From: Mike Frysinger Date: Mon, 30 Dec 2013 09:40:38 +0000 (+0000) Subject: ia64: setjmp/longjmp: stop saving/restoring fpsr [BZ #16379] X-Git-Tag: upstream/2.20~1114 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e646a161cef3069fe1a6c92b750a87350630c62d;p=platform%2Fupstream%2Flinaro-glibc.git ia64: setjmp/longjmp: stop saving/restoring fpsr [BZ #16379] The new tst-setjmp-fp test has been failing on IA64 because the setjmp and longjmp helpers take care of saving/restoring the fpsr register. Per the C standards, this is incorrect, so disable that logic. URL: https://sourceware.org/bugzilla/show_bug.cgi?id=16379 Signed-off-by: Mike Frysinger --- diff --git a/ports/ChangeLog.ia64 b/ports/ChangeLog.ia64 index b5c426e..d5e1924 100644 --- a/ports/ChangeLog.ia64 +++ b/ports/ChangeLog.ia64 @@ -1,5 +1,14 @@ 2013-12-30 Mike Frysinger + [BZ #16379] + * sysdeps/unix/sysv/linux/ia64/__longjmp.S: Comment out loading of + fpsr. Update offsets accordingly. + * sysdeps/unix/sysv/linux/ia64/nptl/__ia64_longjmp.S: Likewise. + * sysdeps/unix/sysv/linux/ia64/setjmp.S: Comment out saving of + fpsr. Update offsets accordingly. + +2013-12-30 Mike Frysinger + * sysdeps/unix/sysv/linux/ia64/setjmp.S (setjmp): Call __sigsetjmp via HIDDEN_JUMPTARGET. (_setjmp): Likewise. @@ -304,9 +313,9 @@ 2012-09-24 Mike Frysinger - * ports/sysdeps/ia64/fpu/fegetround.c (fegetround): Move contents + * sysdeps/ia64/fpu/fegetround.c (fegetround): Move contents of function to ... - * ports/sysdeps/ia64/fpu/get-rounding-mode.h: ... here. + * sysdeps/ia64/fpu/get-rounding-mode.h: ... here. 2012-09-24 Mike Frysinger diff --git a/ports/sysdeps/unix/sysv/linux/ia64/__longjmp.S b/ports/sysdeps/unix/sysv/linux/ia64/__longjmp.S index 8a70ae2..4860a8c 100644 --- a/ports/sysdeps/unix/sysv/linux/ia64/__longjmp.S +++ b/ports/sysdeps/unix/sysv/linux/ia64/__longjmp.S @@ -82,12 +82,12 @@ LEAF(__longjmp) #ifdef CHECK_RSP CHECK_RSP (r28) #endif - ld8.fill.nta gp=[r3],16 // r1 (gp) + ld8.fill.nta gp=[r3],32 // r1 (gp) dep r11=-1,r23,3,6 // r11 <- ia64_rse_rnat_addr(jmpbuf.ar_bsp) mov sp=r28 // r12 (sp) ;; ld8.nta r16=[r2],16 // caller's unat - ld8.nta r17=[r3],16 // fpsr +// ld8.nta r17=[r3],16 // fpsr ;; ld8.fill.nta r4=[r2],16 // r4 ld8.fill.nta r5=[r3],16 // r5 (gp) @@ -97,7 +97,7 @@ LEAF(__longjmp) ld8.fill.nta r7=[r3],16 // r7 ;; mov ar.unat=r16 // restore caller's unat - mov ar.fpsr=r17 // restore fpsr +// mov ar.fpsr=r17 // restore fpsr ;; ld8.nta r16=[r2],16 // b0 ld8.nta r17=[r3],16 // b1 diff --git a/ports/sysdeps/unix/sysv/linux/ia64/nptl/__ia64_longjmp.S b/ports/sysdeps/unix/sysv/linux/ia64/nptl/__ia64_longjmp.S index 41cc303..db61a2c 100644 --- a/ports/sysdeps/unix/sysv/linux/ia64/nptl/__ia64_longjmp.S +++ b/ports/sysdeps/unix/sysv/linux/ia64/nptl/__ia64_longjmp.S @@ -75,11 +75,11 @@ LEAF(__ia64_longjmp) mov ar.unat=r25 // setup ar.unat (NaT bits for r1, r4-r7, and r12) ;; ld8.fill.nta sp=[r2],16 // r12 (sp) - ld8.fill.nta gp=[r3],16 // r1 (gp) + ld8.fill.nta gp=[r3],32 // r1 (gp) dep r11=-1,r23,3,6 // r11 <- ia64_rse_rnat_addr(jmpbuf.ar_bsp) ;; ld8.nta r16=[r2],16 // caller's unat - ld8.nta r17=[r3],16 // fpsr +// ld8.nta r17=[r3],16 // fpsr ;; ld8.fill.nta r4=[r2],16 // r4 ld8.fill.nta r5=[r3],16 // r5 (gp) @@ -88,7 +88,7 @@ LEAF(__ia64_longjmp) ld8.fill.nta r7=[r3],16 // r7 ;; mov ar.unat=r16 // restore caller's unat - mov ar.fpsr=r17 // restore fpsr +// mov ar.fpsr=r17 // restore fpsr ;; ld8.nta r16=[r2],16 // b0 ld8.nta r17=[r3],16 // b1 diff --git a/ports/sysdeps/unix/sysv/linux/ia64/setjmp.S b/ports/sysdeps/unix/sysv/linux/ia64/setjmp.S index bf1b980..1be53cc 100644 --- a/ports/sysdeps/unix/sysv/linux/ia64/setjmp.S +++ b/ports/sysdeps/unix/sysv/linux/ia64/setjmp.S @@ -25,7 +25,7 @@ 0x000 stack pointer (r12) ; unchangeable (see _JMPBUF_UNWINDS) 0x008 r1 (gp) 0x010 caller's unat - 0x018 fpsr + 0x018 fpsr ; disabled per the C standard; BZ 16379 0x020 r4 0x028 r5 0x030 r6 @@ -89,15 +89,15 @@ ENTRY(__sigsetjmp) .save ar.unat, loc2 mov loc2=ar.unat ;; - mov r17=ar.fpsr +// mov r17=ar.fpsr mov r2=in0 add r3=8,in0 ;; .mem.offset 8,0; st8.spill.nta [r2]=sp,16 // r12 (sp) -.mem.offset 0,0; st8.spill.nta [r3]=gp,16 // r1 (gp) +.mem.offset 0,0; st8.spill.nta [r3]=gp,32 // r1 (gp) ;; st8.nta [r2]=loc2,16 // save caller's unat - st8.nta [r3]=r17,16 // save fpsr +// st8.nta [r3]=r17,16 // save fpsr add r8=0xa0,in0 ;; .mem.offset 8,0; st8.spill.nta [r2]=r4,16 // r4