diff options
Diffstat (limited to '')
-rw-r--r-- | src/vm_arm64.dasc | 79 |
1 files changed, 77 insertions, 2 deletions
diff --git a/src/vm_arm64.dasc b/src/vm_arm64.dasc index 2a2e3a9a..1abc6ecc 100644 --- a/src/vm_arm64.dasc +++ b/src/vm_arm64.dasc | |||
@@ -2064,6 +2064,63 @@ static void build_subroutines(BuildCtx *ctx) | |||
2064 | |//-- Miscellaneous functions -------------------------------------------- | 2064 | |//-- Miscellaneous functions -------------------------------------------- |
2065 | |//----------------------------------------------------------------------- | 2065 | |//----------------------------------------------------------------------- |
2066 | | | 2066 | | |
2067 | |.define NEXT_TAB, TAB:CARG1 | ||
2068 | |.define NEXT_RES, CARG1 | ||
2069 | |.define NEXT_IDX, CARG2w | ||
2070 | |.define NEXT_LIM, CARG3w | ||
2071 | |.define NEXT_TMP0, TMP0 | ||
2072 | |.define NEXT_TMP0w, TMP0w | ||
2073 | |.define NEXT_TMP1, TMP1 | ||
2074 | |.define NEXT_TMP1w, TMP1w | ||
2075 | |.define NEXT_RES_PTR, sp | ||
2076 | |.define NEXT_RES_VAL, [sp] | ||
2077 | |.define NEXT_RES_KEY, [sp, #8] | ||
2078 | | | ||
2079 | |// TValue *lj_vm_next(GCtab *t, uint32_t idx) | ||
2080 | |// Next idx returned in CRET2w. | ||
2081 | |->vm_next: | ||
2082 | |.if JIT | ||
2083 | | ldr NEXT_LIM, NEXT_TAB->asize | ||
2084 | | ldr NEXT_TMP1, NEXT_TAB->array | ||
2085 | |1: // Traverse array part. | ||
2086 | | subs NEXT_TMP0w, NEXT_IDX, NEXT_LIM | ||
2087 | | bhs >5 // Index points after array part? | ||
2088 | | ldr NEXT_TMP0, [NEXT_TMP1, NEXT_IDX, uxtw #3] | ||
2089 | | cmn NEXT_TMP0, #-LJ_TNIL | ||
2090 | | cinc NEXT_IDX, NEXT_IDX, eq | ||
2091 | | beq <1 // Skip holes in array part. | ||
2092 | | str NEXT_TMP0, NEXT_RES_VAL | ||
2093 | | movz NEXT_TMP0w, #(LJ_TISNUM>>1)&0xffff, lsl #16 | ||
2094 | | stp NEXT_IDX, NEXT_TMP0w, NEXT_RES_KEY | ||
2095 | | add NEXT_IDX, NEXT_IDX, #1 | ||
2096 | | mov NEXT_RES, NEXT_RES_PTR | ||
2097 | |4: | ||
2098 | | ret | ||
2099 | | | ||
2100 | |5: // Traverse hash part. | ||
2101 | | ldr NEXT_TMP1w, NEXT_TAB->hmask | ||
2102 | | ldr NODE:NEXT_RES, NEXT_TAB->node | ||
2103 | | add NEXT_TMP0w, NEXT_TMP0w, NEXT_TMP0w, lsl #1 | ||
2104 | | add NEXT_LIM, NEXT_LIM, NEXT_TMP1w | ||
2105 | | add NODE:NEXT_RES, NODE:NEXT_RES, NEXT_TMP0w, uxtw #3 | ||
2106 | |6: | ||
2107 | | cmp NEXT_IDX, NEXT_LIM | ||
2108 | | bhi >9 | ||
2109 | | ldr NEXT_TMP0, NODE:NEXT_RES->val | ||
2110 | | cmn NEXT_TMP0, #-LJ_TNIL | ||
2111 | | add NEXT_IDX, NEXT_IDX, #1 | ||
2112 | | bne <4 | ||
2113 | | // Skip holes in hash part. | ||
2114 | | add NODE:NEXT_RES, NODE:NEXT_RES, #sizeof(Node) | ||
2115 | | b <6 | ||
2116 | | | ||
2117 | |9: // End of iteration. Set the key to nil (not the value). | ||
2118 | | movn NEXT_TMP0, #0 | ||
2119 | | str NEXT_TMP0, NEXT_RES_KEY | ||
2120 | | mov NEXT_RES, NEXT_RES_PTR | ||
2121 | | ret | ||
2122 | |.endif | ||
2123 | | | ||
2067 | |//----------------------------------------------------------------------- | 2124 | |//----------------------------------------------------------------------- |
2068 | |//-- FFI helper functions ----------------------------------------------- | 2125 | |//-- FFI helper functions ----------------------------------------------- |
2069 | |//----------------------------------------------------------------------- | 2126 | |//----------------------------------------------------------------------- |
@@ -3320,10 +3377,11 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
3320 | break; | 3377 | break; |
3321 | 3378 | ||
3322 | case BC_ITERN: | 3379 | case BC_ITERN: |
3323 | | // RA = base, (RB = nresults+1, RC = nargs+1 (2+1)) | ||
3324 | |.if JIT | 3380 | |.if JIT |
3325 | | // NYI: add hotloop, record BC_ITERN. | 3381 | | hotloop |
3326 | |.endif | 3382 | |.endif |
3383 | |->vm_IITERN: | ||
3384 | | // RA = base, (RB = nresults+1, RC = nargs+1 (2+1)) | ||
3327 | | add RA, BASE, RA, lsl #3 | 3385 | | add RA, BASE, RA, lsl #3 |
3328 | | ldr TAB:RB, [RA, #-16] | 3386 | | ldr TAB:RB, [RA, #-16] |
3329 | | ldrh TMP3w, [PC, # OFS_RD] | 3387 | | ldrh TMP3w, [PC, # OFS_RD] |
@@ -3390,11 +3448,28 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
3390 | | ins_next | 3448 | | ins_next |
3391 | | | 3449 | | |
3392 | |5: // Despecialize bytecode if any of the checks fail. | 3450 | |5: // Despecialize bytecode if any of the checks fail. |
3451 | |.if JIT | ||
3452 | | ldrb TMP2w, [RC, # OFS_OP] | ||
3453 | |.endif | ||
3393 | | mov TMP0, #BC_JMP | 3454 | | mov TMP0, #BC_JMP |
3394 | | mov TMP1, #BC_ITERC | 3455 | | mov TMP1, #BC_ITERC |
3395 | | strb TMP0w, [PC, #-4+OFS_OP] | 3456 | | strb TMP0w, [PC, #-4+OFS_OP] |
3457 | |.if JIT | ||
3458 | | cmp TMP2w, #BC_ITERN | ||
3459 | | bne >6 | ||
3460 | |.endif | ||
3396 | | strb TMP1w, [RC, # OFS_OP] | 3461 | | strb TMP1w, [RC, # OFS_OP] |
3397 | | b <1 | 3462 | | b <1 |
3463 | |.if JIT | ||
3464 | |6: // Unpatch JLOOP. | ||
3465 | | ldr RA, [GL, #GL_J(trace)] | ||
3466 | | ldrh TMP2w, [RC, # OFS_RD] | ||
3467 | | ldr TRACE:RA, [RA, TMP2, lsl #3] | ||
3468 | | ldr TMP2w, TRACE:RA->startins | ||
3469 | | bfxil TMP2w, TMP1w, #0, #8 | ||
3470 | | str TMP2w, [RC] | ||
3471 | | b <1 | ||
3472 | |.endif | ||
3398 | break; | 3473 | break; |
3399 | 3474 | ||
3400 | case BC_VARG: | 3475 | case BC_VARG: |