(subsi3): Rename to subsi3_internal.

(subsi3): Rename to subsi3_internal.  Add new define_expand
to handle subtracting a register from a constant.

From-SVN: r10693
This commit is contained in:
Jim Wilson 1995-12-09 15:11:50 -08:00
parent 06ada9d1c1
commit caca3c8a03
1 changed files with 21 additions and 1 deletions

View File

@ -321,13 +321,33 @@
"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;
}
}")
;; -------------------------------------------------------------------------
;; Division instructions