spe.md (*mov_si<mode>_e500_subreg0): Rename to mov_si<mode>_e500_subreg0.
authorJoseph Myers <joseph@codesourcery.com>
Tue, 19 Jun 2012 22:08:49 +0000 (23:08 +0100)
committerJoseph Myers <jsm28@gcc.gnu.org>
Tue, 19 Jun 2012 22:08:49 +0000 (23:08 +0100)
* config/rs6000/spe.md (*mov_si<mode>_e500_subreg0): Rename to
mov_si<mode>_e500_subreg0.
(*mov_si<mode>_e500_subreg0_elf_low)
(*mov_si<mode>_e500_subreg4_elf_low): New patterns.

testsuite:
* gcc.c-torture/compile/vector-5.c,
gcc.c-torture/compile/vector-6.c: New tests.

From-SVN: r188795

gcc/ChangeLog
gcc/config/rs6000/spe.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/vector-5.c [new file with mode: 0644]
gcc/testsuite/gcc.c-torture/compile/vector-6.c [new file with mode: 0644]

index 2c8eb9e930dba378fea42c4776f81ae5f9345796..77e029e14144002c58b0cf02091639acf134425e 100644 (file)
@@ -1,3 +1,10 @@
+2012-06-19  Joseph Myers  <joseph@codesourcery.com>
+
+       * config/rs6000/spe.md (*mov_si<mode>_e500_subreg0): Rename to
+       mov_si<mode>_e500_subreg0.
+       (*mov_si<mode>_e500_subreg0_elf_low)
+       (*mov_si<mode>_e500_subreg4_elf_low): New patterns.
+
 2012-06-19  Richard Henderson  <rth@redhat.com>
 
        * config/alpha/alpha.c: Include params.h.
index bbe11b9124be9c31a72bd453d0d13e08a96807f2..43cdbfa92f269282e0c9fdfb56df55c2351438a3 100644 (file)
@@ -1,5 +1,5 @@
 ;; e500 SPE description
-;; Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
+;; Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012
 ;; Free Software Foundation, Inc.
 ;; Contributed by Aldy Hernandez (aldy@quesejoda.com)
 
   "evmergehi %0,%1,%1\;mr %L0,%1\;evmergehi %Y0,%L1,%L1\;mr %Z0,%L1"
   [(set_attr "length" "16")])
 
-(define_insn "*mov_si<mode>_e500_subreg0"
+(define_insn "mov_si<mode>_e500_subreg0"
   [(set (subreg:SI (match_operand:SPE64TF 0 "register_operand" "+r,&r") 0)
        (match_operand:SI 1 "input_operand" "r,m"))]
   "(TARGET_E500_DOUBLE && (<MODE>mode == DFmode || <MODE>mode == TFmode))
    evmergelohi %0,%0,%0\;{l%U1%X1|lwz%U1%X1} %0,%1\;evmergelohi %0,%0,%0"
   [(set_attr "length" "4,12")])
 
+(define_insn_and_split "*mov_si<mode>_e500_subreg0_elf_low"
+  [(set (subreg:SI (match_operand:SPE64TF 0 "register_operand" "+r") 0)
+       (lo_sum:SI (match_operand:SI 1 "gpc_reg_operand" "r")
+                  (match_operand 2 "" "")))]
+  "((TARGET_E500_DOUBLE && (<MODE>mode == DFmode || <MODE>mode == TFmode))
+    || (TARGET_SPE && <MODE>mode != DFmode && <MODE>mode != TFmode))
+   && TARGET_ELF && !TARGET_64BIT && can_create_pseudo_p ()"
+  "#"
+  "&& 1"
+  [(pc)]
+{
+  rtx tmp = gen_reg_rtx (SImode);
+  emit_insn (gen_elf_low (tmp, operands[1], operands[2]));
+  emit_insn (gen_mov_si<mode>_e500_subreg0 (operands[0], tmp));
+  DONE;
+}
+  [(set_attr "length" "8")])
+
 ;; ??? Could use evstwwe for memory stores in some cases, depending on
 ;; the offset.
 (define_insn "*mov_si<mode>_e500_subreg0_2"
    mr %0,%1
    {l%U1%X1|lwz%U1%X1} %0,%1")
 
+(define_insn "*mov_si<mode>_e500_subreg4_elf_low"
+  [(set (subreg:SI (match_operand:SPE64TF 0 "register_operand" "+r") 4)
+       (lo_sum:SI (match_operand:SI 1 "gpc_reg_operand" "r")
+                  (match_operand 2 "" "")))]
+  "((TARGET_E500_DOUBLE && (<MODE>mode == DFmode || <MODE>mode == TFmode))
+    || (TARGET_SPE && <MODE>mode != DFmode && <MODE>mode != TFmode))
+   && TARGET_ELF && !TARGET_64BIT"
+  "{ai|addic} %0,%1,%K2")
+
 (define_insn "*mov_si<mode>_e500_subreg4_2"
   [(set (match_operand:SI 0 "rs6000_nonimmediate_operand" "+r,m")
        (subreg:SI (match_operand:SPE64TF 1 "register_operand" "r,r") 4))]
index de7b7d54db7ab838e3f521f45a1fa0e1c31def49..c82c0ab1a0016660df693cf8f802fe2443587cfe 100644 (file)
@@ -1,3 +1,8 @@
+2012-06-19  Joseph Myers  <joseph@codesourcery.com>
+
+       * gcc.c-torture/compile/vector-5.c,
+       gcc.c-torture/compile/vector-6.c: New tests.
+
 2012-06-19  Richard Henderson  <rth@redhat.com>
 
        * gcc.target/i386/pr33329.c: Change multiplier constant to 12345.
diff --git a/gcc/testsuite/gcc.c-torture/compile/vector-5.c b/gcc/testsuite/gcc.c-torture/compile/vector-5.c
new file mode 100644 (file)
index 0000000..30a4f85
--- /dev/null
@@ -0,0 +1,7 @@
+typedef int v2si __attribute__((__vector_size__(8)));
+
+v2si
+f (int x)
+{
+  return (v2si) { x, (__INTPTR_TYPE__) "" };
+}
diff --git a/gcc/testsuite/gcc.c-torture/compile/vector-6.c b/gcc/testsuite/gcc.c-torture/compile/vector-6.c
new file mode 100644 (file)
index 0000000..7694d36
--- /dev/null
@@ -0,0 +1,7 @@
+typedef int v2si __attribute__((__vector_size__(8)));
+
+v2si
+f (int x)
+{
+  return (v2si) { (__INTPTR_TYPE__) "", x };
+}