5 .file "linux64_closure.S"
8 FFI_HIDDEN (ffi_closure_LINUX64)
9 FFI_HIDDEN (.ffi_closure_LINUX64)
10 .globl ffi_closure_LINUX64, .ffi_closure_LINUX64
14 .quad .ffi_closure_LINUX64,.TOC.@tocbase,0
15 .size ffi_closure_LINUX64,24
16 .type .ffi_closure_LINUX64,@function
20 # save general regs into parm save area
33 # mandatory 48 bytes special reg save area + 64 bytes parm save area
34 # + 16 bytes retval area + 13*8 bytes fpr save area + round to 16
38 # next save fpr 1 to fpr 13
39 stfd %f1, 128+(0*8)(%r1)
40 stfd %f2, 128+(1*8)(%r1)
41 stfd %f3, 128+(2*8)(%r1)
42 stfd %f4, 128+(3*8)(%r1)
43 stfd %f5, 128+(4*8)(%r1)
44 stfd %f6, 128+(5*8)(%r1)
45 stfd %f7, 128+(6*8)(%r1)
46 stfd %f8, 128+(7*8)(%r1)
47 stfd %f9, 128+(8*8)(%r1)
48 stfd %f10, 128+(9*8)(%r1)
49 stfd %f11, 128+(10*8)(%r1)
50 stfd %f12, 128+(11*8)(%r1)
51 stfd %f13, 128+(12*8)(%r1)
53 # set up registers for the routine that actually does the work
54 # get the context pointer from the trampoline
57 # now load up the pointer to the result storage
60 # now load up the pointer to the parameter save area
61 # in the previous frame
62 addi %r5, %r1, 240 + 48
64 # now load up the pointer to the saved fpr registers */
68 bl .ffi_closure_helper_LINUX64
71 # now r3 contains the return type
72 # so use it to look up in a table
73 # so we know how to deal with each type
75 # look up the proper starting point in table
76 # by using return type as offset
77 mflr %r4 # move address of .Lret to r4
78 sldi %r3, %r3, 4 # now multiply return type by 16
79 addi %r4, %r4, .Lret_type0 - .Lret
81 add %r3, %r3, %r4 # add contents of table to table address
85 # Each of the ret_typeX code fragments has to be exactly 16 bytes long
86 # (4 instructions). For cache effectiveness we align to a 16 byte boundary
101 # case FFI_TYPE_FLOAT
106 # case FFI_TYPE_DOUBLE
111 # case FFI_TYPE_LONGDOUBLE
116 # case FFI_TYPE_UINT8
121 # case FFI_TYPE_SINT8
126 # case FFI_TYPE_UINT16
132 # case FFI_TYPE_SINT16
137 # case FFI_TYPE_UINT32
142 # case FFI_TYPE_SINT32
147 # case FFI_TYPE_UINT64
152 # case FFI_TYPE_SINT64
157 # case FFI_TYPE_STRUCT
162 # case FFI_TYPE_POINTER
170 .byte 0,12,0,1,128,0,0,0
171 .size .ffi_closure_LINUX64,.-.ffi_closure_LINUX64
173 .section .eh_frame,EH_FRAME_FLAGS,@progbits
175 .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry
177 .4byte 0x0 # CIE Identifier Tag
178 .byte 0x1 # CIE Version
179 .ascii "zR\0" # CIE Augmentation
180 .uleb128 0x1 # CIE Code Alignment Factor
181 .sleb128 -8 # CIE Data Alignment Factor
182 .byte 0x41 # CIE RA Column
183 .uleb128 0x1 # Augmentation size
184 .byte 0x14 # FDE Encoding (pcrel udata8)
185 .byte 0xc # DW_CFA_def_cfa
191 .4byte .LEFDE1-.LASFDE1 # FDE Length
193 .4byte .LASFDE1-.Lframe1 # FDE CIE offset
194 .8byte .LFB1-. # FDE initial location
195 .8byte .LFE1-.LFB1 # FDE address range
196 .uleb128 0x0 # Augmentation size
197 .byte 0x2 # DW_CFA_advance_loc1
199 .byte 0xe # DW_CFA_def_cfa_offset
201 .byte 0x11 # DW_CFA_offset_extended_sf