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")

Reply via email to