diff --git a/dlls/vcomp/main.c b/dlls/vcomp/main.c index 5206e474b34..ab51ef2bcc5 100644 --- a/dlls/vcomp/main.c +++ b/dlls/vcomp/main.c @@ -229,6 +229,51 @@ __ASM_GLOBAL_FUNC( _vcomp_fork_call_wrapper, "mov SP, r5\n\t" "pop {r4, r5, PC}" ) +#elif defined(__aarch64__) + +extern void CDECL _vcomp_fork_call_wrapper(void *wrapper, int nargs, __ms_va_list args); +__ASM_GLOBAL_FUNC( _vcomp_fork_call_wrapper, + "stp x29, x30, [SP,#-16]!\n\t" + "mov x29, SP\n\t" + "mov x9, x0\n\t" + "cbz w1, 2f\n\t" + "mov w10, w1\n\t" + "mov x11, x2\n\t" + "ldr w12, [x11, #24]\n\t" + "ldr x13, [x11, #8]\n\t" + "ldr x0, [x13, w12, sxtw]\n\t" + "add w12, w12, #8\n\t" + "ldr x1, [x13, w12, sxtw]\n\t" + "add w12, w12, #8\n\t" + "ldr x2, [x13, w12, sxtw]\n\t" + "add w12, w12, #8\n\t" + "ldr x3, [x13, w12, sxtw]\n\t" + "add w12, w12, #8\n\t" + "ldr x4, [x13, w12, sxtw]\n\t" + "add w12, w12, #8\n\t" + "ldr x5, [x13, w12, sxtw]\n\t" + "add w12, w12, #8\n\t" + "ldr x6, [x13, w12, sxtw]\n\t" + "add w12, w12, #8\n\t" + "ldr x7, [x13, w12, sxtw]\n\t" + "add w12, w12, #8\n\t" + "add x13, x13, w12, sxtw\n\t" + "subs w12, w10, #8\n\t" + "b.le 2f\n\t" + "ldr x11, [x11]\n\t" + "lsl w12, w12, #3\n\t" + "sub SP, SP, w12, sxtw\n\t" + "tbz w12, #3, 1f\n\t" + "sub SP, SP, #8\n\t" + "1: sub w12, w12, #8\n\t" + "ldr x14, [x13, w12, sxtw]\n\t" + "str x14, [SP, w12, sxtw]\n\t" + "cbnz w12, 1b\n\t" + "2: blr x9\n\t" + "mov SP, x29\n\t" + "ldp x29, x30, [SP], #16\n\t" + "ret\n" ) + #else static void CDECL _vcomp_fork_call_wrapper(void *wrapper, int nargs, __ms_va_list args)