diff options
Diffstat (limited to '')
-rw-r--r-- | src/vm_arm.dasc | 79 |
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: |