avr.md ("call_insn"): Handle explicit integer specially.
authorDenis Chertykov <denisc@overta.ru>
Fri, 19 Mar 2004 20:07:54 +0000 (20:07 +0000)
committerDenis Chertykov <denisc@gcc.gnu.org>
Fri, 19 Mar 2004 20:07:54 +0000 (23:07 +0300)
* config/avr/avr.md ("call_insn"): Handle explicit integer
specially.
(call_value_insn): Likewise.

From-SVN: r79697

gcc/ChangeLog
gcc/config/avr/avr.md

index 9fc58b7ea7fb4e9174b32941fa68e1684567055e..e04f07bfbf11059dc172ad092f8a242e06e1a92a 100644 (file)
@@ -1,3 +1,9 @@
+2004-03-19  Denis Chertykov  <denisc@overta.ru>
+
+       * config/avr/avr.md ("call_insn"): Handle explicit integer
+       specially.
+       (call_value_insn): Likewise.
+
 2004-03-19  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
 
        * tree.c (substitute_in_expr): Rewrite to simplify and be more generic.
index 53b879b5bb704ed7b517afcded5a4dfb9911ba6f..22da0b10250127b25ea9f874f5ac4f1dc3f87fc9 100644 (file)
   "")
 
 (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)]