]>
Commit | Line | Data |
---|---|---|
6fe7ccc8 A |
1 | /* |
2 | * Copyright (C) 2011 Apple Inc. All rights reserved. | |
3 | * | |
4 | * Redistribution and use in source and binary forms, with or without | |
5 | * modification, are permitted provided that the following conditions | |
6 | * are met: | |
7 | * 1. Redistributions of source code must retain the above copyright | |
8 | * notice, this list of conditions and the following disclaimer. | |
9 | * 2. Redistributions in binary form must reproduce the above copyright | |
10 | * notice, this list of conditions and the following disclaimer in the | |
11 | * documentation and/or other materials provided with the distribution. | |
12 | * | |
13 | * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY | |
14 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
15 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | |
16 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR | |
17 | * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | |
18 | * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |
19 | * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | |
20 | * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY | |
21 | * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
22 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
23 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
24 | */ | |
25 | ||
81345200 A |
26 | #ifndef CCallHelpers_h |
27 | #define CCallHelpers_h | |
6fe7ccc8 | 28 | |
81345200 | 29 | #if ENABLE(JIT) |
6fe7ccc8 | 30 | |
81345200 A |
31 | #include "AssemblyHelpers.h" |
32 | #include "GPRInfo.h" | |
6fe7ccc8 | 33 | |
81345200 | 34 | namespace JSC { |
6fe7ccc8 A |
35 | |
36 | class CCallHelpers : public AssemblyHelpers { | |
37 | public: | |
93a37866 A |
38 | CCallHelpers(VM* vm, CodeBlock* codeBlock = 0) |
39 | : AssemblyHelpers(vm, codeBlock) | |
6fe7ccc8 A |
40 | { |
41 | } | |
42 | ||
43 | // These methods used to sort arguments into the correct registers. | |
44 | // On X86 we use cdecl calling conventions, which pass all arguments on the | |
45 | // stack. On other architectures we may need to sort values into the | |
46 | // correct registers. | |
47 | #if !NUMBER_OF_ARGUMENT_REGISTERS | |
48 | unsigned m_callArgumentOffset; | |
49 | void resetCallArguments() { m_callArgumentOffset = 0; } | |
50 | ||
51 | // These methods are using internally to implement the callOperation methods. | |
52 | void addCallArgument(GPRReg value) | |
53 | { | |
54 | poke(value, m_callArgumentOffset++); | |
55 | } | |
56 | void addCallArgument(TrustedImm32 imm) | |
57 | { | |
58 | poke(imm, m_callArgumentOffset++); | |
59 | } | |
60 | void addCallArgument(TrustedImmPtr pointer) | |
61 | { | |
62 | poke(pointer, m_callArgumentOffset++); | |
63 | } | |
64 | void addCallArgument(FPRReg value) | |
65 | { | |
66 | storeDouble(value, Address(stackPointerRegister, m_callArgumentOffset * sizeof(void*))); | |
67 | m_callArgumentOffset += sizeof(double) / sizeof(void*); | |
68 | } | |
69 | ||
70 | ALWAYS_INLINE void setupArguments(FPRReg arg1) | |
71 | { | |
72 | resetCallArguments(); | |
73 | addCallArgument(arg1); | |
74 | } | |
75 | ||
76 | ALWAYS_INLINE void setupArguments(FPRReg arg1, FPRReg arg2) | |
77 | { | |
78 | resetCallArguments(); | |
79 | addCallArgument(arg1); | |
80 | addCallArgument(arg2); | |
81 | } | |
82 | ||
83 | ALWAYS_INLINE void setupArguments(GPRReg arg1) | |
84 | { | |
85 | resetCallArguments(); | |
86 | addCallArgument(arg1); | |
87 | } | |
88 | ||
89 | ALWAYS_INLINE void setupArguments(GPRReg arg1, GPRReg arg2) | |
90 | { | |
91 | resetCallArguments(); | |
92 | addCallArgument(arg1); | |
93 | addCallArgument(arg2); | |
94 | } | |
93a37866 | 95 | |
81345200 A |
96 | ALWAYS_INLINE void setupArguments(TrustedImmPtr arg1, GPRReg arg2) |
97 | { | |
98 | resetCallArguments(); | |
99 | addCallArgument(arg1); | |
100 | addCallArgument(arg2); | |
101 | } | |
102 | ||
103 | ALWAYS_INLINE void setupArguments(GPRReg arg1, GPRReg arg2, GPRReg arg3) | |
104 | { | |
105 | resetCallArguments(); | |
106 | addCallArgument(arg1); | |
107 | addCallArgument(arg2); | |
108 | addCallArgument(arg3); | |
109 | } | |
110 | ||
111 | ALWAYS_INLINE void setupArguments(GPRReg arg1, GPRReg arg2, TrustedImmPtr arg3, TrustedImmPtr arg4) | |
112 | { | |
113 | resetCallArguments(); | |
114 | addCallArgument(arg1); | |
115 | addCallArgument(arg2); | |
116 | addCallArgument(arg3); | |
117 | addCallArgument(arg4); | |
118 | } | |
119 | ||
120 | ALWAYS_INLINE void setupArguments(GPRReg arg1, GPRReg arg2, TrustedImmPtr arg3, TrustedImm32 arg4, GPRReg arg5) | |
121 | { | |
122 | resetCallArguments(); | |
123 | addCallArgument(arg1); | |
124 | addCallArgument(arg2); | |
125 | addCallArgument(arg3); | |
126 | addCallArgument(arg4); | |
127 | addCallArgument(arg5); | |
128 | } | |
129 | ||
130 | ALWAYS_INLINE void setupArguments(GPRReg arg1, GPRReg arg2, TrustedImmPtr arg3, TrustedImm32 arg4, GPRReg arg5, GPRReg arg6) | |
131 | { | |
132 | resetCallArguments(); | |
133 | addCallArgument(arg1); | |
134 | addCallArgument(arg2); | |
135 | addCallArgument(arg3); | |
136 | addCallArgument(arg4); | |
137 | addCallArgument(arg5); | |
138 | addCallArgument(arg6); | |
139 | } | |
140 | ||
93a37866 A |
141 | ALWAYS_INLINE void setupArguments(TrustedImmPtr arg1) |
142 | { | |
143 | resetCallArguments(); | |
144 | addCallArgument(arg1); | |
145 | } | |
6fe7ccc8 A |
146 | |
147 | ALWAYS_INLINE void setupArgumentsExecState() | |
148 | { | |
149 | resetCallArguments(); | |
150 | addCallArgument(GPRInfo::callFrameRegister); | |
151 | } | |
152 | ||
153 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1) | |
154 | { | |
155 | resetCallArguments(); | |
156 | addCallArgument(GPRInfo::callFrameRegister); | |
157 | addCallArgument(arg1); | |
158 | } | |
159 | ||
160 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1) | |
161 | { | |
162 | resetCallArguments(); | |
163 | addCallArgument(GPRInfo::callFrameRegister); | |
164 | addCallArgument(arg1); | |
165 | } | |
166 | ||
93a37866 A |
167 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32 arg1) |
168 | { | |
169 | resetCallArguments(); | |
170 | addCallArgument(GPRInfo::callFrameRegister); | |
171 | addCallArgument(arg1); | |
172 | } | |
173 | ||
6fe7ccc8 A |
174 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2) |
175 | { | |
176 | resetCallArguments(); | |
177 | addCallArgument(GPRInfo::callFrameRegister); | |
178 | addCallArgument(arg1); | |
179 | addCallArgument(arg2); | |
180 | } | |
181 | ||
182 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, TrustedImmPtr arg2) | |
183 | { | |
184 | resetCallArguments(); | |
185 | addCallArgument(GPRInfo::callFrameRegister); | |
186 | addCallArgument(arg1); | |
187 | addCallArgument(arg2); | |
188 | } | |
189 | ||
93a37866 A |
190 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, TrustedImm32 arg2) |
191 | { | |
192 | resetCallArguments(); | |
193 | addCallArgument(GPRInfo::callFrameRegister); | |
194 | addCallArgument(arg1); | |
195 | addCallArgument(arg2); | |
196 | } | |
197 | ||
198 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32 arg1, GPRReg arg2) | |
199 | { | |
200 | resetCallArguments(); | |
201 | addCallArgument(GPRInfo::callFrameRegister); | |
202 | addCallArgument(arg1); | |
203 | addCallArgument(arg2); | |
204 | } | |
205 | ||
206 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1, GPRReg arg2) | |
207 | { | |
208 | resetCallArguments(); | |
209 | addCallArgument(GPRInfo::callFrameRegister); | |
210 | addCallArgument(arg1); | |
211 | addCallArgument(arg2); | |
212 | } | |
213 | ||
6fe7ccc8 A |
214 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32 arg1, TrustedImm32 arg2) |
215 | { | |
216 | resetCallArguments(); | |
217 | addCallArgument(GPRInfo::callFrameRegister); | |
218 | addCallArgument(arg1); | |
219 | addCallArgument(arg2); | |
220 | } | |
221 | ||
222 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1, TrustedImmPtr arg2) | |
223 | { | |
224 | resetCallArguments(); | |
225 | addCallArgument(GPRInfo::callFrameRegister); | |
226 | addCallArgument(arg1); | |
227 | addCallArgument(arg2); | |
228 | } | |
229 | ||
93a37866 A |
230 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1, TrustedImm32 arg2) |
231 | { | |
232 | resetCallArguments(); | |
233 | addCallArgument(GPRInfo::callFrameRegister); | |
234 | addCallArgument(arg1); | |
235 | addCallArgument(arg2); | |
236 | } | |
237 | ||
81345200 A |
238 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1, TrustedImm32 arg2, TrustedImm32 arg3) |
239 | { | |
240 | resetCallArguments(); | |
241 | addCallArgument(GPRInfo::callFrameRegister); | |
242 | addCallArgument(arg1); | |
243 | addCallArgument(arg2); | |
244 | addCallArgument(arg3); | |
245 | } | |
246 | ||
6fe7ccc8 A |
247 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, GPRReg arg3) |
248 | { | |
249 | resetCallArguments(); | |
250 | addCallArgument(GPRInfo::callFrameRegister); | |
251 | addCallArgument(arg1); | |
252 | addCallArgument(arg2); | |
253 | addCallArgument(arg3); | |
254 | } | |
255 | ||
81345200 A |
256 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, TrustedImm32 arg3) |
257 | { | |
258 | resetCallArguments(); | |
259 | addCallArgument(GPRInfo::callFrameRegister); | |
260 | addCallArgument(arg1); | |
261 | addCallArgument(arg2); | |
262 | addCallArgument(arg3); | |
263 | } | |
264 | ||
6fe7ccc8 A |
265 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, TrustedImmPtr arg3) |
266 | { | |
267 | resetCallArguments(); | |
268 | addCallArgument(GPRInfo::callFrameRegister); | |
269 | addCallArgument(arg1); | |
270 | addCallArgument(arg2); | |
271 | addCallArgument(arg3); | |
272 | } | |
273 | ||
93a37866 A |
274 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, TrustedImm32 arg2, GPRReg arg3) |
275 | { | |
276 | resetCallArguments(); | |
277 | addCallArgument(GPRInfo::callFrameRegister); | |
278 | addCallArgument(arg1); | |
279 | addCallArgument(arg2); | |
280 | addCallArgument(arg3); | |
281 | } | |
282 | ||
6fe7ccc8 A |
283 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, TrustedImm32 arg2, TrustedImmPtr arg3) |
284 | { | |
285 | resetCallArguments(); | |
286 | addCallArgument(GPRInfo::callFrameRegister); | |
287 | addCallArgument(arg1); | |
288 | addCallArgument(arg2); | |
289 | addCallArgument(arg3); | |
290 | } | |
291 | ||
81345200 A |
292 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1, GPRReg arg2, GPRReg arg3) |
293 | { | |
294 | resetCallArguments(); | |
295 | addCallArgument(GPRInfo::callFrameRegister); | |
296 | addCallArgument(arg1); | |
297 | addCallArgument(arg2); | |
298 | addCallArgument(arg3); | |
299 | } | |
300 | ||
301 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1, GPRReg arg2, TrustedImm32 arg3) | |
302 | { | |
303 | resetCallArguments(); | |
304 | addCallArgument(GPRInfo::callFrameRegister); | |
305 | addCallArgument(arg1); | |
306 | addCallArgument(arg2); | |
307 | addCallArgument(arg3); | |
308 | } | |
309 | ||
310 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1, GPRReg arg2, TrustedImmPtr arg3) | |
311 | { | |
312 | resetCallArguments(); | |
313 | addCallArgument(GPRInfo::callFrameRegister); | |
314 | addCallArgument(arg1); | |
315 | addCallArgument(arg2); | |
316 | addCallArgument(arg3); | |
317 | } | |
318 | ||
319 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1, TrustedImmPtr arg2, TrustedImm32 arg3) | |
320 | { | |
321 | resetCallArguments(); | |
322 | addCallArgument(GPRInfo::callFrameRegister); | |
323 | addCallArgument(arg1); | |
324 | addCallArgument(arg2); | |
325 | addCallArgument(arg3); | |
326 | } | |
327 | ||
93a37866 A |
328 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1, TrustedImmPtr arg2, TrustedImmPtr arg3) |
329 | { | |
330 | resetCallArguments(); | |
331 | addCallArgument(GPRInfo::callFrameRegister); | |
332 | addCallArgument(arg1); | |
333 | addCallArgument(arg2); | |
334 | addCallArgument(arg3); | |
335 | } | |
336 | ||
6fe7ccc8 A |
337 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, TrustedImmPtr arg2, TrustedImmPtr arg3) |
338 | { | |
339 | resetCallArguments(); | |
340 | addCallArgument(GPRInfo::callFrameRegister); | |
341 | addCallArgument(arg1); | |
342 | addCallArgument(arg2); | |
343 | addCallArgument(arg3); | |
344 | } | |
345 | ||
93a37866 A |
346 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, TrustedImmPtr arg2, TrustedImm32 arg3, GPRReg arg4) |
347 | { | |
348 | resetCallArguments(); | |
349 | addCallArgument(GPRInfo::callFrameRegister); | |
350 | addCallArgument(arg1); | |
351 | addCallArgument(arg2); | |
352 | addCallArgument(arg3); | |
353 | addCallArgument(arg4); | |
354 | } | |
81345200 A |
355 | |
356 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1, TrustedImm32 arg2, GPRReg arg3, TrustedImmPtr arg4) | |
357 | { | |
358 | resetCallArguments(); | |
359 | addCallArgument(GPRInfo::callFrameRegister); | |
360 | addCallArgument(arg1); | |
361 | addCallArgument(arg2); | |
362 | addCallArgument(arg3); | |
363 | addCallArgument(arg4); | |
364 | } | |
365 | ||
366 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, TrustedImm32 arg3, TrustedImmPtr arg4) | |
367 | { | |
368 | resetCallArguments(); | |
369 | addCallArgument(GPRInfo::callFrameRegister); | |
370 | addCallArgument(arg1); | |
371 | addCallArgument(arg2); | |
372 | addCallArgument(arg3); | |
373 | addCallArgument(arg4); | |
374 | } | |
375 | ||
376 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1, GPRReg arg2, TrustedImm32 arg3, GPRReg arg4, GPRReg arg5) | |
377 | { | |
378 | resetCallArguments(); | |
379 | addCallArgument(GPRInfo::callFrameRegister); | |
380 | addCallArgument(arg1); | |
381 | addCallArgument(arg2); | |
382 | addCallArgument(arg3); | |
383 | addCallArgument(arg4); | |
384 | addCallArgument(arg5); | |
385 | } | |
93a37866 A |
386 | |
387 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, TrustedImmPtr arg2, TrustedImm32 arg3, GPRReg arg4, GPRReg arg5) | |
388 | { | |
389 | resetCallArguments(); | |
390 | addCallArgument(GPRInfo::callFrameRegister); | |
391 | addCallArgument(arg1); | |
392 | addCallArgument(arg2); | |
393 | addCallArgument(arg3); | |
394 | addCallArgument(arg4); | |
395 | addCallArgument(arg5); | |
396 | } | |
397 | ||
6fe7ccc8 A |
398 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, GPRReg arg3, GPRReg arg4) |
399 | { | |
400 | resetCallArguments(); | |
401 | addCallArgument(GPRInfo::callFrameRegister); | |
402 | addCallArgument(arg1); | |
403 | addCallArgument(arg2); | |
404 | addCallArgument(arg3); | |
405 | addCallArgument(arg4); | |
406 | } | |
407 | ||
93a37866 A |
408 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, GPRReg arg3, TrustedImm32 arg4) |
409 | { | |
410 | resetCallArguments(); | |
411 | addCallArgument(GPRInfo::callFrameRegister); | |
412 | addCallArgument(arg1); | |
413 | addCallArgument(arg2); | |
414 | addCallArgument(arg3); | |
415 | addCallArgument(arg4); | |
416 | } | |
417 | ||
418 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32 arg1, TrustedImmPtr arg2, GPRReg arg3) | |
419 | { | |
420 | resetCallArguments(); | |
421 | addCallArgument(GPRInfo::callFrameRegister); | |
422 | addCallArgument(arg1); | |
423 | addCallArgument(arg2); | |
424 | addCallArgument(arg3); | |
425 | } | |
426 | ||
6fe7ccc8 A |
427 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, GPRReg arg3, TrustedImmPtr arg4) |
428 | { | |
429 | resetCallArguments(); | |
430 | addCallArgument(GPRInfo::callFrameRegister); | |
431 | addCallArgument(arg1); | |
432 | addCallArgument(arg2); | |
433 | addCallArgument(arg3); | |
434 | addCallArgument(arg4); | |
435 | } | |
436 | ||
437 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, TrustedImm32 arg3, TrustedImm32 arg4) | |
438 | { | |
439 | resetCallArguments(); | |
440 | addCallArgument(GPRInfo::callFrameRegister); | |
441 | addCallArgument(arg1); | |
442 | addCallArgument(arg2); | |
443 | addCallArgument(arg3); | |
444 | addCallArgument(arg4); | |
445 | } | |
446 | ||
81345200 A |
447 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, TrustedImm32 arg3, GPRReg arg4) |
448 | { | |
449 | resetCallArguments(); | |
450 | addCallArgument(GPRInfo::callFrameRegister); | |
451 | addCallArgument(arg1); | |
452 | addCallArgument(arg2); | |
453 | addCallArgument(arg3); | |
454 | addCallArgument(arg4); | |
455 | } | |
456 | ||
6fe7ccc8 A |
457 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32 arg1, TrustedImm32 arg2, GPRReg arg3, GPRReg arg4) |
458 | { | |
459 | resetCallArguments(); | |
460 | addCallArgument(GPRInfo::callFrameRegister); | |
461 | addCallArgument(arg1); | |
462 | addCallArgument(arg2); | |
463 | addCallArgument(arg3); | |
464 | addCallArgument(arg4); | |
465 | } | |
466 | ||
81345200 A |
467 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1, GPRReg arg2, GPRReg arg3, TrustedImm32 arg4) |
468 | { | |
469 | resetCallArguments(); | |
470 | addCallArgument(GPRInfo::callFrameRegister); | |
471 | addCallArgument(arg1); | |
472 | addCallArgument(arg2); | |
473 | addCallArgument(arg3); | |
474 | addCallArgument(arg4); | |
475 | } | |
476 | ||
477 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1, GPRReg arg2, GPRReg arg3, TrustedImm32 arg4, TrustedImmPtr arg5) | |
478 | { | |
479 | resetCallArguments(); | |
480 | addCallArgument(GPRInfo::callFrameRegister); | |
481 | addCallArgument(arg1); | |
482 | addCallArgument(arg2); | |
483 | addCallArgument(arg3); | |
484 | addCallArgument(arg4); | |
485 | addCallArgument(arg5); | |
486 | } | |
487 | ||
488 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1, GPRReg arg2, GPRReg arg3, GPRReg arg4, GPRReg arg5, TrustedImmPtr arg6) | |
489 | { | |
490 | resetCallArguments(); | |
491 | addCallArgument(GPRInfo::callFrameRegister); | |
492 | addCallArgument(arg1); | |
493 | addCallArgument(arg2); | |
494 | addCallArgument(arg3); | |
495 | addCallArgument(arg4); | |
496 | addCallArgument(arg5); | |
497 | addCallArgument(arg6); | |
498 | } | |
499 | ||
500 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1, GPRReg arg2, GPRReg arg3, GPRReg arg4, TrustedImm32 arg5, TrustedImmPtr arg6) | |
501 | { | |
502 | resetCallArguments(); | |
503 | addCallArgument(GPRInfo::callFrameRegister); | |
504 | addCallArgument(arg1); | |
505 | addCallArgument(arg2); | |
506 | addCallArgument(arg3); | |
507 | addCallArgument(arg4); | |
508 | addCallArgument(arg5); | |
509 | addCallArgument(arg6); | |
510 | } | |
511 | ||
512 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1, GPRReg arg2, GPRReg arg3, TrustedImmPtr arg4) | |
513 | { | |
514 | resetCallArguments(); | |
515 | addCallArgument(GPRInfo::callFrameRegister); | |
516 | addCallArgument(arg1); | |
517 | addCallArgument(arg2); | |
518 | addCallArgument(arg3); | |
519 | addCallArgument(arg4); | |
520 | } | |
521 | ||
522 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1, GPRReg arg2, TrustedImm32 arg3, TrustedImmPtr arg4) | |
523 | { | |
524 | resetCallArguments(); | |
525 | addCallArgument(GPRInfo::callFrameRegister); | |
526 | addCallArgument(arg1); | |
527 | addCallArgument(arg2); | |
528 | addCallArgument(arg3); | |
529 | addCallArgument(arg4); | |
530 | } | |
531 | ||
532 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, TrustedImmPtr arg2, GPRReg arg3, GPRReg arg4) | |
533 | { | |
534 | resetCallArguments(); | |
535 | addCallArgument(GPRInfo::callFrameRegister); | |
536 | addCallArgument(arg1); | |
537 | addCallArgument(arg2); | |
538 | addCallArgument(arg3); | |
539 | addCallArgument(arg4); | |
540 | } | |
541 | ||
6fe7ccc8 A |
542 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, GPRReg arg3, GPRReg arg4, GPRReg arg5) |
543 | { | |
544 | resetCallArguments(); | |
545 | addCallArgument(GPRInfo::callFrameRegister); | |
546 | addCallArgument(arg1); | |
547 | addCallArgument(arg2); | |
548 | addCallArgument(arg3); | |
549 | addCallArgument(arg4); | |
550 | addCallArgument(arg5); | |
551 | } | |
93a37866 | 552 | |
81345200 A |
553 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, TrustedImm32 arg3, GPRReg arg4, GPRReg arg5) |
554 | { | |
555 | resetCallArguments(); | |
556 | addCallArgument(GPRInfo::callFrameRegister); | |
557 | addCallArgument(arg1); | |
558 | addCallArgument(arg2); | |
559 | addCallArgument(arg3); | |
560 | addCallArgument(arg4); | |
561 | addCallArgument(arg5); | |
562 | } | |
563 | ||
564 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, GPRReg arg3, GPRReg arg4, TrustedImmPtr arg5) | |
565 | { | |
566 | resetCallArguments(); | |
567 | addCallArgument(GPRInfo::callFrameRegister); | |
568 | addCallArgument(arg1); | |
569 | addCallArgument(arg2); | |
570 | addCallArgument(arg3); | |
571 | addCallArgument(arg4); | |
572 | addCallArgument(arg5); | |
573 | } | |
574 | ||
575 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, GPRReg arg3, TrustedImm32 arg4, TrustedImmPtr arg5) | |
576 | { | |
577 | resetCallArguments(); | |
578 | addCallArgument(GPRInfo::callFrameRegister); | |
579 | addCallArgument(arg1); | |
580 | addCallArgument(arg2); | |
581 | addCallArgument(arg3); | |
582 | addCallArgument(arg4); | |
583 | addCallArgument(arg5); | |
584 | } | |
585 | ||
586 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, GPRReg arg3, GPRReg arg4, TrustedImm32 arg5) | |
587 | { | |
588 | resetCallArguments(); | |
589 | addCallArgument(GPRInfo::callFrameRegister); | |
590 | addCallArgument(arg1); | |
591 | addCallArgument(arg2); | |
592 | addCallArgument(arg3); | |
593 | addCallArgument(arg4); | |
594 | addCallArgument(arg5); | |
595 | } | |
596 | ||
597 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, GPRReg arg3, GPRReg arg4, GPRReg arg5, GPRReg arg6) | |
598 | { | |
599 | resetCallArguments(); | |
600 | addCallArgument(GPRInfo::callFrameRegister); | |
601 | addCallArgument(arg1); | |
602 | addCallArgument(arg2); | |
603 | addCallArgument(arg3); | |
604 | addCallArgument(arg4); | |
605 | addCallArgument(arg5); | |
606 | addCallArgument(arg6); | |
607 | } | |
608 | ||
609 | ||
610 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, GPRReg arg3, GPRReg arg4, GPRReg arg5, TrustedImm32 arg6) | |
611 | { | |
612 | resetCallArguments(); | |
613 | addCallArgument(GPRInfo::callFrameRegister); | |
614 | addCallArgument(arg1); | |
615 | addCallArgument(arg2); | |
616 | addCallArgument(arg3); | |
617 | addCallArgument(arg4); | |
618 | addCallArgument(arg5); | |
619 | addCallArgument(arg6); | |
620 | } | |
621 | ||
93a37866 A |
622 | ALWAYS_INLINE void setupArgumentsWithExecState(FPRReg arg1, GPRReg arg2) |
623 | { | |
624 | resetCallArguments(); | |
625 | addCallArgument(GPRInfo::callFrameRegister); | |
626 | addCallArgument(arg1); | |
627 | addCallArgument(arg2); | |
628 | } | |
629 | ||
630 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, FPRReg arg3) | |
631 | { | |
632 | resetCallArguments(); | |
633 | addCallArgument(GPRInfo::callFrameRegister); | |
634 | addCallArgument(arg1); | |
635 | addCallArgument(arg2); | |
636 | addCallArgument(arg3); | |
637 | } | |
6fe7ccc8 A |
638 | #endif // !NUMBER_OF_ARGUMENT_REGISTERS |
639 | // These methods are suitable for any calling convention that provides for | |
640 | // at least 4 argument registers, e.g. X86_64, ARMv7. | |
641 | #if NUMBER_OF_ARGUMENT_REGISTERS >= 4 | |
642 | template<GPRReg destA, GPRReg destB> | |
81345200 | 643 | void setupTwoStubArgsGPR(GPRReg srcA, GPRReg srcB) |
6fe7ccc8 A |
644 | { |
645 | // Assuming that srcA != srcB, there are 7 interesting states the registers may be in: | |
646 | // (1) both are already in arg regs, the right way around. | |
647 | // (2) both are already in arg regs, the wrong way around. | |
648 | // (3) neither are currently in arg registers. | |
649 | // (4) srcA in in its correct reg. | |
650 | // (5) srcA in in the incorrect reg. | |
651 | // (6) srcB in in its correct reg. | |
652 | // (7) srcB in in the incorrect reg. | |
653 | // | |
654 | // The trivial approach is to simply emit two moves, to put srcA in place then srcB in | |
655 | // place (the MacroAssembler will omit redundant moves). This apporach will be safe in | |
656 | // cases 1, 3, 4, 5, 6, and in cases where srcA==srcB. The two problem cases are 2 | |
657 | // (requires a swap) and 7 (must move srcB first, to avoid trampling.) | |
658 | ||
659 | if (srcB != destA) { | |
660 | // Handle the easy cases - two simple moves. | |
661 | move(srcA, destA); | |
662 | move(srcB, destB); | |
663 | } else if (srcA != destB) { | |
664 | // Handle the non-swap case - just put srcB in place first. | |
665 | move(srcB, destB); | |
666 | move(srcA, destA); | |
667 | } else | |
668 | swap(destA, destB); | |
669 | } | |
81345200 A |
670 | |
671 | template<GPRReg destA, GPRReg destB, GPRReg destC> | |
672 | void setupThreeStubArgsGPR(GPRReg srcA, GPRReg srcB, GPRReg srcC) | |
673 | { | |
674 | // If neither of srcB/srcC are in our way, then we can move srcA into place. | |
675 | // Then we can use setupTwoStubArgs to fix srcB/srcC. | |
676 | if (srcB != destA && srcC != destA) { | |
677 | move(srcA, destA); | |
678 | setupTwoStubArgsGPR<destB, destC>(srcB, srcC); | |
679 | return; | |
680 | } | |
681 | ||
682 | // If neither of srcA/srcC are in our way, then we can move srcB into place. | |
683 | // Then we can use setupTwoStubArgs to fix srcA/srcC. | |
684 | if (srcA != destB && srcC != destB) { | |
685 | move(srcB, destB); | |
686 | setupTwoStubArgsGPR<destA, destC>(srcA, srcC); | |
687 | return; | |
688 | } | |
689 | ||
690 | // If neither of srcA/srcB are in our way, then we can move srcC into place. | |
691 | // Then we can use setupTwoStubArgs to fix srcA/srcB. | |
692 | if (srcA != destC && srcB != destC) { | |
693 | move(srcC, destC); | |
694 | setupTwoStubArgsGPR<destA, destB>(srcA, srcB); | |
695 | return; | |
696 | } | |
697 | ||
698 | // If we get here, we haven't been able to move any of srcA/srcB/srcC. | |
699 | // Since all three are blocked, then all three must already be in the argument register. | |
700 | // But are they in the right ones? | |
701 | ||
702 | // First, ensure srcA is in place. | |
703 | if (srcA != destA) { | |
704 | swap(srcA, destA); | |
705 | ||
706 | // If srcA wasn't in argumentGPR1, one of srcB/srcC must be. | |
707 | ASSERT(srcB == destA || srcC == destA); | |
708 | // If srcB was in argumentGPR1 it no longer is (due to the swap). | |
709 | // Otherwise srcC must have been. Mark him as moved. | |
710 | if (srcB == destA) | |
711 | srcB = srcA; | |
712 | else | |
713 | srcC = srcA; | |
714 | } | |
715 | ||
716 | // Either srcB & srcC need swapping, or we're all done. | |
717 | ASSERT((srcB == destB || srcC == destC) | |
718 | || (srcB == destC || srcC == destB)); | |
719 | ||
720 | if (srcB != destB) | |
721 | swap(destB, destC); | |
722 | } | |
723 | ||
93a37866 | 724 | #if CPU(X86_64) || CPU(ARM64) |
6fe7ccc8 | 725 | template<FPRReg destA, FPRReg destB> |
81345200 | 726 | void setupTwoStubArgsFPR(FPRReg srcA, FPRReg srcB) |
6fe7ccc8 A |
727 | { |
728 | // Assuming that srcA != srcB, there are 7 interesting states the registers may be in: | |
729 | // (1) both are already in arg regs, the right way around. | |
730 | // (2) both are already in arg regs, the wrong way around. | |
731 | // (3) neither are currently in arg registers. | |
732 | // (4) srcA in in its correct reg. | |
733 | // (5) srcA in in the incorrect reg. | |
734 | // (6) srcB in in its correct reg. | |
735 | // (7) srcB in in the incorrect reg. | |
736 | // | |
737 | // The trivial approach is to simply emit two moves, to put srcA in place then srcB in | |
738 | // place (the MacroAssembler will omit redundant moves). This apporach will be safe in | |
739 | // cases 1, 3, 4, 5, 6, and in cases where srcA==srcB. The two problem cases are 2 | |
740 | // (requires a swap) and 7 (must move srcB first, to avoid trampling.) | |
741 | ||
742 | if (srcB != destA) { | |
743 | // Handle the easy cases - two simple moves. | |
744 | moveDouble(srcA, destA); | |
745 | moveDouble(srcB, destB); | |
746 | return; | |
747 | } | |
748 | ||
749 | if (srcA != destB) { | |
750 | // Handle the non-swap case - just put srcB in place first. | |
751 | moveDouble(srcB, destB); | |
752 | moveDouble(srcA, destA); | |
753 | return; | |
754 | } | |
755 | ||
756 | ASSERT(srcB == destA && srcA == destB); | |
757 | // Need to swap; pick a temporary register. | |
758 | FPRReg temp; | |
759 | if (destA != FPRInfo::argumentFPR3 && destA != FPRInfo::argumentFPR3) | |
760 | temp = FPRInfo::argumentFPR3; | |
761 | else if (destA != FPRInfo::argumentFPR2 && destA != FPRInfo::argumentFPR2) | |
762 | temp = FPRInfo::argumentFPR2; | |
763 | else { | |
764 | ASSERT(destA != FPRInfo::argumentFPR1 && destA != FPRInfo::argumentFPR1); | |
765 | temp = FPRInfo::argumentFPR1; | |
766 | } | |
767 | moveDouble(destA, temp); | |
768 | moveDouble(destB, destA); | |
769 | moveDouble(temp, destB); | |
770 | } | |
771 | #endif | |
772 | void setupStubArguments(GPRReg arg1, GPRReg arg2) | |
773 | { | |
81345200 | 774 | setupTwoStubArgsGPR<GPRInfo::argumentGPR1, GPRInfo::argumentGPR2>(arg1, arg2); |
6fe7ccc8 | 775 | } |
81345200 | 776 | |
6fe7ccc8 A |
777 | void setupStubArguments(GPRReg arg1, GPRReg arg2, GPRReg arg3) |
778 | { | |
81345200 | 779 | setupThreeStubArgsGPR<GPRInfo::argumentGPR1, GPRInfo::argumentGPR2, GPRInfo::argumentGPR3>(arg1, arg2, arg3); |
6fe7ccc8 A |
780 | } |
781 | ||
81345200 A |
782 | #if CPU(MIPS) || (OS(WINDOWS) && CPU(X86_64)) |
783 | #define POKE_ARGUMENT_OFFSET 4 | |
784 | #else | |
785 | #define POKE_ARGUMENT_OFFSET 0 | |
786 | #endif | |
787 | ||
93a37866 | 788 | #if CPU(X86_64) || CPU(ARM64) |
6fe7ccc8 A |
789 | ALWAYS_INLINE void setupArguments(FPRReg arg1) |
790 | { | |
791 | moveDouble(arg1, FPRInfo::argumentFPR0); | |
792 | } | |
793 | ||
794 | ALWAYS_INLINE void setupArguments(FPRReg arg1, FPRReg arg2) | |
795 | { | |
81345200 | 796 | setupTwoStubArgsFPR<FPRInfo::argumentFPR0, FPRInfo::argumentFPR1>(arg1, arg2); |
6fe7ccc8 | 797 | } |
93a37866 A |
798 | |
799 | ALWAYS_INLINE void setupArgumentsWithExecState(FPRReg arg1, GPRReg arg2) | |
800 | { | |
81345200 A |
801 | #if OS(WINDOWS) && CPU(X86_64) |
802 | // On Windows, arguments map to designated registers based on the argument positions, even when there are interlaced scalar and floating point arguments. | |
803 | // See http://msdn.microsoft.com/en-us/library/zthk2dkh.aspx | |
804 | moveDouble(arg1, FPRInfo::argumentFPR1); | |
805 | move(arg2, GPRInfo::argumentGPR2); | |
806 | #else | |
93a37866 A |
807 | moveDouble(arg1, FPRInfo::argumentFPR0); |
808 | move(arg2, GPRInfo::argumentGPR1); | |
81345200 | 809 | #endif |
93a37866 A |
810 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); |
811 | } | |
812 | ||
813 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, FPRReg arg3) | |
814 | { | |
81345200 A |
815 | #if OS(WINDOWS) && CPU(X86_64) |
816 | // On Windows, arguments map to designated registers based on the argument positions, even when there are interlaced scalar and floating point arguments. | |
817 | // See http://msdn.microsoft.com/en-us/library/zthk2dkh.aspx | |
818 | moveDouble(arg3, FPRInfo::argumentFPR3); | |
819 | #else | |
93a37866 | 820 | moveDouble(arg3, FPRInfo::argumentFPR0); |
81345200 | 821 | #endif |
93a37866 A |
822 | setupStubArguments(arg1, arg2); |
823 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
824 | } | |
825 | #elif CPU(ARM) | |
826 | #if CPU(ARM_HARDFP) | |
827 | ALWAYS_INLINE void setupArguments(FPRReg arg1) | |
828 | { | |
829 | moveDouble(arg1, FPRInfo::argumentFPR0); | |
830 | } | |
831 | ||
832 | ALWAYS_INLINE void setupArguments(FPRReg arg1, FPRReg arg2) | |
833 | { | |
834 | if (arg2 != FPRInfo::argumentFPR0) { | |
835 | moveDouble(arg1, FPRInfo::argumentFPR0); | |
836 | moveDouble(arg2, FPRInfo::argumentFPR1); | |
837 | } else if (arg1 != FPRInfo::argumentFPR1) { | |
838 | moveDouble(arg2, FPRInfo::argumentFPR1); | |
839 | moveDouble(arg1, FPRInfo::argumentFPR0); | |
840 | } else { | |
841 | // Swap arg1, arg2. | |
842 | moveDouble(FPRInfo::argumentFPR0, ARMRegisters::d2); | |
843 | moveDouble(FPRInfo::argumentFPR1, FPRInfo::argumentFPR0); | |
844 | moveDouble(ARMRegisters::d2, FPRInfo::argumentFPR1); | |
845 | } | |
846 | } | |
847 | ||
848 | ALWAYS_INLINE void setupArgumentsWithExecState(FPRReg arg1, GPRReg arg2) | |
849 | { | |
850 | moveDouble(arg1, FPRInfo::argumentFPR0); | |
851 | move(arg2, GPRInfo::argumentGPR1); | |
852 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
853 | } | |
854 | ||
855 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, FPRReg arg3) | |
856 | { | |
857 | moveDouble(arg3, FPRInfo::argumentFPR0); | |
858 | setupStubArguments(arg1, arg2); | |
859 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
860 | } | |
81345200 A |
861 | |
862 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32, FPRReg arg2, GPRReg arg3) | |
863 | { | |
864 | moveDouble(arg2, FPRInfo::argumentFPR0); | |
865 | move(arg3, GPRInfo::argumentGPR1); | |
866 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
867 | } | |
868 | ||
869 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, TrustedImm32, FPRReg arg4) | |
870 | { | |
871 | moveDouble(arg4, FPRInfo::argumentFPR0); | |
872 | setupStubArguments(arg1, arg2); | |
873 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
874 | } | |
875 | ||
6fe7ccc8 A |
876 | #else |
877 | ALWAYS_INLINE void setupArguments(FPRReg arg1) | |
878 | { | |
879 | assembler().vmov(GPRInfo::argumentGPR0, GPRInfo::argumentGPR1, arg1); | |
880 | } | |
881 | ||
882 | ALWAYS_INLINE void setupArguments(FPRReg arg1, FPRReg arg2) | |
883 | { | |
884 | assembler().vmov(GPRInfo::argumentGPR0, GPRInfo::argumentGPR1, arg1); | |
885 | assembler().vmov(GPRInfo::argumentGPR2, GPRInfo::argumentGPR3, arg2); | |
886 | } | |
93a37866 A |
887 | |
888 | ALWAYS_INLINE void setupArgumentsWithExecState(FPRReg arg1, GPRReg arg2) | |
889 | { | |
890 | move(arg2, GPRInfo::argumentGPR3); | |
891 | assembler().vmov(GPRInfo::argumentGPR1, GPRInfo::argumentGPR2, arg1); | |
892 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
893 | } | |
894 | ||
895 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, FPRReg arg3) | |
896 | { | |
897 | setupStubArguments(arg1, arg2); | |
898 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
899 | assembler().vmov(GPRInfo::argumentGPR3, GPRInfo::nonArgGPR0, arg3); | |
900 | poke(GPRInfo::nonArgGPR0); | |
901 | } | |
81345200 A |
902 | |
903 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32 arg1, FPRReg arg2, GPRReg arg3) | |
904 | { | |
905 | poke(arg3, POKE_ARGUMENT_OFFSET); | |
906 | move(arg1, GPRInfo::argumentGPR1); | |
907 | assembler().vmov(GPRInfo::argumentGPR2, GPRInfo::argumentGPR3, arg2); | |
908 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
909 | } | |
910 | ||
911 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, TrustedImm32 arg3, FPRReg arg4) | |
912 | { | |
913 | setupStubArguments(arg1, arg2); | |
914 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
915 | move(arg3, GPRInfo::argumentGPR3); | |
916 | assembler().vmov(GPRInfo::nonArgGPR0, GPRInfo::nonArgGPR1, arg4); | |
917 | poke(GPRInfo::nonArgGPR0, POKE_ARGUMENT_OFFSET); | |
918 | poke(GPRInfo::nonArgGPR1, POKE_ARGUMENT_OFFSET + 1); | |
919 | } | |
920 | #endif // CPU(ARM_HARDFP) | |
921 | #elif CPU(MIPS) | |
922 | ALWAYS_INLINE void setupArguments(FPRReg arg1) | |
923 | { | |
924 | moveDouble(arg1, FPRInfo::argumentFPR0); | |
925 | } | |
926 | ||
927 | ALWAYS_INLINE void setupArguments(FPRReg arg1, FPRReg arg2) | |
928 | { | |
929 | if (arg2 != FPRInfo::argumentFPR0) { | |
930 | moveDouble(arg1, FPRInfo::argumentFPR0); | |
931 | moveDouble(arg2, FPRInfo::argumentFPR1); | |
932 | } else if (arg1 != FPRInfo::argumentFPR1) { | |
933 | moveDouble(arg2, FPRInfo::argumentFPR1); | |
934 | moveDouble(arg1, FPRInfo::argumentFPR0); | |
935 | } else { | |
936 | // Swap arg1, arg2. | |
937 | swapDouble(FPRInfo::argumentFPR0, FPRInfo::argumentFPR1); | |
938 | } | |
939 | } | |
940 | ||
941 | ALWAYS_INLINE void setupArgumentsWithExecState(FPRReg arg1, GPRReg arg2) | |
942 | { | |
943 | assembler().vmov(GPRInfo::argumentGPR2, GPRInfo::argumentGPR3, arg1); | |
944 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
945 | poke(arg2, 4); | |
946 | } | |
947 | ||
948 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, FPRReg arg3) | |
949 | { | |
950 | setupStubArguments(arg1, arg2); | |
951 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
952 | poke(arg3, 4); | |
953 | } | |
954 | ||
955 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32 arg1, FPRReg arg2, GPRReg arg3) | |
956 | { | |
957 | setupArgumentsWithExecState(arg2, arg3); | |
958 | } | |
959 | ||
960 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, TrustedImm32 arg3, FPRReg arg4) | |
961 | { | |
962 | setupArgumentsWithExecState(arg1, arg2, arg4); | |
963 | } | |
964 | #elif CPU(SH4) | |
93a37866 A |
965 | ALWAYS_INLINE void setupArguments(FPRReg arg1) |
966 | { | |
967 | moveDouble(arg1, FPRInfo::argumentFPR0); | |
968 | } | |
969 | ||
970 | ALWAYS_INLINE void setupArguments(FPRReg arg1, FPRReg arg2) | |
971 | { | |
972 | if (arg2 != FPRInfo::argumentFPR0) { | |
973 | moveDouble(arg1, FPRInfo::argumentFPR0); | |
974 | moveDouble(arg2, FPRInfo::argumentFPR1); | |
975 | } else if (arg1 != FPRInfo::argumentFPR1) { | |
976 | moveDouble(arg2, FPRInfo::argumentFPR1); | |
977 | moveDouble(arg1, FPRInfo::argumentFPR0); | |
81345200 | 978 | } else |
93a37866 | 979 | swapDouble(FPRInfo::argumentFPR0, FPRInfo::argumentFPR1); |
93a37866 A |
980 | } |
981 | ||
982 | ALWAYS_INLINE void setupArgumentsWithExecState(FPRReg arg1, GPRReg arg2) | |
983 | { | |
81345200 A |
984 | moveDouble(arg1, FPRInfo::argumentFPR0); |
985 | move(arg2, GPRInfo::argumentGPR1); | |
93a37866 | 986 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); |
93a37866 A |
987 | } |
988 | ||
989 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, FPRReg arg3) | |
990 | { | |
81345200 | 991 | moveDouble(arg3, FPRInfo::argumentFPR0); |
93a37866 A |
992 | setupStubArguments(arg1, arg2); |
993 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
93a37866 A |
994 | } |
995 | #else | |
81345200 | 996 | #error "JIT not supported on this platform." |
6fe7ccc8 A |
997 | #endif |
998 | ||
999 | ALWAYS_INLINE void setupArguments(GPRReg arg1) | |
1000 | { | |
1001 | move(arg1, GPRInfo::argumentGPR0); | |
1002 | } | |
1003 | ||
81345200 A |
1004 | ALWAYS_INLINE void setupArguments(TrustedImmPtr arg1, GPRReg arg2) |
1005 | { | |
1006 | move(arg2, GPRInfo::argumentGPR1); | |
1007 | move(arg1, GPRInfo::argumentGPR0); | |
1008 | } | |
1009 | ||
6fe7ccc8 A |
1010 | ALWAYS_INLINE void setupArguments(GPRReg arg1, GPRReg arg2) |
1011 | { | |
81345200 A |
1012 | setupTwoStubArgsGPR<GPRInfo::argumentGPR0, GPRInfo::argumentGPR1>(arg1, arg2); |
1013 | } | |
1014 | ||
1015 | ALWAYS_INLINE void setupArguments(GPRReg arg1, GPRReg arg2, GPRReg arg3) | |
1016 | { | |
1017 | setupThreeStubArgsGPR<GPRInfo::argumentGPR0, GPRInfo::argumentGPR1, GPRInfo::argumentGPR2>(arg1, arg2, arg3); | |
1018 | } | |
1019 | ||
1020 | ALWAYS_INLINE void setupArguments(GPRReg arg1, GPRReg arg2, TrustedImmPtr arg3, TrustedImmPtr arg4) | |
1021 | { | |
1022 | setupTwoStubArgsGPR<GPRInfo::argumentGPR0, GPRInfo::argumentGPR1>(arg1, arg2); | |
1023 | move(arg3, GPRInfo::argumentGPR2); | |
1024 | move(arg4, GPRInfo::argumentGPR3); | |
6fe7ccc8 | 1025 | } |
93a37866 | 1026 | |
81345200 A |
1027 | ALWAYS_INLINE void setupArguments(GPRReg arg1, GPRReg arg2, GPRReg arg3, TrustedImmPtr arg4) |
1028 | { | |
1029 | setupThreeStubArgsGPR<GPRInfo::argumentGPR0, GPRInfo::argumentGPR1, GPRInfo::argumentGPR2>(arg1, arg2, arg3); | |
1030 | move(arg4, GPRInfo::argumentGPR3); | |
1031 | } | |
1032 | ||
1033 | ALWAYS_INLINE void setupArguments(GPRReg arg1, TrustedImmPtr arg2, GPRReg arg3, TrustedImmPtr arg4) | |
1034 | { | |
1035 | setupTwoStubArgsGPR<GPRInfo::argumentGPR0, GPRInfo::argumentGPR2>(arg1, arg3); | |
1036 | move(arg2, GPRInfo::argumentGPR1); | |
1037 | move(arg4, GPRInfo::argumentGPR3); | |
1038 | } | |
1039 | ||
1040 | ALWAYS_INLINE void setupArguments(GPRReg arg1, GPRReg arg2, TrustedImmPtr arg3, TrustedImm32 arg4, GPRReg arg5, GPRReg arg6) | |
1041 | { | |
1042 | poke(arg6, POKE_ARGUMENT_OFFSET + 1); | |
1043 | poke(arg5, POKE_ARGUMENT_OFFSET); | |
1044 | setupTwoStubArgsGPR<GPRInfo::argumentGPR0, GPRInfo::argumentGPR1>(arg1, arg2); | |
1045 | move(arg3, GPRInfo::argumentGPR2); | |
1046 | move(arg4, GPRInfo::argumentGPR3); | |
1047 | } | |
1048 | ||
93a37866 A |
1049 | ALWAYS_INLINE void setupArguments(TrustedImmPtr arg1) |
1050 | { | |
1051 | move(arg1, GPRInfo::argumentGPR0); | |
1052 | } | |
6fe7ccc8 A |
1053 | |
1054 | ALWAYS_INLINE void setupArgumentsExecState() | |
1055 | { | |
1056 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1057 | } | |
1058 | ||
1059 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1) | |
1060 | { | |
1061 | move(arg1, GPRInfo::argumentGPR1); | |
1062 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1063 | } | |
1064 | ||
1065 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1) | |
1066 | { | |
1067 | move(arg1, GPRInfo::argumentGPR1); | |
1068 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1069 | } | |
1070 | ||
93a37866 A |
1071 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32 arg1) |
1072 | { | |
1073 | move(arg1, GPRInfo::argumentGPR1); | |
1074 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1075 | } | |
1076 | ||
81345200 A |
1077 | #if OS(WINDOWS) && CPU(X86_64) |
1078 | ALWAYS_INLINE void setupArgumentsWithExecStateForCallWithSlowPathReturnType(TrustedImm32 arg1) | |
1079 | { | |
1080 | move(arg1, GPRInfo::argumentGPR2); | |
1081 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR1); | |
1082 | } | |
1083 | #endif | |
1084 | ||
6fe7ccc8 A |
1085 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2) |
1086 | { | |
1087 | setupStubArguments(arg1, arg2); | |
1088 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1089 | } | |
1090 | ||
1091 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, TrustedImmPtr arg2) | |
1092 | { | |
1093 | move(arg1, GPRInfo::argumentGPR1); | |
1094 | move(arg2, GPRInfo::argumentGPR2); | |
1095 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1096 | } | |
93a37866 A |
1097 | #if CPU(X86_64) || CPU(ARM64) |
1098 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, TrustedImm64 arg2) | |
1099 | { | |
1100 | move(arg1, GPRInfo::argumentGPR1); | |
1101 | move(arg2, GPRInfo::argumentGPR2); | |
1102 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1103 | } | |
1104 | ||
1105 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm64 arg1, GPRReg arg2) | |
1106 | { | |
1107 | move(arg2, GPRInfo::argumentGPR2); // Move this first, so setting arg1 does not trample! | |
1108 | move(arg1, GPRInfo::argumentGPR1); | |
1109 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1110 | } | |
1111 | #endif | |
1112 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, TrustedImm32 arg2) | |
1113 | { | |
1114 | move(arg1, GPRInfo::argumentGPR1); | |
1115 | move(arg2, GPRInfo::argumentGPR2); | |
1116 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1117 | } | |
6fe7ccc8 A |
1118 | |
1119 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, ImmPtr arg2) | |
1120 | { | |
1121 | move(arg1, GPRInfo::argumentGPR1); | |
1122 | move(arg2, GPRInfo::argumentGPR2); | |
1123 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1124 | } | |
1125 | ||
1126 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1, GPRReg arg2) | |
1127 | { | |
1128 | move(arg2, GPRInfo::argumentGPR2); // Move this first, so setting arg1 does not trample! | |
1129 | move(arg1, GPRInfo::argumentGPR1); | |
1130 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1131 | } | |
1132 | ||
93a37866 A |
1133 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32 arg1, GPRReg arg2) |
1134 | { | |
1135 | move(arg2, GPRInfo::argumentGPR2); // Move this first, so setting arg1 does not trample! | |
1136 | move(arg1, GPRInfo::argumentGPR1); | |
1137 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1138 | } | |
1139 | ||
6fe7ccc8 A |
1140 | ALWAYS_INLINE void setupArgumentsWithExecState(ImmPtr arg1, GPRReg arg2) |
1141 | { | |
1142 | move(arg2, GPRInfo::argumentGPR2); // Move this first, so setting arg1 does not trample! | |
1143 | move(arg1, GPRInfo::argumentGPR1); | |
1144 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1145 | } | |
1146 | ||
1147 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32 arg1, TrustedImm32 arg2) | |
1148 | { | |
1149 | move(arg1, GPRInfo::argumentGPR1); | |
1150 | move(arg2, GPRInfo::argumentGPR2); | |
1151 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1152 | } | |
1153 | ||
1154 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1, TrustedImmPtr arg2) | |
1155 | { | |
1156 | move(arg1, GPRInfo::argumentGPR1); | |
1157 | move(arg2, GPRInfo::argumentGPR2); | |
1158 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1159 | } | |
1160 | ||
93a37866 A |
1161 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1, TrustedImm32 arg2) |
1162 | { | |
1163 | move(arg1, GPRInfo::argumentGPR1); | |
1164 | move(arg2, GPRInfo::argumentGPR2); | |
1165 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1166 | } | |
1167 | ||
81345200 A |
1168 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1, TrustedImm32 arg2, TrustedImm32 arg3) |
1169 | { | |
1170 | move(arg1, GPRInfo::argumentGPR1); | |
1171 | move(arg2, GPRInfo::argumentGPR2); | |
1172 | move(arg3, GPRInfo::argumentGPR3); | |
1173 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1174 | } | |
1175 | ||
6fe7ccc8 A |
1176 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, GPRReg arg3) |
1177 | { | |
1178 | setupStubArguments(arg1, arg2, arg3); | |
1179 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1180 | } | |
1181 | ||
1182 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, TrustedImm32 arg3) | |
1183 | { | |
1184 | setupStubArguments(arg1, arg2); | |
1185 | move(arg3, GPRInfo::argumentGPR3); | |
1186 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1187 | } | |
1188 | ||
93a37866 A |
1189 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, TrustedImm32 arg2, GPRReg arg3) |
1190 | { | |
81345200 A |
1191 | setupTwoStubArgsGPR<GPRInfo::argumentGPR1, GPRInfo::argumentGPR3>(arg1, arg3); |
1192 | move(arg2, GPRInfo::argumentGPR2); | |
1193 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1194 | } | |
1195 | ||
1196 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, TrustedImmPtr arg2, GPRReg arg3) | |
1197 | { | |
1198 | setupTwoStubArgsGPR<GPRInfo::argumentGPR1, GPRInfo::argumentGPR3>(arg1, arg3); | |
93a37866 A |
1199 | move(arg2, GPRInfo::argumentGPR2); |
1200 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1201 | } | |
1202 | ||
6fe7ccc8 A |
1203 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, TrustedImm32 arg2, TrustedImmPtr arg3) |
1204 | { | |
1205 | move(arg1, GPRInfo::argumentGPR1); | |
1206 | move(arg2, GPRInfo::argumentGPR2); | |
1207 | move(arg3, GPRInfo::argumentGPR3); | |
1208 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1209 | } | |
1210 | ||
93a37866 A |
1211 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, TrustedImmPtr arg2, TrustedImm32 arg3) |
1212 | { | |
1213 | move(arg1, GPRInfo::argumentGPR1); | |
1214 | move(arg2, GPRInfo::argumentGPR2); | |
1215 | move(arg3, GPRInfo::argumentGPR3); | |
1216 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1217 | } | |
81345200 A |
1218 | |
1219 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, TrustedImm32 arg2, TrustedImm32 arg3) | |
1220 | { | |
1221 | move(arg1, GPRInfo::argumentGPR1); | |
1222 | move(arg2, GPRInfo::argumentGPR2); | |
1223 | move(arg3, GPRInfo::argumentGPR3); | |
1224 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1225 | } | |
93a37866 | 1226 | |
6fe7ccc8 A |
1227 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, TrustedImmPtr arg2, TrustedImmPtr arg3) |
1228 | { | |
1229 | move(arg1, GPRInfo::argumentGPR1); | |
1230 | move(arg2, GPRInfo::argumentGPR2); | |
1231 | move(arg3, GPRInfo::argumentGPR3); | |
1232 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1233 | } | |
1234 | ||
1235 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, TrustedImmPtr arg3) | |
1236 | { | |
1237 | setupStubArguments(arg1, arg2); | |
1238 | move(arg3, GPRInfo::argumentGPR3); | |
1239 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1240 | } | |
1241 | ||
1242 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32 arg1, TrustedImm32 arg2, GPRReg arg3) | |
93a37866 A |
1243 | { |
1244 | move(arg3, GPRInfo::argumentGPR3); | |
1245 | move(arg1, GPRInfo::argumentGPR1); | |
1246 | move(arg2, GPRInfo::argumentGPR2); | |
1247 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1248 | } | |
1249 | ||
1250 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32 arg1, TrustedImmPtr arg2, GPRReg arg3) | |
1251 | { | |
1252 | move(arg3, GPRInfo::argumentGPR3); | |
1253 | move(arg1, GPRInfo::argumentGPR1); | |
1254 | move(arg2, GPRInfo::argumentGPR2); | |
1255 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1256 | } | |
1257 | ||
1258 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32 arg1, GPRReg arg2, TrustedImm32 arg3) | |
1259 | { | |
1260 | move(arg2, GPRInfo::argumentGPR2); | |
1261 | move(arg1, GPRInfo::argumentGPR1); | |
1262 | move(arg3, GPRInfo::argumentGPR3); | |
1263 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1264 | } | |
1265 | ||
1266 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32 arg1, GPRReg arg2, GPRReg arg3) | |
1267 | { | |
81345200 A |
1268 | setupTwoStubArgsGPR<GPRInfo::argumentGPR2, GPRInfo::argumentGPR3>(arg2, arg3); |
1269 | move(arg1, GPRInfo::argumentGPR1); | |
1270 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1271 | } | |
1272 | ||
1273 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1, GPRReg arg2, GPRReg arg3) | |
1274 | { | |
1275 | setupTwoStubArgsGPR<GPRInfo::argumentGPR2, GPRInfo::argumentGPR3>(arg2, arg3); | |
1276 | move(arg1, GPRInfo::argumentGPR1); | |
1277 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1278 | } | |
1279 | ||
1280 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1, GPRReg arg2, TrustedImm32 arg3) | |
1281 | { | |
1282 | move(arg2, GPRInfo::argumentGPR2); // In case arg2 is argumentGPR1. | |
1283 | move(arg1, GPRInfo::argumentGPR1); | |
1284 | move(arg3, GPRInfo::argumentGPR3); | |
1285 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1286 | } | |
1287 | ||
1288 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1, GPRReg arg2, TrustedImmPtr arg3) | |
1289 | { | |
1290 | move(arg2, GPRInfo::argumentGPR2); // In case arg2 is argumentGPR1. | |
1291 | move(arg1, GPRInfo::argumentGPR1); | |
1292 | move(arg3, GPRInfo::argumentGPR3); | |
1293 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1294 | } | |
1295 | ||
1296 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1, TrustedImmPtr arg2, TrustedImm32 arg3) | |
1297 | { | |
93a37866 | 1298 | move(arg1, GPRInfo::argumentGPR1); |
81345200 A |
1299 | move(arg2, GPRInfo::argumentGPR2); |
1300 | move(arg3, GPRInfo::argumentGPR3); | |
93a37866 A |
1301 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); |
1302 | } | |
1303 | ||
1304 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1, TrustedImmPtr arg2, TrustedImmPtr arg3) | |
1305 | { | |
1306 | move(arg1, GPRInfo::argumentGPR1); | |
1307 | move(arg2, GPRInfo::argumentGPR2); | |
1308 | move(arg3, GPRInfo::argumentGPR3); | |
1309 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1310 | } | |
1311 | ||
1312 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32 arg1, TrustedImm32 arg2, TrustedImm32 arg3) | |
6fe7ccc8 A |
1313 | { |
1314 | move(arg1, GPRInfo::argumentGPR1); | |
1315 | move(arg2, GPRInfo::argumentGPR2); | |
1316 | move(arg3, GPRInfo::argumentGPR3); | |
1317 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1318 | } | |
1319 | ||
1320 | #endif // NUMBER_OF_ARGUMENT_REGISTERS >= 4 | |
1321 | // These methods are suitable for any calling convention that provides for | |
1322 | // exactly 4 argument registers, e.g. ARMv7. | |
1323 | #if NUMBER_OF_ARGUMENT_REGISTERS == 4 | |
93a37866 | 1324 | |
6fe7ccc8 A |
1325 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, GPRReg arg3, GPRReg arg4) |
1326 | { | |
93a37866 A |
1327 | poke(arg4, POKE_ARGUMENT_OFFSET); |
1328 | setupArgumentsWithExecState(arg1, arg2, arg3); | |
1329 | } | |
1330 | ||
1331 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, GPRReg arg3, TrustedImm32 arg4) | |
1332 | { | |
1333 | poke(arg4, POKE_ARGUMENT_OFFSET); | |
1334 | setupArgumentsWithExecState(arg1, arg2, arg3); | |
1335 | } | |
1336 | ||
81345200 A |
1337 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, TrustedImmPtr arg2, GPRReg arg3, GPRReg arg4) |
1338 | { | |
1339 | poke(arg4, POKE_ARGUMENT_OFFSET); | |
1340 | setupArgumentsWithExecState(arg1, arg2, arg3); | |
1341 | } | |
1342 | ||
93a37866 A |
1343 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, TrustedImmPtr arg2, TrustedImm32 arg3, GPRReg arg4) |
1344 | { | |
1345 | poke(arg4, POKE_ARGUMENT_OFFSET); | |
1346 | setupArgumentsWithExecState(arg1, arg2, arg3); | |
1347 | } | |
1348 | ||
81345200 A |
1349 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1, GPRReg arg2, GPRReg arg3, TrustedImm32 arg4) |
1350 | { | |
1351 | poke(arg4, POKE_ARGUMENT_OFFSET); | |
1352 | setupArgumentsWithExecState(arg1, arg2, arg3); | |
1353 | } | |
1354 | ||
1355 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1, GPRReg arg2, GPRReg arg3, TrustedImmPtr arg4) | |
1356 | { | |
1357 | poke(arg4, POKE_ARGUMENT_OFFSET); | |
1358 | setupArgumentsWithExecState(arg1, arg2, arg3); | |
1359 | } | |
1360 | ||
1361 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1, GPRReg arg2, TrustedImm32 arg3, TrustedImmPtr arg4) | |
1362 | { | |
1363 | poke(arg4, POKE_ARGUMENT_OFFSET); | |
1364 | setupArgumentsWithExecState(arg1, arg2, arg3); | |
1365 | } | |
1366 | ||
1367 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1, GPRReg arg2, GPRReg arg3, TrustedImm32 arg4, TrustedImmPtr arg5) | |
1368 | { | |
1369 | poke(arg5, POKE_ARGUMENT_OFFSET + 1); | |
1370 | poke(arg4, POKE_ARGUMENT_OFFSET); | |
1371 | setupArgumentsWithExecState(arg1, arg2, arg3); | |
1372 | } | |
1373 | ||
93a37866 A |
1374 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, TrustedImmPtr arg2, TrustedImm32 arg3, GPRReg arg4, GPRReg arg5) |
1375 | { | |
1376 | poke(arg5, POKE_ARGUMENT_OFFSET + 1); | |
1377 | poke(arg4, POKE_ARGUMENT_OFFSET); | |
6fe7ccc8 A |
1378 | setupArgumentsWithExecState(arg1, arg2, arg3); |
1379 | } | |
1380 | ||
1381 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, TrustedImm32 arg3, TrustedImm32 arg4) | |
1382 | { | |
93a37866 | 1383 | poke(arg4, POKE_ARGUMENT_OFFSET); |
6fe7ccc8 A |
1384 | setupArgumentsWithExecState(arg1, arg2, arg3); |
1385 | } | |
1386 | ||
81345200 A |
1387 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, TrustedImm32 arg3, TrustedImm32 arg4, TrustedImm32 arg5) |
1388 | { | |
1389 | poke(arg5, POKE_ARGUMENT_OFFSET + 1); | |
1390 | poke(arg4, POKE_ARGUMENT_OFFSET); | |
1391 | setupArgumentsWithExecState(arg1, arg2, arg3); | |
1392 | } | |
1393 | ||
6fe7ccc8 A |
1394 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32 arg1, TrustedImm32 arg2, GPRReg arg3, GPRReg arg4) |
1395 | { | |
93a37866 | 1396 | poke(arg4, POKE_ARGUMENT_OFFSET); |
6fe7ccc8 A |
1397 | setupArgumentsWithExecState(arg1, arg2, arg3); |
1398 | } | |
1399 | ||
1400 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, GPRReg arg3, TrustedImmPtr arg4) | |
1401 | { | |
93a37866 | 1402 | poke(arg4, POKE_ARGUMENT_OFFSET); |
6fe7ccc8 A |
1403 | setupArgumentsWithExecState(arg1, arg2, arg3); |
1404 | } | |
1405 | ||
1406 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, GPRReg arg3, GPRReg arg4, GPRReg arg5) | |
1407 | { | |
93a37866 A |
1408 | poke(arg5, POKE_ARGUMENT_OFFSET + 1); |
1409 | poke(arg4, POKE_ARGUMENT_OFFSET); | |
6fe7ccc8 A |
1410 | setupArgumentsWithExecState(arg1, arg2, arg3); |
1411 | } | |
93a37866 | 1412 | |
81345200 A |
1413 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, GPRReg arg3, GPRReg arg4, TrustedImm32 arg5) |
1414 | { | |
1415 | poke(arg5, POKE_ARGUMENT_OFFSET + 1); | |
1416 | poke(arg4, POKE_ARGUMENT_OFFSET); | |
1417 | setupArgumentsWithExecState(arg1, arg2, arg3); | |
1418 | } | |
1419 | ||
93a37866 A |
1420 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32 arg1, GPRReg arg2, GPRReg arg3, GPRReg arg4) |
1421 | { | |
1422 | poke(arg4, POKE_ARGUMENT_OFFSET); | |
1423 | setupArgumentsWithExecState(arg1, arg2, arg3); | |
1424 | } | |
1425 | ||
1426 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32 arg1, GPRReg arg2, GPRReg arg3, TrustedImmPtr arg4) | |
1427 | { | |
1428 | poke(arg4, POKE_ARGUMENT_OFFSET); | |
1429 | setupArgumentsWithExecState(arg1, arg2, arg3); | |
1430 | } | |
1431 | ||
1432 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32 arg1, GPRReg arg2, TrustedImm32 arg3, TrustedImmPtr arg4) | |
1433 | { | |
1434 | poke(arg4, POKE_ARGUMENT_OFFSET); | |
1435 | setupArgumentsWithExecState(arg1, arg2, arg3); | |
1436 | } | |
1437 | ||
1438 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32 arg1, GPRReg arg2, TrustedImm32 arg3, GPRReg arg4) | |
1439 | { | |
1440 | poke(arg4, POKE_ARGUMENT_OFFSET); | |
1441 | setupArgumentsWithExecState(arg1, arg2, arg3); | |
1442 | } | |
1443 | ||
81345200 A |
1444 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32 arg1, GPRReg arg2, GPRReg arg3, TrustedImm32 arg4) |
1445 | { | |
1446 | poke(arg4, POKE_ARGUMENT_OFFSET); | |
1447 | setupArgumentsWithExecState(arg1, arg2, arg3); | |
1448 | } | |
1449 | ||
1450 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, TrustedImm32 arg3, TrustedImmPtr arg4) | |
1451 | { | |
1452 | poke(arg4, POKE_ARGUMENT_OFFSET); | |
1453 | setupArgumentsWithExecState(arg1, arg2, arg3); | |
1454 | } | |
1455 | ||
93a37866 A |
1456 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, TrustedImm32 arg3, GPRReg arg4, GPRReg arg5) |
1457 | { | |
1458 | poke(arg5, POKE_ARGUMENT_OFFSET + 1); | |
1459 | poke(arg4, POKE_ARGUMENT_OFFSET); | |
1460 | setupArgumentsWithExecState(arg1, arg2, arg3); | |
1461 | } | |
1462 | ||
1463 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, TrustedImm32 arg3, GPRReg arg4, TrustedImm32 arg5) | |
1464 | { | |
1465 | poke(arg5, POKE_ARGUMENT_OFFSET + 1); | |
1466 | poke(arg4, POKE_ARGUMENT_OFFSET); | |
1467 | setupArgumentsWithExecState(arg1, arg2, arg3); | |
1468 | } | |
1469 | ||
1470 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32 arg1, GPRReg arg2, GPRReg arg3, GPRReg arg4, TrustedImmPtr arg5) | |
1471 | { | |
1472 | poke(arg5, POKE_ARGUMENT_OFFSET + 1); | |
1473 | poke(arg4, POKE_ARGUMENT_OFFSET); | |
1474 | setupArgumentsWithExecState(arg1, arg2, arg3); | |
1475 | } | |
1476 | ||
1477 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32 arg1, GPRReg arg2, GPRReg arg3, TrustedImm32 arg4, TrustedImm32 arg5) | |
1478 | { | |
1479 | poke(arg5, POKE_ARGUMENT_OFFSET + 1); | |
1480 | poke(arg4, POKE_ARGUMENT_OFFSET); | |
1481 | setupArgumentsWithExecState(arg1, arg2, arg3); | |
1482 | } | |
1483 | ||
81345200 A |
1484 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1, GPRReg arg2, TrustedImm32 arg3, GPRReg arg4, GPRReg arg5) |
1485 | { | |
1486 | poke(arg5, POKE_ARGUMENT_OFFSET + 1); | |
1487 | poke(arg4, POKE_ARGUMENT_OFFSET); | |
1488 | setupArgumentsWithExecState(arg1, arg2, arg3); | |
1489 | } | |
1490 | ||
93a37866 A |
1491 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32 arg1, TrustedImm32 arg2, TrustedImm32 arg3, GPRReg arg4, GPRReg arg5) |
1492 | { | |
1493 | poke(arg5, POKE_ARGUMENT_OFFSET + 1); | |
1494 | poke(arg4, POKE_ARGUMENT_OFFSET); | |
1495 | setupArgumentsWithExecState(arg1, arg2, arg3); | |
1496 | } | |
1497 | ||
1498 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32 arg1, GPRReg arg2, GPRReg arg3, GPRReg arg4, GPRReg arg5) | |
1499 | { | |
1500 | poke(arg5, POKE_ARGUMENT_OFFSET + 1); | |
1501 | poke(arg4, POKE_ARGUMENT_OFFSET); | |
1502 | setupArgumentsWithExecState(arg1, arg2, arg3); | |
1503 | } | |
1504 | ||
81345200 A |
1505 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, TrustedImmPtr arg3, GPRReg arg4, TrustedImm32 arg5) |
1506 | { | |
1507 | poke(arg5, POKE_ARGUMENT_OFFSET + 1); | |
1508 | poke(arg4, POKE_ARGUMENT_OFFSET); | |
1509 | setupArgumentsWithExecState(arg1, arg2, arg3); | |
1510 | } | |
1511 | ||
1512 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, GPRReg arg3, GPRReg arg4, GPRReg arg5, GPRReg arg6) | |
1513 | { | |
1514 | poke(arg6, POKE_ARGUMENT_OFFSET + 2); | |
1515 | poke(arg5, POKE_ARGUMENT_OFFSET + 1); | |
1516 | poke(arg4, POKE_ARGUMENT_OFFSET); | |
1517 | setupArgumentsWithExecState(arg1, arg2, arg3); | |
1518 | } | |
1519 | ||
1520 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, GPRReg arg3, GPRReg arg4, GPRReg arg5, TrustedImm32 arg6) | |
1521 | { | |
1522 | poke(arg6, POKE_ARGUMENT_OFFSET + 2); | |
1523 | poke(arg5, POKE_ARGUMENT_OFFSET + 1); | |
1524 | poke(arg4, POKE_ARGUMENT_OFFSET); | |
1525 | setupArgumentsWithExecState(arg1, arg2, arg3); | |
1526 | } | |
1527 | ||
1528 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, TrustedImm32 arg3, GPRReg arg4, GPRReg arg5, TrustedImm32 arg6) | |
1529 | { | |
1530 | poke(arg6, POKE_ARGUMENT_OFFSET + 2); | |
1531 | poke(arg5, POKE_ARGUMENT_OFFSET + 1); | |
1532 | poke(arg4, POKE_ARGUMENT_OFFSET); | |
1533 | setupArgumentsWithExecState(arg1, arg2, arg3); | |
1534 | } | |
1535 | ||
1536 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, TrustedImmPtr arg3, GPRReg arg4, GPRReg arg5) | |
1537 | { | |
1538 | poke(arg5, POKE_ARGUMENT_OFFSET + 1); | |
1539 | poke(arg4, POKE_ARGUMENT_OFFSET); | |
1540 | setupArgumentsWithExecState(arg1, arg2, arg3); | |
1541 | } | |
1542 | ||
1543 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, TrustedImm32 arg3, GPRReg arg4, TrustedImm32 arg5, TrustedImmPtr arg6) | |
1544 | { | |
1545 | poke(arg6, POKE_ARGUMENT_OFFSET + 2); | |
1546 | poke(arg5, POKE_ARGUMENT_OFFSET + 1); | |
1547 | poke(arg4, POKE_ARGUMENT_OFFSET); | |
1548 | setupArgumentsWithExecState(arg1, arg2, arg3); | |
1549 | } | |
1550 | ||
1551 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1, GPRReg arg2, GPRReg arg3, GPRReg arg4, GPRReg arg5, TrustedImmPtr arg6) | |
1552 | { | |
1553 | poke(arg6, POKE_ARGUMENT_OFFSET + 2); | |
1554 | poke(arg5, POKE_ARGUMENT_OFFSET + 1); | |
1555 | poke(arg4, POKE_ARGUMENT_OFFSET); | |
1556 | setupArgumentsWithExecState(arg1, arg2, arg3); | |
1557 | } | |
1558 | ||
1559 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1, GPRReg arg2, GPRReg arg3, GPRReg arg4, TrustedImm32 arg5, TrustedImmPtr arg6) | |
1560 | { | |
1561 | poke(arg6, POKE_ARGUMENT_OFFSET + 2); | |
1562 | poke(arg5, POKE_ARGUMENT_OFFSET + 1); | |
1563 | poke(arg4, POKE_ARGUMENT_OFFSET); | |
1564 | setupArgumentsWithExecState(arg1, arg2, arg3); | |
1565 | } | |
1566 | ||
1567 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32 arg1, GPRReg arg2, GPRReg arg3, GPRReg arg4, GPRReg arg5, TrustedImm32 arg6) | |
1568 | { | |
1569 | poke(arg6, POKE_ARGUMENT_OFFSET + 2); | |
1570 | poke(arg5, POKE_ARGUMENT_OFFSET + 1); | |
1571 | poke(arg4, POKE_ARGUMENT_OFFSET); | |
1572 | setupArgumentsWithExecState(arg1, arg2, arg3); | |
1573 | } | |
1574 | ||
1575 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32 arg1, GPRReg arg2, GPRReg arg3, TrustedImm32 arg4, GPRReg arg5, GPRReg arg6) | |
1576 | { | |
1577 | poke(arg6, POKE_ARGUMENT_OFFSET + 2); | |
1578 | poke(arg5, POKE_ARGUMENT_OFFSET + 1); | |
1579 | poke(arg4, POKE_ARGUMENT_OFFSET); | |
1580 | setupArgumentsWithExecState(arg1, arg2, arg3); | |
1581 | } | |
1582 | ||
1583 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32 arg1, GPRReg arg2, GPRReg arg3, GPRReg arg4, GPRReg arg5, GPRReg arg6, GPRReg arg7) | |
1584 | { | |
1585 | poke(arg7, POKE_ARGUMENT_OFFSET + 3); | |
1586 | poke(arg6, POKE_ARGUMENT_OFFSET + 2); | |
1587 | poke(arg5, POKE_ARGUMENT_OFFSET + 1); | |
1588 | poke(arg4, POKE_ARGUMENT_OFFSET); | |
1589 | setupArgumentsWithExecState(arg1, arg2, arg3); | |
1590 | } | |
1591 | ||
1592 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, TrustedImm32 arg3, GPRReg arg4, GPRReg arg5, GPRReg arg6, GPRReg arg7) | |
1593 | { | |
1594 | poke(arg7, POKE_ARGUMENT_OFFSET + 3); | |
1595 | poke(arg6, POKE_ARGUMENT_OFFSET + 2); | |
1596 | poke(arg5, POKE_ARGUMENT_OFFSET + 1); | |
1597 | poke(arg4, POKE_ARGUMENT_OFFSET); | |
1598 | setupArgumentsWithExecState(arg1, arg2, arg3); | |
1599 | } | |
1600 | ||
1601 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32 arg1, GPRReg arg2, GPRReg arg3, TrustedImm32 arg4, TrustedImm32 arg5, GPRReg arg6, GPRReg arg7) | |
1602 | { | |
1603 | poke(arg7, POKE_ARGUMENT_OFFSET + 3); | |
1604 | poke(arg6, POKE_ARGUMENT_OFFSET + 2); | |
1605 | poke(arg5, POKE_ARGUMENT_OFFSET + 1); | |
1606 | poke(arg4, POKE_ARGUMENT_OFFSET); | |
1607 | setupArgumentsWithExecState(arg1, arg2, arg3); | |
1608 | } | |
1609 | ||
1610 | ALWAYS_INLINE void setupArguments(GPRReg arg1, GPRReg arg2, TrustedImmPtr arg3, TrustedImm32 arg4, GPRReg arg5) | |
1611 | { | |
1612 | poke(arg5, POKE_ARGUMENT_OFFSET); | |
1613 | setupTwoStubArgsGPR<GPRInfo::argumentGPR0, GPRInfo::argumentGPR1>(arg1, arg2); | |
1614 | move(arg3, GPRInfo::argumentGPR2); | |
1615 | move(arg4, GPRInfo::argumentGPR3); | |
1616 | } | |
6fe7ccc8 A |
1617 | #endif // NUMBER_OF_ARGUMENT_REGISTERS == 4 |
1618 | ||
93a37866 | 1619 | #if NUMBER_OF_ARGUMENT_REGISTERS >= 5 |
81345200 A |
1620 | void setupStubArguments134(GPRReg arg1, GPRReg arg3, GPRReg arg4) |
1621 | { | |
1622 | setupThreeStubArgsGPR<GPRInfo::argumentGPR1, GPRInfo::argumentGPR3, GPRInfo::argumentGPR4>(arg1, arg3, arg4); | |
1623 | } | |
1624 | ||
93a37866 A |
1625 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, TrustedImmPtr arg2, TrustedImm32 arg3, GPRReg arg4) |
1626 | { | |
81345200 | 1627 | setupTwoStubArgsGPR<GPRInfo::argumentGPR1, GPRInfo::argumentGPR4>(arg1, arg4); |
93a37866 A |
1628 | move(arg2, GPRInfo::argumentGPR2); |
1629 | move(arg3, GPRInfo::argumentGPR3); | |
1630 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1631 | } | |
81345200 A |
1632 | |
1633 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, TrustedImmPtr arg2, GPRReg arg3, GPRReg arg4) | |
1634 | { | |
1635 | setupStubArguments134(arg1, arg3, arg4); | |
1636 | move(arg2, GPRInfo::argumentGPR2); | |
1637 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1638 | } | |
1639 | ||
1640 | ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImmPtr arg1, GPRReg arg2, GPRReg arg3, TrustedImmPtr arg4) | |
1641 | { | |
1642 | setupTwoStubArgsGPR<GPRInfo::argumentGPR2, GPRInfo::argumentGPR3>(arg2, arg3); | |
1643 | move(arg1, GPRInfo::argumentGPR1); | |
1644 | move(arg4, GPRInfo::argumentGPR4); | |
1645 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1646 | } | |
1647 | ||
1648 | ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, GPRReg arg3, TrustedImm32 arg4) | |
1649 | { | |
1650 | setupThreeStubArgsGPR<GPRInfo::argumentGPR1, GPRInfo::argumentGPR2, GPRInfo::argumentGPR3>(arg1, arg2, arg3); | |
1651 | move(arg4, GPRInfo::argumentGPR4); | |
1652 | move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); | |
1653 | } | |
1654 | ||
1655 | ALWAYS_INLINE void setupArguments(GPRReg arg1, TrustedImmPtr arg2, GPRReg arg3, GPRReg arg4, TrustedImmPtr arg5) | |
1656 | { | |
1657 | setupThreeStubArgsGPR<GPRInfo::argumentGPR0, GPRInfo::argumentGPR2, GPRInfo::argumentGPR3>(arg1, arg3, arg4); | |
1658 | move(arg2, GPRInfo::argumentGPR1); | |
1659 | move(arg5, GPRInfo::argumentGPR4); | |
1660 | } | |
1661 | ||
1662 | ALWAYS_INLINE void setupArguments(GPRReg arg1, GPRReg arg2, TrustedImmPtr arg3, TrustedImm32 arg4, GPRReg arg5) | |
1663 | { | |
1664 | setupThreeStubArgsGPR<GPRInfo::argumentGPR0, GPRInfo::argumentGPR1, GPRInfo::argumentGPR4>(arg1, arg2, arg5); | |
1665 | move(arg3, GPRInfo::argumentGPR2); | |
1666 | move(arg4, GPRInfo::argumentGPR3); | |
1667 | } | |
93a37866 A |
1668 | #endif |
1669 | ||
6fe7ccc8 A |
1670 | void setupResults(GPRReg destA, GPRReg destB) |
1671 | { | |
1672 | GPRReg srcA = GPRInfo::returnValueGPR; | |
1673 | GPRReg srcB = GPRInfo::returnValueGPR2; | |
1674 | ||
81345200 A |
1675 | if (destA == InvalidGPRReg) |
1676 | move(srcB, destB); | |
1677 | else if (destB == InvalidGPRReg) | |
1678 | move(srcA, destA); | |
1679 | else if (srcB != destA) { | |
6fe7ccc8 A |
1680 | // Handle the easy cases - two simple moves. |
1681 | move(srcA, destA); | |
1682 | move(srcB, destB); | |
1683 | } else if (srcA != destB) { | |
1684 | // Handle the non-swap case - just put srcB in place first. | |
1685 | move(srcB, destB); | |
1686 | move(srcA, destA); | |
1687 | } else | |
1688 | swap(destA, destB); | |
1689 | } | |
81345200 A |
1690 | |
1691 | void setupResults(JSValueRegs regs) | |
1692 | { | |
1693 | #if USE(JSVALUE64) | |
1694 | move(GPRInfo::returnValueGPR, regs.gpr()); | |
1695 | #else | |
1696 | setupResults(regs.payloadGPR(), regs.tagGPR()); | |
1697 | #endif | |
1698 | } | |
1699 | ||
1700 | void jumpToExceptionHandler() | |
1701 | { | |
1702 | // genericUnwind() leaves the handler CallFrame* in vm->callFrameForThrow, | |
1703 | // and the address of the handler in vm->targetMachinePCForThrow. | |
1704 | loadPtr(&vm()->targetMachinePCForThrow, GPRInfo::regT1); | |
1705 | jump(GPRInfo::regT1); | |
1706 | } | |
6fe7ccc8 A |
1707 | }; |
1708 | ||
81345200 | 1709 | } // namespace JSC |
6fe7ccc8 | 1710 | |
81345200 | 1711 | #endif // ENABLE(JIT) |
6fe7ccc8 | 1712 | |
81345200 | 1713 | #endif // CCallHelpers_h |
6fe7ccc8 | 1714 |