diff --git a/libs/wine/port.c b/libs/wine/port.c index f4ad2e9c5be..7cbe5b4e389 100644 --- a/libs/wine/port.c +++ b/libs/wine/port.c @@ -171,20 +171,16 @@ __ASM_GLOBAL_FUNC( wine_call_on_stack, "lwz 0, 4(1)\n\t" /* fetch return address */ "mtlr 0\n\t" /* return address -> lr */ "blr") /* return */ -#elif defined(__arm__) +#elif defined(__arm__) && defined(__GNUC__) __ASM_GLOBAL_FUNC( wine_call_on_stack, - "str r14, [r13, #4]\n\t" /* save return address on stack */ - "sub r2, r2, #16\n\t" /* reserve space on new stack */ - "str r13, [r2, #12]\n\t" /* store old sp */ - "mov r3, r0\n\t" /* func */ - "mov r0, r1\n\t" /* arg */ - "mov r13, r2\n\t" /* stack */ - "mov r2, #0\n\t" /* zero */ - "str r2, [r13]\n\t" /* bottom of stack */ - "sub r13, r13, #16\n\t" /* create a frame for this function */ - "blx r3\n\t" /* call func */ - "ldr r13, [r13, #28]\n\t" /* fetch old sp */ - "ldr r15, [r13, #4]") /* fetch return address and return */ + "push {r4,LR}\n\t" /* save return address on stack */ + "mov r4, sp\n\t" /* store old sp in local var */ + "mov sp, r2\n\t" /* stack */ + "mov r2, r0\n\t" /* func -> scratch register */ + "mov r0, r1\n\t" /* arg */ + "blx r2\n\t" /* call func */ + "mov sp, r4\n\t" /* restore old sp from local var */ + "pop {r4,PC}") /* fetch return address into pc */ #else #error You must implement wine_switch_to_stack for your platform #endif