Created
August 3, 2015 13:31
-
-
Save directhex/88cfc7bd8d7995a7e4f5 to your computer and use it in GitHub Desktop.
This file contains 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 -urNad mono/mini.orig/cpu-ppc.md mono/mini/cpu-ppc.md | |
--- mono/mini.orig/cpu-ppc.md 2015-08-03 13:30:23.569589093 +0000 | |
+++ mono/mini/cpu-ppc.md 2015-08-03 12:56:43.530622697 +0000 | |
@@ -314,5 +314,5 @@ | |
jump_table: dest:i len:8 | |
-atomic_add_i4: src1:b src2:i dest:i len:20 | |
+atomic_add_i4: src1:b src2:i dest:i len:28 | |
atomic_cas_i4: src1:b src2:i src3:i dest:i len:38 | |
diff -urNad mono/mini.orig/mini-ppc.c mono/mini/mini-ppc.c | |
--- mono/mini.orig/mini-ppc.c 2015-08-03 12:55:02.262472750 +0000 | |
+++ mono/mini/mini-ppc.c 2015-08-03 12:55:31.622517064 +0000 | |
@@ -4339,6 +4339,39 @@ | |
#endif | |
break; | |
} | |
+ case OP_ATOMIC_ADD_I4: | |
+ CASE_PPC64 (OP_ATOMIC_ADD_I8) { | |
+ int location = ins->inst_basereg; | |
+ int addend = ins->sreg2; | |
+ guint8 *loop, *branch; | |
+ g_assert (ins->inst_offset == 0); | |
+ | |
+ loop = code; | |
+ ppc_sync (code); | |
+ if (ins->opcode == OP_ATOMIC_ADD_I4) | |
+ ppc_lwarx (code, ppc_r0, 0, location); | |
+#ifdef __mono_ppc64__ | |
+ else | |
+ ppc_ldarx (code, ppc_r0, 0, location); | |
+#endif | |
+ | |
+ ppc_add (code, ppc_r0, ppc_r0, addend); | |
+ | |
+ if (ins->opcode == OP_ATOMIC_ADD_I4) | |
+ ppc_stwcxd (code, ppc_r0, 0, location); | |
+#ifdef __mono_ppc64__ | |
+ else | |
+ ppc_stdcxd (code, ppc_r0, 0, location); | |
+#endif | |
+ | |
+ branch = code; | |
+ ppc_bc (code, PPC_BR_FALSE, PPC_BR_EQ, 0); | |
+ ppc_patch (branch, loop); | |
+ | |
+ ppc_sync (code); | |
+ ppc_mr (code, ins->dreg, ppc_r0); | |
+ break; | |
+ } | |
#ifdef __mono_ppc64__ | |
case OP_ICONV_TO_I4: | |
@@ -4427,39 +4460,6 @@ | |
else | |
ppc_mr (code, ins->dreg, ins->sreg1); | |
break; | |
- case OP_ATOMIC_ADD_I4: | |
- CASE_PPC64 (OP_ATOMIC_ADD_I8) { | |
- int location = ins->inst_basereg; | |
- int addend = ins->sreg2; | |
- guint8 *loop, *branch; | |
- g_assert (ins->inst_offset == 0); | |
- | |
- loop = code; | |
- ppc_sync (code); | |
- if (ins->opcode == OP_ATOMIC_ADD_I4) | |
- ppc_lwarx (code, ppc_r0, 0, location); | |
-#ifdef __mono_ppc64__ | |
- else | |
- ppc_ldarx (code, ppc_r0, 0, location); | |
-#endif | |
- | |
- ppc_add (code, ppc_r0, ppc_r0, addend); | |
- | |
- if (ins->opcode == OP_ATOMIC_ADD_I4) | |
- ppc_stwcxd (code, ppc_r0, 0, location); | |
-#ifdef __mono_ppc64__ | |
- else | |
- ppc_stdcxd (code, ppc_r0, 0, location); | |
-#endif | |
- | |
- branch = code; | |
- ppc_bc (code, PPC_BR_FALSE, PPC_BR_EQ, 0); | |
- ppc_patch (branch, loop); | |
- | |
- ppc_sync (code); | |
- ppc_mr (code, ins->dreg, ppc_r0); | |
- break; | |
- } | |
#else | |
case OP_ICONV_TO_R4: | |
case OP_ICONV_TO_R8: { |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment