summaryrefslogtreecommitdiff
path: root/src/setjmp/powerpc/setjmp.S
blob: 413e6a816baf2e3786e1b2cd239a45aeaf7a3d6b (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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
	.global ___setjmp
	.hidden ___setjmp
	.global __setjmp
	.global _setjmp
	.global setjmp
	.type   __setjmp,@function
	.type   _setjmp,@function
	.type   setjmp,@function
___setjmp:
__setjmp:
_setjmp:
setjmp:
	/* 0) store IP int 0, then into the jmpbuf pointed to by r3 (first arg) */
	mflr 0
	stw 0, 0(3)
	/* 1) store reg1 (SP) */
	stw 1, 4(3)
	/* 2) store cr */
	mfcr 0
	stw 0, 8(3)
	/* 3) store r14-31 */
	stw 14, 12(3)
	stw 15, 16(3)
	stw 16, 20(3)
	stw 17, 24(3)
	stw 18, 28(3)
	stw 19, 32(3)
	stw 20, 36(3)
	stw 21, 40(3)
	stw 22, 44(3)
	stw 23, 48(3)
	stw 24, 52(3)
	stw 25, 56(3)
	stw 26, 60(3)
	stw 27, 64(3)
	stw 28, 68(3)
	stw 29, 72(3)
	stw 30, 76(3)
	stw 31, 80(3)
#if defined(_SOFT_FLOAT) || defined(__NO_FPRS__)
	mflr 0
	bl 1f
	.hidden __hwcap
	.long __hwcap-.
1:	mflr 4
	lwz 5, 0(4)
	add 4, 4, 5
	andis. 4, 4, 0x80
	beq 1f
	.long 0x11c35b21 /* evstdd 14,88(3) */
	.long 0x11e36321 /* ... */
	.long 0x12036b21
	.long 0x12237321
	.long 0x12437b21
	.long 0x12638321
	.long 0x12838b21
	.long 0x12a39321
	.long 0x12c39b21
	.long 0x12e3a321
	.long 0x1303ab21
	.long 0x1323b321
	.long 0x1343bb21
	.long 0x1363c321
	.long 0x1383cb21
	.long 0x13a3d321
	.long 0x13c3db21
	.long 0x13e3e321 /* evstdd 31,224(3) */
	.long 0x11a3eb21 /* evstdd 13,232(3) */
1:	mtlr 0
#else
	stfd 14,88(3)
	stfd 15,96(3)
	stfd 16,104(3)
	stfd 17,112(3)
	stfd 18,120(3)
	stfd 19,128(3)
	stfd 20,136(3)
	stfd 21,144(3)
	stfd 22,152(3)
	stfd 23,160(3)
	stfd 24,168(3)
	stfd 25,176(3)
	stfd 26,184(3)
	stfd 27,192(3)
	stfd 28,200(3)
	stfd 29,208(3)
	stfd 30,216(3)
	stfd 31,224(3)
#endif
	/* 4) set return value to 0 */
	li 3, 0
	/* 5) return */
	blr