; Windows x64 ABI bridge. No game offsets, policy or managed callbacks live here.
; Arguments are mirrored into GP and XMM registers to support fixed scalar ABIs.
; The C++ caller pads twelve slots and contains the SEH fault boundary.
OPTION CASEMAP:NONE
.code
XfeInvokeAsm PROC FRAME
push rbx
.pushreg rbx
push rsi
.pushreg rsi
push rdi
.pushreg rdi
push r12
.pushreg r12
sub rsp, 88h
.allocstack 88h
.endprolog
mov rbx, rcx
mov rsi, rdx
mov rdi, r9
mov rax, [rsi+20h]
mov [rsp+20h], rax
mov rax, [rsi+28h]
mov [rsp+28h], rax
mov rax, [rsi+30h]
mov [rsp+30h], rax
mov rax, [rsi+38h]
mov [rsp+38h], rax
mov rax, [rsi+40h]
mov [rsp+40h], rax
mov rax, [rsi+48h]
mov [rsp+48h], rax
mov rax, [rsi+50h]
mov [rsp+50h], rax
mov rax, [rsi+58h]
mov [rsp+58h], rax
mov rcx, [rsi]
mov rdx, [rsi+8]
mov r8, [rsi+10h]
mov r9, [rsi+18h]
movq xmm0, rcx
movq xmm1, rdx
movq xmm2, r8
movq xmm3, r9
call rbx
mov [rdi], rax
movsd qword ptr [rdi+8], xmm0
add rsp, 88h
pop r12
pop rdi
pop rsi
pop rbx
ret
XfeInvokeAsm ENDP
END
; Windows x64 ABI bridge. No game offsets, policy or managed callbacks live here.
; Arguments are mirrored into GP and XMM registers to support fixed scalar ABIs.
; The C++ caller pads twelve slots and contains the SEH fault boundary.
OPTION CASEMAP:NONE
.code
XfeInvokeAsm PROC FRAME
push rbx
.pushreg rbx
push rsi
.pushreg rsi
push rdi
.pushreg rdi
push r12
.pushreg r12
sub rsp, 88h
.allocstack 88h
.endprolog
mov rbx, rcx
mov rsi, rdx
mov rdi, r9
mov rax, [rsi+20h]
mov [rsp+20h], rax
mov rax, [rsi+28h]
mov [rsp+28h], rax
mov rax, [rsi+30h]
mov [rsp+30h], rax
mov rax, [rsi+38h]
mov [rsp+38h], rax
mov rax, [rsi+40h]
mov [rsp+40h], rax
mov rax, [rsi+48h]
mov [rsp+48h], rax
mov rax, [rsi+50h]
mov [rsp+50h], rax
mov rax, [rsi+58h]
mov [rsp+58h], rax
mov rcx, [rsi]
mov rdx, [rsi+8]
mov r8, [rsi+10h]
mov r9, [rsi+18h]
movq xmm0, rcx
movq xmm1, rdx
movq xmm2, r8
movq xmm3, r9
call rbx
mov [rdi], rax
movsd qword ptr [rdi+8], xmm0
add rsp, 88h
pop r12
pop rdi
pop rsi
pop rbx
ret
XfeInvokeAsm ENDP
END