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