aboutsummaryrefslogtreecommitdiff
path: root/src/vm_arm64.dasc
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/vm_arm64.dasc79
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: