aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2011-04-08 02:54:11 +0200
committerMike Pall <mike>2011-04-08 02:54:11 +0200
commitaee129a7898a422ebed288b4110657908de8fb23 (patch)
tree3cf9cbd2244f1044ed0eb2fa3475692a57291d3d /src
parent16e0ecaf547c47eb8bf192cf6d606487759f746f (diff)
downloadluajit-aee129a7898a422ebed288b4110657908de8fb23.tar.gz
luajit-aee129a7898a422ebed288b4110657908de8fb23.tar.bz2
luajit-aee129a7898a422ebed288b4110657908de8fb23.zip
ARM: Add tailcall instructions.
Diffstat (limited to 'src')
-rw-r--r--src/buildvm_arm.dasc55
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: