I somehow missed this testsuite failure... Attached patch is needed. I'll commit it later today.
Uros. On Wed, May 15, 2019 at 2:16 PM Richard Biener <richard.guent...@gmail.com> wrote: > > On Tue, May 14, 2019 at 6:23 PM Uros Bizjak <ubiz...@gmail.com> wrote: > > > > Recent work by Richard Sandiford [1] enabled the possibility to > > macroize DIVMOD patterns in i386.md. > > > > 2019-05-14 Uroš Bizjak <ubiz...@gmail.com> > > > > * config/i386/i386.md (any_div): New code iterator. > > (paired_mod): New code attribute. > > (sgnprefix): Handle DIV and UDIV RTXes. > > (u): Ditto. > > (<u>divmod<mode>4): Macroize expander from divmod<mode>4 > > and udivmod<mode>4 patterns using any_div code iterator. > > (divmod splitters): Macroize splitters using any_div code iterator. > > (*udivmodsi4_pow2_zext_1): Use exactl_log2 in insn condition. > > (*udivmodsi4_pow2_zext_2): Ditto. > > (*<u>divmod<mode>4_noext): Macroize insn from *divmod<mode>4_noext > > and *udivmod<mode>4_noext patterns using any_div code iterator. > > (*<u>divmod<mode>4_noext_zext_1): Macroize insn from > > *divmod<mode>4_noext_zext_1 and *udivmod<mode>4_noext_zext_1 > > patterns using any_div code iterator. > > (*<u>divmod<mode>4_noext_zext_2): Macroize insn from > > *divmod<mode>4_noext_zext_2 and *udivmod<mode>4_noext_zext_2 > > patterns using any_div code iterator. > > (<u>divmodhiqi3): Macroize insn from divmodhiqi3 and > > udivmodhiqi3 patterns using any_extend code iterator. > > > > The patch also reorders DIVMOD patterns a bit. > > > > Bootstrapped and regression tested on x86_64-linux-gnu {,-m32}. > > > > Committed to mainline SVN. > > I see > > FAIL: gcc.target/i386/udivmod-1.c execution test > > on x86_64. > > > [1] https://gcc.gnu.org/ml/gcc-patches/2019-05/msg00560.html > > > > Uros.
diff --git a/gcc/config/i386/i386-expand.c b/gcc/config/i386/i386-expand.c index a55d4923be48..36b27898833e 100644 --- a/gcc/config/i386/i386-expand.c +++ b/gcc/config/i386/i386-expand.c @@ -984,7 +984,7 @@ predict_jump (int prob) void ix86_split_idivmod (machine_mode mode, rtx operands[], - bool signed_p) + bool unsigned_p) { rtx_code_label *end_label, *qimode_label; rtx div, mod; @@ -1000,22 +1000,22 @@ ix86_split_idivmod (machine_mode mode, rtx operands[], if (GET_MODE (operands[0]) == SImode) { if (GET_MODE (operands[1]) == SImode) - gen_divmod4_1 = signed_p ? gen_divmodsi4_1 : gen_udivmodsi4_1; + gen_divmod4_1 = unsigned_p ? gen_udivmodsi4_1 : gen_divmodsi4_1; else gen_divmod4_1 - = signed_p ? gen_divmodsi4_zext_2 : gen_udivmodsi4_zext_2; + = unsigned_p ? gen_udivmodsi4_zext_2 : gen_divmodsi4_zext_2; gen_zero_extend = gen_zero_extendqisi2; } else { gen_divmod4_1 - = signed_p ? gen_divmodsi4_zext_1 : gen_udivmodsi4_zext_1; + = unsigned_p ? gen_udivmodsi4_zext_1 : gen_divmodsi4_zext_1; gen_zero_extend = gen_zero_extendqidi2; } gen_test_ccno_1 = gen_testsi_ccno_1; break; case E_DImode: - gen_divmod4_1 = signed_p ? gen_divmoddi4_1 : gen_udivmoddi4_1; + gen_divmod4_1 = unsigned_p ? gen_udivmoddi4_1 : gen_divmoddi4_1; gen_test_ccno_1 = gen_testdi_ccno_1; gen_zero_extend = gen_zero_extendqidi2; break; @@ -1061,15 +1061,15 @@ ix86_split_idivmod (machine_mode mode, rtx operands[], tmp2 = lowpart_subreg (QImode, operands[3], mode); emit_insn (gen_udivmodhiqi3 (tmp0, tmp1, tmp2)); - if (signed_p) + if (unsigned_p) { - div = gen_rtx_DIV (mode, operands[2], operands[3]); - mod = gen_rtx_MOD (mode, operands[2], operands[3]); + div = gen_rtx_UDIV (mode, operands[2], operands[3]); + mod = gen_rtx_UMOD (mode, operands[2], operands[3]); } else { - div = gen_rtx_UDIV (mode, operands[2], operands[3]); - mod = gen_rtx_UMOD (mode, operands[2], operands[3]); + div = gen_rtx_DIV (mode, operands[2], operands[3]); + mod = gen_rtx_MOD (mode, operands[2], operands[3]); } if (mode == SImode) { diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 05411221197f..b6e44c82d217 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -939,7 +939,8 @@ (define_code_attr s [(sign_extend "s") (zero_extend "u")]) (define_code_attr u [(sign_extend "") (zero_extend "u") (div "") (udiv "u")]) -(define_code_attr u_bool [(sign_extend "false") (zero_extend "true")]) +(define_code_attr u_bool [(sign_extend "false") (zero_extend "true") + (div "false") (udiv "true")]) ;; Used in signed and unsigned truncations. (define_code_iterator any_truncate [ss_truncate truncate us_truncate]) @@ -7505,7 +7506,7 @@ && can_create_pseudo_p () && !optimize_insn_for_size_p ()" [(const_int 0)] - "ix86_split_idivmod (<MODE>mode, operands, true); DONE;") + "ix86_split_idivmod (<MODE>mode, operands, <u_bool>); DONE;") (define_split [(set (match_operand:DI 0 "register_operand") @@ -7521,7 +7522,7 @@ && can_create_pseudo_p () && !optimize_insn_for_size_p ()" [(const_int 0)] - "ix86_split_idivmod (SImode, operands, true); DONE;") + "ix86_split_idivmod (SImode, operands, <u_bool>); DONE;") (define_split [(set (match_operand:DI 1 "register_operand") @@ -7537,7 +7538,7 @@ && can_create_pseudo_p () && !optimize_insn_for_size_p ()" [(const_int 0)] - "ix86_split_idivmod (SImode, operands, true); DONE;") + "ix86_split_idivmod (SImode, operands, <u_bool>); DONE;") (define_insn_and_split "divmod<mode>4_1" [(set (match_operand:SWI48 0 "register_operand" "=a")