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