|  | /* ----------------------------------------------------------------------- | 
|  | sysv.S - Copyright (c) 2002, 2003, 2004, 2006, 2008 Kaz Kojima | 
|  |  | 
|  | SuperH Foreign Function Interface | 
|  |  | 
|  | Permission is hereby granted, free of charge, to any person obtaining | 
|  | a copy of this software and associated documentation files (the | 
|  | ``Software''), to deal in the Software without restriction, including | 
|  | without limitation the rights to use, copy, modify, merge, publish, | 
|  | distribute, sublicense, and/or sell copies of the Software, and to | 
|  | permit persons to whom the Software is furnished to do so, subject to | 
|  | the following conditions: | 
|  |  | 
|  | The above copyright notice and this permission notice shall be included | 
|  | in all copies or substantial portions of the Software. | 
|  |  | 
|  | THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, | 
|  | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | 
|  | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | 
|  | NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT | 
|  | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | 
|  | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | 
|  | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 
|  | DEALINGS IN THE SOFTWARE. | 
|  | ----------------------------------------------------------------------- */ | 
|  |  | 
|  | #define LIBFFI_ASM | 
|  | #include <fficonfig.h> | 
|  | #include <ffi.h> | 
|  | #ifdef HAVE_MACHINE_ASM_H | 
|  | #include <machine/asm.h> | 
|  | #else | 
|  | /* XXX these lose for some platforms, I'm sure. */ | 
|  | #define CNAME(x) x | 
|  | #define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x): | 
|  | #endif | 
|  |  | 
|  | #if defined(__HITACHI__) | 
|  | #define STRUCT_VALUE_ADDRESS_WITH_ARG 1 | 
|  | #else | 
|  | #define STRUCT_VALUE_ADDRESS_WITH_ARG 0 | 
|  | #endif | 
|  |  | 
|  | .text | 
|  |  | 
|  | # r4:	ffi_prep_args | 
|  | # r5:	&ecif | 
|  | # r6:	bytes | 
|  | # r7:	flags | 
|  | # sp+0: rvalue | 
|  | # sp+4: fn | 
|  |  | 
|  | # This assumes we are using gas. | 
|  | ENTRY(ffi_call_SYSV) | 
|  | # Save registers | 
|  | .LFB1: | 
|  | mov.l	r8,@-r15 | 
|  | .LCFI0: | 
|  | mov.l	r9,@-r15 | 
|  | .LCFI1: | 
|  | mov.l	r10,@-r15 | 
|  | .LCFI2: | 
|  | mov.l	r12,@-r15 | 
|  | .LCFI3: | 
|  | mov.l	r14,@-r15 | 
|  | .LCFI4: | 
|  | sts.l	pr,@-r15 | 
|  | .LCFI5: | 
|  | mov	r15,r14 | 
|  | .LCFI6: | 
|  | #if defined(__SH4__) | 
|  | mov	r6,r8 | 
|  | mov	r7,r9 | 
|  |  | 
|  | sub	r6,r15 | 
|  | add	#-16,r15 | 
|  | mov	#~7,r0 | 
|  | and	r0,r15 | 
|  |  | 
|  | mov	r4,r0 | 
|  | jsr	@r0 | 
|  | mov	r15,r4 | 
|  |  | 
|  | mov	r9,r1 | 
|  | shlr8	r9 | 
|  | shlr8	r9 | 
|  | shlr8	r9 | 
|  |  | 
|  | mov	#FFI_TYPE_STRUCT,r2 | 
|  | cmp/eq	r2,r9 | 
|  | bf	1f | 
|  | #if STRUCT_VALUE_ADDRESS_WITH_ARG | 
|  | mov.l	@r15+,r4 | 
|  | bra	2f | 
|  | mov	#5,r2 | 
|  | #else | 
|  | mov.l	@r15+,r10 | 
|  | #endif | 
|  | 1: | 
|  | mov	#4,r2 | 
|  | 2: | 
|  | mov	#4,r3 | 
|  |  | 
|  | L_pass: | 
|  | cmp/pl	r8 | 
|  | bf	L_call_it | 
|  |  | 
|  | mov	r1,r0 | 
|  | and	#3,r0 | 
|  |  | 
|  | L_pass_d: | 
|  | cmp/eq	#FFI_TYPE_DOUBLE,r0 | 
|  | bf	L_pass_f | 
|  |  | 
|  | mov	r3,r0 | 
|  | and	#1,r0 | 
|  | tst	r0,r0 | 
|  | bt	1f | 
|  | add	#1,r3 | 
|  | 1: | 
|  | mov	#12,r0 | 
|  | cmp/hs	r0,r3 | 
|  | bt/s	3f | 
|  | shlr2	r1 | 
|  | bsr	L_pop_d | 
|  | nop | 
|  | 3: | 
|  | add	#2,r3 | 
|  | bra	L_pass | 
|  | add	#-8,r8 | 
|  |  | 
|  | L_pop_d: | 
|  | mov	r3,r0 | 
|  | add	r0,r0 | 
|  | add	r3,r0 | 
|  | add	#-12,r0 | 
|  | braf	r0 | 
|  | nop | 
|  | #ifdef __LITTLE_ENDIAN__ | 
|  | fmov.s	@r15+,fr5 | 
|  | rts | 
|  | fmov.s	@r15+,fr4 | 
|  | fmov.s	@r15+,fr7 | 
|  | rts | 
|  | fmov.s	@r15+,fr6 | 
|  | fmov.s	@r15+,fr9 | 
|  | rts | 
|  | fmov.s	@r15+,fr8 | 
|  | fmov.s	@r15+,fr11 | 
|  | rts | 
|  | fmov.s	@r15+,fr10 | 
|  | #else | 
|  | fmov.s	@r15+,fr4 | 
|  | rts | 
|  | fmov.s	@r15+,fr5 | 
|  | fmov.s	@r15+,fr6 | 
|  | rts | 
|  | fmov.s	@r15+,fr7 | 
|  | fmov.s	@r15+,fr8 | 
|  | rts | 
|  | fmov.s	@r15+,fr9 | 
|  | fmov.s	@r15+,fr10 | 
|  | rts | 
|  | fmov.s	@r15+,fr11 | 
|  | #endif | 
|  |  | 
|  | L_pass_f: | 
|  | cmp/eq	#FFI_TYPE_FLOAT,r0 | 
|  | bf	L_pass_i | 
|  |  | 
|  | mov	#12,r0 | 
|  | cmp/hs	r0,r3 | 
|  | bt/s	2f | 
|  | shlr2	r1 | 
|  | bsr	L_pop_f | 
|  | nop | 
|  | 2: | 
|  | add	#1,r3 | 
|  | bra	L_pass | 
|  | add	#-4,r8 | 
|  |  | 
|  | L_pop_f: | 
|  | mov	r3,r0 | 
|  | shll2	r0 | 
|  | add	#-16,r0 | 
|  | braf	r0 | 
|  | nop | 
|  | #ifdef __LITTLE_ENDIAN__ | 
|  | rts | 
|  | fmov.s	@r15+,fr5 | 
|  | rts | 
|  | fmov.s	@r15+,fr4 | 
|  | rts | 
|  | fmov.s	@r15+,fr7 | 
|  | rts | 
|  | fmov.s	@r15+,fr6 | 
|  | rts | 
|  | fmov.s	@r15+,fr9 | 
|  | rts | 
|  | fmov.s	@r15+,fr8 | 
|  | rts | 
|  | fmov.s	@r15+,fr11 | 
|  | rts | 
|  | fmov.s	@r15+,fr10 | 
|  | #else | 
|  | rts | 
|  | fmov.s	@r15+,fr4 | 
|  | rts | 
|  | fmov.s	@r15+,fr5 | 
|  | rts | 
|  | fmov.s	@r15+,fr6 | 
|  | rts | 
|  | fmov.s	@r15+,fr7 | 
|  | rts | 
|  | fmov.s	@r15+,fr8 | 
|  | rts | 
|  | fmov.s	@r15+,fr9 | 
|  | rts | 
|  | fmov.s	@r15+,fr10 | 
|  | rts | 
|  | fmov.s	@r15+,fr11 | 
|  | #endif | 
|  |  | 
|  | L_pass_i: | 
|  | cmp/eq	#FFI_TYPE_INT,r0 | 
|  | bf	L_call_it | 
|  |  | 
|  | mov	#8,r0 | 
|  | cmp/hs	r0,r2 | 
|  | bt/s	2f | 
|  | shlr2	r1 | 
|  | bsr	L_pop_i | 
|  | nop | 
|  | 2: | 
|  | add	#1,r2 | 
|  | bra	L_pass | 
|  | add	#-4,r8 | 
|  |  | 
|  | L_pop_i: | 
|  | mov	r2,r0 | 
|  | shll2	r0 | 
|  | add	#-16,r0 | 
|  | braf	r0 | 
|  | nop | 
|  | rts | 
|  | mov.l	@r15+,r4 | 
|  | rts | 
|  | mov.l	@r15+,r5 | 
|  | rts | 
|  | mov.l	@r15+,r6 | 
|  | rts | 
|  | mov.l	@r15+,r7 | 
|  |  | 
|  | L_call_it: | 
|  | # call function | 
|  | #if (! STRUCT_VALUE_ADDRESS_WITH_ARG) | 
|  | mov	r10, r2 | 
|  | #endif | 
|  | mov.l  @(28,r14),r1 | 
|  | jsr    @r1 | 
|  | nop | 
|  |  | 
|  | L_ret_d: | 
|  | mov	#FFI_TYPE_DOUBLE,r2 | 
|  | cmp/eq	r2,r9 | 
|  | bf	L_ret_ll | 
|  |  | 
|  | mov.l	@(24,r14),r1 | 
|  | #ifdef __LITTLE_ENDIAN__ | 
|  | fmov.s	fr1,@r1 | 
|  | add	#4,r1 | 
|  | bra	L_epilogue | 
|  | fmov.s	fr0,@r1 | 
|  | #else | 
|  | fmov.s	fr0,@r1 | 
|  | add	#4,r1 | 
|  | bra	L_epilogue | 
|  | fmov.s	fr1,@r1 | 
|  | #endif | 
|  |  | 
|  | L_ret_ll: | 
|  | mov	#FFI_TYPE_SINT64,r2 | 
|  | cmp/eq	r2,r9 | 
|  | bt/s	1f | 
|  | mov	#FFI_TYPE_UINT64,r2 | 
|  | cmp/eq	r2,r9 | 
|  | bf	L_ret_f | 
|  |  | 
|  | 1: | 
|  | mov.l	@(24,r14),r2 | 
|  | mov.l	r0,@r2 | 
|  | bra	L_epilogue | 
|  | mov.l	r1,@(4,r2) | 
|  |  | 
|  | L_ret_f: | 
|  | mov	#FFI_TYPE_FLOAT,r2 | 
|  | cmp/eq	r2,r9 | 
|  | bf	L_ret_i | 
|  |  | 
|  | mov.l	@(24,r14),r1 | 
|  | bra	L_epilogue | 
|  | fmov.s	fr0,@r1 | 
|  |  | 
|  | L_ret_i: | 
|  | mov	#FFI_TYPE_INT,r2 | 
|  | cmp/eq	r2,r9 | 
|  | bf	L_epilogue | 
|  |  | 
|  | mov.l	@(24,r14),r1 | 
|  | bra	L_epilogue | 
|  | mov.l	r0,@r1 | 
|  |  | 
|  | L_epilogue: | 
|  | # Remove the space we pushed for the args | 
|  | mov   r14,r15 | 
|  |  | 
|  | lds.l  @r15+,pr | 
|  | mov.l  @r15+,r14 | 
|  | mov.l  @r15+,r12 | 
|  | mov.l  @r15+,r10 | 
|  | mov.l  @r15+,r9 | 
|  | rts | 
|  | mov.l  @r15+,r8 | 
|  | #else | 
|  | mov	r6,r8 | 
|  | mov	r7,r9 | 
|  |  | 
|  | sub	r6,r15 | 
|  | add	#-16,r15 | 
|  | mov	#~7,r0 | 
|  | and	r0,r15 | 
|  |  | 
|  | mov	r4,r0 | 
|  | jsr	@r0 | 
|  | mov	r15,r4 | 
|  |  | 
|  | mov	r9,r3 | 
|  | shlr8	r9 | 
|  | shlr8	r9 | 
|  | shlr8	r9 | 
|  |  | 
|  | mov	#FFI_TYPE_STRUCT,r2 | 
|  | cmp/eq	r2,r9 | 
|  | bf	1f | 
|  | #if STRUCT_VALUE_ADDRESS_WITH_ARG | 
|  | mov.l	@r15+,r4 | 
|  | bra	2f | 
|  | mov	#5,r2 | 
|  | #else | 
|  | mov.l	@r15+,r10 | 
|  | #endif | 
|  | 1: | 
|  | mov	#4,r2 | 
|  | 2: | 
|  |  | 
|  | L_pass: | 
|  | cmp/pl	r8 | 
|  | bf	L_call_it | 
|  |  | 
|  | mov	r3,r0 | 
|  | and	#3,r0 | 
|  |  | 
|  | L_pass_d: | 
|  | cmp/eq	#FFI_TYPE_DOUBLE,r0 | 
|  | bf	L_pass_i | 
|  |  | 
|  | mov	r15,r0 | 
|  | and	#7,r0 | 
|  | tst	r0,r0 | 
|  | bt	1f | 
|  | add	#4,r15 | 
|  | 1: | 
|  | mov	#8,r0 | 
|  | cmp/hs	r0,r2 | 
|  | bt/s	2f | 
|  | shlr2	r3 | 
|  | bsr	L_pop_d | 
|  | nop | 
|  | 2: | 
|  | add	#2,r2 | 
|  | bra	L_pass | 
|  | add	#-8,r8 | 
|  |  | 
|  | L_pop_d: | 
|  | mov	r2,r0 | 
|  | add	r0,r0 | 
|  | add	r2,r0 | 
|  | add	#-12,r0 | 
|  | add	r0,r0 | 
|  | braf	r0 | 
|  | nop | 
|  | mov.l	@r15+,r4 | 
|  | rts | 
|  | mov.l	@r15+,r5 | 
|  | mov.l	@r15+,r5 | 
|  | rts | 
|  | mov.l	@r15+,r6 | 
|  | mov.l	@r15+,r6 | 
|  | rts | 
|  | mov.l	@r15+,r7 | 
|  | rts | 
|  | mov.l	@r15+,r7 | 
|  |  | 
|  | L_pass_i: | 
|  | cmp/eq	#FFI_TYPE_INT,r0 | 
|  | bf	L_call_it | 
|  |  | 
|  | mov	#8,r0 | 
|  | cmp/hs	r0,r2 | 
|  | bt/s	2f | 
|  | shlr2	r3 | 
|  | bsr	L_pop_i | 
|  | nop | 
|  | 2: | 
|  | add	#1,r2 | 
|  | bra	L_pass | 
|  | add	#-4,r8 | 
|  |  | 
|  | L_pop_i: | 
|  | mov	r2,r0 | 
|  | shll2	r0 | 
|  | add	#-16,r0 | 
|  | braf	r0 | 
|  | nop | 
|  | rts | 
|  | mov.l	@r15+,r4 | 
|  | rts | 
|  | mov.l	@r15+,r5 | 
|  | rts | 
|  | mov.l	@r15+,r6 | 
|  | rts | 
|  | mov.l	@r15+,r7 | 
|  |  | 
|  | L_call_it: | 
|  | # call function | 
|  | #if (! STRUCT_VALUE_ADDRESS_WITH_ARG) | 
|  | mov	r10, r2 | 
|  | #endif | 
|  | mov.l  @(28,r14),r1 | 
|  | jsr    @r1 | 
|  | nop | 
|  |  | 
|  | L_ret_d: | 
|  | mov	#FFI_TYPE_DOUBLE,r2 | 
|  | cmp/eq	r2,r9 | 
|  | bf	L_ret_ll | 
|  |  | 
|  | mov.l	@(24,r14),r2 | 
|  | mov.l	r0,@r2 | 
|  | bra	L_epilogue | 
|  | mov.l	r1,@(4,r2) | 
|  |  | 
|  | L_ret_ll: | 
|  | mov	#FFI_TYPE_SINT64,r2 | 
|  | cmp/eq	r2,r9 | 
|  | bt/s	1f | 
|  | mov	#FFI_TYPE_UINT64,r2 | 
|  | cmp/eq	r2,r9 | 
|  | bf	L_ret_i | 
|  |  | 
|  | 1: | 
|  | mov.l	@(24,r14),r2 | 
|  | mov.l	r0,@r2 | 
|  | bra	L_epilogue | 
|  | mov.l	r1,@(4,r2) | 
|  |  | 
|  | L_ret_i: | 
|  | mov	#FFI_TYPE_FLOAT,r2 | 
|  | cmp/eq	r2,r9 | 
|  | bt	1f | 
|  | mov	#FFI_TYPE_INT,r2 | 
|  | cmp/eq	r2,r9 | 
|  | bf	L_epilogue | 
|  | 1: | 
|  | mov.l	@(24,r14),r1 | 
|  | bra	L_epilogue | 
|  | mov.l	r0,@r1 | 
|  |  | 
|  | L_epilogue: | 
|  | # Remove the space we pushed for the args | 
|  | mov   r14,r15 | 
|  |  | 
|  | lds.l  @r15+,pr | 
|  | mov.l  @r15+,r14 | 
|  | mov.l  @r15+,r12 | 
|  | mov.l  @r15+,r10 | 
|  | mov.l  @r15+,r9 | 
|  | rts | 
|  | mov.l  @r15+,r8 | 
|  | #endif | 
|  | .LFE1: | 
|  | .ffi_call_SYSV_end: | 
|  | .size    CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV) | 
|  |  | 
|  | .globl	ffi_closure_helper_SYSV | 
|  |  | 
|  | ENTRY(ffi_closure_SYSV) | 
|  | .LFB2: | 
|  | mov.l	r7,@-r15 | 
|  | .LCFI7: | 
|  | mov.l	r6,@-r15 | 
|  | .LCFI8: | 
|  | mov.l	r5,@-r15 | 
|  | .LCFI9: | 
|  | mov.l	r4,@-r15 | 
|  | .LCFIA: | 
|  | mov.l	r14,@-r15 | 
|  | .LCFIB: | 
|  | sts.l	pr,@-r15 | 
|  |  | 
|  | /* Stack layout: | 
|  | xx bytes (on stack parameters) | 
|  | 16 bytes (register parameters) | 
|  | 4 bytes (saved frame pointer) | 
|  | 4 bytes (saved return address) | 
|  | 32 bytes (floating register parameters, SH-4 only) | 
|  | 8 bytes (result) | 
|  | 4 bytes (pad) | 
|  | 4 bytes (5th arg) | 
|  | <- new stack pointer | 
|  | */ | 
|  | .LCFIC: | 
|  | #if defined(__SH4__) | 
|  | add	#-48,r15 | 
|  | #else | 
|  | add	#-16,r15 | 
|  | #endif | 
|  | .LCFID: | 
|  | mov	r15,r14 | 
|  | .LCFIE: | 
|  |  | 
|  | #if defined(__SH4__) | 
|  | mov	r14,r1 | 
|  | add	#48,r1 | 
|  | #ifdef __LITTLE_ENDIAN__ | 
|  | fmov.s	fr10,@-r1 | 
|  | fmov.s	fr11,@-r1 | 
|  | fmov.s	fr8,@-r1 | 
|  | fmov.s	fr9,@-r1 | 
|  | fmov.s	fr6,@-r1 | 
|  | fmov.s	fr7,@-r1 | 
|  | fmov.s	fr4,@-r1 | 
|  | fmov.s	fr5,@-r1 | 
|  | #else | 
|  | fmov.s	fr11,@-r1 | 
|  | fmov.s	fr10,@-r1 | 
|  | fmov.s	fr9,@-r1 | 
|  | fmov.s	fr8,@-r1 | 
|  | fmov.s	fr7,@-r1 | 
|  | fmov.s	fr6,@-r1 | 
|  | fmov.s	fr5,@-r1 | 
|  | fmov.s	fr4,@-r1 | 
|  | #endif | 
|  | mov	r1,r7 | 
|  | mov	r14,r6 | 
|  | add	#56,r6 | 
|  | #else | 
|  | mov	r14,r6 | 
|  | add	#24,r6 | 
|  | #endif | 
|  |  | 
|  | bt/s	10f | 
|  | mov	r2, r5 | 
|  | mov	r14,r1 | 
|  | add	#8,r1 | 
|  | mov	r1,r5 | 
|  | 10: | 
|  |  | 
|  | mov	r14,r1 | 
|  | #if defined(__SH4__) | 
|  | add	#72,r1 | 
|  | #else | 
|  | add	#40,r1 | 
|  | #endif | 
|  | mov.l	r1,@r14 | 
|  |  | 
|  | #ifdef PIC | 
|  | mov.l	L_got,r1 | 
|  | mova	L_got,r0 | 
|  | add	r0,r1 | 
|  | mov.l	L_helper,r0 | 
|  | add	r1,r0 | 
|  | #else | 
|  | mov.l	L_helper,r0 | 
|  | #endif | 
|  | jsr	@r0 | 
|  | mov	r3,r4 | 
|  |  | 
|  | shll	r0 | 
|  | mov	r0,r1 | 
|  | mova	L_table,r0 | 
|  | add	r1,r0 | 
|  | mov.w	@r0,r0 | 
|  | mov	r14,r2 | 
|  | braf	r0 | 
|  | add	#8,r2 | 
|  | 0: | 
|  | .align 2 | 
|  | #ifdef PIC | 
|  | L_got: | 
|  | .long	_GLOBAL_OFFSET_TABLE_ | 
|  | L_helper: | 
|  | .long	ffi_closure_helper_SYSV@GOTOFF | 
|  | #else | 
|  | L_helper: | 
|  | .long	ffi_closure_helper_SYSV | 
|  | #endif | 
|  | L_table: | 
|  | .short L_case_v - 0b	/* FFI_TYPE_VOID */ | 
|  | .short L_case_i - 0b	/* FFI_TYPE_INT */ | 
|  | #if defined(__SH4__) | 
|  | .short L_case_f - 0b	/* FFI_TYPE_FLOAT */ | 
|  | .short L_case_d - 0b	/* FFI_TYPE_DOUBLE */ | 
|  | .short L_case_d - 0b	/* FFI_TYPE_LONGDOUBLE */ | 
|  | #else | 
|  | .short L_case_i - 0b	/* FFI_TYPE_FLOAT */ | 
|  | .short L_case_ll - 0b	/* FFI_TYPE_DOUBLE */ | 
|  | .short L_case_ll - 0b	/* FFI_TYPE_LONGDOUBLE */ | 
|  | #endif | 
|  | .short L_case_uq - 0b	/* FFI_TYPE_UINT8 */ | 
|  | .short L_case_q - 0b	/* FFI_TYPE_SINT8 */ | 
|  | .short L_case_uh - 0b	/* FFI_TYPE_UINT16 */ | 
|  | .short L_case_h - 0b	/* FFI_TYPE_SINT16 */ | 
|  | .short L_case_i - 0b	/* FFI_TYPE_UINT32 */ | 
|  | .short L_case_i - 0b	/* FFI_TYPE_SINT32 */ | 
|  | .short L_case_ll - 0b	/* FFI_TYPE_UINT64 */ | 
|  | .short L_case_ll - 0b	/* FFI_TYPE_SINT64 */ | 
|  | .short L_case_v - 0b	/* FFI_TYPE_STRUCT */ | 
|  | .short L_case_i - 0b	/* FFI_TYPE_POINTER */ | 
|  |  | 
|  | #if defined(__SH4__) | 
|  | L_case_d: | 
|  | #ifdef __LITTLE_ENDIAN__ | 
|  | fmov.s	@r2+,fr1 | 
|  | bra	L_case_v | 
|  | fmov.s	@r2,fr0 | 
|  | #else | 
|  | fmov.s	@r2+,fr0 | 
|  | bra	L_case_v | 
|  | fmov.s	@r2,fr1 | 
|  | #endif | 
|  |  | 
|  | L_case_f: | 
|  | bra	L_case_v | 
|  | fmov.s	@r2,fr0 | 
|  | #endif | 
|  |  | 
|  | L_case_ll: | 
|  | mov.l	@r2+,r0 | 
|  | bra	L_case_v | 
|  | mov.l	@r2,r1 | 
|  |  | 
|  | L_case_i: | 
|  | bra	L_case_v | 
|  | mov.l	@r2,r0 | 
|  |  | 
|  | L_case_q: | 
|  | #ifdef __LITTLE_ENDIAN__ | 
|  | #else | 
|  | add	#3,r2 | 
|  | #endif | 
|  | bra	L_case_v | 
|  | mov.b	@r2,r0 | 
|  |  | 
|  | L_case_uq: | 
|  | #ifdef __LITTLE_ENDIAN__ | 
|  | #else | 
|  | add	#3,r2 | 
|  | #endif | 
|  | mov.b	@r2,r0 | 
|  | bra	L_case_v | 
|  | extu.b r0,r0 | 
|  |  | 
|  | L_case_h: | 
|  | #ifdef __LITTLE_ENDIAN__ | 
|  | #else | 
|  | add	#2,r2 | 
|  | #endif | 
|  | bra	L_case_v | 
|  | mov.w	@r2,r0 | 
|  |  | 
|  | L_case_uh: | 
|  | #ifdef __LITTLE_ENDIAN__ | 
|  | #else | 
|  | add	#2,r2 | 
|  | #endif | 
|  | mov.w	@r2,r0 | 
|  | extu.w	r0,r0 | 
|  | /* fall through */ | 
|  |  | 
|  | L_case_v: | 
|  | #if defined(__SH4__) | 
|  | add	#48,r15 | 
|  | #else | 
|  | add	#16,r15 | 
|  | #endif | 
|  | lds.l	@r15+,pr | 
|  | mov.l	@r15+,r14 | 
|  | rts | 
|  | add	#16,r15 | 
|  | .LFE2: | 
|  | .ffi_closure_SYSV_end: | 
|  | .size    CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV) | 
|  |  | 
|  | #if defined __ELF__ && defined __linux__ | 
|  | .section	.note.GNU-stack,"",@progbits | 
|  | #endif | 
|  |  | 
|  | .section	".eh_frame","aw",@progbits | 
|  | __FRAME_BEGIN__: | 
|  | .4byte	.LECIE1-.LSCIE1	/* Length of Common Information Entry */ | 
|  | .LSCIE1: | 
|  | .4byte	0x0	/* CIE Identifier Tag */ | 
|  | .byte	0x1	/* CIE Version */ | 
|  | #ifdef PIC | 
|  | .ascii "zR\0"	/* CIE Augmentation */ | 
|  | #else | 
|  | .byte	0x0	/* CIE Augmentation */ | 
|  | #endif | 
|  | .byte	0x1	/* uleb128 0x1; CIE Code Alignment Factor */ | 
|  | .byte	0x7c	/* sleb128 -4; CIE Data Alignment Factor */ | 
|  | .byte	0x11	/* CIE RA Column */ | 
|  | #ifdef PIC | 
|  | .uleb128 0x1	/* Augmentation size */ | 
|  | .byte	0x10	/* FDE Encoding (pcrel) */ | 
|  | #endif | 
|  | .byte	0xc	/* DW_CFA_def_cfa */ | 
|  | .byte	0xf	/* uleb128 0xf */ | 
|  | .byte	0x0	/* uleb128 0x0 */ | 
|  | .align	2 | 
|  | .LECIE1: | 
|  | .LSFDE1: | 
|  | .4byte	.LEFDE1-.LASFDE1	/* FDE Length */ | 
|  | .LASFDE1: | 
|  | .4byte	.LASFDE1-__FRAME_BEGIN__	/* FDE CIE offset */ | 
|  | #ifdef PIC | 
|  | .4byte	.LFB1-.	/* FDE initial location */ | 
|  | #else | 
|  | .4byte	.LFB1	/* FDE initial location */ | 
|  | #endif | 
|  | .4byte	.LFE1-.LFB1	 /* FDE address range */ | 
|  | #ifdef PIC | 
|  | .uleb128 0x0	/* Augmentation size */ | 
|  | #endif | 
|  | .byte	0x4	/* DW_CFA_advance_loc4 */ | 
|  | .4byte	.LCFI0-.LFB1 | 
|  | .byte	0xe	/* DW_CFA_def_cfa_offset */ | 
|  | .byte	0x4	/* uleb128 0x4 */ | 
|  | .byte	0x4	/* DW_CFA_advance_loc4 */ | 
|  | .4byte	.LCFI1-.LCFI0 | 
|  | .byte	0xe	/* DW_CFA_def_cfa_offset */ | 
|  | .byte	0x8	/* uleb128 0x4 */ | 
|  | .byte	0x4	/* DW_CFA_advance_loc4 */ | 
|  | .4byte	.LCFI2-.LCFI1 | 
|  | .byte	0xe	/* DW_CFA_def_cfa_offset */ | 
|  | .byte	0xc	/* uleb128 0x4 */ | 
|  | .byte	0x4	/* DW_CFA_advance_loc4 */ | 
|  | .4byte	.LCFI3-.LCFI2 | 
|  | .byte	0xe	/* DW_CFA_def_cfa_offset */ | 
|  | .byte	0x10	/* uleb128 0x4 */ | 
|  | .byte	0x4	/* DW_CFA_advance_loc4 */ | 
|  | .4byte	.LCFI4-.LCFI3 | 
|  | .byte	0xe	/* DW_CFA_def_cfa_offset */ | 
|  | .byte	0x14	/* uleb128 0x4 */ | 
|  | .byte	0x4	/* DW_CFA_advance_loc4 */ | 
|  | .4byte	.LCFI5-.LCFI4 | 
|  | .byte	0xe	/* DW_CFA_def_cfa_offset */ | 
|  | .byte	0x18	/* uleb128 0x4 */ | 
|  | .byte	0x91	/* DW_CFA_offset, column 0x11 */ | 
|  | .byte	0x6	/* uleb128 0x6 */ | 
|  | .byte	0x8e	/* DW_CFA_offset, column 0xe */ | 
|  | .byte	0x5	/* uleb128 0x5 */ | 
|  | .byte	0x8c	/* DW_CFA_offset, column 0xc */ | 
|  | .byte	0x4	/* uleb128 0x4 */ | 
|  | .byte	0x8a	/* DW_CFA_offset, column 0xa */ | 
|  | .byte	0x3	/* uleb128 0x3 */ | 
|  | .byte	0x89	/* DW_CFA_offset, column 0x9 */ | 
|  | .byte	0x2	/* uleb128 0x2 */ | 
|  | .byte	0x88	/* DW_CFA_offset, column 0x8 */ | 
|  | .byte	0x1	/* uleb128 0x1 */ | 
|  | .byte	0x4	/* DW_CFA_advance_loc4 */ | 
|  | .4byte	.LCFI6-.LCFI5 | 
|  | .byte	0xd	/* DW_CFA_def_cfa_register */ | 
|  | .byte	0xe	/* uleb128 0xe */ | 
|  | .align	2 | 
|  | .LEFDE1: | 
|  |  | 
|  | .LSFDE3: | 
|  | .4byte	.LEFDE3-.LASFDE3	/* FDE Length */ | 
|  | .LASFDE3: | 
|  | .4byte	.LASFDE3-__FRAME_BEGIN__	/* FDE CIE offset */ | 
|  | #ifdef PIC | 
|  | .4byte	.LFB2-.	/* FDE initial location */ | 
|  | #else | 
|  | .4byte	.LFB2	/* FDE initial location */ | 
|  | #endif | 
|  | .4byte	.LFE2-.LFB2	 /* FDE address range */ | 
|  | #ifdef PIC | 
|  | .uleb128 0x0	/* Augmentation size */ | 
|  | #endif | 
|  | .byte	0x4	/* DW_CFA_advance_loc4 */ | 
|  | .4byte	.LCFI7-.LFB2 | 
|  | .byte	0xe	/* DW_CFA_def_cfa_offset */ | 
|  | .byte	0x4	/* uleb128 0x4 */ | 
|  | .byte	0x4	/* DW_CFA_advance_loc4 */ | 
|  | .4byte	.LCFI8-.LCFI7 | 
|  | .byte	0xe	/* DW_CFA_def_cfa_offset */ | 
|  | .byte	0x8	/* uleb128 0x4 */ | 
|  | .byte	0x4	/* DW_CFA_advance_loc4 */ | 
|  | .4byte	.LCFI9-.LCFI8 | 
|  | .byte	0xe	/* DW_CFA_def_cfa_offset */ | 
|  | .byte	0xc	/* uleb128 0x4 */ | 
|  | .byte	0x4	/* DW_CFA_advance_loc4 */ | 
|  | .4byte	.LCFIA-.LCFI9 | 
|  | .byte	0xe	/* DW_CFA_def_cfa_offset */ | 
|  | .byte	0x10	/* uleb128 0x4 */ | 
|  | .byte	0x4	/* DW_CFA_advance_loc4 */ | 
|  | .4byte	.LCFIB-.LCFIA | 
|  | .byte	0xe	/* DW_CFA_def_cfa_offset */ | 
|  | .byte	0x14	/* uleb128 0x4 */ | 
|  | .byte	0x4	/* DW_CFA_advance_loc4 */ | 
|  | .4byte	.LCFIC-.LCFIB | 
|  | .byte	0xe	/* DW_CFA_def_cfa_offset */ | 
|  | .byte	0x18	/* uleb128 0x4 */ | 
|  | .byte	0x4	/* DW_CFA_advance_loc4 */ | 
|  | .4byte	.LCFID-.LCFIC | 
|  | .byte	0xe	/* DW_CFA_def_cfa_offset */ | 
|  | #if defined(__SH4__) | 
|  | .byte	24+48	/* uleb128 24+48 */ | 
|  | #else | 
|  | .byte	24+16	/* uleb128 24+16 */ | 
|  | #endif | 
|  | .byte	0x91	/* DW_CFA_offset, column 0x11 */ | 
|  | .byte	0x6	/* uleb128 0x6 */ | 
|  | .byte	0x8e	/* DW_CFA_offset, column 0xe */ | 
|  | .byte	0x5	/* uleb128 0x5 */ | 
|  | .byte	0x84	/* DW_CFA_offset, column 0x4 */ | 
|  | .byte	0x4	/* uleb128 0x4 */ | 
|  | .byte	0x85	/* DW_CFA_offset, column 0x5 */ | 
|  | .byte	0x3	/* uleb128 0x3 */ | 
|  | .byte	0x86	/* DW_CFA_offset, column 0x6 */ | 
|  | .byte	0x2	/* uleb128 0x2 */ | 
|  | .byte	0x87	/* DW_CFA_offset, column 0x7 */ | 
|  | .byte	0x1	/* uleb128 0x1 */ | 
|  | .byte	0x4	/* DW_CFA_advance_loc4 */ | 
|  | .4byte	.LCFIE-.LCFID | 
|  | .byte	0xd	/* DW_CFA_def_cfa_register */ | 
|  | .byte	0xe	/* uleb128 0xe */ | 
|  | .align	2 | 
|  | .LEFDE3: |