This is the mail archive of the
newlib@sources.redhat.com
mailing list for the newlib project.
Patch to MIPS setjmp.S
- From: Richard Sandiford <rsandifo at redhat dot com>
- To: newlib at sources dot redhat dot com
- Date: 01 Aug 2002 20:52:57 +0100
- Subject: Patch to MIPS setjmp.S
The MIPS implementation of setjmp() and longjmp() will save float
registers for 64-bit code, but not for 32-bit code. This patch
provides hard and soft versions of both. __mips_soft_float decides
which is needed.
Tested by building a mips-elf cross-compiler, and by trying
various gcc option combinations by hand. OK to install?
Richard
* libc/include/machine/setjmp.h: For mips, define _JBLEN based
based on __mips_soft_float rather than __mips64.
* libc/machine/mips/setjmp.S: Provide hard and soft float versions
of both 32-bit and 64-bit code.
Index: libc/include/machine/setjmp.h
===================================================================
RCS file: /cvs/src/src/newlib/libc/include/machine/setjmp.h,v
retrieving revision 1.12
diff -c -p -d -r1.12 setjmp.h
*** libc/include/machine/setjmp.h 24 Jul 2002 15:44:24 -0000 1.12
--- libc/include/machine/setjmp.h 1 Aug 2002 10:07:40 -0000
*************** _BEGIN_STD_C
*** 71,80 ****
#ifdef __mips__
#ifdef __mips64
- #define _JBLEN 23
#define _JBTYPE long long
! #else
#define _JBLEN 11
#endif
#endif
--- 71,82 ----
#ifdef __mips__
#ifdef __mips64
#define _JBTYPE long long
! #endif
! #ifdef __mips_soft_float
#define _JBLEN 11
+ #else
+ #define _JBLEN 23
#endif
#endif
Index: libc/machine/mips/setjmp.S
===================================================================
RCS file: /cvs/src/src/newlib/libc/machine/mips/setjmp.S,v
retrieving revision 1.3
diff -c -p -d -r1.3 setjmp.S
*** libc/machine/mips/setjmp.S 13 Jul 2001 15:41:39 -0000 1.3
--- libc/machine/mips/setjmp.S 1 Aug 2002 10:07:40 -0000
***************
*** 1,72 ****
/* This is a simple version of setjmp and longjmp for MIPS 32 and 64.
! The MIPS 32 version does NOT save the floating point register, which is
! wrong, but I don't know how to cleanly handle machines without a
! floating point coprocessor.
!
! Ian Lance Taylor, Cygnus Support, 13 May 1993.
!
! The MIPS 64 version saves registers fp20 to fp31. 23 registers
! are saved in all. */
#ifdef __mips16
/* This file contains 32 bit assembly code. */
.set nomips16
#endif
! /* int setjmp (jmp_buf); */
! .globl setjmp
! .ent setjmp
! setjmp:
! .frame $sp,0,$31
!
! #ifdef __mips64
!
! sd $16, 000($4) /* s0 */
! sd $17, 010($4) /* s1 */
! sd $18, 020($4) /* s2 */
! sd $19, 030($4) /* s3 */
! sd $20, 040($4) /* s4 */
! sd $21, 050($4) /* s5 */
! sd $22, 060($4) /* s6 */
! sd $23, 070($4) /* s7 */
! sdc1 $f20, 0100($4)
! sdc1 $f21, 0110($4)
! sdc1 $f22, 0120($4)
! sdc1 $f23, 0130($4)
! sdc1 $f24, 0140($4)
! sdc1 $f25, 0150($4)
! sdc1 $f26, 0160($4)
! sdc1 $f27, 0170($4)
! sdc1 $f28, 0200($4)
! sdc1 $f29, 0210($4)
! sdc1 $f30, 0220($4)
! sdc1 $f31, 0230($4)
! sd $29, 0240($4) /* sp */
! sd $30, 0250($4) /* fp */
! sd $31, 0260($4) /* ra */
! #else /* not __mips64 */
! sw $16,0($4) /* $s0 */
! sw $17,4($4) /* $s1 */
! sw $18,8($4) /* $s2 */
! sw $19,12($4) /* $s3 */
! sw $20,16($4) /* $s4 */
! sw $21,20($4) /* $s5 */
! sw $22,24($4) /* $s6 */
! sw $23,28($4) /* $s7 */
! sw $30,32($4) /* $s8 */
! sw $sp,36($4)
! sw $31,40($4)
! #endif /* not __mips64 */
move $2,$0
-
j $31
.end setjmp
--- 1,76 ----
/* This is a simple version of setjmp and longjmp for MIPS 32 and 64.
! Ian Lance Taylor, Cygnus Support, 13 May 1993. */
#ifdef __mips16
/* This file contains 32 bit assembly code. */
.set nomips16
#endif
! #define GPR_LAYOUT \
! GPR_OFFSET ($16, 0); \
! GPR_OFFSET ($17, 1); \
! GPR_OFFSET ($18, 2); \
! GPR_OFFSET ($19, 3); \
! GPR_OFFSET ($20, 4); \
! GPR_OFFSET ($21, 5); \
! GPR_OFFSET ($22, 6); \
! GPR_OFFSET ($23, 7); \
! GPR_OFFSET ($29, 8); \
! GPR_OFFSET ($30, 9); \
! GPR_OFFSET ($31, 10)
! #define NUM_GPRS_SAVED 11
! #ifdef __mips_hard_float
! #define FPR_LAYOUT \
! FPR_OFFSET ($f20, 0); \
! FPR_OFFSET ($f21, 1); \
! FPR_OFFSET ($f22, 2); \
! FPR_OFFSET ($f23, 3); \
! FPR_OFFSET ($f24, 4); \
! FPR_OFFSET ($f25, 5); \
! FPR_OFFSET ($f26, 6); \
! FPR_OFFSET ($f27, 7); \
! FPR_OFFSET ($f28, 8); \
! FPR_OFFSET ($f29, 9); \
! FPR_OFFSET ($f30, 10); \
! FPR_OFFSET ($f31, 11)
! #else
! #define FPR_LAYOUT
! #endif
! #ifdef __mips64
! #define BYTES_PER_WORD 8
! #define LOAD_GPR ld
! #define LOAD_FPR ldc1
! #define STORE_GPR sd
! #define STORE_FPR sdc1
! #else
! #define BYTES_PER_WORD 4
! #define LOAD_GPR lw
! #define LOAD_FPR lwc1
! #define STORE_GPR sw
! #define STORE_FPR swc1
! #endif
! #define GPOFF(INDEX) (INDEX * BYTES_PER_WORD)
! #define FPOFF(INDEX) ((INDEX + NUM_GPRS_SAVED) * BYTES_PER_WORD)
! /* int setjmp (jmp_buf); */
! .globl setjmp
! .ent setjmp
! setjmp:
! .frame $sp,0,$31
! #define GPR_OFFSET(REG, INDEX) STORE_GPR REG,GPOFF(INDEX)($4)
! #define FPR_OFFSET(REG, INDEX) STORE_FPR REG,FPOFF(INDEX)($4)
! GPR_LAYOUT
! FPR_LAYOUT
! #undef GPR_OFFSET
! #undef FPR_OFFSET
move $2,$0
j $31
.end setjmp
*************** setjmp:
*** 77,132 ****
longjmp:
.frame $sp,0,$31
! #ifdef __mips64
!
! ld $16, 000($4) /* s0 */
! ld $17, 010($4) /* s1 */
! ld $18, 020($4) /* s2 */
! ld $19, 030($4) /* s3 */
! ld $20, 040($4) /* s4 */
! ld $21, 050($4) /* s5 */
! ld $22, 060($4) /* s6 */
! ld $23, 070($4) /* s7 */
!
! ldc1 $f20, 0100($4)
! ldc1 $f21, 0110($4)
! ldc1 $f22, 0120($4)
! ldc1 $f23, 0130($4)
! ldc1 $f24, 0140($4)
! ldc1 $f25, 0150($4)
! ldc1 $f26, 0160($4)
! ldc1 $f27, 0170($4)
! ldc1 $f28, 0200($4)
! ldc1 $f29, 0210($4)
! ldc1 $f30, 0220($4)
! ldc1 $f31, 0230($4)
!
! ld $29, 0240($4) /* sp */
! ld $30, 0250($4) /* fp */
! ld $31, 0260($4) /* ra */
!
! #else /* not __mips64 */
!
! lw $16,0($4) /* $s0 */
! lw $17,4($4) /* $s1 */
! lw $18,8($4) /* $s2 */
! lw $19,12($4) /* $s3 */
! lw $20,16($4) /* $s4 */
! lw $21,20($4) /* $s5 */
! lw $22,24($4) /* $s6 */
! lw $23,28($4) /* $s7 */
! lw $30,32($4) /* $s8 */
!
! lw $sp,36($4)
! lw $31,40($4)
!
! #endif /* not __mips64 */
bne $5,$0,1f
li $5,1
1:
move $2,$5
-
j $31
.end longjmp
--- 81,97 ----
longjmp:
.frame $sp,0,$31
! #define GPR_OFFSET(REG, INDEX) LOAD_GPR REG,GPOFF(INDEX)($4)
! #define FPR_OFFSET(REG, INDEX) LOAD_FPR REG,FPOFF(INDEX)($4)
! GPR_LAYOUT
! FPR_LAYOUT
! #undef GPR_OFFSET
! #undef FPR_OFFSET
bne $5,$0,1f
li $5,1
1:
move $2,$5
j $31
.end longjmp