summaryrefslogtreecommitdiff
path: root/newlib/libc/machine/mips/setjmp.S
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/machine/mips/setjmp.S')
-rw-r--r--newlib/libc/machine/mips/setjmp.S65
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 00000000000..8ffda41a651
--- /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