Skip to content

Commit 84bae21

Browse files
authored
Implement missing overloads for generic AS in generic target (#13938)
Following up to #13428, this PR implements the overloads for the generic AS that are missing in the `generic` libclc target.
1 parent 8086df5 commit 84bae21

File tree

11 files changed

+331
-80
lines changed

11 files changed

+331
-80
lines changed

libclc/generic/libspirv/atomic/atomic_add.cl

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,23 +10,39 @@
1010

1111
// TODO: Stop manually mangling this name. Need C++ namespaces to get the exact mangling.
1212

13-
#define IMPL(TYPE, TYPE_MANGLED, AS, AS_MANGLED, FN_NAME) \
13+
#define IMPL(TYPE, TYPE_MANGLED, AS, AS_MANGLED, SUB, FN_NAME) \
1414
_CLC_DEF TYPE \
15-
_Z18__spirv_AtomicIAddPU3##AS_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagE##TYPE_MANGLED( \
15+
_Z18__spirv_AtomicIAddP##AS_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS##SUB##_19MemorySemanticsMask4FlagE##TYPE_MANGLED( \
1616
volatile AS TYPE *p, enum Scope scope, \
1717
enum MemorySemanticsMask semantics, TYPE val) { \
1818
return FN_NAME(p, val); \
1919
}
2020

21-
IMPL(int, i, global, AS1, __sync_fetch_and_add)
22-
IMPL(unsigned int, j, global, AS1, __sync_fetch_and_add)
23-
IMPL(int, i, local, AS3, __sync_fetch_and_add)
24-
IMPL(unsigned int, j, local, AS3, __sync_fetch_and_add)
21+
IMPL(int, i, global, U3AS1, 1, __sync_fetch_and_add)
22+
IMPL(unsigned int, j, global, U3AS1, 1, __sync_fetch_and_add)
23+
IMPL(int, i, local, U3AS3, 1, __sync_fetch_and_add)
24+
IMPL(unsigned int, j, local, U3AS3, 1, __sync_fetch_and_add)
2525

2626
#ifdef cl_khr_int64_base_atomics
27-
IMPL(long, l, global, AS1, __sync_fetch_and_add_8)
28-
IMPL(unsigned long, m, global, AS1, __sync_fetch_and_add_8)
29-
IMPL(long, l, local, AS3, __sync_fetch_and_add_8)
30-
IMPL(unsigned long, m, local, AS3, __sync_fetch_and_add_8)
27+
IMPL(long, l, global, U3AS1, 1, __sync_fetch_and_add_8)
28+
IMPL(unsigned long, m, global, U3AS1, 1, __sync_fetch_and_add_8)
29+
IMPL(long, l, local, U3AS3, 1, __sync_fetch_and_add_8)
30+
IMPL(unsigned long, m, local, U3AS3, 1, __sync_fetch_and_add_8)
3131
#endif
32+
33+
#if _CLC_GENERIC_AS_SUPPORTED
34+
35+
#define IMPL_GENERIC(TYPE, TYPE_MANGLED, FN_NAME) \
36+
IMPL(TYPE, TYPE_MANGLED, , , 0, FN_NAME)
37+
38+
IMPL_GENERIC(int, i, __sync_fetch_and_add)
39+
IMPL_GENERIC(unsigned int, j, __sync_fetch_and_add)
40+
41+
#ifdef cl_khr_int64_base_atomics
42+
IMPL_GENERIC(long, l, __sync_fetch_and_add_8)
43+
IMPL_GENERIC(unsigned long, m, __sync_fetch_and_add_8)
44+
#endif
45+
46+
#endif //_CLC_GENERIC_AS_SUPPORTED
47+
3248
#undef IMPL

libclc/generic/libspirv/atomic/atomic_and.cl

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,23 +10,39 @@
1010

1111
// TODO: Stop manually mangling this name. Need C++ namespaces to get the exact mangling.
1212

13-
#define IMPL(TYPE, TYPE_MANGLED, AS, AS_MANGLED, FN_NAME) \
13+
#define IMPL(TYPE, TYPE_MANGLED, AS, AS_MANGLED, SUB, FN_NAME) \
1414
_CLC_DEF TYPE \
15-
_Z17__spirv_AtomicAndPU3##AS_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagE##TYPE_MANGLED( \
15+
_Z17__spirv_AtomicAndP##AS_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS##SUB##_19MemorySemanticsMask4FlagE##TYPE_MANGLED( \
1616
volatile AS TYPE *p, enum Scope scope, \
1717
enum MemorySemanticsMask semantics, TYPE val) { \
1818
return FN_NAME(p, val); \
1919
}
2020

21-
IMPL(int, i, global, AS1, __sync_fetch_and_and)
22-
IMPL(unsigned int, j, global, AS1, __sync_fetch_and_and)
23-
IMPL(int, i, local, AS3, __sync_fetch_and_and)
24-
IMPL(unsigned int, j, local, AS3, __sync_fetch_and_and)
21+
IMPL(int, i, global, U3AS1, 1, __sync_fetch_and_and)
22+
IMPL(unsigned int, j, global, U3AS1, 1, __sync_fetch_and_and)
23+
IMPL(int, i, local, U3AS3, 1, __sync_fetch_and_and)
24+
IMPL(unsigned int, j, local, U3AS3, 1, __sync_fetch_and_and)
2525

2626
#ifdef cl_khr_int64_extended_atomics
27-
IMPL(long, l, global, AS1, __sync_fetch_and_and_8)
28-
IMPL(unsigned long, m, global, AS1, __sync_fetch_and_and_8)
29-
IMPL(long, l, local, AS3, __sync_fetch_and_and_8)
30-
IMPL(unsigned long, m, local, AS3, __sync_fetch_and_and_8)
27+
IMPL(long, l, global, U3AS1, 1, __sync_fetch_and_and_8)
28+
IMPL(unsigned long, m, global, U3AS1, 1, __sync_fetch_and_and_8)
29+
IMPL(long, l, local, U3AS3, 1, __sync_fetch_and_and_8)
30+
IMPL(unsigned long, m, local, U3AS3, 1, __sync_fetch_and_and_8)
3131
#endif
32+
33+
#if _CLC_GENERIC_AS_SUPPORTED
34+
35+
#define IMPL_GENERIC(TYPE, TYPE_MANGLED, FN_NAME) \
36+
IMPL(TYPE, TYPE_MANGLED, , , 0, FN_NAME)
37+
38+
IMPL_GENERIC(int, i, __sync_fetch_and_and)
39+
IMPL_GENERIC(unsigned int, j, __sync_fetch_and_and)
40+
41+
#ifdef cl_khr_int64_base_atomics
42+
IMPL_GENERIC(long, l, __sync_fetch_and_and_8)
43+
IMPL_GENERIC(unsigned long, m, __sync_fetch_and_and_8)
44+
#endif
45+
46+
#endif //_CLC_GENERIC_AS_SUPPORTED
47+
3248
#undef IMPL

libclc/generic/libspirv/atomic/atomic_cmpxchg.cl

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,41 @@ _Z29__spirv_AtomicCompareExchangePU3AS1mN5__spv5Scope4FlagENS1_19MemorySemantics
6666
enum MemorySemanticsMask neq, ulong val, ulong cmp) {
6767
return __sync_val_compare_and_swap_8(p, cmp, val);
6868
}
69+
6970
#endif
71+
72+
#if _CLC_GENERIC_AS_SUPPORTED
73+
74+
_CLC_DEF int
75+
_Z29__spirv_AtomicCompareExchangePiN5__spv5Scope4FlagENS0_19MemorySemanticsMask4FlagES4_ii(
76+
volatile int *p, enum Scope scope, enum MemorySemanticsMask eq,
77+
enum MemorySemanticsMask neq, int val, int cmp) {
78+
return __sync_val_compare_and_swap(p, cmp, val);
79+
}
80+
81+
_CLC_DEF uint
82+
_Z29__spirv_AtomicCompareExchangePjN5__spv5Scope4FlagENS0_19MemorySemanticsMask4FlagES4_jj(
83+
volatile uint *p, enum Scope scope, enum MemorySemanticsMask eq,
84+
enum MemorySemanticsMask neq, uint val, uint cmp) {
85+
return __sync_val_compare_and_swap(p, cmp, val);
86+
}
87+
88+
#ifdef cl_khr_int64_base_atomics
89+
90+
_CLC_DEF long
91+
_Z29__spirv_AtomicCompareExchangePlN5__spv5Scope4FlagENS0_19MemorySemanticsMask4FlagES4_ll(
92+
volatile long *p, enum Scope scope, enum MemorySemanticsMask eq,
93+
enum MemorySemanticsMask neq, long val, long cmp) {
94+
return __sync_val_compare_and_swap_8(p, cmp, val);
95+
}
96+
97+
_CLC_DEF ulong
98+
_Z29__spirv_AtomicCompareExchangePmN5__spv5Scope4FlagENS0_19MemorySemanticsMask4FlagES4_mm(
99+
volatile ulong *p, enum Scope scope, enum MemorySemanticsMask eq,
100+
enum MemorySemanticsMask neq, ulong val, ulong cmp) {
101+
return __sync_val_compare_and_swap_8(p, cmp, val);
102+
}
103+
104+
#endif
105+
106+
#endif //_CLC_GENERIC_AS_SUPPORTED

libclc/generic/libspirv/atomic/atomic_max.cl

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,28 +10,49 @@
1010

1111
// TODO: Stop manually mangling this name. Need C++ namespaces to get the exact mangling.
1212

13-
#define IMPL(TYPE, TYPE_MANGLED, AS, AS_MANGLED, NAME, PREFIX, SUFFIX) \
13+
#define IMPL(TYPE, TYPE_MANGLED, AS, AS_MANGLED, SUB, NAME, PREFIX, SUFFIX) \
1414
_CLC_DEF TYPE \
15-
_Z18##NAME##PU3##AS_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagE##TYPE_MANGLED( \
15+
_Z18##NAME##P##AS_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS##SUB##_19MemorySemanticsMask4FlagE##TYPE_MANGLED( \
1616
volatile AS TYPE *p, enum Scope scope, \
1717
enum MemorySemanticsMask semantics, TYPE val) { \
1818
return PREFIX##__sync_fetch_and_##SUFFIX(p, val); \
1919
}
2020

21-
IMPL(int, i, global, AS1, __spirv_AtomicSMax, , max)
22-
IMPL(unsigned int, j, global, AS1, __spirv_AtomicUMax, , umax)
23-
IMPL(int, i, local, AS3, __spirv_AtomicSMax, , max)
24-
IMPL(unsigned int, j, local, AS3, __spirv_AtomicUMax, , umax)
21+
IMPL(int, i, global, U3AS1, 1, __spirv_AtomicSMax, , max)
22+
IMPL(unsigned int, j, global, U3AS1, 1, __spirv_AtomicUMax, , umax)
23+
IMPL(int, i, local, U3AS3, 1, __spirv_AtomicSMax, , max)
24+
IMPL(unsigned int, j, local, U3AS3, 1, __spirv_AtomicUMax, , umax)
2525

2626
#ifdef cl_khr_int64_extended_atomics
2727
unsigned long __clc__sync_fetch_and_max_local_8(volatile local long *, long);
2828
unsigned long __clc__sync_fetch_and_max_global_8(volatile global long *, long);
2929
unsigned long __clc__sync_fetch_and_umax_local_8(volatile local unsigned long *, unsigned long);
3030
unsigned long __clc__sync_fetch_and_umax_global_8(volatile global unsigned long *, unsigned long);
3131

32-
IMPL(long, l, global, AS1, __spirv_AtomicSMax, __clc, max_global_8)
33-
IMPL(unsigned long, m, global, AS1, __spirv_AtomicUMax, __clc, umax_global_8)
34-
IMPL(long, l, local, AS3, __spirv_AtomicSMax, __clc, max_local_8)
35-
IMPL(unsigned long, m, local, AS3, __spirv_AtomicUMax, __clc, umax_local_8)
32+
IMPL(long, l, global, U3AS1, 1, __spirv_AtomicSMax, __clc, max_global_8)
33+
IMPL(unsigned long, m, global, U3AS1, 1, __spirv_AtomicUMax, __clc, umax_global_8)
34+
IMPL(long, l, local, U3AS3, 1, __spirv_AtomicSMax, __clc, max_local_8)
35+
IMPL(unsigned long, m, local, U3AS3, 1, __spirv_AtomicUMax, __clc, umax_local_8)
3636
#endif
37+
38+
#if _CLC_GENERIC_AS_SUPPORTED
39+
40+
41+
#define IMPL_GENERIC(TYPE, TYPE_MANGLED, NAME, PREFIX, SUFFIX) \
42+
IMPL(TYPE, TYPE_MANGLED, , , 0, NAME, PREFIX, SUFFIX)
43+
44+
IMPL_GENERIC(int, i, __spirv_AtomicSMax, , max)
45+
IMPL_GENERIC(unsigned int, j, __spirv_AtomicUMax, , umax)
46+
47+
#ifdef cl_khr_int64_extended_atomics
48+
49+
unsigned long __clc__sync_fetch_and_max_generic_8(volatile generic long *, long);
50+
unsigned long __clc__sync_fetch_and_umax_generic_8(volatile __generic unsigned long *, unsigned long);
51+
52+
IMPL_GENERIC(long, l, __spirv_AtomicSMax, __clc, max_generic_8)
53+
IMPL_GENERIC(unsigned long, m, __spirv_AtomicUMax, __clc, umax_generic_8)
54+
#endif
55+
56+
57+
#endif //_CLC_GENERIC_AS_SUPPORTED
3758
#undef IMPL

libclc/generic/libspirv/atomic/atomic_min.cl

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,28 +10,49 @@
1010

1111
// TODO: Stop manually mangling this name. Need C++ namespaces to get the exact mangling.
1212

13-
#define IMPL(TYPE, TYPE_MANGLED, AS, AS_MANGLED, NAME, PREFIX, SUFFIX) \
13+
#define IMPL(TYPE, TYPE_MANGLED, AS, AS_MANGLED, SUB, NAME, PREFIX, SUFFIX) \
1414
_CLC_DEF TYPE \
15-
_Z18##NAME##PU3##AS_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagE##TYPE_MANGLED( \
15+
_Z18##NAME##P##AS_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS##SUB##_19MemorySemanticsMask4FlagE##TYPE_MANGLED( \
1616
volatile AS TYPE *p, enum Scope scope, \
1717
enum MemorySemanticsMask semantics, TYPE val) { \
1818
return PREFIX##__sync_fetch_and_##SUFFIX(p, val); \
1919
}
2020

21-
IMPL(int, i, global, AS1, __spirv_AtomicSMin, , min)
22-
IMPL(unsigned int, j, global, AS1, __spirv_AtomicUMin, , umin)
23-
IMPL(int, i, local, AS3, __spirv_AtomicSMin, , min)
24-
IMPL(unsigned int, j, local, AS3, __spirv_AtomicUMin, , umin)
21+
IMPL(int, i, global, U3AS1, 1, __spirv_AtomicSMin, , min)
22+
IMPL(unsigned int, j, global, U3AS1, 1, __spirv_AtomicUMin, , umin)
23+
IMPL(int, i, local, U3AS3, 1, __spirv_AtomicSMin, , min)
24+
IMPL(unsigned int, j, local, U3AS3, 1, __spirv_AtomicUMin, , umin)
2525

2626
#ifdef cl_khr_int64_extended_atomics
2727
unsigned long __clc__sync_fetch_and_min_local_8(volatile local long *, long);
2828
unsigned long __clc__sync_fetch_and_min_global_8(volatile global long *, long);
2929
unsigned long __clc__sync_fetch_and_umin_local_8(volatile local unsigned long *, unsigned long);
3030
unsigned long __clc__sync_fetch_and_umin_global_8(volatile global unsigned long *, unsigned long);
3131

32-
IMPL(long, l, global, AS1, __spirv_AtomicSMin, __clc, min_global_8)
33-
IMPL(unsigned long, m, global, AS1, __spirv_AtomicUMin, __clc, umin_global_8)
34-
IMPL(long, l, local, AS3, __spirv_AtomicSMin, __clc, min_local_8)
35-
IMPL(unsigned long, m, local, AS3, __spirv_AtomicUMin, __clc, umin_local_8)
32+
IMPL(long, l, global, U3AS1, 1, __spirv_AtomicSMin, __clc, min_global_8)
33+
IMPL(unsigned long, m, global, U3AS1, 1, __spirv_AtomicUMin, __clc, umin_global_8)
34+
IMPL(long, l, local, U3AS3, 1, __spirv_AtomicSMin, __clc, min_local_8)
35+
IMPL(unsigned long, m, local, U3AS3, 1, __spirv_AtomicUMin, __clc, umin_local_8)
3636
#endif
37+
38+
#if _CLC_GENERIC_AS_SUPPORTED
39+
40+
41+
#define IMPL_GENERIC(TYPE, TYPE_MANGLED, NAME, PREFIX, SUFFIX) \
42+
IMPL(TYPE, TYPE_MANGLED, , , 0, NAME, PREFIX, SUFFIX)
43+
44+
IMPL_GENERIC(int, i, __spirv_AtomicSMin, , min)
45+
IMPL_GENERIC(unsigned int, j, __spirv_AtomicUMin, , umin)
46+
47+
#ifdef cl_khr_int64_extended_atomics
48+
49+
unsigned long __clc__sync_fetch_and_min_generic_8(volatile generic long *, long);
50+
unsigned long __clc__sync_fetch_and_umin_generic_8(volatile __generic unsigned long *, unsigned long);
51+
52+
IMPL_GENERIC(long, l, __spirv_AtomicSMin, __clc, min_generic_8)
53+
IMPL_GENERIC(unsigned long, m, __spirv_AtomicUMin, __clc, umin_generic_8)
54+
#endif
55+
56+
57+
#endif //_CLC_GENERIC_AS_SUPPORTED
3758
#undef IMPL

libclc/generic/libspirv/atomic/atomic_or.cl

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,23 +10,39 @@
1010

1111
// TODO: Stop manually mangling this name. Need C++ namespaces to get the exact mangling.
1212

13-
#define IMPL(TYPE, TYPE_MANGLED, AS, AS_MANGLED, FN_NAME) \
13+
#define IMPL(TYPE, TYPE_MANGLED, AS, AS_MANGLED, SUB, FN_NAME) \
1414
_CLC_DEF TYPE \
15-
_Z16__spirv_AtomicOrPU3##AS_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagE##TYPE_MANGLED( \
15+
_Z16__spirv_AtomicOrP##AS_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS##SUB##_19MemorySemanticsMask4FlagE##TYPE_MANGLED( \
1616
volatile AS TYPE *p, enum Scope scope, \
1717
enum MemorySemanticsMask semantics, TYPE val) { \
1818
return FN_NAME(p, val); \
1919
}
2020

21-
IMPL(int, i, global, AS1, __sync_fetch_and_or)
22-
IMPL(unsigned int, j, global, AS1, __sync_fetch_and_or)
23-
IMPL(int, i, local, AS3, __sync_fetch_and_or)
24-
IMPL(unsigned int, j, local, AS3, __sync_fetch_and_or)
21+
IMPL(int, i, global, U3AS1, 1, __sync_fetch_and_or)
22+
IMPL(unsigned int, j, global, U3AS1, 1, __sync_fetch_and_or)
23+
IMPL(int, i, local, U3AS3, 1, __sync_fetch_and_or)
24+
IMPL(unsigned int, j, local, U3AS3, 1, __sync_fetch_and_or)
2525

2626
#ifdef cl_khr_int64_extended_atomics
27-
IMPL(long, l, global, AS1, __sync_fetch_and_or_8)
28-
IMPL(unsigned long, m, global, AS1, __sync_fetch_and_or_8)
29-
IMPL(long, l, local, AS3, __sync_fetch_and_or_8)
30-
IMPL(unsigned long, m, local, AS3, __sync_fetch_and_or_8)
27+
IMPL(long, l, global, U3AS1, 1, __sync_fetch_and_or_8)
28+
IMPL(unsigned long, m, global, U3AS1, 1, __sync_fetch_and_or_8)
29+
IMPL(long, l, local, U3AS3, 1, __sync_fetch_and_or_8)
30+
IMPL(unsigned long, m, local, U3AS3, 1, __sync_fetch_and_or_8)
3131
#endif
32+
33+
#if _CLC_GENERIC_AS_SUPPORTED
34+
35+
#define IMPL_GENERIC(TYPE, TYPE_MANGLED, FN_NAME) \
36+
IMPL(TYPE, TYPE_MANGLED, , , 0, FN_NAME)
37+
38+
IMPL_GENERIC(int, i, __sync_fetch_and_or)
39+
IMPL_GENERIC(unsigned int, j, __sync_fetch_and_or)
40+
41+
#ifdef cl_khr_int64_base_atomics
42+
IMPL_GENERIC(long, l, __sync_fetch_and_or_8)
43+
IMPL_GENERIC(unsigned long, m, __sync_fetch_and_or_8)
44+
#endif
45+
46+
#endif //_CLC_GENERIC_AS_SUPPORTED
47+
3248
#undef IMPL

libclc/generic/libspirv/atomic/atomic_sub.cl

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,23 +10,38 @@
1010

1111
// TODO: Stop manually mangling this name. Need C++ namespaces to get the exact mangling.
1212

13-
#define IMPL(TYPE, TYPE_MANGLED, AS, AS_MANGLED, FN_NAME) \
13+
#define IMPL(TYPE, TYPE_MANGLED, AS, AS_MANGLED, SUB, FN_NAME) \
1414
_CLC_DEF TYPE \
15-
_Z18__spirv_AtomicISubPU3##AS_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagE##TYPE_MANGLED( \
15+
_Z18__spirv_AtomicISubP##AS_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS##SUB##_19MemorySemanticsMask4FlagE##TYPE_MANGLED( \
1616
volatile AS TYPE *p, enum Scope scope, \
1717
enum MemorySemanticsMask semantics, TYPE val) { \
1818
return FN_NAME(p, val); \
1919
}
2020

21-
IMPL(int, i, global, AS1, __sync_fetch_and_sub)
22-
IMPL(unsigned int, j, global, AS1, __sync_fetch_and_sub)
23-
IMPL(int, i, local, AS3, __sync_fetch_and_sub)
24-
IMPL(unsigned int, j, local, AS3, __sync_fetch_and_sub)
21+
IMPL(int, i, global, U3AS1, 1, __sync_fetch_and_sub)
22+
IMPL(unsigned int, j, global, U3AS1, 1, __sync_fetch_and_sub)
23+
IMPL(int, i, local, U3AS3, 1, __sync_fetch_and_sub)
24+
IMPL(unsigned int, j, local, U3AS3, 1, __sync_fetch_and_sub)
2525

2626
#ifdef cl_khr_int64_base_atomics
27-
IMPL(long, l, global, AS1, __sync_fetch_and_sub_8)
28-
IMPL(unsigned long, m, global, AS1, __sync_fetch_and_sub_8)
29-
IMPL(long, l, local, AS3, __sync_fetch_and_sub_8)
30-
IMPL(unsigned long, m, local, AS3, __sync_fetch_and_sub_8)
27+
IMPL(long, l, global, U3AS1, 1, __sync_fetch_and_sub_8)
28+
IMPL(unsigned long, m, global, U3AS1, 1, __sync_fetch_and_sub_8)
29+
IMPL(long, l, local, U3AS3, 1, __sync_fetch_and_sub_8)
30+
IMPL(unsigned long, m, local, U3AS3, 1, __sync_fetch_and_sub_8)
3131
#endif
32+
33+
#if _CLC_GENERIC_AS_SUPPORTED
34+
35+
#define IMPL_GENERIC(TYPE, TYPE_MANGLED, FN_NAME) \
36+
IMPL(TYPE, TYPE_MANGLED, , , 0, FN_NAME)
37+
38+
IMPL_GENERIC(int, i, __sync_fetch_and_sub)
39+
IMPL_GENERIC(unsigned int, j, __sync_fetch_and_sub)
40+
41+
#ifdef cl_khr_int64_base_atomics
42+
IMPL_GENERIC(long, l, __sync_fetch_and_sub_8)
43+
IMPL_GENERIC(unsigned long, m, __sync_fetch_and_sub_8)
44+
#endif
45+
46+
#endif //_CLC_GENERIC_AS_SUPPORTED
3247
#undef IMPL

0 commit comments

Comments
 (0)