summaryrefslogtreecommitdiff
path: root/gcc/config/stormy16/stormy16.md
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/config/stormy16/stormy16.md')
-rw-r--r--gcc/config/stormy16/stormy16.md25
1 files changed, 9 insertions, 16 deletions
diff --git a/gcc/config/stormy16/stormy16.md b/gcc/config/stormy16/stormy16.md
index 93f21fc9e05..bd68243a7e8 100644
--- a/gcc/config/stormy16/stormy16.md
+++ b/gcc/config/stormy16/stormy16.md
@@ -185,7 +185,7 @@
(define_insn "movhi_internal"
[(set (match_operand:HI 0 "nonimmediate_nonstack_operand" "=r,m,e,e,T,r,S,W,r")
- (match_operand:HI 1 "xs_hi_general_operand" "r,e,m,L,L,i,i,ir,W"))]
+ (match_operand:HI 1 "xs_hi_general_operand" "r,e,m,L,L,i,i,ie,W"))]
""
"@
mov %0,%1
@@ -304,11 +304,8 @@
;; ::::::::::::::::::::
;; Addition
-; Operand 3 is marked earlyclobber because that helps reload
-; to generate better code---this pattern will never need the
-; carry register as an input, and some output reloads or input
-; reloads might need to use it. In fact, without the '&' reload
-; will fail in some cases.
+; Note - the early clobber modifier is no longer needed on operand 3
+; and in fact can cause some reload spill failures if it is present.
; Note that the 'Z' constraint matches "add $reg,0", which reload
; will occasionally emit. We avoid the "add $reg,imm" match because
; it clobbers the carry.
@@ -316,7 +313,7 @@
[(set (match_operand:HI 0 "register_operand" "=r,r,r,T,T,r,r,r")
(plus:HI (match_operand:HI 1 "register_operand" "%0,0,0,0,0,0,0,0")
(match_operand:HI 2 "xs_hi_nonmemory_operand" "O,P,Z,L,M,Ir,N,i")))
- (clobber (match_scratch:BI 3 "=X,X,X,&y,&y,&y,&y,&y"))]
+ (clobber (match_scratch:BI 3 "=X,X,X,y,y,y,y,y"))]
""
"@
inc %0,%o2
@@ -905,15 +902,11 @@
"ri")])
(label_ref (match_operand 0 "" ""))
(pc)))
-;; Although I would greatly like the 'match_dup' in the following line
-;; to actually be a register constraint, there is (at the time of writing) no
-;; way for reload to insert an output reload on the edges out of a branch.
-;; If reload is fixed to use insert_insn_on_edge, this can be changed,
-;; preferably to a 'minus' operand that explains the actual operation, like:
-; (set (match_operand 5 "register_operand" "=2")
-; (minus:SI (match_operand 6 "register_operand" "2")
-; (match_operand 7 "register_operand" "3")))
- (clobber (match_dup 2))
+ ;; This clobber is problematic. Too many gcc optimizations will change
+ ;; operand 2 without changing the clobber. At the time of writing there
+ ;; is no way around this. :-( For an example try compiling:
+ ;; gcc.c-torture/compile/20000403-1.c -O3 -fomit-frame-pointer -funroll-loops
+ (clobber (match_operand:SI 5 "register_operand" "=2"))
(clobber (match_operand:BI 4 "" "=&y"))]
""
"#"