public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc(refs/vendors/redhat/heads/gcc-8-branch)] i386: Fix some -O0 avx2intrin.h and xopintrin.h intrinsic macros [PR94046]
@ 2020-09-17 17:19 Jakub Jelinek
  0 siblings, 0 replies; only message in thread
From: Jakub Jelinek @ 2020-09-17 17:19 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:4e53bb5a8d46b0a093c78d4a6f4b4005727a7251

commit 4e53bb5a8d46b0a093c78d4a6f4b4005727a7251
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Thu Mar 5 19:44:42 2020 +0100

    i386: Fix some -O0 avx2intrin.h and xopintrin.h intrinsic macros [PR94046]
    
    As the testcases show, the macros we have for -O0 for intrinsics that require
    constant argument(s) should first cast the argument to the type the -O1+
    inline uses and afterwards to whatever type e.g. a builtin needs.
    The PR reported one which violated this, and I've grepped for all double-casts
    and grepped out from that meaningful casts where the __m{128,256,512}{,d,i}
    first cast is cast to same sized __v* type and has the same kind of element
    type (float, double, integral).  These 7 macros were using different casts,
    and I've double checked them against the inline function types.
    
    2020-03-05  Jakub Jelinek  <jakub@redhat.com>
    
            PR target/94046
            * config/i386/avx2intrin.h (_mm_mask_i32gather_ps): Fix first cast of
            SRC and MASK arguments to __m128 from __m128d.
            (_mm256_mask_i32gather_ps): Fix first cast of MASK argument to __m256
            from __m256d.
            (_mm_mask_i64gather_ps): Fix first cast of MASK argument to __m128
            from __m128d.
            * config/i386/xopintrin.h (_mm_permute2_pd): Fix first cast of C
            argument to __m128i from __m128d.
            (_mm256_permute2_pd): Fix first cast of C argument to __m256i from
            __m256d.
            (_mm_permute2_ps): Fix first cast of C argument to __m128i from __m128.
            (_mm256_permute2_ps): Fix first cast of C argument to __m256i from
            __m256.
    
            * g++.dg/ext/pr94046-1.C: New test.
            * g++.dg/ext/pr94046-2.C: New test.
    
    (cherry picked from commit 07d52e63d999a0a10c7598c34c48365a357d3d5a)

Diff:
---
 gcc/config/i386/avx2intrin.h         |  8 +++---
 gcc/config/i386/xopintrin.h          |  8 +++---
 gcc/testsuite/g++.dg/ext/pr94046-1.C | 55 ++++++++++++++++++++++++++++++++++++
 gcc/testsuite/g++.dg/ext/pr94046-2.C |  5 ++++
 4 files changed, 68 insertions(+), 8 deletions(-)

diff --git a/gcc/config/i386/avx2intrin.h b/gcc/config/i386/avx2intrin.h
index f6a2555de33..8906600a225 100644
--- a/gcc/config/i386/avx2intrin.h
+++ b/gcc/config/i386/avx2intrin.h
@@ -1736,10 +1736,10 @@ _mm256_mask_i64gather_epi32 (__m128i __src, int const *__base,
 					(int)SCALE)
 
 #define _mm_mask_i32gather_ps(SRC, BASE, INDEX, MASK, SCALE)	 \
-  (__m128) __builtin_ia32_gathersiv4sf ((__v4sf)(__m128d)SRC,	 \
+  (__m128) __builtin_ia32_gathersiv4sf ((__v4sf)(__m128)SRC,	 \
 					(float const *)BASE,	 \
 					(__v4si)(__m128i)INDEX,	 \
-					(__v4sf)(__m128d)MASK,	 \
+					(__v4sf)(__m128)MASK,	 \
 					(int)SCALE)
 
 #define _mm256_i32gather_ps(BASE, INDEX, SCALE)			       \
@@ -1754,7 +1754,7 @@ _mm256_mask_i64gather_epi32 (__m128i __src, int const *__base,
   (__m256) __builtin_ia32_gathersiv8sf ((__v8sf)(__m256)SRC,	\
 					(float const *)BASE,	\
 					(__v8si)(__m256i)INDEX, \
-					(__v8sf)(__m256d)MASK,	\
+					(__v8sf)(__m256)MASK,	\
 					(int)SCALE)
 
 #define _mm_i64gather_ps(BASE, INDEX, SCALE)				\
@@ -1769,7 +1769,7 @@ _mm256_mask_i64gather_epi32 (__m128i __src, int const *__base,
   (__m128) __builtin_ia32_gatherdiv4sf ((__v4sf)(__m128)SRC,	 \
 					(float const *)BASE,	 \
 					(__v2di)(__m128i)INDEX,	 \
-					(__v4sf)(__m128d)MASK,	 \
+					(__v4sf)(__m128)MASK,	 \
 					(int)SCALE)
 
 #define _mm256_i64gather_ps(BASE, INDEX, SCALE)				\
diff --git a/gcc/config/i386/xopintrin.h b/gcc/config/i386/xopintrin.h
index e7fda9abee4..f50547d389c 100644
--- a/gcc/config/i386/xopintrin.h
+++ b/gcc/config/i386/xopintrin.h
@@ -814,25 +814,25 @@ _mm256_permute2_ps (__m256 __X, __m256 __Y, __m256i __C, const int __I)
 #define _mm_permute2_pd(X, Y, C, I)					\
   ((__m128d) __builtin_ia32_vpermil2pd ((__v2df)(__m128d)(X),		\
 					(__v2df)(__m128d)(Y),		\
-					(__v2di)(__m128d)(C),		\
+					(__v2di)(__m128i)(C),		\
 					(int)(I)))
 
 #define _mm256_permute2_pd(X, Y, C, I)					\
   ((__m256d) __builtin_ia32_vpermil2pd256 ((__v4df)(__m256d)(X),	\
 					   (__v4df)(__m256d)(Y),	\
-					   (__v4di)(__m256d)(C),	\
+					   (__v4di)(__m256i)(C),	\
 					   (int)(I)))
 
 #define _mm_permute2_ps(X, Y, C, I)					\
   ((__m128) __builtin_ia32_vpermil2ps ((__v4sf)(__m128)(X),		\
 				       (__v4sf)(__m128)(Y),		\
-				       (__v4si)(__m128)(C),		\
+				       (__v4si)(__m128i)(C),		\
 				       (int)(I)))
 
 #define _mm256_permute2_ps(X, Y, C, I)					\
   ((__m256) __builtin_ia32_vpermil2ps256 ((__v8sf)(__m256)(X),		\
 					  (__v8sf)(__m256)(Y),  	\
-					  (__v8si)(__m256)(C),		\
+					  (__v8si)(__m256i)(C),		\
  					  (int)(I)))
 #endif /* __OPTIMIZE__ */
 
diff --git a/gcc/testsuite/g++.dg/ext/pr94046-1.C b/gcc/testsuite/g++.dg/ext/pr94046-1.C
new file mode 100644
index 00000000000..512eaf112c0
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/pr94046-1.C
@@ -0,0 +1,55 @@
+// PR target/94046
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
+// { dg-options "-O2 -mavx2 -mxop" }
+
+#include <x86intrin.h>
+
+#define S(x) struct x { operator __##x (); };
+S (m128)
+S (m128d)
+S (m128i)
+S (m256)
+S (m256d)
+S (m256i)
+
+__m128
+f1 (m128 src, float const *base, m128i idx, m128 mask)
+{
+  return _mm_mask_i32gather_ps (src, base, idx, mask, 2);
+}
+
+__m256
+f2 (m256 src, float const *base, m256i idx, m256 mask)
+{
+  return _mm256_mask_i32gather_ps (src, base, idx, mask, 2);
+}
+
+__m128
+f3 (m128 src, float const *base, m128i idx, m128 mask)
+{
+  return _mm_mask_i64gather_ps (src, base, idx, mask, 2);
+}
+
+__m128d
+f4 (m128d x, m128d y, m128i c)
+{
+  return _mm_permute2_pd (x, y, c, 3);
+}
+
+__m128
+f5 (m128 x, m128 y, m128i c)
+{
+  return _mm_permute2_ps (x, y, c, 3);
+}
+
+__m256d
+f6 (m256d x, m256d y, m256i c)
+{
+  return _mm256_permute2_pd (x, y, c, 3);
+}
+
+__m256
+f7 (m256 x, m256 y, m256i c)
+{
+  return _mm256_permute2_ps (x, y, c, 3);
+}
diff --git a/gcc/testsuite/g++.dg/ext/pr94046-2.C b/gcc/testsuite/g++.dg/ext/pr94046-2.C
new file mode 100644
index 00000000000..9744950a838
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/pr94046-2.C
@@ -0,0 +1,5 @@
+// PR target/94046
+// { dg-do compile { target i?86-*-* x86_64-*-* } }
+// { dg-options "-O0 -mavx2 -mxop" }
+
+#include "pr94046-1.C"


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

only message in thread, other threads:[~2020-09-17 17:19 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-09-17 17:19 [gcc(refs/vendors/redhat/heads/gcc-8-branch)] i386: Fix some -O0 avx2intrin.h and xopintrin.h intrinsic macros [PR94046] Jakub Jelinek

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