===================================================================
@@ -201,23 +201,31 @@ cmpsi_gt:
cmpsi_lt:
mov.w #0,r0
exitd
#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