diff options
Diffstat (limited to 'src/buildvm_x86.dasc')
-rw-r--r-- | src/buildvm_x86.dasc | 79 |
1 files changed, 67 insertions, 12 deletions
diff --git a/src/buildvm_x86.dasc b/src/buildvm_x86.dasc index 7758cd15..a3e65174 100644 --- a/src/buildvm_x86.dasc +++ b/src/buildvm_x86.dasc | |||
@@ -223,19 +223,18 @@ | |||
223 | |.define SAVE_R2, aword [rsp+aword*6] | 223 | |.define SAVE_R2, aword [rsp+aword*6] |
224 | |.define SAVE_R1, aword [rsp+aword*5] //<-- rsp after register saves. | 224 | |.define SAVE_R1, aword [rsp+aword*5] //<-- rsp after register saves. |
225 | |.define SAVE_CFRAME, aword [rsp+aword*4] | 225 | |.define SAVE_CFRAME, aword [rsp+aword*4] |
226 | |.define TMPa, aword [rsp+aword*3] | 226 | |.define SAVE_PC, dword [rsp+dword*7] |
227 | |//----- ^^^ awords above, vvv dwords below | 227 | |.define SAVE_L, dword [rsp+dword*6] |
228 | |.define SAVE_PC, dword [rsp+dword*5] | 228 | |.define SAVE_ERRF, dword [rsp+dword*5] |
229 | |.define SAVE_L, dword [rsp+dword*4] | 229 | |.define SAVE_NRES, dword [rsp+dword*4] |
230 | |.define SAVE_ERRF, dword [rsp+dword*3] | 230 | |.define TMPa, aword [rsp+aword*1] |
231 | |.define SAVE_NRES, dword [rsp+dword*2] | ||
232 | |.define TMP2, dword [rsp+dword*1] | 231 | |.define TMP2, dword [rsp+dword*1] |
233 | |.define TMP1, dword [rsp] //<-- rsp while in interpreter. | 232 | |.define TMP1, dword [rsp] //<-- rsp while in interpreter. |
234 | |//----- 16 byte aligned | 233 | |//----- 16 byte aligned |
235 | | | 234 | | |
236 | |// TMPQ overlaps TMP1/TMP2. MULTRES overlaps TMP2 (and TMPQ). | 235 | |// TMPQ overlaps TMP1/TMP2. MULTRES overlaps TMP2 (and TMPQ). |
237 | |.define TMPQ, qword [rsp] | 236 | |.define TMPQ, qword [rsp] |
238 | |.define TMP3, dword [rsp+aword*3] | 237 | |.define TMP3, dword [rsp+aword*1] |
239 | |.define MULTRES, TMP2 | 238 | |.define MULTRES, TMP2 |
240 | | | 239 | | |
241 | |.endif | 240 | |.endif |
@@ -2627,18 +2626,51 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | |||
2627 | | // Error code returned in eax (RD). | 2626 | | // Error code returned in eax (RD). |
2628 | | mov RAa, L:RB->cframe | 2627 | | mov RAa, L:RB->cframe |
2629 | | and RAa, CFRAME_RAWMASK | 2628 | | and RAa, CFRAME_RAWMASK |
2630 | |.if X64 | 2629 | |.if X64WIN |
2630 | | // Reposition stack later. | ||
2631 | |.elif X64 | ||
2631 | | mov rsp, RAa // Reposition stack to C frame. | 2632 | | mov rsp, RAa // Reposition stack to C frame. |
2632 | |.else | 2633 | |.else |
2633 | | mov esp, RAa // Reposition stack to C frame. | 2634 | | mov esp, RAa // Reposition stack to C frame. |
2634 | |.endif | 2635 | |.endif |
2635 | | mov SAVE_L, L:RB // Needed for on-trace resume/yield. | 2636 | | mov [RAa+CFRAME_OFS_L], L:RB // Set SAVE_L (on-trace resume/yield). |
2636 | | test RD, RD; jnz >1 // Check for error from exit. | ||
2637 | | mov BASE, L:RB->base | 2637 | | mov BASE, L:RB->base |
2638 | | mov PC, SAVE_PC | 2638 | | mov PC, [RAa+CFRAME_OFS_PC] // Get SAVE_PC. |
2639 | |.if X64 | ||
2640 | | jmp >1 | ||
2641 | |.else | ||
2642 | | test RD, RD; jnz >2 // Check for error from exit. | ||
2643 | |.endif | ||
2639 | #endif | 2644 | #endif |
2640 | |->vm_exit_interp: | 2645 | |->vm_exit_interp: |
2641 | #if LJ_HASJIT | 2646 | #if LJ_HASJIT |
2647 | |.if X64 | ||
2648 | | xor RD, RD | ||
2649 | | // Restore additional callee-save registers only used in compiled code. | ||
2650 | |.if X64WIN | ||
2651 | | lea RAa, [rsp+9*16+4*8] | ||
2652 | |1: | ||
2653 | | movdqa xmm15, [RAa-9*16] | ||
2654 | | movdqa xmm14, [RAa-8*16] | ||
2655 | | movdqa xmm13, [RAa-7*16] | ||
2656 | | movdqa xmm12, [RAa-6*16] | ||
2657 | | movdqa xmm11, [RAa-5*16] | ||
2658 | | movdqa xmm10, [RAa-4*16] | ||
2659 | | movdqa xmm9, [RAa-3*16] | ||
2660 | | movdqa xmm8, [RAa-2*16] | ||
2661 | | movdqa xmm7, [RAa-1*16] | ||
2662 | | mov rsp, RAa // Reposition stack to C frame. | ||
2663 | | movdqa xmm6, [RAa] | ||
2664 | | mov r15, CSAVE_3 | ||
2665 | | mov r14, CSAVE_4 | ||
2666 | |.else | ||
2667 | | add rsp, 16 // Reposition stack to C frame. | ||
2668 | |1: | ||
2669 | |.endif | ||
2670 | | mov r13, TMPa | ||
2671 | | mov r12, TMPQ | ||
2672 | | test RD, RD; jnz >2 // Check for error from exit. | ||
2673 | |.endif | ||
2642 | | mov LFUNC:KBASE, [BASE-8] | 2674 | | mov LFUNC:KBASE, [BASE-8] |
2643 | | mov KBASE, LFUNC:KBASE->pc | 2675 | | mov KBASE, LFUNC:KBASE->pc |
2644 | | mov KBASE, [KBASE+PC2PROTO(k)] | 2676 | | mov KBASE, [KBASE+PC2PROTO(k)] |
@@ -2646,7 +2678,7 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | |||
2646 | | set_vmstate INTERP | 2678 | | set_vmstate INTERP |
2647 | | ins_next | 2679 | | ins_next |
2648 | | | 2680 | | |
2649 | |1: // Rethrow error from the right C frame. | 2681 | |2: // Rethrow error from the right C frame. |
2650 | | mov FCARG1, L:RB | 2682 | | mov FCARG1, L:RB |
2651 | | mov FCARG2, RD | 2683 | | mov FCARG2, RD |
2652 | | call extern lj_err_throw@8 // (lua_State *L, int errcode) | 2684 | | call extern lj_err_throw@8 // (lua_State *L, int errcode) |
@@ -4714,6 +4746,29 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop, int cmov, int sse) | |||
4714 | | mov L:RB, SAVE_L | 4746 | | mov L:RB, SAVE_L |
4715 | | mov [DISPATCH+DISPATCH_GL(jit_base)], BASE | 4747 | | mov [DISPATCH+DISPATCH_GL(jit_base)], BASE |
4716 | | mov [DISPATCH+DISPATCH_GL(jit_L)], L:RB | 4748 | | mov [DISPATCH+DISPATCH_GL(jit_L)], L:RB |
4749 | | // Save additional callee-save registers only used in compiled code. | ||
4750 | |.if X64WIN | ||
4751 | | mov TMPQ, r12 | ||
4752 | | mov TMPa, r13 | ||
4753 | | mov CSAVE_4, r14 | ||
4754 | | mov CSAVE_3, r15 | ||
4755 | | mov RAa, rsp | ||
4756 | | sub rsp, 9*16+4*8 | ||
4757 | | movdqa [RAa], xmm6 | ||
4758 | | movdqa [RAa-1*16], xmm7 | ||
4759 | | movdqa [RAa-2*16], xmm8 | ||
4760 | | movdqa [RAa-3*16], xmm9 | ||
4761 | | movdqa [RAa-4*16], xmm10 | ||
4762 | | movdqa [RAa-5*16], xmm11 | ||
4763 | | movdqa [RAa-6*16], xmm12 | ||
4764 | | movdqa [RAa-7*16], xmm13 | ||
4765 | | movdqa [RAa-8*16], xmm14 | ||
4766 | | movdqa [RAa-9*16], xmm15 | ||
4767 | |.elif X64 | ||
4768 | | mov TMPQ, r12 | ||
4769 | | mov TMPa, r13 | ||
4770 | | sub rsp, 16 | ||
4771 | |.endif | ||
4717 | | jmp RDa | 4772 | | jmp RDa |
4718 | #endif | 4773 | #endif |
4719 | break; | 4774 | break; |