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.dasc136
1 files changed, 125 insertions, 11 deletions
diff --git a/src/buildvm_x86.dasc b/src/buildvm_x86.dasc
index dd409c5c..d6dfde88 100644
--- a/src/buildvm_x86.dasc
+++ b/src/buildvm_x86.dasc
@@ -114,10 +114,13 @@
114|.if not X64 // x86 stack layout. 114|.if not X64 // x86 stack layout.
115| 115|
116|.define CFRAME_SPACE, aword*7 // Delta for esp (see <--). 116|.define CFRAME_SPACE, aword*7 // Delta for esp (see <--).
117|.macro saveregs 117|.macro saveregs_
118| push ebp; push edi; push esi; push ebx 118| push edi; push esi; push ebx
119| sub esp, CFRAME_SPACE 119| sub esp, CFRAME_SPACE
120|.endmacro 120|.endmacro
121|.macro saveregs
122| push ebp; saveregs_
123|.endmacro
121|.macro restoreregs 124|.macro restoreregs
122| add esp, CFRAME_SPACE 125| add esp, CFRAME_SPACE
123| pop ebx; pop esi; pop edi; pop ebp 126| pop ebx; pop esi; pop edi; pop ebp
@@ -166,10 +169,13 @@
166|.elif X64WIN // x64/Windows stack layout 169|.elif X64WIN // x64/Windows stack layout
167| 170|
168|.define CFRAME_SPACE, aword*5 // Delta for rsp (see <--). 171|.define CFRAME_SPACE, aword*5 // Delta for rsp (see <--).
169|.macro saveregs 172|.macro saveregs_
170| push rbp; push rdi; push rsi; push rbx 173| push rdi; push rsi; push rbx
171| sub rsp, CFRAME_SPACE 174| sub rsp, CFRAME_SPACE
172|.endmacro 175|.endmacro
176|.macro saveregs
177| push rbp; saveregs_
178|.endmacro
173|.macro restoreregs 179|.macro restoreregs
174| add rsp, CFRAME_SPACE 180| add rsp, CFRAME_SPACE
175| pop rbx; pop rsi; pop rdi; pop rbp 181| pop rbx; pop rsi; pop rdi; pop rbp
@@ -206,10 +212,13 @@
206|.else // x64/POSIX stack layout 212|.else // x64/POSIX stack layout
207| 213|
208|.define CFRAME_SPACE, aword*5 // Delta for rsp (see <--). 214|.define CFRAME_SPACE, aword*5 // Delta for rsp (see <--).
209|.macro saveregs 215|.macro saveregs_
210| push rbp; push rbx; push r15; push r14 216| push rbx; push r15; push r14
211| sub rsp, CFRAME_SPACE 217| sub rsp, CFRAME_SPACE
212|.endmacro 218|.endmacro
219|.macro saveregs
220| push rbp; saveregs_
221|.endmacro
213|.macro restoreregs 222|.macro restoreregs
214| add rsp, CFRAME_SPACE 223| add rsp, CFRAME_SPACE
215| pop r14; pop r15; pop rbx; pop rbp 224| pop r14; pop r15; pop rbx; pop rbp
@@ -760,14 +769,18 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse)
760 | mov PC, [RB-12] // Restore PC from [cont|PC]. 769 | mov PC, [RB-12] // Restore PC from [cont|PC].
761 |.if X64 770 |.if X64
762 | movsxd RAa, dword [RB-16] // May be negative on WIN64 with debug. 771 | movsxd RAa, dword [RB-16] // May be negative on WIN64 with debug.
763 | test RA, RA 772#if LJ_HASFFI
764 | jz >1 773 | cmp RA, 1
774 | jbe >1
775#endif
765 | lea KBASEa, qword [=>0] 776 | lea KBASEa, qword [=>0]
766 | add RAa, KBASEa 777 | add RAa, KBASEa
767 |.else 778 |.else
768 | mov RA, dword [RB-16] 779 | mov RA, dword [RB-16]
769 | test RA, RA 780#if LJ_HASFFI
770 | jz >1 781 | cmp RA, 1
782 | jbe >1
783#endif
771 |.endif 784 |.endif
772 | mov LFUNC:KBASE, [BASE-8] 785 | mov LFUNC:KBASE, [BASE-8]
773 | mov KBASE, LFUNC:KBASE->pc 786 | mov KBASE, LFUNC:KBASE->pc
@@ -775,11 +788,15 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse)
775 | // BASE = base, RC = result, RB = meta base 788 | // BASE = base, RC = result, RB = meta base
776 | jmp RAa // Jump to continuation. 789 | jmp RAa // Jump to continuation.
777 | 790 |
778 |1: // Tail call from C function. 791#if LJ_HASFFI
792 |1:
793 | je ->cont_ffi_callback // cont = 1: return from FFI callback.
794 | // cont = 0: Tail call from C function.
779 | sub RB, BASE 795 | sub RB, BASE
780 | shr RB, 3 796 | shr RB, 3
781 | lea RD, [RB-1] 797 | lea RD, [RB-1]
782 | jmp ->vm_call_tail 798 | jmp ->vm_call_tail
799#endif
783 | 800 |
784 |->cont_cat: // BASE = base, RC = result, RB = mbase 801 |->cont_cat: // BASE = base, RC = result, RB = mbase
785 | movzx RA, PC_RB 802 | movzx RA, PC_RB
@@ -3700,6 +3717,103 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse)
3700 |//-- FFI helper functions ----------------------------------------------- 3717 |//-- FFI helper functions -----------------------------------------------
3701 |//----------------------------------------------------------------------- 3718 |//-----------------------------------------------------------------------
3702 | 3719 |
3720 |// Handler for callback functions. Callback slot number in ah/al.
3721 |->vm_ffi_callback:
3722#if LJ_HASFFI
3723 |.type CTSTATE, CTState, PC
3724 |.if not X64
3725 | sub esp, 16 // Leave room for SAVE_ERRF etc.
3726 |.endif
3727 | saveregs_ // ebp/rbp already saved. ebp now holds global_State *.
3728 | lea DISPATCH, [ebp+GG_G2DISP]
3729 | mov CTSTATE, GL:ebp->ctype_state
3730 | movzx eax, ax
3731 | mov CTSTATE->cb.slot, eax
3732 |.if X64
3733 | mov CTSTATE->cb.gpr[0], CARG1
3734 | mov CTSTATE->cb.gpr[1], CARG2
3735 | mov CTSTATE->cb.gpr[2], CARG3
3736 | mov CTSTATE->cb.gpr[3], CARG4
3737 | movsd qword CTSTATE->cb.fpr[0], xmm0
3738 | movsd qword CTSTATE->cb.fpr[1], xmm1
3739 | movsd qword CTSTATE->cb.fpr[2], xmm2
3740 | movsd qword CTSTATE->cb.fpr[3], xmm3
3741 |.if X64WIN
3742 | lea rax, [rsp+CFRAME_SIZE+4*8]
3743 |.else
3744 | lea rax, [rsp+CFRAME_SIZE]
3745 | mov CTSTATE->cb.gpr[4], CARG5
3746 | mov CTSTATE->cb.gpr[5], CARG6
3747 | movsd qword CTSTATE->cb.fpr[4], xmm4
3748 | movsd qword CTSTATE->cb.fpr[5], xmm5
3749 | movsd qword CTSTATE->cb.fpr[6], xmm6
3750 | movsd qword CTSTATE->cb.fpr[7], xmm7
3751 |.endif
3752 | mov CTSTATE->cb.stack, rax
3753 | mov CARG2, rsp
3754 |.else
3755 | lea eax, [esp+CFRAME_SIZE+16]
3756 | mov CTSTATE->cb.gpr[0], FCARG1
3757 | mov CTSTATE->cb.gpr[1], FCARG2
3758 | mov CTSTATE->cb.stack, eax
3759 | mov FCARG1, [esp+CFRAME_SIZE+12] // Move around misplaced retaddr/ebp.
3760 | mov FCARG2, [esp+CFRAME_SIZE+8]
3761 | mov SAVE_RET, FCARG1
3762 | mov SAVE_R4, FCARG2
3763 | mov FCARG2, esp
3764 |.endif
3765 | mov SAVE_PC, CTSTATE // Any value outside of bytecode is ok.
3766 | mov FCARG1, CTSTATE
3767 | call extern lj_ccallback_enter@8 // (CTState *cts, void *cf)
3768 | // lua_State * returned in eax (RD).
3769 | set_vmstate INTERP
3770 | mov BASE, L:RD->base
3771 | mov RD, L:RD->top
3772 | sub RD, BASE
3773 | mov LFUNC:RB, [BASE-8]
3774 | shr RD, 3
3775 | add RD, 1
3776 | ins_callt
3777#endif
3778 |
3779 |->cont_ffi_callback: // Return from FFI callback.
3780#if LJ_HASFFI
3781 | mov L:RA, SAVE_L
3782 | mov CTSTATE, [DISPATCH+DISPATCH_GL(ctype_state)]
3783 | mov aword CTSTATE->L, L:RAa
3784 | mov L:RA->base, BASE
3785 | mov L:RA->top, RB
3786 | mov FCARG1, CTSTATE
3787 | mov FCARG2, RC
3788 | call extern lj_ccallback_leave@8 // (CTState *cts, TValue *o)
3789 |.if X64
3790 | mov rax, CTSTATE->cb.gpr[0]
3791 | movsd xmm0, qword CTSTATE->cb.fpr[0]
3792 | jmp ->vm_leave_unw
3793 |.else
3794 | mov L:RB, SAVE_L
3795 | mov eax, CTSTATE->cb.gpr[0]
3796 | mov edx, CTSTATE->cb.gpr[1]
3797 | cmp dword CTSTATE->cb.gpr[2], 1
3798 | jb >7
3799 | je >6
3800 | fld qword CTSTATE->cb.fpr[0].d
3801 | jmp >7
3802 |6:
3803 | fld dword CTSTATE->cb.fpr[0].f
3804 |7:
3805 | mov ecx, L:RB->top
3806 | movzx ecx, word [ecx+6] // Get stack adjustment and copy up.
3807 | mov SAVE_L, ecx // Must be one slot above SAVE_RET
3808 | restoreregs
3809 | pop ecx // Move return addr from SAVE_RET.
3810 | add esp, [esp] // Adjust stack.
3811 | add esp, 16
3812 | push ecx
3813 | ret
3814 |.endif
3815#endif
3816 |
3703 |->vm_ffi_call@4: // Call C function via FFI. 3817 |->vm_ffi_call@4: // Call C function via FFI.
3704 | // Caveat: needs special frame unwinding, see below. 3818 | // Caveat: needs special frame unwinding, see below.
3705#if LJ_HASFFI 3819#if LJ_HASFFI