Skip to content

Instantly share code, notes, and snippets.

@schani
Created August 19, 2010 23:26
Show Gist options
  • Select an option

  • Save schani/539202 to your computer and use it in GitHub Desktop.

Select an option

Save schani/539202 to your computer and use it in GitHub Desktop.
diff --git a/mono/mini/cpu-x86.md b/mono/mini/cpu-x86.md
index f689505..ebb5495 100644
--- a/mono/mini/cpu-x86.md
+++ b/mono/mini/cpu-x86.md
@@ -300,7 +300,7 @@ tls_get: dest:i len:20
atomic_add_i4: src1:b src2:i dest:i len:16
atomic_add_new_i4: src1:b src2:i dest:i len:16
atomic_exchange_i4: src1:b src2:i dest:a len:24
-atomic_cas_i4: src1:b src2:i src3:a dest:i len:24
+atomic_cas_i4: src1:a src2:b src3:i dest:a len:24 clob:1
memory_barrier: len:16
relaxed_nop: len:2
diff --git a/mono/mini/method-to-ir.c b/mono/mini/method-to-ir.c
index 1b93a3a..6cbf95f 100644
--- a/mono/mini/method-to-ir.c
+++ b/mono/mini/method-to-ir.c
@@ -4456,17 +4456,17 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign
if (size == 4) {
MONO_INST_NEW (cfg, ins, OP_ATOMIC_CAS_I4);
ins->dreg = alloc_ireg (cfg);
- ins->sreg1 = args [0]->dreg;
- ins->sreg2 = args [1]->dreg;
- ins->sreg3 = args [2]->dreg;
+ ins->sreg2 = args [0]->dreg;
+ ins->sreg3 = args [1]->dreg;
+ ins->sreg1 = args [2]->dreg;
ins->type = STACK_I4;
MONO_ADD_INS (cfg->cbb, ins);
} else if (size == 8) {
MONO_INST_NEW (cfg, ins, OP_ATOMIC_CAS_I8);
ins->dreg = alloc_ireg (cfg);
- ins->sreg1 = args [0]->dreg;
- ins->sreg2 = args [1]->dreg;
- ins->sreg3 = args [2]->dreg;
+ ins->sreg2 = args [0]->dreg;
+ ins->sreg3 = args [1]->dreg;
+ ins->sreg1 = args [2]->dreg;
ins->type = STACK_I8;
MONO_ADD_INS (cfg->cbb, ins);
} else {
diff --git a/mono/mini/mini-x86.c b/mono/mini/mini-x86.c
index d002584..025c9f1 100644
--- a/mono/mini/mini-x86.c
+++ b/mono/mini/mini-x86.c
@@ -3993,15 +3993,13 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
break;
}
case OP_ATOMIC_CAS_I4: {
- g_assert (ins->sreg3 == X86_EAX);
- g_assert (ins->sreg1 != X86_EAX);
- g_assert (ins->sreg1 != ins->sreg2);
+ g_assert (ins->dreg == X86_EAX);
+ g_assert (ins->sreg1 == X86_EAX);
+ g_assert (ins->sreg2 != X86_EAX);
+ g_assert (ins->sreg2 != ins->sreg2);
x86_prefix (code, X86_LOCK_PREFIX);
- x86_cmpxchg_membase_reg (code, ins->sreg1, ins->inst_offset, ins->sreg2);
-
- if (ins->dreg != X86_EAX)
- x86_mov_reg_reg (code, ins->dreg, X86_EAX, 4);
+ x86_cmpxchg_membase_reg (code, ins->sreg2, ins->inst_offset, ins->sreg3);
break;
}
#ifdef MONO_ARCH_SIMD_INTRINSICS
diff --git a/mono/mini/mini-x86.h b/mono/mini/mini-x86.h
index 94812a2..86db114 100644
--- a/mono/mini/mini-x86.h
+++ b/mono/mini/mini-x86.h
@@ -117,7 +117,7 @@ struct sigcontext {
#define MONO_ARCH_INST_FIXED_REG(desc) (((desc == ' ') || (desc == 'i')) ? -1 : ((desc == 's') ? X86_ECX : ((desc == 'a') ? X86_EAX : ((desc == 'd') ? X86_EDX : ((desc == 'l') ? X86_EAX : -1)))))
-#define MONO_ARCH_INST_FIXED_MASK(desc) ((desc == 'y') ? (X86_BYTE_REGS) : 0)
+#define MONO_ARCH_INST_FIXED_MASK(desc) ((desc == 'y') ? (X86_BYTE_REGS) : (((desc) == 'a') ? (1 << X86_EAX) : 0))
/* RDX is clobbered by the opcode implementation before accessing sreg2 */
/*
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment