From bc101e2652728d8a6e8ece7c637e095618546a95 Mon Sep 17 00:00:00 2001 From: Andreas Krebbel Date: Wed, 23 Jan 2013 10:00:24 +0100 Subject: [PATCH] S/390: Fix setjmp/longjmp FPR save/restore --- sysdeps/s390/bits/setjmp.h | 2 +- sysdeps/s390/s390-64/__longjmp.c | 12 ++++++++---- sysdeps/s390/s390-64/setjmp.S | 12 ++++++++---- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/sysdeps/s390/bits/setjmp.h b/sysdeps/s390/bits/setjmp.h index 285003f..e929c161 100644 --- a/sysdeps/s390/bits/setjmp.h +++ b/sysdeps/s390/bits/setjmp.h @@ -34,7 +34,7 @@ typedef struct __s390_jmp_buf long int __gregs[10]; # if __WORDSIZE == 64 - /* We save fpu registers 1, 3, 5 and 7. */ + /* We save fpu registers f8 - f15. */ long __fpregs[8]; # else /* We save fpu registers 4 and 6. */ diff --git a/sysdeps/s390/s390-64/__longjmp.c b/sysdeps/s390/s390-64/__longjmp.c index 510b1c2..2682406 100644 --- a/sysdeps/s390/s390-64/__longjmp.c +++ b/sysdeps/s390/s390-64/__longjmp.c @@ -42,10 +42,14 @@ __longjmp (__jmp_buf env, int val) register void *r1 __asm ("%r1") = (void *) env; #endif /* Restore registers and jump back. */ - asm volatile ("ld %%f7,104(%1)\n\t" - "ld %%f5,96(%1)\n\t" - "ld %%f3,88(%1)\n\t" - "ld %%f1,80(%1)\n\t" + asm volatile ("ld %%f8,80(%1)\n\t" + "ld %%f9,88(%1)\n\t" + "ld %%f10,96(%1)\n\t" + "ld %%f11,104(%1)\n\t" + "ld %%f12,112(%1)\n\t" + "ld %%f13,120(%1)\n\t" + "ld %%f14,128(%1)\n\t" + "ld %%f15,136(%1)\n\t" #ifdef PTR_DEMANGLE "lmg %%r6,%%r13,0(%1)\n\t" "lmg %%r4,%%r5,64(%1)\n\t" diff --git a/sysdeps/s390/s390-64/setjmp.S b/sysdeps/s390/s390-64/setjmp.S index b12d905..6269dbf 100644 --- a/sysdeps/s390/s390-64/setjmp.S +++ b/sysdeps/s390/s390-64/setjmp.S @@ -55,10 +55,14 @@ ENTRY(__sigsetjmp) #else stmg %r6,%r15,0(%r2) /* Store registers in jmp_buf. */ #endif - std %f1,80(%r2) - std %f3,88(%r2) - std %f5,96(%r2) - std %f7,104(%r2) + std %f8,80(%r2) + std %f9,88(%r2) + std %f10,96(%r2) + std %f11,104(%r2) + std %f12,112(%r2) + std %f13,120(%r2) + std %f14,128(%r2) + std %f15,136(%r2) #if defined NOT_IN_libc && defined IS_IN_rtld /* In ld.so we never save the signal mask. */ lghi %r2,0 -- 2.7.4