re PR target/85281 (Assembler messages: Error: operand size mismatch for `vpbroadcast...
authorJakub Jelinek <jakub@redhat.com>
Wed, 11 Apr 2018 11:37:01 +0000 (13:37 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 11 Apr 2018 11:37:01 +0000 (13:37 +0200)
PR target/85281
* config/i386/sse.md (iptr): Add V16SFmode and V8DFmode cases.
(<avx512>_vec_dup<mode><mask_name>): Use a single pattern for modes
other than V2DFmode using iptr mode attribute.
(<avx512>_vec_dup<mode><mask_name>): Use iptr mode attribute.

* gcc.target/i386/pr85281.c: New test.

From-SVN: r259316

gcc/ChangeLog
gcc/config/i386/sse.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr85281.c [new file with mode: 0644]

index 1b17a9e4ea504fdfefc50b3d5a1066435d27ba38..9c86c5565d5e767c911d0849c9440cbe35abee4b 100644 (file)
@@ -1,3 +1,11 @@
+2018-04-11  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/85281
+       * config/i386/sse.md (iptr): Add V16SFmode and V8DFmode cases.
+       (<avx512>_vec_dup<mode><mask_name>): Use a single pattern for modes
+       other than V2DFmode using iptr mode attribute.
+       (<avx512>_vec_dup<mode><mask_name>): Use iptr mode attribute.
+
 2018-04-11  Alexander Monakov  <amonakov@ispras.ru>
 
        PR rtl-optimization/84659
index caca42d9e0d46aab70b75f0586a6bc15b3c157b2..8c970e0cc8aa58b56fc467409155960352a1175e 100644 (file)
   [(V64QI "b") (V32HI "w") (V16SI "k") (V8DI "q")
    (V32QI "b") (V16HI "w") (V8SI "k") (V4DI "q")
    (V16QI "b") (V8HI "w") (V4SI "k") (V2DI "q")
+   (V16SF "k") (V8DF "q")
    (V8SF "k") (V4DF "q")
    (V4SF "k") (V2DF "q")
    (SF "k") (DF "q")])
   if (<MODE>mode == V2DFmode)
     return "vpbroadcastq\t{%1, %0<mask_operand2>|%0<mask_operand2>, %q1}";
 
-  if (GET_MODE_SIZE (GET_MODE_INNER (<MODE>mode)) == 4)
-    return "v<sseintprefix>broadcast<bcstscalarsuff>\t{%1, %0<mask_operand2>|%0<mask_operand2>, %k1}";
-  else
-    return "v<sseintprefix>broadcast<bcstscalarsuff>\t{%1, %0<mask_operand2>|%0<mask_operand2>, %q1}";
+  return "v<sseintprefix>broadcast<bcstscalarsuff>\t{%1, %0<mask_operand2>|%0<mask_operand2>, %<iptr>1}";
 }
   [(set_attr "type" "ssemov")
    (set_attr "prefix" "evex")
            (match_operand:<ssexmmmode> 1 "nonimmediate_operand" "vm")
            (parallel [(const_int 0)]))))]
   "TARGET_AVX512BW"
-  "vpbroadcast<bcstscalarsuff>\t{%1, %0<mask_operand2>|%0<mask_operand2>, %1}"
+  "vpbroadcast<bcstscalarsuff>\t{%1, %0<mask_operand2>|%0<mask_operand2>, %<iptr>1}"
   [(set_attr "type" "ssemov")
    (set_attr "prefix" "evex")
    (set_attr "mode" "<sseinsnmode>")])
index 27e92c51cb41aff35c62abf9447f869a8810a0ae..8deaeb959746ba4fb7ac614c80c7acf41efacdee 100644 (file)
@@ -1,3 +1,8 @@
+2018-04-11  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/85281
+       * gcc.target/i386/pr85281.c: New test.
+
 2018-04-11  Alexander Monakov  <amonakov@ispras.ru>
 
        PR rtl-optimization/84659
diff --git a/gcc/testsuite/gcc.target/i386/pr85281.c b/gcc/testsuite/gcc.target/i386/pr85281.c
new file mode 100644 (file)
index 0000000..2903986
--- /dev/null
@@ -0,0 +1,15 @@
+/* PR target/85281 */
+/* { dg-do assemble { target avx512bw } } */
+/* { dg-require-effective-target int128 } */
+/* { dg-require-effective-target masm_intel } */
+/* { dg-options "-O -mavx512bw -masm=intel -w" } */
+
+typedef char V __attribute__ ((__vector_size__ (64)));
+
+V
+foo (V v)
+{
+  v[8] /= (unsigned __int128) 0;
+  v[0] -= ~255;
+  return v;
+}