#endif
#ifndef uatomic_set
-#define uatomic_set(addr, v) CAA_STORE_SHARED(*(addr), (v))
+#define uatomic_set(addr, v) CMM_STORE_SHARED(*(addr), (v))
#endif
#ifndef uatomic_read
-#define uatomic_read(addr) CAA_LOAD_SHARED(*(addr))
+#define uatomic_read(addr) CMM_LOAD_SHARED(*(addr))
#endif
#if !defined __OPTIMIZE__ || defined UATOMIC_NO_LINK_ERROR
#endif
case 4:
return __sync_val_compare_and_swap_4(addr, old, _new);
-#if (BITS_PER_LONG == 64)
+#if (CAA_BITS_PER_LONG == 64)
case 8:
return __sync_val_compare_and_swap_8(addr, old, _new);
#endif
sizeof(*(addr))))
+/* uatomic_and */
+
+#ifndef uatomic_and
+static inline __attribute__((always_inline))
+void _uatomic_and(void *addr, unsigned long val,
+ int len)
+{
+ switch (len) {
+#ifdef UATOMIC_HAS_ATOMIC_BYTE
+ case 1:
+ __sync_and_and_fetch_1(addr, val);
+#endif
+#ifdef UATOMIC_HAS_ATOMIC_SHORT
+ case 2:
+ __sync_and_and_fetch_2(addr, val);
+#endif
+ case 4:
+ __sync_and_and_fetch_4(addr, val);
+#if (CAA_BITS_PER_LONG == 64)
+ case 8:
+ __sync_and_and_fetch_8(addr, val);
+#endif
+ }
+ _uatomic_link_error();
+ return 0;
+}
+
+#define uatomic_and(addr, v) \
+ (_uatomic_and((addr), \
+ (unsigned long)(v), \
+ sizeof(*(addr))))
+#endif
+
+/* uatomic_or */
+
+#ifndef uatomic_or
+static inline __attribute__((always_inline))
+void _uatomic_or(void *addr, unsigned long val,
+ int len)
+{
+ switch (len) {
+#ifdef UATOMIC_HAS_ATOMIC_BYTE
+ case 1:
+ __sync_or_and_fetch_1(addr, val);
+#endif
+#ifdef UATOMIC_HAS_ATOMIC_SHORT
+ case 2:
+ __sync_or_and_fetch_2(addr, val);
+#endif
+ case 4:
+ __sync_or_and_fetch_4(addr, val);
+#if (CAA_BITS_PER_LONG == 64)
+ case 8:
+ __sync_or_and_fetch_8(addr, val);
+#endif
+ }
+ _uatomic_link_error();
+ return 0;
+}
+
+#define uatomic_or(addr, v) \
+ (_uatomic_or((addr), \
+ (unsigned long)(v), \
+ sizeof(*(addr))))
+#endif
+
/* uatomic_add_return */
#ifndef uatomic_add_return
#endif
case 4:
return __sync_add_and_fetch_4(addr, val);
-#if (BITS_PER_LONG == 64)
+#if (CAA_BITS_PER_LONG == 64)
case 8:
return __sync_add_and_fetch_8(addr, val);
#endif
return old;
}
-#if (BITS_PER_LONG == 64)
+#if (CAA_BITS_PER_LONG == 64)
case 8:
{
unsigned long old;
#else /* #ifndef uatomic_cmpxchg */
+#ifndef uatomic_and
+/* uatomic_and */
+
+static inline __attribute__((always_inline))
+void _uatomic_and(void *addr, unsigned long val, int len)
+{
+ switch (len) {
+#ifdef UATOMIC_HAS_ATOMIC_BYTE
+ case 1:
+ {
+ unsigned char old, oldt;
+
+ oldt = uatomic_read((unsigned char *)addr);
+ do {
+ old = oldt;
+ oldt = _uatomic_cmpxchg(addr, old, old & val, 1);
+ } while (oldt != old);
+ }
+#endif
+#ifdef UATOMIC_HAS_ATOMIC_SHORT
+ case 2:
+ {
+ unsigned short old, oldt;
+
+ oldt = uatomic_read((unsigned short *)addr);
+ do {
+ old = oldt;
+ oldt = _uatomic_cmpxchg(addr, old, old & val, 2);
+ } while (oldt != old);
+ }
+#endif
+ case 4:
+ {
+ unsigned int old, oldt;
+
+ oldt = uatomic_read((unsigned int *)addr);
+ do {
+ old = oldt;
+ oldt = _uatomic_cmpxchg(addr, old, old & val, 4);
+ } while (oldt != old);
+ }
+#if (CAA_BITS_PER_LONG == 64)
+ case 8:
+ {
+ unsigned long old, oldt;
+
+ oldt = uatomic_read((unsigned long *)addr);
+ do {
+ old = oldt;
+ oldt = _uatomic_cmpxchg(addr, old, old & val, 8);
+ } while (oldt != old);
+ }
+#endif
+ }
+ _uatomic_link_error();
+ return 0;
+}
+
+#define uatomic_and(addr, v) \
+ (uatomic_and((addr), \
+ (unsigned long)(v), \
+ sizeof(*(addr))))
+#endif /* #ifndef uatomic_and */
+
+#ifndef uatomic_or
+/* uatomic_or */
+
+static inline __attribute__((always_inline))
+void _uatomic_or(void *addr, unsigned long val, int len)
+{
+ switch (len) {
+#ifdef UATOMIC_HAS_ATOMIC_BYTE
+ case 1:
+ {
+ unsigned char old, oldt;
+
+ oldt = uatomic_read((unsigned char *)addr);
+ do {
+ old = oldt;
+ oldt = _uatomic_cmpxchg(addr, old, old | val, 1);
+ } while (oldt != old);
+ }
+#endif
+#ifdef UATOMIC_HAS_ATOMIC_SHORT
+ case 2:
+ {
+ unsigned short old, oldt;
+
+ oldt = uatomic_read((unsigned short *)addr);
+ do {
+ old = oldt;
+ oldt = _uatomic_cmpxchg(addr, old, old | val, 2);
+ } while (oldt != old);
+ }
+#endif
+ case 4:
+ {
+ unsigned int old, oldt;
+
+ oldt = uatomic_read((unsigned int *)addr);
+ do {
+ old = oldt;
+ oldt = _uatomic_cmpxchg(addr, old, old | val, 4);
+ } while (oldt != old);
+ }
+#if (CAA_BITS_PER_LONG == 64)
+ case 8:
+ {
+ unsigned long old, oldt;
+
+ oldt = uatomic_read((unsigned long *)addr);
+ do {
+ old = oldt;
+ oldt = _uatomic_cmpxchg(addr, old, old | val, 8);
+ } while (oldt != old);
+ }
+#endif
+ }
+ _uatomic_link_error();
+ return 0;
+}
+
+#define uatomic_or(addr, v) \
+ (uatomic_or((addr), \
+ (unsigned long)(v), \
+ sizeof(*(addr))))
+#endif /* #ifndef uatomic_or */
+
#ifndef uatomic_add_return
/* uatomic_add_return */
oldt = uatomic_read((unsigned char *)addr);
do {
old = oldt;
- oldt = _uatomic_cmpxchg(addr, old, old + val, 1);
+ oldt = uatomic_cmpxchg((unsigned char *)addr,
+ old, old + val);
} while (oldt != old);
return old + val;
oldt = uatomic_read((unsigned short *)addr);
do {
old = oldt;
- oldt = _uatomic_cmpxchg(addr, old, old + val, 2);
+ oldt = uatomic_cmpxchg((unsigned short *)addr,
+ old, old + val);
} while (oldt != old);
return old + val;
oldt = uatomic_read((unsigned int *)addr);
do {
old = oldt;
- oldt = _uatomic_cmpxchg(addr, old, old + val, 4);
+ oldt = uatomic_cmpxchg((unsigned int *)addr,
+ old, old + val);
} while (oldt != old);
return old + val;
}
-#if (BITS_PER_LONG == 64)
+#if (CAA_BITS_PER_LONG == 64)
case 8:
{
unsigned long old, oldt;
oldt = uatomic_read((unsigned long *)addr);
do {
old = oldt;
- oldt = _uatomic_cmpxchg(addr, old, old + val, 8);
+ oldt = uatomic_cmpxchg((unsigned long *)addr,
+ old, old + val);
} while (oldt != old);
return old + val;
oldt = uatomic_read((unsigned char *)addr);
do {
old = oldt;
- oldt = _uatomic_cmpxchg(addr, old, val, 1);
+ oldt = uatomic_cmpxchg((unsigned char *)addr,
+ old, val);
} while (oldt != old);
return old;
oldt = uatomic_read((unsigned short *)addr);
do {
old = oldt;
- oldt = _uatomic_cmpxchg(addr, old, val, 2);
+ oldt = uatomic_cmpxchg((unsigned short *)addr,
+ old, val);
} while (oldt != old);
return old;
oldt = uatomic_read((unsigned int *)addr);
do {
old = oldt;
- oldt = _uatomic_cmpxchg(addr, old, val, 4);
+ oldt = uatomic_cmpxchg((unsigned int *)addr,
+ old, val);
} while (oldt != old);
return old;
}
-#if (BITS_PER_LONG == 64)
+#if (CAA_BITS_PER_LONG == 64)
case 8:
{
unsigned long old, oldt;
oldt = uatomic_read((unsigned long *)addr);
do {
old = oldt;
- oldt = _uatomic_cmpxchg(addr, old, val, 8);
+ oldt = uatomic_cmpxchg((unsigned long *)addr,
+ old, val);
} while (oldt != old);
return old;