libwine: Implemented the call_on_stack function for Sparc
André Hentschel
nerv at dawncrow.de
Fri Jan 14 14:46:26 CST 2011
---
libs/wine/port.c | 13 +++++++++++++
1 files changed, 13 insertions(+), 0 deletions(-)
diff --git a/libs/wine/port.c b/libs/wine/port.c
index 3562afa..32b819b 100644
--- a/libs/wine/port.c
+++ b/libs/wine/port.c
@@ -182,6 +182,19 @@ __ASM_GLOBAL_FUNC( wine_call_on_stack,
"mov PC, r2\n\t" /* call func */
"mov sp, r4\n\t" /* restore old sp from local var */
"pop {r4,PC}") /* fetch return address into pc */
+#elif defined(__sparc__) && defined(__GNUC__)
+__ASM_GLOBAL_FUNC( wine_call_on_stack,
+ "save %sp, -96, %sp\n\t" /* push: change register window */
+ "mov %sp, %l2\n\t" /* store old sp in local var */
+ "mov %i0, %l0\n\t" /* func */
+ "mov %i1, %l1\n\t" /* arg */
+ "sub %i2, 96, %sp\n\t" /* stack */
+ "call %l0, 0\n\t" /* call func */
+ "mov %l1, %o0\n\t" /* delay slot: arg for func */
+ "mov %l2, %sp\n\t" /* restore old sp from local var */
+ "mov %o0, %i0\n\t" /* move return value to right register window */
+ "ret\n\t" /* return */
+ "restore\n\t") /* delay slot: pop */
#else
#error You must implement wine_switch_to_stack for your platform
#endif
--
Best Regards, André Hentschel
More information about the wine-patches
mailing list