mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-02-25 01:57:17 +08:00
* 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.
This commit is contained in:
parent
235d9fdadc
commit
172fda76d4
@ -1,3 +1,10 @@
|
|||||||
|
2002-08-07 Richard Sandiford <rsandifo@redhat.com>
|
||||||
|
|
||||||
|
* 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.
|
||||||
|
|
||||||
2002-08-04 Christopher Faylor <cgf@redhat.com>
|
2002-08-04 Christopher Faylor <cgf@redhat.com>
|
||||||
|
|
||||||
* libc/stdio/popen.c (popen): Allow "rb", "rt", "wb", and "wt"
|
* libc/stdio/popen.c (popen): Allow "rb", "rt", "wb", and "wt"
|
||||||
|
@ -71,10 +71,12 @@ _BEGIN_STD_C
|
|||||||
|
|
||||||
#ifdef __mips__
|
#ifdef __mips__
|
||||||
#ifdef __mips64
|
#ifdef __mips64
|
||||||
#define _JBLEN 23
|
|
||||||
#define _JBTYPE long long
|
#define _JBTYPE long long
|
||||||
#else
|
#endif
|
||||||
|
#ifdef __mips_soft_float
|
||||||
#define _JBLEN 11
|
#define _JBLEN 11
|
||||||
|
#else
|
||||||
|
#define _JBLEN 23
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1,72 +1,76 @@
|
|||||||
/* This is a simple version of setjmp and longjmp for MIPS 32 and 64.
|
/* 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
|
Ian Lance Taylor, Cygnus Support, 13 May 1993. */
|
||||||
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
|
#ifdef __mips16
|
||||||
/* This file contains 32 bit assembly code. */
|
/* This file contains 32 bit assembly code. */
|
||||||
.set nomips16
|
.set nomips16
|
||||||
#endif
|
#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); */
|
/* int setjmp (jmp_buf); */
|
||||||
.globl setjmp
|
.globl setjmp
|
||||||
.ent setjmp
|
.ent setjmp
|
||||||
setjmp:
|
setjmp:
|
||||||
.frame $sp,0,$31
|
.frame $sp,0,$31
|
||||||
|
|
||||||
#ifdef __mips64
|
#define GPR_OFFSET(REG, INDEX) STORE_GPR REG,GPOFF(INDEX)($4)
|
||||||
|
#define FPR_OFFSET(REG, INDEX) STORE_FPR REG,FPOFF(INDEX)($4)
|
||||||
sd $16, 000($4) /* s0 */
|
GPR_LAYOUT
|
||||||
sd $17, 010($4) /* s1 */
|
FPR_LAYOUT
|
||||||
sd $18, 020($4) /* s2 */
|
#undef GPR_OFFSET
|
||||||
sd $19, 030($4) /* s3 */
|
#undef FPR_OFFSET
|
||||||
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
|
move $2,$0
|
||||||
|
|
||||||
j $31
|
j $31
|
||||||
|
|
||||||
.end setjmp
|
.end setjmp
|
||||||
@ -77,56 +81,17 @@ setjmp:
|
|||||||
longjmp:
|
longjmp:
|
||||||
.frame $sp,0,$31
|
.frame $sp,0,$31
|
||||||
|
|
||||||
#ifdef __mips64
|
#define GPR_OFFSET(REG, INDEX) LOAD_GPR REG,GPOFF(INDEX)($4)
|
||||||
|
#define FPR_OFFSET(REG, INDEX) LOAD_FPR REG,FPOFF(INDEX)($4)
|
||||||
ld $16, 000($4) /* s0 */
|
GPR_LAYOUT
|
||||||
ld $17, 010($4) /* s1 */
|
FPR_LAYOUT
|
||||||
ld $18, 020($4) /* s2 */
|
#undef GPR_OFFSET
|
||||||
ld $19, 030($4) /* s3 */
|
#undef FPR_OFFSET
|
||||||
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
|
bne $5,$0,1f
|
||||||
li $5,1
|
li $5,1
|
||||||
1:
|
1:
|
||||||
move $2,$5
|
move $2,$5
|
||||||
|
|
||||||
j $31
|
j $31
|
||||||
|
|
||||||
.end longjmp
|
.end longjmp
|
||||||
|
Loading…
x
Reference in New Issue
Block a user