1/* -----------------------------------------------------------------------
2   sysv.S - Copyright (c) 2002, 2003, 2004, 2006, 2008 Kaz Kojima
3
4   SuperH Foreign Function Interface
5
6   Permission is hereby granted, free of charge, to any person obtaining
7   a copy of this software and associated documentation files (the
8   ``Software''), to deal in the Software without restriction, including
9   without limitation the rights to use, copy, modify, merge, publish,
10   distribute, sublicense, and/or sell copies of the Software, and to
11   permit persons to whom the Software is furnished to do so, subject to
12   the following conditions:
13
14   The above copyright notice and this permission notice shall be included
15   in all copies or substantial portions of the Software.
16
17   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
18   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
21   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
22   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
24   DEALINGS IN THE SOFTWARE.
25   ----------------------------------------------------------------------- */
26
27#define LIBFFI_ASM
28#include <fficonfig.h>
29#include <ffi.h>
30#ifdef HAVE_MACHINE_ASM_H
31#include <machine/asm.h>
32#else
33/* XXX these lose for some platforms, I'm sure. */
34#define CNAME(x) x
35#define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x):
36#endif
37
38#if defined(__HITACHI__)
39#define STRUCT_VALUE_ADDRESS_WITH_ARG 1
40#else
41#define STRUCT_VALUE_ADDRESS_WITH_ARG 0
42#endif
43
44.text
45
46	# r4:	ffi_prep_args
47	# r5:	&ecif
48	# r6:	bytes
49	# r7:	flags
50	# sp+0: rvalue
51	# sp+4: fn
52
53	# This assumes we are using gas.
54ENTRY(ffi_call_SYSV)
55	# Save registers
56.LFB1:
57	mov.l	r8,@-r15
58.LCFI0:
59	mov.l	r9,@-r15
60.LCFI1:
61	mov.l	r10,@-r15
62.LCFI2:
63	mov.l	r12,@-r15
64.LCFI3:
65	mov.l	r14,@-r15
66.LCFI4:
67	sts.l	pr,@-r15
68.LCFI5:
69	mov	r15,r14
70.LCFI6:
71#if defined(__SH4__)
72	mov	r6,r8
73	mov	r7,r9
74
75	sub	r6,r15
76	add	#-16,r15
77	mov	#~7,r0
78	and	r0,r15
79
80	mov	r4,r0
81	jsr	@r0
82	 mov	r15,r4
83
84	mov	r9,r1
85	shlr8	r9
86	shlr8	r9
87	shlr8	r9
88
89	mov	#FFI_TYPE_STRUCT,r2
90	cmp/eq	r2,r9
91	bf	1f
92#if STRUCT_VALUE_ADDRESS_WITH_ARG
93 	mov.l	@r15+,r4
94	bra	2f
95	 mov	#5,r2
96#else
97 	mov.l	@r15+,r10
98#endif
991:
100	mov	#4,r2
1012:
102	mov	#4,r3
103
104L_pass:
105	cmp/pl	r8
106	bf	L_call_it
107
108	mov	r1,r0
109	and	#3,r0
110
111L_pass_d:
112	cmp/eq	#FFI_TYPE_DOUBLE,r0
113	bf	L_pass_f
114
115	mov	r3,r0
116	and	#1,r0
117	tst	r0,r0
118	bt	1f
119	add	#1,r3
1201:
121	mov	#12,r0
122	cmp/hs	r0,r3
123	bt/s	3f
124	 shlr2	r1
125	bsr	L_pop_d
126	 nop
1273:
128	add	#2,r3
129	bra	L_pass
130	 add	#-8,r8
131
132L_pop_d:
133	mov	r3,r0
134	add	r0,r0
135	add	r3,r0
136	add	#-12,r0
137	braf	r0
138	 nop
139#ifdef __LITTLE_ENDIAN__
140	fmov.s	@r15+,fr5
141	rts
142	 fmov.s	@r15+,fr4
143	fmov.s	@r15+,fr7
144	rts
145	 fmov.s	@r15+,fr6
146	fmov.s	@r15+,fr9
147	rts
148	 fmov.s	@r15+,fr8
149	fmov.s	@r15+,fr11
150	rts
151	 fmov.s	@r15+,fr10
152#else
153	fmov.s	@r15+,fr4
154	rts
155	 fmov.s	@r15+,fr5
156	fmov.s	@r15+,fr6
157	rts
158	 fmov.s	@r15+,fr7
159	fmov.s	@r15+,fr8
160	rts
161	 fmov.s	@r15+,fr9
162	fmov.s	@r15+,fr10
163	rts
164	 fmov.s	@r15+,fr11
165#endif
166
167L_pass_f:
168	cmp/eq	#FFI_TYPE_FLOAT,r0
169	bf	L_pass_i
170
171	mov	#12,r0
172	cmp/hs	r0,r3
173	bt/s	2f
174	 shlr2	r1
175	bsr	L_pop_f
176	 nop
1772:
178	add	#1,r3
179	bra	L_pass
180	 add	#-4,r8
181
182L_pop_f:
183	mov	r3,r0
184	shll2	r0
185	add	#-16,r0
186	braf	r0
187	 nop
188#ifdef __LITTLE_ENDIAN__
189	rts
190	 fmov.s	@r15+,fr5
191	rts
192	 fmov.s	@r15+,fr4
193	rts
194	 fmov.s	@r15+,fr7
195	rts
196	 fmov.s	@r15+,fr6
197	rts
198	 fmov.s	@r15+,fr9
199	rts
200	 fmov.s	@r15+,fr8
201	rts
202	 fmov.s	@r15+,fr11
203	rts
204	 fmov.s	@r15+,fr10
205#else
206	rts
207	 fmov.s	@r15+,fr4
208	rts
209	 fmov.s	@r15+,fr5
210	rts
211	 fmov.s	@r15+,fr6
212	rts
213	 fmov.s	@r15+,fr7
214	rts
215	 fmov.s	@r15+,fr8
216	rts
217	 fmov.s	@r15+,fr9
218	rts
219	 fmov.s	@r15+,fr10
220	rts
221	 fmov.s	@r15+,fr11
222#endif
223
224L_pass_i:
225	cmp/eq	#FFI_TYPE_INT,r0
226	bf	L_call_it
227
228	mov	#8,r0
229	cmp/hs	r0,r2
230	bt/s	2f
231	 shlr2	r1
232	bsr	L_pop_i
233	 nop
2342:
235	add	#1,r2
236	bra	L_pass
237	 add	#-4,r8
238
239L_pop_i:
240	mov	r2,r0
241	shll2	r0
242	add	#-16,r0
243	braf	r0
244	 nop
245	rts
246	 mov.l	@r15+,r4
247	rts
248	 mov.l	@r15+,r5
249	rts
250	 mov.l	@r15+,r6
251	rts
252	 mov.l	@r15+,r7
253
254L_call_it:
255	# call function
256#if (! STRUCT_VALUE_ADDRESS_WITH_ARG)
257	mov	r10, r2
258#endif
259	mov.l  @(28,r14),r1
260	jsr    @r1
261	 nop
262
263L_ret_d:
264	mov	#FFI_TYPE_DOUBLE,r2
265	cmp/eq	r2,r9
266	bf	L_ret_ll
267
268	mov.l	@(24,r14),r1
269#ifdef __LITTLE_ENDIAN__
270	fmov.s	fr1,@r1
271	add	#4,r1
272	bra	L_epilogue
273	 fmov.s	fr0,@r1
274#else
275	fmov.s	fr0,@r1
276	add	#4,r1
277	bra	L_epilogue
278	 fmov.s	fr1,@r1
279#endif
280
281L_ret_ll:
282	mov	#FFI_TYPE_SINT64,r2
283	cmp/eq	r2,r9
284	bt/s	1f
285	 mov	#FFI_TYPE_UINT64,r2
286	cmp/eq	r2,r9
287	bf	L_ret_f
288
2891:
290	mov.l	@(24,r14),r2
291	mov.l	r0,@r2
292	bra	L_epilogue
293	 mov.l	r1,@(4,r2)
294
295L_ret_f:
296	mov	#FFI_TYPE_FLOAT,r2
297	cmp/eq	r2,r9
298	bf	L_ret_i
299
300	mov.l	@(24,r14),r1
301	bra	L_epilogue
302	 fmov.s	fr0,@r1
303
304L_ret_i:
305	mov	#FFI_TYPE_INT,r2
306	cmp/eq	r2,r9
307	bf	L_epilogue
308
309	mov.l	@(24,r14),r1
310	bra	L_epilogue
311	 mov.l	r0,@r1
312
313L_epilogue:
314	# Remove the space we pushed for the args
315	mov   r14,r15
316
317	lds.l  @r15+,pr
318	mov.l  @r15+,r14
319	mov.l  @r15+,r12
320	mov.l  @r15+,r10
321	mov.l  @r15+,r9
322	rts
323	 mov.l  @r15+,r8
324#else
325	mov	r6,r8
326	mov	r7,r9
327
328	sub	r6,r15
329	add	#-16,r15
330	mov	#~7,r0
331	and	r0,r15
332
333	mov	r4,r0
334	jsr	@r0
335	 mov	r15,r4
336
337	mov	r9,r3
338	shlr8	r9
339	shlr8	r9
340	shlr8	r9
341
342	mov	#FFI_TYPE_STRUCT,r2
343	cmp/eq	r2,r9
344	bf	1f
345#if STRUCT_VALUE_ADDRESS_WITH_ARG
346	mov.l	@r15+,r4
347	bra	2f
348	 mov	#5,r2
349#else
350	mov.l	@r15+,r10
351#endif
3521:
353	mov	#4,r2
3542:
355
356L_pass:
357	cmp/pl	r8
358	bf	L_call_it
359
360	mov	r3,r0
361	and	#3,r0
362
363L_pass_d:
364	cmp/eq	#FFI_TYPE_DOUBLE,r0
365	bf	L_pass_i
366
367	mov	r15,r0
368	and	#7,r0
369	tst	r0,r0
370	bt	1f
371	add	#4,r15
3721:
373	mov	#8,r0
374	cmp/hs	r0,r2
375	bt/s	2f
376	 shlr2	r3
377	bsr	L_pop_d
378	 nop
3792:
380	add	#2,r2
381	bra	L_pass
382	 add	#-8,r8
383
384L_pop_d:
385	mov	r2,r0
386	add	r0,r0
387	add	r2,r0
388	add	#-12,r0
389	add	r0,r0
390	braf	r0
391	 nop
392	mov.l	@r15+,r4
393	rts
394	 mov.l	@r15+,r5
395	mov.l	@r15+,r5
396	rts
397	 mov.l	@r15+,r6
398	mov.l	@r15+,r6
399	rts
400	 mov.l	@r15+,r7
401	rts
402	 mov.l	@r15+,r7
403
404L_pass_i:
405	cmp/eq	#FFI_TYPE_INT,r0
406	bf	L_call_it
407
408	mov	#8,r0
409	cmp/hs	r0,r2
410	bt/s	2f
411	 shlr2	r3
412	bsr	L_pop_i
413	 nop
4142:
415	add	#1,r2
416	bra	L_pass
417	 add	#-4,r8
418
419L_pop_i:
420	mov	r2,r0
421	shll2	r0
422	add	#-16,r0
423	braf	r0
424	 nop
425	rts
426	 mov.l	@r15+,r4
427	rts
428	 mov.l	@r15+,r5
429	rts
430	 mov.l	@r15+,r6
431	rts
432	 mov.l	@r15+,r7
433
434L_call_it:
435	# call function
436#if (! STRUCT_VALUE_ADDRESS_WITH_ARG)
437	mov	r10, r2
438#endif
439	mov.l  @(28,r14),r1
440	jsr    @r1
441	 nop
442
443L_ret_d:
444	mov	#FFI_TYPE_DOUBLE,r2
445	cmp/eq	r2,r9
446	bf	L_ret_ll
447
448	mov.l	@(24,r14),r2
449	mov.l	r0,@r2
450	bra	L_epilogue
451	 mov.l	r1,@(4,r2)
452
453L_ret_ll:
454	mov	#FFI_TYPE_SINT64,r2
455	cmp/eq	r2,r9
456	bt/s	1f
457	 mov	#FFI_TYPE_UINT64,r2
458	cmp/eq	r2,r9
459	bf	L_ret_i
460
4611:
462	mov.l	@(24,r14),r2
463	mov.l	r0,@r2
464	bra	L_epilogue
465	 mov.l	r1,@(4,r2)
466
467L_ret_i:
468	mov	#FFI_TYPE_FLOAT,r2
469	cmp/eq	r2,r9
470	bt	1f
471	mov	#FFI_TYPE_INT,r2
472	cmp/eq	r2,r9
473	bf	L_epilogue
4741:
475	mov.l	@(24,r14),r1
476	bra	L_epilogue
477	 mov.l	r0,@r1
478
479L_epilogue:
480	# Remove the space we pushed for the args
481	mov   r14,r15
482
483	lds.l  @r15+,pr
484	mov.l  @r15+,r14
485	mov.l  @r15+,r12
486	mov.l  @r15+,r10
487	mov.l  @r15+,r9
488	rts
489	 mov.l  @r15+,r8
490#endif
491.LFE1:
492.ffi_call_SYSV_end:
493        .size    CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV)
494
495.globl	ffi_closure_helper_SYSV
496
497ENTRY(ffi_closure_SYSV)
498.LFB2:
499	mov.l	r7,@-r15
500.LCFI7:
501	mov.l	r6,@-r15
502.LCFI8:
503	mov.l	r5,@-r15
504.LCFI9:
505	mov.l	r4,@-r15
506.LCFIA:
507	mov.l	r14,@-r15
508.LCFIB:
509	sts.l	pr,@-r15
510
511	/* Stack layout:
512	   xx bytes (on stack parameters)
513	   16 bytes (register parameters)
514	    4 bytes (saved frame pointer)
515	    4 bytes (saved return address)
516	   32 bytes (floating register parameters, SH-4 only)
517	    8 bytes (result)
518	    4 bytes (pad)
519	    4 bytes (5th arg)
520	   <- new stack pointer
521	*/
522.LCFIC:
523#if defined(__SH4__)
524	add	#-48,r15
525#else
526	add	#-16,r15
527#endif
528.LCFID:
529	mov	r15,r14
530.LCFIE:
531
532#if defined(__SH4__)
533	mov	r14,r1
534	add	#48,r1
535#ifdef __LITTLE_ENDIAN__
536	fmov.s	fr10,@-r1
537	fmov.s	fr11,@-r1
538	fmov.s	fr8,@-r1
539	fmov.s	fr9,@-r1
540	fmov.s	fr6,@-r1
541	fmov.s	fr7,@-r1
542	fmov.s	fr4,@-r1
543	fmov.s	fr5,@-r1
544#else
545	fmov.s	fr11,@-r1
546	fmov.s	fr10,@-r1
547	fmov.s	fr9,@-r1
548	fmov.s	fr8,@-r1
549	fmov.s	fr7,@-r1
550	fmov.s	fr6,@-r1
551	fmov.s	fr5,@-r1
552	fmov.s	fr4,@-r1
553#endif
554	mov	r1,r7
555	mov	r14,r6
556	add	#56,r6
557#else
558	mov	r14,r6
559	add	#24,r6
560#endif
561
562	bt/s	10f
563	 mov	r2, r5
564	mov	r14,r1
565	add	#8,r1
566	mov	r1,r5
56710:
568
569	mov	r14,r1
570#if defined(__SH4__)
571	add	#72,r1
572#else
573	add	#40,r1
574#endif
575	mov.l	r1,@r14
576
577#ifdef PIC
578	mov.l	L_got,r1
579	mova	L_got,r0
580	add	r0,r1
581	mov.l	L_helper,r0
582	add	r1,r0
583#else
584	mov.l	L_helper,r0
585#endif
586	jsr	@r0
587	 mov	r3,r4
588
589	shll	r0
590	mov	r0,r1
591	mova	L_table,r0
592	add	r1,r0
593	mov.w	@r0,r0
594	mov	r14,r2
595	braf	r0
596	 add	#8,r2
5970:
598	.align 2
599#ifdef PIC
600L_got:
601	.long	_GLOBAL_OFFSET_TABLE_
602L_helper:
603	.long	ffi_closure_helper_SYSV@GOTOFF
604#else
605L_helper:
606	.long	ffi_closure_helper_SYSV
607#endif
608L_table:
609	.short L_case_v - 0b	/* FFI_TYPE_VOID */
610	.short L_case_i - 0b	/* FFI_TYPE_INT */
611#if defined(__SH4__)
612	.short L_case_f - 0b	/* FFI_TYPE_FLOAT */
613	.short L_case_d - 0b	/* FFI_TYPE_DOUBLE */
614	.short L_case_d - 0b	/* FFI_TYPE_LONGDOUBLE */
615#else
616	.short L_case_i - 0b	/* FFI_TYPE_FLOAT */
617	.short L_case_ll - 0b	/* FFI_TYPE_DOUBLE */
618	.short L_case_ll - 0b	/* FFI_TYPE_LONGDOUBLE */
619#endif
620	.short L_case_uq - 0b	/* FFI_TYPE_UINT8 */
621	.short L_case_q - 0b	/* FFI_TYPE_SINT8 */
622	.short L_case_uh - 0b	/* FFI_TYPE_UINT16 */
623	.short L_case_h - 0b	/* FFI_TYPE_SINT16 */
624	.short L_case_i - 0b	/* FFI_TYPE_UINT32 */
625	.short L_case_i - 0b	/* FFI_TYPE_SINT32 */
626	.short L_case_ll - 0b	/* FFI_TYPE_UINT64 */
627	.short L_case_ll - 0b	/* FFI_TYPE_SINT64 */
628	.short L_case_v - 0b	/* FFI_TYPE_STRUCT */
629	.short L_case_i - 0b	/* FFI_TYPE_POINTER */
630
631#if defined(__SH4__)
632L_case_d:
633#ifdef __LITTLE_ENDIAN__
634	fmov.s	@r2+,fr1
635	bra	L_case_v
636	 fmov.s	@r2,fr0
637#else
638	fmov.s	@r2+,fr0
639	bra	L_case_v
640	 fmov.s	@r2,fr1
641#endif
642
643L_case_f:
644	bra	L_case_v
645	 fmov.s	@r2,fr0
646#endif
647
648L_case_ll:
649	mov.l	@r2+,r0
650	bra	L_case_v
651	 mov.l	@r2,r1
652
653L_case_i:
654	bra	L_case_v
655	 mov.l	@r2,r0
656
657L_case_q:
658#ifdef __LITTLE_ENDIAN__
659#else
660	add	#3,r2
661#endif
662	bra	L_case_v
663	 mov.b	@r2,r0
664
665L_case_uq:
666#ifdef __LITTLE_ENDIAN__
667#else
668	add	#3,r2
669#endif
670	mov.b	@r2,r0
671	bra	L_case_v
672	 extu.b r0,r0
673
674L_case_h:
675#ifdef __LITTLE_ENDIAN__
676#else
677	add	#2,r2
678#endif
679	bra	L_case_v
680	 mov.w	@r2,r0
681
682L_case_uh:
683#ifdef __LITTLE_ENDIAN__
684#else
685	add	#2,r2
686#endif
687	mov.w	@r2,r0
688	extu.w	r0,r0
689	/* fall through */
690
691L_case_v:
692#if defined(__SH4__)
693	add	#48,r15
694#else
695	add	#16,r15
696#endif
697	lds.l	@r15+,pr
698	mov.l	@r15+,r14
699	rts
700	 add	#16,r15
701.LFE2:
702.ffi_closure_SYSV_end:
703        .size    CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV)
704
705#if defined __ELF__ && defined __linux__
706	.section	.note.GNU-stack,"",@progbits
707#endif
708
709	.section	".eh_frame","aw",@progbits
710__FRAME_BEGIN__:
711	.4byte	.LECIE1-.LSCIE1	/* Length of Common Information Entry */
712.LSCIE1:
713	.4byte	0x0	/* CIE Identifier Tag */
714	.byte	0x1	/* CIE Version */
715#ifdef PIC
716	.ascii "zR\0"	/* CIE Augmentation */
717#else
718	.byte	0x0	/* CIE Augmentation */
719#endif
720	.byte	0x1	/* uleb128 0x1; CIE Code Alignment Factor */
721	.byte	0x7c	/* sleb128 -4; CIE Data Alignment Factor */
722	.byte	0x11	/* CIE RA Column */
723#ifdef PIC
724	.uleb128 0x1	/* Augmentation size */
725	.byte	0x10	/* FDE Encoding (pcrel) */
726#endif
727	.byte	0xc	/* DW_CFA_def_cfa */
728	.byte	0xf	/* uleb128 0xf */
729	.byte	0x0	/* uleb128 0x0 */
730	.align	2
731.LECIE1:
732.LSFDE1:
733	.4byte	.LEFDE1-.LASFDE1	/* FDE Length */
734.LASFDE1:
735	.4byte	.LASFDE1-__FRAME_BEGIN__	/* FDE CIE offset */
736#ifdef PIC
737	.4byte	.LFB1-.	/* FDE initial location */
738#else
739	.4byte	.LFB1	/* FDE initial location */
740#endif
741	.4byte	.LFE1-.LFB1	 /* FDE address range */
742#ifdef PIC
743	.uleb128 0x0	/* Augmentation size */
744#endif
745	.byte	0x4	/* DW_CFA_advance_loc4 */
746	.4byte	.LCFI0-.LFB1
747	.byte	0xe	/* DW_CFA_def_cfa_offset */
748	.byte	0x4	/* uleb128 0x4 */
749	.byte	0x4	/* DW_CFA_advance_loc4 */
750	.4byte	.LCFI1-.LCFI0
751	.byte	0xe	/* DW_CFA_def_cfa_offset */
752	.byte	0x8	/* uleb128 0x4 */
753	.byte	0x4	/* DW_CFA_advance_loc4 */
754	.4byte	.LCFI2-.LCFI1
755	.byte	0xe	/* DW_CFA_def_cfa_offset */
756	.byte	0xc	/* uleb128 0x4 */
757	.byte	0x4	/* DW_CFA_advance_loc4 */
758	.4byte	.LCFI3-.LCFI2
759	.byte	0xe	/* DW_CFA_def_cfa_offset */
760	.byte	0x10	/* uleb128 0x4 */
761	.byte	0x4	/* DW_CFA_advance_loc4 */
762	.4byte	.LCFI4-.LCFI3
763	.byte	0xe	/* DW_CFA_def_cfa_offset */
764	.byte	0x14	/* uleb128 0x4 */
765	.byte	0x4	/* DW_CFA_advance_loc4 */
766	.4byte	.LCFI5-.LCFI4
767	.byte	0xe	/* DW_CFA_def_cfa_offset */
768	.byte	0x18	/* uleb128 0x4 */
769	.byte	0x91	/* DW_CFA_offset, column 0x11 */
770	.byte	0x6	/* uleb128 0x6 */
771	.byte	0x8e	/* DW_CFA_offset, column 0xe */
772	.byte	0x5	/* uleb128 0x5 */
773	.byte	0x8c	/* DW_CFA_offset, column 0xc */
774	.byte	0x4	/* uleb128 0x4 */
775	.byte	0x8a	/* DW_CFA_offset, column 0xa */
776	.byte	0x3	/* uleb128 0x3 */
777	.byte	0x89	/* DW_CFA_offset, column 0x9 */
778	.byte	0x2	/* uleb128 0x2 */
779	.byte	0x88	/* DW_CFA_offset, column 0x8 */
780	.byte	0x1	/* uleb128 0x1 */
781	.byte	0x4	/* DW_CFA_advance_loc4 */
782	.4byte	.LCFI6-.LCFI5
783	.byte	0xd	/* DW_CFA_def_cfa_register */
784	.byte	0xe	/* uleb128 0xe */
785	.align	2
786.LEFDE1:
787
788.LSFDE3:
789	.4byte	.LEFDE3-.LASFDE3	/* FDE Length */
790.LASFDE3:
791	.4byte	.LASFDE3-__FRAME_BEGIN__	/* FDE CIE offset */
792#ifdef PIC
793	.4byte	.LFB2-.	/* FDE initial location */
794#else
795	.4byte	.LFB2	/* FDE initial location */
796#endif
797	.4byte	.LFE2-.LFB2	 /* FDE address range */
798#ifdef PIC
799	.uleb128 0x0	/* Augmentation size */
800#endif
801	.byte	0x4	/* DW_CFA_advance_loc4 */
802	.4byte	.LCFI7-.LFB2
803	.byte	0xe	/* DW_CFA_def_cfa_offset */
804	.byte	0x4	/* uleb128 0x4 */
805	.byte	0x4	/* DW_CFA_advance_loc4 */
806	.4byte	.LCFI8-.LCFI7
807	.byte	0xe	/* DW_CFA_def_cfa_offset */
808	.byte	0x8	/* uleb128 0x4 */
809	.byte	0x4	/* DW_CFA_advance_loc4 */
810	.4byte	.LCFI9-.LCFI8
811	.byte	0xe	/* DW_CFA_def_cfa_offset */
812	.byte	0xc	/* uleb128 0x4 */
813	.byte	0x4	/* DW_CFA_advance_loc4 */
814	.4byte	.LCFIA-.LCFI9
815	.byte	0xe	/* DW_CFA_def_cfa_offset */
816	.byte	0x10	/* uleb128 0x4 */
817	.byte	0x4	/* DW_CFA_advance_loc4 */
818	.4byte	.LCFIB-.LCFIA
819	.byte	0xe	/* DW_CFA_def_cfa_offset */
820	.byte	0x14	/* uleb128 0x4 */
821	.byte	0x4	/* DW_CFA_advance_loc4 */
822	.4byte	.LCFIC-.LCFIB
823	.byte	0xe	/* DW_CFA_def_cfa_offset */
824	.byte	0x18	/* uleb128 0x4 */
825	.byte	0x4	/* DW_CFA_advance_loc4 */
826	.4byte	.LCFID-.LCFIC
827	.byte	0xe	/* DW_CFA_def_cfa_offset */
828#if defined(__SH4__)
829	.byte	24+48	/* uleb128 24+48 */
830#else
831	.byte	24+16	/* uleb128 24+16 */
832#endif
833	.byte	0x91	/* DW_CFA_offset, column 0x11 */
834	.byte	0x6	/* uleb128 0x6 */
835	.byte	0x8e	/* DW_CFA_offset, column 0xe */
836	.byte	0x5	/* uleb128 0x5 */
837	.byte	0x84	/* DW_CFA_offset, column 0x4 */
838	.byte	0x4	/* uleb128 0x4 */
839	.byte	0x85	/* DW_CFA_offset, column 0x5 */
840	.byte	0x3	/* uleb128 0x3 */
841	.byte	0x86	/* DW_CFA_offset, column 0x6 */
842	.byte	0x2	/* uleb128 0x2 */
843	.byte	0x87	/* DW_CFA_offset, column 0x7 */
844	.byte	0x1	/* uleb128 0x1 */
845	.byte	0x4	/* DW_CFA_advance_loc4 */
846	.4byte	.LCFIE-.LCFID
847	.byte	0xd	/* DW_CFA_def_cfa_register */
848	.byte	0xe	/* uleb128 0xe */
849	.align	2
850.LEFDE3:
851