Skip to content

Instantly share code, notes, and snippets.

@directhex
Created August 3, 2015 13:31
Show Gist options
  • Save directhex/88cfc7bd8d7995a7e4f5 to your computer and use it in GitHub Desktop.
Save directhex/88cfc7bd8d7995a7e4f5 to your computer and use it in GitHub Desktop.
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