2
3
13#include "../c89atomic.c"
15#include "../extras/c89atomic_deque.c"
16#include "../extras/c89atomic_bitmap_allocator.c"
18#if defined(__clang__
) || (defined(__GNUC__
) && (__GNUC__
> 4
|| (__GNUC__
== 4
&& __GNUC_MINOR__
>= 6
)))
19 #pragma GCC diagnostic push
20 #pragma GCC diagnostic ignored "-Wlong-long"
21 #if defined(__clang__
)
22 #pragma GCC diagnostic ignored "-Wc++11-long-long"
26#if defined(_MSC_VER) || defined(__BORLANDC__)
27 #define C89ATOMIC_ULL(x) (c89atomic_uint64)(x##i64)
29 #define C89ATOMIC_ULL(x) (c89atomic_uint64)(x##ULL)
35#ifndef ENABLE_VIRTUAL_TERMINAL_PROCESSING
36#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004
39static void enable_colored_output(
void)
44 hOut = GetStdHandle(STD_OUTPUT_HANDLE);
45 if (hOut == INVALID_HANDLE_VALUE) {
49 if (!GetConsoleMode(hOut, &mode)) {
53 SetConsoleMode(hOut, mode | ENABLE_VIRTUAL_TERMINAL_PROCESSING);
56static void enable_colored_output(
void)
68static int g_ErrorCount = 0;
70const char* c89atomic_memory_order_to_string(c89atomic_memory_order order)
82 return "[unknown memory order]";
86void c89atomic_test_passed(
void)
88 printf(
"\033[32mPASSED\033[0m\n");
91void c89atomic_test_failed(
void)
93 printf(
"\033[31mFAILED\033[0m\n");
98#define c89atomic_test__basic__flag_test_and_set_explicit(order) \
99{
100 printf(" %-*s", PRINT_WIDTH, c89atomic_memory_order_to_string(order));
102 c89atomic_flag a = 0
;
103 c89atomic_flag b = 0
;
104 c89atomic_flag r = c89atomic_flag_test_and_set_explicit
(&b, order);
105 if (a == r && b == 1
) {
106 c89atomic_test_passed();
108 c89atomic_test_failed();
111}
113void c89atomic_test__basic__flag_test_and_set(
void)
115 printf(
"c89atomic_flag_test_and_set():\n");
127#define c89atomic_test__basic__flag_clear_explicit(order) \
128{
129 printf(" %-*s", PRINT_WIDTH, c89atomic_memory_order_to_string(order));
131 c89atomic_flag a = 1
;
132 c89atomic_flag_clear_explicit
(&a, order);
134 c89atomic_test_passed();
136 c89atomic_test_failed();
139}
141void c89atomic_test__basic__flag_clear(
void)
143 printf(
"c89atomic_flag_clear():\n");
152#define c89atomic_test__basic__flag_load_explicit(order) \
153{
154 printf(" %-*s", PRINT_WIDTH, c89atomic_memory_order_to_string(order));
156 c89atomic_flag a = 42
;
157 c89atomic_flag b = c89atomic_flag_load_explicit
(&a, order);
159 c89atomic_test_passed();
161 c89atomic_test_failed();
164}
166void c89atomic_test__basic__flag_load(
void)
168 printf(
"c89atomic_flag_load():\n");
181#define c89atomic_test__basic_load_explicit(sizeInBits, src, order) \
182{
183 printf(" %-*s", PRINT_WIDTH, c89atomic_memory_order_to_string(order));
185 c89atomic_uint##sizeInBits a = src;
186 c89atomic_uint##sizeInBits b = c89atomic_load_explicit_##sizeInBits(&a, order);
188 c89atomic_test_passed();
190 c89atomic_test_failed();
193}
195#define c89atomic_test__basic_load_n(sizeInBits, src) \
196{
197 printf("c89atomic_load_%d():\n", sizeInBits);
204}
206void c89atomic_test__basic__load(
void)
216#define c89atomic_test__basic_store_explicit(sizeInBits, src, order) \
217{
218 printf(" %-*s", PRINT_WIDTH, c89atomic_memory_order_to_string(order));
220 c89atomic_uint##sizeInBits a = OLD_VAL;
221 c89atomic_uint##sizeInBits b = src;
222 c89atomic_store_explicit_##sizeInBits(&a, b, order);
224 c89atomic_test_passed();
226 c89atomic_test_failed();
229}
231#define c89atomic_test__basic_store_n(sizeInBits, src) \
232{
233 printf("c89atomic_store_%d():\n", sizeInBits);
240}
242void c89atomic_test__basic__store(
void)
252#define c89atomic_test__basic_exchange_explicit(sizeInBits, src, order) \
253{
254 printf(" %-*s", PRINT_WIDTH, c89atomic_memory_order_to_string(order));
256 c89atomic_uint##sizeInBits a = OLD_VAL;
257 c89atomic_uint##sizeInBits b = OLD_VAL;
258 c89atomic_uint##sizeInBits c = src;
259 c89atomic_uint##sizeInBits r = c89atomic_exchange_explicit_##sizeInBits(&b, c, order);
260 if (r == a && b == c) {
261 c89atomic_test_passed();
263 c89atomic_test_failed();
266}
268#define c89atomic_test__basic_exchange_n(sizeInBits, src) \
269{
270 printf("c89atomic_exchange_%d():\n", sizeInBits);
277}
279void c89atomic_test__basic__exchange(
void)
289#define c89atomic_test__basic_compare_exchange_strong_explicit(sizeInBits, src, orderSuccess, orderFailure) \
290{
291 printf(" %s, %s ", c89atomic_memory_order_to_string(orderSuccess), c89atomic_memory_order_to_string(orderFailure));
293 c89atomic_uint##sizeInBits a = OLD_VAL;
294 c89atomic_uint##sizeInBits b = OLD_VAL;
295 c89atomic_uint##sizeInBits c = src;
296 c89atomic_bool r = c89atomic_compare_exchange_strong_explicit_##sizeInBits(&a, &b, c, orderSuccess, orderFailure);
297 if (a == c && b == OLD_VAL && r == 1
) {
300 b = (c89atomic_uint##sizeInBits)(a + 1
);
301 r = c89atomic_compare_exchange_strong_explicit_##sizeInBits(&a, &b, c, orderSuccess, orderFailure);
303 c89atomic_test_passed();
305 c89atomic_test_failed();
308 c89atomic_test_failed();
311}
313#define c89atomic_test__basic_compare_exchange_strong_n(sizeInBits, src) \
314{
315 printf("c89atomic_compare_exchange_%d():\n", sizeInBits);
322}
324void c89atomic_test__basic__compare_exchange_strong(
void)
334#define c89atomic_test__basic_compare_exchange_weak_explicit(sizeInBits, src, orderSuccess, orderFailure) \
335{
336 printf(" %s, %s ", c89atomic_memory_order_to_string(orderSuccess), c89atomic_memory_order_to_string(orderFailure));
338 c89atomic_uint##sizeInBits a = OLD_VAL;
339 c89atomic_uint##sizeInBits b = OLD_VAL;
340 c89atomic_uint##sizeInBits c = src;
341 c89atomic_bool r = c89atomic_compare_exchange_weak_explicit_##sizeInBits(&a, &b, c, orderSuccess, orderFailure);
342 if (a == c && b == OLD_VAL && r == 1
) {
345 b = (c89atomic_uint##sizeInBits)(a + 1
);
346 r = c89atomic_compare_exchange_weak_explicit_##sizeInBits(&a, &b, c, orderSuccess, orderFailure);
348 c89atomic_test_passed();
350 c89atomic_test_failed();
353 c89atomic_test_failed();
356}
358#define c89atomic_test__basic_compare_exchange_weak_n(sizeInBits, src) \
359{
360 printf("c89atomic_compare_exchange_weak_%d():\n", sizeInBits);
367}
369void c89atomic_test__basic__compare_exchange_weak(
void)
379#define c89atomic_test__basic_fetch_add_explicit(sizeInBits, src, order) \
380{
381 printf(" %-*s", PRINT_WIDTH, c89atomic_memory_order_to_string(order));
383 c89atomic_uint##sizeInBits a = OLD_VAL;
384 c89atomic_uint##sizeInBits b = a;
385 c89atomic_uint##sizeInBits c = src;
386 c89atomic_uint##sizeInBits r = c89atomic_fetch_add_explicit_##sizeInBits(&a, c, order);
387 if (r == b && a == (b + c)) {
388 c89atomic_test_passed();
390 c89atomic_test_failed();
393}
395#define c89atomic_test__basic_fetch_add_n(sizeInBits, src) \
396{
397 printf("c89atomic_fetch_add_%d():\n", sizeInBits);
404}
406void c89atomic_test__basic__fetch_add(
void)
416#define c89atomic_test__basic_fetch_sub_explicit(sizeInBits, src, order) \
417{
418 printf(" %-*s", PRINT_WIDTH, c89atomic_memory_order_to_string(order));
420 c89atomic_uint##sizeInBits a = OLD_VAL;
421 c89atomic_uint##sizeInBits b = a;
422 c89atomic_uint##sizeInBits c = src;
423 c89atomic_uint##sizeInBits r = c89atomic_fetch_sub_explicit_##sizeInBits(&a, c, order);
424 if (r == b && a == (c89atomic_uint##sizeInBits)(b - c)) {
425 c89atomic_test_passed();
427 c89atomic_test_failed();
430}
432#define c89atomic_test__basic_fetch_sub_n(sizeInBits, src) \
433{
434 printf("c89atomic_fetch_sub_%d():\n", sizeInBits);
441}
443void c89atomic_test__basic__fetch_sub(
void)
453#define c89atomic_test__basic_fetch_or_explicit(sizeInBits, src, order) \
454{
455 printf(" %-*s", PRINT_WIDTH, c89atomic_memory_order_to_string(order));
457 c89atomic_uint##sizeInBits a = OLD_VAL;
458 c89atomic_uint##sizeInBits b = a;
459 c89atomic_uint##sizeInBits c = src;
460 c89atomic_uint##sizeInBits r = c89atomic_fetch_or_explicit_##sizeInBits(&a, c, order);
461 if (r == b && a == (c89atomic_uint##sizeInBits)(b | c)) {
462 c89atomic_test_passed();
464 c89atomic_test_failed();
467}
469#define c89atomic_test__basic_fetch_or_n(sizeInBits, src) \
470{
471 printf("c89atomic_fetch_or_%d():\n", sizeInBits);
478}
480void c89atomic_test__basic__fetch_or(
void)
490#define c89atomic_test__basic_fetch_xor_explicit(sizeInBits, src, order) \
491{
492 printf(" %-*s", PRINT_WIDTH, c89atomic_memory_order_to_string(order));
494 c89atomic_uint##sizeInBits a = OLD_VAL;
495 c89atomic_uint##sizeInBits b = a;
496 c89atomic_uint##sizeInBits c = src;
497 c89atomic_uint##sizeInBits r = c89atomic_fetch_xor_explicit_##sizeInBits(&a, c, order);
498 if (r == b && a == (c89atomic_uint##sizeInBits)(b ^ c)) {
499 c89atomic_test_passed();
501 c89atomic_test_failed();
504}
506#define c89atomic_test__basic_fetch_xor_n(sizeInBits, src) \
507{
508 printf("c89atomic_fetch_xor_%d():\n", sizeInBits);
515}
517void c89atomic_test__basic__fetch_xor(
void)
527#define c89atomic_test__basic_fetch_and_explicit(sizeInBits, src, order) \
528{
529 printf(" %-*s", PRINT_WIDTH, c89atomic_memory_order_to_string(order));
531 c89atomic_uint##sizeInBits a = OLD_VAL;
532 c89atomic_uint##sizeInBits b = a;
533 c89atomic_uint##sizeInBits c = src;
534 c89atomic_uint##sizeInBits r = c89atomic_fetch_and_explicit_##sizeInBits(&a, c, order);
535 if (r == b && a == (c89atomic_uint##sizeInBits)(b & c)) {
536 c89atomic_test_passed();
538 c89atomic_test_failed();
541}
543#define c89atomic_test__basic_fetch_and_n(sizeInBits, src) \
544{
545 printf("c89atomic_fetch_and_%d():\n", sizeInBits);
552}
554void c89atomic_test__basic__fetch_and(
void)
564#define c89atomic_test__basic_compare_and_swap_explicit(sizeInBits, src) \
565{
566 printf("c89atomic_compare_and_swap_%d() ", sizeInBits); printf("%*s", (int)(sizeInBits == 8
), "");
568 c89atomic_uint##sizeInBits a = OLD_VAL;
569 c89atomic_uint##sizeInBits b = a;
570 c89atomic_uint##sizeInBits c = src;
571 c89atomic_uint##sizeInBits r = c89atomic_compare_and_swap_##sizeInBits(&a, b, c);
572 if (a == c && r == b) {
575 b = (c89atomic_uint##sizeInBits)(a + 1
);
576 r = c89atomic_compare_and_swap_##sizeInBits(&a, b, c);
578 c89atomic_test_passed();
580 c89atomic_test_failed();
583 c89atomic_test_failed();
586}
588void c89atomic_test__basic__compare_and_swap(
void)
598#define C89ATOMIC_CHECK_SIZEOF(type, size) \
599{
600 printf("sizeof(%s)%*.s== %d ", #type, 17
- (int)strlen(#type), "", size);
601 if (sizeof(type) != size) {
602 c89atomic_test_failed();
604 c89atomic_test_passed();
606}
608static void c89atomic_test__basic__sizeof(
void)
622int main(
int argc,
char** argv)
624 enable_colored_output();
627 c89atomic_test__basic__sizeof();
628 if (g_ErrorCount > 0) {
629 printf(
"Tests cannot continue because the size of one or more basic types are not valid.\n");
633 c89atomic_test__basic__flag_test_and_set();
634 c89atomic_test__basic__flag_clear();
635 c89atomic_test__basic__flag_load();
636 c89atomic_test__basic__load();
637 c89atomic_test__basic__store();
638 c89atomic_test__basic__exchange();
639 c89atomic_test__basic__compare_exchange_strong();
640 c89atomic_test__basic__compare_exchange_weak();
641 c89atomic_test__basic__fetch_add();
642 c89atomic_test__basic__fetch_sub();
643 c89atomic_test__basic__fetch_or();
644 c89atomic_test__basic__fetch_xor();
645 c89atomic_test__basic__fetch_and();
646 c89atomic_test__basic__compare_and_swap();
648 printf(
"c89atomic_is_lock_free_8 = %s\n", c89atomic_is_lock_free_8(NULL) ?
"\033[32mTRUE\033[0m" :
"\033[31mFALSE\033[0m");
649 printf(
"c89atomic_is_lock_free_16 = %s\n", c89atomic_is_lock_free_16(NULL) ?
"\033[32mTRUE\033[0m" :
"\033[31mFALSE\033[0m");
650 printf(
"c89atomic_is_lock_free_32 = %s\n", c89atomic_is_lock_free_32(NULL) ?
"\033[32mTRUE\033[0m" :
"\033[31mFALSE\033[0m");
651 printf(
"c89atomic_is_lock_free_64 = %s\n", c89atomic_is_lock_free_64(NULL) ?
"\033[32mTRUE\033[0m" :
"\033[31mFALSE\033[0m");
666 c89atomic_uint64 dst = 0;
667 c89atomic_uint64 src = 1;
703 c89atomic_deque_result result;
704 c89atomic_deque deque;
705 void* pValue = (
void*)123456;
707 c89atomic_deque_init(&deque);
711 printf(
"Deque Take Tail (Empty): ");
712 result = c89atomic_deque_take_tail(&deque, &pValue);
713 if (result == C89ATOMIC_DEQUE_NO_DATA_AVAILABLE) {
714 c89atomic_test_passed();
716 c89atomic_test_failed();
719 printf(
"Deque Take Head (Empty): ");
720 result = c89atomic_deque_take_head(&deque, &pValue);
721 if (result == C89ATOMIC_DEQUE_NO_DATA_AVAILABLE) {
722 c89atomic_test_passed();
724 c89atomic_test_failed();
727 printf(
"Deque Push Tail: ");
728 result = c89atomic_deque_push_tail(&deque, (
void*)1);
729 if (result == C89ATOMIC_DEQUE_SUCCESS) {
730 result = c89atomic_deque_push_tail(&deque, (
void*)2);
731 if (result == C89ATOMIC_DEQUE_SUCCESS) {
732 result = c89atomic_deque_push_tail(&deque, (
void*)3);
733 if (result == C89ATOMIC_DEQUE_SUCCESS) {
734 c89atomic_test_passed();
736 c89atomic_test_failed();
739 c89atomic_test_failed();
742 c89atomic_test_failed();
747 printf(
"Deque Take Tail: ");
748 result = c89atomic_deque_take_tail(&deque, &pValue);
749 if (result == C89ATOMIC_DEQUE_SUCCESS && pValue == (
void*)3) {
750 c89atomic_test_passed();
752 c89atomic_test_failed();
756 printf(
"Deque Take Head: ");
757 result = c89atomic_deque_take_head(&deque, &pValue);
758 if (result == C89ATOMIC_DEQUE_SUCCESS && pValue == (
void*)1) {
759 c89atomic_test_passed();
761 c89atomic_test_failed();
765 printf(
"Deque Take Tail (Last): ");
766 result = c89atomic_deque_take_tail(&deque, &pValue);
767 if (result == C89ATOMIC_DEQUE_SUCCESS && pValue == (
void*)2) {
768 c89atomic_test_passed();
770 c89atomic_test_failed();
774 printf(
"Deque Empty: ");
775 if (deque.head == deque.tail) {
776 c89atomic_test_passed();
778 c89atomic_test_failed();
782 printf(
"Deque Take Head (Last): ");
783 result = c89atomic_deque_push_tail(&deque, (
void*)4);
784 if (result == C89ATOMIC_DEQUE_SUCCESS) {
785 result = c89atomic_deque_take_head(&deque, &pValue);
786 if (result == C89ATOMIC_DEQUE_SUCCESS && pValue == (
void*)4) {
787 c89atomic_test_passed();
789 c89atomic_test_failed();
792 c89atomic_test_failed();
795 printf(
"Deque Empty: ");
796 if (deque.head == deque.tail) {
797 c89atomic_test_passed();
799 c89atomic_test_failed();
806 c89atomic_bitmap_allocator_result result;
807 c89atomic_uint32 bitmap[2];
808 c89atomic_bitmap_allocator allocator;
810 size_t allocIndex = 1234;
811 c89atomic_bool success = 1;
813 c89atomic_bitmap_allocator_init(bitmap,
sizeof(bitmap) * 8, &allocator);
816 printf(
"Bitmap Allocator Alloc: ");
817 for (i = 0; i <
sizeof(bitmap) * 8; i += 1) {
818 result = c89atomic_bitmap_allocator_alloc(&allocator, &allocIndex);
819 if (result != C89ATOMIC_BITMAP_ALLOCATOR_SUCCESS) {
820 c89atomic_test_failed();
825 if (allocIndex != i) {
826 c89atomic_test_failed();
833 c89atomic_test_passed();
836 printf(
"Bitmap Allocator No Mem: ");
837 result = c89atomic_bitmap_allocator_alloc(&allocator, &allocIndex);
838 if (result == C89ATOMIC_BITMAP_ALLOCATOR_OUT_OF_MEMORY) {
839 c89atomic_test_passed();
841 c89atomic_test_failed();
844 printf(
"Bitmap Allocator Free: ");
845 c89atomic_bitmap_allocator_free(&allocator, 34);
846 result = c89atomic_bitmap_allocator_alloc(&allocator, &allocIndex);
847 if (result == C89ATOMIC_BITMAP_ALLOCATOR_SUCCESS && allocIndex == 34) {
848 c89atomic_test_passed();
850 c89atomic_test_failed();
860 printf(
"Compiler: ");
861 #if defined(__clang__
)
862 printf(
"Clang %d.%d\n", __clang_major__, __clang_minor__);
863 #elif defined(__GNUC__)
864 printf(
"GCC %d.%d\n", __GNUC__, __GNUC_MINOR__);
865 #elif defined(_MSC_VER)
866 printf(
"MSVC %d\n", _MSC_VER);
867 #elif defined(__TINYC__)
868 printf(
"TinyCC %d\n", __TINYC__);
869 #elif defined(__WATCOMC__)
870 printf(
"Watcom %d.%d\n", __WATCOMC__ / 100, (__WATCOMC__ - (__WATCOMC__ / 100)) / 10);
871 #elif defined(__DMC__)
872 printf(
"Digital Mars %d\n", __DMC__);
873 #elif defined(__BORLANDC__)
874 printf(
"Borland C++ %d\n", __BORLANDC__);
879 printf(
"Architecture: ");
880 #if defined(C89ATOMIC_X64
)
883 #if defined(C89ATOMIC_X86)
885 #if defined(__GNUC__)
886 #if !defined(__i486__)
888 #elif !defined(__i586__)
890 #elif !defined(__i686__)
891 printf(
" (i586+)\n");
895 #elif defined(_M_IX86)
901 printf(
" (i586+)\n");
909 #if defined(C89ATOMIC_ARM64)
912 #if defined(C89ATOMIC_ARM32)
915 #if defined(C89ATOMIC_PPC64)
916 printf(
"PowerPC64\n");
918 #if defined(C89ATOMIC_PPC32)
922 printf(
"Code Path: ");
923 #if defined(C89ATOMIC_MODERN_GCC
)
924 printf(
"GCC __atomic* intrinsics\n");
925 #elif defined(C89ATOMIC_LEGACY_GCC)
926 printf(
"GCC __sync* intrinsics\n");
927 #elif defined(C89ATOMIC_LEGACY_GCC_ASM)
928 printf(
"GCC inlined assembly\n");
929 #elif defined(C89ATOMIC_MODERN_MSVC)
930 printf(
"MSVC _Interlocked* intrinsics\n");
931 #elif defined(C89ATOMIC_LEGACY_MSVC)
932 printf(
"MSVC _Interlocked* intrinsics (no lock-free 8/16 bit)\n");
933 #elif defined(C89ATOMIC_LEGACY_MSVC_ASM)
934 printf(
"MSVC inlined assembly\n");
937 if (g_ErrorCount > 0) {
938 printf(
"\033[31m%d test(s) failed.\033[0m\n", g_ErrorCount);
946#if defined(__clang__
) || (defined(__GNUC__
) && (__GNUC__
> 4
|| (__GNUC__
== 4
&& __GNUC_MINOR__
>= 6
)))
947 #pragma GCC diagnostic pop
#define c89atomic_memory_order_release
#define c89atomic_memory_order_seq_cst
#define c89atomic_memory_order_acquire
#define c89atomic_exchange_f64(dst, src)
#define c89atomic_signal_fence(order)
#define c89atomic_memory_order_relaxed
#define c89atomic_exchange_f32(dst, src)
#define c89atomic_memory_order_consume
#define c89atomic_exchange_64(dst, src)
#define c89atomic_exchange_ptr(dst, src)
#define c89atomic_load_f32(ptr)
#define c89atomic_memory_order_acq_rel
#define c89atomic_load_f64(ptr)
#define c89atomic_exchange_i32(dst, src)
#define c89atomic_compare_exchange_strong_ptr(dst, expected, replacement)
#define c89atomic_test__basic_compare_exchange_weak_n(sizeInBits, src)
#define c89atomic_test__basic_fetch_or_explicit(sizeInBits, src, order)
#define c89atomic_test__basic_fetch_or_n(sizeInBits, src)
#define c89atomic_test__basic_compare_exchange_strong_explicit(sizeInBits, src, orderSuccess, orderFailure)
#define c89atomic_test__basic_compare_exchange_strong_n(sizeInBits, src)
#define c89atomic_test__basic_fetch_xor_explicit(sizeInBits, src, order)
#define c89atomic_test__basic_fetch_add_explicit(sizeInBits, src, order)
#define c89atomic_test__basic__flag_load_explicit(order)
#define C89ATOMIC_CHECK_SIZEOF(type, size)
#define c89atomic_test__basic_compare_exchange_weak_explicit(sizeInBits, src, orderSuccess, orderFailure)
#define c89atomic_test__basic_fetch_and_explicit(sizeInBits, src, order)
#define c89atomic_test__basic_store_explicit(sizeInBits, src, order)
#define c89atomic_test__basic__flag_test_and_set_explicit(order)
#define c89atomic_test__basic_fetch_sub_n(sizeInBits, src)
#define c89atomic_test__basic_compare_and_swap_explicit(sizeInBits, src)
#define c89atomic_test__basic_fetch_and_n(sizeInBits, src)
#define c89atomic_test__basic_fetch_xor_n(sizeInBits, src)
#define c89atomic_test__basic__flag_clear_explicit(order)
#define c89atomic_test__basic_load_explicit(sizeInBits, src, order)
#define c89atomic_test__basic_load_n(sizeInBits, src)
#define c89atomic_test__basic_fetch_sub_explicit(sizeInBits, src, order)
#define c89atomic_test__basic_exchange_n(sizeInBits, src)
#define c89atomic_test__basic_store_n(sizeInBits, src)
#define c89atomic_test__basic_fetch_add_n(sizeInBits, src)
#define c89atomic_test__basic_exchange_explicit(sizeInBits, src, order)