]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
amdgcn: Fixed intermittent failure in vectorized version of rint
authorKwok Cheung Yeung <kcy@codesourcery.com>
Mon, 7 Nov 2022 12:17:08 +0000 (12:17 +0000)
committerKwok Cheung Yeung <kcy@codesourcery.com>
Mon, 7 Nov 2022 13:15:02 +0000 (13:15 +0000)
The lane mask was not being updated properly in nested conditionals.
Also fixed an issue causing inaccuracy in double-precision rint.

2022-11-07  Kwok Cheung Yeung  <kcy@codesourcery.com>

libgcc/
* config/gcn/simd-math/v64df_rint.c (rint): Simplified.  Fixed bug in
nested VECTOR_IF.  Fixed issue with signed right-shift.
* config/gcn/simd-math/v64sf_rint.c (rintf): Simplified.  Fixed bug in
nested VECTOR_IF.

libgcc/ChangeLog.omp
libgcc/config/gcn/simd-math/v64df_rint.c
libgcc/config/gcn/simd-math/v64sf_rint.c

index 37ab8fcbf69b08c30c7de2d3c88093df61c4d914..af9abdb220e4a0866c95aa5b48bda069d728f5ed 100644 (file)
@@ -1,3 +1,10 @@
+2022-11-07  Kwok Cheung Yeung  <kcy@codesourcery.com>
+
+       * config/gcn/simd-math/v64df_rint.c (rint): Simplified.  Fixed bug in
+       nested VECTOR_IF.  Fixed issue with signed right-shift.
+       * config/gcn/simd-math/v64sf_rint.c (rintf): Simplified.  Fixed bug in
+       nested VECTOR_IF.
+
 2022-11-01  Kwok Cheung Yeung  <kcy@codesourcery.com>
            Paul-Antoine Arras  <pa@codesourcery.com>
            Andrew Jenner  <andrew@codesourcery.com>
index ec36cce8c86108a055f0db5a2c6b02efd547e7de..561c9a2ac9d7330c81ea184dd89c2f77fbb87f50 100644 (file)
@@ -40,7 +40,7 @@ DEF_VD_MATH_FUNC (v64df, rint, v64df x)
       GET_HIGH_WORD (i0, t, cond2);
       SET_HIGH_WORD (t, (i0&0x7fffffff)|(sx<<31), cond2);
       VECTOR_RETURN (t, cond2);
-    VECTOR_ELSE (cond2)
+    VECTOR_ELSE2 (cond2, cond)
       i = (0x000fffff) >> j0;
       VECTOR_RETURN (x, cond2 & (((i0 & i) | i1) == 0));      /* x is integral */
       i >>= 1;
@@ -54,7 +54,7 @@ DEF_VD_MATH_FUNC (v64df, rint, v64df x)
     VECTOR_RETURN (x + x, cond & (j0 == 0x400));
     VECTOR_RETURN (x, cond);
   VECTOR_ELSE (cond)
-    i = (0xffffffff) >> (j0 - 20);
+    i = CAST_VECTOR (v64si, VECTOR_INIT (0xffffffff) >> (j0 - 20));
     VECTOR_RETURN (x, cond & ((i1 & i) == 0));
     i >>= 1;
     VECTOR_COND_MOVE (i1, (i1 & (~i)) | (0x40000000 >> (j0 - 20)), cond & ((i1 & i) != 0));
index 60c348a9d676d479d354ff44c6e0200c4da11193..8ebad4beae9ed3a9f7cb1f3377a3e6f98723c7be 100644 (file)
@@ -29,9 +29,7 @@ DEF_VS_MATH_FUNC (v64sf, rintf, v64sf x)
   v64si ix = (i0 & 0x7fffffff);
   v64si j0 = (ix >> 23) - 0x7f;
   VECTOR_IF (j0 < 23, cond)
-    VECTOR_IF2 (FLT_UWORD_IS_ZERO (ix), cond2, cond)
-      VECTOR_RETURN (x, cond2);
-    VECTOR_ENDIF
+    VECTOR_RETURN (x, cond & FLT_UWORD_IS_ZERO (ix));
     VECTOR_IF2 (j0 < 0, cond2, cond)
       v64si i1 = (i0 & 0x07fffff);
       VECTOR_COND_MOVE (i0, i0 & 0xfff00000, cond2);
@@ -42,22 +40,16 @@ DEF_VS_MATH_FUNC (v64sf, rintf, v64sf x)
       GET_FLOAT_WORD (i0, t, cond2);
       SET_FLOAT_WORD (t, (i0&0x7fffffff)|(sx<<31), cond2);
       VECTOR_RETURN (t, cond2);
-    VECTOR_ELSE (cond2)
+    VECTOR_ELSE2 (cond2, cond)
       v64si i = (0x007fffff) >> j0;
-      VECTOR_IF2 ((i0 & i) == 0, cond3, cond2) /* x is integral */
-       VECTOR_RETURN (x, cond3);
-      VECTOR_ENDIF
+      VECTOR_RETURN (x, cond2 & ((i0 & i) == 0));       /* x is integral */
       i >>= 1;
-      VECTOR_IF2 ((i0 & i) != 0, cond3, cond2)
-       VECTOR_COND_MOVE (i0, (i0 & (~i)) | ((0x200000) >> j0), cond3);
-      VECTOR_ENDIF
+      VECTOR_COND_MOVE (i0, (i0 & (~i)) | (0x200000 >> j0),
+                        cond2 & ((i0 & i) != 0));
     VECTOR_ENDIF
   VECTOR_ELSE (cond)
-    VECTOR_IF2 (~FLT_UWORD_IS_FINITE (ix), cond2, cond) /* inf or NaN */
-      VECTOR_RETURN (x + x, cond2);
-    VECTOR_ELSE (cond2)        /* x is integral */
-      VECTOR_RETURN (x, cond2);
-    VECTOR_ENDIF
+    VECTOR_RETURN (x + x, cond & ~FLT_UWORD_IS_FINITE (ix));    /* inf or NaN */
+    VECTOR_RETURN (x, cond); /* x is integral */
   VECTOR_ENDIF
 
   SET_FLOAT_WORD (x, i0, NO_COND);