diff options
author | Jeff Johnston <jjohnstn@redhat.com> | 2001-03-08 21:39:32 +0000 |
---|---|---|
committer | Jeff Johnston <jjohnstn@redhat.com> | 2001-03-08 21:39:32 +0000 |
commit | e69b6f73d760b364bcf7782354a28e69091f7023 (patch) | |
tree | 6efe0cac41e1e5101d2d2531b7352fe2f666e05b /newlib/libc/machine | |
parent | 2ea968d3e19ca8c42fbfc8492dc8dfc9ee49fe98 (diff) | |
download | cygnal-e69b6f73d760b364bcf7782354a28e69091f7023.tar.gz cygnal-e69b6f73d760b364bcf7782354a28e69091f7023.tar.bz2 cygnal-e69b6f73d760b364bcf7782354a28e69091f7023.zip |
2001-03-07 Richard Sandiford <rsandifo@redhat.com>
* (libc/include/machine/setjmp.h): Use 23 DI-mode ints for a
jmpbuf on MIPS64 targets.
* (libc/machine/mips/setjmp.S): Add MIPS64 version.
Diffstat (limited to 'newlib/libc/machine')
-rw-r--r-- | newlib/libc/machine/mips/setjmp.S | 75 |
1 files changed, 72 insertions, 3 deletions
diff --git a/newlib/libc/machine/mips/setjmp.S b/newlib/libc/machine/mips/setjmp.S index 8ffda41a6..9532e7a38 100644 --- a/newlib/libc/machine/mips/setjmp.S +++ b/newlib/libc/machine/mips/setjmp.S @@ -1,15 +1,20 @@ -/* This is a simple version of setjmp and longjmp. +/* This is a simple version of setjmp and longjmp for MIPS 32 and 64. - This version does NOT save the floating point register, which is + 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. */ + Ian Lance Taylor, Cygnus Support, 13 May 1993. + The MIPS 64 version saves registers fp20 to fp31. 23 registers + are saved in all. */ + +#ifndef __mips64 #ifdef __mips16 /* This file contains 32 bit assembly code. */ .set nomips16 #endif +#endif /* int setjmp (jmp_buf); */ .globl setjmp @@ -17,6 +22,36 @@ 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 */ @@ -30,6 +65,8 @@ setjmp: sw $sp,36($4) sw $31,40($4) +#endif /* not __mips64 */ + move $2,$0 j $31 @@ -42,6 +79,36 @@ setjmp: 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 */ @@ -55,6 +122,8 @@ longjmp: lw $sp,36($4) lw $31,40($4) +#endif /* not __mips64 */ + bne $5,$0,1f li $5,1 1: |