-
-
Save schani/539202 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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