reactos/dll/win32/rpcrt4/msvc.S

146 lines
3.1 KiB
ArmAsm

#include <asm.inc>
#ifdef _M_IX86
.code32
EXTERN _ndr_client_call:PROC
PUBLIC _call_stubless_func
_call_stubless_func:
mov ecx,[esp+4] /* This Pointer */
mov ecx,[ecx] /* This->lpVtbl */
mov ecx,[ecx-8] /* MIDL_STUBLESS_PROXY_INFO */
mov edx,[ecx+8] /* Info->FormatStringOffset */
mov edx,[edx+eax*2] /* FormatStringOffset[index] */
and edx, 0000FFFFh
add edx,[ecx+4] /* info->ProcFormatString + offset */
mov eax, [edx+8] /* arguments size */
and eax, 0000FFFFh
push eax
lea eax, [esp+8] /* &This */
push eax
push edx /* format string */
push [ecx] /* info->pstubdesc */
call _ndr_client_call
lea esp, [esp+12]
pop edx /* arguments size */
mov ecx, [esp] /* return address */
add esp, edx
jmp ecx
#else
.code64
EXTERN ndr_client_call:PROC
PUBLIC call_stubless_func
FUNC call_stubless_func
mov [rsp + 8], rcx
.SAVEREG rcx, 8
mov [rsp + 10h], rdx
.SAVEREG rdx, 10h
mov [rsp + 18h], r8
.SAVEREG r8, 18h
mov [rsp + 20h], r9
.SAVEREG r9, 20h
sub rsp, 38h
.ALLOCSTACK 38h
.ENDPROLOG
lea r8, [rsp +38h + 8] /* &This */
mov rcx, [rcx] /* This->lpVtbl */
mov rcx, [rcx - 10h] /* MIDL_STUBLESS_PROXY_INFO */
mov rdx, [rcx + 10h] /* info->FormatStringOffset */
movzx rdx, word ptr [rdx+r10*2] /* FormatStringOffset[index] */
add rdx, [rcx + 8] /* info->ProcFormatString + offset */
mov rcx, [rcx] /* info->pStubDesc */
movaps [rsp + 20h], xmm1
movaps [rsp + 28h], xmm2
movaps [rsp + 30h], xmm3
lea r9, [rsp + 18h] /* fpu_args */
call ndr_client_call
add rsp, 38h
ret
ENDFUNC
PUBLIC call_server_func
FUNC call_server_func
push rbp
.PUSHREG rbp
mov rbp, rsp
push rsi
.PUSHREG rsi
push rdi
.PUSHREG rdi
.ENDPROLOG
mov rax, rcx /* function to call */
mov rcx, 32 /* allocate max(32,stack_size) bytes of stack space */
cmp r8, rcx
cmovg rcx, r8
sub rsp, rcx
and rsp, NOT 15
mov rcx, r8
shr rcx, 3
mov rdi, rsp
mov rsi, rdx
rep movsq /* copy arguments */
mov rcx, [rsp]
mov rdx, [rsp + 8]
mov r8, [rsp + 16]
mov r9, [rsp + 24]
movd xmm0, rcx
movd xmm1, rdx
movd xmm2, r8
movd xmm3, r9
call rax
lea rsp, [rbp - 16] /* restore stack */
pop rdi
pop rsi
pop rbp
ret
ENDFUNC
PUBLIC NdrClientCall2
FUNC NdrClientCall2
mov [rsp + 18h], r8
.SAVEREG r8, 18h
mov [rsp + 20h], r9
.SAVEREG r9, 20h
sub rsp, 28h
.ALLOCSTACK 28h
.ENDPROLOG
lea r8, [rsp + 28h + 18h]
xor r9, r9
call ndr_client_call
add rsp, 28h
ret
ENDFUNC
EXTERN ndr_async_client_call:PROC
PUBLIC NdrAsyncClientCall
FUNC NdrAsyncClientCall
mov [rsp + 18h], r8
.SAVEREG r8, 18h
mov [rsp + 20h], r9
.SAVEREG r9, 20h
sub rsp, 28h
.ALLOCSTACK 28h
.ENDPROLOG
lea r8, [rsp + 28h + 18h]
call ndr_async_client_call
add rsp, 28h
ret
ENDFUNC
#endif
END