Browse Source

Fix from Joseph Myers: Save and restore iWMMXt registers in ARM setjmp/longjmp

Khem Raj 18 years ago
parent
commit
84211be088

+ 10 - 0
libc/sysdeps/linux/arm/__longjmp.S

@@ -60,6 +60,16 @@ __longjmp:
 	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

+ 1 - 1
libc/sysdeps/linux/arm/bits/setjmp.h

@@ -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];

+ 10 - 0
libc/sysdeps/linux/arm/setjmp.S

@@ -52,6 +52,16 @@ __sigsetjmp:
 # else
 	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.  */