--- gcc/config/avr/avr.c.orig   Sat May 12 15:32:41 2001
+++ gcc/config/avr/avr.c        Sat Oct  6 01:04:15 2001
@@ -562,7 +562,7 @@
       fprintf (file,"\tsei\n");
       ++prologue_size;
     }
-  if (interrupt_func_p | signal_func_p)
+  if (interrupt_func_p || signal_func_p)
     {
       fprintf (file, "\t"
                AS1 (push,__zero_reg__)   CR_TAB
@@ -574,14 +574,23 @@
     }
   if (main_p)
     {
-      fprintf (file, ("\t" 
-                     AS2 (ldi,r28,lo8(%s - %d)) CR_TAB
-                     AS2 (ldi,r29,hi8(%s - %d)) CR_TAB
-                     AS2 (out,__SP_H__,r29)     CR_TAB
-                     AS2 (out,__SP_L__,r28) "\n"),
-              avr_init_stack, size, avr_init_stack, size);
+      if (!TARGET_TINY_STACK) {
+        fprintf (file, ("\t" 
+                       AS2 (ldi,r28,lo8(%s - %d)) CR_TAB
+                       AS2 (ldi,r29,hi8(%s - %d)) CR_TAB
+                       AS2 (out,__SP_H__,r29)     CR_TAB
+                       AS2 (out,__SP_L__,r28) "\n"),
+                avr_init_stack, size, avr_init_stack, size);
       
-      prologue_size += 4;
+        prologue_size += 4;
+      } else {
+        fprintf (file, ("\t" 
+                       AS2 (ldi,r28,lo8(%s - %d)) CR_TAB
+                       AS2 (out,__SP_L__,r28) "\n"),
+                avr_init_stack, size);
+      
+        prologue_size += 2;
+      }
     }
   else if (minimize && (frame_pointer_needed || live_seq > 6)) 
     {
@@ -613,7 +622,8 @@
     {
       for (reg = 0; reg < 32; ++reg)
        {
-         if ((!leaf_func_p
+         if (!fixed_regs[reg] &&
+             ((!leaf_func_p
               && (call_used_regs[reg]
                   && (interrupt_func_p || signal_func_p)
                   && !(reg == TMP_REGNO || reg == ZERO_REGNO)))
@@ -621,7 +631,7 @@
                  && (!call_used_regs[reg]
                      || interrupt_func_p || signal_func_p)
                  && ! (frame_pointer_needed
-                       && (reg == REG_Y || reg == (REG_Y+1)))))
+                       && (reg == REG_Y || reg == (REG_Y+1))))))
            {
              fprintf (file, "\t" AS1 (push,%s) "\n", avr_regnames[reg]);
              ++prologue_size;
@@ -737,7 +747,7 @@
              fputs ("\t", file);
              epilogue_size += out_adj_frame_ptr (file, -size);
 
-             if (interrupt_func_p | signal_func_p)
+             if (interrupt_func_p || signal_func_p)
                {
                  epilogue_size += out_set_stack_ptr (file, -1, 0);
                }
@@ -754,7 +764,8 @@
 
       for (reg = 31; reg >= 0; --reg)
        {
-         if ((!leaf_func_p
+         if (!fixed_regs[reg] &&
+             ((!leaf_func_p
               && (call_used_regs[reg]
                   && (interrupt_func_p || signal_func_p)
                   && !(reg == TMP_REGNO || reg == ZERO_REGNO)))
@@ -762,14 +773,14 @@
                  && (!call_used_regs[reg]
                      || interrupt_func_p || signal_func_p)
                  && ! (frame_pointer_needed
-                       && (reg == REG_Y || reg == (REG_Y+1)))))
+                       && (reg == REG_Y || reg == (REG_Y+1))))))
            {
              fprintf (file, "\t" AS1 (pop,%s) "\n", avr_regnames[reg]);
              ++epilogue_size;
            }
        }
       
-      if (interrupt_func_p | signal_func_p)
+      if (interrupt_func_p || signal_func_p)
        {
          fprintf (file, "\t"
                   AS1 (pop,__tmp_reg__)      CR_TAB
