h8300.c (dosize): Don't clobber the static chain register if it's needed by the curre...
authorJeff Law <law@gcc.gnu.org>
Fri, 15 Nov 1996 00:26:51 +0000 (17:26 -0700)
committerJeff Law <law@gcc.gnu.org>
Fri, 15 Nov 1996 00:26:51 +0000 (17:26 -0700)
        * h8300/h8300.c (dosize): Don't clobber the static chain
        register if it's needed by the current function.

From-SVN: r13158

gcc/config/h8300/h8300.c

index 440b219a847b52bf8216cd17df83156052642aac..a8f973606e73084d83a06e8024ab1a155dcf002c 100644 (file)
@@ -170,7 +170,27 @@ dosize (file, op, size)
       break;
     default:
       if (TARGET_H8300)
-       fprintf (file, "\tmov.w\t#%d,r3\n\t%s.w\tr3,sp\n", size, op);
+       {
+         if (current_function_needs_context
+             && strcmp (op, "sub") == 0)
+           {
+             /* Egad.  We don't have a temporary to hold the
+                size of the frame in the prologue!  Just inline
+                the bastard since this shouldn't happen often.  */
+             while (size >= 2)
+               {
+                 fprintf (file, "\tsubs\t#2,sp\n");
+                 size -= 2;
+               }
+
+             if (size)
+               fprintf (file, "\tsubs\t#1,sp\n");
+
+             size = 0;
+           }
+         else
+           fprintf (file, "\tmov.w\t#%d,r3\n\t%s.w\tr3,sp\n", size, op);
+       }
       else
        fprintf (file, "\t%s\t#%d,sp\n", op, size);
       size = 0;