summaryrefslogtreecommitdiff
path: root/gcc/config/m32c/m32c-lib1.S
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/config/m32c/m32c-lib1.S')
-rw-r--r--gcc/config/m32c/m32c-lib1.S32
1 files changed, 20 insertions, 12 deletions
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