@@ -56,6 +56,7 @@ def VectorLoadStore : BuiltinGroup;
56
56
def LoadStore : BuiltinGroup;
57
57
def IntelSubgroups : BuiltinGroup;
58
58
def AtomicFloating : BuiltinGroup;
59
+ def GroupUniform : BuiltinGroup;
59
60
60
61
//===----------------------------------------------------------------------===//
61
62
// Class defining a demangled builtin record. The information in the record
@@ -605,7 +606,10 @@ class GroupBuiltin<string name, Op operation> {
605
606
!eq(operation, OpGroupNonUniformBallotFindMSB));
606
607
bit IsLogical = !or(!eq(operation, OpGroupNonUniformLogicalAnd),
607
608
!eq(operation, OpGroupNonUniformLogicalOr),
608
- !eq(operation, OpGroupNonUniformLogicalXor));
609
+ !eq(operation, OpGroupNonUniformLogicalXor),
610
+ !eq(operation, OpGroupLogicalAndKHR),
611
+ !eq(operation, OpGroupLogicalOrKHR),
612
+ !eq(operation, OpGroupLogicalXorKHR));
609
613
bit NoGroupOperation = !or(IsElect, IsAllOrAny, IsAllEqual,
610
614
IsBallot, IsInverseBallot,
611
615
IsBallotBitExtract, IsBallotFindBit,
@@ -873,6 +877,51 @@ defm : DemangledGroupBuiltin<"group_non_uniform_scan_inclusive_logical_xors", Wo
873
877
defm : DemangledGroupBuiltin<"group_non_uniform_scan_exclusive_logical_xors", WorkOrSub, OpGroupNonUniformLogicalXor>;
874
878
defm : DemangledGroupBuiltin<"group_clustered_reduce_logical_xor", WorkOrSub, OpGroupNonUniformLogicalXor>;
875
879
880
+ // cl_khr_work_group_uniform_arithmetic / SPV_KHR_uniform_group_instructions
881
+ defm : DemangledGroupBuiltin<"group_reduce_imul", OnlyWork, OpGroupIMulKHR>;
882
+ defm : DemangledGroupBuiltin<"group_reduce_mulu", OnlyWork, OpGroupIMulKHR>;
883
+ defm : DemangledGroupBuiltin<"group_reduce_muls", OnlyWork, OpGroupIMulKHR>;
884
+ defm : DemangledGroupBuiltin<"group_scan_inclusive_imul", OnlyWork, OpGroupIMulKHR>;
885
+ defm : DemangledGroupBuiltin<"group_scan_inclusive_mulu", OnlyWork, OpGroupIMulKHR>;
886
+ defm : DemangledGroupBuiltin<"group_scan_inclusive_muls", OnlyWork, OpGroupIMulKHR>;
887
+ defm : DemangledGroupBuiltin<"group_scan_exclusive_imul", OnlyWork, OpGroupIMulKHR>;
888
+ defm : DemangledGroupBuiltin<"group_scan_exclusive_mulu", OnlyWork, OpGroupIMulKHR>;
889
+ defm : DemangledGroupBuiltin<"group_scan_exclusive_muls", OnlyWork, OpGroupIMulKHR>;
890
+
891
+ defm : DemangledGroupBuiltin<"group_reduce_mulf", OnlyWork, OpGroupFMulKHR>;
892
+ defm : DemangledGroupBuiltin<"group_reduce_mulh", OnlyWork, OpGroupFMulKHR>;
893
+ defm : DemangledGroupBuiltin<"group_reduce_muld", OnlyWork, OpGroupFMulKHR>;
894
+ defm : DemangledGroupBuiltin<"group_scan_inclusive_mulf", OnlyWork, OpGroupFMulKHR>;
895
+ defm : DemangledGroupBuiltin<"group_scan_inclusive_mulh", OnlyWork, OpGroupFMulKHR>;
896
+ defm : DemangledGroupBuiltin<"group_scan_inclusive_muld", OnlyWork, OpGroupFMulKHR>;
897
+ defm : DemangledGroupBuiltin<"group_scan_exclusive_mulf", OnlyWork, OpGroupFMulKHR>;
898
+ defm : DemangledGroupBuiltin<"group_scan_exclusive_mulh", OnlyWork, OpGroupFMulKHR>;
899
+ defm : DemangledGroupBuiltin<"group_scan_exclusive_muld", OnlyWork, OpGroupFMulKHR>;
900
+
901
+ defm : DemangledGroupBuiltin<"group_scan_exclusive_and", OnlyWork, OpGroupBitwiseAndKHR>;
902
+ defm : DemangledGroupBuiltin<"group_scan_inclusive_and", OnlyWork, OpGroupBitwiseAndKHR>;
903
+ defm : DemangledGroupBuiltin<"group_reduce_and", OnlyWork, OpGroupBitwiseAndKHR>;
904
+
905
+ defm : DemangledGroupBuiltin<"group_scan_exclusive_or", OnlyWork, OpGroupBitwiseOrKHR>;
906
+ defm : DemangledGroupBuiltin<"group_scan_inclusive_or", OnlyWork, OpGroupBitwiseOrKHR>;
907
+ defm : DemangledGroupBuiltin<"group_reduce_or", OnlyWork, OpGroupBitwiseOrKHR>;
908
+
909
+ defm : DemangledGroupBuiltin<"group_scan_exclusive_xor", OnlyWork, OpGroupBitwiseXorKHR>;
910
+ defm : DemangledGroupBuiltin<"group_scan_inclusive_xor", OnlyWork, OpGroupBitwiseXorKHR>;
911
+ defm : DemangledGroupBuiltin<"group_reduce_xor", OnlyWork, OpGroupBitwiseXorKHR>;
912
+
913
+ defm : DemangledGroupBuiltin<"group_scan_exclusive_logical_and", OnlyWork, OpGroupLogicalAndKHR>;
914
+ defm : DemangledGroupBuiltin<"group_scan_inclusive_logical_and", OnlyWork, OpGroupLogicalAndKHR>;
915
+ defm : DemangledGroupBuiltin<"group_reduce_logical_and", OnlyWork, OpGroupLogicalAndKHR>;
916
+
917
+ defm : DemangledGroupBuiltin<"group_scan_exclusive_logical_or", OnlyWork, OpGroupLogicalOrKHR>;
918
+ defm : DemangledGroupBuiltin<"group_scan_inclusive_logical_or", OnlyWork, OpGroupLogicalOrKHR>;
919
+ defm : DemangledGroupBuiltin<"group_reduce_logical_or", OnlyWork, OpGroupLogicalOrKHR>;
920
+
921
+ defm : DemangledGroupBuiltin<"group_scan_exclusive_logical_xor", OnlyWork, OpGroupLogicalXorKHR>;
922
+ defm : DemangledGroupBuiltin<"group_scan_inclusive_logical_xor", OnlyWork, OpGroupLogicalXorKHR>;
923
+ defm : DemangledGroupBuiltin<"group_reduce_logical_xor", OnlyWork, OpGroupLogicalXorKHR>;
924
+
876
925
//===----------------------------------------------------------------------===//
877
926
// Class defining an atomic instruction on floating-point numbers.
878
927
//
@@ -967,6 +1016,52 @@ foreach i = ["", "2", "4", "8", "16"] in {
967
1016
}
968
1017
// OpSubgroupImageBlockReadINTEL and OpSubgroupImageBlockWriteINTEL are to be resolved later on (in code)
969
1018
1019
+ //===----------------------------------------------------------------------===//
1020
+ // Class defining a builtin for group operations within uniform control flow.
1021
+ // It should be translated into a SPIR-V instruction using
1022
+ // the SPV_KHR_uniform_group_instructions extension.
1023
+ //
1024
+ // name is the demangled name of the given builtin.
1025
+ // opcode specifies the SPIR-V operation code of the generated instruction.
1026
+ //===----------------------------------------------------------------------===//
1027
+ class GroupUniformBuiltin<string name, Op operation> {
1028
+ string Name = name;
1029
+ Op Opcode = operation;
1030
+ bit IsLogical = !or(!eq(operation, OpGroupLogicalAndKHR),
1031
+ !eq(operation, OpGroupLogicalOrKHR),
1032
+ !eq(operation, OpGroupLogicalXorKHR));
1033
+ }
1034
+
1035
+ // Table gathering all the Intel sub group builtins.
1036
+ def GroupUniformBuiltins : GenericTable {
1037
+ let FilterClass = "GroupUniformBuiltin";
1038
+ let Fields = ["Name", "Opcode", "IsLogical"];
1039
+ }
1040
+
1041
+ // Function to lookup group builtins by their name and set.
1042
+ def lookupGroupUniformBuiltin : SearchIndex {
1043
+ let Table = GroupUniformBuiltins;
1044
+ let Key = ["Name"];
1045
+ }
1046
+
1047
+ // Multiclass used to define incoming builtin records for
1048
+ // the SPV_KHR_uniform_group_instructions extension
1049
+ // and corresponding work group builtin records.
1050
+ multiclass DemangledGroupUniformBuiltin<string name, bits<8> minNumArgs, bits<8> maxNumArgs, Op operation> {
1051
+ def : DemangledBuiltin<!strconcat("__spirv_Group", name), OpenCL_std, GroupUniform, minNumArgs, maxNumArgs>;
1052
+ def : GroupUniformBuiltin<!strconcat("__spirv_Group", name), operation>;
1053
+ }
1054
+
1055
+ // cl_khr_work_group_uniform_arithmetic / SPV_KHR_uniform_group_instructions
1056
+ defm : DemangledGroupUniformBuiltin<"IMulKHR", 3, 3, OpGroupIMulKHR>;
1057
+ defm : DemangledGroupUniformBuiltin<"FMulKHR", 3, 3, OpGroupFMulKHR>;
1058
+ defm : DemangledGroupUniformBuiltin<"BitwiseAndKHR", 3, 3, OpGroupBitwiseAndKHR>;
1059
+ defm : DemangledGroupUniformBuiltin<"BitwiseOrKHR", 3, 3, OpGroupBitwiseOrKHR>;
1060
+ defm : DemangledGroupUniformBuiltin<"BitwiseXorKHR", 3, 3, OpGroupBitwiseXorKHR>;
1061
+ defm : DemangledGroupUniformBuiltin<"LogicalAndKHR", 3, 3, OpGroupLogicalAndKHR>;
1062
+ defm : DemangledGroupUniformBuiltin<"LogicalOrKHR", 3, 3, OpGroupLogicalOrKHR>;
1063
+ defm : DemangledGroupUniformBuiltin<"LogicalXorKHR", 3, 3, OpGroupLogicalXorKHR>;
1064
+
970
1065
//===----------------------------------------------------------------------===//
971
1066
// Class defining a get builtin record used for lowering builtin calls such as
972
1067
// "get_sub_group_eq_mask" or "get_global_id" to SPIR-V instructions.
0 commit comments