1fd4e5da5Sopenharmony_ci// Copyright (c) 2018 Google LLC.
2fd4e5da5Sopenharmony_ci//
3fd4e5da5Sopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License");
4fd4e5da5Sopenharmony_ci// you may not use this file except in compliance with the License.
5fd4e5da5Sopenharmony_ci// You may obtain a copy of the License at
6fd4e5da5Sopenharmony_ci//
7fd4e5da5Sopenharmony_ci//     http://www.apache.org/licenses/LICENSE-2.0
8fd4e5da5Sopenharmony_ci//
9fd4e5da5Sopenharmony_ci// Unless required by applicable law or agreed to in writing, software
10fd4e5da5Sopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS,
11fd4e5da5Sopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12fd4e5da5Sopenharmony_ci// See the License for the specific language governing permissions and
13fd4e5da5Sopenharmony_ci// limitations under the License.
14fd4e5da5Sopenharmony_ci
15fd4e5da5Sopenharmony_ci#include <sstream>
16fd4e5da5Sopenharmony_ci#include <string>
17fd4e5da5Sopenharmony_ci#include <tuple>
18fd4e5da5Sopenharmony_ci
19fd4e5da5Sopenharmony_ci#include "gmock/gmock.h"
20fd4e5da5Sopenharmony_ci#include "test/unit_spirv.h"
21fd4e5da5Sopenharmony_ci#include "test/val/val_fixtures.h"
22fd4e5da5Sopenharmony_ci
23fd4e5da5Sopenharmony_cinamespace spvtools {
24fd4e5da5Sopenharmony_cinamespace val {
25fd4e5da5Sopenharmony_cinamespace {
26fd4e5da5Sopenharmony_ci
27fd4e5da5Sopenharmony_ciusing ::testing::Combine;
28fd4e5da5Sopenharmony_ciusing ::testing::HasSubstr;
29fd4e5da5Sopenharmony_ciusing ::testing::Values;
30fd4e5da5Sopenharmony_ciusing ::testing::ValuesIn;
31fd4e5da5Sopenharmony_ci
32fd4e5da5Sopenharmony_cistd::string GenerateShaderCode(
33fd4e5da5Sopenharmony_ci    const std::string& body,
34fd4e5da5Sopenharmony_ci    const std::string& capabilities_and_extensions = "",
35fd4e5da5Sopenharmony_ci    const std::string& execution_model = "GLCompute") {
36fd4e5da5Sopenharmony_ci  std::ostringstream ss;
37fd4e5da5Sopenharmony_ci  ss << R"(
38fd4e5da5Sopenharmony_ciOpCapability Shader
39fd4e5da5Sopenharmony_ciOpCapability GroupNonUniform
40fd4e5da5Sopenharmony_ciOpCapability GroupNonUniformVote
41fd4e5da5Sopenharmony_ciOpCapability GroupNonUniformBallot
42fd4e5da5Sopenharmony_ciOpCapability GroupNonUniformShuffle
43fd4e5da5Sopenharmony_ciOpCapability GroupNonUniformShuffleRelative
44fd4e5da5Sopenharmony_ciOpCapability GroupNonUniformArithmetic
45fd4e5da5Sopenharmony_ciOpCapability GroupNonUniformClustered
46fd4e5da5Sopenharmony_ciOpCapability GroupNonUniformQuad
47fd4e5da5Sopenharmony_ciOpCapability GroupNonUniformPartitionedNV
48fd4e5da5Sopenharmony_ciOpExtension "SPV_NV_shader_subgroup_partitioned"
49fd4e5da5Sopenharmony_ci)";
50fd4e5da5Sopenharmony_ci
51fd4e5da5Sopenharmony_ci  ss << capabilities_and_extensions;
52fd4e5da5Sopenharmony_ci  ss << "OpMemoryModel Logical GLSL450\n";
53fd4e5da5Sopenharmony_ci  ss << "OpEntryPoint " << execution_model << " %main \"main\"\n";
54fd4e5da5Sopenharmony_ci  if (execution_model == "GLCompute") {
55fd4e5da5Sopenharmony_ci    ss << "OpExecutionMode %main LocalSize 1 1 1\n";
56fd4e5da5Sopenharmony_ci  }
57fd4e5da5Sopenharmony_ci
58fd4e5da5Sopenharmony_ci  ss << R"(
59fd4e5da5Sopenharmony_ci%void = OpTypeVoid
60fd4e5da5Sopenharmony_ci%func = OpTypeFunction %void
61fd4e5da5Sopenharmony_ci%bool = OpTypeBool
62fd4e5da5Sopenharmony_ci%u32 = OpTypeInt 32 0
63fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 1
64fd4e5da5Sopenharmony_ci%float = OpTypeFloat 32
65fd4e5da5Sopenharmony_ci%u32vec4 = OpTypeVector %u32 4
66fd4e5da5Sopenharmony_ci%u32vec3 = OpTypeVector %u32 3
67fd4e5da5Sopenharmony_ci%v2bool = OpTypeVector %bool 2
68fd4e5da5Sopenharmony_ci%v4float = OpTypeVector %float 4
69fd4e5da5Sopenharmony_ci%struct = OpTypeStruct %int
70fd4e5da5Sopenharmony_ci%v4int = OpTypeVector %int 4
71fd4e5da5Sopenharmony_ci
72fd4e5da5Sopenharmony_ci%true = OpConstantTrue %bool
73fd4e5da5Sopenharmony_ci%false = OpConstantFalse %bool
74fd4e5da5Sopenharmony_ci
75fd4e5da5Sopenharmony_ci%u32_0 = OpConstant %u32 0
76fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0
77fd4e5da5Sopenharmony_ci
78fd4e5da5Sopenharmony_ci%float_0 = OpConstant %float 0
79fd4e5da5Sopenharmony_ci
80fd4e5da5Sopenharmony_ci%u32vec4_null = OpConstantComposite %u32vec4 %u32_0 %u32_0 %u32_0 %u32_0
81fd4e5da5Sopenharmony_ci%u32vec3_null = OpConstantComposite %u32vec3 %u32_0 %u32_0 %u32_0
82fd4e5da5Sopenharmony_ci%v2bool_false = OpConstantNull %v2bool
83fd4e5da5Sopenharmony_ci%v4float_null = OpConstantNull %v4float
84fd4e5da5Sopenharmony_ci%struct_null = OpConstantNull %struct
85fd4e5da5Sopenharmony_ci%v4int_null = OpConstantComposite %v4int %int_0 %int_0 %int_0 %int_0
86fd4e5da5Sopenharmony_ci
87fd4e5da5Sopenharmony_ci%u32_undef = OpUndef %u32
88fd4e5da5Sopenharmony_ci
89fd4e5da5Sopenharmony_ci%cross_device = OpConstant %u32 0
90fd4e5da5Sopenharmony_ci%device = OpConstant %u32 1
91fd4e5da5Sopenharmony_ci%workgroup = OpConstant %u32 2
92fd4e5da5Sopenharmony_ci%subgroup = OpConstant %u32 3
93fd4e5da5Sopenharmony_ci%invocation = OpConstant %u32 4
94fd4e5da5Sopenharmony_ci
95fd4e5da5Sopenharmony_ci%reduce = OpConstant %u32 0
96fd4e5da5Sopenharmony_ci%inclusive_scan = OpConstant %u32 1
97fd4e5da5Sopenharmony_ci%exclusive_scan = OpConstant %u32 2
98fd4e5da5Sopenharmony_ci%clustered_reduce = OpConstant %u32 3
99fd4e5da5Sopenharmony_ci
100fd4e5da5Sopenharmony_ci%main = OpFunction %void None %func
101fd4e5da5Sopenharmony_ci%main_entry = OpLabel
102fd4e5da5Sopenharmony_ci)";
103fd4e5da5Sopenharmony_ci
104fd4e5da5Sopenharmony_ci  ss << body;
105fd4e5da5Sopenharmony_ci
106fd4e5da5Sopenharmony_ci  ss << R"(
107fd4e5da5Sopenharmony_ciOpReturn
108fd4e5da5Sopenharmony_ciOpFunctionEnd)";
109fd4e5da5Sopenharmony_ci
110fd4e5da5Sopenharmony_ci  return ss.str();
111fd4e5da5Sopenharmony_ci}
112fd4e5da5Sopenharmony_ci
113fd4e5da5Sopenharmony_cispv::Scope scopes[] = {spv::Scope::CrossDevice, spv::Scope::Device,
114fd4e5da5Sopenharmony_ci                       spv::Scope::Workgroup, spv::Scope::Subgroup,
115fd4e5da5Sopenharmony_ci                       spv::Scope::Invocation};
116fd4e5da5Sopenharmony_ci
117fd4e5da5Sopenharmony_ciusing ValidateGroupNonUniform = spvtest::ValidateBase<bool>;
118fd4e5da5Sopenharmony_ciusing GroupNonUniform = spvtest::ValidateBase<
119fd4e5da5Sopenharmony_ci    std::tuple<std::string, std::string, spv::Scope, std::string, std::string>>;
120fd4e5da5Sopenharmony_ci
121fd4e5da5Sopenharmony_cistd::string ConvertScope(spv::Scope scope) {
122fd4e5da5Sopenharmony_ci  switch (scope) {
123fd4e5da5Sopenharmony_ci    case spv::Scope::CrossDevice:
124fd4e5da5Sopenharmony_ci      return "%cross_device";
125fd4e5da5Sopenharmony_ci    case spv::Scope::Device:
126fd4e5da5Sopenharmony_ci      return "%device";
127fd4e5da5Sopenharmony_ci    case spv::Scope::Workgroup:
128fd4e5da5Sopenharmony_ci      return "%workgroup";
129fd4e5da5Sopenharmony_ci    case spv::Scope::Subgroup:
130fd4e5da5Sopenharmony_ci      return "%subgroup";
131fd4e5da5Sopenharmony_ci    case spv::Scope::Invocation:
132fd4e5da5Sopenharmony_ci      return "%invocation";
133fd4e5da5Sopenharmony_ci    default:
134fd4e5da5Sopenharmony_ci      return "";
135fd4e5da5Sopenharmony_ci  }
136fd4e5da5Sopenharmony_ci}
137fd4e5da5Sopenharmony_ci
138fd4e5da5Sopenharmony_cistd::string ConvertMatch(const std::string& type) {
139fd4e5da5Sopenharmony_ci  if (type == "%bool") {
140fd4e5da5Sopenharmony_ci    return "%true";
141fd4e5da5Sopenharmony_ci  } else if (type == "%u32") {
142fd4e5da5Sopenharmony_ci    return "%u32_0";
143fd4e5da5Sopenharmony_ci  } else if (type == "%int") {
144fd4e5da5Sopenharmony_ci    return "%int_0";
145fd4e5da5Sopenharmony_ci  } else if (type == "%float") {
146fd4e5da5Sopenharmony_ci    return "%float_0";
147fd4e5da5Sopenharmony_ci  } else if (type == "%u32vec4") {
148fd4e5da5Sopenharmony_ci    return "%u32vec4_null";
149fd4e5da5Sopenharmony_ci  } else if (type == "%u32vec3") {
150fd4e5da5Sopenharmony_ci    return "%u32vec3_null";
151fd4e5da5Sopenharmony_ci  } else if (type == "%v2bool") {
152fd4e5da5Sopenharmony_ci    return "%v2bool_false";
153fd4e5da5Sopenharmony_ci  } else if (type == "%v4float") {
154fd4e5da5Sopenharmony_ci    return "%v4float_null";
155fd4e5da5Sopenharmony_ci  } else if (type == "%struct") {
156fd4e5da5Sopenharmony_ci    return "%struct_null";
157fd4e5da5Sopenharmony_ci  } else if (type == "%v4int") {
158fd4e5da5Sopenharmony_ci    return "%v4int_null";
159fd4e5da5Sopenharmony_ci  }
160fd4e5da5Sopenharmony_ci
161fd4e5da5Sopenharmony_ci  return "INVALID";
162fd4e5da5Sopenharmony_ci}
163fd4e5da5Sopenharmony_ci
164fd4e5da5Sopenharmony_ciTEST_P(GroupNonUniform, Vulkan1p1) {
165fd4e5da5Sopenharmony_ci  std::string opcode = std::get<0>(GetParam());
166fd4e5da5Sopenharmony_ci  std::string type = std::get<1>(GetParam());
167fd4e5da5Sopenharmony_ci  spv::Scope execution_scope = std::get<2>(GetParam());
168fd4e5da5Sopenharmony_ci  std::string args = std::get<3>(GetParam());
169fd4e5da5Sopenharmony_ci  std::string error = std::get<4>(GetParam());
170fd4e5da5Sopenharmony_ci
171fd4e5da5Sopenharmony_ci  const std::string match = "match_res";
172fd4e5da5Sopenharmony_ci  size_t pos = std::string::npos;
173fd4e5da5Sopenharmony_ci  while ((pos = args.find(match)) != std::string::npos) {
174fd4e5da5Sopenharmony_ci    const std::string replace = ConvertMatch(type);
175fd4e5da5Sopenharmony_ci    args = args.substr(0, pos) + replace + args.substr(pos + match.size());
176fd4e5da5Sopenharmony_ci  }
177fd4e5da5Sopenharmony_ci
178fd4e5da5Sopenharmony_ci  std::ostringstream sstr;
179fd4e5da5Sopenharmony_ci  sstr << "%result = " << opcode << " ";
180fd4e5da5Sopenharmony_ci  sstr << type << " ";
181fd4e5da5Sopenharmony_ci  sstr << ConvertScope(execution_scope) << " ";
182fd4e5da5Sopenharmony_ci  sstr << args << "\n";
183fd4e5da5Sopenharmony_ci
184fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(sstr.str()), SPV_ENV_VULKAN_1_1);
185fd4e5da5Sopenharmony_ci  spv_result_t result = ValidateInstructions(SPV_ENV_VULKAN_1_1);
186fd4e5da5Sopenharmony_ci  if (error == "") {
187fd4e5da5Sopenharmony_ci    if (execution_scope == spv::Scope::Subgroup) {
188fd4e5da5Sopenharmony_ci      EXPECT_EQ(SPV_SUCCESS, result);
189fd4e5da5Sopenharmony_ci    } else {
190fd4e5da5Sopenharmony_ci      EXPECT_EQ(SPV_ERROR_INVALID_DATA, result);
191fd4e5da5Sopenharmony_ci      EXPECT_THAT(getDiagnosticString(),
192fd4e5da5Sopenharmony_ci                  AnyVUID("VUID-StandaloneSpirv-None-04642"));
193fd4e5da5Sopenharmony_ci      EXPECT_THAT(
194fd4e5da5Sopenharmony_ci          getDiagnosticString(),
195fd4e5da5Sopenharmony_ci          HasSubstr(
196fd4e5da5Sopenharmony_ci              "in Vulkan environment Execution scope is limited to Subgroup"));
197fd4e5da5Sopenharmony_ci    }
198fd4e5da5Sopenharmony_ci  } else {
199fd4e5da5Sopenharmony_ci    EXPECT_EQ(SPV_ERROR_INVALID_DATA, result);
200fd4e5da5Sopenharmony_ci    EXPECT_THAT(getDiagnosticString(), HasSubstr(error));
201fd4e5da5Sopenharmony_ci  }
202fd4e5da5Sopenharmony_ci}
203fd4e5da5Sopenharmony_ci
204fd4e5da5Sopenharmony_ciTEST_P(GroupNonUniform, Spirv1p3) {
205fd4e5da5Sopenharmony_ci  std::string opcode = std::get<0>(GetParam());
206fd4e5da5Sopenharmony_ci  std::string type = std::get<1>(GetParam());
207fd4e5da5Sopenharmony_ci  spv::Scope execution_scope = std::get<2>(GetParam());
208fd4e5da5Sopenharmony_ci  std::string args = std::get<3>(GetParam());
209fd4e5da5Sopenharmony_ci  std::string error = std::get<4>(GetParam());
210fd4e5da5Sopenharmony_ci
211fd4e5da5Sopenharmony_ci  const std::string match = "match_res";
212fd4e5da5Sopenharmony_ci  size_t pos = std::string::npos;
213fd4e5da5Sopenharmony_ci  while ((pos = args.find(match)) != std::string::npos) {
214fd4e5da5Sopenharmony_ci    const std::string replace = ConvertMatch(type);
215fd4e5da5Sopenharmony_ci    args = args.substr(0, pos) + replace + args.substr(pos + match.size());
216fd4e5da5Sopenharmony_ci  }
217fd4e5da5Sopenharmony_ci
218fd4e5da5Sopenharmony_ci  std::ostringstream sstr;
219fd4e5da5Sopenharmony_ci  sstr << "%result = " << opcode << " ";
220fd4e5da5Sopenharmony_ci  sstr << type << " ";
221fd4e5da5Sopenharmony_ci  sstr << ConvertScope(execution_scope) << " ";
222fd4e5da5Sopenharmony_ci  sstr << args << "\n";
223fd4e5da5Sopenharmony_ci
224fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(sstr.str()), SPV_ENV_UNIVERSAL_1_3);
225fd4e5da5Sopenharmony_ci  spv_result_t result = ValidateInstructions(SPV_ENV_UNIVERSAL_1_3);
226fd4e5da5Sopenharmony_ci  if (error == "") {
227fd4e5da5Sopenharmony_ci    if (execution_scope == spv::Scope::Subgroup ||
228fd4e5da5Sopenharmony_ci        execution_scope == spv::Scope::Workgroup) {
229fd4e5da5Sopenharmony_ci      EXPECT_EQ(SPV_SUCCESS, result);
230fd4e5da5Sopenharmony_ci    } else {
231fd4e5da5Sopenharmony_ci      EXPECT_EQ(SPV_ERROR_INVALID_DATA, result);
232fd4e5da5Sopenharmony_ci      EXPECT_THAT(
233fd4e5da5Sopenharmony_ci          getDiagnosticString(),
234fd4e5da5Sopenharmony_ci          HasSubstr("Execution scope is limited to Subgroup or Workgroup"));
235fd4e5da5Sopenharmony_ci    }
236fd4e5da5Sopenharmony_ci  } else {
237fd4e5da5Sopenharmony_ci    EXPECT_EQ(SPV_ERROR_INVALID_DATA, result);
238fd4e5da5Sopenharmony_ci    EXPECT_THAT(getDiagnosticString(), HasSubstr(error));
239fd4e5da5Sopenharmony_ci  }
240fd4e5da5Sopenharmony_ci}
241fd4e5da5Sopenharmony_ci
242fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(GroupNonUniformElect, GroupNonUniform,
243fd4e5da5Sopenharmony_ci                         Combine(Values("OpGroupNonUniformElect"),
244fd4e5da5Sopenharmony_ci                                 Values("%bool"), ValuesIn(scopes), Values(""),
245fd4e5da5Sopenharmony_ci                                 Values("")));
246fd4e5da5Sopenharmony_ci
247fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(GroupNonUniformVote, GroupNonUniform,
248fd4e5da5Sopenharmony_ci                         Combine(Values("OpGroupNonUniformAll",
249fd4e5da5Sopenharmony_ci                                        "OpGroupNonUniformAny",
250fd4e5da5Sopenharmony_ci                                        "OpGroupNonUniformAllEqual"),
251fd4e5da5Sopenharmony_ci                                 Values("%bool"), ValuesIn(scopes),
252fd4e5da5Sopenharmony_ci                                 Values("%true"), Values("")));
253fd4e5da5Sopenharmony_ci
254fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(GroupNonUniformBroadcast, GroupNonUniform,
255fd4e5da5Sopenharmony_ci                         Combine(Values("OpGroupNonUniformBroadcast"),
256fd4e5da5Sopenharmony_ci                                 Values("%bool"), ValuesIn(scopes),
257fd4e5da5Sopenharmony_ci                                 Values("%true %u32_0"), Values("")));
258fd4e5da5Sopenharmony_ci
259fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(GroupNonUniformBroadcastFirst, GroupNonUniform,
260fd4e5da5Sopenharmony_ci                         Combine(Values("OpGroupNonUniformBroadcastFirst"),
261fd4e5da5Sopenharmony_ci                                 Values("%bool"), ValuesIn(scopes),
262fd4e5da5Sopenharmony_ci                                 Values("%true"), Values("")));
263fd4e5da5Sopenharmony_ci
264fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(GroupNonUniformBallot, GroupNonUniform,
265fd4e5da5Sopenharmony_ci                         Combine(Values("OpGroupNonUniformBallot"),
266fd4e5da5Sopenharmony_ci                                 Values("%u32vec4"), ValuesIn(scopes),
267fd4e5da5Sopenharmony_ci                                 Values("%true"), Values("")));
268fd4e5da5Sopenharmony_ci
269fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(GroupNonUniformInverseBallot, GroupNonUniform,
270fd4e5da5Sopenharmony_ci                         Combine(Values("OpGroupNonUniformInverseBallot"),
271fd4e5da5Sopenharmony_ci                                 Values("%bool"), ValuesIn(scopes),
272fd4e5da5Sopenharmony_ci                                 Values("%u32vec4_null"), Values("")));
273fd4e5da5Sopenharmony_ci
274fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(GroupNonUniformBallotBitExtract, GroupNonUniform,
275fd4e5da5Sopenharmony_ci                         Combine(Values("OpGroupNonUniformBallotBitExtract"),
276fd4e5da5Sopenharmony_ci                                 Values("%bool"), ValuesIn(scopes),
277fd4e5da5Sopenharmony_ci                                 Values("%u32vec4_null %u32_0"), Values("")));
278fd4e5da5Sopenharmony_ci
279fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(GroupNonUniformBallotBitCount, GroupNonUniform,
280fd4e5da5Sopenharmony_ci                         Combine(Values("OpGroupNonUniformBallotBitCount"),
281fd4e5da5Sopenharmony_ci                                 Values("%u32"), ValuesIn(scopes),
282fd4e5da5Sopenharmony_ci                                 Values("Reduce %u32vec4_null"), Values("")));
283fd4e5da5Sopenharmony_ci
284fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(GroupNonUniformBallotFind, GroupNonUniform,
285fd4e5da5Sopenharmony_ci                         Combine(Values("OpGroupNonUniformBallotFindLSB",
286fd4e5da5Sopenharmony_ci                                        "OpGroupNonUniformBallotFindMSB"),
287fd4e5da5Sopenharmony_ci                                 Values("%u32"), ValuesIn(scopes),
288fd4e5da5Sopenharmony_ci                                 Values("%u32vec4_null"), Values("")));
289fd4e5da5Sopenharmony_ci
290fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(GroupNonUniformShuffle, GroupNonUniform,
291fd4e5da5Sopenharmony_ci                         Combine(Values("OpGroupNonUniformShuffle",
292fd4e5da5Sopenharmony_ci                                        "OpGroupNonUniformShuffleXor",
293fd4e5da5Sopenharmony_ci                                        "OpGroupNonUniformShuffleUp",
294fd4e5da5Sopenharmony_ci                                        "OpGroupNonUniformShuffleDown"),
295fd4e5da5Sopenharmony_ci                                 Values("%u32"), ValuesIn(scopes),
296fd4e5da5Sopenharmony_ci                                 Values("%u32_0 %u32_0"), Values("")));
297fd4e5da5Sopenharmony_ci
298fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
299fd4e5da5Sopenharmony_ci    GroupNonUniformIntegerArithmetic, GroupNonUniform,
300fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformIAdd", "OpGroupNonUniformIMul",
301fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformSMin", "OpGroupNonUniformUMin",
302fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformSMax", "OpGroupNonUniformUMax",
303fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformBitwiseAnd", "OpGroupNonUniformBitwiseOr",
304fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformBitwiseXor"),
305fd4e5da5Sopenharmony_ci            Values("%u32"), ValuesIn(scopes), Values("Reduce %u32_0"),
306fd4e5da5Sopenharmony_ci            Values("")));
307fd4e5da5Sopenharmony_ci
308fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
309fd4e5da5Sopenharmony_ci    GroupNonUniformFloatArithmetic, GroupNonUniform,
310fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformFAdd", "OpGroupNonUniformFMul",
311fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformFMin", "OpGroupNonUniformFMax"),
312fd4e5da5Sopenharmony_ci            Values("%float"), ValuesIn(scopes), Values("Reduce %float_0"),
313fd4e5da5Sopenharmony_ci            Values("")));
314fd4e5da5Sopenharmony_ci
315fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(GroupNonUniformLogicalArithmetic, GroupNonUniform,
316fd4e5da5Sopenharmony_ci                         Combine(Values("OpGroupNonUniformLogicalAnd",
317fd4e5da5Sopenharmony_ci                                        "OpGroupNonUniformLogicalOr",
318fd4e5da5Sopenharmony_ci                                        "OpGroupNonUniformLogicalXor"),
319fd4e5da5Sopenharmony_ci                                 Values("%bool"), ValuesIn(scopes),
320fd4e5da5Sopenharmony_ci                                 Values("Reduce %true"), Values("")));
321fd4e5da5Sopenharmony_ci
322fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(GroupNonUniformQuad, GroupNonUniform,
323fd4e5da5Sopenharmony_ci                         Combine(Values("OpGroupNonUniformQuadBroadcast",
324fd4e5da5Sopenharmony_ci                                        "OpGroupNonUniformQuadSwap"),
325fd4e5da5Sopenharmony_ci                                 Values("%u32"), ValuesIn(scopes),
326fd4e5da5Sopenharmony_ci                                 Values("%u32_0 %u32_0"), Values("")));
327fd4e5da5Sopenharmony_ci
328fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(GroupNonUniformBallotBitCountScope, GroupNonUniform,
329fd4e5da5Sopenharmony_ci                         Combine(Values("OpGroupNonUniformBallotBitCount"),
330fd4e5da5Sopenharmony_ci                                 Values("%u32"), ValuesIn(scopes),
331fd4e5da5Sopenharmony_ci                                 Values("Reduce %u32vec4_null"), Values("")));
332fd4e5da5Sopenharmony_ci
333fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
334fd4e5da5Sopenharmony_ci    GroupNonUniformBallotBitCountBadResultType, GroupNonUniform,
335fd4e5da5Sopenharmony_ci    Combine(
336fd4e5da5Sopenharmony_ci        Values("OpGroupNonUniformBallotBitCount"), Values("%float", "%int"),
337fd4e5da5Sopenharmony_ci        Values(spv::Scope::Subgroup), Values("Reduce %u32vec4_null"),
338fd4e5da5Sopenharmony_ci        Values("Expected Result Type to be an unsigned integer type scalar.")));
339fd4e5da5Sopenharmony_ci
340fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(GroupNonUniformBallotBitCountBadValue, GroupNonUniform,
341fd4e5da5Sopenharmony_ci                         Combine(Values("OpGroupNonUniformBallotBitCount"),
342fd4e5da5Sopenharmony_ci                                 Values("%u32"), Values(spv::Scope::Subgroup),
343fd4e5da5Sopenharmony_ci                                 Values("Reduce %u32vec3_null", "Reduce %u32_0",
344fd4e5da5Sopenharmony_ci                                        "Reduce %float_0"),
345fd4e5da5Sopenharmony_ci                                 Values("Expected Value to be a vector of four "
346fd4e5da5Sopenharmony_ci                                        "components of integer type scalar")));
347fd4e5da5Sopenharmony_ci
348fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(GroupNonUniformElectGood, GroupNonUniform,
349fd4e5da5Sopenharmony_ci                         Combine(Values("OpGroupNonUniformElect"),
350fd4e5da5Sopenharmony_ci                                 Values("%bool"), Values(spv::Scope::Subgroup),
351fd4e5da5Sopenharmony_ci                                 Values(""), Values("")));
352fd4e5da5Sopenharmony_ci
353fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
354fd4e5da5Sopenharmony_ci    GroupNonUniformElectBadResultType, GroupNonUniform,
355fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformElect"),
356fd4e5da5Sopenharmony_ci            Values("%void", "%u32", "%int", "%float", "%u32vec4", "%u32vec3",
357fd4e5da5Sopenharmony_ci                   "%v2bool", "%v4float", "%struct"),
358fd4e5da5Sopenharmony_ci            Values(spv::Scope::Subgroup), Values(""),
359fd4e5da5Sopenharmony_ci            Values("Result must be a boolean scalar type")));
360fd4e5da5Sopenharmony_ci
361fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(GroupNonUniformAnyAllGood, GroupNonUniform,
362fd4e5da5Sopenharmony_ci                         Combine(Values("OpGroupNonUniformAny",
363fd4e5da5Sopenharmony_ci                                        "OpGroupNonUniformAll"),
364fd4e5da5Sopenharmony_ci                                 Values("%bool"), Values(spv::Scope::Subgroup),
365fd4e5da5Sopenharmony_ci                                 Values("%true", "%false"), Values("")));
366fd4e5da5Sopenharmony_ci
367fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
368fd4e5da5Sopenharmony_ci    GroupNonUniformAnyAllBadResultType, GroupNonUniform,
369fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformAny", "OpGroupNonUniformAll"),
370fd4e5da5Sopenharmony_ci            Values("%void", "%u32", "%int", "%float", "%u32vec4", "%u32vec3",
371fd4e5da5Sopenharmony_ci                   "%v2bool", "%v4float", "%struct"),
372fd4e5da5Sopenharmony_ci            Values(spv::Scope::Subgroup), Values("%true"),
373fd4e5da5Sopenharmony_ci            Values("Result must be a boolean scalar type")));
374fd4e5da5Sopenharmony_ci
375fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
376fd4e5da5Sopenharmony_ci    GroupNonUniformAnyAllBadOperand, GroupNonUniform,
377fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformAny", "OpGroupNonUniformAll"),
378fd4e5da5Sopenharmony_ci            Values("%bool"), Values(spv::Scope::Subgroup),
379fd4e5da5Sopenharmony_ci            Values("%u32_0", "%int_0", "%float_0", "%u32vec4_null",
380fd4e5da5Sopenharmony_ci                   "%u32vec3_null", "%v2bool_false", "%v4float_null",
381fd4e5da5Sopenharmony_ci                   "%struct_null"),
382fd4e5da5Sopenharmony_ci            Values("Predicate must be a boolean scalar type")));
383fd4e5da5Sopenharmony_ci
384fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(GroupNonUniformAllEqualGood, GroupNonUniform,
385fd4e5da5Sopenharmony_ci                         Combine(Values("OpGroupNonUniformAllEqual"),
386fd4e5da5Sopenharmony_ci                                 Values("%bool"), Values(spv::Scope::Subgroup),
387fd4e5da5Sopenharmony_ci                                 Values("%true", "%false"), Values("")));
388fd4e5da5Sopenharmony_ci
389fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
390fd4e5da5Sopenharmony_ci    GroupNonUniformAllEqualBadResultType, GroupNonUniform,
391fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformAllEqual"),
392fd4e5da5Sopenharmony_ci            Values("%void", "%u32", "%int", "%float", "%u32vec4", "%u32vec3",
393fd4e5da5Sopenharmony_ci                   "%v2bool", "%v4float", "%struct"),
394fd4e5da5Sopenharmony_ci            Values(spv::Scope::Subgroup), Values("%true"),
395fd4e5da5Sopenharmony_ci            Values("Result must be a boolean scalar type")));
396fd4e5da5Sopenharmony_ci
397fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
398fd4e5da5Sopenharmony_ci    GroupNonUniformAllEqualBadOperand, GroupNonUniform,
399fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformAllEqual"), Values("%bool"),
400fd4e5da5Sopenharmony_ci            Values(spv::Scope::Subgroup), Values("%struct_null"),
401fd4e5da5Sopenharmony_ci            Values("Value must be a scalar or vector of integer, "
402fd4e5da5Sopenharmony_ci                   "floating-point, or boolean type")));
403fd4e5da5Sopenharmony_ci
404fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(GroupNonUniformBroadcastGood, GroupNonUniform,
405fd4e5da5Sopenharmony_ci                         Combine(Values("OpGroupNonUniformBroadcast",
406fd4e5da5Sopenharmony_ci                                        "OpGroupNonUniformQuadBroadcast",
407fd4e5da5Sopenharmony_ci                                        "OpGroupNonUniformQuadSwap"),
408fd4e5da5Sopenharmony_ci                                 Values("%bool", "%u32", "%int", "%float",
409fd4e5da5Sopenharmony_ci                                        "%u32vec4", "%u32vec3", "%v2bool",
410fd4e5da5Sopenharmony_ci                                        "%v4float", "%v4int"),
411fd4e5da5Sopenharmony_ci                                 Values(spv::Scope::Subgroup),
412fd4e5da5Sopenharmony_ci                                 Values("match_res %u32_0"), Values("")));
413fd4e5da5Sopenharmony_ci
414fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
415fd4e5da5Sopenharmony_ci    GroupNonUniformBroadcastShuffleBadResultType, GroupNonUniform,
416fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformBroadcast", "OpGroupNonUniformShuffle",
417fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformShuffleXor", "OpGroupNonUniformShuffleUp",
418fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformShuffleDown",
419fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformQuadBroadcast",
420fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformQuadSwap"),
421fd4e5da5Sopenharmony_ci            Values("%void", "%struct"), Values(spv::Scope::Subgroup),
422fd4e5da5Sopenharmony_ci            Values("%u32_0 %u32_0"),
423fd4e5da5Sopenharmony_ci            Values("Result must be a scalar or vector of integer, "
424fd4e5da5Sopenharmony_ci                   "floating-point, or boolean type")));
425fd4e5da5Sopenharmony_ci
426fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
427fd4e5da5Sopenharmony_ci    GroupNonUniformBroadcastShuffleBadOperand1, GroupNonUniform,
428fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformBroadcast", "OpGroupNonUniformShuffle",
429fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformShuffleXor", "OpGroupNonUniformShuffleUp",
430fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformShuffleDown",
431fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformQuadBroadcast",
432fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformQuadSwap"),
433fd4e5da5Sopenharmony_ci            Values("%bool"), Values(spv::Scope::Subgroup),
434fd4e5da5Sopenharmony_ci            Values("%u32_0 %u32_0", "%int_0 %u32_0", "%float_0 %u32_0",
435fd4e5da5Sopenharmony_ci                   "%u32vec4_null %u32_0", "%u32vec3_null %u32_0",
436fd4e5da5Sopenharmony_ci                   "%v2bool_false %u32_0", "%v4float_null %u32_0",
437fd4e5da5Sopenharmony_ci                   "%struct_null %u32_0", "%v4int_null %u32_0"),
438fd4e5da5Sopenharmony_ci            Values("The type of Value must match the Result type")));
439fd4e5da5Sopenharmony_ci
440fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
441fd4e5da5Sopenharmony_ci    GroupNonUniformBroadcastShuffleBadOperand2, GroupNonUniform,
442fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformBroadcast", "OpGroupNonUniformShuffle",
443fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformShuffleXor", "OpGroupNonUniformShuffleUp",
444fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformShuffleDown",
445fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformQuadBroadcast",
446fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformQuadSwap"),
447fd4e5da5Sopenharmony_ci            Values("%bool"), Values(spv::Scope::Subgroup),
448fd4e5da5Sopenharmony_ci            Values("%true %true", "%true %int_0", "%true %float_0",
449fd4e5da5Sopenharmony_ci                   "%true %u32vec4_null", "%true %u32vec3_null",
450fd4e5da5Sopenharmony_ci                   "%true %v4float_null", "%true %v2bool_false",
451fd4e5da5Sopenharmony_ci                   "%true %struct_null", "%true %v4int_null"),
452fd4e5da5Sopenharmony_ci            Values("must be an unsigned integer scalar")));
453fd4e5da5Sopenharmony_ci
454fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(GroupNonUniformBroadcastShuffleOperand2NotConstant,
455fd4e5da5Sopenharmony_ci                         GroupNonUniform,
456fd4e5da5Sopenharmony_ci                         Combine(Values("OpGroupNonUniformBroadcast",
457fd4e5da5Sopenharmony_ci                                        "OpGroupNonUniformQuadBroadcast",
458fd4e5da5Sopenharmony_ci                                        "OpGroupNonUniformQuadSwap"),
459fd4e5da5Sopenharmony_ci                                 Values("%bool"), Values(spv::Scope::Subgroup),
460fd4e5da5Sopenharmony_ci                                 Values("%true %u32_undef"),
461fd4e5da5Sopenharmony_ci                                 Values("must be a constant instruction")));
462fd4e5da5Sopenharmony_ci
463fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(GroupNonUniformBroadcastFirstGood, GroupNonUniform,
464fd4e5da5Sopenharmony_ci                         Combine(Values("OpGroupNonUniformBroadcastFirst"),
465fd4e5da5Sopenharmony_ci                                 Values("%bool", "%u32", "%int", "%float",
466fd4e5da5Sopenharmony_ci                                        "%u32vec4", "%u32vec3", "%v2bool",
467fd4e5da5Sopenharmony_ci                                        "%v4float", "%v4int"),
468fd4e5da5Sopenharmony_ci                                 Values(spv::Scope::Subgroup),
469fd4e5da5Sopenharmony_ci                                 Values("match_res"), Values("")));
470fd4e5da5Sopenharmony_ci
471fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
472fd4e5da5Sopenharmony_ci    GroupNonUniformBroadcasFirsttBadResultType, GroupNonUniform,
473fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformBroadcastFirst"),
474fd4e5da5Sopenharmony_ci            Values("%void", "%struct"), Values(spv::Scope::Subgroup),
475fd4e5da5Sopenharmony_ci            Values("%u32_0"),
476fd4e5da5Sopenharmony_ci            Values("Result must be a scalar or vector of integer, "
477fd4e5da5Sopenharmony_ci                   "floating-point, or boolean type")));
478fd4e5da5Sopenharmony_ci
479fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
480fd4e5da5Sopenharmony_ci    GroupNonUniformBroadcastBadOperand, GroupNonUniform,
481fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformBroadcastFirst"), Values("%bool"),
482fd4e5da5Sopenharmony_ci            Values(spv::Scope::Subgroup),
483fd4e5da5Sopenharmony_ci            Values("%u32_0", "%int_0", "%float_0", "%u32vec4_null",
484fd4e5da5Sopenharmony_ci                   "%u32vec3_null", "%v2bool_false", "%v4float_null",
485fd4e5da5Sopenharmony_ci                   "%struct_null", "%v4int_null"),
486fd4e5da5Sopenharmony_ci            Values("The type of Value must match the Result type")));
487fd4e5da5Sopenharmony_ci
488fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(GroupNonUniformBallotGood, GroupNonUniform,
489fd4e5da5Sopenharmony_ci                         Combine(Values("OpGroupNonUniformBallot"),
490fd4e5da5Sopenharmony_ci                                 Values("%u32vec4"),
491fd4e5da5Sopenharmony_ci                                 Values(spv::Scope::Subgroup),
492fd4e5da5Sopenharmony_ci                                 Values("%true", "%false"), Values("")));
493fd4e5da5Sopenharmony_ci
494fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
495fd4e5da5Sopenharmony_ci    GroupNonUniformBallotBadResultType, GroupNonUniform,
496fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformBallot"),
497fd4e5da5Sopenharmony_ci            Values("%void", "%bool", "%u32", "%int", "%float", "%u32vec3",
498fd4e5da5Sopenharmony_ci                   "%v2bool", "%v4float", "%struct", "%v4int"),
499fd4e5da5Sopenharmony_ci            Values(spv::Scope::Subgroup), Values("%true", "%false"),
500fd4e5da5Sopenharmony_ci            Values("Result must be a 4-component unsigned integer vector")));
501fd4e5da5Sopenharmony_ci
502fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(GroupNonUniformBallotBadOperand, GroupNonUniform,
503fd4e5da5Sopenharmony_ci                         Combine(Values("OpGroupNonUniformBallot"),
504fd4e5da5Sopenharmony_ci                                 Values("%u32vec4"),
505fd4e5da5Sopenharmony_ci                                 Values(spv::Scope::Subgroup),
506fd4e5da5Sopenharmony_ci                                 Values("%u32_0", "%int_0", "%float_0",
507fd4e5da5Sopenharmony_ci                                        "%u32vec4_null", "%u32vec3_null",
508fd4e5da5Sopenharmony_ci                                        "%v2bool_false", "%v4float_null",
509fd4e5da5Sopenharmony_ci                                        "%struct_null", "%v4int_null"),
510fd4e5da5Sopenharmony_ci                                 Values("Predicate must be a boolean scalar")));
511fd4e5da5Sopenharmony_ci
512fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(GroupNonUniformInverseBallotGood, GroupNonUniform,
513fd4e5da5Sopenharmony_ci                         Combine(Values("OpGroupNonUniformInverseBallot"),
514fd4e5da5Sopenharmony_ci                                 Values("%bool"), Values(spv::Scope::Subgroup),
515fd4e5da5Sopenharmony_ci                                 Values("%u32vec4_null"), Values("")));
516fd4e5da5Sopenharmony_ci
517fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
518fd4e5da5Sopenharmony_ci    GroupNonUniformInverseBallotBadResultType, GroupNonUniform,
519fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformInverseBallot"),
520fd4e5da5Sopenharmony_ci            Values("%void", "%u32", "%int", "%float", "%u32vec4", "%u32vec3",
521fd4e5da5Sopenharmony_ci                   "%v2bool", "%v4float", "%struct", "%v4int"),
522fd4e5da5Sopenharmony_ci            Values(spv::Scope::Subgroup), Values("%u32vec4_null"),
523fd4e5da5Sopenharmony_ci            Values("Result must be a boolean scalar")));
524fd4e5da5Sopenharmony_ci
525fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
526fd4e5da5Sopenharmony_ci    GroupNonUniformInverseBallotBadOperand, GroupNonUniform,
527fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformInverseBallot"), Values("%bool"),
528fd4e5da5Sopenharmony_ci            Values(spv::Scope::Subgroup),
529fd4e5da5Sopenharmony_ci            Values("%true", "%false", "%u32_0", "%int_0", "%float_0",
530fd4e5da5Sopenharmony_ci                   "%u32vec3_null", "%v2bool_false", "%v4float_null",
531fd4e5da5Sopenharmony_ci                   "%struct_null", "%v4int_null"),
532fd4e5da5Sopenharmony_ci            Values("Value must be a 4-component unsigned integer vector")));
533fd4e5da5Sopenharmony_ci
534fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(GroupNonUniformBallotBitExtractGood, GroupNonUniform,
535fd4e5da5Sopenharmony_ci                         Combine(Values("OpGroupNonUniformBallotBitExtract"),
536fd4e5da5Sopenharmony_ci                                 Values("%bool"), Values(spv::Scope::Subgroup),
537fd4e5da5Sopenharmony_ci                                 Values("%u32vec4_null %u32_0"), Values("")));
538fd4e5da5Sopenharmony_ci
539fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
540fd4e5da5Sopenharmony_ci    GroupNonUniformBallotBitExtractBadResultType, GroupNonUniform,
541fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformBallotBitExtract"),
542fd4e5da5Sopenharmony_ci            Values("%void", "%u32", "%int", "%float", "%u32vec4", "%u32vec3",
543fd4e5da5Sopenharmony_ci                   "%v2bool", "%v4float", "%struct", "%v4int"),
544fd4e5da5Sopenharmony_ci            Values(spv::Scope::Subgroup), Values("%u32vec4_null %u32_0"),
545fd4e5da5Sopenharmony_ci            Values("Result must be a boolean scalar")));
546fd4e5da5Sopenharmony_ci
547fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
548fd4e5da5Sopenharmony_ci    GroupNonUniformBallotBitExtractBadOperand1, GroupNonUniform,
549fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformBallotBitExtract"), Values("%bool"),
550fd4e5da5Sopenharmony_ci            Values(spv::Scope::Subgroup),
551fd4e5da5Sopenharmony_ci            Values("%true %u32_0", "%false %u32_0", "%u32_0 %u32_0",
552fd4e5da5Sopenharmony_ci                   "%int_0 %u32_0", "%float_0 %u32_0", "%u32vec3_null %u32_0",
553fd4e5da5Sopenharmony_ci                   "%v2bool_false %u32_0", "%v4float_null %u32_0",
554fd4e5da5Sopenharmony_ci                   "%struct_null %u32_0", "%v4int_null %u32_0"),
555fd4e5da5Sopenharmony_ci            Values("Value must be a 4-component unsigned integer vector")));
556fd4e5da5Sopenharmony_ci
557fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
558fd4e5da5Sopenharmony_ci    GroupNonUniformBallotBitExtractBadOperand2, GroupNonUniform,
559fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformBallotBitExtract"), Values("%bool"),
560fd4e5da5Sopenharmony_ci            Values(spv::Scope::Subgroup),
561fd4e5da5Sopenharmony_ci            Values("%u32vec4_null %true", "%u32vec4_null %false",
562fd4e5da5Sopenharmony_ci                   "%u32vec4_null %int_0", "%u32vec4_null %float_0",
563fd4e5da5Sopenharmony_ci                   "%u32vec4_null %u32vec3_null", "%u32vec4_null %v2bool_false",
564fd4e5da5Sopenharmony_ci                   "%u32vec4_null %v4float_null", "%u32vec4_null %struct_null",
565fd4e5da5Sopenharmony_ci                   "%u32vec4_null %v4int_null"),
566fd4e5da5Sopenharmony_ci            Values("Id must be an unsigned integer scalar")));
567fd4e5da5Sopenharmony_ci
568fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(GroupNonUniformBallotFindGood, GroupNonUniform,
569fd4e5da5Sopenharmony_ci                         Combine(Values("OpGroupNonUniformBallotFindLSB",
570fd4e5da5Sopenharmony_ci                                        "OpGroupNonUniformBallotFindMSB"),
571fd4e5da5Sopenharmony_ci                                 Values("%u32"), Values(spv::Scope::Subgroup),
572fd4e5da5Sopenharmony_ci                                 Values("%u32vec4_null"), Values("")));
573fd4e5da5Sopenharmony_ci
574fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
575fd4e5da5Sopenharmony_ci    GroupNonUniformBallotFindBadResultType, GroupNonUniform,
576fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformBallotFindLSB",
577fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformBallotFindMSB"),
578fd4e5da5Sopenharmony_ci            Values("%void", "%bool", "%int", "%float", "%u32vec4", "%u32vec3",
579fd4e5da5Sopenharmony_ci                   "%v2bool", "%v4float", "%struct", "%v4int"),
580fd4e5da5Sopenharmony_ci            Values(spv::Scope::Subgroup), Values("%u32vec4_null"),
581fd4e5da5Sopenharmony_ci            Values("Result must be an unsigned integer scalar")));
582fd4e5da5Sopenharmony_ci
583fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
584fd4e5da5Sopenharmony_ci    GroupNonUniformBallotFindBadOperand, GroupNonUniform,
585fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformBallotFindLSB",
586fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformBallotFindMSB"),
587fd4e5da5Sopenharmony_ci            Values("%u32"), Values(spv::Scope::Subgroup),
588fd4e5da5Sopenharmony_ci            Values("%true", "%false", "%u32_0", "%int_0", "%float_0",
589fd4e5da5Sopenharmony_ci                   "%u32vec3_null", "%v2bool_false", "%v4float_null",
590fd4e5da5Sopenharmony_ci                   "%struct_null", "%v4int_null"),
591fd4e5da5Sopenharmony_ci            Values("Value must be a 4-component unsigned integer vector")));
592fd4e5da5Sopenharmony_ci
593fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
594fd4e5da5Sopenharmony_ci    GroupNonUniformIntegerArithmeticGood, GroupNonUniform,
595fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformIAdd", "OpGroupNonUniformIMul",
596fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformSMin", "OpGroupNonUniformSMax",
597fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformBitwiseAnd", "OpGroupNonUniformBitwiseOr",
598fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformBitwiseXor"),
599fd4e5da5Sopenharmony_ci            Values("%u32", "%int", "%u32vec4", "%u32vec3", "%v4int"),
600fd4e5da5Sopenharmony_ci            Values(spv::Scope::Subgroup),
601fd4e5da5Sopenharmony_ci            Values("Reduce match_res", "InclusiveScan match_res",
602fd4e5da5Sopenharmony_ci                   "ExclusiveScan match_res",
603fd4e5da5Sopenharmony_ci                   "ClusteredReduce match_res %u32_0",
604fd4e5da5Sopenharmony_ci                   "PartitionedReduceNV match_res %u32vec4_null",
605fd4e5da5Sopenharmony_ci                   "PartitionedInclusiveScanNV match_res %u32vec4_null",
606fd4e5da5Sopenharmony_ci                   "PartitionedExclusiveScanNV match_res %v4int_null"),
607fd4e5da5Sopenharmony_ci            Values("")));
608fd4e5da5Sopenharmony_ci
609fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
610fd4e5da5Sopenharmony_ci    GroupNonUniformIntegerArithmeticBadResultType, GroupNonUniform,
611fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformIAdd", "OpGroupNonUniformIMul",
612fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformSMin", "OpGroupNonUniformSMax",
613fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformBitwiseAnd", "OpGroupNonUniformBitwiseOr",
614fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformBitwiseXor"),
615fd4e5da5Sopenharmony_ci            Values("%bool", "%float", "%v4float", "%struct"),
616fd4e5da5Sopenharmony_ci            Values(spv::Scope::Subgroup),
617fd4e5da5Sopenharmony_ci            Values("Reduce match_res", "InclusiveScan match_res",
618fd4e5da5Sopenharmony_ci                   "ExclusiveScan match_res",
619fd4e5da5Sopenharmony_ci                   "ClusteredReduce match_res %u32_0"),
620fd4e5da5Sopenharmony_ci            Values("Result must be an integer scalar or vector")));
621fd4e5da5Sopenharmony_ci
622fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
623fd4e5da5Sopenharmony_ci    GroupNonUniformIntegerArithmeticBadValue, GroupNonUniform,
624fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformIAdd", "OpGroupNonUniformIMul",
625fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformSMin", "OpGroupNonUniformSMax",
626fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformBitwiseAnd", "OpGroupNonUniformBitwiseOr",
627fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformBitwiseXor"),
628fd4e5da5Sopenharmony_ci            Values("%int", "%u32vec4", "%u32vec3", "%v4int"),
629fd4e5da5Sopenharmony_ci            Values(spv::Scope::Subgroup),
630fd4e5da5Sopenharmony_ci            Values("Reduce %u32_0", "InclusiveScan %u32_0",
631fd4e5da5Sopenharmony_ci                   "ExclusiveScan %u32_0", "ClusteredReduce %u32_0 %u32_0"),
632fd4e5da5Sopenharmony_ci            Values("The type of Value must match the Result type")));
633fd4e5da5Sopenharmony_ci
634fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
635fd4e5da5Sopenharmony_ci    GroupNonUniformIntegerArithmeticMissingClusterSize, GroupNonUniform,
636fd4e5da5Sopenharmony_ci    Combine(
637fd4e5da5Sopenharmony_ci        Values("OpGroupNonUniformIAdd", "OpGroupNonUniformIMul",
638fd4e5da5Sopenharmony_ci               "OpGroupNonUniformSMin", "OpGroupNonUniformUMin",
639fd4e5da5Sopenharmony_ci               "OpGroupNonUniformSMax", "OpGroupNonUniformUMax",
640fd4e5da5Sopenharmony_ci               "OpGroupNonUniformBitwiseAnd", "OpGroupNonUniformBitwiseOr",
641fd4e5da5Sopenharmony_ci               "OpGroupNonUniformBitwiseXor"),
642fd4e5da5Sopenharmony_ci        Values("%u32"), Values(spv::Scope::Subgroup),
643fd4e5da5Sopenharmony_ci        Values("ClusteredReduce match_res"),
644fd4e5da5Sopenharmony_ci        Values(
645fd4e5da5Sopenharmony_ci            "ClusterSize must be present when Operation is ClusteredReduce")));
646fd4e5da5Sopenharmony_ci
647fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
648fd4e5da5Sopenharmony_ci    GroupNonUniformIntegerArithmeticMissingBallot, GroupNonUniform,
649fd4e5da5Sopenharmony_ci    Combine(
650fd4e5da5Sopenharmony_ci        Values("OpGroupNonUniformIAdd", "OpGroupNonUniformIMul",
651fd4e5da5Sopenharmony_ci               "OpGroupNonUniformSMin", "OpGroupNonUniformUMin",
652fd4e5da5Sopenharmony_ci               "OpGroupNonUniformSMax", "OpGroupNonUniformUMax",
653fd4e5da5Sopenharmony_ci               "OpGroupNonUniformBitwiseAnd", "OpGroupNonUniformBitwiseOr",
654fd4e5da5Sopenharmony_ci               "OpGroupNonUniformBitwiseXor"),
655fd4e5da5Sopenharmony_ci        Values("%u32"), Values(spv::Scope::Subgroup),
656fd4e5da5Sopenharmony_ci        Values("PartitionedReduceNV match_res",
657fd4e5da5Sopenharmony_ci               "PartitionedInclusiveScanNV match_res",
658fd4e5da5Sopenharmony_ci               "PartitionedExclusiveScanNV match_res"),
659fd4e5da5Sopenharmony_ci        Values("Ballot must be present when Operation is PartitionedReduceNV, "
660fd4e5da5Sopenharmony_ci               "PartitionedInclusiveScanNV, or PartitionedExclusiveScanNV")));
661fd4e5da5Sopenharmony_ci
662fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
663fd4e5da5Sopenharmony_ci    GroupNonUniformIntegerArithmeticBadClusterSizeType, GroupNonUniform,
664fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformIAdd", "OpGroupNonUniformIMul",
665fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformSMin", "OpGroupNonUniformUMin",
666fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformSMax", "OpGroupNonUniformUMax",
667fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformBitwiseAnd", "OpGroupNonUniformBitwiseOr",
668fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformBitwiseXor"),
669fd4e5da5Sopenharmony_ci            Values("%u32"), Values(spv::Scope::Subgroup),
670fd4e5da5Sopenharmony_ci            Values("ClusteredReduce match_res %true",
671fd4e5da5Sopenharmony_ci                   "ClusteredReduce match_res %false",
672fd4e5da5Sopenharmony_ci                   "ClusteredReduce match_res %int_0",
673fd4e5da5Sopenharmony_ci                   "ClusteredReduce match_res %float_0",
674fd4e5da5Sopenharmony_ci                   "ClusteredReduce match_res %u32vec4_null",
675fd4e5da5Sopenharmony_ci                   "ClusteredReduce match_res %u32vec3_null",
676fd4e5da5Sopenharmony_ci                   "ClusteredReduce match_res %v2bool_false",
677fd4e5da5Sopenharmony_ci                   "ClusteredReduce match_res %v4float_null",
678fd4e5da5Sopenharmony_ci                   "ClusteredReduce match_res %struct_null",
679fd4e5da5Sopenharmony_ci                   "ClusteredReduce match_res %v4int_null"),
680fd4e5da5Sopenharmony_ci            Values("ClusterSize must be an unsigned integer scalar")));
681fd4e5da5Sopenharmony_ci
682fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
683fd4e5da5Sopenharmony_ci    GroupNonUniformIntegerArithmeticBadBallotType, GroupNonUniform,
684fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformIAdd", "OpGroupNonUniformIMul",
685fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformSMin", "OpGroupNonUniformUMin",
686fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformSMax", "OpGroupNonUniformUMax",
687fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformBitwiseAnd", "OpGroupNonUniformBitwiseOr",
688fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformBitwiseXor"),
689fd4e5da5Sopenharmony_ci            Values("%u32"), Values(spv::Scope::Subgroup),
690fd4e5da5Sopenharmony_ci            Values("PartitionedReduceNV match_res %true",
691fd4e5da5Sopenharmony_ci                   "PartitionedReduceNV match_res %false",
692fd4e5da5Sopenharmony_ci                   "PartitionedReduceNV match_res %int_0",
693fd4e5da5Sopenharmony_ci                   "PartitionedReduceNV match_res %float_0",
694fd4e5da5Sopenharmony_ci                   "PartitionedReduceNV match_res %u32_0",
695fd4e5da5Sopenharmony_ci                   "PartitionedReduceNV match_res %u32vec3_null",
696fd4e5da5Sopenharmony_ci                   "PartitionedReduceNV match_res %v2bool_false",
697fd4e5da5Sopenharmony_ci                   "PartitionedReduceNV match_res %v4float_null",
698fd4e5da5Sopenharmony_ci                   "PartitionedReduceNV match_res %struct_null"),
699fd4e5da5Sopenharmony_ci            Values("Ballot must be a 4-component integer vector")));
700fd4e5da5Sopenharmony_ci
701fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
702fd4e5da5Sopenharmony_ci    GroupNonUniformIntegerArithmeticClusterSizeNotConstant, GroupNonUniform,
703fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformIAdd", "OpGroupNonUniformIMul",
704fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformSMin", "OpGroupNonUniformUMin",
705fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformSMax", "OpGroupNonUniformUMax",
706fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformBitwiseAnd", "OpGroupNonUniformBitwiseOr",
707fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformBitwiseXor"),
708fd4e5da5Sopenharmony_ci            Values("%u32"), Values(spv::Scope::Subgroup),
709fd4e5da5Sopenharmony_ci            Values("ClusteredReduce match_res %u32_undef"),
710fd4e5da5Sopenharmony_ci            Values("ClusterSize must be a constant instruction")));
711fd4e5da5Sopenharmony_ci
712fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
713fd4e5da5Sopenharmony_ci    GroupNonUniformUnsignedIntegerArithmeticGood, GroupNonUniform,
714fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformUMin", "OpGroupNonUniformUMax"),
715fd4e5da5Sopenharmony_ci            Values("%u32", "%u32vec4", "%u32vec3"),
716fd4e5da5Sopenharmony_ci            Values(spv::Scope::Subgroup),
717fd4e5da5Sopenharmony_ci            Values("Reduce match_res", "InclusiveScan match_res",
718fd4e5da5Sopenharmony_ci                   "ExclusiveScan match_res",
719fd4e5da5Sopenharmony_ci                   "ClusteredReduce match_res %u32_0"),
720fd4e5da5Sopenharmony_ci            Values("")));
721fd4e5da5Sopenharmony_ci
722fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
723fd4e5da5Sopenharmony_ci    GroupNonUniformUnsignedIntegerArithmeticBadResultType, GroupNonUniform,
724fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformUMin", "OpGroupNonUniformUMax"),
725fd4e5da5Sopenharmony_ci            Values("%bool", "%int", "%float", "%v4float", "%struct", "%v4int"),
726fd4e5da5Sopenharmony_ci            Values(spv::Scope::Subgroup),
727fd4e5da5Sopenharmony_ci            Values("Reduce match_res", "InclusiveScan match_res",
728fd4e5da5Sopenharmony_ci                   "ExclusiveScan match_res",
729fd4e5da5Sopenharmony_ci                   "ClusteredReduce match_res %u32_0"),
730fd4e5da5Sopenharmony_ci            Values("Result must be an unsigned integer scalar or vector")));
731fd4e5da5Sopenharmony_ci
732fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
733fd4e5da5Sopenharmony_ci    GroupNonUniformUnsignedIntegerArithmeticBadValue, GroupNonUniform,
734fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformUMin", "OpGroupNonUniformUMax"),
735fd4e5da5Sopenharmony_ci            Values("%u32vec4", "%u32vec3"), Values(spv::Scope::Subgroup),
736fd4e5da5Sopenharmony_ci            Values("Reduce %u32_0", "InclusiveScan %u32_0",
737fd4e5da5Sopenharmony_ci                   "ExclusiveScan %u32_0", "ClusteredReduce %u32_0 %u32_0"),
738fd4e5da5Sopenharmony_ci            Values("The type of Value must match the Result type")));
739fd4e5da5Sopenharmony_ci
740fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
741fd4e5da5Sopenharmony_ci    GroupNonUniformFloatArithmeticGood, GroupNonUniform,
742fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformFAdd", "OpGroupNonUniformFMul",
743fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformFMin", "OpGroupNonUniformFMax"),
744fd4e5da5Sopenharmony_ci            Values("%float", "%v4float"), Values(spv::Scope::Subgroup),
745fd4e5da5Sopenharmony_ci            Values("Reduce match_res", "InclusiveScan match_res",
746fd4e5da5Sopenharmony_ci                   "ExclusiveScan match_res",
747fd4e5da5Sopenharmony_ci                   "ClusteredReduce match_res %u32_0"),
748fd4e5da5Sopenharmony_ci            Values("")));
749fd4e5da5Sopenharmony_ci
750fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
751fd4e5da5Sopenharmony_ci    GroupNonUniformFloatArithmeticBadResultType, GroupNonUniform,
752fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformFAdd", "OpGroupNonUniformFMul",
753fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformFMin", "OpGroupNonUniformFMax"),
754fd4e5da5Sopenharmony_ci            Values("%bool", "%u32", "%int", "%u32vec4", "%u32vec3", "%struct",
755fd4e5da5Sopenharmony_ci                   "%v4int"),
756fd4e5da5Sopenharmony_ci            Values(spv::Scope::Subgroup),
757fd4e5da5Sopenharmony_ci            Values("Reduce match_res", "InclusiveScan match_res",
758fd4e5da5Sopenharmony_ci                   "ExclusiveScan match_res",
759fd4e5da5Sopenharmony_ci                   "ClusteredReduce match_res %u32_0"),
760fd4e5da5Sopenharmony_ci            Values("Result must be a floating-point scalar or vector")));
761fd4e5da5Sopenharmony_ci
762fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
763fd4e5da5Sopenharmony_ci    GroupNonUniformFloatArithmeticBadValue, GroupNonUniform,
764fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformFAdd", "OpGroupNonUniformFMul",
765fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformFMin", "OpGroupNonUniformFMax"),
766fd4e5da5Sopenharmony_ci            Values("%v4float"), Values(spv::Scope::Subgroup),
767fd4e5da5Sopenharmony_ci            Values("Reduce %float_0", "InclusiveScan %float_0",
768fd4e5da5Sopenharmony_ci                   "ExclusiveScan %float_0", "ClusteredReduce %float_0 %u32_0"),
769fd4e5da5Sopenharmony_ci            Values("The type of Value must match the Result type")));
770fd4e5da5Sopenharmony_ci
771fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
772fd4e5da5Sopenharmony_ci    GroupNonUniformFloatArithmeticMissingClusterSize, GroupNonUniform,
773fd4e5da5Sopenharmony_ci    Combine(
774fd4e5da5Sopenharmony_ci        Values("OpGroupNonUniformFAdd", "OpGroupNonUniformFMul",
775fd4e5da5Sopenharmony_ci               "OpGroupNonUniformFMin", "OpGroupNonUniformFMax"),
776fd4e5da5Sopenharmony_ci        Values("%float"), Values(spv::Scope::Subgroup),
777fd4e5da5Sopenharmony_ci        Values("ClusteredReduce match_res"),
778fd4e5da5Sopenharmony_ci        Values(
779fd4e5da5Sopenharmony_ci            "ClusterSize must be present when Operation is ClusteredReduce")));
780fd4e5da5Sopenharmony_ci
781fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
782fd4e5da5Sopenharmony_ci    GroupNonUniformFloatArithmeticBadClusterSizeType, GroupNonUniform,
783fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformFAdd", "OpGroupNonUniformFMul",
784fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformFMin", "OpGroupNonUniformFMax"),
785fd4e5da5Sopenharmony_ci            Values("%float"), Values(spv::Scope::Subgroup),
786fd4e5da5Sopenharmony_ci            Values("ClusteredReduce match_res %true",
787fd4e5da5Sopenharmony_ci                   "ClusteredReduce match_res %false",
788fd4e5da5Sopenharmony_ci                   "ClusteredReduce match_res %int_0",
789fd4e5da5Sopenharmony_ci                   "ClusteredReduce match_res %float_0",
790fd4e5da5Sopenharmony_ci                   "ClusteredReduce match_res %u32vec4_null",
791fd4e5da5Sopenharmony_ci                   "ClusteredReduce match_res %u32vec3_null",
792fd4e5da5Sopenharmony_ci                   "ClusteredReduce match_res %v2bool_false",
793fd4e5da5Sopenharmony_ci                   "ClusteredReduce match_res %v4float_null",
794fd4e5da5Sopenharmony_ci                   "ClusteredReduce match_res %struct_null",
795fd4e5da5Sopenharmony_ci                   "ClusteredReduce match_res %v4int_null"),
796fd4e5da5Sopenharmony_ci            Values("ClusterSize must be an unsigned integer scalar")));
797fd4e5da5Sopenharmony_ci
798fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
799fd4e5da5Sopenharmony_ci    GroupNonUniformFloatArithmeticClusterSizeNotConstant, GroupNonUniform,
800fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformFAdd", "OpGroupNonUniformFMul",
801fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformFMin", "OpGroupNonUniformFMax"),
802fd4e5da5Sopenharmony_ci            Values("%float"), Values(spv::Scope::Subgroup),
803fd4e5da5Sopenharmony_ci            Values("ClusteredReduce match_res %u32_undef"),
804fd4e5da5Sopenharmony_ci            Values("ClusterSize must be a constant instruction")));
805fd4e5da5Sopenharmony_ci
806fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
807fd4e5da5Sopenharmony_ci    GroupNonUniformBooleanArithmeticGood, GroupNonUniform,
808fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformLogicalAnd", "OpGroupNonUniformLogicalOr",
809fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformLogicalXor"),
810fd4e5da5Sopenharmony_ci            Values("%bool", "%v2bool"), Values(spv::Scope::Subgroup),
811fd4e5da5Sopenharmony_ci            Values("Reduce match_res", "InclusiveScan match_res",
812fd4e5da5Sopenharmony_ci                   "ExclusiveScan match_res",
813fd4e5da5Sopenharmony_ci                   "ClusteredReduce match_res %u32_0"),
814fd4e5da5Sopenharmony_ci            Values("")));
815fd4e5da5Sopenharmony_ci
816fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
817fd4e5da5Sopenharmony_ci    GroupNonUniformBooleanArithmeticBadResultType, GroupNonUniform,
818fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformLogicalAnd", "OpGroupNonUniformLogicalOr",
819fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformLogicalXor"),
820fd4e5da5Sopenharmony_ci            Values("%u32", "%int", "%float", "%u32vec4", "%u32vec3", "%struct",
821fd4e5da5Sopenharmony_ci                   "%v4float", "%v4int"),
822fd4e5da5Sopenharmony_ci            Values(spv::Scope::Subgroup),
823fd4e5da5Sopenharmony_ci            Values("Reduce match_res", "InclusiveScan match_res",
824fd4e5da5Sopenharmony_ci                   "ExclusiveScan match_res",
825fd4e5da5Sopenharmony_ci                   "ClusteredReduce match_res %u32_0"),
826fd4e5da5Sopenharmony_ci            Values("Result must be a boolean scalar or vector")));
827fd4e5da5Sopenharmony_ci
828fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
829fd4e5da5Sopenharmony_ci    GroupNonUniformBooleanArithmeticBadValue, GroupNonUniform,
830fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformLogicalAnd", "OpGroupNonUniformLogicalOr",
831fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformLogicalXor"),
832fd4e5da5Sopenharmony_ci            Values("%v2bool"), Values(spv::Scope::Subgroup),
833fd4e5da5Sopenharmony_ci            Values("Reduce %true", "InclusiveScan %true",
834fd4e5da5Sopenharmony_ci                   "ExclusiveScan %false", "ClusteredReduce %false %u32_0"),
835fd4e5da5Sopenharmony_ci            Values("The type of Value must match the Result type")));
836fd4e5da5Sopenharmony_ci
837fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
838fd4e5da5Sopenharmony_ci    GroupNonUniformBooleanArithmeticMissingClusterSize, GroupNonUniform,
839fd4e5da5Sopenharmony_ci    Combine(
840fd4e5da5Sopenharmony_ci        Values("OpGroupNonUniformLogicalAnd", "OpGroupNonUniformLogicalOr",
841fd4e5da5Sopenharmony_ci               "OpGroupNonUniformLogicalXor"),
842fd4e5da5Sopenharmony_ci        Values("%bool"), Values(spv::Scope::Subgroup),
843fd4e5da5Sopenharmony_ci        Values("ClusteredReduce match_res"),
844fd4e5da5Sopenharmony_ci        Values(
845fd4e5da5Sopenharmony_ci            "ClusterSize must be present when Operation is ClusteredReduce")));
846fd4e5da5Sopenharmony_ci
847fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
848fd4e5da5Sopenharmony_ci    GroupNonUniformBooleanArithmeticBadClusterSizeType, GroupNonUniform,
849fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformLogicalAnd", "OpGroupNonUniformLogicalOr",
850fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformLogicalXor"),
851fd4e5da5Sopenharmony_ci            Values("%bool"), Values(spv::Scope::Subgroup),
852fd4e5da5Sopenharmony_ci            Values("ClusteredReduce match_res %true",
853fd4e5da5Sopenharmony_ci                   "ClusteredReduce match_res %false",
854fd4e5da5Sopenharmony_ci                   "ClusteredReduce match_res %int_0",
855fd4e5da5Sopenharmony_ci                   "ClusteredReduce match_res %float_0",
856fd4e5da5Sopenharmony_ci                   "ClusteredReduce match_res %u32vec4_null",
857fd4e5da5Sopenharmony_ci                   "ClusteredReduce match_res %u32vec3_null",
858fd4e5da5Sopenharmony_ci                   "ClusteredReduce match_res %v2bool_false",
859fd4e5da5Sopenharmony_ci                   "ClusteredReduce match_res %v4float_null",
860fd4e5da5Sopenharmony_ci                   "ClusteredReduce match_res %struct_null",
861fd4e5da5Sopenharmony_ci                   "ClusteredReduce match_res %v4int_null"),
862fd4e5da5Sopenharmony_ci            Values("ClusterSize must be an unsigned integer scalar")));
863fd4e5da5Sopenharmony_ci
864fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
865fd4e5da5Sopenharmony_ci    GroupNonUniformBooleanArithmeticClusterSizeNotConstant, GroupNonUniform,
866fd4e5da5Sopenharmony_ci    Combine(Values("OpGroupNonUniformLogicalAnd", "OpGroupNonUniformLogicalOr",
867fd4e5da5Sopenharmony_ci                   "OpGroupNonUniformLogicalXor"),
868fd4e5da5Sopenharmony_ci            Values("%bool"), Values(spv::Scope::Subgroup),
869fd4e5da5Sopenharmony_ci            Values("ClusteredReduce match_res %u32_undef"),
870fd4e5da5Sopenharmony_ci            Values("ClusterSize must be a constant instruction")));
871fd4e5da5Sopenharmony_ci
872fd4e5da5Sopenharmony_ciTEST_F(ValidateGroupNonUniform, VulkanGroupNonUniformBallotBitCountOperation) {
873fd4e5da5Sopenharmony_ci  std::string test = R"(
874fd4e5da5Sopenharmony_ciOpCapability Shader
875fd4e5da5Sopenharmony_ciOpCapability GroupNonUniform
876fd4e5da5Sopenharmony_ciOpCapability GroupNonUniformBallot
877fd4e5da5Sopenharmony_ciOpCapability GroupNonUniformClustered
878fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
879fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %main "main"
880fd4e5da5Sopenharmony_ciOpExecutionMode %main LocalSize 1 1 1
881fd4e5da5Sopenharmony_ci%void = OpTypeVoid
882fd4e5da5Sopenharmony_ci%func = OpTypeFunction %void
883fd4e5da5Sopenharmony_ci%u32 = OpTypeInt 32 0
884fd4e5da5Sopenharmony_ci%u32vec4 = OpTypeVector %u32 4
885fd4e5da5Sopenharmony_ci%u32_0 = OpConstant %u32 0
886fd4e5da5Sopenharmony_ci%u32vec4_null = OpConstantComposite %u32vec4 %u32_0 %u32_0 %u32_0 %u32_0
887fd4e5da5Sopenharmony_ci%subgroup = OpConstant %u32 3
888fd4e5da5Sopenharmony_ci%main = OpFunction %void None %func
889fd4e5da5Sopenharmony_ci%main_entry = OpLabel
890fd4e5da5Sopenharmony_ci%result = OpGroupNonUniformBallotBitCount %u32 %subgroup ClusteredReduce %u32vec4_null
891fd4e5da5Sopenharmony_ciOpReturn
892fd4e5da5Sopenharmony_ciOpFunctionEnd
893fd4e5da5Sopenharmony_ci)";
894fd4e5da5Sopenharmony_ci
895fd4e5da5Sopenharmony_ci  CompileSuccessfully(test, SPV_ENV_VULKAN_1_1);
896fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_1));
897fd4e5da5Sopenharmony_ci  EXPECT_THAT(
898fd4e5da5Sopenharmony_ci      getDiagnosticString(),
899fd4e5da5Sopenharmony_ci      AnyVUID("VUID-StandaloneSpirv-OpGroupNonUniformBallotBitCount-04685"));
900fd4e5da5Sopenharmony_ci  EXPECT_THAT(
901fd4e5da5Sopenharmony_ci      getDiagnosticString(),
902fd4e5da5Sopenharmony_ci      HasSubstr(
903fd4e5da5Sopenharmony_ci          "In Vulkan: The OpGroupNonUniformBallotBitCount group operation must "
904fd4e5da5Sopenharmony_ci          "be only: Reduce, InclusiveScan, or ExclusiveScan."));
905fd4e5da5Sopenharmony_ci}
906fd4e5da5Sopenharmony_ci
907fd4e5da5Sopenharmony_ciTEST_F(ValidateGroupNonUniform, BroadcastNonConstantSpv1p4) {
908fd4e5da5Sopenharmony_ci  const std::string text = R"(
909fd4e5da5Sopenharmony_ciOpCapability Shader
910fd4e5da5Sopenharmony_ciOpCapability GroupNonUniformBallot
911fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
912fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %main "main" %var
913fd4e5da5Sopenharmony_ciOpExecutionMode %main LocalSize 1 1 1
914fd4e5da5Sopenharmony_ciOpDecorate %var DescriptorSet 0
915fd4e5da5Sopenharmony_ciOpDecorate %var Binding 0
916fd4e5da5Sopenharmony_ciOpDecorate %struct Block
917fd4e5da5Sopenharmony_ciOpMemberDecorate %struct 0 Offset 0
918fd4e5da5Sopenharmony_ci%void = OpTypeVoid
919fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0
920fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0
921fd4e5da5Sopenharmony_ci%subgroup = OpConstant %int 3
922fd4e5da5Sopenharmony_ci%struct = OpTypeStruct %int
923fd4e5da5Sopenharmony_ci%ptr_struct = OpTypePointer StorageBuffer %struct
924fd4e5da5Sopenharmony_ci%ptr_int = OpTypePointer StorageBuffer %int
925fd4e5da5Sopenharmony_ci%var = OpVariable %ptr_struct StorageBuffer
926fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void
927fd4e5da5Sopenharmony_ci%main = OpFunction %void None %void_fn
928fd4e5da5Sopenharmony_ci%entry = OpLabel
929fd4e5da5Sopenharmony_ci%gep = OpAccessChain %ptr_int %var %int_0
930fd4e5da5Sopenharmony_ci%ld = OpLoad %int %gep
931fd4e5da5Sopenharmony_ci%broadcast = OpGroupNonUniformBroadcast %int %subgroup %int_0 %ld
932fd4e5da5Sopenharmony_ciOpReturn
933fd4e5da5Sopenharmony_ciOpFunctionEnd
934fd4e5da5Sopenharmony_ci)";
935fd4e5da5Sopenharmony_ci
936fd4e5da5Sopenharmony_ci  CompileSuccessfully(text, SPV_ENV_UNIVERSAL_1_4);
937fd4e5da5Sopenharmony_ci  EXPECT_EQ(SPV_ERROR_INVALID_DATA,
938fd4e5da5Sopenharmony_ci            ValidateInstructions(SPV_ENV_UNIVERSAL_1_4));
939fd4e5da5Sopenharmony_ci  EXPECT_THAT(
940fd4e5da5Sopenharmony_ci      getDiagnosticString(),
941fd4e5da5Sopenharmony_ci      HasSubstr("Before SPIR-V 1.5, Id must be a constant instruction"));
942fd4e5da5Sopenharmony_ci}
943fd4e5da5Sopenharmony_ci
944fd4e5da5Sopenharmony_ciTEST_F(ValidateGroupNonUniform, BroadcastNonConstantSpv1p5) {
945fd4e5da5Sopenharmony_ci  const std::string text = R"(
946fd4e5da5Sopenharmony_ciOpCapability Shader
947fd4e5da5Sopenharmony_ciOpCapability GroupNonUniformBallot
948fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
949fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %main "main" %var
950fd4e5da5Sopenharmony_ciOpExecutionMode %main LocalSize 1 1 1
951fd4e5da5Sopenharmony_ciOpDecorate %var DescriptorSet 0
952fd4e5da5Sopenharmony_ciOpDecorate %var Binding 0
953fd4e5da5Sopenharmony_ciOpDecorate %struct Block
954fd4e5da5Sopenharmony_ciOpMemberDecorate %struct 0 Offset 0
955fd4e5da5Sopenharmony_ci%void = OpTypeVoid
956fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0
957fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0
958fd4e5da5Sopenharmony_ci%subgroup = OpConstant %int 3
959fd4e5da5Sopenharmony_ci%struct = OpTypeStruct %int
960fd4e5da5Sopenharmony_ci%ptr_struct = OpTypePointer StorageBuffer %struct
961fd4e5da5Sopenharmony_ci%ptr_int = OpTypePointer StorageBuffer %int
962fd4e5da5Sopenharmony_ci%var = OpVariable %ptr_struct StorageBuffer
963fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void
964fd4e5da5Sopenharmony_ci%main = OpFunction %void None %void_fn
965fd4e5da5Sopenharmony_ci%entry = OpLabel
966fd4e5da5Sopenharmony_ci%gep = OpAccessChain %ptr_int %var %int_0
967fd4e5da5Sopenharmony_ci%ld = OpLoad %int %gep
968fd4e5da5Sopenharmony_ci%broadcast = OpGroupNonUniformBroadcast %int %subgroup %int_0 %ld
969fd4e5da5Sopenharmony_ciOpReturn
970fd4e5da5Sopenharmony_ciOpFunctionEnd
971fd4e5da5Sopenharmony_ci)";
972fd4e5da5Sopenharmony_ci
973fd4e5da5Sopenharmony_ci  CompileSuccessfully(text, SPV_ENV_UNIVERSAL_1_5);
974fd4e5da5Sopenharmony_ci  EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_5));
975fd4e5da5Sopenharmony_ci}
976fd4e5da5Sopenharmony_ci
977fd4e5da5Sopenharmony_ciTEST_F(ValidateGroupNonUniform, QuadBroadcastNonConstantSpv1p4) {
978fd4e5da5Sopenharmony_ci  const std::string text = R"(
979fd4e5da5Sopenharmony_ciOpCapability Shader
980fd4e5da5Sopenharmony_ciOpCapability GroupNonUniformQuad
981fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
982fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %main "main" %var
983fd4e5da5Sopenharmony_ciOpExecutionMode %main LocalSize 1 1 1
984fd4e5da5Sopenharmony_ciOpDecorate %var DescriptorSet 0
985fd4e5da5Sopenharmony_ciOpDecorate %var Binding 0
986fd4e5da5Sopenharmony_ciOpDecorate %struct Block
987fd4e5da5Sopenharmony_ciOpMemberDecorate %struct 0 Offset 0
988fd4e5da5Sopenharmony_ci%void = OpTypeVoid
989fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0
990fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0
991fd4e5da5Sopenharmony_ci%subgroup = OpConstant %int 3
992fd4e5da5Sopenharmony_ci%struct = OpTypeStruct %int
993fd4e5da5Sopenharmony_ci%ptr_struct = OpTypePointer StorageBuffer %struct
994fd4e5da5Sopenharmony_ci%ptr_int = OpTypePointer StorageBuffer %int
995fd4e5da5Sopenharmony_ci%var = OpVariable %ptr_struct StorageBuffer
996fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void
997fd4e5da5Sopenharmony_ci%main = OpFunction %void None %void_fn
998fd4e5da5Sopenharmony_ci%entry = OpLabel
999fd4e5da5Sopenharmony_ci%gep = OpAccessChain %ptr_int %var %int_0
1000fd4e5da5Sopenharmony_ci%ld = OpLoad %int %gep
1001fd4e5da5Sopenharmony_ci%broadcast = OpGroupNonUniformQuadBroadcast %int %subgroup %int_0 %ld
1002fd4e5da5Sopenharmony_ciOpReturn
1003fd4e5da5Sopenharmony_ciOpFunctionEnd
1004fd4e5da5Sopenharmony_ci)";
1005fd4e5da5Sopenharmony_ci
1006fd4e5da5Sopenharmony_ci  CompileSuccessfully(text, SPV_ENV_UNIVERSAL_1_4);
1007fd4e5da5Sopenharmony_ci  EXPECT_EQ(SPV_ERROR_INVALID_DATA,
1008fd4e5da5Sopenharmony_ci            ValidateInstructions(SPV_ENV_UNIVERSAL_1_4));
1009fd4e5da5Sopenharmony_ci  EXPECT_THAT(
1010fd4e5da5Sopenharmony_ci      getDiagnosticString(),
1011fd4e5da5Sopenharmony_ci      HasSubstr("Before SPIR-V 1.5, Index must be a constant instruction"));
1012fd4e5da5Sopenharmony_ci}
1013fd4e5da5Sopenharmony_ci
1014fd4e5da5Sopenharmony_ciTEST_F(ValidateGroupNonUniform, QuadBroadcastNonConstantSpv1p5) {
1015fd4e5da5Sopenharmony_ci  const std::string text = R"(
1016fd4e5da5Sopenharmony_ciOpCapability Shader
1017fd4e5da5Sopenharmony_ciOpCapability GroupNonUniformQuad
1018fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
1019fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %main "main" %var
1020fd4e5da5Sopenharmony_ciOpExecutionMode %main LocalSize 1 1 1
1021fd4e5da5Sopenharmony_ciOpDecorate %var DescriptorSet 0
1022fd4e5da5Sopenharmony_ciOpDecorate %var Binding 0
1023fd4e5da5Sopenharmony_ciOpDecorate %struct Block
1024fd4e5da5Sopenharmony_ciOpMemberDecorate %struct 0 Offset 0
1025fd4e5da5Sopenharmony_ci%void = OpTypeVoid
1026fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0
1027fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0
1028fd4e5da5Sopenharmony_ci%subgroup = OpConstant %int 3
1029fd4e5da5Sopenharmony_ci%struct = OpTypeStruct %int
1030fd4e5da5Sopenharmony_ci%ptr_struct = OpTypePointer StorageBuffer %struct
1031fd4e5da5Sopenharmony_ci%ptr_int = OpTypePointer StorageBuffer %int
1032fd4e5da5Sopenharmony_ci%var = OpVariable %ptr_struct StorageBuffer
1033fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void
1034fd4e5da5Sopenharmony_ci%main = OpFunction %void None %void_fn
1035fd4e5da5Sopenharmony_ci%entry = OpLabel
1036fd4e5da5Sopenharmony_ci%gep = OpAccessChain %ptr_int %var %int_0
1037fd4e5da5Sopenharmony_ci%ld = OpLoad %int %gep
1038fd4e5da5Sopenharmony_ci%broadcast = OpGroupNonUniformQuadBroadcast %int %subgroup %int_0 %ld
1039fd4e5da5Sopenharmony_ciOpReturn
1040fd4e5da5Sopenharmony_ciOpFunctionEnd
1041fd4e5da5Sopenharmony_ci)";
1042fd4e5da5Sopenharmony_ci
1043fd4e5da5Sopenharmony_ci  CompileSuccessfully(text, SPV_ENV_UNIVERSAL_1_5);
1044fd4e5da5Sopenharmony_ci  EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_5));
1045fd4e5da5Sopenharmony_ci}
1046fd4e5da5Sopenharmony_ci
1047fd4e5da5Sopenharmony_ci}  // namespace
1048fd4e5da5Sopenharmony_ci}  // namespace val
1049fd4e5da5Sopenharmony_ci}  // namespace spvtools
1050