else
ppc_mr (code, ins->dreg, ins->sreg1);
break;
- case OP_ATOMIC_ADD_NEW_I4:
- case OP_ATOMIC_ADD_NEW_I8: {
+ case OP_ATOMIC_ADD_I4:
+ case OP_ATOMIC_ADD_I8: {
guint8 *loop = code, *branch;
g_assert (ins->inst_offset == 0);
- if (ins->opcode == OP_ATOMIC_ADD_NEW_I4)
+ ppc_sync (code);
+ if (ins->opcode == OP_ATOMIC_ADD_I4)
ppc_lwarx (code, ppc_r0, 0, ins->inst_basereg);
else
ppc_ldarx (code, ppc_r0, 0, ins->inst_basereg);
ppc_add (code, ppc_r0, ppc_r0, ins->sreg2);
- if (ins->opcode == OP_ATOMIC_ADD_NEW_I4)
+ if (ins->opcode == OP_ATOMIC_ADD_I4)
ppc_stwcxd (code, ppc_r0, 0, ins->inst_basereg);
else
ppc_stdcxd (code, ppc_r0, 0, ins->inst_basereg);
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;
}
guint8 *start, *not_equal, *lost_reservation;
start = code;
+ ppc_sync (code);
if (ins->opcode == OP_ATOMIC_CAS_I4)
ppc_lwarx (code, ppc_r0, 0, location);
#ifdef __mono_ppc64__
ppc_patch (lost_reservation, start);
ppc_patch (not_equal, code);
+ ppc_sync (code);
ppc_mr (code, ins->dreg, ppc_r0);
break;
}
}
#endif
+
+gboolean
+mono_arch_opcode_supported (int opcode)
+{
+ switch (opcode) {
+ case OP_ATOMIC_CAS_I4:
+#ifdef TARGET_POWERPC64
+ case OP_ATOMIC_ADD_I4: /* Yes, really - see cpu-ppc(64).md. */
+ case OP_ATOMIC_ADD_I8:
+ case OP_ATOMIC_CAS_I8:
+#endif
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}