1/* Copyright (c) 2005 Aldy Hernandez <aldyh@redhat.com> */
2#include <picolibc.h>
3
4# setjmp/longjmp for mt.
5#
6# The jmpbuf looks like this:
7#
8# Register	jmpbuf offset
9# R0		---		--
10# R1		0x4		 4
11# R2		0x8		 8
12# R3		0xc		12
13# R4		0x10		16
14# R5		0x14		20
15# R6		0x18		24
16# R7		0x1c		28
17# R8		0x20		32
18# R9		----		--
19# R10		----		--
20# R11		0x2c		44
21# R12		0x30		48
22# R13		0x34		52
23# R14		0x38		56
24# R15		0x3c		60
25#
26# R1 contains the pointer to jmpbuf
27	.text
28	.global	setjmp
29	.type	setjmp ,@function
30setjmp:
31
32	stw	r1, r1, #4
33	or	r0, r0, r0
34	stw	r2, r1, #8
35	or	r0, r0, r0
36	stw	r3, r1, #12
37	or	r0, r0, r0
38	stw	r4, r1, #16
39	or	r0, r0, r0
40	stw	r5, r1, #20
41	or	r0, r0, r0
42	stw	r6, r1, #24
43	or	r0, r0, r0
44	stw	r7, r1, #28
45	or	r0, r0, r0
46	stw	r8, r1, #32
47	or	r0, r0, r0
48	stw	r11, r1, #44
49	or	r0, r0, r0
50	stw	r12, r1, #48
51	or	r0, r0, r0
52	stw	r13, r1, #52
53	or	r0, r0, r0
54	stw	r14, r1, #56
55	or	r0, r0, r0
56	stw	r15, r1, #60
57
58	jal	r0, r14
59	addi	r11, r0, #0
60.Lend1:
61	.size	setjmp,.Lend1-setjmp
62
63	.global	longjmp
64	.type	longjmp,@function
65longjmp:
66	or	r9, r1, r1
67	or	r11, r2, r2
68	ldw	r1, r1, #4
69	or	r0, r0, r0
70	ldw	r2, r1, #8
71	or	r0, r0, r0
72	ldw	r3, r1, #12
73	or	r0, r0, r0
74	ldw	r4, r1, #16
75	or	r0, r0, r0
76	ldw	r5, r1, #20
77	or	r0, r0, r0
78	ldw	r6, r1, #24
79	or	r0, r0, r0
80	ldw	r7, r1, #28
81	or	r0, r0, r0
82	ldw	r8, r1, #32
83	or	r0, r0, r0
84
85
86	ldw	r12, r1, #48
87	or	r0, r0, r0
88	ldw	r13, r1, #52
89	or	r0, r0, r0
90	ldw	r14, r1, #56
91	or	r0, r0, r0
92	ldw	r15, r1, #60
93
94	brne	r0, r11, .L01
95	or	r0, r0, r0
96
97	addi	r11, r0, #1
98.L01:
99	jal	r0, r14
100	or	r0, r0, r0
101.Lend2:
102	.size	longjmp,.Lend2-longjmp2
103