OSDN Git Service

* configure.in (powerpc64*-*-linux*): Remove.
[pf3gnuchains/gcc-fork.git] / libffi / src / powerpc / linux64_closure.S
1         .file   "linux64_closure.S"
2
3 #ifdef __powerpc64__
4         .hidden ffi_closure_LINUX64, .ffi_closure_LINUX64
5         .globl  ffi_closure_LINUX64, .ffi_closure_LINUX64
6         .section        ".opd","aw"
7         .align  3
8 ffi_closure_LINUX64:
9         .quad   .ffi_closure_LINUX64,.TOC.@tocbase,0
10         .size   ffi_closure_LINUX64,24
11         .type   .ffi_closure_LINUX64,@function
12         .text
13 .ffi_closure_LINUX64:
14 .LFB1:
15         # save general regs into parm save area
16         std     %r3, 48(%r1)
17         std     %r4, 56(%r1)
18         std     %r5, 64(%r1)
19         std     %r6, 72(%r1)
20         mflr    %r0
21
22         std     %r7, 80(%r1)
23         std     %r8, 88(%r1)
24         std     %r9, 96(%r1)
25         std     %r10, 104(%r1)
26         std     %r0, 16(%r1)
27
28         # mandatory 48 bytes special reg save area + 64 bytes parm save area
29         # + 8 bytes retval area + 13*8 bytes fpr save area
30         stdu    %r1, -224(%r1)
31 .LCFI0:
32
33         # next save fpr 1 to fpr 13
34         stfd  %f1, 120+(0*8)(%r1)
35         stfd  %f2, 120+(1*8)(%r1)
36         stfd  %f3, 120+(2*8)(%r1)
37         stfd  %f4, 120+(3*8)(%r1)
38         stfd  %f5, 120+(4*8)(%r1)
39         stfd  %f6, 120+(5*8)(%r1)
40         stfd  %f7, 120+(6*8)(%r1)
41         stfd  %f8, 120+(7*8)(%r1)
42         stfd  %f9, 120+(8*8)(%r1)
43         stfd  %f10, 120+(9*8)(%r1)
44         stfd  %f11, 120+(10*8)(%r1)
45         stfd  %f12, 120+(11*8)(%r1)
46         stfd  %f13, 120+(12*8)(%r1)
47
48         # set up registers for the routine that actually does the work
49         # get the context pointer from the trampoline
50         mr %r3, %r11
51
52         # now load up the pointer to the result storage
53         addi %r4, %r1, 112
54
55         # now load up the pointer to the parameter save area
56         # in the previous frame
57         addi %r5, %r1, 224 + 48
58
59         # now load up the pointer to the saved fpr registers */
60         addi %r6, %r1, 120
61
62         # make the call
63         bl .ffi_closure_helper_LINUX64
64
65         # now r3 contains the return type
66         # so use it to look up in a table
67         # so we know how to deal with each type
68
69         # look up the proper starting point in table 
70         # by using return type as offset
71         addi %r5, %r1, 112      # get pointer to results area
72         bl .Lget_ret_type0_addr # get pointer to .Lret_type0 into LR
73         mflr %r4                # move to r4
74         sldi %r3, %r3, 4        # now multiply return type by 16
75         add %r3, %r3, %r4       # add contents of table to table address
76         mtctr %r3
77         bctr                    # jump to it
78
79 # Each of the ret_typeX code fragments has to be exactly 16 bytes long
80 # (4 instructions). For cache effectiveness we align to a 16 byte boundary
81 # first.
82         .align 4
83
84         nop
85         nop
86         nop
87 .Lget_ret_type0_addr:
88         blrl
89
90 .Lret_type0:
91 # case FFI_TYPE_VOID
92         b .Lfinish
93         nop
94         nop
95         nop
96 # case FFI_TYPE_INT
97         lwa %r3, 4(%r5)
98         b .Lfinish
99         nop
100         nop
101 # case FFI_TYPE_FLOAT
102         lfs %f1, 4(%r5)
103         b .Lfinish
104         nop
105         nop
106 # case FFI_TYPE_DOUBLE
107         lfd %f1, 0(%r5)
108         b .Lfinish
109         nop
110         nop
111 # case FFI_TYPE_LONGDOUBLE
112         lfd %f1, 0(%r5)
113         b .Lfinish
114         nop
115         nop
116 # case FFI_TYPE_UINT8
117         lbz %r3, 7(%r5)
118         b .Lfinish
119         nop
120         nop
121 # case FFI_TYPE_SINT8
122         lbz %r3, 7(%r5)
123         extsb %r3,%r3
124         b .Lfinish
125         nop
126 # case FFI_TYPE_UINT16
127         lhz %r3, 6(%r5)
128         b .Lfinish
129         nop
130         nop
131 # case FFI_TYPE_SINT16
132         lha %r3, 6(%r5)
133         b .Lfinish
134         nop
135         nop
136 # case FFI_TYPE_UINT32
137         lwz %r3, 4(%r5)
138         b .Lfinish
139         nop
140         nop
141 # case FFI_TYPE_SINT32
142         lwa %r3, 4(%r5)
143         b .Lfinish
144         nop
145         nop
146 # case FFI_TYPE_UINT64
147         ld %r3, 0(%r5)
148         b .Lfinish
149         nop
150         nop
151 # case FFI_TYPE_SINT64
152         ld %r3, 0(%r5)
153         b .Lfinish
154         nop
155         nop
156 # case FFI_TYPE_STRUCT
157         b .Lfinish
158         nop
159         nop
160         nop
161 # case FFI_TYPE_POINTER
162         ld %r3, 0(%r5)
163         b .Lfinish
164         nop
165         nop
166 # esac
167 .Lfinish:
168         ld %r0, 224+16(%r1)
169         mtlr %r0
170         addi %r1, %r1, 224
171         blr
172 .LFE1:
173         .long   0
174         .byte   0,12,0,1,128,0,0,0
175         .size   .ffi_closure_LINUX64,.-.ffi_closure_LINUX64
176
177         .section        .eh_frame,"aw",@progbits
178 .Lframe1:
179         .4byte  .LECIE1-.LSCIE1  # Length of Common Information Entry
180 .LSCIE1:
181         .4byte  0x0      # CIE Identifier Tag
182         .byte   0x1      # CIE Version
183         .ascii "zR\0"    # CIE Augmentation
184         .uleb128 0x1     # CIE Code Alignment Factor
185         .sleb128 -8      # CIE Data Alignment Factor
186         .byte   0x41     # CIE RA Column
187         .uleb128 0x1     # Augmentation size
188         .byte   0x14     # FDE Encoding (pcrel udata8)
189         .byte   0xc      # DW_CFA_def_cfa
190         .uleb128 0x1
191         .uleb128 0x0
192         .align 3
193 .LECIE1:
194 .LSFDE1:
195         .4byte  .LEFDE1-.LASFDE1         # FDE Length
196 .LASFDE1:
197         .4byte  .LASFDE1-.Lframe1        # FDE CIE offset
198         .8byte  .LFB1-.  # FDE initial location
199         .8byte  .LFE1-.LFB1      # FDE address range
200         .uleb128 0x0     # Augmentation size
201         .byte   0x2      # DW_CFA_advance_loc1
202         .byte   .LCFI0-.LFB1
203         .byte   0xe      # DW_CFA_def_cfa_offset
204         .uleb128 224
205         .byte   0x11     # DW_CFA_offset_extended_sf
206         .uleb128 0x41
207         .sleb128 -2
208         .align 3
209 .LEFDE1:
210 #endif