[patch] ARM setjmp/longjmp fix for iWMMXt

Joseph S. Myers joseph at codesourcery.com
Fri Aug 11 10:18:08 UTC 2006


This patch makes the ARM setjmp/longjmp save and restore iWMMXt registers.

Index: libc/sysdeps/linux/arm/setjmp.S
===================================================================
--- libc/sysdeps/linux/arm/setjmp.S	(revision 15800)
+++ libc/sysdeps/linux/arm/setjmp.S	(working copy)
@@ -56,6 +56,16 @@
 	sfmea   f4, 4, [ip]!
 # endif
 #endif
+#ifdef __IWMMXT__
+	/* Save the call-preserved iWMMXt registers.  */
+	/* Following instructions are wstrd wr10, [ip], #8 (etc.)  */
+	stcl	p1, cr10, [r12], #8
+	stcl	p1, cr11, [r12], #8
+	stcl	p1, cr12, [r12], #8
+	stcl	p1, cr13, [r12], #8
+	stcl	p1, cr14, [r12], #8
+	stcl	p1, cr15, [r12], #8
+#endif
 
 	/* Make a tail call to __sigjmp_save; it takes the same args.  */
 #ifdef __PIC__
Index: libc/sysdeps/linux/arm/bits/setjmp.h
===================================================================
--- libc/sysdeps/linux/arm/bits/setjmp.h	(revision 15800)
+++ libc/sysdeps/linux/arm/bits/setjmp.h	(working copy)
@@ -35,7 +35,7 @@
    are occupied by v1-v6, sl, fp, sp, pc, d8-d15, and fpscr.  (Note
    that d8-15 require 17 words, due to the use of fstmx.)  */
 typedef int __jmp_buf[64] __attribute__((aligned (8)));
-#elif defined __MAVERICK__
+#elif defined __MAVERICK__ || defined __IWMMXT__
 typedef int __jmp_buf[34];
 #else
 typedef int __jmp_buf[22];
Index: libc/sysdeps/linux/arm/__longjmp.S
===================================================================
--- libc/sysdeps/linux/arm/__longjmp.S	(revision 15800)
+++ libc/sysdeps/linux/arm/__longjmp.S	(working copy)
@@ -60,6 +60,16 @@
 	lfmfd	f4, 4, [ip] !	/* load the floating point regs */
 # endif
 #endif	
+#ifdef __IWMMXT__
+	/* Restore the call-preserved iWMMXt registers.  */
+	/* Following instructions are wldrd wr10, [ip], #8 (etc.)  */
+	ldcl	p1, cr10, [r12], #8
+	ldcl	p1, cr11, [r12], #8
+	ldcl	p1, cr12, [r12], #8
+	ldcl	p1, cr13, [r12], #8
+	ldcl	p1, cr14, [r12], #8
+	ldcl	p1, cr15, [r12], #8
+#endif
 
 #if defined(__USE_BX__)
 	bx	lr

-- 
Joseph S. Myers
joseph at codesourcery.com



More information about the uClibc mailing list