diff options
Diffstat (limited to '')
-rw-r--r-- | src/vm_x86.dasc | 99 |
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: |