summaryrefslogtreecommitdiff
path: root/newlib/libc/machine/mips/setjmp.S
blob: 8ffda41a651d5f1e62b40d676d36d975b355a891 (plain)
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