diff options
Diffstat (limited to 'Modules/_ctypes/libffi/src/mips/n32.S')
-rw-r--r-- | Modules/_ctypes/libffi/src/mips/n32.S | 576 |
1 files changed, 0 insertions, 576 deletions
diff --git a/Modules/_ctypes/libffi/src/mips/n32.S b/Modules/_ctypes/libffi/src/mips/n32.S deleted file mode 100644 index c6985d30a6..0000000000 --- a/Modules/_ctypes/libffi/src/mips/n32.S +++ /dev/null @@ -1,576 +0,0 @@ -/* ----------------------------------------------------------------------- - n32.S - Copyright (c) 1996, 1998, 2005, 2007, 2009, 2010 Red Hat, Inc. - - MIPS 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> - -/* Only build this code if we are compiling for n32 */ - -#if defined(FFI_MIPS_N32) - -#define callback a0 -#define bytes a2 -#define flags a3 -#define raddr a4 -#define fn a5 - -#define SIZEOF_FRAME ( 8 * FFI_SIZEOF_ARG ) - -#ifdef __GNUC__ - .abicalls -#endif - .set mips4 - .text - .align 2 - .globl ffi_call_N32 - .ent ffi_call_N32 -ffi_call_N32: -.LFB3: - .frame $fp, SIZEOF_FRAME, ra - .mask 0xc0000000,-FFI_SIZEOF_ARG - .fmask 0x00000000,0 - - # Prologue - SUBU $sp, SIZEOF_FRAME # Frame size -.LCFI0: - REG_S $fp, SIZEOF_FRAME - 2*FFI_SIZEOF_ARG($sp) # Save frame pointer - REG_S ra, SIZEOF_FRAME - 1*FFI_SIZEOF_ARG($sp) # Save return address -.LCFI1: - move $fp, $sp -.LCFI3: - move t9, callback # callback function pointer - REG_S bytes, 2*FFI_SIZEOF_ARG($fp) # bytes - REG_S flags, 3*FFI_SIZEOF_ARG($fp) # flags - REG_S raddr, 4*FFI_SIZEOF_ARG($fp) # raddr - REG_S fn, 5*FFI_SIZEOF_ARG($fp) # fn - - # Allocate at least 4 words in the argstack - move v0, bytes - bge bytes, 4 * FFI_SIZEOF_ARG, bigger - LI v0, 4 * FFI_SIZEOF_ARG - b sixteen - - bigger: - ADDU t4, v0, 2 * FFI_SIZEOF_ARG -1 # make sure it is aligned - and v0, t4, -2 * FFI_SIZEOF_ARG # to a proper boundry. - -sixteen: - SUBU $sp, $sp, v0 # move the stack pointer to reflect the - # arg space - - move a0, $sp # 4 * FFI_SIZEOF_ARG - ADDU a3, $fp, 3 * FFI_SIZEOF_ARG - - # Call ffi_prep_args - jal t9 - - # Copy the stack pointer to t9 - move t9, $sp - - # Fix the stack if there are more than 8 64bit slots worth - # of arguments. - - # Load the number of bytes - REG_L t6, 2*FFI_SIZEOF_ARG($fp) - - # Is it bigger than 8 * FFI_SIZEOF_ARG? - daddiu t8, t6, -(8 * FFI_SIZEOF_ARG) - bltz t8, loadregs - - ADDU t9, t9, t8 - -loadregs: - - REG_L t6, 3*FFI_SIZEOF_ARG($fp) # load the flags word into t6. - - and t4, t6, ((1<<FFI_FLAG_BITS)-1) - REG_L a0, 0*FFI_SIZEOF_ARG(t9) - beqz t4, arg1_next - bne t4, FFI_TYPE_FLOAT, arg1_doublep - l.s $f12, 0*FFI_SIZEOF_ARG(t9) - b arg1_next -arg1_doublep: - l.d $f12, 0*FFI_SIZEOF_ARG(t9) -arg1_next: - - SRL t4, t6, 1*FFI_FLAG_BITS - and t4, ((1<<FFI_FLAG_BITS)-1) - REG_L a1, 1*FFI_SIZEOF_ARG(t9) - beqz t4, arg2_next - bne t4, FFI_TYPE_FLOAT, arg2_doublep - l.s $f13, 1*FFI_SIZEOF_ARG(t9) - b arg2_next -arg2_doublep: - l.d $f13, 1*FFI_SIZEOF_ARG(t9) -arg2_next: - - SRL t4, t6, 2*FFI_FLAG_BITS - and t4, ((1<<FFI_FLAG_BITS)-1) - REG_L a2, 2*FFI_SIZEOF_ARG(t9) - beqz t4, arg3_next - bne t4, FFI_TYPE_FLOAT, arg3_doublep - l.s $f14, 2*FFI_SIZEOF_ARG(t9) - b arg3_next -arg3_doublep: - l.d $f14, 2*FFI_SIZEOF_ARG(t9) -arg3_next: - - SRL t4, t6, 3*FFI_FLAG_BITS - and t4, ((1<<FFI_FLAG_BITS)-1) - REG_L a3, 3*FFI_SIZEOF_ARG(t9) - beqz t4, arg4_next - bne t4, FFI_TYPE_FLOAT, arg4_doublep - l.s $f15, 3*FFI_SIZEOF_ARG(t9) - b arg4_next -arg4_doublep: - l.d $f15, 3*FFI_SIZEOF_ARG(t9) -arg4_next: - - SRL t4, t6, 4*FFI_FLAG_BITS - and t4, ((1<<FFI_FLAG_BITS)-1) - REG_L a4, 4*FFI_SIZEOF_ARG(t9) - beqz t4, arg5_next - bne t4, FFI_TYPE_FLOAT, arg5_doublep - l.s $f16, 4*FFI_SIZEOF_ARG(t9) - b arg5_next -arg5_doublep: - l.d $f16, 4*FFI_SIZEOF_ARG(t9) -arg5_next: - - SRL t4, t6, 5*FFI_FLAG_BITS - and t4, ((1<<FFI_FLAG_BITS)-1) - REG_L a5, 5*FFI_SIZEOF_ARG(t9) - beqz t4, arg6_next - bne t4, FFI_TYPE_FLOAT, arg6_doublep - l.s $f17, 5*FFI_SIZEOF_ARG(t9) - b arg6_next -arg6_doublep: - l.d $f17, 5*FFI_SIZEOF_ARG(t9) -arg6_next: - - SRL t4, t6, 6*FFI_FLAG_BITS - and t4, ((1<<FFI_FLAG_BITS)-1) - REG_L a6, 6*FFI_SIZEOF_ARG(t9) - beqz t4, arg7_next - bne t4, FFI_TYPE_FLOAT, arg7_doublep - l.s $f18, 6*FFI_SIZEOF_ARG(t9) - b arg7_next -arg7_doublep: - l.d $f18, 6*FFI_SIZEOF_ARG(t9) -arg7_next: - - SRL t4, t6, 7*FFI_FLAG_BITS - and t4, ((1<<FFI_FLAG_BITS)-1) - REG_L a7, 7*FFI_SIZEOF_ARG(t9) - beqz t4, arg8_next - bne t4, FFI_TYPE_FLOAT, arg8_doublep - l.s $f19, 7*FFI_SIZEOF_ARG(t9) - b arg8_next -arg8_doublep: - l.d $f19, 7*FFI_SIZEOF_ARG(t9) -arg8_next: - -callit: - # Load the function pointer - REG_L t9, 5*FFI_SIZEOF_ARG($fp) - - # If the return value pointer is NULL, assume no return value. - REG_L t5, 4*FFI_SIZEOF_ARG($fp) - beqz t5, noretval - - # Shift the return type flag over - SRL t6, 8*FFI_FLAG_BITS - - beq t6, FFI_TYPE_SINT32, retint - bne t6, FFI_TYPE_INT, retfloat -retint: - jal t9 - REG_L t4, 4*FFI_SIZEOF_ARG($fp) - REG_S v0, 0(t4) - b epilogue - -retfloat: - bne t6, FFI_TYPE_FLOAT, retdouble - jal t9 - REG_L t4, 4*FFI_SIZEOF_ARG($fp) - s.s $f0, 0(t4) - b epilogue - -retdouble: - bne t6, FFI_TYPE_DOUBLE, retstruct_d - jal t9 - REG_L t4, 4*FFI_SIZEOF_ARG($fp) - s.d $f0, 0(t4) - b epilogue - -retstruct_d: - bne t6, FFI_TYPE_STRUCT_D, retstruct_f - jal t9 - REG_L t4, 4*FFI_SIZEOF_ARG($fp) - s.d $f0, 0(t4) - b epilogue - -retstruct_f: - bne t6, FFI_TYPE_STRUCT_F, retstruct_d_d - jal t9 - REG_L t4, 4*FFI_SIZEOF_ARG($fp) - s.s $f0, 0(t4) - b epilogue - -retstruct_d_d: - bne t6, FFI_TYPE_STRUCT_DD, retstruct_f_f - jal t9 - REG_L t4, 4*FFI_SIZEOF_ARG($fp) - s.d $f0, 0(t4) - s.d $f2, 8(t4) - b epilogue - -retstruct_f_f: - bne t6, FFI_TYPE_STRUCT_FF, retstruct_d_f - jal t9 - REG_L t4, 4*FFI_SIZEOF_ARG($fp) - s.s $f0, 0(t4) - s.s $f2, 4(t4) - b epilogue - -retstruct_d_f: - bne t6, FFI_TYPE_STRUCT_DF, retstruct_f_d - jal t9 - REG_L t4, 4*FFI_SIZEOF_ARG($fp) - s.d $f0, 0(t4) - s.s $f2, 8(t4) - b epilogue - -retstruct_f_d: - bne t6, FFI_TYPE_STRUCT_FD, retstruct_d_soft - jal t9 - REG_L t4, 4*FFI_SIZEOF_ARG($fp) - s.s $f0, 0(t4) - s.d $f2, 8(t4) - b epilogue - -retstruct_d_soft: - bne t6, FFI_TYPE_STRUCT_D_SOFT, retstruct_f_soft - jal t9 - REG_L t4, 4*FFI_SIZEOF_ARG($fp) - sd v0, 0(t4) - b epilogue - -retstruct_f_soft: - bne t6, FFI_TYPE_STRUCT_F_SOFT, retstruct_d_d_soft - jal t9 - REG_L t4, 4*FFI_SIZEOF_ARG($fp) - sw v0, 0(t4) - b epilogue - -retstruct_d_d_soft: - bne t6, FFI_TYPE_STRUCT_DD_SOFT, retstruct_f_f_soft - jal t9 - REG_L t4, 4*FFI_SIZEOF_ARG($fp) - sd v0, 0(t4) - sd v1, 8(t4) - b epilogue - -retstruct_f_f_soft: - bne t6, FFI_TYPE_STRUCT_FF_SOFT, retstruct_d_f_soft - jal t9 - REG_L t4, 4*FFI_SIZEOF_ARG($fp) - sw v0, 0(t4) - sw v1, 4(t4) - b epilogue - -retstruct_d_f_soft: - bne t6, FFI_TYPE_STRUCT_DF_SOFT, retstruct_f_d_soft - jal t9 - REG_L t4, 4*FFI_SIZEOF_ARG($fp) - sd v0, 0(t4) - sw v1, 8(t4) - b epilogue - -retstruct_f_d_soft: - bne t6, FFI_TYPE_STRUCT_FD_SOFT, retstruct_small - jal t9 - REG_L t4, 4*FFI_SIZEOF_ARG($fp) - sw v0, 0(t4) - sd v1, 8(t4) - b epilogue - -retstruct_small: - bne t6, FFI_TYPE_STRUCT_SMALL, retstruct_small2 - jal t9 - REG_L t4, 4*FFI_SIZEOF_ARG($fp) - REG_S v0, 0(t4) - b epilogue - -retstruct_small2: - bne t6, FFI_TYPE_STRUCT_SMALL2, retstruct - jal t9 - REG_L t4, 4*FFI_SIZEOF_ARG($fp) - REG_S v0, 0(t4) - REG_S v1, 8(t4) - b epilogue - -retstruct: -noretval: - jal t9 - - # Epilogue -epilogue: - move $sp, $fp - REG_L $fp, SIZEOF_FRAME - 2*FFI_SIZEOF_ARG($sp) # Restore frame pointer - REG_L ra, SIZEOF_FRAME - 1*FFI_SIZEOF_ARG($sp) # Restore return address - ADDU $sp, SIZEOF_FRAME # Fix stack pointer - j ra - -.LFE3: - .end ffi_call_N32 - -/* ffi_closure_N32. Expects address of the passed-in ffi_closure in t0 - ($12). Stores any arguments passed in registers onto the stack, - then calls ffi_closure_mips_inner_N32, which then decodes - them. - - Stack layout: - - 20 - Start of parameters, original sp - 19 - Called function a7 save - 18 - Called function a6 save - 17 - Called function a5 save - 16 - Called function a4 save - 15 - Called function a3 save - 14 - Called function a2 save - 13 - Called function a1 save - 12 - Called function a0 save - 11 - Called function f19 - 10 - Called function f18 - 9 - Called function f17 - 8 - Called function f16 - 7 - Called function f15 - 6 - Called function f14 - 5 - Called function f13 - 4 - Called function f12 - 3 - return value high (v1 or $f2) - 2 - return value low (v0 or $f0) - 1 - ra save - 0 - gp save our sp points here - */ - -#define SIZEOF_FRAME2 (20 * FFI_SIZEOF_ARG) - -#define A7_OFF2 (19 * FFI_SIZEOF_ARG) -#define A6_OFF2 (18 * FFI_SIZEOF_ARG) -#define A5_OFF2 (17 * FFI_SIZEOF_ARG) -#define A4_OFF2 (16 * FFI_SIZEOF_ARG) -#define A3_OFF2 (15 * FFI_SIZEOF_ARG) -#define A2_OFF2 (14 * FFI_SIZEOF_ARG) -#define A1_OFF2 (13 * FFI_SIZEOF_ARG) -#define A0_OFF2 (12 * FFI_SIZEOF_ARG) - -#define F19_OFF2 (11 * FFI_SIZEOF_ARG) -#define F18_OFF2 (10 * FFI_SIZEOF_ARG) -#define F17_OFF2 (9 * FFI_SIZEOF_ARG) -#define F16_OFF2 (8 * FFI_SIZEOF_ARG) -#define F15_OFF2 (7 * FFI_SIZEOF_ARG) -#define F14_OFF2 (6 * FFI_SIZEOF_ARG) -#define F13_OFF2 (5 * FFI_SIZEOF_ARG) -#define F12_OFF2 (4 * FFI_SIZEOF_ARG) - -#define V1_OFF2 (3 * FFI_SIZEOF_ARG) -#define V0_OFF2 (2 * FFI_SIZEOF_ARG) - -#define RA_OFF2 (1 * FFI_SIZEOF_ARG) -#define GP_OFF2 (0 * FFI_SIZEOF_ARG) - - .align 2 - .globl ffi_closure_N32 - .ent ffi_closure_N32 -ffi_closure_N32: -.LFB2: - .frame $sp, SIZEOF_FRAME2, ra - .mask 0x90000000,-(SIZEOF_FRAME2 - RA_OFF2) - .fmask 0x00000000,0 - SUBU $sp, SIZEOF_FRAME2 -.LCFI5: - .cpsetup t9, GP_OFF2, ffi_closure_N32 - REG_S ra, RA_OFF2($sp) # Save return address -.LCFI6: - # Store all possible argument registers. If there are more than - # fit in registers, then they were stored on the stack. - REG_S a0, A0_OFF2($sp) - REG_S a1, A1_OFF2($sp) - REG_S a2, A2_OFF2($sp) - REG_S a3, A3_OFF2($sp) - REG_S a4, A4_OFF2($sp) - REG_S a5, A5_OFF2($sp) - REG_S a6, A6_OFF2($sp) - REG_S a7, A7_OFF2($sp) - - # Store all possible float/double registers. - s.d $f12, F12_OFF2($sp) - s.d $f13, F13_OFF2($sp) - s.d $f14, F14_OFF2($sp) - s.d $f15, F15_OFF2($sp) - s.d $f16, F16_OFF2($sp) - s.d $f17, F17_OFF2($sp) - s.d $f18, F18_OFF2($sp) - s.d $f19, F19_OFF2($sp) - - # Call ffi_closure_mips_inner_N32 to do the real work. - LA t9, ffi_closure_mips_inner_N32 - move a0, $12 # Pointer to the ffi_closure - ADDU a1, $sp, V0_OFF2 - ADDU a2, $sp, A0_OFF2 - ADDU a3, $sp, F12_OFF2 - jalr t9 - - # Return flags are in v0 - bne v0, FFI_TYPE_SINT32, cls_retint - lw v0, V0_OFF2($sp) - b cls_epilogue - -cls_retint: - bne v0, FFI_TYPE_INT, cls_retfloat - REG_L v0, V0_OFF2($sp) - b cls_epilogue - -cls_retfloat: - bne v0, FFI_TYPE_FLOAT, cls_retdouble - l.s $f0, V0_OFF2($sp) - b cls_epilogue - -cls_retdouble: - bne v0, FFI_TYPE_DOUBLE, cls_retstruct_d - l.d $f0, V0_OFF2($sp) - b cls_epilogue - -cls_retstruct_d: - bne v0, FFI_TYPE_STRUCT_D, cls_retstruct_f - l.d $f0, V0_OFF2($sp) - b cls_epilogue - -cls_retstruct_f: - bne v0, FFI_TYPE_STRUCT_F, cls_retstruct_d_d - l.s $f0, V0_OFF2($sp) - b cls_epilogue - -cls_retstruct_d_d: - bne v0, FFI_TYPE_STRUCT_DD, cls_retstruct_f_f - l.d $f0, V0_OFF2($sp) - l.d $f2, V1_OFF2($sp) - b cls_epilogue - -cls_retstruct_f_f: - bne v0, FFI_TYPE_STRUCT_FF, cls_retstruct_d_f - l.s $f0, V0_OFF2($sp) - l.s $f2, V1_OFF2($sp) - b cls_epilogue - -cls_retstruct_d_f: - bne v0, FFI_TYPE_STRUCT_DF, cls_retstruct_f_d - l.d $f0, V0_OFF2($sp) - l.s $f2, V1_OFF2($sp) - b cls_epilogue - -cls_retstruct_f_d: - bne v0, FFI_TYPE_STRUCT_FD, cls_retstruct_small2 - l.s $f0, V0_OFF2($sp) - l.d $f2, V1_OFF2($sp) - b cls_epilogue - -cls_retstruct_small2: - REG_L v0, V0_OFF2($sp) - REG_L v1, V1_OFF2($sp) - - # Epilogue -cls_epilogue: - REG_L ra, RA_OFF2($sp) # Restore return address - .cpreturn - ADDU $sp, SIZEOF_FRAME2 - j ra -.LFE2: - .end ffi_closure_N32 - -#ifdef __GNUC__ - .section .eh_frame,"aw",@progbits -.Lframe1: - .4byte .LECIE1-.LSCIE1 # length -.LSCIE1: - .4byte 0x0 # CIE - .byte 0x1 # Version 1 - .ascii "\000" # Augmentation - .uleb128 0x1 # Code alignment 1 - .sleb128 -4 # Data alignment -4 - .byte 0x1f # Return Address $31 - .byte 0xc # DW_CFA_def_cfa - .uleb128 0x1d # in $sp - .uleb128 0x0 # offset 0 - .align EH_FRAME_ALIGN -.LECIE1: - -.LSFDE1: - .4byte .LEFDE1-.LASFDE1 # length. -.LASFDE1: - .4byte .LASFDE1-.Lframe1 # CIE_pointer. - FDE_ADDR_BYTES .LFB3 # initial_location. - FDE_ADDR_BYTES .LFE3-.LFB3 # address_range. - .byte 0x4 # DW_CFA_advance_loc4 - .4byte .LCFI0-.LFB3 # to .LCFI0 - .byte 0xe # DW_CFA_def_cfa_offset - .uleb128 SIZEOF_FRAME # adjust stack.by SIZEOF_FRAME - .byte 0x4 # DW_CFA_advance_loc4 - .4byte .LCFI1-.LCFI0 # to .LCFI1 - .byte 0x9e # DW_CFA_offset of $fp - .uleb128 2*FFI_SIZEOF_ARG/4 # - .byte 0x9f # DW_CFA_offset of ra - .uleb128 1*FFI_SIZEOF_ARG/4 # - .byte 0x4 # DW_CFA_advance_loc4 - .4byte .LCFI3-.LCFI1 # to .LCFI3 - .byte 0xd # DW_CFA_def_cfa_register - .uleb128 0x1e # in $fp - .align EH_FRAME_ALIGN -.LEFDE1: -.LSFDE3: - .4byte .LEFDE3-.LASFDE3 # length -.LASFDE3: - .4byte .LASFDE3-.Lframe1 # CIE_pointer. - FDE_ADDR_BYTES .LFB2 # initial_location. - FDE_ADDR_BYTES .LFE2-.LFB2 # address_range. - .byte 0x4 # DW_CFA_advance_loc4 - .4byte .LCFI5-.LFB2 # to .LCFI5 - .byte 0xe # DW_CFA_def_cfa_offset - .uleb128 SIZEOF_FRAME2 # adjust stack.by SIZEOF_FRAME - .byte 0x4 # DW_CFA_advance_loc4 - .4byte .LCFI6-.LCFI5 # to .LCFI6 - .byte 0x9c # DW_CFA_offset of $gp ($28) - .uleb128 (SIZEOF_FRAME2 - GP_OFF2)/4 - .byte 0x9f # DW_CFA_offset of ra ($31) - .uleb128 (SIZEOF_FRAME2 - RA_OFF2)/4 - .align EH_FRAME_ALIGN -.LEFDE3: -#endif /* __GNUC__ */ - -#endif |