https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91825
--- Comment #6 from Marek Polacek <mpolacek at gcc dot gnu.org> --- Somewhat reduced: typedef struct rtx_def *rtx; enum machine_mode { E_VOIDmode, E_BLKmode, E_CCmode, E_CCFPmode, E_CCFPEmode, E_CC_SWPmode, E_CC_NZCmode, E_CC_NZmode, E_CC_Zmode, E_CC_Cmode, E_CC_ADCmode, E_CC_Vmode, E_BImode, E_QImode, E_HImode, E_SImode, E_DImode, E_TImode, E_OImode, E_CImode, E_XImode, E_QQmode, E_HQmode, E_SQmode, E_DQmode, E_TQmode, E_UQQmode, E_UHQmode, E_USQmode, E_UDQmode, E_UTQmode, E_HAmode, E_SAmode, E_DAmode, E_TAmode, E_UHAmode, E_USAmode, E_UDAmode, E_UTAmode, E_HFmode, E_SFmode, E_DFmode, E_TFmode, E_SDmode, E_DDmode, E_TDmode, E_CQImode, E_CHImode, E_CSImode, E_CDImode, E_CTImode, E_COImode, E_CCImode, E_CXImode, E_HCmode, E_SCmode, E_DCmode, E_TCmode, E_V8QImode, E_V4HImode, E_V2SImode, E_V16QImode, E_V8HImode, E_V4SImode, E_V2DImode, E_VNx2TImode, E_VNx3TImode, E_VNx4TImode, E_VNx2OImode, E_V2HFmode, E_V4HFmode, E_V2SFmode, E_V2DFmode, NUM_MACHINE_MODES }; template <int N> struct A { int coeffs[N]; }; template <int N> class C : public A<N> { public: template <typename C0> C(const C0 &); }; machine_mode mode_size_inline_mode, emit_store_flag_1_target_mode; A<2> mode_size[1]; struct B { enum from_int {}; }; extern const char mode_class[NUM_MACHINE_MODES]; template <typename T> T as_a(machine_mode); class scalar_int_mode { public: scalar_int_mode() {} scalar_int_mode(B::from_int p1) : m_mode(machine_mode(p1)) {} operator machine_mode() { return m_mode; } machine_mode m_mode; } mode_to_bytes_mode; scalar_int_mode word_mode; template <typename T> bool is_int_mode(machine_mode p1, T p2) { if (mode_class[p1]) { *p2 = B::from_int(p1); return true; } return false; } enum insn_code {}; enum rtx_code { GE, LE, LT }; struct rtx_def { rtx_code code; machine_mode mode; }; rtx const_int_rtx_63, const_int_rtx_64, emit_store_flag_1_subtarget, emit_store_flag_1_tem, emit_store_flag_1_op00, emit_store_flag_1_op01, emit_store_flag_1_op0h, emit_store_flag_1_target, emit_store_flag_1_op0, emit_store_flag_1_op1; enum tree_code { RSHIFT_EXPR }; enum optab_tag { and_optab, ior_optab, one_cmpl_optab }; enum optab_methods { OPTAB_DIRECT }; insn_code emit_store_flag_1_icode; rtx_code emit_store_flag_1_code; int emit_store_flag_1_unsignedp, emit_store_flag_1_normalizep; short emit_store_flag_1___trans_tmp_24, emit_store_flag_1___trans_tmp_23; bool iterate_p(); inline __attribute__((__always_inline__)) C<2> mode_size_inline() { A<2> mode_size; switch (mode_size_inline_mode) { case E_VOIDmode: return 0; case E_BLKmode: return 0; case E_CCmode: return 4; case E_CCFPmode: return 4; case E_CCFPEmode: return 4; case E_CC_SWPmode: return 4; case E_CC_NZCmode: return 4; case E_CC_NZmode: return 4; case E_CC_Zmode: return 4; case E_CC_Cmode: return 4; case E_CC_ADCmode: return 4; case E_CC_Vmode: return 4; case E_BImode: return 1; case E_QImode: return 1; case E_HImode: return 2; case E_SImode: return 4; case E_DImode: return 8; case E_TImode: return 6; case E_OImode: return 2; case E_CImode: return 8; case E_XImode: return 4; case E_QQmode: return 1; case E_HQmode: return 2; case E_SQmode: return 4; case E_DQmode: return 8; case E_TQmode: return 6; case E_UQQmode: return 1; case E_UHQmode: return 2; case E_USQmode: return 4; case E_UDQmode: return 8; case E_UTQmode: return 6; case E_HAmode: return 2; case E_SAmode: return 4; case E_DAmode: return 8; case E_TAmode: return 6; case E_UHAmode: return 2; case E_USAmode: return 4; case E_UDAmode: return 8; case E_UTAmode: return 6; case E_HFmode: return 2; case E_SFmode: return 4; case E_DFmode: return 8; case E_TFmode: return 6; case E_SDmode: return 4; case E_DDmode: return 8; case E_TDmode: return 6; case E_CQImode: return 2; case E_CHImode: return 4; case E_CSImode: return 8; case E_CDImode: return 6; case E_CTImode: return 2; case E_COImode: return 4; case E_CCImode: return 6; case E_CXImode: return 8; case E_HCmode: return 4; case E_SCmode: return 8; case E_DCmode: return 6; case E_TCmode: return 2; case E_V8QImode: return 8; case E_V4HImode: return 8; case E_V2SImode: return 8; case E_V16QImode: return 6; case E_V8HImode: return 6; case E_V4SImode: return 6; case E_V2DImode: return 6; case E_VNx2TImode: return 2; case E_VNx3TImode: return 8; case E_VNx4TImode: return 4; case E_VNx2OImode: return 4; case E_V2HFmode: return 4; case E_V4HFmode: return 8; case E_V2SFmode: return 8; case E_V2DFmode: return 6; default: return mode_size; } } inline __attribute__((always_inline)) C<2> mode_to_bytes() { return mode_to_bytes_mode ? mode_size_inline() : mode_size[0]; } inline __attribute__((always_inline)) C<2> mode_to_bits() { mode_to_bytes(); return 0; } inline __attribute__((always_inline)) short GET_MODE_SIZE(scalar_int_mode) { return mode_to_bytes().coeffs[0]; } inline __attribute__((always_inline)) short GET_MODE_BITSIZE(scalar_int_mode) { return mode_to_bits().coeffs[0]; } void get_wider(); void simplify_gen_subreg(machine_mode, rtx, machine_mode, C<2>); bool val_signbit_known_set_p(machine_mode, long); rtx emit_store_flag(rtx, rtx_code, rtx, rtx, machine_mode, int, int); rtx expand_shift(tree_code, machine_mode, rtx, C<2>, rtx, int); insn_code optab_handler(); void expand_binop(machine_mode, optab_tag, rtx, rtx, rtx, int, optab_methods); rtx expand_unop(machine_mode, optab_tag, rtx, rtx, int); void convert_move(rtx, rtx, int); rtx convert_modes(machine_mode, machine_mode, rtx, int); rtx emit_cstore(); rtx emit_store_flag_1(machine_mode p1) { scalar_int_mode int_mode; emit_store_flag_1___trans_tmp_23 = mode_to_bits().coeffs[0]; if (is_int_mode(p1, &int_mode) * (emit_store_flag_1_op0->code || emit_store_flag_1_op0)) if (emit_store_flag_1_code && const_int_rtx_63) { machine_mode __trans_tmp_3 = word_mode, __trans_tmp_4 = int_mode, __trans_tmp_5 = word_mode, __trans_tmp_6 = int_mode, __trans_tmp_7 = word_mode; simplify_gen_subreg(__trans_tmp_3, emit_store_flag_1_op0, __trans_tmp_4, 0); simplify_gen_subreg(__trans_tmp_5, emit_store_flag_1_op0, __trans_tmp_6, 8); expand_binop(__trans_tmp_7, const_int_rtx_64 ? ior_optab : and_optab, emit_store_flag_1_op00, emit_store_flag_1_op01, 0, emit_store_flag_1_unsignedp, OPTAB_DIRECT); if (emit_store_flag_1_tem) { machine_mode __trans_tmp_8 = word_mode; emit_store_flag(0, emit_store_flag_1_code, emit_store_flag_1_tem, emit_store_flag_1_op1, __trans_tmp_8, emit_store_flag_1_unsignedp, emit_store_flag_1_normalizep); } } if (emit_store_flag_1_code || emit_store_flag_1_code && const_int_rtx_64) machine_mode __trans_tmp_9 = word_mode; machine_mode __trans_tmp_10 = int_mode, __trans_tmp_12 = word_mode, __trans_tmp_14 = word_mode; emit_store_flag_1_tem = emit_store_flag( 0, emit_store_flag_1_code, emit_store_flag_1_op0h, emit_store_flag_1_op1, __trans_tmp_12, emit_store_flag_1_unsignedp, emit_store_flag_1_target_mode || emit_store_flag_1_tem->mode == emit_store_flag_1_target_mode); bool __trans_tmp_13 = val_signbit_known_set_p( __trans_tmp_14, emit_store_flag_1_normalizep ?: 1); convert_move(emit_store_flag_1_target, 0, __trans_tmp_13); if (emit_store_flag_1_op1 == const_int_rtx_64 && (emit_store_flag_1_code == LT || emit_store_flag_1_code == GE) && is_int_mode(p1, &int_mode)) { scalar_int_mode int_target_mode = int_target_mode = as_a<scalar_int_mode>(emit_store_flag_1_target_mode); emit_store_flag_1___trans_tmp_24 = mode_to_bytes().coeffs[0]; if (GET_MODE_SIZE(int_mode)) { machine_mode __trans_tmp_15 = int_target_mode, __trans_tmp_16 = int_mode; emit_store_flag_1_op0 = convert_modes(__trans_tmp_15, __trans_tmp_16, emit_store_flag_1_op0, 0); } int_mode = int_target_mode; if (int_mode) emit_store_flag_1_subtarget = 0; if (emit_store_flag_1_code) { machine_mode __trans_tmp_17 = int_mode, __trans_tmp_18 = int_mode; emit_store_flag_1_op0 = expand_unop(__trans_tmp_17, one_cmpl_optab, emit_store_flag_1_op0, emit_store_flag_1_subtarget, 0); GET_MODE_BITSIZE(int_mode); emit_store_flag_1_normalizep = 1; emit_store_flag_1_op0 = expand_shift(RSHIFT_EXPR, __trans_tmp_18, emit_store_flag_1_op0, 1, emit_store_flag_1_subtarget, 1); } if (int_mode = int_target_mode) { machine_mode __trans_tmp_20 = int_target_mode, __trans_tmp_21 = int_mode; emit_store_flag_1_op0 = convert_modes(__trans_tmp_20, __trans_tmp_21, emit_store_flag_1_op0, 0); } } for (; iterate_p();) emit_store_flag_1_icode = optab_handler(); if (emit_store_flag_1_icode) get_wider(); rtx tem = emit_cstore(); if (tem) if (mode_class[p1]) tem = emit_cstore(); if (tem) return tem; return 0; }