xref: /netbsd-src/sys/external/bsd/gnu-efi/dist/lib/ia64/setjmp.S (revision 32d1c65c71fbdb65a012e8392a62a757dd6853e9)
1/*	$NetBSD: setjmp.S,v 1.1.1.1 2018/08/16 18:17:47 jmcneill Exp $	*/
2
3/*
4 * Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.
5 * This program and the accompanying materials are licensed and made
6available
7 * under the terms and conditions of the BSD License which accompanies
8this
9 * distribution.  The full text of the license may be found at
10 * http://opensource.org/licenses/bsd-license.php.
11 *
12 * THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
13BASIS,
14 * WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR
15 * IMPLIED.
16 */
17	.text
18	.globl	setjmp
19	.type	setjmp, @function
20setjmp:
21	alloc	loc0 = ar.pfs, 1, 2, 1, 0
22	;;
23	mov	r14 = ar.unat
24	mov	r15 = ar.bsp
25	add	r10 = 0x10*20, in0
26	;;
27	stf.spill.nta	[in0] = f2, 0x10
28	st8.spill.nta	[r10] = r4, 8
29	mov		r21 = b1
30	;;
31	stf.spill.nta	[in0] = f3, 0x10
32	st8.spill.nta	[r10] = r5, 8
33	mov		r22 = b2
34	;;
35	stf.spill.nta	[in0] = f4, 0x10
36	st8.spill.nta	[r10] = r6, 8
37	mov		r23 = b3
38	;;
39	stf.spill.nta	[in0] = f5, 0x10
40	st8.spill.nta	[r10] = r7, 8
41	mov		r24 = b4
42	;;
43	stf.spill.nta	[in0] = f16, 0x10
44	st8.spill.nta	[r10] = sp, 8
45	mov		r25 = b5
46	;;
47	stf.spill.nta	[in0] = f17, 0x10
48	st8.nta		[r10] = loc1, 8
49	mov		r16 = pr
50	;;
51	stf.spill.nta	[in0] = f18, 0x10
52	st8.nta		[r10] = r21, 8
53	mov		r17 = ar.lc
54	;;
55	stf.spill.nta	[in0] = f19, 0x10
56	st8.nta		[r10] = r22, 8
57	;;
58	stf.spill.nta	[in0] = f20, 0x10
59	st8.nta		[r10] = r23, 8
60	;;
61	stf.spill.nta	[in0] = f21, 0x10
62	st8.nta		[r10] = r24, 8
63	;;
64	stf.spill.nta	[in0] = f22, 0x10
65	st8.nta		[r10] = r25, 8
66	;;
67	stf.spill.nta	[in0] = f23, 0x10
68	mov		r18 = ar.unat
69	;;
70	stf.spill.nta	[in0] = f24, 0x10
71	st8.nta		[r10] = r14, 8
72	;;
73	stf.spill.nta	[in0] = f25, 0x10
74	st8.nta		[r10] = r18, 8
75	;;
76	stf.spill.nta	[in0] = f26, 0x10
77	st8.nta		[r10] = loc0, 8
78	;;
79	stf.spill.nta	[in0] = f27, 0x10
80	st8.nta		[r10] = r15, 8
81	mov		r8 = 0
82	;;
83	stf.spill.nta	[in0] = f28, 0x10
84	mov		r19 = ar.fpsr
85	;;
86	stf.spill.nta	[in0] = f29, 0x10
87	st8.nta		[r10] = r16, 8
88	mov		ar.pfs = loc0
89	;;
90	stf.spill.nta	[in0] = f30, 0x10
91	st8.nta		[r10] = r17, 8
92	mov		b0 = loc1
93	;;
94	stf.spill.nta	[in0] = f31, 0x10
95	st8.nta		[r10] = r19
96	;;
97	mov		ar.unat = r14
98	br.ret.sptk	b0
99	;;
100
101	.globl	longjmp
102	.type	longjmp, @function
103	.regstk 2, 0, 0, 0
104longjmp:
105	add		r10 = 0x10*20 + 8*14, in0
106	movl		r2  = ~((((1<<14) - 1) << 16) | 3)
107	;;
108	ld8.nt1		r14 = [r10], -8*2
109	mov		r15 = ar.bspstore
110	;;
111	ld8.nt1		r17 = [r10], -8
112	mov		r16 = ar.rsc
113	cmp.leu		p6  = r14, r15
114	;;
115	ld8.nt1		r18 = [r10], -8
116	ld8.nt1		r25 = [r10], -8
117	and		r2  = r16, r2
118	;;
119	ldf.fill.nt1	f2  = [in0], 0x10
120	ld8.nt1		r24 = [r10], -8
121	mov		b5  = r25
122	;;
123	mov		ar.rsc = r2
124	ld8.nt1		r23 = [r10], -8
125	mov		b4 = r24
126	;;
127	ldf.fill.nt1	f3 = [in0], 0x10
128	mov		ar.unat = r17
129(p6)	br.spnt.many	_skip_flushrs
130	;;
131	flushrs
132	mov		r15 = ar.bsp
133	;;
134_skip_flushrs:
135	mov		r31 = ar.rnat
136	loadrs
137	;;
138	ldf.fill.nt1	f4  = [in0], 0x10
139	ld8.nt1		r22 = [r10], -8
140	dep		r2  = -1, r14, 3, 6
141	;;
142	ldf.fill.nt1	f5  = [in0], 0x10
143	ld8.nt1		r21 = [r10], -8
144	cmp.ltu		p6  = r2, r15
145	;;
146	ld8.nt1		r20 = [r10], -0x10
147(p6)	ld8.nta		r31 = [r2]
148	mov		b3  = r23
149	;;
150	ldf.fill.nt1	f16 = [in0], 0x10
151	ld8.fill.nt1	r7  = [r10], -8
152	mov		b2  = r22
153	;;
154	ldf.fill.nt1	f17 = [in0], 0x10
155	ld8.fill.nt1	r6  = [r10], -8
156	mov		b1  = r21
157	;;
158	ldf.fill.nt1	f18 = [in0], 0x10
159	ld8.fill.nt1	r5  = [r10], -8
160	mov		b0  = r20
161	;;
162	ldf.fill.nt1	f19 = [in0], 0x10
163	ld8.fill.nt1	r4  = [r10], 8*13
164	;;
165	ldf.fill.nt1	f20 = [in0], 0x10
166	ld8.nt1		r19 = [r10], 0x10
167	;;
168	ldf.fill.nt1	f21 = [in0], 0x10
169	ld8.nt1		r26 = [r10], 8
170	mov		ar.pfs = r19
171	;;
172	ldf.fill.nt1	f22 = [in0], 0x10
173	ld8.nt1		r27 = [r10], 8
174	mov		pr  = r26, -1
175	;;
176	ldf.fill.nt1	f23 = [in0], 0x10
177	ld8.nt1		r28 = [r10], -17*8 - 0x10
178	mov		ar.lc = r27
179	;;
180	ldf.fill.nt1	f24 = [in0], 0x10
181	ldf.fill.nt1	f25 = [in0], 0x10
182	mov		r8  = in1
183	;;
184	ldf.fill.nt1	f26 = [in0], 0x10
185	ldf.fill.nt1	f31 = [r10], -0x10
186	;;
187	ldf.fill.nt1	f27 = [in0], 0x10
188	ldf.fill.nt1	f30 = [r10], -0x10
189	;;
190	ldf.fill.nt1	f28 = [in0]
191	ldf.fill.nt1	f29 = [r10], 0x10*3 + 8*4
192	;;
193	ld8.fill.nt1	sp  = [r10]
194	mov		ar.unat = r18
195	;;
196	mov		ar.bspstore = r14
197	mov		ar.rnat = r31
198	;;
199	invala
200	mov		ar.rsc = r16
201	br.ret.sptk	b0
202