2006-07-08 Zoltan Varga <vargaz@gmail.com>
[mono.git] / mono / mini / mini-amd64.c
index 8e40c1ba699bf4d2db33347bc70e5e24f0bbfaa8..7b7ad306bcaaf69af03be2654bc38df2a1f33154 100644 (file)
@@ -2002,7 +2002,7 @@ mono_emit_stack_alloc (guchar *code, MonoInst* tree)
                        offset += 8;
                }
                
-               amd64_shift_reg_imm (code, X86_SHR, sreg, 4);
+               amd64_shift_reg_imm (code, X86_SHR, sreg, 3);
                if (sreg != AMD64_RCX)
                        amd64_mov_reg_reg (code, AMD64_RCX, sreg, 8);
                amd64_alu_reg_reg (code, X86_XOR, AMD64_RAX, AMD64_RAX);
@@ -2248,12 +2248,15 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                cpos += 6;
 
                cov->data [bb->dfn].cil_code = bb->cil_code;
+               amd64_mov_reg_imm (code, AMD64_R11, (guint64)&cov->data [bb->dfn].count);
                /* this is not thread save, but good enough */
-               amd64_inc_mem (code, (guint64)&cov->data [bb->dfn].count); 
+               amd64_inc_membase (code, AMD64_R11, 0);
        }
 
        offset = code - cfg->native_code;
 
+       mono_debug_open_block (cfg, bb, offset);
+
        ins = bb->code;
        while (ins) {
                offset = code - cfg->native_code;
@@ -3865,7 +3868,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        }
 
                        if (breg == AMD64_RAX) {
-                               amd64_mov_reg_reg (code, AMD64_R11, AMD64_RAX, size);
+                               amd64_mov_reg_reg (code, AMD64_R11, AMD64_RAX, 8);
                                breg = AMD64_R11;
                        }
 
@@ -4651,7 +4654,7 @@ mono_arch_instrument_epilog (MonoCompile *cfg, void *func, void *p, gboolean ena
                save_mode = SAVE_XMM;
                break;
        case MONO_TYPE_GENERICINST:
-               if (mono_type_generic_inst_is_valuetype (mono_method_signature (method)->ret)) {
+               if (!mono_type_generic_inst_is_valuetype (mono_method_signature (method)->ret)) {
                        save_mode = SAVE_EAX;
                        break;
                }
@@ -5047,9 +5050,9 @@ mono_arch_get_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethod
                        guint32 opcode;
 
                        if (fsig->params [0]->type == MONO_TYPE_I4)
-                               opcode = OP_ATOMIC_ADD_I4;
+                               opcode = OP_ATOMIC_ADD_NEW_I4;
                        else if (fsig->params [0]->type == MONO_TYPE_I8)
-                               opcode = OP_ATOMIC_ADD_I8;
+                               opcode = OP_ATOMIC_ADD_NEW_I8;
                        else
                                g_assert_not_reached ();