diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2017-12-15 09:38:53 -0500 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2017-12-15 09:39:34 -0500 |
commit | f95a4a932476be2ba99e2fd081e8d2bc6ea12813 (patch) | |
tree | 75f67192cb2d7b7b575c94edda318e475239b63c /newlib/libc/machine/mips/setjmp.S | |
parent | f60aca96985e68c7d8a52eb7bc955fb80e132f73 (diff) |
Import newlib and create makefile
Diffstat (limited to 'newlib/libc/machine/mips/setjmp.S')
-rw-r--r-- | newlib/libc/machine/mips/setjmp.S | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/newlib/libc/machine/mips/setjmp.S b/newlib/libc/machine/mips/setjmp.S new file mode 100644 index 0000000..8ffda41 --- /dev/null +++ b/newlib/libc/machine/mips/setjmp.S @@ -0,0 +1,65 @@ +/* This is a simple version of setjmp and longjmp. + + This 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. */ + +#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 + + 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) + + move $2,$0 + + j $31 + + .end setjmp + +/* volatile void longjmp (jmp_buf, int); */ + .globl longjmp + .ent longjmp +longjmp: + .frame $sp,0,$31 + + 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) + + bne $5,$0,1f + li $5,1 +1: + move $2,$5 + + j $31 + + .end longjmp |