@@ -21,53 +21,59 @@ __CLC_NVVM_ATOMIC(unsigned long, m, unsigned long, ul, max,
2121#undef __CLC_NVVM_ATOMIC
2222#undef __CLC_NVVM_ATOMIC_IMPL
2323
24- #define __CLC_NVVM_ATOMIC_MAX_IMPL (TYPE , TYPE_MANGLED , TYPE_INT , TYPE_INT_MANGLED , OP_MANGLED , \
25- ADDR_SPACE , ADDR_SPACE_MANGLED ) \
26- TYPE_INT _Z18__spirv_AtomicLoadPU3##ADDR_SPACE_MANGLED##K##TYPE_INT_MANGLED##N5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagE( \
27- volatile ADDR_SPACE const TYPE_INT *, enum Scope, \
28- enum MemorySemanticsMask); \
29- TYPE_INT \
30- _Z29__spirv_AtomicCompareExchange##PU3##ADDR_SPACE_MANGLED##TYPE_INT_MANGLED##N5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagES5_##TYPE_INT_MANGLED##TYPE_INT_MANGLED( \
31- volatile ADDR_SPACE TYPE_INT *, enum Scope, enum MemorySemanticsMask, enum MemorySemanticsMask, \
32- TYPE_INT, TYPE_INT); \
33- _CLC_DECL TYPE \
34- _Z21__spirv_Atomic##OP_MANGLED##PU3##ADDR_SPACE_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagE##TYPE_MANGLED( \
35- volatile ADDR_SPACE TYPE *pointer, enum Scope scope, \
36- enum MemorySemanticsMask semantics, TYPE val) { \
37- enum MemorySemanticsMask load_order; \
38- switch (semantics) { \
39- case SequentiallyConsistent: \
40- load_order = SequentiallyConsistent; \
41- break; \
42- case Acquire: \
43- case AcquireRelease: \
44- load_order = Acquire; \
45- break; \
46- default: \
47- load_order = None; \
48- } \
49- volatile ADDR_SPACE TYPE_INT* pointer_int = (volatile ADDR_SPACE TYPE_INT *)pointer; \
50- TYPE_INT val_int = *(TYPE_INT*)&val; \
51- TYPE_INT old_int = _Z18__spirv_AtomicLoadPU3##ADDR_SPACE_MANGLED##K##TYPE_INT_MANGLED##N5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagE( \
52- pointer_int, scope, load_order); \
53- TYPE old = *(TYPE*)&old_int; \
54- while (val > old) { \
55- TYPE_INT tmp_int = _Z29__spirv_AtomicCompareExchange##PU3##ADDR_SPACE_MANGLED##TYPE_INT_MANGLED##N5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagES5_##TYPE_INT_MANGLED##TYPE_INT_MANGLED( \
56- pointer_int, scope, semantics, semantics, val_int, old_int); \
57- if(old_int == tmp_int){ \
58- return *(TYPE*)&tmp_int; \
59- } \
60- old_int = tmp_int; \
61- old = *(TYPE*)&old_int; \
62- } \
63- return old; \
24+ #define __CLC_NVVM_ATOMIC_MAX_IMPL (TYPE , TYPE_MANGLED , TYPE_INT , \
25+ TYPE_INT_MANGLED , OP_MANGLED , ADDR_SPACE , \
26+ ADDR_SPACE_MANGLED ) \
27+ TYPE_INT \
28+ _Z18__spirv_AtomicLoadPU3##ADDR_SPACE_MANGLED##K##TYPE_INT_MANGLED##N5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagE( \
29+ volatile ADDR_SPACE const TYPE_INT *, enum Scope, \
30+ enum MemorySemanticsMask); \
31+ TYPE_INT \
32+ _Z29__spirv_AtomicCompareExchange##PU3##ADDR_SPACE_MANGLED##TYPE_INT_MANGLED##N5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagES5_##TYPE_INT_MANGLED##TYPE_INT_MANGLED( \
33+ volatile ADDR_SPACE TYPE_INT *, enum Scope, enum MemorySemanticsMask, \
34+ enum MemorySemanticsMask, TYPE_INT, TYPE_INT); \
35+ _CLC_DECL TYPE \
36+ _Z21__spirv_Atomic##OP_MANGLED##PU3##ADDR_SPACE_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagE##TYPE_MANGLED( \
37+ volatile ADDR_SPACE TYPE *pointer, enum Scope scope, \
38+ enum MemorySemanticsMask semantics, TYPE val) { \
39+ enum MemorySemanticsMask load_order; \
40+ switch (semantics) { \
41+ case SequentiallyConsistent: \
42+ load_order = SequentiallyConsistent; \
43+ break; \
44+ case Acquire: \
45+ case AcquireRelease: \
46+ load_order = Acquire; \
47+ break; \
48+ default: \
49+ load_order = None; \
50+ } \
51+ volatile ADDR_SPACE TYPE_INT *pointer_int = \
52+ (volatile ADDR_SPACE TYPE_INT *)pointer; \
53+ TYPE_INT val_int = *(TYPE_INT *)&val; \
54+ TYPE_INT old_int = \
55+ _Z18__spirv_AtomicLoadPU3##ADDR_SPACE_MANGLED##K##TYPE_INT_MANGLED##N5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagE( \
56+ pointer_int, scope, load_order); \
57+ TYPE old = *(TYPE *)&old_int; \
58+ while (val > old) { \
59+ TYPE_INT tmp_int = \
60+ _Z29__spirv_AtomicCompareExchange##PU3##ADDR_SPACE_MANGLED##TYPE_INT_MANGLED##N5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagES5_##TYPE_INT_MANGLED##TYPE_INT_MANGLED( \
61+ pointer_int, scope, semantics, semantics, val_int, old_int); \
62+ if (old_int == tmp_int) { \
63+ return *(TYPE *)&tmp_int; \
64+ } \
65+ old_int = tmp_int; \
66+ old = *(TYPE *)&old_int; \
67+ } \
68+ return old; \
6469 }
6570
66- #define __CLC_NVVM_ATOMIC_MAX (TYPE , TYPE_MANGLED , TYPE_INT , TYPE_INT_MANGLED , OP_MANGLED ) \
67- __CLC_NVVM_ATOMIC_MAX_IMPL(TYPE, TYPE_MANGLED, TYPE_INT, TYPE_INT_MANGLED, OP_MANGLED, __global, \
68- AS1) \
69- __CLC_NVVM_ATOMIC_MAX_IMPL(TYPE, TYPE_MANGLED, TYPE_INT, TYPE_INT_MANGLED, OP_MANGLED, __local, \
70- AS3)
71-
71+ #define __CLC_NVVM_ATOMIC_MAX (TYPE , TYPE_MANGLED , TYPE_INT , TYPE_INT_MANGLED , \
72+ OP_MANGLED ) \
73+ __CLC_NVVM_ATOMIC_MAX_IMPL(TYPE, TYPE_MANGLED, TYPE_INT, TYPE_INT_MANGLED, \
74+ OP_MANGLED, __global, AS1) \
75+ __CLC_NVVM_ATOMIC_MAX_IMPL(TYPE, TYPE_MANGLED, TYPE_INT, TYPE_INT_MANGLED, \
76+ OP_MANGLED, __local, AS3)
77+
7278__CLC_NVVM_ATOMIC_MAX (float , f , int , i , FMaxEXT )
7379__CLC_NVVM_ATOMIC_MAX (double , d , long , l , FMaxEXT )
0 commit comments