"")
(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]))"
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")
(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)
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")
(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)]