arm.md (negdi2): Use gen_negdi2_neon.
authorAndrew Stubbs <ams@codesourcery.com>
Mon, 30 Apr 2012 13:52:16 +0000 (13:52 +0000)
committerAndrew Stubbs <ams@gcc.gnu.org>
Mon, 30 Apr 2012 13:52:16 +0000 (13:52 +0000)
2012-04-30  Andrew Stubbs  <ams@codesourcery.com>

* config/arm/arm.md (negdi2): Use gen_negdi2_neon.
* config/arm/neon.md (negdi2_neon): New insn.
Also add splitters for core and NEON registers.

From-SVN: r186984

gcc/ChangeLog
gcc/config/arm/arm.md
gcc/config/arm/neon.md

index dccd2ca5f34c3c7356f5b5a38440f2abb8d021a2..df2de77a90deb91e601581b9af42a2e9f5d57cf9 100644 (file)
@@ -1,3 +1,9 @@
+2012-04-30  Andrew Stubbs  <ams@codesourcery.com>
+
+       * config/arm/arm.md (negdi2): Use gen_negdi2_neon.
+       * config/arm/neon.md (negdi2_neon): New insn.
+       Also add splitters for core and NEON registers.
+
 2012-04-30  Andrew Stubbs  <ams@codesourcery.com>
 
        * config/arm/arm.c (neon_valid_immediate): Allow const_int.
index 79eff0e4fe4ab2064b629eb95b1737ae2e0778e6..9506228c5e4ae13f3f02616a5e4a039c568efca0 100644 (file)
         (neg:DI (match_operand:DI 1 "s_register_operand" "")))
     (clobber (reg:CC CC_REGNUM))])]
   "TARGET_EITHER"
-  ""
+  {
+    if (TARGET_NEON)
+      {
+        emit_insn (gen_negdi2_neon (operands[0], operands[1]));
+       DONE;
+      }
+  }
 )
 
 ;; The constraints here are to prevent a *partial* overlap (where %Q0 == %R1).
index 960bf313076bf80767719d2d96f319da36220cac..4568dead2f1cbb2dc64187e138bcb330ebb55bb7 100644 (file)
                     (const_string "neon_int_3")))]
 )
 
+(define_insn "negdi2_neon"
+  [(set (match_operand:DI 0 "s_register_operand"        "=&w, w,r,&r")
+       (neg:DI (match_operand:DI 1 "s_register_operand" "  w, w,0, r")))
+   (clobber (match_scratch:DI 2                                 "= X,&w,X, X"))
+   (clobber (reg:CC CC_REGNUM))]
+  "TARGET_NEON"
+  "#"
+  [(set_attr "length" "8")]
+)
+
+; Split negdi2_neon for vfp registers
+(define_split
+  [(set (match_operand:DI 0 "s_register_operand" "")
+       (neg:DI (match_operand:DI 1 "s_register_operand" "")))
+   (clobber (match_scratch:DI 2 ""))
+   (clobber (reg:CC CC_REGNUM))]
+  "TARGET_NEON && reload_completed && IS_VFP_REGNUM (REGNO (operands[0]))"
+  [(set (match_dup 2) (const_int 0))
+   (parallel [(set (match_dup 0) (minus:DI (match_dup 2) (match_dup 1)))
+             (clobber (reg:CC CC_REGNUM))])]
+  {
+    if (!REG_P (operands[2]))
+      operands[2] = operands[0];
+  }
+)
+
+; Split negdi2_neon for core registers
+(define_split
+  [(set (match_operand:DI 0 "s_register_operand" "")
+       (neg:DI (match_operand:DI 1 "s_register_operand" "")))
+   (clobber (match_scratch:DI 2 ""))
+   (clobber (reg:CC CC_REGNUM))]
+  "TARGET_32BIT && reload_completed
+   && arm_general_register_operand (operands[0], DImode)"
+  [(parallel [(set (match_dup 0) (neg:DI (match_dup 1)))
+             (clobber (reg:CC CC_REGNUM))])]
+  ""
+)
+
 (define_insn "*umin<mode>3_neon"
   [(set (match_operand:VDQIW 0 "s_register_operand" "=w")
        (umin:VDQIW (match_operand:VDQIW 1 "s_register_operand" "w")