@@ -21,53 +21,59 @@ __CLC_NVVM_ATOMIC(unsigned long, m, unsigned long, ul, max,
21
21
#undef __CLC_NVVM_ATOMIC
22
22
#undef __CLC_NVVM_ATOMIC_IMPL
23
23
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; \
64
69
}
65
70
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
+
72
78
__CLC_NVVM_ATOMIC_MAX (float , f , int , i , FMaxEXT )
73
79
__CLC_NVVM_ATOMIC_MAX (double , d , long , l , FMaxEXT )
0 commit comments