From 84211be0889a59d7188645aefb5325ddfd642627 Mon Sep 17 00:00:00 2001 From: Khem Raj Date: Thu, 31 Aug 2006 19:49:16 +0000 Subject: Fix from Joseph Myers: Save and restore iWMMXt registers in ARM setjmp/longjmp --- libc/sysdeps/linux/arm/__longjmp.S | 10 ++++++++++ libc/sysdeps/linux/arm/bits/setjmp.h | 2 +- libc/sysdeps/linux/arm/setjmp.S | 10 ++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) (limited to 'libc') diff --git a/libc/sysdeps/linux/arm/__longjmp.S b/libc/sysdeps/linux/arm/__longjmp.S index 27f127122..4261797f8 100644 --- a/libc/sysdeps/linux/arm/__longjmp.S +++ b/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 diff --git a/libc/sysdeps/linux/arm/bits/setjmp.h b/libc/sysdeps/linux/arm/bits/setjmp.h index 745cdb8f7..ac52f1281 100644 --- a/libc/sysdeps/linux/arm/bits/setjmp.h +++ b/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]; diff --git a/libc/sysdeps/linux/arm/setjmp.S b/libc/sysdeps/linux/arm/setjmp.S index ceea96a40..8d15b8324 100644 --- a/libc/sysdeps/linux/arm/setjmp.S +++ b/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. */ -- cgit v1.2.3