diff options
Diffstat (limited to '')
-rw-r--r-- | src/vm_x64.dasc | 80 |
1 files changed, 78 insertions, 2 deletions
diff --git a/src/vm_x64.dasc b/src/vm_x64.dasc index d2119bc4..fdffd4b6 100644 --- a/src/vm_x64.dasc +++ b/src/vm_x64.dasc | |||
@@ -2633,6 +2633,67 @@ static void build_subroutines(BuildCtx *ctx) | |||
2633 | | .if X64WIN; pop rsi; .endif | 2633 | | .if X64WIN; pop rsi; .endif |
2634 | | ret | 2634 | | ret |
2635 | | | 2635 | | |
2636 | |.define NEXT_TAB, TAB:CARG1 | ||
2637 | |.define NEXT_IDX, CARG2d | ||
2638 | |.define NEXT_IDXa, CARG2 | ||
2639 | |.define NEXT_PTR, RC | ||
2640 | |.define NEXT_PTRd, RCd | ||
2641 | |.define NEXT_TMP, CARG3 | ||
2642 | |.define NEXT_ASIZE, CARG4d | ||
2643 | |.macro NEXT_RES_IDXL, op2; lea edx, [NEXT_IDX+op2]; .endmacro | ||
2644 | |.if X64WIN | ||
2645 | |.define NEXT_RES_PTR, [rsp+aword*5] | ||
2646 | |.macro NEXT_RES_IDX, op2; add NEXT_IDX, op2; .endmacro | ||
2647 | |.else | ||
2648 | |.define NEXT_RES_PTR, [rsp+aword*1] | ||
2649 | |.macro NEXT_RES_IDX, op2; lea edx, [NEXT_IDX+op2]; .endmacro | ||
2650 | |.endif | ||
2651 | | | ||
2652 | |// TValue *lj_vm_next(GCtab *t, uint32_t idx) | ||
2653 | |// Next idx returned in edx. | ||
2654 | |->vm_next: | ||
2655 | |.if JIT | ||
2656 | | mov NEXT_ASIZE, NEXT_TAB->asize | ||
2657 | |1: // Traverse array part. | ||
2658 | | cmp NEXT_IDX, NEXT_ASIZE; jae >5 | ||
2659 | | mov NEXT_TMP, NEXT_TAB->array | ||
2660 | | mov NEXT_TMP, qword [NEXT_TMP+NEXT_IDX*8] | ||
2661 | | cmp NEXT_TMP, LJ_TNIL; je >2 | ||
2662 | | lea NEXT_PTR, NEXT_RES_PTR | ||
2663 | | mov qword [NEXT_PTR], NEXT_TMP | ||
2664 | |.if DUALNUM | ||
2665 | | setint NEXT_TMP, NEXT_IDXa | ||
2666 | | mov qword [NEXT_PTR+qword*1], NEXT_TMP | ||
2667 | |.else | ||
2668 | | cvtsi2sd xmm0, NEXT_IDX | ||
2669 | | movsd qword [NEXT_PTR+qword*1], xmm0 | ||
2670 | |.endif | ||
2671 | | NEXT_RES_IDX 1 | ||
2672 | | ret | ||
2673 | |2: // Skip holes in array part. | ||
2674 | | add NEXT_IDX, 1 | ||
2675 | | jmp <1 | ||
2676 | | | ||
2677 | |5: // Traverse hash part. | ||
2678 | | sub NEXT_IDX, NEXT_ASIZE | ||
2679 | |6: | ||
2680 | | cmp NEXT_IDX, NEXT_TAB->hmask; ja >9 | ||
2681 | | imul NEXT_PTRd, NEXT_IDX, #NODE | ||
2682 | | add NODE:NEXT_PTR, NEXT_TAB->node | ||
2683 | | cmp qword NODE:NEXT_PTR->val, LJ_TNIL; je >7 | ||
2684 | | NEXT_RES_IDXL NEXT_ASIZE+1 | ||
2685 | | ret | ||
2686 | |7: // Skip holes in hash part. | ||
2687 | | add NEXT_IDX, 1 | ||
2688 | | jmp <6 | ||
2689 | | | ||
2690 | |9: // End of iteration. Set the key to nil (not the value). | ||
2691 | | NEXT_RES_IDX NEXT_ASIZE | ||
2692 | | lea NEXT_PTR, NEXT_RES_PTR | ||
2693 | | mov qword [NEXT_PTR+qword*1], LJ_TNIL | ||
2694 | | ret | ||
2695 | |.endif | ||
2696 | | | ||
2636 | |//----------------------------------------------------------------------- | 2697 | |//----------------------------------------------------------------------- |
2637 | |//-- Assertions --------------------------------------------------------- | 2698 | |//-- Assertions --------------------------------------------------------- |
2638 | |//----------------------------------------------------------------------- | 2699 | |//----------------------------------------------------------------------- |
@@ -4044,10 +4105,11 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
4044 | break; | 4105 | break; |
4045 | 4106 | ||
4046 | case BC_ITERN: | 4107 | case BC_ITERN: |
4047 | | ins_A // RA = base, (RB = nresults+1, RC = nargs+1 (2+1)) | ||
4048 | |.if JIT | 4108 | |.if JIT |
4049 | | // NYI: add hotloop, record BC_ITERN. | 4109 | | hotloop RBd |
4050 | |.endif | 4110 | |.endif |
4111 | |->vm_IITERN: | ||
4112 | | ins_A // RA = base, (RB = nresults+1, RC = nargs+1 (2+1)) | ||
4051 | | mov TAB:RB, [BASE+RA*8-16] | 4113 | | mov TAB:RB, [BASE+RA*8-16] |
4052 | | cleartp TAB:RB | 4114 | | cleartp TAB:RB |
4053 | | mov RCd, [BASE+RA*8-8] // Get index from control var. | 4115 | | mov RCd, [BASE+RA*8-8] // Get index from control var. |
@@ -4118,8 +4180,22 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
4118 | |5: // Despecialize bytecode if any of the checks fail. | 4180 | |5: // Despecialize bytecode if any of the checks fail. |
4119 | | mov PC_OP, BC_JMP | 4181 | | mov PC_OP, BC_JMP |
4120 | | branchPC RD | 4182 | | branchPC RD |
4183 | |.if JIT | ||
4184 | | cmp byte [PC], BC_ITERN | ||
4185 | | jne >6 | ||
4186 | |.endif | ||
4121 | | mov byte [PC], BC_ITERC | 4187 | | mov byte [PC], BC_ITERC |
4122 | | jmp <1 | 4188 | | jmp <1 |
4189 | |.if JIT | ||
4190 | |6: // Unpatch JLOOP. | ||
4191 | | mov RA, [DISPATCH+DISPATCH_J(trace)] | ||
4192 | | movzx RCd, word [PC+2] | ||
4193 | | mov TRACE:RA, [RA+RC*8] | ||
4194 | | mov eax, TRACE:RA->startins | ||
4195 | | mov al, BC_ITERC | ||
4196 | | mov dword [PC], eax | ||
4197 | | jmp <1 | ||
4198 | |.endif | ||
4123 | break; | 4199 | break; |
4124 | 4200 | ||
4125 | case BC_VARG: | 4201 | case BC_VARG: |