[kaffe] CVS kaffe (dalibor): Cleaned up sysdepCallMethod for s390

Kaffe CVS Kaffe Mailing List <kaffe@kaffe.org>
Sat Dec 13 12:09:02 2003


PatchSet 4224 
Date: 2003/12/13 20:01:52
Author: dalibor
Branch: HEAD
Tag: (none) 
Log:
Cleaned up sysdepCallMethod for s390

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

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

        * config/s390/common.h: Moved sysdepCallMethod
        into config/s390/sysdepCallMethod.h.

        * config/s390/linux/md.h:
        Include config/s390/sysdepCallMethod.h.

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

        * aclocal.m4,
        config/Makefile.in:
        Regenerated.

Members: 
	ChangeLog:1.1813->1.1814 
	aclocal.m4:1.82->1.83 
	config/Makefile.am:1.33->1.34 
	config/Makefile.in:1.100->1.101 
	config/s390/common.h:1.2->1.3 
	config/s390/sysdepCallMethod.h:INITIAL->1.1 
	config/s390/linux/md.h:1.2->1.3 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.1813 kaffe/ChangeLog:1.1814
--- kaffe/ChangeLog:1.1813	Sat Dec 13 19:31:25 2003
+++ kaffe/ChangeLog	Sat Dec 13 20:01:52 2003
@@ -1,5 +1,22 @@
 2003-12-13  Dalibor Topic <robilad@kaffe.org>
 
+	* config/s390/sysdepCallMethod.h: New file.
+
+	* config/s390/common.h: Moved sysdepCallMethod
+	into config/s390/sysdepCallMethod.h.
+
+	* config/s390/linux/md.h:
+	Include config/s390/sysdepCallMethod.h.
+
+	* config/Makefile.am
+	(EXTRA_DIST): Added config/s390/sysdepCallMethod.h.
+
+	* aclocal.m4,
+	config/Makefile.in:
+	Regenerated.
+
+2003-12-13  Dalibor Topic <robilad@kaffe.org>
+
 	* config/mips/sysdepCallMethod.h: New file.
 
 	* config/mips/common.h: Moved sysdepCallMethod selection
Index: kaffe/aclocal.m4
diff -u kaffe/aclocal.m4:1.82 kaffe/aclocal.m4:1.83
--- kaffe/aclocal.m4:1.82	Sat Dec 13 19:31:26 2003
+++ kaffe/aclocal.m4	Sat Dec 13 20:01:53 2003
@@ -8723,7 +8723,7 @@
 AU_DEFUN([fp_WITH_DMALLOC], [AM_WITH_DMALLOC])
 
 # ----------------------------------------------------------------------------
-# $Id: aclocal.m4,v 1.82 2003/12/13 19:31:26 dalibor Exp $
+# $Id: aclocal.m4,v 1.83 2003/12/13 20:01:53 dalibor Exp $
 #
 # Copyright (C) 2003 Free Software Foundation, Inc.
 #
@@ -8767,7 +8767,7 @@
 #
 # GNU Crypto m4 macro for use by VM Providers
 #
-# $Revision: 1.82 $
+# $Revision: 1.83 $
 #
 
 # process --with-gnu-crypto configure option.
Index: kaffe/config/Makefile.am
diff -u kaffe/config/Makefile.am:1.33 kaffe/config/Makefile.am:1.34
--- kaffe/config/Makefile.am:1.33	Sat Dec 13 19:31:27 2003
+++ kaffe/config/Makefile.am	Sat Dec 13 20:01:53 2003
@@ -269,6 +269,7 @@
 	s390/linux/config.frag \
 	s390/linux/md.c \
 	s390/linux/md.h \
+	s390/sysdepCallMethod.h \
 	s390/threads.h \
 	sparc/bsdi3/config.frag \
 	sparc/bsdi3/jit-md.h \
Index: kaffe/config/Makefile.in
diff -u kaffe/config/Makefile.in:1.100 kaffe/config/Makefile.in:1.101
--- kaffe/config/Makefile.in:1.100	Sat Dec 13 19:31:27 2003
+++ kaffe/config/Makefile.in	Sat Dec 13 20:01:53 2003
@@ -511,6 +511,7 @@
 	s390/linux/config.frag \
 	s390/linux/md.c \
 	s390/linux/md.h \
+	s390/sysdepCallMethod.h \
 	s390/threads.h \
 	sparc/bsdi3/config.frag \
 	sparc/bsdi3/jit-md.h \
Index: kaffe/config/s390/common.h
diff -u kaffe/config/s390/common.h:1.2 kaffe/config/s390/common.h:1.3
--- kaffe/config/s390/common.h:1.2	Sun Oct  5 00:14:27 2003
+++ kaffe/config/s390/common.h	Sat Dec 13 20:01:55 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. 
  */
@@ -15,160 +18,6 @@
 /* The s390 gcc port aligns to the appropriate boundary: 1->1, 2->2, 4->4,
    and 8->8.  So alignment is pretty simple: */
 #define  ALIGNMENT_OF_SIZE(S) (S)
-
-/*
- * 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
-/*
- * The calling convention is as follows:
- *
- * Up to the first five up-to-32-bit integer values are passed in general
- * purpose registers 2 through 6, and the remainder go on the stack.  
- * Types shorter than 32 bits (i.e. byte, boolean, char and short) are 
- * promoted to 32 bits (i.e. to int).
- *
- * 64-bit integer values are intermingled with 32-bit values in the
- * order they appear in the argument list, and are passed in pairs of
- * registers (NOT even/odd pairs, just pairs) or on the stack.  If there 
- * is only one register available and the next integer argument is a
- * 64-bit value, that register is unused and all the remaining integer
- * values are passed on the stack.
- *
- * Floating point values are passed in floating point registers 0 and 2,
- * and then on the stack.
- * 
- * Function results are returned in GPR 2 (up-to-32-bit integer), GPRS 2
- * and 3 (64-bit integer) or FPR 2 (floating point).
- * 
- * Values on the stack are intermingled in the order they appear.
- *
- * Based on implementation in config/arm/common.h, with guidance from
- * <http://ww2.biglobe.ne.jp/~inaba/sysdepCallMethod.html>, 
- * /usr/src/linux/Documentation/Debugging390.txt, and analysis of
- * assorted test programs compiled with gcc 2.95.2+IBM S/390 patches and
- * decompiled with objdump.
- *
- * Ross Patterson <Ross.Patterson@CA.Com>
- * Computer Associates International, Inc.
- */
-#define  sysdepCallMethod(CALL) do {                                    \
- /*                                                                     \
-  * argl is placed here to exploit a gcc artifact: the first            \
-  * automatic variable defined is placed at the lowest address on the   \
-  * stack frame.  Thus by judicious fiddling of the stack pointer,      \
-  * argl becomes the argument list to the callee function.  This        \
-  * is explained nicely at the URL above.                               \
-  */                                                                    \
-  int argl[(CALL)->nrargs];                /* outgoing args on stack */ \
-  union {                                             /* fp reg args */ \
-      float f;                                                          \
-      double d;                                                         \
-        } fpr_args[2];                                                  \
-  int gpr_args[5] = {0, 0, 0, 0, 0};                  /* gp reg args */ \
-    {                                                                   \
-      int *out_args = argl;                /* outgoing args on stack */ \
-      int argidx = {0};                           /* input arg index */ \
-      int fpr_argc = {0};                        /* fp reg arg count */ \
-      int gpr_argc = {0};                        /* gp reg arg count */ \
-      for(; argidx < (CALL)->nrargs; ++argidx) {                        \
-         DBG(SYSDEPCALLMETHOD,                                          \
-             printf("sysdepCallMethod: arg[%2d]=%c/%d  V=%8x %8x\n",    \
-                    argidx, (CALL)->calltype[argidx],                   \
-                    (CALL)->callsize[argidx],                           \
-                    (&(CALL)->args[argidx].i)[0],                       \
-                    (&(CALL)->args[argidx].i)[1]);                      \
-            )                                                           \
-         if ((CALL)->callsize[argidx] != 0) { /* if non-empty, copy: */ \
-           switch ((CALL)->calltype[argidx]) {                          \
-           case 'B':                          /* 8-bit byte          */ \
-           case 'Z':                          /* 8-bit boolean       */ \
-           case 'C':                          /* 16-bit char         */ \
-           case 'S':                          /* 16-bit int          */ \
-           case 'I':                          /* 32-bit int          */ \
-           case 'L':                          /* 32-bit objectref    */ \
-             if (gpr_argc < 5)       /* if any gp regs left, use one */ \
-                gpr_args[gpr_argc++] = (CALL)->args[argidx].i;          \
-             else          /* otherwise, put it on the outgoing list */ \
-               *out_args++ = (CALL)->args[argidx].i;                    \
-             break;                                                     \
-           case 'J':                          /* 64-bit int          */ \
-             if (gpr_argc < 4) {    /* if two gp regs left, use them */ \
-                gpr_args[gpr_argc++] = (&(CALL)->args[argidx].i)[0];    \
-                gpr_args[gpr_argc++] = (&(CALL)->args[argidx].i)[1];    \
-             }                                                          \
-             else {        /* otherwise, put it on the outgoing list */ \
-               *out_args++ = (&(CALL)->args[argidx].i)[0];              \
-               *out_args++ = (&(CALL)->args[argidx].i)[1];              \
-               if (gpr_argc == 4)                                       \
-                  gpr_argc++;        /* do not use last gpr for args */ \
-             }                                                          \
-             break;                                                     \
-           case 'F':                          /* 32-bit float        */ \
-             if (fpr_argc < 2)       /* if any fp regs left, use one */ \
-                fpr_args[fpr_argc++].f = (CALL)->args[argidx].f;        \
-             else          /* otherwise, put it on the outgoing list */ \
-               *out_args++ = (CALL)->args[argidx].i;                    \
-             break;                                                     \
-           case 'D':                          /* 64-bit float        */ \
-             if (fpr_argc < 2)       /* if any fp regs left, use one */ \
-                fpr_args[fpr_argc++].d = (CALL)->args[argidx].d;        \
-             else {        /* otherwise, put it on the outgoing list */ \
-               *out_args++ = (&(CALL)->args[argidx].i)[0];              \
-               *out_args++ = (&(CALL)->args[argidx].i)[1];              \
-             }                                                          \
-             break;                                                     \
-           default:                                                     \
-             printf("sysdepCallMethod: unknown arg[%d] type %c\n",      \
-                argidx, ((CALL)->calltype[argidx]));                    \
-           } /* switch ((CALL)->calltype[argidx]) */                    \
-         } /* if ((CALL)->callsize[argidx] != 0) */                     \
-      } /* for(; argidx < (CALL)->nrargs; ++argidx) */                  \
-    }                                                                   \
-    asm (" \n"								\
-"     ld    0,0(,%2)                        # Load fpr args         \n"	\
-"     ld    2,8(,%2)                        #    into regs 0-2.     \n"	\
-"     lm    2,6,0(%1)                       # Load gpr args into 2-6\n"	\
-"     basr 14,%0                            # Call the routine.     \n"	\
-"     stm   2,3,0(%1)                       # Save int result.      \n"	\
-"     std   0,0(,%2)                        # Save float result.    \n"	\
-"     "                                                                 \
-        :                                     /* sets these          */ \
-        : "ra" ((CALL)->function),            /* uses these          */ \
-          "ra" (gpr_args),                                              \
-          "ra" (fpr_args)                                               \
-        : "cc",                               /* clobbers these      */ \
-          "0", "1", "2", "3", "4", "5", "6", "7",                       \
-                                        "14",                           \
-          "16", "17", "18", "19",       "21",       "23",               \
-          "24", "25", "26", "27", "28", "29", "30", "31",               \
-          "memory"              /* just gpr_args[0..1] & fpr_args[0] */ \
-   );                                                                   \
-        DBG(SYSDEPCALLMETHOD,                                           \
-            printf("sysdepCallMethod: rettype=%c/%d R2=%8x R3=%8x F0=%8x %8x\n",\
-                   (CALL)->rettype, (CALL)->retsize, gpr_args[0],       \
-                   gpr_args[1], ((int *)&fpr_args)[0],                  \
-                   ((int *)&fpr_args)[1]);                              \
-        )                                                               \
-    switch ((CALL)->rettype) {                /* what kind of retval?*/ \
-    case 'D':                                 /* 64-bit float        */ \
-       (CALL)->ret->d = fpr_args[0].d;                                  \
-       break;                                                           \
-    case 'F':                                 /* 32-bit float        */ \
-       (CALL)->ret->f = fpr_args[0].f;                                  \
-       break;                                                           \
-    case 'J':                                 /* 64-bit int          */ \
-       (&(CALL)->ret->i)[1] = gpr_args[1];                              \
-    default:                                  /* all shorter types   */ \
-       (CALL)->ret->i = gpr_args[0];                                    \
-    } /* switch ((CALL)->rettype) */                                    \
-} while (0)
-#endif /* NEED_sysdepCallMethod */
-
 
 #if defined(__GNUC__)
 #define KAFFE_PROFILER 1
===================================================================
Checking out kaffe/config/s390/sysdepCallMethod.h
RCS:  /home/cvs/kaffe/kaffe/config/s390/sysdepCallMethod.h,v
VERS: 1.1
***************
--- /dev/null	Sun Aug  4 19:57:58 2002
+++ kaffe/config/s390/sysdepCallMethod.h	Sat Dec 13 20:04:38 2003
@@ -0,0 +1,174 @@
+/*
+ * s390/sysdepCallMethod.h (cloned from s390/common.h by ROSSP)
+ * Common s390 configuration information.
+ *
+ * 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 __s390_sysdepCallMethod_h
+#define __s390_sysdepCallMethod_h
+
+#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
+/*
+ * The calling convention is as follows:
+ *
+ * Up to the first five up-to-32-bit integer values are passed in general
+ * purpose registers 2 through 6, and the remainder go on the stack.  
+ * Types shorter than 32 bits (i.e. byte, boolean, char and short) are 
+ * promoted to 32 bits (i.e. to int).
+ *
+ * 64-bit integer values are intermingled with 32-bit values in the
+ * order they appear in the argument list, and are passed in pairs of
+ * registers (NOT even/odd pairs, just pairs) or on the stack.  If there 
+ * is only one register available and the next integer argument is a
+ * 64-bit value, that register is unused and all the remaining integer
+ * values are passed on the stack.
+ *
+ * Floating point values are passed in floating point registers 0 and 2,
+ * and then on the stack.
+ * 
+ * Function results are returned in GPR 2 (up-to-32-bit integer), GPRS 2
+ * and 3 (64-bit integer) or FPR 2 (floating point).
+ * 
+ * Values on the stack are intermingled in the order they appear.
+ *
+ * Based on implementation in config/arm/common.h, with guidance from
+ * <http://ww2.biglobe.ne.jp/~inaba/sysdepCallMethod.html>, 
+ * /usr/src/linux/Documentation/Debugging390.txt, and analysis of
+ * assorted test programs compiled with gcc 2.95.2+IBM S/390 patches and
+ * decompiled with objdump.
+ *
+ * Ross Patterson <Ross.Patterson@CA.Com>
+ * Computer Associates International, Inc.
+ */
+static inline void sysdepCallMethod(callMethodInfo *call)
+{
+ /*
+  * argl is placed here to exploit a gcc artifact: the first
+  * automatic variable defined is placed at the lowest address on the
+  * stack frame.  Thus by judicious fiddling of the stack pointer,
+  * argl becomes the argument list to the callee function.  This
+  * is explained nicely at the URL above.
+  */
+  int argl[(CALL)->nrargs];                /* outgoing args on stack */
+  union {                                             /* fp reg args */
+      float f;
+      double d;
+        } fpr_args[2];
+  int gpr_args[5] = {0, 0, 0, 0, 0};                  /* gp reg args */
+    {
+      int *out_args = argl;                /* outgoing args on stack */
+      int argidx = {0};                           /* input arg index */
+      int fpr_argc = {0};                        /* fp reg arg count */
+      int gpr_argc = {0};                        /* gp reg arg count */
+      for(; argidx < (CALL)->nrargs; ++argidx) {
+         DBG(SYSDEPCALLMETHOD,
+             printf("sysdepCallMethod: arg[%2d]=%c/%d  V=%8x %8x\n",
+                    argidx, (CALL)->calltype[argidx],
+                    (CALL)->callsize[argidx],
+                    (&(CALL)->args[argidx].i)[0],
+                    (&(CALL)->args[argidx].i)[1]);
+            )
+         if ((CALL)->callsize[argidx] != 0) { /* if non-empty, copy: */
+           switch ((CALL)->calltype[argidx]) {
+           case 'B':                          /* 8-bit byte          */
+           case 'Z':                          /* 8-bit boolean       */
+           case 'C':                          /* 16-bit char         */
+           case 'S':                          /* 16-bit int          */
+           case 'I':                          /* 32-bit int          */
+           case 'L':                          /* 32-bit objectref    */
+             if (gpr_argc < 5)       /* if any gp regs left, use one */
+                gpr_args[gpr_argc++] = (CALL)->args[argidx].i;
+             else          /* otherwise, put it on the outgoing list */
+               *out_args++ = (CALL)->args[argidx].i;
+             break;
+           case 'J':                          /* 64-bit int          */
+             if (gpr_argc < 4) {    /* if two gp regs left, use them */
+                gpr_args[gpr_argc++] = (&(CALL)->args[argidx].i)[0];
+                gpr_args[gpr_argc++] = (&(CALL)->args[argidx].i)[1];
+             }
+             else {        /* otherwise, put it on the outgoing list */
+               *out_args++ = (&(CALL)->args[argidx].i)[0];
+               *out_args++ = (&(CALL)->args[argidx].i)[1];
+               if (gpr_argc == 4)
+                  gpr_argc++;        /* do not use last gpr for args */
+             }
+             break;
+           case 'F':                          /* 32-bit float        */
+             if (fpr_argc < 2)       /* if any fp regs left, use one */
+                fpr_args[fpr_argc++].f = (CALL)->args[argidx].f;
+             else          /* otherwise, put it on the outgoing list */
+               *out_args++ = (CALL)->args[argidx].i;
+             break;
+           case 'D':                          /* 64-bit float        */
+             if (fpr_argc < 2)       /* if any fp regs left, use one */
+                fpr_args[fpr_argc++].d = (CALL)->args[argidx].d;
+             else {        /* otherwise, put it on the outgoing list */
+               *out_args++ = (&(CALL)->args[argidx].i)[0];
+               *out_args++ = (&(CALL)->args[argidx].i)[1];
+             }
+             break;
+           default:
+             printf("sysdepCallMethod: unknown arg[%d] type %c\n",
+                argidx, ((CALL)->calltype[argidx]));
+           } /* switch ((CALL)->calltype[argidx]) */
+         } /* if ((CALL)->callsize[argidx] != 0) */
+      } /* for(; argidx < (CALL)->nrargs; ++argidx) */
+    }
+    asm (" \n"
+"     ld    0,0(,%2)                        # Load fpr args         \n"
+"     ld    2,8(,%2)                        #    into regs 0-2.     \n"
+"     lm    2,6,0(%1)                       # Load gpr args into 2-6\n"
+"     basr 14,%0                            # Call the routine.     \n"
+"     stm   2,3,0(%1)                       # Save int result.      \n"
+"     std   0,0(,%2)                        # Save float result.    \n"
+"     "
+        :                                     /* sets these          */
+        : "ra" ((CALL)->function),            /* uses these          */
+          "ra" (gpr_args),
+          "ra" (fpr_args)
+        : "cc",                               /* clobbers these      */
+          "0", "1", "2", "3", "4", "5", "6", "7",
+                                        "14",
+          "16", "17", "18", "19",       "21",       "23",
+          "24", "25", "26", "27", "28", "29", "30", "31",
+          "memory"              /* just gpr_args[0..1] & fpr_args[0] */
+   );
+        DBG(SYSDEPCALLMETHOD,
+            printf("sysdepCallMethod: rettype=%c/%d R2=%8x R3=%8x F0=%8x %8x\n",
+                   (CALL)->rettype, (CALL)->retsize, gpr_args[0],
+                   gpr_args[1], ((int *)&fpr_args)[0],
+                   ((int *)&fpr_args)[1]);
+        )
+    switch ((CALL)->rettype) {                /* what kind of retval?*/
+    case 'D':                                 /* 64-bit float        */
+       (CALL)->ret->d = fpr_args[0].d;
+       break;
+    case 'F':                                 /* 32-bit float        */
+       (CALL)->ret->f = fpr_args[0].f;
+       break;
+    case 'J':                                 /* 64-bit int          */
+       (&(CALL)->ret->i)[1] = gpr_args[1];
+    default:                                  /* all shorter types   */
+       (CALL)->ret->i = gpr_args[0];
+    } /* switch ((CALL)->rettype) */
+}
+#endif /* NEED_sysdepCallMethod */
+
+#endif /* __s390_sysdepCallMethod_h */
Index: kaffe/config/s390/linux/md.h
diff -u kaffe/config/s390/linux/md.h:1.2 kaffe/config/s390/linux/md.h:1.3
--- kaffe/config/s390/linux/md.h:1.2	Thu Jun 12 22:23:14 2003
+++ kaffe/config/s390/linux/md.h	Sat Dec 13 20:01:55 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 __ks390_linux_md_h
 
 #include "s390/common.h"
+#include "s390/sysdepCallMethod.h"
 #include "s390/threads.h"
 
 #if defined(TRANSLATOR)