summaryrefslogtreecommitdiff
path: root/gcc/config/avr
diff options
context:
space:
mode:
authordenisc <denisc@138bc75d-0d04-0410-961f-82ee72b054a4>2004-03-19 20:07:54 +0000
committerdenisc <denisc@138bc75d-0d04-0410-961f-82ee72b054a4>2004-03-19 20:07:54 +0000
commitf5391096aa3c8fd8a77c4c46033ff1b17eeff8c1 (patch)
tree7c5e497149e34008ed9322c348b29c12334db703 /gcc/config/avr
parent50d1f2691562e61e66d20b22c0bbbb5964633526 (diff)
downloadgcc-f5391096aa3c8fd8a77c4c46033ff1b17eeff8c1.tar.gz
* config/avr/avr.md ("call_insn"): Handle explicit integer
specially. (call_value_insn): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@79697 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/avr')
-rw-r--r--gcc/config/avr/avr.md35
1 files changed, 22 insertions, 13 deletions
diff --git a/gcc/config/avr/avr.md b/gcc/config/avr/avr.md
index 53b879b5bb7..22da0b10250 100644
--- a/gcc/config/avr/avr.md
+++ b/gcc/config/avr/avr.md
@@ -2086,8 +2086,8 @@
"")
(define_insn "call_insn"
- [(call (mem:HI (match_operand:HI 0 "nonmemory_operand" "!z,*r,i"))
- (match_operand:HI 1 "general_operand" "X,X,X"))]
+ [(call (mem:HI (match_operand:HI 0 "nonmemory_operand" "!z,*r,s,n"))
+ (match_operand:HI 1 "general_operand" "X,X,X,X"))]
;; We don't need in saving Z register because r30,r31 is a call used registers
;; Operand 1 not used on the AVR.
"(register_operand (operands[0], HImode) || CONSTANT_P (operands[0]))"
@@ -2104,9 +2104,13 @@
AS2 (mov, r31, %B0) CR_TAB
\"icall\");
}
- return AS1(%~call,%c0);
+ else if (which_alternative==2)
+ return AS1(%~call,%c0);
+ return (AS2 (ldi,r30,lo8(%0)) CR_TAB
+ AS2 (ldi,r31,hi8(%0)) CR_TAB
+ \"icall\");
}"
- [(set_attr "cc" "clobber,clobber,clobber")
+ [(set_attr "cc" "clobber,clobber,clobber,clobber")
(set_attr_alternative "length"
[(const_int 1)
(if_then_else (eq_attr "mcu_enhanced" "yes")
@@ -2114,17 +2118,17 @@
(const_int 3))
(if_then_else (eq_attr "mcu_mega" "yes")
(const_int 2)
- (const_int 1))])])
+ (const_int 1))
+ (const_int 3)])])
(define_insn "call_value_insn"
- [(set (match_operand 0 "register_operand" "=r,r,r")
- (call (mem:HI (match_operand:HI 1 "nonmemory_operand" "!z,*r,i"))
+ [(set (match_operand 0 "register_operand" "=r,r,r,r")
+ (call (mem:HI (match_operand:HI 1 "nonmemory_operand" "!z,*r,s,n"))
;; We don't need in saving Z register because r30,r31 is a call used registers
- (match_operand:HI 2 "general_operand" "X,X,X")))]
+ (match_operand:HI 2 "general_operand" "X,X,X,X")))]
;; Operand 2 not used on the AVR.
"(register_operand (operands[0], VOIDmode) || CONSTANT_P (operands[0]))"
- "*
-{
+ "*{
if (which_alternative==0)
return \"icall\";
else if (which_alternative==1)
@@ -2137,9 +2141,13 @@
AS2 (mov, r31, %B1) CR_TAB
\"icall\");
}
- return AS1(%~call,%c1);
+ else if (which_alternative==2)
+ return AS1(%~call,%c1);
+ return (AS2 (ldi, r30, lo8(%1)) CR_TAB
+ AS2 (ldi, r31, hi8(%1)) CR_TAB
+ \"icall\");
}"
- [(set_attr "cc" "clobber,clobber,clobber")
+ [(set_attr "cc" "clobber,clobber,clobber,clobber")
(set_attr_alternative "length"
[(const_int 1)
(if_then_else (eq_attr "mcu_enhanced" "yes")
@@ -2147,7 +2155,8 @@
(const_int 3))
(if_then_else (eq_attr "mcu_mega" "yes")
(const_int 2)
- (const_int 1))])])
+ (const_int 1))
+ (const_int 3)])])
(define_insn "return"
[(return)]