@@ -18,3 +18,60 @@ __CLC_NVVM_ATOMIC(ulong, m, ulong, ul, min, _Z18__spirv_AtomicUMin)
18
18
#undef __CLC_NVVM_ATOMIC_TYPES
19
19
#undef __CLC_NVVM_ATOMIC
20
20
#undef __CLC_NVVM_ATOMIC_IMPL
21
+
22
+ #define __CLC_NVVM_ATOMIC_MIN_IMPL (TYPE , TYPE_MANGLED , TYPE_INT , \
23
+ TYPE_INT_MANGLED , OP_MANGLED , ADDR_SPACE , \
24
+ ADDR_SPACE_MANGLED ) \
25
+ TYPE_INT \
26
+ _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, \
32
+ enum MemorySemanticsMask, 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 = \
50
+ (volatile ADDR_SPACE TYPE_INT *)pointer; \
51
+ TYPE_INT val_int = *(TYPE_INT *)&val; \
52
+ TYPE_INT old_int = \
53
+ _Z18__spirv_AtomicLoadPU3##ADDR_SPACE_MANGLED##K##TYPE_INT_MANGLED##N5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagE( \
54
+ pointer_int, scope, load_order); \
55
+ TYPE old = *(TYPE *)&old_int; \
56
+ while (val < old) { \
57
+ TYPE_INT tmp_int = \
58
+ _Z29__spirv_AtomicCompareExchange##PU3##ADDR_SPACE_MANGLED##TYPE_INT_MANGLED##N5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagES5_##TYPE_INT_MANGLED##TYPE_INT_MANGLED( \
59
+ pointer_int, scope, semantics, semantics, val_int, old_int); \
60
+ if (old_int == tmp_int) { \
61
+ return *(TYPE *)&tmp_int; \
62
+ } \
63
+ old_int = tmp_int; \
64
+ old = *(TYPE *)&old_int; \
65
+ } \
66
+ return old; \
67
+ }
68
+
69
+ #define __CLC_NVVM_ATOMIC_MIN (TYPE , TYPE_MANGLED , TYPE_INT , TYPE_INT_MANGLED , \
70
+ OP_MANGLED ) \
71
+ __CLC_NVVM_ATOMIC_MIN_IMPL(TYPE, TYPE_MANGLED, TYPE_INT, TYPE_INT_MANGLED, \
72
+ OP_MANGLED, __global, AS1) \
73
+ __CLC_NVVM_ATOMIC_MIN_IMPL(TYPE, TYPE_MANGLED, TYPE_INT, TYPE_INT_MANGLED, \
74
+ OP_MANGLED, __local, AS3)
75
+
76
+ __CLC_NVVM_ATOMIC_MIN (float , f , int , i , FMinEXT )
77
+ __CLC_NVVM_ATOMIC_MIN (double , d , long , l , FMinEXT )
0 commit comments