]> git.saurik.com Git - apple/objc4.git/blob - runtime/objc-blocktramps-arm.s
objc4-750.tar.gz
[apple/objc4.git] / runtime / objc-blocktramps-arm.s
1 #if __arm__
2
3 #include <arm/arch.h>
4 #include <mach/vm_param.h>
5
6 .syntax unified
7
8 .text
9 .globl __objc_blockTrampolineImpl
10 .globl __objc_blockTrampolineStart
11 .globl __objc_blockTrampolineLast
12
13 // Trampoline machinery assumes the trampolines are Thumb function pointers
14 #if !__thumb2__
15 # error sorry
16 #endif
17
18 .thumb
19
20 // Exported symbols are not marked as functions.
21 // The trampoline construction code assumes that the Thumb bit is not set.
22 .thumb_func L__objc_blockTrampolineImpl_func
23
24 .align PAGE_MAX_SHIFT
25 __objc_blockTrampolineImpl:
26 L__objc_blockTrampolineImpl_func:
27 /*
28 r0 == self
29 r12 == pc of trampoline's first instruction + PC bias
30 lr == original return address
31 */
32
33 mov r1, r0 // _cmd = self
34
35 // Trampoline's data is one page before the trampoline text.
36 // Also correct PC bias of 4 bytes.
37 sub r12, # 2*PAGE_MAX_SIZE
38 ldr r0, [r12, #-4] // self = block object
39 ldr pc, [r0, #12] // tail call block->invoke
40 // not reached
41
42 // Align trampolines to 8 bytes
43 .align 3
44
45 .macro TrampolineEntry
46 mov r12, pc
47 b L__objc_blockTrampolineImpl_func
48 .align 3
49 .endmacro
50
51 .macro TrampolineEntryX16
52 TrampolineEntry
53 TrampolineEntry
54 TrampolineEntry
55 TrampolineEntry
56
57 TrampolineEntry
58 TrampolineEntry
59 TrampolineEntry
60 TrampolineEntry
61
62 TrampolineEntry
63 TrampolineEntry
64 TrampolineEntry
65 TrampolineEntry
66
67 TrampolineEntry
68 TrampolineEntry
69 TrampolineEntry
70 TrampolineEntry
71 .endmacro
72
73 .macro TrampolineEntryX256
74 TrampolineEntryX16
75 TrampolineEntryX16
76 TrampolineEntryX16
77 TrampolineEntryX16
78
79 TrampolineEntryX16
80 TrampolineEntryX16
81 TrampolineEntryX16
82 TrampolineEntryX16
83
84 TrampolineEntryX16
85 TrampolineEntryX16
86 TrampolineEntryX16
87 TrampolineEntryX16
88
89 TrampolineEntryX16
90 TrampolineEntryX16
91 TrampolineEntryX16
92 TrampolineEntryX16
93 .endmacro
94
95 __objc_blockTrampolineStart:
96 // 2048-2 trampolines to fill 16K page
97 TrampolineEntryX256
98 TrampolineEntryX256
99 TrampolineEntryX256
100 TrampolineEntryX256
101
102 TrampolineEntryX256
103 TrampolineEntryX256
104 TrampolineEntryX256
105
106 TrampolineEntryX16
107 TrampolineEntryX16
108 TrampolineEntryX16
109 TrampolineEntryX16
110
111 TrampolineEntryX16
112 TrampolineEntryX16
113 TrampolineEntryX16
114 TrampolineEntryX16
115
116 TrampolineEntryX16
117 TrampolineEntryX16
118 TrampolineEntryX16
119 TrampolineEntryX16
120
121 TrampolineEntryX16
122 TrampolineEntryX16
123 TrampolineEntryX16
124
125 TrampolineEntry
126 TrampolineEntry
127 TrampolineEntry
128 TrampolineEntry
129
130 TrampolineEntry
131 TrampolineEntry
132 TrampolineEntry
133 TrampolineEntry
134
135 TrampolineEntry
136 TrampolineEntry
137 TrampolineEntry
138 TrampolineEntry
139
140 TrampolineEntry
141 __objc_blockTrampolineLast:
142 TrampolineEntry
143 // TrampolineEntry
144 // TrampolineEntry
145
146
147
148 .text
149 .globl __objc_blockTrampolineImpl_stret
150 .globl __objc_blockTrampolineStart_stret
151 .globl __objc_blockTrampolineLast_stret
152
153 // Trampoline machinery assumes the trampolines are Thumb function pointers
154 #if !__thumb2__
155 # error sorry
156 #endif
157
158 .thumb
159
160 // Exported symbols are not marked as functions.
161 // The trampoline construction code assumes that the Thumb bit is not set.
162 .thumb_func L__objc_blockTrampolineImpl_stret_func
163
164 .align PAGE_MAX_SHIFT
165 __objc_blockTrampolineImpl_stret:
166 L__objc_blockTrampolineImpl_stret_func:
167 /*
168 r1 == self
169 r12 == pc of trampoline's first instruction + PC bias
170 lr == original return address
171 */
172
173 mov r2, r1 // _cmd = self
174
175 // Trampoline's data is one page before the trampoline text.
176 // Also correct PC bias of 4 bytes.
177 sub r12, # 3*PAGE_MAX_SIZE
178 ldr r1, [r12, #-4] // self = block object
179 ldr pc, [r1, #12] // tail call block->invoke
180 // not reached
181
182 // Align trampolines to 8 bytes
183 .align 3
184
185 .macro TrampolineEntry_stret
186 mov r12, pc
187 b L__objc_blockTrampolineImpl_stret_func
188 .align 3
189 .endmacro
190
191 .macro TrampolineEntryX16_stret
192 TrampolineEntry_stret
193 TrampolineEntry_stret
194 TrampolineEntry_stret
195 TrampolineEntry_stret
196
197 TrampolineEntry_stret
198 TrampolineEntry_stret
199 TrampolineEntry_stret
200 TrampolineEntry_stret
201
202 TrampolineEntry_stret
203 TrampolineEntry_stret
204 TrampolineEntry_stret
205 TrampolineEntry_stret
206
207 TrampolineEntry_stret
208 TrampolineEntry_stret
209 TrampolineEntry_stret
210 TrampolineEntry_stret
211 .endmacro
212
213 .macro TrampolineEntryX256_stret
214 TrampolineEntryX16_stret
215 TrampolineEntryX16_stret
216 TrampolineEntryX16_stret
217 TrampolineEntryX16_stret
218
219 TrampolineEntryX16_stret
220 TrampolineEntryX16_stret
221 TrampolineEntryX16_stret
222 TrampolineEntryX16_stret
223
224 TrampolineEntryX16_stret
225 TrampolineEntryX16_stret
226 TrampolineEntryX16_stret
227 TrampolineEntryX16_stret
228
229 TrampolineEntryX16_stret
230 TrampolineEntryX16_stret
231 TrampolineEntryX16_stret
232 TrampolineEntryX16_stret
233 .endmacro
234
235 __objc_blockTrampolineStart_stret:
236 // 2048-2 trampolines to fill 16K page
237 TrampolineEntryX256_stret
238 TrampolineEntryX256_stret
239 TrampolineEntryX256_stret
240 TrampolineEntryX256_stret
241
242 TrampolineEntryX256_stret
243 TrampolineEntryX256_stret
244 TrampolineEntryX256_stret
245
246 TrampolineEntryX16_stret
247 TrampolineEntryX16_stret
248 TrampolineEntryX16_stret
249 TrampolineEntryX16_stret
250
251 TrampolineEntryX16_stret
252 TrampolineEntryX16_stret
253 TrampolineEntryX16_stret
254 TrampolineEntryX16_stret
255
256 TrampolineEntryX16_stret
257 TrampolineEntryX16_stret
258 TrampolineEntryX16_stret
259 TrampolineEntryX16_stret
260
261 TrampolineEntryX16_stret
262 TrampolineEntryX16_stret
263 TrampolineEntryX16_stret
264
265 TrampolineEntry_stret
266 TrampolineEntry_stret
267 TrampolineEntry_stret
268 TrampolineEntry_stret
269
270 TrampolineEntry_stret
271 TrampolineEntry_stret
272 TrampolineEntry_stret
273 TrampolineEntry_stret
274
275 TrampolineEntry_stret
276 TrampolineEntry_stret
277 TrampolineEntry_stret
278 TrampolineEntry_stret
279
280 TrampolineEntry_stret
281 __objc_blockTrampolineLast_stret:
282 TrampolineEntry_stret
283 // TrampolineEntry_stret
284 // TrampolineEntry_stret
285
286 #endif