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: |