volatile uint32 value;
} Atomic_uint32 ALIGNED(4);
-typedef struct Atomic_uint64 {
+typedef struct Atomic_uint64 {
volatile uint64 value;
} Atomic_uint64 ALIGNED(8);
"0" (oldVal)
: "cc"
);
+
return val;
#elif defined _MSC_VER && _MSC_VER >= 1600
return _InterlockedCompareExchange8(&var->value, newVal, oldVal);
{
uint32 res;
+#if defined VM_ARM_64
+ res = _VMATOM_X(ROP, 32, TRUE, &var->value, orr, val);
+#else
do {
res = Atomic_Read(var);
} while (res != Atomic_ReadIfEqualWrite(var, res, res | val));
+#endif
return res;
}
{
uint32 res;
+#if defined VM_ARM_64
+ res = _VMATOM_X(ROP, 32, TRUE, &var->value, and, val);
+#else
do {
res = Atomic_Read(var);
} while (res != Atomic_ReadIfEqualWrite(var, res, res & val));
+#endif
return res;
}
{
uint64 res;
+#if defined VM_ARM_64
+ res = _VMATOM_X(ROP, 64, TRUE, &var->value, orr, val);
+#else
do {
res = var->value;
} while (res != Atomic_ReadIfEqualWrite64(var, res, res | val));
+#endif
return res;
}
{
uint64 res;
+#if defined VM_ARM_64
+ res = _VMATOM_X(ROP, 64, TRUE, &var->value, and, val);
+#else
do {
res = var->value;
} while (res != Atomic_ReadIfEqualWrite64(var, res, res & val));
+#endif
return res;
}
Atomic_ReadSub64(Atomic_uint64 *var, // IN/OUT
uint64 val) // IN
{
+#if defined VM_ARM_64
+ return _VMATOM_X(ROP, 64, TRUE, &var->value, sub, val);
+#else
return Atomic_ReadAdd64(var, -val);
+#endif
}
{
uint16 res;
+#if defined VM_ARM_64
+ res = _VMATOM_X(ROP, 16, TRUE, &var->value, orr, val);
+#else
do {
res = var->value;
} while (res != Atomic_ReadIfEqualWrite16(var, res, res | val));
+#endif
return res;
}
return Atomic_ReadAdd16(var, 1);
}
-/*
+/*
*----------------------------------------------------------------------
*
* Atomic_ReadDec16 --