]> gcc.gnu.org Git - gcc.git/commitdiff
backport: re PR target/89726 (Incorrect inlined version of 'ceil' for 32bit)
authorJakub Jelinek <jakub@redhat.com>
Fri, 30 Aug 2019 12:26:30 +0000 (14:26 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 30 Aug 2019 12:26:30 +0000 (14:26 +0200)
Backported from mainline
2019-03-19  Jakub Jelinek  <jakub@redhat.com>

PR target/89726
* config/i386/i386.c (ix86_expand_floorceildf_32): In ceil
compensation use x2 += 1 instead of x2 -= -1 and when honoring
signed zeros, do another copysign after the compensation.

* gcc.target/i386/fpprec-1.c (x): Add 6 new constants.
(expect_round, expect_rint, expect_floor, expect_ceil, expect_trunc):
Add expected results for them.

From-SVN: r275135

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/fpprec-1.c

index e0b0736c9e2c2e5af33c64c45d1971cd4a37acd5..8c7eb971ffef90117fc71ea550e0a1dbc82c5d30 100644 (file)
@@ -1,6 +1,13 @@
 2019-08-30  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       2019-03-19  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/89726
+       * config/i386/i386.c (ix86_expand_floorceildf_32): In ceil
+       compensation use x2 += 1 instead of x2 -= -1 and when honoring
+       signed zeros, do another copysign after the compensation.
+
        2019-03-15  Jakub Jelinek  <jakub@redhat.com>
 
        PR debug/89704
index fc12b5588c8b389c48ca3930519130e0caed0436..1f4029c7a6cd1ed5d96ac38a7a91ebbd607e570c 100644 (file)
@@ -46225,8 +46225,10 @@ ix86_expand_floorceildf_32 (rtx operand0, rtx operand1, bool do_floor)
           x2 -= 1;
      Compensate.  Ceil:
         if (x2 < x)
-          x2 -= -1;
-        return x2;
+          x2 += 1;
+       if (HONOR_SIGNED_ZEROS (mode))
+         x2 = copysign (x2, x);
+       return x2;
    */
   machine_mode mode = GET_MODE (operand0);
   rtx xa, TWO52, tmp, one, res, mask;
@@ -46252,17 +46254,16 @@ ix86_expand_floorceildf_32 (rtx operand0, rtx operand1, bool do_floor)
   /* xa = copysign (xa, operand1) */
   ix86_sse_copysign_to_positive (xa, xa, res, mask);
 
-  /* generate 1.0 or -1.0 */
-  one = force_reg (mode,
-                  const_double_from_real_value (do_floor
-                                                ? dconst1 : dconstm1, mode));
+  /* generate 1.0 */
+  one = force_reg (mode, const_double_from_real_value (dconst1, mode));
 
   /* Compensate: xa = xa - (xa > operand1 ? 1 : 0) */
   tmp = ix86_expand_sse_compare_mask (UNGT, xa, res, !do_floor);
   emit_insn (gen_rtx_SET (tmp, gen_rtx_AND (mode, one, tmp)));
-  /* We always need to subtract here to preserve signed zero.  */
-  tmp = expand_simple_binop (mode, MINUS,
+  tmp = expand_simple_binop (mode, do_floor ? MINUS : PLUS,
                             xa, tmp, NULL_RTX, 0, OPTAB_DIRECT);
+  if (!do_floor && HONOR_SIGNED_ZEROS (mode))
+    ix86_sse_copysign_to_positive (tmp, tmp, res, mask);
   emit_move_insn (res, tmp);
 
   emit_label (label);
index 1fc3ef919c1437c882b983334e1d38919e2f026c..560f564f1eea783a1d3618ac3463a6ff75a19eda 100644 (file)
@@ -3,6 +3,11 @@
        Backported from mainline
        2019-03-19  Jakub Jelinek  <jakub@redhat.com>
 
+       PR target/89726
+       * gcc.target/i386/fpprec-1.c (x): Add 6 new constants.
+       (expect_round, expect_rint, expect_floor, expect_ceil, expect_trunc):
+       Add expected results for them.
+
        PR c/89734
        * gcc.dg/pr89734.c: New test.
 
index 1c17c1d10a00bdbd4168be17e810ca5806734dc2..4e55a225bb85f812427fe71f8f20059b7eef5a6a 100644 (file)
@@ -11,6 +11,9 @@ double x[] = { __builtin_nan(""), __builtin_inf(), -__builtin_inf(),
        0x1.0000000000001p-1, 0x1.fffffffffffffp-2,
        0x1.0000000000001p+0, 0x1.fffffffffffffp-1,
        0x1.8000000000001p+0, 0x1.7ffffffffffffp+0,
+       -0x1.0000000000001p-1, -0x1.fffffffffffffp-2,
+       -0x1.0000000000001p+0, -0x1.fffffffffffffp-1,
+       -0x1.8000000000001p+0, -0x1.7ffffffffffffp+0,
        -0.0, 0.0, -0.5, 0.5, -1.0, 1.0, -1.5, 1.5, -2.0, 2.0,
        -2.5, 2.5 };
 #define NUM (sizeof(x)/sizeof(double))
@@ -19,6 +22,7 @@ double expect_round[] = { __builtin_nan(""), __builtin_inf(), -__builtin_inf(),
        -0x1.fffffffffffffp+1023, 0x1.fffffffffffffp+1023,
        -0.0, 0.0,
        1.0, 0.0, 1.0, 1.0, 2.0, 1.0,
+       -1.0, -0.0, -1.0, -1.0, -2.0, -1.0,
        -0.0, 0.0, -1.0, 1.0, -1.0, 1.0, -2.0, 2.0, -2.0, 2.0,
        -3.0, 3.0 };
 
@@ -26,6 +30,7 @@ double expect_rint[] = { __builtin_nan(""), __builtin_inf(), -__builtin_inf(),
         -0x1.fffffffffffffp+1023, 0x1.fffffffffffffp+1023,
         -0.0, 0.0,
         1.0, 0.0, 1.0, 1.0, 2.0, 1.0,
+        -1.0, -0.0, -1.0, -1.0, -2.0, -1.0,
         -0.0, 0.0, -0.0, 0.0, -1.0, 1.0, -2.0, 2.0, -2.0, 2.0,
         -2.0, 2.0 };
 
@@ -33,6 +38,7 @@ double expect_floor[] = { __builtin_nan(""), __builtin_inf(), -__builtin_inf(),
         -0x1.fffffffffffffp+1023, 0x1.fffffffffffffp+1023,
         -1.0, 0.0,
         0.0, 0.0, 1.0, 0.0, 1.0, 1.0,
+        -1.0, -1.0, -2.0, -1.0, -2.0, -2.0,
         -0.0, 0.0, -1.0, 0.0, -1.0, 1.0, -2.0, 1.0, -2.0, 2.0,
         -3.0, 2.0 };
 
@@ -40,6 +46,7 @@ double expect_ceil[] = { __builtin_nan(""), __builtin_inf(), -__builtin_inf(),
         -0x1.fffffffffffffp+1023, 0x1.fffffffffffffp+1023,
         -0.0, 1.0,
         1.0, 1.0, 2.0, 1.0, 2.0, 2.0,
+        -0.0, -0.0, -1.0, -0.0, -1.0, -1.0,
         -0.0, 0.0, -0.0, 1.0, -1.0, 1.0, -1.0, 2.0, -2.0, 2.0,
         -2.0, 3.0 };
 
@@ -47,6 +54,7 @@ double expect_trunc[] = { __builtin_nan(""), __builtin_inf(), -__builtin_inf(),
         -0x1.fffffffffffffp+1023, 0x1.fffffffffffffp+1023,
         -0.0, 0.0,
         0.0, 0.0, 1.0, 0.0, 1.0, 1.0,
+        -0.0, -0.0, -1.0, -0.0, -1.0, -1.0,
         -0.0, 0.0, -0.0, 0.0, -1.0, 1.0, -1.0, 1.0, -2.0, 2.0,
         -2.0, 2.0 };
 
This page took 0.154806 seconds and 5 git commands to generate.