* Removed all Id tags.
[cacao.git] / src / vm / jit / arm / codegen.c
index ddf555b1286d67db79504e0e534d8c238f8fe62b..6719286f4109e1005963f4c9081d956eef16dcc4 100644 (file)
@@ -22,8 +22,6 @@
    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    02110-1301, USA.
 
-   $Id: codegen.c 8211 2007-07-18 19:52:23Z michi $
-
 */
 
 
@@ -41,6 +39,7 @@
 
 #include "mm/memory.h"
 
+#include "native/localref.h"
 #include "native/native.h"
 
 #include "threads/lock-common.h"
@@ -88,8 +87,6 @@ bool codegen_emit(jitdata *jd)
        basicblock     *bptr;
        instruction    *iptr;
        exception_entry *ex;
-       s4              fieldtype;
-       s4              varindex;
 
        s4              spilledregs_num;
        s4              savedregs_num;
@@ -100,6 +97,10 @@ bool codegen_emit(jitdata *jd)
        unresolved_method  *um;
        builtintable_entry *bte;
        methoddesc         *md;
+       fieldinfo          *fi;
+       unresolved_field   *uf;
+       int                 fieldtype;
+       int                 varindex;
 
        /* get required compiler data */
 
@@ -1141,7 +1142,7 @@ bool codegen_emit(jitdata *jd)
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
                        d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
                        /* implicit null-pointer check */
-                       M_ILD_INTERN(d, s1, OFFSET(java_arrayheader, size));
+                       M_ILD_INTERN(d, s1, OFFSET(java_array_t, size));
                        emit_store_dst(jd, iptr, d);
                        break;
 
@@ -1153,7 +1154,7 @@ bool codegen_emit(jitdata *jd)
                        /* implicit null-pointer check */
                        emit_arrayindexoutofbounds_check(cd, iptr, s1, s2);
                        M_ADD(REG_ITMP1, s1, s2); /* REG_ITMP1 = s1 + 1 * s2 */
-                       M_LDRSB(d, REG_ITMP1, OFFSET(java_bytearray, data[0]));
+                       M_LDRSB(d, REG_ITMP1, OFFSET(java_bytearray_t, data[0]));
                        emit_store_dst(jd, iptr, d);
                        break;
 
@@ -1165,7 +1166,7 @@ bool codegen_emit(jitdata *jd)
                        /* implicit null-pointer check */
                        emit_arrayindexoutofbounds_check(cd, iptr, s1, s2);
                        M_ADD(REG_ITMP1, s1, REG_LSL(s2, 1)); /* REG_ITMP1 = s1 + 2 * s2 */
-                       M_LDRH(d, REG_ITMP1, OFFSET(java_chararray, data[0]));
+                       M_LDRH(d, REG_ITMP1, OFFSET(java_chararray_t, data[0]));
                        emit_store_dst(jd, iptr, d);
                        break;
 
@@ -1177,7 +1178,7 @@ bool codegen_emit(jitdata *jd)
                        /* implicit null-pointer check */
                        emit_arrayindexoutofbounds_check(cd, iptr, s1, s2);
                        M_ADD(REG_ITMP1, s1, REG_LSL(s2, 1)); /* REG_ITMP1 = s1 + 2 * s2 */
-                       M_LDRSH(d, REG_ITMP1, OFFSET(java_shortarray, data[0]));
+                       M_LDRSH(d, REG_ITMP1, OFFSET(java_shortarray_t, data[0]));
                        emit_store_dst(jd, iptr, d);
                        break;
 
@@ -1189,7 +1190,7 @@ bool codegen_emit(jitdata *jd)
                        /* implicit null-pointer check */
                        emit_arrayindexoutofbounds_check(cd, iptr, s1, s2);
                        M_ADD(REG_ITMP1, s1, REG_LSL(s2, 2)); /* REG_ITMP1 = s1 + 4 * s2 */
-                       M_ILD_INTERN(d, REG_ITMP1, OFFSET(java_intarray, data[0]));
+                       M_ILD_INTERN(d, REG_ITMP1, OFFSET(java_intarray_t, data[0]));
                        emit_store_dst(jd, iptr, d);
                        break;
 
@@ -1201,7 +1202,7 @@ bool codegen_emit(jitdata *jd)
                        /* implicit null-pointer check */
                        emit_arrayindexoutofbounds_check(cd, iptr, s1, s2);
                        M_ADD(REG_ITMP3, s1, REG_LSL(s2, 3)); /* REG_ITMP3 = s1 + 8 * s2 */
-                       M_LLD_INTERN(d, REG_ITMP3, OFFSET(java_longarray, data[0]));
+                       M_LLD_INTERN(d, REG_ITMP3, OFFSET(java_longarray_t, data[0]));
                        emit_store_dst(jd, iptr, d);
                        break;
 
@@ -1214,10 +1215,10 @@ bool codegen_emit(jitdata *jd)
                        M_ADD(REG_ITMP1, s1, REG_LSL(s2, 2)); /* REG_ITMP1 = s1 + 4 * s2 */
 #if !defined(ENABLE_SOFTFLOAT)
                        d = codegen_reg_of_dst(jd, iptr, REG_FTMP1);
-                       M_FLD_INTERN(d, REG_ITMP1, OFFSET(java_floatarray, data[0]));
+                       M_FLD_INTERN(d, REG_ITMP1, OFFSET(java_floatarray_t, data[0]));
 #else
                        d = codegen_reg_of_dst(jd, iptr, REG_ITMP1);
-                       M_ILD_INTERN(d, REG_ITMP1, OFFSET(java_floatarray, data[0]));
+                       M_ILD_INTERN(d, REG_ITMP1, OFFSET(java_floatarray_t, data[0]));
 #endif
                        emit_store_dst(jd, iptr, d);
                        break;
@@ -1231,10 +1232,10 @@ bool codegen_emit(jitdata *jd)
                        M_ADD(REG_ITMP3, s1, REG_LSL(s2, 3)); /* REG_ITMP3 = s1 + 8 * s2 */
 #if !defined(ENABLE_SOFTFLOAT)
                        d = codegen_reg_of_dst(jd, iptr, REG_FTMP1);
-                       M_DLD_INTERN(d, REG_ITMP3, OFFSET(java_doublearray, data[0]));
+                       M_DLD_INTERN(d, REG_ITMP3, OFFSET(java_doublearray_t, data[0]));
 #else
                        d = codegen_reg_of_dst(jd, iptr, REG_ITMP12_PACKED);
-                       M_LLD_INTERN(d, REG_ITMP3, OFFSET(java_doublearray, data[0]));
+                       M_LLD_INTERN(d, REG_ITMP3, OFFSET(java_doublearray_t, data[0]));
 #endif
                        emit_store_dst(jd, iptr, d);
                        break;
@@ -1247,7 +1248,7 @@ bool codegen_emit(jitdata *jd)
                        /* implicit null-pointer check */
                        emit_arrayindexoutofbounds_check(cd, iptr, s1, s2);
                        M_ADD(REG_ITMP1, s1, REG_LSL(s2, 2)); /* REG_ITMP1 = s1 + 4 * s2 */
-                       M_LDR_INTERN(d, REG_ITMP1, OFFSET(java_objectarray, data[0]));
+                       M_LDR_INTERN(d, REG_ITMP1, OFFSET(java_objectarray_t, data[0]));
                        emit_store_dst(jd, iptr, d);
                        break;
 
@@ -1259,7 +1260,7 @@ bool codegen_emit(jitdata *jd)
                        emit_arrayindexoutofbounds_check(cd, iptr, s1, s2);
                        s3 = emit_load_s3(jd, iptr, REG_ITMP3);
                        M_ADD(REG_ITMP1, s1, s2); /* REG_ITMP1 = s1 + 1 * s2 */
-                       M_STRB(s3, REG_ITMP1, OFFSET(java_bytearray, data[0]));
+                       M_STRB(s3, REG_ITMP1, OFFSET(java_bytearray_t, data[0]));
                        break;
 
                case ICMD_CASTORE:    /* ..., arrayref, index, value  ==> ...         */
@@ -1270,7 +1271,7 @@ bool codegen_emit(jitdata *jd)
                        emit_arrayindexoutofbounds_check(cd, iptr, s1, s2);
                        s3 = emit_load_s3(jd, iptr, REG_ITMP3);
                        M_ADD(REG_ITMP1, s1, REG_LSL(s2, 1)); /* REG_ITMP1 = s1 + 2 * s2 */
-                       M_STRH(s3, REG_ITMP1, OFFSET(java_chararray, data[0]));
+                       M_STRH(s3, REG_ITMP1, OFFSET(java_chararray_t, data[0]));
                        break;
 
                case ICMD_SASTORE:    /* ..., arrayref, index, value  ==> ...         */
@@ -1281,7 +1282,7 @@ bool codegen_emit(jitdata *jd)
                        emit_arrayindexoutofbounds_check(cd, iptr, s1, s2);
                        s3 = emit_load_s3(jd, iptr, REG_ITMP3);
                        M_ADD(REG_ITMP1, s1, REG_LSL(s2, 1)); /* REG_ITMP1 = s1 + 2 * s2 */
-                       M_STRH(s3, REG_ITMP1, OFFSET(java_shortarray, data[0]));
+                       M_STRH(s3, REG_ITMP1, OFFSET(java_shortarray_t, data[0]));
                        break;
 
                case ICMD_IASTORE:    /* ..., arrayref, index, value  ==> ...         */
@@ -1292,7 +1293,7 @@ bool codegen_emit(jitdata *jd)
                        emit_arrayindexoutofbounds_check(cd, iptr, s1, s2);
                        s3 = emit_load_s3(jd, iptr, REG_ITMP3);
                        M_ADD(REG_ITMP1, s1, REG_LSL(s2, 2)); /* REG_ITMP1 = s1 + 4 * s2 */
-                       M_IST_INTERN(s3, REG_ITMP1, OFFSET(java_intarray, data[0]));
+                       M_IST_INTERN(s3, REG_ITMP1, OFFSET(java_intarray_t, data[0]));
                        break;
 
                case ICMD_LASTORE:    /* ..., arrayref, index, value  ==> ...         */
@@ -1303,7 +1304,7 @@ bool codegen_emit(jitdata *jd)
                        emit_arrayindexoutofbounds_check(cd, iptr, s1, s2);
                        M_ADD(REG_ITMP3, s1, REG_LSL(s2, 3)); /* REG_ITMP3 = s1 + 8 * s2 */
                        s3 = emit_load_s3(jd, iptr, REG_ITMP12_PACKED);
-                       M_LST_INTERN(s3, REG_ITMP3, OFFSET(java_longarray, data[0]));
+                       M_LST_INTERN(s3, REG_ITMP3, OFFSET(java_longarray_t, data[0]));
                        break;
 
                case ICMD_FASTORE:    /* ..., arrayref, index, value  ==> ...         */
@@ -1315,10 +1316,10 @@ bool codegen_emit(jitdata *jd)
                        M_ADD(REG_ITMP1, s1, REG_LSL(s2, 2)); /* REG_ITMP1 = s1 + 4 * s2 */
 #if !defined(ENABLE_SOFTFLOAT)
                        s3 = emit_load_s3(jd, iptr, REG_FTMP1);
-                       M_FST_INTERN(s3, REG_ITMP1, OFFSET(java_floatarray, data[0]));
+                       M_FST_INTERN(s3, REG_ITMP1, OFFSET(java_floatarray_t, data[0]));
 #else
                        s3 = emit_load_s3(jd, iptr, REG_ITMP3);
-                       M_IST_INTERN(s3, REG_ITMP1, OFFSET(java_floatarray, data[0]));
+                       M_IST_INTERN(s3, REG_ITMP1, OFFSET(java_floatarray_t, data[0]));
 #endif
                        break;
 
@@ -1331,10 +1332,10 @@ bool codegen_emit(jitdata *jd)
                        M_ADD(REG_ITMP1, s1, REG_LSL(s2, 3)); /* REG_ITMP1 = s1 + 8 * s2 */
 #if !defined(ENABLE_SOFTFLOAT)
                        s3 = emit_load_s3(jd, iptr, REG_FTMP1);
-                       M_DST_INTERN(s3, REG_ITMP1, OFFSET(java_doublearray, data[0]));
+                       M_DST_INTERN(s3, REG_ITMP1, OFFSET(java_doublearray_t, data[0]));
 #else
                        s3 = emit_load_s3(jd, iptr, REG_ITMP23_PACKED);
-                       M_LST_INTERN(s3, REG_ITMP1, OFFSET(java_doublearray, data[0]));
+                       M_LST_INTERN(s3, REG_ITMP1, OFFSET(java_doublearray_t, data[0]));
 #endif
                        break;
 
@@ -1367,17 +1368,15 @@ bool codegen_emit(jitdata *jd)
                        s2 = emit_load_s2(jd, iptr, REG_ITMP2);
                        s3 = emit_load_s3(jd, iptr, REG_ITMP3);
                        M_ADD(REG_ITMP1, s1, REG_LSL(s2, 2)); /* REG_ITMP1 = s1 + 4 * s2 */
-                       M_STR_INTERN(s3, REG_ITMP1, OFFSET(java_objectarray, data[0]));
+                       M_STR_INTERN(s3, REG_ITMP1, OFFSET(java_objectarray_t, data[0]));
                        break;
 
                case ICMD_GETSTATIC:  /* ...  ==> ..., value                          */
 
                        if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
-                               unresolved_field *uf = iptr->sx.s23.s3.uf;
-
+                               uf        = iptr->sx.s23.s3.uf;
                                fieldtype = uf->fieldref->parseddesc.fd->type;
-
-                               disp = dseg_add_unique_address(cd, NULL);
+                               disp      = dseg_add_unique_address(cd, NULL);
 
                                patcher_add_patch_ref(jd, PATCHER_get_putstatic, uf, disp);
 
@@ -1385,9 +1384,9 @@ bool codegen_emit(jitdata *jd)
                                        M_NOP;
                        }
                        else {
-                               fieldinfo *fi = iptr->sx.s23.s3.fmiref->p.field;
-
+                               fi        = iptr->sx.s23.s3.fmiref->p.field;
                                fieldtype = fi->type;
+                               disp      = dseg_add_address(cd, fi->value);
 
                                if (!CLASS_IS_OR_ALMOST_INITIALIZED(fi->class)) {
                                        patcher_add_patch_ref(jd, PATCHER_initialize_class,
@@ -1396,8 +1395,6 @@ bool codegen_emit(jitdata *jd)
                                        if (opt_showdisassemble)
                                                M_NOP;
                                }
-
-                               disp = dseg_add_address(cd, &(fi->value));
                        }
 
                        M_DSEG_LOAD(REG_ITMP3, disp);
@@ -1436,11 +1433,9 @@ bool codegen_emit(jitdata *jd)
                case ICMD_PUTSTATIC:  /* ..., value  ==> ...                          */
 
                        if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
-                               unresolved_field *uf = iptr->sx.s23.s3.uf;
-
+                               uf        = iptr->sx.s23.s3.uf;
                                fieldtype = uf->fieldref->parseddesc.fd->type;
-
-                               disp = dseg_add_unique_address(cd, NULL);
+                               disp      = dseg_add_unique_address(cd, NULL);
 
                                patcher_add_patch_ref(jd, PATCHER_get_putstatic, uf, disp);
 
@@ -1448,9 +1443,9 @@ bool codegen_emit(jitdata *jd)
                                        M_NOP;
                        }
                        else {
-                               fieldinfo *fi = iptr->sx.s23.s3.fmiref->p.field;
-
+                               fi        = iptr->sx.s23.s3.fmiref->p.field;
                                fieldtype = fi->type;
+                               disp      = dseg_add_address(cd, fi->value);
 
                                if (!CLASS_IS_OR_ALMOST_INITIALIZED(fi->class)) {
                                        patcher_add_patch_ref(jd, PATCHER_initialize_class,
@@ -1459,8 +1454,6 @@ bool codegen_emit(jitdata *jd)
                                        if (opt_showdisassemble)
                                                M_NOP;
                                }
-
-                               disp = dseg_add_address(cd, &(fi->value));
                        }
 
                        M_DSEG_LOAD(REG_ITMP3, disp);
@@ -1502,13 +1495,12 @@ bool codegen_emit(jitdata *jd)
 
 
                        if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
-                               unresolved_field *uf = iptr->sx.s23.s3.uf;
-
+                               uf        = iptr->sx.s23.s3.uf;
                                fieldtype = uf->fieldref->parseddesc.fd->type;
+                               disp      = 0;
                        }
                        else {
-                               fieldinfo *fi = iptr->sx.s23.s3.fmiref->p.field;
-
+                               fi        = iptr->sx.s23.s3.fmiref->p.field;
                                fieldtype = fi->type;
                                disp      = fi->offset;
                        }
@@ -1520,14 +1512,13 @@ bool codegen_emit(jitdata *jd)
 #endif
 
                        if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
-                               unresolved_field *uf = iptr->sx.s23.s3.uf;
+                               /* XXX REMOVE ME */
+                               uf = iptr->sx.s23.s3.uf;
 
                                patcher_add_patch_ref(jd, PATCHER_get_putfield, uf, 0);
 
                                if (opt_showdisassemble)
                                        M_NOP;
-
-                               disp = 0;
                        }
 
                        switch (fieldtype) {
@@ -1568,13 +1559,12 @@ bool codegen_emit(jitdata *jd)
                        emit_nullpointer_check(cd, iptr, s1);
 
                        if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
-                               unresolved_field *uf = iptr->sx.s23.s3.uf;
-
+                               uf        = iptr->sx.s23.s3.uf;
                                fieldtype = uf->fieldref->parseddesc.fd->type;
+                               disp      = 0;
                        }
                        else {
-                               fieldinfo *fi = iptr->sx.s23.s3.fmiref->p.field;
-
+                               fi        = iptr->sx.s23.s3.fmiref->p.field;
                                fieldtype = fi->type;
                                disp      = fi->offset;
                        }
@@ -1610,14 +1600,13 @@ bool codegen_emit(jitdata *jd)
                        }
 
                        if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
-                               unresolved_field *uf = iptr->sx.s23.s3.uf;
+                               /* XXX REMOVE ME */
+                               uf = iptr->sx.s23.s3.uf;
 
                                patcher_add_patch_ref(jd, PATCHER_get_putfield, uf, 0);
 
                                if (opt_showdisassemble)
                                        M_NOP;
-
-                               disp = 0;
                        }
 
                        switch (fieldtype) {
@@ -2328,7 +2317,7 @@ bool codegen_emit(jitdata *jd)
 
                                /* implicit null-pointer check */
                                M_LDR_INTERN(REG_METHODPTR, REG_A0,
-                                                        OFFSET(java_objectheader, vftbl));
+                                                        OFFSET(java_object_t, vftbl));
                                M_LDR_INTERN(REG_PV, REG_METHODPTR, s1);
 
                                /* generate the actual call */
@@ -2357,7 +2346,7 @@ bool codegen_emit(jitdata *jd)
 
                                /* implicit null-pointer check */
                                M_LDR_INTERN(REG_METHODPTR, REG_A0,
-                                                        OFFSET(java_objectheader, vftbl));
+                                                        OFFSET(java_object_t, vftbl));
                                M_LDR_INTERN(REG_METHODPTR, REG_METHODPTR, s1);
                                M_LDR_INTERN(REG_PV, REG_METHODPTR, s2);
 
@@ -2482,7 +2471,7 @@ bool codegen_emit(jitdata *jd)
                                        emit_label_beq(cd, BRANCH_LABEL_3);
                                }
 
-                               M_LDR_INTERN(REG_ITMP2, s1, OFFSET(java_objectheader, vftbl));
+                               M_LDR_INTERN(REG_ITMP2, s1, OFFSET(java_object_t, vftbl));
                                M_LDR_INTERN(REG_ITMP3, REG_ITMP2, OFFSET(vftbl_t, interfacetablelength));
 
                                /* we put unresolved or non-immediate superindices onto dseg */
@@ -2501,7 +2490,7 @@ bool codegen_emit(jitdata *jd)
                                   things differently here! */
                                if ((super == NULL) || !IS_IMM(superindex)) {
 
-                                       M_LDR_INTERN(REG_ITMP3, s1, OFFSET(java_objectheader, vftbl));
+                                       M_LDR_INTERN(REG_ITMP3, s1, OFFSET(java_object_t, vftbl));
 
                                        /* this assumes something */
                                        assert(OFFSET(vftbl_t, interfacetable[0]) == 0);
@@ -2551,7 +2540,7 @@ bool codegen_emit(jitdata *jd)
                                        emit_label_beq(cd, BRANCH_LABEL_5);
                                }
 
-                               M_LDR_INTERN(REG_ITMP2, s1, OFFSET(java_objectheader, vftbl));
+                               M_LDR_INTERN(REG_ITMP2, s1, OFFSET(java_object_t, vftbl));
                                M_DSEG_LOAD(REG_ITMP3, disp);
 
                                CODEGEN_CRITICAL_SECTION_START;
@@ -2688,7 +2677,7 @@ bool codegen_emit(jitdata *jd)
                                        emit_label_beq(cd, BRANCH_LABEL_3);
                                }
 
-                               M_LDR_INTERN(REG_ITMP1, s1, OFFSET(java_objectheader, vftbl));
+                               M_LDR_INTERN(REG_ITMP1, s1, OFFSET(java_object_t, vftbl));
                                M_LDR_INTERN(REG_ITMP3,
                                                         REG_ITMP1, OFFSET(vftbl_t, interfacetablelength));
 
@@ -2762,7 +2751,7 @@ bool codegen_emit(jitdata *jd)
                                        emit_label_beq(cd, BRANCH_LABEL_5);
                                }
 
-                               M_LDR_INTERN(REG_ITMP1, s1, OFFSET(java_objectheader, vftbl));
+                               M_LDR_INTERN(REG_ITMP1, s1, OFFSET(java_object_t, vftbl));
                                M_DSEG_LOAD(REG_ITMP2, disp);
 
                                CODEGEN_CRITICAL_SECTION_START;