]> gcc.gnu.org Git - gcc.git/commitdiff
(subsi3): Rename to subsi3_internal.
authorJim Wilson <wilson@gcc.gnu.org>
Sat, 9 Dec 1995 23:11:50 +0000 (15:11 -0800)
committerJim Wilson <wilson@gcc.gnu.org>
Sat, 9 Dec 1995 23:11:50 +0000 (15:11 -0800)
(subsi3): Rename to subsi3_internal.  Add new define_expand
to handle subtracting a register from a constant.

From-SVN: r10693

gcc/config/sh/sh.md

index 3b767fb7a8478c4655872a7245012de5a9c999bf..898b5088922bce676c43457a4fc798c76244b305 100644 (file)
   "clrt\;subc  %R2,%R0\;subc   %S2,%S0"
   [(set_attr "length" "6")])
 
-(define_insn "subsi3"
+(define_insn "*subsi3_internal"
   [(set (match_operand:SI 0 "arith_reg_operand" "=r")
        (minus:SI (match_operand:SI 1 "arith_reg_operand" "0")
                  (match_operand:SI 2 "arith_reg_operand" "r")))]
   ""
   "sub %2,%0"
   [(set_attr "type" "arith")])
+
+;; Convert `constant - reg' to `neg rX; add rX, #const' since this
+;; will sometimes save one instruction.  Otherwise we might get
+;; `mov #const, rY; sub rY,rX; mov rX, rY' if the source and dest regs
+;; are the same.
+
+(define_expand "subsi3"
+  [(set (match_operand:SI 0 "arith_reg_operand" "")
+       (minus:SI (match_operand:SI 1 "arith_operand" "")
+                 (match_operand:SI 2 "arith_reg_operand" "")))]
+  ""
+  "
+{
+  if (GET_CODE (operands[1]) == CONST_INT)
+    {
+      emit_insn (gen_negsi2 (operands[0], operands[2]));
+      emit_insn (gen_addsi3 (operands[0], operands[0], operands[1]));
+      DONE;
+    }
+}")
 \f
 ;; -------------------------------------------------------------------------
 ;; Division instructions
This page took 0.071527 seconds and 5 git commands to generate.