aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Wilson <wilson@gcc.gnu.org>1995-03-22 14:57:33 -0800
committerJim Wilson <wilson@gcc.gnu.org>1995-03-22 14:57:33 -0800
commite96a50ccad69f136f81e4d81b24282fa78dacb23 (patch)
tree7ca81f4b7f2824c1a069ca53762d9b15596dcfd7
parent9ff5b60dfbe8962d634a80adbdc7d01516fbb117 (diff)
downloadgcc-e96a50ccad69f136f81e4d81b24282fa78dacb23.zip
gcc-e96a50ccad69f136f81e4d81b24282fa78dacb23.tar.gz
gcc-e96a50ccad69f136f81e4d81b24282fa78dacb23.tar.bz2
(udivsi3): Don't clobber register 6.
(udivsi3, divsi3, mulsi3_call): Use a pseudo-reg with regclass 'z' for output rather than hard register 0. (block_move_real): Don't clobber registers 4 and 5. From-SVN: r9224
-rw-r--r--gcc/config/sh/sh.md37
1 files changed, 16 insertions, 21 deletions
diff --git a/gcc/config/sh/sh.md b/gcc/config/sh/sh.md
index df475e4..c17575d 100644
--- a/gcc/config/sh/sh.md
+++ b/gcc/config/sh/sh.md
@@ -292,17 +292,22 @@
;; Division instructions
;; -------------------------------------------------------------------------
-
;; we take advantage of the library routines which don't clobber as many
;; registers as a normal function call would.
+;; We must use a psuedo-reg forced to reg 0 in the SET_DEST rather than
+;; hard register 0. If we used hard register 0, then the next instruction
+;; would be a move from hard register 0 to a pseudo-reg. If the pseudo-reg
+;; gets allocated to a stack slot that needs its address reloaded, then
+;; there is nothing to prevent reload from using r0 to reload the address.
+;; This reload would clobber the value in r0 we are trying to store.
+;; If we let reload allocate r0, then this problem can never happen.
(define_insn ""
- [(set (reg:SI 0)
+ [(set (match_operand:SI 1 "register_operand" "=z")
(udiv:SI (reg:SI 4) (reg:SI 5)))
(clobber (reg:SI 18))
(clobber (reg:SI 17))
- (clobber (reg:SI 6))
(clobber (reg:SI 4))
(use (match_operand:SI 0 "arith_reg_operand" "r"))]
""
@@ -314,22 +319,18 @@
[(set (reg:SI 4) (match_operand:SI 1 "general_operand" "g"))
(set (reg:SI 5) (match_operand:SI 2 "general_operand" "g"))
(set (match_dup 3) (symbol_ref:SI "__udivsi3"))
- (parallel[(set (reg:SI 0)
+ (parallel[(set (match_operand:SI 0 "register_operand" "=z")
(udiv:SI (reg:SI 4)
(reg:SI 5)))
(clobber (reg:SI 18))
(clobber (reg:SI 17))
- (clobber (reg:SI 6))
(clobber (reg:SI 4))
- (use (match_dup 3))])
- (set (match_operand:SI 0 "general_operand" "=g")
- (reg:SI 0))]
+ (use (match_dup 3))])]
""
"operands[3] = gen_reg_rtx(SImode);")
-
(define_insn ""
- [(set (reg:SI 0)
+ [(set (match_operand:SI 1 "register_operand" "=z")
(div:SI (reg:SI 4) (reg:SI 5)))
(clobber (reg:SI 18))
(clobber (reg:SI 17))
@@ -346,7 +347,7 @@
[(set (reg:SI 4) (match_operand:SI 1 "general_operand" "g"))
(set (reg:SI 5) (match_operand:SI 2 "general_operand" "g"))
(set (match_dup 3) (symbol_ref:SI "__sdivsi3"))
- (parallel[(set (reg:SI 0)
+ (parallel[(set (match_operand:SI 0 "register_operand" "=z")
(div:SI (reg:SI 4)
(reg:SI 5)))
(clobber (reg:SI 18))
@@ -354,9 +355,7 @@
(clobber (reg:SI 1))
(clobber (reg:SI 2))
(clobber (reg:SI 3))
- (use (match_dup 3))])
- (set (match_operand:SI 0 "general_operand" "=g")
- (reg:SI 0))]
+ (use (match_dup 3))])]
""
"operands[3] = gen_reg_rtx(SImode);")
@@ -408,7 +407,7 @@
;; a call to a routine which clobbers known registers.
(define_insn ""
- [(set (reg:SI 0)
+ [(set (match_operand:SI 1 "register_operand" "=z")
(mult:SI (reg:SI 4) (reg:SI 5)))
(clobber (reg:SI 21))
(clobber (reg:SI 18))
@@ -426,7 +425,7 @@
[(set (reg:SI 4) (match_operand:SI 1 "general_operand" "g"))
(set (reg:SI 5) (match_operand:SI 2 "general_operand" "g"))
(set (match_dup 3) (symbol_ref:SI "__mulsi3"))
- (parallel[(set (reg:SI 0)
+ (parallel[(set (match_operand:SI 0 "register_operand" "=z")
(mult:SI (reg:SI 4)
(reg:SI 5)))
(clobber (reg:SI 21))
@@ -435,9 +434,7 @@
(clobber (reg:SI 3))
(clobber (reg:SI 2))
(clobber (reg:SI 1))
- (use (match_dup 3))])
- (set (match_operand:SI 0 "general_operand" "=g")
- (reg:SI 0))]
+ (use (match_dup 3))])]
""
"operands[3] = gen_reg_rtx(SImode);")
@@ -1675,8 +1672,6 @@
(mem:BLK (reg:SI 5)))
(use (match_operand:SI 0 "arith_reg_operand" "r"))
(clobber (reg:SI 17))
- (clobber (reg:SI 4))
- (clobber (reg:SI 5))
(clobber (reg:SI 0))])]
""
"jsr @%0%#"