diff options
Diffstat (limited to 'src/buildvm_x86.dasc')
-rw-r--r-- | src/buildvm_x86.dasc | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/src/buildvm_x86.dasc b/src/buildvm_x86.dasc index b4f34782..31a09b7e 100644 --- a/src/buildvm_x86.dasc +++ b/src/buildvm_x86.dasc | |||
@@ -3409,6 +3409,101 @@ static void build_subroutines(BuildCtx *ctx, int cmov, int sse) | |||
3409 | |.endif | 3409 | |.endif |
3410 | | | 3410 | | |
3411 | |//----------------------------------------------------------------------- | 3411 | |//----------------------------------------------------------------------- |
3412 | |//-- FFI helper functions ----------------------------------------------- | ||
3413 | |//----------------------------------------------------------------------- | ||
3414 | | | ||
3415 | |->vm_ffi_call: | ||
3416 | #if LJ_HASFFI | ||
3417 | |.if X64 | ||
3418 | | .type CCSTATE, CCallState, rbx | ||
3419 | | push rbp; mov rbp, rsp; push rbx; mov CCSTATE, CARG1 | ||
3420 | |.else | ||
3421 | | .type CCSTATE, CCallState, ebx | ||
3422 | | push ebp; mov ebp, esp; push ebx; mov CCSTATE, FCARG1 | ||
3423 | |.endif | ||
3424 | | | ||
3425 | | // Readjust stack. | ||
3426 | |.if X64 | ||
3427 | | mov eax, CCSTATE->spadj | ||
3428 | | sub rsp, rax | ||
3429 | |.else | ||
3430 | | sub esp, CCSTATE->spadj | ||
3431 | |.endif | ||
3432 | | | ||
3433 | | // Copy stack slots. | ||
3434 | | movzx ecx, byte CCSTATE->nsp | ||
3435 | | sub ecx, 1 | ||
3436 | | js >2 | ||
3437 | |1: | ||
3438 | |.if X64 | ||
3439 | | mov rax, [CCSTATE+rcx*8+offsetof(CCallState, stack)] | ||
3440 | | mov [rsp+rcx*8+CCALL_SPS_EXTRA*8], rax | ||
3441 | |.else | ||
3442 | | mov eax, [CCSTATE+ecx*4+offsetof(CCallState, stack)] | ||
3443 | | mov [esp+ecx*4], eax | ||
3444 | |.endif | ||
3445 | | sub ecx, 1 | ||
3446 | | jns <1 | ||
3447 | |2: | ||
3448 | | | ||
3449 | |.if X64 | ||
3450 | | movzx eax, byte CCSTATE->nfpr | ||
3451 | | mov CARG1, CCSTATE->gpr[0] | ||
3452 | | mov CARG2, CCSTATE->gpr[1] | ||
3453 | | mov CARG3, CCSTATE->gpr[2] | ||
3454 | | mov CARG4, CCSTATE->gpr[3] | ||
3455 | |.if not X64WIN | ||
3456 | | mov CARG5, CCSTATE->gpr[4] | ||
3457 | | mov CARG6, CCSTATE->gpr[5] | ||
3458 | |.endif | ||
3459 | | test eax, eax; jz >5 | ||
3460 | | movaps xmm0, CCSTATE->fpr[0] | ||
3461 | | movaps xmm1, CCSTATE->fpr[1] | ||
3462 | | movaps xmm2, CCSTATE->fpr[2] | ||
3463 | | movaps xmm3, CCSTATE->fpr[3] | ||
3464 | |.if not X64WIN | ||
3465 | | cmp eax, 4; jbe >5 | ||
3466 | | movaps xmm4, CCSTATE->fpr[4] | ||
3467 | | movaps xmm5, CCSTATE->fpr[5] | ||
3468 | | movaps xmm6, CCSTATE->fpr[6] | ||
3469 | | movaps xmm7, CCSTATE->fpr[7] | ||
3470 | |.endif | ||
3471 | |5: | ||
3472 | |.else | ||
3473 | | mov FCARG1, CCSTATE->gpr[0] | ||
3474 | | mov FCARG2, CCSTATE->gpr[1] | ||
3475 | |.endif | ||
3476 | | | ||
3477 | | call aword CCSTATE->func | ||
3478 | | | ||
3479 | |.if X64 | ||
3480 | | mov CCSTATE->gpr[0], rax | ||
3481 | | movaps CCSTATE->fpr[0], xmm0 | ||
3482 | |.if not X64WIN | ||
3483 | | mov CCSTATE->gpr[1], rdx | ||
3484 | | movaps CCSTATE->fpr[1], xmm1 | ||
3485 | |.endif | ||
3486 | |.else | ||
3487 | | mov CCSTATE->gpr[0], eax | ||
3488 | | mov CCSTATE->gpr[1], edx | ||
3489 | | cmp byte CCSTATE->resx87, 1 | ||
3490 | | jb >7 | ||
3491 | | je >6 | ||
3492 | | fstp qword CCSTATE->fpr[0].d[0] | ||
3493 | | jmp >7 | ||
3494 | |6: | ||
3495 | | fstp dword CCSTATE->fpr[0].f[0] | ||
3496 | |7: | ||
3497 | |.endif | ||
3498 | | | ||
3499 | |.if X64 | ||
3500 | | mov rbx, [rbp-8]; leave; ret | ||
3501 | |.else | ||
3502 | | mov ebx, [ebp-4]; leave; ret | ||
3503 | |.endif | ||
3504 | #endif | ||
3505 | | | ||
3506 | |//----------------------------------------------------------------------- | ||
3412 | } | 3507 | } |
3413 | 3508 | ||
3414 | /* Generate the code for a single instruction. */ | 3509 | /* Generate the code for a single instruction. */ |