diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d4114d31e9a..78802b06bd4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2010-10-22 DJ Delorie + + * config/m32c/m32c-lib1.S (m32c_jsri16): Make reentrant. + 2010-10-22 Paul Koning * config/pdp11/pdp11.h (IRA_COVER_CLASSES): Define. diff --git a/gcc/config/m32c/m32c-lib1.S b/gcc/config/m32c/m32c-lib1.S index 9556e095eec..777781b6fda 100644 --- a/gcc/config/m32c/m32c-lib1.S +++ b/gcc/config/m32c/m32c-lib1.S @@ -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