diff options
author | denisc <denisc@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-03-19 20:07:54 +0000 |
---|---|---|
committer | denisc <denisc@138bc75d-0d04-0410-961f-82ee72b054a4> | 2004-03-19 20:07:54 +0000 |
commit | f5391096aa3c8fd8a77c4c46033ff1b17eeff8c1 (patch) | |
tree | 7c5e497149e34008ed9322c348b29c12334db703 /gcc/config/avr | |
parent | 50d1f2691562e61e66d20b22c0bbbb5964633526 (diff) | |
download | gcc-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.md | 35 |
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)] |