URL
https://opencores.org/ocsvn/openrisc/openrisc/trunk
Subversion Repositories openrisc
[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libffi/] [src/] [sh64/] [sysv.S] - Rev 732
Compare with Previous | Blame | View Log
/* -----------------------------------------------------------------------sysv.S - Copyright (c) 2003, 2004, 2006, 2008 Kaz KojimaSuperH SHmedia Foreign Function InterfacePermission is hereby granted, free of charge, to any person obtaininga copy of this software and associated documentation files (the``Software''), to deal in the Software without restriction, includingwithout limitation the rights to use, copy, modify, merge, publish,distribute, sublicense, and/or sell copies of the Software, and topermit persons to whom the Software is furnished to do so, subject tothe following conditions:The above copyright notice and this permission notice shall be includedin 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 OFMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE ANDNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHTHOLDERS 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 OTHERDEALINGS 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#ifdef __LITTLE_ENDIAN__#define OFS_FLT 0#else#define OFS_FLT 4#endif.section .text..SHmedia32,"ax"# r2: ffi_prep_args# r3: &ecif# r4: bytes# r5: flags# r6: flags2# r7: rvalue# r8: fn# This assumes we are using gas..align 5ENTRY(ffi_call_SYSV)# Save registers.LFB1:addi.l r15, -48, r15.LCFI0:st.q r15, 40, r32st.q r15, 32, r31st.q r15, 24, r30st.q r15, 16, r29st.q r15, 8, r28st.l r15, 4, r18st.l r15, 0, r14.LCFI1:add.l r15, r63, r14.LCFI2:# add r4, r63, r28add r5, r63, r29add r6, r63, r30add r7, r63, r31add r8, r63, r32addi r4, (64 + 7), r4andi r4, ~7, r4sub.l r15, r4, r15ptabs/l r2, tr0add r15, r63, r2blink tr0, r18addi r15, 64, r22movi 0, r0movi 0, r1movi -1, r23pt/l 1f, tr1bnei/l r29, FFI_TYPE_STRUCT, tr1ld.l r15, 0, r19addi r15, 8, r15addi r0, 1, r01:.L_pass:andi r30, 3, r20shlri r30, 2, r30pt/l .L_call_it, tr0pt/l .L_pass_i, tr1pt/l .L_pass_f, tr2beqi/l r20, FFI_TYPE_VOID, tr0beqi/l r20, FFI_TYPE_INT, tr1beqi/l r20, FFI_TYPE_FLOAT, tr2.L_pass_d:addi r0, 1, r0pt/l 3f, tr0movi 12, r20bge/l r1, r20, tr0pt/l .L_pop_d, tr1pt/l 2f, tr0blink tr1, r632:addi.l r15, 8, r153:pt/l .L_pass, tr0addi r1, 2, r1blink tr0, r63.L_pop_d:pt/l .L_pop_d_tbl, tr1gettr tr1, r20shlli r1, 2, r21add r20, r21, r20ptabs/l r20, tr1blink tr1, r63.L_pop_d_tbl:fld.d r15, 0, dr0blink tr0, r63fld.d r15, 0, dr2blink tr0, r63fld.d r15, 0, dr4blink tr0, r63fld.d r15, 0, dr6blink tr0, r63fld.d r15, 0, dr8blink tr0, r63fld.d r15, 0, dr10blink tr0, r63.L_pass_f:addi r0, 1, r0pt/l 3f, tr0movi 12, r20bge/l r1, r20, tr0pt/l .L_pop_f, tr1pt/l 2f, tr0blink tr1, r632:addi.l r15, 8, r153:pt/l .L_pass, tr0blink tr0, r63.L_pop_f:pt/l .L_pop_f_tbl, tr1pt/l 5f, tr2gettr tr1, r20bge/l r23, r63, tr2add r1, r63, r23shlli r1, 3, r21addi r1, 2, r1add r20, r21, r20ptabs/l r20, tr1blink tr1, r635:addi r23, 1, r21movi -1, r23shlli r21, 3, r21add r20, r21, r20ptabs/l r20, tr1blink tr1, r63.L_pop_f_tbl:fld.s r15, OFS_FLT, fr0blink tr0, r63fld.s r15, OFS_FLT, fr1blink tr0, r63fld.s r15, OFS_FLT, fr2blink tr0, r63fld.s r15, OFS_FLT, fr3blink tr0, r63fld.s r15, OFS_FLT, fr4blink tr0, r63fld.s r15, OFS_FLT, fr5blink tr0, r63fld.s r15, OFS_FLT, fr6blink tr0, r63fld.s r15, OFS_FLT, fr7blink tr0, r63fld.s r15, OFS_FLT, fr8blink tr0, r63fld.s r15, OFS_FLT, fr9blink tr0, r63fld.s r15, OFS_FLT, fr10blink tr0, r63fld.s r15, OFS_FLT, fr11blink tr0, r63.L_pass_i:pt/l 3f, tr0movi 8, r20bge/l r0, r20, tr0pt/l .L_pop_i, tr1pt/l 2f, tr0blink tr1, r632:addi.l r15, 8, r153:pt/l .L_pass, tr0addi r0, 1, r0blink tr0, r63.L_pop_i:pt/l .L_pop_i_tbl, tr1gettr tr1, r20shlli r0, 3, r21add r20, r21, r20ptabs/l r20, tr1blink tr1, r63.L_pop_i_tbl:ld.q r15, 0, r2blink tr0, r63ld.q r15, 0, r3blink tr0, r63ld.q r15, 0, r4blink tr0, r63ld.q r15, 0, r5blink tr0, r63ld.q r15, 0, r6blink tr0, r63ld.q r15, 0, r7blink tr0, r63ld.q r15, 0, r8blink tr0, r63ld.q r15, 0, r9blink tr0, r63.L_call_it:# call functionpt/l 1f, tr1bnei/l r29, FFI_TYPE_STRUCT, tr1add r19, r63, r21:add r22, r63, r15ptabs/l r32, tr0blink tr0, r18pt/l .L_ret_i, tr0pt/l .L_ret_ll, tr1pt/l .L_ret_d, tr2pt/l .L_ret_f, tr3pt/l .L_epilogue, tr4beqi/l r29, FFI_TYPE_INT, tr0beqi/l r29, FFI_TYPE_UINT32, tr0beqi/l r29, FFI_TYPE_SINT64, tr1beqi/l r29, FFI_TYPE_UINT64, tr1beqi/l r29, FFI_TYPE_DOUBLE, tr2beqi/l r29, FFI_TYPE_FLOAT, tr3pt/l .L_ret_q, tr0pt/l .L_ret_h, tr1beqi/l r29, FFI_TYPE_UINT8, tr0beqi/l r29, FFI_TYPE_UINT16, tr1blink tr4, r63.L_ret_d:fst.d r31, 0, dr0blink tr4, r63.L_ret_ll:st.q r31, 0, r2blink tr4, r63.L_ret_f:fst.s r31, OFS_FLT, fr0blink tr4, r63.L_ret_q:st.b r31, 0, r2blink tr4, r63.L_ret_h:st.w r31, 0, r2blink tr4, r63.L_ret_i:st.l r31, 0, r2# Fall.L_epilogue:# Remove the space we pushed for the argsadd r14, r63, r15ld.l r15, 0, r14ld.l r15, 4, r18ld.q r15, 8, r28ld.q r15, 16, r29ld.q r15, 24, r30ld.q r15, 32, r31ld.q r15, 40, r32addi.l r15, 48, r15ptabs r18, tr0blink tr0, r63.LFE1:.ffi_call_SYSV_end:.size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV).align 5ENTRY(ffi_closure_SYSV).LFB2:addi.l r15, -136, r15.LCFI3:st.l r15, 12, r18st.l r15, 8, r14st.l r15, 4, r12.LCFI4:add r15, r63, r14.LCFI5:/* Stack layout:...64 bytes (register parameters)48 bytes (floating register parameters)8 bytes (result)4 bytes (r18)4 bytes (r14)4 bytes (r12)4 bytes (for align)<- new stack pointer*/fst.d r14, 24, dr0fst.d r14, 32, dr2fst.d r14, 40, dr4fst.d r14, 48, dr6fst.d r14, 56, dr8fst.d r14, 64, dr10st.q r14, 72, r2st.q r14, 80, r3st.q r14, 88, r4st.q r14, 96, r5st.q r14, 104, r6st.q r14, 112, r7st.q r14, 120, r8st.q r14, 128, r9add r1, r63, r2addi r14, 16, r3addi r14, 72, r4addi r14, 24, r5addi r14, 136, r6#ifdef PICmovi (((datalabel _GLOBAL_OFFSET_TABLE_-(.LPCS0-.)) >> 16) & 65535), r12shori ((datalabel _GLOBAL_OFFSET_TABLE_-(.LPCS0-.)) & 65535), r12.LPCS0: ptrel/u r12, tr0movi ((ffi_closure_helper_SYSV@GOTPLT) & 65535), r1gettr tr0, r12ldx.l r1, r12, r1ptabs r1, tr0#elsept/l ffi_closure_helper_SYSV, tr0#endifblink tr0, r18shlli r2, 1, r1movi (((datalabel .L_table) >> 16) & 65535), r2shori ((datalabel .L_table) & 65535), r2ldx.w r2, r1, r1add r1, r2, r1pt/l .L_case_v, tr1ptabs r1, tr0blink tr0, r63.align 2.L_table:.word .L_case_v - datalabel .L_table /* FFI_TYPE_VOID */.word .L_case_i - datalabel .L_table /* FFI_TYPE_INT */.word .L_case_f - datalabel .L_table /* FFI_TYPE_FLOAT */.word .L_case_d - datalabel .L_table /* FFI_TYPE_DOUBLE */.word .L_case_d - datalabel .L_table /* FFI_TYPE_LONGDOUBLE */.word .L_case_uq - datalabel .L_table /* FFI_TYPE_UINT8 */.word .L_case_q - datalabel .L_table /* FFI_TYPE_SINT8 */.word .L_case_uh - datalabel .L_table /* FFI_TYPE_UINT16 */.word .L_case_h - datalabel .L_table /* FFI_TYPE_SINT16 */.word .L_case_i - datalabel .L_table /* FFI_TYPE_UINT32 */.word .L_case_i - datalabel .L_table /* FFI_TYPE_SINT32 */.word .L_case_ll - datalabel .L_table /* FFI_TYPE_UINT64 */.word .L_case_ll - datalabel .L_table /* FFI_TYPE_SINT64 */.word .L_case_v - datalabel .L_table /* FFI_TYPE_STRUCT */.word .L_case_i - datalabel .L_table /* FFI_TYPE_POINTER */.align 2.L_case_d:fld.d r14, 16, dr0blink tr1, r63.L_case_f:fld.s r14, 16, fr0blink tr1, r63.L_case_ll:ld.q r14, 16, r2blink tr1, r63.L_case_i:ld.l r14, 16, r2blink tr1, r63.L_case_q:ld.b r14, 16, r2blink tr1, r63.L_case_uq:ld.ub r14, 16, r2blink tr1, r63.L_case_h:ld.w r14, 16, r2blink tr1, r63.L_case_uh:ld.uw r14, 16, r2blink tr1, r63.L_case_v:add.l r14, r63, r15ld.l r15, 4, r12ld.l r15, 8, r14ld.l r15, 12, r18addi.l r15, 136, r15ptabs r18, tr0blink tr0, r63.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.uleb128 0x1 /* CIE Code Alignment Factor */.sleb128 -4 /* CIE Data Alignment Factor */.byte 0x12 /* CIE RA Column */#ifdef PIC.uleb128 0x1 /* Augmentation size */.byte 0x10 /* FDE Encoding (pcrel) */#endif.byte 0xc /* DW_CFA_def_cfa */.uleb128 0xf.uleb128 0x0.align 2.LECIE1:.LSFDE1:.4byte datalabel .LEFDE1-datalabel .LASFDE1 /* FDE Length */.LASFDE1:.4byte datalabel .LASFDE1-datalabel __FRAME_BEGIN__#ifdef PIC.4byte .LFB1-. /* FDE initial location */#else.4byte .LFB1 /* FDE initial location */#endif.4byte datalabel .LFE1-datalabel .LFB1 /* FDE address range */#ifdef PIC.uleb128 0x0 /* Augmentation size */#endif.byte 0x4 /* DW_CFA_advance_loc4 */.4byte datalabel .LCFI0-datalabel .LFB1.byte 0xe /* DW_CFA_def_cfa_offset */.uleb128 0x30.byte 0x4 /* DW_CFA_advance_loc4 */.4byte datalabel .LCFI1-datalabel .LCFI0.byte 0x8e /* DW_CFA_offset, column 0xe */.uleb128 0xc.byte 0x92 /* DW_CFA_offset, column 0x12 */.uleb128 0xb.byte 0x9c /* DW_CFA_offset, column 0x1c */.uleb128 0xa.byte 0x9d /* DW_CFA_offset, column 0x1d */.uleb128 0x8.byte 0x9e /* DW_CFA_offset, column 0x1e */.uleb128 0x6.byte 0x9f /* DW_CFA_offset, column 0x1f */.uleb128 0x4.byte 0xa0 /* DW_CFA_offset, column 0x20 */.uleb128 0x2.byte 0x4 /* DW_CFA_advance_loc4 */.4byte datalabel .LCFI2-datalabel .LCFI1.byte 0xd /* DW_CFA_def_cfa_register */.uleb128 0xe.align 2.LEFDE1:.LSFDE3:.4byte datalabel .LEFDE3-datalabel .LASFDE3 /* FDE Length */.LASFDE3:.4byte datalabel .LASFDE3-datalabel __FRAME_BEGIN__#ifdef PIC.4byte .LFB2-. /* FDE initial location */#else.4byte .LFB2 /* FDE initial location */#endif.4byte datalabel .LFE2-datalabel .LFB2 /* FDE address range */#ifdef PIC.uleb128 0x0 /* Augmentation size */#endif.byte 0x4 /* DW_CFA_advance_loc4 */.4byte datalabel .LCFI3-datalabel .LFB2.byte 0xe /* DW_CFA_def_cfa_offset */.uleb128 0x88.byte 0x4 /* DW_CFA_advance_loc4 */.4byte datalabel .LCFI4-datalabel .LCFI3.byte 0x8c /* DW_CFA_offset, column 0xc */.uleb128 0x21.byte 0x8e /* DW_CFA_offset, column 0xe */.uleb128 0x20.byte 0x92 /* DW_CFA_offset, column 0x12 */.uleb128 0x1f.byte 0x4 /* DW_CFA_advance_loc4 */.4byte datalabel .LCFI5-datalabel .LCFI4.byte 0xd /* DW_CFA_def_cfa_register */.uleb128 0xe.align 2.LEFDE3:
