Reversed vftbl movement because of performance considerations
authorstefan <none@none>
Wed, 12 Feb 2003 16:24:36 +0000 (16:24 +0000)
committerstefan <none@none>
Wed, 12 Feb 2003 16:24:36 +0000 (16:24 +0000)
12 files changed:
alpha/asmpart.S
alpha/ngen.c
builtin.c
global.h
headers.c
jit/stack.c
loader.c
src/cacaoh/headers.c
src/vm/builtin.c
src/vm/global.h
src/vm/jit/stack.c
src/vm/loader.c

index 3f9a3d9217a8ab958728d45873dc46edebec23b7..1f294fe2801fcc33b099ae0c8f9d32afb3ddcc61 100644 (file)
@@ -608,7 +608,7 @@ ex_table_loop:
        beq     a1,ex_handle_it       /* NULL catches everything                  */
 
        ldq     a0,offobjvftbl(xptr)  /* a0 = vftblptr(xptr)                      */
-       ldq     a0,offclass(a0)
+       ldq     a1,offobjvftbl(a1)    /* a1 = vftblptr(catchtype) class (not obj) */
        ldl     a0,offbaseval(a0)     /* a0 = baseval(xptr)                       */
        ldl     v0,offbaseval(a1)     /* a2 = baseval(catchtype)                  */
        ldl     a1,offdiffval(a1)     /* a1 = diffval(catchtype)                  */
index 39d245119e5aefa20c6cdc1d3817bb6b971e73be..c87673802a32b2c06d4d373d3d94e047755a44a2 100644 (file)
@@ -11,7 +11,7 @@
        Authors: Andreas  Krall      EMAIL: cacao@complang.tuwien.ac.at
                 Reinhard Grafl      EMAIL: cacao@complang.tuwien.ac.at
 
-       Last Change: $Id: ngen.c 227 2003-02-12 13:23:24Z stefan $
+       Last Change: $Id: ngen.c 228 2003-02-12 16:24:36Z stefan $
 
 *******************************************************************************/
 
@@ -3323,14 +3323,13 @@ makeactualcall:
                                                M_CMPULE(REG_ITMP1, REG_ITMP2, d);
                                                }
 */
-                                       M_BEQZ(s1, 8);
+                                       M_BEQZ(s1, 7);
                                        M_ALD(REG_ITMP1, s1, OFFSET(java_objectheader, vftbl));
-                                       M_ALD(REG_ITMP1, REG_ITMP1, OFFSET(vftbl, class));
-                                       a = dseg_addaddress ((void*) super);
+                                       a = dseg_addaddress ((void*) super->vftbl);
                                        M_ALD(REG_ITMP2, REG_PV, a);
-                                       M_ILD(REG_ITMP1, REG_ITMP1, OFFSET(classinfo, baseval));
-                                       M_ILD(REG_ITMP3, REG_ITMP2, OFFSET(classinfo, baseval));
-                                       M_ILD(REG_ITMP2, REG_ITMP2, OFFSET(classinfo, diffval));
+                                       M_ILD(REG_ITMP1, REG_ITMP1, OFFSET(vftbl, baseval));
+                                       M_ILD(REG_ITMP3, REG_ITMP2, OFFSET(vftbl, baseval));
+                                       M_ILD(REG_ITMP2, REG_ITMP2, OFFSET(vftbl, diffval));
                                        M_ISUB(REG_ITMP1, REG_ITMP3, REG_ITMP1);
                                        M_CMPULE(REG_ITMP1, REG_ITMP2, d);
                                        }
@@ -3398,22 +3397,21 @@ makeactualcall:
                                                M_BEQZ(REG_ITMP2, 0);
                                                }
 */
-                                       M_BEQZ(s1, 9 + (d == REG_ITMP3));
+                                       M_BEQZ(s1, 8 + (d == REG_ITMP3));
                                        M_ALD(REG_ITMP1, s1, OFFSET(java_objectheader, vftbl));
-                                       M_ALD(REG_ITMP1, REG_ITMP1, OFFSET(vftbl, class));
-                                       a = dseg_addaddress ((void*) super);
+                                       a = dseg_addaddress ((void*) super->vftbl);
                                        M_ALD(REG_ITMP2, REG_PV, a);
-                                       M_ILD(REG_ITMP1, REG_ITMP1, OFFSET(classinfo, baseval));
+                                       M_ILD(REG_ITMP1, REG_ITMP1, OFFSET(vftbl, baseval));
                                        if (d != REG_ITMP3) {
-                                               M_ILD(REG_ITMP3, REG_ITMP2, OFFSET(classinfo, baseval));
-                                               M_ILD(REG_ITMP2, REG_ITMP2, OFFSET(classinfo, diffval));
+                                               M_ILD(REG_ITMP3, REG_ITMP2, OFFSET(vftbl, baseval));
+                                               M_ILD(REG_ITMP2, REG_ITMP2, OFFSET(vftbl, diffval));
                                                M_ISUB(REG_ITMP1, REG_ITMP3, REG_ITMP1);
                                                }
                                        else {
-                                               M_ILD(REG_ITMP2, REG_ITMP2, OFFSET(classinfo, baseval));
+                                               M_ILD(REG_ITMP2, REG_ITMP2, OFFSET(vftbl, baseval));
                                                M_ISUB(REG_ITMP1, REG_ITMP2, REG_ITMP1);
                                                M_ALD(REG_ITMP2, REG_PV, a);
-                                               M_ILD(REG_ITMP2, REG_ITMP2, OFFSET(classinfo, diffval));
+                                               M_ILD(REG_ITMP2, REG_ITMP2, OFFSET(vftbl, diffval));
                                                }
                                        M_CMPULE(REG_ITMP1, REG_ITMP2, REG_ITMP2);
                                        M_BEQZ(REG_ITMP2, 0);
index 7aea2d8eee2a4a97a444baed180b9e7972444731..4da71058cc973a3bd57842d39c7c04c51fcf3614 100644 (file)
--- a/builtin.c
+++ b/builtin.c
@@ -138,8 +138,8 @@ s4 builtin_isanysubclass (classinfo *sub, classinfo *super)
        return 0;
        */
 
-       return (unsigned) (sub->baseval - super->baseval) <=
-                  (unsigned) (super->diffval);
+       return (unsigned) (sub->vftbl->baseval - super->vftbl->baseval) <=
+                  (unsigned) (super->vftbl->diffval);
 }
 
 
index b9b4f7b2c254546ba5debe44fc42af186d258ccc..c9c5ca16c1d2fea6e9180399f9e06b9a425a3a34 100644 (file)
--- a/global.h
+++ b/global.h
@@ -12,7 +12,7 @@
        Changes: Mark     Probst  (schani)   EMAIL: cacao@complang.tuwien.ac.at
                         Philipp  Tomsich (phil)     EMAIL: cacao@complang.tuwien.ac.at
 
-       Last Change: $Id: global.h 227 2003-02-12 13:23:24Z stefan $
+       Last Change: $Id: global.h 228 2003-02-12 16:24:36Z stefan $
 
 *******************************************************************************/
 
@@ -522,10 +522,6 @@ struct classinfo {                /* class structure                          */
     innerclassinfo *innerclass;
 
     classinfo      *hashlink;         /* link for external hash chain         */
-
-       s4           baseval;              /* base for runtime type check         */
-       s4           diffval;              /* high - base for runtime type check  */
-
 };
 
 
@@ -593,6 +589,9 @@ struct vftbl {
        s4           vftbllength;          /* virtual function table length       */
        s4           interfacetablelength; /* interface table length              */
 
+       s4           baseval;              /* base for runtime type check         */
+       s4           diffval;              /* high - base for runtime type check  */
+
        s4          *interfacevftbllength; /* length of interface vftbls          */
        
        methodptr    table[1];             /* class vftbl                         */
index e81b65a40af698a6eae6fe94cba0f6c209eeb653..f3dad92cc375532f0010e88828084e94eb2d9fe0 100644 (file)
--- a/headers.c
+++ b/headers.c
@@ -15,7 +15,7 @@
        Changes: Mark Probst         EMAIL: cacao@complang.tuwien.ac.at
                 Philipp Tomsich     EMAIL: cacao@complang.tuwien.ac.at
 
-       Last Change: $Id: headers.c 227 2003-02-12 13:23:24Z stefan $
+       Last Change: $Id: headers.c 228 2003-02-12 16:24:36Z stefan $
 
 *******************************************************************************/
 
@@ -533,9 +533,8 @@ int main(int argc, char **argv)
        fprintf (file, "#define offobjvftbl    %3d\n", (int) OFFSET(java_objectheader, vftbl));
        fprintf (file, "#define offarraysize   %3d\n", (int) OFFSET(java_arrayheader, size));
        fprintf (file, "#define offobjarrdata  %3d\n\n", (int) OFFSET(java_objectarray, data[0]));
-       fprintf (file, "#define offbaseval     %3d\n", (int) OFFSET(classinfo, baseval));
-       fprintf (file, "#define offdiffval     %3d\n", (int) OFFSET(classinfo, diffval));
-       fprintf (file, "#define offclass     %3d\n", (int) OFFSET(vftbl, class));
+       fprintf (file, "#define offbaseval     %3d\n", (int) OFFSET(vftbl, baseval));
+       fprintf (file, "#define offdiffval     %3d\n", (int) OFFSET(vftbl, diffval));
 
        fclose (file);
 
index b37299f086784f1b3376f112c5aab9435f199c5d..290f0b75abbdfbe0f13620b0c9cfe73d60233e44 100644 (file)
@@ -1965,7 +1965,7 @@ static void show_icmd_method()
                                                if (c->flags & ACC_INTERFACE)
                                                        printf(" (INTERFACE) ");
                                                else
-                                                       printf(" (CLASS,%3d) ", c->diffval);
+                                                       printf(" (CLASS,%3d) ", c->vftbl->diffval);
                                                utf_fprint(stdout, c->name);
                                                }
                                        break;
index 672396cd7816e5264e3cfcb472a656250c571213..4c499b31654244840a1e785c0c42da1751c31466 100644 (file)
--- a/loader.c
+++ b/loader.c
@@ -2519,19 +2519,19 @@ static void loader_compute_class_values (classinfo *c)
 {
        classinfo *subs;
 
-       c->baseval = ++classvalue;
+       c->vftbl->baseval = ++classvalue;
        subs = c->sub;
        while (subs != NULL) {
                loader_compute_class_values(subs);
                subs = subs->nextsub;
                }
-       c->diffval = classvalue - c->baseval;
+       c->vftbl->diffval = classvalue - c->vftbl->baseval;
 /*
        {
        int i;
        for (i = 0; i < c->index; i++)
                printf(" ");
-       printf("%3d  %3d  ", (int) c->baseval, c->diffval);
+       printf("%3d  %3d  ", (int) c->vftbl->baseval, c->vftbl->diffval);
        utf_display(c->name);
        printf("\n");
        }
index e81b65a40af698a6eae6fe94cba0f6c209eeb653..f3dad92cc375532f0010e88828084e94eb2d9fe0 100644 (file)
@@ -15,7 +15,7 @@
        Changes: Mark Probst         EMAIL: cacao@complang.tuwien.ac.at
                 Philipp Tomsich     EMAIL: cacao@complang.tuwien.ac.at
 
-       Last Change: $Id: headers.c 227 2003-02-12 13:23:24Z stefan $
+       Last Change: $Id: headers.c 228 2003-02-12 16:24:36Z stefan $
 
 *******************************************************************************/
 
@@ -533,9 +533,8 @@ int main(int argc, char **argv)
        fprintf (file, "#define offobjvftbl    %3d\n", (int) OFFSET(java_objectheader, vftbl));
        fprintf (file, "#define offarraysize   %3d\n", (int) OFFSET(java_arrayheader, size));
        fprintf (file, "#define offobjarrdata  %3d\n\n", (int) OFFSET(java_objectarray, data[0]));
-       fprintf (file, "#define offbaseval     %3d\n", (int) OFFSET(classinfo, baseval));
-       fprintf (file, "#define offdiffval     %3d\n", (int) OFFSET(classinfo, diffval));
-       fprintf (file, "#define offclass     %3d\n", (int) OFFSET(vftbl, class));
+       fprintf (file, "#define offbaseval     %3d\n", (int) OFFSET(vftbl, baseval));
+       fprintf (file, "#define offdiffval     %3d\n", (int) OFFSET(vftbl, diffval));
 
        fclose (file);
 
index 7aea2d8eee2a4a97a444baed180b9e7972444731..4da71058cc973a3bd57842d39c7c04c51fcf3614 100644 (file)
@@ -138,8 +138,8 @@ s4 builtin_isanysubclass (classinfo *sub, classinfo *super)
        return 0;
        */
 
-       return (unsigned) (sub->baseval - super->baseval) <=
-                  (unsigned) (super->diffval);
+       return (unsigned) (sub->vftbl->baseval - super->vftbl->baseval) <=
+                  (unsigned) (super->vftbl->diffval);
 }
 
 
index b9b4f7b2c254546ba5debe44fc42af186d258ccc..c9c5ca16c1d2fea6e9180399f9e06b9a425a3a34 100644 (file)
@@ -12,7 +12,7 @@
        Changes: Mark     Probst  (schani)   EMAIL: cacao@complang.tuwien.ac.at
                         Philipp  Tomsich (phil)     EMAIL: cacao@complang.tuwien.ac.at
 
-       Last Change: $Id: global.h 227 2003-02-12 13:23:24Z stefan $
+       Last Change: $Id: global.h 228 2003-02-12 16:24:36Z stefan $
 
 *******************************************************************************/
 
@@ -522,10 +522,6 @@ struct classinfo {                /* class structure                          */
     innerclassinfo *innerclass;
 
     classinfo      *hashlink;         /* link for external hash chain         */
-
-       s4           baseval;              /* base for runtime type check         */
-       s4           diffval;              /* high - base for runtime type check  */
-
 };
 
 
@@ -593,6 +589,9 @@ struct vftbl {
        s4           vftbllength;          /* virtual function table length       */
        s4           interfacetablelength; /* interface table length              */
 
+       s4           baseval;              /* base for runtime type check         */
+       s4           diffval;              /* high - base for runtime type check  */
+
        s4          *interfacevftbllength; /* length of interface vftbls          */
        
        methodptr    table[1];             /* class vftbl                         */
index b37299f086784f1b3376f112c5aab9435f199c5d..290f0b75abbdfbe0f13620b0c9cfe73d60233e44 100644 (file)
@@ -1965,7 +1965,7 @@ static void show_icmd_method()
                                                if (c->flags & ACC_INTERFACE)
                                                        printf(" (INTERFACE) ");
                                                else
-                                                       printf(" (CLASS,%3d) ", c->diffval);
+                                                       printf(" (CLASS,%3d) ", c->vftbl->diffval);
                                                utf_fprint(stdout, c->name);
                                                }
                                        break;
index 672396cd7816e5264e3cfcb472a656250c571213..4c499b31654244840a1e785c0c42da1751c31466 100644 (file)
@@ -2519,19 +2519,19 @@ static void loader_compute_class_values (classinfo *c)
 {
        classinfo *subs;
 
-       c->baseval = ++classvalue;
+       c->vftbl->baseval = ++classvalue;
        subs = c->sub;
        while (subs != NULL) {
                loader_compute_class_values(subs);
                subs = subs->nextsub;
                }
-       c->diffval = classvalue - c->baseval;
+       c->vftbl->diffval = classvalue - c->vftbl->baseval;
 /*
        {
        int i;
        for (i = 0; i < c->index; i++)
                printf(" ");
-       printf("%3d  %3d  ", (int) c->baseval, c->diffval);
+       printf("%3d  %3d  ", (int) c->vftbl->baseval, c->vftbl->diffval);
        utf_display(c->name);
        printf("\n");
        }