Merge pull request #2799 from BrzVlad/fix-conc-card-clean
[mono.git] / mono / mini / mini-x86.c
index a74765570f76a2139af0e55533dacdfb50ab8a66..1ef8d4614dd92f90cad7202396f7c9894ec9d5ea 100644 (file)
@@ -1096,8 +1096,7 @@ mono_arch_allocate_vars (MonoCompile *cfg)
        offsets = mono_allocate_stack_slots (cfg, TRUE, &locals_stack_size, &locals_stack_align);
        if (locals_stack_size > MONO_ARCH_MAX_FRAME_SIZE) {
                char *mname = mono_method_full_name (cfg->method, TRUE);
-               cfg->exception_type = MONO_EXCEPTION_INVALID_PROGRAM;
-               cfg->exception_message = g_strdup_printf ("Method %s stack is too big.", mname);
+               mono_cfg_set_exception_invalid_program (cfg, g_strdup_printf ("Method %s stack is too big.", mname));
                g_free (mname);
                return;
        }
@@ -1537,8 +1536,8 @@ mono_arch_emit_call (MonoCompile *cfg, MonoCallInst *call)
                                                MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORER8_MEMBASE_REG, X86_ESP, ainfo->offset, in->dreg);
                                                argsize = 8;
                                        } else if (t->type == MONO_TYPE_I8 || t->type == MONO_TYPE_U8) {
-                                               MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORE_MEMBASE_REG, X86_ESP, ainfo->offset + 4, in->dreg + 2);
-                                               MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORE_MEMBASE_REG, X86_ESP, ainfo->offset, in->dreg + 1);
+                                               MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORE_MEMBASE_REG, X86_ESP, ainfo->offset + 4, MONO_LVREG_MS (in->dreg));
+                                               MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORE_MEMBASE_REG, X86_ESP, ainfo->offset, MONO_LVREG_LS (in->dreg));
                                                argsize = 4;
                                        } else {
                                                MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORE_MEMBASE_REG, X86_ESP, ainfo->offset, in->dreg);
@@ -1674,8 +1673,8 @@ mono_arch_emit_setret (MonoCompile *cfg, MonoMethod *method, MonoInst *val)
                        if (COMPILE_LLVM (cfg))
                                MONO_EMIT_NEW_UNALU (cfg, OP_LMOVE, cfg->ret->dreg, val->dreg);
                        else {
-                               MONO_EMIT_NEW_UNALU (cfg, OP_MOVE, X86_EAX, val->dreg + 1);
-                               MONO_EMIT_NEW_UNALU (cfg, OP_MOVE, X86_EDX, val->dreg + 2);
+                               MONO_EMIT_NEW_UNALU (cfg, OP_MOVE, X86_EAX, MONO_LVREG_LS (val->dreg));
+                               MONO_EMIT_NEW_UNALU (cfg, OP_MOVE, X86_EDX, MONO_LVREG_MS (val->dreg));
                        }
                        return;
                }
@@ -2476,26 +2475,6 @@ emit_setup_lmf (MonoCompile *cfg, guint8 *code, gint32 lmf_offset, int cfa_offse
        return code;
 }
 
-#define REAL_PRINT_REG(text,reg) \
-mono_assert (reg >= 0); \
-x86_push_reg (code, X86_EAX); \
-x86_push_reg (code, X86_EDX); \
-x86_push_reg (code, X86_ECX); \
-x86_push_reg (code, reg); \
-x86_push_imm (code, reg); \
-x86_push_imm (code, text " %d %p\n"); \
-x86_mov_reg_imm (code, X86_EAX, printf); \
-x86_call_reg (code, X86_EAX); \
-x86_alu_reg_imm (code, X86_ADD, X86_ESP, 3*4); \
-x86_pop_reg (code, X86_ECX); \
-x86_pop_reg (code, X86_EDX); \
-x86_pop_reg (code, X86_EAX);
-
-/* REAL_PRINT_REG does not appear to be used, and was not adapted to work with Native Client. */
-#ifdef __native__client_codegen__
-#define REAL_PRINT_REG(text, reg) g_assert_not_reached()
-#endif
-
 /* benchmark and set based on cpu */
 #define LOOP_ALIGNMENT 8
 #define bb_is_loop_start(bb) ((bb)->loop_body_start && (bb)->nesting)
@@ -4233,7 +4212,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        x86_branch8 (code, X86_CC_NE, 0, FALSE);
 
                        x86_fstp (code, 0);                     
-                       EMIT_COND_SYSTEM_EXCEPTION (X86_CC_EQ, FALSE, "ArithmeticException");
+                       EMIT_COND_SYSTEM_EXCEPTION (X86_CC_EQ, FALSE, "OverflowException");
 
                        x86_patch (br1, code);
                        break;
@@ -5131,9 +5110,6 @@ mono_arch_patch_code_new (MonoCompile *cfg, MonoDomain *domain, guint8 *code, Mo
        case MONO_PATCH_INFO_BB:
        case MONO_PATCH_INFO_LABEL:
        case MONO_PATCH_INFO_RGCTX_FETCH:
-       case MONO_PATCH_INFO_MONITOR_ENTER:
-       case MONO_PATCH_INFO_MONITOR_ENTER_V4:
-       case MONO_PATCH_INFO_MONITOR_EXIT:
        case MONO_PATCH_INFO_JIT_ICALL_ADDR:
 #if defined(__native_client_codegen__) && defined(__native_client__)
                if (nacl_is_code_address (code)) {
@@ -5668,8 +5644,7 @@ mono_arch_emit_exceptions (MonoCompile *cfg)
 
                        x86_patch (patch_info->ip.i + cfg->native_code, code);
 
-                       exc_class = mono_class_from_name (mono_defaults.corlib, "System", patch_info->data.name);
-                       g_assert (exc_class);
+                       exc_class = mono_class_load_from_name (mono_defaults.corlib, "System", patch_info->data.name);
                        throw_ip = patch_info->ip.i;
 
                        /* Find a throw sequence for the same exception class */
@@ -6486,9 +6461,9 @@ mono_arch_decompose_long_opts (MonoCompile *cfg, MonoInst *long_ins)
 
        if (long_ins->opcode == OP_LNEG) {
                ins = long_ins;
-               MONO_EMIT_NEW_UNALU (cfg, OP_INEG, ins->dreg + 1, ins->sreg1 + 1);
-               MONO_EMIT_NEW_BIALU_IMM (cfg, OP_ADC_IMM, ins->dreg + 2, ins->sreg1 + 2, 0);
-               MONO_EMIT_NEW_UNALU (cfg, OP_INEG, ins->dreg + 2, ins->dreg + 2);
+               MONO_EMIT_NEW_UNALU (cfg, OP_INEG, MONO_LVREG_LS (ins->dreg), MONO_LVREG_LS (ins->sreg1));
+               MONO_EMIT_NEW_BIALU_IMM (cfg, OP_ADC_IMM, MONO_LVREG_MS (ins->dreg), MONO_LVREG_MS (ins->sreg1), 0);
+               MONO_EMIT_NEW_UNALU (cfg, OP_INEG, MONO_LVREG_MS (ins->dreg), MONO_LVREG_MS (ins->dreg));
                NULLIFY_INS (ins);
                return;
        }
@@ -6517,7 +6492,7 @@ mono_arch_decompose_long_opts (MonoCompile *cfg, MonoInst *long_ins)
                ins->klass = mono_defaults.int32_class;
                ins->sreg1 = vreg;
                ins->type = STACK_I4;
-               ins->dreg = long_ins->dreg + 1;
+               ins->dreg = MONO_LVREG_LS (long_ins->dreg);
                MONO_ADD_INS (cfg->cbb, ins);
        
                MONO_INST_NEW (cfg, ins, OP_PSHUFLED);
@@ -6532,7 +6507,7 @@ mono_arch_decompose_long_opts (MonoCompile *cfg, MonoInst *long_ins)
                ins->klass = mono_defaults.int32_class;
                ins->sreg1 = vreg;
                ins->type = STACK_I4;
-               ins->dreg = long_ins->dreg + 2;
+               ins->dreg = MONO_LVREG_MS (long_ins->dreg);
                MONO_ADD_INS (cfg->cbb, ins);
        
                long_ins->opcode = OP_NOP;
@@ -6541,14 +6516,14 @@ mono_arch_decompose_long_opts (MonoCompile *cfg, MonoInst *long_ins)
                MONO_INST_NEW (cfg, ins, OP_INSERTX_I4_SLOW);
                ins->dreg = long_ins->dreg;
                ins->sreg1 = long_ins->dreg;
-               ins->sreg2 = long_ins->sreg2 + 1;
+               ins->sreg2 = MONO_LVREG_LS (long_ins->sreg2);
                ins->inst_c0 = long_ins->inst_c0 * 2;
                MONO_ADD_INS (cfg->cbb, ins);
 
                MONO_INST_NEW (cfg, ins, OP_INSERTX_I4_SLOW);
                ins->dreg = long_ins->dreg;
                ins->sreg1 = long_ins->dreg;
-               ins->sreg2 = long_ins->sreg2 + 2;
+               ins->sreg2 = MONO_LVREG_MS (long_ins->sreg2);
                ins->inst_c0 = long_ins->inst_c0 * 2 + 1;
                MONO_ADD_INS (cfg->cbb, ins);
 
@@ -6557,7 +6532,7 @@ mono_arch_decompose_long_opts (MonoCompile *cfg, MonoInst *long_ins)
        case OP_EXPAND_I8:
                MONO_INST_NEW (cfg, ins, OP_ICONV_TO_X);
                ins->dreg = long_ins->dreg;
-               ins->sreg1 = long_ins->sreg1 + 1;
+               ins->sreg1 = MONO_LVREG_LS (long_ins->sreg1);
                ins->klass = long_ins->klass;
                ins->type = STACK_VTYPE;
                MONO_ADD_INS (cfg->cbb, ins);
@@ -6565,7 +6540,7 @@ mono_arch_decompose_long_opts (MonoCompile *cfg, MonoInst *long_ins)
                MONO_INST_NEW (cfg, ins, OP_INSERTX_I4_SLOW);
                ins->dreg = long_ins->dreg;
                ins->sreg1 = long_ins->dreg;
-               ins->sreg2 = long_ins->sreg1 + 2;
+               ins->sreg2 = MONO_LVREG_MS (long_ins->sreg1);
                ins->inst_c0 = 1;
                ins->klass = long_ins->klass;
                ins->type = STACK_VTYPE;