Skip to content

Commit 8088b0a

Browse files
committed
[SYCL] Move SPIR-V atomic builtins declarations into clang/lib/Sema/SPIRVBuiltins.td
Change scope and memory semantics type from Enum from int, similar as in PR intel#17438. volatile is removed from function parameter pointer type, to align with SVP-IR and clang/lib/Sema/SPIRVBuiltins.td.
1 parent 61cb6d7 commit 8088b0a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

80 files changed

+1118
-1498
lines changed

clang/lib/Sema/SPIRVBuiltins.td

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,10 +392,13 @@ def AIGenTypeNNoScalar : GenericType<"AIGenTypeNNoScalar", TLAllInts, VecNoS
392392
// All integer to unsigned
393393
def AI2UGenTypeN : GenericType<"AI2UGenTypeN", TLAllUIntsTwice, VecAndScalar>;
394394
// Signed integer
395+
def SGenType1 : GenericType<"SGenType1", TLSignedInts, Vec1>;
395396
def SGenTypeN : GenericType<"SGenTypeN", TLSignedInts, VecAndScalar>;
396397
// Unsigned integer
398+
def UGenType1 : GenericType<"UGenType1", TLUnsignedInts, Vec1>;
397399
def UGenTypeN : GenericType<"UGenTypeN", TLUnsignedInts, VecAndScalar>;
398400
// Float
401+
def FGenType1 : GenericType<"FGenType1", TLFloat, Vec1>;
399402
def FGenTypeN : GenericType<"FGenTypeN", TLFloat, VecAndScalar>;
400403
// (u)int, (u)long, and all floats
401404
def IntLongFloatGenType1 : GenericType<"IntLongFloatGenType1", TLIntLongFloats, Vec1>;
@@ -960,3 +963,67 @@ foreach name = ["GroupSMin", "GroupSMax"] in {
960963
foreach name = ["GroupLogicalAndKHR", "GroupLogicalOrKHR"] in {
961964
def : SPVBuiltin<name, [Bool, UInt, UInt, Bool], Attr.Convergent>;
962965
}
966+
967+
// 3.56.18. Atomic Instructions
968+
969+
foreach AS = [GlobalAS, LocalAS, PrivateAS, GenericAS] in {
970+
def : SPVBuiltin<
971+
"AtomicLoad", [AGenType1, PointerType<AGenType1, AS>, Int, Int],
972+
Attr.Convergent>;
973+
974+
def : SPVBuiltin<"AtomicStore",
975+
[Void, PointerType<AGenType1, AS>, Int, Int, AGenType1],
976+
Attr.Convergent>;
977+
978+
def : SPVBuiltin<"AtomicExchange",
979+
[AGenType1, PointerType<AGenType1, AS>, Int, Int, AGenType1],
980+
Attr.Convergent>;
981+
982+
foreach name = ["AtomicCompareExchange", "AtomicCompareExchangeWeak"] in {
983+
def : SPVBuiltin<name,
984+
[AIGenType1, PointerType<AIGenType1, AS>, Int, Int, Int,
985+
AIGenType1, AIGenType1],
986+
Attr.Convergent>;
987+
}
988+
989+
foreach name = ["AtomicIIncrement", "AtomicIDecrement"] in {
990+
def : SPVBuiltin<name, [AIGenType1, PointerType<AIGenType1, AS>, Int, Int],
991+
Attr.Convergent>;
992+
}
993+
994+
foreach name = ["AtomicSMin", "AtomicSMax"] in {
995+
def : SPVBuiltin<name,
996+
[SGenType1, PointerType<SGenType1, AS>, Int, Int,
997+
SGenType1],
998+
Attr.Convergent>;
999+
}
1000+
1001+
foreach name = ["AtomicUMin", "AtomicUMax"] in {
1002+
def : SPVBuiltin<name,
1003+
[UGenType1, PointerType<UGenType1, AS>, Int, Int,
1004+
UGenType1],
1005+
Attr.Convergent>;
1006+
}
1007+
1008+
foreach name = ["AtomicIAdd", "AtomicISub", "AtomicAnd", "AtomicOr",
1009+
"AtomicXor"] in {
1010+
def : SPVBuiltin<name,
1011+
[AIGenType1, PointerType<AIGenType1, AS>, Int, Int,
1012+
AIGenType1],
1013+
Attr.Convergent>;
1014+
}
1015+
1016+
def : SPVBuiltin<
1017+
"AtomicFlagTestAndSet", [Bool, PointerType<Int, AS>, Int, Int],
1018+
Attr.Convergent>;
1019+
1020+
def : SPVBuiltin<"AtomicFlagClear", [Void, PointerType<Int, AS>, Int, Int],
1021+
Attr.Convergent>;
1022+
1023+
foreach name = ["AtomicFMaxEXT", "AtomicFMinEXT", "AtomicFAddEXT"] in {
1024+
def : SPVBuiltin<name,
1025+
[FGenType1, PointerType<FGenType1, AS>, Int, Int,
1026+
FGenType1],
1027+
Attr.Convergent>;
1028+
}
1029+
}
Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
#include <clc/clc.h>
22
#include <libspirv/spirv.h>
33

4-
#define IMPL(TYPE, TYPE_MANGLED, AS, AS_MANGLED) \
5-
_CLC_OVERLOAD _CLC_DEF TYPE atomic_add(volatile AS TYPE *p, TYPE val) { \
6-
/* TODO: Stop manually mangling this name. Need C++ namespaces to get the \
7-
* exact mangling. */ \
8-
return _Z18__spirv_AtomicIAddPU3##AS_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagE##TYPE_MANGLED( \
9-
p, Device, SequentiallyConsistent, val); \
4+
#define IMPL(TYPE, AS) \
5+
_CLC_OVERLOAD _CLC_DEF TYPE atomic_add(volatile AS TYPE *p, TYPE val) { \
6+
return __spirv_AtomicIAdd((AS TYPE *)p, Device, SequentiallyConsistent, val); \
107
}
118

12-
IMPL(int, i, global, AS1)
13-
IMPL(unsigned int, j, global, AS1)
14-
IMPL(int, i, local, AS3)
15-
IMPL(unsigned int, j, local, AS3)
9+
IMPL(int, global)
10+
IMPL(unsigned int, global)
11+
IMPL(int, local)
12+
IMPL(unsigned int, local)
1613
#undef IMPL
Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
#include <clc/clc.h>
22
#include <libspirv/spirv.h>
33

4-
#define IMPL(TYPE, TYPE_MANGLED, AS, AS_MANGLED) \
5-
_CLC_OVERLOAD _CLC_DEF TYPE atomic_and(volatile AS TYPE *p, TYPE val) { \
6-
/* TODO: Stop manually mangling this name. Need C++ namespaces to get the \
7-
* exact mangling. */ \
8-
return _Z17__spirv_AtomicAndPU3##AS_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagE##TYPE_MANGLED( \
9-
p, Device, SequentiallyConsistent, val); \
4+
#define IMPL(TYPE, AS) \
5+
_CLC_OVERLOAD _CLC_DEF TYPE atomic_and(volatile AS TYPE *p, TYPE val) { \
6+
return __spirv_AtomicAnd((AS TYPE *)p, Device, SequentiallyConsistent, val); \
107
}
118

12-
IMPL(int, i, global, AS1)
13-
IMPL(unsigned int, j, global, AS1)
14-
IMPL(int, i, local, AS3)
15-
IMPL(unsigned int, j, local, AS3)
9+
IMPL(int, global)
10+
IMPL(unsigned int, global)
11+
IMPL(int, local)
12+
IMPL(unsigned int, local)
1613
#undef IMPL
Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
11
#include <clc/clc.h>
22
#include <libspirv/spirv.h>
33

4-
#define IMPL(TYPE, TYPE_MANGLED, AS, AS_MANGLED) \
5-
_CLC_OVERLOAD _CLC_DEF TYPE atomic_cmpxchg(volatile AS TYPE *p, TYPE cmp, \
6-
TYPE val) { \
7-
/* TODO: Stop manually mangling this name. Need C++ namespaces to get the \
8-
* exact mangling. */ \
9-
return _Z29__spirv_AtomicCompareExchangePU3##AS_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagES5_##TYPE_MANGLED##TYPE_MANGLED( \
10-
p, Device, SequentiallyConsistent, SequentiallyConsistent, val, cmp); \
4+
#define IMPL(TYPE, AS) \
5+
_CLC_OVERLOAD _CLC_DEF TYPE atomic_cmpxchg(volatile AS TYPE *p, TYPE cmp, \
6+
TYPE val) { \
7+
return __spirv_AtomicCompareExchange((AS TYPE *)p, Device, \
8+
SequentiallyConsistent, SequentiallyConsistent, val, cmp); \
119
}
1210

13-
IMPL(int, i, global, AS1)
14-
IMPL(unsigned int, j, global, AS1)
15-
IMPL(int, i, local, AS3)
16-
IMPL(unsigned int, j, local, AS3)
11+
IMPL(int, global)
12+
IMPL(unsigned int, global)
13+
IMPL(int, local)
14+
IMPL(unsigned int, local)
1715
#undef IMPL
Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
#include <clc/clc.h>
22
#include <libspirv/spirv.h>
33

4-
#define IMPL(TYPE, TYPE_MANGLED, AS, AS_MANGLED) \
5-
_CLC_OVERLOAD _CLC_DEF TYPE atomic_dec(volatile AS TYPE *p) { \
6-
/* TODO: Stop manually mangling this name. Need C++ namespaces to get the \
7-
* exact mangling. */ \
8-
return _Z24__spirv_AtomicIDecrementPU3##AS_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagE( \
9-
p, Device, SequentiallyConsistent); \
4+
#define IMPL(TYPE, AS) \
5+
_CLC_OVERLOAD _CLC_DEF TYPE atomic_dec(volatile AS TYPE *p) { \
6+
return __spirv_AtomicIDecrement( \
7+
(AS TYPE *)p, Device, SequentiallyConsistent); \
108
}
119

12-
IMPL(int, i, global, AS1)
13-
IMPL(unsigned int, j, global, AS1)
14-
IMPL(int, i, local, AS3)
15-
IMPL(unsigned int, j, local, AS3)
10+
IMPL(int, global)
11+
IMPL(unsigned int, global)
12+
IMPL(int, local)
13+
IMPL(unsigned int, local)
1614
#undef IMPL
Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
#include <clc/clc.h>
22
#include <libspirv/spirv.h>
33

4-
#define IMPL(TYPE, TYPE_MANGLED, AS, AS_MANGLED) \
5-
_CLC_OVERLOAD _CLC_DEF TYPE atomic_inc(volatile AS TYPE *p) { \
6-
/* TODO: Stop manually mangling this name. Need C++ namespaces to get the \
7-
* exact mangling. */ \
8-
return _Z24__spirv_AtomicIIncrementPU3##AS_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagE( \
9-
p, Device, SequentiallyConsistent); \
4+
#define IMPL(TYPE, AS) \
5+
_CLC_OVERLOAD _CLC_DEF TYPE atomic_inc(volatile AS TYPE *p) { \
6+
return __spirv_AtomicIIncrement( \
7+
(AS TYPE *)p, Device, SequentiallyConsistent); \
108
}
119

12-
IMPL(int, i, global, AS1)
13-
IMPL(unsigned int, j, global, AS1)
14-
IMPL(int, i, local, AS3)
15-
IMPL(unsigned int, j, local, AS3)
10+
IMPL(int, global)
11+
IMPL(unsigned int, global)
12+
IMPL(int, local)
13+
IMPL(unsigned int, local)
1614
#undef IMPL
Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
#include <clc/clc.h>
22
#include <libspirv/spirv.h>
33

4-
#define IMPL(TYPE, TYPE_MANGLED, AS, AS_MANGLED, OP) \
5-
_CLC_OVERLOAD _CLC_DEF TYPE atomic_max(volatile AS TYPE *p, TYPE val) { \
6-
/* TODO: Stop manually mangling this name. Need C++ namespaces to get the \
7-
* exact mangling. */ \
8-
return _Z18##OP##PU3##AS_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagE##TYPE_MANGLED( \
9-
p, Device, SequentiallyConsistent, val); \
4+
#define IMPL(TYPE, AS, OP) \
5+
_CLC_OVERLOAD _CLC_DEF TYPE atomic_max(volatile AS TYPE *p, TYPE val) { \
6+
return OP((AS TYPE *)p, Device, SequentiallyConsistent, val); \
107
}
118

12-
IMPL(int, i, global, AS1, __spirv_AtomicSMax)
13-
IMPL(unsigned int, j, global, AS1, __spirv_AtomicUMax)
14-
IMPL(int, i, local, AS3, __spirv_AtomicSMax)
15-
IMPL(unsigned int, j, local, AS3, __spirv_AtomicUMax)
9+
IMPL(int, global, __spirv_AtomicSMax)
10+
IMPL(unsigned int, global, __spirv_AtomicUMax)
11+
IMPL(int, local, __spirv_AtomicSMax)
12+
IMPL(unsigned int, local, __spirv_AtomicUMax)
1613
#undef IMPL
Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
#include <clc/clc.h>
22
#include <libspirv/spirv.h>
33

4-
#define IMPL(TYPE, TYPE_MANGLED, AS, AS_MANGLED, OP) \
5-
_CLC_OVERLOAD _CLC_DEF TYPE atomic_min(volatile AS TYPE *p, TYPE val) { \
6-
/* TODO: Stop manually mangling this name. Need C++ namespaces to get the \
7-
* exact mangling. */ \
8-
return _Z18##OP##PU3##AS_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagE##TYPE_MANGLED( \
9-
p, Device, SequentiallyConsistent, val); \
4+
#define IMPL(TYPE, AS, OP) \
5+
_CLC_OVERLOAD _CLC_DEF TYPE atomic_min(volatile AS TYPE *p, TYPE val) { \
6+
return OP((AS TYPE *)p, Device, SequentiallyConsistent, val); \
107
}
118

12-
IMPL(int, i, global, AS1, __spirv_AtomicSMin)
13-
IMPL(unsigned int, j, global, AS1, __spirv_AtomicUMin)
14-
IMPL(int, i, local, AS3, __spirv_AtomicSMin)
15-
IMPL(unsigned int, j, local, AS3, __spirv_AtomicUMin)
9+
IMPL(int, global, __spirv_AtomicSMin)
10+
IMPL(unsigned int, global, __spirv_AtomicUMin)
11+
IMPL(int, local, __spirv_AtomicSMin)
12+
IMPL(unsigned int, local, __spirv_AtomicUMin)
1613
#undef IMPL
Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
#include <clc/clc.h>
22
#include <libspirv/spirv.h>
33

4-
#define IMPL(TYPE, TYPE_MANGLED, AS, AS_MANGLED) \
5-
_CLC_OVERLOAD _CLC_DEF TYPE atomic_or(volatile AS TYPE *p, TYPE val) { \
6-
/* TODO: Stop manually mangling this name. Need C++ namespaces to get the \
7-
* exact mangling. */ \
8-
return _Z16__spirv_AtomicOrPU3##AS_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagE##TYPE_MANGLED( \
9-
p, Device, SequentiallyConsistent, val); \
4+
#define IMPL(TYPE, AS) \
5+
_CLC_OVERLOAD _CLC_DEF TYPE atomic_or(volatile AS TYPE *p, TYPE val) { \
6+
return __spirv_AtomicOr((AS TYPE *)p, Device, SequentiallyConsistent, val); \
107
}
118

12-
IMPL(int, i, global, AS1)
13-
IMPL(unsigned int, j, global, AS1)
14-
IMPL(int, i, local, AS3)
15-
IMPL(unsigned int, j, local, AS3)
9+
IMPL(int, global)
10+
IMPL(unsigned int, global)
11+
IMPL(int, local)
12+
IMPL(unsigned int, local)
1613
#undef IMPL
Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
#include <clc/clc.h>
22
#include <libspirv/spirv.h>
33

4-
#define IMPL(TYPE, TYPE_MANGLED, AS, AS_MANGLED) \
5-
_CLC_OVERLOAD _CLC_DEF TYPE atomic_sub(volatile AS TYPE *p, TYPE val) { \
6-
/* TODO: Stop manually mangling this name. Need C++ namespaces to get the \
7-
* exact mangling. */ \
8-
return _Z18__spirv_AtomicISubPU3##AS_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagE##TYPE_MANGLED( \
9-
p, Device, SequentiallyConsistent, val); \
4+
#define IMPL(TYPE, AS) \
5+
_CLC_OVERLOAD _CLC_DEF TYPE atomic_sub(volatile AS TYPE *p, TYPE val) { \
6+
return __spirv_AtomicISub((AS TYPE *)p, Device, SequentiallyConsistent, val); \
107
}
118

12-
IMPL(int, i, global, AS1)
13-
IMPL(unsigned int, j, global, AS1)
14-
IMPL(int, i, local, AS3)
15-
IMPL(unsigned int, j, local, AS3)
9+
IMPL(int, global)
10+
IMPL(unsigned int, global)
11+
IMPL(int, local)
12+
IMPL(unsigned int, local)
1613
#undef IMPL

libclc/generic/lib/atomic/atomic_xchg.cl

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,20 @@
22
#include <libspirv/spirv.h>
33

44
_CLC_OVERLOAD _CLC_DEF float atomic_xchg(volatile global float *p, float val) {
5-
/* TODO: Stop manually mangling this name. Need C++ namespaces to get the exact mangling. */
6-
return _Z22__spirv_AtomicExchangePU3AS1fN5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagEf(
7-
p, Device, SequentiallyConsistent, val);
5+
return __spirv_AtomicExchange((global float *)p, Device, SequentiallyConsistent, val);
86
}
97

108
_CLC_OVERLOAD _CLC_DEF float atomic_xchg(volatile local float *p, float val) {
11-
/* TODO: Stop manually mangling this name. Need C++ namespaces to get the exact mangling. */
12-
return _Z22__spirv_AtomicExchangePU3AS3fN5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagEf(
13-
p, Device, SequentiallyConsistent, val);
9+
return __spirv_AtomicExchange((local float *)p, Device, SequentiallyConsistent, val);
1410
}
1511

16-
#define IMPL(TYPE, TYPE_MANGLED, AS, AS_MANGLED) \
17-
_CLC_OVERLOAD _CLC_DEF TYPE atomic_xchg(volatile AS TYPE *p, TYPE val) { \
18-
/* TODO: Stop manually mangling this name. Need C++ namespaces to get the \
19-
* exact mangling. */ \
20-
return _Z22__spirv_AtomicExchangePU3##AS_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagE##TYPE_MANGLED( \
21-
p, Device, SequentiallyConsistent, val); \
12+
#define IMPL(TYPE, AS) \
13+
_CLC_OVERLOAD _CLC_DEF TYPE atomic_xchg(volatile AS TYPE *p, TYPE val) { \
14+
return __spirv_AtomicExchange((AS TYPE *)p, Device, SequentiallyConsistent, val); \
2215
}
2316

24-
IMPL(int, i, global, AS1)
25-
IMPL(unsigned int, j, global, AS1)
26-
IMPL(int, i, local, AS3)
27-
IMPL(unsigned int, j, local, AS3)
17+
IMPL(int, global)
18+
IMPL(unsigned int, global)
19+
IMPL(int, local)
20+
IMPL(unsigned int, local)
2821
#undef IMPL
Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
#include <clc/clc.h>
22
#include <libspirv/spirv.h>
33

4-
#define IMPL(TYPE, TYPE_MANGLED, AS, AS_MANGLED) \
5-
_CLC_OVERLOAD _CLC_DEF TYPE atomic_xor(volatile AS TYPE *p, TYPE val) { \
6-
/* TODO: Stop manually mangling this name. Need C++ namespaces to get the \
7-
* exact mangling. */ \
8-
return _Z17__spirv_AtomicXorPU3##AS_MANGLED##TYPE_MANGLED##N5__spv5Scope4FlagENS1_19MemorySemanticsMask4FlagE##TYPE_MANGLED( \
9-
p, Device, SequentiallyConsistent, val); \
4+
#define IMPL(TYPE, AS) \
5+
_CLC_OVERLOAD _CLC_DEF TYPE atomic_xor(volatile AS TYPE *p, TYPE val) { \
6+
return __spirv_AtomicXor((AS TYPE *)p, Device, SequentiallyConsistent, val); \
107
}
118

12-
IMPL(int, i, global, AS1)
13-
IMPL(unsigned int, j, global, AS1)
14-
IMPL(int, i, local, AS3)
15-
IMPL(unsigned int, j, local, AS3)
9+
IMPL(int, global)
10+
IMPL(unsigned int, global)
11+
IMPL(int, local)
12+
IMPL(unsigned int, local)
1613
#undef IMPL

0 commit comments

Comments
 (0)