@@ -1040,6 +1040,8 @@ let Extension = FuncExtOpenCLCxx in {
1040
1040
}
1041
1041
}
1042
1042
1043
+ // OpenCL v2.0 s6.13.11 - Atomic Functions.
1044
+
1043
1045
// An atomic builtin with 2 additional _explicit variants.
1044
1046
multiclass BuiltinAtomicExplicit<string Name, list<Type> Types> {
1045
1047
// Without explicit MemoryOrder or MemoryScope.
@@ -1052,31 +1054,29 @@ multiclass BuiltinAtomicExplicit<string Name, list<Type> Types> {
1052
1054
def : Builtin<Name # "_explicit", !listconcat(Types, [MemoryOrder, MemoryScope])>;
1053
1055
}
1054
1056
1055
- // OpenCL v2.0 s6.13.11 - Atomic Functions.
1056
- let MinVersion = CL20 in {
1057
- def : Builtin<"atomic_work_item_fence", [Void, MemFenceFlags, MemoryOrder, MemoryScope]>;
1058
-
1057
+ // OpenCL 2.0 atomic functions that have a pointer argument in a given address space.
1058
+ multiclass OpenCL2Atomics<AddressSpace addrspace> {
1059
1059
foreach TypePair = [[AtomicInt, Int], [AtomicUInt, UInt],
1060
1060
[AtomicLong, Long], [AtomicULong, ULong],
1061
1061
[AtomicFloat, Float], [AtomicDouble, Double]] in {
1062
1062
def : Builtin<"atomic_init",
1063
- [Void, PointerType<VolatileType<TypePair[0]>, GenericAS >, TypePair[1]]>;
1063
+ [Void, PointerType<VolatileType<TypePair[0]>, addrspace >, TypePair[1]]>;
1064
1064
defm : BuiltinAtomicExplicit<"atomic_store",
1065
- [Void, PointerType<VolatileType<TypePair[0]>, GenericAS >, TypePair[1]]>;
1065
+ [Void, PointerType<VolatileType<TypePair[0]>, addrspace >, TypePair[1]]>;
1066
1066
defm : BuiltinAtomicExplicit<"atomic_load",
1067
- [TypePair[1], PointerType<VolatileType<TypePair[0]>, GenericAS >]>;
1067
+ [TypePair[1], PointerType<VolatileType<TypePair[0]>, addrspace >]>;
1068
1068
defm : BuiltinAtomicExplicit<"atomic_exchange",
1069
- [TypePair[1], PointerType<VolatileType<TypePair[0]>, GenericAS >, TypePair[1]]>;
1069
+ [TypePair[1], PointerType<VolatileType<TypePair[0]>, addrspace >, TypePair[1]]>;
1070
1070
foreach Variant = ["weak", "strong"] in {
1071
1071
def : Builtin<"atomic_compare_exchange_" # Variant,
1072
- [Bool, PointerType<VolatileType<TypePair[0]>, GenericAS >,
1073
- PointerType<TypePair[1], GenericAS >, TypePair[1]]>;
1072
+ [Bool, PointerType<VolatileType<TypePair[0]>, addrspace >,
1073
+ PointerType<TypePair[1], addrspace >, TypePair[1]]>;
1074
1074
def : Builtin<"atomic_compare_exchange_" # Variant # "_explicit",
1075
- [Bool, PointerType<VolatileType<TypePair[0]>, GenericAS >,
1076
- PointerType<TypePair[1], GenericAS >, TypePair[1], MemoryOrder, MemoryOrder]>;
1075
+ [Bool, PointerType<VolatileType<TypePair[0]>, addrspace >,
1076
+ PointerType<TypePair[1], addrspace >, TypePair[1], MemoryOrder, MemoryOrder]>;
1077
1077
def : Builtin<"atomic_compare_exchange_" # Variant # "_explicit",
1078
- [Bool, PointerType<VolatileType<TypePair[0]>, GenericAS >,
1079
- PointerType<TypePair[1], GenericAS >, TypePair[1], MemoryOrder, MemoryOrder, MemoryScope]>;
1078
+ [Bool, PointerType<VolatileType<TypePair[0]>, addrspace >,
1079
+ PointerType<TypePair[1], addrspace >, TypePair[1], MemoryOrder, MemoryOrder, MemoryScope]>;
1080
1080
}
1081
1081
}
1082
1082
@@ -1085,22 +1085,28 @@ let MinVersion = CL20 in {
1085
1085
[AtomicUIntPtr, UIntPtr, PtrDiff]] in {
1086
1086
foreach ModOp = ["add", "sub"] in {
1087
1087
defm : BuiltinAtomicExplicit<"atomic_fetch_" # ModOp,
1088
- [TypePair[1], PointerType<VolatileType<TypePair[0]>, GenericAS >, TypePair[2]]>;
1088
+ [TypePair[1], PointerType<VolatileType<TypePair[0]>, addrspace >, TypePair[2]]>;
1089
1089
}
1090
1090
}
1091
1091
foreach TypePair = [[AtomicInt, Int, Int], [AtomicUInt, UInt, UInt],
1092
1092
[AtomicLong, Long, Long], [AtomicULong, ULong, ULong]] in {
1093
1093
foreach ModOp = ["or", "xor", "and", "min", "max"] in {
1094
1094
defm : BuiltinAtomicExplicit<"atomic_fetch_" # ModOp,
1095
- [TypePair[1], PointerType<VolatileType<TypePair[0]>, GenericAS >, TypePair[2]]>;
1095
+ [TypePair[1], PointerType<VolatileType<TypePair[0]>, addrspace >, TypePair[2]]>;
1096
1096
}
1097
1097
}
1098
1098
1099
1099
defm : BuiltinAtomicExplicit<"atomic_flag_clear",
1100
- [Void, PointerType<VolatileType<AtomicFlag>, GenericAS >]>;
1100
+ [Void, PointerType<VolatileType<AtomicFlag>, addrspace >]>;
1101
1101
1102
1102
defm : BuiltinAtomicExplicit<"atomic_flag_test_and_set",
1103
- [Bool, PointerType<VolatileType<AtomicFlag>, GenericAS>]>;
1103
+ [Bool, PointerType<VolatileType<AtomicFlag>, addrspace>]>;
1104
+ }
1105
+
1106
+ let MinVersion = CL20 in {
1107
+ def : Builtin<"atomic_work_item_fence", [Void, MemFenceFlags, MemoryOrder, MemoryScope]>;
1108
+
1109
+ defm : OpenCL2Atomics<GenericAS>;
1104
1110
}
1105
1111
1106
1112
// The functionality added by cl_ext_float_atomics extension
0 commit comments