]> git.saurik.com Git - apple/objc4.git/blob - runtime/objc-blocktramps-arm.s
objc4-781.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 two pages 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 .macro TrampolineEntry
43 mov r12, pc
44 b L__objc_blockTrampolineImpl_func
45 .align 3
46 .endmacro
47
48 .macro TrampolineEntryX16
49 TrampolineEntry
50 TrampolineEntry
51 TrampolineEntry
52 TrampolineEntry
53
54 TrampolineEntry
55 TrampolineEntry
56 TrampolineEntry
57 TrampolineEntry
58
59 TrampolineEntry
60 TrampolineEntry
61 TrampolineEntry
62 TrampolineEntry
63
64 TrampolineEntry
65 TrampolineEntry
66 TrampolineEntry
67 TrampolineEntry
68 .endmacro
69
70 .macro TrampolineEntryX256
71 TrampolineEntryX16
72 TrampolineEntryX16
73 TrampolineEntryX16
74 TrampolineEntryX16
75
76 TrampolineEntryX16
77 TrampolineEntryX16
78 TrampolineEntryX16
79 TrampolineEntryX16
80
81 TrampolineEntryX16
82 TrampolineEntryX16
83 TrampolineEntryX16
84 TrampolineEntryX16
85
86 TrampolineEntryX16
87 TrampolineEntryX16
88 TrampolineEntryX16
89 TrampolineEntryX16
90 .endmacro
91
92 .align 5
93 __objc_blockTrampolineStart:
94 // 2048-4 trampolines to fill 16K page
95 TrampolineEntryX256
96 TrampolineEntryX256
97 TrampolineEntryX256
98 TrampolineEntryX256
99
100 TrampolineEntryX256
101 TrampolineEntryX256
102 TrampolineEntryX256
103
104 TrampolineEntryX16
105 TrampolineEntryX16
106 TrampolineEntryX16
107 TrampolineEntryX16
108
109 TrampolineEntryX16
110 TrampolineEntryX16
111 TrampolineEntryX16
112 TrampolineEntryX16
113
114 TrampolineEntryX16
115 TrampolineEntryX16
116 TrampolineEntryX16
117 TrampolineEntryX16
118
119 TrampolineEntryX16
120 TrampolineEntryX16
121 TrampolineEntryX16
122
123 TrampolineEntry
124 TrampolineEntry
125 TrampolineEntry
126 TrampolineEntry
127
128 TrampolineEntry
129 TrampolineEntry
130 TrampolineEntry
131 TrampolineEntry
132
133 TrampolineEntry
134 TrampolineEntry
135 TrampolineEntry
136 __objc_blockTrampolineLast:
137 TrampolineEntry
138
139 // TrampolineEntry
140 // TrampolineEntry
141 // TrampolineEntry
142 // TrampolineEntry
143
144
145
146 .text
147 .globl __objc_blockTrampolineImpl_stret
148 .globl __objc_blockTrampolineStart_stret
149 .globl __objc_blockTrampolineLast_stret
150
151 // Trampoline machinery assumes the trampolines are Thumb function pointers
152 #if !__thumb2__
153 # error sorry
154 #endif
155
156 .thumb
157
158 // Exported symbols are not marked as functions.
159 // The trampoline construction code assumes that the Thumb bit is not set.
160 .thumb_func L__objc_blockTrampolineImpl_stret_func
161
162 .align PAGE_MAX_SHIFT
163 __objc_blockTrampolineImpl_stret:
164 L__objc_blockTrampolineImpl_stret_func:
165 /*
166 r1 == self
167 r12 == pc of trampoline's first instruction + PC bias
168 lr == original return address
169 */
170
171 mov r2, r1 // _cmd = self
172
173 // Trampoline's data is three pages before the trampoline text.
174 // Also correct PC bias of 4 bytes.
175 sub r12, # 3*PAGE_MAX_SIZE
176 ldr r1, [r12, #-4] // self = block object
177 ldr pc, [r1, #12] // tail call block->invoke
178 // not reached
179
180 .macro TrampolineEntry_stret
181 mov r12, pc
182 b L__objc_blockTrampolineImpl_stret_func
183 .align 3
184 .endmacro
185
186 .macro TrampolineEntryX16_stret
187 TrampolineEntry_stret
188 TrampolineEntry_stret
189 TrampolineEntry_stret
190 TrampolineEntry_stret
191
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 .endmacro
207
208 .macro TrampolineEntryX256_stret
209 TrampolineEntryX16_stret
210 TrampolineEntryX16_stret
211 TrampolineEntryX16_stret
212 TrampolineEntryX16_stret
213
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 .endmacro
229
230 .align 5
231 __objc_blockTrampolineStart_stret:
232 // 2048-4 trampolines to fill 16K page
233 TrampolineEntryX256_stret
234 TrampolineEntryX256_stret
235 TrampolineEntryX256_stret
236 TrampolineEntryX256_stret
237
238 TrampolineEntryX256_stret
239 TrampolineEntryX256_stret
240 TrampolineEntryX256_stret
241
242 TrampolineEntryX16_stret
243 TrampolineEntryX16_stret
244 TrampolineEntryX16_stret
245 TrampolineEntryX16_stret
246
247 TrampolineEntryX16_stret
248 TrampolineEntryX16_stret
249 TrampolineEntryX16_stret
250 TrampolineEntryX16_stret
251
252 TrampolineEntryX16_stret
253 TrampolineEntryX16_stret
254 TrampolineEntryX16_stret
255 TrampolineEntryX16_stret
256
257 TrampolineEntryX16_stret
258 TrampolineEntryX16_stret
259 TrampolineEntryX16_stret
260
261 TrampolineEntry_stret
262 TrampolineEntry_stret
263 TrampolineEntry_stret
264 TrampolineEntry_stret
265
266 TrampolineEntry_stret
267 TrampolineEntry_stret
268 TrampolineEntry_stret
269 TrampolineEntry_stret
270
271 TrampolineEntry_stret
272 TrampolineEntry_stret
273 TrampolineEntry_stret
274 __objc_blockTrampolineLast_stret:
275 TrampolineEntry_stret
276
277 // TrampolineEntry_stret
278 // TrampolineEntry_stret
279 // TrampolineEntry_stret
280 // TrampolineEntry_stret
281
282 #endif