* config/m32c/m32c-lib1.S (m32c_jsri16): Make reentrant.
authorDJ Delorie <dj@redhat.com>
Fri, 22 Oct 2010 19:56:51 +0000 (15:56 -0400)
committerDJ Delorie <dj@gcc.gnu.org>
Fri, 22 Oct 2010 19:56:51 +0000 (15:56 -0400)
From-SVN: r165859

gcc/ChangeLog
gcc/config/m32c/m32c-lib1.S

index d4114d3..78802b0 100644 (file)
@@ -1,3 +1,7 @@
+2010-10-22  DJ Delorie  <dj@redhat.com>
+
+       * config/m32c/m32c-lib1.S (m32c_jsri16): Make reentrant.
+
 2010-10-22  Paul Koning  <ni1d@arrl.net>
 
        * config/pdp11/pdp11.h (IRA_COVER_CLASSES): Define.
index 9556e09..777781b 100644 (file)
@@ -204,20 +204,28 @@ cmpsi_lt:
 #endif
 
 #ifdef L__m32c_jsri16
-       .data
-m32c_jsri_addr:
-       .byte   0, 0, 0
-m32c_jsri_ret:
-       .byte   0, 0, 0
-
        .text
+#ifdef A16
        .global m32c_jsri16
 m32c_jsri16:
-       pop.w   m32c_jsri_ret
-       pop.b   m32c_jsri_ret+2
-       pop.w   m32c_jsri_addr
-       push.b  m32c_jsri_ret+2
-       push.w  m32c_jsri_ret
-       jmpi.a  m32c_jsri_addr
+       add.w   #-1, sp
+
+       /* Read the address (16 bits) and return address (24 bits) off
+       the stack.  */
+       mov.w   4[sp], r0
+       mov.w   1[sp], r3
+       mov.b   3[sp], a0 /* This zero-extends, so the high byte has
+                            zero in it.  */
+
+       /* Write the return address, then new address, to the stack.  */
+       mov.w   a0, 1[sp] /* Just to get the zero in 2[sp].  */
+       mov.w   r0, 0[sp]
+       mov.w   r3, 3[sp]
+       mov.b   a0, 5[sp]
+
+       /* This "returns" to the target address, leaving the pending
+       return address on the stack.  */
+       rts
+#endif
 
 #endif