1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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
|