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