Skip to content

Implement missing overloads for generic AS in generic target #13938

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 10 commits into from
May 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 26 additions & 10 deletions libclc/generic/libspirv/atomic/atomic_add.cl
Original file line number Diff line number Diff line change
Expand Up @@ -10,23 +10,39 @@

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

#define IMPL(TYPE, TYPE_MANGLED, AS, AS_MANGLED, FN_NAME) \
#define IMPL(TYPE, TYPE_MANGLED, AS, AS_MANGLED, SUB, FN_NAME) \
_CLC_DEF TYPE \
_Z18__spirv_AtomicIAddPU3##AS_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagE##TYPE_MANGLED( \
_Z18__spirv_AtomicIAddP##AS_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS##SUB##_19MemorySemanticsMask4FlagE##TYPE_MANGLED( \
volatile AS TYPE *p, enum Scope scope, \
enum MemorySemanticsMask semantics, TYPE val) { \
return FN_NAME(p, val); \
}

IMPL(int, i, global, AS1, __sync_fetch_and_add)
IMPL(unsigned int, j, global, AS1, __sync_fetch_and_add)
IMPL(int, i, local, AS3, __sync_fetch_and_add)
IMPL(unsigned int, j, local, AS3, __sync_fetch_and_add)
IMPL(int, i, global, U3AS1, 1, __sync_fetch_and_add)
IMPL(unsigned int, j, global, U3AS1, 1, __sync_fetch_and_add)
IMPL(int, i, local, U3AS3, 1, __sync_fetch_and_add)
IMPL(unsigned int, j, local, U3AS3, 1, __sync_fetch_and_add)

#ifdef cl_khr_int64_base_atomics
IMPL(long, l, global, AS1, __sync_fetch_and_add_8)
IMPL(unsigned long, m, global, AS1, __sync_fetch_and_add_8)
IMPL(long, l, local, AS3, __sync_fetch_and_add_8)
IMPL(unsigned long, m, local, AS3, __sync_fetch_and_add_8)
IMPL(long, l, global, U3AS1, 1, __sync_fetch_and_add_8)
IMPL(unsigned long, m, global, U3AS1, 1, __sync_fetch_and_add_8)
IMPL(long, l, local, U3AS3, 1, __sync_fetch_and_add_8)
IMPL(unsigned long, m, local, U3AS3, 1, __sync_fetch_and_add_8)
#endif

#if _CLC_GENERIC_AS_SUPPORTED

#define IMPL_GENERIC(TYPE, TYPE_MANGLED, FN_NAME) \
IMPL(TYPE, TYPE_MANGLED, , , 0, FN_NAME)

IMPL_GENERIC(int, i, __sync_fetch_and_add)
IMPL_GENERIC(unsigned int, j, __sync_fetch_and_add)

#ifdef cl_khr_int64_base_atomics
IMPL_GENERIC(long, l, __sync_fetch_and_add_8)
IMPL_GENERIC(unsigned long, m, __sync_fetch_and_add_8)
#endif

#endif //_CLC_GENERIC_AS_SUPPORTED

#undef IMPL
36 changes: 26 additions & 10 deletions libclc/generic/libspirv/atomic/atomic_and.cl
Original file line number Diff line number Diff line change
Expand Up @@ -10,23 +10,39 @@

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

#define IMPL(TYPE, TYPE_MANGLED, AS, AS_MANGLED, FN_NAME) \
#define IMPL(TYPE, TYPE_MANGLED, AS, AS_MANGLED, SUB, FN_NAME) \
_CLC_DEF TYPE \
_Z17__spirv_AtomicAndPU3##AS_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagE##TYPE_MANGLED( \
_Z17__spirv_AtomicAndP##AS_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS##SUB##_19MemorySemanticsMask4FlagE##TYPE_MANGLED( \
volatile AS TYPE *p, enum Scope scope, \
enum MemorySemanticsMask semantics, TYPE val) { \
return FN_NAME(p, val); \
}

IMPL(int, i, global, AS1, __sync_fetch_and_and)
IMPL(unsigned int, j, global, AS1, __sync_fetch_and_and)
IMPL(int, i, local, AS3, __sync_fetch_and_and)
IMPL(unsigned int, j, local, AS3, __sync_fetch_and_and)
IMPL(int, i, global, U3AS1, 1, __sync_fetch_and_and)
IMPL(unsigned int, j, global, U3AS1, 1, __sync_fetch_and_and)
IMPL(int, i, local, U3AS3, 1, __sync_fetch_and_and)
IMPL(unsigned int, j, local, U3AS3, 1, __sync_fetch_and_and)

#ifdef cl_khr_int64_extended_atomics
IMPL(long, l, global, AS1, __sync_fetch_and_and_8)
IMPL(unsigned long, m, global, AS1, __sync_fetch_and_and_8)
IMPL(long, l, local, AS3, __sync_fetch_and_and_8)
IMPL(unsigned long, m, local, AS3, __sync_fetch_and_and_8)
IMPL(long, l, global, U3AS1, 1, __sync_fetch_and_and_8)
IMPL(unsigned long, m, global, U3AS1, 1, __sync_fetch_and_and_8)
IMPL(long, l, local, U3AS3, 1, __sync_fetch_and_and_8)
IMPL(unsigned long, m, local, U3AS3, 1, __sync_fetch_and_and_8)
#endif

#if _CLC_GENERIC_AS_SUPPORTED

#define IMPL_GENERIC(TYPE, TYPE_MANGLED, FN_NAME) \
IMPL(TYPE, TYPE_MANGLED, , , 0, FN_NAME)

IMPL_GENERIC(int, i, __sync_fetch_and_and)
IMPL_GENERIC(unsigned int, j, __sync_fetch_and_and)

#ifdef cl_khr_int64_base_atomics
IMPL_GENERIC(long, l, __sync_fetch_and_and_8)
IMPL_GENERIC(unsigned long, m, __sync_fetch_and_and_8)
#endif

#endif //_CLC_GENERIC_AS_SUPPORTED

#undef IMPL
37 changes: 37 additions & 0 deletions libclc/generic/libspirv/atomic/atomic_cmpxchg.cl
Original file line number Diff line number Diff line change
Expand Up @@ -66,4 +66,41 @@ _Z29__spirv_AtomicCompareExchangePU3AS1mN5__spv5Scope4FlagENS1_19MemorySemantics
enum MemorySemanticsMask neq, ulong val, ulong cmp) {
return __sync_val_compare_and_swap_8(p, cmp, val);
}

#endif

#if _CLC_GENERIC_AS_SUPPORTED

_CLC_DEF int
_Z29__spirv_AtomicCompareExchangePiN5__spv5Scope4FlagENS0_19MemorySemanticsMask4FlagES4_ii(
volatile int *p, enum Scope scope, enum MemorySemanticsMask eq,
enum MemorySemanticsMask neq, int val, int cmp) {
return __sync_val_compare_and_swap(p, cmp, val);
}

_CLC_DEF uint
_Z29__spirv_AtomicCompareExchangePjN5__spv5Scope4FlagENS0_19MemorySemanticsMask4FlagES4_jj(
volatile uint *p, enum Scope scope, enum MemorySemanticsMask eq,
enum MemorySemanticsMask neq, uint val, uint cmp) {
return __sync_val_compare_and_swap(p, cmp, val);
}

#ifdef cl_khr_int64_base_atomics

_CLC_DEF long
_Z29__spirv_AtomicCompareExchangePlN5__spv5Scope4FlagENS0_19MemorySemanticsMask4FlagES4_ll(
volatile long *p, enum Scope scope, enum MemorySemanticsMask eq,
enum MemorySemanticsMask neq, long val, long cmp) {
return __sync_val_compare_and_swap_8(p, cmp, val);
}

_CLC_DEF ulong
_Z29__spirv_AtomicCompareExchangePmN5__spv5Scope4FlagENS0_19MemorySemanticsMask4FlagES4_mm(
volatile ulong *p, enum Scope scope, enum MemorySemanticsMask eq,
enum MemorySemanticsMask neq, ulong val, ulong cmp) {
return __sync_val_compare_and_swap_8(p, cmp, val);
}

#endif

#endif //_CLC_GENERIC_AS_SUPPORTED
41 changes: 31 additions & 10 deletions libclc/generic/libspirv/atomic/atomic_max.cl
Original file line number Diff line number Diff line change
Expand Up @@ -10,28 +10,49 @@

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

#define IMPL(TYPE, TYPE_MANGLED, AS, AS_MANGLED, NAME, PREFIX, SUFFIX) \
#define IMPL(TYPE, TYPE_MANGLED, AS, AS_MANGLED, SUB, NAME, PREFIX, SUFFIX) \
_CLC_DEF TYPE \
_Z18##NAME##PU3##AS_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagE##TYPE_MANGLED( \
_Z18##NAME##P##AS_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS##SUB##_19MemorySemanticsMask4FlagE##TYPE_MANGLED( \
volatile AS TYPE *p, enum Scope scope, \
enum MemorySemanticsMask semantics, TYPE val) { \
return PREFIX##__sync_fetch_and_##SUFFIX(p, val); \
}

IMPL(int, i, global, AS1, __spirv_AtomicSMax, , max)
IMPL(unsigned int, j, global, AS1, __spirv_AtomicUMax, , umax)
IMPL(int, i, local, AS3, __spirv_AtomicSMax, , max)
IMPL(unsigned int, j, local, AS3, __spirv_AtomicUMax, , umax)
IMPL(int, i, global, U3AS1, 1, __spirv_AtomicSMax, , max)
IMPL(unsigned int, j, global, U3AS1, 1, __spirv_AtomicUMax, , umax)
IMPL(int, i, local, U3AS3, 1, __spirv_AtomicSMax, , max)
IMPL(unsigned int, j, local, U3AS3, 1, __spirv_AtomicUMax, , umax)

#ifdef cl_khr_int64_extended_atomics
unsigned long __clc__sync_fetch_and_max_local_8(volatile local long *, long);
unsigned long __clc__sync_fetch_and_max_global_8(volatile global long *, long);
unsigned long __clc__sync_fetch_and_umax_local_8(volatile local unsigned long *, unsigned long);
unsigned long __clc__sync_fetch_and_umax_global_8(volatile global unsigned long *, unsigned long);

IMPL(long, l, global, AS1, __spirv_AtomicSMax, __clc, max_global_8)
IMPL(unsigned long, m, global, AS1, __spirv_AtomicUMax, __clc, umax_global_8)
IMPL(long, l, local, AS3, __spirv_AtomicSMax, __clc, max_local_8)
IMPL(unsigned long, m, local, AS3, __spirv_AtomicUMax, __clc, umax_local_8)
IMPL(long, l, global, U3AS1, 1, __spirv_AtomicSMax, __clc, max_global_8)
IMPL(unsigned long, m, global, U3AS1, 1, __spirv_AtomicUMax, __clc, umax_global_8)
IMPL(long, l, local, U3AS3, 1, __spirv_AtomicSMax, __clc, max_local_8)
IMPL(unsigned long, m, local, U3AS3, 1, __spirv_AtomicUMax, __clc, umax_local_8)
#endif

#if _CLC_GENERIC_AS_SUPPORTED


#define IMPL_GENERIC(TYPE, TYPE_MANGLED, NAME, PREFIX, SUFFIX) \
IMPL(TYPE, TYPE_MANGLED, , , 0, NAME, PREFIX, SUFFIX)

IMPL_GENERIC(int, i, __spirv_AtomicSMax, , max)
IMPL_GENERIC(unsigned int, j, __spirv_AtomicUMax, , umax)

#ifdef cl_khr_int64_extended_atomics

unsigned long __clc__sync_fetch_and_max_generic_8(volatile generic long *, long);
unsigned long __clc__sync_fetch_and_umax_generic_8(volatile __generic unsigned long *, unsigned long);

IMPL_GENERIC(long, l, __spirv_AtomicSMax, __clc, max_generic_8)
IMPL_GENERIC(unsigned long, m, __spirv_AtomicUMax, __clc, umax_generic_8)
#endif


#endif //_CLC_GENERIC_AS_SUPPORTED
#undef IMPL
41 changes: 31 additions & 10 deletions libclc/generic/libspirv/atomic/atomic_min.cl
Original file line number Diff line number Diff line change
Expand Up @@ -10,28 +10,49 @@

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

#define IMPL(TYPE, TYPE_MANGLED, AS, AS_MANGLED, NAME, PREFIX, SUFFIX) \
#define IMPL(TYPE, TYPE_MANGLED, AS, AS_MANGLED, SUB, NAME, PREFIX, SUFFIX) \
_CLC_DEF TYPE \
_Z18##NAME##PU3##AS_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagE##TYPE_MANGLED( \
_Z18##NAME##P##AS_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS##SUB##_19MemorySemanticsMask4FlagE##TYPE_MANGLED( \
volatile AS TYPE *p, enum Scope scope, \
enum MemorySemanticsMask semantics, TYPE val) { \
return PREFIX##__sync_fetch_and_##SUFFIX(p, val); \
}

IMPL(int, i, global, AS1, __spirv_AtomicSMin, , min)
IMPL(unsigned int, j, global, AS1, __spirv_AtomicUMin, , umin)
IMPL(int, i, local, AS3, __spirv_AtomicSMin, , min)
IMPL(unsigned int, j, local, AS3, __spirv_AtomicUMin, , umin)
IMPL(int, i, global, U3AS1, 1, __spirv_AtomicSMin, , min)
IMPL(unsigned int, j, global, U3AS1, 1, __spirv_AtomicUMin, , umin)
IMPL(int, i, local, U3AS3, 1, __spirv_AtomicSMin, , min)
IMPL(unsigned int, j, local, U3AS3, 1, __spirv_AtomicUMin, , umin)

#ifdef cl_khr_int64_extended_atomics
unsigned long __clc__sync_fetch_and_min_local_8(volatile local long *, long);
unsigned long __clc__sync_fetch_and_min_global_8(volatile global long *, long);
unsigned long __clc__sync_fetch_and_umin_local_8(volatile local unsigned long *, unsigned long);
unsigned long __clc__sync_fetch_and_umin_global_8(volatile global unsigned long *, unsigned long);

IMPL(long, l, global, AS1, __spirv_AtomicSMin, __clc, min_global_8)
IMPL(unsigned long, m, global, AS1, __spirv_AtomicUMin, __clc, umin_global_8)
IMPL(long, l, local, AS3, __spirv_AtomicSMin, __clc, min_local_8)
IMPL(unsigned long, m, local, AS3, __spirv_AtomicUMin, __clc, umin_local_8)
IMPL(long, l, global, U3AS1, 1, __spirv_AtomicSMin, __clc, min_global_8)
IMPL(unsigned long, m, global, U3AS1, 1, __spirv_AtomicUMin, __clc, umin_global_8)
IMPL(long, l, local, U3AS3, 1, __spirv_AtomicSMin, __clc, min_local_8)
IMPL(unsigned long, m, local, U3AS3, 1, __spirv_AtomicUMin, __clc, umin_local_8)
#endif

#if _CLC_GENERIC_AS_SUPPORTED


#define IMPL_GENERIC(TYPE, TYPE_MANGLED, NAME, PREFIX, SUFFIX) \
IMPL(TYPE, TYPE_MANGLED, , , 0, NAME, PREFIX, SUFFIX)

IMPL_GENERIC(int, i, __spirv_AtomicSMin, , min)
IMPL_GENERIC(unsigned int, j, __spirv_AtomicUMin, , umin)

#ifdef cl_khr_int64_extended_atomics

unsigned long __clc__sync_fetch_and_min_generic_8(volatile generic long *, long);
unsigned long __clc__sync_fetch_and_umin_generic_8(volatile __generic unsigned long *, unsigned long);

IMPL_GENERIC(long, l, __spirv_AtomicSMin, __clc, min_generic_8)
IMPL_GENERIC(unsigned long, m, __spirv_AtomicUMin, __clc, umin_generic_8)
#endif


#endif //_CLC_GENERIC_AS_SUPPORTED
#undef IMPL
36 changes: 26 additions & 10 deletions libclc/generic/libspirv/atomic/atomic_or.cl
Original file line number Diff line number Diff line change
Expand Up @@ -10,23 +10,39 @@

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

#define IMPL(TYPE, TYPE_MANGLED, AS, AS_MANGLED, FN_NAME) \
#define IMPL(TYPE, TYPE_MANGLED, AS, AS_MANGLED, SUB, FN_NAME) \
_CLC_DEF TYPE \
_Z16__spirv_AtomicOrPU3##AS_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagE##TYPE_MANGLED( \
_Z16__spirv_AtomicOrP##AS_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS##SUB##_19MemorySemanticsMask4FlagE##TYPE_MANGLED( \
volatile AS TYPE *p, enum Scope scope, \
enum MemorySemanticsMask semantics, TYPE val) { \
return FN_NAME(p, val); \
}

IMPL(int, i, global, AS1, __sync_fetch_and_or)
IMPL(unsigned int, j, global, AS1, __sync_fetch_and_or)
IMPL(int, i, local, AS3, __sync_fetch_and_or)
IMPL(unsigned int, j, local, AS3, __sync_fetch_and_or)
IMPL(int, i, global, U3AS1, 1, __sync_fetch_and_or)
IMPL(unsigned int, j, global, U3AS1, 1, __sync_fetch_and_or)
IMPL(int, i, local, U3AS3, 1, __sync_fetch_and_or)
IMPL(unsigned int, j, local, U3AS3, 1, __sync_fetch_and_or)

#ifdef cl_khr_int64_extended_atomics
IMPL(long, l, global, AS1, __sync_fetch_and_or_8)
IMPL(unsigned long, m, global, AS1, __sync_fetch_and_or_8)
IMPL(long, l, local, AS3, __sync_fetch_and_or_8)
IMPL(unsigned long, m, local, AS3, __sync_fetch_and_or_8)
IMPL(long, l, global, U3AS1, 1, __sync_fetch_and_or_8)
IMPL(unsigned long, m, global, U3AS1, 1, __sync_fetch_and_or_8)
IMPL(long, l, local, U3AS3, 1, __sync_fetch_and_or_8)
IMPL(unsigned long, m, local, U3AS3, 1, __sync_fetch_and_or_8)
#endif

#if _CLC_GENERIC_AS_SUPPORTED

#define IMPL_GENERIC(TYPE, TYPE_MANGLED, FN_NAME) \
IMPL(TYPE, TYPE_MANGLED, , , 0, FN_NAME)

IMPL_GENERIC(int, i, __sync_fetch_and_or)
IMPL_GENERIC(unsigned int, j, __sync_fetch_and_or)

#ifdef cl_khr_int64_base_atomics
IMPL_GENERIC(long, l, __sync_fetch_and_or_8)
IMPL_GENERIC(unsigned long, m, __sync_fetch_and_or_8)
#endif

#endif //_CLC_GENERIC_AS_SUPPORTED

#undef IMPL
35 changes: 25 additions & 10 deletions libclc/generic/libspirv/atomic/atomic_sub.cl
Original file line number Diff line number Diff line change
Expand Up @@ -10,23 +10,38 @@

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

#define IMPL(TYPE, TYPE_MANGLED, AS, AS_MANGLED, FN_NAME) \
#define IMPL(TYPE, TYPE_MANGLED, AS, AS_MANGLED, SUB, FN_NAME) \
_CLC_DEF TYPE \
_Z18__spirv_AtomicISubPU3##AS_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagE##TYPE_MANGLED( \
_Z18__spirv_AtomicISubP##AS_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS##SUB##_19MemorySemanticsMask4FlagE##TYPE_MANGLED( \
volatile AS TYPE *p, enum Scope scope, \
enum MemorySemanticsMask semantics, TYPE val) { \
return FN_NAME(p, val); \
}

IMPL(int, i, global, AS1, __sync_fetch_and_sub)
IMPL(unsigned int, j, global, AS1, __sync_fetch_and_sub)
IMPL(int, i, local, AS3, __sync_fetch_and_sub)
IMPL(unsigned int, j, local, AS3, __sync_fetch_and_sub)
IMPL(int, i, global, U3AS1, 1, __sync_fetch_and_sub)
IMPL(unsigned int, j, global, U3AS1, 1, __sync_fetch_and_sub)
IMPL(int, i, local, U3AS3, 1, __sync_fetch_and_sub)
IMPL(unsigned int, j, local, U3AS3, 1, __sync_fetch_and_sub)

#ifdef cl_khr_int64_base_atomics
IMPL(long, l, global, AS1, __sync_fetch_and_sub_8)
IMPL(unsigned long, m, global, AS1, __sync_fetch_and_sub_8)
IMPL(long, l, local, AS3, __sync_fetch_and_sub_8)
IMPL(unsigned long, m, local, AS3, __sync_fetch_and_sub_8)
IMPL(long, l, global, U3AS1, 1, __sync_fetch_and_sub_8)
IMPL(unsigned long, m, global, U3AS1, 1, __sync_fetch_and_sub_8)
IMPL(long, l, local, U3AS3, 1, __sync_fetch_and_sub_8)
IMPL(unsigned long, m, local, U3AS3, 1, __sync_fetch_and_sub_8)
#endif

#if _CLC_GENERIC_AS_SUPPORTED

#define IMPL_GENERIC(TYPE, TYPE_MANGLED, FN_NAME) \
IMPL(TYPE, TYPE_MANGLED, , , 0, FN_NAME)

IMPL_GENERIC(int, i, __sync_fetch_and_sub)
IMPL_GENERIC(unsigned int, j, __sync_fetch_and_sub)

#ifdef cl_khr_int64_base_atomics
IMPL_GENERIC(long, l, __sync_fetch_and_sub_8)
IMPL_GENERIC(unsigned long, m, __sync_fetch_and_sub_8)
#endif

#endif //_CLC_GENERIC_AS_SUPPORTED
#undef IMPL
Loading
Loading