diff options
| author | Mike Pall <mike> | 2011-04-08 02:54:11 +0200 |
|---|---|---|
| committer | Mike Pall <mike> | 2011-04-08 02:54:11 +0200 |
| commit | aee129a7898a422ebed288b4110657908de8fb23 (patch) | |
| tree | 3cf9cbd2244f1044ed0eb2fa3475692a57291d3d /src | |
| parent | 16e0ecaf547c47eb8bf192cf6d606487759f746f (diff) | |
| download | luajit-aee129a7898a422ebed288b4110657908de8fb23.tar.gz luajit-aee129a7898a422ebed288b4110657908de8fb23.tar.bz2 luajit-aee129a7898a422ebed288b4110657908de8fb23.zip | |
ARM: Add tailcall instructions.
Diffstat (limited to 'src')
| -rw-r--r-- | src/buildvm_arm.dasc | 55 |
1 files changed, 53 insertions, 2 deletions
diff --git a/src/buildvm_arm.dasc b/src/buildvm_arm.dasc index 14a60fd3..f24d8190 100644 --- a/src/buildvm_arm.dasc +++ b/src/buildvm_arm.dasc | |||
| @@ -2334,10 +2334,61 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
| 2334 | break; | 2334 | break; |
| 2335 | 2335 | ||
| 2336 | case BC_CALLMT: | 2336 | case BC_CALLMT: |
| 2337 | | NYI | 2337 | | // RA = base*8, (RB = 0,) RC = extra_nargs |
| 2338 | | ldr CARG1, SAVE_MULTRES | ||
| 2339 | | add NARGS8:RC, CARG1, RC, lsl #3 | ||
| 2340 | | b ->BC_CALLT1_Z | ||
| 2338 | break; | 2341 | break; |
| 2339 | case BC_CALLT: | 2342 | case BC_CALLT: |
| 2340 | | NYI | 2343 | | lsl NARGS8:RC, RC, #3 |
| 2344 | | // RA = base*8, (RB = 0,) RC = (nargs+1)*8 | ||
| 2345 | |->BC_CALLT1_Z: | ||
| 2346 | | ldrd LFUNC:CARG34, [RA, BASE]! | ||
| 2347 | | sub NARGS8:RC, NARGS8:RC, #8 | ||
| 2348 | | add RA, RA, #8 | ||
| 2349 | | checkfunc CARG4, ->vmeta_callt | ||
| 2350 | | ldr PC, [BASE, FRAME_PC] | ||
| 2351 | |->BC_CALLT2_Z: | ||
| 2352 | | str LFUNC:CARG3, [BASE, FRAME_FUNC] // Copy function down, but keep PC. | ||
| 2353 | | ldrb CARG4, LFUNC:CARG3->ffid | ||
| 2354 | | tst PC, #FRAME_TYPE | ||
| 2355 | | bne >7 | ||
| 2356 | |1: | ||
| 2357 | | cmp NARGS8:RC, #0 | ||
| 2358 | | mov RB, #0 | ||
| 2359 | | beq >3 | ||
| 2360 | |2: | ||
| 2361 | | ldrd CARG12, [RA, RB] | ||
| 2362 | | add INS, RB, #8 | ||
| 2363 | | cmp INS, NARGS8:RC | ||
| 2364 | | strd CARG12, [BASE, RB] | ||
| 2365 | | mov RB, INS | ||
| 2366 | | bne <2 | ||
| 2367 | |3: | ||
| 2368 | | cmp CARG4, #1 // (> FF_C) Calling a fast function? | ||
| 2369 | | bhi >5 | ||
| 2370 | |4: | ||
| 2371 | | ins_callt | ||
| 2372 | | | ||
| 2373 | |5: // Tailcall to a fast function with a Lua frame below. | ||
| 2374 | | ldr INS, [PC, #-4] | ||
| 2375 | | decode_RA8 RA, INS | ||
| 2376 | | sub CARG1, BASE, RA | ||
| 2377 | | ldr LFUNC:CARG1, [CARG1, #-16] | ||
| 2378 | | ldr CARG1, LFUNC:CARG1->field_pc | ||
| 2379 | | ldr KBASE, [CARG1, #PC2PROTO(k)] | ||
| 2380 | | b <4 | ||
| 2381 | | | ||
| 2382 | |7: // Tailcall from a vararg function. | ||
| 2383 | | eor PC, PC, #FRAME_VARG | ||
| 2384 | | tst PC, #FRAME_TYPEP // Vararg frame below? | ||
| 2385 | | movne CARG4, #0 // Clear ffid if no Lua function below. | ||
| 2386 | | bne <1 | ||
| 2387 | | sub BASE, BASE, PC | ||
| 2388 | | ldr PC, [BASE, FRAME_PC] | ||
| 2389 | | tst PC, #FRAME_TYPE | ||
| 2390 | | movne CARG4, #0 // Clear ffid if no Lua function below. | ||
| 2391 | | b <1 | ||
| 2341 | break; | 2392 | break; |
| 2342 | 2393 | ||
| 2343 | case BC_ITERC: | 2394 | case BC_ITERC: |
