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