4 .file "linux64_closure.S"
7 .hidden ffi_closure_LINUX64, .ffi_closure_LINUX64
8 .globl ffi_closure_LINUX64, .ffi_closure_LINUX64
12 .quad .ffi_closure_LINUX64,.TOC.@tocbase,0
13 .size ffi_closure_LINUX64,24
14 .type .ffi_closure_LINUX64,@function
18 # save general regs into parm save area
31 # mandatory 48 bytes special reg save area + 64 bytes parm save area
32 # + 8 bytes retval area + 13*8 bytes fpr save area
36 # next save fpr 1 to fpr 13
37 stfd %f1, 120+(0*8)(%r1)
38 stfd %f2, 120+(1*8)(%r1)
39 stfd %f3, 120+(2*8)(%r1)
40 stfd %f4, 120+(3*8)(%r1)
41 stfd %f5, 120+(4*8)(%r1)
42 stfd %f6, 120+(5*8)(%r1)
43 stfd %f7, 120+(6*8)(%r1)
44 stfd %f8, 120+(7*8)(%r1)
45 stfd %f9, 120+(8*8)(%r1)
46 stfd %f10, 120+(9*8)(%r1)
47 stfd %f11, 120+(10*8)(%r1)
48 stfd %f12, 120+(11*8)(%r1)
49 stfd %f13, 120+(12*8)(%r1)
51 # set up registers for the routine that actually does the work
52 # get the context pointer from the trampoline
55 # now load up the pointer to the result storage
58 # now load up the pointer to the parameter save area
59 # in the previous frame
60 addi %r5, %r1, 224 + 48
62 # now load up the pointer to the saved fpr registers */
66 bl .ffi_closure_helper_LINUX64
68 # now r3 contains the return type
69 # so use it to look up in a table
70 # so we know how to deal with each type
72 # look up the proper starting point in table
73 # by using return type as offset
74 addi %r5, %r1, 112 # get pointer to results area
75 bl .Lget_ret_type0_addr # get pointer to .Lret_type0 into LR
77 sldi %r3, %r3, 4 # now multiply return type by 16
78 add %r3, %r3, %r4 # add contents of table to table address
82 # Each of the ret_typeX code fragments has to be exactly 16 bytes long
83 # (4 instructions). For cache effectiveness we align to a 16 byte boundary
104 # case FFI_TYPE_FLOAT
109 # case FFI_TYPE_DOUBLE
114 # case FFI_TYPE_LONGDOUBLE
119 # case FFI_TYPE_UINT8
124 # case FFI_TYPE_SINT8
129 # case FFI_TYPE_UINT16
134 # case FFI_TYPE_SINT16
139 # case FFI_TYPE_UINT32
144 # case FFI_TYPE_SINT32
149 # case FFI_TYPE_UINT64
154 # case FFI_TYPE_SINT64
159 # case FFI_TYPE_STRUCT
164 # case FFI_TYPE_POINTER
177 .byte 0,12,0,1,128,0,0,0
178 .size .ffi_closure_LINUX64,.-.ffi_closure_LINUX64
180 .section .eh_frame,EH_FRAME_FLAGS,@progbits
182 .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry
184 .4byte 0x0 # CIE Identifier Tag
185 .byte 0x1 # CIE Version
186 .ascii "zR\0" # CIE Augmentation
187 .uleb128 0x1 # CIE Code Alignment Factor
188 .sleb128 -8 # CIE Data Alignment Factor
189 .byte 0x41 # CIE RA Column
190 .uleb128 0x1 # Augmentation size
191 .byte 0x14 # FDE Encoding (pcrel udata8)
192 .byte 0xc # DW_CFA_def_cfa
198 .4byte .LEFDE1-.LASFDE1 # FDE Length
200 .4byte .LASFDE1-.Lframe1 # FDE CIE offset
201 .8byte .LFB1-. # FDE initial location
202 .8byte .LFE1-.LFB1 # FDE address range
203 .uleb128 0x0 # Augmentation size
204 .byte 0x2 # DW_CFA_advance_loc1
206 .byte 0xe # DW_CFA_def_cfa_offset
208 .byte 0x11 # DW_CFA_offset_extended_sf