Patch to MIPS setjmp.S
J. Johnston
jjohnstn@redhat.com
Tue Aug 6 08:46:00 GMT 2002
Richard Sandiford wrote:
>
> 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?
>
Yes.
-- Jeff J.
>
> * 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
More information about the Newlib
mailing list