OSDN Git Service

Backport from mainline
authoruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 30 Apr 2013 05:30:20 +0000 (05:30 +0000)
committeruros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 30 Apr 2013 05:30:20 +0000 (05:30 +0000)
2013-04-29  Uros Bizjak  <ubizjak@gmail.com>

PR target/44578
* config/i386/i386.md (*zero_extendsidi2_rex64): Add "!" to m->?*y
alternative.
(*zero_extendsidi2): Ditto.

Backport from mainline
2013-04-29  Uros Bizjak  <ubizjak@gmail.com>

PR target/57098
* config/i386/i386.c (ix86_expand_vec_perm): Validize constant memory.

testsuite/ChangeLog:

Backport from mainline
2013-04-29  Uros Bizjak  <ubizjak@gmail.com>

PR target/44578
* gcc.target/i386/pr44578.c: New test.

Backport from mainline
2013-04-29  Uros Bizjak  <ubizjak@gmail.com>

PR target/57098
* gcc.target/i386/pr57098.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@198439 138bc75d-0d04-0410-961f-82ee72b054a4

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

index d2214c0..5686631 100644 (file)
@@ -1,3 +1,19 @@
+2013-04-30  Uros Bizjak  <ubizjak@gmail.com>
+
+       Backport from mainline
+       2013-04-29  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/44578
+       * config/i386/i386.md (*zero_extendsidi2_rex64): Add "!" to m->?*y
+       alternative.
+       (*zero_extendsidi2): Ditto.
+
+       Backport from mainline
+       2013-04-29  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/57098
+       * config/i386/i386.c (ix86_expand_vec_perm): Validize constant memory.
+
 2013-04-29  Christian Bruel  <christian.bruel@st.com>
 
        PR target/57108
 2013-04-29  Christian Bruel  <christian.bruel@st.com>
 
        PR target/57108
index 440bd82..cd117d4 100644 (file)
@@ -20026,7 +20026,7 @@ ix86_expand_vec_perm (rtx operands[])
              vec[i * 2 + 1] = const1_rtx;
            }
          vt = gen_rtx_CONST_VECTOR (maskmode, gen_rtvec_v (w, vec));
              vec[i * 2 + 1] = const1_rtx;
            }
          vt = gen_rtx_CONST_VECTOR (maskmode, gen_rtvec_v (w, vec));
-         vt = force_const_mem (maskmode, vt);
+         vt = validize_mem (force_const_mem (maskmode, vt));
          t1 = expand_simple_binop (maskmode, PLUS, t1, vt, t1, 1,
                                    OPTAB_DIRECT);
 
          t1 = expand_simple_binop (maskmode, PLUS, t1, vt, t1, 1,
                                    OPTAB_DIRECT);
 
@@ -20223,7 +20223,7 @@ ix86_expand_vec_perm (rtx operands[])
       for (i = 0; i < 16; ++i)
        vec[i] = GEN_INT (i/e * e);
       vt = gen_rtx_CONST_VECTOR (V16QImode, gen_rtvec_v (16, vec));
       for (i = 0; i < 16; ++i)
        vec[i] = GEN_INT (i/e * e);
       vt = gen_rtx_CONST_VECTOR (V16QImode, gen_rtvec_v (16, vec));
-      vt = force_const_mem (V16QImode, vt);
+      vt = validize_mem (force_const_mem (V16QImode, vt));
       if (TARGET_XOP)
        emit_insn (gen_xop_pperm (mask, mask, mask, vt));
       else
       if (TARGET_XOP)
        emit_insn (gen_xop_pperm (mask, mask, mask, vt));
       else
@@ -20234,7 +20234,7 @@ ix86_expand_vec_perm (rtx operands[])
       for (i = 0; i < 16; ++i)
        vec[i] = GEN_INT (i % e);
       vt = gen_rtx_CONST_VECTOR (V16QImode, gen_rtvec_v (16, vec));
       for (i = 0; i < 16; ++i)
        vec[i] = GEN_INT (i % e);
       vt = gen_rtx_CONST_VECTOR (V16QImode, gen_rtvec_v (16, vec));
-      vt = force_const_mem (V16QImode, vt);
+      vt = validize_mem (force_const_mem (V16QImode, vt));
       emit_insn (gen_addv16qi3 (mask, mask, vt));
     }
 
       emit_insn (gen_addv16qi3 (mask, mask, vt));
     }
 
index d462b76..627beee 100644 (file)
 })
 
 (define_insn "*zero_extendsidi2_rex64"
 })
 
 (define_insn "*zero_extendsidi2_rex64"
-  [(set (match_operand:DI 0 "nonimmediate_operand"  "=r,o,?*Ym,?*y,?*Yi,*x")
+  [(set (match_operand:DI 0 "nonimmediate_operand"  "=r,o,?*Ym,?!*y,?*Yi,*x")
        (zero_extend:DI
        (zero_extend:DI
-        (match_operand:SI 1 "nonimmediate_operand" "rm,0,r   ,m  ,r   ,m")))]
+        (match_operand:SI 1 "nonimmediate_operand" "rm,0,r   ,m   ,r   ,m")))]
   "TARGET_64BIT"
   "@
    mov{l}\t{%1, %k0|%k0, %1}
   "TARGET_64BIT"
   "@
    mov{l}\t{%1, %k0|%k0, %1}
 
 ;; %%% Kill me once multi-word ops are sane.
 (define_insn "zero_extendsidi2_1"
 
 ;; %%% Kill me once multi-word ops are sane.
 (define_insn "zero_extendsidi2_1"
-  [(set (match_operand:DI 0 "nonimmediate_operand" "=r,?r,?o,?*Ym,?*y,?*Yi,*x")
+  [(set (match_operand:DI 0 "nonimmediate_operand" "=r,?r,?o,?*Ym,?!*y,?*Yi,*x")
        (zero_extend:DI
        (zero_extend:DI
-        (match_operand:SI 1 "nonimmediate_operand" "0,rm,r ,r   ,m  ,r   ,m")))
+        (match_operand:SI 1 "nonimmediate_operand" "0,rm,r ,r   ,m   ,r   ,m")))
    (clobber (reg:CC FLAGS_REG))]
   "!TARGET_64BIT"
   "@
    (clobber (reg:CC FLAGS_REG))]
   "!TARGET_64BIT"
   "@
index fda80e8..2dcb742 100644 (file)
@@ -1,3 +1,17 @@
+2013-04-30  Uros Bizjak  <ubizjak@gmail.com>
+
+       Backport from mainline
+       2013-04-29  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/44578
+       * gcc.target/i386/pr44578.c: New test.
+
+       Backport from mainline
+       2013-04-29  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/57098
+       * gcc.target/i386/pr57098.c: New test.
+
 2013-04-29  Christian Bruel  <christian.bruel@st.com>
 
        PR target/57108
 2013-04-29  Christian Bruel  <christian.bruel@st.com>
 
        PR target/57108
diff --git a/gcc/testsuite/gcc.target/i386/pr44578.c b/gcc/testsuite/gcc.target/i386/pr44578.c
new file mode 100644 (file)
index 0000000..20f76c3
--- /dev/null
@@ -0,0 +1,31 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mtune=athlon64" } */
+
+extern void abort (void);
+
+long double
+__attribute__((noinline, noclone))
+test (float num)
+{
+  unsigned int i;
+
+  if (num < 0.0)
+    num = 0.0;
+
+  __builtin_memcpy (&i, &num, sizeof(unsigned int));
+
+  return (long double)(unsigned long long) i;
+}
+
+int
+main ()
+{
+  long double x;
+
+  x = test (0.0);
+
+  if (x != 0.0)
+    abort ();
+
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.target/i386/pr57098.c b/gcc/testsuite/gcc.target/i386/pr57098.c
new file mode 100644 (file)
index 0000000..37598d7
--- /dev/null
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target lp64 } */
+/* { dg-options "-msse4 -mcmodel=large" } */
+
+typedef int V __attribute__((vector_size(16)));
+
+void foo (V *p, V *mask)
+{
+  *p = __builtin_shuffle (*p, *mask);
+}