mirror of
https://github.com/LuaJIT/LuaJIT.git
synced 2025-02-07 23:24:09 +00:00
ARM: Add tailcall instructions.
This commit is contained in:
parent
16e0ecaf54
commit
aee129a789
@ -2334,10 +2334,61 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case BC_CALLMT:
|
case BC_CALLMT:
|
||||||
| NYI
|
| // RA = base*8, (RB = 0,) RC = extra_nargs
|
||||||
|
| ldr CARG1, SAVE_MULTRES
|
||||||
|
| add NARGS8:RC, CARG1, RC, lsl #3
|
||||||
|
| b ->BC_CALLT1_Z
|
||||||
break;
|
break;
|
||||||
case BC_CALLT:
|
case BC_CALLT:
|
||||||
| NYI
|
| lsl NARGS8:RC, RC, #3
|
||||||
|
| // RA = base*8, (RB = 0,) RC = (nargs+1)*8
|
||||||
|
|->BC_CALLT1_Z:
|
||||||
|
| ldrd LFUNC:CARG34, [RA, BASE]!
|
||||||
|
| sub NARGS8:RC, NARGS8:RC, #8
|
||||||
|
| add RA, RA, #8
|
||||||
|
| checkfunc CARG4, ->vmeta_callt
|
||||||
|
| ldr PC, [BASE, FRAME_PC]
|
||||||
|
|->BC_CALLT2_Z:
|
||||||
|
| str LFUNC:CARG3, [BASE, FRAME_FUNC] // Copy function down, but keep PC.
|
||||||
|
| ldrb CARG4, LFUNC:CARG3->ffid
|
||||||
|
| tst PC, #FRAME_TYPE
|
||||||
|
| bne >7
|
||||||
|
|1:
|
||||||
|
| cmp NARGS8:RC, #0
|
||||||
|
| mov RB, #0
|
||||||
|
| beq >3
|
||||||
|
|2:
|
||||||
|
| ldrd CARG12, [RA, RB]
|
||||||
|
| add INS, RB, #8
|
||||||
|
| cmp INS, NARGS8:RC
|
||||||
|
| strd CARG12, [BASE, RB]
|
||||||
|
| mov RB, INS
|
||||||
|
| bne <2
|
||||||
|
|3:
|
||||||
|
| cmp CARG4, #1 // (> FF_C) Calling a fast function?
|
||||||
|
| bhi >5
|
||||||
|
|4:
|
||||||
|
| ins_callt
|
||||||
|
|
|
||||||
|
|5: // Tailcall to a fast function with a Lua frame below.
|
||||||
|
| ldr INS, [PC, #-4]
|
||||||
|
| decode_RA8 RA, INS
|
||||||
|
| sub CARG1, BASE, RA
|
||||||
|
| ldr LFUNC:CARG1, [CARG1, #-16]
|
||||||
|
| ldr CARG1, LFUNC:CARG1->field_pc
|
||||||
|
| ldr KBASE, [CARG1, #PC2PROTO(k)]
|
||||||
|
| b <4
|
||||||
|
|
|
||||||
|
|7: // Tailcall from a vararg function.
|
||||||
|
| eor PC, PC, #FRAME_VARG
|
||||||
|
| tst PC, #FRAME_TYPEP // Vararg frame below?
|
||||||
|
| movne CARG4, #0 // Clear ffid if no Lua function below.
|
||||||
|
| bne <1
|
||||||
|
| sub BASE, BASE, PC
|
||||||
|
| ldr PC, [BASE, FRAME_PC]
|
||||||
|
| tst PC, #FRAME_TYPE
|
||||||
|
| movne CARG4, #0 // Clear ffid if no Lua function below.
|
||||||
|
| b <1
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BC_ITERC:
|
case BC_ITERC:
|
||||||
|
Loading…
Reference in New Issue
Block a user