* Merged in new atomic instructions (twisti branch).
[cacao.git] / src / vm / jit / i386 / codegen.c
index d909a9b1d2c9655ef93f2f9beeb2c4c2396bd305..9b49b4fe67516891b59ff571226c7af7f8d9a586 100644 (file)
@@ -46,6 +46,7 @@
 #include "vm/builtin.h"
 #include "vm/exceptions.h"
 #include "vm/global.h"
+#include "vm/primitive.h"
 #include "vm/stringlocal.h"
 #include "vm/vm.h"
 
@@ -443,11 +444,13 @@ bool codegen_emit(jitdata *jd)
                                var = VAR(bptr->invars[len]);
                                if (bptr->type != BBTYPE_STD) {
                                        if (!IS_2_WORD_TYPE(var->type)) {
+#if !defined(ENABLE_SSA)
                                                if (bptr->type == BBTYPE_EXH) {
                                                        d = codegen_reg_of_var(0, var, REG_ITMP1);
                                                        M_INTMOVE(REG_ITMP1, d);
                                                        emit_store(jd, NULL, var, d);
                                                }
+#endif
                                        } 
                                        else {
                                                log_text("copy interface registers(EXH, SBR): longs \
@@ -2301,6 +2304,10 @@ bool codegen_emit(jitdata *jd)
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
                        emit_nullpointer_check(cd, iptr, s1);
 
+#if defined(ENABLE_ESCAPE_CHECK)
+                       /*emit_escape_check(cd, s1);*/
+#endif
+
                        if (INSTRUCTION_IS_UNRESOLVED(iptr)) {
                                uf        = iptr->sx.s23.s3.uf;
                                fieldtype = uf->fieldref->parseddesc.fd->type;
@@ -2958,6 +2965,12 @@ gen_method:
                                        M_MOV_IMM(bte->stub, REG_ITMP1);
                                }
                                M_CALL(REG_ITMP1);
+
+#if defined(ENABLE_ESCAPE_CHECK)
+                               if (bte->opcode == ICMD_NEW || bte->opcode == ICMD_NEWARRAY) {
+                                       /*emit_escape_annotate_object(cd, m);*/
+                               }
+#endif
                                break;
 
                        case ICMD_INVOKESPECIAL:
@@ -3091,9 +3104,6 @@ gen_method:
                                        supervftbl = super->vftbl;
                                }
                        
-                               if ((super == NULL) || !(super->flags & ACC_INTERFACE))
-                                       CODEGEN_CRITICAL_SECTION_NEW;
-
                                s1 = emit_load_s1(jd, iptr, REG_ITMP1);
 
                                /* if class is not resolved, check which code to call */
@@ -3166,8 +3176,6 @@ gen_method:
 
                                        M_MOV_IMM(supervftbl, REG_ITMP3);
 
-                                       CODEGEN_CRITICAL_SECTION_START;
-
                                        M_ILD32(REG_ITMP2, REG_ITMP2, OFFSET(vftbl_t, baseval));
 
                                        /*                              if (s1 != REG_ITMP1) { */
@@ -3184,8 +3192,6 @@ gen_method:
                                        M_MOV_IMM(supervftbl, REG_ITMP3);
                                        M_ILD(REG_ITMP3, REG_ITMP3, OFFSET(vftbl_t, diffval));
 
-                                       CODEGEN_CRITICAL_SECTION_END;
-
                                        /*                              } */
 
                                        M_CMP(REG_ITMP3, REG_ITMP2);
@@ -3246,9 +3252,6 @@ gen_method:
                                supervftbl = super->vftbl;
                        }
                        
-                       if ((super == NULL) || !(super->flags & ACC_INTERFACE))
-                               CODEGEN_CRITICAL_SECTION_NEW;
-
                        s1 = emit_load_s1(jd, iptr, REG_ITMP1);
                        d = codegen_reg_of_dst(jd, iptr, REG_ITMP2);
 
@@ -3332,14 +3335,10 @@ gen_method:
 
                                M_MOV_IMM(supervftbl, REG_ITMP2);
 
-                               CODEGEN_CRITICAL_SECTION_START;
-
                                M_ILD(REG_ITMP1, REG_ITMP1, OFFSET(vftbl_t, baseval));
                                M_ILD(REG_ITMP3, REG_ITMP2, OFFSET(vftbl_t, diffval));
                                M_ILD(REG_ITMP2, REG_ITMP2, OFFSET(vftbl_t, baseval));
 
-                               CODEGEN_CRITICAL_SECTION_END;
-
                                M_ISUB(REG_ITMP2, REG_ITMP1);
                                M_CLR(d);                                 /* may be REG_ITMP2 */
                                M_CMP(REG_ITMP3, REG_ITMP1);
@@ -3418,6 +3417,13 @@ gen_method:
                        emit_store_dst(jd, iptr, s1);
                        break;
 
+#if defined(ENABLE_SSA)
+               case ICMD_GETEXCEPTION:
+                       d = codegen_reg_of_dst(jd, iptr, REG_ITMP1);
+                       M_INTMOVE(REG_ITMP1, d);
+                       emit_store_dst(jd, iptr, d);
+                       break;
+#endif
                default:
                        exceptions_throw_internalerror("Unknown ICMD %d during code generation",
                                                                                   iptr->opc);
@@ -3618,6 +3624,20 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f, int s
        switch (md->returntype.type) {
        case TYPE_INT:
        case TYPE_ADR:
+               switch (md->returntype.decltype) {
+               case PRIMITIVETYPE_BOOLEAN:
+                       M_BZEXT(REG_RESULT, REG_RESULT);
+                       break;
+               case PRIMITIVETYPE_BYTE:
+                       M_BSEXT(REG_RESULT, REG_RESULT);
+                       break;
+               case PRIMITIVETYPE_CHAR:
+                       M_CZEXT(REG_RESULT, REG_RESULT);
+                       break;
+               case PRIMITIVETYPE_SHORT:
+                       M_SSEXT(REG_RESULT, REG_RESULT);
+                       break;
+               }
                M_IST(REG_RESULT, REG_SP, 1 * 8);
                break;
        case TYPE_LNG: