This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[m32c] make m32c_jsri16 reentrant


Applied.

2010-10-22  DJ Delorie  <dj@redhat.com>

	* config/m32c/m32c-lib1.S (m32c_jsri16): Make reentrant.

Index: config/m32c/m32c-lib1.S
===================================================================
--- config/m32c/m32c-lib1.S	(revision 165857)
+++ config/m32c/m32c-lib1.S	(working copy)
@@ -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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]