1
2#
3# This is a generic function to test that restoring registers during unwinding work correctly.
4#
5
6	.literal4
7	.align 2
8LC14:	.long	1096810496
9LC15:	.long	1097859072
10LC16:	.long	1098907648
11LC17:	.long	1099431936
12LC18:	.long	1099956224
13LC19:	.long	1100480512
14LC20:	.long	1101004800
15LC21:	.long	1101529088
16LC22:	.long	1102053376
17LC23:	.long	1102577664
18LC24:	.long	1103101952
19LC25:	.long	1103626240
20LC26:	.long	1104150528
21LC27:	.long	1104674816
22LC28:	.long	1105199104
23LC29:	.long	1105723392
24LC30:	.long	1106247680
25LC31:	.long	1106771968
26
27	.literal16
28LV23:	.long	0x23232323, 0x23232322, 0x23232321, 0x23232320
29LV24:	.long	0x24242424, 0x24242422, 0x24242421, 0x24242420
30LV25:	.long	0x25252525, 0x25252522, 0x25252521, 0x25252520
31LV26:	.long	0x26262626, 0x26262622, 0x26262621, 0x26262620
32LV27:	.long	0x27272727, 0x27272722, 0x27272721, 0x27272720
33LV28:	.long	0x28282828, 0x28282822, 0x28282821, 0x28282820
34LV29:	.long	0x29292929, 0x29292922, 0x29292921, 0x29292920
35LV30:	.long	0x30303030, 0x30303022, 0x30303021, 0x30303020
36LV31:	.long	0x31313131, 0x31313122, 0x31313121, 0x31313120
37
38	.text
39.globl _unwind_tester
40_unwind_tester:
41LFB2:
42	mflr r0
43LCFI43:
44	bl saveFP ; save f14-f31
45LCFI44:
46	stmw r13,-220(r1)
47LCFI45:
48	stwu r1,-336(r1)
49LCFI46:
50
51	# load magic values into non-volatile registers
52	lis		r31,0x3333
53	ori		r31,r31,0x3131
54	lis		r30,0x3333
55	ori		r30,r30,0x3030
56	lis		r29,0x2222
57	ori		r29,r29,0x2929
58	lis		r28,0x2222
59	ori		r28,r28,0x2828
60	lis		r27,0x2222
61	ori		r27,r27,0x2727
62	lis		r26,0x2222
63	ori		r26,r26,0x2626
64	lis		r25,0x2222
65	ori		r25,r25,0x2525
66	lis		r24,0x2222
67	ori		r24,r24,0x2424
68	lis		r23,0x2222
69	ori		r23,r23,0x2323
70	lis		r22,0x2222
71	ori		r22,r22,0x2222
72	lis		r21,0x2222
73	ori		r21,r21,0x2121
74	lis		r20,0x2222
75	ori		r20,r20,0x2020
76	lis		r19,0x1111
77	ori		r19,r19,0x1919
78	lis		r18,0x1111
79	ori		r18,r18,0x1818
80	lis		r17,0x1111
81	ori		r17,r17,0x1717
82	lis		r16,0x1111
83	ori		r16,r16,0x1616
84	lis		r15,0x1111
85	ori		r15,r15,0x1515
86	lis		r14,0x1111
87	ori		r14,r14,0x1414
88	lis		r13,0x1111
89	ori		r13,r13,0x1313
90
91	lis		r2,ha16(LC14)
92	lfs		f14,lo16(LC14)(r2)
93	lis		r2,ha16(LC15)
94	lfs		f15,lo16(LC15)(r2)
95	lis		r2,ha16(LC16)
96	lfs		f16,lo16(LC16)(r2)
97	lis		r2,ha16(LC17)
98	lfs		f17,lo16(LC17)(r2)
99	lis		r2,ha16(LC18)
100	lfs		f18,lo16(LC18)(r2)
101	lis		r2,ha16(LC19)
102	lfs		f19,lo16(LC19)(r2)
103	lis		r2,ha16(LC20)
104	lfs		f20,lo16(LC20)(r2)
105	lis		r2,ha16(LC21)
106	lfs		f21,lo16(LC21)(r2)
107	lis		r2,ha16(LC22)
108	lfs		f22,lo16(LC22)(r2)
109	lis		r2,ha16(LC23)
110	lfs		f23,lo16(LC23)(r2)
111	lis		r2,ha16(LC24)
112	lfs		f24,lo16(LC24)(r2)
113	lis		r2,ha16(LC25)
114	lfs		f25,lo16(LC25)(r2)
115	lis		r2,ha16(LC26)
116	lfs		f26,lo16(LC26)(r2)
117	lis		r2,ha16(LC27)
118	lfs		f27,lo16(LC27)(r2)
119	lis		r2,ha16(LC28)
120	lfs		f28,lo16(LC28)(r2)
121	lis		r2,ha16(LC29)
122	lfs		f29,lo16(LC29)(r2)
123	lis		r2,ha16(LC30)
124	lfs		f30,lo16(LC30)(r2)
125	lis		r2,ha16(LC31)
126	lfs		f31,lo16(LC31)(r2)
127
128	lis		r2,ha16(LV23)
129	la		r2,lo16(LV23)(r2)
130	lvx		v23,0,r2
131	lis		r2,ha16(LV24)
132	la		r2,lo16(LV24)(r2)
133	lvx		v24,0,r2
134	lis		r2,ha16(LV25)
135	la		r2,lo16(LV25)(r2)
136	lvx		v25,0,r2
137	lis		r2,ha16(LV26)
138	la		r2,lo16(LV26)(r2)
139	lvx		v26,0,r2
140	lis		r2,ha16(LV27)
141	la		r2,lo16(LV27)(r2)
142	lvx		v27,0,r2
143	lis		r2,ha16(LV28)
144	la		r2,lo16(LV28)(r2)
145	lvx		v28,0,r2
146	lis		r2,ha16(LV29)
147	la		r2,lo16(LV29)(r2)
148	lvx		v29,0,r2
149	lis		r2,ha16(LV30)
150	la		r2,lo16(LV30)(r2)
151	lvx		v30,0,r2
152	lis		r2,ha16(LV31)
153	la		r2,lo16(LV31)(r2)
154	lvx		v31,0,r2
155
156	lis		r2,0x1234
157	ori		r2,r2,0x5678
158	mtocrf	255,r2
159
160	# call test function which will invoke unwinder which "returns" here
161	mtctr	r3
162	bctrl
163
164	# verify that non-volatile registers still contain magic values
165	lis		r3,0x3333
166	ori		r3,r3,0x3131
167	cmpw	r3,r31
168	bne		L2
169	lis		r3,0x3333
170	ori		r3,r3,0x3030
171	cmpw	r3,r30
172	bne		L2
173	lis		r3,0x2222
174	ori		r3,r3,0x2929
175	cmpw	r3,r29
176	bne		L2
177	lis		r3,0x2222
178	ori		r3,r3,0x2828
179	cmpw	r3,r28
180	bne		L2
181	lis		r3,0x2222
182	ori		r3,r3,0x2727
183	cmpw	r3,r27
184	bne		L2
185	lis		r3,0x2222
186	ori		r3,r3,0x2626
187	cmpw	r3,r26
188	bne		L2
189	lis		r3,0x2222
190	ori		r3,r3,0x2525
191	cmpw	r3,r25
192	bne		L2
193	lis		r3,0x2222
194	ori		r3,r3,0x2424
195	cmpw	r3,r24
196	bne		L2
197	lis		r3,0x2222
198	ori		r3,r3,0x2323
199	cmpw	r3,r23
200	bne		L2
201	lis		r3,0x2222
202	ori		r3,r3,0x2222
203	cmpw	r3,r22
204	bne		L2
205	lis		r3,0x2222
206	ori		r3,r3,0x2121
207	cmpw	r3,r21
208	bne		L2
209	lis		r3,0x2222
210	ori		r3,r3,0x2020
211	cmpw	r3,r20
212	bne		L2
213	lis		r3,0x1111
214	ori		r3,r3,0x1919
215	cmpw	r3,r19
216	bne		L2
217	lis		r3,0x1111
218	ori		r3,r3,0x1818
219	cmpw	r3,r18
220	bne		L2
221	lis		r3,0x1111
222	ori		r3,r3,0x1717
223	cmpw	r3,r17
224	bne		L2
225	lis		r3,0x1111
226	ori		r3,r3,0x1616
227	cmpw	r3,r16
228	bne		L2
229	lis		r3,0x1111
230	ori		r3,r3,0x1515
231	cmpw	r3,r15
232	bne		L2
233	lis		r3,0x1111
234	ori		r3,r3,0x1414
235	cmpw	r3,r14
236	bne		L2
237	lis		r3,0x1111
238	ori		r3,r3,0x1313
239	cmpw	r3,r13
240	bne		L2
241
242	lis		r2,ha16(LC14)
243	lfs		f1,lo16(LC14)(r2)
244	fcmpu	cr7,f1,f14
245	bne		cr7,L2
246	lis		r2,ha16(LC15)
247	lfs		f1,lo16(LC15)(r2)
248	fcmpu	cr7,f1,f15
249	bne		cr7,L2
250	lis		r2,ha16(LC16)
251	lfs		f1,lo16(LC16)(r2)
252	fcmpu	cr7,f1,f16
253	bne		cr7,L2
254	lis		r2,ha16(LC17)
255	lfs		f1,lo16(LC17)(r2)
256	fcmpu	cr7,f1,f17
257	bne		cr7,L2
258	lis		r2,ha16(LC18)
259	lfs		f1,lo16(LC18)(r2)
260	fcmpu	cr7,f1,f18
261	bne		cr7,L2
262	lis		r2,ha16(LC19)
263	lfs		f1,lo16(LC19)(r2)
264	fcmpu	cr7,f1,f19
265	bne		cr7,L2
266	lis		r2,ha16(LC20)
267	lfs		f1,lo16(LC20)(r2)
268	fcmpu	cr7,f1,f20
269	bne		cr7,L2
270	lis		r2,ha16(LC21)
271	lfs		f1,lo16(LC21)(r2)
272	fcmpu	cr7,f1,f21
273	bne		cr7,L2
274	lis		r2,ha16(LC22)
275	lfs		f1,lo16(LC22)(r2)
276	fcmpu	cr7,f1,f22
277	bne		cr7,L2
278	lis		r2,ha16(LC23)
279	lfs		f1,lo16(LC23)(r2)
280	fcmpu	cr7,f1,f23
281	bne		cr7,L2
282	lis		r2,ha16(LC24)
283	lfs		f1,lo16(LC24)(r2)
284	fcmpu	cr7,f1,f24
285	bne		cr7,L2
286	lis		r2,ha16(LC25)
287	lfs		f1,lo16(LC25)(r2)
288	fcmpu	cr7,f1,f25
289	bne		cr7,L2
290	lis		r2,ha16(LC26)
291	lfs		f1,lo16(LC26)(r2)
292	fcmpu	cr7,f1,f26
293	bne		cr7,L2
294	lis		r2,ha16(LC27)
295	lfs		f1,lo16(LC27)(r2)
296	fcmpu	cr7,f1,f27
297	bne		cr7,L2
298	lis		r2,ha16(LC28)
299	lfs		f1,lo16(LC28)(r2)
300	fcmpu	cr7,f1,f28
301	bne		cr7,L2
302	lis		r2,ha16(LC29)
303	lfs		f1,lo16(LC29)(r2)
304	fcmpu	cr7,f1,f29
305	bne		cr7,L2
306	lis		r2,ha16(LC30)
307	lfs		f1,lo16(LC30)(r2)
308	fcmpu	cr7,f1,f30
309	bne		cr7,L2
310	lis		r2,ha16(LC31)
311	lfs		f1,lo16(LC31)(r2)
312	fcmpu	cr7,f1,f31
313	bne		cr7,L2
314
315	lis		r2,ha16(LV23)
316	la		r2,lo16(LV23)(r2)
317	lvx		v1,0,r2
318	vcmpequw. v0,v1,v23
319	beq		cr6,L2
320	lis		r2,ha16(LV24)
321	la		r2,lo16(LV24)(r2)
322	lvx		v1,0,r2
323	vcmpequw. v0,v1,v24
324	beq		cr6,L2
325	lis		r2,ha16(LV25)
326	la		r2,lo16(LV25)(r2)
327	lvx		v1,0,r2
328	vcmpequw. v0,v1,v25
329	beq		cr6,L2
330	lis		r2,ha16(LV26)
331	la		r2,lo16(LV26)(r2)
332	lvx		v1,0,r2
333	vcmpequw. v0,v1,v26
334	beq		cr6,L2
335	lis		r2,ha16(LV27)
336	la		r2,lo16(LV27)(r2)
337	lvx		v1,0,r2
338	vcmpequw. v0,v1,v27
339	beq		cr6,L2
340	lis		r2,ha16(LV28)
341	la		r2,lo16(LV28)(r2)
342	lvx		v1,0,r2
343	vcmpequw. v0,v1,v28
344	beq		cr6,L2
345	lis		r2,ha16(LV29)
346	la		r2,lo16(LV29)(r2)
347	lvx		v1,0,r2
348	vcmpequw. v0,v1,v29
349	beq		cr6,L2
350	lis		r2,ha16(LV30)
351	la		r2,lo16(LV30)(r2)
352	lvx		v1,0,r2
353	vcmpequw. v0,v1,v30
354	beq		cr6,L2
355	lis		r2,ha16(LV31)
356	la		r2,lo16(LV31)(r2)
357	lvx		v1,0,r2
358	vcmpequw. v0,v1,v31
359	beq		cr6,L2
360
361	mfcr	r3
362	lis		r2,0x00FF
363	ori		r2,r2,0xF000
364	and		r3,r3,r2
365	lis		r2,0x0034
366	ori		r2,r2,0x5000
367	cmpw	r3,r2
368	bne		L2
369
370	li		r3,0
371	b		L3
372L2: li		r3,1
373L3:
374
375	addi r1,r1,336
376	lwz r0,8(r1)
377	lmw r13,-220(r1)
378	mtlr r0
379	b restFP ; restore f14-f31
380LFE2:
381
382
383	.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
384EH_frame1:
385	.set L$set$0,LECIE1-LSCIE1
386	.long L$set$0	; Length of Common Information Entry
387LSCIE1:
388	.long	0x0	; CIE Identifier Tag
389	.byte	0x1	; CIE Version
390	.ascii "zR\0"	; CIE Augmentation
391	.byte	0x1	; uleb128 0x1; CIE Code Alignment Factor
392	.byte	0x7c	; sleb128 -4; CIE Data Alignment Factor
393	.byte	0x41	; CIE RA Column
394	.byte	0x1	; uleb128 0x1; Augmentation size
395	.byte	0x10	; FDE Encoding (pcrel)
396	.byte	0xc	; DW_CFA_def_cfa
397	.byte	0x1	; uleb128 0x1
398	.byte	0x0	; uleb128 0x0
399	.align 2
400LECIE1:
401
402	.globl _unwind_tester.eh
403_unwind_tester.eh:
404LSFDE27:
405	.set L$set$34,LEFDE27-LASFDE27
406	.long L$set$34	; FDE Length
407LASFDE27:
408	.long	LASFDE27-EH_frame1	; FDE CIE offset
409	.long	LFB2-.	; FDE initial location
410	.set L$set$35,LFE2-LFB2
411	.long L$set$35	; FDE address range
412	.byte	0x0	; uleb128 0x0; Augmentation size
413	.byte	0x4	; DW_CFA_advance_loc4
414	.set L$set$36,LCFI43-LFB2
415	.long L$set$36
416	.byte	0x9	; DW_CFA_register
417	.byte	0x41	; uleb128 0x41
418	.byte	0x0	; uleb128 0x0
419	.byte	0x4	; DW_CFA_advance_loc4
420	.set L$set$37,LCFI46-LCFI43
421	.long L$set$37
422	.byte	0xe	; DW_CFA_def_cfa_offset
423	.byte	0xd0,0x2	; uleb128 0x150
424	.byte	0x9f	; DW_CFA_offset, column 0x1f
425	.byte	0x25	; uleb128 0x25
426	.byte	0x9e	; DW_CFA_offset, column 0x1e
427	.byte	0x26	; uleb128 0x26
428	.byte	0x9d	; DW_CFA_offset, column 0x1d
429	.byte	0x27	; uleb128 0x27
430	.byte	0x9c	; DW_CFA_offset, column 0x1c
431	.byte	0x28	; uleb128 0x28
432	.byte	0x9b	; DW_CFA_offset, column 0x1b
433	.byte	0x29	; uleb128 0x29
434	.byte	0x9a	; DW_CFA_offset, column 0x1a
435	.byte	0x2a	; uleb128 0x2a
436	.byte	0x99	; DW_CFA_offset, column 0x19
437	.byte	0x2b	; uleb128 0x2b
438	.byte	0x98	; DW_CFA_offset, column 0x18
439	.byte	0x2c	; uleb128 0x2c
440	.byte	0x97	; DW_CFA_offset, column 0x17
441	.byte	0x2d	; uleb128 0x2d
442	.byte	0x96	; DW_CFA_offset, column 0x16
443	.byte	0x2e	; uleb128 0x2e
444	.byte	0x95	; DW_CFA_offset, column 0x15
445	.byte	0x2f	; uleb128 0x2f
446	.byte	0x94	; DW_CFA_offset, column 0x14
447	.byte	0x30	; uleb128 0x30
448	.byte	0x93	; DW_CFA_offset, column 0x13
449	.byte	0x31	; uleb128 0x31
450	.byte	0x92	; DW_CFA_offset, column 0x12
451	.byte	0x32	; uleb128 0x32
452	.byte	0x91	; DW_CFA_offset, column 0x11
453	.byte	0x33	; uleb128 0x33
454	.byte	0x90	; DW_CFA_offset, column 0x10
455	.byte	0x34	; uleb128 0x34
456	.byte	0x8f	; DW_CFA_offset, column 0xf
457	.byte	0x35	; uleb128 0x35
458	.byte	0x8e	; DW_CFA_offset, column 0xe
459	.byte	0x36	; uleb128 0x36
460	.byte	0x8d	; DW_CFA_offset, column 0xd
461	.byte	0x37	; uleb128 0x37
462	.byte	0x11	; DW_CFA_offset_extended_sf
463	.byte	0x41	; uleb128 0x41
464	.byte	0x7e	; sleb128 -2
465	.byte	0xbf	; DW_CFA_offset, column 0x3f
466	.byte	0x2	; uleb128 0x2
467	.byte	0xbe	; DW_CFA_offset, column 0x3e
468	.byte	0x4	; uleb128 0x4
469	.byte	0xbd	; DW_CFA_offset, column 0x3d
470	.byte	0x6	; uleb128 0x6
471	.byte	0xbc	; DW_CFA_offset, column 0x3c
472	.byte	0x8	; uleb128 0x8
473	.byte	0xbb	; DW_CFA_offset, column 0x3b
474	.byte	0xa	; uleb128 0xa
475	.byte	0xba	; DW_CFA_offset, column 0x3a
476	.byte	0xc	; uleb128 0xc
477	.byte	0xb9	; DW_CFA_offset, column 0x39
478	.byte	0xe	; uleb128 0xe
479	.byte	0xb8	; DW_CFA_offset, column 0x38
480	.byte	0x10	; uleb128 0x10
481	.byte	0xb7	; DW_CFA_offset, column 0x37
482	.byte	0x12	; uleb128 0x12
483	.byte	0xb6	; DW_CFA_offset, column 0x36
484	.byte	0x14	; uleb128 0x14
485	.byte	0xb5	; DW_CFA_offset, column 0x35
486	.byte	0x16	; uleb128 0x16
487	.byte	0xb4	; DW_CFA_offset, column 0x34
488	.byte	0x18	; uleb128 0x18
489	.byte	0xb3	; DW_CFA_offset, column 0x33
490	.byte	0x1a	; uleb128 0x1a
491	.byte	0xb2	; DW_CFA_offset, column 0x32
492	.byte	0x1c	; uleb128 0x1c
493	.byte	0xb1	; DW_CFA_offset, column 0x31
494	.byte	0x1e	; uleb128 0x1e
495	.byte	0xb0	; DW_CFA_offset, column 0x30
496	.byte	0x20	; uleb128 0x20
497	.byte	0xaf	; DW_CFA_offset, column 0x2f
498	.byte	0x22	; uleb128 0x22
499	.byte	0xae	; DW_CFA_offset, column 0x2e
500	.byte	0x24	; uleb128 0x24
501	.align 2
502LEFDE27:
503