rs6000.md (bswapdi 2nd splitter): Don't swap words twice for little-endian.
authorAlan Modra <amodra@gmail.com>
Mon, 6 May 2013 00:19:07 +0000 (09:49 +0930)
committerAlan Modra <amodra@gcc.gnu.org>
Mon, 6 May 2013 00:19:07 +0000 (09:49 +0930)
* config/rs6000/rs6000.md (bswapdi 2nd splitter): Don't swap words
twice for little-endian.
(ashrdi3_no_power, ashrdi3): Support little-endian.

From-SVN: r198618

gcc/ChangeLog
gcc/config/rs6000/rs6000.md

index 5c2aea36ed9c8586cebcf043642745f88a5b799d..e2cfb396000c6e9d5a06cdd79d9708883a85a33f 100644 (file)
@@ -1,3 +1,9 @@
+2013-05-06  Alan Modra  <amodra@gmail.com>
+
+       * config/rs6000/rs6000.md (bswapdi 2nd splitter): Don't swap words
+       twice for little-endian.
+       (ashrdi3_no_power, ashrdi3): Support little-endian.
+
 2013-05-06  Oleg Endo  <olegendo@gcc.gnu.org>
 
        PR target/55303
index bdf19f8df471af0e5b3ebb99311115729c85293b..1e65ac1cde05422949a41f059580a70ae4b9a345 100644 (file)
     {
       word_high = change_address (dest, SImode, addr1);
       word_low  = change_address (dest, SImode, addr2);
-      emit_insn (gen_bswapsi2 (word_high, src_si));
-      emit_insn (gen_bswapsi2 (word_low, op3_si));
     }
   else
     {
       word_high = change_address (dest, SImode, addr2);
       word_low  = change_address (dest, SImode, addr1);
-      emit_insn (gen_bswapsi2 (word_low, src_si));
-      emit_insn (gen_bswapsi2 (word_high, op3_si));
     }
+  emit_insn (gen_bswapsi2 (word_high, src_si));
+  emit_insn (gen_bswapsi2 (word_low, op3_si));
 }")
 
 (define_split
   [(set (match_operand:DI 0 "gpc_reg_operand" "=&r,&r")
        (ashiftrt:DI (match_operand:DI 1 "gpc_reg_operand" "r,r")
                     (match_operand:SI 2 "const_int_operand" "M,i")))]
-  "TARGET_32BIT && !TARGET_POWERPC64 && WORDS_BIG_ENDIAN"
-  "@
-   srawi %0,%1,31\;srawi %L0,%1,%h2
-   srwi %L0,%L1,%h2\;insrwi %L0,%1,%h2,0\;srawi %0,%1,%h2"
+  "!TARGET_POWERPC64"
+  "*
+{
+  switch (which_alternative)
+    {
+    default:
+      gcc_unreachable ();
+    case 0:
+      if (WORDS_BIG_ENDIAN)
+        return \"srawi %0,%1,31\;srawi %L0,%1,%h2\";
+      else
+        return \"srawi %L0,%L1,31\;srawi %0,%L1,%h2\";
+    case 1:
+      if (WORDS_BIG_ENDIAN)
+       return \"srwi %L0,%L1,%h2\;insrwi %L0,%1,%h2,0\;srawi %0,%1,%h2\";
+      else
+       return \"srwi %0,%1,%h2\;insrwi %0,%L1,%h2,0\;srawi %L0,%L1,%h2\";
+    }
+}"
   [(set_attr "type" "two,three")
    (set_attr "length" "8,12")])
 
   [(set (match_operand:DI 0 "gpc_reg_operand" "")
        (ashiftrt:DI (match_operand:DI 1 "gpc_reg_operand" "")
                     (match_operand:SI 2 "reg_or_cint_operand" "")))]
-  "WORDS_BIG_ENDIAN"
+  ""
   "
 {
   if (TARGET_POWERPC64)
     ;
-  else if (TARGET_32BIT && GET_CODE (operands[2]) == CONST_INT
-          && WORDS_BIG_ENDIAN)
+  else if (GET_CODE (operands[2]) == CONST_INT)
     {
       emit_insn (gen_ashrdi3_no_power (operands[0], operands[1], operands[2]));
       DONE;