aboutsummaryrefslogtreecommitdiff
path: root/src/vm_x86.dasc
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/vm_x86.dasc99
1 files changed, 97 insertions, 2 deletions
diff --git a/src/vm_x86.dasc b/src/vm_x86.dasc
index 718cb8f0..cbf0810c 100644
--- a/src/vm_x86.dasc
+++ b/src/vm_x86.dasc
@@ -3120,6 +3120,86 @@ static void build_subroutines(BuildCtx *ctx)
3120 | ret 3120 | ret
3121 |.endif 3121 |.endif
3122 | 3122 |
3123 |.define NEXT_TAB, TAB:FCARG1
3124 |.define NEXT_IDX, FCARG2
3125 |.define NEXT_PTR, RCa
3126 |.define NEXT_PTRd, RC
3127 |.macro NEXT_RES_IDXL, op2; lea edx, [NEXT_IDX+op2]; .endmacro
3128 |.if X64
3129 |.define NEXT_TMP, CARG3d
3130 |.define NEXT_TMPq, CARG3
3131 |.define NEXT_ASIZE, CARG4d
3132 |.macro NEXT_ENTER; .endmacro
3133 |.macro NEXT_LEAVE; ret; .endmacro
3134 |.if X64WIN
3135 |.define NEXT_RES_PTR, [rsp+aword*5]
3136 |.macro NEXT_RES_IDX, op2; add NEXT_IDX, op2; .endmacro
3137 |.else
3138 |.define NEXT_RES_PTR, [rsp+aword*1]
3139 |.macro NEXT_RES_IDX, op2; lea edx, [NEXT_IDX+op2]; .endmacro
3140 |.endif
3141 |.else
3142 |.define NEXT_ASIZE, esi
3143 |.define NEXT_TMP, edi
3144 |.macro NEXT_ENTER; push esi; push edi; .endmacro
3145 |.macro NEXT_LEAVE; pop edi; pop esi; ret; .endmacro
3146 |.define NEXT_RES_PTR, [esp+dword*3]
3147 |.macro NEXT_RES_IDX, op2; add NEXT_IDX, op2; .endmacro
3148 |.endif
3149 |
3150 |// TValue *lj_vm_next(GCtab *t, uint32_t idx)
3151 |// Next idx returned in edx.
3152 |->vm_next:
3153 |.if JIT
3154 | NEXT_ENTER
3155 | mov NEXT_ASIZE, NEXT_TAB->asize
3156 |1: // Traverse array part.
3157 | cmp NEXT_IDX, NEXT_ASIZE; jae >5
3158 | mov NEXT_TMP, NEXT_TAB->array
3159 | cmp dword [NEXT_TMP+NEXT_IDX*8+4], LJ_TNIL; je >2
3160 | lea NEXT_PTR, NEXT_RES_PTR
3161 |.if X64
3162 | mov NEXT_TMPq, qword [NEXT_TMP+NEXT_IDX*8]
3163 | mov qword [NEXT_PTR], NEXT_TMPq
3164 |.else
3165 | mov NEXT_ASIZE, dword [NEXT_TMP+NEXT_IDX*8+4]
3166 | mov NEXT_TMP, dword [NEXT_TMP+NEXT_IDX*8]
3167 | mov dword [NEXT_PTR+4], NEXT_ASIZE
3168 | mov dword [NEXT_PTR], NEXT_TMP
3169 |.endif
3170 |.if DUALNUM
3171 | mov dword [NEXT_PTR+dword*3], LJ_TISNUM
3172 | mov dword [NEXT_PTR+dword*2], NEXT_IDX
3173 |.else
3174 | cvtsi2sd xmm0, NEXT_IDX
3175 | movsd qword [NEXT_PTR+dword*2], xmm0
3176 |.endif
3177 | NEXT_RES_IDX 1
3178 | NEXT_LEAVE
3179 |2: // Skip holes in array part.
3180 | add NEXT_IDX, 1
3181 | jmp <1
3182 |
3183 |5: // Traverse hash part.
3184 | sub NEXT_IDX, NEXT_ASIZE
3185 |6:
3186 | cmp NEXT_IDX, NEXT_TAB->hmask; ja >9
3187 | imul NEXT_PTRd, NEXT_IDX, #NODE
3188 | add NODE:NEXT_PTRd, dword NEXT_TAB->node
3189 | cmp dword NODE:NEXT_PTR->val.it, LJ_TNIL; je >7
3190 | NEXT_RES_IDXL NEXT_ASIZE+1
3191 | NEXT_LEAVE
3192 |7: // Skip holes in hash part.
3193 | add NEXT_IDX, 1
3194 | jmp <6
3195 |
3196 |9: // End of iteration. Set the key to nil (not the value).
3197 | NEXT_RES_IDX NEXT_ASIZE
3198 | lea NEXT_PTR, NEXT_RES_PTR
3199 | mov dword [NEXT_PTR+dword*3], LJ_TNIL
3200 | NEXT_LEAVE
3201 |.endif
3202 |
3123 |//----------------------------------------------------------------------- 3203 |//-----------------------------------------------------------------------
3124 |//-- Assertions --------------------------------------------------------- 3204 |//-- Assertions ---------------------------------------------------------
3125 |//----------------------------------------------------------------------- 3205 |//-----------------------------------------------------------------------
@@ -4771,10 +4851,11 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
4771 break; 4851 break;
4772 4852
4773 case BC_ITERN: 4853 case BC_ITERN:
4774 | ins_A // RA = base, (RB = nresults+1, RC = nargs+1 (2+1))
4775 |.if JIT 4854 |.if JIT
4776 | // NYI: add hotloop, record BC_ITERN. 4855 | hotloop RB
4777 |.endif 4856 |.endif
4857 |->vm_IITERN:
4858 | ins_A // RA = base, (RB = nresults+1, RC = nargs+1 (2+1))
4778 | mov TMP1, KBASE // Need two more free registers. 4859 | mov TMP1, KBASE // Need two more free registers.
4779 | mov TMP2, DISPATCH 4860 | mov TMP2, DISPATCH
4780 | mov TAB:RB, [BASE+RA*8-16] 4861 | mov TAB:RB, [BASE+RA*8-16]
@@ -4868,8 +4949,22 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
4868 |5: // Despecialize bytecode if any of the checks fail. 4949 |5: // Despecialize bytecode if any of the checks fail.
4869 | mov PC_OP, BC_JMP 4950 | mov PC_OP, BC_JMP
4870 | branchPC RD 4951 | branchPC RD
4952 |.if JIT
4953 | cmp byte [PC], BC_ITERN
4954 | jne >6
4955 |.endif
4871 | mov byte [PC], BC_ITERC 4956 | mov byte [PC], BC_ITERC
4872 | jmp <1 4957 | jmp <1
4958 |.if JIT
4959 |6: // Unpatch JLOOP.
4960 | mov RA, [DISPATCH+DISPATCH_J(trace)]
4961 | movzx RC, word [PC+2]
4962 | mov TRACE:RA, [RA+RC*4]
4963 | mov eax, TRACE:RA->startins
4964 | mov al, BC_ITERC
4965 | mov dword [PC], eax
4966 | jmp <1
4967 |.endif
4873 break; 4968 break;
4874 4969
4875 case BC_VARG: 4970 case BC_VARG: