xref: /freebsd-src/sys/contrib/ck/include/ck_pr.h (revision 74e9b5f29ad0056bbe11a30c91dfa0705fa19cd5)
11fb62fb0SOlivier Houchard /*
21fb62fb0SOlivier Houchard  * Copyright 2009-2015 Samy Al Bahra.
31fb62fb0SOlivier Houchard  * Copyright 2011 David Joseph.
41fb62fb0SOlivier Houchard  * All rights reserved.
51fb62fb0SOlivier Houchard  *
61fb62fb0SOlivier Houchard  * Redistribution and use in source and binary forms, with or without
71fb62fb0SOlivier Houchard  * modification, are permitted provided that the following conditions
81fb62fb0SOlivier Houchard  * are met:
91fb62fb0SOlivier Houchard  * 1. Redistributions of source code must retain the above copyright
101fb62fb0SOlivier Houchard  *    notice, this list of conditions and the following disclaimer.
111fb62fb0SOlivier Houchard  * 2. Redistributions in binary form must reproduce the above copyright
121fb62fb0SOlivier Houchard  *    notice, this list of conditions and the following disclaimer in the
131fb62fb0SOlivier Houchard  *    documentation and/or other materials provided with the distribution.
141fb62fb0SOlivier Houchard  *
151fb62fb0SOlivier Houchard  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
161fb62fb0SOlivier Houchard  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
171fb62fb0SOlivier Houchard  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
181fb62fb0SOlivier Houchard  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
191fb62fb0SOlivier Houchard  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
201fb62fb0SOlivier Houchard  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
211fb62fb0SOlivier Houchard  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
221fb62fb0SOlivier Houchard  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
231fb62fb0SOlivier Houchard  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
241fb62fb0SOlivier Houchard  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
251fb62fb0SOlivier Houchard  * SUCH DAMAGE.
261fb62fb0SOlivier Houchard  */
271fb62fb0SOlivier Houchard 
281fb62fb0SOlivier Houchard #ifndef CK_PR_H
291fb62fb0SOlivier Houchard #define CK_PR_H
301fb62fb0SOlivier Houchard 
311fb62fb0SOlivier Houchard #include <ck_cc.h>
321fb62fb0SOlivier Houchard #include <ck_limits.h>
331fb62fb0SOlivier Houchard #include <ck_md.h>
341fb62fb0SOlivier Houchard #include <ck_stdint.h>
351fb62fb0SOlivier Houchard #include <ck_stdbool.h>
361fb62fb0SOlivier Houchard 
37*74e9b5f2SOlivier Houchard /*
38*74e9b5f2SOlivier Houchard  * Default to using builtins for clang analyzer, coverity, and sparse:
39*74e9b5f2SOlivier Houchard  * inline assembly is often too opaque for useful analysis.  Override
40*74e9b5f2SOlivier Houchard  * the defaults by defining CK_USE_CC_BUILTINS=0 or 1.
41*74e9b5f2SOlivier Houchard  */
42*74e9b5f2SOlivier Houchard #if !defined(CK_USE_CC_BUILTINS)
43*74e9b5f2SOlivier Houchard #if defined(__clang_analyzer__) || defined(__COVERITY__) || defined(__CHECKER__)
44*74e9b5f2SOlivier Houchard #define CK_USE_CC_BUILTINS 1
45*74e9b5f2SOlivier Houchard #else
46*74e9b5f2SOlivier Houchard #define CK_USE_CC_BUILTINS 0
47*74e9b5f2SOlivier Houchard #endif
48*74e9b5f2SOlivier Houchard #endif
49*74e9b5f2SOlivier Houchard 
50*74e9b5f2SOlivier Houchard #if !CK_USE_CC_BUILTINS
511fb62fb0SOlivier Houchard #if defined(__x86_64__)
521fb62fb0SOlivier Houchard #include "gcc/x86_64/ck_pr.h"
531fb62fb0SOlivier Houchard #elif defined(__x86__)
541fb62fb0SOlivier Houchard #include "gcc/x86/ck_pr.h"
551fb62fb0SOlivier Houchard #elif defined(__sparcv9__)
561fb62fb0SOlivier Houchard #include "gcc/sparcv9/ck_pr.h"
571fb62fb0SOlivier Houchard #elif defined(__ppc64__)
581fb62fb0SOlivier Houchard #include "gcc/ppc64/ck_pr.h"
59271ce402SOlivier Houchard #elif defined(__s390x__)
60271ce402SOlivier Houchard #include "gcc/s390x/ck_pr.h"
611fb62fb0SOlivier Houchard #elif defined(__ppc__)
621fb62fb0SOlivier Houchard #include "gcc/ppc/ck_pr.h"
631fb62fb0SOlivier Houchard #elif defined(__arm__)
641fb62fb0SOlivier Houchard #include "gcc/arm/ck_pr.h"
651fb62fb0SOlivier Houchard #elif defined(__aarch64__)
661fb62fb0SOlivier Houchard #include "gcc/aarch64/ck_pr.h"
671fb62fb0SOlivier Houchard #elif !defined(__GNUC__)
681fb62fb0SOlivier Houchard #error Your platform is unsupported
691fb62fb0SOlivier Houchard #endif
701fb62fb0SOlivier Houchard #endif /* !CK_USE_CC_BUILTINS */
711fb62fb0SOlivier Houchard 
721fb62fb0SOlivier Houchard #if defined(__GNUC__)
731fb62fb0SOlivier Houchard #include "gcc/ck_pr.h"
741fb62fb0SOlivier Houchard #endif
751fb62fb0SOlivier Houchard 
761fb62fb0SOlivier Houchard #define CK_PR_FENCE_EMIT(T)			\
771fb62fb0SOlivier Houchard 	CK_CC_INLINE static void		\
781fb62fb0SOlivier Houchard 	ck_pr_fence_##T(void)			\
791fb62fb0SOlivier Houchard 	{					\
801fb62fb0SOlivier Houchard 		ck_pr_fence_strict_##T();	\
811fb62fb0SOlivier Houchard 		return;				\
821fb62fb0SOlivier Houchard 	}
831fb62fb0SOlivier Houchard #define CK_PR_FENCE_NOOP(T)			\
841fb62fb0SOlivier Houchard 	CK_CC_INLINE static void		\
851fb62fb0SOlivier Houchard 	ck_pr_fence_##T(void)			\
861fb62fb0SOlivier Houchard 	{					\
871fb62fb0SOlivier Houchard 		ck_pr_barrier();		\
881fb62fb0SOlivier Houchard 		return;				\
891fb62fb0SOlivier Houchard 	}
901fb62fb0SOlivier Houchard 
911fb62fb0SOlivier Houchard /*
921fb62fb0SOlivier Houchard  * None of the currently supported platforms allow for data-dependent
931fb62fb0SOlivier Houchard  * load ordering.
941fb62fb0SOlivier Houchard  */
951fb62fb0SOlivier Houchard CK_PR_FENCE_NOOP(load_depends)
961fb62fb0SOlivier Houchard #define ck_pr_fence_strict_load_depends ck_pr_fence_load_depends
971fb62fb0SOlivier Houchard 
981fb62fb0SOlivier Houchard /*
991fb62fb0SOlivier Houchard  * In memory models where atomic operations do not have serializing
1001fb62fb0SOlivier Houchard  * effects, atomic read-modify-write operations are modeled as stores.
1011fb62fb0SOlivier Houchard  */
1021fb62fb0SOlivier Houchard #if defined(CK_MD_RMO)
1031fb62fb0SOlivier Houchard /*
1041fb62fb0SOlivier Houchard  * Only stores to the same location have a global
1051fb62fb0SOlivier Houchard  * ordering.
1061fb62fb0SOlivier Houchard  */
CK_PR_FENCE_EMIT(atomic)1071fb62fb0SOlivier Houchard CK_PR_FENCE_EMIT(atomic)
1081fb62fb0SOlivier Houchard CK_PR_FENCE_EMIT(atomic_load)
1091fb62fb0SOlivier Houchard CK_PR_FENCE_EMIT(atomic_store)
1101fb62fb0SOlivier Houchard CK_PR_FENCE_EMIT(store_atomic)
1111fb62fb0SOlivier Houchard CK_PR_FENCE_EMIT(load_atomic)
1121fb62fb0SOlivier Houchard CK_PR_FENCE_EMIT(load_store)
1131fb62fb0SOlivier Houchard CK_PR_FENCE_EMIT(store_load)
1141fb62fb0SOlivier Houchard CK_PR_FENCE_EMIT(load)
1151fb62fb0SOlivier Houchard CK_PR_FENCE_EMIT(store)
1161fb62fb0SOlivier Houchard CK_PR_FENCE_EMIT(memory)
1171fb62fb0SOlivier Houchard CK_PR_FENCE_EMIT(acquire)
1181fb62fb0SOlivier Houchard CK_PR_FENCE_EMIT(release)
1191fb62fb0SOlivier Houchard CK_PR_FENCE_EMIT(acqrel)
1201fb62fb0SOlivier Houchard CK_PR_FENCE_EMIT(lock)
1211fb62fb0SOlivier Houchard CK_PR_FENCE_EMIT(unlock)
1221fb62fb0SOlivier Houchard #elif defined(CK_MD_PSO)
1231fb62fb0SOlivier Houchard /*
1241fb62fb0SOlivier Houchard  * Anything can be re-ordered with respect to stores.
1251fb62fb0SOlivier Houchard  * Otherwise, loads are executed in-order.
1261fb62fb0SOlivier Houchard  */
1271fb62fb0SOlivier Houchard CK_PR_FENCE_EMIT(atomic)
1281fb62fb0SOlivier Houchard CK_PR_FENCE_NOOP(atomic_load)
1291fb62fb0SOlivier Houchard CK_PR_FENCE_EMIT(atomic_store)
1301fb62fb0SOlivier Houchard CK_PR_FENCE_EMIT(store_atomic)
1311fb62fb0SOlivier Houchard CK_PR_FENCE_NOOP(load_atomic)
1321fb62fb0SOlivier Houchard CK_PR_FENCE_EMIT(load_store)
1331fb62fb0SOlivier Houchard CK_PR_FENCE_EMIT(store_load)
1341fb62fb0SOlivier Houchard CK_PR_FENCE_NOOP(load)
1351fb62fb0SOlivier Houchard CK_PR_FENCE_EMIT(store)
1361fb62fb0SOlivier Houchard CK_PR_FENCE_EMIT(memory)
1371fb62fb0SOlivier Houchard CK_PR_FENCE_EMIT(acquire)
1381fb62fb0SOlivier Houchard CK_PR_FENCE_EMIT(release)
1391fb62fb0SOlivier Houchard CK_PR_FENCE_EMIT(acqrel)
1401fb62fb0SOlivier Houchard CK_PR_FENCE_EMIT(lock)
1411fb62fb0SOlivier Houchard CK_PR_FENCE_EMIT(unlock)
1421fb62fb0SOlivier Houchard #elif defined(CK_MD_TSO)
1431fb62fb0SOlivier Houchard /*
1441fb62fb0SOlivier Houchard  * Only loads are re-ordered and only with respect to
1451fb62fb0SOlivier Houchard  * prior stores. Atomic operations are serializing.
1461fb62fb0SOlivier Houchard  */
1471fb62fb0SOlivier Houchard CK_PR_FENCE_NOOP(atomic)
1481fb62fb0SOlivier Houchard CK_PR_FENCE_NOOP(atomic_load)
1491fb62fb0SOlivier Houchard CK_PR_FENCE_NOOP(atomic_store)
1501fb62fb0SOlivier Houchard CK_PR_FENCE_NOOP(store_atomic)
1511fb62fb0SOlivier Houchard CK_PR_FENCE_NOOP(load_atomic)
1521fb62fb0SOlivier Houchard CK_PR_FENCE_NOOP(load_store)
1531fb62fb0SOlivier Houchard CK_PR_FENCE_EMIT(store_load)
1541fb62fb0SOlivier Houchard CK_PR_FENCE_NOOP(load)
1551fb62fb0SOlivier Houchard CK_PR_FENCE_NOOP(store)
1561fb62fb0SOlivier Houchard CK_PR_FENCE_EMIT(memory)
1571fb62fb0SOlivier Houchard CK_PR_FENCE_NOOP(acquire)
1581fb62fb0SOlivier Houchard CK_PR_FENCE_NOOP(release)
1591fb62fb0SOlivier Houchard CK_PR_FENCE_NOOP(acqrel)
1601fb62fb0SOlivier Houchard CK_PR_FENCE_NOOP(lock)
1611fb62fb0SOlivier Houchard CK_PR_FENCE_NOOP(unlock)
1621fb62fb0SOlivier Houchard #else
1631fb62fb0SOlivier Houchard #error "No memory model has been defined."
1641fb62fb0SOlivier Houchard #endif /* CK_MD_TSO */
1651fb62fb0SOlivier Houchard 
1661fb62fb0SOlivier Houchard #undef CK_PR_FENCE_EMIT
1671fb62fb0SOlivier Houchard #undef CK_PR_FENCE_NOOP
1681fb62fb0SOlivier Houchard 
1691fb62fb0SOlivier Houchard #ifndef CK_F_PR_RFO
1701fb62fb0SOlivier Houchard #define CK_F_PR_RFO
1711fb62fb0SOlivier Houchard CK_CC_INLINE static void
1721fb62fb0SOlivier Houchard ck_pr_rfo(const void *m)
1731fb62fb0SOlivier Houchard {
1741fb62fb0SOlivier Houchard 
1751fb62fb0SOlivier Houchard 	(void)m;
1761fb62fb0SOlivier Houchard 	return;
1771fb62fb0SOlivier Houchard }
1781fb62fb0SOlivier Houchard #endif /* CK_F_PR_RFO */
1791fb62fb0SOlivier Houchard 
1801fb62fb0SOlivier Houchard #define CK_PR_STORE_SAFE(DST, VAL, TYPE)			\
1811fb62fb0SOlivier Houchard     ck_pr_md_store_##TYPE(					\
1821fb62fb0SOlivier Houchard         ((void)sizeof(*(DST) = (VAL)), (DST)),			\
1831fb62fb0SOlivier Houchard         (VAL))
1841fb62fb0SOlivier Houchard 
1851fb62fb0SOlivier Houchard #define ck_pr_store_ptr(DST, VAL) CK_PR_STORE_SAFE((DST), (VAL), ptr)
1861fb62fb0SOlivier Houchard #define ck_pr_store_char(DST, VAL) CK_PR_STORE_SAFE((DST), (VAL), char)
1878f87df16SOlivier Houchard #ifndef CK_PR_DISABLE_DOUBLE
1881fb62fb0SOlivier Houchard #define ck_pr_store_double(DST, VAL) CK_PR_STORE_SAFE((DST), (VAL), double)
1898f87df16SOlivier Houchard #endif
1901fb62fb0SOlivier Houchard #define ck_pr_store_uint(DST, VAL) CK_PR_STORE_SAFE((DST), (VAL), uint)
1911fb62fb0SOlivier Houchard #define ck_pr_store_int(DST, VAL) CK_PR_STORE_SAFE((DST), (VAL), int)
1921fb62fb0SOlivier Houchard #define ck_pr_store_32(DST, VAL) CK_PR_STORE_SAFE((DST), (VAL), 32)
1931fb62fb0SOlivier Houchard #define ck_pr_store_16(DST, VAL) CK_PR_STORE_SAFE((DST), (VAL), 16)
1941fb62fb0SOlivier Houchard #define ck_pr_store_8(DST, VAL) CK_PR_STORE_SAFE((DST), (VAL), 8)
1951fb62fb0SOlivier Houchard 
1961fb62fb0SOlivier Houchard #define ck_pr_store_ptr_unsafe(DST, VAL) ck_pr_md_store_ptr((DST), (VAL))
1971fb62fb0SOlivier Houchard 
1981fb62fb0SOlivier Houchard #ifdef CK_F_PR_LOAD_64
1991fb62fb0SOlivier Houchard #define ck_pr_store_64(DST, VAL) CK_PR_STORE_SAFE((DST), (VAL), 64)
2001fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_64 */
2011fb62fb0SOlivier Houchard 
2021fb62fb0SOlivier Houchard #define CK_PR_LOAD_PTR_SAFE(SRC) (CK_CC_TYPEOF(*(SRC), (void *)))ck_pr_md_load_ptr((SRC))
2031fb62fb0SOlivier Houchard #define ck_pr_load_ptr(SRC) CK_PR_LOAD_PTR_SAFE((SRC))
2041fb62fb0SOlivier Houchard 
2051fb62fb0SOlivier Houchard #define CK_PR_LOAD_SAFE(SRC, TYPE) ck_pr_md_load_##TYPE((SRC))
2061fb62fb0SOlivier Houchard #define ck_pr_load_char(SRC) CK_PR_LOAD_SAFE((SRC), char)
2078f87df16SOlivier Houchard #ifndef CK_PR_DISABLE_DOUBLE
2081fb62fb0SOlivier Houchard #define ck_pr_load_double(SRC) CK_PR_LOAD_SAFE((SRC), double)
2098f87df16SOlivier Houchard #endif
2101fb62fb0SOlivier Houchard #define ck_pr_load_uint(SRC) CK_PR_LOAD_SAFE((SRC), uint)
2111fb62fb0SOlivier Houchard #define ck_pr_load_int(SRC) CK_PR_LOAD_SAFE((SRC), int)
2121fb62fb0SOlivier Houchard #define ck_pr_load_32(SRC) CK_PR_LOAD_SAFE((SRC), 32)
2131fb62fb0SOlivier Houchard #define ck_pr_load_16(SRC) CK_PR_LOAD_SAFE((SRC), 16)
2141fb62fb0SOlivier Houchard #define ck_pr_load_8(SRC) CK_PR_LOAD_SAFE((SRC), 8)
2151fb62fb0SOlivier Houchard 
2161fb62fb0SOlivier Houchard #ifdef CK_F_PR_LOAD_64
2171fb62fb0SOlivier Houchard #define ck_pr_load_64(SRC) CK_PR_LOAD_SAFE((SRC), 64)
2181fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_64 */
2191fb62fb0SOlivier Houchard 
2201fb62fb0SOlivier Houchard #define CK_PR_BIN(K, S, M, T, P, C)					\
2211fb62fb0SOlivier Houchard 	CK_CC_INLINE static void					\
2221fb62fb0SOlivier Houchard 	ck_pr_##K##_##S(M *target, T value)				\
2231fb62fb0SOlivier Houchard 	{								\
2241fb62fb0SOlivier Houchard 		T previous;						\
2251fb62fb0SOlivier Houchard 		C punt;							\
2261fb62fb0SOlivier Houchard 		punt = ck_pr_md_load_##S(target);			\
2271fb62fb0SOlivier Houchard 		previous = (T)punt;					\
2281fb62fb0SOlivier Houchard 		while (ck_pr_cas_##S##_value(target,			\
2291fb62fb0SOlivier Houchard 					     (C)previous,		\
2301fb62fb0SOlivier Houchard 					     (C)(previous P value),	\
2311fb62fb0SOlivier Houchard 					     &previous) == false)	\
2321fb62fb0SOlivier Houchard 			ck_pr_stall();					\
2331fb62fb0SOlivier Houchard 									\
2341fb62fb0SOlivier Houchard 		return;							\
2351fb62fb0SOlivier Houchard 	}
2361fb62fb0SOlivier Houchard 
2371fb62fb0SOlivier Houchard #define CK_PR_BIN_S(K, S, T, P) CK_PR_BIN(K, S, T, T, P, T)
2381fb62fb0SOlivier Houchard 
2391fb62fb0SOlivier Houchard #if defined(CK_F_PR_LOAD_CHAR) && defined(CK_F_PR_CAS_CHAR_VALUE)
2401fb62fb0SOlivier Houchard 
2411fb62fb0SOlivier Houchard #ifndef CK_F_PR_ADD_CHAR
2421fb62fb0SOlivier Houchard #define CK_F_PR_ADD_CHAR
2431fb62fb0SOlivier Houchard CK_PR_BIN_S(add, char, char, +)
2441fb62fb0SOlivier Houchard #endif /* CK_F_PR_ADD_CHAR */
2451fb62fb0SOlivier Houchard 
2461fb62fb0SOlivier Houchard #ifndef CK_F_PR_SUB_CHAR
2471fb62fb0SOlivier Houchard #define CK_F_PR_SUB_CHAR
2481fb62fb0SOlivier Houchard CK_PR_BIN_S(sub, char, char, -)
2491fb62fb0SOlivier Houchard #endif /* CK_F_PR_SUB_CHAR */
2501fb62fb0SOlivier Houchard 
2511fb62fb0SOlivier Houchard #ifndef CK_F_PR_AND_CHAR
2521fb62fb0SOlivier Houchard #define CK_F_PR_AND_CHAR
2531fb62fb0SOlivier Houchard CK_PR_BIN_S(and, char, char, &)
2541fb62fb0SOlivier Houchard #endif /* CK_F_PR_AND_CHAR */
2551fb62fb0SOlivier Houchard 
2561fb62fb0SOlivier Houchard #ifndef CK_F_PR_XOR_CHAR
2571fb62fb0SOlivier Houchard #define CK_F_PR_XOR_CHAR
2581fb62fb0SOlivier Houchard CK_PR_BIN_S(xor, char, char, ^)
2591fb62fb0SOlivier Houchard #endif /* CK_F_PR_XOR_CHAR */
2601fb62fb0SOlivier Houchard 
2611fb62fb0SOlivier Houchard #ifndef CK_F_PR_OR_CHAR
2621fb62fb0SOlivier Houchard #define CK_F_PR_OR_CHAR
2631fb62fb0SOlivier Houchard CK_PR_BIN_S(or, char, char, |)
2641fb62fb0SOlivier Houchard #endif /* CK_F_PR_OR_CHAR */
2651fb62fb0SOlivier Houchard 
2661fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_CHAR && CK_F_PR_CAS_CHAR_VALUE */
2671fb62fb0SOlivier Houchard 
2681fb62fb0SOlivier Houchard #if defined(CK_F_PR_LOAD_INT) && defined(CK_F_PR_CAS_INT_VALUE)
2691fb62fb0SOlivier Houchard 
2701fb62fb0SOlivier Houchard #ifndef CK_F_PR_ADD_INT
2711fb62fb0SOlivier Houchard #define CK_F_PR_ADD_INT
2721fb62fb0SOlivier Houchard CK_PR_BIN_S(add, int, int, +)
2731fb62fb0SOlivier Houchard #endif /* CK_F_PR_ADD_INT */
2741fb62fb0SOlivier Houchard 
2751fb62fb0SOlivier Houchard #ifndef CK_F_PR_SUB_INT
2761fb62fb0SOlivier Houchard #define CK_F_PR_SUB_INT
2771fb62fb0SOlivier Houchard CK_PR_BIN_S(sub, int, int, -)
2781fb62fb0SOlivier Houchard #endif /* CK_F_PR_SUB_INT */
2791fb62fb0SOlivier Houchard 
2801fb62fb0SOlivier Houchard #ifndef CK_F_PR_AND_INT
2811fb62fb0SOlivier Houchard #define CK_F_PR_AND_INT
2821fb62fb0SOlivier Houchard CK_PR_BIN_S(and, int, int, &)
2831fb62fb0SOlivier Houchard #endif /* CK_F_PR_AND_INT */
2841fb62fb0SOlivier Houchard 
2851fb62fb0SOlivier Houchard #ifndef CK_F_PR_XOR_INT
2861fb62fb0SOlivier Houchard #define CK_F_PR_XOR_INT
2871fb62fb0SOlivier Houchard CK_PR_BIN_S(xor, int, int, ^)
2881fb62fb0SOlivier Houchard #endif /* CK_F_PR_XOR_INT */
2891fb62fb0SOlivier Houchard 
2901fb62fb0SOlivier Houchard #ifndef CK_F_PR_OR_INT
2911fb62fb0SOlivier Houchard #define CK_F_PR_OR_INT
2921fb62fb0SOlivier Houchard CK_PR_BIN_S(or, int, int, |)
2931fb62fb0SOlivier Houchard #endif /* CK_F_PR_OR_INT */
2941fb62fb0SOlivier Houchard 
2951fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_INT && CK_F_PR_CAS_INT_VALUE */
2961fb62fb0SOlivier Houchard 
2978f87df16SOlivier Houchard #if defined(CK_F_PR_LOAD_DOUBLE) && defined(CK_F_PR_CAS_DOUBLE_VALUE) && \
2988f87df16SOlivier Houchard 	    !defined(CK_PR_DISABLE_DOUBLE)
2991fb62fb0SOlivier Houchard 
3001fb62fb0SOlivier Houchard #ifndef CK_F_PR_ADD_DOUBLE
3011fb62fb0SOlivier Houchard #define CK_F_PR_ADD_DOUBLE
3021fb62fb0SOlivier Houchard CK_PR_BIN_S(add, double, double, +)
3031fb62fb0SOlivier Houchard #endif /* CK_F_PR_ADD_DOUBLE */
3041fb62fb0SOlivier Houchard 
3051fb62fb0SOlivier Houchard #ifndef CK_F_PR_SUB_DOUBLE
3061fb62fb0SOlivier Houchard #define CK_F_PR_SUB_DOUBLE
3071fb62fb0SOlivier Houchard CK_PR_BIN_S(sub, double, double, -)
3081fb62fb0SOlivier Houchard #endif /* CK_F_PR_SUB_DOUBLE */
3091fb62fb0SOlivier Houchard 
3108f87df16SOlivier Houchard #endif /* CK_F_PR_LOAD_DOUBLE && CK_F_PR_CAS_DOUBLE_VALUE && !CK_PR_DISABLE_DOUBLE */
3111fb62fb0SOlivier Houchard 
3121fb62fb0SOlivier Houchard #if defined(CK_F_PR_LOAD_UINT) && defined(CK_F_PR_CAS_UINT_VALUE)
3131fb62fb0SOlivier Houchard 
3141fb62fb0SOlivier Houchard #ifndef CK_F_PR_ADD_UINT
3151fb62fb0SOlivier Houchard #define CK_F_PR_ADD_UINT
3161fb62fb0SOlivier Houchard CK_PR_BIN_S(add, uint, unsigned int, +)
3171fb62fb0SOlivier Houchard #endif /* CK_F_PR_ADD_UINT */
3181fb62fb0SOlivier Houchard 
3191fb62fb0SOlivier Houchard #ifndef CK_F_PR_SUB_UINT
3201fb62fb0SOlivier Houchard #define CK_F_PR_SUB_UINT
3211fb62fb0SOlivier Houchard CK_PR_BIN_S(sub, uint, unsigned int, -)
3221fb62fb0SOlivier Houchard #endif /* CK_F_PR_SUB_UINT */
3231fb62fb0SOlivier Houchard 
3241fb62fb0SOlivier Houchard #ifndef CK_F_PR_AND_UINT
3251fb62fb0SOlivier Houchard #define CK_F_PR_AND_UINT
3261fb62fb0SOlivier Houchard CK_PR_BIN_S(and, uint, unsigned int, &)
3271fb62fb0SOlivier Houchard #endif /* CK_F_PR_AND_UINT */
3281fb62fb0SOlivier Houchard 
3291fb62fb0SOlivier Houchard #ifndef CK_F_PR_XOR_UINT
3301fb62fb0SOlivier Houchard #define CK_F_PR_XOR_UINT
3311fb62fb0SOlivier Houchard CK_PR_BIN_S(xor, uint, unsigned int, ^)
3321fb62fb0SOlivier Houchard #endif /* CK_F_PR_XOR_UINT */
3331fb62fb0SOlivier Houchard 
3341fb62fb0SOlivier Houchard #ifndef CK_F_PR_OR_UINT
3351fb62fb0SOlivier Houchard #define CK_F_PR_OR_UINT
3361fb62fb0SOlivier Houchard CK_PR_BIN_S(or, uint, unsigned int, |)
3371fb62fb0SOlivier Houchard #endif /* CK_F_PR_OR_UINT */
3381fb62fb0SOlivier Houchard 
3391fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_UINT && CK_F_PR_CAS_UINT_VALUE */
3401fb62fb0SOlivier Houchard 
3411fb62fb0SOlivier Houchard #if defined(CK_F_PR_LOAD_PTR) && defined(CK_F_PR_CAS_PTR_VALUE)
3421fb62fb0SOlivier Houchard 
3431fb62fb0SOlivier Houchard #ifndef CK_F_PR_ADD_PTR
3441fb62fb0SOlivier Houchard #define CK_F_PR_ADD_PTR
3451fb62fb0SOlivier Houchard CK_PR_BIN(add, ptr, void, uintptr_t, +, void *)
3461fb62fb0SOlivier Houchard #endif /* CK_F_PR_ADD_PTR */
3471fb62fb0SOlivier Houchard 
3481fb62fb0SOlivier Houchard #ifndef CK_F_PR_SUB_PTR
3491fb62fb0SOlivier Houchard #define CK_F_PR_SUB_PTR
3501fb62fb0SOlivier Houchard CK_PR_BIN(sub, ptr, void, uintptr_t, -, void *)
3511fb62fb0SOlivier Houchard #endif /* CK_F_PR_SUB_PTR */
3521fb62fb0SOlivier Houchard 
3531fb62fb0SOlivier Houchard #ifndef CK_F_PR_AND_PTR
3541fb62fb0SOlivier Houchard #define CK_F_PR_AND_PTR
3551fb62fb0SOlivier Houchard CK_PR_BIN(and, ptr, void, uintptr_t, &, void *)
3561fb62fb0SOlivier Houchard #endif /* CK_F_PR_AND_PTR */
3571fb62fb0SOlivier Houchard 
3581fb62fb0SOlivier Houchard #ifndef CK_F_PR_XOR_PTR
3591fb62fb0SOlivier Houchard #define CK_F_PR_XOR_PTR
3601fb62fb0SOlivier Houchard CK_PR_BIN(xor, ptr, void, uintptr_t, ^, void *)
3611fb62fb0SOlivier Houchard #endif /* CK_F_PR_XOR_PTR */
3621fb62fb0SOlivier Houchard 
3631fb62fb0SOlivier Houchard #ifndef CK_F_PR_OR_PTR
3641fb62fb0SOlivier Houchard #define CK_F_PR_OR_PTR
3651fb62fb0SOlivier Houchard CK_PR_BIN(or, ptr, void, uintptr_t, |, void *)
3661fb62fb0SOlivier Houchard #endif /* CK_F_PR_OR_PTR */
3671fb62fb0SOlivier Houchard 
3681fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_PTR && CK_F_PR_CAS_PTR_VALUE */
3691fb62fb0SOlivier Houchard 
3701fb62fb0SOlivier Houchard #if defined(CK_F_PR_LOAD_64) && defined(CK_F_PR_CAS_64_VALUE)
3711fb62fb0SOlivier Houchard 
3721fb62fb0SOlivier Houchard #ifndef CK_F_PR_ADD_64
3731fb62fb0SOlivier Houchard #define CK_F_PR_ADD_64
3741fb62fb0SOlivier Houchard CK_PR_BIN_S(add, 64, uint64_t, +)
3751fb62fb0SOlivier Houchard #endif /* CK_F_PR_ADD_64 */
3761fb62fb0SOlivier Houchard 
3771fb62fb0SOlivier Houchard #ifndef CK_F_PR_SUB_64
3781fb62fb0SOlivier Houchard #define CK_F_PR_SUB_64
3791fb62fb0SOlivier Houchard CK_PR_BIN_S(sub, 64, uint64_t, -)
3801fb62fb0SOlivier Houchard #endif /* CK_F_PR_SUB_64 */
3811fb62fb0SOlivier Houchard 
3821fb62fb0SOlivier Houchard #ifndef CK_F_PR_AND_64
3831fb62fb0SOlivier Houchard #define CK_F_PR_AND_64
3841fb62fb0SOlivier Houchard CK_PR_BIN_S(and, 64, uint64_t, &)
3851fb62fb0SOlivier Houchard #endif /* CK_F_PR_AND_64 */
3861fb62fb0SOlivier Houchard 
3871fb62fb0SOlivier Houchard #ifndef CK_F_PR_XOR_64
3881fb62fb0SOlivier Houchard #define CK_F_PR_XOR_64
3891fb62fb0SOlivier Houchard CK_PR_BIN_S(xor, 64, uint64_t, ^)
3901fb62fb0SOlivier Houchard #endif /* CK_F_PR_XOR_64 */
3911fb62fb0SOlivier Houchard 
3921fb62fb0SOlivier Houchard #ifndef CK_F_PR_OR_64
3931fb62fb0SOlivier Houchard #define CK_F_PR_OR_64
3941fb62fb0SOlivier Houchard CK_PR_BIN_S(or, 64, uint64_t, |)
3951fb62fb0SOlivier Houchard #endif /* CK_F_PR_OR_64 */
3961fb62fb0SOlivier Houchard 
3971fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_64 && CK_F_PR_CAS_64_VALUE */
3981fb62fb0SOlivier Houchard 
3991fb62fb0SOlivier Houchard #if defined(CK_F_PR_LOAD_32) && defined(CK_F_PR_CAS_32_VALUE)
4001fb62fb0SOlivier Houchard 
4011fb62fb0SOlivier Houchard #ifndef CK_F_PR_ADD_32
4021fb62fb0SOlivier Houchard #define CK_F_PR_ADD_32
4031fb62fb0SOlivier Houchard CK_PR_BIN_S(add, 32, uint32_t, +)
4041fb62fb0SOlivier Houchard #endif /* CK_F_PR_ADD_32 */
4051fb62fb0SOlivier Houchard 
4061fb62fb0SOlivier Houchard #ifndef CK_F_PR_SUB_32
4071fb62fb0SOlivier Houchard #define CK_F_PR_SUB_32
4081fb62fb0SOlivier Houchard CK_PR_BIN_S(sub, 32, uint32_t, -)
4091fb62fb0SOlivier Houchard #endif /* CK_F_PR_SUB_32 */
4101fb62fb0SOlivier Houchard 
4111fb62fb0SOlivier Houchard #ifndef CK_F_PR_AND_32
4121fb62fb0SOlivier Houchard #define CK_F_PR_AND_32
4131fb62fb0SOlivier Houchard CK_PR_BIN_S(and, 32, uint32_t, &)
4141fb62fb0SOlivier Houchard #endif /* CK_F_PR_AND_32 */
4151fb62fb0SOlivier Houchard 
4161fb62fb0SOlivier Houchard #ifndef CK_F_PR_XOR_32
4171fb62fb0SOlivier Houchard #define CK_F_PR_XOR_32
4181fb62fb0SOlivier Houchard CK_PR_BIN_S(xor, 32, uint32_t, ^)
4191fb62fb0SOlivier Houchard #endif /* CK_F_PR_XOR_32 */
4201fb62fb0SOlivier Houchard 
4211fb62fb0SOlivier Houchard #ifndef CK_F_PR_OR_32
4221fb62fb0SOlivier Houchard #define CK_F_PR_OR_32
4231fb62fb0SOlivier Houchard CK_PR_BIN_S(or, 32, uint32_t, |)
4241fb62fb0SOlivier Houchard #endif /* CK_F_PR_OR_32 */
4251fb62fb0SOlivier Houchard 
4261fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_32 && CK_F_PR_CAS_32_VALUE */
4271fb62fb0SOlivier Houchard 
4281fb62fb0SOlivier Houchard #if defined(CK_F_PR_LOAD_16) && defined(CK_F_PR_CAS_16_VALUE)
4291fb62fb0SOlivier Houchard 
4301fb62fb0SOlivier Houchard #ifndef CK_F_PR_ADD_16
4311fb62fb0SOlivier Houchard #define CK_F_PR_ADD_16
4321fb62fb0SOlivier Houchard CK_PR_BIN_S(add, 16, uint16_t, +)
4331fb62fb0SOlivier Houchard #endif /* CK_F_PR_ADD_16 */
4341fb62fb0SOlivier Houchard 
4351fb62fb0SOlivier Houchard #ifndef CK_F_PR_SUB_16
4361fb62fb0SOlivier Houchard #define CK_F_PR_SUB_16
4371fb62fb0SOlivier Houchard CK_PR_BIN_S(sub, 16, uint16_t, -)
4381fb62fb0SOlivier Houchard #endif /* CK_F_PR_SUB_16 */
4391fb62fb0SOlivier Houchard 
4401fb62fb0SOlivier Houchard #ifndef CK_F_PR_AND_16
4411fb62fb0SOlivier Houchard #define CK_F_PR_AND_16
4421fb62fb0SOlivier Houchard CK_PR_BIN_S(and, 16, uint16_t, &)
4431fb62fb0SOlivier Houchard #endif /* CK_F_PR_AND_16 */
4441fb62fb0SOlivier Houchard 
4451fb62fb0SOlivier Houchard #ifndef CK_F_PR_XOR_16
4461fb62fb0SOlivier Houchard #define CK_F_PR_XOR_16
4471fb62fb0SOlivier Houchard CK_PR_BIN_S(xor, 16, uint16_t, ^)
4481fb62fb0SOlivier Houchard #endif /* CK_F_PR_XOR_16 */
4491fb62fb0SOlivier Houchard 
4501fb62fb0SOlivier Houchard #ifndef CK_F_PR_OR_16
4511fb62fb0SOlivier Houchard #define CK_F_PR_OR_16
4521fb62fb0SOlivier Houchard CK_PR_BIN_S(or, 16, uint16_t, |)
4531fb62fb0SOlivier Houchard #endif /* CK_F_PR_OR_16 */
4541fb62fb0SOlivier Houchard 
4551fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_16 && CK_F_PR_CAS_16_VALUE */
4561fb62fb0SOlivier Houchard 
4571fb62fb0SOlivier Houchard #if defined(CK_F_PR_LOAD_8) && defined(CK_F_PR_CAS_8_VALUE)
4581fb62fb0SOlivier Houchard 
4591fb62fb0SOlivier Houchard #ifndef CK_F_PR_ADD_8
4601fb62fb0SOlivier Houchard #define CK_F_PR_ADD_8
4611fb62fb0SOlivier Houchard CK_PR_BIN_S(add, 8, uint8_t, +)
4621fb62fb0SOlivier Houchard #endif /* CK_F_PR_ADD_8 */
4631fb62fb0SOlivier Houchard 
4641fb62fb0SOlivier Houchard #ifndef CK_F_PR_SUB_8
4651fb62fb0SOlivier Houchard #define CK_F_PR_SUB_8
4661fb62fb0SOlivier Houchard CK_PR_BIN_S(sub, 8, uint8_t, -)
4671fb62fb0SOlivier Houchard #endif /* CK_F_PR_SUB_8 */
4681fb62fb0SOlivier Houchard 
4691fb62fb0SOlivier Houchard #ifndef CK_F_PR_AND_8
4701fb62fb0SOlivier Houchard #define CK_F_PR_AND_8
4711fb62fb0SOlivier Houchard CK_PR_BIN_S(and, 8, uint8_t, &)
4721fb62fb0SOlivier Houchard #endif /* CK_F_PR_AND_8 */
4731fb62fb0SOlivier Houchard 
4741fb62fb0SOlivier Houchard #ifndef CK_F_PR_XOR_8
4751fb62fb0SOlivier Houchard #define CK_F_PR_XOR_8
4761fb62fb0SOlivier Houchard CK_PR_BIN_S(xor, 8, uint8_t, ^)
4771fb62fb0SOlivier Houchard #endif /* CK_F_PR_XOR_8 */
4781fb62fb0SOlivier Houchard 
4791fb62fb0SOlivier Houchard #ifndef CK_F_PR_OR_8
4801fb62fb0SOlivier Houchard #define CK_F_PR_OR_8
4811fb62fb0SOlivier Houchard CK_PR_BIN_S(or, 8, uint8_t, |)
4821fb62fb0SOlivier Houchard #endif /* CK_F_PR_OR_8 */
4831fb62fb0SOlivier Houchard 
4841fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_8 && CK_F_PR_CAS_8_VALUE */
4851fb62fb0SOlivier Houchard 
4861fb62fb0SOlivier Houchard #undef CK_PR_BIN_S
4871fb62fb0SOlivier Houchard #undef CK_PR_BIN
4881fb62fb0SOlivier Houchard 
4891fb62fb0SOlivier Houchard #define CK_PR_BTX(K, S, M, T, P, C, R)						   \
4901fb62fb0SOlivier Houchard 	CK_CC_INLINE static bool						   \
4911fb62fb0SOlivier Houchard 	ck_pr_##K##_##S(M *target, unsigned int offset)				   \
4921fb62fb0SOlivier Houchard 	{									   \
4931fb62fb0SOlivier Houchard 		T previous;							   \
4941fb62fb0SOlivier Houchard 		C punt;								   \
4951fb62fb0SOlivier Houchard 		punt = ck_pr_md_load_##S(target);				   \
4961fb62fb0SOlivier Houchard 		previous = (T)punt;						   \
4971fb62fb0SOlivier Houchard 		while (ck_pr_cas_##S##_value(target, (C)previous,		   \
4981fb62fb0SOlivier Houchard 			(C)(previous P (R ((T)1 << offset))), &previous) == false) \
4991fb62fb0SOlivier Houchard 				ck_pr_stall();					   \
5001fb62fb0SOlivier Houchard 		return ((previous >> offset) & 1);				   \
5011fb62fb0SOlivier Houchard 	}
5021fb62fb0SOlivier Houchard 
5031fb62fb0SOlivier Houchard #define CK_PR_BTX_S(K, S, T, P, R) CK_PR_BTX(K, S, T, T, P, T, R)
5041fb62fb0SOlivier Houchard 
5051fb62fb0SOlivier Houchard #if defined(CK_F_PR_LOAD_INT) && defined(CK_F_PR_CAS_INT_VALUE)
5061fb62fb0SOlivier Houchard 
5071fb62fb0SOlivier Houchard #ifndef CK_F_PR_BTC_INT
5081fb62fb0SOlivier Houchard #define CK_F_PR_BTC_INT
5091fb62fb0SOlivier Houchard CK_PR_BTX_S(btc, int, int, ^,)
5101fb62fb0SOlivier Houchard #endif /* CK_F_PR_BTC_INT */
5111fb62fb0SOlivier Houchard 
5121fb62fb0SOlivier Houchard #ifndef CK_F_PR_BTR_INT
5131fb62fb0SOlivier Houchard #define CK_F_PR_BTR_INT
5141fb62fb0SOlivier Houchard CK_PR_BTX_S(btr, int, int, &, ~)
5151fb62fb0SOlivier Houchard #endif /* CK_F_PR_BTR_INT */
5161fb62fb0SOlivier Houchard 
5171fb62fb0SOlivier Houchard #ifndef CK_F_PR_BTS_INT
5181fb62fb0SOlivier Houchard #define CK_F_PR_BTS_INT
5191fb62fb0SOlivier Houchard CK_PR_BTX_S(bts, int, int, |,)
5201fb62fb0SOlivier Houchard #endif /* CK_F_PR_BTS_INT */
5211fb62fb0SOlivier Houchard 
5221fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_INT && CK_F_PR_CAS_INT_VALUE */
5231fb62fb0SOlivier Houchard 
5241fb62fb0SOlivier Houchard #if defined(CK_F_PR_LOAD_UINT) && defined(CK_F_PR_CAS_UINT_VALUE)
5251fb62fb0SOlivier Houchard 
5261fb62fb0SOlivier Houchard #ifndef CK_F_PR_BTC_UINT
5271fb62fb0SOlivier Houchard #define CK_F_PR_BTC_UINT
5281fb62fb0SOlivier Houchard CK_PR_BTX_S(btc, uint, unsigned int, ^,)
5291fb62fb0SOlivier Houchard #endif /* CK_F_PR_BTC_UINT */
5301fb62fb0SOlivier Houchard 
5311fb62fb0SOlivier Houchard #ifndef CK_F_PR_BTR_UINT
5321fb62fb0SOlivier Houchard #define CK_F_PR_BTR_UINT
5331fb62fb0SOlivier Houchard CK_PR_BTX_S(btr, uint, unsigned int, &, ~)
5341fb62fb0SOlivier Houchard #endif /* CK_F_PR_BTR_UINT */
5351fb62fb0SOlivier Houchard 
5361fb62fb0SOlivier Houchard #ifndef CK_F_PR_BTS_UINT
5371fb62fb0SOlivier Houchard #define CK_F_PR_BTS_UINT
5381fb62fb0SOlivier Houchard CK_PR_BTX_S(bts, uint, unsigned int, |,)
5391fb62fb0SOlivier Houchard #endif /* CK_F_PR_BTS_UINT */
5401fb62fb0SOlivier Houchard 
5411fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_UINT && CK_F_PR_CAS_UINT_VALUE */
5421fb62fb0SOlivier Houchard 
5431fb62fb0SOlivier Houchard #if defined(CK_F_PR_LOAD_PTR) && defined(CK_F_PR_CAS_PTR_VALUE)
5441fb62fb0SOlivier Houchard 
5451fb62fb0SOlivier Houchard #ifndef CK_F_PR_BTC_PTR
5461fb62fb0SOlivier Houchard #define CK_F_PR_BTC_PTR
5471fb62fb0SOlivier Houchard CK_PR_BTX(btc, ptr, void, uintptr_t, ^, void *,)
5481fb62fb0SOlivier Houchard #endif /* CK_F_PR_BTC_PTR */
5491fb62fb0SOlivier Houchard 
5501fb62fb0SOlivier Houchard #ifndef CK_F_PR_BTR_PTR
5511fb62fb0SOlivier Houchard #define CK_F_PR_BTR_PTR
5521fb62fb0SOlivier Houchard CK_PR_BTX(btr, ptr, void, uintptr_t, &, void *, ~)
5531fb62fb0SOlivier Houchard #endif /* CK_F_PR_BTR_PTR */
5541fb62fb0SOlivier Houchard 
5551fb62fb0SOlivier Houchard #ifndef CK_F_PR_BTS_PTR
5561fb62fb0SOlivier Houchard #define CK_F_PR_BTS_PTR
5571fb62fb0SOlivier Houchard CK_PR_BTX(bts, ptr, void, uintptr_t, |, void *,)
5581fb62fb0SOlivier Houchard #endif /* CK_F_PR_BTS_PTR */
5591fb62fb0SOlivier Houchard 
5601fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_PTR && CK_F_PR_CAS_PTR_VALUE */
5611fb62fb0SOlivier Houchard 
5621fb62fb0SOlivier Houchard #if defined(CK_F_PR_LOAD_64) && defined(CK_F_PR_CAS_64_VALUE)
5631fb62fb0SOlivier Houchard 
5641fb62fb0SOlivier Houchard #ifndef CK_F_PR_BTC_64
5651fb62fb0SOlivier Houchard #define CK_F_PR_BTC_64
5661fb62fb0SOlivier Houchard CK_PR_BTX_S(btc, 64, uint64_t, ^,)
5671fb62fb0SOlivier Houchard #endif /* CK_F_PR_BTC_64 */
5681fb62fb0SOlivier Houchard 
5691fb62fb0SOlivier Houchard #ifndef CK_F_PR_BTR_64
5701fb62fb0SOlivier Houchard #define CK_F_PR_BTR_64
5711fb62fb0SOlivier Houchard CK_PR_BTX_S(btr, 64, uint64_t, &, ~)
5721fb62fb0SOlivier Houchard #endif /* CK_F_PR_BTR_64 */
5731fb62fb0SOlivier Houchard 
5741fb62fb0SOlivier Houchard #ifndef CK_F_PR_BTS_64
5751fb62fb0SOlivier Houchard #define CK_F_PR_BTS_64
5761fb62fb0SOlivier Houchard CK_PR_BTX_S(bts, 64, uint64_t, |,)
5771fb62fb0SOlivier Houchard #endif /* CK_F_PR_BTS_64 */
5781fb62fb0SOlivier Houchard 
5791fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_64 && CK_F_PR_CAS_64_VALUE */
5801fb62fb0SOlivier Houchard 
5811fb62fb0SOlivier Houchard #if defined(CK_F_PR_LOAD_32) && defined(CK_F_PR_CAS_32_VALUE)
5821fb62fb0SOlivier Houchard 
5831fb62fb0SOlivier Houchard #ifndef CK_F_PR_BTC_32
5841fb62fb0SOlivier Houchard #define CK_F_PR_BTC_32
5851fb62fb0SOlivier Houchard CK_PR_BTX_S(btc, 32, uint32_t, ^,)
5861fb62fb0SOlivier Houchard #endif /* CK_F_PR_BTC_32 */
5871fb62fb0SOlivier Houchard 
5881fb62fb0SOlivier Houchard #ifndef CK_F_PR_BTR_32
5891fb62fb0SOlivier Houchard #define CK_F_PR_BTR_32
5901fb62fb0SOlivier Houchard CK_PR_BTX_S(btr, 32, uint32_t, &, ~)
5911fb62fb0SOlivier Houchard #endif /* CK_F_PR_BTR_32 */
5921fb62fb0SOlivier Houchard 
5931fb62fb0SOlivier Houchard #ifndef CK_F_PR_BTS_32
5941fb62fb0SOlivier Houchard #define CK_F_PR_BTS_32
5951fb62fb0SOlivier Houchard CK_PR_BTX_S(bts, 32, uint32_t, |,)
5961fb62fb0SOlivier Houchard #endif /* CK_F_PR_BTS_32 */
5971fb62fb0SOlivier Houchard 
5981fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_32 && CK_F_PR_CAS_32_VALUE */
5991fb62fb0SOlivier Houchard 
6001fb62fb0SOlivier Houchard #if defined(CK_F_PR_LOAD_16) && defined(CK_F_PR_CAS_16_VALUE)
6011fb62fb0SOlivier Houchard 
6021fb62fb0SOlivier Houchard #ifndef CK_F_PR_BTC_16
6031fb62fb0SOlivier Houchard #define CK_F_PR_BTC_16
6041fb62fb0SOlivier Houchard CK_PR_BTX_S(btc, 16, uint16_t, ^,)
6051fb62fb0SOlivier Houchard #endif /* CK_F_PR_BTC_16 */
6061fb62fb0SOlivier Houchard 
6071fb62fb0SOlivier Houchard #ifndef CK_F_PR_BTR_16
6081fb62fb0SOlivier Houchard #define CK_F_PR_BTR_16
6091fb62fb0SOlivier Houchard CK_PR_BTX_S(btr, 16, uint16_t, &, ~)
6101fb62fb0SOlivier Houchard #endif /* CK_F_PR_BTR_16 */
6111fb62fb0SOlivier Houchard 
6121fb62fb0SOlivier Houchard #ifndef CK_F_PR_BTS_16
6131fb62fb0SOlivier Houchard #define CK_F_PR_BTS_16
6141fb62fb0SOlivier Houchard CK_PR_BTX_S(bts, 16, uint16_t, |,)
6151fb62fb0SOlivier Houchard #endif /* CK_F_PR_BTS_16 */
6161fb62fb0SOlivier Houchard 
6171fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_16 && CK_F_PR_CAS_16_VALUE */
6181fb62fb0SOlivier Houchard 
6191fb62fb0SOlivier Houchard #undef CK_PR_BTX_S
6201fb62fb0SOlivier Houchard #undef CK_PR_BTX
6211fb62fb0SOlivier Houchard 
6221fb62fb0SOlivier Houchard #define CK_PR_UNARY(K, X, S, M, T)					\
6231fb62fb0SOlivier Houchard 	CK_CC_INLINE static void					\
6241fb62fb0SOlivier Houchard 	ck_pr_##K##_##S(M *target)					\
6251fb62fb0SOlivier Houchard 	{								\
6261fb62fb0SOlivier Houchard 		ck_pr_##X##_##S(target, (T)1);				\
6271fb62fb0SOlivier Houchard 		return;							\
6281fb62fb0SOlivier Houchard 	}
6291fb62fb0SOlivier Houchard 
6301fb62fb0SOlivier Houchard #define CK_PR_UNARY_Z(K, S, M, T, P, C, Z)				\
631725de581SAndriy Gapon 	CK_CC_INLINE static bool					\
632725de581SAndriy Gapon 	ck_pr_##K##_##S##_is_zero(M *target)				\
6331fb62fb0SOlivier Houchard 	{								\
6341fb62fb0SOlivier Houchard 		T previous;						\
6351fb62fb0SOlivier Houchard 		C punt;							\
6361fb62fb0SOlivier Houchard 		punt = (C)ck_pr_md_load_##S(target);			\
6371fb62fb0SOlivier Houchard 		previous = (T)punt;					\
6381fb62fb0SOlivier Houchard 		while (ck_pr_cas_##S##_value(target,			\
6391fb62fb0SOlivier Houchard 					     (C)previous,		\
6401fb62fb0SOlivier Houchard 					     (C)(previous P 1),		\
6411fb62fb0SOlivier Houchard 					     &previous) == false)	\
6421fb62fb0SOlivier Houchard 			ck_pr_stall();					\
643725de581SAndriy Gapon 		return previous == (T)Z;				\
644725de581SAndriy Gapon         }
645725de581SAndriy Gapon 
646725de581SAndriy Gapon #define CK_PR_UNARY_Z_STUB(K, S, M)					\
647725de581SAndriy Gapon 	CK_CC_INLINE static void					\
648725de581SAndriy Gapon 	ck_pr_##K##_##S##_zero(M *target, bool *zero)			\
649725de581SAndriy Gapon 	{								\
650725de581SAndriy Gapon 		*zero = ck_pr_##K##_##S##_is_zero(target);		\
6511fb62fb0SOlivier Houchard 		return;							\
6521fb62fb0SOlivier Houchard 	}
6531fb62fb0SOlivier Houchard 
6541fb62fb0SOlivier Houchard #define CK_PR_UNARY_S(K, X, S, M) CK_PR_UNARY(K, X, S, M, M)
655725de581SAndriy Gapon #define CK_PR_UNARY_Z_S(K, S, M, P, Z)          \
656725de581SAndriy Gapon         CK_PR_UNARY_Z(K, S, M, M, P, M, Z)      \
657725de581SAndriy Gapon         CK_PR_UNARY_Z_STUB(K, S, M)
6581fb62fb0SOlivier Houchard 
6591fb62fb0SOlivier Houchard #if defined(CK_F_PR_LOAD_CHAR) && defined(CK_F_PR_CAS_CHAR_VALUE)
6601fb62fb0SOlivier Houchard 
6611fb62fb0SOlivier Houchard #ifndef CK_F_PR_INC_CHAR
6621fb62fb0SOlivier Houchard #define CK_F_PR_INC_CHAR
6631fb62fb0SOlivier Houchard CK_PR_UNARY_S(inc, add, char, char)
6641fb62fb0SOlivier Houchard #endif /* CK_F_PR_INC_CHAR */
6651fb62fb0SOlivier Houchard 
6661fb62fb0SOlivier Houchard #ifndef CK_F_PR_INC_CHAR_ZERO
6671fb62fb0SOlivier Houchard #define CK_F_PR_INC_CHAR_ZERO
6681fb62fb0SOlivier Houchard CK_PR_UNARY_Z_S(inc, char, char, +, -1)
669725de581SAndriy Gapon #else
670725de581SAndriy Gapon CK_PR_UNARY_Z_STUB(inc, char, char)
6711fb62fb0SOlivier Houchard #endif /* CK_F_PR_INC_CHAR_ZERO */
6721fb62fb0SOlivier Houchard 
6731fb62fb0SOlivier Houchard #ifndef CK_F_PR_DEC_CHAR
6741fb62fb0SOlivier Houchard #define CK_F_PR_DEC_CHAR
6751fb62fb0SOlivier Houchard CK_PR_UNARY_S(dec, sub, char, char)
6761fb62fb0SOlivier Houchard #endif /* CK_F_PR_DEC_CHAR */
6771fb62fb0SOlivier Houchard 
6781fb62fb0SOlivier Houchard #ifndef CK_F_PR_DEC_CHAR_ZERO
6791fb62fb0SOlivier Houchard #define CK_F_PR_DEC_CHAR_ZERO
6801fb62fb0SOlivier Houchard CK_PR_UNARY_Z_S(dec, char, char, -, 1)
681725de581SAndriy Gapon #else
682725de581SAndriy Gapon CK_PR_UNARY_Z_STUB(dec, char, char)
6831fb62fb0SOlivier Houchard #endif /* CK_F_PR_DEC_CHAR_ZERO */
6841fb62fb0SOlivier Houchard 
6851fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_CHAR && CK_F_PR_CAS_CHAR_VALUE */
6861fb62fb0SOlivier Houchard 
6871fb62fb0SOlivier Houchard #if defined(CK_F_PR_LOAD_INT) && defined(CK_F_PR_CAS_INT_VALUE)
6881fb62fb0SOlivier Houchard 
6891fb62fb0SOlivier Houchard #ifndef CK_F_PR_INC_INT
6901fb62fb0SOlivier Houchard #define CK_F_PR_INC_INT
6911fb62fb0SOlivier Houchard CK_PR_UNARY_S(inc, add, int, int)
6921fb62fb0SOlivier Houchard #endif /* CK_F_PR_INC_INT */
6931fb62fb0SOlivier Houchard 
6941fb62fb0SOlivier Houchard #ifndef CK_F_PR_INC_INT_ZERO
6951fb62fb0SOlivier Houchard #define CK_F_PR_INC_INT_ZERO
6961fb62fb0SOlivier Houchard CK_PR_UNARY_Z_S(inc, int, int, +, -1)
697725de581SAndriy Gapon #else
698725de581SAndriy Gapon CK_PR_UNARY_Z_STUB(inc, int, int)
6991fb62fb0SOlivier Houchard #endif /* CK_F_PR_INC_INT_ZERO */
7001fb62fb0SOlivier Houchard 
7011fb62fb0SOlivier Houchard #ifndef CK_F_PR_DEC_INT
7021fb62fb0SOlivier Houchard #define CK_F_PR_DEC_INT
7031fb62fb0SOlivier Houchard CK_PR_UNARY_S(dec, sub, int, int)
7041fb62fb0SOlivier Houchard #endif /* CK_F_PR_DEC_INT */
7051fb62fb0SOlivier Houchard 
7061fb62fb0SOlivier Houchard #ifndef CK_F_PR_DEC_INT_ZERO
7071fb62fb0SOlivier Houchard #define CK_F_PR_DEC_INT_ZERO
7081fb62fb0SOlivier Houchard CK_PR_UNARY_Z_S(dec, int, int, -, 1)
709725de581SAndriy Gapon #else
710725de581SAndriy Gapon CK_PR_UNARY_Z_STUB(dec, int, int)
7111fb62fb0SOlivier Houchard #endif /* CK_F_PR_DEC_INT_ZERO */
7121fb62fb0SOlivier Houchard 
7131fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_INT && CK_F_PR_CAS_INT_VALUE */
7141fb62fb0SOlivier Houchard 
7158f87df16SOlivier Houchard #if defined(CK_F_PR_LOAD_DOUBLE) && defined(CK_F_PR_CAS_DOUBLE_VALUE) && \
7168f87df16SOlivier Houchard 	    !defined(CK_PR_DISABLE_DOUBLE)
7171fb62fb0SOlivier Houchard 
7181fb62fb0SOlivier Houchard #ifndef CK_F_PR_INC_DOUBLE
7191fb62fb0SOlivier Houchard #define CK_F_PR_INC_DOUBLE
7201fb62fb0SOlivier Houchard CK_PR_UNARY_S(inc, add, double, double)
7211fb62fb0SOlivier Houchard #endif /* CK_F_PR_INC_DOUBLE */
7221fb62fb0SOlivier Houchard 
7231fb62fb0SOlivier Houchard #ifndef CK_F_PR_DEC_DOUBLE
7241fb62fb0SOlivier Houchard #define CK_F_PR_DEC_DOUBLE
7251fb62fb0SOlivier Houchard CK_PR_UNARY_S(dec, sub, double, double)
7261fb62fb0SOlivier Houchard #endif /* CK_F_PR_DEC_DOUBLE */
7271fb62fb0SOlivier Houchard 
7288f87df16SOlivier Houchard #endif /* CK_F_PR_LOAD_DOUBLE && CK_F_PR_CAS_DOUBLE_VALUE && !CK_PR_DISABLE_DOUBLE */
7291fb62fb0SOlivier Houchard 
7301fb62fb0SOlivier Houchard #if defined(CK_F_PR_LOAD_UINT) && defined(CK_F_PR_CAS_UINT_VALUE)
7311fb62fb0SOlivier Houchard 
7321fb62fb0SOlivier Houchard #ifndef CK_F_PR_INC_UINT
7331fb62fb0SOlivier Houchard #define CK_F_PR_INC_UINT
7341fb62fb0SOlivier Houchard CK_PR_UNARY_S(inc, add, uint, unsigned int)
7351fb62fb0SOlivier Houchard #endif /* CK_F_PR_INC_UINT */
7361fb62fb0SOlivier Houchard 
7371fb62fb0SOlivier Houchard #ifndef CK_F_PR_INC_UINT_ZERO
7381fb62fb0SOlivier Houchard #define CK_F_PR_INC_UINT_ZERO
7391fb62fb0SOlivier Houchard CK_PR_UNARY_Z_S(inc, uint, unsigned int, +, UINT_MAX)
740725de581SAndriy Gapon #else
741725de581SAndriy Gapon CK_PR_UNARY_Z_STUB(inc, uint, unsigned int)
7421fb62fb0SOlivier Houchard #endif /* CK_F_PR_INC_UINT_ZERO */
7431fb62fb0SOlivier Houchard 
7441fb62fb0SOlivier Houchard #ifndef CK_F_PR_DEC_UINT
7451fb62fb0SOlivier Houchard #define CK_F_PR_DEC_UINT
7461fb62fb0SOlivier Houchard CK_PR_UNARY_S(dec, sub, uint, unsigned int)
7471fb62fb0SOlivier Houchard #endif /* CK_F_PR_DEC_UINT */
7481fb62fb0SOlivier Houchard 
7491fb62fb0SOlivier Houchard #ifndef CK_F_PR_DEC_UINT_ZERO
7501fb62fb0SOlivier Houchard #define CK_F_PR_DEC_UINT_ZERO
7511fb62fb0SOlivier Houchard CK_PR_UNARY_Z_S(dec, uint, unsigned int, -, 1)
752725de581SAndriy Gapon #else
753725de581SAndriy Gapon CK_PR_UNARY_Z_STUB(dec, uint, unsigned int)
7541fb62fb0SOlivier Houchard #endif /* CK_F_PR_DEC_UINT_ZERO */
7551fb62fb0SOlivier Houchard 
7561fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_UINT && CK_F_PR_CAS_UINT_VALUE */
7571fb62fb0SOlivier Houchard 
7581fb62fb0SOlivier Houchard #if defined(CK_F_PR_LOAD_PTR) && defined(CK_F_PR_CAS_PTR_VALUE)
7591fb62fb0SOlivier Houchard 
7601fb62fb0SOlivier Houchard #ifndef CK_F_PR_INC_PTR
7611fb62fb0SOlivier Houchard #define CK_F_PR_INC_PTR
7621fb62fb0SOlivier Houchard CK_PR_UNARY(inc, add, ptr, void, uintptr_t)
7631fb62fb0SOlivier Houchard #endif /* CK_F_PR_INC_PTR */
7641fb62fb0SOlivier Houchard 
7651fb62fb0SOlivier Houchard #ifndef CK_F_PR_INC_PTR_ZERO
7661fb62fb0SOlivier Houchard #define CK_F_PR_INC_PTR_ZERO
7671fb62fb0SOlivier Houchard CK_PR_UNARY_Z(inc, ptr, void, uintptr_t, +, void *, UINT_MAX)
768725de581SAndriy Gapon #else
769725de581SAndriy Gapon CK_PR_UNARY_Z_STUB(inc, ptr, void)
7701fb62fb0SOlivier Houchard #endif /* CK_F_PR_INC_PTR_ZERO */
7711fb62fb0SOlivier Houchard 
7721fb62fb0SOlivier Houchard #ifndef CK_F_PR_DEC_PTR
7731fb62fb0SOlivier Houchard #define CK_F_PR_DEC_PTR
7741fb62fb0SOlivier Houchard CK_PR_UNARY(dec, sub, ptr, void, uintptr_t)
7751fb62fb0SOlivier Houchard #endif /* CK_F_PR_DEC_PTR */
7761fb62fb0SOlivier Houchard 
7771fb62fb0SOlivier Houchard #ifndef CK_F_PR_DEC_PTR_ZERO
7781fb62fb0SOlivier Houchard #define CK_F_PR_DEC_PTR_ZERO
7791fb62fb0SOlivier Houchard CK_PR_UNARY_Z(dec, ptr, void, uintptr_t, -, void *, 1)
780725de581SAndriy Gapon #else
781725de581SAndriy Gapon CK_PR_UNARY_Z_STUB(dec, ptr, void)
7821fb62fb0SOlivier Houchard #endif /* CK_F_PR_DEC_PTR_ZERO */
7831fb62fb0SOlivier Houchard 
7841fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_PTR && CK_F_PR_CAS_PTR_VALUE */
7851fb62fb0SOlivier Houchard 
7861fb62fb0SOlivier Houchard #if defined(CK_F_PR_LOAD_64) && defined(CK_F_PR_CAS_64_VALUE)
7871fb62fb0SOlivier Houchard 
7881fb62fb0SOlivier Houchard #ifndef CK_F_PR_INC_64
7891fb62fb0SOlivier Houchard #define CK_F_PR_INC_64
7901fb62fb0SOlivier Houchard CK_PR_UNARY_S(inc, add, 64, uint64_t)
7911fb62fb0SOlivier Houchard #endif /* CK_F_PR_INC_64 */
7921fb62fb0SOlivier Houchard 
7931fb62fb0SOlivier Houchard #ifndef CK_F_PR_INC_64_ZERO
7941fb62fb0SOlivier Houchard #define CK_F_PR_INC_64_ZERO
7951fb62fb0SOlivier Houchard CK_PR_UNARY_Z_S(inc, 64, uint64_t, +, UINT64_MAX)
796725de581SAndriy Gapon #else
797725de581SAndriy Gapon CK_PR_UNARY_Z_STUB(inc, 64, uint64_t)
7981fb62fb0SOlivier Houchard #endif /* CK_F_PR_INC_64_ZERO */
7991fb62fb0SOlivier Houchard 
8001fb62fb0SOlivier Houchard #ifndef CK_F_PR_DEC_64
8011fb62fb0SOlivier Houchard #define CK_F_PR_DEC_64
8021fb62fb0SOlivier Houchard CK_PR_UNARY_S(dec, sub, 64, uint64_t)
8031fb62fb0SOlivier Houchard #endif /* CK_F_PR_DEC_64 */
8041fb62fb0SOlivier Houchard 
8051fb62fb0SOlivier Houchard #ifndef CK_F_PR_DEC_64_ZERO
8061fb62fb0SOlivier Houchard #define CK_F_PR_DEC_64_ZERO
8071fb62fb0SOlivier Houchard CK_PR_UNARY_Z_S(dec, 64, uint64_t, -, 1)
808725de581SAndriy Gapon #else
809725de581SAndriy Gapon CK_PR_UNARY_Z_STUB(dec, 64, uint64_t)
8101fb62fb0SOlivier Houchard #endif /* CK_F_PR_DEC_64_ZERO */
8111fb62fb0SOlivier Houchard 
8121fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_64 && CK_F_PR_CAS_64_VALUE */
8131fb62fb0SOlivier Houchard 
8141fb62fb0SOlivier Houchard #if defined(CK_F_PR_LOAD_32) && defined(CK_F_PR_CAS_32_VALUE)
8151fb62fb0SOlivier Houchard 
8161fb62fb0SOlivier Houchard #ifndef CK_F_PR_INC_32
8171fb62fb0SOlivier Houchard #define CK_F_PR_INC_32
8181fb62fb0SOlivier Houchard CK_PR_UNARY_S(inc, add, 32, uint32_t)
8191fb62fb0SOlivier Houchard #endif /* CK_F_PR_INC_32 */
8201fb62fb0SOlivier Houchard 
8211fb62fb0SOlivier Houchard #ifndef CK_F_PR_INC_32_ZERO
8221fb62fb0SOlivier Houchard #define CK_F_PR_INC_32_ZERO
8231fb62fb0SOlivier Houchard CK_PR_UNARY_Z_S(inc, 32, uint32_t, +, UINT32_MAX)
824725de581SAndriy Gapon #else
825725de581SAndriy Gapon CK_PR_UNARY_Z_STUB(inc, 32, uint32_t)
8261fb62fb0SOlivier Houchard #endif /* CK_F_PR_INC_32_ZERO */
8271fb62fb0SOlivier Houchard 
8281fb62fb0SOlivier Houchard #ifndef CK_F_PR_DEC_32
8291fb62fb0SOlivier Houchard #define CK_F_PR_DEC_32
8301fb62fb0SOlivier Houchard CK_PR_UNARY_S(dec, sub, 32, uint32_t)
8311fb62fb0SOlivier Houchard #endif /* CK_F_PR_DEC_32 */
8321fb62fb0SOlivier Houchard 
8331fb62fb0SOlivier Houchard #ifndef CK_F_PR_DEC_32_ZERO
8341fb62fb0SOlivier Houchard #define CK_F_PR_DEC_32_ZERO
8351fb62fb0SOlivier Houchard CK_PR_UNARY_Z_S(dec, 32, uint32_t, -, 1)
836725de581SAndriy Gapon #else
837725de581SAndriy Gapon CK_PR_UNARY_Z_STUB(dec, 32, uint32_t)
8381fb62fb0SOlivier Houchard #endif /* CK_F_PR_DEC_32_ZERO */
8391fb62fb0SOlivier Houchard 
8401fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_32 && CK_F_PR_CAS_32_VALUE */
8411fb62fb0SOlivier Houchard 
8421fb62fb0SOlivier Houchard #if defined(CK_F_PR_LOAD_16) && defined(CK_F_PR_CAS_16_VALUE)
8431fb62fb0SOlivier Houchard 
8441fb62fb0SOlivier Houchard #ifndef CK_F_PR_INC_16
8451fb62fb0SOlivier Houchard #define CK_F_PR_INC_16
8461fb62fb0SOlivier Houchard CK_PR_UNARY_S(inc, add, 16, uint16_t)
8471fb62fb0SOlivier Houchard #endif /* CK_F_PR_INC_16 */
8481fb62fb0SOlivier Houchard 
8491fb62fb0SOlivier Houchard #ifndef CK_F_PR_INC_16_ZERO
8501fb62fb0SOlivier Houchard #define CK_F_PR_INC_16_ZERO
8511fb62fb0SOlivier Houchard CK_PR_UNARY_Z_S(inc, 16, uint16_t, +, UINT16_MAX)
852725de581SAndriy Gapon #else
853725de581SAndriy Gapon CK_PR_UNARY_Z_STUB(inc, 16, uint16_t)
8541fb62fb0SOlivier Houchard #endif /* CK_F_PR_INC_16_ZERO */
8551fb62fb0SOlivier Houchard 
8561fb62fb0SOlivier Houchard #ifndef CK_F_PR_DEC_16
8571fb62fb0SOlivier Houchard #define CK_F_PR_DEC_16
8581fb62fb0SOlivier Houchard CK_PR_UNARY_S(dec, sub, 16, uint16_t)
8591fb62fb0SOlivier Houchard #endif /* CK_F_PR_DEC_16 */
8601fb62fb0SOlivier Houchard 
8611fb62fb0SOlivier Houchard #ifndef CK_F_PR_DEC_16_ZERO
8621fb62fb0SOlivier Houchard #define CK_F_PR_DEC_16_ZERO
8631fb62fb0SOlivier Houchard CK_PR_UNARY_Z_S(dec, 16, uint16_t, -, 1)
864725de581SAndriy Gapon #else
865725de581SAndriy Gapon CK_PR_UNARY_Z_STUB(dec, 16, uint16_t)
8661fb62fb0SOlivier Houchard #endif /* CK_F_PR_DEC_16_ZERO */
8671fb62fb0SOlivier Houchard 
8681fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_16 && CK_F_PR_CAS_16_VALUE */
8691fb62fb0SOlivier Houchard 
8701fb62fb0SOlivier Houchard #if defined(CK_F_PR_LOAD_8) && defined(CK_F_PR_CAS_8_VALUE)
8711fb62fb0SOlivier Houchard 
8721fb62fb0SOlivier Houchard #ifndef CK_F_PR_INC_8
8731fb62fb0SOlivier Houchard #define CK_F_PR_INC_8
8741fb62fb0SOlivier Houchard CK_PR_UNARY_S(inc, add, 8, uint8_t)
8751fb62fb0SOlivier Houchard #endif /* CK_F_PR_INC_8 */
8761fb62fb0SOlivier Houchard 
8771fb62fb0SOlivier Houchard #ifndef CK_F_PR_INC_8_ZERO
8781fb62fb0SOlivier Houchard #define CK_F_PR_INC_8_ZERO
8791fb62fb0SOlivier Houchard CK_PR_UNARY_Z_S(inc, 8, uint8_t, +, UINT8_MAX)
880725de581SAndriy Gapon #else
881725de581SAndriy Gapon CK_PR_UNARY_Z_STUB(inc, 8, uint8_t)
8821fb62fb0SOlivier Houchard #endif /* CK_F_PR_INC_8_ZERO */
8831fb62fb0SOlivier Houchard 
8841fb62fb0SOlivier Houchard #ifndef CK_F_PR_DEC_8
8851fb62fb0SOlivier Houchard #define CK_F_PR_DEC_8
8861fb62fb0SOlivier Houchard CK_PR_UNARY_S(dec, sub, 8, uint8_t)
8871fb62fb0SOlivier Houchard #endif /* CK_F_PR_DEC_8 */
8881fb62fb0SOlivier Houchard 
8891fb62fb0SOlivier Houchard #ifndef CK_F_PR_DEC_8_ZERO
8901fb62fb0SOlivier Houchard #define CK_F_PR_DEC_8_ZERO
8911fb62fb0SOlivier Houchard CK_PR_UNARY_Z_S(dec, 8, uint8_t, -, 1)
892725de581SAndriy Gapon #else
893725de581SAndriy Gapon CK_PR_UNARY_Z_STUB(dec, 8, uint8_t)
8941fb62fb0SOlivier Houchard #endif /* CK_F_PR_DEC_8_ZERO */
8951fb62fb0SOlivier Houchard 
8961fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_8 && CK_F_PR_CAS_8_VALUE */
8971fb62fb0SOlivier Houchard 
8981fb62fb0SOlivier Houchard #undef CK_PR_UNARY_Z_S
8991fb62fb0SOlivier Houchard #undef CK_PR_UNARY_S
9001fb62fb0SOlivier Houchard #undef CK_PR_UNARY_Z
9011fb62fb0SOlivier Houchard #undef CK_PR_UNARY
9021fb62fb0SOlivier Houchard 
9031fb62fb0SOlivier Houchard #define CK_PR_N(K, S, M, T, P, C)					\
9041fb62fb0SOlivier Houchard 	CK_CC_INLINE static void					\
9051fb62fb0SOlivier Houchard 	ck_pr_##K##_##S(M *target)					\
9061fb62fb0SOlivier Houchard 	{								\
9071fb62fb0SOlivier Houchard 		T previous;						\
9081fb62fb0SOlivier Houchard 		C punt;							\
9091fb62fb0SOlivier Houchard 		punt = (C)ck_pr_md_load_##S(target);			\
9101fb62fb0SOlivier Houchard 		previous = (T)punt;					\
9111fb62fb0SOlivier Houchard 		while (ck_pr_cas_##S##_value(target,			\
9121fb62fb0SOlivier Houchard 					     (C)previous,		\
9131fb62fb0SOlivier Houchard 					     (C)(P previous),		\
9141fb62fb0SOlivier Houchard 					     &previous) == false)	\
9151fb62fb0SOlivier Houchard 			ck_pr_stall();					\
9161fb62fb0SOlivier Houchard 									\
9171fb62fb0SOlivier Houchard 		return;							\
9181fb62fb0SOlivier Houchard 	}
9191fb62fb0SOlivier Houchard 
9201fb62fb0SOlivier Houchard #define CK_PR_N_Z(S, M, T, C)						\
9211fb62fb0SOlivier Houchard 	CK_CC_INLINE static void					\
9221fb62fb0SOlivier Houchard 	ck_pr_neg_##S##_zero(M *target, bool *zero)			\
9231fb62fb0SOlivier Houchard 	{								\
9241fb62fb0SOlivier Houchard 		T previous;						\
9251fb62fb0SOlivier Houchard 		C punt;							\
9261fb62fb0SOlivier Houchard 		punt = (C)ck_pr_md_load_##S(target);			\
9271fb62fb0SOlivier Houchard 		previous = (T)punt;					\
9281fb62fb0SOlivier Houchard 		while (ck_pr_cas_##S##_value(target,			\
9291fb62fb0SOlivier Houchard 					     (C)previous,		\
9301fb62fb0SOlivier Houchard 					     (C)(-previous),		\
9311fb62fb0SOlivier Houchard 					     &previous) == false)	\
9321fb62fb0SOlivier Houchard 			ck_pr_stall();					\
9331fb62fb0SOlivier Houchard 									\
9341fb62fb0SOlivier Houchard 		*zero = previous == 0;					\
9351fb62fb0SOlivier Houchard 		return;							\
9361fb62fb0SOlivier Houchard 	}
9371fb62fb0SOlivier Houchard 
9381fb62fb0SOlivier Houchard #define CK_PR_N_S(K, S, M, P)	CK_PR_N(K, S, M, M, P, M)
9391fb62fb0SOlivier Houchard #define CK_PR_N_Z_S(S, M) 	CK_PR_N_Z(S, M, M, M)
9401fb62fb0SOlivier Houchard 
9411fb62fb0SOlivier Houchard #if defined(CK_F_PR_LOAD_CHAR) && defined(CK_F_PR_CAS_CHAR_VALUE)
9421fb62fb0SOlivier Houchard 
9431fb62fb0SOlivier Houchard #ifndef CK_F_PR_NOT_CHAR
9441fb62fb0SOlivier Houchard #define CK_F_PR_NOT_CHAR
9451fb62fb0SOlivier Houchard CK_PR_N_S(not, char, char, ~)
9461fb62fb0SOlivier Houchard #endif /* CK_F_PR_NOT_CHAR */
9471fb62fb0SOlivier Houchard 
9481fb62fb0SOlivier Houchard #ifndef CK_F_PR_NEG_CHAR
9491fb62fb0SOlivier Houchard #define CK_F_PR_NEG_CHAR
9501fb62fb0SOlivier Houchard CK_PR_N_S(neg, char, char, -)
9511fb62fb0SOlivier Houchard #endif /* CK_F_PR_NEG_CHAR */
9521fb62fb0SOlivier Houchard 
9531fb62fb0SOlivier Houchard #ifndef CK_F_PR_NEG_CHAR_ZERO
9541fb62fb0SOlivier Houchard #define CK_F_PR_NEG_CHAR_ZERO
9551fb62fb0SOlivier Houchard CK_PR_N_Z_S(char, char)
9561fb62fb0SOlivier Houchard #endif /* CK_F_PR_NEG_CHAR_ZERO */
9571fb62fb0SOlivier Houchard 
9581fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_CHAR && CK_F_PR_CAS_CHAR_VALUE */
9591fb62fb0SOlivier Houchard 
9601fb62fb0SOlivier Houchard #if defined(CK_F_PR_LOAD_INT) && defined(CK_F_PR_CAS_INT_VALUE)
9611fb62fb0SOlivier Houchard 
9621fb62fb0SOlivier Houchard #ifndef CK_F_PR_NOT_INT
9631fb62fb0SOlivier Houchard #define CK_F_PR_NOT_INT
9641fb62fb0SOlivier Houchard CK_PR_N_S(not, int, int, ~)
9651fb62fb0SOlivier Houchard #endif /* CK_F_PR_NOT_INT */
9661fb62fb0SOlivier Houchard 
9671fb62fb0SOlivier Houchard #ifndef CK_F_PR_NEG_INT
9681fb62fb0SOlivier Houchard #define CK_F_PR_NEG_INT
9691fb62fb0SOlivier Houchard CK_PR_N_S(neg, int, int, -)
9701fb62fb0SOlivier Houchard #endif /* CK_F_PR_NEG_INT */
9711fb62fb0SOlivier Houchard 
9721fb62fb0SOlivier Houchard #ifndef CK_F_PR_NEG_INT_ZERO
9731fb62fb0SOlivier Houchard #define CK_F_PR_NEG_INT_ZERO
9741fb62fb0SOlivier Houchard CK_PR_N_Z_S(int, int)
9751fb62fb0SOlivier Houchard #endif /* CK_F_PR_NEG_INT_ZERO */
9761fb62fb0SOlivier Houchard 
9771fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_INT && CK_F_PR_CAS_INT_VALUE */
9781fb62fb0SOlivier Houchard 
9798f87df16SOlivier Houchard #if defined(CK_F_PR_LOAD_DOUBLE) && defined(CK_F_PR_CAS_DOUBLE_VALUE) && \
9808f87df16SOlivier Houchard 	    !defined(CK_PR_DISABLE_DOUBLE)
9811fb62fb0SOlivier Houchard 
9821fb62fb0SOlivier Houchard #ifndef CK_F_PR_NEG_DOUBLE
9831fb62fb0SOlivier Houchard #define CK_F_PR_NEG_DOUBLE
9841fb62fb0SOlivier Houchard CK_PR_N_S(neg, double, double, -)
9851fb62fb0SOlivier Houchard #endif /* CK_F_PR_NEG_DOUBLE */
9861fb62fb0SOlivier Houchard 
9878f87df16SOlivier Houchard #endif /* CK_F_PR_LOAD_DOUBLE && CK_F_PR_CAS_DOUBLE_VALUE && !CK_PR_DISABLE_DOUBLE */
9881fb62fb0SOlivier Houchard 
9891fb62fb0SOlivier Houchard #if defined(CK_F_PR_LOAD_UINT) && defined(CK_F_PR_CAS_UINT_VALUE)
9901fb62fb0SOlivier Houchard 
9911fb62fb0SOlivier Houchard #ifndef CK_F_PR_NOT_UINT
9921fb62fb0SOlivier Houchard #define CK_F_PR_NOT_UINT
9931fb62fb0SOlivier Houchard CK_PR_N_S(not, uint, unsigned int, ~)
9941fb62fb0SOlivier Houchard #endif /* CK_F_PR_NOT_UINT */
9951fb62fb0SOlivier Houchard 
9961fb62fb0SOlivier Houchard #ifndef CK_F_PR_NEG_UINT
9971fb62fb0SOlivier Houchard #define CK_F_PR_NEG_UINT
9981fb62fb0SOlivier Houchard CK_PR_N_S(neg, uint, unsigned int, -)
9991fb62fb0SOlivier Houchard #endif /* CK_F_PR_NEG_UINT */
10001fb62fb0SOlivier Houchard 
10011fb62fb0SOlivier Houchard #ifndef CK_F_PR_NEG_UINT_ZERO
10021fb62fb0SOlivier Houchard #define CK_F_PR_NEG_UINT_ZERO
10031fb62fb0SOlivier Houchard CK_PR_N_Z_S(uint, unsigned int)
10041fb62fb0SOlivier Houchard #endif /* CK_F_PR_NEG_UINT_ZERO */
10051fb62fb0SOlivier Houchard 
10061fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_UINT && CK_F_PR_CAS_UINT_VALUE */
10071fb62fb0SOlivier Houchard 
10081fb62fb0SOlivier Houchard #if defined(CK_F_PR_LOAD_PTR) && defined(CK_F_PR_CAS_PTR_VALUE)
10091fb62fb0SOlivier Houchard 
10101fb62fb0SOlivier Houchard #ifndef CK_F_PR_NOT_PTR
10111fb62fb0SOlivier Houchard #define CK_F_PR_NOT_PTR
10121fb62fb0SOlivier Houchard CK_PR_N(not, ptr, void, uintptr_t, ~, void *)
10131fb62fb0SOlivier Houchard #endif /* CK_F_PR_NOT_PTR */
10141fb62fb0SOlivier Houchard 
10151fb62fb0SOlivier Houchard #ifndef CK_F_PR_NEG_PTR
10161fb62fb0SOlivier Houchard #define CK_F_PR_NEG_PTR
10171fb62fb0SOlivier Houchard CK_PR_N(neg, ptr, void, uintptr_t, -, void *)
10181fb62fb0SOlivier Houchard #endif /* CK_F_PR_NEG_PTR */
10191fb62fb0SOlivier Houchard 
10201fb62fb0SOlivier Houchard #ifndef CK_F_PR_NEG_PTR_ZERO
10211fb62fb0SOlivier Houchard #define CK_F_PR_NEG_PTR_ZERO
10221fb62fb0SOlivier Houchard CK_PR_N_Z(ptr, void, uintptr_t, void *)
10231fb62fb0SOlivier Houchard #endif /* CK_F_PR_NEG_PTR_ZERO */
10241fb62fb0SOlivier Houchard 
10251fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_PTR && CK_F_PR_CAS_PTR_VALUE */
10261fb62fb0SOlivier Houchard 
10271fb62fb0SOlivier Houchard #if defined(CK_F_PR_LOAD_64) && defined(CK_F_PR_CAS_64_VALUE)
10281fb62fb0SOlivier Houchard 
10291fb62fb0SOlivier Houchard #ifndef CK_F_PR_NOT_64
10301fb62fb0SOlivier Houchard #define CK_F_PR_NOT_64
10311fb62fb0SOlivier Houchard CK_PR_N_S(not, 64, uint64_t, ~)
10321fb62fb0SOlivier Houchard #endif /* CK_F_PR_NOT_64 */
10331fb62fb0SOlivier Houchard 
10341fb62fb0SOlivier Houchard #ifndef CK_F_PR_NEG_64
10351fb62fb0SOlivier Houchard #define CK_F_PR_NEG_64
10361fb62fb0SOlivier Houchard CK_PR_N_S(neg, 64, uint64_t, -)
10371fb62fb0SOlivier Houchard #endif /* CK_F_PR_NEG_64 */
10381fb62fb0SOlivier Houchard 
10391fb62fb0SOlivier Houchard #ifndef CK_F_PR_NEG_64_ZERO
10401fb62fb0SOlivier Houchard #define CK_F_PR_NEG_64_ZERO
10411fb62fb0SOlivier Houchard CK_PR_N_Z_S(64, uint64_t)
10421fb62fb0SOlivier Houchard #endif /* CK_F_PR_NEG_64_ZERO */
10431fb62fb0SOlivier Houchard 
10441fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_64 && CK_F_PR_CAS_64_VALUE */
10451fb62fb0SOlivier Houchard 
10461fb62fb0SOlivier Houchard #if defined(CK_F_PR_LOAD_32) && defined(CK_F_PR_CAS_32_VALUE)
10471fb62fb0SOlivier Houchard 
10481fb62fb0SOlivier Houchard #ifndef CK_F_PR_NOT_32
10491fb62fb0SOlivier Houchard #define CK_F_PR_NOT_32
10501fb62fb0SOlivier Houchard CK_PR_N_S(not, 32, uint32_t, ~)
10511fb62fb0SOlivier Houchard #endif /* CK_F_PR_NOT_32 */
10521fb62fb0SOlivier Houchard 
10531fb62fb0SOlivier Houchard #ifndef CK_F_PR_NEG_32
10541fb62fb0SOlivier Houchard #define CK_F_PR_NEG_32
10551fb62fb0SOlivier Houchard CK_PR_N_S(neg, 32, uint32_t, -)
10561fb62fb0SOlivier Houchard #endif /* CK_F_PR_NEG_32 */
10571fb62fb0SOlivier Houchard 
10581fb62fb0SOlivier Houchard #ifndef CK_F_PR_NEG_32_ZERO
10591fb62fb0SOlivier Houchard #define CK_F_PR_NEG_32_ZERO
10601fb62fb0SOlivier Houchard CK_PR_N_Z_S(32, uint32_t)
10611fb62fb0SOlivier Houchard #endif /* CK_F_PR_NEG_32_ZERO */
10621fb62fb0SOlivier Houchard 
10631fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_32 && CK_F_PR_CAS_32_VALUE */
10641fb62fb0SOlivier Houchard 
10651fb62fb0SOlivier Houchard #if defined(CK_F_PR_LOAD_16) && defined(CK_F_PR_CAS_16_VALUE)
10661fb62fb0SOlivier Houchard 
10671fb62fb0SOlivier Houchard #ifndef CK_F_PR_NOT_16
10681fb62fb0SOlivier Houchard #define CK_F_PR_NOT_16
10691fb62fb0SOlivier Houchard CK_PR_N_S(not, 16, uint16_t, ~)
10701fb62fb0SOlivier Houchard #endif /* CK_F_PR_NOT_16 */
10711fb62fb0SOlivier Houchard 
10721fb62fb0SOlivier Houchard #ifndef CK_F_PR_NEG_16
10731fb62fb0SOlivier Houchard #define CK_F_PR_NEG_16
10741fb62fb0SOlivier Houchard CK_PR_N_S(neg, 16, uint16_t, -)
10751fb62fb0SOlivier Houchard #endif /* CK_F_PR_NEG_16 */
10761fb62fb0SOlivier Houchard 
10771fb62fb0SOlivier Houchard #ifndef CK_F_PR_NEG_16_ZERO
10781fb62fb0SOlivier Houchard #define CK_F_PR_NEG_16_ZERO
10791fb62fb0SOlivier Houchard CK_PR_N_Z_S(16, uint16_t)
10801fb62fb0SOlivier Houchard #endif /* CK_F_PR_NEG_16_ZERO */
10811fb62fb0SOlivier Houchard 
10821fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_16 && CK_F_PR_CAS_16_VALUE */
10831fb62fb0SOlivier Houchard 
10841fb62fb0SOlivier Houchard #if defined(CK_F_PR_LOAD_8) && defined(CK_F_PR_CAS_8_VALUE)
10851fb62fb0SOlivier Houchard 
10861fb62fb0SOlivier Houchard #ifndef CK_F_PR_NOT_8
10871fb62fb0SOlivier Houchard #define CK_F_PR_NOT_8
10881fb62fb0SOlivier Houchard CK_PR_N_S(not, 8, uint8_t, ~)
10891fb62fb0SOlivier Houchard #endif /* CK_F_PR_NOT_8 */
10901fb62fb0SOlivier Houchard 
10911fb62fb0SOlivier Houchard #ifndef CK_F_PR_NEG_8
10921fb62fb0SOlivier Houchard #define CK_F_PR_NEG_8
10931fb62fb0SOlivier Houchard CK_PR_N_S(neg, 8, uint8_t, -)
10941fb62fb0SOlivier Houchard #endif /* CK_F_PR_NEG_8 */
10951fb62fb0SOlivier Houchard 
10961fb62fb0SOlivier Houchard #ifndef CK_F_PR_NEG_8_ZERO
10971fb62fb0SOlivier Houchard #define CK_F_PR_NEG_8_ZERO
10981fb62fb0SOlivier Houchard CK_PR_N_Z_S(8, uint8_t)
10991fb62fb0SOlivier Houchard #endif /* CK_F_PR_NEG_8_ZERO */
11001fb62fb0SOlivier Houchard 
11011fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_8 && CK_F_PR_CAS_8_VALUE */
11021fb62fb0SOlivier Houchard 
11031fb62fb0SOlivier Houchard #undef CK_PR_N_Z_S
11041fb62fb0SOlivier Houchard #undef CK_PR_N_S
11051fb62fb0SOlivier Houchard #undef CK_PR_N_Z
11061fb62fb0SOlivier Houchard #undef CK_PR_N
11071fb62fb0SOlivier Houchard 
11081fb62fb0SOlivier Houchard #define CK_PR_FAA(S, M, T, C)						\
11091fb62fb0SOlivier Houchard 	CK_CC_INLINE static C						\
11101fb62fb0SOlivier Houchard 	ck_pr_faa_##S(M *target, T delta)				\
11111fb62fb0SOlivier Houchard 	{								\
11121fb62fb0SOlivier Houchard 		T previous;						\
11131fb62fb0SOlivier Houchard 		C punt;							\
11141fb62fb0SOlivier Houchard 		punt = (C)ck_pr_md_load_##S(target);			\
11151fb62fb0SOlivier Houchard 		previous = (T)punt;					\
11161fb62fb0SOlivier Houchard 		while (ck_pr_cas_##S##_value(target,			\
11171fb62fb0SOlivier Houchard 					     (C)previous,		\
11181fb62fb0SOlivier Houchard 					     (C)(previous + delta),	\
11191fb62fb0SOlivier Houchard 					     &previous) == false)	\
11201fb62fb0SOlivier Houchard 			ck_pr_stall();					\
11211fb62fb0SOlivier Houchard 									\
11221fb62fb0SOlivier Houchard 		return ((C)previous);					\
11231fb62fb0SOlivier Houchard 	}
11241fb62fb0SOlivier Houchard 
11251fb62fb0SOlivier Houchard #define CK_PR_FAS(S, M, C)						\
11261fb62fb0SOlivier Houchard 	CK_CC_INLINE static C						\
11271fb62fb0SOlivier Houchard 	ck_pr_fas_##S(M *target, C update)				\
11281fb62fb0SOlivier Houchard 	{								\
11291fb62fb0SOlivier Houchard 		C previous;						\
11301fb62fb0SOlivier Houchard 		previous = ck_pr_md_load_##S(target);			\
11311fb62fb0SOlivier Houchard 		while (ck_pr_cas_##S##_value(target,			\
11321fb62fb0SOlivier Houchard 					     previous,			\
11331fb62fb0SOlivier Houchard 					     update,			\
11341fb62fb0SOlivier Houchard 					     &previous) == false)	\
11351fb62fb0SOlivier Houchard 			ck_pr_stall();					\
11361fb62fb0SOlivier Houchard 									\
11371fb62fb0SOlivier Houchard 		return (previous);					\
11381fb62fb0SOlivier Houchard 	}
11391fb62fb0SOlivier Houchard 
11401fb62fb0SOlivier Houchard #define CK_PR_FAA_S(S, M) CK_PR_FAA(S, M, M, M)
11411fb62fb0SOlivier Houchard #define CK_PR_FAS_S(S, M) CK_PR_FAS(S, M, M)
11421fb62fb0SOlivier Houchard 
11431fb62fb0SOlivier Houchard #if defined(CK_F_PR_LOAD_CHAR) && defined(CK_F_PR_CAS_CHAR_VALUE)
11441fb62fb0SOlivier Houchard 
11451fb62fb0SOlivier Houchard #ifndef CK_F_PR_FAA_CHAR
11461fb62fb0SOlivier Houchard #define CK_F_PR_FAA_CHAR
11471fb62fb0SOlivier Houchard CK_PR_FAA_S(char, char)
11481fb62fb0SOlivier Houchard #endif /* CK_F_PR_FAA_CHAR */
11491fb62fb0SOlivier Houchard 
11501fb62fb0SOlivier Houchard #ifndef CK_F_PR_FAS_CHAR
11511fb62fb0SOlivier Houchard #define CK_F_PR_FAS_CHAR
11521fb62fb0SOlivier Houchard CK_PR_FAS_S(char, char)
11531fb62fb0SOlivier Houchard #endif /* CK_F_PR_FAS_CHAR */
11541fb62fb0SOlivier Houchard 
11551fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_CHAR && CK_F_PR_CAS_CHAR_VALUE */
11561fb62fb0SOlivier Houchard 
11571fb62fb0SOlivier Houchard #if defined(CK_F_PR_LOAD_INT) && defined(CK_F_PR_CAS_INT_VALUE)
11581fb62fb0SOlivier Houchard 
11591fb62fb0SOlivier Houchard #ifndef CK_F_PR_FAA_INT
11601fb62fb0SOlivier Houchard #define CK_F_PR_FAA_INT
11611fb62fb0SOlivier Houchard CK_PR_FAA_S(int, int)
11621fb62fb0SOlivier Houchard #endif /* CK_F_PR_FAA_INT */
11631fb62fb0SOlivier Houchard 
11641fb62fb0SOlivier Houchard #ifndef CK_F_PR_FAS_INT
11651fb62fb0SOlivier Houchard #define CK_F_PR_FAS_INT
11661fb62fb0SOlivier Houchard CK_PR_FAS_S(int, int)
11671fb62fb0SOlivier Houchard #endif /* CK_F_PR_FAS_INT */
11681fb62fb0SOlivier Houchard 
11691fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_INT && CK_F_PR_CAS_INT_VALUE */
11701fb62fb0SOlivier Houchard 
11718f87df16SOlivier Houchard #if defined(CK_F_PR_LOAD_DOUBLE) && defined(CK_F_PR_CAS_DOUBLE_VALUE) && \
11728f87df16SOlivier Houchard 	    !defined(CK_PR_DISABLE_DOUBLE)
11731fb62fb0SOlivier Houchard 
11741fb62fb0SOlivier Houchard #ifndef CK_F_PR_FAA_DOUBLE
11751fb62fb0SOlivier Houchard #define CK_F_PR_FAA_DOUBLE
11761fb62fb0SOlivier Houchard CK_PR_FAA_S(double, double)
11771fb62fb0SOlivier Houchard #endif /* CK_F_PR_FAA_DOUBLE */
11781fb62fb0SOlivier Houchard 
11791fb62fb0SOlivier Houchard #ifndef CK_F_PR_FAS_DOUBLE
11801fb62fb0SOlivier Houchard #define CK_F_PR_FAS_DOUBLE
11811fb62fb0SOlivier Houchard CK_PR_FAS_S(double, double)
11821fb62fb0SOlivier Houchard #endif /* CK_F_PR_FAS_DOUBLE */
11831fb62fb0SOlivier Houchard 
11848f87df16SOlivier Houchard #endif /* CK_F_PR_LOAD_DOUBLE && CK_F_PR_CAS_DOUBLE_VALUE && !CK_PR_DISABLE_DOUBLE */
11851fb62fb0SOlivier Houchard 
11861fb62fb0SOlivier Houchard #if defined(CK_F_PR_LOAD_UINT) && defined(CK_F_PR_CAS_UINT_VALUE)
11871fb62fb0SOlivier Houchard 
11881fb62fb0SOlivier Houchard #ifndef CK_F_PR_FAA_UINT
11891fb62fb0SOlivier Houchard #define CK_F_PR_FAA_UINT
11901fb62fb0SOlivier Houchard CK_PR_FAA_S(uint, unsigned int)
11911fb62fb0SOlivier Houchard #endif /* CK_F_PR_FAA_UINT */
11921fb62fb0SOlivier Houchard 
11931fb62fb0SOlivier Houchard #ifndef CK_F_PR_FAS_UINT
11941fb62fb0SOlivier Houchard #define CK_F_PR_FAS_UINT
11951fb62fb0SOlivier Houchard CK_PR_FAS_S(uint, unsigned int)
11961fb62fb0SOlivier Houchard #endif /* CK_F_PR_FAS_UINT */
11971fb62fb0SOlivier Houchard 
11981fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_UINT && CK_F_PR_CAS_UINT_VALUE */
11991fb62fb0SOlivier Houchard 
12001fb62fb0SOlivier Houchard #if defined(CK_F_PR_LOAD_PTR) && defined(CK_F_PR_CAS_PTR_VALUE)
12011fb62fb0SOlivier Houchard 
12021fb62fb0SOlivier Houchard #ifndef CK_F_PR_FAA_PTR
12031fb62fb0SOlivier Houchard #define CK_F_PR_FAA_PTR
12041fb62fb0SOlivier Houchard CK_PR_FAA(ptr, void, uintptr_t, void *)
12051fb62fb0SOlivier Houchard #endif /* CK_F_PR_FAA_PTR */
12061fb62fb0SOlivier Houchard 
12071fb62fb0SOlivier Houchard #ifndef CK_F_PR_FAS_PTR
12081fb62fb0SOlivier Houchard #define CK_F_PR_FAS_PTR
12091fb62fb0SOlivier Houchard CK_PR_FAS(ptr, void, void *)
12101fb62fb0SOlivier Houchard #endif /* CK_F_PR_FAS_PTR */
12111fb62fb0SOlivier Houchard 
12121fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_PTR && CK_F_PR_CAS_PTR_VALUE */
12131fb62fb0SOlivier Houchard 
12141fb62fb0SOlivier Houchard #if defined(CK_F_PR_LOAD_64) && defined(CK_F_PR_CAS_64_VALUE)
12151fb62fb0SOlivier Houchard 
12161fb62fb0SOlivier Houchard #ifndef CK_F_PR_FAA_64
12171fb62fb0SOlivier Houchard #define CK_F_PR_FAA_64
12181fb62fb0SOlivier Houchard CK_PR_FAA_S(64, uint64_t)
12191fb62fb0SOlivier Houchard #endif /* CK_F_PR_FAA_64 */
12201fb62fb0SOlivier Houchard 
12211fb62fb0SOlivier Houchard #ifndef CK_F_PR_FAS_64
12221fb62fb0SOlivier Houchard #define CK_F_PR_FAS_64
12231fb62fb0SOlivier Houchard CK_PR_FAS_S(64, uint64_t)
12241fb62fb0SOlivier Houchard #endif /* CK_F_PR_FAS_64 */
12251fb62fb0SOlivier Houchard 
12261fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_64 && CK_F_PR_CAS_64_VALUE */
12271fb62fb0SOlivier Houchard 
12281fb62fb0SOlivier Houchard #if defined(CK_F_PR_LOAD_32) && defined(CK_F_PR_CAS_32_VALUE)
12291fb62fb0SOlivier Houchard 
12301fb62fb0SOlivier Houchard #ifndef CK_F_PR_FAA_32
12311fb62fb0SOlivier Houchard #define CK_F_PR_FAA_32
12321fb62fb0SOlivier Houchard CK_PR_FAA_S(32, uint32_t)
12331fb62fb0SOlivier Houchard #endif /* CK_F_PR_FAA_32 */
12341fb62fb0SOlivier Houchard 
12351fb62fb0SOlivier Houchard #ifndef CK_F_PR_FAS_32
12361fb62fb0SOlivier Houchard #define CK_F_PR_FAS_32
12371fb62fb0SOlivier Houchard CK_PR_FAS_S(32, uint32_t)
12381fb62fb0SOlivier Houchard #endif /* CK_F_PR_FAS_32 */
12391fb62fb0SOlivier Houchard 
12401fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_32 && CK_F_PR_CAS_32_VALUE */
12411fb62fb0SOlivier Houchard 
12421fb62fb0SOlivier Houchard #if defined(CK_F_PR_LOAD_16) && defined(CK_F_PR_CAS_16_VALUE)
12431fb62fb0SOlivier Houchard 
12441fb62fb0SOlivier Houchard #ifndef CK_F_PR_FAA_16
12451fb62fb0SOlivier Houchard #define CK_F_PR_FAA_16
12461fb62fb0SOlivier Houchard CK_PR_FAA_S(16, uint16_t)
12471fb62fb0SOlivier Houchard #endif /* CK_F_PR_FAA_16 */
12481fb62fb0SOlivier Houchard 
12491fb62fb0SOlivier Houchard #ifndef CK_F_PR_FAS_16
12501fb62fb0SOlivier Houchard #define CK_F_PR_FAS_16
12511fb62fb0SOlivier Houchard CK_PR_FAS_S(16, uint16_t)
12521fb62fb0SOlivier Houchard #endif /* CK_F_PR_FAS_16 */
12531fb62fb0SOlivier Houchard 
12541fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_16 && CK_F_PR_CAS_16_VALUE */
12551fb62fb0SOlivier Houchard 
12561fb62fb0SOlivier Houchard #if defined(CK_F_PR_LOAD_8) && defined(CK_F_PR_CAS_8_VALUE)
12571fb62fb0SOlivier Houchard 
12581fb62fb0SOlivier Houchard #ifndef CK_F_PR_FAA_8
12591fb62fb0SOlivier Houchard #define CK_F_PR_FAA_8
12601fb62fb0SOlivier Houchard CK_PR_FAA_S(8, uint8_t)
12611fb62fb0SOlivier Houchard #endif /* CK_F_PR_FAA_8 */
12621fb62fb0SOlivier Houchard 
12631fb62fb0SOlivier Houchard #ifndef CK_F_PR_FAS_8
12641fb62fb0SOlivier Houchard #define CK_F_PR_FAS_8
12651fb62fb0SOlivier Houchard CK_PR_FAS_S(8, uint8_t)
12661fb62fb0SOlivier Houchard #endif /* CK_F_PR_FAS_8 */
12671fb62fb0SOlivier Houchard 
12681fb62fb0SOlivier Houchard #endif /* CK_F_PR_LOAD_8 && CK_F_PR_CAS_8_VALUE */
12691fb62fb0SOlivier Houchard 
12701fb62fb0SOlivier Houchard #undef CK_PR_FAA_S
12711fb62fb0SOlivier Houchard #undef CK_PR_FAS_S
12721fb62fb0SOlivier Houchard #undef CK_PR_FAA
12731fb62fb0SOlivier Houchard #undef CK_PR_FAS
12741fb62fb0SOlivier Houchard 
12751fb62fb0SOlivier Houchard #endif /* CK_PR_H */
1276