[kaffe] CVS kaffe (dalibor): Converted i386-qnx and i386-win32 sysdepCallMethods to inline functions

Kaffe CVS Kaffe Mailing List <kaffe@kaffe.org>
Thu Dec 11 10:09:01 2003


PatchSet 4214 
Date: 2003/12/11 17:56:17
Author: dalibor
Branch: HEAD
Tag: (none) 
Log:
Converted i386-qnx and i386-win32 sysdepCallMethods to inline functions

2003-12-11  Dalibor Topic <robilad@kaffe.org>

        * config/arm/sysdepCallMethod.h: New file.

        * config/Makefile.am
        (EXTRA_DIST) Added config/arm/sysdepCallMethod.h.

        * aclocal.m4,
        config/Makefile.in,
        kaffe/Makefile.in,
        kaffe/kaffe/Makefile.in,
        kaffe/scripts/Makefile.in,
        kaffe/scripts/compat/Makefile.in,
        test/internal/Makefile.in,
        test/regression/Makefile.in:
        Regenerated.

        * config/arm/common.h
        (sysdepCallMethod) Moved into its own file,
        config/arm/sysdepCallMethod.h.

        * config/arm/linux/md.h,
        config/arm/netbsd1/md.h:
        Include config/arm/sysdepCallMethod.h.

        * config/arm/riscos/md.h:
        (sysdepCallMethod) Converted macro to inline function.

Members: 
	ChangeLog:1.1804->1.1805 
	aclocal.m4:1.78->1.79 
	config/Makefile.am:1.29->1.30 
	config/Makefile.in:1.96->1.97 
	config/i386/common.h:1.16->1.17 
	config/i386/sysdepCallMethod.h:INITIAL->1.1 
	config/i386/beos/md.h:1.5->1.6 
	config/i386/bsdi/md.h:1.3->1.4 
	config/i386/cygwin32/md.h:1.2->1.3 
	config/i386/dgux/md.h:1.2->1.3 
	config/i386/freebsd2/md.h:1.6->1.7 
	config/i386/gnu/md.h:1.2->1.3 
	config/i386/linux/md.h:1.5->1.6 
	config/i386/netbsd1/md.h:1.2->1.3 
	config/i386/nextstep3/md.h:1.3->1.4 
	config/i386/openbsd2/md.h:1.3->1.4 
	config/i386/oskit/md.h:1.4->1.5 
	config/i386/qnx/md.h:1.5->1.6 
	config/i386/sco3.2v5/md.h:1.2->1.3 
	config/i386/solaris2/md.h:1.2->1.3 
	config/i386/univel_svr4/md.h:1.4->1.5 
	config/i386/win32/md.h:1.2->1.3 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.1804 kaffe/ChangeLog:1.1805
--- kaffe/ChangeLog:1.1804	Thu Dec 11 16:43:29 2003
+++ kaffe/ChangeLog	Thu Dec 11 17:56:17 2003
@@ -1,5 +1,40 @@
 2003-12-11  Dalibor Topic <robilad@kaffe.org>
 
+	* config/i386/sysdepCallMethod.h: New file.
+
+	* config/Makefile.am
+	(EXTRA_DIST) Added config/i386/sysdepCallMethod.h.
+
+        * aclocal.m4,
+        config/Makefile.in:
+	Regenerated.
+
+        * config/i386/common.h:
+	(sysdepCallMethod) Moved into its own file,
+        config/i386/sysdepCallMethod.h.
+
+        * config/i386/bsdi/md.h,
+	config/i386/beos/md.h,
+        config/i386/cygwin32/md.h,
+        config/i386/dgux/md.h,
+        config/i386/freebsd2/md.h,
+        config/i386/gnu/md.h,
+        config/i386/linux/md.h,
+        config/i386/netbsd1/md.h,
+        config/i386/nextstep3/md.h,
+        config/i386/openbsd2/md.h,
+        config/i386/oskit/md.h,
+        config/i386/sco3.2v5/md.h,
+        config/i386/solaris2/md.h,
+        config/i386/univel_svr4/md.h:
+	Include config/i386/sysdepCallMethod.h.
+
+        * config/i386/win32/md.h,
+        config/i386/qnx/md.h:
+	(sysdepCallMethod) Converted macro to inline function.
+
+2003-12-11  Dalibor Topic <robilad@kaffe.org>
+
 	* config/arm/sysdepCallMethod.h: New file.
 
 	* config/Makefile.am
Index: kaffe/aclocal.m4
diff -u kaffe/aclocal.m4:1.78 kaffe/aclocal.m4:1.79
--- kaffe/aclocal.m4:1.78	Thu Dec 11 16:43:30 2003
+++ kaffe/aclocal.m4	Thu Dec 11 17:56:18 2003
@@ -8723,7 +8723,7 @@
 AU_DEFUN([fp_WITH_DMALLOC], [AM_WITH_DMALLOC])
 
 # ----------------------------------------------------------------------------
-# $Id: aclocal.m4,v 1.78 2003/12/11 16:43:30 dalibor Exp $
+# $Id: aclocal.m4,v 1.79 2003/12/11 17:56:18 dalibor Exp $
 #
 # Copyright (C) 2003 Free Software Foundation, Inc.
 #
@@ -8767,7 +8767,7 @@
 #
 # GNU Crypto m4 macro for use by VM Providers
 #
-# $Revision: 1.78 $
+# $Revision: 1.79 $
 #
 
 # process --with-gnu-crypto configure option.
Index: kaffe/config/Makefile.am
diff -u kaffe/config/Makefile.am:1.29 kaffe/config/Makefile.am:1.30
--- kaffe/config/Makefile.am:1.29	Thu Dec 11 16:43:31 2003
+++ kaffe/config/Makefile.am	Thu Dec 11 17:56:20 2003
@@ -162,6 +162,7 @@
 	i386/solaris2/jit-md.h \
 	i386/solaris2/md.c \
 	i386/solaris2/md.h \
+	i386/sysdepCallMethod.h \
 	i386/threads.h \
 	i386/trampolines.c \
 	i386/univel_svr4/config.frag \
Index: kaffe/config/Makefile.in
diff -u kaffe/config/Makefile.in:1.96 kaffe/config/Makefile.in:1.97
--- kaffe/config/Makefile.in:1.96	Thu Dec 11 16:43:31 2003
+++ kaffe/config/Makefile.in	Thu Dec 11 17:56:20 2003
@@ -404,6 +404,7 @@
 	i386/solaris2/jit-md.h \
 	i386/solaris2/md.c \
 	i386/solaris2/md.h \
+	i386/sysdepCallMethod.h \
 	i386/threads.h \
 	i386/trampolines.c \
 	i386/univel_svr4/config.frag \
Index: kaffe/config/i386/common.h
diff -u kaffe/config/i386/common.h:1.16 kaffe/config/i386/common.h:1.17
--- kaffe/config/i386/common.h:1.16	Sat Oct  4 22:55:23 2003
+++ kaffe/config/i386/common.h	Thu Dec 11 17:56:20 2003
@@ -5,6 +5,9 @@
  * Copyright (c) 1996, 1997, 1998, 1999
  *	Transvirtual Technologies, Inc.  All rights reserved.
  *
+ * Copyright (c) 2003
+ *      Kaffe.org contributors. See ChangeLog for details.
+ *
  * See the file "license.terms" for information on usage and redistribution 
  * of this file. 
  */
@@ -14,53 +17,6 @@
 
 /* The 386 never aligns to more than a 4 byte boundary. */
 #define	ALIGNMENT_OF_SIZE(S)	((S) < 4 ? (S) : 4)
-
-/*
- * Make a call to a native or Java (JIT) method.
- *  This assembly code should build a standard C call using the passed
- *  call information.  By its nature this is highly processor specific.
- *  This function is mandatory for both JIT and Interpreter (since stubs
- *  have now been deprecated).
- */
-#if NEED_sysdepCallMethod
-static inline void sysdepCallMethod(callMethodInfo *call) {
-  unsigned args = call->nrargs;
-
-  /* Push all arguments into the stack, in last-to-first order.  This
-     assumes that the second 32bit-word of longs and doubles is
-     available as an additional int argument, as callMethod[AV]() do.  */
-  while (args > 0)
-    asm volatile ("pushl %0" : : "m" (call->args[--args].i) : "sp");
-
-  switch(call->retsize) {
-  case 0:
-    /* Must be void.  */
-    ((void (*)(void))(call->function))();
-    break;
-
-  case 1:
-    if (call->rettype == 'F')
-      call->ret->f = ((jfloat (*)(void))(call->function))();
-    else /* Must be 32-bit or smaller int.  */
-      call->ret->i = ((jint (*)(void))(call->function))();
-    break;
-
-  default:
-    /* It could've been `case 2;', but then we'd get an additional cmp
-     * that we don't really need.  */
-    if (call->rettype == 'D')
-      call->ret->d = ((jdouble (*)(void))(call->function))();
-    else /* Must be jlong.  */
-      call->ret->j = ((jlong (*)(void))(call->function))();
-    break;
-  }
-
-  /* Adjust the stack pointer.  */
-  asm volatile ("addl %0,%%esp" : :
-		"r" (call->argsize * sizeof(jint)) : "cc", "sp");
-}
-#endif /* NEED_sysdepCallMethod */
-
 
 #if defined(__GNUC__)
 #define KAFFE_PROFILER 1
===================================================================
Checking out kaffe/config/i386/sysdepCallMethod.h
RCS:  /home/cvs/kaffe/kaffe/config/i386/sysdepCallMethod.h,v
VERS: 1.1
***************
--- /dev/null	Sun Aug  4 19:57:58 2002
+++ kaffe/config/i386/sysdepCallMethod.h	Thu Dec 11 17:59:20 2003
@@ -0,0 +1,67 @@
+/*
+ * i386/sysdepCallMethod.h
+ * Common i386 sysdepCallMethod.
+ *
+ * Copyright (c) 1996, 1997, 1998, 1999
+ *	Transvirtual Technologies, Inc.  All rights reserved.
+ *
+ * Copyright (c) 2003
+ *      Kaffe.org contributors. See ChangeLog for details.
+ *
+ * See the file "license.terms" for information on usage and redistribution 
+ * of this file. 
+ */
+
+#ifndef __i386_sysdepCallMethod_h
+#define __i386_sysdepCallMethod_h
+
+/* Needed for callMethodInfo declaration */
+#include "support.h"
+
+/*
+ * Make a call to a native or Java (JIT) method.
+ *  This assembly code should build a standard C call using the passed
+ *  call information.  By its nature this is highly processor specific.
+ *  This function is mandatory for both JIT and Interpreter (since stubs
+ *  have now been deprecated).
+ */
+#if NEED_sysdepCallMethod
+static inline void sysdepCallMethod(callMethodInfo *call) {
+  unsigned args = call->nrargs;
+
+  /* Push all arguments into the stack, in last-to-first order.  This
+     assumes that the second 32bit-word of longs and doubles is
+     available as an additional int argument, as callMethod[AV]() do.  */
+  while (args > 0)
+    asm volatile ("pushl %0" : : "m" (call->args[--args].i) : "sp");
+
+  switch(call->retsize) {
+  case 0:
+    /* Must be void.  */
+    ((void (*)(void))(call->function))();
+    break;
+
+  case 1:
+    if (call->rettype == 'F')
+      call->ret->f = ((jfloat (*)(void))(call->function))();
+    else /* Must be 32-bit or smaller int.  */
+      call->ret->i = ((jint (*)(void))(call->function))();
+    break;
+
+  default:
+    /* It could've been `case 2;', but then we'd get an additional cmp
+     * that we don't really need.  */
+    if (call->rettype == 'D')
+      call->ret->d = ((jdouble (*)(void))(call->function))();
+    else /* Must be jlong.  */
+      call->ret->j = ((jlong (*)(void))(call->function))();
+    break;
+  }
+
+  /* Adjust the stack pointer.  */
+  asm volatile ("addl %0,%%esp" : :
+		"r" (call->argsize * sizeof(jint)) : "cc", "sp");
+}
+#endif /* NEED_sysdepCallMethod */
+
+#endif /* __i386_sysdepCallMethod_h */
Index: kaffe/config/i386/beos/md.h
diff -u kaffe/config/i386/beos/md.h:1.5 kaffe/config/i386/beos/md.h:1.6
--- kaffe/config/i386/beos/md.h:1.5	Wed Aug 27 07:04:19 2003
+++ kaffe/config/i386/beos/md.h	Thu Dec 11 17:56:20 2003
@@ -5,6 +5,9 @@
  * Copyright (c) 1996, 1997
  *	Transvirtual Technologies, Inc.  All rights reserved.
  *
+ * Copyright (c) 2003
+ *      Kaffe.org contributors. See ChangeLog for details.
+ *
  * See the file "license.terms" for information on usage and redistribution 
  * of this file. 
  */
@@ -13,6 +16,7 @@
 #define __i386_beos_md_h
 
 #include "i386/common.h"
+#include "i386/sysdepCallMethod.h"
 #include "i386/threads.h"
 
 /*
Index: kaffe/config/i386/bsdi/md.h
diff -u kaffe/config/i386/bsdi/md.h:1.3 kaffe/config/i386/bsdi/md.h:1.4
--- kaffe/config/i386/bsdi/md.h:1.3	Wed Aug 27 07:04:19 2003
+++ kaffe/config/i386/bsdi/md.h	Thu Dec 11 17:56:21 2003
@@ -5,6 +5,9 @@
  * Copyright (c) 1996, 1997
  *	Transvirtual Technologies, Inc.  All rights reserved.
  *
+ * Copyright (c) 2003
+ *      Kaffe.org contributors. See ChangeLog for details.
+ *
  * See the file "license.terms" for information on usage and redistribution 
  * of this file. 
  */
@@ -13,6 +16,7 @@
 #define __i386_bsdi_md_h
 
 #include "i386/common.h"
+#include "i386/sysdepCallMethod.h"
 #include "i386/threads.h"
 
 /*
Index: kaffe/config/i386/cygwin32/md.h
diff -u kaffe/config/i386/cygwin32/md.h:1.2 kaffe/config/i386/cygwin32/md.h:1.3
--- kaffe/config/i386/cygwin32/md.h:1.2	Wed Aug 27 07:04:19 2003
+++ kaffe/config/i386/cygwin32/md.h	Thu Dec 11 17:56:21 2003
@@ -5,6 +5,9 @@
  * Copyright (c) 1996, 1997
  *	Transvirtual Technologies, Inc.  All rights reserved.
  *
+ * Copyright (c) 2003
+ *      Kaffe.org contributors. See ChangeLog for details.
+ *
  * See the file "license.terms" for information on usage and redistribution 
  * of this file. 
  */
@@ -16,6 +19,7 @@
 /* Thread handling */
 /**/
 #include "i386/common.h"
+#include "i386/sysdepCallMethod.h"
 #include "i386/threads.h"
 
 /* Redefine the stack pointer offset */
Index: kaffe/config/i386/dgux/md.h
diff -u kaffe/config/i386/dgux/md.h:1.2 kaffe/config/i386/dgux/md.h:1.3
--- kaffe/config/i386/dgux/md.h:1.2	Wed Aug 27 07:04:20 2003
+++ kaffe/config/i386/dgux/md.h	Thu Dec 11 17:56:21 2003
@@ -5,6 +5,9 @@
  * Copyright (c) 1996, 1997
  *	Transvirtual Technologies, Inc.  All rights reserved.
  *
+ * Copyright (c) 2003
+ *      Kaffe.org contributors. See ChangeLog for details.
+ *
  * See the file "license.terms" for information on usage and redistribution 
  * of this file. 
  */
@@ -13,6 +16,7 @@
 #define __i386_dgux_md_h
 
 #include "i386/common.h"
+#include "i386/sysdepCallMethod.h"
 #include "i386/threads.h"
 
 /**/
Index: kaffe/config/i386/freebsd2/md.h
diff -u kaffe/config/i386/freebsd2/md.h:1.6 kaffe/config/i386/freebsd2/md.h:1.7
--- kaffe/config/i386/freebsd2/md.h:1.6	Tue Jun 24 19:26:01 2003
+++ kaffe/config/i386/freebsd2/md.h	Thu Dec 11 17:56:22 2003
@@ -5,6 +5,9 @@
  * Copyright (c) 1996, 1997
  *	Transvirtual Technologies, Inc.  All rights reserved.
  *
+ * Copyright (c) 2003
+ *      Kaffe.org contributors. See ChangeLog for details.
+ *
  * See the file "license.terms" for information on usage and redistribution 
  * of this file. 
  */
@@ -13,6 +16,7 @@
 #define __i386_freebsd2_md_h
 
 #include "i386/common.h"
+#include "i386/sysdepCallMethod.h"
 #include "i386/threads.h"
 
 /*
Index: kaffe/config/i386/gnu/md.h
diff -u kaffe/config/i386/gnu/md.h:1.2 kaffe/config/i386/gnu/md.h:1.3
--- kaffe/config/i386/gnu/md.h:1.2	Wed Aug 27 07:04:21 2003
+++ kaffe/config/i386/gnu/md.h	Thu Dec 11 17:56:22 2003
@@ -5,6 +5,9 @@
  * Copyright (c) 1996, 1997
  *	Transvirtual Technologies, Inc.  All rights reserved.
  *
+ * Copyright (c) 2003
+ *      Kaffe.org contributors. See ChangeLog for details.
+ *
  * See the file "license.terms" for information on usage and redistribution 
  * of this file. 
  */
@@ -13,6 +16,7 @@
 #define __ki386_gnu_md_h
 
 #include "i386/common.h"
+#include "i386/sysdepCallMethod.h"
 #include "i386/threads.h"
 
 /* Function prototype for signal handlers */
Index: kaffe/config/i386/linux/md.h
diff -u kaffe/config/i386/linux/md.h:1.5 kaffe/config/i386/linux/md.h:1.6
--- kaffe/config/i386/linux/md.h:1.5	Wed Aug 27 07:04:21 2003
+++ kaffe/config/i386/linux/md.h	Thu Dec 11 17:56:22 2003
@@ -5,6 +5,9 @@
  * Copyright (c) 1996, 1997
  *	Transvirtual Technologies, Inc.  All rights reserved.
  *
+ * Copyright (c) 2003
+ *      Kaffe.org contributors. See ChangeLog for details.
+ *
  * See the file "license.terms" for information on usage and redistribution 
  * of this file. 
  */
@@ -13,6 +16,7 @@
 #define __ki386_linux_md_h
 
 #include "i386/common.h"
+#include "i386/sysdepCallMethod.h"
 #include "i386/threads.h"
 
 /* Linux requires a little initialisation */
Index: kaffe/config/i386/netbsd1/md.h
diff -u kaffe/config/i386/netbsd1/md.h:1.2 kaffe/config/i386/netbsd1/md.h:1.3
--- kaffe/config/i386/netbsd1/md.h:1.2	Thu Aug  7 10:47:14 2003
+++ kaffe/config/i386/netbsd1/md.h	Thu Dec 11 17:56:23 2003
@@ -5,6 +5,9 @@
  * Copyright (c) 1996, 1997
  *	Transvirtual Technologies, Inc.  All rights reserved.
  *
+ * Copyright (c) 2003
+ *      Kaffe.org contributors. See ChangeLog for details.
+ *
  * See the file "license.terms" for information on usage and redistribution 
  * of this file. 
  */
@@ -13,6 +16,7 @@
 #define __i386_netbsd1_md_h
 
 #include "i386/common.h"
+#include "i386/sysdepCallMethod.h"
 #include "i386/threads.h"
 
 /*
Index: kaffe/config/i386/nextstep3/md.h
diff -u kaffe/config/i386/nextstep3/md.h:1.3 kaffe/config/i386/nextstep3/md.h:1.4
--- kaffe/config/i386/nextstep3/md.h:1.3	Wed Aug 27 07:04:21 2003
+++ kaffe/config/i386/nextstep3/md.h	Thu Dec 11 17:56:23 2003
@@ -5,6 +5,9 @@
  * Copyright (c) 1996, 1997
  *	Transvirtual Technologies, Inc.  All rights reserved.
  *
+ * Copyright (c) 2003
+ *      Kaffe.org contributors. See ChangeLog for details.
+ *
  * See the file "license.terms" for information on usage and redistribution 
  * of this file. 
  */
@@ -13,6 +16,7 @@
 #define __i386_nextstep3_md_h
 
 #include "i386/common.h"
+#include "i386/sysdepCallMethod.h"
 #include "i386/threads.h"
 
 /*
Index: kaffe/config/i386/openbsd2/md.h
diff -u kaffe/config/i386/openbsd2/md.h:1.3 kaffe/config/i386/openbsd2/md.h:1.4
--- kaffe/config/i386/openbsd2/md.h:1.3	Mon Aug 25 06:14:46 2003
+++ kaffe/config/i386/openbsd2/md.h	Thu Dec 11 17:56:23 2003
@@ -5,6 +5,9 @@
  * Copyright (c) 1996, 1997
  *	Transvirtual Technologies, Inc.  All rights reserved.
  *
+ * Copyright (c) 2003
+ *      Kaffe.org contributors. See ChangeLog for details.
+ *
  * See the file "license.terms" for information on usage and redistribution 
  * of this file. 
  */
@@ -13,6 +16,7 @@
 #define __i386_openbsd2_md_h
 
 #include "i386/common.h"
+#include "i386/sysdepCallMethod.h"
 #include "i386/threads.h"
 
 /*
Index: kaffe/config/i386/oskit/md.h
diff -u kaffe/config/i386/oskit/md.h:1.4 kaffe/config/i386/oskit/md.h:1.5
--- kaffe/config/i386/oskit/md.h:1.4	Wed Aug 27 07:04:22 2003
+++ kaffe/config/i386/oskit/md.h	Thu Dec 11 17:56:24 2003
@@ -4,6 +4,9 @@
  * See the file "license.terms" for information on usage and redistribution
  * of this file.
  *
+ * Copyright (c) 2003
+ *      Kaffe.org contributors. See ChangeLog for details.
+ *
  * Contributed by the Flux Research Group at the University of Utah.
  * Authors: Godmar Back, Leigh Stoller
  */
@@ -12,6 +15,7 @@
 #define __i386_oskit_md_h
 
 #include "i386/common.h"
+#include "i386/sysdepCallMethod.h"
 #include "i386/threads.h"
 
 /*
Index: kaffe/config/i386/qnx/md.h
diff -u kaffe/config/i386/qnx/md.h:1.5 kaffe/config/i386/qnx/md.h:1.6
--- kaffe/config/i386/qnx/md.h:1.5	Sat Oct  4 22:55:24 2003
+++ kaffe/config/i386/qnx/md.h	Thu Dec 11 17:56:24 2003
@@ -5,6 +5,9 @@
  * Copyright (c) 1996, 1997
  *	Transvirtual Technologies, Inc.  All rights reserved.
  *
+ * Copyright (c) 2003
+ *      Kaffe.org contributors. See ChangeLog for details.
+ *
  * See the file "license.terms" for information on usage and redistribution 
  * of this file. 
  */
@@ -22,6 +25,7 @@
 #include "i386/common.h"
 #include "i386/threads.h"
 
+#include "support.h"
 /*
  * Redefine stack pointer offset.
  */
@@ -77,43 +81,44 @@
  * point unit.  We must make some changes to the sysdepCallMethod to
  * handle this.
  */
-#undef	sysdepCallMethod
-#define	sysdepCallMethod(CALL)						\
-	asm volatile ("	\n"						\
-"1:			\n"						\
-"		cmpl $0,%0 \n"						\
-"		je 3f \n"						\
-"		decl %0	\n"						\
-"		cmpb $0,(%2,%0)	\n"					\
-"		je 1b \n"						\
-"		cmpb $1,(%2,%0)	\n"					\
-"		je 2f \n"						\
-"		pushl 4(%1,%0,8) \n"					\
-"2:		\n"							\
-"		pushl (%1,%0,8)	\n"					\
-"		jmpl 1b	\n"						\
-"3:		\n"							\
-"		call *%3 \n"						\
-"		movl %5,%%ebx \n"					\
-"		movb %4,%%cl \n"					\
-"		movl %%eax,(%%ebx) \n"					\
-"		cmpb $0x44,%%cl \n"					\
-"		je 4f \n"						\
-"		cmpb $0x4a,%%cl	\n"					\
-"		jne 5f \n"						\
-"4:		\n"							\
-"		movl %%edx,4(%%ebx) \n"					\
-"5:		\n"							\
-"	" :								\
-	  : "r" ((CALL)->nrargs),					\
-	    "r" ((CALL)->args),						\
-	    "r" ((CALL)->callsize),					\
-	    "m" ((CALL)->function),					\
-	    "m" ((CALL)->rettype),					\
-	    "m" ((CALL)->ret)						\
-	  : "eax", "ebx", "ecx", "edx", "edi", "esi", "cc", "memory");	\
-	asm volatile ("	\n"						\
-"		subl %0,%%esp \n"					\
-	" : : "r" ((CALL)->argsize * sizeof(jint)) : "cc")
+static inline void sysdepCallMethod(callMethodInfo *call) 
+{
+	asm volatile ("	\n"
+"1:			\n"
+"		cmpl $0,%0 \n"
+"		je 3f \n"
+"		decl %0	\n"
+"		cmpb $0,(%2,%0)	\n"
+"		je 1b \n"
+"		cmpb $1,(%2,%0)	\n"
+"		je 2f \n"
+"		pushl 4(%1,%0,8) \n"
+"2:		\n"
+"		pushl (%1,%0,8)	\n"
+"		jmpl 1b	\n"
+"3:		\n"
+"		call *%3 \n"
+"		movl %5,%%ebx \n"
+"		movb %4,%%cl \n"
+"		movl %%eax,(%%ebx) \n"
+"		cmpb $0x44,%%cl \n"
+"		je 4f \n"
+"		cmpb $0x4a,%%cl	\n"
+"		jne 5f \n"
+"4:		\n"
+"		movl %%edx,4(%%ebx) \n"
+"5:		\n"
+"	" :
+	  : "r" ((call)->nrargs),
+	    "r" ((call)->args),
+	    "r" ((call)->callsize),
+	    "m" ((call)->function),
+	    "m" ((call)->rettype),
+	    "m" ((call)->ret)
+	  : "eax", "ebx", "ecx", "edx", "edi", "esi", "cc", "memory");
+	asm volatile ("	\n"
+"		subl %0,%%esp \n"
+"	" : : "r" ((call)->argsize * sizeof(jint)) : "cc");
+}
 
 #endif
Index: kaffe/config/i386/sco3.2v5/md.h
diff -u kaffe/config/i386/sco3.2v5/md.h:1.2 kaffe/config/i386/sco3.2v5/md.h:1.3
--- kaffe/config/i386/sco3.2v5/md.h:1.2	Wed Aug 27 07:04:23 2003
+++ kaffe/config/i386/sco3.2v5/md.h	Thu Dec 11 17:56:24 2003
@@ -5,6 +5,9 @@
  * Copyright (c) 1996, 1997
  *	Transvirtual Technologies, Inc.  All rights reserved.
  *
+ * Copyright (c) 2003
+ *      Kaffe.org contributors. See ChangeLog for details.
+ *
  * See the file "license.terms" for information on usage and redistribution 
  * of this file. 
  */
@@ -13,6 +16,7 @@
 #define __i386_sco3_2v5_md_h
 
 #include "i386/common.h"
+#include "i386/sysdepCallMethod.h"
 #include "i386/threads.h"
 
 #define	POSIX_SIGNALS
Index: kaffe/config/i386/solaris2/md.h
diff -u kaffe/config/i386/solaris2/md.h:1.2 kaffe/config/i386/solaris2/md.h:1.3
--- kaffe/config/i386/solaris2/md.h:1.2	Wed Aug 27 07:04:23 2003
+++ kaffe/config/i386/solaris2/md.h	Thu Dec 11 17:56:25 2003
@@ -5,6 +5,9 @@
  * Copyright (c) 1996, 1997
  *	Transvirtual Technologies, Inc.  All rights reserved.
  *
+ * Copyright (c) 2003
+ *      Kaffe.org contributors. See ChangeLog for details.
+ *
  * See the file "license.terms" for information on usage and redistribution 
  * of this file. 
  */
@@ -13,6 +16,7 @@
 #define __i386_solaris2_md_h
 
 #include "i386/common.h"
+#include "i386/sysdepCallMethod.h"
 #include "i386/threads.h"
 
 #define	SIGNAL_ARGS(sig, sc) int sig, siginfo_t* sip, ucontext_t* sc
Index: kaffe/config/i386/univel_svr4/md.h
diff -u kaffe/config/i386/univel_svr4/md.h:1.4 kaffe/config/i386/univel_svr4/md.h:1.5
--- kaffe/config/i386/univel_svr4/md.h:1.4	Wed Aug 27 07:04:24 2003
+++ kaffe/config/i386/univel_svr4/md.h	Thu Dec 11 17:56:25 2003
@@ -5,6 +5,9 @@
  * Copyright (c) 1996, 1997
  *	Transvirtual Technologies, Inc.  All rights reserved.
  *
+ * Copyright (c) 2003
+ *      Kaffe.org contributors. See ChangeLog for details.
+ *
  * See the file "license.terms" for information on usage and redistribution 
  * of this file. 
  */
@@ -13,6 +16,7 @@
 #define __i386_univel_svr4_md_h
 
 #include "i386/common.h"
+#include "i386/sysdepCallMethod.h"
 #include "i386/threads.h"
 
 /* Function prototype for signal handlers */
Index: kaffe/config/i386/win32/md.h
diff -u kaffe/config/i386/win32/md.h:1.2 kaffe/config/i386/win32/md.h:1.3
--- kaffe/config/i386/win32/md.h:1.2	Tue Jul 27 23:30:41 1999
+++ kaffe/config/i386/win32/md.h	Thu Dec 11 17:56:25 2003
@@ -5,6 +5,9 @@
  * Copyright (c) 1996, 1997, 1998
  *	Transvirtual Technologies, Inc.  All rights reserved.
  *
+ * Copyright (c) 2003
+ *      Kaffe.org contributors. See ChangeLog for details.
+ *
  * See the file "license.terms" for information on usage and redistribution 
  * of this file. 
  */
@@ -17,6 +20,8 @@
 #include "i386/common.h"
 #include "i386/threads.h"
 
+#include "support.h"
+
 #if !defined(EXTERN_C)
 #define EXTERN_C extern
 #endif
@@ -33,8 +38,10 @@
 
 extern void _sysdepCallMethod(void*);
 
-#undef sysdepCallMethod
-#define	sysdepCallMethod(M) _sysdepCallMethod((void*)(M)) /* Provided by WIN32-MD.ASM */
+static inline void sysdepCallMethod(callMethodInfo *call) {
+	/* Provided by WIN32-MD.ASM */
+	return _sysdepCallMethod((void*)(call));
+}
 
 extern int _compareAndExchange(void*, void*, void*);