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