Merged revisions 7707-7722 via svnmerge from
authormichi <none@none>
Mon, 16 Apr 2007 18:03:08 +0000 (18:03 +0000)
committermichi <none@none>
Mon, 16 Apr 2007 18:03:08 +0000 (18:03 +0000)
svn+ssh://michi@c1.complang.tuwien.ac.at/ahome/cacao/svn/cacao/trunk

........
  r7712 | twisti | 2007-04-15 23:13:03 +0200 (Sun, 15 Apr 2007) | 4 lines

  * src/vm/jit/mips/emit.c (emit_load): Bugfix: Added missing float
  instruction.
  (emit_store): Likewise.
........
  r7713 | twisti | 2007-04-15 23:49:48 +0200 (Sun, 15 Apr 2007) | 29 lines

  * src/vm/jit/reg.c (reg_setup): Removed arg{int,flt}regs stuff.
  * src/vm/jit/reg.h (registerdata): Removed arg{int,flt}regs.

  * src/vm/jit/stack.c (stack_analyse): regoff now contains the register
  number instead of an offset.

  * src/vm/jit/allocator/simplereg.c: Use
  abi_registers_{integer,float}_argument instead of arg{int,flt}regs.

  * src/vm/jit/alpha/codegen.c,
  src/vm/jit/alpha/emit.c,
  src/vm/jit/alpha/md-abi.c,
  src/vm/jit/arm/codegen.c,
  src/vm/jit/arm/emit.c,
  src/vm/jit/arm/md-abi.c,
  src/vm/jit/arm/md-abi.h,
  src/vm/jit/i386/codegen.c,
  src/vm/jit/i386/md-abi.c,
  src/vm/jit/mips/codegen.c,
  src/vm/jit/mips/emit.c,
  src/vm/jit/mips/md-abi.c,
  src/vm/jit/powerpc/codegen.c,
  src/vm/jit/powerpc/emit.c,
  src/vm/jit/powerpc/linux/md-abi.c,
  src/vm/jit/powerpc/linux/md-abi.h,
  src/vm/jit/x86_64/codegen.c,
  src/vm/jit/x86_64/emit.c,
  src/vm/jit/x86_64/md-abi.c: A lot of changes like the ones above.
........
  r7714 | twisti | 2007-04-16 16:11:14 +0200 (Mon, 16 Apr 2007) | 4 lines

  * src/vm/builtin.c (builtin_print_argument): Removed java_lang_String
  until we know what we do with strings internally (more patches to
  come).
........
  r7715 | twisti | 2007-04-16 16:28:30 +0200 (Mon, 16 Apr 2007) | 5 lines

  * src/threads/threads-common.c (native/include/java_lang_String.h):
  Added.
  (threads_create_thread): Fixed string-internal warnings.
  (threads_dump): Likewise.
........
  r7716 | twisti | 2007-04-16 16:29:53 +0200 (Mon, 16 Apr 2007) | 2 lines

  * src/vmcore/utf8.c (utf_get_number_of_u2s): Return 0 instead of NULL.
........
  r7717 | twisti | 2007-04-16 17:23:32 +0200 (Mon, 16 Apr 2007) | 5 lines

  * src/native/vm/gnu/java_lang_VMClassLoader.c (loadClass): Fixed
  string-internal warnings.
  (nativeGetResources): Likewise.
  (findLoadedClass): Likewise.
........
  r7718 | twisti | 2007-04-16 17:26:01 +0200 (Mon, 16 Apr 2007) | 3 lines

  * src/native/vm/gnu/java_lang_VMRuntime.c (mapLibraryName): Fixed
  string-internal warnings.
........
  r7719 | twisti | 2007-04-16 17:29:29 +0200 (Mon, 16 Apr 2007) | 3 lines

  * src/native/vm/gnu/java_lang_reflect_Method.c (getSignature): Fixed
  string-internal warnings.
........
  r7720 | twisti | 2007-04-16 17:49:09 +0200 (Mon, 16 Apr 2007) | 13 lines

  * src/native/vm/java_lang_ClassLoader.c (defineClass): Fixed
  string-internal warnings.

  * src/native/vm/java_lang_Runtime.c (loadLibrary): Likewise.

  * src/native/vm/gnu/java_lang_reflect_Field.c (getSignature):
  Likewise.

  * src/native/vm/gnu/java_lang_reflect_Constructor.c (getSignature):
  Likewise.

  * src/native/vm/gnu/java_lang_VMThrowable.c (getStackTrace): Likewise.
........
  r7721 | twisti | 2007-04-16 17:53:53 +0200 (Mon, 16 Apr 2007) | 7 lines

  * src/native/vm/java_lang_Class.c (forName): Fixed string-internal
  warnings.
  (getDeclaredFields): Likewise.
  (getDeclaredMethods): Likewise.
  (getEnclosingMethod): Likewise.
  (getClassSignature): Likewise.
........
  r7722 | twisti | 2007-04-16 17:57:21 +0200 (Mon, 16 Apr 2007) | 5 lines

  * src/native/jni.c (_Jv_JNI_DefineClass): Fixed string-internal
  warnings.
  (_Jv_JNI_NewStringUTF): Likewise.
  (_Jv_JNI_GetStringUTFChars): Likewise.
........

--HG--
branch : exact-gc

36 files changed:
src/native/jni.c
src/native/vm/gnu/java_lang_VMClassLoader.c
src/native/vm/gnu/java_lang_VMRuntime.c
src/native/vm/gnu/java_lang_VMThrowable.c
src/native/vm/gnu/java_lang_reflect_Constructor.c
src/native/vm/gnu/java_lang_reflect_Field.c
src/native/vm/gnu/java_lang_reflect_Method.c
src/native/vm/java_lang_Class.c
src/native/vm/java_lang_ClassLoader.c
src/native/vm/java_lang_Runtime.c
src/threads/threads-common.c
src/vm/builtin.c
src/vm/jit/allocator/simplereg.c
src/vm/jit/alpha/codegen.c
src/vm/jit/alpha/emit.c
src/vm/jit/alpha/md-abi.c
src/vm/jit/arm/codegen.c
src/vm/jit/arm/emit.c
src/vm/jit/arm/md-abi.c
src/vm/jit/arm/md-abi.h
src/vm/jit/i386/codegen.c
src/vm/jit/i386/md-abi.c
src/vm/jit/mips/codegen.c
src/vm/jit/mips/emit.c
src/vm/jit/mips/md-abi.c
src/vm/jit/powerpc/codegen.c
src/vm/jit/powerpc/emit.c
src/vm/jit/powerpc/linux/md-abi.c
src/vm/jit/powerpc/linux/md-abi.h
src/vm/jit/reg.c
src/vm/jit/reg.h
src/vm/jit/stack.c
src/vm/jit/x86_64/codegen.c
src/vm/jit/x86_64/emit.c
src/vm/jit/x86_64/md-abi.c
src/vmcore/utf8.c

index 25386f917baaed006f6ac5d9d2cac16fa01ab8e4..a011a0f0fe38b729ba56b189f2ebd184a4a47fab 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: jni.c 7601 2007-03-28 23:02:50Z michi $
+   $Id: jni.c 7723 2007-04-16 18:03:08Z michi $
 
 */
 
@@ -1127,7 +1127,7 @@ jclass _Jv_JNI_DefineClass(JNIEnv *env, const char *name, jobject loader,
        STATISTICS(jniinvokation());
 
        cl = (java_lang_ClassLoader *) loader;
-       s  = javastring_new_from_utf_string(name);
+       s  = (java_lang_String *) javastring_new_from_utf_string(name);
        ba = (java_bytearray *) buf;
 
        c = (jclass) _Jv_java_lang_ClassLoader_defineClass(cl, s, ba, 0, bufLen,
@@ -4179,7 +4179,8 @@ void _Jv_JNI_ReleaseStringChars(JNIEnv *env, jstring str, const jchar *chars)
 
 /* NewStringUTF ****************************************************************
 
-   Constructs a new java.lang.String object from an array of UTF-8 characters.
+   Constructs a new java.lang.String object from an array of UTF-8
+   characters.
 
 *******************************************************************************/
 
@@ -4189,7 +4190,7 @@ jstring _Jv_JNI_NewStringUTF(JNIEnv *env, const char *bytes)
 
        STATISTICS(jniinvokation());
 
-       s = javastring_safe_new_from_utf8(bytes);
+       s = (java_lang_String *) javastring_safe_new_from_utf8(bytes);
 
     return (jstring) _Jv_JNI_NewLocalRef(env, (jobject) s);
 }
@@ -4228,7 +4229,7 @@ const char *_Jv_JNI_GetStringUTFChars(JNIEnv *env, jstring string,
        if (isCopy)
                *isCopy = JNI_TRUE;
        
-       u = javastring_toutf((java_lang_String *) string, false);
+       u = javastring_toutf((java_objectheader *) string, false);
 
        if (u != NULL)
                return u->text;
index aed9dde716b015d8e635aa9e039d97031f3a45c1..eac72274226b94d55353d1c4badaa225cdcbba89 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: java_lang_VMClassLoader.c 7441 2007-03-02 23:13:10Z michi $
+   $Id: java_lang_VMClassLoader.c 7723 2007-04-16 18:03:08Z michi $
 
 */
 
@@ -175,7 +175,7 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_loadClass(JNIEnv
 
        /* create utf string in which '.' is replaced by '/' */
 
-       u = javastring_toutf(name, true);
+       u = javastring_toutf((java_objectheader *) name, true);
 
        /* load class */
 
@@ -219,9 +219,9 @@ JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_loadClass(JNIEnv
  */
 JNIEXPORT java_util_Vector* JNICALL Java_java_lang_VMClassLoader_nativeGetResources(JNIEnv *env, jclass clazz, java_lang_String *name)
 {
-       jobject               o;         /* vector being created     */
+       java_objectheader    *o;         /* vector being created     */
        methodinfo           *m;         /* "add" method of vector   */
-       java_lang_String     *path;      /* path to be added         */
+       java_objectheader    *path;      /* path to be added         */
        list_classpath_entry *lce;       /* classpath entry          */
        utf                  *utfname;   /* utf to look for          */
        char                 *buffer;    /* char buffer              */
@@ -236,16 +236,17 @@ JNIEXPORT java_util_Vector* JNICALL Java_java_lang_VMClassLoader_nativeGetResour
 
        /* get the resource name as utf string */
 
-       utfname = javastring_toutf(name, false);
-       if (!utfname)
+       utfname = javastring_toutf((java_objectheader *) name, false);
+
+       if (utfname == NULL)
                return NULL;
 
        /* copy it to a char buffer */
 
-       namelen = utf_bytes(utfname);
+       namelen   = utf_bytes(utfname);
        searchlen = namelen;
-       bufsize = namelen + strlen("0");
-       buffer = MNEW(char, bufsize);
+       bufsize   = namelen + strlen("0");
+       buffer    = MNEW(char, bufsize);
 
        utf_copy(buffer, utfname);
        namestart = buffer;
@@ -276,7 +277,7 @@ JNIEXPORT java_util_Vector* JNICALL Java_java_lang_VMClassLoader_nativeGetResour
 
        o = native_new_and_init(class_java_util_Vector);
 
-       if (!o)
+       if (o == NULL)
                goto return_NULL;
 
        /* get Vector.add() method */
@@ -287,7 +288,7 @@ JNIEXPORT java_util_Vector* JNICALL Java_java_lang_VMClassLoader_nativeGetResour
                                                                 NULL,
                                                                 true);
 
-       if (!m)
+       if (m == NULL)
                goto return_NULL;
 
        /* iterate over all classpath entries */
@@ -333,7 +334,7 @@ JNIEXPORT java_util_Vector* JNICALL Java_java_lang_VMClassLoader_nativeGetResour
 
                /* if a resource was found, add it to the vector */
 
-               if (path) {
+               if (path != NULL) {
                        ret = vm_call_method_int(m, o, path);
 
                        if (exceptions_get_exception() != NULL)
@@ -371,23 +372,26 @@ JNIEXPORT s4 JNICALL Java_java_lang_VMClassLoader_defaultAssertionStatus(JNIEnv
  * Method:    findLoadedClass
  * Signature: (Ljava/lang/ClassLoader;Ljava/lang/String;)Ljava/lang/Class;
  */
-JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_findLoadedClass(JNIEnv *env, jclass clazz, java_lang_ClassLoader *cl, java_lang_String *name)
+JNIEXPORT java_lang_Class* JNICALL Java_java_lang_VMClassLoader_findLoadedClass(JNIEnv *env, jclass clazz, java_lang_ClassLoader *loader, java_lang_String *name)
 {
-       classinfo *c;
-       utf       *u;
+       classloader *cl;
+       classinfo   *c;
+       utf         *u;
+
+       cl = (classloader *) loader;
 
        /* replace `.' by `/', this is required by the classcache */
 
-       u = javastring_toutf(name, true);
+       u = javastring_toutf((java_objectheader *) name, true);
 
        /* lookup for defining classloader */
 
-       c = classcache_lookup_defined((classloader *) cl, u);
+       c = classcache_lookup_defined(cl, u);
 
        /* if not found, lookup for initiating classloader */
 
        if (c == NULL)
-               c = classcache_lookup((classloader *) cl, u);
+               c = classcache_lookup(cl, u);
 
        return (java_lang_Class *) c;
 }
index fcd7642cc78cc2f9bdba4a244cafd3ec6cfdb1b0..98d52dbdf3ae5d2d2cae101c6e7082430a76880e 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: java_lang_VMRuntime.c 7376 2007-02-20 00:42:27Z twisti $
+   $Id: java_lang_VMRuntime.c 7718 2007-04-16 15:26:01Z twisti $
 
 */
 
@@ -256,18 +256,18 @@ JNIEXPORT s4 JNICALL Java_java_lang_VMRuntime_nativeLoad(JNIEnv *env, jclass cla
  */
 JNIEXPORT java_lang_String* JNICALL Java_java_lang_VMRuntime_mapLibraryName(JNIEnv *env, jclass clazz, java_lang_String *libname)
 {
-       utf              *u;
-       char             *buffer;
-       s4                buffer_len;
-       s4                dumpsize;
-       java_lang_String *s;
+       utf               *u;
+       char              *buffer;
+       s4                 buffer_len;
+       s4                 dumpsize;
+       java_objectheader *o;
 
-       if (!libname) {
+       if (libname == NULL) {
                exceptions_throw_nullpointerexception();
                return NULL;
        }
 
-       u = javastring_toutf(libname, 0);
+       u = javastring_toutf((java_objectheader *) libname, false);
 
        /* calculate length of library name */
 
@@ -297,13 +297,13 @@ JNIEXPORT java_lang_String* JNICALL Java_java_lang_VMRuntime_mapLibraryName(JNIE
        strcat(buffer, ".so");
 #endif
 
-       s = javastring_new_from_utf_string(buffer);
+       o = javastring_new_from_utf_string(buffer);
 
        /* release memory */
 
        dump_release(dumpsize);
 
-       return s;
+       return (java_lang_String *) o;
 }
 
 
index 90633386126c2a334350c6e933a63335caaa1fca..d70d4b78474f5ddc3a13b26ee70bdc2f88bcdd4d 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: java_lang_VMThrowable.c 7246 2007-01-29 18:49:05Z twisti $
+   $Id: java_lang_VMThrowable.c 7720 2007-04-16 15:49:09Z twisti $
 
 */
 
@@ -208,7 +208,7 @@ JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMThrowable_getStackTrace(JNI
 
                if (!(ste->method->flags & ACC_NATIVE)) {
                        if (ste->method->class->sourcefile)
-                               filename = javastring_new(ste->method->class->sourcefile);
+                               filename = (java_lang_String *) javastring_new(ste->method->class->sourcefile);
                        else
                                filename = NULL;
                }
@@ -224,14 +224,15 @@ JNIEXPORT java_objectarray* JNICALL Java_java_lang_VMThrowable_getStackTrace(JNI
 
                /* get declaring class name */
 
-               declaringclass = _Jv_java_lang_Class_getName(ste->method->class);
+               declaringclass =
+                       _Jv_java_lang_Class_getName((java_lang_Class *) ste->method->class);
 
                /* fill the java.lang.StackTraceElement element */
 
                o->fileName       = filename;
                o->lineNumber     = linenumber;
                o->declaringClass = declaringclass;
-               o->methodName     = javastring_new(ste->method->name);
+               o->methodName     = (java_lang_String *) javastring_new(ste->method->name);
                o->isNative       = (ste->method->flags & ACC_NATIVE) ? 1 : 0;
 
                oa->data[i] = (java_objectheader *) o;
index 9a5a343be2438e0a4eddffa570114e390f901abf..f13cde7e5d6da5eb8384dace83899e99988ce233 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: java_lang_reflect_Constructor.c 7573 2007-03-25 18:55:02Z twisti $
+   $Id: java_lang_reflect_Constructor.c 7720 2007-04-16 15:49:09Z twisti $
 
 */
 
@@ -148,9 +148,9 @@ JNIEXPORT java_lang_Object* JNICALL Java_java_lang_reflect_Constructor_construct
  */
 JNIEXPORT java_lang_String* JNICALL Java_java_lang_reflect_Constructor_getSignature(JNIEnv *env, java_lang_reflect_Constructor *this)
 {
-       classinfo        *c;
-       methodinfo       *m;
-       java_lang_String *s;
+       classinfo         *c;
+       methodinfo        *m;
+       java_objectheader *o;
 
        c = (classinfo *) this->clazz;
        m = &(c->methods[this->slot]);
@@ -158,11 +158,11 @@ JNIEXPORT java_lang_String* JNICALL Java_java_lang_reflect_Constructor_getSignat
        if (m->signature == NULL)
                return NULL;
 
-       s = javastring_new(m->signature);
+       o = javastring_new(m->signature);
 
-       /* in error case, s == NULL */
+       /* in error case o is NULL */
 
-       return s;
+       return (java_lang_String *) o;
 }
 
 
index 3d2942508f7c9c1dd783766ad7e88fcb0d27f06d..fb340072669f8785ce03e2fd1872fbd612894c11 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: java_lang_reflect_Field.c 7486 2007-03-08 13:50:07Z twisti $
+   $Id: java_lang_reflect_Field.c 7720 2007-04-16 15:49:09Z twisti $
 
 */
 
@@ -1198,9 +1198,9 @@ JNIEXPORT void JNICALL Java_java_lang_reflect_Field_setDouble(JNIEnv *env, java_
  */
 JNIEXPORT java_lang_String* JNICALL Java_java_lang_reflect_Field_getSignature(JNIEnv *env, java_lang_reflect_Field* this)
 {
-       classinfo        *c;
-       fieldinfo        *f;
-       java_lang_String *s;
+       classinfo         *c;
+       fieldinfo         *f;
+       java_objectheader *o;
 
        /* get the class and the field */
 
@@ -1210,11 +1210,11 @@ JNIEXPORT java_lang_String* JNICALL Java_java_lang_reflect_Field_getSignature(JN
        if (f->signature == NULL)
                return NULL;
 
-       s = javastring_new(f->signature);
+       o = javastring_new(f->signature);
 
-       /* in error case, s == NULL */
+       /* in error case o is NULL */
 
-       return s;
+       return (java_lang_String *) o;
 }
 
 
index 2bb0169eabe27a124df48e800f350b74b1a398f5..026d570933eeadb9e0e6b24c1369627982576845 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: java_lang_reflect_Method.c 7573 2007-03-25 18:55:02Z twisti $
+   $Id: java_lang_reflect_Method.c 7719 2007-04-16 15:29:29Z twisti $
 
 */
 
@@ -164,9 +164,9 @@ JNIEXPORT java_lang_Object* JNICALL Java_java_lang_reflect_Method_invokeNative(J
  */
 JNIEXPORT java_lang_String* JNICALL Java_java_lang_reflect_Method_getSignature(JNIEnv *env, java_lang_reflect_Method* this)
 {
-       classinfo        *c;
-       methodinfo       *m;
-       java_lang_String *s;
+       classinfo         *c;
+       methodinfo        *m;
+       java_objectheader *o;
 
        c = (classinfo *) this->declaringClass;
        m = &(c->methods[this->slot]);
@@ -174,11 +174,11 @@ JNIEXPORT java_lang_String* JNICALL Java_java_lang_reflect_Method_getSignature(J
        if (m->signature == NULL)
                return NULL;
 
-       s = javastring_new(m->signature);
+       o = javastring_new(m->signature);
 
-       /* in error case, s == NULL */
+       /* in error case o is NULL */
 
-       return s;
+       return (java_lang_String *) o;
 }
 
 
index c0c3c0d026b844170d225cd57ee9ff3a418b4fe9..6c0c8cda776f39587414ed88bb8fefed85c85cbe 100644 (file)
@@ -134,8 +134,8 @@ java_lang_Class *_Jv_java_lang_Class_forName(java_lang_String *name)
 
        /* create utf string in which '.' is replaced by '/' */
 
-       ufile = javastring_toutf(name, true);
-       uname = javastring_toutf(name, false);
+       ufile = javastring_toutf((java_objectheader *) name, true);
+       uname = javastring_toutf((java_objectheader *) name, false);
 
        /* name must not contain '/' (mauve test) */
 
@@ -608,7 +608,7 @@ java_objectarray *_Jv_java_lang_Class_getDeclaredFields(java_lang_Class *klass,
                        rf = (java_lang_reflect_Field *) o;
 
                        rf->declaringClass = (java_lang_Class *) c;
-                       rf->name           = javastring_new(f->name);
+                       rf->name           = (java_lang_String *) javastring_new(f->name);
                        rf->slot           = i;
 
                        /* store object into array */
@@ -681,7 +681,7 @@ java_objectarray *_Jv_java_lang_Class_getDeclaredMethods(java_lang_Class *klass,
                        rm = (java_lang_reflect_Method *) o;
 
                        rm->declaringClass = (java_lang_Class *) m->class;
-                       rm->name           = javastring_new(m->name);
+                       rm->name           = (java_lang_String *) javastring_new(m->name);
                        rm->slot           = i;
 
                        /* store object into array */
@@ -988,7 +988,7 @@ java_lang_reflect_Method *_Jv_java_lang_Class_getEnclosingMethod(java_lang_Class
        rm = (java_lang_reflect_Method *) o;
 
        rm->declaringClass = (java_lang_Class *) m->class;
-       rm->name           = javastring_new(m->name);
+       rm->name           = (java_lang_String *) javastring_new(m->name);
        rm->slot           = m - m->class->methods;      /* calculate method slot */
 
        return rm;
@@ -1002,19 +1002,19 @@ java_lang_reflect_Method *_Jv_java_lang_Class_getEnclosingMethod(java_lang_Class
  */
 java_lang_String *_Jv_java_lang_Class_getClassSignature(java_lang_Class* klass)
 {
-       classinfo        *c;
-       java_lang_String *s;
+       classinfo         *c;
+       java_objectheader *o;
 
        c = (classinfo *) klass;
 
        if (c->signature == NULL)
                return NULL;
 
-       s = javastring_new(c->signature);
+       o = javastring_new(c->signature);
 
-       /* in error case, s == NULL */
+       /* in error case o is NULL */
 
-       return s;
+       return (java_lang_String *) o;
 }
 
 
index 351991a0e133f5027fb262bd2b08ded6b17718e9..d1e37d63c999ce91cb0022729bfb82ef5800beb7 100644 (file)
@@ -97,7 +97,7 @@ java_lang_Class *_Jv_java_lang_ClassLoader_defineClass(java_lang_ClassLoader *cl
        if (name != NULL) {
                /* convert '.' to '/' in java string */
 
-               utfname = javastring_toutf(name, true);
+               utfname = javastring_toutf((java_objectheader *) name, true);
                
                /* check if this class has already been defined */
 
index d11580fd2fd3a1c203cc23da99eee18fe223f54a..bb52a4d1a5b6febe51b90303ec1dc81236a0a704 100644 (file)
@@ -130,7 +130,7 @@ s4 _Jv_java_lang_Runtime_loadLibrary(java_lang_String *libname, java_objectheade
 #if defined(WITH_STATIC_CLASSPATH)
        return 1;
 #else /* defined(WITH_STATIC_CLASSPATH) */
-       name = javastring_toutf(libname, 0);
+       name = javastring_toutf((java_objectheader *) libname, false);
 
        /* is the library already loaded? */
 
index a6abe93a1fe01acd74fda76db3ae1a439ac88625..2054294b6a928e305b060269732a2465ae388afd 100644 (file)
 #include "config.h"
 #include "vm/types.h"
 
-
 #include "native/jni.h"
+
 #include "native/include/java_lang_Object.h"
+#include "native/include/java_lang_String.h"
 #include "native/include/java_lang_Thread.h"
 
 #if defined(WITH_CLASSPATH_GNU)
@@ -100,7 +101,7 @@ threadobject *threads_create_thread(utf *name)
 
        /* set java.lang.Thread fields */
 
-       t->name     = javastring_new(name);
+       t->name     = (java_lang_String *) javastring_new(name);
 #if defined(ENABLE_JAVASE)
        t->daemon   = true;
 #endif
@@ -236,7 +237,7 @@ void threads_dump(void)
                        /* get thread name */
 
 #if defined(ENABLE_JAVASE)
-                       name = javastring_toutf(t->name, false);
+                       name = javastring_toutf((java_objectheader *) t->name, false);
 #elif defined(ENABLE_JAVAME_CLDC1_1)
                        name = t->name;
 #endif
index fca67d528f4347e06d3981204b30e43dcbb2f401..51a01df89274c789c9a7e342a8f8621f9229d44d 100644 (file)
@@ -28,7 +28,7 @@
    calls instead of machine instructions, using the C calling
    convention.
 
-   $Id: builtin.c 7696 2007-04-12 20:18:54Z twisti $
+   $Id: builtin.c 7723 2007-04-16 18:03:08Z michi $
 
 */
 
@@ -1348,7 +1348,6 @@ static char *builtin_print_argument(char *logtext, s4 *logtextlen,
 {
        imm_union          imu;
        java_objectheader *o;
-       java_lang_String  *s;
        classinfo         *c;
        utf               *u;
        u4                 len;
@@ -1400,9 +1399,7 @@ static char *builtin_print_argument(char *logtext, s4 *logtextlen,
                                /* get java.lang.String object and the length of the
                                   string */
 
-                               s = (java_lang_String *) o;
-
-                               u = javastring_toutf(s, false);
+                               u = javastring_toutf(o, false);
 
                                len = strlen(" (String = \"") + utf_bytes(u) + strlen("\")");
 
index 02bb914a967a1b15407a0c18497e1bbd90f14428..3a480b0609039ba9a2005a3abe2bcdaaae7f681c 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
    02111-1307, USA.
 
-   $Id: simplereg.c 7645 2007-04-03 11:46:50Z twisti $
+   $Id: simplereg.c 7713 2007-04-15 21:49:48Z twisti $
 
 */
 
 
 #include "vm/builtin.h"
 #include "vm/exceptions.h"
+#include "vm/resolve.h"
 #include "vm/stringlocal.h"
 
+#include "vm/jit/abi.h"
 #include "vm/jit/reg.h"
-#include "vm/jit/allocator/simplereg.h"
 #include "vm/jit/show.h"
+#include "vm/jit/allocator/simplereg.h"
 
 #include "vmcore/method.h"
 #include "vmcore/options.h"
-#include "vm/resolve.h"
 
 
 #if 0
@@ -159,7 +160,7 @@ static void simplereg_allocate_temporaries(jitdata *jd);
 #define AVAIL_FREE_TMP_INT  AVAIL_BACK_INT(rd->freetmpinttop)
 #define AVAIL_FREE_SAV_INT  AVAIL_BACK_INT(rd->freesavinttop)
 
-#define TAKE_ARG_FLT(r)  POP_FRONT(rd->argfltregs, rd->argfltreguse, r)
+#define TAKE_ARG_FLT(r)  POP_FRONT(abi_registers_float_argument, rd->argfltreguse, r)
 #define TAKE_TMP_FLT(r)  POP_BACK(rd->tmpfltregs, rd->tmpfltreguse, r)
 #define TAKE_SAV_FLT(r)  POP_BACK(rd->savfltregs, rd->savfltreguse, r)
 
@@ -167,7 +168,7 @@ static void simplereg_allocate_temporaries(jitdata *jd);
 #define TAKE_TMP_ADR(r)  POP_BACK(rd->tmpadrregs, rd->tmpadrreguse, r)
 #define TAKE_SAV_ADR(r)  POP_BACK(rd->savadrregs, rd->savadrreguse, r)
 
-#define TAKE_ARG_INT(r)  POP_FRONT_INT(rd->argintregs, rd->argintreguse, r)
+#define TAKE_ARG_INT(r)  POP_FRONT_INT(abi_registers_integer_argument, rd->argintreguse, r)
 #define TAKE_TMP_INT(r)  POP_BACK_INT(rd->tmpintregs, rd->tmpintreguse, r)
 #define TAKE_SAV_INT(r)  POP_BACK_INT(rd->savintregs, rd->savintreguse, r)
 
@@ -657,11 +658,9 @@ static void simplereg_allocate_locals_leafmethod(jitdata *jd)
 #if !defined(SUPPORT_PASS_FLOATARGS_IN_INTREGS)
                                        /* We can only use float arguments as local variables,
                                         * if we do not pass them in integer registers. */
-                                       else if ((p < md->paramcount) &&
-                                                        !md->params[p].inmemory) 
-                                       {
+                                       else if ((p < md->paramcount) && !md->params[p].inmemory) {
                                                v->flags = 0;
-                                               v->vv.regoff = rd->argfltregs[md->params[p].regoff];
+                                               v->vv.regoff = md->params[p].regoff;
                                        }
 #endif
                                        else if (AVAIL_TMP_FLT) {
@@ -669,11 +668,10 @@ static void simplereg_allocate_locals_leafmethod(jitdata *jd)
                                                TAKE_TMP_FLT(v->vv.regoff);
                                        }
                                        /* use unused argument registers as local registers */
-                                       else if ((p >= md->paramcount) &&
-                                                        (fargcnt < FLT_ARG_CNT)) 
-                                       {
+                                       else if ((p >= md->paramcount) && (fargcnt < FLT_ARG_CNT)) {
                                                v->flags = 0;
-                                               POP_FRONT(rd->argfltregs, fargcnt, v->vv.regoff);
+                                               POP_FRONT(abi_registers_float_argument,
+                                                                 fargcnt, v->vv.regoff);
                                        }
                                        else if (AVAIL_SAV_FLT) {
                                                v->flags = 0;
@@ -715,13 +713,12 @@ static void simplereg_allocate_locals_leafmethod(jitdata *jd)
                                                        v->flags = 0;
 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
                                                        if (IS_2_WORD_TYPE(t))
-                                                               v->vv.regoff = PACK_REGS(
-                                               rd->argintregs[GET_LOW_REG(md->params[p].regoff)],
-                                               rd->argintregs[GET_HIGH_REG(md->params[p].regoff)]);
+                                                               v->vv.regoff =
+                                                                       PACK_REGS(GET_LOW_REG(md->params[p].regoff),
+                                                                                         GET_HIGH_REG(md->params[p].regoff));
                                                                else
 #endif
-                                                                       v->vv.regoff =
-                                                                          rd->argintregs[md->params[p].regoff];
+                                                                       v->vv.regoff = md->params[p].regoff;
                                                }
                                                else if (AVAIL_TMP_INT) {
                                                        v->flags = 0;
@@ -734,7 +731,8 @@ static void simplereg_allocate_locals_leafmethod(jitdata *jd)
                                                                 (iargcnt + intregsneeded < INT_ARG_CNT)) 
                                                {
                                                        v->flags = 0;
-                                                       POP_FRONT_INT(rd->argintregs, iargcnt, v->vv.regoff);
+                                                       POP_FRONT_INT(abi_registers_integer_argument,
+                                                                                 iargcnt, v->vv.regoff);
                                                }
                                                else if (AVAIL_SAV_INT) {
                                                        v->flags = 0;
@@ -922,14 +920,14 @@ static void simplereg_init(jitdata *jd, registerdata *rd)
        /* record the interface registers as used */
 
        for (i=0; i<rd->argintreguse; ++i)
-               rd->intusedinout[rd->argintregs[i]] = 1;
+               rd->intusedinout[abi_registers_integer_argument[i]] = 1;
        for (i=rd->tmpintreguse; i<INT_TMP_CNT; ++i)
                rd->intusedinout[rd->tmpintregs[i]] = 1;
        for (i=rd->savintreguse; i<INT_SAV_CNT; ++i)
                rd->intusedinout[rd->savintregs[i]] = 1;
 
        for (i=0; i<rd->argfltreguse; ++i)
-               rd->fltusedinout[rd->argfltregs[i]] = 1;
+               rd->fltusedinout[abi_registers_float_argument[i]] = 1;
        for (i=rd->tmpfltreguse; i<FLT_TMP_CNT; ++i)
                rd->fltusedinout[rd->tmpfltregs[i]] = 1;
        for (i=rd->savfltreguse; i<FLT_SAV_CNT; ++i)
index 9936648fcca545d84b2a121a15dceb91ffa77f0d..f5ae76fc4f7c6c00b6f5b138c1140a35767a68c0 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: codegen.c 7693 2007-04-12 14:56:49Z michi $
+   $Id: codegen.c 7723 2007-04-16 18:03:08Z michi $
 
 */
 
@@ -214,43 +214,33 @@ bool codegen_emit(jitdata *jd)
 
                if (IS_INT_LNG_TYPE(t)) {                    /* integer args          */
                        if (!md->params[p].inmemory) {           /* register arguments    */
-                               s2 = rd->argintregs[s1];
-                               if (!IS_INMEMORY(var->flags)) {      /* reg arg -> register   */
-                                       M_INTMOVE(s2, var->vv.regoff);
-
-                               } else {                             /* reg arg -> spilled    */
-                                       M_LST(s2, REG_SP, var->vv.regoff * 8);
-                               }
-
-                       } else {                                 /* stack arguments       */
-                               if (!IS_INMEMORY(var->flags)) {      /* stack arg -> register */
+                               if (!IS_INMEMORY(var->flags))
+                                       M_INTMOVE(s1, var->vv.regoff);
+                               else
+                                       M_LST(s1, REG_SP, var->vv.regoff * 8);
+                       }
+                       else {                                   /* stack arguments       */
+                               if (!IS_INMEMORY(var->flags))
                                        M_LLD(var->vv.regoff, REG_SP, (cd->stackframesize + s1) *8);
-
-                               } else {                             /* stack arg -> spilled  */
+                               else
                                        var->vv.regoff = cd->stackframesize + s1;
-                               }
                        }
-
-               } else {                                     /* floating args         */
+               }
+               else {                                       /* floating args         */
                        if (!md->params[p].inmemory) {           /* register arguments    */
-                               s2 = rd->argfltregs[s1];
-                               if (!IS_INMEMORY(var->flags)) {      /* reg arg -> register   */
-                                       M_FLTMOVE(s2, var->vv.regoff);
-
-                               } else {                                         /* reg arg -> spilled    */
-                                       M_DST(s2, REG_SP, var->vv.regoff * 8);
-                               }
-
-                       } else {                                 /* stack arguments       */
-                               if (!(var->flags & INMEMORY)) {      /* stack-arg -> register */
+                               if (!IS_INMEMORY(var->flags))
+                                       M_FLTMOVE(s1, var->vv.regoff);
+                               else
+                                       M_DST(s1, REG_SP, var->vv.regoff * 8);
+                       }
+                       else {                                   /* stack arguments       */
+                               if (!(var->flags & INMEMORY))
                                        M_DLD(var->vv.regoff, REG_SP, (cd->stackframesize + s1) * 8);
-
-                               } else {                             /* stack-arg -> spilled  */
+                               else
                                        var->vv.regoff = cd->stackframesize + s1;
-                               }
                        }
                }
-       } /* end for */
+       }
 
        /* call monitorenter function */
 
@@ -265,10 +255,10 @@ bool codegen_emit(jitdata *jd)
                        M_LDA(REG_SP, REG_SP, -(INT_ARG_CNT + FLT_ARG_CNT) * 8);
 
                        for (p = 0; p < INT_ARG_CNT; p++)
-                               M_LST(rd->argintregs[p], REG_SP, p * 8);
+                               M_LST(abi_registers_integer_argument[p], REG_SP, p * 8);
 
                        for (p = 0; p < FLT_ARG_CNT; p++)
-                               M_DST(rd->argfltregs[p], REG_SP, (INT_ARG_CNT + p) * 8);
+                               M_DST(abi_registers_float_argument[p], REG_SP, (INT_ARG_CNT + p) * 8);
 
                        s1 += INT_ARG_CNT + FLT_ARG_CNT;
                }
@@ -295,10 +285,10 @@ bool codegen_emit(jitdata *jd)
 #if !defined(NDEBUG)
                if (opt_verbosecall) {
                        for (p = 0; p < INT_ARG_CNT; p++)
-                               M_LLD(rd->argintregs[p], REG_SP, p * 8);
+                               M_LLD(abi_registers_integer_argument[p], REG_SP, p * 8);
 
                        for (p = 0; p < FLT_ARG_CNT; p++)
-                               M_DLD(rd->argfltregs[p], REG_SP, (INT_ARG_CNT + p) * 8);
+                               M_DLD(abi_registers_float_argument[p], REG_SP, (INT_ARG_CNT + p) * 8);
 
                        M_LDA(REG_SP, REG_SP, (INT_ARG_CNT + FLT_ARG_CNT) * 8);
                }
@@ -2581,6 +2571,7 @@ gen_method:
 
                        for (s3 = s3 - 1; s3 >= 0; s3--) {
                                var = VAR(iptr->sx.s23.s2.args[s3]);
+                               d  = md->params[s3].regoff;
 
                                /* Already Preallocated (ARGVAR) ? */
                                if (var->flags & PREALLOC)
@@ -2588,24 +2579,22 @@ gen_method:
 
                                if (IS_INT_LNG_TYPE(var->type)) {
                                        if (!md->params[s3].inmemory) {
-                                               s1 = rd->argintregs[md->params[s3].regoff];
-                                               d = emit_load(jd, iptr, var, s1);
-                                               M_INTMOVE(d, s1);
+                                               s1 = emit_load(jd, iptr, var, d);
+                                               M_INTMOVE(s1, d);
                                        }
                                        else {
-                                               d = emit_load(jd, iptr, var, REG_ITMP1);
-                                               M_LST(d, REG_SP, md->params[s3].regoff * 8);
+                                               s1 = emit_load(jd, iptr, var, REG_ITMP1);
+                                               M_LST(s1, REG_SP, d * 8);
                                        }
                                }
                                else {
                                        if (!md->params[s3].inmemory) {
-                                               s1 = rd->argfltregs[md->params[s3].regoff];
-                                               d = emit_load(jd, iptr, var, s1);
+                                               s1 = emit_load(jd, iptr, var, d);
                                                M_FLTMOVE(d, s1);
                                        }
                                        else {
-                                               d = emit_load(jd, iptr, var, REG_FTMP1);
-                                               M_DST(d, REG_SP, md->params[s3].regoff * 8);
+                                               s1 = emit_load(jd, iptr, var, REG_FTMP1);
+                                               M_DST(s1, REG_SP, d * 8);
                                        }
                                }
                        }
@@ -3152,23 +3141,21 @@ void codegen_emit_stub_compiler(jitdata *jd)
 
 void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 {
-       methodinfo   *m;
-       codeinfo     *code;
-       codegendata  *cd;
-       registerdata *rd;
-       methoddesc   *md;
-       s4            nativeparams;
-       s4            i, j;                 /* count variables                    */
-       s4            t;
-       s4            s1, s2, disp;
-       s4            funcdisp;             /* displacement of the function       */
+       methodinfo  *m;
+       codeinfo    *code;
+       codegendata *cd;
+       methoddesc  *md;
+       s4           nativeparams;
+       s4           i, j;                 /* count variables                    */
+       s4           t;
+       s4           s1, s2, disp;
+       s4           funcdisp;             /* displacement of the function       */
 
        /* get required compiler data */
 
        m    = jd->m;
        code = jd->code;
        cd   = jd->cd;
-       rd   = jd->rd;
 
        /* initialize variables */
 
@@ -3232,14 +3219,14 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        for (i = 0, j = 0; i < md->paramcount && i < INT_ARG_CNT; i++) {
                if (IS_INT_LNG_TYPE(md->paramtypes[i].type)) {
-                       M_LST(rd->argintregs[i], REG_SP, j * 8);
+                       M_LST(abi_registers_integer_argument[i], REG_SP, j * 8);
                        j++;
                }
        }
 
        for (i = 0; i < md->paramcount && i < FLT_ARG_CNT; i++) {
                if (IS_FLT_DBL_TYPE(md->paramtypes[i].type)) {
-                       M_DST(rd->argfltregs[i], REG_SP, j * 8);
+                       M_DST(abi_registers_float_argument[i], REG_SP, j * 8);
                        j++;
                }
        }
@@ -3260,14 +3247,14 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        for (i = 0, j = 0; i < md->paramcount && i < INT_ARG_CNT; i++) {
                if (IS_INT_LNG_TYPE(md->paramtypes[i].type)) {
-                       M_LLD(rd->argintregs[i], REG_SP, j * 8);
+                       M_LLD(abi_registers_integer_argument[i], REG_SP, j * 8);
                        j++;
                }
        }
 
        for (i = 0; i < md->paramcount && i < FLT_ARG_CNT; i++) {
                if (IS_FLT_DBL_TYPE(md->paramtypes[i].type)) {
-                       M_DLD(rd->argfltregs[i], REG_SP, j * 8);
+                       M_DLD(abi_registers_float_argument[i], REG_SP, j * 8);
                        j++;
                }
        }
@@ -3279,41 +3266,36 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
                if (IS_INT_LNG_TYPE(t)) {
                        if (!md->params[i].inmemory) {
-                               s1 = rd->argintregs[md->params[i].regoff];
+                               s1 = md->params[i].regoff;
+                               s2 = nmd->params[j].regoff;
 
-                               if (!nmd->params[j].inmemory) {
-                                       s2 = rd->argintregs[nmd->params[j].regoff];
+                               if (!nmd->params[j].inmemory)
                                        M_INTMOVE(s1, s2);
-
-                               } else {
-                                       s2 = nmd->params[j].regoff;
+                               else
                                        M_LST(s1, REG_SP, s2 * 8);
-                               }
-
-                       } else {
+                       }
+                       else {
                                s1 = md->params[i].regoff + cd->stackframesize;
                                s2 = nmd->params[j].regoff;
                                M_LLD(REG_ITMP1, REG_SP, s1 * 8);
                                M_LST(REG_ITMP1, REG_SP, s2 * 8);
                        }
-
-               else {
+               }
+               else {
                        if (!md->params[i].inmemory) {
-                               s1 = rd->argfltregs[md->params[i].regoff];
+                               s1 = md->params[i].regoff;
+                               s2 = nmd->params[j].regoff;
 
-                               if (!nmd->params[j].inmemory) {
-                                       s2 = rd->argfltregs[nmd->params[j].regoff];
+                               if (!nmd->params[j].inmemory)
                                        M_FLTMOVE(s1, s2);
-
-                               } else {
-                                       s2 = nmd->params[j].regoff;
+                               else {
                                        if (IS_2_WORD_TYPE(t))
                                                M_DST(s1, REG_SP, s2 * 8);
                                        else
                                                M_FST(s1, REG_SP, s2 * 8);
                                }
-
-                       else {
+                       }
+                       else {
                                s1 = md->params[i].regoff + cd->stackframesize;
                                s2 = nmd->params[j].regoff;
                                M_DLD(REG_FTMP1, REG_SP, s1 * 8);
@@ -3346,11 +3328,18 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        /* save return value */
 
-       if (md->returntype.type != TYPE_VOID) {
-               if (IS_INT_LNG_TYPE(md->returntype.type))
-                       M_LST(REG_RESULT, REG_SP, 0 * 8);
-               else
-                       M_DST(REG_FRESULT, REG_SP, 0 * 8);
+       switch (md->returntype.type) {
+       case TYPE_INT:
+       case TYPE_LNG:
+       case TYPE_ADR:
+               M_LST(REG_RESULT, REG_SP, 0 * 8);
+               break;
+       case TYPE_FLT:
+       case TYPE_DBL:
+               M_DST(REG_FRESULT, REG_SP, 0 * 8);
+               break;
+       case TYPE_VOID:
+               break;
        }
 
        /* call finished trace */
@@ -3372,11 +3361,18 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        /* restore return value */
 
-       if (md->returntype.type != TYPE_VOID) {
-               if (IS_INT_LNG_TYPE(md->returntype.type))
-                       M_LLD(REG_RESULT, REG_SP, 0 * 8);
-               else
-                       M_DLD(REG_FRESULT, REG_SP, 0 * 8);
+       switch (md->returntype.type) {
+       case TYPE_INT:
+       case TYPE_LNG:
+       case TYPE_ADR:
+               M_LLD(REG_RESULT, REG_SP, 0 * 8);
+               break;
+       case TYPE_FLT:
+       case TYPE_DBL:
+               M_DLD(REG_FRESULT, REG_SP, 0 * 8);
+               break;
+       case TYPE_VOID:
+               break;
        }
 
 #if defined(ENABLE_GC_CACAO)
@@ -3406,7 +3402,6 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
        M_ALD(REG_ITMP3, REG_PV, disp);     /* load asm exception handler address */
        M_JMP(REG_ZERO, REG_ITMP3);         /* jump to asm exception handler      */
        
-
        /* generate patcher stubs */
 
        emit_patcher_stubs(jd);
index 8ba787a62892872037ed1c1e4762f9897238ef88..710f78a616c820d4663751677c6a46531a12fedc 100644 (file)
@@ -45,6 +45,7 @@
 #include "vm/builtin.h"
 #include "vm/exceptions.h"
 
+#include "vm/jit/abi.h"
 #include "vm/jit/abi-asm.h"
 #include "vm/jit/asmpart.h"
 #include "vm/jit/dseg.h"
@@ -606,10 +607,10 @@ void emit_verbosecall_enter(jitdata *jd)
        /* save argument registers */
 
        for (i = 0; i < INT_ARG_CNT; i++)
-               M_LST(rd->argintregs[i], REG_SP, (2 + i) * 8);
+               M_LST(abi_registers_integer_argument[i], REG_SP, (2 + i) * 8);
 
        for (i = 0; i < FLT_ARG_CNT; i++)
-               M_DST(rd->argintregs[i], REG_SP, (2 + INT_ARG_CNT + i) * 8);
+               M_DST(abi_registers_float_argument[i], REG_SP, (2 + INT_ARG_CNT + i) * 8);
 
        /* save temporary registers for leaf methods */
 
@@ -628,12 +629,12 @@ void emit_verbosecall_enter(jitdata *jd)
 
                if (IS_FLT_DBL_TYPE(t)) {
                        if (IS_2_WORD_TYPE(t)) {
-                               M_DST(rd->argfltregs[i], REG_SP, 0 * 8);
-                               M_LLD(rd->argintregs[i], REG_SP, 0 * 8);
+                               M_DST(abi_registers_float_argument[i], REG_SP, 0 * 8);
+                               M_LLD(abi_registers_integer_argument[i], REG_SP, 0 * 8);
                        }
                        else {
-                               M_FST(rd->argfltregs[i], REG_SP, 0 * 8);
-                               M_ILD(rd->argintregs[i], REG_SP, 0 * 8);
+                               M_FST(abi_registers_float_argument[i], REG_SP, 0 * 8);
+                               M_ILD(abi_registers_integer_argument[i], REG_SP, 0 * 8);
                        }
                }
        }
@@ -651,10 +652,10 @@ void emit_verbosecall_enter(jitdata *jd)
        /* restore argument registers */
 
        for (i = 0; i < INT_ARG_CNT; i++)
-               M_LLD(rd->argintregs[i], REG_SP, (2 + i) * 8);
+               M_LLD(abi_registers_integer_argument[i], REG_SP, (2 + i) * 8);
 
        for (i = 0; i < FLT_ARG_CNT; i++)
-               M_DLD(rd->argintregs[i], REG_SP, (2 + INT_ARG_CNT + i) * 8);
+               M_DLD(abi_registers_float_argument[i], REG_SP, (2 + INT_ARG_CNT + i) * 8);
 
        /* restore temporary registers for leaf methods */
 
index 77b9577596f5f6b8aa48cfeac97cf4e4da129da3..94d982e313b26a90bcf849342604d33605a614dd 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: md-abi.c 7637 2007-04-02 20:58:30Z twisti $
+   $Id: md-abi.c 7713 2007-04-15 21:49:48Z twisti $
 
 */
 
@@ -107,6 +107,43 @@ s4 nregdescfloat[] = {
 };
 
 
+const s4 abi_registers_float_argument[] = {
+       16, /* fa0  */
+       17, /* fa1  */
+       18, /* fa2  */
+       19, /* fa3  */
+       20, /* fa4  */
+       21, /* fa5  */
+};
+
+const s4 abi_registers_float_saved[] = {
+       2,  /* fs0  */
+       3,  /* fs1  */
+       4,  /* fs2  */
+       5,  /* fs3  */
+       6,  /* fs4  */
+       7,  /* fs5  */
+       8,  /* fs6  */
+       9,  /* fs7  */
+};
+
+const s4 abi_registers_float_temporary[] = {
+       1,  /* ft0  */
+       10, /* ft1  */
+       11, /* ft2  */
+       12, /* ft3  */
+       13, /* ft4  */
+       14, /* ft5  */
+       15, /* ft6  */
+       22, /* ft7  */
+       23, /* ft8  */
+       24, /* ft9  */
+       25, /* ft10 */
+       26, /* ft11 */
+       27, /* ft12 */
+};
+
+
 /* md_param_alloc **************************************************************
 
    Allocate the parameters of the given method descriptor according to the
@@ -123,7 +160,7 @@ void md_param_alloc(methoddesc *md)
 
        /* set default values */
 
-       reguse = 0;
+       reguse    = 0;
        stacksize = 0;
 
        /* get params field of methoddesc */
@@ -137,7 +174,7 @@ void md_param_alloc(methoddesc *md)
                case TYPE_LNG:
                        if (i < INT_ARG_CNT) {
                                pd->inmemory = false;
-                               pd->regoff   = reguse;
+                               pd->regoff   = abi_registers_integer_argument[reguse];
                                reguse++;
                                md->argintreguse = reguse;
                        }
@@ -152,7 +189,7 @@ void md_param_alloc(methoddesc *md)
                case TYPE_DBL:
                        if (i < FLT_ARG_CNT) {
                                pd->inmemory = false;
-                               pd->regoff   = reguse;
+                               pd->regoff   = abi_registers_float_argument[reguse];
                                reguse++;
                                md->argfltreguse = reguse;
                        }
index 867c078fe0afd8cf369ec8c68ce5418c52729f39..80ab2c854c69faad24c2425621d41ed55da37b5d 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: codegen.c 7692 2007-04-12 14:47:24Z twisti $
+   $Id: codegen.c 7713 2007-04-15 21:49:48Z twisti $
 
 */
 
@@ -219,33 +219,32 @@ bool codegen_emit(jitdata *jd)
                if (IS_INT_LNG_TYPE(t)) {                    /* integer args          */
 #endif
                        if (!md->params[i].inmemory) {           /* register arguments    */
-                               s2 = ARGUMENT_REGS(t, s1);           /* get argument register */
                                if (!(var->flags & INMEMORY)) {      /* reg arg -> register   */
                                        if (GET_LOW_REG(var->vv.regoff) == REG_SPLIT || GET_HIGH_REG(var->vv.regoff) == REG_SPLIT) {
                                                /* TODO: remove this!!! */
-                                               dolog("SPLIT in local var: %x>%x (%s.%s)", s2, var->vv.regoff, m->class->name->text, m->name->text);
-                                               assert(s2 == var->vv.regoff);
+                                               dolog("SPLIT in local var: %x>%x (%s.%s)", s1, var->vv.regoff, m->class->name->text, m->name->text);
+                                               assert(s1 == var->vv.regoff);
                                        }
                                        s3 = var->vv.regoff;
-                                       SPLIT_OPEN(t, s2, REG_ITMP1);
-                                       SPLIT_LOAD(t, s2, cd->stackframesize);
+                                       SPLIT_OPEN(t, s1, REG_ITMP1);
+                                       SPLIT_LOAD(t, s1, cd->stackframesize);
                                        SPLIT_OPEN(t, s3, REG_ITMP1);
 
                                        if (IS_2_WORD_TYPE(t))
-                                               M_LNGMOVE(s2, s3);
+                                               M_LNGMOVE(s1, s3);
                                        else
-                                               M_INTMOVE(s2, s3);
+                                               M_INTMOVE(s1, s3);
 
                                        SPLIT_STORE_AND_CLOSE(t, s3, cd->stackframesize);
                                }
                                else {                               /* reg arg -> spilled    */
-                                       SPLIT_OPEN(t, s2, REG_ITMP1);
-                                       SPLIT_LOAD(t, s2, cd->stackframesize);
+                                       SPLIT_OPEN(t, s1, REG_ITMP1);
+                                       SPLIT_LOAD(t, s1, cd->stackframesize);
 
                                        if (IS_2_WORD_TYPE(t))
-                                               M_LST(s2, REG_SP, var->vv.regoff * 4);
+                                               M_LST(s1, REG_SP, var->vv.regoff * 4);
                                        else
-                                               M_IST(s2, REG_SP, var->vv.regoff * 4);
+                                               M_IST(s1, REG_SP, var->vv.regoff * 4);
                                        /* no SPLIT_CLOSE here because arg is fully spilled now */
                                }
                        }
@@ -264,20 +263,19 @@ bool codegen_emit(jitdata *jd)
 #if !defined(ENABLE_SOFTFLOAT)
                } else {                                     /* floating args         */
                        if (!md->params[i].inmemory) {           /* register arguments    */
-                               s2 = ARGUMENT_REGS(t, s1);           /* get argument register */
                                if (!(var->flags & INMEMORY)) {      /* reg arg -> register   */
-                                       SPLIT_OPEN(t, s2, REG_ITMP1);
-                                       SPLIT_LOAD(t, s2, cd->stackframesize);
-                                       M_CAST_INT_TO_FLT_TYPED(t, s2, var->vv.regoff);
+                                       SPLIT_OPEN(t, s1, REG_ITMP1);
+                                       SPLIT_LOAD(t, s1, cd->stackframesize);
+                                       M_CAST_INT_TO_FLT_TYPED(t, s1, var->vv.regoff);
                                }
                                else {                               /* reg arg -> spilled    */
-                                       SPLIT_OPEN(t, s2, REG_ITMP1);
-                                       SPLIT_LOAD(t, s2, cd->stackframesize);
+                                       SPLIT_OPEN(t, s1, REG_ITMP1);
+                                       SPLIT_LOAD(t, s1, cd->stackframesize);
 
                                        if (IS_2_WORD_TYPE(t))
-                                               M_LST(s2, REG_SP, var->vv.regoff * 4);
+                                               M_LST(s1, REG_SP, var->vv.regoff * 4);
                                        else
-                                               M_IST(s2, REG_SP, var->vv.regoff * 4);
+                                               M_IST(s1, REG_SP, var->vv.regoff * 4);
                                        /* no SPLIT_CLOSE here because arg is fully spilled now */
                                }
                        }
@@ -2233,6 +2231,7 @@ bool codegen_emit(jitdata *jd)
 
                        for (s3 = s3 - 1; s3 >= 0; s3--) {
                                var = VAR(iptr->sx.s23.s2.args[s3]);
+                               d   = md->params[s3].regoff;
 
                                if (var->flags & PREALLOC) /* argument was precolored? */
                                        continue;
@@ -2242,43 +2241,41 @@ bool codegen_emit(jitdata *jd)
                                if (IS_INT_LNG_TYPE(var->type)) {
 #endif /* !defined(ENABLE_SOFTFLOAT) */
                                        if (!md->params[s3].inmemory) {
-                                               s1 = ARGUMENT_REGS(var->type, md->params[s3].regoff);
                                                SPLIT_OPEN(var->type, s1, REG_ITMP2);
-                                               d = emit_load(jd, iptr, var, s1);
+                                               s1 = emit_load(jd, iptr, var, d);
 
                                                if (IS_2_WORD_TYPE(var->type))
-                                                       M_LNGMOVE(d, s1);
+                                                       M_LNGMOVE(s1, d);
                                                else
-                                                       M_INTMOVE(d, s1);
+                                                       M_INTMOVE(s1, d);
 
-                                               SPLIT_STORE_AND_CLOSE(var->type, s1, 0);
+                                               SPLIT_STORE_AND_CLOSE(var->type, d, 0);
                                        }
                                        else {
                                                if (IS_2_WORD_TYPE(var->type)) {
-                                                       d = emit_load(jd, iptr, var, REG_ITMP12_PACKED);
-                                                       M_LST(d, REG_SP, md->params[s3].regoff * 4);
+                                                       s1 = emit_load(jd, iptr, var, REG_ITMP12_PACKED);
+                                                       M_LST(s1, REG_SP, d * 4);
                                                }
                                                else {
-                                                       d = emit_load(jd, iptr, var, REG_ITMP1);
-                                                       M_IST(d, REG_SP, md->params[s3].regoff * 4);
+                                                       s1 = emit_load(jd, iptr, var, REG_ITMP1);
+                                                       M_IST(s1, REG_SP, d * 4);
                                                }
                                        }
 #if !defined(ENABLE_SOFTFLOAT)
                                }
                                else {
                                        if (!md->params[s3].inmemory) {
-                                               s1 = ARGUMENT_REGS(var->type, md->params[s3].regoff);
-                                               d = emit_load(jd, iptr, var, REG_FTMP1);
-                                               SPLIT_OPEN(var->type, s1, REG_ITMP1);
-                                               M_CAST_FLT_TO_INT_TYPED(var->type, d, s1);
-                                               SPLIT_STORE_AND_CLOSE(var->type, s1, 0);
+                                               s1 = emit_load(jd, iptr, var, REG_FTMP1);
+                                               SPLIT_OPEN(var->type, d, REG_ITMP1);
+                                               M_CAST_FLT_TO_INT_TYPED(var->type, s1, d);
+                                               SPLIT_STORE_AND_CLOSE(var->type, d, 0);
                                        }
                                        else {
-                                               d = emit_load(jd, iptr, var, REG_FTMP1);
+                                               s1 = emit_load(jd, iptr, var, REG_FTMP1);
                                                if (IS_2_WORD_TYPE(var->type))
-                                                       M_DST(d, REG_SP, md->params[s3].regoff * 4);
+                                                       M_DST(s1, REG_SP, d * 4);
                                                else
-                                                       M_FST(d, REG_SP, md->params[s3].regoff * 4);
+                                                       M_FST(s1, REG_SP, d * 4);
                                        }
                                }
 #endif /* !defined(ENABLE_SOFTFLOAT) */
@@ -2868,22 +2865,20 @@ void codegen_emit_stub_compiler(jitdata *jd)
 
 void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 {
-       methodinfo   *m;
-       codeinfo     *code;
-       codegendata  *cd;
-       registerdata *rd;
-       s4            nativeparams;
-       methoddesc   *md;
-       s4            i, j;
-       s4            t;
-       s4            disp, funcdisp, s1, s2;
+       methodinfo  *m;
+       codeinfo    *code;
+       codegendata *cd;
+       s4           nativeparams;
+       methoddesc  *md;
+       s4           i, j;
+       s4           t;
+       s4           disp, funcdisp, s1, s2;
 
        /* get required compiler data */
 
        m    = jd->m;
        code = jd->code;
        cd   = jd->cd;
-       rd   = jd->rd;
 
        /* initialize variables */
 
@@ -2970,11 +2965,10 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
                t = md->paramtypes[i].type;
 
                if (!md->params[i].inmemory) {
-                       s1 = ARGUMENT_REGS(t, md->params[i].regoff);
+                       s1 = md->params[i].regoff;
+                       s2 = nmd->params[j].regoff;
 
                        if (!nmd->params[j].inmemory) {
-                               s2 = ARGUMENT_REGS(t, nmd->params[j].regoff);
-
 #if !defined(__ARM_EABI__)
                                SPLIT_OPEN(t, s1, REG_ITMP1);
                                SPLIT_LOAD(t, s1, cd->stackframesize);
@@ -2991,8 +2985,6 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 #endif
                        }
                        else {
-                               s2 = nmd->params[j].regoff;
-
 #if !defined(__ARM_EABI__)
                                SPLIT_OPEN(t, s1, REG_ITMP1);
                                SPLIT_LOAD(t, s1, cd->stackframesize);
index 3b8c80cd947d6ca7b7cb1d709d29a627eeb7ec5b..d77dd14e53330f3b622ab7f86ad82856f891c319 100644 (file)
@@ -47,6 +47,7 @@
 #include "vm/exceptions.h"
 #include "vm/global.h"
 
+#include "vm/jit/abi.h"
 #include "vm/jit/asmpart.h"
 #include "vm/jit/emit-common.h"
 #include "vm/jit/jit.h"
@@ -745,9 +746,11 @@ void emit_verbosecall_enter(jitdata *jd)
 
                if (i < 2) {
 #if defined(__ARMEL__)
-                       s2 = PACK_REGS(rd->argintregs[i * 2], rd->argintregs[i * 2 + 1]);
+                       s2 = PACK_REGS(abi_registers_integer_argument[i * 2],
+                                                  abi_registers_integer_argument[i * 2 + 1]);
 #else /* defined(__ARMEB__) */
-                       s2 = PACK_REGS(rd->argintregs[i * 2 + 1], rd->argintregs[i * 2]);
+                       s2 = PACK_REGS(abi_registers_integer_argument[i * 2 + 1],
+                                                  abi_registers_integer_argument[i * 2]);
 #endif          
                        M_LNGMOVE(s1, s2);
                }
index 49d6dc906f87238cf8cd931398e78a900ce2c680..8d19890e12fc94b0888b9bd1315cc01eb53848f7 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: md-abi.c 7353 2007-02-13 23:14:35Z twisti $
+   $Id: md-abi.c 7713 2007-04-15 21:49:48Z twisti $
 
 */
 
@@ -52,6 +52,26 @@ const char *abi_registers_integer_name[] = {
        "v5", "t3", "t1", "t2", "ip", "sp", "lr", "pc",
 };
 
+const s4 abi_registers_integer_argument[] = {
+       0,  /* a0 */
+       1,  /* a1 */
+       2,  /* a2 */
+       3,  /* a3 */
+       REG_SPLIT,
+};
+
+const s4 abi_registers_integer_saved[] = {
+       4,  /* s0 */
+       5,  /* s1 */
+       6,  /* s2 */
+       7,  /* s3 */
+       8,  /* s4 */
+};
+
+const s4 abi_registers_integer_temporary[] = {
+       -1,
+};
+
 
 #if defined(ENABLE_SOFTFLOAT)
 s4 nregdescfloat[] = {
@@ -68,6 +88,27 @@ s4 nregdescfloat[] = {
 };
 #endif /* defined(ENABLE_SOFTFLOAT) */
 
+const s4 abi_registers_float_argument[] = {
+       -1,
+};
+
+const s4 abi_registers_float_saved[] = {
+       -1,
+};
+
+const s4 abi_registers_float_temporary[] = {
+#if defined(ENABLE_SOFTFLOAT)
+       -1,
+#else
+       0,  /* ft0 */
+       1,  /* ft1 */
+       2,  /* ft2 */
+       3,  /* ft3 */
+       4,  /* ft4 */
+       5,  /* ft5 */
+#endif
+};
+
 
 /* md_param_alloc **************************************************************
 
@@ -107,12 +148,12 @@ void md_param_alloc(methoddesc *md)
                case TYPE_FLT:
                        if (reguse < INT_ARG_CNT) {
                                pd->inmemory = false;
-                               pd->regoff = reguse;
+                               pd->regoff   = abi_registers_integer_argument[reguse];
                                reguse++;
                        }
                        else {
                                pd->inmemory = true;
-                               pd->regoff = stacksize;
+                               pd->regoff   = stacksize;
                                stacksize++;
                        }
                        break;
@@ -122,25 +163,33 @@ void md_param_alloc(methoddesc *md)
                        if (reguse+1 < INT_ARG_CNT) {
                                pd->inmemory = false;
 #if defined(__ARMEL__)
-                               pd->regoff = PACK_REGS(reguse, reguse+1);
+                               pd->regoff   =
+                                       PACK_REGS(abi_registers_integer_argument[reguse],
+                                                         abi_registers_integer_argument[reguse + 1]);
 #else
-                               pd->regoff = PACK_REGS(reguse+1, reguse);
+                               pd->regoff   =
+                                       PACK_REGS(abi_registers_integer_argument[reguse + 1],
+                                                         abi_registers_integer_argument[reguse]);
 #endif
                                reguse += 2;
                        }
                        else if (reguse < INT_ARG_CNT) {
                                pd->inmemory = false;
 #if defined(__ARMEL__)
-                               pd->regoff = PACK_REGS(reguse, INT_ARG_CNT);
+                               pd->regoff   =
+                                       PACK_REGS(abi_registers_integer_argument[reguse],
+                                                         abi_registers_integer_argument[INT_ARG_CNT]);
 #else
-                               pd->regoff = PACK_REGS(INT_ARG_CNT, reguse);
+                               pd->regoff   =
+                                       PACK_REGS(abi_registers_integer_argument[INT_ARG_CNT],
+                                                         abi_registers_integer_argument[reguse]);
 #endif
                                reguse++;
                                stacksize++;
                        }
                        else {
                                pd->inmemory = true;
-                               pd->regoff = stacksize;
+                               pd->regoff   = stacksize;
                                stacksize += 2;
                        }
                        break;
@@ -200,7 +249,7 @@ void md_param_alloc_native(methoddesc *md)
                case TYPE_FLT:
                        if (reguse < INT_ARG_CNT) {
                                pd->inmemory = false;
-                               pd->regoff   = reguse;
+                               pd->regoff   = abi_registers_integer_argument[reguse];
                                reguse++;
                        }
                        else {
@@ -218,9 +267,13 @@ void md_param_alloc_native(methoddesc *md)
 #endif
                                pd->inmemory = false;
 #if defined(__ARMEL__)
-                               pd->regoff   = PACK_REGS(reguse, reguse + 1);
+                               pd->regoff   =
+                                       PACK_REGS(abi_registers_integer_argument[reguse],
+                                                         abi_registers_integer_argument[reguse + 1]);
 #else
-                               pd->regoff   = PACK_REGS(reguse + 1, reguse);
+                               pd->regoff   =
+                                       PACK_REGS(abi_registers_integer_argument[reguse + 1],
+                                                         abi_registers_integer_argument[reguse]);
 #endif
                                reguse += 2;
                        }
@@ -228,9 +281,13 @@ void md_param_alloc_native(methoddesc *md)
                        else if (reguse < INT_ARG_CNT) {
                                pd->inmemory = false;
 # if defined(__ARMEL__)
-                               pd->regoff   = PACK_REGS(reguse, INT_ARG_CNT);
+                               pd->regoff   =
+                                       PACK_REGS(abi_registers_integer_argument[reguse],
+                                                         abi_registers_integer_argument[INT_ARG_CNT]);
 # else
-                               pd->regoff   = PACK_REGS(INT_ARG_CNT, reguse);
+                               pd->regoff   =
+                                       PACK_REGS(abi_registers_integer_argument[INT_ARG_CNT],
+                                                         abi_registers_integer_argument[reguse]);
 # endif
                                reguse++;
                                stacksize++;
index 2cff1581610c4ecfcae9f12df2cf3800a15e561a..b7970eff2fcf1fbd1e361c44fb770c12f436c7cc 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: md-abi.h 7276 2007-02-02 11:58:18Z michi $
+   $Id: md-abi.h 7713 2007-04-15 21:49:48Z twisti $
 
 */
 
 
 #define REG_ITMP12_TYPED(t) ((IS_2_WORD_TYPE(t)) ? REG_ITMP12_PACKED : REG_ITMP1)
 #define REG_RESULT_TYPED(t) ((IS_2_WORD_TYPE(t)) ? REG_RESULT_PACKED : REG_RESULT)
-#define ARGUMENT_REGS(t,a)  ((IS_2_WORD_TYPE(t)) ? \
-          (PACK_REGS(rd->argintregs[GET_LOW_REG(a)],rd->argintregs[GET_HIGH_REG(a)])) : \
-          (rd->argintregs[(a)]) \
-       )
-
 
 #endif /* _MD_ABI_H */
 
index cc1d17ebc98b4dae03f9c665e1a69f326ef2c480..7ee99707a9dc5539417e84ee638e4c110b161baf 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: codegen.c 7709 2007-04-15 15:28:13Z michi $
+   $Id: codegen.c 7723 2007-04-16 18:03:08Z michi $
 
 */
 
@@ -2963,7 +2963,7 @@ gen_method:
 
                                } else {
                                        if (!md->params[s3].inmemory) {
-                                               s1 = rd->argfltregs[md->params[s3].regoff];
+                                               s1 = md->params[s3].regoff;
                                                d = emit_load(jd, iptr, var, s1);
                                                M_FLTMOVE(d, s1);
 
@@ -3886,15 +3886,14 @@ void codegen_emit_stub_builtin(jitdata *jd, methoddesc *md, functionptr f)
 
 void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 {
-       methodinfo   *m;
-       codeinfo     *code;
-       codegendata  *cd;
-       registerdata *rd;
-       methoddesc   *md;
-       s4            nativeparams;
-       s4            i, j;                 /* count variables                    */
-       s4            t;
-       s4            s1, s2;
+       methodinfo  *m;
+       codeinfo    *code;
+       codegendata *cd;
+       methoddesc  *md;
+       s4           nativeparams;
+       s4           i, j;                 /* count variables                    */
+       s4           t;
+       s4           s1, s2;
        s4            disp;
 
        /* get required compiler data */
@@ -3902,7 +3901,6 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
        m    = jd->m;
        code = jd->code;
        cd   = jd->cd;
-       rd   = jd->rd;
 
        /* set some variables */
 
@@ -4039,18 +4037,22 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        /* save return value */
 
-       if (md->returntype.type != TYPE_VOID) {
-               if (IS_INT_LNG_TYPE(md->returntype.type)) {
-                       if (IS_2_WORD_TYPE(md->returntype.type))
-                               M_IST(REG_RESULT2, REG_SP, 2 * 4);
-                       M_IST(REG_RESULT, REG_SP, 1 * 4);
-               }
-               else {
-                       if (IS_2_WORD_TYPE(md->returntype.type))
-                               emit_fstl_membase(cd, REG_SP, 1 * 4);
-                       else
-                               emit_fsts_membase(cd, REG_SP, 1 * 4);
-               }
+       switch (md->returntype.type) {
+       case TYPE_INT:
+       case TYPE_ADR:
+               M_IST(REG_RESULT, REG_SP, 1 * 4);
+               break;
+       case TYPE_LNG:
+               M_LST(REG_RESULT_PACKED, REG_SP, 1 * 4);
+               break;
+       case TYPE_FLT:
+               emit_fsts_membase(cd, REG_SP, 1 * 4);
+               break;
+       case TYPE_DBL:
+               emit_fstl_membase(cd, REG_SP, 1 * 4);
+               break;
+       case TYPE_VOID:
+               break;
        }
 
 #if !defined(NDEBUG)
@@ -4069,18 +4071,22 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        /* restore return value */
 
-       if (md->returntype.type != TYPE_VOID) {
-               if (IS_INT_LNG_TYPE(md->returntype.type)) {
-                       if (IS_2_WORD_TYPE(md->returntype.type))
-                               M_ILD(REG_RESULT2, REG_SP, 2 * 4);
-                       M_ILD(REG_RESULT, REG_SP, 1 * 4);
-               }
-               else {
-                       if (IS_2_WORD_TYPE(md->returntype.type))
-                               emit_fldl_membase(cd, REG_SP, 1 * 4);
-                       else
-                               emit_flds_membase(cd, REG_SP, 1 * 4);
-               }
+       switch (md->returntype.type) {
+       case TYPE_INT:
+       case TYPE_ADR:
+               M_ILD(REG_RESULT, REG_SP, 1 * 4);
+               break;
+       case TYPE_LNG:
+               M_LLD(REG_RESULT_PACKED, REG_SP, 1 * 4);
+               break;
+       case TYPE_FLT:
+               emit_flds_membase(cd, REG_SP, 1 * 4);
+               break;
+       case TYPE_DBL:
+               emit_fldl_membase(cd, REG_SP, 1 * 4);
+               break;
+       case TYPE_VOID:
+               break;
        }
 
 #if defined(ENABLE_GC_CACAO)
index d478d9655fb3387bc9ef835beec38360b50d2579..3ce42ba32cf7bb613a609519c76235631e426cc0 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: md-abi.c 7706 2007-04-15 12:17:02Z michi $
+   $Id: md-abi.c 7713 2007-04-15 21:49:48Z twisti $
 
 */
 
@@ -51,17 +51,17 @@ const char *abi_registers_integer_name[] = {
 };
 
 const s4 abi_registers_integer_argument[] = {
-       -1,  /* empty */
+       -1,
 };
 
 const s4 abi_registers_integer_saved[] = {
-       5,  /* s0 */
-       6,  /* s1 */
-       7,  /* s2 */
+       5, /* s0 */
+       6, /* s1 */
+       7, /* s2 */
 };
 
 const s4 abi_registers_integer_temporary[] = {
-       3,  /* t0 */
+       3, /* t0 */
 };
 
 
@@ -73,6 +73,18 @@ s4 nregdescfloat[] = {
     REG_END
 };
 
+const s4 abi_registers_float_argument[] = {
+       -1,
+};
+
+const s4 abi_registers_float_saved[] = {
+       -1,
+};
+
+const s4 abi_registers_float_temporary[] = {
+       -1,
+};
+
 
 /* md_param_alloc **************************************************************
 
index 89daefaba77e157dbc3d630996171af9b69a01b7..db594035516364574847ec20f2273ff0a30521d9 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: codegen.c 7700 2007-04-13 11:48:48Z twisti $
+   $Id: codegen.c 7713 2007-04-15 21:49:48Z twisti $
 
 */
 
@@ -51,6 +51,7 @@
 #include "vm/exceptions.h"
 #include "vm/vm.h"
 
+#include "vm/jit/abi.h"
 #include "vm/jit/asmpart.h"
 #include "vm/jit/codegen-common.h"
 #include "vm/jit/dseg.h"
@@ -215,36 +216,32 @@ bool codegen_emit(jitdata *jd)
                        continue;
 
                var = VAR(varindex);
+               s1  = md->params[p].regoff;
 
-               s1 = md->params[p].regoff;
                if (IS_INT_LNG_TYPE(t)) {                    /* integer args          */
                        if (!md->params[p].inmemory) {           /* register arguments    */
 #if SIZEOF_VOID_P == 8
-                               s2 = rd->argintregs[s1];
-                               if (!(var->flags & INMEMORY)) {      /* reg arg -> register   */
-                                       M_INTMOVE(s2, var->vv.regoff);
-                               } else {                             /* reg arg -> spilled    */
-                                       M_LST(s2, REG_SP, var->vv.regoff * 8);
-                               }
+                               if (!(var->flags & INMEMORY))
+                                       M_INTMOVE(s1, var->vv.regoff);
+                               else
+                                       M_LST(s1, REG_SP, var->vv.regoff * 8);
 #else
                                if (IS_2_WORD_TYPE(t)) {
-                                       s2 = PACK_REGS(rd->argintregs[GET_LOW_REG(s1)],
-                                                                  rd->argintregs[GET_HIGH_REG(s1)]);
-                                       if (!(var->flags & INMEMORY))    /* reg arg -> register   */
-                                               M_LNGMOVE(s2, var->vv.regoff);
-                                       else                             /* reg arg -> spilled    */
-                                               M_LST(s2, REG_SP, var->vv.regoff * 8);
+                                       if (!(var->flags & INMEMORY))
+                                               M_LNGMOVE(s1, var->vv.regoff);
+                                       else
+                                               M_LST(s1, REG_SP, var->vv.regoff * 8);
                                }
                                else {
-                                       s2 = rd->argintregs[s1];
-                                       if (!(var->flags & INMEMORY))    /* reg arg -> register   */
-                                               M_INTMOVE(s2, var->vv.regoff);
-                                       else                             /* reg arg -> spilled    */
-                                               M_IST(s2, REG_SP, var->vv.regoff * 8);
+                                       if (!(var->flags & INMEMORY))
+                                               M_INTMOVE(s1, var->vv.regoff);
+                                       else
+                                               M_IST(s1, REG_SP, var->vv.regoff * 8);
                                }
 #endif
-                       } else {                                 /* stack arguments       */
-                               if (!(var->flags & INMEMORY)) {      /* stack arg -> register */
+                       }
+                       else {                                   /* stack arguments       */
+                               if (!(var->flags & INMEMORY)) {
 #if SIZEOF_VOID_P == 8
                                        M_LLD(var->vv.regoff, REG_SP, (cd->stackframesize + s1) * 8);
 #else
@@ -253,78 +250,75 @@ bool codegen_emit(jitdata *jd)
                                        else
                                                M_ILD(var->vv.regoff, REG_SP, (cd->stackframesize + s1) * 8);
 #endif
-                               } else {                             /* stack arg -> spilled  */
+                               }
+                               else
                                        var->vv.regoff = cd->stackframesize + s1;
-                               }
                        }
-
-               } else {                                     /* floating args         */
-                       if (!md->params[p].inmemory) {           /* register arguments    */
+               }
+               else {                                       /* floating args         */
+                       if (!md->params[p].inmemory) {
 #if SIZEOF_VOID_P == 8
-                               s2 = rd->argfltregs[s1];
-                               if (!(var->flags & INMEMORY)) {      /* reg arg -> register   */
+                               if (!(var->flags & INMEMORY)) {
                                        if (IS_2_WORD_TYPE(t))
-                                               M_DMOV(s2, var->vv.regoff);
+                                               M_DMOV(s1, var->vv.regoff);
                                        else
-                                               M_FMOV(s2, var->vv.regoff);
-                               } else {                                         /* reg arg -> spilled    */
+                                               M_FMOV(s1, var->vv.regoff);
+                               }
+                               else {
                                        if (IS_2_WORD_TYPE(t))
-                                               M_DST(s2, REG_SP, var->vv.regoff * 8);
+                                               M_DST(s1, REG_SP, var->vv.regoff * 8);
                                        else
-                                               M_FST(s2, REG_SP, var->vv.regoff * 8);
+                                               M_FST(s1, REG_SP, var->vv.regoff * 8);
                                }
 #else
                                if ((p == 0) ||
                                        ((p == 1) && IS_FLT_DBL_TYPE(md->paramtypes[0].type))) {
-                                       s2 = rd->argfltregs[s1];
-                                       if (!(var->flags & INMEMORY)) {  /* reg arg -> register   */
+                                       if (!(var->flags & INMEMORY)) {
                                                if (IS_2_WORD_TYPE(t))
-                                                       M_DBLMOVE(s2, var->vv.regoff);
+                                                       M_DBLMOVE(s1, var->vv.regoff);
                                                else
-                                                       M_FLTMOVE(s2, var->vv.regoff);
+                                                       M_FLTMOVE(s1, var->vv.regoff);
                                        }
-                                       else {                                   /* reg arg -> spilled    */
+                                       else {
                                                if (IS_2_WORD_TYPE(t))
-                                                       M_DST(s2, REG_SP, var->vv.regoff * 8);
+                                                       M_DST(s1, REG_SP, var->vv.regoff * 8);
                                                else
-                                                       M_FST(s2, REG_SP, var->vv.regoff * 8);
+                                                       M_FST(s1, REG_SP, var->vv.regoff * 8);
                                        }
                                }
                                else {
                                        if (IS_2_WORD_TYPE(t)) {
-                                               s2 = PACK_REGS(rd->argintregs[GET_LOW_REG(s1)],
-                                                                          rd->argintregs[GET_HIGH_REG(s1)]);
                                                if (!(var->flags & INMEMORY)) {
-                                                       M_MTC1(GET_LOW_REG(s2), var->vv.regoff);
-                                                       M_MTC1(GET_HIGH_REG(s2), var->vv.regoff + 1);
+                                                       M_MTC1(GET_LOW_REG(s1), var->vv.regoff);
+                                                       M_MTC1(GET_HIGH_REG(s1), var->vv.regoff + 1);
                                                        M_NOP;
                                                }
                                                else
-                                                       M_LST(s2, REG_SP, var->vv.regoff * 8);
+                                                       M_LST(s1, REG_SP, var->vv.regoff * 8);
                                        }
                                        else {
-                                               s2 = rd->argintregs[s1];
                                                if (!(var->flags & INMEMORY)) {
-                                                       M_MTC1(s2, var->vv.regoff);
+                                                       M_MTC1(s1, var->vv.regoff);
                                                        M_NOP;
                                                }
                                                else
-                                                       M_IST(s2, REG_SP, var->vv.regoff * 8);
+                                                       M_IST(s1, REG_SP, var->vv.regoff * 8);
                                        }
                                }
 #endif
-
-                       } else {                                 /* stack arguments       */
-                               if (!(var->flags & INMEMORY)) {      /* stack-arg -> register */
+                       }
+                       else {
+                               if (!(var->flags & INMEMORY)) {
                                        if (IS_2_WORD_TYPE(t))
                                                M_DLD(var->vv.regoff, REG_SP, (cd->stackframesize + s1) * 8);
                                        else
                                                M_FLD(var->vv.regoff, REG_SP, (cd->stackframesize + s1) * 8);
-                               } else                               /* stack-arg -> spilled  */
+                               }
+                               else
                                        var->vv.regoff = cd->stackframesize + s1;
                        }
                }
-       } /* end for */
+       }
 
        /* call monitorenter function */
 
@@ -339,10 +333,10 @@ bool codegen_emit(jitdata *jd)
                        M_LDA(REG_SP, REG_SP, -(INT_ARG_CNT + FLT_ARG_CNT) * 8);
 
                        for (p = 0; p < INT_ARG_CNT; p++)
-                               M_AST(rd->argintregs[p], REG_SP, p * 8);
+                               M_AST(abi_registers_integer_argument[p], REG_SP, p * 8);
 
                        for (p = 0; p < FLT_ARG_CNT; p++)
-                               M_DST(rd->argfltregs[p], REG_SP, (INT_ARG_CNT + p) * 8);
+                               M_DST(abi_registers_float_argument[p], REG_SP, (INT_ARG_CNT + p) * 8);
 
                        s1 += INT_ARG_CNT + FLT_ARG_CNT;
                }
@@ -370,10 +364,10 @@ bool codegen_emit(jitdata *jd)
 # if !defined(NDEBUG)
                if (opt_verbosecall) {
                        for (p = 0; p < INT_ARG_CNT; p++)
-                               M_ALD(rd->argintregs[p], REG_SP, p * 8);
+                               M_ALD(abi_registers_integer_argument[p], REG_SP, p * 8);
 
                        for (p = 0; p < FLT_ARG_CNT; p++)
-                               M_DLD(rd->argfltregs[p], REG_SP, (INT_ARG_CNT + p) * 8);
+                               M_DLD(abi_registers_float_argument[p], REG_SP, (INT_ARG_CNT + p) * 8);
 
 
                        M_LDA(REG_SP, REG_SP, (INT_ARG_CNT + FLT_ARG_CNT) * 8);
@@ -3088,6 +3082,7 @@ gen_method:
 
                        for (s3 = s3 - 1; s3 >= 0; s3--) {
                                var = VAR(iptr->sx.s23.s2.args[s3]);
+                               d   = md->params[s3].regoff;
 
                                if (var->flags & PREALLOC)
                                        continue;
@@ -3095,37 +3090,30 @@ gen_method:
                                if (IS_INT_LNG_TYPE(var->type)) {
 #if SIZEOF_VOID_P == 8
                                        if (!md->params[s3].inmemory) {
-                                               s1 = rd->argintregs[md->params[s3].regoff];
-                                               d = emit_load(jd, iptr, var, s1);
-                                               M_INTMOVE(d, s1);
+                                               s1 = emit_load(jd, iptr, var, d);
+                                               M_INTMOVE(s1, d);
                                        }
                                        else  {
-                                               d = emit_load(jd, iptr, var, REG_ITMP1);
-                                               M_LST(d, REG_SP, md->params[s3].regoff * 8);
+                                               s1 = emit_load(jd, iptr, var, REG_ITMP1);
+                                               M_LST(s1, REG_SP, d * 8);
                                        }
 #else
                                        if (!md->params[s3].inmemory) {
-                                               if (IS_2_WORD_TYPE(var->type)) {
-                                                       s1 = md->params[s3].regoff;
-                                                       s1 = PACK_REGS(rd->argintregs[GET_LOW_REG(s1)],
-                                                                                  rd->argintregs[GET_HIGH_REG(s1)]);
-                                                       d = emit_load(jd, iptr, var, s1);
-                                                       M_LNGMOVE(d, s1);
-                                               }
-                                               else {
-                                                       s1 = rd->argintregs[md->params[s3].regoff];
-                                                       d = emit_load(jd, iptr, var, s1);
-                                                       M_INTMOVE(d, s1);
-                                               }
+                                               s1 = emit_load(jd, iptr, var, d);
+
+                                               if (IS_2_WORD_TYPE(var->type))
+                                                       M_LNGMOVE(s1, d);
+                                               else
+                                                       M_INTMOVE(s1, d);
                                        }
                                        else {
                                                if (IS_2_WORD_TYPE(var->type)) {
-                                                       d = emit_load(jd, iptr, var, REG_ITMP12_PACKED);
-                                                       M_LST(d, REG_SP, md->params[s3].regoff * 8);
+                                                       s1 = emit_load(jd, iptr, var, REG_ITMP12_PACKED);
+                                                       M_LST(s1, REG_SP, d * 8);
                                                }
                                                else {
-                                                       d = emit_load(jd, iptr, var, REG_ITMP1);
-                                                       M_IST(d, REG_SP, md->params[s3].regoff * 8);
+                                                       s1 = emit_load(jd, iptr, var, REG_ITMP1);
+                                                       M_IST(s1, REG_SP, d * 8);
                                                }
                                        }
 #endif
@@ -3133,47 +3121,41 @@ gen_method:
                                else {
                                        if (!md->params[s3].inmemory) {
 #if SIZEOF_VOID_P == 8
-                                               s1 = rd->argfltregs[md->params[s3].regoff];
-                                               d = emit_load(jd, iptr, var, s1);
+                                               s1 = emit_load(jd, iptr, var, d);
                                                if (IS_2_WORD_TYPE(var->type))
-                                                       M_DMOV(d, s1);
+                                                       M_DMOV(s1, d);
                                                else
-                                                       M_FMOV(d, s1);
+                                                       M_FMOV(s1, d);
 #else
                                                if ((s3 == 0) ||
                                                        ((s3 == 1) && IS_FLT_DBL_TYPE(md->paramtypes[0].type))) {
-                                                       s1 = rd->argfltregs[md->params[s3].regoff];
-                                                       d = emit_load(jd, iptr, var, s1);
+                                                       s1 = emit_load(jd, iptr, var, d);
                                                        if (IS_2_WORD_TYPE(var->type))
-                                                               M_DBLMOVE(d, s1);
+                                                               M_DBLMOVE(s1, d);
                                                        else
-                                                               M_FLTMOVE(d, s1);
+                                                               M_FLTMOVE(s1, d);
                                                }
                                                else {
                                                        if (IS_2_WORD_TYPE(var->type)) {
-                                                               s1 = md->params[s3].regoff;
-                                                               s2 = PACK_REGS(rd->argintregs[GET_LOW_REG(s1)],
-                                                                                          rd->argintregs[GET_HIGH_REG(s1)]);
-                                                               d = emit_load(jd, iptr, var, REG_FTMP1);
-                                                               M_MFC1(GET_LOW_REG(s2), d);
-                                                               M_MFC1(GET_HIGH_REG(s2), d + 1);
+                                                               s1 = emit_load(jd, iptr, var, REG_FTMP1);
+                                                               M_MFC1(GET_LOW_REG(d), s1);
+                                                               M_MFC1(GET_HIGH_REG(d), s1 + 1);
                                                                M_NOP;
                                                        }
                                                        else {
-                                                               s1 = rd->argintregs[md->params[s3].regoff];
-                                                               d = emit_load(jd, iptr, var, s1);
-                                                               M_MFC1(s1, d);
+                                                               s1 = emit_load(jd, iptr, var, d);
+                                                               M_MFC1(d, s1);
                                                                M_NOP;
                                                        }
                                                }       
 #endif
                                        }
                                        else {
-                                               d = emit_load(jd, iptr, var, REG_FTMP1);
+                                               s1 = emit_load(jd, iptr, var, REG_FTMP1);
                                                if (IS_2_WORD_TYPE(var->type))
-                                                       M_DST(d, REG_SP, md->params[s3].regoff * 8);
+                                                       M_DST(s1, REG_SP, d * 8);
                                                else
-                                                       M_FST(d, REG_SP, md->params[s3].regoff * 8);
+                                                       M_FST(s1, REG_SP, d * 8);
                                        }
                                }
                        }
@@ -3747,23 +3729,21 @@ void codegen_emit_stub_compiler(jitdata *jd)
 
 void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 {
-       methodinfo   *m;
-       codeinfo     *code;
-       codegendata  *cd;
-       registerdata *rd;
-       methoddesc   *md;
-       s4            nativeparams;
-       s4            i, j;                 /* count variables                    */
-       s4            t;
-       s4            s1, s2, disp;
-       s4            funcdisp;             /* displacement of the function       */
+       methodinfo  *m;
+       codeinfo    *code;
+       codegendata *cd;
+       methoddesc  *md;
+       s4           nativeparams;
+       s4           i, j;
+       s4           t;
+       s4           s1, s2, disp;
+       s4           funcdisp;              /* displacement of the function       */
 
        /* get required compiler data */
 
        m    = jd->m;
        code = jd->code;
        cd   = jd->cd;
-       rd   = jd->rd;
 
        /* initialize variables */
 
@@ -3823,7 +3803,8 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 #if SIZEOF_VOID_P == 8
        for (i = 0, j = 0; i < md->paramcount && i < INT_ARG_CNT; i++) {
                if (IS_INT_LNG_TYPE(md->params[i].type)) {
-                       M_AST(rd->argintregs[i], REG_SP, j * 8);
+                       s1 = md->params[i].regoff;
+                       M_AST(s1, REG_SP, j * 8);
                        j++;
                }
        }
@@ -3832,14 +3813,12 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
                if (IS_INT_LNG_TYPE(md->params[i].type)) {
                        if (!md->params[i].inmemory) {
                                s1 = md->params[i].regoff;
-                               if (IS_2_WORD_TYPE(md->params[i].type)) {
-                                       s1 = PACK_REGS(rd->argintregs[GET_LOW_REG(s1)],
-                                                                  rd->argintregs[GET_HIGH_REG(s1)]);
+
+                               if (IS_2_WORD_TYPE(md->params[i].type))
                                        M_LST(s1, REG_SP, j * 8);
-                               }
-                               else {
-                                       M_IST(rd->argintregs[s1], REG_SP, j * 8);
-                               }
+                               else
+                                       M_IST(s1, REG_SP, j * 8);
+
                                j++;
                        }
                }
@@ -3848,10 +3827,13 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        for (i = 0; i < md->paramcount && i < FLT_ARG_CNT; i++) {
                if (IS_FLT_DBL_TYPE(md->params[i].type)) {
+                       s1 = md->params[i].regoff;
+
                        if (IS_2_WORD_TYPE(md->params[i].type))
-                               M_DST(rd->argfltregs[i], REG_SP, j * 8);
+                               M_DST(s1, REG_SP, j * 8);
                        else
-                               M_FST(rd->argfltregs[i], REG_SP, j * 8);
+                               M_FST(s1, REG_SP, j * 8);
+
                        j++;
                }
        }
@@ -3872,7 +3854,8 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 #if SIZEOF_VOID_P == 8
        for (i = 0, j = 0; i < md->paramcount && i < INT_ARG_CNT; i++) {
                if (IS_INT_LNG_TYPE(md->params[i].type)) {
-                       M_LLD(rd->argintregs[i], REG_SP, j * 8);
+                       s1 = md->params[i].regoff;
+                       M_LLD(s1, REG_SP, j * 8);
                        j++;
                }
        }
@@ -3881,14 +3864,12 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
                if (IS_INT_LNG_TYPE(md->params[i].type)) {
                        if (!md->params[i].inmemory) {
                                s1 = md->params[i].regoff;
-                               if (IS_2_WORD_TYPE(md->params[i].type)) {
-                                       s1 = PACK_REGS(rd->argintregs[GET_LOW_REG(s1)],
-                                                                  rd->argintregs[GET_HIGH_REG(s1)]);
+
+                               if (IS_2_WORD_TYPE(md->params[i].type))
                                        M_LLD(s1, REG_SP, j * 8);
-                               }
-                               else {
-                                       M_ILD(rd->argintregs[s1], REG_SP, j * 8);
-                               }
+                               else
+                                       M_ILD(s1, REG_SP, j * 8);
+
                                j++;
                        }
                }
@@ -3897,10 +3878,13 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        for (i = 0; i < md->paramcount && i < FLT_ARG_CNT; i++) {
                if (IS_FLT_DBL_TYPE(md->params[i].type)) {
+                       s1 = md->params[i].regoff;
+
                        if (IS_2_WORD_TYPE(md->params[i].type))
-                               M_DLD(rd->argfltregs[i], REG_SP, j * 8);
+                               M_DLD(s1, REG_SP, j * 8);
                        else
-                               M_FLD(rd->argfltregs[i], REG_SP, j * 8);
+                               M_FLD(s1, REG_SP, j * 8);
+
                        j++;
                }
        }
@@ -3913,36 +3897,19 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
                if (IS_INT_LNG_TYPE(t)) {
                        if (!md->params[i].inmemory) {
                                s1 = md->params[i].regoff;
-#if SIZEOF_VOID_P == 8
-                               s1 = rd->argintregs[s1];
-#else
-                               if (IS_2_WORD_TYPE(t))
-                                       s1 = PACK_REGS(rd->argintregs[GET_LOW_REG(s1)],
-                                                                  rd->argintregs[GET_HIGH_REG(s1)]);
-                               else
-                                       s1 = rd->argintregs[s1];
-#endif
+                               s2 = nmd->params[j].regoff;
 
                                if (!nmd->params[j].inmemory) {
-                                       s2 = nmd->params[j].regoff;
 #if SIZEOF_VOID_P == 8
-                                       s2 = rd->argintregs[s2];
                                        M_INTMOVE(s1, s2);
 #else
-                                       if (IS_2_WORD_TYPE(t)) {
-                                               s2 = PACK_REGS(rd->argintregs[GET_LOW_REG(s2)],
-                                                                          rd->argintregs[GET_HIGH_REG(s2)]);
+                                       if (IS_2_WORD_TYPE(t))
                                                M_LNGMOVE(s1, s2);
-                                       }
-                                       else {
-                                               s2 = rd->argintregs[s2];
+                                       else
                                                M_INTMOVE(s1, s2);
-                                       }
 #endif
                                }
                                else {
-                                       s2 = nmd->params[j].regoff;
-
 #if SIZEOF_VOID_P == 8
                                        M_LST(s1, REG_SP, s2 * 8);
 #else
@@ -3962,8 +3929,8 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
                                M_LST(REG_ITMP1, REG_SP, s2 * 8);
 #else
                                if (IS_2_WORD_TYPE(t)) {
-                                       M_LLD(PACK_REGS(REG_ITMP1, REG_ITMP2), REG_SP, s1 * 8);
-                                       M_LST(PACK_REGS(REG_ITMP1, REG_ITMP2), REG_SP, s2 * 4);
+                                       M_LLD(REG_ITMP12_PACKED, REG_SP, s1 * 8);
+                                       M_LST(REG_ITMP12_PACKED, REG_SP, s2 * 4);
                                }
                                else {
                                        M_ILD(REG_ITMP1, REG_SP, s1 * 8);
@@ -3979,8 +3946,6 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
                                if (!nmd->params[j].inmemory) {
 #if SIZEOF_VOID_P == 8
-                                       s1 = rd->argfltregs[s1];
-                                       s2 = rd->argfltregs[s2];
                                        if (IS_2_WORD_TYPE(t))
                                                M_DMOV(s1, s2);
                                        else
@@ -3992,10 +3957,6 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
                                           argument (JNIenv) */
 
                                        if (IS_2_WORD_TYPE(t)) {
-                                               s1 = rd->argfltregs[s1];
-                                               s2 = PACK_REGS(rd->argintregs[GET_LOW_REG(s2)],
-                                                                          rd->argintregs[GET_HIGH_REG(s2)]);
-
                                                /* double high/low order is endian
                                                   independent: even numbered holds low
                                                   32-bits, odd numbered high 32-bits */
@@ -4003,17 +3964,12 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
                                                M_MFC1(GET_LOW_REG(s2), s1);           /* low 32-bits */
                                                M_MFC1(GET_HIGH_REG(s2), s1 + 1);     /* high 32-bits */
                                        }
-                                       else {
-                                               s1 = rd->argfltregs[s1];
-                                               s2 = rd->argintregs[s2];
+                                       else
                                                M_MFC1(s2, s1);
-                                       }
 #endif
                                }
                                else {
 #if SIZEOF_VOID_P == 8
-                                       s1 = rd->argfltregs[s1];
-
                                        if (IS_2_WORD_TYPE(t))
                                                M_DST(s1, REG_SP, s2 * 8);
                                        else
@@ -4023,12 +3979,10 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
                                           but was moved out by the native function
                                           argument(s), just get low register */
 
-                                       s1 = rd->argfltregs[GET_LOW_REG(s1)];
-
                                        if (IS_2_WORD_TYPE(t))
-                                               M_DST(s1, REG_SP, s2 * 4);
+                                               M_DST(GET_LOW_REG(s1), REG_SP, s2 * 4);
                                        else
-                                               M_FST(s1, REG_SP, s2 * 4);
+                                               M_FST(GET_LOW_REG(s1), REG_SP, s2 * 4);
 #endif
                                }
                        }
@@ -4068,21 +4022,32 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        /* save return value */
 
-       if (md->returntype.type != TYPE_VOID) {
+       switch (md->returntype.type) {
 #if SIZEOF_VOID_P == 8
-               if (IS_INT_LNG_TYPE(md->returntype.type))
-                       M_LST(REG_RESULT, REG_SP, 0 * 8);
-               else
-                       M_DST(REG_FRESULT, REG_SP, 0 * 8);
+       case TYPE_INT:
+       case TYPE_LNG:
+       case TYPE_ADR:
+               M_LST(REG_RESULT, REG_SP, 0 * 8);
+               break;
+       case TYPE_FLT:
+       case TYPE_DBL:
+               M_DST(REG_FRESULT, REG_SP, 0 * 8);
+               break;
 #else
-               if (IS_INT_LNG_TYPE(md->returntype.type)) {
-                       M_IST(REG_RESULT, REG_SP, 1*4 + 0 * 8);
-                       if (IS_2_WORD_TYPE(md->returntype.type))
-                               M_IST(REG_RESULT2, REG_SP, 1*4 + 0 * 8 + 4);
-               }
-               else
-                       M_DST(REG_FRESULT, REG_SP, 1*4 + 0 * 8);
+       case TYPE_INT:
+       case TYPE_ADR:
+               M_IST(REG_RESULT, REG_SP, 1*4 + 0 * 8);
+               break;
+       case TYPE_LNG:
+               M_LST(REG_RESULT_PACKED, REG_SP, 1*4 + 0 * 8);
+               break;
+       case TYPE_FLT:
+       case TYPE_DBL:
+               M_DST(REG_FRESULT, REG_SP, 1*4 + 0 * 8);
+               break;
 #endif
+       case TYPE_VOID:
+               break;
        }
 
 #if !defined(NDEBUG)
@@ -4101,21 +4066,32 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        /* restore return value */
 
-       if (md->returntype.type != TYPE_VOID) {
+       switch (md->returntype.type) {
 #if SIZEOF_VOID_P == 8
-               if (IS_INT_LNG_TYPE(md->returntype.type))
-                       M_LLD(REG_RESULT, REG_SP, 0 * 8);
-               else
-                       M_DLD(REG_FRESULT, REG_SP, 0 * 8);
+       case TYPE_INT:
+       case TYPE_LNG:
+       case TYPE_ADR:
+               M_LLD(REG_RESULT, REG_SP, 0 * 8);
+               break;
+       case TYPE_FLT:
+       case TYPE_DBL:
+               M_DLD(REG_FRESULT, REG_SP, 0 * 8);
+               break;
 #else
-               if (IS_INT_LNG_TYPE(md->returntype.type)) {
-                       M_ILD(REG_RESULT, REG_SP, 1*4 + 0 * 8);
-                       if (IS_2_WORD_TYPE(md->returntype.type))
-                               M_ILD(REG_RESULT2, REG_SP, 1*4 + 0 * 8 + 4);
-               }
-               else
-                       M_DLD(REG_FRESULT, REG_SP, 1*4 + 0 * 8);
+       case TYPE_INT:
+       case TYPE_ADR:
+               M_ILD(REG_RESULT, REG_SP, 1*4 + 0 * 8);
+               break;
+       case TYPE_LNG:
+               M_LLD(REG_RESULT_PACKED, REG_SP, 1*4 + 0 * 8);
+               break;
+       case TYPE_FLT:
+       case TYPE_DBL:
+               M_DLD(REG_FRESULT, REG_SP, 1*4 + 0 * 8);
+               break;
 #endif
+       case TYPE_VOID:
+               break;
        }
 
        M_ALD(REG_RA, REG_SP, (cd->stackframesize - 1) * 8); /* load RA           */
index e3feaf675fbd7b576ac01467de34449f5644743c..a09c8b1cb1469b1d393442d689adbfca1bbd234b 100644 (file)
@@ -46,6 +46,7 @@
 #include "vm/exceptions.h"
 #include "vm/stringlocal.h" /* XXX for gen_resolvebranch */
 
+#include "vm/jit/abi.h"
 #include "vm/jit/abi-asm.h"
 #include "vm/jit/asmpart.h"
 #include "vm/jit/dseg.h"
@@ -94,6 +95,8 @@ s4 emit_load(jitdata *jd, instruction *iptr, varinfo *src, s4 tempreg)
                        break;
 #endif
                case TYPE_FLT:
+                       M_FLD(tempreg, REG_SP, disp);
+                       break;
                case TYPE_DBL:
                        M_DLD(tempreg, REG_SP, disp);
                        break;
@@ -227,6 +230,8 @@ void emit_store(jitdata *jd, instruction *iptr, varinfo *dst, s4 d)
                        break;
 #endif
                case TYPE_FLT:
+                       M_FST(d, REG_SP, disp);
+                       break;
                case TYPE_DBL:
                        M_DST(d, REG_SP, disp);
                        break;
@@ -828,10 +833,10 @@ void emit_verbosecall_enter(jitdata *jd)
           types, so it's correct for MIPS32 too) */
 
        for (i = 0; i < INT_ARG_CNT; i++)
-               M_AST(rd->argintregs[i], REG_SP, PA_SIZE + (2 + i) * 8);
+               M_AST(abi_registers_integer_argument[i], REG_SP, PA_SIZE + (2 + i) * 8);
 
        for (i = 0; i < FLT_ARG_CNT; i++)
-               M_DST(rd->argfltregs[i], REG_SP, PA_SIZE + (2 + INT_ARG_CNT + i) * 8);
+               M_DST(abi_registers_float_argument[i], REG_SP, PA_SIZE + (2 + INT_ARG_CNT + i) * 8);
 
        /* save temporary registers for leaf methods */
 
@@ -852,12 +857,12 @@ void emit_verbosecall_enter(jitdata *jd)
 
                if (IS_FLT_DBL_TYPE(t)) {
                        if (IS_2_WORD_TYPE(t)) {
-                               M_DST(rd->argfltregs[i], REG_SP, 0 * 8);
-                               M_LLD(rd->argintregs[i], REG_SP, 0 * 8);
+                               M_DST(abi_registers_float_argument[i], REG_SP, 0 * 8);
+                               M_LLD(abi_registers_integer_argument[i], REG_SP, 0 * 8);
                        }
                        else {
-                               M_FST(rd->argfltregs[i], REG_SP, 0 * 8);
-                               M_ILD(rd->argintregs[i], REG_SP, 0 * 8);
+                               M_FST(abi_registers_float_argument[i], REG_SP, 0 * 8);
+                               M_ILD(abi_registers_integer_argument[i], REG_SP, 0 * 8);
                        }
                }
        }
@@ -868,16 +873,16 @@ void emit_verbosecall_enter(jitdata *jd)
 
                        if (IS_INT_LNG_TYPE(t)) {
                                if (IS_2_WORD_TYPE(t)) {
-                                       M_ILD(rd->argintregs[j], REG_SP, PA_SIZE + (2 + i) * 8);
-                                       M_ILD(rd->argintregs[j + 1], REG_SP, PA_SIZE + (2 + i) * 8 + 4);
+                                       M_ILD(abi_registers_integer_argument[j], REG_SP, PA_SIZE + (2 + i) * 8);
+                                       M_ILD(abi_registers_integer_argument[j + 1], REG_SP, PA_SIZE + (2 + i) * 8 + 4);
                                }
                                else {
 # if WORDS_BIGENDIAN == 1
-                                       M_MOV(REG_ZERO, rd->argintregs[j]);
-                                       M_ILD(rd->argintregs[j + 1], REG_SP, PA_SIZE + (2 + i) * 8);
+                                       M_MOV(REG_ZERO, abi_registers_integer_argument[j]);
+                                       M_ILD(abi_registers_integer_argument[j + 1], REG_SP, PA_SIZE + (2 + i) * 8);
 # else
-                                       M_ILD(rd->argintregs[j], REG_SP, PA_SIZE + (2 + i) * 8);
-                                       M_MOV(REG_ZERO, rd->argintregs[j + 1]);
+                                       M_ILD(abi_registers_integer_argument[j], REG_SP, PA_SIZE + (2 + i) * 8);
+                                       M_MOV(REG_ZERO, abi_registers_integer_argument[j + 1]);
 # endif
                                }
                                j += 2;
@@ -896,10 +901,10 @@ void emit_verbosecall_enter(jitdata *jd)
        /* restore argument registers */
 
        for (i = 0; i < INT_ARG_CNT; i++)
-               M_ALD(rd->argintregs[i], REG_SP, PA_SIZE + (2 + i) * 8);
+               M_ALD(abi_registers_integer_argument[i], REG_SP, PA_SIZE + (2 + i) * 8);
 
        for (i = 0; i < FLT_ARG_CNT; i++)
-               M_DLD(rd->argfltregs[i], REG_SP, PA_SIZE + (2 + INT_ARG_CNT + i) * 8);
+               M_DLD(abi_registers_float_argument[i], REG_SP, PA_SIZE + (2 + INT_ARG_CNT + i) * 8);
 
        /* restore temporary registers for leaf methods */
 
index a14b272476bdf16a6eac669ada44cc393692397e..d539eef67d2d48ac43689e3a0a547f446da2cf15 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: md-abi.c 7699 2007-04-13 10:42:05Z twisti $
+   $Id: md-abi.c 7713 2007-04-15 21:49:48Z twisti $
 
 */
 
@@ -60,6 +60,36 @@ const char *abi_registers_integer_name[] = {
        "t8",    "t9",    "k0",    "k1",    "gp",    "sp",    "s8",    "ra"
 };
 
+const s4 abi_registers_integer_argument[] = {
+       4,  /* a0  */
+       5,  /* a1  */
+       6,  /* a2  */
+       7,  /* a3  */
+       8,  /* a4  */
+       9,  /* a5  */
+       10, /* a6  */
+       11, /* a7  */
+};
+
+const s4 abi_registers_integer_saved[] = {
+       16, /* s0  */
+       17, /* s1  */
+       18, /* s2  */
+       19, /* s3  */
+       20, /* s4  */
+       21, /* s5  */
+       22, /* s6  */
+       23, /* s7  */
+};
+
+const s4 abi_registers_integer_temporary[] = {
+       12, /* t0  */
+       13, /* t1  */
+       14, /* t2  */
+       15, /* t3  */
+       24, /* t4  */
+};
+
 
 s4 nregdescfloat[] = {
        /*  fv0,   ftmp1,   ftmp2,   ftmp3,     ft0,     ft1,     ft2,     ft3,   */
@@ -77,6 +107,43 @@ s4 nregdescfloat[] = {
        REG_END
 };
 
+const s4 abi_registers_float_argument[] = {
+       12, /* fa0  */
+       13, /* fa1  */
+       14, /* fa2  */
+       15, /* fa3  */
+       16, /* fa4  */
+       17, /* fa5  */
+       18, /* fa6  */
+       19, /* fa7  */
+};
+
+const s4 abi_registers_float_saved[] = {
+       24, /* fs0  */
+       26, /* fs1  */
+       28, /* fs2  */
+       30, /* fs3  */
+};
+
+const s4 abi_registers_float_temporary[] = {
+       4,  /* ft0  */
+       5,  /* ft1  */
+       6,  /* ft2  */
+       7,  /* ft3  */
+       8,  /* ft4  */
+       9,  /* ft5  */
+       10, /* ft6  */
+       11, /* ft7  */
+       20, /* ft8  */
+       21, /* ft9  */
+       22, /* ft10 */
+       23, /* ft11 */
+       25, /* ft12 */
+       27, /* ft13 */
+       29, /* ft14 */
+       31, /* ft15 */
+};
+
 #else /* SIZEOF_VOID_P == 8 */
 
 /* MIPS32 */
@@ -104,6 +171,35 @@ const char *abi_registers_integer_name[] = {
        "t8",    "t9",    "k0",    "k1",    "gp",    "sp",    "s8",    "ra"
 };
 
+const s4 abi_registers_integer_argument[] = {
+       4,  /* a0  */
+       5,  /* a1  */
+       6,  /* a2  */
+       7,  /* a3  */
+};
+
+const s4 abi_registers_integer_saved[] = {
+       16, /* s0  */
+       17, /* s1  */
+       18, /* s2  */
+       19, /* s3  */
+       20, /* s4  */
+       21, /* s5  */
+       22, /* s6  */
+       23, /* s7  */
+};
+
+const s4 abi_registers_integer_temporary[] = {
+       8,  /* t0  */
+       9,  /* t1  */
+       10, /* t2  */
+       11, /* t3  */
+       12, /* t4  */
+       13, /* t5  */
+       14, /* t6  */
+       15, /* t7  */
+};
+
 
 #if !defined(ENABLE_SOFT_FLOAT)
 
@@ -123,6 +219,28 @@ s4 nregdescfloat[] = {
        REG_END
 };
 
+const s4 abi_registers_float_argument[] = {
+       12, /* fa0  */
+       14, /* fa1  */
+};
+
+const s4 abi_registers_float_saved[] = {
+       20, /* fs0  */
+       22, /* fs1  */
+       24, /* fs2  */
+       26, /* fs3  */
+       28, /* fs4  */
+       30, /* fs5  */
+};
+
+const s4 abi_registers_float_temporary[] = {
+       8,  /* ft0  */
+       10, /* ft1  */
+       16, /* ft2  */
+       18, /* ft3  */
+};
+
+
 #else /* !defined(ENABLE_SOFT_FLOAT) */
 
 s4 nregdescfloat[] = {
@@ -153,8 +271,8 @@ void md_param_alloc(methoddesc *md)
 
        /* set default values */
 
-       reguse = 0;
-       stacksize = 0;
+       reguse      = 0;
+       stacksize   = 0;
 #if SIZEOF_VOID_P == 4 && !defined(ENABLE_SOFT_FLOAT)
        a0_is_float = false;
 #endif
@@ -172,7 +290,7 @@ void md_param_alloc(methoddesc *md)
                case TYPE_LNG:
                        if (i < INT_ARG_CNT) {
                                pd->inmemory = false;
-                               pd->regoff   = reguse;
+                               pd->regoff   = abi_registers_integer_argument[reguse];
                                reguse++;
                                md->argintreguse = reguse;
                        }
@@ -186,7 +304,7 @@ void md_param_alloc(methoddesc *md)
                case TYPE_DBL:
                        if (i < FLT_ARG_CNT) {
                                pd->inmemory = false;
-                               pd->regoff   = reguse;
+                               pd->regoff   = abi_registers_float_argument[reguse];
                                reguse++;
                                md->argfltreguse = reguse;
                        }
@@ -214,14 +332,14 @@ void md_param_alloc(methoddesc *md)
                        ((i == 0) ||
                         ((i == 1) && IS_FLT_DBL_TYPE(md->paramtypes[0].type)))) {
                        if (IS_2_WORD_TYPE(t)) {
-                               pd->type = TYPE_DBL;
-                               pd->regoff = reguse;
+                               pd->type   = TYPE_DBL;
+                               pd->regoff = abi_registers_float_argument[reguse];
                                reguse++;
                                stacksize += 2;
                        }
                        else {
-                               pd->type = TYPE_FLT;
-                               pd->regoff = reguse;
+                               pd->type   = TYPE_FLT;
+                               pd->regoff = abi_registers_float_argument[reguse];
                                reguse++;
                                stacksize++;
                        }
@@ -236,9 +354,13 @@ void md_param_alloc(methoddesc *md)
                                if (reguse < INT_ARG_CNT) {
                                        pd->inmemory = false;
 # if WORDS_BIGENDIAN == 1
-                                       pd->regoff   = PACK_REGS(reguse + 1, reguse);
+                                       pd->regoff   =
+                                               PACK_REGS(abi_registers_integer_argument[reguse + 1],
+                                                                 abi_registers_integer_argument[reguse]);
 # else
-                                       pd->regoff   = PACK_REGS(reguse, reguse + 1);
+                                       pd->regoff   =
+                                               PACK_REGS(abi_registers_integer_argument[reguse],
+                                                                 abi_registers_integer_argument[reguse + 1]);
 # endif
                                        reguse += 2;
                                        md->argintreguse = reguse;
@@ -254,13 +376,13 @@ void md_param_alloc(methoddesc *md)
 
                                if (reguse < INT_ARG_CNT) {
                                        pd->inmemory = false;
-                                       pd->regoff = reguse;
+                                       pd->regoff   = abi_registers_integer_argument[reguse];
                                        reguse++;
                                        md->argintreguse = reguse;
                                }
                                else {
                                        pd->inmemory = true;
-                                       pd->regoff = stacksize;
+                                       pd->regoff   = stacksize;
                                }
                                stacksize++;
                        }
@@ -277,7 +399,7 @@ void md_param_alloc(methoddesc *md)
 
                        if (i < INT_ARG_CNT) {
                                pd->inmemory = false;
-                               pd->regoff   = reguse;
+                               pd->regoff   = abi_registers_integer_argument[reguse];
                                reguse++;
                                md->argintreguse = reguse;
                        }
@@ -294,9 +416,13 @@ void md_param_alloc(methoddesc *md)
                        if (i < INT_ARG_CNT) {
                                pd->inmemory = false;
 #if WORDS_BIGENDIAN == 1
-                               pd->regoff   = PACK_REGS(reguse + 1, reguse);
+                               pd->regoff   =
+                                       PACK_REGS(abi_registers_integer_argument[reguse + 1],
+                                                         abi_registers_integer_argument[reguse]);
 #else
-                               pd->regoff   = PACK_REGS(reguse, reguse + 1);
+                               pd->regoff   =
+                                       PACK_REGS(abi_registers_integer_argument[reguse],
+                                                         abi_registers_integer_argument[reguse + 1]);
 #endif
                                reguse += 2;
                                md->argintreguse = reguse;
index 04759b2d96df6f23de3a8c5583df750fb399b019..824c5cb28ac22ba2ad7a3ed54f1b548e0b7a8044 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: codegen.c 7693 2007-04-12 14:56:49Z michi $
+   $Id: codegen.c 7723 2007-04-16 18:03:08Z michi $
 
 */
 
@@ -244,36 +244,31 @@ bool codegen_emit(jitdata *jd)
                        continue;
 
                var = VAR(varindex);
+               s1  = md->params[p].regoff;
 
-               s1 = md->params[p].regoff;
-               if (IS_INT_LNG_TYPE(t)) {                    /* integer args          */
-                       if (IS_2_WORD_TYPE(t))
-                               s2 = PACK_REGS(rd->argintregs[GET_LOW_REG(s1)],
-                                                          rd->argintregs[GET_HIGH_REG(s1)]);
-                       else
-                               s2 = rd->argintregs[s1];
-                       if (!md->params[p].inmemory) {           /* register arguments    */
-                               if (!IS_INMEMORY(var->flags)) {      /* reg arg -> register   */
+               if (IS_INT_LNG_TYPE(t)) {
+                       if (!md->params[p].inmemory) {
+                               if (!IS_INMEMORY(var->flags)) {
                                        if (IS_2_WORD_TYPE(t))
-                                               M_LNGMOVE(s2, var->vv.regoff);
+                                               M_LNGMOVE(s1, var->vv.regoff);
                                        else
-                                               M_INTMOVE(s2, var->vv.regoff);
-
-                               } else {                             /* reg arg -> spilled    */
+                                               M_INTMOVE(s1, var->vv.regoff);
+                               }
+                               else {
                                        if (IS_2_WORD_TYPE(t))
-                                               M_LST(s2, REG_SP, var->vv.regoff * 4);
+                                               M_LST(s1, REG_SP, var->vv.regoff * 4);
                                        else
-                                               M_IST(s2, REG_SP, var->vv.regoff * 4);
+                                               M_IST(s1, REG_SP, var->vv.regoff * 4);
                                }
-
-                       } else {                                 /* stack arguments       */
-                               if (!IS_INMEMORY(var->flags)) {      /* stack arg -> register */
+                       }
+                       else {
+                               if (!IS_INMEMORY(var->flags)) {
                                        if (IS_2_WORD_TYPE(t))
                                                M_LLD(var->vv.regoff, REG_SP, (cd->stackframesize + s1) * 4);
                                        else
                                                M_ILD(var->vv.regoff, REG_SP, (cd->stackframesize + s1) * 4);
-
-                               } else {                             /* stack arg -> spilled  */
+                               }
+                               else {
 #if 1
                                        M_ILD(REG_ITMP1, REG_SP, (cd->stackframesize + s1) * 4);
                                        M_IST(REG_ITMP1, REG_SP, var->vv.regoff * 4);
@@ -287,29 +282,26 @@ bool codegen_emit(jitdata *jd)
 #endif
                                }
                        }
-
-               } else {                                     /* floating args         */
-                       if (!md->params[p].inmemory) {           /* register arguments    */
-                               s2 = rd->argfltregs[s1];
-                               if (!IS_INMEMORY(var->flags)) {      /* reg arg -> register   */
-                                       M_FLTMOVE(s2, var->vv.regoff);
-
-                               } else {                                         /* reg arg -> spilled    */
+               }
+               else {
+                       if (!md->params[p].inmemory) {
+                               if (!IS_INMEMORY(var->flags))
+                                       M_FLTMOVE(s1, var->vv.regoff);
+                               else {
                                        if (IS_2_WORD_TYPE(t))
-                                               M_DST(s2, REG_SP, var->vv.regoff * 4);
+                                               M_DST(s1, REG_SP, var->vv.regoff * 4);
                                        else
-                                               M_FST(s2, REG_SP, var->vv.regoff * 4);
+                                               M_FST(s1, REG_SP, var->vv.regoff * 4);
                                }
-
-                       } else {                                 /* stack arguments       */
-                               if (!IS_INMEMORY(var->flags)) {      /* stack-arg -> register */
+                       }
+                       else {
+                               if (!IS_INMEMORY(var->flags)) {
                                        if (IS_2_WORD_TYPE(t))
                                                M_DLD(var->vv.regoff, REG_SP, (cd->stackframesize + s1) * 4);
-
                                        else
                                                M_FLD(var->vv.regoff, REG_SP, (cd->stackframesize + s1) * 4);
-
-                               } else {                             /* stack-arg -> spilled  */
+                               }
+                               else {
 #if 1
                                        if (IS_2_WORD_TYPE(t)) {
                                                M_DLD(REG_FTMP1, REG_SP, (cd->stackframesize + s1) * 4);
@@ -327,7 +319,7 @@ bool codegen_emit(jitdata *jd)
                                }
                        }
                }
-       } /* end for */
+       }
 
 #if defined(ENABLE_THREADS)
        /* call monitorenter function */
@@ -342,10 +334,10 @@ bool codegen_emit(jitdata *jd)
                        M_AADD_IMM(REG_SP, -((LA_SIZE_IN_POINTERS + ARG_CNT) * 8), REG_SP);
 
                        for (p = 0; p < INT_ARG_CNT; p++)
-                               M_IST(rd->argintregs[p], REG_SP, LA_SIZE + p * 8);
+                               M_IST(abi_registers_integer_argument[p], REG_SP, LA_SIZE + p * 8);
 
                        for (p = 0; p < FLT_ARG_CNT; p++)
-                               M_DST(rd->argfltregs[p], REG_SP, LA_SIZE + (INT_ARG_CNT + p) * 8);
+                               M_DST(abi_registers_float_argument[p], REG_SP, LA_SIZE + (INT_ARG_CNT + p) * 8);
 
                        /* ATTENTION: We multiply here with 2, because we use * 8
                           above for simplicity and below * 4! */
@@ -354,15 +346,15 @@ bool codegen_emit(jitdata *jd)
                }
 # endif
 
-               p = dseg_add_functionptr(cd, LOCK_monitor_enter);
-               M_ALD(REG_ITMP3, REG_PV, p);
+               disp = dseg_add_functionptr(cd, LOCK_monitor_enter);
+               M_ALD(REG_ITMP3, REG_PV, disp);
                M_MTCTR(REG_ITMP3);
 
                /* get or test the lock object */
 
                if (m->flags & ACC_STATIC) {
-                       p = dseg_add_address(cd, &m->class->object.header);
-                       M_ALD(REG_A0, REG_PV, p);
+                       disp = dseg_add_address(cd, &m->class->object.header);
+                       M_ALD(REG_A0, REG_PV, disp);
                }
                else {
                        M_TST(REG_A0);
@@ -376,10 +368,10 @@ bool codegen_emit(jitdata *jd)
 # if !defined(NDEBUG)
                if (JITDATA_HAS_FLAG_VERBOSECALL(jd)) {
                        for (p = 0; p < INT_ARG_CNT; p++)
-                               M_ILD(rd->argintregs[p], REG_SP, LA_SIZE + p * 8);
+                               M_ILD(abi_registers_integer_argument[p], REG_SP, LA_SIZE + p * 8);
 
                        for (p = 0; p < FLT_ARG_CNT; p++)
-                               M_DLD(rd->argfltregs[p], REG_SP, LA_SIZE + (INT_ARG_CNT + p) * 8);
+                               M_DLD(abi_registers_float_argument[p], REG_SP, LA_SIZE + (INT_ARG_CNT + p) * 8);
 
                        M_AADD_IMM(REG_SP, (LA_SIZE_IN_POINTERS + ARG_CNT) * 8, REG_SP);
                }
@@ -822,26 +814,21 @@ bool codegen_emit(jitdata *jd)
                case ICMD_LDIV:       /* ..., val1, val2  ==> ..., val1 / val2        */
                case ICMD_LREM:       /* ..., val1, val2  ==> ..., val1 % val2        */
 
-                       bte = iptr->sx.s23.s3.bte;
-                       md  = bte->md;
+                       s1 = emit_load_s1(jd, iptr, REG_A0_A1_PACKED);
+                       s2 = emit_load_s2(jd, iptr, REG_A2_A3_PACKED);
 
-                       s2 = emit_load_s2(jd, iptr, REG_ITMP12_PACKED);
+                       /* XXX TODO: only do this if arithmetic check is really done! */
                        M_OR_TST(GET_HIGH_REG(s2), GET_LOW_REG(s2), REG_ITMP3);
                        /* XXX could be optimized */
                        emit_arithmetic_check(cd, iptr, REG_ITMP3);
 
+                       bte = iptr->sx.s23.s3.bte;
                        disp = dseg_add_functionptr(cd, bte->fp);
                        M_ALD(REG_ITMP3, REG_PV, disp);
                        M_MTCTR(REG_ITMP3);
 
-                       s3 = PACK_REGS(rd->argintregs[GET_LOW_REG(md->params[1].regoff)],
-                                                  rd->argintregs[GET_HIGH_REG(md->params[1].regoff)]);
-                       M_LNGMOVE(s2, s3);
-
-                       s1 = emit_load_s1(jd, iptr, REG_ITMP12_PACKED);
-                       s3 = PACK_REGS(rd->argintregs[GET_LOW_REG(md->params[0].regoff)],
-                                                  rd->argintregs[GET_HIGH_REG(md->params[0].regoff)]);
-                       M_LNGMOVE(s1, s3);
+                       M_LNGMOVE(s1, REG_A0_A1_PACKED);
+                       M_LNGMOVE(s2, REG_A2_A3_PACKED);
 
                        M_JSR;
 
@@ -2408,6 +2395,7 @@ gen_method:
 
                        for (s3 = s3 - 1; s3 >= 0; s3--) {
                                var = VAR(iptr->sx.s23.s2.args[s3]);
+                               d   = md->params[s3].regoff;
 
                                /* Already Preallocated? */
                                if (var->flags & PREALLOC)
@@ -2416,41 +2404,36 @@ gen_method:
                                if (IS_INT_LNG_TYPE(var->type)) {
                                        if (!md->params[s3].inmemory) {
                                                if (IS_2_WORD_TYPE(var->type)) {
-                                                       s1 = PACK_REGS(
-                                                  rd->argintregs[GET_LOW_REG(md->params[s3].regoff)],
-                                                  rd->argintregs[GET_HIGH_REG(md->params[s3].regoff)]);
-                                                       d = emit_load(jd, iptr, var, s1);
-                                                       M_LNGMOVE(d, s1);
+                                                       s1 = emit_load(jd, iptr, var, d);
+                                                       M_LNGMOVE(s1, d);
                                                }
                                                else {
-                                                       s1 = rd->argintregs[md->params[s3].regoff];
-                                                       d = emit_load(jd, iptr, var, s1);
-                                                       M_INTMOVE(d, s1);
+                                                       s1 = emit_load(jd, iptr, var, d);
+                                                       M_INTMOVE(s1, d);
                                                }
                                        }
                                        else {
                                                if (IS_2_WORD_TYPE(var->type)) {
-                                                       d = emit_load(jd, iptr, var, REG_ITMP12_PACKED);
-                                                       M_LST(d, REG_SP, md->params[s3].regoff * 4);
+                                                       s1 = emit_load(jd, iptr, var, REG_ITMP12_PACKED);
+                                                       M_LST(s1, REG_SP, d * 4);
                                                }
                                                else {
-                                                       d = emit_load(jd, iptr, var, REG_ITMP1);
-                                                       M_IST(d, REG_SP, md->params[s3].regoff * 4);
+                                                       s1 = emit_load(jd, iptr, var, REG_ITMP1);
+                                                       M_IST(s1, REG_SP, d * 4);
                                                }
                                        }
                                }
                                else {
                                        if (!md->params[s3].inmemory) {
-                                               s1 = rd->argfltregs[md->params[s3].regoff];
-                                               d = emit_load(jd, iptr, var, s1);
-                                               M_FLTMOVE(d, s1);
+                                               s1 = emit_load(jd, iptr, var, d);
+                                               M_FLTMOVE(s1, d);
                                        }
                                        else {
-                                               d = emit_load(jd, iptr, var, REG_FTMP1);
+                                               s1 = emit_load(jd, iptr, var, REG_FTMP1);
                                                if (IS_2_WORD_TYPE(var->type))
-                                                       M_DST(d, REG_SP, md->params[s3].regoff * 4);
+                                                       M_DST(s1, REG_SP, d * 4);
                                                else
-                                                       M_FST(d, REG_SP, md->params[s3].regoff * 4);
+                                                       M_FST(s1, REG_SP, d * 4);
                                        }
                                }
                        }
@@ -3008,23 +2991,21 @@ void codegen_emit_stub_compiler(jitdata *jd)
 
 void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 {
-       methodinfo   *m;
-       codeinfo     *code;
-       codegendata  *cd;
-       registerdata *rd;
-       methoddesc   *md;
-       s4            nativeparams;
-       s4            i, j;                 /* count variables                    */
-       s4            t;
-       s4            s1, s2, disp;
-       s4            funcdisp;
+       methodinfo  *m;
+       codeinfo    *code;
+       codegendata *cd;
+       methoddesc  *md;
+       s4           nativeparams;
+       s4           i, j;                 /* count variables                    */
+       s4           t;
+       s4           s1, s2, disp;
+       s4           funcdisp;
 
        /* get required compiler data */
 
        m    = jd->m;
        code = jd->code;
        cd   = jd->cd;
-       rd   = jd->rd;
 
        /* set some variables */
 
@@ -3095,13 +3076,15 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
                if (IS_INT_LNG_TYPE(t)) {
                        if (!md->params[i].inmemory) {
                                s1 = md->params[i].regoff;
+
                                if (IS_2_WORD_TYPE(t)) {
-                                       M_IST(rd->argintregs[GET_HIGH_REG(s1)], REG_SP, LA_SIZE + 4 * 4 + j * 4);
+                                       M_IST(GET_HIGH_REG(s1), REG_SP, LA_SIZE + 4 * 4 + j * 4);
                                        j++;
-                                       M_IST(rd->argintregs[GET_LOW_REG(s1)], REG_SP, LA_SIZE + 4 * 4 + j * 4);
-                               } else {
-                                       M_IST(rd->argintregs[s1], REG_SP, LA_SIZE + 4 * 4 + j * 4);
+                                       M_IST(GET_LOW_REG(s1), REG_SP, LA_SIZE + 4 * 4 + j * 4);
                                }
+                               else
+                                       M_IST(s1, REG_SP, LA_SIZE + 4 * 4 + j * 4);
+
                                j++;
                        }
                }
@@ -3111,7 +3094,7 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
                if (IS_FLT_DBL_TYPE(md->paramtypes[i].type)) {
                        if (!md->params[i].inmemory) {
                                s1 = md->params[i].regoff;
-                               M_DST(rd->argfltregs[s1], REG_SP, LA_SIZE + 4 * 4 + j * 8);
+                               M_DST(s1, REG_SP, LA_SIZE + 4 * 4 + j * 8);
                                j++;
                        }
                }
@@ -3140,12 +3123,13 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
                                s1 = md->params[i].regoff;
 
                                if (IS_2_WORD_TYPE(t)) {
-                                       M_ILD(rd->argintregs[GET_HIGH_REG(s1)], REG_SP, LA_SIZE + 4 * 4 + j * 4);
+                                       M_ILD(GET_HIGH_REG(s1), REG_SP, LA_SIZE + 4 * 4 + j * 4);
                                        j++;
-                                       M_ILD(rd->argintregs[GET_LOW_REG(s1)], REG_SP, LA_SIZE + 4 * 4 + j * 4);
-                               } else {
-                                       M_ILD(rd->argintregs[s1], REG_SP, LA_SIZE + 4 * 4 + j * 4);
+                                       M_ILD(GET_LOW_REG(s1), REG_SP, LA_SIZE + 4 * 4 + j * 4);
                                }
+                               else
+                                       M_ILD(s1, REG_SP, LA_SIZE + 4 * 4 + j * 4);
+
                                j++;
                        }
                }
@@ -3155,7 +3139,7 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
                if (IS_FLT_DBL_TYPE(md->paramtypes[i].type)) {
                        if (!md->params[i].inmemory) {
                                s1 = md->params[i].regoff;
-                               M_DLD(rd->argfltregs[s1], REG_SP, LA_SIZE + 4 * 4 + j * 8);
+                               M_DLD(s1, REG_SP, LA_SIZE + 4 * 4 + j * 8);
                                j++;
                        }
                }
@@ -3168,33 +3152,23 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
                if (IS_INT_LNG_TYPE(t)) {
                        if (!md->params[i].inmemory) {
-                               if (IS_2_WORD_TYPE(t))
-                                       s1 = PACK_REGS(
-                                               rd->argintregs[GET_LOW_REG(md->params[i].regoff)],
-                                           rd->argintregs[GET_HIGH_REG(md->params[i].regoff)]);
-                               else
-                                       s1 = rd->argintregs[md->params[i].regoff];
+                               s1 = md->params[i].regoff;
+                               s2 = nmd->params[j].regoff;
 
                                if (!nmd->params[j].inmemory) {
-                                       if (IS_2_WORD_TYPE(t)) {
-                                               s2 = PACK_REGS(
-                                                  rd->argintregs[GET_LOW_REG(nmd->params[j].regoff)],
-                                                  rd->argintregs[GET_HIGH_REG(nmd->params[j].regoff)]);
+                                       if (IS_2_WORD_TYPE(t))
                                                M_LNGMOVE(s1, s2);
-                                       } else {
-                                               s2 = rd->argintregs[nmd->params[j].regoff];
+                                       else
                                                M_INTMOVE(s1, s2);
-                                       }
-
-                               } else {
-                                       s2 = nmd->params[j].regoff;
+                               }
+                               else {
                                        if (IS_2_WORD_TYPE(t))
                                                M_LST(s1, REG_SP, s2 * 4);
                                        else
                                                M_IST(s1, REG_SP, s2 * 4);
                                }
-
-                       else {
+                       }
+                       else {
                                s1 = md->params[i].regoff + cd->stackframesize;
                                s2 = nmd->params[j].regoff;
 
@@ -3206,8 +3180,8 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
                                if (IS_2_WORD_TYPE(t))
                                        M_IST(REG_ITMP2, REG_SP, s2 * 4 + 4);
                        }
-
-               else {
+               }
+               else {
                        /* We only copy spilled float arguments, as the float
                           argument registers keep unchanged. */
 
@@ -3218,8 +3192,8 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
                                if (IS_2_WORD_TYPE(t)) {
                                        M_DLD(REG_FTMP1, REG_SP, s1 * 4);
                                        M_DST(REG_FTMP1, REG_SP, s2 * 4);
-
-                               else {
+                               }
+                               else {
                                        M_FLD(REG_FTMP1, REG_SP, s1 * 4);
                                        M_FST(REG_FTMP1, REG_SP, s2 * 4);
                                }
@@ -3251,18 +3225,22 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        /* save return value */
 
-       if (md->returntype.type != TYPE_VOID) {
-               if (IS_INT_LNG_TYPE(md->returntype.type)) {
-                       if (IS_2_WORD_TYPE(md->returntype.type))
-                               M_IST(REG_RESULT2, REG_SP, LA_SIZE + 2 * 4);
-                       M_IST(REG_RESULT, REG_SP, LA_SIZE + 1 * 4);
-               }
-               else {
-                       if (IS_2_WORD_TYPE(md->returntype.type))
-                               M_DST(REG_FRESULT, REG_SP, LA_SIZE + 1 * 4);
-                       else
-                               M_FST(REG_FRESULT, REG_SP, LA_SIZE + 1 * 4);
-               }
+       switch (md->returntype.type) {
+       case TYPE_INT:
+       case TYPE_ADR:
+               M_IST(REG_RESULT, REG_SP, LA_SIZE + 1 * 4);
+               break;
+       case TYPE_LNG:
+               M_LST(REG_RESULT_PACKED, REG_SP, LA_SIZE + 1 * 4);
+               break;
+       case TYPE_FLT:
+               M_FST(REG_FRESULT, REG_SP, LA_SIZE + 1 * 4);
+               break;
+       case TYPE_DBL:
+               M_DST(REG_FRESULT, REG_SP, LA_SIZE + 1 * 4);
+               break;
+       case TYPE_VOID:
+               break;
        }
 
        /* remove native stackframe info */
@@ -3276,18 +3254,22 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        /* restore return value */
 
-       if (md->returntype.type != TYPE_VOID) {
-               if (IS_INT_LNG_TYPE(md->returntype.type)) {
-                       if (IS_2_WORD_TYPE(md->returntype.type))
-                               M_ILD(REG_RESULT2, REG_SP, LA_SIZE + 2 * 4);
-                       M_ILD(REG_RESULT, REG_SP, LA_SIZE + 1 * 4);
-               }
-               else {
-                       if (IS_2_WORD_TYPE(md->returntype.type))
-                               M_DLD(REG_FRESULT, REG_SP, LA_SIZE + 1 * 4);
-                       else
-                               M_FLD(REG_FRESULT, REG_SP, LA_SIZE + 1 * 4);
-               }
+       switch (md->returntype.type) {
+       case TYPE_INT:
+       case TYPE_ADR:
+               M_ILD(REG_RESULT, REG_SP, LA_SIZE + 1 * 4);
+               break;
+       case TYPE_LNG:
+               M_LLD(REG_RESULT_PACKED, REG_SP, LA_SIZE + 1 * 4);
+               break;
+       case TYPE_FLT:
+               M_FLD(REG_FRESULT, REG_SP, LA_SIZE + 1 * 4);
+               break;
+       case TYPE_DBL:
+               M_DLD(REG_FRESULT, REG_SP, LA_SIZE + 1 * 4);
+               break;
+       case TYPE_VOID:
+               break;
        }
 
 #if defined(ENABLE_GC_CACAO)
index 1b77a9f0c67591444869a5e9546ba3529b8e3652..17215a2861a6e6352661a383ab80ebf606545cb4 100644 (file)
@@ -46,6 +46,7 @@
 #include "vm/builtin.h"
 #include "vm/exceptions.h"
 
+#include "vm/jit/abi.h"
 #include "vm/jit/asmpart.h"
 #include "vm/jit/codegen-common.h"
 #include "vm/jit/dseg.h"
@@ -742,28 +743,31 @@ void emit_verbosecall_enter(jitdata *jd)
        /* integer argument regs                                             */
        /* all integer argument registers have to be saved                   */
        for (p = 0; p < 8; p++) {
-               d = rd->argintregs[p];
+               d = abi_registers_integer_argument[p];
                /* save integer argument registers */
                M_IST(d, REG_SP, LA_SIZE + 4 * 8 + 4 + p * 4);
        }
        p = 4;
 #endif
        stack_off = LA_SIZE;
+
        for (; p < md->paramcount && p < TRACE_ARGS_NUM; p++, stack_off += 8) {
                t = md->paramtypes[p].type;
+
                if (IS_INT_LNG_TYPE(t)) {
-                       if (!md->params[p].inmemory) { /* Param in Arg Reg */
+                       if (!md->params[p].inmemory) {
+                               s1 = md->params[p].regoff;
+
                                if (IS_2_WORD_TYPE(t)) {
-                                       M_IST(rd->argintregs[GET_HIGH_REG(md->params[p].regoff)]
-                                                 , REG_SP, stack_off);
-                                       M_IST(rd->argintregs[GET_LOW_REG(md->params[p].regoff)]
-                                                 , REG_SP, stack_off + 4);
-                               } else {
+                                       M_IST(GET_HIGH_REG(s1), REG_SP, stack_off);
+                                       M_IST(GET_LOW_REG(s1), REG_SP, stack_off + 4);
+                               }
+                               else {
                                        M_IST(REG_ITMP1, REG_SP, stack_off);
-                                       M_IST(rd->argintregs[md->params[p].regoff]
-                                                 , REG_SP, stack_off + 4);
+                                       M_IST(s1, REG_SP, stack_off + 4);
                                }
-                       } else { /* Param on Stack */
+                       }
+                       else {
                                s1 = (md->params[p].regoff + cd->stackframesize) * 4 
                                        + stack_size;
                                if (IS_2_WORD_TYPE(t)) {
@@ -771,22 +775,26 @@ void emit_verbosecall_enter(jitdata *jd)
                                        M_IST(REG_ITMP2, REG_SP, stack_off);
                                        M_ILD(REG_ITMP2, REG_SP, s1 + 4);
                                        M_IST(REG_ITMP2, REG_SP, stack_off + 4);
-                               } else {
+                               }
+                               else {
                                        M_IST(REG_ITMP1, REG_SP, stack_off);
                                        M_ILD(REG_ITMP2, REG_SP, s1);
                                        M_IST(REG_ITMP2, REG_SP, stack_off + 4);
                                }
                        }
-               } else { /* IS_FLT_DBL_TYPE(t) */
-                       if (!md->params[p].inmemory) { /* in Arg Reg */
-                               s1 = rd->argfltregs[md->params[p].regoff];
+               }
+               else {
+                       if (!md->params[p].inmemory) {
+                               s1 = md->params[p].regoff;
+
                                if (!IS_2_WORD_TYPE(t)) {
                                        M_IST(REG_ITMP1, REG_SP, stack_off);
                                        M_FST(s1, REG_SP, stack_off + 4);
-                               } else {
-                                       M_DST(s1, REG_SP, stack_off);
                                }
-                       } else { /* on Stack */
+                               else
+                                       M_DST(s1, REG_SP, stack_off);
+                       }
+                       else {
                                /* this should not happen */
                        }
                }
@@ -795,40 +803,48 @@ void emit_verbosecall_enter(jitdata *jd)
        /* load first 4 (==INT_ARG_CNT/2) arguments into integer registers */
 #if defined(__DARWIN__)
        for (p = 0; p < 8; p++) {
-               d = rd->argintregs[p];
+               d = abi_registers_integer_argument[p];
                M_ILD(d, REG_SP, LA_SIZE + p * 4);
        }
 #else
        /* LINUX */
        /* Set integer and float argument registers vor trace_args call */
        /* offset to saved integer argument registers                   */
+
        stack_off = LA_SIZE + 4 * 8 + 4;
+
        for (p = 0; (p < 4) && (p < md->paramcount); p++) {
                t = md->paramtypes[p].type;
+
                if (IS_INT_LNG_TYPE(t)) {
                        /* "stretch" int types */
                        if (!IS_2_WORD_TYPE(t)) {
-                               M_CLR(rd->argintregs[2 * p]);
-                               M_ILD(rd->argintregs[2 * p + 1], REG_SP,stack_off);
+                               M_CLR(abi_registers_integer_argument[2 * p]);
+                               M_ILD(abi_registers_integer_argument[2 * p + 1], REG_SP,stack_off);
                                stack_off += 4;
-                       } else {
-                               M_ILD(rd->argintregs[2 * p + 1], REG_SP,stack_off + 4);
-                               M_ILD(rd->argintregs[2 * p], REG_SP,stack_off);
+                       }
+                       else {
+                               M_ILD(abi_registers_integer_argument[2 * p + 1], REG_SP,stack_off + 4);
+                               M_ILD(abi_registers_integer_argument[2 * p], REG_SP,stack_off);
                                stack_off += 8;
                        }
-               } else { /* Float/Dbl */
-                       if (!md->params[p].inmemory) { /* Param in Arg Reg */
+               }
+               else {
+                       if (!md->params[p].inmemory) {
                                /* use reserved Place on Stack (sp + 5 * 16) to copy  */
                                /* float/double arg reg to int reg                    */
-                               s1 = rd->argfltregs[md->params[p].regoff];
+
+                               s1 = md->params[p].regoff;
+
                                if (!IS_2_WORD_TYPE(t)) {
                                        M_FST(s1, REG_SP, 5 * 16);
-                                       M_ILD(rd->argintregs[2 * p + 1], REG_SP, 5 * 16);
-                                       M_CLR(rd->argintregs[2 * p]);
-                               } else {
+                                       M_ILD(abi_registers_integer_argument[2 * p + 1], REG_SP, 5 * 16);
+                                       M_CLR(abi_registers_integer_argument[2 * p]);
+                               }
+                               else {
                                        M_DST(s1, REG_SP, 5 * 16);
-                                       M_ILD(rd->argintregs[2 * p + 1], REG_SP,  5 * 16 + 4);
-                                       M_ILD(rd->argintregs[2 * p], REG_SP, 5 * 16);
+                                       M_ILD(abi_registers_integer_argument[2 * p + 1], REG_SP,  5 * 16 + 4);
+                                       M_ILD(abi_registers_integer_argument[2 * p], REG_SP, 5 * 16);
                                }
                        }
                }
@@ -852,28 +868,27 @@ void emit_verbosecall_enter(jitdata *jd)
        /* restore integer argument registers from the reserved stack space */
 
        stack_off = LA_SIZE;
-       for (p = 0; p < md->paramcount && p < TRACE_ARGS_NUM; 
-                p++, stack_off += 8) {
+
+       for (p = 0; p < md->paramcount && p < TRACE_ARGS_NUM; p++, stack_off += 8) {
                t = md->paramtypes[p].type;
 
                if (IS_INT_LNG_TYPE(t)) {
                        if (!md->params[p].inmemory) {
+                               s1 = md->params[p].regoff;
+
                                if (IS_2_WORD_TYPE(t)) {
-                                       M_ILD(rd->argintregs[GET_HIGH_REG(md->params[p].regoff)]
-                                                 , REG_SP, stack_off);
-                                       M_ILD(rd->argintregs[GET_LOW_REG(md->params[p].regoff)]
-                                                 , REG_SP, stack_off + 4);
-                               } else {
-                                       M_ILD(rd->argintregs[md->params[p].regoff]
-                                                 , REG_SP, stack_off + 4);
+                                       M_ILD(GET_HIGH_REG(s1), REG_SP, stack_off);
+                                       M_ILD(GET_LOW_REG(s1), REG_SP, stack_off + 4);
                                }
+                               else
+                                       M_ILD(s1, REG_SP, stack_off + 4);
                        }
                }
        }
 #else
        /* LINUX */
        for (p = 0; p < 8; p++) {
-               d = rd->argintregs[p];
+               d = abi_registers_integer_argument[p];
                /* save integer argument registers */
                M_ILD(d, REG_SP, LA_SIZE + 4 * 8 + 4 + p * 4);
        }
index 0949fd9e433bddf665baa4499ed3d263cbf303a9..3c33bb3e9ad7f477ed8ebaed59c4d89556cebf94 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: md-abi.c 7330 2007-02-11 21:39:54Z twisti $
+   $Id: md-abi.c 7713 2007-04-15 21:49:48Z twisti $
 
 */
 
@@ -203,8 +203,7 @@ void md_param_alloc(methoddesc *md)
                case TYPE_ADR:
                        if (iarg < INT_ARG_CNT) {
                                pd->inmemory  = false;
-/*                             pd->regoff    = abi_registers_integer_argument[iarg]; */
-                               pd->regoff    = iarg;
+                               pd->regoff    = abi_registers_integer_argument[iarg];
                                iarg++;
                        }
                        else {
@@ -218,10 +217,9 @@ void md_param_alloc(methoddesc *md)
                        if (iarg < INT_ARG_CNT - 1) {
                                _ALIGN(iarg);
                                pd->inmemory  = false;
-/*                             pd->regoff    = */
-/*                                     PACK_REGS(abi_registers_integer_argument[iarg + 1], */
-/*                                                       abi_registers_integer_argument[iarg]); */
-                               pd->regoff    = PACK_REGS(iarg + 1, iarg);
+                               pd->regoff    =
+                                       PACK_REGS(abi_registers_integer_argument[iarg + 1],
+                                                         abi_registers_integer_argument[iarg]);
                                iarg += 2;
                        }
                        else {
@@ -236,8 +234,7 @@ void md_param_alloc(methoddesc *md)
                case TYPE_FLT:
                        if (farg < FLT_ARG_CNT) {
                                pd->inmemory  = false;
-/*                             pd->regoff    = abi_registers_float_argument[farg]; */
-                               pd->regoff    = farg;
+                               pd->regoff    = abi_registers_float_argument[farg];
                                farg++;
                        }
                        else {
@@ -250,8 +247,7 @@ void md_param_alloc(methoddesc *md)
                case TYPE_DBL:
                        if (farg < FLT_ARG_CNT) {
                                pd->inmemory  = false;
-/*                             pd->regoff    = abi_registers_integer_argument[farg]; */
-                               pd->regoff    = farg;
+                               pd->regoff    = abi_registers_float_argument[farg];
                                farg++;
                        }
                        else {
@@ -285,7 +281,7 @@ void md_param_alloc(methoddesc *md)
 
        md->argintreguse = iarg;
        md->argfltreguse = farg;
-       md->memuse = stacksize;
+       md->memuse       = stacksize;
 }
 
 
index 2d6ade25d8184cd2773442a1577067e90d2912ba..0063dcd4141d0abe2577bdb086b5e6d6a634e184 100644 (file)
@@ -1,6 +1,6 @@
 /* src/vm/jit/powerpc/linux/md-abi.h - defines for PowerPC Linux ABI
 
-   Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
+   Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
    C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
    E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
    J. Wenninger, Institut f. Computersprachen - TU Wien
@@ -28,7 +28,7 @@
 
    Changes:
 
-   $Id: md-abi.h 7356 2007-02-14 11:00:28Z twisti $
+   $Id: md-abi.h 7713 2007-04-15 21:49:48Z twisti $
 
 */
 
@@ -94,6 +94,7 @@
 #define REG_RESULT_PACKED    PACK_REGS(REG_RESULT2, REG_RESULT)
 
 #define REG_A0_A1_PACKED     PACK_REGS(REG_A1, REG_A0)
+#define REG_A2_A3_PACKED     PACK_REGS(REG_A3, REG_A2)
 
 #define REG_ITMP12_PACKED    PACK_REGS(REG_ITMP2, REG_ITMP1)
 #define REG_ITMP23_PACKED    PACK_REGS(REG_ITMP3, REG_ITMP2)
index 9fcab0228e374957efa9ac34b7a47b610ab56fee..417f1429a933545dc70c7fd94a312ab669bc7d2d 100644 (file)
@@ -1,6 +1,6 @@
 /* src/vm/jit/reg.c - register allocator setup
 
-   Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
+   Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
    C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
    E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
    J. Wenninger, Institut f. Computersprachen - TU Wien
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   Contact: cacao@cacaojvm.org
-
-   Authors: Andreas Krall
-
-   Changes: Stefan Ring
-            Christian Thalinger
-            Christian Ullrich
-            Michael Starzinger
-            Edwin Steiner
-
-   $Id: reg.c 7596 2007-03-28 21:05:53Z twisti $
+   $Id: reg.c 7713 2007-04-15 21:49:48Z twisti $
 
 */
 
@@ -70,15 +60,6 @@ void reg_setup(jitdata *jd)
 
        /* setup the integer register table */
 
-#if defined(__ARM__)
-       /* On ARM longs can be split across argument regs and stack. This is
-        * signed by setting the HIGH_REG to INT_ARG_CNT in md_param_alloc().
-        * Here we make sure it resolves to a special dummy reg (REG_SPLIT). */
-       rd->argintregs = DMNEW(s4, INT_ARG_CNT + 1);
-       rd->argintregs[INT_ARG_CNT] = REG_SPLIT;
-#else
-       rd->argintregs = DMNEW(s4, INT_ARG_CNT);
-#endif
        rd->tmpintregs = DMNEW(s4, INT_TMP_CNT);
        rd->savintregs = DMNEW(s4, INT_SAV_CNT);
        rd->freeargintregs = DMNEW(s4, INT_ARG_CNT);
@@ -100,29 +81,11 @@ void reg_setup(jitdata *jd)
                case REG_TMP:
                        rd->tmpintregs[rd->tmpintreguse++] = i; 
                        break;
-               case REG_ARG:
-                       rd->argintregs[rd->argintreguse++] = i;
-                       break;
                }
        }
        assert(rd->savintreguse == INT_SAV_CNT);
        assert(rd->tmpintreguse == INT_TMP_CNT);
-       assert(rd->argintreguse == INT_ARG_CNT);
-
-#if defined(__X86_64__)
-       /* 
-        * on x86_64 the argument registers are not in ascending order 
-        * a00 (%rdi) <-> a03 (%rcx) and a01 (%rsi) <-> a02 (%rdx)
-        */
-       i = rd->argintregs[3];
-       rd->argintregs[3] = rd->argintregs[0];
-       rd->argintregs[0] = i;
-
-       i = rd->argintregs[2];
-       rd->argintregs[2] = rd->argintregs[1];
-       rd->argintregs[1] = i;
-#endif
-               
+
 #ifdef HAS_ADDRESS_REGISTER_FILE
        /* setup the address register table */
 
@@ -161,7 +124,6 @@ void reg_setup(jitdata *jd)
                
        /* setup the float register table */
 
-       rd->argfltregs = DMNEW(s4, FLT_ARG_CNT);
        rd->tmpfltregs = DMNEW(s4, FLT_TMP_CNT);
        rd->savfltregs = DMNEW(s4, FLT_SAV_CNT);
        rd->freeargfltregs = DMNEW(s4, FLT_ARG_CNT);
@@ -183,14 +145,10 @@ void reg_setup(jitdata *jd)
                case REG_TMP:
                        rd->tmpfltregs[rd->tmpfltreguse++] = i;
                        break;
-               case REG_ARG:
-                       rd->argfltregs[rd->argfltreguse++] = i;
-                       break;
                }
        }
        assert(rd->savfltreguse == FLT_SAV_CNT);
        assert(rd->tmpfltreguse == FLT_TMP_CNT);
-       assert(rd->argfltreguse == FLT_ARG_CNT);
 
 
        rd->freemem    = DMNEW(s4, m->maxstack);
index 7c38f89d3c09bd30f9582ec637afe83b1d00fac7..3c5d51976525c6be2bb7e61a00bcdc4e6beaa290 100644 (file)
@@ -1,6 +1,6 @@
 /* src/vm/jit/reg.h - register allocator header
 
-   Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
+   Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
    C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
    E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
    J. Wenninger, Institut f. Computersprachen - TU Wien
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   Contact: cacao@cacaojvm.org
-
-   Authors: Christian Thalinger
-
-   Changes: Christian Ullrich
-            Edwin Steiner
-
-   $Id: reg.h 5708 2006-10-06 22:37:13Z edwin $
+   $Id: reg.h 7713 2007-04-15 21:49:48Z twisti $
 
 */
 
@@ -77,10 +70,8 @@ struct registerdata {
        int intreg_ret;                 /* register to return integer values      */
        int fltreg_ret;                 /* register for return float values       */
 
-       int *argintregs;                /* argument integer registers             */
        int *tmpintregs;                /* scratch integer registers              */
        int *savintregs;                /* saved integer registers                */
-       int *argfltregs;                /* argument float registers               */
        int *tmpfltregs;                /* scratch float registers                */
        int *savfltregs;                /* saved float registers                  */
        int *freeargintregs;            /* free argument integer registers        */
index 974c91630e4e9e8ddba388f8be1b0016988467ef..6fb32e58b97332d84a12c41af2ddfa9154dcb7ce 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: stack.c 7695 2007-04-12 19:49:34Z twisti $
+   $Id: stack.c 7713 2007-04-15 21:49:48Z twisti $
 
 */
 
@@ -4478,20 +4478,20 @@ icmd_BUILTIN:
                                                                                assert(0); /* XXX is this assert ok? */
 #else
                                                                                sd.var[copy->varnum].vv.regoff = 
-                                                                       rd->argfltregs[md->params[i].regoff];
+                                                                                       md->params[i].regoff;
 #endif /* SUPPORT_PASS_FLOATARGS_IN_INTREGS */
                                                                        }
                                                                        else {
 #if defined(SUPPORT_COMBINE_INTEGER_REGISTERS)
                                                                                if (IS_2_WORD_TYPE(copy->type))
                                                                                        sd.var[copy->varnum].vv.regoff = 
-                       PACK_REGS( rd->argintregs[GET_LOW_REG(md->params[i].regoff)],
-                                          rd->argintregs[GET_HIGH_REG(md->params[i].regoff)]);
+                       PACK_REGS(GET_LOW_REG(md->params[i].regoff),
+                                         GET_HIGH_REG(md->params[i].regoff));
 
                                                                                else
 #endif /* SUPPORT_COMBINE_INTEGER_REGISTERS */
                                                                                        sd.var[copy->varnum].vv.regoff = 
-                                                                       rd->argintregs[md->params[i].regoff];
+                                                                                               md->params[i].regoff;
                                                                        }
                                                                }
                                                        }
index a87afba8cceea7b8508bfc036363864d69a11445..0d007164b2f85a07cf09212e6b0ece5fab53a9c3 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: codegen.c 7709 2007-04-15 15:28:13Z michi $
+   $Id: codegen.c 7723 2007-04-16 18:03:08Z michi $
 
 */
 
@@ -231,45 +231,35 @@ bool codegen_emit(jitdata *jd)
                s1 = md->params[p].regoff;
 
                if (IS_INT_LNG_TYPE(t)) {                    /* integer args          */
-                       s2 = rd->argintregs[s1];
                        if (!md->params[p].inmemory) {           /* register arguments    */
-                               if (!IS_INMEMORY(var->flags)) {      /* reg arg -> register   */
-                                       M_INTMOVE(s2, var->vv.regoff);
-
-                               } else {                             /* reg arg -> spilled    */
-                                   M_LST(s2, REG_SP, var->vv.regoff * 8);
-                               }
-
-                       } else {                                 /* stack arguments       */
-                               if (!IS_INMEMORY(var->flags)) {      /* stack arg -> register */
+                               if (!IS_INMEMORY(var->flags))
+                                       M_INTMOVE(s1, var->vv.regoff);
+                               else
+                                   M_LST(s1, REG_SP, var->vv.regoff * 8);
+                       }
+                       else {                                 /* stack arguments       */
+                               if (!IS_INMEMORY(var->flags))
                                        /* + 8 for return address */
                                        M_LLD(var->vv.regoff, REG_SP, (cd->stackframesize + s1) * 8 + 8);
-
-                               } else {                             /* stack arg -> spilled  */
+                               else
                                        var->vv.regoff = cd->stackframesize + s1 + 1;
-                               }
                        }
-
-               else {                                     /* floating args         */
+               }
+               else {                                     /* floating args         */
                        if (!md->params[p].inmemory) {           /* register arguments    */
-                               s2 = rd->argfltregs[s1];
-                               if (!IS_INMEMORY(var->flags)) {      /* reg arg -> register   */
-                                       M_FLTMOVE(s2, var->vv.regoff);
-
-                               } else {                                         /* reg arg -> spilled    */
-                                       M_DST(s2, REG_SP, var->vv.regoff * 8);
-                               }
-
-                       } else {                                 /* stack arguments       */
-                               if (!IS_INMEMORY(var->flags)) {      /* stack-arg -> register */
+                               if (!IS_INMEMORY(var->flags))
+                                       M_FLTMOVE(s1, var->vv.regoff);
+                               else
+                                       M_DST(s1, REG_SP, var->vv.regoff * 8);
+                       }
+                       else {                                 /* stack arguments       */
+                               if (!IS_INMEMORY(var->flags))
                                        M_DLD(var->vv.regoff, REG_SP, (cd->stackframesize + s1) * 8 + 8);
-
-                               } else {
+                               else
                                        var->vv.regoff = cd->stackframesize + s1 + 1;
-                               }
                        }
                }
-       }  /* end for */
+       }
 
        /* save monitorenter argument */
 
@@ -283,10 +273,10 @@ bool codegen_emit(jitdata *jd)
                        M_LSUB_IMM((INT_ARG_CNT + FLT_ARG_CNT) * 8, REG_SP);
 
                        for (p = 0; p < INT_ARG_CNT; p++)
-                               M_LST(rd->argintregs[p], REG_SP, p * 8);
+                               M_LST(abi_registers_integer_argument[p], REG_SP, p * 8);
 
                        for (p = 0; p < FLT_ARG_CNT; p++)
-                               M_DST(rd->argfltregs[p], REG_SP, (INT_ARG_CNT + p) * 8);
+                               M_DST(abi_registers_float_argument[p], REG_SP, (INT_ARG_CNT + p) * 8);
 
                        s1 += INT_ARG_CNT + FLT_ARG_CNT;
                }
@@ -308,10 +298,10 @@ bool codegen_emit(jitdata *jd)
 
                if (opt_verbosecall) {
                        for (p = 0; p < INT_ARG_CNT; p++)
-                               M_LLD(rd->argintregs[p], REG_SP, p * 8);
+                               M_LLD(abi_registers_integer_argument[p], REG_SP, p * 8);
 
                        for (p = 0; p < FLT_ARG_CNT; p++)
-                               M_DLD(rd->argfltregs[p], REG_SP, (INT_ARG_CNT + p) * 8);
+                               M_DLD(abi_registers_float_argument[p], REG_SP, (INT_ARG_CNT + p) * 8);
 
                        M_LADD_IMM((INT_ARG_CNT + FLT_ARG_CNT) * 8, REG_SP);
                }
@@ -2396,7 +2386,7 @@ gen_method:
 
                                if (IS_INT_LNG_TYPE(var->type)) {
                                        if (!md->params[s3].inmemory) {
-                                               s1 = rd->argintregs[md->params[s3].regoff];
+                                               s1 = md->params[s3].regoff;
                                                d = emit_load(jd, iptr, var, s1);
                                                M_INTMOVE(d, s1);
                                        }
@@ -2407,7 +2397,7 @@ gen_method:
                                }
                                else {
                                        if (!md->params[s3].inmemory) {
-                                               s1 = rd->argfltregs[md->params[s3].regoff];
+                                               s1 = md->params[s3].regoff;
                                                d = emit_load(jd, iptr, var, s1);
                                                M_FLTMOVE(d, s1);
                                        }
@@ -3111,22 +3101,20 @@ void codegen_emit_stub_builtin(jitdata *jd, methoddesc *md, functionptr f)
 
 void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 {
-       methodinfo   *m;
-       codeinfo     *code;
-       codegendata  *cd;
-       registerdata *rd;
-       methoddesc   *md;
-       s4            nativeparams;
-       s4            i, j;                 /* count variables                    */
-       s4            t;
-       s4            s1, s2, disp;
+       methodinfo  *m;
+       codeinfo    *code;
+       codegendata *cd;
+       methoddesc  *md;
+       s4           nativeparams;
+       s4           i, j;
+       s4           t;
+       s4           s1, s2, disp;
 
        /* get required compiler data */
 
        m    = jd->m;
        code = jd->code;
        cd   = jd->cd;
-       rd   = jd->rd;
 
        /* initialize variables */
 
@@ -3201,10 +3189,17 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
                if (!md->params[i].inmemory) {
                        s1 = md->params[i].regoff;
 
-                       if (IS_INT_LNG_TYPE(md->paramtypes[i].type))
-                               M_LST(rd->argintregs[s1], REG_SP, j * 8);
-                       else
-                               M_DST(rd->argfltregs[s1], REG_SP, j * 8);
+                       switch (md->paramtypes[i].type) {
+                       case TYPE_INT:
+                       case TYPE_LNG:
+                       case TYPE_ADR:
+                               M_LST(s1, REG_SP, j * 8);
+                               break;
+                       case TYPE_FLT:
+                       case TYPE_DBL:
+                               M_DST(s1, REG_SP, j * 8);
+                               break;
+                       }
 
                        j++;
                }
@@ -3227,10 +3222,17 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
                if (!md->params[i].inmemory) {
                        s1 = md->params[i].regoff;
 
-                       if (IS_INT_LNG_TYPE(md->paramtypes[i].type))
-                               M_LLD(rd->argintregs[s1], REG_SP, j * 8);
-                       else
-                               M_DLD(rd->argfltregs[s1], REG_SP, j * 8);
+                       switch (md->paramtypes[i].type) {
+                       case TYPE_INT:
+                       case TYPE_LNG:
+                       case TYPE_ADR:
+                               M_LLD(s1, REG_SP, j * 8);
+                               break;
+                       case TYPE_FLT:
+                       case TYPE_DBL:
+                               M_DLD(s1, REG_SP, j * 8);
+                               break;
+                       }
 
                        j++;
                }
@@ -3242,40 +3244,36 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
        /* copy or spill arguments to new locations */
 
        for (i = md->paramcount - 1, j = i + nativeparams; i >= 0; i--, j--) {
-               t = md->paramtypes[i].type;
+               t  = md->paramtypes[i].type;
+               s2 = nmd->params[j].regoff;
 
                if (IS_INT_LNG_TYPE(t)) {
                        if (!md->params[i].inmemory) {
-                               s1 = rd->argintregs[md->params[i].regoff];
+                               s1 = md->params[i].regoff;
 
-                               if (!nmd->params[j].inmemory) {
-                                       s2 = rd->argintregs[nmd->params[j].regoff];
+                               if (!nmd->params[j].inmemory)
                                        M_INTMOVE(s1, s2);
-
-                               } else {
-                                       s2 = nmd->params[j].regoff;
+                               else
                                        M_LST(s1, REG_SP, s2 * 8);
-                               }
-
-                       } else {
+                       }
+                       else {
                                s1 = md->params[i].regoff + cd->stackframesize + 1;   /* + 1 (RA) */
-                               s2 = nmd->params[j].regoff;
                                M_LLD(REG_ITMP1, REG_SP, s1 * 8);
                                M_LST(REG_ITMP1, REG_SP, s2 * 8);
                        }
-
-               else {
-                       /* We only copy spilled float arguments, as the float argument    */
-                       /* registers keep unchanged.                                      */
+               }
+               else {
+                       /* We only copy spilled float arguments, as the float
+                          argument registers keep unchanged. */
 
                        if (md->params[i].inmemory) {
                                s1 = md->params[i].regoff + cd->stackframesize + 1;   /* + 1 (RA) */
-                               s2 = nmd->params[j].regoff;
 
                                if (IS_2_WORD_TYPE(t)) {
                                        M_DLD(REG_FTMP1, REG_SP, s1 * 8);
                                        M_DST(REG_FTMP1, REG_SP, s2 * 8);
-                               } else {
+                               }
+                               else {
                                        M_FLD(REG_FTMP1, REG_SP, s1 * 8);
                                        M_FST(REG_FTMP1, REG_SP, s2 * 8);
                                }
@@ -3298,11 +3296,18 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        /* save return value */
 
-       if (md->returntype.type != TYPE_VOID) {
-               if (IS_INT_LNG_TYPE(md->returntype.type))
-                       M_LST(REG_RESULT, REG_SP, 0 * 8);
-               else
-                       M_DST(REG_FRESULT, REG_SP, 0 * 8);
+       switch (md->returntype.type) {
+       case TYPE_INT:
+       case TYPE_LNG:
+       case TYPE_ADR:
+               M_LST(REG_RESULT, REG_SP, 0 * 8);
+               break;
+       case TYPE_FLT:
+       case TYPE_DBL:
+               M_DST(REG_FRESULT, REG_SP, 0 * 8);
+               break;
+       case TYPE_VOID:
+               break;
        }
 
 #if !defined(NDEBUG)
@@ -3319,11 +3324,18 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        /* restore return value */
 
-       if (md->returntype.type != TYPE_VOID) {
-               if (IS_INT_LNG_TYPE(md->returntype.type))
-                       M_LLD(REG_RESULT, REG_SP, 0 * 8);
-               else
-                       M_DLD(REG_FRESULT, REG_SP, 0 * 8);
+       switch (md->returntype.type) {
+       case TYPE_INT:
+       case TYPE_LNG:
+       case TYPE_ADR:
+               M_LLD(REG_RESULT, REG_SP, 0 * 8);
+               break;
+       case TYPE_FLT:
+       case TYPE_DBL:
+               M_DLD(REG_FRESULT, REG_SP, 0 * 8);
+               break;
+       case TYPE_VOID:
+               break;
        }
 
 #if defined(ENABLE_GC_CACAO)
index 1cfebca4e3b382fa16c83b14e32d717718974280..7e818eaed51f6d9fedcd4e278e37c4a16ebf52c1 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: emit.c 7644 2007-04-03 11:37:30Z twisti $
+   $Id: emit.c 7713 2007-04-15 21:49:48Z twisti $
 
 */
 
@@ -46,6 +46,7 @@
 #include "vm/builtin.h"
 #include "vm/exceptions.h"
 
+#include "vm/jit/abi.h"
 #include "vm/jit/abi-asm.h"
 #include "vm/jit/asmpart.h"
 #include "vm/jit/codegen-common.h"
@@ -591,10 +592,10 @@ void emit_verbosecall_enter(jitdata *jd)
        /* save argument registers */
 
        for (i = 0; i < INT_ARG_CNT; i++)
-               M_LST(rd->argintregs[i], REG_SP, (1 + i) * 8);
+               M_LST(abi_registers_integer_argument[i], REG_SP, (1 + i) * 8);
 
        for (i = 0; i < FLT_ARG_CNT; i++)
-               M_DST(rd->argfltregs[i], REG_SP, (1 + INT_ARG_CNT + i) * 8);
+               M_DST(abi_registers_float_argument[i], REG_SP, (1 + INT_ARG_CNT + i) * 8);
 
        /* save temporary registers for leaf methods */
 
@@ -614,9 +615,11 @@ void emit_verbosecall_enter(jitdata *jd)
        
                if (IS_FLT_DBL_TYPE(md->paramtypes[i].type)) {
                        for (k = INT_ARG_CNT - 2; k >= i; k--)
-                               M_MOV(rd->argintregs[k], rd->argintregs[k + 1]);
+                               M_MOV(abi_registers_integer_argument[k],
+                                         abi_registers_integer_argument[k + 1]);
 
-                       emit_movd_freg_reg(cd, rd->argfltregs[j], rd->argintregs[i]);
+                       emit_movd_freg_reg(cd, abi_registers_float_argument[j],
+                                                          abi_registers_integer_argument[i]);
                        j++;
                }
        }
@@ -629,10 +632,10 @@ void emit_verbosecall_enter(jitdata *jd)
        /* restore argument registers */
 
        for (i = 0; i < INT_ARG_CNT; i++)
-               M_LLD(rd->argintregs[i], REG_SP, (1 + i) * 8);
+               M_LLD(abi_registers_integer_argument[i], REG_SP, (1 + i) * 8);
 
        for (i = 0; i < FLT_ARG_CNT; i++)
-               M_DLD(rd->argfltregs[i], REG_SP, (1 + INT_ARG_CNT + i) * 8);
+               M_DLD(abi_registers_float_argument[i], REG_SP, (1 + INT_ARG_CNT + i) * 8);
 
        /* restore temporary registers for leaf methods */
 
index 307cc26787024cf6288343f16cfe0898eef842a1..cc8237c629b55bbdf3ded35bdb0fb632e773b93f 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: md-abi.c 7630 2007-04-02 19:56:14Z twisti $
+   $Id: md-abi.c 7713 2007-04-15 21:49:48Z twisti $
 
 */
 
@@ -34,6 +34,7 @@
 
 #include "vm/global.h"
 
+#include "vm/jit/abi.h"
 #include "vm/jit/jit.h" /* for REG_* (maybe can be removed) */
 
 #include "vmcore/descriptor.h"
@@ -74,6 +75,16 @@ const s4 abi_registers_integer_temporary[] = {
 };
 
 
+/* float registers *************************************************************
+
+   xmm0,   xmm1,   xmm2,   xmm3,   xmm4,   xmm5,   xmm6,   xmm7,
+   (fa0)   (fa1)   (fa2)   (fa3)   (fa4)   (fa5)   (fa6)   (fa7)
+
+   xmm8,   xmm9,   xmm10,  xmm11,  xmm12,  xmm13,  xmm14,  xmm15
+   (ftmp1) (ftmp2) (ftmp3) (ft0)   (ft1)   (ft2)   (ft3)   (ft4)
+
+*******************************************************************************/
+
 s4 nregdescfloat[] = {
     REG_ARG, REG_ARG, REG_ARG, REG_ARG, REG_ARG, REG_ARG, REG_ARG, REG_ARG,
     REG_RES, REG_RES, REG_RES, REG_TMP, REG_TMP, REG_TMP, REG_TMP, REG_TMP,
@@ -81,6 +92,30 @@ s4 nregdescfloat[] = {
 };
 
 
+const s4 abi_registers_float_argument[] = {
+       0,  /* fa0 */
+       1,  /* fa1 */
+       2,  /* fa2 */
+       3,  /* fa3 */
+       4,  /* fa4 */
+       5,  /* fa5 */
+       6,  /* fa6 */
+       7,  /* fa7 */
+};
+
+const s4 abi_registers_float_saved[] = {
+       -1,
+};
+
+const s4 abi_registers_float_temporary[] = {
+       11, /* ft0 */
+       12, /* ft1 */
+       13, /* ft2 */
+       14, /* ft3 */
+       15, /* ft4 */
+};
+
+
 /* md_param_alloc **************************************************************
 
    XXX
@@ -97,8 +132,8 @@ void md_param_alloc(methoddesc *md)
 
        /* set default values */
 
-       iarg = 0;
-       farg = 0;
+       iarg      = 0;
+       farg      = 0;
        stacksize = 0;
 
        /* get params field of methoddesc */
@@ -112,7 +147,7 @@ void md_param_alloc(methoddesc *md)
                case TYPE_LNG:
                        if (iarg < INT_ARG_CNT) {
                                pd->inmemory = false;
-                               pd->regoff   = iarg;
+                               pd->regoff   = abi_registers_integer_argument[iarg];
                                iarg++;
                        }
                        else {
@@ -126,7 +161,7 @@ void md_param_alloc(methoddesc *md)
                case TYPE_DBL:
                        if (farg < FLT_ARG_CNT) {
                                pd->inmemory = false;
-                               pd->regoff   = farg;
+                               pd->regoff   = abi_registers_float_argument[farg];
                                farg++;
                        }
                        else {
index d64f4d126bfb48a4033e1d4888f10752aac7eaab..3251e5924cf80de20bb7acf014205ec124f1b3e3 100644 (file)
@@ -22,7 +22,7 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: utf8.c 7387 2007-02-21 23:26:24Z twisti $
+   $Id: utf8.c 7716 2007-04-16 14:29:53Z twisti $
 
 */
 
@@ -1022,7 +1022,7 @@ u4 utf_get_number_of_u2s(utf *u)
        if (utf_ptr != endpos) {
                /* string ended abruptly */
                exceptions_throw_internalerror("Illegal utf8 string");
-               return NULL;
+               return 0;
        }
 
        return len;