re PR target/85473 (internal compiler error: in emit_move_insn, at expr.c:3722)
authorSebastian Peryt <sebastian.peryt@intel.com>
Wed, 25 Apr 2018 12:39:57 +0000 (14:39 +0200)
committerSebastian Peryt <speryt@gcc.gnu.org>
Wed, 25 Apr 2018 12:39:57 +0000 (14:39 +0200)
2018-04-25  Sebastian Peryt  <sebastian.peryt@intel.com>

gcc/ChangeLog:

PR target/85473
* config/i386/i386.c (ix86_expand_builtin): Change memory
operand to XI, extend p0 to Pmode.
* config/i386/i386.md: Change unspec volatile and operand
1 mode to XI, change operand 0 mode to P.

gcc/testsuite/ChangeLog:

PR target/85473
* gcc.target/i386/pr85473-1.c: New test.
* gcc.target/i386/pr85473-2.c: New test.

From-SVN: r259648

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/config/i386/i386.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr85473-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr85473-2.c [new file with mode: 0644]

index 6ea0aaa7eeaa1ef4dd02a3d72f418653c62d9234..e65ab7bd83f6da50230365f933484ba729e796ed 100644 (file)
@@ -1,3 +1,11 @@
+2018-04-25  Sebastian Peryt  <sebastian.peryt@intel.com>
+
+       PR target/85473
+       * config/i386/i386.c (ix86_expand_builtin): Change memory
+       operand to XI, extend p0 to Pmode.
+       * config/i386/i386.md: Change unspec volatile and operand
+       1 mode to XI, change operand 0 mode to P.
+
 2018-04-25  Chung-Ju Wu  <jasonwucj@gmail.com>
 
        * config/nds32/nds32-predicates.c (nds32_can_use_bclr_p): Mask with
index a3c3870d4f4df4c2c2b5dff1954e69de474dfae1..6a2141e48dbd4f44bbd0efc9967d1afa3bf81725 100644 (file)
@@ -37147,11 +37147,14 @@ ix86_expand_builtin (tree exp, rtx target, rtx subtarget,
       arg1 = CALL_EXPR_ARG (exp, 1);
       op0 = expand_normal (arg0);
       op1 = expand_normal (arg1);
-      mode0 = (TARGET_64BIT ? DImode : SImode);
 
-      op0 = force_reg (mode0, op0);
-      if (!memory_operand (op1, mode0))
-       op1 = gen_rtx_MEM (mode0, op1);
+      op0 = ix86_zero_extend_to_Pmode (op0);
+      if (!address_operand (op1, VOIDmode))
+      {
+       op1 = convert_memory_address (Pmode, op1);
+       op1 = copy_addr_to_reg (op1);
+      }
+      op1 = gen_rtx_MEM (XImode, op1);
 
       insn = (TARGET_64BIT
                ? gen_movdir64b_di (op0, op1)
index a134ca8801419a240ea4cb238839b97ee93f4b13..ad9ccf9d1d7070ff07ccb5b2f7e4273b5c5f6fe9 100644 (file)
   [(set_attr "type" "other")])
 
 (define_insn "movdir64b_<mode>"
-  [(unspec_volatile:SWI48[(match_operand:SWI48 0 "register_operand" "r")
-       (match_operand:SWI48 1 "memory_operand")]
+  [(unspec_volatile:XI[(match_operand:P 0 "register_operand" "r")
+       (match_operand:XI 1 "memory_operand")]
                 UNSPECV_MOVDIR64B)]
   "TARGET_MOVDIR64B"
   "movdir64b\t{%1, %0|%0, %1}"
index 7a955a68c3eceb5d036aa98facf692c8f03c4c54..a62a9cb86f4da91f0aa4e06daf8d46c28b6eca08 100644 (file)
@@ -1,3 +1,9 @@
+2018-04-25  Sebastian Peryt  <sebastian.peryt@intel.com>
+
+       PR target/85473
+       * gcc.target/i386/pr85473-1.c: New test.
+       * gcc.target/i386/pr85473-2.c: New test.
+
 2018-04-25  Nathan Sidwell  <nathan@acm.org>
            Jakub Jelinek  <jakub@redhat.com>
 
diff --git a/gcc/testsuite/gcc.target/i386/pr85473-1.c b/gcc/testsuite/gcc.target/i386/pr85473-1.c
new file mode 100644 (file)
index 0000000..d0c04d3
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do compile { target { ! ia32 } } } */
+/* { dg-require-effective-target maybe_x32 } */
+/* { dg-options "-O2 -mx32 -maddress-mode=short -mmovdir64b" } */
+/* { dg-final { scan-assembler "movdir64b\[ \\t\]" } } */
+
+unsigned int w[5] __attribute__((aligned(64)));
+
+void
+foo ()
+{
+
+   unsigned int array[] = {1, 2, 3, 4, 5};
+   __builtin_ia32_movdir64b(w, array);
+}
+
diff --git a/gcc/testsuite/gcc.target/i386/pr85473-2.c b/gcc/testsuite/gcc.target/i386/pr85473-2.c
new file mode 100644 (file)
index 0000000..a325d04
--- /dev/null
@@ -0,0 +1,7 @@
+/* { dg-do compile { target { ! ia32 } } } */
+/* { dg-require-effective-target maybe_x32 } */
+/* { dg-options "-O2 -mx32 -maddress-mode=long -mmovdir64b" } */
+/* { dg-final { scan-assembler "movdir64b\[ \\t\]" } } */
+
+#include "pr85473-1.c"
+