vk: Make anv_cmd_buffer_begin_subpass() switch on gen
[mesa.git] / src / util / u_atomic.h
index e123e171d301939eb5776a8fe182961463852c75..e38395ac63368b479437e3c46de7f2023659ccba 100644 (file)
@@ -6,6 +6,8 @@
  *
  */
 
+#include "no_extern_c.h"
+
 #ifndef U_ATOMIC_H
 #define U_ATOMIC_H
 
 
 #if _MSC_VER < 1600
 
-/* Implement _InterlockedCompareExchange8 in terms of InterlockedCompareExchange16 */
-static __inline
-char _InterlockedCompareExchange8(char volatile *Destination8, char Exchange8, char Comparand8)
+/* Implement _InterlockedCompareExchange8 in terms of _InterlockedCompareExchange16 */
+static __inline char
+_InterlockedCompareExchange8(char volatile *destination8, char exchange8, char comparand8)
 {
-   INT_PTR DestinationAddr = (INT_PTR)Destination8;
-   short volatile *Destination16 = (short volatile *)(DestinationAddr & ~1);
-   const short Shift8 = (DestinationAddr & 1) * 8;
-   const short Mask8 = 0xff << Shift8;
-   short Initial16 = *Destination16;
-   char Initial8 = Initial16 >> Shift8;
-   while (Initial8 == Comparand8) {
-      /* initial *Destination8 matches, so try exchange it while keeping the
+   INT_PTR destinationAddr = (INT_PTR)destination8;
+   short volatile *destination16 = (short volatile *)(destinationAddr & ~1);
+   const short shift8 = (destinationAddr & 1) * 8;
+   const short mask8 = 0xff << shift8;
+   short initial16 = *destination16;
+   char initial8 = initial16 >> shift8;
+   while (initial8 == comparand8) {
+      /* initial *destination8 matches, so try exchange it while keeping the
        * neighboring byte untouched */
-      short Exchange16 = (Initial16 & ~Mask8) | ((short)Exchange8 << Shift8);
-      short Comparand16 = Initial16;
-      short Initial16 = InterlockedCompareExchange16(Destination16, Exchange16, Comparand16);
-      if (Initial16 == Comparand16) {
+      short exchange16 = (initial16 & ~mask8) | ((short)exchange8 << shift8);
+      short comparand16 = initial16;
+      short initial16 = _InterlockedCompareExchange16(destination16, exchange16, comparand16);
+      if (initial16 == comparand16) {
          /* succeeded */
-         return Comparand8;
+         return comparand8;
       }
       /* something changed, retry with the new initial value */
-      Initial8 = Initial16 >> Shift8;
+      initial8 = initial16 >> shift8;
    }
-   return Initial8;
+   return initial8;
+}
+
+/* Implement _InterlockedExchangeAdd16 in terms of _InterlockedCompareExchange16 */
+static __inline short
+_InterlockedExchangeAdd16(short volatile *addend, short value)
+{
+   short initial = *addend;
+   short comparand;
+   do {
+      short exchange = initial + value;
+      comparand = initial;
+      /* if *addend==comparand then *addend=exchange, return original *addend */
+      initial = _InterlockedCompareExchange16(addend, exchange, comparand);
+   } while(initial != comparand);
+   return comparand;
+}
+
+/* Implement _InterlockedExchangeAdd8 in terms of _InterlockedCompareExchange8 */
+static __inline char
+_InterlockedExchangeAdd8(char volatile *addend, char value)
+{
+   char initial = *addend;
+   char comparand;
+   do {
+      char exchange = initial + value;
+      comparand = initial;
+      initial = _InterlockedCompareExchange8(addend, exchange, comparand);
+   } while(initial != comparand);
+   return comparand;
 }
 
 #endif /* _MSC_VER < 1600 */
@@ -186,7 +217,7 @@ char _InterlockedCompareExchange8(char volatile *Destination8, char Exchange8, c
    sizeof(*v) == sizeof(uint64_t) ? atomic_inc_64((uint64_t *)(v)) : \
                                     (assert(!"should not get here"), 0))
 
-#define p_atomic_inc_return(v) ((typeof(*v)) \
+#define p_atomic_inc_return(v) ((__typeof(*v)) \
    sizeof(*v) == sizeof(uint8_t)  ? atomic_inc_8_nv ((uint8_t  *)(v)) : \
    sizeof(*v) == sizeof(uint16_t) ? atomic_inc_16_nv((uint16_t *)(v)) : \
    sizeof(*v) == sizeof(uint32_t) ? atomic_inc_32_nv((uint32_t *)(v)) : \
@@ -200,7 +231,7 @@ char _InterlockedCompareExchange8(char volatile *Destination8, char Exchange8, c
    sizeof(*v) == sizeof(uint64_t) ? atomic_dec_64((uint64_t *)(v)) : \
                                     (assert(!"should not get here"), 0))
 
-#define p_atomic_dec_return(v) ((typeof(*v)) \
+#define p_atomic_dec_return(v) ((__typeof(*v)) \
    sizeof(*v) == sizeof(uint8_t)  ? atomic_dec_8_nv ((uint8_t  *)(v)) : \
    sizeof(*v) == sizeof(uint16_t) ? atomic_dec_16_nv((uint16_t *)(v)) : \
    sizeof(*v) == sizeof(uint32_t) ? atomic_dec_32_nv((uint32_t *)(v)) : \
@@ -214,7 +245,7 @@ char _InterlockedCompareExchange8(char volatile *Destination8, char Exchange8, c
    sizeof(*v) == sizeof(uint64_t) ? atomic_add_64((uint64_t *)(v), (i)) : \
                                     (assert(!"should not get here"), 0))
 
-#define p_atomic_cmpxchg(v, old, _new) ((typeof(*v)) \
+#define p_atomic_cmpxchg(v, old, _new) ((__typeof(*v)) \
    sizeof(*v) == sizeof(uint8_t)  ? atomic_cas_8 ((uint8_t  *)(v), (uint8_t )(old), (uint8_t )(_new)) : \
    sizeof(*v) == sizeof(uint16_t) ? atomic_cas_16((uint16_t *)(v), (uint16_t)(old), (uint16_t)(_new)) : \
    sizeof(*v) == sizeof(uint32_t) ? atomic_cas_32((uint32_t *)(v), (uint32_t)(old), (uint32_t)(_new)) : \