rs6000.md (bswapsi2): New define_insn and splitter.
authorDavid Edelsohn <edelsohn@gnu.org>
Sun, 18 Feb 2007 20:55:31 +0000 (20:55 +0000)
committerDavid Edelsohn <dje@gcc.gnu.org>
Sun, 18 Feb 2007 20:55:31 +0000 (15:55 -0500)
2007-02-18  David Edelsohn  <edelsohn@gnu.org>
            Roger Sayle  <roger@eyesopen.com>

        * config/rs6000/rs6000.md (bswapsi2): New define_insn and splitter.

Co-Authored-By: Roger Sayle <roger@eyesopen.com>
From-SVN: r122104

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

index 751d6c16231ef663816d51740b9b4f25609b456b..c797248648b159e781b944b8412a8545f24f89e3 100644 (file)
@@ -1,3 +1,8 @@
+2007-02-18  David Edelsohn  <edelsohn@gnu.org>
+           Roger Sayle  <roger@eyesopen.com>
+
+       * config/rs6000/rs6000.md (bswapsi2): New define_insn and splitter.
+
 2007-02-18  Sandra Loosemore  <sandra@codesourcery.com>
 
        * calls.c (initialize_argument_information): Pass original EXP
index 21959a53f0fe118b456a9ba1dcfbdaf3f5efa1df..54202e489f492a416baa2c2c14a28a8d3866e77a 100644 (file)
     DONE;
   })
 
+(define_insn "bswapsi2"
+  [(set (match_operand:SI 0 "reg_or_mem_operand" "=r,Z,&r")
+       (bswap:SI (match_operand:SI 1 "reg_or_mem_operand" "Z,r,r")))]
+  ""
+  "@
+   {lbrx|lwbrx} %0,%y1
+   {stbrx|stwbrx} %1,%y0
+   #"
+  [(set_attr "length" "4,4,12")])
+
+(define_split
+  [(set (match_operand:SI 0 "gpc_reg_operand" "")
+       (bswap:SI (match_operand:SI 1 "gpc_reg_operand" "")))]
+  "reload_completed"
+  [(set (match_dup 0)
+       (rotate:SI (match_dup 1) (const_int 8)))
+   (set (zero_extract:SI (match_dup 0)
+                        (const_int 8)
+                        (const_int 0))
+       (match_dup 1))
+   (set (zero_extract:SI (match_dup 0)
+                        (const_int 8)
+                        (const_int 16))
+       (rotate:SI (match_dup 1)
+                  (const_int 16)))]
+  "")
+
 (define_expand "mulsi3"
   [(use (match_operand:SI 0 "gpc_reg_operand" ""))
    (use (match_operand:SI 1 "gpc_reg_operand" ""))