* src/threads/posix/thread-posix.cpp: Eliminated some easy-to-fix or pointless compil...
[cacao.git] / src / vm / jit / codegen-common.cpp
index f05b6d951a932feeae117d1f29a6feaa8e5b5cad..9b1dad8cdd3d5b9d443a96adca228a0d7e14a0a5 100644 (file)
@@ -1,6 +1,6 @@
 /* src/vm/jit/codegen-common.cpp - architecture independent code generator stuff
 
-   Copyright (C) 1996-2005, 2006, 2007, 2008, 2009
+   Copyright (C) 1996-2005, 2006, 2007, 2008, 2009, 2010
    CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
    Copyright (C) 2009 Theobroma Systems Ltd.
 
@@ -996,7 +996,7 @@ s4 codegen_reg_of_dst(jitdata *jd, instruction *iptr, s4 tempregnum)
 bool codegen_emit(jitdata *jd)
 {
        varinfo*            var;
-       builtintable_entry* bte;
+       builtintable_entry* bte = 0;
        methoddesc*         md;
        int32_t             s1, s2, /*s3,*/ d;
        int32_t             fieldtype;
@@ -1507,16 +1507,22 @@ bool codegen_emit(jitdata *jd)
 #if defined(__I386__)
                                // Generate architecture specific instructions.
                                codegen_emit_instruction(jd, iptr);
+                               break;
 #else
+                       {
+                               fieldinfo* fi;
+                               patchref_t* pr;
                                if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
                                        unresolved_field* uf = iptr->sx.s23.s3.uf;
                                        fieldtype = uf->fieldref->parseddesc.fd->type;
                                        disp      = dseg_add_unique_address(cd, 0);
 
-                                       patcher_add_patch_ref(jd, PATCHER_get_putstatic, uf, disp);
+                                       pr = patcher_add_patch_ref(jd, PATCHER_get_putstatic, uf, disp);
+
+                                       fi = NULL;              /* Silence compiler warning */
                                }
                                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);
 
@@ -1525,8 +1531,14 @@ bool codegen_emit(jitdata *jd)
                                                patcher_add_patch_ref(jd, PATCHER_initialize_class, fi->clazz, 0);
                                                PROFILE_CYCLE_START;
                                        }
+
+                                       pr = NULL;              /* Silence compiler warning */
                                }
 
+#if defined(USES_PATCHABLE_MEMORY_BARRIER)
+                               codegen_emit_patchable_barrier(iptr, cd, pr, fi);
+#endif
+
                                // XXX X86_64: Here We had this:
                                /* This approach is much faster than moving the field
                                   address inline into a register. */
@@ -1539,13 +1551,20 @@ bool codegen_emit(jitdata *jd)
                                        M_ALD(d, REG_ITMP1, 0);
                                        break;
                                case TYPE_INT:
+#if defined(ENABLE_SOFTFLOAT)
+                               case TYPE_FLT:
+#endif
                                        d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
                                        M_ILD(d, REG_ITMP1, 0);
                                        break;
                                case TYPE_LNG:
+#if defined(ENABLE_SOFTFLOAT)
+                               case TYPE_DBL:
+#endif
                                        d = codegen_reg_of_dst(jd, iptr, REG_LTMP23);
                                        M_LLD(d, REG_ITMP1, 0);
                                        break;
+#if !defined(ENABLE_SOFTFLOAT)
                                case TYPE_FLT:
                                        d = codegen_reg_of_dst(jd, iptr, REG_FTMP1);
                                        M_FLD(d, REG_ITMP1, 0);
@@ -1554,26 +1573,38 @@ bool codegen_emit(jitdata *jd)
                                        d = codegen_reg_of_dst(jd, iptr, REG_FTMP1);
                                        M_DLD(d, REG_ITMP1, 0);
                                        break;
+#endif
+                               default:
+                                       // Silence compiler warning.
+                                       d = 0;
                                }
                                emit_store_dst(jd, iptr, d);
-#endif
                                break;
+                       }
+#endif
 
                        case ICMD_PUTSTATIC:  /* ..., value  ==> ...                      */
 
 #if defined(__I386__)
                                // Generate architecture specific instructions.
                                codegen_emit_instruction(jd, iptr);
+                               break;
 #else
+                       {
+                               fieldinfo* fi;
+                               patchref_t* pr;
+
                                if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
                                        unresolved_field* uf = iptr->sx.s23.s3.uf;
                                        fieldtype = uf->fieldref->parseddesc.fd->type;
                                        disp      = dseg_add_unique_address(cd, 0);
 
-                                       patcher_add_patch_ref(jd, PATCHER_get_putstatic, uf, disp);
+                                       pr = patcher_add_patch_ref(jd, PATCHER_get_putstatic, uf, disp);
+
+                                       fi = NULL;              /* Silence compiler warning */
                                }
                                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);
 
@@ -1582,6 +1613,8 @@ bool codegen_emit(jitdata *jd)
                                                patcher_add_patch_ref(jd, PATCHER_initialize_class, fi->clazz, 0);
                                                PROFILE_CYCLE_START;
                                        }
+
+                                       pr = NULL;              /* Silence compiler warning */
                                }
 
                                // XXX X86_64: Here We had this:
@@ -1596,13 +1629,20 @@ bool codegen_emit(jitdata *jd)
                                        M_AST(s1, REG_ITMP1, 0);
                                        break;
                                case TYPE_INT:
+#if defined(ENABLE_SOFTFLOAT)
+                               case TYPE_FLT:
+#endif
                                        s1 = emit_load_s1(jd, iptr, REG_ITMP2);
                                        M_IST(s1, REG_ITMP1, 0);
                                        break;
                                case TYPE_LNG:
+#if defined(ENABLE_SOFTFLOAT)
+                               case TYPE_DBL:
+#endif
                                        s1 = emit_load_s1(jd, iptr, REG_LTMP23);
                                        M_LST(s1, REG_ITMP1, 0);
                                        break;
+#if !defined(ENABLE_SOFTFLOAT)
                                case TYPE_FLT:
                                        s1 = emit_load_s1(jd, iptr, REG_FTMP2);
                                        M_FST(s1, REG_ITMP1, 0);
@@ -1611,9 +1651,14 @@ bool codegen_emit(jitdata *jd)
                                        s1 = emit_load_s1(jd, iptr, REG_FTMP2);
                                        M_DST(s1, REG_ITMP1, 0);
                                        break;
+#endif
                                }
+#if defined(USES_PATCHABLE_MEMORY_BARRIER)
+                               codegen_emit_patchable_barrier(iptr, cd, pr, fi);
 #endif
                                break;
+                       }
+#endif
 
                        /* branch operations **********************************************/
 
@@ -1822,6 +1867,9 @@ bool codegen_emit(jitdata *jd)
                                goto nowperformreturn;
 
                        case ICMD_IRETURN:    /* ..., retvalue ==> ...                    */
+#if defined(ENABLE_SOFTFLOAT)
+                       case ICMD_FRETURN:
+#endif
 
                                REPLACEMENT_POINT_RETURN(cd, iptr);
                                s1 = emit_load_s1(jd, iptr, REG_RESULT);
@@ -1830,6 +1878,9 @@ bool codegen_emit(jitdata *jd)
                                goto nowperformreturn;
 
                        case ICMD_LRETURN:    /* ..., retvalue ==> ...                    */
+#if defined(ENABLE_SOFTFLOAT)
+                       case ICMD_DRETURN:
+#endif
 
                                REPLACEMENT_POINT_RETURN(cd, iptr);
                                s1 = emit_load_s1(jd, iptr, REG_LRESULT);
@@ -1837,6 +1888,7 @@ bool codegen_emit(jitdata *jd)
                                emit_lmove(cd, s1, REG_LRESULT);
                                goto nowperformreturn;
 
+#if !defined(ENABLE_SOFTFLOAT)
                        case ICMD_FRETURN:    /* ..., retvalue ==> ...                    */
 
                                REPLACEMENT_POINT_RETURN(cd, iptr);
@@ -1858,6 +1910,7 @@ bool codegen_emit(jitdata *jd)
                                M_CAST_D2L(s1, REG_LRESULT);
 #endif
                                goto nowperformreturn;
+#endif
 
 nowperformreturn:
 #if !defined(NDEBUG)
@@ -1962,35 +2015,45 @@ gen_method:
                                                continue;
 
                                        if (!md->params[i].inmemory) {
-                                               assert(ARG_CNT > 0);
-                                               s1 = emit_load(jd, iptr, var, d);
-
                                                switch (var->type) {
                                                case TYPE_ADR:
                                                case TYPE_INT:
-                                                       assert(INT_ARG_CNT > 0);
+#if defined(ENABLE_SOFTFLOAT)
+                                               case TYPE_FLT:
+#endif
+                                                       s1 = emit_load(jd, iptr, var, d);
                                                        emit_imove(cd, s1, d);
                                                        break;
 
                                                case TYPE_LNG:
+#if defined(ENABLE_SOFTFLOAT)
+                                               case TYPE_DBL:
+#endif
+                                                       s1 = emit_load(jd, iptr, var, d);
                                                        emit_lmove(cd, s1, d);
                                                        break;
 
+#if !defined(ENABLE_SOFTFLOAT)
                                                case TYPE_FLT:
 #if !defined(SUPPORT_PASS_FLOATARGS_IN_INTREGS)
+                                                       s1 = emit_load(jd, iptr, var, d);
                                                        emit_fmove(cd, s1, d);
 #else
+                                                       s1 = emit_load(jd, iptr, var, REG_FTMP1);
                                                        M_CAST_F2I(s1, d);
 #endif
                                                        break;
 
                                                case TYPE_DBL:
 #if !defined(SUPPORT_PASS_FLOATARGS_IN_INTREGS)
+                                                       s1 = emit_load(jd, iptr, var, d);
                                                        emit_dmove(cd, s1, d);
 #else
+                                                       s1 = emit_load(jd, iptr, var, REG_FTMP1);
                                                        M_CAST_D2L(s1, d);
 #endif
                                                        break;
+#endif
                                                }
                                        }
                                        else {
@@ -2005,6 +2068,9 @@ gen_method:
                                                        break;
 
                                                case TYPE_INT:
+#if defined(ENABLE_SOFTFLOAT)
+                                               case TYPE_FLT:
+#endif
 #if SIZEOF_VOID_P == 4
                                                        s1 = emit_load(jd, iptr, var, REG_ITMP1);
                                                        M_IST(s1, REG_SP, d);
@@ -2014,12 +2080,16 @@ gen_method:
 #endif
 
                                                case TYPE_LNG:
+#if defined(ENABLE_SOFTFLOAT)
+                                               case TYPE_DBL:
+#endif
                                                        s1 = emit_load(jd, iptr, var, REG_LTMP12);
                                                        // XXX Sparc64: Here this actually was:
                                                        //     M_STX(s1, REG_SP, JITSTACK + d);
                                                        M_LST(s1, REG_SP, d);
                                                        break;
 
+#if !defined(ENABLE_SOFTFLOAT)
                                                case TYPE_FLT:
 #if SIZEOF_VOID_P == 4
                                                        s1 = emit_load(jd, iptr, var, REG_FTMP1);
@@ -2035,6 +2105,7 @@ gen_method:
                                                        //     M_DST(s1, REG_SP, JITSTACK + d);
                                                        M_DST(s1, REG_SP, d);
                                                        break;
+#endif
                                                }
                                        }
                                }
@@ -2064,6 +2135,9 @@ gen_method:
                                switch (md->returntype.type) {
                                case TYPE_INT:
                                case TYPE_ADR:
+#if defined(ENABLE_SOFTFLOAT)
+                               case TYPE_FLT:
+#endif
                                        s1 = codegen_reg_of_dst(jd, iptr, REG_RESULT);
                                        // XXX Sparc64: This should actually be REG_RESULT_CALLER, fix this!
                                        emit_imove(cd, REG_RESULT, s1);
@@ -2071,12 +2145,16 @@ gen_method:
                                        break;
 
                                case TYPE_LNG:
+#if defined(ENABLE_SOFTFLOAT)
+                               case TYPE_DBL:
+#endif
                                        s1 = codegen_reg_of_dst(jd, iptr, REG_LRESULT);
                                        // XXX Sparc64: This should actually be REG_RESULT_CALLER, fix this!
                                        emit_lmove(cd, REG_LRESULT, s1);
                                        emit_store_dst(jd, iptr, s1);
                                        break;
 
+#if !defined(ENABLE_SOFTFLOAT)
                                case TYPE_FLT:
 #if !defined(SUPPORT_PASS_FLOATARGS_IN_INTREGS)
                                        s1 = codegen_reg_of_dst(jd, iptr, REG_FRESULT);
@@ -2098,6 +2176,7 @@ gen_method:
 #endif
                                        emit_store_dst(jd, iptr, s1);
                                        break;
+#endif
 
                                case TYPE_VOID:
                                        break;