public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc/devel/omp/gcc-12] amdgcn: Fixed intermittent failure in vectorized version of rint
@ 2022-11-07 15:15 Kwok Yeung
  0 siblings, 0 replies; only message in thread
From: Kwok Yeung @ 2022-11-07 15:15 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:8e6c5b18e10adb63811ee5e3423e20146077c439

commit 8e6c5b18e10adb63811ee5e3423e20146077c439
Author: Kwok Cheung Yeung <kcy@codesourcery.com>
Date:   Mon Nov 7 12:17:08 2022 +0000

    amdgcn: Fixed intermittent failure in vectorized version of rint
    
    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.

Diff:
---
 libgcc/ChangeLog.omp                     |  7 +++++++
 libgcc/config/gcn/simd-math/v64df_rint.c |  4 ++--
 libgcc/config/gcn/simd-math/v64sf_rint.c | 22 +++++++---------------
 3 files changed, 16 insertions(+), 17 deletions(-)

diff --git a/libgcc/ChangeLog.omp b/libgcc/ChangeLog.omp
index 37ab8fcbf69..af9abdb220e 100644
--- a/libgcc/ChangeLog.omp
+++ b/libgcc/ChangeLog.omp
@@ -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>
diff --git a/libgcc/config/gcn/simd-math/v64df_rint.c b/libgcc/config/gcn/simd-math/v64df_rint.c
index ec36cce8c86..561c9a2ac9d 100644
--- a/libgcc/config/gcn/simd-math/v64df_rint.c
+++ b/libgcc/config/gcn/simd-math/v64df_rint.c
@@ -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));
diff --git a/libgcc/config/gcn/simd-math/v64sf_rint.c b/libgcc/config/gcn/simd-math/v64sf_rint.c
index 60c348a9d67..8ebad4beae9 100644
--- a/libgcc/config/gcn/simd-math/v64sf_rint.c
+++ b/libgcc/config/gcn/simd-math/v64sf_rint.c
@@ -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);

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-11-07 15:15 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-11-07 15:15 [gcc/devel/omp/gcc-12] amdgcn: Fixed intermittent failure in vectorized version of rint Kwok Yeung

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).