AArch64 backend support for EXTR instruction.
authorIan Bolton <ian.bolton@arm.com>
Tue, 19 Mar 2013 16:17:14 +0000 (16:17 +0000)
committerIan Bolton <ibolton@gcc.gnu.org>
Tue, 19 Mar 2013 16:17:14 +0000 (16:17 +0000)
From-SVN: r196795

gcc/ChangeLog
gcc/config/aarch64/aarch64.md
gcc/testsuite/ChangeLog

index b55bc7f8d39fc9008bd47666ec1d5c6c0a322677..4b2d216356dc23c217fd80e99dcc2fd565cd0075 100644 (file)
@@ -1,3 +1,8 @@
+2013-03-19  Ian Bolton  <ian.bolton@arm.com>
+
+       * config/aarch64/aarch64.md (*extr<mode>5_insn): New pattern.
+       (*extrsi5_insn_uxtw): Likewise.
+
 2013-03-19  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/56273
index 76a51259728c398a9152f0e5cc1de4fe97ea9dec..8fc86d47de94e61e0d43dd62c798d312eeb47aad 100644 (file)
    (set_attr "mode" "<MODE>")]
 )
 
+(define_insn "*extr<mode>5_insn"
+  [(set (match_operand:GPI 0 "register_operand" "=r")
+       (ior:GPI (ashift:GPI (match_operand:GPI 1 "register_operand" "r")
+                            (match_operand 3 "const_int_operand" "n"))
+                (lshiftrt:GPI (match_operand:GPI 2 "register_operand" "r")
+                              (match_operand 4 "const_int_operand" "n"))))]
+  "UINTVAL (operands[3]) < GET_MODE_BITSIZE (<MODE>mode) &&
+   (UINTVAL (operands[3]) + UINTVAL (operands[4]) == GET_MODE_BITSIZE (<MODE>mode))"
+  "extr\\t%<w>0, %<w>1, %<w>2, %4"
+  [(set_attr "v8type" "shift")
+   (set_attr "mode" "<MODE>")]
+)
+
+;; zero_extend version of the above
+(define_insn "*extrsi5_insn_uxtw"
+  [(set (match_operand:DI 0 "register_operand" "=r")
+       (zero_extend:DI
+        (ior:SI (ashift:SI (match_operand:SI 1 "register_operand" "r")
+                           (match_operand 3 "const_int_operand" "n"))
+                (lshiftrt:SI (match_operand:SI 2 "register_operand" "r")
+                             (match_operand 4 "const_int_operand" "n")))))]
+  "UINTVAL (operands[3]) < 32 &&
+   (UINTVAL (operands[3]) + UINTVAL (operands[4]) == 32)"
+  "extr\\t%w0, %w1, %w2, %4"
+  [(set_attr "v8type" "shift")
+   (set_attr "mode" "SI")]
+)
+
 (define_insn "*<ANY_EXTEND:optab><GPI:mode>_ashl<SHORT:mode>"
   [(set (match_operand:GPI 0 "register_operand" "=r")
        (ANY_EXTEND:GPI
index 5a6552844de6a97ad7df8364536057d181687b6c..fa69025f09523939a8586bee5d982a73afd697f7 100644 (file)
@@ -1,3 +1,7 @@
+2013-03-19  Ian Bolton  <ian.bolton@arm.com>
+
+       * gcc.target/aarch64/extr.c: New test.
+
 2013-03-19  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/56273