/*********************************************************
- * Copyright (C) 1998-2020 VMware, Inc. All rights reserved.
+ * Copyright (C) 1998-2021 VMware, Inc. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published
*
* Note: Only partially tested on ARM processors: Works for View Open
* Client, which shouldn't have threads, and ARMv8 processors.
- *
- * In ARM, GCC intrinsics (__sync*) compile but might not
- * work, while MS intrinsics (_Interlocked*) do not compile.
*/
#ifndef _ATOMIC_H_
#if defined __GNUC__ && defined VM_ARM_32
val = AtomicUndefined(var);
-#elif defined VM_ARM_64
+#elif defined __GNUC__ && defined VM_ARM_64
val = _VMATOM_X(R, 8, &var->value);
#elif defined __GNUC__ && (defined __i386__ || defined __x86_64__)
__asm__ __volatile__(
{
#if defined __GNUC__ && defined VM_ARM_32
return AtomicUndefined(var + val);
-#elif defined VM_ARM_64
+#elif defined __GNUC__ && defined VM_ARM_64
return _VMATOM_X(RW, 8, TRUE, &var->value, val);
#elif defined __GNUC__ && (defined __i386__ || defined __x86_64__)
__asm__ __volatile__(
{
#if defined __GNUC__ && defined VM_ARM_32
AtomicUndefined(var + val);
-#elif defined VM_ARM_64
+#elif defined __GNUC__ && defined VM_ARM_64
_VMATOM_X(W, 8, &var->value, val);
#elif defined __GNUC__ && (defined __i386__ || defined __x86_64__)
__asm__ __volatile__(
{
#if defined __GNUC__ && defined VM_ARM_32
return AtomicUndefined(var + oldVal + newVal);
-#elif defined VM_ARM_64
+#elif defined __GNUC__ && defined VM_ARM_64
return _VMATOM_X(RIFEQW, 8, TRUE, &var->value, oldVal, newVal);
#elif defined __GNUC__ && (defined __i386__ || defined __x86_64__)
uint8 val;
{
uint8 res;
-#if defined VM_ARM_64
+#if defined __GNUC__ && defined VM_ARM_64
res = _VMATOM_X(ROP, 8, TRUE, &var->value, and, val);
#else
do {
Atomic_And8(Atomic_uint8 *var, // IN/OUT
uint8 val) // IN
{
-#if defined VM_ARM_64
+#if defined __GNUC__ && defined VM_ARM_64
_VMATOM_X(OP, 8, TRUE, &var->value, and, val);
#else
(void)Atomic_ReadAnd8(var, val);
{
uint8 res;
-#if defined VM_ARM_64
+#if defined __GNUC__ && defined VM_ARM_64
res = _VMATOM_X(ROP, 8, TRUE, &var->value, orr, val);
#else
do {
Atomic_Or8(Atomic_uint8 *var, // IN/OUT
uint8 val) // IN
{
-#if defined VM_ARM_64
+#if defined __GNUC__ && defined VM_ARM_64
_VMATOM_X(OP, 8, TRUE, &var->value, orr, val);
#else
(void)Atomic_ReadOr8(var, val);
{
uint8 res;
-#if defined VM_ARM_64
+#if defined __GNUC__ && defined VM_ARM_64
res = _VMATOM_X(ROP, 8, TRUE, &var->value, eor, val);
#else
do {
Atomic_Xor8(Atomic_uint8 *var, // IN/OUT
uint8 val) // IN
{
-#if defined VM_ARM_64
+#if defined __GNUC__ && defined VM_ARM_64
_VMATOM_X(OP, 8, TRUE, &var->value, eor, val);
#else
(void)Atomic_ReadXor8(var, val);
{
uint8 res;
-#if defined VM_ARM_64
+#if defined __GNUC__ && defined VM_ARM_64
res = _VMATOM_X(ROP, 8, TRUE, &var->value, add, val);
#else
do {
Atomic_Add8(Atomic_uint8 *var, // IN/OUT
uint8 val) // IN
{
-#if defined VM_ARM_64
+#if defined __GNUC__ && defined VM_ARM_64
_VMATOM_X(OP, 8, TRUE, &var->value, add, val);
#else
(void)Atomic_ReadAdd8(var, val);
Atomic_Sub8(Atomic_uint8 *var, // IN/OUT
uint8 val) // IN
{
-#if defined VM_ARM_64
+#if defined __GNUC__ && defined VM_ARM_64
_VMATOM_X(OP, 8, TRUE, &var->value, sub, val);
#else
Atomic_Add8(var, -val);
{
uint32 res;
-#if defined VM_ARM_64
+#if defined __GNUC__ && defined VM_ARM_64
res = _VMATOM_X(ROP, 32, TRUE, &var->value, orr, val);
#else
do {
{
uint32 res;
-#if defined VM_ARM_64
+#if defined __GNUC__ && defined VM_ARM_64
res = _VMATOM_X(ROP, 32, TRUE, &var->value, and, val);
#else
do {
{
uint64 res;
-#if defined VM_ARM_64
+#if defined __GNUC__ && defined VM_ARM_64
res = _VMATOM_X(ROP, 64, TRUE, &var->value, orr, val);
#else
do {
{
uint64 res;
-#if defined VM_ARM_64
+#if defined __GNUC__ && defined VM_ARM_64
res = _VMATOM_X(ROP, 64, TRUE, &var->value, and, val);
#else
do {
Atomic_ReadAdd64(Atomic_uint64 *var, // IN/OUT
uint64 val) // IN
{
-#if defined VM_ARM_64
+#if defined __GNUC__ && defined VM_ARM_64
return _VMATOM_X(ROP, 64, TRUE, &var->value, add, val);
#elif defined __x86_64__
Atomic_ReadSub64(Atomic_uint64 *var, // IN/OUT
uint64 val) // IN
{
-#if defined VM_ARM_64
+#if defined __GNUC__ && defined VM_ARM_64
return _VMATOM_X(ROP, 64, TRUE, &var->value, sub, val);
#else
return Atomic_ReadAdd64(var, (uint64)-(int64)val);