x86-64: {,V}CVT{,U}SI2Sx are ambiguous without suffix
authorJan Beulich <jbeulich@suse.com>
Fri, 11 Jan 2019 11:20:40 +0000 (11:20 +0000)
committerJan Beulich <jbeulich@gcc.gnu.org>
Fri, 11 Jan 2019 11:20:40 +0000 (11:20 +0000)
For 64-bit these should not be emitted without suffix in AT&T mode (as
being ambiguous that way); the suffixes are benign for 32-bit. For
consistency also omit the suffix in Intel mode for {,V}CVTSI2SxQ.

The omission has originally (prior to rev 260691) lead to wrong code
being generated for the 64-bit unsigned-to-float/double conversions (as
gas guesses an L suffix instead of the required Q one when the operand
is in memory). In all remaining cases (being changed here) the omission
would "just" lead to warnings with future gas versions.

As a result, arrange to check for the L suffixes in 32-bit test cases.

In order for related test cases to actually test what they're supposed
to test, add (seemingly unrelated) a few empty "asm volatile()".
Presumably there are more where constant propagation voids the intended
effect of the tests, but these are ones helping make sure the assembler
actually still assembles correctly the output after the changes here.

From-SVN: r267833

16 files changed:
gcc/ChangeLog
gcc/config/i386/i386.md
gcc/config/i386/sse.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/avx512f-vcvtsd2si-1.c
gcc/testsuite/gcc.target/i386/avx512f-vcvtsi2ss-1.c
gcc/testsuite/gcc.target/i386/avx512f-vcvtss2si-1.c
gcc/testsuite/gcc.target/i386/avx512f-vcvttsd2si-1.c
gcc/testsuite/gcc.target/i386/avx512f-vcvttss2si-1.c
gcc/testsuite/gcc.target/i386/avx512f-vcvtusi2sd-1.c
gcc/testsuite/gcc.target/i386/avx512f-vcvtusi2sd-2.c
gcc/testsuite/gcc.target/i386/avx512f-vcvtusi2sd64-2.c
gcc/testsuite/gcc.target/i386/avx512f-vcvtusi2ss-1.c
gcc/testsuite/gcc.target/i386/avx512f-vcvtusi2ss-2.c
gcc/testsuite/gcc.target/i386/avx512f-vcvtusi2ss64-2.c
gcc/testsuite/gcc.target/i386/pr19398.c

index 8a83f4e376cc3f6c1a5031347923d27d2c7989cc..080825432a64fc4c4b9af7f27b6fab5de1a18f48 100644 (file)
@@ -1,3 +1,11 @@
+2019-01-11  Jan Beulich  <jbeulich@suse.com>
+
+       * config/i386/i386.md (rex64suffix): Add L suffix for SI.
+       * config/i386/sse.md (cvtusi2<ssescalarmodesuffix>32<round_name>,
+       sse2_cvtsi2sd): Add {l}.
+       (sse2_cvtsi2sdq<round_name>): Make q conditional upon AT&T
+       syntax.
+
 2019-01-10  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/88785
index 28e336044683585f608ba12249b15583b68586dd..d085e88bc61d76d86662d84e5b44cd81d99e6076 100644 (file)
   [(QI "V64QI") (HI "V32HI") (SI "V16SI") (DI "V8DI") (SF "V16SF") (DF "V8DF")])
 
 ;; Instruction suffix for REX 64bit operators.
-(define_mode_attr rex64suffix [(SI "") (DI "{q}")])
+(define_mode_attr rex64suffix [(SI "{l}") (DI "{q}")])
 (define_mode_attr rex64namesuffix [(SI "") (DI "q")])
 
 ;; This mode iterator allows :P to be used for patterns that operate on
index c9ec74b6aa101c3b78ed175946845eff75ac2741..15643fe6b11db06e7633bcae496867a57b44a9b3 100644 (file)
          (match_operand:VF_128 1 "register_operand" "v")
          (const_int 1)))]
   "TARGET_AVX512F && <round_modev4sf_condition>"
-  "vcvtusi2<ssescalarmodesuffix>\t{%2, <round_op3>%1, %0|%0, %1<round_op3>, %2}"
+  "vcvtusi2<ssescalarmodesuffix>{l}\t{%2, <round_op3>%1, %0|%0, %1<round_op3>, %2}"
   [(set_attr "type" "sseicvt")
    (set_attr "prefix" "evex")
    (set_attr "mode" "<ssescalarmode>")])
          (const_int 1)))]
   "TARGET_SSE2"
   "@
-   cvtsi2sd\t{%2, %0|%0, %2}
-   cvtsi2sd\t{%2, %0|%0, %2}
-   vcvtsi2sd\t{%2, %1, %0|%0, %1, %2}"
+   cvtsi2sd{l}\t{%2, %0|%0, %2}
+   cvtsi2sd{l}\t{%2, %0|%0, %2}
+   vcvtsi2sd{l}\t{%2, %1, %0|%0, %1, %2}"
   [(set_attr "isa" "noavx,noavx,avx")
    (set_attr "type" "sseicvt")
    (set_attr "athlon_decode" "double,direct,*")
          (const_int 1)))]
   "TARGET_SSE2 && TARGET_64BIT"
   "@
-   cvtsi2sdq\t{%2, %0|%0, %2}
-   cvtsi2sdq\t{%2, %0|%0, %2}
-   vcvtsi2sdq\t{%2, <round_op3>%1, %0|%0, %1<round_op3>, %2}"
+   cvtsi2sd{q}\t{%2, %0|%0, %2}
+   cvtsi2sd{q}\t{%2, %0|%0, %2}
+   vcvtsi2sd{q}\t{%2, <round_op3>%1, %0|%0, %1<round_op3>, %2}"
   [(set_attr "isa" "noavx,noavx,avx")
    (set_attr "type" "sseicvt")
    (set_attr "athlon_decode" "double,direct,*")
index beccccd20d80999e0c80b9d4f7a717ce20c7a482..5fbeb1e5f5b3b668dc52cbb236b83a681d766fb8 100644 (file)
@@ -1,3 +1,18 @@
+2019-01-11  Jan Beulich  <jbeulich@suse.com>
+
+       * gcc.target/i386/avx512f-vcvtsd2si-1.c,
+       gcc.target/i386/avx512f-vcvtss2si-1.c,
+       gcc.target/i386/avx512f-vcvttsd2si-1.c,
+       gcc.target/i386/avx512f-vcvttss2si-1.c: Permit l suffix.
+       * gcc.target/i386/avx512f-vcvtsi2ss-1.c,
+       gcc.target/i386/avx512f-vcvtusi2sd-1.c,
+       gcc.target/i386/avx512f-vcvtusi2ss-1.c: Expect l suffix.
+       * gcc.target/i386/avx512f-vcvtusi2sd-2.c,
+       gcc.target/i386/avx512f-vcvtusi2sd64-2.c,
+       gcc.target/i386/avx512f-vcvtusi2ss-2.c,
+       gcc.target/i386/avx512f-vcvtusi2ss64-2.c: Add asm volatile().
+       gcc.target/i386/pr19398.c: Permit l or q suffix.
+
 2019-01-11  Jakub Jelinek  <jakub@redhat.com>
 
        PR rtl-optimization/88296
index 893c85aceb656bc153e90368eb7e41499b641b33..845e206e025f9151d1823fd371da70c208dbbd69 100644 (file)
@@ -1,6 +1,6 @@
 /* { dg-do compile } */
 /* { dg-options "-O2 -mavx512f" } */
-/* { dg-final { scan-assembler-times "vcvtsd2si\[ \\t\]+\[^\n\]*\{rn-sae\}\[^\n\]*%xmm\[0-9\]+.{6}(?:\n|\[ \\t\]+#)" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtsd2sil?\[ \\t\]+\[^\n\]*\{rn-sae\}\[^\n\]*%xmm\[0-9\]+.{6}(?:\n|\[ \\t\]+#)" 1 } } */
 #include <immintrin.h>
 
 volatile __m128d x;
index 179ab64a7269517c80d86a7b67d29acc2d4fd79e..8e26576ee7fe753f32878e089166b75135485449 100644 (file)
@@ -1,6 +1,6 @@
 /* { dg-do compile } */
 /* { dg-options "-mavx512f -O2" } */
-/* { dg-final { scan-assembler-times "vcvtsi2ss\[ \\t\]+\[^%\n\]*%e\[^\{\n\]*\{rn-sae\}\[^\{\n\]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtsi2ssl\[ \\t\]+\[^%\n\]*%e\[^\{\n\]*\{rn-sae\}\[^\{\n\]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */
 
 #include <immintrin.h>
 
index d093814b0fb8d57cd4d3feb5a704ba5e69228e50..96289ef95c5f6e651fdef5d71a3b14453e1d2184 100644 (file)
@@ -1,6 +1,6 @@
 /* { dg-do compile } */
 /* { dg-options "-O2 -mavx512f" } */
-/* { dg-final { scan-assembler-times "vcvtss2si\[ \\t\]+\[^\n\]*\{rn-sae\}\[^\{\n\]*%xmm\[0-9\]+.{6}(?:\n|\[ \\t\]+#)" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtss2sil?\[ \\t\]+\[^\n\]*\{rn-sae\}\[^\{\n\]*%xmm\[0-9\]+.{6}(?:\n|\[ \\t\]+#)" 1 } } */
 #include <immintrin.h>
 
 volatile __m128 x;
index e9b1d9b6c094dccf36d50088c331fc24e7e863fb..e7f23aa7e50a9011eefc5343c7cc4a57152e2c28 100644 (file)
@@ -1,7 +1,7 @@
 /* { dg-do compile } */
 /* { dg-options "-O2 -mavx512f" } */
-/* { dg-final { scan-assembler-times "vcvttsd2si\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+.{6}(?:\n|\[ \\t\]+#)" 1 } } */
-/* { dg-final { scan-assembler-times "vcvttsd2si\[ \\t\]+\[^\{\n\]*\{sae\}\[^\n\]*%xmm\[0-9\]+.{6}(?:\n|\[ \\t\]+#)" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttsd2sil?\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+.{6}(?:\n|\[ \\t\]+#)" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttsd2sil?\[ \\t\]+\[^\{\n\]*\{sae\}\[^\n\]*%xmm\[0-9\]+.{6}(?:\n|\[ \\t\]+#)" 1 } } */
 #include <immintrin.h>
 
 volatile __m128d x;
index 7351d33b1426615a0fc2a0ed8a97bb5bccfc894d..859848201a406c555e2d92e58821036beff123ed 100644 (file)
@@ -1,7 +1,7 @@
 /* { dg-do compile } */
 /* { dg-options "-O2 -mavx512f" } */
-/* { dg-final { scan-assembler-times "vcvttss2si\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+.{6}(?:\n|\[ \\t\]+#)" 1 } } */
-/* { dg-final { scan-assembler-times "vcvttss2si\[ \\t\]+\[^\{\n\]*\{sae\}\[^\n\]*%xmm\[0-9\]+.{6}(?:\n|\[ \\t\]+#)" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttss2sil?\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+.{6}(?:\n|\[ \\t\]+#)" 1 } } */
+/* { dg-final { scan-assembler-times "vcvttss2sil?\[ \\t\]+\[^\{\n\]*\{sae\}\[^\n\]*%xmm\[0-9\]+.{6}(?:\n|\[ \\t\]+#)" 1 } } */
 #include <immintrin.h>
 
 volatile __m128 x;
index 215ed3df2b2fff89f32920c655b89c9c409af5a3..16fd394af56129215a73da06901ead21a191c354 100644 (file)
@@ -1,6 +1,6 @@
 /* { dg-do compile } */
 /* { dg-options "-mavx512f -O2" } */
-/* { dg-final { scan-assembler-times "vcvtusi2sd\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtusi2sdl\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */
 
 #include <immintrin.h>
 
index 2100cbeb42385ac77af5dc34e943263ed2d7f475..89e5f5428321a4ab418355d3a42d627aa2eb067b 100644 (file)
@@ -22,7 +22,9 @@ avx512f_test (void)
   s1.x = _mm_set_pd (-24.43, -43.35);
   s2 = 0xFEDCA987;
 
+  asm volatile ("" : "+m" (s2));
   res.x = _mm_cvtu32_sd (s1.x, s2);
+  asm volatile ("" : "+m" (s2));
 
   compute_vcvtusi2sd (s1.a, s2, res_ref);
 
index d7dc0f9940cf7aefa6e2202337831ffcb3148b67..c2736b7b3ff59245e6e66f269015cad61fa02556 100644 (file)
@@ -22,7 +22,9 @@ avx512f_test (void)
   s1.x = _mm_set_pd (-24.43, -43.35);
   s2 = 0xFEDCBA9876543210;
 
+  asm volatile ("" : "+m" (s2));
   res.x = _mm_cvtu64_sd (s1.x, s2);
+  asm volatile ("" : "+m" (s2));
 
   compute_vcvtusi2sd (s1.a, s2, res_ref);
 
index cbd5d3f0d5e0de083e38583a139cb09e465db666..829d2ab9688fcefbd3c5c94ab449f114bc6178c3 100644 (file)
@@ -1,7 +1,7 @@
 /* { dg-do compile } */
 /* { dg-options "-mavx512f -O2" } */
-/* { dg-final { scan-assembler-times "vcvtusi2ss\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */
-/* { dg-final { scan-assembler-times "vcvtusi2ss\[ \\t\]+\[^%\n\]*%e\[^\{\n\]*\{rn-sae\}\[^\{\n\]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtusi2ssl\[ \\t\]+\[^\{\n\]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */
+/* { dg-final { scan-assembler-times "vcvtusi2ssl\[ \\t\]+\[^%\n\]*%e\[^\{\n\]*\{rn-sae\}\[^\{\n\]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */
 
 #include <immintrin.h>
 
index b5f67dd0ba0c1b04c488c8cd05e5b98eef59d29e..6d2827d0fdd290d818f34e60ca9bf4b5370c37a7 100644 (file)
@@ -24,7 +24,9 @@ avx512f_test (void)
   s1.x = _mm_set_ps (-24.43, 68.346, -43.35, 546.46);
   s2 = 0xFEDCA987;
 
+  asm volatile ("" : "+m" (s2));
   res.x = _mm_cvtu32_ss (s1.x, s2);
+  asm volatile ("" : "+m" (s2));
 
   compute_vcvtusi2ss (s1.a, s2, res_ref);
 
index e3b015c2e332d2a66bc7c0aad417e7e1c95e1d34..1023e50073592f16a5457be14809dee3bdff5bf6 100644 (file)
@@ -24,7 +24,9 @@ avx512f_test (void)
   s1.x = _mm_set_ps (-24.43, 68.346, -43.35, 546.46);
   s2 = 0xFEDCBA9876543210;
 
+  asm volatile ("" : "+m" (s2));
   res.x = _mm_cvtu64_ss (s1.x, s2);
+  asm volatile ("" : "+m" (s2));
 
   compute_vcvtusi2ss (s1.a, s2, res_ref);
 
index 60931c0a0a4c0644aafdb518fcb639d053b4c00d..c494179e300b274329936548b1aa89493e059446 100644 (file)
@@ -6,4 +6,4 @@ int test (float a)
   return (a * a);
 }
 
-/* { dg-final { scan-assembler-not "cvttss2si\[^\\n\]*%xmm" } } */
+/* { dg-final { scan-assembler-not "cvttss2si\[lq\]?\[^\\n\]*%xmm" } } */