aboutsummaryrefslogtreecommitdiff
path: root/src/vm_arm.dasc
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/vm_arm.dasc79
1 files changed, 77 insertions, 2 deletions
diff --git a/src/vm_arm.dasc b/src/vm_arm.dasc
index 0e80bf00..3a73e00b 100644
--- a/src/vm_arm.dasc
+++ b/src/vm_arm.dasc
@@ -2424,6 +2424,64 @@ static void build_subroutines(BuildCtx *ctx)
2424 |//-- Miscellaneous functions -------------------------------------------- 2424 |//-- Miscellaneous functions --------------------------------------------
2425 |//----------------------------------------------------------------------- 2425 |//-----------------------------------------------------------------------
2426 | 2426 |
2427 |.define NEXT_TAB, TAB:CARG1
2428 |.define NEXT_RES, CARG1
2429 |.define NEXT_IDX, CARG2
2430 |.define NEXT_TMP0, CARG3
2431 |.define NEXT_TMP1, CARG4
2432 |.define NEXT_LIM, r12
2433 |.define NEXT_RES_PTR, sp
2434 |.define NEXT_RES_VAL, [sp]
2435 |.define NEXT_RES_KEY_I, [sp, #8]
2436 |.define NEXT_RES_KEY_IT, [sp, #12]
2437 |
2438 |// TValue *lj_vm_next(GCtab *t, uint32_t idx)
2439 |// Next idx returned in CRET2.
2440 |->vm_next:
2441 |.if JIT
2442 | ldr NEXT_TMP0, NEXT_TAB->array
2443 | ldr NEXT_LIM, NEXT_TAB->asize
2444 | add NEXT_TMP0, NEXT_TMP0, NEXT_IDX, lsl #3
2445 |1: // Traverse array part.
2446 | subs NEXT_TMP1, NEXT_IDX, NEXT_LIM
2447 | bhs >5
2448 | ldr NEXT_TMP1, [NEXT_TMP0, #4]
2449 | str NEXT_IDX, NEXT_RES_KEY_I
2450 | add NEXT_TMP0, NEXT_TMP0, #8
2451 | add NEXT_IDX, NEXT_IDX, #1
2452 | checktp NEXT_TMP1, LJ_TNIL
2453 | beq <1 // Skip holes in array part.
2454 | ldr NEXT_TMP0, [NEXT_TMP0, #-8]
2455 | mov NEXT_RES, NEXT_RES_PTR
2456 | strd NEXT_TMP0, NEXT_RES_VAL // Stores NEXT_TMP1, too.
2457 | mvn NEXT_TMP0, #~LJ_TISNUM
2458 | str NEXT_TMP0, NEXT_RES_KEY_IT
2459 | bx lr
2460 |
2461 |5: // Traverse hash part.
2462 | ldr NEXT_TMP0, NEXT_TAB->hmask
2463 | ldr NODE:NEXT_RES, NEXT_TAB->node
2464 | add NEXT_TMP1, NEXT_TMP1, NEXT_TMP1, lsl #1
2465 | add NEXT_LIM, NEXT_LIM, NEXT_TMP0
2466 | add NODE:NEXT_RES, NODE:NEXT_RES, NEXT_TMP1, lsl #3
2467 |6:
2468 | cmp NEXT_IDX, NEXT_LIM
2469 | bhi >9
2470 | ldr NEXT_TMP1, NODE:NEXT_RES->val.it
2471 | checktp NEXT_TMP1, LJ_TNIL
2472 | add NEXT_IDX, NEXT_IDX, #1
2473 | bxne lr
2474 | // Skip holes in hash part.
2475 | add NEXT_RES, NEXT_RES, #sizeof(Node)
2476 | b <6
2477 |
2478 |9: // End of iteration. Set the key to nil (not the value).
2479 | mvn NEXT_TMP0, #0
2480 | mov NEXT_RES, NEXT_RES_PTR
2481 | str NEXT_TMP0, NEXT_RES_KEY_IT
2482 | bx lr
2483 |.endif
2484 |
2427 |//----------------------------------------------------------------------- 2485 |//-----------------------------------------------------------------------
2428 |//-- FFI helper functions ----------------------------------------------- 2486 |//-- FFI helper functions -----------------------------------------------
2429 |//----------------------------------------------------------------------- 2487 |//-----------------------------------------------------------------------
@@ -3914,10 +3972,11 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
3914 break; 3972 break;
3915 3973
3916 case BC_ITERN: 3974 case BC_ITERN:
3917 | // RA = base*8, (RB = nresults+1, RC = nargs+1 (2+1))
3918 |.if JIT 3975 |.if JIT
3919 | // NYI: add hotloop, record BC_ITERN. 3976 | hotloop
3920 |.endif 3977 |.endif
3978 |->vm_IITERN:
3979 | // RA = base*8, (RB = nresults+1, RC = nargs+1 (2+1))
3921 | add RA, BASE, RA 3980 | add RA, BASE, RA
3922 | ldr TAB:RB, [RA, #-16] 3981 | ldr TAB:RB, [RA, #-16]
3923 | ldr CARG1, [RA, #-8] // Get index from control var. 3982 | ldr CARG1, [RA, #-8] // Get index from control var.
@@ -3992,9 +4051,25 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
3992 | mov OP, #BC_ITERC 4051 | mov OP, #BC_ITERC
3993 | strb CARG1, [PC, #-4] 4052 | strb CARG1, [PC, #-4]
3994 | sub PC, RC, #0x20000 4053 | sub PC, RC, #0x20000
4054 |.if JIT
4055 | ldrb CARG1, [PC]
4056 | cmp CARG1, #BC_ITERN
4057 | bne >6
4058 |.endif
3995 | strb OP, [PC] // Subsumes ins_next1. 4059 | strb OP, [PC] // Subsumes ins_next1.
3996 | ins_next2 4060 | ins_next2
3997 | b <1 4061 | b <1
4062 |.if JIT
4063 |6: // Unpatch JLOOP.
4064 | ldr CARG1, [DISPATCH, #DISPATCH_J(trace)]
4065 | ldrh CARG2, [PC, #2]
4066 | ldr TRACE:CARG1, [CARG1, CARG2, lsl #2]
4067 | // Subsumes ins_next1 and ins_next2.
4068 | ldr INS, TRACE:CARG1->startins
4069 | bfi INS, OP, #0, #8
4070 | str INS, [PC], #4
4071 | b <1
4072 |.endif
3998 break; 4073 break;
3999 4074
4000 case BC_VARG: 4075 case BC_VARG: