1fd4e5da5Sopenharmony_ci// Copyright (c) 2017 Google Inc.
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// Tests validation rules of GLSL.450.std and OpenCL.std extended instructions.
16fd4e5da5Sopenharmony_ci// Doesn't test OpenCL.std vector size 2, 3, 4, 8 or 16 rules (not supported
17fd4e5da5Sopenharmony_ci// by standard SPIR-V).
18fd4e5da5Sopenharmony_ci
19fd4e5da5Sopenharmony_ci#include <sstream>
20fd4e5da5Sopenharmony_ci#include <string>
21fd4e5da5Sopenharmony_ci#include <vector>
22fd4e5da5Sopenharmony_ci
23fd4e5da5Sopenharmony_ci#include "gmock/gmock.h"
24fd4e5da5Sopenharmony_ci#include "test/unit_spirv.h"
25fd4e5da5Sopenharmony_ci#include "test/val/val_fixtures.h"
26fd4e5da5Sopenharmony_ci
27fd4e5da5Sopenharmony_cinamespace spvtools {
28fd4e5da5Sopenharmony_cinamespace val {
29fd4e5da5Sopenharmony_cinamespace {
30fd4e5da5Sopenharmony_ci
31fd4e5da5Sopenharmony_ciusing ::testing::Eq;
32fd4e5da5Sopenharmony_ciusing ::testing::HasSubstr;
33fd4e5da5Sopenharmony_ciusing ::testing::Not;
34fd4e5da5Sopenharmony_ci
35fd4e5da5Sopenharmony_ciusing ValidateExtInst = spvtest::ValidateBase<bool>;
36fd4e5da5Sopenharmony_ciusing ValidateGlslStd450SqrtLike = spvtest::ValidateBase<std::string>;
37fd4e5da5Sopenharmony_ciusing ValidateGlslStd450FMinLike = spvtest::ValidateBase<std::string>;
38fd4e5da5Sopenharmony_ciusing ValidateGlslStd450FClampLike = spvtest::ValidateBase<std::string>;
39fd4e5da5Sopenharmony_ciusing ValidateGlslStd450SAbsLike = spvtest::ValidateBase<std::string>;
40fd4e5da5Sopenharmony_ciusing ValidateGlslStd450UMinLike = spvtest::ValidateBase<std::string>;
41fd4e5da5Sopenharmony_ciusing ValidateGlslStd450UClampLike = spvtest::ValidateBase<std::string>;
42fd4e5da5Sopenharmony_ciusing ValidateGlslStd450SinLike = spvtest::ValidateBase<std::string>;
43fd4e5da5Sopenharmony_ciusing ValidateGlslStd450PowLike = spvtest::ValidateBase<std::string>;
44fd4e5da5Sopenharmony_ciusing ValidateGlslStd450Pack = spvtest::ValidateBase<std::string>;
45fd4e5da5Sopenharmony_ciusing ValidateGlslStd450Unpack = spvtest::ValidateBase<std::string>;
46fd4e5da5Sopenharmony_ciusing ValidateOpenCLStdSqrtLike = spvtest::ValidateBase<std::string>;
47fd4e5da5Sopenharmony_ciusing ValidateOpenCLStdFMinLike = spvtest::ValidateBase<std::string>;
48fd4e5da5Sopenharmony_ciusing ValidateOpenCLStdFClampLike = spvtest::ValidateBase<std::string>;
49fd4e5da5Sopenharmony_ciusing ValidateOpenCLStdSAbsLike = spvtest::ValidateBase<std::string>;
50fd4e5da5Sopenharmony_ciusing ValidateOpenCLStdUMinLike = spvtest::ValidateBase<std::string>;
51fd4e5da5Sopenharmony_ciusing ValidateOpenCLStdUClampLike = spvtest::ValidateBase<std::string>;
52fd4e5da5Sopenharmony_ciusing ValidateOpenCLStdUMul24Like = spvtest::ValidateBase<std::string>;
53fd4e5da5Sopenharmony_ciusing ValidateOpenCLStdUMad24Like = spvtest::ValidateBase<std::string>;
54fd4e5da5Sopenharmony_ciusing ValidateOpenCLStdLengthLike = spvtest::ValidateBase<std::string>;
55fd4e5da5Sopenharmony_ciusing ValidateOpenCLStdDistanceLike = spvtest::ValidateBase<std::string>;
56fd4e5da5Sopenharmony_ciusing ValidateOpenCLStdNormalizeLike = spvtest::ValidateBase<std::string>;
57fd4e5da5Sopenharmony_ciusing ValidateOpenCLStdVStoreHalfLike = spvtest::ValidateBase<std::string>;
58fd4e5da5Sopenharmony_ciusing ValidateOpenCLStdVLoadHalfLike = spvtest::ValidateBase<std::string>;
59fd4e5da5Sopenharmony_ciusing ValidateOpenCLStdFractLike = spvtest::ValidateBase<std::string>;
60fd4e5da5Sopenharmony_ciusing ValidateOpenCLStdFrexpLike = spvtest::ValidateBase<std::string>;
61fd4e5da5Sopenharmony_ciusing ValidateOpenCLStdLdexpLike = spvtest::ValidateBase<std::string>;
62fd4e5da5Sopenharmony_ciusing ValidateOpenCLStdUpsampleLike = spvtest::ValidateBase<std::string>;
63fd4e5da5Sopenharmony_ciusing ValidateClspvReflection = spvtest::ValidateBase<bool>;
64fd4e5da5Sopenharmony_ci
65fd4e5da5Sopenharmony_ci// Returns number of components in Pack/Unpack extended instructions.
66fd4e5da5Sopenharmony_ci// |ext_inst_name| is expected to be of the format "PackHalf2x16".
67fd4e5da5Sopenharmony_ci// Number of components is assumed to be single-digit.
68fd4e5da5Sopenharmony_ciuint32_t GetPackedNumComponents(const std::string& ext_inst_name) {
69fd4e5da5Sopenharmony_ci  const size_t x_index = ext_inst_name.find_last_of('x');
70fd4e5da5Sopenharmony_ci  const std::string num_components_str =
71fd4e5da5Sopenharmony_ci      ext_inst_name.substr(x_index - 1, x_index);
72fd4e5da5Sopenharmony_ci  return uint32_t(std::stoul(num_components_str));
73fd4e5da5Sopenharmony_ci}
74fd4e5da5Sopenharmony_ci
75fd4e5da5Sopenharmony_ci// Returns packed bit width in Pack/Unpack extended instructions.
76fd4e5da5Sopenharmony_ci// |ext_inst_name| is expected to be of the format "PackHalf2x16".
77fd4e5da5Sopenharmony_ciuint32_t GetPackedBitWidth(const std::string& ext_inst_name) {
78fd4e5da5Sopenharmony_ci  const size_t x_index = ext_inst_name.find_last_of('x');
79fd4e5da5Sopenharmony_ci  const std::string packed_bit_width_str = ext_inst_name.substr(x_index + 1);
80fd4e5da5Sopenharmony_ci  return uint32_t(std::stoul(packed_bit_width_str));
81fd4e5da5Sopenharmony_ci}
82fd4e5da5Sopenharmony_ci
83fd4e5da5Sopenharmony_cistd::string GenerateShaderCode(
84fd4e5da5Sopenharmony_ci    const std::string& body,
85fd4e5da5Sopenharmony_ci    const std::string& capabilities_and_extensions = "",
86fd4e5da5Sopenharmony_ci    const std::string& execution_model = "Fragment") {
87fd4e5da5Sopenharmony_ci  std::ostringstream ss;
88fd4e5da5Sopenharmony_ci  ss << R"(
89fd4e5da5Sopenharmony_ciOpCapability Shader
90fd4e5da5Sopenharmony_ciOpCapability Float16
91fd4e5da5Sopenharmony_ciOpCapability Float64
92fd4e5da5Sopenharmony_ciOpCapability Int16
93fd4e5da5Sopenharmony_ciOpCapability Int64
94fd4e5da5Sopenharmony_ci)";
95fd4e5da5Sopenharmony_ci
96fd4e5da5Sopenharmony_ci  ss << capabilities_and_extensions;
97fd4e5da5Sopenharmony_ci  ss << "%extinst = OpExtInstImport \"GLSL.std.450\"\n";
98fd4e5da5Sopenharmony_ci  ss << "OpMemoryModel Logical GLSL450\n";
99fd4e5da5Sopenharmony_ci  ss << "OpEntryPoint " << execution_model << " %main \"main\""
100fd4e5da5Sopenharmony_ci     << " %f32_output"
101fd4e5da5Sopenharmony_ci     << " %f32vec2_output"
102fd4e5da5Sopenharmony_ci     << " %u32_output"
103fd4e5da5Sopenharmony_ci     << " %u32vec2_output"
104fd4e5da5Sopenharmony_ci     << " %u64_output"
105fd4e5da5Sopenharmony_ci     << " %f32_input"
106fd4e5da5Sopenharmony_ci     << " %f32vec2_input"
107fd4e5da5Sopenharmony_ci     << " %u32_input"
108fd4e5da5Sopenharmony_ci     << " %u32vec2_input"
109fd4e5da5Sopenharmony_ci     << " %u64_input"
110fd4e5da5Sopenharmony_ci     << "\n";
111fd4e5da5Sopenharmony_ci  if (execution_model == "Fragment") {
112fd4e5da5Sopenharmony_ci    ss << "OpExecutionMode %main OriginUpperLeft\n";
113fd4e5da5Sopenharmony_ci  }
114fd4e5da5Sopenharmony_ci
115fd4e5da5Sopenharmony_ci  ss << R"(
116fd4e5da5Sopenharmony_ci%void = OpTypeVoid
117fd4e5da5Sopenharmony_ci%func = OpTypeFunction %void
118fd4e5da5Sopenharmony_ci%bool = OpTypeBool
119fd4e5da5Sopenharmony_ci%f16 = OpTypeFloat 16
120fd4e5da5Sopenharmony_ci%f32 = OpTypeFloat 32
121fd4e5da5Sopenharmony_ci%f64 = OpTypeFloat 64
122fd4e5da5Sopenharmony_ci%u32 = OpTypeInt 32 0
123fd4e5da5Sopenharmony_ci%s32 = OpTypeInt 32 1
124fd4e5da5Sopenharmony_ci%u64 = OpTypeInt 64 0
125fd4e5da5Sopenharmony_ci%s64 = OpTypeInt 64 1
126fd4e5da5Sopenharmony_ci%u16 = OpTypeInt 16 0
127fd4e5da5Sopenharmony_ci%s16 = OpTypeInt 16 1
128fd4e5da5Sopenharmony_ci%f32vec2 = OpTypeVector %f32 2
129fd4e5da5Sopenharmony_ci%f32vec3 = OpTypeVector %f32 3
130fd4e5da5Sopenharmony_ci%f32vec4 = OpTypeVector %f32 4
131fd4e5da5Sopenharmony_ci%f64vec2 = OpTypeVector %f64 2
132fd4e5da5Sopenharmony_ci%f64vec3 = OpTypeVector %f64 3
133fd4e5da5Sopenharmony_ci%f64vec4 = OpTypeVector %f64 4
134fd4e5da5Sopenharmony_ci%u32vec2 = OpTypeVector %u32 2
135fd4e5da5Sopenharmony_ci%u32vec3 = OpTypeVector %u32 3
136fd4e5da5Sopenharmony_ci%s32vec2 = OpTypeVector %s32 2
137fd4e5da5Sopenharmony_ci%u32vec4 = OpTypeVector %u32 4
138fd4e5da5Sopenharmony_ci%s32vec4 = OpTypeVector %s32 4
139fd4e5da5Sopenharmony_ci%u64vec2 = OpTypeVector %u64 2
140fd4e5da5Sopenharmony_ci%s64vec2 = OpTypeVector %s64 2
141fd4e5da5Sopenharmony_ci%f64mat22 = OpTypeMatrix %f64vec2 2
142fd4e5da5Sopenharmony_ci%f32mat22 = OpTypeMatrix %f32vec2 2
143fd4e5da5Sopenharmony_ci%f32mat23 = OpTypeMatrix %f32vec2 3
144fd4e5da5Sopenharmony_ci%f32mat32 = OpTypeMatrix %f32vec3 2
145fd4e5da5Sopenharmony_ci%f32mat33 = OpTypeMatrix %f32vec3 3
146fd4e5da5Sopenharmony_ci
147fd4e5da5Sopenharmony_ci%f32_0 = OpConstant %f32 0
148fd4e5da5Sopenharmony_ci%f32_1 = OpConstant %f32 1
149fd4e5da5Sopenharmony_ci%f32_2 = OpConstant %f32 2
150fd4e5da5Sopenharmony_ci%f32_3 = OpConstant %f32 3
151fd4e5da5Sopenharmony_ci%f32_4 = OpConstant %f32 4
152fd4e5da5Sopenharmony_ci%f32_h = OpConstant %f32 0.5
153fd4e5da5Sopenharmony_ci%f32vec2_01 = OpConstantComposite %f32vec2 %f32_0 %f32_1
154fd4e5da5Sopenharmony_ci%f32vec2_12 = OpConstantComposite %f32vec2 %f32_1 %f32_2
155fd4e5da5Sopenharmony_ci%f32vec3_012 = OpConstantComposite %f32vec3 %f32_0 %f32_1 %f32_2
156fd4e5da5Sopenharmony_ci%f32vec3_123 = OpConstantComposite %f32vec3 %f32_1 %f32_2 %f32_3
157fd4e5da5Sopenharmony_ci%f32vec4_0123 = OpConstantComposite %f32vec4 %f32_0 %f32_1 %f32_2 %f32_3
158fd4e5da5Sopenharmony_ci%f32vec4_1234 = OpConstantComposite %f32vec4 %f32_1 %f32_2 %f32_3 %f32_4
159fd4e5da5Sopenharmony_ci
160fd4e5da5Sopenharmony_ci%f64_0 = OpConstant %f64 0
161fd4e5da5Sopenharmony_ci%f64_1 = OpConstant %f64 1
162fd4e5da5Sopenharmony_ci%f64_2 = OpConstant %f64 2
163fd4e5da5Sopenharmony_ci%f64_3 = OpConstant %f64 3
164fd4e5da5Sopenharmony_ci%f64vec2_01 = OpConstantComposite %f64vec2 %f64_0 %f64_1
165fd4e5da5Sopenharmony_ci%f64vec3_012 = OpConstantComposite %f64vec3 %f64_0 %f64_1 %f64_2
166fd4e5da5Sopenharmony_ci%f64vec4_0123 = OpConstantComposite %f64vec4 %f64_0 %f64_1 %f64_2 %f64_3
167fd4e5da5Sopenharmony_ci
168fd4e5da5Sopenharmony_ci%f16_0 = OpConstant %f16 0
169fd4e5da5Sopenharmony_ci%f16_1 = OpConstant %f16 1
170fd4e5da5Sopenharmony_ci%f16_h = OpConstant %f16 0.5
171fd4e5da5Sopenharmony_ci
172fd4e5da5Sopenharmony_ci%u32_0 = OpConstant %u32 0
173fd4e5da5Sopenharmony_ci%u32_1 = OpConstant %u32 1
174fd4e5da5Sopenharmony_ci%u32_2 = OpConstant %u32 2
175fd4e5da5Sopenharmony_ci%u32_3 = OpConstant %u32 3
176fd4e5da5Sopenharmony_ci
177fd4e5da5Sopenharmony_ci%s32_0 = OpConstant %s32 0
178fd4e5da5Sopenharmony_ci%s32_1 = OpConstant %s32 1
179fd4e5da5Sopenharmony_ci%s32_2 = OpConstant %s32 2
180fd4e5da5Sopenharmony_ci%s32_3 = OpConstant %s32 3
181fd4e5da5Sopenharmony_ci
182fd4e5da5Sopenharmony_ci%u64_0 = OpConstant %u64 0
183fd4e5da5Sopenharmony_ci%u64_1 = OpConstant %u64 1
184fd4e5da5Sopenharmony_ci%u64_2 = OpConstant %u64 2
185fd4e5da5Sopenharmony_ci%u64_3 = OpConstant %u64 3
186fd4e5da5Sopenharmony_ci
187fd4e5da5Sopenharmony_ci%s64_0 = OpConstant %s64 0
188fd4e5da5Sopenharmony_ci%s64_1 = OpConstant %s64 1
189fd4e5da5Sopenharmony_ci%s64_2 = OpConstant %s64 2
190fd4e5da5Sopenharmony_ci%s64_3 = OpConstant %s64 3
191fd4e5da5Sopenharmony_ci
192fd4e5da5Sopenharmony_ci%s32vec2_01 = OpConstantComposite %s32vec2 %s32_0 %s32_1
193fd4e5da5Sopenharmony_ci%u32vec2_01 = OpConstantComposite %u32vec2 %u32_0 %u32_1
194fd4e5da5Sopenharmony_ci
195fd4e5da5Sopenharmony_ci%s32vec2_12 = OpConstantComposite %s32vec2 %s32_1 %s32_2
196fd4e5da5Sopenharmony_ci%u32vec2_12 = OpConstantComposite %u32vec2 %u32_1 %u32_2
197fd4e5da5Sopenharmony_ci
198fd4e5da5Sopenharmony_ci%s32vec4_0123 = OpConstantComposite %s32vec4 %s32_0 %s32_1 %s32_2 %s32_3
199fd4e5da5Sopenharmony_ci%u32vec4_0123 = OpConstantComposite %u32vec4 %u32_0 %u32_1 %u32_2 %u32_3
200fd4e5da5Sopenharmony_ci
201fd4e5da5Sopenharmony_ci%s64vec2_01 = OpConstantComposite %s64vec2 %s64_0 %s64_1
202fd4e5da5Sopenharmony_ci%u64vec2_01 = OpConstantComposite %u64vec2 %u64_0 %u64_1
203fd4e5da5Sopenharmony_ci
204fd4e5da5Sopenharmony_ci%f32mat22_1212 = OpConstantComposite %f32mat22 %f32vec2_12 %f32vec2_12
205fd4e5da5Sopenharmony_ci%f32mat23_121212 = OpConstantComposite %f32mat23 %f32vec2_12 %f32vec2_12 %f32vec2_12
206fd4e5da5Sopenharmony_ci
207fd4e5da5Sopenharmony_ci%f32_ptr_output = OpTypePointer Output %f32
208fd4e5da5Sopenharmony_ci%f32vec2_ptr_output = OpTypePointer Output %f32vec2
209fd4e5da5Sopenharmony_ci
210fd4e5da5Sopenharmony_ci%u32_ptr_output = OpTypePointer Output %u32
211fd4e5da5Sopenharmony_ci%u32vec2_ptr_output = OpTypePointer Output %u32vec2
212fd4e5da5Sopenharmony_ci
213fd4e5da5Sopenharmony_ci%u64_ptr_output = OpTypePointer Output %u64
214fd4e5da5Sopenharmony_ci
215fd4e5da5Sopenharmony_ci%f32_output = OpVariable %f32_ptr_output Output
216fd4e5da5Sopenharmony_ci%f32vec2_output = OpVariable %f32vec2_ptr_output Output
217fd4e5da5Sopenharmony_ci
218fd4e5da5Sopenharmony_ci%u32_output = OpVariable %u32_ptr_output Output
219fd4e5da5Sopenharmony_ci%u32vec2_output = OpVariable %u32vec2_ptr_output Output
220fd4e5da5Sopenharmony_ci
221fd4e5da5Sopenharmony_ci%u64_output = OpVariable %u64_ptr_output Output
222fd4e5da5Sopenharmony_ci
223fd4e5da5Sopenharmony_ci%f32_ptr_input = OpTypePointer Input %f32
224fd4e5da5Sopenharmony_ci%f32vec2_ptr_input = OpTypePointer Input %f32vec2
225fd4e5da5Sopenharmony_ci
226fd4e5da5Sopenharmony_ci%u32_ptr_input = OpTypePointer Input %u32
227fd4e5da5Sopenharmony_ci%u32vec2_ptr_input = OpTypePointer Input %u32vec2
228fd4e5da5Sopenharmony_ci
229fd4e5da5Sopenharmony_ci%u64_ptr_input = OpTypePointer Input %u64
230fd4e5da5Sopenharmony_ci
231fd4e5da5Sopenharmony_ci%f32_input = OpVariable %f32_ptr_input Input
232fd4e5da5Sopenharmony_ci%f32vec2_input = OpVariable %f32vec2_ptr_input Input
233fd4e5da5Sopenharmony_ci
234fd4e5da5Sopenharmony_ci%u32_input = OpVariable %u32_ptr_input Input
235fd4e5da5Sopenharmony_ci%u32vec2_input = OpVariable %u32vec2_ptr_input Input
236fd4e5da5Sopenharmony_ci
237fd4e5da5Sopenharmony_ci%u64_input = OpVariable %u64_ptr_input Input
238fd4e5da5Sopenharmony_ci
239fd4e5da5Sopenharmony_ci%struct_f16_u16 = OpTypeStruct %f16 %u16
240fd4e5da5Sopenharmony_ci%struct_f32_f32 = OpTypeStruct %f32 %f32
241fd4e5da5Sopenharmony_ci%struct_f32_f32_f32 = OpTypeStruct %f32 %f32 %f32
242fd4e5da5Sopenharmony_ci%struct_f32_u32 = OpTypeStruct %f32 %u32
243fd4e5da5Sopenharmony_ci%struct_f32_u32_f32 = OpTypeStruct %f32 %u32 %f32
244fd4e5da5Sopenharmony_ci%struct_u32_f32 = OpTypeStruct %u32 %f32
245fd4e5da5Sopenharmony_ci%struct_u32_u32 = OpTypeStruct %u32 %u32
246fd4e5da5Sopenharmony_ci%struct_f32_f64 = OpTypeStruct %f32 %f64
247fd4e5da5Sopenharmony_ci%struct_f32vec2_f32vec2 = OpTypeStruct %f32vec2 %f32vec2
248fd4e5da5Sopenharmony_ci%struct_f32vec2_u32vec2 = OpTypeStruct %f32vec2 %u32vec2
249fd4e5da5Sopenharmony_ci
250fd4e5da5Sopenharmony_ci%main = OpFunction %void None %func
251fd4e5da5Sopenharmony_ci%main_entry = OpLabel
252fd4e5da5Sopenharmony_ci)";
253fd4e5da5Sopenharmony_ci
254fd4e5da5Sopenharmony_ci  ss << body;
255fd4e5da5Sopenharmony_ci
256fd4e5da5Sopenharmony_ci  ss << R"(
257fd4e5da5Sopenharmony_ciOpReturn
258fd4e5da5Sopenharmony_ciOpFunctionEnd)";
259fd4e5da5Sopenharmony_ci
260fd4e5da5Sopenharmony_ci  return ss.str();
261fd4e5da5Sopenharmony_ci}
262fd4e5da5Sopenharmony_ci
263fd4e5da5Sopenharmony_cistd::string GenerateKernelCode(
264fd4e5da5Sopenharmony_ci    const std::string& body,
265fd4e5da5Sopenharmony_ci    const std::string& capabilities_and_extensions = "",
266fd4e5da5Sopenharmony_ci    const std::string& memory_model = "Physical32") {
267fd4e5da5Sopenharmony_ci  std::ostringstream ss;
268fd4e5da5Sopenharmony_ci  ss << R"(
269fd4e5da5Sopenharmony_ciOpCapability Addresses
270fd4e5da5Sopenharmony_ciOpCapability Kernel
271fd4e5da5Sopenharmony_ciOpCapability Linkage
272fd4e5da5Sopenharmony_ciOpCapability GenericPointer
273fd4e5da5Sopenharmony_ciOpCapability Int8
274fd4e5da5Sopenharmony_ciOpCapability Int16
275fd4e5da5Sopenharmony_ciOpCapability Int64
276fd4e5da5Sopenharmony_ciOpCapability Float16
277fd4e5da5Sopenharmony_ciOpCapability Float64
278fd4e5da5Sopenharmony_ciOpCapability Vector16
279fd4e5da5Sopenharmony_ciOpCapability Matrix
280fd4e5da5Sopenharmony_ci)";
281fd4e5da5Sopenharmony_ci
282fd4e5da5Sopenharmony_ci  ss << capabilities_and_extensions;
283fd4e5da5Sopenharmony_ci  ss << "%extinst = OpExtInstImport \"OpenCL.std\"\n";
284fd4e5da5Sopenharmony_ci  ss << "OpMemoryModel " << memory_model << " OpenCL\n";
285fd4e5da5Sopenharmony_ci
286fd4e5da5Sopenharmony_ci  ss << R"(
287fd4e5da5Sopenharmony_ci%void = OpTypeVoid
288fd4e5da5Sopenharmony_ci%func = OpTypeFunction %void
289fd4e5da5Sopenharmony_ci%bool = OpTypeBool
290fd4e5da5Sopenharmony_ci%f16 = OpTypeFloat 16
291fd4e5da5Sopenharmony_ci%f32 = OpTypeFloat 32
292fd4e5da5Sopenharmony_ci%f64 = OpTypeFloat 64
293fd4e5da5Sopenharmony_ci%u32 = OpTypeInt 32 0
294fd4e5da5Sopenharmony_ci%u64 = OpTypeInt 64 0
295fd4e5da5Sopenharmony_ci%u16 = OpTypeInt 16 0
296fd4e5da5Sopenharmony_ci%u8 = OpTypeInt 8 0
297fd4e5da5Sopenharmony_ci%f32vec2 = OpTypeVector %f32 2
298fd4e5da5Sopenharmony_ci%f32vec3 = OpTypeVector %f32 3
299fd4e5da5Sopenharmony_ci%f32vec4 = OpTypeVector %f32 4
300fd4e5da5Sopenharmony_ci%f32vec8 = OpTypeVector %f32 8
301fd4e5da5Sopenharmony_ci%f16vec8 = OpTypeVector %f16 8
302fd4e5da5Sopenharmony_ci%f32vec16 = OpTypeVector %f32 16
303fd4e5da5Sopenharmony_ci%f64vec2 = OpTypeVector %f64 2
304fd4e5da5Sopenharmony_ci%f64vec3 = OpTypeVector %f64 3
305fd4e5da5Sopenharmony_ci%f64vec4 = OpTypeVector %f64 4
306fd4e5da5Sopenharmony_ci%u32vec2 = OpTypeVector %u32 2
307fd4e5da5Sopenharmony_ci%u32vec3 = OpTypeVector %u32 3
308fd4e5da5Sopenharmony_ci%u32vec4 = OpTypeVector %u32 4
309fd4e5da5Sopenharmony_ci%u32vec8 = OpTypeVector %u32 8
310fd4e5da5Sopenharmony_ci%u64vec2 = OpTypeVector %u64 2
311fd4e5da5Sopenharmony_ci%f64mat22 = OpTypeMatrix %f64vec2 2
312fd4e5da5Sopenharmony_ci%f32mat22 = OpTypeMatrix %f32vec2 2
313fd4e5da5Sopenharmony_ci%f32mat23 = OpTypeMatrix %f32vec2 3
314fd4e5da5Sopenharmony_ci%f32mat32 = OpTypeMatrix %f32vec3 2
315fd4e5da5Sopenharmony_ci%f32mat33 = OpTypeMatrix %f32vec3 3
316fd4e5da5Sopenharmony_ci
317fd4e5da5Sopenharmony_ci%f32_0 = OpConstant %f32 0
318fd4e5da5Sopenharmony_ci%f32_1 = OpConstant %f32 1
319fd4e5da5Sopenharmony_ci%f32_2 = OpConstant %f32 2
320fd4e5da5Sopenharmony_ci%f32_3 = OpConstant %f32 3
321fd4e5da5Sopenharmony_ci%f32_4 = OpConstant %f32 4
322fd4e5da5Sopenharmony_ci%f32_h = OpConstant %f32 0.5
323fd4e5da5Sopenharmony_ci%f32vec2_01 = OpConstantComposite %f32vec2 %f32_0 %f32_1
324fd4e5da5Sopenharmony_ci%f32vec2_12 = OpConstantComposite %f32vec2 %f32_1 %f32_2
325fd4e5da5Sopenharmony_ci%f32vec3_012 = OpConstantComposite %f32vec3 %f32_0 %f32_1 %f32_2
326fd4e5da5Sopenharmony_ci%f32vec3_123 = OpConstantComposite %f32vec3 %f32_1 %f32_2 %f32_3
327fd4e5da5Sopenharmony_ci%f32vec4_0123 = OpConstantComposite %f32vec4 %f32_0 %f32_1 %f32_2 %f32_3
328fd4e5da5Sopenharmony_ci%f32vec4_1234 = OpConstantComposite %f32vec4 %f32_1 %f32_2 %f32_3 %f32_4
329fd4e5da5Sopenharmony_ci%f32vec8_01010101 = OpConstantComposite %f32vec8 %f32_0 %f32_1 %f32_0 %f32_1 %f32_0 %f32_1 %f32_0 %f32_1
330fd4e5da5Sopenharmony_ci
331fd4e5da5Sopenharmony_ci%f64_0 = OpConstant %f64 0
332fd4e5da5Sopenharmony_ci%f64_1 = OpConstant %f64 1
333fd4e5da5Sopenharmony_ci%f64_2 = OpConstant %f64 2
334fd4e5da5Sopenharmony_ci%f64_3 = OpConstant %f64 3
335fd4e5da5Sopenharmony_ci%f64vec2_01 = OpConstantComposite %f64vec2 %f64_0 %f64_1
336fd4e5da5Sopenharmony_ci%f64vec3_012 = OpConstantComposite %f64vec3 %f64_0 %f64_1 %f64_2
337fd4e5da5Sopenharmony_ci%f64vec4_0123 = OpConstantComposite %f64vec4 %f64_0 %f64_1 %f64_2 %f64_3
338fd4e5da5Sopenharmony_ci
339fd4e5da5Sopenharmony_ci%f16_0 = OpConstant %f16 0
340fd4e5da5Sopenharmony_ci%f16_1 = OpConstant %f16 1
341fd4e5da5Sopenharmony_ci
342fd4e5da5Sopenharmony_ci%u8_0 = OpConstant %u8 0
343fd4e5da5Sopenharmony_ci%u8_1 = OpConstant %u8 1
344fd4e5da5Sopenharmony_ci%u8_2 = OpConstant %u8 2
345fd4e5da5Sopenharmony_ci%u8_3 = OpConstant %u8 3
346fd4e5da5Sopenharmony_ci
347fd4e5da5Sopenharmony_ci%u16_0 = OpConstant %u16 0
348fd4e5da5Sopenharmony_ci%u16_1 = OpConstant %u16 1
349fd4e5da5Sopenharmony_ci%u16_2 = OpConstant %u16 2
350fd4e5da5Sopenharmony_ci%u16_3 = OpConstant %u16 3
351fd4e5da5Sopenharmony_ci
352fd4e5da5Sopenharmony_ci%u32_0 = OpConstant %u32 0
353fd4e5da5Sopenharmony_ci%u32_1 = OpConstant %u32 1
354fd4e5da5Sopenharmony_ci%u32_2 = OpConstant %u32 2
355fd4e5da5Sopenharmony_ci%u32_3 = OpConstant %u32 3
356fd4e5da5Sopenharmony_ci%u32_256 = OpConstant %u32 256
357fd4e5da5Sopenharmony_ci
358fd4e5da5Sopenharmony_ci%u64_0 = OpConstant %u64 0
359fd4e5da5Sopenharmony_ci%u64_1 = OpConstant %u64 1
360fd4e5da5Sopenharmony_ci%u64_2 = OpConstant %u64 2
361fd4e5da5Sopenharmony_ci%u64_3 = OpConstant %u64 3
362fd4e5da5Sopenharmony_ci%u64_256 = OpConstant %u64 256
363fd4e5da5Sopenharmony_ci
364fd4e5da5Sopenharmony_ci%u32vec2_01 = OpConstantComposite %u32vec2 %u32_0 %u32_1
365fd4e5da5Sopenharmony_ci%u32vec2_12 = OpConstantComposite %u32vec2 %u32_1 %u32_2
366fd4e5da5Sopenharmony_ci%u32vec3_012 = OpConstantComposite %u32vec3 %u32_0 %u32_1 %u32_2
367fd4e5da5Sopenharmony_ci%u32vec4_0123 = OpConstantComposite %u32vec4 %u32_0 %u32_1 %u32_2 %u32_3
368fd4e5da5Sopenharmony_ci
369fd4e5da5Sopenharmony_ci%u64vec2_01 = OpConstantComposite %u64vec2 %u64_0 %u64_1
370fd4e5da5Sopenharmony_ci
371fd4e5da5Sopenharmony_ci%f32mat22_1212 = OpConstantComposite %f32mat22 %f32vec2_12 %f32vec2_12
372fd4e5da5Sopenharmony_ci%f32mat23_121212 = OpConstantComposite %f32mat23 %f32vec2_12 %f32vec2_12 %f32vec2_12
373fd4e5da5Sopenharmony_ci
374fd4e5da5Sopenharmony_ci%struct_f32_f32 = OpTypeStruct %f32 %f32
375fd4e5da5Sopenharmony_ci%struct_f32_f32_f32 = OpTypeStruct %f32 %f32 %f32
376fd4e5da5Sopenharmony_ci%struct_f32_u32 = OpTypeStruct %f32 %u32
377fd4e5da5Sopenharmony_ci%struct_f32_u32_f32 = OpTypeStruct %f32 %u32 %f32
378fd4e5da5Sopenharmony_ci%struct_u32_f32 = OpTypeStruct %u32 %f32
379fd4e5da5Sopenharmony_ci%struct_u32_u32 = OpTypeStruct %u32 %u32
380fd4e5da5Sopenharmony_ci%struct_f32_f64 = OpTypeStruct %f32 %f64
381fd4e5da5Sopenharmony_ci%struct_f32vec2_f32vec2 = OpTypeStruct %f32vec2 %f32vec2
382fd4e5da5Sopenharmony_ci%struct_f32vec2_u32vec2 = OpTypeStruct %f32vec2 %u32vec2
383fd4e5da5Sopenharmony_ci
384fd4e5da5Sopenharmony_ci%f16vec8_ptr_workgroup = OpTypePointer Workgroup %f16vec8
385fd4e5da5Sopenharmony_ci%f16vec8_workgroup = OpVariable %f16vec8_ptr_workgroup Workgroup
386fd4e5da5Sopenharmony_ci%f16_ptr_workgroup = OpTypePointer Workgroup %f16
387fd4e5da5Sopenharmony_ci
388fd4e5da5Sopenharmony_ci%u32vec8_ptr_workgroup = OpTypePointer Workgroup %u32vec8
389fd4e5da5Sopenharmony_ci%u32vec8_workgroup = OpVariable %u32vec8_ptr_workgroup Workgroup
390fd4e5da5Sopenharmony_ci%u32_ptr_workgroup = OpTypePointer Workgroup %u32
391fd4e5da5Sopenharmony_ci
392fd4e5da5Sopenharmony_ci%f32vec8_ptr_workgroup = OpTypePointer Workgroup %f32vec8
393fd4e5da5Sopenharmony_ci%f32vec8_workgroup = OpVariable %f32vec8_ptr_workgroup Workgroup
394fd4e5da5Sopenharmony_ci%f32_ptr_workgroup = OpTypePointer Workgroup %f32
395fd4e5da5Sopenharmony_ci
396fd4e5da5Sopenharmony_ci%u32arr = OpTypeArray %u32 %u32_256
397fd4e5da5Sopenharmony_ci%u32arr_ptr_cross_workgroup = OpTypePointer CrossWorkgroup %u32arr
398fd4e5da5Sopenharmony_ci%u32arr_cross_workgroup = OpVariable %u32arr_ptr_cross_workgroup CrossWorkgroup
399fd4e5da5Sopenharmony_ci%u32_ptr_cross_workgroup = OpTypePointer CrossWorkgroup %u32
400fd4e5da5Sopenharmony_ci
401fd4e5da5Sopenharmony_ci%f32arr = OpTypeArray %f32 %u32_256
402fd4e5da5Sopenharmony_ci%f32arr_ptr_cross_workgroup = OpTypePointer CrossWorkgroup %f32arr
403fd4e5da5Sopenharmony_ci%f32arr_cross_workgroup = OpVariable %f32arr_ptr_cross_workgroup CrossWorkgroup
404fd4e5da5Sopenharmony_ci%f32_ptr_cross_workgroup = OpTypePointer CrossWorkgroup %f32
405fd4e5da5Sopenharmony_ci
406fd4e5da5Sopenharmony_ci%f32vec2arr = OpTypeArray %f32vec2 %u32_256
407fd4e5da5Sopenharmony_ci%f32vec2arr_ptr_cross_workgroup = OpTypePointer CrossWorkgroup %f32vec2arr
408fd4e5da5Sopenharmony_ci%f32vec2arr_cross_workgroup = OpVariable %f32vec2arr_ptr_cross_workgroup CrossWorkgroup
409fd4e5da5Sopenharmony_ci%f32vec2_ptr_cross_workgroup = OpTypePointer CrossWorkgroup %f32vec2
410fd4e5da5Sopenharmony_ci
411fd4e5da5Sopenharmony_ci%struct_arr = OpTypeArray %struct_f32_f32 %u32_256
412fd4e5da5Sopenharmony_ci%struct_arr_ptr_cross_workgroup = OpTypePointer CrossWorkgroup %struct_arr
413fd4e5da5Sopenharmony_ci%struct_arr_cross_workgroup = OpVariable %struct_arr_ptr_cross_workgroup CrossWorkgroup
414fd4e5da5Sopenharmony_ci%struct_ptr_cross_workgroup = OpTypePointer CrossWorkgroup %struct_f32_f32
415fd4e5da5Sopenharmony_ci
416fd4e5da5Sopenharmony_ci%f16vec8_ptr_uniform_constant = OpTypePointer UniformConstant %f16vec8
417fd4e5da5Sopenharmony_ci%f16vec8_uniform_constant = OpVariable %f16vec8_ptr_uniform_constant UniformConstant
418fd4e5da5Sopenharmony_ci%f16_ptr_uniform_constant = OpTypePointer UniformConstant %f16
419fd4e5da5Sopenharmony_ci
420fd4e5da5Sopenharmony_ci%u32vec8_ptr_uniform_constant = OpTypePointer UniformConstant %u32vec8
421fd4e5da5Sopenharmony_ci%u32vec8_uniform_constant = OpVariable %u32vec8_ptr_uniform_constant UniformConstant
422fd4e5da5Sopenharmony_ci%u32_ptr_uniform_constant = OpTypePointer UniformConstant %u32
423fd4e5da5Sopenharmony_ci
424fd4e5da5Sopenharmony_ci%f32vec8_ptr_uniform_constant = OpTypePointer UniformConstant %f32vec8
425fd4e5da5Sopenharmony_ci%f32vec8_uniform_constant = OpVariable %f32vec8_ptr_uniform_constant UniformConstant
426fd4e5da5Sopenharmony_ci%f32_ptr_uniform_constant = OpTypePointer UniformConstant %f32
427fd4e5da5Sopenharmony_ci
428fd4e5da5Sopenharmony_ci%f16vec8_ptr_input = OpTypePointer Input %f16vec8
429fd4e5da5Sopenharmony_ci%f16vec8_input = OpVariable %f16vec8_ptr_input Input
430fd4e5da5Sopenharmony_ci%f16_ptr_input = OpTypePointer Input %f16
431fd4e5da5Sopenharmony_ci
432fd4e5da5Sopenharmony_ci%u32vec8_ptr_input = OpTypePointer Input %u32vec8
433fd4e5da5Sopenharmony_ci%u32vec8_input = OpVariable %u32vec8_ptr_input Input
434fd4e5da5Sopenharmony_ci%u32_ptr_input = OpTypePointer Input %u32
435fd4e5da5Sopenharmony_ci
436fd4e5da5Sopenharmony_ci%f32_ptr_generic = OpTypePointer Generic %f32
437fd4e5da5Sopenharmony_ci%u32_ptr_generic = OpTypePointer Generic %u32
438fd4e5da5Sopenharmony_ci
439fd4e5da5Sopenharmony_ci%f32_ptr_function = OpTypePointer Function %f32
440fd4e5da5Sopenharmony_ci%f32vec2_ptr_function = OpTypePointer Function %f32vec2
441fd4e5da5Sopenharmony_ci%u32_ptr_function = OpTypePointer Function %u32
442fd4e5da5Sopenharmony_ci%u64_ptr_function = OpTypePointer Function %u64
443fd4e5da5Sopenharmony_ci%u32vec2_ptr_function = OpTypePointer Function %u32vec2
444fd4e5da5Sopenharmony_ci
445fd4e5da5Sopenharmony_ci%u8arr = OpTypeArray %u8 %u32_256
446fd4e5da5Sopenharmony_ci%u8arr_ptr_uniform_constant = OpTypePointer UniformConstant %u8arr
447fd4e5da5Sopenharmony_ci%u8arr_uniform_constant = OpVariable %u8arr_ptr_uniform_constant UniformConstant
448fd4e5da5Sopenharmony_ci%u8_ptr_uniform_constant = OpTypePointer UniformConstant %u8
449fd4e5da5Sopenharmony_ci%u8_ptr_generic = OpTypePointer Generic %u8
450fd4e5da5Sopenharmony_ci
451fd4e5da5Sopenharmony_ci%main = OpFunction %void None %func
452fd4e5da5Sopenharmony_ci%main_entry = OpLabel
453fd4e5da5Sopenharmony_ci)";
454fd4e5da5Sopenharmony_ci
455fd4e5da5Sopenharmony_ci  ss << body;
456fd4e5da5Sopenharmony_ci
457fd4e5da5Sopenharmony_ci  ss << R"(
458fd4e5da5Sopenharmony_ciOpReturn
459fd4e5da5Sopenharmony_ciOpFunctionEnd)";
460fd4e5da5Sopenharmony_ci
461fd4e5da5Sopenharmony_ci  return ss.str();
462fd4e5da5Sopenharmony_ci}
463fd4e5da5Sopenharmony_ci
464fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450SqrtLike, Success) {
465fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
466fd4e5da5Sopenharmony_ci  std::ostringstream ss;
467fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name << " %f32_0\n";
468fd4e5da5Sopenharmony_ci  ss << "%val2 = OpExtInst %f32vec2 %extinst " << ext_inst_name
469fd4e5da5Sopenharmony_ci     << " %f32vec2_01\n";
470fd4e5da5Sopenharmony_ci  ss << "%val3 = OpExtInst %f64 %extinst " << ext_inst_name << " %f64_0\n";
471fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(ss.str()));
472fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
473fd4e5da5Sopenharmony_ci}
474fd4e5da5Sopenharmony_ci
475fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450SqrtLike, IntResultType) {
476fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
477fd4e5da5Sopenharmony_ci  const std::string body =
478fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + " %f32_0\n";
479fd4e5da5Sopenharmony_ci
480fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
481fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
482fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
483fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 " + ext_inst_name +
484fd4e5da5Sopenharmony_ci                        ": expected Result Type to be a float scalar "
485fd4e5da5Sopenharmony_ci                        "or vector type"));
486fd4e5da5Sopenharmony_ci}
487fd4e5da5Sopenharmony_ci
488fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450SqrtLike, IntOperand) {
489fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
490fd4e5da5Sopenharmony_ci  const std::string body =
491fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + " %u32_0\n";
492fd4e5da5Sopenharmony_ci
493fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
494fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
495fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
496fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 " + ext_inst_name +
497fd4e5da5Sopenharmony_ci                        ": expected types of all operands to be equal to "
498fd4e5da5Sopenharmony_ci                        "Result Type"));
499fd4e5da5Sopenharmony_ci}
500fd4e5da5Sopenharmony_ci
501fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllSqrtLike, ValidateGlslStd450SqrtLike,
502fd4e5da5Sopenharmony_ci                         ::testing::ValuesIn(std::vector<std::string>{
503fd4e5da5Sopenharmony_ci                             "Round",
504fd4e5da5Sopenharmony_ci                             "RoundEven",
505fd4e5da5Sopenharmony_ci                             "FAbs",
506fd4e5da5Sopenharmony_ci                             "Trunc",
507fd4e5da5Sopenharmony_ci                             "FSign",
508fd4e5da5Sopenharmony_ci                             "Floor",
509fd4e5da5Sopenharmony_ci                             "Ceil",
510fd4e5da5Sopenharmony_ci                             "Fract",
511fd4e5da5Sopenharmony_ci                             "Sqrt",
512fd4e5da5Sopenharmony_ci                             "InverseSqrt",
513fd4e5da5Sopenharmony_ci                             "Normalize",
514fd4e5da5Sopenharmony_ci                         }));
515fd4e5da5Sopenharmony_ci
516fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450FMinLike, Success) {
517fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
518fd4e5da5Sopenharmony_ci  std::ostringstream ss;
519fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name
520fd4e5da5Sopenharmony_ci     << " %f32_0 %f32_1\n";
521fd4e5da5Sopenharmony_ci  ss << "%val2 = OpExtInst %f32vec2 %extinst " << ext_inst_name
522fd4e5da5Sopenharmony_ci     << " %f32vec2_01 %f32vec2_12\n";
523fd4e5da5Sopenharmony_ci  ss << "%val3 = OpExtInst %f64 %extinst " << ext_inst_name
524fd4e5da5Sopenharmony_ci     << " %f64_0 %f64_0\n";
525fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(ss.str()));
526fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
527fd4e5da5Sopenharmony_ci}
528fd4e5da5Sopenharmony_ci
529fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450FMinLike, IntResultType) {
530fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
531fd4e5da5Sopenharmony_ci  const std::string body =
532fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + " %f32_0 %f32_1\n";
533fd4e5da5Sopenharmony_ci
534fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
535fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
536fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
537fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 " + ext_inst_name +
538fd4e5da5Sopenharmony_ci                        ": expected Result Type to be a float scalar "
539fd4e5da5Sopenharmony_ci                        "or vector type"));
540fd4e5da5Sopenharmony_ci}
541fd4e5da5Sopenharmony_ci
542fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450FMinLike, IntOperand1) {
543fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
544fd4e5da5Sopenharmony_ci  const std::string body =
545fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + " %u32_0 %f32_1\n";
546fd4e5da5Sopenharmony_ci
547fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
548fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
549fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
550fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 " + ext_inst_name +
551fd4e5da5Sopenharmony_ci                        ": expected types of all operands to be equal to "
552fd4e5da5Sopenharmony_ci                        "Result Type"));
553fd4e5da5Sopenharmony_ci}
554fd4e5da5Sopenharmony_ci
555fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450FMinLike, IntOperand2) {
556fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
557fd4e5da5Sopenharmony_ci  const std::string body =
558fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + " %f32_0 %u32_1\n";
559fd4e5da5Sopenharmony_ci
560fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
561fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
562fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
563fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 " + ext_inst_name +
564fd4e5da5Sopenharmony_ci                        ": expected types of all operands to be equal to "
565fd4e5da5Sopenharmony_ci                        "Result Type"));
566fd4e5da5Sopenharmony_ci}
567fd4e5da5Sopenharmony_ci
568fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllFMinLike, ValidateGlslStd450FMinLike,
569fd4e5da5Sopenharmony_ci                         ::testing::ValuesIn(std::vector<std::string>{
570fd4e5da5Sopenharmony_ci                             "FMin",
571fd4e5da5Sopenharmony_ci                             "FMax",
572fd4e5da5Sopenharmony_ci                             "Step",
573fd4e5da5Sopenharmony_ci                             "Reflect",
574fd4e5da5Sopenharmony_ci                             "NMin",
575fd4e5da5Sopenharmony_ci                             "NMax",
576fd4e5da5Sopenharmony_ci                         }));
577fd4e5da5Sopenharmony_ci
578fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450FClampLike, Success) {
579fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
580fd4e5da5Sopenharmony_ci  std::ostringstream ss;
581fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name
582fd4e5da5Sopenharmony_ci     << " %f32_0 %f32_1 %f32_2\n";
583fd4e5da5Sopenharmony_ci  ss << "%val2 = OpExtInst %f32vec2 %extinst " << ext_inst_name
584fd4e5da5Sopenharmony_ci     << " %f32vec2_01 %f32vec2_01 %f32vec2_12\n";
585fd4e5da5Sopenharmony_ci  ss << "%val3 = OpExtInst %f64 %extinst " << ext_inst_name
586fd4e5da5Sopenharmony_ci     << " %f64_0 %f64_0 %f64_1\n";
587fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(ss.str()));
588fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
589fd4e5da5Sopenharmony_ci}
590fd4e5da5Sopenharmony_ci
591fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450FClampLike, IntResultType) {
592fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
593fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %u32 %extinst " + ext_inst_name +
594fd4e5da5Sopenharmony_ci                           " %f32_0 %f32_1 %f32_2\n";
595fd4e5da5Sopenharmony_ci
596fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
597fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
598fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
599fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 " + ext_inst_name +
600fd4e5da5Sopenharmony_ci                        ": expected Result Type to be a float scalar "
601fd4e5da5Sopenharmony_ci                        "or vector type"));
602fd4e5da5Sopenharmony_ci}
603fd4e5da5Sopenharmony_ci
604fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450FClampLike, IntOperand1) {
605fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
606fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %f32 %extinst " + ext_inst_name +
607fd4e5da5Sopenharmony_ci                           " %u32_0 %f32_0 %f32_1\n";
608fd4e5da5Sopenharmony_ci
609fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
610fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
611fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
612fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 " + ext_inst_name +
613fd4e5da5Sopenharmony_ci                        ": expected types of all operands to be equal to "
614fd4e5da5Sopenharmony_ci                        "Result Type"));
615fd4e5da5Sopenharmony_ci}
616fd4e5da5Sopenharmony_ci
617fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450FClampLike, IntOperand2) {
618fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
619fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %f32 %extinst " + ext_inst_name +
620fd4e5da5Sopenharmony_ci                           " %f32_0 %u32_0 %f32_1\n";
621fd4e5da5Sopenharmony_ci
622fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
623fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
624fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
625fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 " + ext_inst_name +
626fd4e5da5Sopenharmony_ci                        ": expected types of all operands to be equal to "
627fd4e5da5Sopenharmony_ci                        "Result Type"));
628fd4e5da5Sopenharmony_ci}
629fd4e5da5Sopenharmony_ci
630fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450FClampLike, IntOperand3) {
631fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
632fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %f32 %extinst " + ext_inst_name +
633fd4e5da5Sopenharmony_ci                           " %f32_1 %f32_0 %u32_2\n";
634fd4e5da5Sopenharmony_ci
635fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
636fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
637fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
638fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 " + ext_inst_name +
639fd4e5da5Sopenharmony_ci                        ": expected types of all operands to be equal to "
640fd4e5da5Sopenharmony_ci                        "Result Type"));
641fd4e5da5Sopenharmony_ci}
642fd4e5da5Sopenharmony_ci
643fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllFClampLike, ValidateGlslStd450FClampLike,
644fd4e5da5Sopenharmony_ci                         ::testing::ValuesIn(std::vector<std::string>{
645fd4e5da5Sopenharmony_ci                             "FClamp",
646fd4e5da5Sopenharmony_ci                             "FMix",
647fd4e5da5Sopenharmony_ci                             "SmoothStep",
648fd4e5da5Sopenharmony_ci                             "Fma",
649fd4e5da5Sopenharmony_ci                             "FaceForward",
650fd4e5da5Sopenharmony_ci                             "NClamp",
651fd4e5da5Sopenharmony_ci                         }));
652fd4e5da5Sopenharmony_ci
653fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450SAbsLike, Success) {
654fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
655fd4e5da5Sopenharmony_ci  std::ostringstream ss;
656fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %s32 %extinst " << ext_inst_name << " %u32_1\n";
657fd4e5da5Sopenharmony_ci  ss << "%val2 = OpExtInst %s32 %extinst " << ext_inst_name << " %s32_1\n";
658fd4e5da5Sopenharmony_ci  ss << "%val3 = OpExtInst %u32 %extinst " << ext_inst_name << " %u32_1\n";
659fd4e5da5Sopenharmony_ci  ss << "%val4 = OpExtInst %u32 %extinst " << ext_inst_name << " %s32_1\n";
660fd4e5da5Sopenharmony_ci  ss << "%val5 = OpExtInst %s32vec2 %extinst " << ext_inst_name
661fd4e5da5Sopenharmony_ci     << " %s32vec2_01\n";
662fd4e5da5Sopenharmony_ci  ss << "%val6 = OpExtInst %u32vec2 %extinst " << ext_inst_name
663fd4e5da5Sopenharmony_ci     << " %u32vec2_01\n";
664fd4e5da5Sopenharmony_ci  ss << "%val7 = OpExtInst %u32vec2 %extinst " << ext_inst_name
665fd4e5da5Sopenharmony_ci     << " %s32vec2_01\n";
666fd4e5da5Sopenharmony_ci  ss << "%val8 = OpExtInst %s32vec2 %extinst " << ext_inst_name
667fd4e5da5Sopenharmony_ci     << " %u32vec2_01\n";
668fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(ss.str()));
669fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
670fd4e5da5Sopenharmony_ci}
671fd4e5da5Sopenharmony_ci
672fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450SAbsLike, FloatResultType) {
673fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
674fd4e5da5Sopenharmony_ci  const std::string body =
675fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + " %u32_0\n";
676fd4e5da5Sopenharmony_ci
677fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
678fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
679fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
680fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 " + ext_inst_name +
681fd4e5da5Sopenharmony_ci                        ": expected Result Type to be an int scalar "
682fd4e5da5Sopenharmony_ci                        "or vector type"));
683fd4e5da5Sopenharmony_ci}
684fd4e5da5Sopenharmony_ci
685fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450SAbsLike, FloatOperand) {
686fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
687fd4e5da5Sopenharmony_ci  const std::string body =
688fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %s32 %extinst " + ext_inst_name + " %f32_0\n";
689fd4e5da5Sopenharmony_ci
690fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
691fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
692fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
693fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 " + ext_inst_name +
694fd4e5da5Sopenharmony_ci                        ": expected all operands to be int scalars or "
695fd4e5da5Sopenharmony_ci                        "vectors"));
696fd4e5da5Sopenharmony_ci}
697fd4e5da5Sopenharmony_ci
698fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450SAbsLike, WrongDimOperand) {
699fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
700fd4e5da5Sopenharmony_ci  const std::string body =
701fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %s32 %extinst " + ext_inst_name + " %s32vec2_01\n";
702fd4e5da5Sopenharmony_ci
703fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
704fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
705fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
706fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 " + ext_inst_name +
707fd4e5da5Sopenharmony_ci                        ": expected all operands to have the same dimension as "
708fd4e5da5Sopenharmony_ci                        "Result Type"));
709fd4e5da5Sopenharmony_ci}
710fd4e5da5Sopenharmony_ci
711fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450SAbsLike, WrongBitWidthOperand) {
712fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
713fd4e5da5Sopenharmony_ci  const std::string body =
714fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %s64 %extinst " + ext_inst_name + " %s32_0\n";
715fd4e5da5Sopenharmony_ci
716fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
717fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
718fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
719fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 " + ext_inst_name +
720fd4e5da5Sopenharmony_ci                        ": expected all operands to have the same bit width as "
721fd4e5da5Sopenharmony_ci                        "Result Type"));
722fd4e5da5Sopenharmony_ci}
723fd4e5da5Sopenharmony_ci
724fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450SAbsLike, TypelessOperand) {
725fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
726fd4e5da5Sopenharmony_ci  const std::string body =
727fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %s64 %extinst " + ext_inst_name + " %main_entry\n";
728fd4e5da5Sopenharmony_ci
729fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
730fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
731fd4e5da5Sopenharmony_ci  EXPECT_THAT(
732fd4e5da5Sopenharmony_ci      getDiagnosticString(),
733fd4e5da5Sopenharmony_ci      HasSubstr("GLSL.std.450 " + ext_inst_name +
734fd4e5da5Sopenharmony_ci                ": expected all operands to be int scalars or vectors"));
735fd4e5da5Sopenharmony_ci}
736fd4e5da5Sopenharmony_ci
737fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllSAbsLike, ValidateGlslStd450SAbsLike,
738fd4e5da5Sopenharmony_ci                         ::testing::ValuesIn(std::vector<std::string>{
739fd4e5da5Sopenharmony_ci                             "SAbs",
740fd4e5da5Sopenharmony_ci                             "SSign",
741fd4e5da5Sopenharmony_ci                             "FindILsb",
742fd4e5da5Sopenharmony_ci                             "FindUMsb",
743fd4e5da5Sopenharmony_ci                             "FindSMsb",
744fd4e5da5Sopenharmony_ci                         }));
745fd4e5da5Sopenharmony_ci
746fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, FindUMsbNot32Bit) {
747fd4e5da5Sopenharmony_ci  const std::string body = R"(
748fd4e5da5Sopenharmony_ci%val1 = OpExtInst %s64 %extinst FindUMsb %u64_1
749fd4e5da5Sopenharmony_ci)";
750fd4e5da5Sopenharmony_ci
751fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
752fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
753fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
754fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 FindUMsb: this instruction is currently "
755fd4e5da5Sopenharmony_ci                        "limited to 32-bit width components"));
756fd4e5da5Sopenharmony_ci}
757fd4e5da5Sopenharmony_ci
758fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, FindSMsbNot32Bit) {
759fd4e5da5Sopenharmony_ci  const std::string body = R"(
760fd4e5da5Sopenharmony_ci%val1 = OpExtInst %s64 %extinst FindSMsb %u64_1
761fd4e5da5Sopenharmony_ci)";
762fd4e5da5Sopenharmony_ci
763fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
764fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
765fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
766fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 FindSMsb: this instruction is currently "
767fd4e5da5Sopenharmony_ci                        "limited to 32-bit width components"));
768fd4e5da5Sopenharmony_ci}
769fd4e5da5Sopenharmony_ci
770fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UMinLike, Success) {
771fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
772fd4e5da5Sopenharmony_ci  std::ostringstream ss;
773fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %s32 %extinst " << ext_inst_name
774fd4e5da5Sopenharmony_ci     << " %u32_1 %s32_2\n";
775fd4e5da5Sopenharmony_ci  ss << "%val2 = OpExtInst %s32 %extinst " << ext_inst_name
776fd4e5da5Sopenharmony_ci     << " %s32_1 %u32_2\n";
777fd4e5da5Sopenharmony_ci  ss << "%val3 = OpExtInst %u32 %extinst " << ext_inst_name
778fd4e5da5Sopenharmony_ci     << " %u32_1 %s32_2\n";
779fd4e5da5Sopenharmony_ci  ss << "%val4 = OpExtInst %u32 %extinst " << ext_inst_name
780fd4e5da5Sopenharmony_ci     << " %s32_1 %u32_2\n";
781fd4e5da5Sopenharmony_ci  ss << "%val5 = OpExtInst %s32vec2 %extinst " << ext_inst_name
782fd4e5da5Sopenharmony_ci     << " %s32vec2_01 %u32vec2_01\n";
783fd4e5da5Sopenharmony_ci  ss << "%val6 = OpExtInst %u32vec2 %extinst " << ext_inst_name
784fd4e5da5Sopenharmony_ci     << " %u32vec2_01 %s32vec2_01\n";
785fd4e5da5Sopenharmony_ci  ss << "%val7 = OpExtInst %u32vec2 %extinst " << ext_inst_name
786fd4e5da5Sopenharmony_ci     << " %s32vec2_01 %u32vec2_01\n";
787fd4e5da5Sopenharmony_ci  ss << "%val8 = OpExtInst %s32vec2 %extinst " << ext_inst_name
788fd4e5da5Sopenharmony_ci     << " %u32vec2_01 %s32vec2_01\n";
789fd4e5da5Sopenharmony_ci  ss << "%val9 = OpExtInst %s64 %extinst " << ext_inst_name
790fd4e5da5Sopenharmony_ci     << " %u64_1 %s64_0\n";
791fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(ss.str()));
792fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
793fd4e5da5Sopenharmony_ci}
794fd4e5da5Sopenharmony_ci
795fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UMinLike, FloatResultType) {
796fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
797fd4e5da5Sopenharmony_ci  const std::string body =
798fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + " %u32_0 %u32_0\n";
799fd4e5da5Sopenharmony_ci
800fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
801fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
802fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
803fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 " + ext_inst_name +
804fd4e5da5Sopenharmony_ci                        ": expected Result Type to be an int scalar "
805fd4e5da5Sopenharmony_ci                        "or vector type"));
806fd4e5da5Sopenharmony_ci}
807fd4e5da5Sopenharmony_ci
808fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UMinLike, FloatOperand1) {
809fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
810fd4e5da5Sopenharmony_ci  const std::string body =
811fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %s32 %extinst " + ext_inst_name + " %f32_0 %u32_0\n";
812fd4e5da5Sopenharmony_ci
813fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
814fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
815fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
816fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 " + ext_inst_name +
817fd4e5da5Sopenharmony_ci                        ": expected all operands to be int scalars or "
818fd4e5da5Sopenharmony_ci                        "vectors"));
819fd4e5da5Sopenharmony_ci}
820fd4e5da5Sopenharmony_ci
821fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UMinLike, FloatOperand2) {
822fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
823fd4e5da5Sopenharmony_ci  const std::string body =
824fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %s32 %extinst " + ext_inst_name + " %u32_0 %f32_0\n";
825fd4e5da5Sopenharmony_ci
826fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
827fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
828fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
829fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 " + ext_inst_name +
830fd4e5da5Sopenharmony_ci                        ": expected all operands to be int scalars or "
831fd4e5da5Sopenharmony_ci                        "vectors"));
832fd4e5da5Sopenharmony_ci}
833fd4e5da5Sopenharmony_ci
834fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UMinLike, WrongDimOperand1) {
835fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
836fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %s32 %extinst " + ext_inst_name +
837fd4e5da5Sopenharmony_ci                           " %s32vec2_01 %s32_0\n";
838fd4e5da5Sopenharmony_ci
839fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
840fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
841fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
842fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 " + ext_inst_name +
843fd4e5da5Sopenharmony_ci                        ": expected all operands to have the same dimension as "
844fd4e5da5Sopenharmony_ci                        "Result Type"));
845fd4e5da5Sopenharmony_ci}
846fd4e5da5Sopenharmony_ci
847fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UMinLike, WrongDimOperand2) {
848fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
849fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %s32 %extinst " + ext_inst_name +
850fd4e5da5Sopenharmony_ci                           " %s32_0 %s32vec2_01\n";
851fd4e5da5Sopenharmony_ci
852fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
853fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
854fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
855fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 " + ext_inst_name +
856fd4e5da5Sopenharmony_ci                        ": expected all operands to have the same dimension as "
857fd4e5da5Sopenharmony_ci                        "Result Type"));
858fd4e5da5Sopenharmony_ci}
859fd4e5da5Sopenharmony_ci
860fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UMinLike, WrongBitWidthOperand1) {
861fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
862fd4e5da5Sopenharmony_ci  const std::string body =
863fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %s64 %extinst " + ext_inst_name + " %s32_0 %s64_0\n";
864fd4e5da5Sopenharmony_ci
865fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
866fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
867fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
868fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 " + ext_inst_name +
869fd4e5da5Sopenharmony_ci                        ": expected all operands to have the same bit width as "
870fd4e5da5Sopenharmony_ci                        "Result Type"));
871fd4e5da5Sopenharmony_ci}
872fd4e5da5Sopenharmony_ci
873fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UMinLike, WrongBitWidthOperand2) {
874fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
875fd4e5da5Sopenharmony_ci  const std::string body =
876fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %s64 %extinst " + ext_inst_name + " %s64_0 %s32_0\n";
877fd4e5da5Sopenharmony_ci
878fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
879fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
880fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
881fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 " + ext_inst_name +
882fd4e5da5Sopenharmony_ci                        ": expected all operands to have the same bit width as "
883fd4e5da5Sopenharmony_ci                        "Result Type"));
884fd4e5da5Sopenharmony_ci}
885fd4e5da5Sopenharmony_ci
886fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UMinLike, TypelessOperand) {
887fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
888fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %s64 %extinst " + ext_inst_name +
889fd4e5da5Sopenharmony_ci                           " %s64_0 %main_entry\n";
890fd4e5da5Sopenharmony_ci
891fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
892fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
893fd4e5da5Sopenharmony_ci  EXPECT_THAT(
894fd4e5da5Sopenharmony_ci      getDiagnosticString(),
895fd4e5da5Sopenharmony_ci      HasSubstr("GLSL.std.450 " + ext_inst_name +
896fd4e5da5Sopenharmony_ci                ": expected all operands to be int scalars or vectors"));
897fd4e5da5Sopenharmony_ci}
898fd4e5da5Sopenharmony_ci
899fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllUMinLike, ValidateGlslStd450UMinLike,
900fd4e5da5Sopenharmony_ci                         ::testing::ValuesIn(std::vector<std::string>{
901fd4e5da5Sopenharmony_ci                             "UMin",
902fd4e5da5Sopenharmony_ci                             "SMin",
903fd4e5da5Sopenharmony_ci                             "UMax",
904fd4e5da5Sopenharmony_ci                             "SMax",
905fd4e5da5Sopenharmony_ci                         }));
906fd4e5da5Sopenharmony_ci
907fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UClampLike, Success) {
908fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
909fd4e5da5Sopenharmony_ci  std::ostringstream ss;
910fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %s32 %extinst " << ext_inst_name
911fd4e5da5Sopenharmony_ci     << " %s32_0 %u32_1 %s32_2\n";
912fd4e5da5Sopenharmony_ci  ss << "%val2 = OpExtInst %s32 %extinst " << ext_inst_name
913fd4e5da5Sopenharmony_ci     << " %u32_0 %s32_1 %u32_2\n";
914fd4e5da5Sopenharmony_ci  ss << "%val3 = OpExtInst %u32 %extinst " << ext_inst_name
915fd4e5da5Sopenharmony_ci     << " %s32_0 %u32_1 %s32_2\n";
916fd4e5da5Sopenharmony_ci  ss << "%val4 = OpExtInst %u32 %extinst " << ext_inst_name
917fd4e5da5Sopenharmony_ci     << " %u32_0 %s32_1 %u32_2\n";
918fd4e5da5Sopenharmony_ci  ss << "%val5 = OpExtInst %s32vec2 %extinst " << ext_inst_name
919fd4e5da5Sopenharmony_ci     << " %s32vec2_01 %u32vec2_01 %u32vec2_12\n";
920fd4e5da5Sopenharmony_ci  ss << "%val6 = OpExtInst %u32vec2 %extinst " << ext_inst_name
921fd4e5da5Sopenharmony_ci     << " %u32vec2_01 %s32vec2_01 %s32vec2_12\n";
922fd4e5da5Sopenharmony_ci  ss << "%val7 = OpExtInst %u32vec2 %extinst " << ext_inst_name
923fd4e5da5Sopenharmony_ci     << " %s32vec2_01 %u32vec2_01 %u32vec2_12\n";
924fd4e5da5Sopenharmony_ci  ss << "%val8 = OpExtInst %s32vec2 %extinst " << ext_inst_name
925fd4e5da5Sopenharmony_ci     << " %u32vec2_01 %s32vec2_01 %s32vec2_12\n";
926fd4e5da5Sopenharmony_ci  ss << "%val9 = OpExtInst %s64 %extinst " << ext_inst_name
927fd4e5da5Sopenharmony_ci     << " %u64_1 %s64_0 %s64_1\n";
928fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(ss.str()));
929fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
930fd4e5da5Sopenharmony_ci}
931fd4e5da5Sopenharmony_ci
932fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UClampLike, FloatResultType) {
933fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
934fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %f32 %extinst " + ext_inst_name +
935fd4e5da5Sopenharmony_ci                           " %u32_0 %u32_0 %u32_1\n";
936fd4e5da5Sopenharmony_ci
937fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
938fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
939fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
940fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 " + ext_inst_name +
941fd4e5da5Sopenharmony_ci                        ": expected Result Type to be an int scalar "
942fd4e5da5Sopenharmony_ci                        "or vector type"));
943fd4e5da5Sopenharmony_ci}
944fd4e5da5Sopenharmony_ci
945fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UClampLike, FloatOperand1) {
946fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
947fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %s32 %extinst " + ext_inst_name +
948fd4e5da5Sopenharmony_ci                           " %f32_0 %u32_0 %u32_1\n";
949fd4e5da5Sopenharmony_ci
950fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
951fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
952fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
953fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 " + ext_inst_name +
954fd4e5da5Sopenharmony_ci                        ": expected all operands to be int scalars or "
955fd4e5da5Sopenharmony_ci                        "vectors"));
956fd4e5da5Sopenharmony_ci}
957fd4e5da5Sopenharmony_ci
958fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UClampLike, FloatOperand2) {
959fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
960fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %s32 %extinst " + ext_inst_name +
961fd4e5da5Sopenharmony_ci                           " %u32_0 %f32_0 %u32_1\n";
962fd4e5da5Sopenharmony_ci
963fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
964fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
965fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
966fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 " + ext_inst_name +
967fd4e5da5Sopenharmony_ci                        ": expected all operands to be int scalars or "
968fd4e5da5Sopenharmony_ci                        "vectors"));
969fd4e5da5Sopenharmony_ci}
970fd4e5da5Sopenharmony_ci
971fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UClampLike, FloatOperand3) {
972fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
973fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %s32 %extinst " + ext_inst_name +
974fd4e5da5Sopenharmony_ci                           " %u32_0 %u32_0 %f32_1\n";
975fd4e5da5Sopenharmony_ci
976fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
977fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
978fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
979fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 " + ext_inst_name +
980fd4e5da5Sopenharmony_ci                        ": expected all operands to be int scalars or "
981fd4e5da5Sopenharmony_ci                        "vectors"));
982fd4e5da5Sopenharmony_ci}
983fd4e5da5Sopenharmony_ci
984fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UClampLike, WrongDimOperand1) {
985fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
986fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %s32 %extinst " + ext_inst_name +
987fd4e5da5Sopenharmony_ci                           " %s32vec2_01 %s32_0 %u32_1\n";
988fd4e5da5Sopenharmony_ci
989fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
990fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
991fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
992fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 " + ext_inst_name +
993fd4e5da5Sopenharmony_ci                        ": expected all operands to have the same dimension as "
994fd4e5da5Sopenharmony_ci                        "Result Type"));
995fd4e5da5Sopenharmony_ci}
996fd4e5da5Sopenharmony_ci
997fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UClampLike, WrongDimOperand2) {
998fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
999fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %s32 %extinst " + ext_inst_name +
1000fd4e5da5Sopenharmony_ci                           " %s32_0 %s32vec2_01 %u32_1\n";
1001fd4e5da5Sopenharmony_ci
1002fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1003fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1004fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1005fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 " + ext_inst_name +
1006fd4e5da5Sopenharmony_ci                        ": expected all operands to have the same dimension as "
1007fd4e5da5Sopenharmony_ci                        "Result Type"));
1008fd4e5da5Sopenharmony_ci}
1009fd4e5da5Sopenharmony_ci
1010fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UClampLike, WrongDimOperand3) {
1011fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
1012fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %s32 %extinst " + ext_inst_name +
1013fd4e5da5Sopenharmony_ci                           " %s32_0 %u32_1 %s32vec2_01\n";
1014fd4e5da5Sopenharmony_ci
1015fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1016fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1017fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1018fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 " + ext_inst_name +
1019fd4e5da5Sopenharmony_ci                        ": expected all operands to have the same dimension as "
1020fd4e5da5Sopenharmony_ci                        "Result Type"));
1021fd4e5da5Sopenharmony_ci}
1022fd4e5da5Sopenharmony_ci
1023fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UClampLike, WrongBitWidthOperand1) {
1024fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
1025fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %s64 %extinst " + ext_inst_name +
1026fd4e5da5Sopenharmony_ci                           " %s32_0 %s64_0 %s64_1\n";
1027fd4e5da5Sopenharmony_ci
1028fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1029fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1030fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1031fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 " + ext_inst_name +
1032fd4e5da5Sopenharmony_ci                        ": expected all operands to have the same bit width as "
1033fd4e5da5Sopenharmony_ci                        "Result Type"));
1034fd4e5da5Sopenharmony_ci}
1035fd4e5da5Sopenharmony_ci
1036fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UClampLike, WrongBitWidthOperand2) {
1037fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
1038fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %s64 %extinst " + ext_inst_name +
1039fd4e5da5Sopenharmony_ci                           " %s64_0 %s32_0 %s64_1\n";
1040fd4e5da5Sopenharmony_ci
1041fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1042fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1043fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1044fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 " + ext_inst_name +
1045fd4e5da5Sopenharmony_ci                        ": expected all operands to have the same bit width as "
1046fd4e5da5Sopenharmony_ci                        "Result Type"));
1047fd4e5da5Sopenharmony_ci}
1048fd4e5da5Sopenharmony_ci
1049fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UClampLike, WrongBitWidthOperand3) {
1050fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
1051fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %s64 %extinst " + ext_inst_name +
1052fd4e5da5Sopenharmony_ci                           " %s64_0 %s64_0 %s32_1\n";
1053fd4e5da5Sopenharmony_ci
1054fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1055fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1056fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1057fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 " + ext_inst_name +
1058fd4e5da5Sopenharmony_ci                        ": expected all operands to have the same bit width as "
1059fd4e5da5Sopenharmony_ci                        "Result Type"));
1060fd4e5da5Sopenharmony_ci}
1061fd4e5da5Sopenharmony_ci
1062fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450UClampLike, TypelessOperand) {
1063fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
1064fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %s64 %extinst " + ext_inst_name +
1065fd4e5da5Sopenharmony_ci                           " %main_entry %s64_0 %s64_0\n";
1066fd4e5da5Sopenharmony_ci
1067fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1068fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1069fd4e5da5Sopenharmony_ci  EXPECT_THAT(
1070fd4e5da5Sopenharmony_ci      getDiagnosticString(),
1071fd4e5da5Sopenharmony_ci      HasSubstr("GLSL.std.450 " + ext_inst_name +
1072fd4e5da5Sopenharmony_ci                ": expected all operands to be int scalars or vectors"));
1073fd4e5da5Sopenharmony_ci}
1074fd4e5da5Sopenharmony_ci
1075fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllUClampLike, ValidateGlslStd450UClampLike,
1076fd4e5da5Sopenharmony_ci                         ::testing::ValuesIn(std::vector<std::string>{
1077fd4e5da5Sopenharmony_ci                             "UClamp",
1078fd4e5da5Sopenharmony_ci                             "SClamp",
1079fd4e5da5Sopenharmony_ci                         }));
1080fd4e5da5Sopenharmony_ci
1081fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450SinLike, Success) {
1082fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
1083fd4e5da5Sopenharmony_ci  std::ostringstream ss;
1084fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name << " %f32_0\n";
1085fd4e5da5Sopenharmony_ci  ss << "%val2 = OpExtInst %f32vec2 %extinst " << ext_inst_name
1086fd4e5da5Sopenharmony_ci     << " %f32vec2_01\n";
1087fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(ss.str()));
1088fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
1089fd4e5da5Sopenharmony_ci}
1090fd4e5da5Sopenharmony_ci
1091fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450SinLike, IntResultType) {
1092fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
1093fd4e5da5Sopenharmony_ci  const std::string body =
1094fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + " %f32_0\n";
1095fd4e5da5Sopenharmony_ci
1096fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1097fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1098fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1099fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 " + ext_inst_name +
1100fd4e5da5Sopenharmony_ci                        ": expected Result Type to be a 16 or 32-bit scalar "
1101fd4e5da5Sopenharmony_ci                        "or vector float type"));
1102fd4e5da5Sopenharmony_ci}
1103fd4e5da5Sopenharmony_ci
1104fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450SinLike, F64ResultType) {
1105fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
1106fd4e5da5Sopenharmony_ci  const std::string body =
1107fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %f64 %extinst " + ext_inst_name + " %f32_0\n";
1108fd4e5da5Sopenharmony_ci
1109fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1110fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1111fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1112fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 " + ext_inst_name +
1113fd4e5da5Sopenharmony_ci                        ": expected Result Type to be a 16 or 32-bit scalar "
1114fd4e5da5Sopenharmony_ci                        "or vector float type"));
1115fd4e5da5Sopenharmony_ci}
1116fd4e5da5Sopenharmony_ci
1117fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450SinLike, IntOperand) {
1118fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
1119fd4e5da5Sopenharmony_ci  const std::string body =
1120fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + " %u32_0\n";
1121fd4e5da5Sopenharmony_ci
1122fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1123fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1124fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1125fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 " + ext_inst_name +
1126fd4e5da5Sopenharmony_ci                        ": expected types of all operands to be equal to "
1127fd4e5da5Sopenharmony_ci                        "Result Type"));
1128fd4e5da5Sopenharmony_ci}
1129fd4e5da5Sopenharmony_ci
1130fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllSinLike, ValidateGlslStd450SinLike,
1131fd4e5da5Sopenharmony_ci                         ::testing::ValuesIn(std::vector<std::string>{
1132fd4e5da5Sopenharmony_ci                             "Radians",
1133fd4e5da5Sopenharmony_ci                             "Degrees",
1134fd4e5da5Sopenharmony_ci                             "Sin",
1135fd4e5da5Sopenharmony_ci                             "Cos",
1136fd4e5da5Sopenharmony_ci                             "Tan",
1137fd4e5da5Sopenharmony_ci                             "Asin",
1138fd4e5da5Sopenharmony_ci                             "Acos",
1139fd4e5da5Sopenharmony_ci                             "Atan",
1140fd4e5da5Sopenharmony_ci                             "Sinh",
1141fd4e5da5Sopenharmony_ci                             "Cosh",
1142fd4e5da5Sopenharmony_ci                             "Tanh",
1143fd4e5da5Sopenharmony_ci                             "Asinh",
1144fd4e5da5Sopenharmony_ci                             "Acosh",
1145fd4e5da5Sopenharmony_ci                             "Atanh",
1146fd4e5da5Sopenharmony_ci                             "Exp",
1147fd4e5da5Sopenharmony_ci                             "Exp2",
1148fd4e5da5Sopenharmony_ci                             "Log",
1149fd4e5da5Sopenharmony_ci                             "Log2",
1150fd4e5da5Sopenharmony_ci                         }));
1151fd4e5da5Sopenharmony_ci
1152fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450PowLike, Success) {
1153fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
1154fd4e5da5Sopenharmony_ci  std::ostringstream ss;
1155fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name
1156fd4e5da5Sopenharmony_ci     << " %f32_1 %f32_1\n";
1157fd4e5da5Sopenharmony_ci  ss << "%val2 = OpExtInst %f32vec2 %extinst " << ext_inst_name
1158fd4e5da5Sopenharmony_ci     << " %f32vec2_01 %f32vec2_12\n";
1159fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(ss.str()));
1160fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
1161fd4e5da5Sopenharmony_ci}
1162fd4e5da5Sopenharmony_ci
1163fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450PowLike, IntResultType) {
1164fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
1165fd4e5da5Sopenharmony_ci  const std::string body =
1166fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + " %f32_1 %f32_0\n";
1167fd4e5da5Sopenharmony_ci
1168fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1169fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1170fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1171fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 " + ext_inst_name +
1172fd4e5da5Sopenharmony_ci                        ": expected Result Type to be a 16 or 32-bit scalar "
1173fd4e5da5Sopenharmony_ci                        "or vector float type"));
1174fd4e5da5Sopenharmony_ci}
1175fd4e5da5Sopenharmony_ci
1176fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450PowLike, F64ResultType) {
1177fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
1178fd4e5da5Sopenharmony_ci  const std::string body =
1179fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %f64 %extinst " + ext_inst_name + " %f32_1 %f32_0\n";
1180fd4e5da5Sopenharmony_ci
1181fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1182fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1183fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1184fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 " + ext_inst_name +
1185fd4e5da5Sopenharmony_ci                        ": expected Result Type to be a 16 or 32-bit scalar "
1186fd4e5da5Sopenharmony_ci                        "or vector float type"));
1187fd4e5da5Sopenharmony_ci}
1188fd4e5da5Sopenharmony_ci
1189fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450PowLike, IntOperand1) {
1190fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
1191fd4e5da5Sopenharmony_ci  const std::string body =
1192fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + " %u32_0 %f32_1\n";
1193fd4e5da5Sopenharmony_ci
1194fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1195fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1196fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1197fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 " + ext_inst_name +
1198fd4e5da5Sopenharmony_ci                        ": expected types of all operands to be equal to "
1199fd4e5da5Sopenharmony_ci                        "Result Type"));
1200fd4e5da5Sopenharmony_ci}
1201fd4e5da5Sopenharmony_ci
1202fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450PowLike, IntOperand2) {
1203fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
1204fd4e5da5Sopenharmony_ci  const std::string body =
1205fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + " %f32_0 %u32_1\n";
1206fd4e5da5Sopenharmony_ci
1207fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1208fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1209fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1210fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 " + ext_inst_name +
1211fd4e5da5Sopenharmony_ci                        ": expected types of all operands to be equal to "
1212fd4e5da5Sopenharmony_ci                        "Result Type"));
1213fd4e5da5Sopenharmony_ci}
1214fd4e5da5Sopenharmony_ci
1215fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllPowLike, ValidateGlslStd450PowLike,
1216fd4e5da5Sopenharmony_ci                         ::testing::ValuesIn(std::vector<std::string>{
1217fd4e5da5Sopenharmony_ci                             "Atan2",
1218fd4e5da5Sopenharmony_ci                             "Pow",
1219fd4e5da5Sopenharmony_ci                         }));
1220fd4e5da5Sopenharmony_ci
1221fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450DeterminantSuccess) {
1222fd4e5da5Sopenharmony_ci  const std::string body = R"(
1223fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Determinant %f32mat22_1212
1224fd4e5da5Sopenharmony_ci)";
1225fd4e5da5Sopenharmony_ci
1226fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1227fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
1228fd4e5da5Sopenharmony_ci}
1229fd4e5da5Sopenharmony_ci
1230fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450DeterminantIncompatibleResultType) {
1231fd4e5da5Sopenharmony_ci  const std::string body = R"(
1232fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f64 %extinst Determinant %f32mat22_1212
1233fd4e5da5Sopenharmony_ci)";
1234fd4e5da5Sopenharmony_ci
1235fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1236fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1237fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1238fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 Determinant: "
1239fd4e5da5Sopenharmony_ci                        "expected operand X component type to be equal to "
1240fd4e5da5Sopenharmony_ci                        "Result Type"));
1241fd4e5da5Sopenharmony_ci}
1242fd4e5da5Sopenharmony_ci
1243fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450DeterminantNotMatrix) {
1244fd4e5da5Sopenharmony_ci  const std::string body = R"(
1245fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Determinant %f32_1
1246fd4e5da5Sopenharmony_ci)";
1247fd4e5da5Sopenharmony_ci
1248fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1249fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1250fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1251fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 Determinant: "
1252fd4e5da5Sopenharmony_ci                        "expected operand X to be a square matrix"));
1253fd4e5da5Sopenharmony_ci}
1254fd4e5da5Sopenharmony_ci
1255fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450DeterminantMatrixNotSquare) {
1256fd4e5da5Sopenharmony_ci  const std::string body = R"(
1257fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Determinant %f32mat23_121212
1258fd4e5da5Sopenharmony_ci)";
1259fd4e5da5Sopenharmony_ci
1260fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1261fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1262fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1263fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 Determinant: "
1264fd4e5da5Sopenharmony_ci                        "expected operand X to be a square matrix"));
1265fd4e5da5Sopenharmony_ci}
1266fd4e5da5Sopenharmony_ci
1267fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450MatrixInverseSuccess) {
1268fd4e5da5Sopenharmony_ci  const std::string body = R"(
1269fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32mat22 %extinst MatrixInverse %f32mat22_1212
1270fd4e5da5Sopenharmony_ci)";
1271fd4e5da5Sopenharmony_ci
1272fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1273fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
1274fd4e5da5Sopenharmony_ci}
1275fd4e5da5Sopenharmony_ci
1276fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450MatrixInverseIncompatibleResultType) {
1277fd4e5da5Sopenharmony_ci  const std::string body = R"(
1278fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32mat33 %extinst MatrixInverse %f32mat22_1212
1279fd4e5da5Sopenharmony_ci)";
1280fd4e5da5Sopenharmony_ci
1281fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1282fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1283fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1284fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 MatrixInverse: "
1285fd4e5da5Sopenharmony_ci                        "expected operand X type to be equal to "
1286fd4e5da5Sopenharmony_ci                        "Result Type"));
1287fd4e5da5Sopenharmony_ci}
1288fd4e5da5Sopenharmony_ci
1289fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450MatrixInverseNotMatrix) {
1290fd4e5da5Sopenharmony_ci  const std::string body = R"(
1291fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst MatrixInverse %f32mat22_1212
1292fd4e5da5Sopenharmony_ci)";
1293fd4e5da5Sopenharmony_ci
1294fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1295fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1296fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1297fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 MatrixInverse: "
1298fd4e5da5Sopenharmony_ci                        "expected Result Type to be a square matrix"));
1299fd4e5da5Sopenharmony_ci}
1300fd4e5da5Sopenharmony_ci
1301fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450MatrixInverseMatrixNotSquare) {
1302fd4e5da5Sopenharmony_ci  const std::string body = R"(
1303fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32mat23 %extinst MatrixInverse %f32mat23_121212
1304fd4e5da5Sopenharmony_ci)";
1305fd4e5da5Sopenharmony_ci
1306fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1307fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1308fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1309fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 MatrixInverse: "
1310fd4e5da5Sopenharmony_ci                        "expected Result Type to be a square matrix"));
1311fd4e5da5Sopenharmony_ci}
1312fd4e5da5Sopenharmony_ci
1313fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450ModfSuccess) {
1314fd4e5da5Sopenharmony_ci  const std::string body = R"(
1315fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Modf %f32_h %f32_output
1316fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec2 %extinst Modf %f32vec2_01 %f32vec2_output
1317fd4e5da5Sopenharmony_ci)";
1318fd4e5da5Sopenharmony_ci
1319fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1320fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
1321fd4e5da5Sopenharmony_ci}
1322fd4e5da5Sopenharmony_ci
1323fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450ModfIntResultType) {
1324fd4e5da5Sopenharmony_ci  const std::string body = R"(
1325fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32 %extinst Modf %f32_h %f32_output
1326fd4e5da5Sopenharmony_ci)";
1327fd4e5da5Sopenharmony_ci
1328fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1329fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1330fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1331fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 Modf: "
1332fd4e5da5Sopenharmony_ci                        "expected Result Type to be a scalar or vector "
1333fd4e5da5Sopenharmony_ci                        "float type"));
1334fd4e5da5Sopenharmony_ci}
1335fd4e5da5Sopenharmony_ci
1336fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450ModfXNotOfResultType) {
1337fd4e5da5Sopenharmony_ci  const std::string body = R"(
1338fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Modf %f64_0 %f32_output
1339fd4e5da5Sopenharmony_ci)";
1340fd4e5da5Sopenharmony_ci
1341fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1342fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1343fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1344fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 Modf: "
1345fd4e5da5Sopenharmony_ci                        "expected operand X type to be equal to Result Type"));
1346fd4e5da5Sopenharmony_ci}
1347fd4e5da5Sopenharmony_ci
1348fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450ModfINotPointer) {
1349fd4e5da5Sopenharmony_ci  const std::string body = R"(
1350fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Modf %f32_h %f32_1
1351fd4e5da5Sopenharmony_ci)";
1352fd4e5da5Sopenharmony_ci
1353fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1354fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1355fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1356fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 Modf: "
1357fd4e5da5Sopenharmony_ci                        "expected operand I to be a pointer"));
1358fd4e5da5Sopenharmony_ci}
1359fd4e5da5Sopenharmony_ci
1360fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450ModfIDataNotOfResultType) {
1361fd4e5da5Sopenharmony_ci  const std::string body = R"(
1362fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Modf %f32_h %f32vec2_output
1363fd4e5da5Sopenharmony_ci)";
1364fd4e5da5Sopenharmony_ci
1365fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1366fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1367fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1368fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 Modf: "
1369fd4e5da5Sopenharmony_ci                        "expected operand I data type to be equal to "
1370fd4e5da5Sopenharmony_ci                        "Result Type"));
1371fd4e5da5Sopenharmony_ci}
1372fd4e5da5Sopenharmony_ci
1373fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450ModfStructSuccess) {
1374fd4e5da5Sopenharmony_ci  const std::string body = R"(
1375fd4e5da5Sopenharmony_ci%val1 = OpExtInst %struct_f32_f32 %extinst ModfStruct %f32_h
1376fd4e5da5Sopenharmony_ci%val2 = OpExtInst %struct_f32vec2_f32vec2 %extinst ModfStruct %f32vec2_01
1377fd4e5da5Sopenharmony_ci)";
1378fd4e5da5Sopenharmony_ci
1379fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1380fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
1381fd4e5da5Sopenharmony_ci}
1382fd4e5da5Sopenharmony_ci
1383fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450ModfStructResultTypeNotStruct) {
1384fd4e5da5Sopenharmony_ci  const std::string body = R"(
1385fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst ModfStruct %f32_h
1386fd4e5da5Sopenharmony_ci)";
1387fd4e5da5Sopenharmony_ci
1388fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1389fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1390fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1391fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 ModfStruct: "
1392fd4e5da5Sopenharmony_ci                        "expected Result Type to be a struct with two "
1393fd4e5da5Sopenharmony_ci                        "identical scalar or vector float type members"));
1394fd4e5da5Sopenharmony_ci}
1395fd4e5da5Sopenharmony_ci
1396fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450ModfStructResultTypeStructWrongSize) {
1397fd4e5da5Sopenharmony_ci  const std::string body = R"(
1398fd4e5da5Sopenharmony_ci%val1 = OpExtInst %struct_f32_f32_f32 %extinst ModfStruct %f32_h
1399fd4e5da5Sopenharmony_ci)";
1400fd4e5da5Sopenharmony_ci
1401fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1402fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1403fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1404fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 ModfStruct: "
1405fd4e5da5Sopenharmony_ci                        "expected Result Type to be a struct with two "
1406fd4e5da5Sopenharmony_ci                        "identical scalar or vector float type members"));
1407fd4e5da5Sopenharmony_ci}
1408fd4e5da5Sopenharmony_ci
1409fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450ModfStructResultTypeStructWrongFirstMember) {
1410fd4e5da5Sopenharmony_ci  const std::string body = R"(
1411fd4e5da5Sopenharmony_ci%val1 = OpExtInst %struct_u32_f32 %extinst ModfStruct %f32_h
1412fd4e5da5Sopenharmony_ci)";
1413fd4e5da5Sopenharmony_ci
1414fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1415fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1416fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1417fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 ModfStruct: "
1418fd4e5da5Sopenharmony_ci                        "expected Result Type to be a struct with two "
1419fd4e5da5Sopenharmony_ci                        "identical scalar or vector float type members"));
1420fd4e5da5Sopenharmony_ci}
1421fd4e5da5Sopenharmony_ci
1422fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450ModfStructResultTypeStructMembersNotEqual) {
1423fd4e5da5Sopenharmony_ci  const std::string body = R"(
1424fd4e5da5Sopenharmony_ci%val1 = OpExtInst %struct_f32_f64 %extinst ModfStruct %f32_h
1425fd4e5da5Sopenharmony_ci)";
1426fd4e5da5Sopenharmony_ci
1427fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1428fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1429fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1430fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 ModfStruct: "
1431fd4e5da5Sopenharmony_ci                        "expected Result Type to be a struct with two "
1432fd4e5da5Sopenharmony_ci                        "identical scalar or vector float type members"));
1433fd4e5da5Sopenharmony_ci}
1434fd4e5da5Sopenharmony_ci
1435fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450ModfStructXWrongType) {
1436fd4e5da5Sopenharmony_ci  const std::string body = R"(
1437fd4e5da5Sopenharmony_ci%val1 = OpExtInst %struct_f32_f32 %extinst ModfStruct %f64_0
1438fd4e5da5Sopenharmony_ci)";
1439fd4e5da5Sopenharmony_ci
1440fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1441fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1442fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1443fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 ModfStruct: "
1444fd4e5da5Sopenharmony_ci                        "expected operand X type to be equal to members of "
1445fd4e5da5Sopenharmony_ci                        "Result Type struct"));
1446fd4e5da5Sopenharmony_ci}
1447fd4e5da5Sopenharmony_ci
1448fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450FrexpSuccess) {
1449fd4e5da5Sopenharmony_ci  const std::string body = R"(
1450fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Frexp %f32_h %u32_output
1451fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec2 %extinst Frexp %f32vec2_01 %u32vec2_output
1452fd4e5da5Sopenharmony_ci)";
1453fd4e5da5Sopenharmony_ci
1454fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1455fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
1456fd4e5da5Sopenharmony_ci}
1457fd4e5da5Sopenharmony_ci
1458fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450FrexpIntResultType) {
1459fd4e5da5Sopenharmony_ci  const std::string body = R"(
1460fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32 %extinst Frexp %f32_h %u32_output
1461fd4e5da5Sopenharmony_ci)";
1462fd4e5da5Sopenharmony_ci
1463fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1464fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1465fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1466fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 Frexp: "
1467fd4e5da5Sopenharmony_ci                        "expected Result Type to be a scalar or vector "
1468fd4e5da5Sopenharmony_ci                        "float type"));
1469fd4e5da5Sopenharmony_ci}
1470fd4e5da5Sopenharmony_ci
1471fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450FrexpWrongXType) {
1472fd4e5da5Sopenharmony_ci  const std::string body = R"(
1473fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Frexp %u32_1 %u32_output
1474fd4e5da5Sopenharmony_ci)";
1475fd4e5da5Sopenharmony_ci
1476fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1477fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1478fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1479fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 Frexp: "
1480fd4e5da5Sopenharmony_ci                        "expected operand X type to be equal to Result Type"));
1481fd4e5da5Sopenharmony_ci}
1482fd4e5da5Sopenharmony_ci
1483fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450FrexpExpNotPointer) {
1484fd4e5da5Sopenharmony_ci  const std::string body = R"(
1485fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Frexp %f32_1 %u32_1
1486fd4e5da5Sopenharmony_ci)";
1487fd4e5da5Sopenharmony_ci
1488fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1489fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1490fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1491fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 Frexp: "
1492fd4e5da5Sopenharmony_ci                        "expected operand Exp to be a pointer"));
1493fd4e5da5Sopenharmony_ci}
1494fd4e5da5Sopenharmony_ci
1495fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450FrexpExpNotInt32Pointer) {
1496fd4e5da5Sopenharmony_ci  const std::string body = R"(
1497fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Frexp %f32_1 %f32_output
1498fd4e5da5Sopenharmony_ci)";
1499fd4e5da5Sopenharmony_ci
1500fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1501fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1502fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1503fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 Frexp: "
1504fd4e5da5Sopenharmony_ci                        "expected operand Exp data type to be a 32-bit int "
1505fd4e5da5Sopenharmony_ci                        "scalar or vector type"));
1506fd4e5da5Sopenharmony_ci}
1507fd4e5da5Sopenharmony_ci
1508fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450FrexpExpWrongComponentNumber) {
1509fd4e5da5Sopenharmony_ci  const std::string body = R"(
1510fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst Frexp %f32vec2_01 %u32_output
1511fd4e5da5Sopenharmony_ci)";
1512fd4e5da5Sopenharmony_ci
1513fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1514fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1515fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1516fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 Frexp: "
1517fd4e5da5Sopenharmony_ci                        "expected operand Exp data type to have the same "
1518fd4e5da5Sopenharmony_ci                        "component number as Result Type"));
1519fd4e5da5Sopenharmony_ci}
1520fd4e5da5Sopenharmony_ci
1521fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450LdexpSuccess) {
1522fd4e5da5Sopenharmony_ci  const std::string body = R"(
1523fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Ldexp %f32_h %u32_2
1524fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec2 %extinst Ldexp %f32vec2_01 %u32vec2_12
1525fd4e5da5Sopenharmony_ci%val3 = OpExtInst %f32 %extinst Ldexp %f32_h %u64_1
1526fd4e5da5Sopenharmony_ci)";
1527fd4e5da5Sopenharmony_ci
1528fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1529fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
1530fd4e5da5Sopenharmony_ci}
1531fd4e5da5Sopenharmony_ci
1532fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450LdexpIntResultType) {
1533fd4e5da5Sopenharmony_ci  const std::string body = R"(
1534fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32 %extinst Ldexp %f32_h %u32_2
1535fd4e5da5Sopenharmony_ci)";
1536fd4e5da5Sopenharmony_ci
1537fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1538fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1539fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1540fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 Ldexp: "
1541fd4e5da5Sopenharmony_ci                        "expected Result Type to be a scalar or vector "
1542fd4e5da5Sopenharmony_ci                        "float type"));
1543fd4e5da5Sopenharmony_ci}
1544fd4e5da5Sopenharmony_ci
1545fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450LdexpWrongXType) {
1546fd4e5da5Sopenharmony_ci  const std::string body = R"(
1547fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Ldexp %u32_1 %u32_2
1548fd4e5da5Sopenharmony_ci)";
1549fd4e5da5Sopenharmony_ci
1550fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1551fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1552fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1553fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 Ldexp: "
1554fd4e5da5Sopenharmony_ci                        "expected operand X type to be equal to Result Type"));
1555fd4e5da5Sopenharmony_ci}
1556fd4e5da5Sopenharmony_ci
1557fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450LdexpFloatExp) {
1558fd4e5da5Sopenharmony_ci  const std::string body = R"(
1559fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Ldexp %f32_1 %f32_2
1560fd4e5da5Sopenharmony_ci)";
1561fd4e5da5Sopenharmony_ci
1562fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1563fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1564fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1565fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 Ldexp: "
1566fd4e5da5Sopenharmony_ci                        "expected operand Exp to be a 32-bit int scalar "
1567fd4e5da5Sopenharmony_ci                        "or vector type"));
1568fd4e5da5Sopenharmony_ci}
1569fd4e5da5Sopenharmony_ci
1570fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450LdexpExpWrongSize) {
1571fd4e5da5Sopenharmony_ci  const std::string body = R"(
1572fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst Ldexp %f32vec2_12 %u32_2
1573fd4e5da5Sopenharmony_ci)";
1574fd4e5da5Sopenharmony_ci
1575fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1576fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1577fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1578fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 Ldexp: "
1579fd4e5da5Sopenharmony_ci                        "expected operand Exp to have the same component "
1580fd4e5da5Sopenharmony_ci                        "number as Result Type"));
1581fd4e5da5Sopenharmony_ci}
1582fd4e5da5Sopenharmony_ci
1583fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450LdexpExpNoType) {
1584fd4e5da5Sopenharmony_ci  const std::string body = R"(
1585fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Ldexp %f32_1 %main_entry
1586fd4e5da5Sopenharmony_ci)";
1587fd4e5da5Sopenharmony_ci
1588fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1589fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1590fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1591fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 Ldexp: "
1592fd4e5da5Sopenharmony_ci                        "expected operand Exp to be a 32-bit int scalar "
1593fd4e5da5Sopenharmony_ci                        "or vector type"));
1594fd4e5da5Sopenharmony_ci}
1595fd4e5da5Sopenharmony_ci
1596fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450FrexpStructSuccess) {
1597fd4e5da5Sopenharmony_ci  const std::string body = R"(
1598fd4e5da5Sopenharmony_ci%val1 = OpExtInst %struct_f32_u32 %extinst FrexpStruct %f32_h
1599fd4e5da5Sopenharmony_ci%val2 = OpExtInst %struct_f32vec2_u32vec2 %extinst FrexpStruct %f32vec2_01
1600fd4e5da5Sopenharmony_ci)";
1601fd4e5da5Sopenharmony_ci
1602fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1603fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
1604fd4e5da5Sopenharmony_ci}
1605fd4e5da5Sopenharmony_ci
1606fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450FrexpStructResultTypeNotStruct) {
1607fd4e5da5Sopenharmony_ci  const std::string body = R"(
1608fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst FrexpStruct %f32_h
1609fd4e5da5Sopenharmony_ci)";
1610fd4e5da5Sopenharmony_ci
1611fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1612fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1613fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1614fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 FrexpStruct: "
1615fd4e5da5Sopenharmony_ci                        "expected Result Type to be a struct with two members, "
1616fd4e5da5Sopenharmony_ci                        "first member a float scalar or vector, second member "
1617fd4e5da5Sopenharmony_ci                        "a 32-bit int scalar or vector with the same number of "
1618fd4e5da5Sopenharmony_ci                        "components as the first member"));
1619fd4e5da5Sopenharmony_ci}
1620fd4e5da5Sopenharmony_ci
1621fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450FrexpStructResultTypeStructWrongSize) {
1622fd4e5da5Sopenharmony_ci  const std::string body = R"(
1623fd4e5da5Sopenharmony_ci%val1 = OpExtInst %struct_f32_u32_f32 %extinst FrexpStruct %f32_h
1624fd4e5da5Sopenharmony_ci)";
1625fd4e5da5Sopenharmony_ci
1626fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1627fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1628fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1629fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 FrexpStruct: "
1630fd4e5da5Sopenharmony_ci                        "expected Result Type to be a struct with two members, "
1631fd4e5da5Sopenharmony_ci                        "first member a float scalar or vector, second member "
1632fd4e5da5Sopenharmony_ci                        "a 32-bit int scalar or vector with the same number of "
1633fd4e5da5Sopenharmony_ci                        "components as the first member"));
1634fd4e5da5Sopenharmony_ci}
1635fd4e5da5Sopenharmony_ci
1636fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450FrexpStructResultTypeStructWrongMember1) {
1637fd4e5da5Sopenharmony_ci  const std::string body = R"(
1638fd4e5da5Sopenharmony_ci%val1 = OpExtInst %struct_u32_u32 %extinst FrexpStruct %f32_h
1639fd4e5da5Sopenharmony_ci)";
1640fd4e5da5Sopenharmony_ci
1641fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1642fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1643fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1644fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 FrexpStruct: "
1645fd4e5da5Sopenharmony_ci                        "expected Result Type to be a struct with two members, "
1646fd4e5da5Sopenharmony_ci                        "first member a float scalar or vector, second member "
1647fd4e5da5Sopenharmony_ci                        "a 32-bit int scalar or vector with the same number of "
1648fd4e5da5Sopenharmony_ci                        "components as the first member"));
1649fd4e5da5Sopenharmony_ci}
1650fd4e5da5Sopenharmony_ci
1651fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450FrexpStructResultTypeStructWrongMember2) {
1652fd4e5da5Sopenharmony_ci  const std::string body = R"(
1653fd4e5da5Sopenharmony_ci%val1 = OpExtInst %struct_f32_f32 %extinst FrexpStruct %f32_h
1654fd4e5da5Sopenharmony_ci)";
1655fd4e5da5Sopenharmony_ci
1656fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1657fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1658fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1659fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 FrexpStruct: "
1660fd4e5da5Sopenharmony_ci                        "expected Result Type to be a struct with two members, "
1661fd4e5da5Sopenharmony_ci                        "first member a float scalar or vector, second member "
1662fd4e5da5Sopenharmony_ci                        "a 32-bit int scalar or vector with the same number of "
1663fd4e5da5Sopenharmony_ci                        "components as the first member"));
1664fd4e5da5Sopenharmony_ci}
1665fd4e5da5Sopenharmony_ci
1666fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450FrexpStructXWrongType) {
1667fd4e5da5Sopenharmony_ci  const std::string body = R"(
1668fd4e5da5Sopenharmony_ci%val1 = OpExtInst %struct_f32_u32 %extinst FrexpStruct %f64_0
1669fd4e5da5Sopenharmony_ci)";
1670fd4e5da5Sopenharmony_ci
1671fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1672fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1673fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1674fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 FrexpStruct: "
1675fd4e5da5Sopenharmony_ci                        "expected operand X type to be equal to the first "
1676fd4e5da5Sopenharmony_ci                        "member of Result Type struct"));
1677fd4e5da5Sopenharmony_ci}
1678fd4e5da5Sopenharmony_ci
1679fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst,
1680fd4e5da5Sopenharmony_ci       GlslStd450FrexpStructResultTypeStructRightInt16Member2) {
1681fd4e5da5Sopenharmony_ci  const std::string body = R"(
1682fd4e5da5Sopenharmony_ci%val1 = OpExtInst %struct_f16_u16 %extinst FrexpStruct %f16_h
1683fd4e5da5Sopenharmony_ci)";
1684fd4e5da5Sopenharmony_ci
1685fd4e5da5Sopenharmony_ci  const std::string extension = R"(
1686fd4e5da5Sopenharmony_ciOpExtension  "SPV_AMD_gpu_shader_int16"
1687fd4e5da5Sopenharmony_ci)";
1688fd4e5da5Sopenharmony_ci
1689fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body, extension));
1690fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
1691fd4e5da5Sopenharmony_ci}
1692fd4e5da5Sopenharmony_ci
1693fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst,
1694fd4e5da5Sopenharmony_ci       GlslStd450FrexpStructResultTypeStructWrongInt16Member2) {
1695fd4e5da5Sopenharmony_ci  const std::string body = R"(
1696fd4e5da5Sopenharmony_ci%val1 = OpExtInst %struct_f16_u16 %extinst FrexpStruct %f16_h
1697fd4e5da5Sopenharmony_ci)";
1698fd4e5da5Sopenharmony_ci
1699fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1700fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1701fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1702fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 FrexpStruct: "
1703fd4e5da5Sopenharmony_ci                        "expected Result Type to be a struct with two members, "
1704fd4e5da5Sopenharmony_ci                        "first member a float scalar or vector, second member "
1705fd4e5da5Sopenharmony_ci                        "a 32-bit int scalar or vector with the same number of "
1706fd4e5da5Sopenharmony_ci                        "components as the first member"));
1707fd4e5da5Sopenharmony_ci}
1708fd4e5da5Sopenharmony_ci
1709fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450Pack, Success) {
1710fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
1711fd4e5da5Sopenharmony_ci  const uint32_t num_components = GetPackedNumComponents(ext_inst_name);
1712fd4e5da5Sopenharmony_ci  const uint32_t packed_bit_width = GetPackedBitWidth(ext_inst_name);
1713fd4e5da5Sopenharmony_ci  const uint32_t total_bit_width = num_components * packed_bit_width;
1714fd4e5da5Sopenharmony_ci  const std::string vec_str =
1715fd4e5da5Sopenharmony_ci      num_components == 2 ? " %f32vec2_01\n" : " %f32vec4_0123\n";
1716fd4e5da5Sopenharmony_ci
1717fd4e5da5Sopenharmony_ci  std::ostringstream body;
1718fd4e5da5Sopenharmony_ci  body << "%val1 = OpExtInst %u" << total_bit_width << " %extinst "
1719fd4e5da5Sopenharmony_ci       << ext_inst_name << vec_str;
1720fd4e5da5Sopenharmony_ci  body << "%val2 = OpExtInst %s" << total_bit_width << " %extinst "
1721fd4e5da5Sopenharmony_ci       << ext_inst_name << vec_str;
1722fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body.str()));
1723fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
1724fd4e5da5Sopenharmony_ci}
1725fd4e5da5Sopenharmony_ci
1726fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450Pack, Float32ResultType) {
1727fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
1728fd4e5da5Sopenharmony_ci  const uint32_t num_components = GetPackedNumComponents(ext_inst_name);
1729fd4e5da5Sopenharmony_ci  const uint32_t packed_bit_width = GetPackedBitWidth(ext_inst_name);
1730fd4e5da5Sopenharmony_ci  const uint32_t total_bit_width = num_components * packed_bit_width;
1731fd4e5da5Sopenharmony_ci  const std::string vec_str =
1732fd4e5da5Sopenharmony_ci      num_components == 2 ? " %f32vec2_01\n" : " %f32vec4_0123\n";
1733fd4e5da5Sopenharmony_ci
1734fd4e5da5Sopenharmony_ci  std::ostringstream body;
1735fd4e5da5Sopenharmony_ci  body << "%val1 = OpExtInst %f" << total_bit_width << " %extinst "
1736fd4e5da5Sopenharmony_ci       << ext_inst_name << vec_str;
1737fd4e5da5Sopenharmony_ci
1738fd4e5da5Sopenharmony_ci  std::ostringstream expected;
1739fd4e5da5Sopenharmony_ci  expected << "GLSL.std.450 " << ext_inst_name
1740fd4e5da5Sopenharmony_ci           << ": expected Result Type to be " << total_bit_width
1741fd4e5da5Sopenharmony_ci           << "-bit int scalar type";
1742fd4e5da5Sopenharmony_ci
1743fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body.str()));
1744fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1745fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(), HasSubstr(expected.str()));
1746fd4e5da5Sopenharmony_ci}
1747fd4e5da5Sopenharmony_ci
1748fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450Pack, Int16ResultType) {
1749fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
1750fd4e5da5Sopenharmony_ci  const uint32_t num_components = GetPackedNumComponents(ext_inst_name);
1751fd4e5da5Sopenharmony_ci  const uint32_t packed_bit_width = GetPackedBitWidth(ext_inst_name);
1752fd4e5da5Sopenharmony_ci  const uint32_t total_bit_width = num_components * packed_bit_width;
1753fd4e5da5Sopenharmony_ci  const std::string vec_str =
1754fd4e5da5Sopenharmony_ci      num_components == 2 ? " %f32vec2_01\n" : " %f32vec4_0123\n";
1755fd4e5da5Sopenharmony_ci
1756fd4e5da5Sopenharmony_ci  std::ostringstream body;
1757fd4e5da5Sopenharmony_ci  body << "%val1 = OpExtInst %u16 %extinst " << ext_inst_name << vec_str;
1758fd4e5da5Sopenharmony_ci
1759fd4e5da5Sopenharmony_ci  std::ostringstream expected;
1760fd4e5da5Sopenharmony_ci  expected << "GLSL.std.450 " << ext_inst_name
1761fd4e5da5Sopenharmony_ci           << ": expected Result Type to be " << total_bit_width
1762fd4e5da5Sopenharmony_ci           << "-bit int scalar type";
1763fd4e5da5Sopenharmony_ci
1764fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body.str()));
1765fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1766fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(), HasSubstr(expected.str()));
1767fd4e5da5Sopenharmony_ci}
1768fd4e5da5Sopenharmony_ci
1769fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450Pack, VNotVector) {
1770fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
1771fd4e5da5Sopenharmony_ci  const uint32_t num_components = GetPackedNumComponents(ext_inst_name);
1772fd4e5da5Sopenharmony_ci  const uint32_t packed_bit_width = GetPackedBitWidth(ext_inst_name);
1773fd4e5da5Sopenharmony_ci  const uint32_t total_bit_width = num_components * packed_bit_width;
1774fd4e5da5Sopenharmony_ci
1775fd4e5da5Sopenharmony_ci  std::ostringstream body;
1776fd4e5da5Sopenharmony_ci  body << "%val1 = OpExtInst %u" << total_bit_width << " %extinst "
1777fd4e5da5Sopenharmony_ci       << ext_inst_name << " %f32_1\n";
1778fd4e5da5Sopenharmony_ci
1779fd4e5da5Sopenharmony_ci  std::ostringstream expected;
1780fd4e5da5Sopenharmony_ci  expected << "GLSL.std.450 " << ext_inst_name
1781fd4e5da5Sopenharmony_ci           << ": expected operand V to be a 32-bit float vector of size "
1782fd4e5da5Sopenharmony_ci           << num_components;
1783fd4e5da5Sopenharmony_ci
1784fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body.str()));
1785fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1786fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(), HasSubstr(expected.str()));
1787fd4e5da5Sopenharmony_ci}
1788fd4e5da5Sopenharmony_ci
1789fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450Pack, VNotFloatVector) {
1790fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
1791fd4e5da5Sopenharmony_ci  const uint32_t num_components = GetPackedNumComponents(ext_inst_name);
1792fd4e5da5Sopenharmony_ci  const uint32_t packed_bit_width = GetPackedBitWidth(ext_inst_name);
1793fd4e5da5Sopenharmony_ci  const uint32_t total_bit_width = num_components * packed_bit_width;
1794fd4e5da5Sopenharmony_ci  const std::string vec_str =
1795fd4e5da5Sopenharmony_ci      num_components == 2 ? " %u32vec2_01\n" : " %u32vec4_0123\n";
1796fd4e5da5Sopenharmony_ci
1797fd4e5da5Sopenharmony_ci  std::ostringstream body;
1798fd4e5da5Sopenharmony_ci  body << "%val1 = OpExtInst %u" << total_bit_width << " %extinst "
1799fd4e5da5Sopenharmony_ci       << ext_inst_name << vec_str;
1800fd4e5da5Sopenharmony_ci
1801fd4e5da5Sopenharmony_ci  std::ostringstream expected;
1802fd4e5da5Sopenharmony_ci  expected << "GLSL.std.450 " << ext_inst_name
1803fd4e5da5Sopenharmony_ci           << ": expected operand V to be a 32-bit float vector of size "
1804fd4e5da5Sopenharmony_ci           << num_components;
1805fd4e5da5Sopenharmony_ci
1806fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body.str()));
1807fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1808fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(), HasSubstr(expected.str()));
1809fd4e5da5Sopenharmony_ci}
1810fd4e5da5Sopenharmony_ci
1811fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450Pack, VNotFloat32Vector) {
1812fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
1813fd4e5da5Sopenharmony_ci  const uint32_t num_components = GetPackedNumComponents(ext_inst_name);
1814fd4e5da5Sopenharmony_ci  const uint32_t packed_bit_width = GetPackedBitWidth(ext_inst_name);
1815fd4e5da5Sopenharmony_ci  const uint32_t total_bit_width = num_components * packed_bit_width;
1816fd4e5da5Sopenharmony_ci  const std::string vec_str =
1817fd4e5da5Sopenharmony_ci      num_components == 2 ? " %f64vec2_01\n" : " %f64vec4_0123\n";
1818fd4e5da5Sopenharmony_ci
1819fd4e5da5Sopenharmony_ci  std::ostringstream body;
1820fd4e5da5Sopenharmony_ci  body << "%val1 = OpExtInst %u" << total_bit_width << " %extinst "
1821fd4e5da5Sopenharmony_ci       << ext_inst_name << vec_str;
1822fd4e5da5Sopenharmony_ci
1823fd4e5da5Sopenharmony_ci  std::ostringstream expected;
1824fd4e5da5Sopenharmony_ci  expected << "GLSL.std.450 " << ext_inst_name
1825fd4e5da5Sopenharmony_ci           << ": expected operand V to be a 32-bit float vector of size "
1826fd4e5da5Sopenharmony_ci           << num_components;
1827fd4e5da5Sopenharmony_ci
1828fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body.str()));
1829fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1830fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(), HasSubstr(expected.str()));
1831fd4e5da5Sopenharmony_ci}
1832fd4e5da5Sopenharmony_ci
1833fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450Pack, VWrongSizeVector) {
1834fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
1835fd4e5da5Sopenharmony_ci  const uint32_t num_components = GetPackedNumComponents(ext_inst_name);
1836fd4e5da5Sopenharmony_ci  const uint32_t packed_bit_width = GetPackedBitWidth(ext_inst_name);
1837fd4e5da5Sopenharmony_ci  const uint32_t total_bit_width = num_components * packed_bit_width;
1838fd4e5da5Sopenharmony_ci  const std::string vec_str =
1839fd4e5da5Sopenharmony_ci      num_components == 4 ? " %f32vec2_01\n" : " %f32vec4_0123\n";
1840fd4e5da5Sopenharmony_ci
1841fd4e5da5Sopenharmony_ci  std::ostringstream body;
1842fd4e5da5Sopenharmony_ci  body << "%val1 = OpExtInst %u" << total_bit_width << " %extinst "
1843fd4e5da5Sopenharmony_ci       << ext_inst_name << vec_str;
1844fd4e5da5Sopenharmony_ci
1845fd4e5da5Sopenharmony_ci  std::ostringstream expected;
1846fd4e5da5Sopenharmony_ci  expected << "GLSL.std.450 " << ext_inst_name
1847fd4e5da5Sopenharmony_ci           << ": expected operand V to be a 32-bit float vector of size "
1848fd4e5da5Sopenharmony_ci           << num_components;
1849fd4e5da5Sopenharmony_ci
1850fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body.str()));
1851fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1852fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(), HasSubstr(expected.str()));
1853fd4e5da5Sopenharmony_ci}
1854fd4e5da5Sopenharmony_ci
1855fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllPack, ValidateGlslStd450Pack,
1856fd4e5da5Sopenharmony_ci                         ::testing::ValuesIn(std::vector<std::string>{
1857fd4e5da5Sopenharmony_ci                             "PackSnorm4x8",
1858fd4e5da5Sopenharmony_ci                             "PackUnorm4x8",
1859fd4e5da5Sopenharmony_ci                             "PackSnorm2x16",
1860fd4e5da5Sopenharmony_ci                             "PackUnorm2x16",
1861fd4e5da5Sopenharmony_ci                             "PackHalf2x16",
1862fd4e5da5Sopenharmony_ci                         }));
1863fd4e5da5Sopenharmony_ci
1864fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, PackDouble2x32Success) {
1865fd4e5da5Sopenharmony_ci  const std::string body = R"(
1866fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f64 %extinst PackDouble2x32 %u32vec2_01
1867fd4e5da5Sopenharmony_ci)";
1868fd4e5da5Sopenharmony_ci
1869fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1870fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
1871fd4e5da5Sopenharmony_ci}
1872fd4e5da5Sopenharmony_ci
1873fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, PackDouble2x32Float32ResultType) {
1874fd4e5da5Sopenharmony_ci  const std::string body = R"(
1875fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst PackDouble2x32 %u32vec2_01
1876fd4e5da5Sopenharmony_ci)";
1877fd4e5da5Sopenharmony_ci
1878fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1879fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1880fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1881fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 PackDouble2x32: expected Result Type to "
1882fd4e5da5Sopenharmony_ci                        "be 64-bit float scalar type"));
1883fd4e5da5Sopenharmony_ci}
1884fd4e5da5Sopenharmony_ci
1885fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, PackDouble2x32Int64ResultType) {
1886fd4e5da5Sopenharmony_ci  const std::string body = R"(
1887fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u64 %extinst PackDouble2x32 %u32vec2_01
1888fd4e5da5Sopenharmony_ci)";
1889fd4e5da5Sopenharmony_ci
1890fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1891fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1892fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1893fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 PackDouble2x32: expected Result Type to "
1894fd4e5da5Sopenharmony_ci                        "be 64-bit float scalar type"));
1895fd4e5da5Sopenharmony_ci}
1896fd4e5da5Sopenharmony_ci
1897fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, PackDouble2x32VNotVector) {
1898fd4e5da5Sopenharmony_ci  const std::string body = R"(
1899fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f64 %extinst PackDouble2x32 %u64_1
1900fd4e5da5Sopenharmony_ci)";
1901fd4e5da5Sopenharmony_ci
1902fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1903fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1904fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1905fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 PackDouble2x32: expected operand V to be "
1906fd4e5da5Sopenharmony_ci                        "a 32-bit int vector of size 2"));
1907fd4e5da5Sopenharmony_ci}
1908fd4e5da5Sopenharmony_ci
1909fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, PackDouble2x32VNotIntVector) {
1910fd4e5da5Sopenharmony_ci  const std::string body = R"(
1911fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f64 %extinst PackDouble2x32 %f32vec2_01
1912fd4e5da5Sopenharmony_ci)";
1913fd4e5da5Sopenharmony_ci
1914fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1915fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1916fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1917fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 PackDouble2x32: expected operand V to be "
1918fd4e5da5Sopenharmony_ci                        "a 32-bit int vector of size 2"));
1919fd4e5da5Sopenharmony_ci}
1920fd4e5da5Sopenharmony_ci
1921fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, PackDouble2x32VNotInt32Vector) {
1922fd4e5da5Sopenharmony_ci  const std::string body = R"(
1923fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f64 %extinst PackDouble2x32 %u64vec2_01
1924fd4e5da5Sopenharmony_ci)";
1925fd4e5da5Sopenharmony_ci
1926fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1927fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1928fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1929fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 PackDouble2x32: expected operand V to be "
1930fd4e5da5Sopenharmony_ci                        "a 32-bit int vector of size 2"));
1931fd4e5da5Sopenharmony_ci}
1932fd4e5da5Sopenharmony_ci
1933fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, PackDouble2x32VWrongSize) {
1934fd4e5da5Sopenharmony_ci  const std::string body = R"(
1935fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f64 %extinst PackDouble2x32 %u32vec4_0123
1936fd4e5da5Sopenharmony_ci)";
1937fd4e5da5Sopenharmony_ci
1938fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
1939fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1940fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
1941fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 PackDouble2x32: expected operand V to be "
1942fd4e5da5Sopenharmony_ci                        "a 32-bit int vector of size 2"));
1943fd4e5da5Sopenharmony_ci}
1944fd4e5da5Sopenharmony_ci
1945fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450Unpack, Success) {
1946fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
1947fd4e5da5Sopenharmony_ci  const uint32_t num_components = GetPackedNumComponents(ext_inst_name);
1948fd4e5da5Sopenharmony_ci  const uint32_t packed_bit_width = GetPackedBitWidth(ext_inst_name);
1949fd4e5da5Sopenharmony_ci  const uint32_t total_bit_width = num_components * packed_bit_width;
1950fd4e5da5Sopenharmony_ci  const std::string result_type_str =
1951fd4e5da5Sopenharmony_ci      num_components == 2 ? "%f32vec2" : " %f32vec4";
1952fd4e5da5Sopenharmony_ci
1953fd4e5da5Sopenharmony_ci  std::ostringstream body;
1954fd4e5da5Sopenharmony_ci  body << "%val1 = OpExtInst " << result_type_str << " %extinst "
1955fd4e5da5Sopenharmony_ci       << ext_inst_name << " %u" << total_bit_width << "_1\n";
1956fd4e5da5Sopenharmony_ci  body << "%val2 = OpExtInst " << result_type_str << " %extinst "
1957fd4e5da5Sopenharmony_ci       << ext_inst_name << " %s" << total_bit_width << "_1\n";
1958fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body.str()));
1959fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
1960fd4e5da5Sopenharmony_ci}
1961fd4e5da5Sopenharmony_ci
1962fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450Unpack, ResultTypeNotVector) {
1963fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
1964fd4e5da5Sopenharmony_ci  const uint32_t num_components = GetPackedNumComponents(ext_inst_name);
1965fd4e5da5Sopenharmony_ci  const uint32_t packed_bit_width = GetPackedBitWidth(ext_inst_name);
1966fd4e5da5Sopenharmony_ci  const uint32_t total_bit_width = num_components * packed_bit_width;
1967fd4e5da5Sopenharmony_ci  const std::string result_type_str = "%f32";
1968fd4e5da5Sopenharmony_ci
1969fd4e5da5Sopenharmony_ci  std::ostringstream body;
1970fd4e5da5Sopenharmony_ci  body << "%val1 = OpExtInst " << result_type_str << " %extinst "
1971fd4e5da5Sopenharmony_ci       << ext_inst_name << " %u" << total_bit_width << "_1\n";
1972fd4e5da5Sopenharmony_ci
1973fd4e5da5Sopenharmony_ci  std::ostringstream expected;
1974fd4e5da5Sopenharmony_ci  expected << "GLSL.std.450 " << ext_inst_name
1975fd4e5da5Sopenharmony_ci           << ": expected Result Type to be a 32-bit float vector of size "
1976fd4e5da5Sopenharmony_ci           << num_components;
1977fd4e5da5Sopenharmony_ci
1978fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body.str()));
1979fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
1980fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(), HasSubstr(expected.str()));
1981fd4e5da5Sopenharmony_ci}
1982fd4e5da5Sopenharmony_ci
1983fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450Unpack, ResultTypeNotFloatVector) {
1984fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
1985fd4e5da5Sopenharmony_ci  const uint32_t num_components = GetPackedNumComponents(ext_inst_name);
1986fd4e5da5Sopenharmony_ci  const uint32_t packed_bit_width = GetPackedBitWidth(ext_inst_name);
1987fd4e5da5Sopenharmony_ci  const uint32_t total_bit_width = num_components * packed_bit_width;
1988fd4e5da5Sopenharmony_ci  const std::string result_type_str =
1989fd4e5da5Sopenharmony_ci      num_components == 2 ? "%u32vec2" : " %u32vec4";
1990fd4e5da5Sopenharmony_ci
1991fd4e5da5Sopenharmony_ci  std::ostringstream body;
1992fd4e5da5Sopenharmony_ci  body << "%val1 = OpExtInst " << result_type_str << " %extinst "
1993fd4e5da5Sopenharmony_ci       << ext_inst_name << " %u" << total_bit_width << "_1\n";
1994fd4e5da5Sopenharmony_ci
1995fd4e5da5Sopenharmony_ci  std::ostringstream expected;
1996fd4e5da5Sopenharmony_ci  expected << "GLSL.std.450 " << ext_inst_name
1997fd4e5da5Sopenharmony_ci           << ": expected Result Type to be a 32-bit float vector of size "
1998fd4e5da5Sopenharmony_ci           << num_components;
1999fd4e5da5Sopenharmony_ci
2000fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body.str()));
2001fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2002fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(), HasSubstr(expected.str()));
2003fd4e5da5Sopenharmony_ci}
2004fd4e5da5Sopenharmony_ci
2005fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450Unpack, ResultTypeNotFloat32Vector) {
2006fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
2007fd4e5da5Sopenharmony_ci  const uint32_t num_components = GetPackedNumComponents(ext_inst_name);
2008fd4e5da5Sopenharmony_ci  const uint32_t packed_bit_width = GetPackedBitWidth(ext_inst_name);
2009fd4e5da5Sopenharmony_ci  const uint32_t total_bit_width = num_components * packed_bit_width;
2010fd4e5da5Sopenharmony_ci  const std::string result_type_str =
2011fd4e5da5Sopenharmony_ci      num_components == 2 ? "%f64vec2" : " %f64vec4";
2012fd4e5da5Sopenharmony_ci
2013fd4e5da5Sopenharmony_ci  std::ostringstream body;
2014fd4e5da5Sopenharmony_ci  body << "%val1 = OpExtInst " << result_type_str << " %extinst "
2015fd4e5da5Sopenharmony_ci       << ext_inst_name << " %u" << total_bit_width << "_1\n";
2016fd4e5da5Sopenharmony_ci
2017fd4e5da5Sopenharmony_ci  std::ostringstream expected;
2018fd4e5da5Sopenharmony_ci  expected << "GLSL.std.450 " << ext_inst_name
2019fd4e5da5Sopenharmony_ci           << ": expected Result Type to be a 32-bit float vector of size "
2020fd4e5da5Sopenharmony_ci           << num_components;
2021fd4e5da5Sopenharmony_ci
2022fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body.str()));
2023fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2024fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(), HasSubstr(expected.str()));
2025fd4e5da5Sopenharmony_ci}
2026fd4e5da5Sopenharmony_ci
2027fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450Unpack, ResultTypeWrongSize) {
2028fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
2029fd4e5da5Sopenharmony_ci  const uint32_t num_components = GetPackedNumComponents(ext_inst_name);
2030fd4e5da5Sopenharmony_ci  const uint32_t packed_bit_width = GetPackedBitWidth(ext_inst_name);
2031fd4e5da5Sopenharmony_ci  const uint32_t total_bit_width = num_components * packed_bit_width;
2032fd4e5da5Sopenharmony_ci  const std::string result_type_str =
2033fd4e5da5Sopenharmony_ci      num_components == 4 ? "%f32vec2" : " %f32vec4";
2034fd4e5da5Sopenharmony_ci
2035fd4e5da5Sopenharmony_ci  std::ostringstream body;
2036fd4e5da5Sopenharmony_ci  body << "%val1 = OpExtInst " << result_type_str << " %extinst "
2037fd4e5da5Sopenharmony_ci       << ext_inst_name << " %u" << total_bit_width << "_1\n";
2038fd4e5da5Sopenharmony_ci
2039fd4e5da5Sopenharmony_ci  std::ostringstream expected;
2040fd4e5da5Sopenharmony_ci  expected << "GLSL.std.450 " << ext_inst_name
2041fd4e5da5Sopenharmony_ci           << ": expected Result Type to be a 32-bit float vector of size "
2042fd4e5da5Sopenharmony_ci           << num_components;
2043fd4e5da5Sopenharmony_ci
2044fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body.str()));
2045fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2046fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(), HasSubstr(expected.str()));
2047fd4e5da5Sopenharmony_ci}
2048fd4e5da5Sopenharmony_ci
2049fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450Unpack, ResultPNotInt) {
2050fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
2051fd4e5da5Sopenharmony_ci  const uint32_t num_components = GetPackedNumComponents(ext_inst_name);
2052fd4e5da5Sopenharmony_ci  const uint32_t packed_bit_width = GetPackedBitWidth(ext_inst_name);
2053fd4e5da5Sopenharmony_ci  const uint32_t total_bit_width = num_components * packed_bit_width;
2054fd4e5da5Sopenharmony_ci  const std::string result_type_str =
2055fd4e5da5Sopenharmony_ci      num_components == 2 ? "%f32vec2" : " %f32vec4";
2056fd4e5da5Sopenharmony_ci
2057fd4e5da5Sopenharmony_ci  std::ostringstream body;
2058fd4e5da5Sopenharmony_ci  body << "%val1 = OpExtInst " << result_type_str << " %extinst "
2059fd4e5da5Sopenharmony_ci       << ext_inst_name << " %f" << total_bit_width << "_1\n";
2060fd4e5da5Sopenharmony_ci
2061fd4e5da5Sopenharmony_ci  std::ostringstream expected;
2062fd4e5da5Sopenharmony_ci  expected << "GLSL.std.450 " << ext_inst_name
2063fd4e5da5Sopenharmony_ci           << ": expected operand P to be a " << total_bit_width
2064fd4e5da5Sopenharmony_ci           << "-bit int scalar";
2065fd4e5da5Sopenharmony_ci
2066fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body.str()));
2067fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2068fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(), HasSubstr(expected.str()));
2069fd4e5da5Sopenharmony_ci}
2070fd4e5da5Sopenharmony_ci
2071fd4e5da5Sopenharmony_ciTEST_P(ValidateGlslStd450Unpack, ResultPWrongBitWidth) {
2072fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
2073fd4e5da5Sopenharmony_ci  const uint32_t num_components = GetPackedNumComponents(ext_inst_name);
2074fd4e5da5Sopenharmony_ci  const uint32_t packed_bit_width = GetPackedBitWidth(ext_inst_name);
2075fd4e5da5Sopenharmony_ci  const uint32_t total_bit_width = num_components * packed_bit_width;
2076fd4e5da5Sopenharmony_ci  const uint32_t wrong_bit_width = total_bit_width == 32 ? 64 : 32;
2077fd4e5da5Sopenharmony_ci  const std::string result_type_str =
2078fd4e5da5Sopenharmony_ci      num_components == 2 ? "%f32vec2" : " %f32vec4";
2079fd4e5da5Sopenharmony_ci
2080fd4e5da5Sopenharmony_ci  std::ostringstream body;
2081fd4e5da5Sopenharmony_ci  body << "%val1 = OpExtInst " << result_type_str << " %extinst "
2082fd4e5da5Sopenharmony_ci       << ext_inst_name << " %u" << wrong_bit_width << "_1\n";
2083fd4e5da5Sopenharmony_ci
2084fd4e5da5Sopenharmony_ci  std::ostringstream expected;
2085fd4e5da5Sopenharmony_ci  expected << "GLSL.std.450 " << ext_inst_name
2086fd4e5da5Sopenharmony_ci           << ": expected operand P to be a " << total_bit_width
2087fd4e5da5Sopenharmony_ci           << "-bit int scalar";
2088fd4e5da5Sopenharmony_ci
2089fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body.str()));
2090fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2091fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(), HasSubstr(expected.str()));
2092fd4e5da5Sopenharmony_ci}
2093fd4e5da5Sopenharmony_ci
2094fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllUnpack, ValidateGlslStd450Unpack,
2095fd4e5da5Sopenharmony_ci                         ::testing::ValuesIn(std::vector<std::string>{
2096fd4e5da5Sopenharmony_ci                             "UnpackSnorm4x8",
2097fd4e5da5Sopenharmony_ci                             "UnpackUnorm4x8",
2098fd4e5da5Sopenharmony_ci                             "UnpackSnorm2x16",
2099fd4e5da5Sopenharmony_ci                             "UnpackUnorm2x16",
2100fd4e5da5Sopenharmony_ci                             "UnpackHalf2x16",
2101fd4e5da5Sopenharmony_ci                         }));
2102fd4e5da5Sopenharmony_ci
2103fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, UnpackDouble2x32Success) {
2104fd4e5da5Sopenharmony_ci  const std::string body = R"(
2105fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32vec2 %extinst UnpackDouble2x32 %f64_1
2106fd4e5da5Sopenharmony_ci)";
2107fd4e5da5Sopenharmony_ci
2108fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
2109fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
2110fd4e5da5Sopenharmony_ci}
2111fd4e5da5Sopenharmony_ci
2112fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, UnpackDouble2x32ResultTypeNotVector) {
2113fd4e5da5Sopenharmony_ci  const std::string body = R"(
2114fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u64 %extinst UnpackDouble2x32 %f64_1
2115fd4e5da5Sopenharmony_ci)";
2116fd4e5da5Sopenharmony_ci
2117fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
2118fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2119fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2120fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 UnpackDouble2x32: expected Result Type "
2121fd4e5da5Sopenharmony_ci                        "to be a 32-bit int vector of size 2"));
2122fd4e5da5Sopenharmony_ci}
2123fd4e5da5Sopenharmony_ci
2124fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, UnpackDouble2x32ResultTypeNotIntVector) {
2125fd4e5da5Sopenharmony_ci  const std::string body = R"(
2126fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst UnpackDouble2x32 %f64_1
2127fd4e5da5Sopenharmony_ci)";
2128fd4e5da5Sopenharmony_ci
2129fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
2130fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2131fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2132fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 UnpackDouble2x32: expected Result Type "
2133fd4e5da5Sopenharmony_ci                        "to be a 32-bit int vector of size 2"));
2134fd4e5da5Sopenharmony_ci}
2135fd4e5da5Sopenharmony_ci
2136fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, UnpackDouble2x32ResultTypeNotInt32Vector) {
2137fd4e5da5Sopenharmony_ci  const std::string body = R"(
2138fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u64vec2 %extinst UnpackDouble2x32 %f64_1
2139fd4e5da5Sopenharmony_ci)";
2140fd4e5da5Sopenharmony_ci
2141fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
2142fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2143fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2144fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 UnpackDouble2x32: expected Result Type "
2145fd4e5da5Sopenharmony_ci                        "to be a 32-bit int vector of size 2"));
2146fd4e5da5Sopenharmony_ci}
2147fd4e5da5Sopenharmony_ci
2148fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, UnpackDouble2x32ResultTypeWrongSize) {
2149fd4e5da5Sopenharmony_ci  const std::string body = R"(
2150fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32vec4 %extinst UnpackDouble2x32 %f64_1
2151fd4e5da5Sopenharmony_ci)";
2152fd4e5da5Sopenharmony_ci
2153fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
2154fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2155fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2156fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 UnpackDouble2x32: expected Result Type "
2157fd4e5da5Sopenharmony_ci                        "to be a 32-bit int vector of size 2"));
2158fd4e5da5Sopenharmony_ci}
2159fd4e5da5Sopenharmony_ci
2160fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, UnpackDouble2x32VNotFloat) {
2161fd4e5da5Sopenharmony_ci  const std::string body = R"(
2162fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32vec2 %extinst UnpackDouble2x32 %u64_1
2163fd4e5da5Sopenharmony_ci)";
2164fd4e5da5Sopenharmony_ci
2165fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
2166fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2167fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2168fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 UnpackDouble2x32: expected operand V to "
2169fd4e5da5Sopenharmony_ci                        "be a 64-bit float scalar"));
2170fd4e5da5Sopenharmony_ci}
2171fd4e5da5Sopenharmony_ci
2172fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, UnpackDouble2x32VNotFloat64) {
2173fd4e5da5Sopenharmony_ci  const std::string body = R"(
2174fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32vec2 %extinst UnpackDouble2x32 %f32_1
2175fd4e5da5Sopenharmony_ci)";
2176fd4e5da5Sopenharmony_ci
2177fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
2178fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2179fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2180fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 UnpackDouble2x32: expected operand V to "
2181fd4e5da5Sopenharmony_ci                        "be a 64-bit float scalar"));
2182fd4e5da5Sopenharmony_ci}
2183fd4e5da5Sopenharmony_ci
2184fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450LengthSuccess) {
2185fd4e5da5Sopenharmony_ci  const std::string body = R"(
2186fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Length %f32_1
2187fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32 %extinst Length %f32vec2_01
2188fd4e5da5Sopenharmony_ci%val3 = OpExtInst %f32 %extinst Length %f32vec4_0123
2189fd4e5da5Sopenharmony_ci)";
2190fd4e5da5Sopenharmony_ci
2191fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
2192fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
2193fd4e5da5Sopenharmony_ci}
2194fd4e5da5Sopenharmony_ci
2195fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450LengthIntResultType) {
2196fd4e5da5Sopenharmony_ci  const std::string body = R"(
2197fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32 %extinst Length %f32vec2_01
2198fd4e5da5Sopenharmony_ci)";
2199fd4e5da5Sopenharmony_ci
2200fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
2201fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2202fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2203fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 Length: "
2204fd4e5da5Sopenharmony_ci                        "expected Result Type to be a float scalar type"));
2205fd4e5da5Sopenharmony_ci}
2206fd4e5da5Sopenharmony_ci
2207fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450LengthIntX) {
2208fd4e5da5Sopenharmony_ci  const std::string body = R"(
2209fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Length %u32vec2_01
2210fd4e5da5Sopenharmony_ci)";
2211fd4e5da5Sopenharmony_ci
2212fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
2213fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2214fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2215fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 Length: "
2216fd4e5da5Sopenharmony_ci                        "expected operand X to be of float scalar or "
2217fd4e5da5Sopenharmony_ci                        "vector type"));
2218fd4e5da5Sopenharmony_ci}
2219fd4e5da5Sopenharmony_ci
2220fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450LengthDifferentType) {
2221fd4e5da5Sopenharmony_ci  const std::string body = R"(
2222fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f64 %extinst Length %f32vec2_01
2223fd4e5da5Sopenharmony_ci)";
2224fd4e5da5Sopenharmony_ci
2225fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
2226fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2227fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2228fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 Length: "
2229fd4e5da5Sopenharmony_ci                        "expected operand X component type to be equal to "
2230fd4e5da5Sopenharmony_ci                        "Result Type"));
2231fd4e5da5Sopenharmony_ci}
2232fd4e5da5Sopenharmony_ci
2233fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450DistanceSuccess) {
2234fd4e5da5Sopenharmony_ci  const std::string body = R"(
2235fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Distance %f32_0 %f32_1
2236fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32 %extinst Distance %f32vec2_01 %f32vec2_12
2237fd4e5da5Sopenharmony_ci%val3 = OpExtInst %f32 %extinst Distance %f32vec4_0123 %f32vec4_1234
2238fd4e5da5Sopenharmony_ci)";
2239fd4e5da5Sopenharmony_ci
2240fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
2241fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
2242fd4e5da5Sopenharmony_ci}
2243fd4e5da5Sopenharmony_ci
2244fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450DistanceIntResultType) {
2245fd4e5da5Sopenharmony_ci  const std::string body = R"(
2246fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32 %extinst Distance %f32vec2_01 %f32vec2_12
2247fd4e5da5Sopenharmony_ci)";
2248fd4e5da5Sopenharmony_ci
2249fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
2250fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2251fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2252fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 Distance: "
2253fd4e5da5Sopenharmony_ci                        "expected Result Type to be a float scalar type"));
2254fd4e5da5Sopenharmony_ci}
2255fd4e5da5Sopenharmony_ci
2256fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450DistanceIntP0) {
2257fd4e5da5Sopenharmony_ci  const std::string body = R"(
2258fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Distance %u32_0 %f32_1
2259fd4e5da5Sopenharmony_ci)";
2260fd4e5da5Sopenharmony_ci
2261fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
2262fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2263fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2264fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 Distance: "
2265fd4e5da5Sopenharmony_ci                        "expected operand P0 to be of float scalar or "
2266fd4e5da5Sopenharmony_ci                        "vector type"));
2267fd4e5da5Sopenharmony_ci}
2268fd4e5da5Sopenharmony_ci
2269fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450DistanceF64VectorP0) {
2270fd4e5da5Sopenharmony_ci  const std::string body = R"(
2271fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Distance %f64vec2_01 %f32vec2_12
2272fd4e5da5Sopenharmony_ci)";
2273fd4e5da5Sopenharmony_ci
2274fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
2275fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2276fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2277fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 Distance: "
2278fd4e5da5Sopenharmony_ci                        "expected operand P0 component type to be equal to "
2279fd4e5da5Sopenharmony_ci                        "Result Type"));
2280fd4e5da5Sopenharmony_ci}
2281fd4e5da5Sopenharmony_ci
2282fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450DistanceIntP1) {
2283fd4e5da5Sopenharmony_ci  const std::string body = R"(
2284fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Distance %f32_0 %u32_1
2285fd4e5da5Sopenharmony_ci)";
2286fd4e5da5Sopenharmony_ci
2287fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
2288fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2289fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2290fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 Distance: "
2291fd4e5da5Sopenharmony_ci                        "expected operand P1 to be of float scalar or "
2292fd4e5da5Sopenharmony_ci                        "vector type"));
2293fd4e5da5Sopenharmony_ci}
2294fd4e5da5Sopenharmony_ci
2295fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450DistanceF64VectorP1) {
2296fd4e5da5Sopenharmony_ci  const std::string body = R"(
2297fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Distance %f32vec2_12 %f64vec2_01
2298fd4e5da5Sopenharmony_ci)";
2299fd4e5da5Sopenharmony_ci
2300fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
2301fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2302fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2303fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 Distance: "
2304fd4e5da5Sopenharmony_ci                        "expected operand P1 component type to be equal to "
2305fd4e5da5Sopenharmony_ci                        "Result Type"));
2306fd4e5da5Sopenharmony_ci}
2307fd4e5da5Sopenharmony_ci
2308fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450DistanceDifferentSize) {
2309fd4e5da5Sopenharmony_ci  const std::string body = R"(
2310fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Distance %f32vec2_01 %f32vec4_0123
2311fd4e5da5Sopenharmony_ci)";
2312fd4e5da5Sopenharmony_ci
2313fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
2314fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2315fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2316fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 Distance: "
2317fd4e5da5Sopenharmony_ci                        "expected operands P0 and P1 to have the same number "
2318fd4e5da5Sopenharmony_ci                        "of components"));
2319fd4e5da5Sopenharmony_ci}
2320fd4e5da5Sopenharmony_ci
2321fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450CrossSuccess) {
2322fd4e5da5Sopenharmony_ci  const std::string body = R"(
2323fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec3 %extinst Cross %f32vec3_012 %f32vec3_123
2324fd4e5da5Sopenharmony_ci)";
2325fd4e5da5Sopenharmony_ci
2326fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
2327fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
2328fd4e5da5Sopenharmony_ci}
2329fd4e5da5Sopenharmony_ci
2330fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450CrossIntVectorResultType) {
2331fd4e5da5Sopenharmony_ci  const std::string body = R"(
2332fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32vec3 %extinst Cross %f32vec3_012 %f32vec3_123
2333fd4e5da5Sopenharmony_ci)";
2334fd4e5da5Sopenharmony_ci
2335fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
2336fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2337fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2338fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 Cross: "
2339fd4e5da5Sopenharmony_ci                        "expected Result Type to be a float vector type"));
2340fd4e5da5Sopenharmony_ci}
2341fd4e5da5Sopenharmony_ci
2342fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450CrossResultTypeWrongSize) {
2343fd4e5da5Sopenharmony_ci  const std::string body = R"(
2344fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst Cross %f32vec3_012 %f32vec3_123
2345fd4e5da5Sopenharmony_ci)";
2346fd4e5da5Sopenharmony_ci
2347fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
2348fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2349fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2350fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 Cross: "
2351fd4e5da5Sopenharmony_ci                        "expected Result Type to have 3 components"));
2352fd4e5da5Sopenharmony_ci}
2353fd4e5da5Sopenharmony_ci
2354fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450CrossXWrongType) {
2355fd4e5da5Sopenharmony_ci  const std::string body = R"(
2356fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec3 %extinst Cross %f64vec3_012 %f32vec3_123
2357fd4e5da5Sopenharmony_ci)";
2358fd4e5da5Sopenharmony_ci
2359fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
2360fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2361fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2362fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 Cross: "
2363fd4e5da5Sopenharmony_ci                        "expected operand X type to be equal to Result Type"));
2364fd4e5da5Sopenharmony_ci}
2365fd4e5da5Sopenharmony_ci
2366fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450CrossYWrongType) {
2367fd4e5da5Sopenharmony_ci  const std::string body = R"(
2368fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec3 %extinst Cross %f32vec3_123 %f64vec3_012
2369fd4e5da5Sopenharmony_ci)";
2370fd4e5da5Sopenharmony_ci
2371fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
2372fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2373fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2374fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 Cross: "
2375fd4e5da5Sopenharmony_ci                        "expected operand Y type to be equal to Result Type"));
2376fd4e5da5Sopenharmony_ci}
2377fd4e5da5Sopenharmony_ci
2378fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450RefractSuccess) {
2379fd4e5da5Sopenharmony_ci  const std::string body = R"(
2380fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst Refract %f32_1 %f32_1 %f32_1
2381fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec2 %extinst Refract %f32vec2_01 %f32vec2_01 %f16_1
2382fd4e5da5Sopenharmony_ci)";
2383fd4e5da5Sopenharmony_ci
2384fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
2385fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
2386fd4e5da5Sopenharmony_ci}
2387fd4e5da5Sopenharmony_ci
2388fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450RefractIntVectorResultType) {
2389fd4e5da5Sopenharmony_ci  const std::string body = R"(
2390fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32vec2 %extinst Refract %f32vec2_01 %f32vec2_01 %f32_1
2391fd4e5da5Sopenharmony_ci)";
2392fd4e5da5Sopenharmony_ci
2393fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
2394fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2395fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2396fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 Refract: "
2397fd4e5da5Sopenharmony_ci                        "expected Result Type to be a float scalar or "
2398fd4e5da5Sopenharmony_ci                        "vector type"));
2399fd4e5da5Sopenharmony_ci}
2400fd4e5da5Sopenharmony_ci
2401fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450RefractIntVectorI) {
2402fd4e5da5Sopenharmony_ci  const std::string body = R"(
2403fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst Refract %u32vec2_01 %f32vec2_01 %f32_1
2404fd4e5da5Sopenharmony_ci)";
2405fd4e5da5Sopenharmony_ci
2406fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
2407fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2408fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2409fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 Refract: "
2410fd4e5da5Sopenharmony_ci                        "expected operand I to be of type equal to "
2411fd4e5da5Sopenharmony_ci                        "Result Type"));
2412fd4e5da5Sopenharmony_ci}
2413fd4e5da5Sopenharmony_ci
2414fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450RefractIntVectorN) {
2415fd4e5da5Sopenharmony_ci  const std::string body = R"(
2416fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst Refract %f32vec2_01 %u32vec2_01 %f32_1
2417fd4e5da5Sopenharmony_ci)";
2418fd4e5da5Sopenharmony_ci
2419fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
2420fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2421fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2422fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 Refract: "
2423fd4e5da5Sopenharmony_ci                        "expected operand N to be of type equal to "
2424fd4e5da5Sopenharmony_ci                        "Result Type"));
2425fd4e5da5Sopenharmony_ci}
2426fd4e5da5Sopenharmony_ci
2427fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450RefractIntEta) {
2428fd4e5da5Sopenharmony_ci  const std::string body = R"(
2429fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst Refract %f32vec2_01 %f32vec2_01 %u32_1
2430fd4e5da5Sopenharmony_ci)";
2431fd4e5da5Sopenharmony_ci
2432fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
2433fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2434fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2435fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 Refract: "
2436fd4e5da5Sopenharmony_ci                        "expected operand Eta to be a float scalar"));
2437fd4e5da5Sopenharmony_ci}
2438fd4e5da5Sopenharmony_ci
2439fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450RefractFloat64Eta) {
2440fd4e5da5Sopenharmony_ci  // SPIR-V issue 337: Eta can be 64-bit float scalar.
2441fd4e5da5Sopenharmony_ci  const std::string body = R"(
2442fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst Refract %f32vec2_01 %f32vec2_01 %f64_1
2443fd4e5da5Sopenharmony_ci)";
2444fd4e5da5Sopenharmony_ci
2445fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
2446fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
2447fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(), Eq(""));
2448fd4e5da5Sopenharmony_ci}
2449fd4e5da5Sopenharmony_ci
2450fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450RefractVectorEta) {
2451fd4e5da5Sopenharmony_ci  const std::string body = R"(
2452fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst Refract %f32vec2_01 %f32vec2_01 %f32vec2_01
2453fd4e5da5Sopenharmony_ci)";
2454fd4e5da5Sopenharmony_ci
2455fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
2456fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2457fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2458fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 Refract: "
2459fd4e5da5Sopenharmony_ci                        "expected operand Eta to be a float scalar"));
2460fd4e5da5Sopenharmony_ci}
2461fd4e5da5Sopenharmony_ci
2462fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtCentroidSuccess) {
2463fd4e5da5Sopenharmony_ci  const std::string body = R"(
2464fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtCentroid %f32_input
2465fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec2 %extinst InterpolateAtCentroid %f32vec2_input
2466fd4e5da5Sopenharmony_ci)";
2467fd4e5da5Sopenharmony_ci
2468fd4e5da5Sopenharmony_ci  CompileSuccessfully(
2469fd4e5da5Sopenharmony_ci      GenerateShaderCode(body, "OpCapability InterpolationFunction\n"));
2470fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
2471fd4e5da5Sopenharmony_ci}
2472fd4e5da5Sopenharmony_ci
2473fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtCentroidInternalSuccess) {
2474fd4e5da5Sopenharmony_ci  const std::string body = R"(
2475fd4e5da5Sopenharmony_ci%ld1  = OpLoad %f32 %f32_input
2476fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtCentroid %ld1
2477fd4e5da5Sopenharmony_ci%ld2  = OpLoad %f32vec2 %f32vec2_input
2478fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec2 %extinst InterpolateAtCentroid %ld2
2479fd4e5da5Sopenharmony_ci)";
2480fd4e5da5Sopenharmony_ci
2481fd4e5da5Sopenharmony_ci  CompileSuccessfully(
2482fd4e5da5Sopenharmony_ci      GenerateShaderCode(body, "OpCapability InterpolationFunction\n"));
2483fd4e5da5Sopenharmony_ci  getValidatorOptions()->before_hlsl_legalization = true;
2484fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
2485fd4e5da5Sopenharmony_ci}
2486fd4e5da5Sopenharmony_ci
2487fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtCentroidInternalInvalidDataF32) {
2488fd4e5da5Sopenharmony_ci  const std::string body = R"(
2489fd4e5da5Sopenharmony_ci%ld1  = OpLoad %f32 %f32_input
2490fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtCentroid %ld1
2491fd4e5da5Sopenharmony_ci)";
2492fd4e5da5Sopenharmony_ci
2493fd4e5da5Sopenharmony_ci  CompileSuccessfully(
2494fd4e5da5Sopenharmony_ci      GenerateShaderCode(body, "OpCapability InterpolationFunction\n"));
2495fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2496fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2497fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 InterpolateAtCentroid: "
2498fd4e5da5Sopenharmony_ci                        "expected Interpolant to be a pointer"));
2499fd4e5da5Sopenharmony_ci}
2500fd4e5da5Sopenharmony_ci
2501fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst,
2502fd4e5da5Sopenharmony_ci       GlslStd450InterpolateAtCentroidInternalInvalidDataF32Vec2) {
2503fd4e5da5Sopenharmony_ci  const std::string body = R"(
2504fd4e5da5Sopenharmony_ci%ld2  = OpLoad %f32vec2 %f32vec2_input
2505fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec2 %extinst InterpolateAtCentroid %ld2
2506fd4e5da5Sopenharmony_ci)";
2507fd4e5da5Sopenharmony_ci
2508fd4e5da5Sopenharmony_ci  CompileSuccessfully(
2509fd4e5da5Sopenharmony_ci      GenerateShaderCode(body, "OpCapability InterpolationFunction\n"));
2510fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2511fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2512fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 InterpolateAtCentroid: "
2513fd4e5da5Sopenharmony_ci                        "expected Interpolant to be a pointer"));
2514fd4e5da5Sopenharmony_ci}
2515fd4e5da5Sopenharmony_ci
2516fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtCentroidNoCapability) {
2517fd4e5da5Sopenharmony_ci  const std::string body = R"(
2518fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtCentroid %f32_input
2519fd4e5da5Sopenharmony_ci)";
2520fd4e5da5Sopenharmony_ci
2521fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
2522fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_CAPABILITY, ValidateInstructions());
2523fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2524fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 InterpolateAtCentroid requires "
2525fd4e5da5Sopenharmony_ci                        "capability InterpolationFunction"));
2526fd4e5da5Sopenharmony_ci}
2527fd4e5da5Sopenharmony_ci
2528fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtCentroidIntResultType) {
2529fd4e5da5Sopenharmony_ci  const std::string body = R"(
2530fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32 %extinst InterpolateAtCentroid %f32_input
2531fd4e5da5Sopenharmony_ci)";
2532fd4e5da5Sopenharmony_ci
2533fd4e5da5Sopenharmony_ci  CompileSuccessfully(
2534fd4e5da5Sopenharmony_ci      GenerateShaderCode(body, "OpCapability InterpolationFunction\n"));
2535fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2536fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2537fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 InterpolateAtCentroid: "
2538fd4e5da5Sopenharmony_ci                        "expected Result Type to be a 32-bit float scalar "
2539fd4e5da5Sopenharmony_ci                        "or vector type"));
2540fd4e5da5Sopenharmony_ci}
2541fd4e5da5Sopenharmony_ci
2542fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtCentroidF64ResultType) {
2543fd4e5da5Sopenharmony_ci  const std::string body = R"(
2544fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f64 %extinst InterpolateAtCentroid %f32_input
2545fd4e5da5Sopenharmony_ci)";
2546fd4e5da5Sopenharmony_ci
2547fd4e5da5Sopenharmony_ci  CompileSuccessfully(
2548fd4e5da5Sopenharmony_ci      GenerateShaderCode(body, "OpCapability InterpolationFunction\n"));
2549fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2550fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2551fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 InterpolateAtCentroid: "
2552fd4e5da5Sopenharmony_ci                        "expected Result Type to be a 32-bit float scalar "
2553fd4e5da5Sopenharmony_ci                        "or vector type"));
2554fd4e5da5Sopenharmony_ci}
2555fd4e5da5Sopenharmony_ci
2556fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtCentroidNotPointer) {
2557fd4e5da5Sopenharmony_ci  const std::string body = R"(
2558fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtCentroid %f32_1
2559fd4e5da5Sopenharmony_ci)";
2560fd4e5da5Sopenharmony_ci
2561fd4e5da5Sopenharmony_ci  CompileSuccessfully(
2562fd4e5da5Sopenharmony_ci      GenerateShaderCode(body, "OpCapability InterpolationFunction\n"));
2563fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2564fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2565fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 InterpolateAtCentroid: "
2566fd4e5da5Sopenharmony_ci                        "expected Interpolant to be a pointer"));
2567fd4e5da5Sopenharmony_ci}
2568fd4e5da5Sopenharmony_ci
2569fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtCentroidWrongDataType) {
2570fd4e5da5Sopenharmony_ci  const std::string body = R"(
2571fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtCentroid %f32vec2_input
2572fd4e5da5Sopenharmony_ci)";
2573fd4e5da5Sopenharmony_ci
2574fd4e5da5Sopenharmony_ci  CompileSuccessfully(
2575fd4e5da5Sopenharmony_ci      GenerateShaderCode(body, "OpCapability InterpolationFunction\n"));
2576fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2577fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2578fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 InterpolateAtCentroid: "
2579fd4e5da5Sopenharmony_ci                        "expected Interpolant data type to be equal to "
2580fd4e5da5Sopenharmony_ci                        "Result Type"));
2581fd4e5da5Sopenharmony_ci}
2582fd4e5da5Sopenharmony_ci
2583fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtCentroidWrongStorageClass) {
2584fd4e5da5Sopenharmony_ci  const std::string body = R"(
2585fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtCentroid %f32_output
2586fd4e5da5Sopenharmony_ci)";
2587fd4e5da5Sopenharmony_ci
2588fd4e5da5Sopenharmony_ci  CompileSuccessfully(
2589fd4e5da5Sopenharmony_ci      GenerateShaderCode(body, "OpCapability InterpolationFunction\n"));
2590fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2591fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2592fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 InterpolateAtCentroid: "
2593fd4e5da5Sopenharmony_ci                        "expected Interpolant storage class to be Input"));
2594fd4e5da5Sopenharmony_ci}
2595fd4e5da5Sopenharmony_ci
2596fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtCentroidWrongExecutionModel) {
2597fd4e5da5Sopenharmony_ci  const std::string body = R"(
2598fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtCentroid %f32_input
2599fd4e5da5Sopenharmony_ci)";
2600fd4e5da5Sopenharmony_ci
2601fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(
2602fd4e5da5Sopenharmony_ci      body, "OpCapability InterpolationFunction\n", "Vertex"));
2603fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
2604fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2605fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 InterpolateAtCentroid requires "
2606fd4e5da5Sopenharmony_ci                        "Fragment execution model"));
2607fd4e5da5Sopenharmony_ci}
2608fd4e5da5Sopenharmony_ci
2609fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtSampleSuccess) {
2610fd4e5da5Sopenharmony_ci  const std::string body = R"(
2611fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtSample %f32_input %u32_1
2612fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec2 %extinst InterpolateAtSample %f32vec2_input %u32_1
2613fd4e5da5Sopenharmony_ci)";
2614fd4e5da5Sopenharmony_ci
2615fd4e5da5Sopenharmony_ci  CompileSuccessfully(
2616fd4e5da5Sopenharmony_ci      GenerateShaderCode(body, "OpCapability InterpolationFunction\n"));
2617fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
2618fd4e5da5Sopenharmony_ci}
2619fd4e5da5Sopenharmony_ci
2620fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtSampleInternalSuccess) {
2621fd4e5da5Sopenharmony_ci  const std::string body = R"(
2622fd4e5da5Sopenharmony_ci%ld1  = OpLoad %f32 %f32_input
2623fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtSample %ld1 %u32_1
2624fd4e5da5Sopenharmony_ci%ld2  = OpLoad %f32vec2 %f32vec2_input
2625fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec2 %extinst InterpolateAtSample %ld2 %u32_1
2626fd4e5da5Sopenharmony_ci)";
2627fd4e5da5Sopenharmony_ci
2628fd4e5da5Sopenharmony_ci  CompileSuccessfully(
2629fd4e5da5Sopenharmony_ci      GenerateShaderCode(body, "OpCapability InterpolationFunction\n"));
2630fd4e5da5Sopenharmony_ci  getValidatorOptions()->before_hlsl_legalization = true;
2631fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
2632fd4e5da5Sopenharmony_ci}
2633fd4e5da5Sopenharmony_ci
2634fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtSampleInternalInvalidDataF32) {
2635fd4e5da5Sopenharmony_ci  const std::string body = R"(
2636fd4e5da5Sopenharmony_ci%ld1  = OpLoad %f32 %f32_input
2637fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtSample %ld1 %u32_1
2638fd4e5da5Sopenharmony_ci)";
2639fd4e5da5Sopenharmony_ci
2640fd4e5da5Sopenharmony_ci  CompileSuccessfully(
2641fd4e5da5Sopenharmony_ci      GenerateShaderCode(body, "OpCapability InterpolationFunction\n"));
2642fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2643fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2644fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 InterpolateAtSample: "
2645fd4e5da5Sopenharmony_ci                        "expected Interpolant to be a pointer"));
2646fd4e5da5Sopenharmony_ci}
2647fd4e5da5Sopenharmony_ci
2648fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst,
2649fd4e5da5Sopenharmony_ci       GlslStd450InterpolateAtSampleInternalInvalidDataF32Vec2) {
2650fd4e5da5Sopenharmony_ci  const std::string body = R"(
2651fd4e5da5Sopenharmony_ci%ld2  = OpLoad %f32vec2 %f32vec2_input
2652fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec2 %extinst InterpolateAtSample %ld2 %u32_1
2653fd4e5da5Sopenharmony_ci)";
2654fd4e5da5Sopenharmony_ci
2655fd4e5da5Sopenharmony_ci  CompileSuccessfully(
2656fd4e5da5Sopenharmony_ci      GenerateShaderCode(body, "OpCapability InterpolationFunction\n"));
2657fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2658fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2659fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 InterpolateAtSample: "
2660fd4e5da5Sopenharmony_ci                        "expected Interpolant to be a pointer"));
2661fd4e5da5Sopenharmony_ci}
2662fd4e5da5Sopenharmony_ci
2663fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtSampleNoCapability) {
2664fd4e5da5Sopenharmony_ci  const std::string body = R"(
2665fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtSample %f32_input %u32_1
2666fd4e5da5Sopenharmony_ci)";
2667fd4e5da5Sopenharmony_ci
2668fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
2669fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_CAPABILITY, ValidateInstructions());
2670fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2671fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 InterpolateAtSample requires "
2672fd4e5da5Sopenharmony_ci                        "capability InterpolationFunction"));
2673fd4e5da5Sopenharmony_ci}
2674fd4e5da5Sopenharmony_ci
2675fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtSampleIntResultType) {
2676fd4e5da5Sopenharmony_ci  const std::string body = R"(
2677fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32 %extinst InterpolateAtSample %f32_input %u32_1
2678fd4e5da5Sopenharmony_ci)";
2679fd4e5da5Sopenharmony_ci
2680fd4e5da5Sopenharmony_ci  CompileSuccessfully(
2681fd4e5da5Sopenharmony_ci      GenerateShaderCode(body, "OpCapability InterpolationFunction\n"));
2682fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2683fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2684fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 InterpolateAtSample: "
2685fd4e5da5Sopenharmony_ci                        "expected Result Type to be a 32-bit float scalar "
2686fd4e5da5Sopenharmony_ci                        "or vector type"));
2687fd4e5da5Sopenharmony_ci}
2688fd4e5da5Sopenharmony_ci
2689fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtSampleF64ResultType) {
2690fd4e5da5Sopenharmony_ci  const std::string body = R"(
2691fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f64 %extinst InterpolateAtSample %f32_input %u32_1
2692fd4e5da5Sopenharmony_ci)";
2693fd4e5da5Sopenharmony_ci
2694fd4e5da5Sopenharmony_ci  CompileSuccessfully(
2695fd4e5da5Sopenharmony_ci      GenerateShaderCode(body, "OpCapability InterpolationFunction\n"));
2696fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2697fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2698fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 InterpolateAtSample: "
2699fd4e5da5Sopenharmony_ci                        "expected Result Type to be a 32-bit float scalar "
2700fd4e5da5Sopenharmony_ci                        "or vector type"));
2701fd4e5da5Sopenharmony_ci}
2702fd4e5da5Sopenharmony_ci
2703fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtSampleNotPointer) {
2704fd4e5da5Sopenharmony_ci  const std::string body = R"(
2705fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtSample %f32_1 %u32_1
2706fd4e5da5Sopenharmony_ci)";
2707fd4e5da5Sopenharmony_ci
2708fd4e5da5Sopenharmony_ci  CompileSuccessfully(
2709fd4e5da5Sopenharmony_ci      GenerateShaderCode(body, "OpCapability InterpolationFunction\n"));
2710fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2711fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2712fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 InterpolateAtSample: "
2713fd4e5da5Sopenharmony_ci                        "expected Interpolant to be a pointer"));
2714fd4e5da5Sopenharmony_ci}
2715fd4e5da5Sopenharmony_ci
2716fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtSampleWrongDataType) {
2717fd4e5da5Sopenharmony_ci  const std::string body = R"(
2718fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtSample %f32vec2_input %u32_1
2719fd4e5da5Sopenharmony_ci)";
2720fd4e5da5Sopenharmony_ci
2721fd4e5da5Sopenharmony_ci  CompileSuccessfully(
2722fd4e5da5Sopenharmony_ci      GenerateShaderCode(body, "OpCapability InterpolationFunction\n"));
2723fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2724fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2725fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 InterpolateAtSample: "
2726fd4e5da5Sopenharmony_ci                        "expected Interpolant data type to be equal to "
2727fd4e5da5Sopenharmony_ci                        "Result Type"));
2728fd4e5da5Sopenharmony_ci}
2729fd4e5da5Sopenharmony_ci
2730fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtSampleWrongStorageClass) {
2731fd4e5da5Sopenharmony_ci  const std::string body = R"(
2732fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtSample %f32_output %u32_1
2733fd4e5da5Sopenharmony_ci)";
2734fd4e5da5Sopenharmony_ci
2735fd4e5da5Sopenharmony_ci  CompileSuccessfully(
2736fd4e5da5Sopenharmony_ci      GenerateShaderCode(body, "OpCapability InterpolationFunction\n"));
2737fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2738fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2739fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 InterpolateAtSample: "
2740fd4e5da5Sopenharmony_ci                        "expected Interpolant storage class to be Input"));
2741fd4e5da5Sopenharmony_ci}
2742fd4e5da5Sopenharmony_ci
2743fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtSampleFloatSample) {
2744fd4e5da5Sopenharmony_ci  const std::string body = R"(
2745fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtSample %f32_input %f32_1
2746fd4e5da5Sopenharmony_ci)";
2747fd4e5da5Sopenharmony_ci
2748fd4e5da5Sopenharmony_ci  CompileSuccessfully(
2749fd4e5da5Sopenharmony_ci      GenerateShaderCode(body, "OpCapability InterpolationFunction\n"));
2750fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2751fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2752fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 InterpolateAtSample: "
2753fd4e5da5Sopenharmony_ci                        "expected Sample to be 32-bit integer"));
2754fd4e5da5Sopenharmony_ci}
2755fd4e5da5Sopenharmony_ci
2756fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtSampleU64Sample) {
2757fd4e5da5Sopenharmony_ci  const std::string body = R"(
2758fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtSample %f32_input %u64_1
2759fd4e5da5Sopenharmony_ci)";
2760fd4e5da5Sopenharmony_ci
2761fd4e5da5Sopenharmony_ci  CompileSuccessfully(
2762fd4e5da5Sopenharmony_ci      GenerateShaderCode(body, "OpCapability InterpolationFunction\n"));
2763fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2764fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2765fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 InterpolateAtSample: "
2766fd4e5da5Sopenharmony_ci                        "expected Sample to be 32-bit integer"));
2767fd4e5da5Sopenharmony_ci}
2768fd4e5da5Sopenharmony_ci
2769fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtSampleWrongExecutionModel) {
2770fd4e5da5Sopenharmony_ci  const std::string body = R"(
2771fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtSample %f32_input %u32_1
2772fd4e5da5Sopenharmony_ci)";
2773fd4e5da5Sopenharmony_ci
2774fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(
2775fd4e5da5Sopenharmony_ci      body, "OpCapability InterpolationFunction\n", "Vertex"));
2776fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
2777fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2778fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 InterpolateAtSample requires "
2779fd4e5da5Sopenharmony_ci                        "Fragment execution model"));
2780fd4e5da5Sopenharmony_ci}
2781fd4e5da5Sopenharmony_ci
2782fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtOffsetSuccess) {
2783fd4e5da5Sopenharmony_ci  const std::string body = R"(
2784fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtOffset %f32_input %f32vec2_01
2785fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec2 %extinst InterpolateAtOffset %f32vec2_input %f32vec2_01
2786fd4e5da5Sopenharmony_ci)";
2787fd4e5da5Sopenharmony_ci
2788fd4e5da5Sopenharmony_ci  CompileSuccessfully(
2789fd4e5da5Sopenharmony_ci      GenerateShaderCode(body, "OpCapability InterpolationFunction\n"));
2790fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
2791fd4e5da5Sopenharmony_ci}
2792fd4e5da5Sopenharmony_ci
2793fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtOffsetInternalSuccess) {
2794fd4e5da5Sopenharmony_ci  const std::string body = R"(
2795fd4e5da5Sopenharmony_ci%ld1  = OpLoad %f32 %f32_input
2796fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtOffset %ld1 %f32vec2_01
2797fd4e5da5Sopenharmony_ci%ld2  = OpLoad %f32vec2 %f32vec2_input
2798fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec2 %extinst InterpolateAtOffset %ld2 %f32vec2_01
2799fd4e5da5Sopenharmony_ci)";
2800fd4e5da5Sopenharmony_ci
2801fd4e5da5Sopenharmony_ci  CompileSuccessfully(
2802fd4e5da5Sopenharmony_ci      GenerateShaderCode(body, "OpCapability InterpolationFunction\n"));
2803fd4e5da5Sopenharmony_ci  getValidatorOptions()->before_hlsl_legalization = true;
2804fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
2805fd4e5da5Sopenharmony_ci}
2806fd4e5da5Sopenharmony_ci
2807fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtOffsetInternalInvalidDataF32) {
2808fd4e5da5Sopenharmony_ci  const std::string body = R"(
2809fd4e5da5Sopenharmony_ci%ld1  = OpLoad %f32 %f32_input
2810fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtOffset %ld1 %f32vec2_01
2811fd4e5da5Sopenharmony_ci)";
2812fd4e5da5Sopenharmony_ci
2813fd4e5da5Sopenharmony_ci  CompileSuccessfully(
2814fd4e5da5Sopenharmony_ci      GenerateShaderCode(body, "OpCapability InterpolationFunction\n"));
2815fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2816fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2817fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 InterpolateAtOffset: "
2818fd4e5da5Sopenharmony_ci                        "expected Interpolant to be a pointer"));
2819fd4e5da5Sopenharmony_ci}
2820fd4e5da5Sopenharmony_ci
2821fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst,
2822fd4e5da5Sopenharmony_ci       GlslStd450InterpolateAtOffsetInternalInvalidDataF32Vec2) {
2823fd4e5da5Sopenharmony_ci  const std::string body = R"(
2824fd4e5da5Sopenharmony_ci%ld2  = OpLoad %f32vec2 %f32vec2_input
2825fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec2 %extinst InterpolateAtOffset %ld2 %f32vec2_01
2826fd4e5da5Sopenharmony_ci)";
2827fd4e5da5Sopenharmony_ci
2828fd4e5da5Sopenharmony_ci  CompileSuccessfully(
2829fd4e5da5Sopenharmony_ci      GenerateShaderCode(body, "OpCapability InterpolationFunction\n"));
2830fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2831fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2832fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 InterpolateAtOffset: "
2833fd4e5da5Sopenharmony_ci                        "expected Interpolant to be a pointer"));
2834fd4e5da5Sopenharmony_ci}
2835fd4e5da5Sopenharmony_ci
2836fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtOffsetNoCapability) {
2837fd4e5da5Sopenharmony_ci  const std::string body = R"(
2838fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtOffset %f32_input %f32vec2_01
2839fd4e5da5Sopenharmony_ci)";
2840fd4e5da5Sopenharmony_ci
2841fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(body));
2842fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_CAPABILITY, ValidateInstructions());
2843fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2844fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 InterpolateAtOffset requires "
2845fd4e5da5Sopenharmony_ci                        "capability InterpolationFunction"));
2846fd4e5da5Sopenharmony_ci}
2847fd4e5da5Sopenharmony_ci
2848fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtOffsetIntResultType) {
2849fd4e5da5Sopenharmony_ci  const std::string body = R"(
2850fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32 %extinst InterpolateAtOffset %f32_input %f32vec2_01
2851fd4e5da5Sopenharmony_ci)";
2852fd4e5da5Sopenharmony_ci
2853fd4e5da5Sopenharmony_ci  CompileSuccessfully(
2854fd4e5da5Sopenharmony_ci      GenerateShaderCode(body, "OpCapability InterpolationFunction\n"));
2855fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2856fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2857fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 InterpolateAtOffset: "
2858fd4e5da5Sopenharmony_ci                        "expected Result Type to be a 32-bit float scalar "
2859fd4e5da5Sopenharmony_ci                        "or vector type"));
2860fd4e5da5Sopenharmony_ci}
2861fd4e5da5Sopenharmony_ci
2862fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtOffsetF64ResultType) {
2863fd4e5da5Sopenharmony_ci  const std::string body = R"(
2864fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f64 %extinst InterpolateAtOffset %f32_input %f32vec2_01
2865fd4e5da5Sopenharmony_ci)";
2866fd4e5da5Sopenharmony_ci
2867fd4e5da5Sopenharmony_ci  CompileSuccessfully(
2868fd4e5da5Sopenharmony_ci      GenerateShaderCode(body, "OpCapability InterpolationFunction\n"));
2869fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2870fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2871fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 InterpolateAtOffset: "
2872fd4e5da5Sopenharmony_ci                        "expected Result Type to be a 32-bit float scalar "
2873fd4e5da5Sopenharmony_ci                        "or vector type"));
2874fd4e5da5Sopenharmony_ci}
2875fd4e5da5Sopenharmony_ci
2876fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtOffsetNotPointer) {
2877fd4e5da5Sopenharmony_ci  const std::string body = R"(
2878fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtOffset %f32_1 %f32vec2_01
2879fd4e5da5Sopenharmony_ci)";
2880fd4e5da5Sopenharmony_ci
2881fd4e5da5Sopenharmony_ci  CompileSuccessfully(
2882fd4e5da5Sopenharmony_ci      GenerateShaderCode(body, "OpCapability InterpolationFunction\n"));
2883fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2884fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2885fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 InterpolateAtOffset: "
2886fd4e5da5Sopenharmony_ci                        "expected Interpolant to be a pointer"));
2887fd4e5da5Sopenharmony_ci}
2888fd4e5da5Sopenharmony_ci
2889fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtOffsetWrongDataType) {
2890fd4e5da5Sopenharmony_ci  const std::string body = R"(
2891fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtOffset %f32vec2_input %f32vec2_01
2892fd4e5da5Sopenharmony_ci)";
2893fd4e5da5Sopenharmony_ci
2894fd4e5da5Sopenharmony_ci  CompileSuccessfully(
2895fd4e5da5Sopenharmony_ci      GenerateShaderCode(body, "OpCapability InterpolationFunction\n"));
2896fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2897fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2898fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 InterpolateAtOffset: "
2899fd4e5da5Sopenharmony_ci                        "expected Interpolant data type to be equal to "
2900fd4e5da5Sopenharmony_ci                        "Result Type"));
2901fd4e5da5Sopenharmony_ci}
2902fd4e5da5Sopenharmony_ci
2903fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtOffsetWrongStorageClass) {
2904fd4e5da5Sopenharmony_ci  const std::string body = R"(
2905fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtOffset %f32_output %f32vec2_01
2906fd4e5da5Sopenharmony_ci)";
2907fd4e5da5Sopenharmony_ci
2908fd4e5da5Sopenharmony_ci  CompileSuccessfully(
2909fd4e5da5Sopenharmony_ci      GenerateShaderCode(body, "OpCapability InterpolationFunction\n"));
2910fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2911fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2912fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 InterpolateAtOffset: "
2913fd4e5da5Sopenharmony_ci                        "expected Interpolant storage class to be Input"));
2914fd4e5da5Sopenharmony_ci}
2915fd4e5da5Sopenharmony_ci
2916fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtOffsetOffsetNotVector) {
2917fd4e5da5Sopenharmony_ci  const std::string body = R"(
2918fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtOffset %f32_input %f32_0
2919fd4e5da5Sopenharmony_ci)";
2920fd4e5da5Sopenharmony_ci
2921fd4e5da5Sopenharmony_ci  CompileSuccessfully(
2922fd4e5da5Sopenharmony_ci      GenerateShaderCode(body, "OpCapability InterpolationFunction\n"));
2923fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2924fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2925fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 InterpolateAtOffset: "
2926fd4e5da5Sopenharmony_ci                        "expected Offset to be a vector of 2 32-bit floats"));
2927fd4e5da5Sopenharmony_ci}
2928fd4e5da5Sopenharmony_ci
2929fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtOffsetOffsetNotVector2) {
2930fd4e5da5Sopenharmony_ci  const std::string body = R"(
2931fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtOffset %f32_input %f32vec3_012
2932fd4e5da5Sopenharmony_ci)";
2933fd4e5da5Sopenharmony_ci
2934fd4e5da5Sopenharmony_ci  CompileSuccessfully(
2935fd4e5da5Sopenharmony_ci      GenerateShaderCode(body, "OpCapability InterpolationFunction\n"));
2936fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2937fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2938fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 InterpolateAtOffset: "
2939fd4e5da5Sopenharmony_ci                        "expected Offset to be a vector of 2 32-bit floats"));
2940fd4e5da5Sopenharmony_ci}
2941fd4e5da5Sopenharmony_ci
2942fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtOffsetOffsetNotFloatVector) {
2943fd4e5da5Sopenharmony_ci  const std::string body = R"(
2944fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtOffset %f32_input %u32vec2_01
2945fd4e5da5Sopenharmony_ci)";
2946fd4e5da5Sopenharmony_ci
2947fd4e5da5Sopenharmony_ci  CompileSuccessfully(
2948fd4e5da5Sopenharmony_ci      GenerateShaderCode(body, "OpCapability InterpolationFunction\n"));
2949fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2950fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2951fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 InterpolateAtOffset: "
2952fd4e5da5Sopenharmony_ci                        "expected Offset to be a vector of 2 32-bit floats"));
2953fd4e5da5Sopenharmony_ci}
2954fd4e5da5Sopenharmony_ci
2955fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtOffsetOffsetNotFloat32Vector) {
2956fd4e5da5Sopenharmony_ci  const std::string body = R"(
2957fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtOffset %f32_input %f64vec2_01
2958fd4e5da5Sopenharmony_ci)";
2959fd4e5da5Sopenharmony_ci
2960fd4e5da5Sopenharmony_ci  CompileSuccessfully(
2961fd4e5da5Sopenharmony_ci      GenerateShaderCode(body, "OpCapability InterpolationFunction\n"));
2962fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
2963fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2964fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 InterpolateAtOffset: "
2965fd4e5da5Sopenharmony_ci                        "expected Offset to be a vector of 2 32-bit floats"));
2966fd4e5da5Sopenharmony_ci}
2967fd4e5da5Sopenharmony_ci
2968fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, GlslStd450InterpolateAtOffsetWrongExecutionModel) {
2969fd4e5da5Sopenharmony_ci  const std::string body = R"(
2970fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst InterpolateAtOffset %f32_input %f32vec2_01
2971fd4e5da5Sopenharmony_ci)";
2972fd4e5da5Sopenharmony_ci
2973fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateShaderCode(
2974fd4e5da5Sopenharmony_ci      body, "OpCapability InterpolationFunction\n", "Vertex"));
2975fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
2976fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
2977fd4e5da5Sopenharmony_ci              HasSubstr("GLSL.std.450 InterpolateAtOffset requires "
2978fd4e5da5Sopenharmony_ci                        "Fragment execution model"));
2979fd4e5da5Sopenharmony_ci}
2980fd4e5da5Sopenharmony_ci
2981fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdSqrtLike, Success) {
2982fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
2983fd4e5da5Sopenharmony_ci  std::ostringstream ss;
2984fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name << " %f32_0\n";
2985fd4e5da5Sopenharmony_ci  ss << "%val2 = OpExtInst %f32vec2 %extinst " << ext_inst_name
2986fd4e5da5Sopenharmony_ci     << " %f32vec2_01\n";
2987fd4e5da5Sopenharmony_ci  ss << "%val3 = OpExtInst %f32vec4 %extinst " << ext_inst_name
2988fd4e5da5Sopenharmony_ci     << " %f32vec4_0123\n";
2989fd4e5da5Sopenharmony_ci  ss << "%val4 = OpExtInst %f64 %extinst " << ext_inst_name << " %f64_0\n";
2990fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
2991fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
2992fd4e5da5Sopenharmony_ci}
2993fd4e5da5Sopenharmony_ci
2994fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdSqrtLike, IntResultType) {
2995fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
2996fd4e5da5Sopenharmony_ci  const std::string body =
2997fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + " %f32_0\n";
2998fd4e5da5Sopenharmony_ci
2999fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3000fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3001fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
3002fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std " + ext_inst_name +
3003fd4e5da5Sopenharmony_ci                        ": expected Result Type to be a float scalar "
3004fd4e5da5Sopenharmony_ci                        "or vector type"));
3005fd4e5da5Sopenharmony_ci}
3006fd4e5da5Sopenharmony_ci
3007fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdSqrtLike, IntOperand) {
3008fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3009fd4e5da5Sopenharmony_ci  const std::string body =
3010fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + " %u32_0\n";
3011fd4e5da5Sopenharmony_ci
3012fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3013fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3014fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
3015fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std " + ext_inst_name +
3016fd4e5da5Sopenharmony_ci                        ": expected types of all operands to be equal to "
3017fd4e5da5Sopenharmony_ci                        "Result Type"));
3018fd4e5da5Sopenharmony_ci}
3019fd4e5da5Sopenharmony_ci
3020fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
3021fd4e5da5Sopenharmony_ci    AllSqrtLike, ValidateOpenCLStdSqrtLike,
3022fd4e5da5Sopenharmony_ci    ::testing::ValuesIn(std::vector<std::string>{
3023fd4e5da5Sopenharmony_ci        "acos",         "acosh",       "acospi",       "asin",
3024fd4e5da5Sopenharmony_ci        "asinh",        "asinpi",      "atan",         "atanh",
3025fd4e5da5Sopenharmony_ci        "atanpi",       "cbrt",        "ceil",         "cos",
3026fd4e5da5Sopenharmony_ci        "cosh",         "cospi",       "erfc",         "erf",
3027fd4e5da5Sopenharmony_ci        "exp",          "exp2",        "exp10",        "expm1",
3028fd4e5da5Sopenharmony_ci        "fabs",         "floor",       "log",          "log2",
3029fd4e5da5Sopenharmony_ci        "log10",        "log1p",       "logb",         "rint",
3030fd4e5da5Sopenharmony_ci        "round",        "rsqrt",       "sin",          "sinh",
3031fd4e5da5Sopenharmony_ci        "sinpi",        "sqrt",        "tan",          "tanh",
3032fd4e5da5Sopenharmony_ci        "tanpi",        "tgamma",      "trunc",        "half_cos",
3033fd4e5da5Sopenharmony_ci        "half_exp",     "half_exp2",   "half_exp10",   "half_log",
3034fd4e5da5Sopenharmony_ci        "half_log2",    "half_log10",  "half_recip",   "half_rsqrt",
3035fd4e5da5Sopenharmony_ci        "half_sin",     "half_sqrt",   "half_tan",     "lgamma",
3036fd4e5da5Sopenharmony_ci        "native_cos",   "native_exp",  "native_exp2",  "native_exp10",
3037fd4e5da5Sopenharmony_ci        "native_log",   "native_log2", "native_log10", "native_recip",
3038fd4e5da5Sopenharmony_ci        "native_rsqrt", "native_sin",  "native_sqrt",  "native_tan",
3039fd4e5da5Sopenharmony_ci        "degrees",      "radians",     "sign",
3040fd4e5da5Sopenharmony_ci    }));
3041fd4e5da5Sopenharmony_ci
3042fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFMinLike, Success) {
3043fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3044fd4e5da5Sopenharmony_ci  std::ostringstream ss;
3045fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name
3046fd4e5da5Sopenharmony_ci     << " %f32_0 %f32_1\n";
3047fd4e5da5Sopenharmony_ci  ss << "%val2 = OpExtInst %f32vec2 %extinst " << ext_inst_name
3048fd4e5da5Sopenharmony_ci     << " %f32vec2_01 %f32vec2_12\n";
3049fd4e5da5Sopenharmony_ci  ss << "%val3 = OpExtInst %f64 %extinst " << ext_inst_name
3050fd4e5da5Sopenharmony_ci     << " %f64_0 %f64_0\n";
3051fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
3052fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
3053fd4e5da5Sopenharmony_ci}
3054fd4e5da5Sopenharmony_ci
3055fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFMinLike, IntResultType) {
3056fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3057fd4e5da5Sopenharmony_ci  const std::string body =
3058fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + " %f32_0 %f32_1\n";
3059fd4e5da5Sopenharmony_ci
3060fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3061fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3062fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
3063fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std " + ext_inst_name +
3064fd4e5da5Sopenharmony_ci                        ": expected Result Type to be a float scalar "
3065fd4e5da5Sopenharmony_ci                        "or vector type"));
3066fd4e5da5Sopenharmony_ci}
3067fd4e5da5Sopenharmony_ci
3068fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFMinLike, IntOperand1) {
3069fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3070fd4e5da5Sopenharmony_ci  const std::string body =
3071fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + " %u32_0 %f32_1\n";
3072fd4e5da5Sopenharmony_ci
3073fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3074fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3075fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
3076fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std " + ext_inst_name +
3077fd4e5da5Sopenharmony_ci                        ": expected types of all operands to be equal to "
3078fd4e5da5Sopenharmony_ci                        "Result Type"));
3079fd4e5da5Sopenharmony_ci}
3080fd4e5da5Sopenharmony_ci
3081fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFMinLike, IntOperand2) {
3082fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3083fd4e5da5Sopenharmony_ci  const std::string body =
3084fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + " %f32_0 %u32_1\n";
3085fd4e5da5Sopenharmony_ci
3086fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3087fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3088fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
3089fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std " + ext_inst_name +
3090fd4e5da5Sopenharmony_ci                        ": expected types of all operands to be equal to "
3091fd4e5da5Sopenharmony_ci                        "Result Type"));
3092fd4e5da5Sopenharmony_ci}
3093fd4e5da5Sopenharmony_ci
3094fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllFMinLike, ValidateOpenCLStdFMinLike,
3095fd4e5da5Sopenharmony_ci                         ::testing::ValuesIn(std::vector<std::string>{
3096fd4e5da5Sopenharmony_ci                             "atan2",     "atan2pi",       "copysign",
3097fd4e5da5Sopenharmony_ci                             "fdim",      "fmax",          "fmin",
3098fd4e5da5Sopenharmony_ci                             "fmod",      "maxmag",        "minmag",
3099fd4e5da5Sopenharmony_ci                             "hypot",     "nextafter",     "pow",
3100fd4e5da5Sopenharmony_ci                             "powr",      "remainder",     "half_divide",
3101fd4e5da5Sopenharmony_ci                             "half_powr", "native_divide", "native_powr",
3102fd4e5da5Sopenharmony_ci                             "step",      "fmax_common",   "fmin_common",
3103fd4e5da5Sopenharmony_ci                         }));
3104fd4e5da5Sopenharmony_ci
3105fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFClampLike, Success) {
3106fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3107fd4e5da5Sopenharmony_ci  std::ostringstream ss;
3108fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name
3109fd4e5da5Sopenharmony_ci     << " %f32_0 %f32_1 %f32_2\n";
3110fd4e5da5Sopenharmony_ci  ss << "%val2 = OpExtInst %f32vec2 %extinst " << ext_inst_name
3111fd4e5da5Sopenharmony_ci     << " %f32vec2_01 %f32vec2_01 %f32vec2_12\n";
3112fd4e5da5Sopenharmony_ci  ss << "%val3 = OpExtInst %f64 %extinst " << ext_inst_name
3113fd4e5da5Sopenharmony_ci     << " %f64_0 %f64_0 %f64_1\n";
3114fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
3115fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
3116fd4e5da5Sopenharmony_ci}
3117fd4e5da5Sopenharmony_ci
3118fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFClampLike, IntResultType) {
3119fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3120fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %u32 %extinst " + ext_inst_name +
3121fd4e5da5Sopenharmony_ci                           " %f32_0 %f32_1 %f32_2\n";
3122fd4e5da5Sopenharmony_ci
3123fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3124fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3125fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
3126fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std " + ext_inst_name +
3127fd4e5da5Sopenharmony_ci                        ": expected Result Type to be a float scalar "
3128fd4e5da5Sopenharmony_ci                        "or vector type"));
3129fd4e5da5Sopenharmony_ci}
3130fd4e5da5Sopenharmony_ci
3131fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFClampLike, IntOperand1) {
3132fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3133fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %f32 %extinst " + ext_inst_name +
3134fd4e5da5Sopenharmony_ci                           " %u32_0 %f32_0 %f32_1\n";
3135fd4e5da5Sopenharmony_ci
3136fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3137fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3138fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
3139fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std " + ext_inst_name +
3140fd4e5da5Sopenharmony_ci                        ": expected types of all operands to be equal to "
3141fd4e5da5Sopenharmony_ci                        "Result Type"));
3142fd4e5da5Sopenharmony_ci}
3143fd4e5da5Sopenharmony_ci
3144fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFClampLike, IntOperand2) {
3145fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3146fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %f32 %extinst " + ext_inst_name +
3147fd4e5da5Sopenharmony_ci                           " %f32_0 %u32_0 %f32_1\n";
3148fd4e5da5Sopenharmony_ci
3149fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3150fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3151fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
3152fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std " + ext_inst_name +
3153fd4e5da5Sopenharmony_ci                        ": expected types of all operands to be equal to "
3154fd4e5da5Sopenharmony_ci                        "Result Type"));
3155fd4e5da5Sopenharmony_ci}
3156fd4e5da5Sopenharmony_ci
3157fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFClampLike, IntOperand3) {
3158fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3159fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %f32 %extinst " + ext_inst_name +
3160fd4e5da5Sopenharmony_ci                           " %f32_1 %f32_0 %u32_2\n";
3161fd4e5da5Sopenharmony_ci
3162fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3163fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3164fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
3165fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std " + ext_inst_name +
3166fd4e5da5Sopenharmony_ci                        ": expected types of all operands to be equal to "
3167fd4e5da5Sopenharmony_ci                        "Result Type"));
3168fd4e5da5Sopenharmony_ci}
3169fd4e5da5Sopenharmony_ci
3170fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllFClampLike, ValidateOpenCLStdFClampLike,
3171fd4e5da5Sopenharmony_ci                         ::testing::ValuesIn(std::vector<std::string>{
3172fd4e5da5Sopenharmony_ci                             "fma",
3173fd4e5da5Sopenharmony_ci                             "mad",
3174fd4e5da5Sopenharmony_ci                             "fclamp",
3175fd4e5da5Sopenharmony_ci                             "mix",
3176fd4e5da5Sopenharmony_ci                             "smoothstep",
3177fd4e5da5Sopenharmony_ci                         }));
3178fd4e5da5Sopenharmony_ci
3179fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdSAbsLike, Success) {
3180fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3181fd4e5da5Sopenharmony_ci  std::ostringstream ss;
3182fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %u32 %extinst " << ext_inst_name << " %u32_1\n";
3183fd4e5da5Sopenharmony_ci  ss << "%val2 = OpExtInst %u32 %extinst " << ext_inst_name << " %u32_1\n";
3184fd4e5da5Sopenharmony_ci  ss << "%val3 = OpExtInst %u32 %extinst " << ext_inst_name << " %u32_1\n";
3185fd4e5da5Sopenharmony_ci  ss << "%val4 = OpExtInst %u32 %extinst " << ext_inst_name << " %u32_1\n";
3186fd4e5da5Sopenharmony_ci  ss << "%val5 = OpExtInst %u32vec2 %extinst " << ext_inst_name
3187fd4e5da5Sopenharmony_ci     << " %u32vec2_01\n";
3188fd4e5da5Sopenharmony_ci  ss << "%val6 = OpExtInst %u32vec2 %extinst " << ext_inst_name
3189fd4e5da5Sopenharmony_ci     << " %u32vec2_01\n";
3190fd4e5da5Sopenharmony_ci  ss << "%val7 = OpExtInst %u32vec2 %extinst " << ext_inst_name
3191fd4e5da5Sopenharmony_ci     << " %u32vec2_01\n";
3192fd4e5da5Sopenharmony_ci  ss << "%val8 = OpExtInst %u32vec2 %extinst " << ext_inst_name
3193fd4e5da5Sopenharmony_ci     << " %u32vec2_01\n";
3194fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
3195fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
3196fd4e5da5Sopenharmony_ci}
3197fd4e5da5Sopenharmony_ci
3198fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdSAbsLike, FloatResultType) {
3199fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3200fd4e5da5Sopenharmony_ci  const std::string body =
3201fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + " %u32_0\n";
3202fd4e5da5Sopenharmony_ci
3203fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3204fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3205fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
3206fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std " + ext_inst_name +
3207fd4e5da5Sopenharmony_ci                        ": expected Result Type to be an int scalar "
3208fd4e5da5Sopenharmony_ci                        "or vector type"));
3209fd4e5da5Sopenharmony_ci}
3210fd4e5da5Sopenharmony_ci
3211fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdSAbsLike, FloatOperand) {
3212fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3213fd4e5da5Sopenharmony_ci  const std::string body =
3214fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + " %f32_0\n";
3215fd4e5da5Sopenharmony_ci
3216fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3217fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3218fd4e5da5Sopenharmony_ci  EXPECT_THAT(
3219fd4e5da5Sopenharmony_ci      getDiagnosticString(),
3220fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
3221fd4e5da5Sopenharmony_ci                ": expected types of all operands to be equal to Result Type"));
3222fd4e5da5Sopenharmony_ci}
3223fd4e5da5Sopenharmony_ci
3224fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdSAbsLike, U64Operand) {
3225fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3226fd4e5da5Sopenharmony_ci  const std::string body =
3227fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + " %u64_0\n";
3228fd4e5da5Sopenharmony_ci
3229fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3230fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3231fd4e5da5Sopenharmony_ci  EXPECT_THAT(
3232fd4e5da5Sopenharmony_ci      getDiagnosticString(),
3233fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
3234fd4e5da5Sopenharmony_ci                ": expected types of all operands to be equal to Result Type"));
3235fd4e5da5Sopenharmony_ci}
3236fd4e5da5Sopenharmony_ci
3237fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllSAbsLike, ValidateOpenCLStdSAbsLike,
3238fd4e5da5Sopenharmony_ci                         ::testing::ValuesIn(std::vector<std::string>{
3239fd4e5da5Sopenharmony_ci                             "s_abs",
3240fd4e5da5Sopenharmony_ci                             "clz",
3241fd4e5da5Sopenharmony_ci                             "ctz",
3242fd4e5da5Sopenharmony_ci                             "popcount",
3243fd4e5da5Sopenharmony_ci                             "u_abs",
3244fd4e5da5Sopenharmony_ci                         }));
3245fd4e5da5Sopenharmony_ci
3246fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMinLike, Success) {
3247fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3248fd4e5da5Sopenharmony_ci  std::ostringstream ss;
3249fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %u32 %extinst " << ext_inst_name
3250fd4e5da5Sopenharmony_ci     << " %u32_1 %u32_2\n";
3251fd4e5da5Sopenharmony_ci  ss << "%val2 = OpExtInst %u32 %extinst " << ext_inst_name
3252fd4e5da5Sopenharmony_ci     << " %u32_1 %u32_2\n";
3253fd4e5da5Sopenharmony_ci  ss << "%val3 = OpExtInst %u32 %extinst " << ext_inst_name
3254fd4e5da5Sopenharmony_ci     << " %u32_1 %u32_2\n";
3255fd4e5da5Sopenharmony_ci  ss << "%val4 = OpExtInst %u32 %extinst " << ext_inst_name
3256fd4e5da5Sopenharmony_ci     << " %u32_1 %u32_2\n";
3257fd4e5da5Sopenharmony_ci  ss << "%val5 = OpExtInst %u32vec2 %extinst " << ext_inst_name
3258fd4e5da5Sopenharmony_ci     << " %u32vec2_01 %u32vec2_01\n";
3259fd4e5da5Sopenharmony_ci  ss << "%val6 = OpExtInst %u32vec2 %extinst " << ext_inst_name
3260fd4e5da5Sopenharmony_ci     << " %u32vec2_01 %u32vec2_01\n";
3261fd4e5da5Sopenharmony_ci  ss << "%val7 = OpExtInst %u32vec2 %extinst " << ext_inst_name
3262fd4e5da5Sopenharmony_ci     << " %u32vec2_01 %u32vec2_01\n";
3263fd4e5da5Sopenharmony_ci  ss << "%val8 = OpExtInst %u32vec2 %extinst " << ext_inst_name
3264fd4e5da5Sopenharmony_ci     << " %u32vec2_01 %u32vec2_01\n";
3265fd4e5da5Sopenharmony_ci  ss << "%val9 = OpExtInst %u64 %extinst " << ext_inst_name
3266fd4e5da5Sopenharmony_ci     << " %u64_1 %u64_0\n";
3267fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
3268fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
3269fd4e5da5Sopenharmony_ci}
3270fd4e5da5Sopenharmony_ci
3271fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMinLike, FloatResultType) {
3272fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3273fd4e5da5Sopenharmony_ci  const std::string body =
3274fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + " %u32_0 %u32_0\n";
3275fd4e5da5Sopenharmony_ci
3276fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3277fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3278fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
3279fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std " + ext_inst_name +
3280fd4e5da5Sopenharmony_ci                        ": expected Result Type to be an int scalar "
3281fd4e5da5Sopenharmony_ci                        "or vector type"));
3282fd4e5da5Sopenharmony_ci}
3283fd4e5da5Sopenharmony_ci
3284fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMinLike, FloatOperand1) {
3285fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3286fd4e5da5Sopenharmony_ci  const std::string body =
3287fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + " %f32_0 %u32_0\n";
3288fd4e5da5Sopenharmony_ci
3289fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3290fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3291fd4e5da5Sopenharmony_ci  EXPECT_THAT(
3292fd4e5da5Sopenharmony_ci      getDiagnosticString(),
3293fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
3294fd4e5da5Sopenharmony_ci                ": expected types of all operands to be equal to Result Type"));
3295fd4e5da5Sopenharmony_ci}
3296fd4e5da5Sopenharmony_ci
3297fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMinLike, FloatOperand2) {
3298fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3299fd4e5da5Sopenharmony_ci  const std::string body =
3300fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + " %u32_0 %f32_0\n";
3301fd4e5da5Sopenharmony_ci
3302fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3303fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3304fd4e5da5Sopenharmony_ci  EXPECT_THAT(
3305fd4e5da5Sopenharmony_ci      getDiagnosticString(),
3306fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
3307fd4e5da5Sopenharmony_ci                ": expected types of all operands to be equal to Result Type"));
3308fd4e5da5Sopenharmony_ci}
3309fd4e5da5Sopenharmony_ci
3310fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMinLike, U64Operand1) {
3311fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3312fd4e5da5Sopenharmony_ci  const std::string body =
3313fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + " %u64_0 %u32_0\n";
3314fd4e5da5Sopenharmony_ci
3315fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3316fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3317fd4e5da5Sopenharmony_ci  EXPECT_THAT(
3318fd4e5da5Sopenharmony_ci      getDiagnosticString(),
3319fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
3320fd4e5da5Sopenharmony_ci                ": expected types of all operands to be equal to Result Type"));
3321fd4e5da5Sopenharmony_ci}
3322fd4e5da5Sopenharmony_ci
3323fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMinLike, U64Operand2) {
3324fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3325fd4e5da5Sopenharmony_ci  const std::string body =
3326fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + " %u32_0 %u64_0\n";
3327fd4e5da5Sopenharmony_ci
3328fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3329fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3330fd4e5da5Sopenharmony_ci  EXPECT_THAT(
3331fd4e5da5Sopenharmony_ci      getDiagnosticString(),
3332fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
3333fd4e5da5Sopenharmony_ci                ": expected types of all operands to be equal to Result Type"));
3334fd4e5da5Sopenharmony_ci}
3335fd4e5da5Sopenharmony_ci
3336fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllUMinLike, ValidateOpenCLStdUMinLike,
3337fd4e5da5Sopenharmony_ci                         ::testing::ValuesIn(std::vector<std::string>{
3338fd4e5da5Sopenharmony_ci                             "s_max",
3339fd4e5da5Sopenharmony_ci                             "u_max",
3340fd4e5da5Sopenharmony_ci                             "s_min",
3341fd4e5da5Sopenharmony_ci                             "u_min",
3342fd4e5da5Sopenharmony_ci                             "s_abs_diff",
3343fd4e5da5Sopenharmony_ci                             "s_add_sat",
3344fd4e5da5Sopenharmony_ci                             "u_add_sat",
3345fd4e5da5Sopenharmony_ci                             "s_mul_hi",
3346fd4e5da5Sopenharmony_ci                             "rotate",
3347fd4e5da5Sopenharmony_ci                             "s_sub_sat",
3348fd4e5da5Sopenharmony_ci                             "u_sub_sat",
3349fd4e5da5Sopenharmony_ci                             "s_hadd",
3350fd4e5da5Sopenharmony_ci                             "u_hadd",
3351fd4e5da5Sopenharmony_ci                             "s_rhadd",
3352fd4e5da5Sopenharmony_ci                             "u_rhadd",
3353fd4e5da5Sopenharmony_ci                             "u_abs_diff",
3354fd4e5da5Sopenharmony_ci                             "u_mul_hi",
3355fd4e5da5Sopenharmony_ci                         }));
3356fd4e5da5Sopenharmony_ci
3357fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUClampLike, Success) {
3358fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3359fd4e5da5Sopenharmony_ci  std::ostringstream ss;
3360fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %u32 %extinst " << ext_inst_name
3361fd4e5da5Sopenharmony_ci     << " %u32_0 %u32_1 %u32_2\n";
3362fd4e5da5Sopenharmony_ci  ss << "%val2 = OpExtInst %u32 %extinst " << ext_inst_name
3363fd4e5da5Sopenharmony_ci     << " %u32_0 %u32_1 %u32_2\n";
3364fd4e5da5Sopenharmony_ci  ss << "%val3 = OpExtInst %u32 %extinst " << ext_inst_name
3365fd4e5da5Sopenharmony_ci     << " %u32_0 %u32_1 %u32_2\n";
3366fd4e5da5Sopenharmony_ci  ss << "%val4 = OpExtInst %u32 %extinst " << ext_inst_name
3367fd4e5da5Sopenharmony_ci     << " %u32_0 %u32_1 %u32_2\n";
3368fd4e5da5Sopenharmony_ci  ss << "%val5 = OpExtInst %u32vec2 %extinst " << ext_inst_name
3369fd4e5da5Sopenharmony_ci     << " %u32vec2_01 %u32vec2_01 %u32vec2_12\n";
3370fd4e5da5Sopenharmony_ci  ss << "%val6 = OpExtInst %u32vec2 %extinst " << ext_inst_name
3371fd4e5da5Sopenharmony_ci     << " %u32vec2_01 %u32vec2_01 %u32vec2_12\n";
3372fd4e5da5Sopenharmony_ci  ss << "%val7 = OpExtInst %u32vec2 %extinst " << ext_inst_name
3373fd4e5da5Sopenharmony_ci     << " %u32vec2_01 %u32vec2_01 %u32vec2_12\n";
3374fd4e5da5Sopenharmony_ci  ss << "%val8 = OpExtInst %u32vec2 %extinst " << ext_inst_name
3375fd4e5da5Sopenharmony_ci     << " %u32vec2_01 %u32vec2_01 %u32vec2_12\n";
3376fd4e5da5Sopenharmony_ci  ss << "%val9 = OpExtInst %u64 %extinst " << ext_inst_name
3377fd4e5da5Sopenharmony_ci     << " %u64_1 %u64_0 %u64_1\n";
3378fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
3379fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
3380fd4e5da5Sopenharmony_ci}
3381fd4e5da5Sopenharmony_ci
3382fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUClampLike, FloatResultType) {
3383fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3384fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %f32 %extinst " + ext_inst_name +
3385fd4e5da5Sopenharmony_ci                           " %u32_0 %u32_0 %u32_1\n";
3386fd4e5da5Sopenharmony_ci
3387fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3388fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3389fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
3390fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std " + ext_inst_name +
3391fd4e5da5Sopenharmony_ci                        ": expected Result Type to be an int scalar "
3392fd4e5da5Sopenharmony_ci                        "or vector type"));
3393fd4e5da5Sopenharmony_ci}
3394fd4e5da5Sopenharmony_ci
3395fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUClampLike, FloatOperand1) {
3396fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3397fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %u32 %extinst " + ext_inst_name +
3398fd4e5da5Sopenharmony_ci                           " %f32_0 %u32_0 %u32_1\n";
3399fd4e5da5Sopenharmony_ci
3400fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3401fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3402fd4e5da5Sopenharmony_ci  EXPECT_THAT(
3403fd4e5da5Sopenharmony_ci      getDiagnosticString(),
3404fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
3405fd4e5da5Sopenharmony_ci                ": expected types of all operands to be equal to Result Type"));
3406fd4e5da5Sopenharmony_ci}
3407fd4e5da5Sopenharmony_ci
3408fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUClampLike, FloatOperand2) {
3409fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3410fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %u32 %extinst " + ext_inst_name +
3411fd4e5da5Sopenharmony_ci                           " %u32_0 %f32_0 %u32_1\n";
3412fd4e5da5Sopenharmony_ci
3413fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3414fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3415fd4e5da5Sopenharmony_ci  EXPECT_THAT(
3416fd4e5da5Sopenharmony_ci      getDiagnosticString(),
3417fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
3418fd4e5da5Sopenharmony_ci                ": expected types of all operands to be equal to Result Type"));
3419fd4e5da5Sopenharmony_ci}
3420fd4e5da5Sopenharmony_ci
3421fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUClampLike, FloatOperand3) {
3422fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3423fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %u32 %extinst " + ext_inst_name +
3424fd4e5da5Sopenharmony_ci                           " %u32_0 %u32_0 %f32_1\n";
3425fd4e5da5Sopenharmony_ci
3426fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3427fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3428fd4e5da5Sopenharmony_ci  EXPECT_THAT(
3429fd4e5da5Sopenharmony_ci      getDiagnosticString(),
3430fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
3431fd4e5da5Sopenharmony_ci                ": expected types of all operands to be equal to Result Type"));
3432fd4e5da5Sopenharmony_ci}
3433fd4e5da5Sopenharmony_ci
3434fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUClampLike, U64Operand1) {
3435fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3436fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %u32 %extinst " + ext_inst_name +
3437fd4e5da5Sopenharmony_ci                           " %f32_0 %u32_0 %u64_1\n";
3438fd4e5da5Sopenharmony_ci
3439fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3440fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3441fd4e5da5Sopenharmony_ci  EXPECT_THAT(
3442fd4e5da5Sopenharmony_ci      getDiagnosticString(),
3443fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
3444fd4e5da5Sopenharmony_ci                ": expected types of all operands to be equal to Result Type"));
3445fd4e5da5Sopenharmony_ci}
3446fd4e5da5Sopenharmony_ci
3447fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUClampLike, U64Operand2) {
3448fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3449fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %u32 %extinst " + ext_inst_name +
3450fd4e5da5Sopenharmony_ci                           " %u32_0 %f32_0 %u64_1\n";
3451fd4e5da5Sopenharmony_ci
3452fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3453fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3454fd4e5da5Sopenharmony_ci  EXPECT_THAT(
3455fd4e5da5Sopenharmony_ci      getDiagnosticString(),
3456fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
3457fd4e5da5Sopenharmony_ci                ": expected types of all operands to be equal to Result Type"));
3458fd4e5da5Sopenharmony_ci}
3459fd4e5da5Sopenharmony_ci
3460fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUClampLike, U64Operand3) {
3461fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3462fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %u32 %extinst " + ext_inst_name +
3463fd4e5da5Sopenharmony_ci                           " %u32_0 %u32_0 %u64_1\n";
3464fd4e5da5Sopenharmony_ci
3465fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3466fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3467fd4e5da5Sopenharmony_ci  EXPECT_THAT(
3468fd4e5da5Sopenharmony_ci      getDiagnosticString(),
3469fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
3470fd4e5da5Sopenharmony_ci                ": expected types of all operands to be equal to Result Type"));
3471fd4e5da5Sopenharmony_ci}
3472fd4e5da5Sopenharmony_ci
3473fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllUClampLike, ValidateOpenCLStdUClampLike,
3474fd4e5da5Sopenharmony_ci                         ::testing::ValuesIn(std::vector<std::string>{
3475fd4e5da5Sopenharmony_ci                             "s_clamp",
3476fd4e5da5Sopenharmony_ci                             "u_clamp",
3477fd4e5da5Sopenharmony_ci                             "s_mad_hi",
3478fd4e5da5Sopenharmony_ci                             "u_mad_sat",
3479fd4e5da5Sopenharmony_ci                             "s_mad_sat",
3480fd4e5da5Sopenharmony_ci                             "u_mad_hi",
3481fd4e5da5Sopenharmony_ci                         }));
3482fd4e5da5Sopenharmony_ci
3483fd4e5da5Sopenharmony_ci// -------------------------------------------------------------
3484fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMul24Like, Success) {
3485fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3486fd4e5da5Sopenharmony_ci  std::ostringstream ss;
3487fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %u32 %extinst " << ext_inst_name
3488fd4e5da5Sopenharmony_ci     << " %u32_1 %u32_2\n";
3489fd4e5da5Sopenharmony_ci  ss << "%val2 = OpExtInst %u32 %extinst " << ext_inst_name
3490fd4e5da5Sopenharmony_ci     << " %u32_1 %u32_2\n";
3491fd4e5da5Sopenharmony_ci  ss << "%val3 = OpExtInst %u32 %extinst " << ext_inst_name
3492fd4e5da5Sopenharmony_ci     << " %u32_1 %u32_2\n";
3493fd4e5da5Sopenharmony_ci  ss << "%val4 = OpExtInst %u32 %extinst " << ext_inst_name
3494fd4e5da5Sopenharmony_ci     << " %u32_1 %u32_2\n";
3495fd4e5da5Sopenharmony_ci  ss << "%val5 = OpExtInst %u32vec2 %extinst " << ext_inst_name
3496fd4e5da5Sopenharmony_ci     << " %u32vec2_01 %u32vec2_01\n";
3497fd4e5da5Sopenharmony_ci  ss << "%val6 = OpExtInst %u32vec2 %extinst " << ext_inst_name
3498fd4e5da5Sopenharmony_ci     << " %u32vec2_01 %u32vec2_01\n";
3499fd4e5da5Sopenharmony_ci  ss << "%val7 = OpExtInst %u32vec2 %extinst " << ext_inst_name
3500fd4e5da5Sopenharmony_ci     << " %u32vec2_01 %u32vec2_01\n";
3501fd4e5da5Sopenharmony_ci  ss << "%val8 = OpExtInst %u32vec2 %extinst " << ext_inst_name
3502fd4e5da5Sopenharmony_ci     << " %u32vec2_01 %u32vec2_01\n";
3503fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
3504fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
3505fd4e5da5Sopenharmony_ci}
3506fd4e5da5Sopenharmony_ci
3507fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMul24Like, FloatResultType) {
3508fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3509fd4e5da5Sopenharmony_ci  const std::string body =
3510fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + " %u32_0 %u32_0\n";
3511fd4e5da5Sopenharmony_ci
3512fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3513fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3514fd4e5da5Sopenharmony_ci  EXPECT_THAT(
3515fd4e5da5Sopenharmony_ci      getDiagnosticString(),
3516fd4e5da5Sopenharmony_ci      HasSubstr(
3517fd4e5da5Sopenharmony_ci          "OpenCL.std " + ext_inst_name +
3518fd4e5da5Sopenharmony_ci          ": expected Result Type to be a 32-bit int scalar or vector type"));
3519fd4e5da5Sopenharmony_ci}
3520fd4e5da5Sopenharmony_ci
3521fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMul24Like, U64ResultType) {
3522fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3523fd4e5da5Sopenharmony_ci  const std::string body =
3524fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %u64 %extinst " + ext_inst_name + " %u64_0 %u64_0\n";
3525fd4e5da5Sopenharmony_ci
3526fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3527fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3528fd4e5da5Sopenharmony_ci  EXPECT_THAT(
3529fd4e5da5Sopenharmony_ci      getDiagnosticString(),
3530fd4e5da5Sopenharmony_ci      HasSubstr(
3531fd4e5da5Sopenharmony_ci          "OpenCL.std " + ext_inst_name +
3532fd4e5da5Sopenharmony_ci          ": expected Result Type to be a 32-bit int scalar or vector type"));
3533fd4e5da5Sopenharmony_ci}
3534fd4e5da5Sopenharmony_ci
3535fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMul24Like, FloatOperand1) {
3536fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3537fd4e5da5Sopenharmony_ci  const std::string body =
3538fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + " %f32_0 %u32_0\n";
3539fd4e5da5Sopenharmony_ci
3540fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3541fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3542fd4e5da5Sopenharmony_ci  EXPECT_THAT(
3543fd4e5da5Sopenharmony_ci      getDiagnosticString(),
3544fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
3545fd4e5da5Sopenharmony_ci                ": expected types of all operands to be equal to Result Type"));
3546fd4e5da5Sopenharmony_ci}
3547fd4e5da5Sopenharmony_ci
3548fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMul24Like, FloatOperand2) {
3549fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3550fd4e5da5Sopenharmony_ci  const std::string body =
3551fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + " %u32_0 %f32_0\n";
3552fd4e5da5Sopenharmony_ci
3553fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3554fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3555fd4e5da5Sopenharmony_ci  EXPECT_THAT(
3556fd4e5da5Sopenharmony_ci      getDiagnosticString(),
3557fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
3558fd4e5da5Sopenharmony_ci                ": expected types of all operands to be equal to Result Type"));
3559fd4e5da5Sopenharmony_ci}
3560fd4e5da5Sopenharmony_ci
3561fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMul24Like, U64Operand1) {
3562fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3563fd4e5da5Sopenharmony_ci  const std::string body =
3564fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + " %u64_0 %u32_0\n";
3565fd4e5da5Sopenharmony_ci
3566fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3567fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3568fd4e5da5Sopenharmony_ci  EXPECT_THAT(
3569fd4e5da5Sopenharmony_ci      getDiagnosticString(),
3570fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
3571fd4e5da5Sopenharmony_ci                ": expected types of all operands to be equal to Result Type"));
3572fd4e5da5Sopenharmony_ci}
3573fd4e5da5Sopenharmony_ci
3574fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMul24Like, U64Operand2) {
3575fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3576fd4e5da5Sopenharmony_ci  const std::string body =
3577fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + " %u32_0 %u64_0\n";
3578fd4e5da5Sopenharmony_ci
3579fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3580fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3581fd4e5da5Sopenharmony_ci  EXPECT_THAT(
3582fd4e5da5Sopenharmony_ci      getDiagnosticString(),
3583fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
3584fd4e5da5Sopenharmony_ci                ": expected types of all operands to be equal to Result Type"));
3585fd4e5da5Sopenharmony_ci}
3586fd4e5da5Sopenharmony_ci
3587fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllUMul24Like, ValidateOpenCLStdUMul24Like,
3588fd4e5da5Sopenharmony_ci                         ::testing::ValuesIn(std::vector<std::string>{
3589fd4e5da5Sopenharmony_ci                             "s_mul24",
3590fd4e5da5Sopenharmony_ci                             "u_mul24",
3591fd4e5da5Sopenharmony_ci                         }));
3592fd4e5da5Sopenharmony_ci
3593fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMad24Like, Success) {
3594fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3595fd4e5da5Sopenharmony_ci  std::ostringstream ss;
3596fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %u32 %extinst " << ext_inst_name
3597fd4e5da5Sopenharmony_ci     << " %u32_0 %u32_1 %u32_2\n";
3598fd4e5da5Sopenharmony_ci  ss << "%val2 = OpExtInst %u32 %extinst " << ext_inst_name
3599fd4e5da5Sopenharmony_ci     << " %u32_0 %u32_1 %u32_2\n";
3600fd4e5da5Sopenharmony_ci  ss << "%val3 = OpExtInst %u32 %extinst " << ext_inst_name
3601fd4e5da5Sopenharmony_ci     << " %u32_0 %u32_1 %u32_2\n";
3602fd4e5da5Sopenharmony_ci  ss << "%val4 = OpExtInst %u32 %extinst " << ext_inst_name
3603fd4e5da5Sopenharmony_ci     << " %u32_0 %u32_1 %u32_2\n";
3604fd4e5da5Sopenharmony_ci  ss << "%val5 = OpExtInst %u32vec2 %extinst " << ext_inst_name
3605fd4e5da5Sopenharmony_ci     << " %u32vec2_01 %u32vec2_01 %u32vec2_12\n";
3606fd4e5da5Sopenharmony_ci  ss << "%val6 = OpExtInst %u32vec2 %extinst " << ext_inst_name
3607fd4e5da5Sopenharmony_ci     << " %u32vec2_01 %u32vec2_01 %u32vec2_12\n";
3608fd4e5da5Sopenharmony_ci  ss << "%val7 = OpExtInst %u32vec2 %extinst " << ext_inst_name
3609fd4e5da5Sopenharmony_ci     << " %u32vec2_01 %u32vec2_01 %u32vec2_12\n";
3610fd4e5da5Sopenharmony_ci  ss << "%val8 = OpExtInst %u32vec2 %extinst " << ext_inst_name
3611fd4e5da5Sopenharmony_ci     << " %u32vec2_01 %u32vec2_01 %u32vec2_12\n";
3612fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
3613fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
3614fd4e5da5Sopenharmony_ci}
3615fd4e5da5Sopenharmony_ci
3616fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMad24Like, FloatResultType) {
3617fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3618fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %f32 %extinst " + ext_inst_name +
3619fd4e5da5Sopenharmony_ci                           " %u32_0 %u32_0 %u32_1\n";
3620fd4e5da5Sopenharmony_ci
3621fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3622fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3623fd4e5da5Sopenharmony_ci  EXPECT_THAT(
3624fd4e5da5Sopenharmony_ci      getDiagnosticString(),
3625fd4e5da5Sopenharmony_ci      HasSubstr(
3626fd4e5da5Sopenharmony_ci          "OpenCL.std " + ext_inst_name +
3627fd4e5da5Sopenharmony_ci          ": expected Result Type to be a 32-bit int scalar or vector type"));
3628fd4e5da5Sopenharmony_ci}
3629fd4e5da5Sopenharmony_ci
3630fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMad24Like, U64ResultType) {
3631fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3632fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %u64 %extinst " + ext_inst_name +
3633fd4e5da5Sopenharmony_ci                           " %u64_0 %u64_0 %u64_1\n";
3634fd4e5da5Sopenharmony_ci
3635fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3636fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3637fd4e5da5Sopenharmony_ci  EXPECT_THAT(
3638fd4e5da5Sopenharmony_ci      getDiagnosticString(),
3639fd4e5da5Sopenharmony_ci      HasSubstr(
3640fd4e5da5Sopenharmony_ci          "OpenCL.std " + ext_inst_name +
3641fd4e5da5Sopenharmony_ci          ": expected Result Type to be a 32-bit int scalar or vector type"));
3642fd4e5da5Sopenharmony_ci}
3643fd4e5da5Sopenharmony_ci
3644fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMad24Like, FloatOperand1) {
3645fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3646fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %u32 %extinst " + ext_inst_name +
3647fd4e5da5Sopenharmony_ci                           " %f32_0 %u32_0 %u32_1\n";
3648fd4e5da5Sopenharmony_ci
3649fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3650fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3651fd4e5da5Sopenharmony_ci  EXPECT_THAT(
3652fd4e5da5Sopenharmony_ci      getDiagnosticString(),
3653fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
3654fd4e5da5Sopenharmony_ci                ": expected types of all operands to be equal to Result Type"));
3655fd4e5da5Sopenharmony_ci}
3656fd4e5da5Sopenharmony_ci
3657fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMad24Like, FloatOperand2) {
3658fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3659fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %u32 %extinst " + ext_inst_name +
3660fd4e5da5Sopenharmony_ci                           " %u32_0 %f32_0 %u32_1\n";
3661fd4e5da5Sopenharmony_ci
3662fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3663fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3664fd4e5da5Sopenharmony_ci  EXPECT_THAT(
3665fd4e5da5Sopenharmony_ci      getDiagnosticString(),
3666fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
3667fd4e5da5Sopenharmony_ci                ": expected types of all operands to be equal to Result Type"));
3668fd4e5da5Sopenharmony_ci}
3669fd4e5da5Sopenharmony_ci
3670fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMad24Like, FloatOperand3) {
3671fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3672fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %u32 %extinst " + ext_inst_name +
3673fd4e5da5Sopenharmony_ci                           " %u32_0 %u32_0 %f32_1\n";
3674fd4e5da5Sopenharmony_ci
3675fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3676fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3677fd4e5da5Sopenharmony_ci  EXPECT_THAT(
3678fd4e5da5Sopenharmony_ci      getDiagnosticString(),
3679fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
3680fd4e5da5Sopenharmony_ci                ": expected types of all operands to be equal to Result Type"));
3681fd4e5da5Sopenharmony_ci}
3682fd4e5da5Sopenharmony_ci
3683fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMad24Like, U64Operand1) {
3684fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3685fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %u32 %extinst " + ext_inst_name +
3686fd4e5da5Sopenharmony_ci                           " %f32_0 %u32_0 %u64_1\n";
3687fd4e5da5Sopenharmony_ci
3688fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3689fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3690fd4e5da5Sopenharmony_ci  EXPECT_THAT(
3691fd4e5da5Sopenharmony_ci      getDiagnosticString(),
3692fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
3693fd4e5da5Sopenharmony_ci                ": expected types of all operands to be equal to Result Type"));
3694fd4e5da5Sopenharmony_ci}
3695fd4e5da5Sopenharmony_ci
3696fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMad24Like, U64Operand2) {
3697fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3698fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %u32 %extinst " + ext_inst_name +
3699fd4e5da5Sopenharmony_ci                           " %u32_0 %f32_0 %u64_1\n";
3700fd4e5da5Sopenharmony_ci
3701fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3702fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3703fd4e5da5Sopenharmony_ci  EXPECT_THAT(
3704fd4e5da5Sopenharmony_ci      getDiagnosticString(),
3705fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
3706fd4e5da5Sopenharmony_ci                ": expected types of all operands to be equal to Result Type"));
3707fd4e5da5Sopenharmony_ci}
3708fd4e5da5Sopenharmony_ci
3709fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUMad24Like, U64Operand3) {
3710fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3711fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %u32 %extinst " + ext_inst_name +
3712fd4e5da5Sopenharmony_ci                           " %u32_0 %u32_0 %u64_1\n";
3713fd4e5da5Sopenharmony_ci
3714fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3715fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3716fd4e5da5Sopenharmony_ci  EXPECT_THAT(
3717fd4e5da5Sopenharmony_ci      getDiagnosticString(),
3718fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
3719fd4e5da5Sopenharmony_ci                ": expected types of all operands to be equal to Result Type"));
3720fd4e5da5Sopenharmony_ci}
3721fd4e5da5Sopenharmony_ci
3722fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllUMad24Like, ValidateOpenCLStdUMad24Like,
3723fd4e5da5Sopenharmony_ci                         ::testing::ValuesIn(std::vector<std::string>{
3724fd4e5da5Sopenharmony_ci                             "s_mad24",
3725fd4e5da5Sopenharmony_ci                             "u_mad24",
3726fd4e5da5Sopenharmony_ci                         }));
3727fd4e5da5Sopenharmony_ci
3728fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdCrossSuccess) {
3729fd4e5da5Sopenharmony_ci  const std::string body = R"(
3730fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec3 %extinst cross %f32vec3_012 %f32vec3_123
3731fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec4 %extinst cross %f32vec4_0123 %f32vec4_0123
3732fd4e5da5Sopenharmony_ci)";
3733fd4e5da5Sopenharmony_ci
3734fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3735fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
3736fd4e5da5Sopenharmony_ci}
3737fd4e5da5Sopenharmony_ci
3738fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdCrossIntVectorResultType) {
3739fd4e5da5Sopenharmony_ci  const std::string body = R"(
3740fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32vec3 %extinst cross %f32vec3_012 %f32vec3_123
3741fd4e5da5Sopenharmony_ci)";
3742fd4e5da5Sopenharmony_ci
3743fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3744fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3745fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
3746fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std cross: "
3747fd4e5da5Sopenharmony_ci                        "expected Result Type to be a float vector type"));
3748fd4e5da5Sopenharmony_ci}
3749fd4e5da5Sopenharmony_ci
3750fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdCrossResultTypeWrongSize) {
3751fd4e5da5Sopenharmony_ci  const std::string body = R"(
3752fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst cross %f32vec3_012 %f32vec3_123
3753fd4e5da5Sopenharmony_ci)";
3754fd4e5da5Sopenharmony_ci
3755fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3756fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3757fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
3758fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std cross: "
3759fd4e5da5Sopenharmony_ci                        "expected Result Type to have 3 or 4 components"));
3760fd4e5da5Sopenharmony_ci}
3761fd4e5da5Sopenharmony_ci
3762fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdCrossXWrongType) {
3763fd4e5da5Sopenharmony_ci  const std::string body = R"(
3764fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec3 %extinst cross %f64vec3_012 %f32vec3_123
3765fd4e5da5Sopenharmony_ci)";
3766fd4e5da5Sopenharmony_ci
3767fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3768fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3769fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
3770fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std cross: "
3771fd4e5da5Sopenharmony_ci                        "expected operand X type to be equal to Result Type"));
3772fd4e5da5Sopenharmony_ci}
3773fd4e5da5Sopenharmony_ci
3774fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdCrossYWrongType) {
3775fd4e5da5Sopenharmony_ci  const std::string body = R"(
3776fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec3 %extinst cross %f32vec3_123 %f64vec3_012
3777fd4e5da5Sopenharmony_ci)";
3778fd4e5da5Sopenharmony_ci
3779fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3780fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3781fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
3782fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std cross: "
3783fd4e5da5Sopenharmony_ci                        "expected operand Y type to be equal to Result Type"));
3784fd4e5da5Sopenharmony_ci}
3785fd4e5da5Sopenharmony_ci
3786fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdLengthLike, Success) {
3787fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3788fd4e5da5Sopenharmony_ci  std::ostringstream ss;
3789fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name << " %f32vec2_01\n";
3790fd4e5da5Sopenharmony_ci  ss << "%val2 = OpExtInst %f32 %extinst " << ext_inst_name
3791fd4e5da5Sopenharmony_ci     << " %f32vec4_0123\n";
3792fd4e5da5Sopenharmony_ci
3793fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
3794fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
3795fd4e5da5Sopenharmony_ci}
3796fd4e5da5Sopenharmony_ci
3797fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdLengthLike, IntResultType) {
3798fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3799fd4e5da5Sopenharmony_ci  const std::string body =
3800fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + " %f32vec2_01\n";
3801fd4e5da5Sopenharmony_ci
3802fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3803fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3804fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
3805fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std " + ext_inst_name +
3806fd4e5da5Sopenharmony_ci                        ": "
3807fd4e5da5Sopenharmony_ci                        "expected Result Type to be a float scalar type"));
3808fd4e5da5Sopenharmony_ci}
3809fd4e5da5Sopenharmony_ci
3810fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdLengthLike, IntX) {
3811fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3812fd4e5da5Sopenharmony_ci  const std::string body =
3813fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %f32 %extinst " + ext_inst_name + " %u32vec2_01\n";
3814fd4e5da5Sopenharmony_ci
3815fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3816fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3817fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
3818fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std " + ext_inst_name +
3819fd4e5da5Sopenharmony_ci                        ": "
3820fd4e5da5Sopenharmony_ci                        "expected operand P to be a float scalar or vector"));
3821fd4e5da5Sopenharmony_ci}
3822fd4e5da5Sopenharmony_ci
3823fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdLengthLike, VectorTooBig) {
3824fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3825fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %f32 %extinst " + ext_inst_name +
3826fd4e5da5Sopenharmony_ci                           " %f32vec8_01010101\n";
3827fd4e5da5Sopenharmony_ci
3828fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3829fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3830fd4e5da5Sopenharmony_ci  EXPECT_THAT(
3831fd4e5da5Sopenharmony_ci      getDiagnosticString(),
3832fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
3833fd4e5da5Sopenharmony_ci                ": "
3834fd4e5da5Sopenharmony_ci                "expected operand P to have no more than 4 components"));
3835fd4e5da5Sopenharmony_ci}
3836fd4e5da5Sopenharmony_ci
3837fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdLengthLike, DifferentType) {
3838fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3839fd4e5da5Sopenharmony_ci  const std::string body =
3840fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %f64 %extinst " + ext_inst_name + " %f32vec2_01\n";
3841fd4e5da5Sopenharmony_ci
3842fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3843fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3844fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
3845fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std " + ext_inst_name +
3846fd4e5da5Sopenharmony_ci                        ": "
3847fd4e5da5Sopenharmony_ci                        "expected operand P component type to be equal to "
3848fd4e5da5Sopenharmony_ci                        "Result Type"));
3849fd4e5da5Sopenharmony_ci}
3850fd4e5da5Sopenharmony_ci
3851fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllLengthLike, ValidateOpenCLStdLengthLike,
3852fd4e5da5Sopenharmony_ci                         ::testing::ValuesIn(std::vector<std::string>{
3853fd4e5da5Sopenharmony_ci                             "length",
3854fd4e5da5Sopenharmony_ci                             "fast_length",
3855fd4e5da5Sopenharmony_ci                         }));
3856fd4e5da5Sopenharmony_ci
3857fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdDistanceLike, Success) {
3858fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3859fd4e5da5Sopenharmony_ci  std::ostringstream ss;
3860fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name
3861fd4e5da5Sopenharmony_ci     << " %f32vec2_01 %f32vec2_01\n";
3862fd4e5da5Sopenharmony_ci  ss << "%val2 = OpExtInst %f32 %extinst " << ext_inst_name
3863fd4e5da5Sopenharmony_ci     << " %f32vec4_0123 %f32vec4_1234\n";
3864fd4e5da5Sopenharmony_ci  ss << "%val3 = OpExtInst %f32 %extinst " << ext_inst_name
3865fd4e5da5Sopenharmony_ci     << " %f32_0 %f32_1\n";
3866fd4e5da5Sopenharmony_ci
3867fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
3868fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
3869fd4e5da5Sopenharmony_ci}
3870fd4e5da5Sopenharmony_ci
3871fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdDistanceLike, IntResultType) {
3872fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3873fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %u32 %extinst " + ext_inst_name +
3874fd4e5da5Sopenharmony_ci                           " %f32vec2_01 %f32vec2_12\n";
3875fd4e5da5Sopenharmony_ci
3876fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3877fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3878fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
3879fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std " + ext_inst_name +
3880fd4e5da5Sopenharmony_ci                        ": "
3881fd4e5da5Sopenharmony_ci                        "expected Result Type to be a float scalar type"));
3882fd4e5da5Sopenharmony_ci}
3883fd4e5da5Sopenharmony_ci
3884fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdDistanceLike, IntP0) {
3885fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3886fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %f32 %extinst " + ext_inst_name +
3887fd4e5da5Sopenharmony_ci                           " %u32vec2_01 %f32vec2_12\n";
3888fd4e5da5Sopenharmony_ci
3889fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3890fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3891fd4e5da5Sopenharmony_ci  EXPECT_THAT(
3892fd4e5da5Sopenharmony_ci      getDiagnosticString(),
3893fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
3894fd4e5da5Sopenharmony_ci                ": "
3895fd4e5da5Sopenharmony_ci                "expected operand P0 to be of float scalar or vector type"));
3896fd4e5da5Sopenharmony_ci}
3897fd4e5da5Sopenharmony_ci
3898fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdDistanceLike, VectorTooBig) {
3899fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3900fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %f32 %extinst " + ext_inst_name +
3901fd4e5da5Sopenharmony_ci                           " %f32vec8_01010101 %f32vec8_01010101\n";
3902fd4e5da5Sopenharmony_ci
3903fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3904fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3905fd4e5da5Sopenharmony_ci  EXPECT_THAT(
3906fd4e5da5Sopenharmony_ci      getDiagnosticString(),
3907fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
3908fd4e5da5Sopenharmony_ci                ": "
3909fd4e5da5Sopenharmony_ci                "expected operand P0 to have no more than 4 components"));
3910fd4e5da5Sopenharmony_ci}
3911fd4e5da5Sopenharmony_ci
3912fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdDistanceLike, F64P0) {
3913fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3914fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %f32 %extinst " + ext_inst_name +
3915fd4e5da5Sopenharmony_ci                           " %f64vec2_01 %f32vec2_12\n";
3916fd4e5da5Sopenharmony_ci
3917fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3918fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3919fd4e5da5Sopenharmony_ci  EXPECT_THAT(
3920fd4e5da5Sopenharmony_ci      getDiagnosticString(),
3921fd4e5da5Sopenharmony_ci      HasSubstr(
3922fd4e5da5Sopenharmony_ci          "OpenCL.std " + ext_inst_name +
3923fd4e5da5Sopenharmony_ci          ": "
3924fd4e5da5Sopenharmony_ci          "expected operand P0 component type to be equal to Result Type"));
3925fd4e5da5Sopenharmony_ci}
3926fd4e5da5Sopenharmony_ci
3927fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdDistanceLike, DifferentOperands) {
3928fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3929fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %f64 %extinst " + ext_inst_name +
3930fd4e5da5Sopenharmony_ci                           " %f64vec2_01 %f32vec2_12\n";
3931fd4e5da5Sopenharmony_ci
3932fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3933fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3934fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
3935fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std " + ext_inst_name +
3936fd4e5da5Sopenharmony_ci                        ": "
3937fd4e5da5Sopenharmony_ci                        "expected operands P0 and P1 to be of the same type"));
3938fd4e5da5Sopenharmony_ci}
3939fd4e5da5Sopenharmony_ci
3940fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllDistanceLike, ValidateOpenCLStdDistanceLike,
3941fd4e5da5Sopenharmony_ci                         ::testing::ValuesIn(std::vector<std::string>{
3942fd4e5da5Sopenharmony_ci                             "distance",
3943fd4e5da5Sopenharmony_ci                             "fast_distance",
3944fd4e5da5Sopenharmony_ci                         }));
3945fd4e5da5Sopenharmony_ci
3946fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdNormalizeLike, Success) {
3947fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3948fd4e5da5Sopenharmony_ci  std::ostringstream ss;
3949fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32vec2 %extinst " << ext_inst_name
3950fd4e5da5Sopenharmony_ci     << " %f32vec2_01\n";
3951fd4e5da5Sopenharmony_ci  ss << "%val2 = OpExtInst %f32vec4 %extinst " << ext_inst_name
3952fd4e5da5Sopenharmony_ci     << " %f32vec4_0123\n";
3953fd4e5da5Sopenharmony_ci  ss << "%val3 = OpExtInst %f32 %extinst " << ext_inst_name << " %f32_2\n";
3954fd4e5da5Sopenharmony_ci
3955fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
3956fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
3957fd4e5da5Sopenharmony_ci}
3958fd4e5da5Sopenharmony_ci
3959fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdNormalizeLike, IntResultType) {
3960fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3961fd4e5da5Sopenharmony_ci  const std::string body =
3962fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %u32 %extinst " + ext_inst_name + " %f32_2\n";
3963fd4e5da5Sopenharmony_ci
3964fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3965fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3966fd4e5da5Sopenharmony_ci  EXPECT_THAT(
3967fd4e5da5Sopenharmony_ci      getDiagnosticString(),
3968fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
3969fd4e5da5Sopenharmony_ci                ": "
3970fd4e5da5Sopenharmony_ci                "expected Result Type to be a float scalar or vector type"));
3971fd4e5da5Sopenharmony_ci}
3972fd4e5da5Sopenharmony_ci
3973fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdNormalizeLike, VectorTooBig) {
3974fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3975fd4e5da5Sopenharmony_ci  const std::string body = "%val1 = OpExtInst %f32vec8 %extinst " +
3976fd4e5da5Sopenharmony_ci                           ext_inst_name + " %f32vec8_01010101\n";
3977fd4e5da5Sopenharmony_ci
3978fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3979fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3980fd4e5da5Sopenharmony_ci  EXPECT_THAT(
3981fd4e5da5Sopenharmony_ci      getDiagnosticString(),
3982fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
3983fd4e5da5Sopenharmony_ci                ": "
3984fd4e5da5Sopenharmony_ci                "expected Result Type to have no more than 4 components"));
3985fd4e5da5Sopenharmony_ci}
3986fd4e5da5Sopenharmony_ci
3987fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdNormalizeLike, DifferentType) {
3988fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
3989fd4e5da5Sopenharmony_ci  const std::string body =
3990fd4e5da5Sopenharmony_ci      "%val1 = OpExtInst %f64vec2 %extinst " + ext_inst_name + " %f32vec2_01\n";
3991fd4e5da5Sopenharmony_ci
3992fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
3993fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
3994fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
3995fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std " + ext_inst_name +
3996fd4e5da5Sopenharmony_ci                        ": "
3997fd4e5da5Sopenharmony_ci                        "expected operand P type to be equal to Result Type"));
3998fd4e5da5Sopenharmony_ci}
3999fd4e5da5Sopenharmony_ci
4000fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllNormalizeLike, ValidateOpenCLStdNormalizeLike,
4001fd4e5da5Sopenharmony_ci                         ::testing::ValuesIn(std::vector<std::string>{
4002fd4e5da5Sopenharmony_ci                             "normalize",
4003fd4e5da5Sopenharmony_ci                             "fast_normalize",
4004fd4e5da5Sopenharmony_ci                         }));
4005fd4e5da5Sopenharmony_ci
4006fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdBitselectSuccess) {
4007fd4e5da5Sopenharmony_ci  const std::string body = R"(
4008fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst bitselect %f32_2 %f32_1 %f32_1
4009fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec4 %extinst bitselect %f32vec4_0123 %f32vec4_1234 %f32vec4_0123
4010fd4e5da5Sopenharmony_ci%val3 = OpExtInst %u32 %extinst bitselect %u32_2 %u32_1 %u32_1
4011fd4e5da5Sopenharmony_ci%val4 = OpExtInst %u32vec4 %extinst bitselect %u32vec4_0123 %u32vec4_0123 %u32vec4_0123
4012fd4e5da5Sopenharmony_ci%val5 = OpExtInst %u64 %extinst bitselect %u64_2 %u64_1 %u64_1
4013fd4e5da5Sopenharmony_ci)";
4014fd4e5da5Sopenharmony_ci
4015fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
4016fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
4017fd4e5da5Sopenharmony_ci}
4018fd4e5da5Sopenharmony_ci
4019fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdBitselectWrongResultType) {
4020fd4e5da5Sopenharmony_ci  const std::string body = R"(
4021fd4e5da5Sopenharmony_ci%val3 = OpExtInst %struct_f32_f32 %extinst bitselect %u32_2 %u32_1 %u32_1
4022fd4e5da5Sopenharmony_ci)";
4023fd4e5da5Sopenharmony_ci
4024fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
4025fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4026fd4e5da5Sopenharmony_ci  EXPECT_THAT(
4027fd4e5da5Sopenharmony_ci      getDiagnosticString(),
4028fd4e5da5Sopenharmony_ci      HasSubstr(
4029fd4e5da5Sopenharmony_ci          "OpenCL.std bitselect: "
4030fd4e5da5Sopenharmony_ci          "expected Result Type to be an int or float scalar or vector type"));
4031fd4e5da5Sopenharmony_ci}
4032fd4e5da5Sopenharmony_ci
4033fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdBitselectAWrongType) {
4034fd4e5da5Sopenharmony_ci  const std::string body = R"(
4035fd4e5da5Sopenharmony_ci%val3 = OpExtInst %u32 %extinst bitselect %f32_2 %u32_1 %u32_1
4036fd4e5da5Sopenharmony_ci)";
4037fd4e5da5Sopenharmony_ci
4038fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
4039fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4040fd4e5da5Sopenharmony_ci  EXPECT_THAT(
4041fd4e5da5Sopenharmony_ci      getDiagnosticString(),
4042fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std bitselect: "
4043fd4e5da5Sopenharmony_ci                "expected types of all operands to be equal to Result Type"));
4044fd4e5da5Sopenharmony_ci}
4045fd4e5da5Sopenharmony_ci
4046fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdBitselectBWrongType) {
4047fd4e5da5Sopenharmony_ci  const std::string body = R"(
4048fd4e5da5Sopenharmony_ci%val3 = OpExtInst %u32 %extinst bitselect %u32_2 %f32_1 %u32_1
4049fd4e5da5Sopenharmony_ci)";
4050fd4e5da5Sopenharmony_ci
4051fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
4052fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4053fd4e5da5Sopenharmony_ci  EXPECT_THAT(
4054fd4e5da5Sopenharmony_ci      getDiagnosticString(),
4055fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std bitselect: "
4056fd4e5da5Sopenharmony_ci                "expected types of all operands to be equal to Result Type"));
4057fd4e5da5Sopenharmony_ci}
4058fd4e5da5Sopenharmony_ci
4059fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdBitselectCWrongType) {
4060fd4e5da5Sopenharmony_ci  const std::string body = R"(
4061fd4e5da5Sopenharmony_ci%val3 = OpExtInst %u32 %extinst bitselect %u32_2 %u32_1 %f32_1
4062fd4e5da5Sopenharmony_ci)";
4063fd4e5da5Sopenharmony_ci
4064fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
4065fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4066fd4e5da5Sopenharmony_ci  EXPECT_THAT(
4067fd4e5da5Sopenharmony_ci      getDiagnosticString(),
4068fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std bitselect: "
4069fd4e5da5Sopenharmony_ci                "expected types of all operands to be equal to Result Type"));
4070fd4e5da5Sopenharmony_ci}
4071fd4e5da5Sopenharmony_ci
4072fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdSelectSuccess) {
4073fd4e5da5Sopenharmony_ci  const std::string body = R"(
4074fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst select %f32_2 %f32_1 %u32_1
4075fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec4 %extinst select %f32vec4_0123 %f32vec4_1234 %u32vec4_0123
4076fd4e5da5Sopenharmony_ci%val3 = OpExtInst %u32 %extinst select %u32_2 %u32_1 %u32_1
4077fd4e5da5Sopenharmony_ci%val4 = OpExtInst %u32vec4 %extinst select %u32vec4_0123 %u32vec4_0123 %u32vec4_0123
4078fd4e5da5Sopenharmony_ci%val5 = OpExtInst %u64 %extinst select %u64_2 %u64_1 %u64_1
4079fd4e5da5Sopenharmony_ci)";
4080fd4e5da5Sopenharmony_ci
4081fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
4082fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
4083fd4e5da5Sopenharmony_ci}
4084fd4e5da5Sopenharmony_ci
4085fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdSelectWrongResultType) {
4086fd4e5da5Sopenharmony_ci  const std::string body = R"(
4087fd4e5da5Sopenharmony_ci%val3 = OpExtInst %struct_f32_f32 %extinst select %u32_2 %u32_1 %u32_1
4088fd4e5da5Sopenharmony_ci)";
4089fd4e5da5Sopenharmony_ci
4090fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
4091fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4092fd4e5da5Sopenharmony_ci  EXPECT_THAT(
4093fd4e5da5Sopenharmony_ci      getDiagnosticString(),
4094fd4e5da5Sopenharmony_ci      HasSubstr(
4095fd4e5da5Sopenharmony_ci          "OpenCL.std select: "
4096fd4e5da5Sopenharmony_ci          "expected Result Type to be an int or float scalar or vector type"));
4097fd4e5da5Sopenharmony_ci}
4098fd4e5da5Sopenharmony_ci
4099fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdSelectAWrongType) {
4100fd4e5da5Sopenharmony_ci  const std::string body = R"(
4101fd4e5da5Sopenharmony_ci%val3 = OpExtInst %u32 %extinst select %f32_2 %u32_1 %u32_1
4102fd4e5da5Sopenharmony_ci)";
4103fd4e5da5Sopenharmony_ci
4104fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
4105fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4106fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
4107fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std select: "
4108fd4e5da5Sopenharmony_ci                        "expected operand A type to be equal to Result Type"));
4109fd4e5da5Sopenharmony_ci}
4110fd4e5da5Sopenharmony_ci
4111fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdSelectBWrongType) {
4112fd4e5da5Sopenharmony_ci  const std::string body = R"(
4113fd4e5da5Sopenharmony_ci%val3 = OpExtInst %u32 %extinst select %u32_2 %f32_1 %u32_1
4114fd4e5da5Sopenharmony_ci)";
4115fd4e5da5Sopenharmony_ci
4116fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
4117fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4118fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
4119fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std select: "
4120fd4e5da5Sopenharmony_ci                        "expected operand B type to be equal to Result Type"));
4121fd4e5da5Sopenharmony_ci}
4122fd4e5da5Sopenharmony_ci
4123fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdSelectCWrongType) {
4124fd4e5da5Sopenharmony_ci  const std::string body = R"(
4125fd4e5da5Sopenharmony_ci%val3 = OpExtInst %f32 %extinst select %f32_2 %f32_1 %f32_1
4126fd4e5da5Sopenharmony_ci)";
4127fd4e5da5Sopenharmony_ci
4128fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
4129fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4130fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
4131fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std select: "
4132fd4e5da5Sopenharmony_ci                        "expected operand C to be an int scalar or vector"));
4133fd4e5da5Sopenharmony_ci}
4134fd4e5da5Sopenharmony_ci
4135fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdSelectCWrongComponentNumber) {
4136fd4e5da5Sopenharmony_ci  const std::string body = R"(
4137fd4e5da5Sopenharmony_ci%val3 = OpExtInst %f32vec2 %extinst select %f32vec2_12 %f32vec2_01 %u32_1
4138fd4e5da5Sopenharmony_ci)";
4139fd4e5da5Sopenharmony_ci
4140fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
4141fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4142fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
4143fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std select: "
4144fd4e5da5Sopenharmony_ci                        "expected operand C to have the same number of "
4145fd4e5da5Sopenharmony_ci                        "components as Result Type"));
4146fd4e5da5Sopenharmony_ci}
4147fd4e5da5Sopenharmony_ci
4148fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdSelectCWrongBitWidth) {
4149fd4e5da5Sopenharmony_ci  const std::string body = R"(
4150fd4e5da5Sopenharmony_ci%val3 = OpExtInst %f32vec2 %extinst select %f32vec2_12 %f32vec2_01 %u64vec2_01
4151fd4e5da5Sopenharmony_ci)";
4152fd4e5da5Sopenharmony_ci
4153fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
4154fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4155fd4e5da5Sopenharmony_ci  EXPECT_THAT(
4156fd4e5da5Sopenharmony_ci      getDiagnosticString(),
4157fd4e5da5Sopenharmony_ci      HasSubstr(
4158fd4e5da5Sopenharmony_ci          "OpenCL.std select: "
4159fd4e5da5Sopenharmony_ci          "expected operand C to have the same bit width as Result Type"));
4160fd4e5da5Sopenharmony_ci}
4161fd4e5da5Sopenharmony_ci
4162fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVStoreHalfLike, SuccessPhysical32) {
4163fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
4164fd4e5da5Sopenharmony_ci  const std::string rounding_mode =
4165fd4e5da5Sopenharmony_ci      ext_inst_name.substr(ext_inst_name.length() - 2) == "_r" ? " RTE" : "";
4166fd4e5da5Sopenharmony_ci
4167fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4168fd4e5da5Sopenharmony_ci  ss << "%ptr = OpAccessChain %f16_ptr_workgroup %f16vec8_workgroup %u32_1\n";
4169fd4e5da5Sopenharmony_ci  if (std::string::npos == ext_inst_name.find("halfn")) {
4170fd4e5da5Sopenharmony_ci    ss << "%val1 = OpExtInst %void %extinst " << ext_inst_name
4171fd4e5da5Sopenharmony_ci       << " %f32_1 %u32_1 %ptr" << rounding_mode << "\n";
4172fd4e5da5Sopenharmony_ci    ss << "%val2 = OpExtInst %void %extinst " << ext_inst_name
4173fd4e5da5Sopenharmony_ci       << " %f64_0 %u32_2 %ptr" << rounding_mode << "\n";
4174fd4e5da5Sopenharmony_ci  } else {
4175fd4e5da5Sopenharmony_ci    ss << "%val1 = OpExtInst %void %extinst " << ext_inst_name
4176fd4e5da5Sopenharmony_ci       << " %f32vec2_01 %u32_1 %ptr" << rounding_mode << "\n";
4177fd4e5da5Sopenharmony_ci    ss << "%val2 = OpExtInst %void %extinst " << ext_inst_name
4178fd4e5da5Sopenharmony_ci       << " %f32vec4_0123 %u32_0 %ptr" << rounding_mode << "\n";
4179fd4e5da5Sopenharmony_ci    ss << "%val3 = OpExtInst %void %extinst " << ext_inst_name
4180fd4e5da5Sopenharmony_ci       << " %f64vec2_01 %u32_2 %ptr" << rounding_mode << "\n";
4181fd4e5da5Sopenharmony_ci  }
4182fd4e5da5Sopenharmony_ci
4183fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
4184fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
4185fd4e5da5Sopenharmony_ci}
4186fd4e5da5Sopenharmony_ci
4187fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVStoreHalfLike, SuccessPhysical64) {
4188fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
4189fd4e5da5Sopenharmony_ci  const std::string rounding_mode =
4190fd4e5da5Sopenharmony_ci      ext_inst_name.substr(ext_inst_name.length() - 2) == "_r" ? " RTE" : "";
4191fd4e5da5Sopenharmony_ci
4192fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4193fd4e5da5Sopenharmony_ci  ss << "%ptr = OpAccessChain %f16_ptr_workgroup %f16vec8_workgroup %u32_1\n";
4194fd4e5da5Sopenharmony_ci  if (std::string::npos == ext_inst_name.find("halfn")) {
4195fd4e5da5Sopenharmony_ci    ss << "%val1 = OpExtInst %void %extinst " << ext_inst_name
4196fd4e5da5Sopenharmony_ci       << " %f32_1 %u64_1 %ptr" << rounding_mode << "\n";
4197fd4e5da5Sopenharmony_ci    ss << "%val2 = OpExtInst %void %extinst " << ext_inst_name
4198fd4e5da5Sopenharmony_ci       << " %f64_0 %u64_2 %ptr" << rounding_mode << "\n";
4199fd4e5da5Sopenharmony_ci  } else {
4200fd4e5da5Sopenharmony_ci    ss << "%val1 = OpExtInst %void %extinst " << ext_inst_name
4201fd4e5da5Sopenharmony_ci       << " %f32vec2_01 %u64_1 %ptr" << rounding_mode << "\n";
4202fd4e5da5Sopenharmony_ci    ss << "%val2 = OpExtInst %void %extinst " << ext_inst_name
4203fd4e5da5Sopenharmony_ci       << " %f32vec4_0123 %u64_0 %ptr" << rounding_mode << "\n";
4204fd4e5da5Sopenharmony_ci    ss << "%val3 = OpExtInst %void %extinst " << ext_inst_name
4205fd4e5da5Sopenharmony_ci       << " %f64vec2_01 %u64_2 %ptr" << rounding_mode << "\n";
4206fd4e5da5Sopenharmony_ci  }
4207fd4e5da5Sopenharmony_ci
4208fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str(), "", "Physical64"));
4209fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
4210fd4e5da5Sopenharmony_ci}
4211fd4e5da5Sopenharmony_ci
4212fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVStoreHalfLike, NonVoidResultType) {
4213fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
4214fd4e5da5Sopenharmony_ci  const std::string rounding_mode =
4215fd4e5da5Sopenharmony_ci      ext_inst_name.substr(ext_inst_name.length() - 2) == "_r" ? " RTE" : "";
4216fd4e5da5Sopenharmony_ci
4217fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4218fd4e5da5Sopenharmony_ci  ss << "%ptr = OpAccessChain %f16_ptr_workgroup %f16vec8_workgroup %u32_1\n";
4219fd4e5da5Sopenharmony_ci  if (std::string::npos == ext_inst_name.find("halfn")) {
4220fd4e5da5Sopenharmony_ci    ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name
4221fd4e5da5Sopenharmony_ci       << " %f32_1 %u32_1 %ptr" << rounding_mode << "\n";
4222fd4e5da5Sopenharmony_ci  } else {
4223fd4e5da5Sopenharmony_ci    ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name
4224fd4e5da5Sopenharmony_ci       << " %f32vec2_01 %u32_1 %ptr" << rounding_mode << "\n";
4225fd4e5da5Sopenharmony_ci  }
4226fd4e5da5Sopenharmony_ci
4227fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
4228fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4229fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
4230fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std " + ext_inst_name +
4231fd4e5da5Sopenharmony_ci                        ": expected Result Type to be void"));
4232fd4e5da5Sopenharmony_ci}
4233fd4e5da5Sopenharmony_ci
4234fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVStoreHalfLike, WrongDataType) {
4235fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
4236fd4e5da5Sopenharmony_ci  const std::string rounding_mode =
4237fd4e5da5Sopenharmony_ci      ext_inst_name.substr(ext_inst_name.length() - 2) == "_r" ? " RTE" : "";
4238fd4e5da5Sopenharmony_ci
4239fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4240fd4e5da5Sopenharmony_ci  ss << "%ptr = OpAccessChain %f16_ptr_workgroup %f16vec8_workgroup %u32_1\n";
4241fd4e5da5Sopenharmony_ci  if (std::string::npos == ext_inst_name.find("halfn")) {
4242fd4e5da5Sopenharmony_ci    ss << "%val1 = OpExtInst %void %extinst " << ext_inst_name
4243fd4e5da5Sopenharmony_ci       << " %f64vec2_01 %u32_1 %ptr" << rounding_mode << "\n";
4244fd4e5da5Sopenharmony_ci    CompileSuccessfully(GenerateKernelCode(ss.str()));
4245fd4e5da5Sopenharmony_ci    ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4246fd4e5da5Sopenharmony_ci    EXPECT_THAT(getDiagnosticString(),
4247fd4e5da5Sopenharmony_ci                HasSubstr("OpenCL.std " + ext_inst_name +
4248fd4e5da5Sopenharmony_ci                          ": expected Data to be a 32 or 64-bit float scalar"));
4249fd4e5da5Sopenharmony_ci  } else {
4250fd4e5da5Sopenharmony_ci    ss << "%val1 = OpExtInst %void %extinst " << ext_inst_name
4251fd4e5da5Sopenharmony_ci       << " %f64_0 %u32_1 %ptr" << rounding_mode << "\n";
4252fd4e5da5Sopenharmony_ci    CompileSuccessfully(GenerateKernelCode(ss.str()));
4253fd4e5da5Sopenharmony_ci    ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4254fd4e5da5Sopenharmony_ci    EXPECT_THAT(getDiagnosticString(),
4255fd4e5da5Sopenharmony_ci                HasSubstr("OpenCL.std " + ext_inst_name +
4256fd4e5da5Sopenharmony_ci                          ": expected Data to be a 32 or 64-bit float vector"));
4257fd4e5da5Sopenharmony_ci  }
4258fd4e5da5Sopenharmony_ci}
4259fd4e5da5Sopenharmony_ci
4260fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVStoreHalfLike, AddressingModelLogical) {
4261fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
4262fd4e5da5Sopenharmony_ci  const std::string rounding_mode =
4263fd4e5da5Sopenharmony_ci      ext_inst_name.substr(ext_inst_name.length() - 2) == "_r" ? " RTE" : "";
4264fd4e5da5Sopenharmony_ci
4265fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4266fd4e5da5Sopenharmony_ci  ss << "%ptr = OpAccessChain %f16_ptr_workgroup %f16vec8_workgroup %u32_1\n";
4267fd4e5da5Sopenharmony_ci  if (std::string::npos == ext_inst_name.find("halfn")) {
4268fd4e5da5Sopenharmony_ci    ss << "%val1 = OpExtInst %void %extinst " << ext_inst_name
4269fd4e5da5Sopenharmony_ci       << " %f32_0 %u32_1 %ptr" << rounding_mode << "\n";
4270fd4e5da5Sopenharmony_ci  } else {
4271fd4e5da5Sopenharmony_ci    ss << "%val1 = OpExtInst %void %extinst " << ext_inst_name
4272fd4e5da5Sopenharmony_ci       << " %f32vec2_01 %u32_1 %ptr" << rounding_mode << "\n";
4273fd4e5da5Sopenharmony_ci  }
4274fd4e5da5Sopenharmony_ci
4275fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str(), "", "Logical"));
4276fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4277fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
4278fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std " + ext_inst_name +
4279fd4e5da5Sopenharmony_ci                        " can only be used with physical addressing models"));
4280fd4e5da5Sopenharmony_ci}
4281fd4e5da5Sopenharmony_ci
4282fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVStoreHalfLike, OffsetNotSizeT) {
4283fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
4284fd4e5da5Sopenharmony_ci  const std::string rounding_mode =
4285fd4e5da5Sopenharmony_ci      ext_inst_name.substr(ext_inst_name.length() - 2) == "_r" ? " RTE" : "";
4286fd4e5da5Sopenharmony_ci
4287fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4288fd4e5da5Sopenharmony_ci  ss << "%ptr = OpAccessChain %f16_ptr_workgroup %f16vec8_workgroup %u32_1\n";
4289fd4e5da5Sopenharmony_ci  if (std::string::npos == ext_inst_name.find("halfn")) {
4290fd4e5da5Sopenharmony_ci    ss << "%val1 = OpExtInst %void %extinst " << ext_inst_name
4291fd4e5da5Sopenharmony_ci       << " %f32_0 %u32_1 %ptr" << rounding_mode << "\n";
4292fd4e5da5Sopenharmony_ci  } else {
4293fd4e5da5Sopenharmony_ci    ss << "%val1 = OpExtInst %void %extinst " << ext_inst_name
4294fd4e5da5Sopenharmony_ci       << " %f32vec2_01 %u32_1 %ptr" << rounding_mode << "\n";
4295fd4e5da5Sopenharmony_ci  }
4296fd4e5da5Sopenharmony_ci
4297fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str(), "", "Physical64"));
4298fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4299fd4e5da5Sopenharmony_ci  EXPECT_THAT(
4300fd4e5da5Sopenharmony_ci      getDiagnosticString(),
4301fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
4302fd4e5da5Sopenharmony_ci                ": "
4303fd4e5da5Sopenharmony_ci                "expected operand Offset to be of type size_t (64-bit integer "
4304fd4e5da5Sopenharmony_ci                "for the addressing model used in the module)"));
4305fd4e5da5Sopenharmony_ci}
4306fd4e5da5Sopenharmony_ci
4307fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVStoreHalfLike, PNotPointer) {
4308fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
4309fd4e5da5Sopenharmony_ci  const std::string rounding_mode =
4310fd4e5da5Sopenharmony_ci      ext_inst_name.substr(ext_inst_name.length() - 2) == "_r" ? " RTE" : "";
4311fd4e5da5Sopenharmony_ci
4312fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4313fd4e5da5Sopenharmony_ci  if (std::string::npos == ext_inst_name.find("halfn")) {
4314fd4e5da5Sopenharmony_ci    ss << "%val1 = OpExtInst %void %extinst " << ext_inst_name
4315fd4e5da5Sopenharmony_ci       << " %f32_0 %u32_1 %f16_ptr_workgroup" << rounding_mode << "\n";
4316fd4e5da5Sopenharmony_ci  } else {
4317fd4e5da5Sopenharmony_ci    ss << "%val1 = OpExtInst %void %extinst " << ext_inst_name
4318fd4e5da5Sopenharmony_ci       << " %f32vec2_01 %u32_1 %f16_ptr_workgroup" << rounding_mode << "\n";
4319fd4e5da5Sopenharmony_ci  }
4320fd4e5da5Sopenharmony_ci
4321fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
4322fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
4323fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
4324fd4e5da5Sopenharmony_ci              HasSubstr("Operand '89[%_ptr_Workgroup_half]' cannot be a type"));
4325fd4e5da5Sopenharmony_ci}
4326fd4e5da5Sopenharmony_ci
4327fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVStoreHalfLike, ConstPointer) {
4328fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
4329fd4e5da5Sopenharmony_ci  const std::string rounding_mode =
4330fd4e5da5Sopenharmony_ci      ext_inst_name.substr(ext_inst_name.length() - 2) == "_r" ? " RTE" : "";
4331fd4e5da5Sopenharmony_ci
4332fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4333fd4e5da5Sopenharmony_ci  ss << "%ptr = OpAccessChain %f16_ptr_uniform_constant "
4334fd4e5da5Sopenharmony_ci        "%f16vec8_uniform_constant %u32_1\n";
4335fd4e5da5Sopenharmony_ci  if (std::string::npos == ext_inst_name.find("halfn")) {
4336fd4e5da5Sopenharmony_ci    ss << "%val1 = OpExtInst %void %extinst " << ext_inst_name
4337fd4e5da5Sopenharmony_ci       << " %f32_0 %u32_1 %ptr" << rounding_mode << "\n";
4338fd4e5da5Sopenharmony_ci  } else {
4339fd4e5da5Sopenharmony_ci    ss << "%val1 = OpExtInst %void %extinst " << ext_inst_name
4340fd4e5da5Sopenharmony_ci       << " %f32vec2_01 %u32_1 %ptr" << rounding_mode << "\n";
4341fd4e5da5Sopenharmony_ci  }
4342fd4e5da5Sopenharmony_ci
4343fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
4344fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4345fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
4346fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std " + ext_inst_name +
4347fd4e5da5Sopenharmony_ci                        ": expected operand P storage class to be Generic, "
4348fd4e5da5Sopenharmony_ci                        "CrossWorkgroup, Workgroup or Function"));
4349fd4e5da5Sopenharmony_ci}
4350fd4e5da5Sopenharmony_ci
4351fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVStoreHalfLike, PDataTypeInt) {
4352fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
4353fd4e5da5Sopenharmony_ci  const std::string rounding_mode =
4354fd4e5da5Sopenharmony_ci      ext_inst_name.substr(ext_inst_name.length() - 2) == "_r" ? " RTE" : "";
4355fd4e5da5Sopenharmony_ci
4356fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4357fd4e5da5Sopenharmony_ci  ss << "%ptr = OpAccessChain %u32_ptr_workgroup %u32vec8_workgroup %u32_1\n";
4358fd4e5da5Sopenharmony_ci  if (std::string::npos == ext_inst_name.find("halfn")) {
4359fd4e5da5Sopenharmony_ci    ss << "%val1 = OpExtInst %void %extinst " << ext_inst_name
4360fd4e5da5Sopenharmony_ci       << " %f32_0 %u32_1 %ptr" << rounding_mode << "\n";
4361fd4e5da5Sopenharmony_ci  } else {
4362fd4e5da5Sopenharmony_ci    ss << "%val1 = OpExtInst %void %extinst " << ext_inst_name
4363fd4e5da5Sopenharmony_ci       << " %f32vec2_01 %u32_1 %ptr" << rounding_mode << "\n";
4364fd4e5da5Sopenharmony_ci  }
4365fd4e5da5Sopenharmony_ci
4366fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
4367fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4368fd4e5da5Sopenharmony_ci  EXPECT_THAT(
4369fd4e5da5Sopenharmony_ci      getDiagnosticString(),
4370fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
4371fd4e5da5Sopenharmony_ci                ": expected operand P data type to be 16-bit float scalar"));
4372fd4e5da5Sopenharmony_ci}
4373fd4e5da5Sopenharmony_ci
4374fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVStoreHalfLike, PDataTypeFloat32) {
4375fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
4376fd4e5da5Sopenharmony_ci  const std::string rounding_mode =
4377fd4e5da5Sopenharmony_ci      ext_inst_name.substr(ext_inst_name.length() - 2) == "_r" ? " RTE" : "";
4378fd4e5da5Sopenharmony_ci
4379fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4380fd4e5da5Sopenharmony_ci  ss << "%ptr = OpAccessChain %f32_ptr_workgroup %f32vec8_workgroup %u32_1\n";
4381fd4e5da5Sopenharmony_ci  if (std::string::npos == ext_inst_name.find("halfn")) {
4382fd4e5da5Sopenharmony_ci    ss << "%val1 = OpExtInst %void %extinst " << ext_inst_name
4383fd4e5da5Sopenharmony_ci       << " %f32_0 %u32_1 %ptr" << rounding_mode << "\n";
4384fd4e5da5Sopenharmony_ci  } else {
4385fd4e5da5Sopenharmony_ci    ss << "%val1 = OpExtInst %void %extinst " << ext_inst_name
4386fd4e5da5Sopenharmony_ci       << " %f32vec2_01 %u32_1 %ptr" << rounding_mode << "\n";
4387fd4e5da5Sopenharmony_ci  }
4388fd4e5da5Sopenharmony_ci
4389fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
4390fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4391fd4e5da5Sopenharmony_ci  EXPECT_THAT(
4392fd4e5da5Sopenharmony_ci      getDiagnosticString(),
4393fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
4394fd4e5da5Sopenharmony_ci                ": expected operand P data type to be 16-bit float scalar"));
4395fd4e5da5Sopenharmony_ci}
4396fd4e5da5Sopenharmony_ci
4397fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllVStoreHalfLike, ValidateOpenCLStdVStoreHalfLike,
4398fd4e5da5Sopenharmony_ci                         ::testing::ValuesIn(std::vector<std::string>{
4399fd4e5da5Sopenharmony_ci                             "vstore_half",
4400fd4e5da5Sopenharmony_ci                             "vstore_half_r",
4401fd4e5da5Sopenharmony_ci                             "vstore_halfn",
4402fd4e5da5Sopenharmony_ci                             "vstore_halfn_r",
4403fd4e5da5Sopenharmony_ci                             "vstorea_halfn",
4404fd4e5da5Sopenharmony_ci                             "vstorea_halfn_r",
4405fd4e5da5Sopenharmony_ci                         }));
4406fd4e5da5Sopenharmony_ci
4407fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVLoadHalfLike, SuccessPhysical32) {
4408fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
4409fd4e5da5Sopenharmony_ci
4410fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4411fd4e5da5Sopenharmony_ci  ss << "%ptr = OpAccessChain %f16_ptr_workgroup %f16vec8_workgroup %u32_1\n";
4412fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32vec2 %extinst " << ext_inst_name
4413fd4e5da5Sopenharmony_ci     << " %u32_1 %ptr 2\n";
4414fd4e5da5Sopenharmony_ci  ss << "%val2 = OpExtInst %f32vec3 %extinst " << ext_inst_name
4415fd4e5da5Sopenharmony_ci     << " %u32_1 %ptr 3\n";
4416fd4e5da5Sopenharmony_ci  ss << "%val3 = OpExtInst %f32vec4 %extinst " << ext_inst_name
4417fd4e5da5Sopenharmony_ci     << " %u32_1 %ptr 4\n";
4418fd4e5da5Sopenharmony_ci
4419fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
4420fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
4421fd4e5da5Sopenharmony_ci}
4422fd4e5da5Sopenharmony_ci
4423fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVLoadHalfLike, SuccessPhysical64) {
4424fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
4425fd4e5da5Sopenharmony_ci
4426fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4427fd4e5da5Sopenharmony_ci  ss << "%ptr = OpAccessChain %f16_ptr_workgroup %f16vec8_workgroup %u32_1\n";
4428fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32vec2 %extinst " << ext_inst_name
4429fd4e5da5Sopenharmony_ci     << " %u64_1 %ptr 2\n";
4430fd4e5da5Sopenharmony_ci  ss << "%val2 = OpExtInst %f32vec3 %extinst " << ext_inst_name
4431fd4e5da5Sopenharmony_ci     << " %u64_1 %ptr 3\n";
4432fd4e5da5Sopenharmony_ci  ss << "%val3 = OpExtInst %f32vec4 %extinst " << ext_inst_name
4433fd4e5da5Sopenharmony_ci     << " %u64_1 %ptr 4\n";
4434fd4e5da5Sopenharmony_ci
4435fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str(), "", "Physical64"));
4436fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
4437fd4e5da5Sopenharmony_ci}
4438fd4e5da5Sopenharmony_ci
4439fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVLoadHalfLike, ResultTypeNotFloatVector) {
4440fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
4441fd4e5da5Sopenharmony_ci
4442fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4443fd4e5da5Sopenharmony_ci  ss << "%ptr = OpAccessChain %f16_ptr_workgroup %f16vec8_workgroup %u32_1\n";
4444fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name
4445fd4e5da5Sopenharmony_ci     << " %u32_1 %ptr 1\n";
4446fd4e5da5Sopenharmony_ci
4447fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
4448fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4449fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
4450fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std " + ext_inst_name +
4451fd4e5da5Sopenharmony_ci                        ": expected Result Type to be a float vector type"));
4452fd4e5da5Sopenharmony_ci}
4453fd4e5da5Sopenharmony_ci
4454fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVLoadHalfLike, AddressingModelLogical) {
4455fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
4456fd4e5da5Sopenharmony_ci
4457fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4458fd4e5da5Sopenharmony_ci  ss << "%ptr = OpAccessChain %f16_ptr_workgroup %f16vec8_workgroup %u32_1\n";
4459fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32vec2 %extinst " << ext_inst_name
4460fd4e5da5Sopenharmony_ci     << " %u32_1 %ptr 2\n";
4461fd4e5da5Sopenharmony_ci
4462fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str(), "", "Logical"));
4463fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4464fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
4465fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std " + ext_inst_name +
4466fd4e5da5Sopenharmony_ci                        " can only be used with physical addressing models"));
4467fd4e5da5Sopenharmony_ci}
4468fd4e5da5Sopenharmony_ci
4469fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVLoadHalfLike, OffsetNotSizeT) {
4470fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
4471fd4e5da5Sopenharmony_ci
4472fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4473fd4e5da5Sopenharmony_ci  ss << "%ptr = OpAccessChain %f16_ptr_workgroup %f16vec8_workgroup %u32_1\n";
4474fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32vec2 %extinst " << ext_inst_name
4475fd4e5da5Sopenharmony_ci     << " %u64_1 %ptr 2\n";
4476fd4e5da5Sopenharmony_ci
4477fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
4478fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4479fd4e5da5Sopenharmony_ci  EXPECT_THAT(
4480fd4e5da5Sopenharmony_ci      getDiagnosticString(),
4481fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
4482fd4e5da5Sopenharmony_ci                ": expected operand Offset to be of type size_t (32-bit "
4483fd4e5da5Sopenharmony_ci                "integer for the addressing model used in the module)"));
4484fd4e5da5Sopenharmony_ci}
4485fd4e5da5Sopenharmony_ci
4486fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVLoadHalfLike, PNotPointer) {
4487fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
4488fd4e5da5Sopenharmony_ci
4489fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4490fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32vec2 %extinst " << ext_inst_name
4491fd4e5da5Sopenharmony_ci     << " %u32_1 %f16_ptr_workgroup 2\n";
4492fd4e5da5Sopenharmony_ci
4493fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
4494fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
4495fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
4496fd4e5da5Sopenharmony_ci              HasSubstr("Operand '89[%_ptr_Workgroup_half]' cannot be a type"));
4497fd4e5da5Sopenharmony_ci}
4498fd4e5da5Sopenharmony_ci
4499fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVLoadHalfLike, OffsetWrongStorageType) {
4500fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
4501fd4e5da5Sopenharmony_ci
4502fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4503fd4e5da5Sopenharmony_ci  ss << "%ptr = OpAccessChain %f16_ptr_input %f16vec8_input %u32_1\n";
4504fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32vec2 %extinst " << ext_inst_name
4505fd4e5da5Sopenharmony_ci     << " %u32_1 %ptr 2\n";
4506fd4e5da5Sopenharmony_ci
4507fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
4508fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4509fd4e5da5Sopenharmony_ci  EXPECT_THAT(
4510fd4e5da5Sopenharmony_ci      getDiagnosticString(),
4511fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
4512fd4e5da5Sopenharmony_ci                ": expected operand P storage class to be UniformConstant, "
4513fd4e5da5Sopenharmony_ci                "Generic, CrossWorkgroup, Workgroup or Function"));
4514fd4e5da5Sopenharmony_ci}
4515fd4e5da5Sopenharmony_ci
4516fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVLoadHalfLike, PDataTypeInt) {
4517fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
4518fd4e5da5Sopenharmony_ci
4519fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4520fd4e5da5Sopenharmony_ci  ss << "%ptr = OpAccessChain %u32_ptr_workgroup %u32vec8_workgroup %u32_1\n";
4521fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32vec2 %extinst " << ext_inst_name
4522fd4e5da5Sopenharmony_ci     << " %u32_1 %ptr 2\n";
4523fd4e5da5Sopenharmony_ci
4524fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
4525fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4526fd4e5da5Sopenharmony_ci  EXPECT_THAT(
4527fd4e5da5Sopenharmony_ci      getDiagnosticString(),
4528fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
4529fd4e5da5Sopenharmony_ci                ": expected operand P data type to be 16-bit float scalar"));
4530fd4e5da5Sopenharmony_ci}
4531fd4e5da5Sopenharmony_ci
4532fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVLoadHalfLike, PDataTypeFloat32) {
4533fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
4534fd4e5da5Sopenharmony_ci
4535fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4536fd4e5da5Sopenharmony_ci  ss << "%ptr = OpAccessChain %f32_ptr_workgroup %f32vec8_workgroup %u32_1\n";
4537fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32vec2 %extinst " << ext_inst_name
4538fd4e5da5Sopenharmony_ci     << " %u32_1 %ptr 2\n";
4539fd4e5da5Sopenharmony_ci
4540fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
4541fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4542fd4e5da5Sopenharmony_ci  EXPECT_THAT(
4543fd4e5da5Sopenharmony_ci      getDiagnosticString(),
4544fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
4545fd4e5da5Sopenharmony_ci                ": expected operand P data type to be 16-bit float scalar"));
4546fd4e5da5Sopenharmony_ci}
4547fd4e5da5Sopenharmony_ci
4548fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdVLoadHalfLike, WrongN) {
4549fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
4550fd4e5da5Sopenharmony_ci
4551fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4552fd4e5da5Sopenharmony_ci  ss << "%ptr = OpAccessChain %f16_ptr_workgroup %f16vec8_workgroup %u32_1\n";
4553fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32vec2 %extinst " << ext_inst_name
4554fd4e5da5Sopenharmony_ci     << " %u32_1 %ptr 3\n";
4555fd4e5da5Sopenharmony_ci
4556fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
4557fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4558fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
4559fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std " + ext_inst_name +
4560fd4e5da5Sopenharmony_ci                        ": expected literal N to be equal to the number of "
4561fd4e5da5Sopenharmony_ci                        "components of Result Type"));
4562fd4e5da5Sopenharmony_ci}
4563fd4e5da5Sopenharmony_ci
4564fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllVLoadHalfLike, ValidateOpenCLStdVLoadHalfLike,
4565fd4e5da5Sopenharmony_ci                         ::testing::ValuesIn(std::vector<std::string>{
4566fd4e5da5Sopenharmony_ci                             "vload_halfn",
4567fd4e5da5Sopenharmony_ci                             "vloada_halfn",
4568fd4e5da5Sopenharmony_ci                         }));
4569fd4e5da5Sopenharmony_ci
4570fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadNSuccessFloatPhysical32) {
4571fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4572fd4e5da5Sopenharmony_ci  ss << "%ptr = OpAccessChain %f32_ptr_uniform_constant "
4573fd4e5da5Sopenharmony_ci        "%f32vec8_uniform_constant %u32_1\n";
4574fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32vec2 %extinst vloadn %u32_1 %ptr 2\n";
4575fd4e5da5Sopenharmony_ci  ss << "%val2 = OpExtInst %f32vec3 %extinst vloadn %u32_1 %ptr 3\n";
4576fd4e5da5Sopenharmony_ci  ss << "%val3 = OpExtInst %f32vec4 %extinst vloadn %u32_1 %ptr 4\n";
4577fd4e5da5Sopenharmony_ci
4578fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
4579fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
4580fd4e5da5Sopenharmony_ci}
4581fd4e5da5Sopenharmony_ci
4582fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadNSuccessIntPhysical32) {
4583fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4584fd4e5da5Sopenharmony_ci  ss << "%ptr = OpAccessChain %u32_ptr_uniform_constant "
4585fd4e5da5Sopenharmony_ci        "%u32vec8_uniform_constant %u32_1\n";
4586fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %u32vec2 %extinst vloadn %u32_1 %ptr 2\n";
4587fd4e5da5Sopenharmony_ci  ss << "%val2 = OpExtInst %u32vec3 %extinst vloadn %u32_1 %ptr 3\n";
4588fd4e5da5Sopenharmony_ci  ss << "%val3 = OpExtInst %u32vec4 %extinst vloadn %u32_1 %ptr 4\n";
4589fd4e5da5Sopenharmony_ci
4590fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
4591fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
4592fd4e5da5Sopenharmony_ci}
4593fd4e5da5Sopenharmony_ci
4594fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadNSuccessFloatPhysical64) {
4595fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4596fd4e5da5Sopenharmony_ci  ss << "%ptr = OpAccessChain %f32_ptr_uniform_constant "
4597fd4e5da5Sopenharmony_ci        "%f32vec8_uniform_constant %u32_1\n";
4598fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32vec2 %extinst vloadn %u64_1 %ptr 2\n";
4599fd4e5da5Sopenharmony_ci  ss << "%val2 = OpExtInst %f32vec3 %extinst vloadn %u64_1 %ptr 3\n";
4600fd4e5da5Sopenharmony_ci  ss << "%val3 = OpExtInst %f32vec4 %extinst vloadn %u64_1 %ptr 4\n";
4601fd4e5da5Sopenharmony_ci
4602fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str(), "", "Physical64"));
4603fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
4604fd4e5da5Sopenharmony_ci}
4605fd4e5da5Sopenharmony_ci
4606fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadNSuccessIntPhysical64) {
4607fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4608fd4e5da5Sopenharmony_ci  ss << "%ptr = OpAccessChain %u32_ptr_uniform_constant "
4609fd4e5da5Sopenharmony_ci        "%u32vec8_uniform_constant %u32_1\n";
4610fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %u32vec2 %extinst vloadn %u64_1 %ptr 2\n";
4611fd4e5da5Sopenharmony_ci  ss << "%val2 = OpExtInst %u32vec3 %extinst vloadn %u64_1 %ptr 3\n";
4612fd4e5da5Sopenharmony_ci  ss << "%val3 = OpExtInst %u32vec4 %extinst vloadn %u64_1 %ptr 4\n";
4613fd4e5da5Sopenharmony_ci
4614fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str(), "", "Physical64"));
4615fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
4616fd4e5da5Sopenharmony_ci}
4617fd4e5da5Sopenharmony_ci
4618fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadNWrongResultType) {
4619fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4620fd4e5da5Sopenharmony_ci  ss << "%ptr = OpAccessChain %f32_ptr_uniform_constant "
4621fd4e5da5Sopenharmony_ci        "%f32vec8_uniform_constant %u32_1\n";
4622fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32 %extinst vloadn %u32_1 %ptr 2\n";
4623fd4e5da5Sopenharmony_ci
4624fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
4625fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4626fd4e5da5Sopenharmony_ci  EXPECT_THAT(
4627fd4e5da5Sopenharmony_ci      getDiagnosticString(),
4628fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std vloadn: "
4629fd4e5da5Sopenharmony_ci                "expected Result Type to be an int or float vector type"));
4630fd4e5da5Sopenharmony_ci}
4631fd4e5da5Sopenharmony_ci
4632fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadNAddressingModelLogical) {
4633fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4634fd4e5da5Sopenharmony_ci  ss << "%ptr = OpAccessChain %f32_ptr_uniform_constant "
4635fd4e5da5Sopenharmony_ci        "%f32vec8_uniform_constant %u32_1\n";
4636fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32vec2 %extinst vloadn %u32_1 %ptr 2\n";
4637fd4e5da5Sopenharmony_ci
4638fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str(), "", "Logical"));
4639fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4640fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
4641fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std vloadn can only be used with physical "
4642fd4e5da5Sopenharmony_ci                        "addressing models"));
4643fd4e5da5Sopenharmony_ci}
4644fd4e5da5Sopenharmony_ci
4645fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadNOffsetNotSizeT) {
4646fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4647fd4e5da5Sopenharmony_ci  ss << "%ptr = OpAccessChain %f32_ptr_uniform_constant "
4648fd4e5da5Sopenharmony_ci        "%f32vec8_uniform_constant %u32_1\n";
4649fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32vec2 %extinst vloadn %u64_1 %ptr 2\n";
4650fd4e5da5Sopenharmony_ci
4651fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
4652fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4653fd4e5da5Sopenharmony_ci  EXPECT_THAT(
4654fd4e5da5Sopenharmony_ci      getDiagnosticString(),
4655fd4e5da5Sopenharmony_ci      HasSubstr(
4656fd4e5da5Sopenharmony_ci          "OpenCL.std vloadn: expected operand Offset to be of type size_t "
4657fd4e5da5Sopenharmony_ci          "(32-bit integer for the addressing model used in the module)"));
4658fd4e5da5Sopenharmony_ci}
4659fd4e5da5Sopenharmony_ci
4660fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadNPNotPointer) {
4661fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4662fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32vec2 %extinst vloadn %u32_1 "
4663fd4e5da5Sopenharmony_ci        "%f32_ptr_uniform_constant 2\n";
4664fd4e5da5Sopenharmony_ci
4665fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
4666fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
4667fd4e5da5Sopenharmony_ci  EXPECT_THAT(
4668fd4e5da5Sopenharmony_ci      getDiagnosticString(),
4669fd4e5da5Sopenharmony_ci      HasSubstr("Operand '120[%_ptr_UniformConstant_float]' cannot be a "
4670fd4e5da5Sopenharmony_ci                "type"));
4671fd4e5da5Sopenharmony_ci}
4672fd4e5da5Sopenharmony_ci
4673fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadNWrongStorageClass) {
4674fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4675fd4e5da5Sopenharmony_ci  ss << "%ptr = OpAccessChain %u32_ptr_input %u32vec8_input %u32_1\n";
4676fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %u32vec2 %extinst vloadn %u32_1 %ptr 2\n";
4677fd4e5da5Sopenharmony_ci
4678fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
4679fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4680fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
4681fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std vloadn: expected operand P storage class "
4682fd4e5da5Sopenharmony_ci                        "to be UniformConstant, Generic, CrossWorkgroup, "
4683fd4e5da5Sopenharmony_ci                        "Workgroup or Function"));
4684fd4e5da5Sopenharmony_ci}
4685fd4e5da5Sopenharmony_ci
4686fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadNWrongComponentType) {
4687fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4688fd4e5da5Sopenharmony_ci  ss << "%ptr = OpAccessChain %f32_ptr_uniform_constant "
4689fd4e5da5Sopenharmony_ci        "%f32vec8_uniform_constant %u32_1\n";
4690fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %u32vec2 %extinst vloadn %u32_1 %ptr 2\n";
4691fd4e5da5Sopenharmony_ci
4692fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
4693fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4694fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
4695fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std vloadn: expected operand P data type to be "
4696fd4e5da5Sopenharmony_ci                        "equal to component type of Result Type"));
4697fd4e5da5Sopenharmony_ci}
4698fd4e5da5Sopenharmony_ci
4699fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadNWrongN) {
4700fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4701fd4e5da5Sopenharmony_ci  ss << "%ptr = OpAccessChain %f32_ptr_uniform_constant "
4702fd4e5da5Sopenharmony_ci        "%f32vec8_uniform_constant %u32_1\n";
4703fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32vec2 %extinst vloadn %u32_1 %ptr 3\n";
4704fd4e5da5Sopenharmony_ci
4705fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
4706fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4707fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
4708fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std vloadn: expected literal N to be equal to "
4709fd4e5da5Sopenharmony_ci                        "the number of components of Result Type"));
4710fd4e5da5Sopenharmony_ci}
4711fd4e5da5Sopenharmony_ci
4712fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadHalfSuccessPhysical32) {
4713fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4714fd4e5da5Sopenharmony_ci  ss << "%ptr = OpAccessChain %f16_ptr_uniform_constant "
4715fd4e5da5Sopenharmony_ci        "%f16vec8_uniform_constant %u32_1\n";
4716fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32 %extinst vload_half %u32_1 %ptr\n";
4717fd4e5da5Sopenharmony_ci  ss << "%val2 = OpExtInst %f64 %extinst vload_half %u32_1 %ptr\n";
4718fd4e5da5Sopenharmony_ci
4719fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
4720fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
4721fd4e5da5Sopenharmony_ci}
4722fd4e5da5Sopenharmony_ci
4723fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadHalfSuccessPhysical64) {
4724fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4725fd4e5da5Sopenharmony_ci  ss << "%ptr = OpAccessChain %f16_ptr_uniform_constant "
4726fd4e5da5Sopenharmony_ci        "%f16vec8_uniform_constant %u32_1\n";
4727fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32 %extinst vload_half %u64_1 %ptr\n";
4728fd4e5da5Sopenharmony_ci  ss << "%val2 = OpExtInst %f64 %extinst vload_half %u64_1 %ptr\n";
4729fd4e5da5Sopenharmony_ci
4730fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str(), "", "Physical64"));
4731fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
4732fd4e5da5Sopenharmony_ci}
4733fd4e5da5Sopenharmony_ci
4734fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadHalfWrongResultType) {
4735fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4736fd4e5da5Sopenharmony_ci  ss << "%ptr = OpAccessChain %f16_ptr_uniform_constant "
4737fd4e5da5Sopenharmony_ci        "%f16vec8_uniform_constant %u32_1\n";
4738fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %u32 %extinst vload_half %u32_1 %ptr\n";
4739fd4e5da5Sopenharmony_ci
4740fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
4741fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4742fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
4743fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std vload_half: "
4744fd4e5da5Sopenharmony_ci                        "expected Result Type to be a float scalar type"));
4745fd4e5da5Sopenharmony_ci}
4746fd4e5da5Sopenharmony_ci
4747fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadHalfAddressingModelLogical) {
4748fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4749fd4e5da5Sopenharmony_ci  ss << "%ptr = OpAccessChain %f16_ptr_uniform_constant "
4750fd4e5da5Sopenharmony_ci        "%f16vec8_uniform_constant %u32_1\n";
4751fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32 %extinst vload_half %u32_1 %ptr\n";
4752fd4e5da5Sopenharmony_ci
4753fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str(), "", "Logical"));
4754fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4755fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
4756fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std vload_half can only be used with physical "
4757fd4e5da5Sopenharmony_ci                        "addressing models"));
4758fd4e5da5Sopenharmony_ci}
4759fd4e5da5Sopenharmony_ci
4760fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadHalfOffsetNotSizeT) {
4761fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4762fd4e5da5Sopenharmony_ci  ss << "%ptr = OpAccessChain %f16_ptr_uniform_constant "
4763fd4e5da5Sopenharmony_ci        "%f16vec8_uniform_constant %u32_1\n";
4764fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32 %extinst vload_half %u64_1 %ptr\n";
4765fd4e5da5Sopenharmony_ci
4766fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
4767fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4768fd4e5da5Sopenharmony_ci  EXPECT_THAT(
4769fd4e5da5Sopenharmony_ci      getDiagnosticString(),
4770fd4e5da5Sopenharmony_ci      HasSubstr(
4771fd4e5da5Sopenharmony_ci          "OpenCL.std vload_half: expected operand Offset to be of type size_t "
4772fd4e5da5Sopenharmony_ci          "(32-bit integer for the addressing model used in the module)"));
4773fd4e5da5Sopenharmony_ci}
4774fd4e5da5Sopenharmony_ci
4775fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadHalfPNotPointer) {
4776fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4777fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32 %extinst vload_half %u32_1 "
4778fd4e5da5Sopenharmony_ci        "%f16_ptr_uniform_constant\n";
4779fd4e5da5Sopenharmony_ci
4780fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
4781fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
4782fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
4783fd4e5da5Sopenharmony_ci              HasSubstr("Operand '114[%_ptr_UniformConstant_half]' cannot be a "
4784fd4e5da5Sopenharmony_ci                        "type"));
4785fd4e5da5Sopenharmony_ci}
4786fd4e5da5Sopenharmony_ci
4787fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadHalfWrongStorageClass) {
4788fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4789fd4e5da5Sopenharmony_ci  ss << "%ptr = OpAccessChain %f16_ptr_input %f16vec8_input %u32_1\n";
4790fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32 %extinst vload_half %u32_1 %ptr\n";
4791fd4e5da5Sopenharmony_ci
4792fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
4793fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4794fd4e5da5Sopenharmony_ci  EXPECT_THAT(
4795fd4e5da5Sopenharmony_ci      getDiagnosticString(),
4796fd4e5da5Sopenharmony_ci      HasSubstr(
4797fd4e5da5Sopenharmony_ci          "OpenCL.std vload_half: expected operand P storage class to be "
4798fd4e5da5Sopenharmony_ci          "UniformConstant, Generic, CrossWorkgroup, Workgroup or Function"));
4799fd4e5da5Sopenharmony_ci}
4800fd4e5da5Sopenharmony_ci
4801fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadHalfPDataTypeInt) {
4802fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4803fd4e5da5Sopenharmony_ci  ss << "%ptr = OpAccessChain %u32_ptr_uniform_constant "
4804fd4e5da5Sopenharmony_ci        "%u32vec8_uniform_constant %u32_1\n";
4805fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32 %extinst vload_half %u32_1 %ptr\n";
4806fd4e5da5Sopenharmony_ci
4807fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
4808fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4809fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
4810fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std vload_half: expected operand P data type "
4811fd4e5da5Sopenharmony_ci                        "to be 16-bit float scalar"));
4812fd4e5da5Sopenharmony_ci}
4813fd4e5da5Sopenharmony_ci
4814fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VLoadHalfPDataTypeFloat32) {
4815fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4816fd4e5da5Sopenharmony_ci  ss << "%ptr = OpAccessChain %f32_ptr_uniform_constant "
4817fd4e5da5Sopenharmony_ci        "%f32vec8_uniform_constant %u32_1\n";
4818fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32 %extinst vload_half %u32_1 %ptr\n";
4819fd4e5da5Sopenharmony_ci
4820fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
4821fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4822fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
4823fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std vload_half: expected operand P data type "
4824fd4e5da5Sopenharmony_ci                        "to be 16-bit float scalar"));
4825fd4e5da5Sopenharmony_ci}
4826fd4e5da5Sopenharmony_ci
4827fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VStoreNSuccessFloatPhysical32) {
4828fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4829fd4e5da5Sopenharmony_ci  ss << "%ptr_w = OpAccessChain %f32_ptr_workgroup %f32vec8_workgroup %u32_1\n";
4830fd4e5da5Sopenharmony_ci  ss << "%ptr_g = OpPtrCastToGeneric %f32_ptr_generic %ptr_w\n";
4831fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %void %extinst vstoren %f32vec2_01 %u32_1 %ptr_g\n";
4832fd4e5da5Sopenharmony_ci  ss << "%val2 = OpExtInst %void %extinst vstoren %f32vec4_0123 %u32_1 "
4833fd4e5da5Sopenharmony_ci        "%ptr_g\n";
4834fd4e5da5Sopenharmony_ci
4835fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
4836fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
4837fd4e5da5Sopenharmony_ci}
4838fd4e5da5Sopenharmony_ci
4839fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VStoreNSuccessFloatPhysical64) {
4840fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4841fd4e5da5Sopenharmony_ci  ss << "%ptr_w = OpAccessChain %f32_ptr_workgroup %f32vec8_workgroup %u32_1\n";
4842fd4e5da5Sopenharmony_ci  ss << "%ptr_g = OpPtrCastToGeneric %f32_ptr_generic %ptr_w\n";
4843fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %void %extinst vstoren %f32vec2_01 %u64_1 %ptr_g\n";
4844fd4e5da5Sopenharmony_ci  ss << "%val2 = OpExtInst %void %extinst vstoren %f32vec4_0123 %u64_1 "
4845fd4e5da5Sopenharmony_ci        "%ptr_g\n";
4846fd4e5da5Sopenharmony_ci
4847fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str(), "", "Physical64"));
4848fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
4849fd4e5da5Sopenharmony_ci}
4850fd4e5da5Sopenharmony_ci
4851fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VStoreNSuccessIntPhysical32) {
4852fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4853fd4e5da5Sopenharmony_ci  ss << "%ptr_w = OpAccessChain %u32_ptr_workgroup %u32vec8_workgroup %u32_1\n";
4854fd4e5da5Sopenharmony_ci  ss << "%ptr_g = OpPtrCastToGeneric %u32_ptr_generic %ptr_w\n";
4855fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %void %extinst vstoren %u32vec2_01 %u32_1 %ptr_g\n";
4856fd4e5da5Sopenharmony_ci  ss << "%val2 = OpExtInst %void %extinst vstoren %u32vec4_0123 %u32_1 "
4857fd4e5da5Sopenharmony_ci        "%ptr_g\n";
4858fd4e5da5Sopenharmony_ci
4859fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
4860fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
4861fd4e5da5Sopenharmony_ci}
4862fd4e5da5Sopenharmony_ci
4863fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VStoreNSuccessIntPhysical64) {
4864fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4865fd4e5da5Sopenharmony_ci  ss << "%ptr_w = OpAccessChain %u32_ptr_workgroup %u32vec8_workgroup %u32_1\n";
4866fd4e5da5Sopenharmony_ci  ss << "%ptr_g = OpPtrCastToGeneric %u32_ptr_generic %ptr_w\n";
4867fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %void %extinst vstoren %u32vec2_01 %u64_1 %ptr_g\n";
4868fd4e5da5Sopenharmony_ci  ss << "%val2 = OpExtInst %void %extinst vstoren %u32vec4_0123 %u64_1 "
4869fd4e5da5Sopenharmony_ci        "%ptr_g\n";
4870fd4e5da5Sopenharmony_ci
4871fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str(), "", "Physical64"));
4872fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
4873fd4e5da5Sopenharmony_ci}
4874fd4e5da5Sopenharmony_ci
4875fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VStoreNResultTypeNotVoid) {
4876fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4877fd4e5da5Sopenharmony_ci  ss << "%ptr_w = OpAccessChain %f32_ptr_workgroup %f32vec8_workgroup %u32_1\n";
4878fd4e5da5Sopenharmony_ci  ss << "%ptr_g = OpPtrCastToGeneric %f32_ptr_generic %ptr_w\n";
4879fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32 %extinst vstoren %f32vec2_01 %u32_1 %ptr_g\n";
4880fd4e5da5Sopenharmony_ci
4881fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
4882fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4883fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
4884fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std vstoren: expected Result Type to be void"));
4885fd4e5da5Sopenharmony_ci}
4886fd4e5da5Sopenharmony_ci
4887fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VStoreNDataWrongType) {
4888fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4889fd4e5da5Sopenharmony_ci  ss << "%ptr_w = OpAccessChain %f32_ptr_workgroup %f32vec8_workgroup %u32_1\n";
4890fd4e5da5Sopenharmony_ci  ss << "%ptr_g = OpPtrCastToGeneric %f32_ptr_generic %ptr_w\n";
4891fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %void %extinst vstoren %f32_1 %u32_1 %ptr_g\n";
4892fd4e5da5Sopenharmony_ci
4893fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
4894fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4895fd4e5da5Sopenharmony_ci  EXPECT_THAT(
4896fd4e5da5Sopenharmony_ci      getDiagnosticString(),
4897fd4e5da5Sopenharmony_ci      HasSubstr(
4898fd4e5da5Sopenharmony_ci          "OpenCL.std vstoren: expected Data to be an int or float vector"));
4899fd4e5da5Sopenharmony_ci}
4900fd4e5da5Sopenharmony_ci
4901fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VStoreNAddressingModelLogical) {
4902fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4903fd4e5da5Sopenharmony_ci  ss << "%ptr_w = OpAccessChain %f32_ptr_workgroup %f32vec8_workgroup %u32_1\n";
4904fd4e5da5Sopenharmony_ci  ss << "%ptr_g = OpPtrCastToGeneric %f32_ptr_generic %ptr_w\n";
4905fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %void %extinst vstoren %f32vec2_01 %u32_1 %ptr_g\n";
4906fd4e5da5Sopenharmony_ci
4907fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str(), "", "Logical"));
4908fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4909fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
4910fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std vstoren can only be used with physical "
4911fd4e5da5Sopenharmony_ci                        "addressing models"));
4912fd4e5da5Sopenharmony_ci}
4913fd4e5da5Sopenharmony_ci
4914fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VStoreNOffsetNotSizeT) {
4915fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4916fd4e5da5Sopenharmony_ci  ss << "%ptr_w = OpAccessChain %f32_ptr_workgroup %f32vec8_workgroup %u32_1\n";
4917fd4e5da5Sopenharmony_ci  ss << "%ptr_g = OpPtrCastToGeneric %f32_ptr_generic %ptr_w\n";
4918fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %void %extinst vstoren %f32vec2_01 %u32_1 %ptr_g\n";
4919fd4e5da5Sopenharmony_ci
4920fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str(), "", "Physical64"));
4921fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4922fd4e5da5Sopenharmony_ci  EXPECT_THAT(
4923fd4e5da5Sopenharmony_ci      getDiagnosticString(),
4924fd4e5da5Sopenharmony_ci      HasSubstr(
4925fd4e5da5Sopenharmony_ci          "OpenCL.std vstoren: expected operand Offset to be of type size_t "
4926fd4e5da5Sopenharmony_ci          "(64-bit integer for the addressing model used in the module)"));
4927fd4e5da5Sopenharmony_ci}
4928fd4e5da5Sopenharmony_ci
4929fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VStoreNPNotPointer) {
4930fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4931fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %void %extinst vstoren %f32vec2_01 %u32_1 "
4932fd4e5da5Sopenharmony_ci        "%f32_ptr_generic\n";
4933fd4e5da5Sopenharmony_ci
4934fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
4935fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
4936fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
4937fd4e5da5Sopenharmony_ci              HasSubstr("Operand '127[%_ptr_Generic_float]' cannot be a type"));
4938fd4e5da5Sopenharmony_ci}
4939fd4e5da5Sopenharmony_ci
4940fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VStoreNWrongStorageClass) {
4941fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4942fd4e5da5Sopenharmony_ci  ss << "%ptr_w = OpAccessChain %f32_ptr_uniform_constant "
4943fd4e5da5Sopenharmony_ci        "%f32vec8_uniform_constant %u32_1\n";
4944fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %void %extinst vstoren %f32vec2_01 %u32_1 %ptr_w\n";
4945fd4e5da5Sopenharmony_ci
4946fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
4947fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4948fd4e5da5Sopenharmony_ci  EXPECT_THAT(
4949fd4e5da5Sopenharmony_ci      getDiagnosticString(),
4950fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std vstoren: expected operand P storage class "
4951fd4e5da5Sopenharmony_ci                "to be Generic, CrossWorkgroup, Workgroup or Function"));
4952fd4e5da5Sopenharmony_ci}
4953fd4e5da5Sopenharmony_ci
4954fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, VStorePWrongDataType) {
4955fd4e5da5Sopenharmony_ci  std::ostringstream ss;
4956fd4e5da5Sopenharmony_ci  ss << "%ptr_w = OpAccessChain %f32_ptr_workgroup %f32vec8_workgroup %u32_1\n";
4957fd4e5da5Sopenharmony_ci  ss << "%ptr_g = OpPtrCastToGeneric %f32_ptr_generic %ptr_w\n";
4958fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %void %extinst vstoren %u32vec2_01 %u32_1 %ptr_g\n";
4959fd4e5da5Sopenharmony_ci
4960fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
4961fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4962fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
4963fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std vstoren: expected operand P data type to "
4964fd4e5da5Sopenharmony_ci                        "be equal to the type of operand Data components"));
4965fd4e5da5Sopenharmony_ci}
4966fd4e5da5Sopenharmony_ci
4967fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdShuffleSuccess) {
4968fd4e5da5Sopenharmony_ci  const std::string body = R"(
4969fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst shuffle %f32vec4_0123 %u32vec2_01
4970fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec4 %extinst shuffle %f32vec4_0123 %u32vec4_0123
4971fd4e5da5Sopenharmony_ci%val3 = OpExtInst %u32vec2 %extinst shuffle %u32vec4_0123 %u32vec2_01
4972fd4e5da5Sopenharmony_ci%val4 = OpExtInst %u32vec4 %extinst shuffle %u32vec4_0123 %u32vec4_0123
4973fd4e5da5Sopenharmony_ci)";
4974fd4e5da5Sopenharmony_ci
4975fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
4976fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
4977fd4e5da5Sopenharmony_ci}
4978fd4e5da5Sopenharmony_ci
4979fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdShuffleWrongResultType) {
4980fd4e5da5Sopenharmony_ci  const std::string body = R"(
4981fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst shuffle %f32vec4_0123 %u32vec2_01
4982fd4e5da5Sopenharmony_ci)";
4983fd4e5da5Sopenharmony_ci
4984fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
4985fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4986fd4e5da5Sopenharmony_ci  EXPECT_THAT(
4987fd4e5da5Sopenharmony_ci      getDiagnosticString(),
4988fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std shuffle: "
4989fd4e5da5Sopenharmony_ci                "expected Result Type to be an int or float vector type"));
4990fd4e5da5Sopenharmony_ci}
4991fd4e5da5Sopenharmony_ci
4992fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdShuffleResultTypeInvalidNumComponents) {
4993fd4e5da5Sopenharmony_ci  const std::string body = R"(
4994fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec3 %extinst shuffle %f32vec4_0123 %u32vec3_012
4995fd4e5da5Sopenharmony_ci)";
4996fd4e5da5Sopenharmony_ci
4997fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
4998fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
4999fd4e5da5Sopenharmony_ci  EXPECT_THAT(
5000fd4e5da5Sopenharmony_ci      getDiagnosticString(),
5001fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std shuffle: "
5002fd4e5da5Sopenharmony_ci                "expected Result Type to have 2, 4, 8 or 16 components"));
5003fd4e5da5Sopenharmony_ci}
5004fd4e5da5Sopenharmony_ci
5005fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdShuffleXWrongType) {
5006fd4e5da5Sopenharmony_ci  const std::string body = R"(
5007fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst shuffle %f32_0 %u32vec2_01
5008fd4e5da5Sopenharmony_ci)";
5009fd4e5da5Sopenharmony_ci
5010fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5011fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5012fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
5013fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std shuffle: "
5014fd4e5da5Sopenharmony_ci                        "expected operand X to be an int or float vector"));
5015fd4e5da5Sopenharmony_ci}
5016fd4e5da5Sopenharmony_ci
5017fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdShuffleXInvalidNumComponents) {
5018fd4e5da5Sopenharmony_ci  const std::string body = R"(
5019fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst shuffle %f32vec3_012 %u32vec2_01
5020fd4e5da5Sopenharmony_ci)";
5021fd4e5da5Sopenharmony_ci
5022fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5023fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5024fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
5025fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std shuffle: "
5026fd4e5da5Sopenharmony_ci                        "expected operand X to have 2, 4, 8 or 16 components"));
5027fd4e5da5Sopenharmony_ci}
5028fd4e5da5Sopenharmony_ci
5029fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdShuffleXInvalidComponentType) {
5030fd4e5da5Sopenharmony_ci  const std::string body = R"(
5031fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst shuffle %f64vec4_0123 %u32vec2_01
5032fd4e5da5Sopenharmony_ci)";
5033fd4e5da5Sopenharmony_ci
5034fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5035fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5036fd4e5da5Sopenharmony_ci  EXPECT_THAT(
5037fd4e5da5Sopenharmony_ci      getDiagnosticString(),
5038fd4e5da5Sopenharmony_ci      HasSubstr(
5039fd4e5da5Sopenharmony_ci          "OpenCL.std shuffle: "
5040fd4e5da5Sopenharmony_ci          "expected operand X and Result Type to have equal component types"));
5041fd4e5da5Sopenharmony_ci}
5042fd4e5da5Sopenharmony_ci
5043fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdShuffleShuffleMaskNotIntVector) {
5044fd4e5da5Sopenharmony_ci  const std::string body = R"(
5045fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst shuffle %f32vec4_0123 %f32vec2_01
5046fd4e5da5Sopenharmony_ci)";
5047fd4e5da5Sopenharmony_ci
5048fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5049fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5050fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
5051fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std shuffle: "
5052fd4e5da5Sopenharmony_ci                        "expected operand Shuffle Mask to be an int vector"));
5053fd4e5da5Sopenharmony_ci}
5054fd4e5da5Sopenharmony_ci
5055fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdShuffleShuffleMaskInvalidNumComponents) {
5056fd4e5da5Sopenharmony_ci  const std::string body = R"(
5057fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec4 %extinst shuffle %f32vec4_0123 %u32vec2_01
5058fd4e5da5Sopenharmony_ci)";
5059fd4e5da5Sopenharmony_ci
5060fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5061fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5062fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
5063fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std shuffle: "
5064fd4e5da5Sopenharmony_ci                        "expected operand Shuffle Mask to have the same number "
5065fd4e5da5Sopenharmony_ci                        "of components as Result Type"));
5066fd4e5da5Sopenharmony_ci}
5067fd4e5da5Sopenharmony_ci
5068fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdShuffleShuffleMaskInvalidBitWidth) {
5069fd4e5da5Sopenharmony_ci  const std::string body = R"(
5070fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f64vec2 %extinst shuffle %f64vec4_0123 %u32vec2_01
5071fd4e5da5Sopenharmony_ci)";
5072fd4e5da5Sopenharmony_ci
5073fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5074fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5075fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
5076fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std shuffle: "
5077fd4e5da5Sopenharmony_ci                        "expected operand Shuffle Mask components to have the "
5078fd4e5da5Sopenharmony_ci                        "same bit width as Result Type components"));
5079fd4e5da5Sopenharmony_ci}
5080fd4e5da5Sopenharmony_ci
5081fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdShuffle2Success) {
5082fd4e5da5Sopenharmony_ci  const std::string body = R"(
5083fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst shuffle2 %f32vec4_0123 %f32vec4_0123 %u32vec2_01
5084fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec4 %extinst shuffle2 %f32vec4_0123 %f32vec4_0123 %u32vec4_0123
5085fd4e5da5Sopenharmony_ci%val3 = OpExtInst %u32vec2 %extinst shuffle2 %u32vec4_0123 %u32vec4_0123 %u32vec2_01
5086fd4e5da5Sopenharmony_ci%val4 = OpExtInst %u32vec4 %extinst shuffle2 %u32vec4_0123 %u32vec4_0123 %u32vec4_0123
5087fd4e5da5Sopenharmony_ci)";
5088fd4e5da5Sopenharmony_ci
5089fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5090fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
5091fd4e5da5Sopenharmony_ci}
5092fd4e5da5Sopenharmony_ci
5093fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdShuffle2WrongResultType) {
5094fd4e5da5Sopenharmony_ci  const std::string body = R"(
5095fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst shuffle2 %f32vec4_0123 %f32vec4_0123 %u32vec2_01
5096fd4e5da5Sopenharmony_ci)";
5097fd4e5da5Sopenharmony_ci
5098fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5099fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5100fd4e5da5Sopenharmony_ci  EXPECT_THAT(
5101fd4e5da5Sopenharmony_ci      getDiagnosticString(),
5102fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std shuffle2: "
5103fd4e5da5Sopenharmony_ci                "expected Result Type to be an int or float vector type"));
5104fd4e5da5Sopenharmony_ci}
5105fd4e5da5Sopenharmony_ci
5106fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdShuffle2ResultTypeInvalidNumComponents) {
5107fd4e5da5Sopenharmony_ci  const std::string body = R"(
5108fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec3 %extinst shuffle2 %f32vec4_0123 %f32vec4_0123 %u32vec3_012
5109fd4e5da5Sopenharmony_ci)";
5110fd4e5da5Sopenharmony_ci
5111fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5112fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5113fd4e5da5Sopenharmony_ci  EXPECT_THAT(
5114fd4e5da5Sopenharmony_ci      getDiagnosticString(),
5115fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std shuffle2: "
5116fd4e5da5Sopenharmony_ci                "expected Result Type to have 2, 4, 8 or 16 components"));
5117fd4e5da5Sopenharmony_ci}
5118fd4e5da5Sopenharmony_ci
5119fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdShuffle2XWrongType) {
5120fd4e5da5Sopenharmony_ci  const std::string body = R"(
5121fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst shuffle2 %f32_0 %f32_0 %u32vec2_01
5122fd4e5da5Sopenharmony_ci)";
5123fd4e5da5Sopenharmony_ci
5124fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5125fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5126fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
5127fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std shuffle2: "
5128fd4e5da5Sopenharmony_ci                        "expected operand X to be an int or float vector"));
5129fd4e5da5Sopenharmony_ci}
5130fd4e5da5Sopenharmony_ci
5131fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdShuffle2YTypeDifferentFromX) {
5132fd4e5da5Sopenharmony_ci  const std::string body = R"(
5133fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst shuffle2 %f32vec2_01 %f32vec4_0123 %u32vec2_01
5134fd4e5da5Sopenharmony_ci)";
5135fd4e5da5Sopenharmony_ci
5136fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5137fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5138fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
5139fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std shuffle2: "
5140fd4e5da5Sopenharmony_ci                        "expected operands X and Y to be of the same type"));
5141fd4e5da5Sopenharmony_ci}
5142fd4e5da5Sopenharmony_ci
5143fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdShuffle2XInvalidNumComponents) {
5144fd4e5da5Sopenharmony_ci  const std::string body = R"(
5145fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst shuffle2 %f32vec3_012 %f32vec3_012 %u32vec2_01
5146fd4e5da5Sopenharmony_ci)";
5147fd4e5da5Sopenharmony_ci
5148fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5149fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5150fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
5151fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std shuffle2: "
5152fd4e5da5Sopenharmony_ci                        "expected operand X to have 2, 4, 8 or 16 components"));
5153fd4e5da5Sopenharmony_ci}
5154fd4e5da5Sopenharmony_ci
5155fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdShuffle2XInvalidComponentType) {
5156fd4e5da5Sopenharmony_ci  const std::string body = R"(
5157fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst shuffle2 %f64vec4_0123 %f64vec4_0123 %u32vec2_01
5158fd4e5da5Sopenharmony_ci)";
5159fd4e5da5Sopenharmony_ci
5160fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5161fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5162fd4e5da5Sopenharmony_ci  EXPECT_THAT(
5163fd4e5da5Sopenharmony_ci      getDiagnosticString(),
5164fd4e5da5Sopenharmony_ci      HasSubstr(
5165fd4e5da5Sopenharmony_ci          "OpenCL.std shuffle2: "
5166fd4e5da5Sopenharmony_ci          "expected operand X and Result Type to have equal component types"));
5167fd4e5da5Sopenharmony_ci}
5168fd4e5da5Sopenharmony_ci
5169fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdShuffle2ShuffleMaskNotIntVector) {
5170fd4e5da5Sopenharmony_ci  const std::string body = R"(
5171fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec2 %extinst shuffle2 %f32vec4_0123 %f32vec4_0123 %f32vec2_01
5172fd4e5da5Sopenharmony_ci)";
5173fd4e5da5Sopenharmony_ci
5174fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5175fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5176fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
5177fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std shuffle2: "
5178fd4e5da5Sopenharmony_ci                        "expected operand Shuffle Mask to be an int vector"));
5179fd4e5da5Sopenharmony_ci}
5180fd4e5da5Sopenharmony_ci
5181fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdShuffle2ShuffleMaskInvalidNumComponents) {
5182fd4e5da5Sopenharmony_ci  const std::string body = R"(
5183fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32vec4 %extinst shuffle2 %f32vec4_0123 %f32vec4_0123 %u32vec2_01
5184fd4e5da5Sopenharmony_ci)";
5185fd4e5da5Sopenharmony_ci
5186fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5187fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5188fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
5189fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std shuffle2: "
5190fd4e5da5Sopenharmony_ci                        "expected operand Shuffle Mask to have the same number "
5191fd4e5da5Sopenharmony_ci                        "of components as Result Type"));
5192fd4e5da5Sopenharmony_ci}
5193fd4e5da5Sopenharmony_ci
5194fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdShuffle2ShuffleMaskInvalidBitWidth) {
5195fd4e5da5Sopenharmony_ci  const std::string body = R"(
5196fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f64vec2 %extinst shuffle2 %f64vec4_0123 %f64vec4_0123 %u32vec2_01
5197fd4e5da5Sopenharmony_ci)";
5198fd4e5da5Sopenharmony_ci
5199fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5200fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5201fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
5202fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std shuffle2: "
5203fd4e5da5Sopenharmony_ci                        "expected operand Shuffle Mask components to have the "
5204fd4e5da5Sopenharmony_ci                        "same bit width as Result Type components"));
5205fd4e5da5Sopenharmony_ci}
5206fd4e5da5Sopenharmony_ci
5207fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdPrintfSuccess) {
5208fd4e5da5Sopenharmony_ci  const std::string body = R"(
5209fd4e5da5Sopenharmony_ci%format = OpAccessChain %u8_ptr_uniform_constant %u8arr_uniform_constant %u32_0
5210fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32 %extinst printf %format %u32_0 %u32_1
5211fd4e5da5Sopenharmony_ci)";
5212fd4e5da5Sopenharmony_ci
5213fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5214fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
5215fd4e5da5Sopenharmony_ci}
5216fd4e5da5Sopenharmony_ci
5217fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdPrintfBoolResultType) {
5218fd4e5da5Sopenharmony_ci  const std::string body = R"(
5219fd4e5da5Sopenharmony_ci%format = OpAccessChain %u8_ptr_uniform_constant %u8arr_uniform_constant %u32_0
5220fd4e5da5Sopenharmony_ci%val1 = OpExtInst %bool %extinst printf %format %u32_0 %u32_1
5221fd4e5da5Sopenharmony_ci)";
5222fd4e5da5Sopenharmony_ci
5223fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5224fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5225fd4e5da5Sopenharmony_ci  EXPECT_THAT(
5226fd4e5da5Sopenharmony_ci      getDiagnosticString(),
5227fd4e5da5Sopenharmony_ci      HasSubstr(
5228fd4e5da5Sopenharmony_ci          "OpenCL.std printf: expected Result Type to be a 32-bit int type"));
5229fd4e5da5Sopenharmony_ci}
5230fd4e5da5Sopenharmony_ci
5231fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdPrintfU64ResultType) {
5232fd4e5da5Sopenharmony_ci  const std::string body = R"(
5233fd4e5da5Sopenharmony_ci%format = OpAccessChain %u8_ptr_uniform_constant %u8arr_uniform_constant %u32_0
5234fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u64 %extinst printf %format %u32_0 %u32_1
5235fd4e5da5Sopenharmony_ci)";
5236fd4e5da5Sopenharmony_ci
5237fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5238fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5239fd4e5da5Sopenharmony_ci  EXPECT_THAT(
5240fd4e5da5Sopenharmony_ci      getDiagnosticString(),
5241fd4e5da5Sopenharmony_ci      HasSubstr(
5242fd4e5da5Sopenharmony_ci          "OpenCL.std printf: expected Result Type to be a 32-bit int type"));
5243fd4e5da5Sopenharmony_ci}
5244fd4e5da5Sopenharmony_ci
5245fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdPrintfFormatNotPointer) {
5246fd4e5da5Sopenharmony_ci  const std::string body = R"(
5247fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32 %extinst printf %u8_ptr_uniform_constant %u32_0 %u32_1
5248fd4e5da5Sopenharmony_ci)";
5249fd4e5da5Sopenharmony_ci
5250fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5251fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
5252fd4e5da5Sopenharmony_ci  EXPECT_THAT(
5253fd4e5da5Sopenharmony_ci      getDiagnosticString(),
5254fd4e5da5Sopenharmony_ci      HasSubstr("Operand '137[%_ptr_UniformConstant_uchar]' cannot be a "
5255fd4e5da5Sopenharmony_ci                "type"));
5256fd4e5da5Sopenharmony_ci}
5257fd4e5da5Sopenharmony_ci
5258fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdPrintfFormatNotUniformConstStorageClass) {
5259fd4e5da5Sopenharmony_ci  const std::string body = R"(
5260fd4e5da5Sopenharmony_ci%format_const = OpAccessChain %u8_ptr_uniform_constant %u8arr_uniform_constant %u32_0
5261fd4e5da5Sopenharmony_ci%format = OpBitcast %u8_ptr_generic %format_const
5262fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32 %extinst printf %format %u32_0 %u32_1
5263fd4e5da5Sopenharmony_ci)";
5264fd4e5da5Sopenharmony_ci
5265fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5266fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5267fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
5268fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std printf: expected Format storage class to "
5269fd4e5da5Sopenharmony_ci                        "be UniformConstant"));
5270fd4e5da5Sopenharmony_ci}
5271fd4e5da5Sopenharmony_ci
5272fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdPrintfFormatNotU8Pointer) {
5273fd4e5da5Sopenharmony_ci  const std::string body = R"(
5274fd4e5da5Sopenharmony_ci%format = OpAccessChain %u32_ptr_uniform_constant %u32vec8_uniform_constant %u32_0
5275fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32 %extinst printf %format %u32_0 %u32_1
5276fd4e5da5Sopenharmony_ci)";
5277fd4e5da5Sopenharmony_ci
5278fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5279fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5280fd4e5da5Sopenharmony_ci  EXPECT_THAT(
5281fd4e5da5Sopenharmony_ci      getDiagnosticString(),
5282fd4e5da5Sopenharmony_ci      HasSubstr(
5283fd4e5da5Sopenharmony_ci          "OpenCL.std printf: expected Format data type to be 8-bit int"));
5284fd4e5da5Sopenharmony_ci}
5285fd4e5da5Sopenharmony_ci
5286fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdPrefetchU32Success) {
5287fd4e5da5Sopenharmony_ci  const std::string body = R"(
5288fd4e5da5Sopenharmony_ci%ptr = OpAccessChain %u32_ptr_cross_workgroup %u32arr_cross_workgroup %u32_0
5289fd4e5da5Sopenharmony_ci%val1 = OpExtInst %void %extinst prefetch %ptr %u32_256
5290fd4e5da5Sopenharmony_ci)";
5291fd4e5da5Sopenharmony_ci
5292fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5293fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
5294fd4e5da5Sopenharmony_ci}
5295fd4e5da5Sopenharmony_ci
5296fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdPrefetchU32Physical64Success) {
5297fd4e5da5Sopenharmony_ci  const std::string body = R"(
5298fd4e5da5Sopenharmony_ci%ptr = OpAccessChain %u32_ptr_cross_workgroup %u32arr_cross_workgroup %u32_0
5299fd4e5da5Sopenharmony_ci%val1 = OpExtInst %void %extinst prefetch %ptr %u64_256
5300fd4e5da5Sopenharmony_ci)";
5301fd4e5da5Sopenharmony_ci
5302fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body, "", "Physical64"));
5303fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
5304fd4e5da5Sopenharmony_ci}
5305fd4e5da5Sopenharmony_ci
5306fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdPrefetchF32Success) {
5307fd4e5da5Sopenharmony_ci  const std::string body = R"(
5308fd4e5da5Sopenharmony_ci%ptr = OpAccessChain %f32_ptr_cross_workgroup %f32arr_cross_workgroup %u32_0
5309fd4e5da5Sopenharmony_ci%val1 = OpExtInst %void %extinst prefetch %ptr %u32_256
5310fd4e5da5Sopenharmony_ci)";
5311fd4e5da5Sopenharmony_ci
5312fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5313fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
5314fd4e5da5Sopenharmony_ci}
5315fd4e5da5Sopenharmony_ci
5316fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdPrefetchF32Vec2Success) {
5317fd4e5da5Sopenharmony_ci  const std::string body = R"(
5318fd4e5da5Sopenharmony_ci%ptr = OpAccessChain %f32vec2_ptr_cross_workgroup %f32vec2arr_cross_workgroup %u32_0
5319fd4e5da5Sopenharmony_ci%val1 = OpExtInst %void %extinst prefetch %ptr %u32_256
5320fd4e5da5Sopenharmony_ci)";
5321fd4e5da5Sopenharmony_ci
5322fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5323fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
5324fd4e5da5Sopenharmony_ci}
5325fd4e5da5Sopenharmony_ci
5326fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdPrefetchResultTypeNotVoid) {
5327fd4e5da5Sopenharmony_ci  const std::string body = R"(
5328fd4e5da5Sopenharmony_ci%ptr = OpAccessChain %u32_ptr_cross_workgroup %u32arr_cross_workgroup %u32_0
5329fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32 %extinst prefetch %ptr %u32_256
5330fd4e5da5Sopenharmony_ci)";
5331fd4e5da5Sopenharmony_ci
5332fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5333fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5334fd4e5da5Sopenharmony_ci  EXPECT_THAT(
5335fd4e5da5Sopenharmony_ci      getDiagnosticString(),
5336fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std prefetch: expected Result Type to be void"));
5337fd4e5da5Sopenharmony_ci}
5338fd4e5da5Sopenharmony_ci
5339fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdPrefetchPtrNotPointer) {
5340fd4e5da5Sopenharmony_ci  const std::string body = R"(
5341fd4e5da5Sopenharmony_ci%val1 = OpExtInst %void %extinst prefetch %u32_ptr_cross_workgroup %u32_256
5342fd4e5da5Sopenharmony_ci)";
5343fd4e5da5Sopenharmony_ci
5344fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5345fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
5346fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
5347fd4e5da5Sopenharmony_ci              HasSubstr("Operand '99[%_ptr_CrossWorkgroup_uint]' cannot be a "
5348fd4e5da5Sopenharmony_ci                        "type"));
5349fd4e5da5Sopenharmony_ci}
5350fd4e5da5Sopenharmony_ci
5351fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdPrefetchPtrNotCrossWorkgroup) {
5352fd4e5da5Sopenharmony_ci  const std::string body = R"(
5353fd4e5da5Sopenharmony_ci%ptr = OpAccessChain %u8_ptr_uniform_constant %u8arr_uniform_constant %u32_0
5354fd4e5da5Sopenharmony_ci%val1 = OpExtInst %void %extinst prefetch %ptr %u32_256
5355fd4e5da5Sopenharmony_ci)";
5356fd4e5da5Sopenharmony_ci
5357fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5358fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5359fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
5360fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std prefetch: expected operand Ptr storage "
5361fd4e5da5Sopenharmony_ci                        "class to be CrossWorkgroup"));
5362fd4e5da5Sopenharmony_ci}
5363fd4e5da5Sopenharmony_ci
5364fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdPrefetchInvalidDataType) {
5365fd4e5da5Sopenharmony_ci  const std::string body = R"(
5366fd4e5da5Sopenharmony_ci%ptr = OpAccessChain %struct_ptr_cross_workgroup %struct_arr_cross_workgroup %u32_0
5367fd4e5da5Sopenharmony_ci%val1 = OpExtInst %void %extinst prefetch %ptr %u32_256
5368fd4e5da5Sopenharmony_ci)";
5369fd4e5da5Sopenharmony_ci
5370fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5371fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5372fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
5373fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std prefetch: expected Ptr data type to be int "
5374fd4e5da5Sopenharmony_ci                        "or float scalar or vector"));
5375fd4e5da5Sopenharmony_ci}
5376fd4e5da5Sopenharmony_ci
5377fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdPrefetchAddressingModelLogical) {
5378fd4e5da5Sopenharmony_ci  const std::string body = R"(
5379fd4e5da5Sopenharmony_ci%ptr = OpAccessChain %u32_ptr_cross_workgroup %u32arr_cross_workgroup %u32_0
5380fd4e5da5Sopenharmony_ci%val1 = OpExtInst %void %extinst prefetch %ptr %u32_256
5381fd4e5da5Sopenharmony_ci)";
5382fd4e5da5Sopenharmony_ci
5383fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body, "", "Logical"));
5384fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5385fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
5386fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std prefetch can only be used with physical "
5387fd4e5da5Sopenharmony_ci                        "addressing models"));
5388fd4e5da5Sopenharmony_ci}
5389fd4e5da5Sopenharmony_ci
5390fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdPrefetchNumElementsNotSizeT) {
5391fd4e5da5Sopenharmony_ci  const std::string body = R"(
5392fd4e5da5Sopenharmony_ci%ptr = OpAccessChain %f32_ptr_cross_workgroup %f32arr_cross_workgroup %u32_0
5393fd4e5da5Sopenharmony_ci%val1 = OpExtInst %void %extinst prefetch %ptr %u32_256
5394fd4e5da5Sopenharmony_ci)";
5395fd4e5da5Sopenharmony_ci
5396fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body, "", "Physical64"));
5397fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5398fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
5399fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std prefetch: expected operand Num Elements to "
5400fd4e5da5Sopenharmony_ci                        "be of type size_t (64-bit integer for the addressing "
5401fd4e5da5Sopenharmony_ci                        "model used in the module)"));
5402fd4e5da5Sopenharmony_ci}
5403fd4e5da5Sopenharmony_ci
5404fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFractLike, Success) {
5405fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
5406fd4e5da5Sopenharmony_ci  std::ostringstream ss;
5407fd4e5da5Sopenharmony_ci  ss << "%var_f32 = OpVariable %f32_ptr_function Function\n";
5408fd4e5da5Sopenharmony_ci  ss << "%var_f32vec2 = OpVariable %f32vec2_ptr_function Function\n";
5409fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name
5410fd4e5da5Sopenharmony_ci     << " %f32_0 %var_f32\n";
5411fd4e5da5Sopenharmony_ci  ss << "%val2 = OpExtInst %f32vec2 %extinst " << ext_inst_name
5412fd4e5da5Sopenharmony_ci     << " %f32vec2_01 %var_f32vec2\n";
5413fd4e5da5Sopenharmony_ci
5414fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
5415fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
5416fd4e5da5Sopenharmony_ci}
5417fd4e5da5Sopenharmony_ci
5418fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFractLike, IntResultType) {
5419fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
5420fd4e5da5Sopenharmony_ci  std::ostringstream ss;
5421fd4e5da5Sopenharmony_ci  ss << "%var_f32 = OpVariable %f32_ptr_function Function\n";
5422fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %u32 %extinst " << ext_inst_name
5423fd4e5da5Sopenharmony_ci     << " %f32_0 %var_f32\n";
5424fd4e5da5Sopenharmony_ci
5425fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
5426fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5427fd4e5da5Sopenharmony_ci  EXPECT_THAT(
5428fd4e5da5Sopenharmony_ci      getDiagnosticString(),
5429fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
5430fd4e5da5Sopenharmony_ci                ": expected Result Type to be a float scalar or vector type"));
5431fd4e5da5Sopenharmony_ci}
5432fd4e5da5Sopenharmony_ci
5433fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFractLike, XWrongType) {
5434fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
5435fd4e5da5Sopenharmony_ci  std::ostringstream ss;
5436fd4e5da5Sopenharmony_ci  ss << "%var_f32 = OpVariable %f32_ptr_function Function\n";
5437fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name
5438fd4e5da5Sopenharmony_ci     << " %f64_0 %var_f32\n";
5439fd4e5da5Sopenharmony_ci
5440fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
5441fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5442fd4e5da5Sopenharmony_ci  EXPECT_THAT(
5443fd4e5da5Sopenharmony_ci      getDiagnosticString(),
5444fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
5445fd4e5da5Sopenharmony_ci                ": expected type of operand X to be equal to Result Type"));
5446fd4e5da5Sopenharmony_ci}
5447fd4e5da5Sopenharmony_ci
5448fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFractLike, NotPointer) {
5449fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
5450fd4e5da5Sopenharmony_ci  std::ostringstream ss;
5451fd4e5da5Sopenharmony_ci  ss << "%var_f32 = OpVariable %f32_ptr_function Function\n";
5452fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name
5453fd4e5da5Sopenharmony_ci     << " %f32_0 %f32_1\n";
5454fd4e5da5Sopenharmony_ci
5455fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
5456fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5457fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
5458fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std " + ext_inst_name +
5459fd4e5da5Sopenharmony_ci                        ": expected the last operand to be a pointer"));
5460fd4e5da5Sopenharmony_ci}
5461fd4e5da5Sopenharmony_ci
5462fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFractLike, PointerInvalidStorageClass) {
5463fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
5464fd4e5da5Sopenharmony_ci  std::ostringstream ss;
5465fd4e5da5Sopenharmony_ci  ss << "%ptr = OpAccessChain %f32_ptr_uniform_constant "
5466fd4e5da5Sopenharmony_ci        "%f32vec8_uniform_constant %u32_1\n";
5467fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name << " %f32_0 %ptr\n";
5468fd4e5da5Sopenharmony_ci
5469fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
5470fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5471fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
5472fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std " + ext_inst_name +
5473fd4e5da5Sopenharmony_ci                        ": expected storage class of the pointer to be "
5474fd4e5da5Sopenharmony_ci                        "Generic, CrossWorkgroup, Workgroup or Function"));
5475fd4e5da5Sopenharmony_ci}
5476fd4e5da5Sopenharmony_ci
5477fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFractLike, PointerWrongDataType) {
5478fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
5479fd4e5da5Sopenharmony_ci  std::ostringstream ss;
5480fd4e5da5Sopenharmony_ci  ss << "%var_u32 = OpVariable %u32_ptr_function Function\n";
5481fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name
5482fd4e5da5Sopenharmony_ci     << " %f32_0 %var_u32\n";
5483fd4e5da5Sopenharmony_ci
5484fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
5485fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5486fd4e5da5Sopenharmony_ci  EXPECT_THAT(
5487fd4e5da5Sopenharmony_ci      getDiagnosticString(),
5488fd4e5da5Sopenharmony_ci      HasSubstr(
5489fd4e5da5Sopenharmony_ci          "OpenCL.std " + ext_inst_name +
5490fd4e5da5Sopenharmony_ci          ": expected data type of the pointer to be equal to Result Type"));
5491fd4e5da5Sopenharmony_ci}
5492fd4e5da5Sopenharmony_ci
5493fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllFractLike, ValidateOpenCLStdFractLike,
5494fd4e5da5Sopenharmony_ci                         ::testing::ValuesIn(std::vector<std::string>{
5495fd4e5da5Sopenharmony_ci                             "fract",
5496fd4e5da5Sopenharmony_ci                             "modf",
5497fd4e5da5Sopenharmony_ci                             "sincos",
5498fd4e5da5Sopenharmony_ci                         }));
5499fd4e5da5Sopenharmony_ci
5500fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdRemquoSuccess) {
5501fd4e5da5Sopenharmony_ci  const std::string body = R"(
5502fd4e5da5Sopenharmony_ci%var_u32 = OpVariable %u32_ptr_function Function
5503fd4e5da5Sopenharmony_ci%var_u32vec2 = OpVariable %u32vec2_ptr_function Function
5504fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst remquo %f32_3 %f32_2 %var_u32
5505fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec2 %extinst remquo %f32vec2_01 %f32vec2_12 %var_u32vec2
5506fd4e5da5Sopenharmony_ci)";
5507fd4e5da5Sopenharmony_ci
5508fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5509fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
5510fd4e5da5Sopenharmony_ci}
5511fd4e5da5Sopenharmony_ci
5512fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdRemquoIntResultType) {
5513fd4e5da5Sopenharmony_ci  const std::string body = R"(
5514fd4e5da5Sopenharmony_ci%var_u32 = OpVariable %u32_ptr_function Function
5515fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32 %extinst remquo %f32_3 %f32_2 %var_u32
5516fd4e5da5Sopenharmony_ci)";
5517fd4e5da5Sopenharmony_ci
5518fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5519fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5520fd4e5da5Sopenharmony_ci  EXPECT_THAT(
5521fd4e5da5Sopenharmony_ci      getDiagnosticString(),
5522fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std remquo: "
5523fd4e5da5Sopenharmony_ci                "expected Result Type to be a float scalar or vector type"));
5524fd4e5da5Sopenharmony_ci}
5525fd4e5da5Sopenharmony_ci
5526fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdRemquoXWrongType) {
5527fd4e5da5Sopenharmony_ci  const std::string body = R"(
5528fd4e5da5Sopenharmony_ci%var_u32 = OpVariable %f32_ptr_function Function
5529fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst remquo %u32_3 %f32_2 %var_u32
5530fd4e5da5Sopenharmony_ci)";
5531fd4e5da5Sopenharmony_ci
5532fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5533fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5534fd4e5da5Sopenharmony_ci  EXPECT_THAT(
5535fd4e5da5Sopenharmony_ci      getDiagnosticString(),
5536fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std remquo: "
5537fd4e5da5Sopenharmony_ci                "expected type of operand X to be equal to Result Type"));
5538fd4e5da5Sopenharmony_ci}
5539fd4e5da5Sopenharmony_ci
5540fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdRemquoYWrongType) {
5541fd4e5da5Sopenharmony_ci  const std::string body = R"(
5542fd4e5da5Sopenharmony_ci%var_u32 = OpVariable %f32_ptr_function Function
5543fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst remquo %f32_3 %u32_2 %var_u32
5544fd4e5da5Sopenharmony_ci)";
5545fd4e5da5Sopenharmony_ci
5546fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5547fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5548fd4e5da5Sopenharmony_ci  EXPECT_THAT(
5549fd4e5da5Sopenharmony_ci      getDiagnosticString(),
5550fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std remquo: "
5551fd4e5da5Sopenharmony_ci                "expected type of operand Y to be equal to Result Type"));
5552fd4e5da5Sopenharmony_ci}
5553fd4e5da5Sopenharmony_ci
5554fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdRemquoNotPointer) {
5555fd4e5da5Sopenharmony_ci  const std::string body = R"(
5556fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst remquo %f32_3 %f32_2 %f32_1
5557fd4e5da5Sopenharmony_ci)";
5558fd4e5da5Sopenharmony_ci
5559fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5560fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5561fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
5562fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std remquo: "
5563fd4e5da5Sopenharmony_ci                        "expected the last operand to be a pointer"));
5564fd4e5da5Sopenharmony_ci}
5565fd4e5da5Sopenharmony_ci
5566fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdRemquoPointerWrongStorageClass) {
5567fd4e5da5Sopenharmony_ci  const std::string body = R"(
5568fd4e5da5Sopenharmony_ci%ptr = OpAccessChain %f32_ptr_uniform_constant %f32vec8_uniform_constant %u32_1
5569fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst remquo %f32_3 %f32_2 %ptr
5570fd4e5da5Sopenharmony_ci)";
5571fd4e5da5Sopenharmony_ci
5572fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5573fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5574fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
5575fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std remquo: "
5576fd4e5da5Sopenharmony_ci                        "expected storage class of the pointer to be Generic, "
5577fd4e5da5Sopenharmony_ci                        "CrossWorkgroup, Workgroup or Function"));
5578fd4e5da5Sopenharmony_ci}
5579fd4e5da5Sopenharmony_ci
5580fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdRemquoPointerWrongDataType) {
5581fd4e5da5Sopenharmony_ci  const std::string body = R"(
5582fd4e5da5Sopenharmony_ci%var_f32 = OpVariable %f32_ptr_function Function
5583fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst remquo %f32_3 %f32_2 %var_f32
5584fd4e5da5Sopenharmony_ci)";
5585fd4e5da5Sopenharmony_ci
5586fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5587fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5588fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
5589fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std remquo: "
5590fd4e5da5Sopenharmony_ci                        "expected data type of the pointer to be a 32-bit int "
5591fd4e5da5Sopenharmony_ci                        "scalar or vector type"));
5592fd4e5da5Sopenharmony_ci}
5593fd4e5da5Sopenharmony_ci
5594fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdRemquoPointerWrongDataTypeWidth) {
5595fd4e5da5Sopenharmony_ci  const std::string body = R"(
5596fd4e5da5Sopenharmony_ci%var_u64 = OpVariable %u64_ptr_function Function
5597fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst remquo %f32_3 %f32_2 %var_u64
5598fd4e5da5Sopenharmony_ci)";
5599fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5600fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5601fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
5602fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std remquo: "
5603fd4e5da5Sopenharmony_ci                        "expected data type of the pointer to be a 32-bit int "
5604fd4e5da5Sopenharmony_ci                        "scalar or vector type"));
5605fd4e5da5Sopenharmony_ci}
5606fd4e5da5Sopenharmony_ci
5607fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdRemquoPointerWrongNumberOfComponents) {
5608fd4e5da5Sopenharmony_ci  const std::string body = R"(
5609fd4e5da5Sopenharmony_ci%var_u32vec2 = OpVariable %u32vec2_ptr_function Function
5610fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst remquo %f32_3 %f32_2 %var_u32vec2
5611fd4e5da5Sopenharmony_ci)";
5612fd4e5da5Sopenharmony_ci
5613fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5614fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5615fd4e5da5Sopenharmony_ci  EXPECT_THAT(
5616fd4e5da5Sopenharmony_ci      getDiagnosticString(),
5617fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std remquo: "
5618fd4e5da5Sopenharmony_ci                "expected data type of the pointer to have the same number "
5619fd4e5da5Sopenharmony_ci                "of components as Result Type"));
5620fd4e5da5Sopenharmony_ci}
5621fd4e5da5Sopenharmony_ci
5622fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFrexpLike, Success) {
5623fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
5624fd4e5da5Sopenharmony_ci  std::ostringstream ss;
5625fd4e5da5Sopenharmony_ci  ss << "%var_u32 = OpVariable %u32_ptr_function Function\n";
5626fd4e5da5Sopenharmony_ci  ss << "%var_u32vec2 = OpVariable %u32vec2_ptr_function Function\n";
5627fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name
5628fd4e5da5Sopenharmony_ci     << " %f32_0 %var_u32\n";
5629fd4e5da5Sopenharmony_ci  ss << "%val2 = OpExtInst %f32vec2 %extinst " << ext_inst_name
5630fd4e5da5Sopenharmony_ci     << " %f32vec2_01 %var_u32vec2\n";
5631fd4e5da5Sopenharmony_ci
5632fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
5633fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
5634fd4e5da5Sopenharmony_ci}
5635fd4e5da5Sopenharmony_ci
5636fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFrexpLike, IntResultType) {
5637fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
5638fd4e5da5Sopenharmony_ci  std::ostringstream ss;
5639fd4e5da5Sopenharmony_ci  ss << "%var_u32 = OpVariable %u32_ptr_function Function\n";
5640fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %u32 %extinst " << ext_inst_name
5641fd4e5da5Sopenharmony_ci     << " %f32_0 %var_u32\n";
5642fd4e5da5Sopenharmony_ci
5643fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
5644fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5645fd4e5da5Sopenharmony_ci  EXPECT_THAT(
5646fd4e5da5Sopenharmony_ci      getDiagnosticString(),
5647fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
5648fd4e5da5Sopenharmony_ci                ": expected Result Type to be a float scalar or vector type"));
5649fd4e5da5Sopenharmony_ci}
5650fd4e5da5Sopenharmony_ci
5651fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFrexpLike, XWrongType) {
5652fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
5653fd4e5da5Sopenharmony_ci  std::ostringstream ss;
5654fd4e5da5Sopenharmony_ci  ss << "%var_u32 = OpVariable %u32_ptr_function Function\n";
5655fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name
5656fd4e5da5Sopenharmony_ci     << " %f64_0 %var_u32\n";
5657fd4e5da5Sopenharmony_ci
5658fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
5659fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5660fd4e5da5Sopenharmony_ci  EXPECT_THAT(
5661fd4e5da5Sopenharmony_ci      getDiagnosticString(),
5662fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
5663fd4e5da5Sopenharmony_ci                ": expected type of operand X to be equal to Result Type"));
5664fd4e5da5Sopenharmony_ci}
5665fd4e5da5Sopenharmony_ci
5666fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFrexpLike, NotPointer) {
5667fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
5668fd4e5da5Sopenharmony_ci  std::ostringstream ss;
5669fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name
5670fd4e5da5Sopenharmony_ci     << " %f32_0 %u32_1\n";
5671fd4e5da5Sopenharmony_ci
5672fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
5673fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5674fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
5675fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std " + ext_inst_name +
5676fd4e5da5Sopenharmony_ci                        ": expected the last operand to be a pointer"));
5677fd4e5da5Sopenharmony_ci}
5678fd4e5da5Sopenharmony_ci
5679fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFrexpLike, PointerInvalidStorageClass) {
5680fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
5681fd4e5da5Sopenharmony_ci  std::ostringstream ss;
5682fd4e5da5Sopenharmony_ci  ss << "%ptr = OpAccessChain %f32_ptr_uniform_constant "
5683fd4e5da5Sopenharmony_ci        "%f32vec8_uniform_constant %u32_1\n";
5684fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name << " %f32_0 %ptr\n";
5685fd4e5da5Sopenharmony_ci
5686fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
5687fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5688fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
5689fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std " + ext_inst_name +
5690fd4e5da5Sopenharmony_ci                        ": expected storage class of the pointer to be "
5691fd4e5da5Sopenharmony_ci                        "Generic, CrossWorkgroup, Workgroup or Function"));
5692fd4e5da5Sopenharmony_ci}
5693fd4e5da5Sopenharmony_ci
5694fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFrexpLike, PointerDataTypeFloat) {
5695fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
5696fd4e5da5Sopenharmony_ci  std::ostringstream ss;
5697fd4e5da5Sopenharmony_ci  ss << "%var_f32 = OpVariable %f32_ptr_function Function\n";
5698fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name
5699fd4e5da5Sopenharmony_ci     << " %f32_0 %var_f32\n";
5700fd4e5da5Sopenharmony_ci
5701fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
5702fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5703fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
5704fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std " + ext_inst_name +
5705fd4e5da5Sopenharmony_ci                        ": expected data type of the pointer to be a 32-bit "
5706fd4e5da5Sopenharmony_ci                        "int scalar or vector type"));
5707fd4e5da5Sopenharmony_ci}
5708fd4e5da5Sopenharmony_ci
5709fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFrexpLike, PointerDataTypeU64) {
5710fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
5711fd4e5da5Sopenharmony_ci  std::ostringstream ss;
5712fd4e5da5Sopenharmony_ci  ss << "%var_u64 = OpVariable %u64_ptr_function Function\n";
5713fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name
5714fd4e5da5Sopenharmony_ci     << " %f32_0 %var_u64\n";
5715fd4e5da5Sopenharmony_ci
5716fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
5717fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5718fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
5719fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std " + ext_inst_name +
5720fd4e5da5Sopenharmony_ci                        ": expected data type of the pointer to be a 32-bit "
5721fd4e5da5Sopenharmony_ci                        "int scalar or vector type"));
5722fd4e5da5Sopenharmony_ci}
5723fd4e5da5Sopenharmony_ci
5724fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdFrexpLike, PointerDataTypeDiffSize) {
5725fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
5726fd4e5da5Sopenharmony_ci  std::ostringstream ss;
5727fd4e5da5Sopenharmony_ci  ss << "%var_u32 = OpVariable %u32_ptr_function Function\n";
5728fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32vec2 %extinst " << ext_inst_name
5729fd4e5da5Sopenharmony_ci     << " %f32vec2_01 %var_u32\n";
5730fd4e5da5Sopenharmony_ci
5731fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
5732fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5733fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
5734fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std " + ext_inst_name +
5735fd4e5da5Sopenharmony_ci                        ": expected data type of the pointer to have the same "
5736fd4e5da5Sopenharmony_ci                        "number of components as Result Type"));
5737fd4e5da5Sopenharmony_ci}
5738fd4e5da5Sopenharmony_ci
5739fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllFrexpLike, ValidateOpenCLStdFrexpLike,
5740fd4e5da5Sopenharmony_ci                         ::testing::ValuesIn(std::vector<std::string>{
5741fd4e5da5Sopenharmony_ci                             "frexp",
5742fd4e5da5Sopenharmony_ci                             "lgamma_r",
5743fd4e5da5Sopenharmony_ci                         }));
5744fd4e5da5Sopenharmony_ci
5745fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdIlogbSuccess) {
5746fd4e5da5Sopenharmony_ci  const std::string body = R"(
5747fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32 %extinst ilogb %f32_3
5748fd4e5da5Sopenharmony_ci%val2 = OpExtInst %u32vec2 %extinst ilogb %f32vec2_12
5749fd4e5da5Sopenharmony_ci)";
5750fd4e5da5Sopenharmony_ci
5751fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5752fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
5753fd4e5da5Sopenharmony_ci}
5754fd4e5da5Sopenharmony_ci
5755fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdIlogbFloatResultType) {
5756fd4e5da5Sopenharmony_ci  const std::string body = R"(
5757fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst ilogb %f32_3
5758fd4e5da5Sopenharmony_ci)";
5759fd4e5da5Sopenharmony_ci
5760fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5761fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5762fd4e5da5Sopenharmony_ci  EXPECT_THAT(
5763fd4e5da5Sopenharmony_ci      getDiagnosticString(),
5764fd4e5da5Sopenharmony_ci      HasSubstr(
5765fd4e5da5Sopenharmony_ci          "OpenCL.std ilogb: "
5766fd4e5da5Sopenharmony_ci          "expected Result Type to be a 32-bit int scalar or vector type"));
5767fd4e5da5Sopenharmony_ci}
5768fd4e5da5Sopenharmony_ci
5769fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdIlogbIntX) {
5770fd4e5da5Sopenharmony_ci  const std::string body = R"(
5771fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32 %extinst ilogb %u32_3
5772fd4e5da5Sopenharmony_ci)";
5773fd4e5da5Sopenharmony_ci
5774fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5775fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5776fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
5777fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std ilogb: "
5778fd4e5da5Sopenharmony_ci                        "expected operand X to be a float scalar or vector"));
5779fd4e5da5Sopenharmony_ci}
5780fd4e5da5Sopenharmony_ci
5781fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdIlogbDiffSize) {
5782fd4e5da5Sopenharmony_ci  const std::string body = R"(
5783fd4e5da5Sopenharmony_ci%val2 = OpExtInst %u32vec2 %extinst ilogb %f32_1
5784fd4e5da5Sopenharmony_ci)";
5785fd4e5da5Sopenharmony_ci
5786fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5787fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5788fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
5789fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std ilogb: "
5790fd4e5da5Sopenharmony_ci                        "expected operand X to have the same number of "
5791fd4e5da5Sopenharmony_ci                        "components as Result Type"));
5792fd4e5da5Sopenharmony_ci}
5793fd4e5da5Sopenharmony_ci
5794fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdNanSuccess) {
5795fd4e5da5Sopenharmony_ci  const std::string body = R"(
5796fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst nan %u32_3
5797fd4e5da5Sopenharmony_ci%val2 = OpExtInst %f32vec2 %extinst nan %u32vec2_12
5798fd4e5da5Sopenharmony_ci)";
5799fd4e5da5Sopenharmony_ci
5800fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5801fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
5802fd4e5da5Sopenharmony_ci}
5803fd4e5da5Sopenharmony_ci
5804fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdNanIntResultType) {
5805fd4e5da5Sopenharmony_ci  const std::string body = R"(
5806fd4e5da5Sopenharmony_ci%val1 = OpExtInst %u32 %extinst nan %u32_3
5807fd4e5da5Sopenharmony_ci)";
5808fd4e5da5Sopenharmony_ci
5809fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5810fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5811fd4e5da5Sopenharmony_ci  EXPECT_THAT(
5812fd4e5da5Sopenharmony_ci      getDiagnosticString(),
5813fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std nan: "
5814fd4e5da5Sopenharmony_ci                "expected Result Type to be a float scalar or vector type"));
5815fd4e5da5Sopenharmony_ci}
5816fd4e5da5Sopenharmony_ci
5817fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdNanFloatNancode) {
5818fd4e5da5Sopenharmony_ci  const std::string body = R"(
5819fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst nan %f32_3
5820fd4e5da5Sopenharmony_ci)";
5821fd4e5da5Sopenharmony_ci
5822fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5823fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5824fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
5825fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std nan: "
5826fd4e5da5Sopenharmony_ci                        "expected Nancode to be an int scalar or vector type"));
5827fd4e5da5Sopenharmony_ci}
5828fd4e5da5Sopenharmony_ci
5829fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdNanFloatDiffSize) {
5830fd4e5da5Sopenharmony_ci  const std::string body = R"(
5831fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f32 %extinst nan %u32vec2_12
5832fd4e5da5Sopenharmony_ci)";
5833fd4e5da5Sopenharmony_ci
5834fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5835fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5836fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
5837fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std nan: "
5838fd4e5da5Sopenharmony_ci                        "expected Nancode to have the same number of "
5839fd4e5da5Sopenharmony_ci                        "components as Result Type"));
5840fd4e5da5Sopenharmony_ci}
5841fd4e5da5Sopenharmony_ci
5842fd4e5da5Sopenharmony_ciTEST_F(ValidateExtInst, OpenCLStdNanFloatDiffBitWidth) {
5843fd4e5da5Sopenharmony_ci  const std::string body = R"(
5844fd4e5da5Sopenharmony_ci%val1 = OpExtInst %f64 %extinst nan %u32_2
5845fd4e5da5Sopenharmony_ci)";
5846fd4e5da5Sopenharmony_ci
5847fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(body));
5848fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5849fd4e5da5Sopenharmony_ci  EXPECT_THAT(
5850fd4e5da5Sopenharmony_ci      getDiagnosticString(),
5851fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std nan: "
5852fd4e5da5Sopenharmony_ci                "expected Nancode to have the same bit width as Result Type"));
5853fd4e5da5Sopenharmony_ci}
5854fd4e5da5Sopenharmony_ci
5855fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdLdexpLike, Success) {
5856fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
5857fd4e5da5Sopenharmony_ci  std::ostringstream ss;
5858fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name
5859fd4e5da5Sopenharmony_ci     << " %f32_0 %u32_1\n";
5860fd4e5da5Sopenharmony_ci  ss << "%val2 = OpExtInst %f32vec2 %extinst " << ext_inst_name
5861fd4e5da5Sopenharmony_ci     << " %f32vec2_12 %u32vec2_12\n";
5862fd4e5da5Sopenharmony_ci
5863fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
5864fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
5865fd4e5da5Sopenharmony_ci}
5866fd4e5da5Sopenharmony_ci
5867fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdLdexpLike, IntResultType) {
5868fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
5869fd4e5da5Sopenharmony_ci  std::ostringstream ss;
5870fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %u32 %extinst " << ext_inst_name
5871fd4e5da5Sopenharmony_ci     << " %f32_0 %u32_1\n";
5872fd4e5da5Sopenharmony_ci
5873fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
5874fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5875fd4e5da5Sopenharmony_ci  EXPECT_THAT(
5876fd4e5da5Sopenharmony_ci      getDiagnosticString(),
5877fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
5878fd4e5da5Sopenharmony_ci                ": expected Result Type to be a float scalar or vector type"));
5879fd4e5da5Sopenharmony_ci}
5880fd4e5da5Sopenharmony_ci
5881fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdLdexpLike, XWrongType) {
5882fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
5883fd4e5da5Sopenharmony_ci  std::ostringstream ss;
5884fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name
5885fd4e5da5Sopenharmony_ci     << " %u32_0 %u32_1\n";
5886fd4e5da5Sopenharmony_ci
5887fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
5888fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5889fd4e5da5Sopenharmony_ci  EXPECT_THAT(
5890fd4e5da5Sopenharmony_ci      getDiagnosticString(),
5891fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
5892fd4e5da5Sopenharmony_ci                ": expected type of operand X to be equal to Result Type"));
5893fd4e5da5Sopenharmony_ci}
5894fd4e5da5Sopenharmony_ci
5895fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdLdexpLike, ExponentNotInt) {
5896fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
5897fd4e5da5Sopenharmony_ci  std::ostringstream ss;
5898fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name
5899fd4e5da5Sopenharmony_ci     << " %f32_0 %f32_1\n";
5900fd4e5da5Sopenharmony_ci
5901fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
5902fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5903fd4e5da5Sopenharmony_ci  EXPECT_THAT(
5904fd4e5da5Sopenharmony_ci      getDiagnosticString(),
5905fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
5906fd4e5da5Sopenharmony_ci                ": expected the exponent to be a 32-bit int scalar or vector"));
5907fd4e5da5Sopenharmony_ci}
5908fd4e5da5Sopenharmony_ci
5909fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdLdexpLike, ExponentNotInt32) {
5910fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
5911fd4e5da5Sopenharmony_ci  std::ostringstream ss;
5912fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name
5913fd4e5da5Sopenharmony_ci     << " %f32_0 %u64_1\n";
5914fd4e5da5Sopenharmony_ci
5915fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
5916fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5917fd4e5da5Sopenharmony_ci  EXPECT_THAT(
5918fd4e5da5Sopenharmony_ci      getDiagnosticString(),
5919fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
5920fd4e5da5Sopenharmony_ci                ": expected the exponent to be a 32-bit int scalar or vector"));
5921fd4e5da5Sopenharmony_ci}
5922fd4e5da5Sopenharmony_ci
5923fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdLdexpLike, ExponentWrongSize) {
5924fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
5925fd4e5da5Sopenharmony_ci  std::ostringstream ss;
5926fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f32 %extinst " << ext_inst_name
5927fd4e5da5Sopenharmony_ci     << " %f32_0 %u32vec2_01\n";
5928fd4e5da5Sopenharmony_ci
5929fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
5930fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5931fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
5932fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std " + ext_inst_name +
5933fd4e5da5Sopenharmony_ci                        ": expected the exponent to have the same number of "
5934fd4e5da5Sopenharmony_ci                        "components as Result Type"));
5935fd4e5da5Sopenharmony_ci}
5936fd4e5da5Sopenharmony_ci
5937fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllLdexpLike, ValidateOpenCLStdLdexpLike,
5938fd4e5da5Sopenharmony_ci                         ::testing::ValuesIn(std::vector<std::string>{
5939fd4e5da5Sopenharmony_ci                             "ldexp",
5940fd4e5da5Sopenharmony_ci                             "pown",
5941fd4e5da5Sopenharmony_ci                             "rootn",
5942fd4e5da5Sopenharmony_ci                         }));
5943fd4e5da5Sopenharmony_ci
5944fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUpsampleLike, Success) {
5945fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
5946fd4e5da5Sopenharmony_ci  std::ostringstream ss;
5947fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %u16 %extinst " << ext_inst_name << " %u8_1 %u8_2\n";
5948fd4e5da5Sopenharmony_ci  ss << "%val2 = OpExtInst %u32 %extinst " << ext_inst_name
5949fd4e5da5Sopenharmony_ci     << " %u16_1 %u16_2\n";
5950fd4e5da5Sopenharmony_ci  ss << "%val3 = OpExtInst %u64 %extinst " << ext_inst_name
5951fd4e5da5Sopenharmony_ci     << " %u32_1 %u32_2\n";
5952fd4e5da5Sopenharmony_ci  ss << "%val4 = OpExtInst %u64vec2 %extinst " << ext_inst_name
5953fd4e5da5Sopenharmony_ci     << " %u32vec2_01 %u32vec2_01\n";
5954fd4e5da5Sopenharmony_ci
5955fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
5956fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
5957fd4e5da5Sopenharmony_ci}
5958fd4e5da5Sopenharmony_ci
5959fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUpsampleLike, FloatResultType) {
5960fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
5961fd4e5da5Sopenharmony_ci  std::ostringstream ss;
5962fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %f64 %extinst " << ext_inst_name
5963fd4e5da5Sopenharmony_ci     << " %u32_1 %u32_2\n";
5964fd4e5da5Sopenharmony_ci
5965fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
5966fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5967fd4e5da5Sopenharmony_ci  EXPECT_THAT(
5968fd4e5da5Sopenharmony_ci      getDiagnosticString(),
5969fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
5970fd4e5da5Sopenharmony_ci                ": expected Result Type to be an int scalar or vector type"));
5971fd4e5da5Sopenharmony_ci}
5972fd4e5da5Sopenharmony_ci
5973fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUpsampleLike, InvalidResultTypeBitWidth) {
5974fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
5975fd4e5da5Sopenharmony_ci  std::ostringstream ss;
5976fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %u8 %extinst " << ext_inst_name << " %u8_1 %u8_2\n";
5977fd4e5da5Sopenharmony_ci
5978fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
5979fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5980fd4e5da5Sopenharmony_ci  EXPECT_THAT(
5981fd4e5da5Sopenharmony_ci      getDiagnosticString(),
5982fd4e5da5Sopenharmony_ci      HasSubstr(
5983fd4e5da5Sopenharmony_ci          "OpenCL.std " + ext_inst_name +
5984fd4e5da5Sopenharmony_ci          ": expected bit width of Result Type components to be 16, 32 or 64"));
5985fd4e5da5Sopenharmony_ci}
5986fd4e5da5Sopenharmony_ci
5987fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUpsampleLike, LoHiDiffType) {
5988fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
5989fd4e5da5Sopenharmony_ci  std::ostringstream ss;
5990fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %u64 %extinst " << ext_inst_name
5991fd4e5da5Sopenharmony_ci     << " %u32_1 %u16_2\n";
5992fd4e5da5Sopenharmony_ci
5993fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
5994fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
5995fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
5996fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std " + ext_inst_name +
5997fd4e5da5Sopenharmony_ci                        ": expected Hi and Lo operands to have the same type"));
5998fd4e5da5Sopenharmony_ci}
5999fd4e5da5Sopenharmony_ci
6000fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUpsampleLike, DiffNumberOfComponents) {
6001fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
6002fd4e5da5Sopenharmony_ci  std::ostringstream ss;
6003fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %u64vec2 %extinst " << ext_inst_name
6004fd4e5da5Sopenharmony_ci     << " %u32_1 %u32_2\n";
6005fd4e5da5Sopenharmony_ci
6006fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
6007fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
6008fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
6009fd4e5da5Sopenharmony_ci              HasSubstr("OpenCL.std " + ext_inst_name +
6010fd4e5da5Sopenharmony_ci                        ": expected Hi and Lo operands to have the same number "
6011fd4e5da5Sopenharmony_ci                        "of components as Result Type"));
6012fd4e5da5Sopenharmony_ci}
6013fd4e5da5Sopenharmony_ci
6014fd4e5da5Sopenharmony_ciTEST_P(ValidateOpenCLStdUpsampleLike, HiLoWrongBitWidth) {
6015fd4e5da5Sopenharmony_ci  const std::string ext_inst_name = GetParam();
6016fd4e5da5Sopenharmony_ci  std::ostringstream ss;
6017fd4e5da5Sopenharmony_ci  ss << "%val1 = OpExtInst %u64 %extinst " << ext_inst_name
6018fd4e5da5Sopenharmony_ci     << " %u16_1 %u16_2\n";
6019fd4e5da5Sopenharmony_ci
6020fd4e5da5Sopenharmony_ci  CompileSuccessfully(GenerateKernelCode(ss.str()));
6021fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
6022fd4e5da5Sopenharmony_ci  EXPECT_THAT(
6023fd4e5da5Sopenharmony_ci      getDiagnosticString(),
6024fd4e5da5Sopenharmony_ci      HasSubstr("OpenCL.std " + ext_inst_name +
6025fd4e5da5Sopenharmony_ci                ": expected bit width of components of Hi and Lo operands to "
6026fd4e5da5Sopenharmony_ci                "be half of the bit width of components of Result Type"));
6027fd4e5da5Sopenharmony_ci}
6028fd4e5da5Sopenharmony_ci
6029fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(AllUpsampleLike, ValidateOpenCLStdUpsampleLike,
6030fd4e5da5Sopenharmony_ci                         ::testing::ValuesIn(std::vector<std::string>{
6031fd4e5da5Sopenharmony_ci                             "u_upsample",
6032fd4e5da5Sopenharmony_ci                             "s_upsample",
6033fd4e5da5Sopenharmony_ci                         }));
6034fd4e5da5Sopenharmony_ci
6035fd4e5da5Sopenharmony_ciTEST_F(ValidateClspvReflection, RequiresNonSemanticExtension) {
6036fd4e5da5Sopenharmony_ci  const std::string text = R"(
6037fd4e5da5Sopenharmony_ciOpCapability Shader
6038fd4e5da5Sopenharmony_ciOpCapability Linkage
6039fd4e5da5Sopenharmony_ci%1 = OpExtInstImport "NonSemantic.ClspvReflection.1"
6040fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
6041fd4e5da5Sopenharmony_ci)";
6042fd4e5da5Sopenharmony_ci
6043fd4e5da5Sopenharmony_ci  CompileSuccessfully(text);
6044fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
6045fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
6046fd4e5da5Sopenharmony_ci              HasSubstr("NonSemantic extended instruction sets cannot be "
6047fd4e5da5Sopenharmony_ci                        "declared without SPV_KHR_non_semantic_info"));
6048fd4e5da5Sopenharmony_ci}
6049fd4e5da5Sopenharmony_ci
6050fd4e5da5Sopenharmony_ciTEST_F(ValidateClspvReflection, DoesNotRequiresNonSemanticExtensionPost1p6) {
6051fd4e5da5Sopenharmony_ci  const std::string text = R"(
6052fd4e5da5Sopenharmony_ciOpCapability Shader
6053fd4e5da5Sopenharmony_ciOpCapability Linkage
6054fd4e5da5Sopenharmony_ci%1 = OpExtInstImport "NonSemantic.ClspvReflection.1"
6055fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
6056fd4e5da5Sopenharmony_ci)";
6057fd4e5da5Sopenharmony_ci
6058fd4e5da5Sopenharmony_ci  CompileSuccessfully(text, SPV_ENV_UNIVERSAL_1_6);
6059fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_UNIVERSAL_1_6));
6060fd4e5da5Sopenharmony_ci}
6061fd4e5da5Sopenharmony_ci
6062fd4e5da5Sopenharmony_ciTEST_F(ValidateClspvReflection, MissingVersion) {
6063fd4e5da5Sopenharmony_ci  const std::string text = R"(
6064fd4e5da5Sopenharmony_ciOpCapability Shader
6065fd4e5da5Sopenharmony_ciOpCapability Linkage
6066fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info"
6067fd4e5da5Sopenharmony_ci%1 = OpExtInstImport "NonSemantic.ClspvReflection."
6068fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
6069fd4e5da5Sopenharmony_ci%2 = OpTypeVoid
6070fd4e5da5Sopenharmony_ci%3 = OpTypeInt 32 0
6071fd4e5da5Sopenharmony_ci%4 = OpConstant %3 1
6072fd4e5da5Sopenharmony_ci%5 = OpExtInst %2 %1 SpecConstantWorkDim %4
6073fd4e5da5Sopenharmony_ci)";
6074fd4e5da5Sopenharmony_ci
6075fd4e5da5Sopenharmony_ci  CompileSuccessfully(text);
6076fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
6077fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
6078fd4e5da5Sopenharmony_ci              HasSubstr("Missing NonSemantic.ClspvReflection import version"));
6079fd4e5da5Sopenharmony_ci}
6080fd4e5da5Sopenharmony_ci
6081fd4e5da5Sopenharmony_ciTEST_F(ValidateClspvReflection, BadVersion0) {
6082fd4e5da5Sopenharmony_ci  const std::string text = R"(
6083fd4e5da5Sopenharmony_ciOpCapability Shader
6084fd4e5da5Sopenharmony_ciOpCapability Linkage
6085fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info"
6086fd4e5da5Sopenharmony_ci%1 = OpExtInstImport "NonSemantic.ClspvReflection.0"
6087fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
6088fd4e5da5Sopenharmony_ci%2 = OpTypeVoid
6089fd4e5da5Sopenharmony_ci%3 = OpTypeInt 32 0
6090fd4e5da5Sopenharmony_ci%4 = OpConstant %3 1
6091fd4e5da5Sopenharmony_ci%5 = OpExtInst %2 %1 SpecConstantWorkDim %4
6092fd4e5da5Sopenharmony_ci)";
6093fd4e5da5Sopenharmony_ci
6094fd4e5da5Sopenharmony_ci  CompileSuccessfully(text);
6095fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
6096fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
6097fd4e5da5Sopenharmony_ci              HasSubstr("Unknown NonSemantic.ClspvReflection import version"));
6098fd4e5da5Sopenharmony_ci}
6099fd4e5da5Sopenharmony_ci
6100fd4e5da5Sopenharmony_ciTEST_F(ValidateClspvReflection, BadVersionNotANumber) {
6101fd4e5da5Sopenharmony_ci  const std::string text = R"(
6102fd4e5da5Sopenharmony_ciOpCapability Shader
6103fd4e5da5Sopenharmony_ciOpCapability Linkage
6104fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info"
6105fd4e5da5Sopenharmony_ci%1 = OpExtInstImport "NonSemantic.ClspvReflection.1a"
6106fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
6107fd4e5da5Sopenharmony_ci%2 = OpTypeVoid
6108fd4e5da5Sopenharmony_ci%3 = OpTypeInt 32 0
6109fd4e5da5Sopenharmony_ci%4 = OpConstant %3 1
6110fd4e5da5Sopenharmony_ci%5 = OpExtInst %2 %1 SpecConstantWorkDim %4
6111fd4e5da5Sopenharmony_ci)";
6112fd4e5da5Sopenharmony_ci
6113fd4e5da5Sopenharmony_ci  CompileSuccessfully(text);
6114fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
6115fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
6116fd4e5da5Sopenharmony_ci              HasSubstr("NonSemantic.ClspvReflection import does not encode "
6117fd4e5da5Sopenharmony_ci                        "the version correctly"));
6118fd4e5da5Sopenharmony_ci}
6119fd4e5da5Sopenharmony_ci
6120fd4e5da5Sopenharmony_ciTEST_F(ValidateClspvReflection, Kernel) {
6121fd4e5da5Sopenharmony_ci  const std::string text = R"(
6122fd4e5da5Sopenharmony_ciOpCapability Shader
6123fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info"
6124fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.1"
6125fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
6126fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo"
6127fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1
6128fd4e5da5Sopenharmony_ci%foo_name = OpString "foo"
6129fd4e5da5Sopenharmony_ci%void = OpTypeVoid
6130fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void
6131fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn
6132fd4e5da5Sopenharmony_ci%entry = OpLabel
6133fd4e5da5Sopenharmony_ciOpReturn
6134fd4e5da5Sopenharmony_ciOpFunctionEnd
6135fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name
6136fd4e5da5Sopenharmony_ci)";
6137fd4e5da5Sopenharmony_ci
6138fd4e5da5Sopenharmony_ci  CompileSuccessfully(text);
6139fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
6140fd4e5da5Sopenharmony_ci}
6141fd4e5da5Sopenharmony_ci
6142fd4e5da5Sopenharmony_ciTEST_F(ValidateClspvReflection, KernelNotAFunction) {
6143fd4e5da5Sopenharmony_ci  const std::string text = R"(
6144fd4e5da5Sopenharmony_ciOpCapability Shader
6145fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info"
6146fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.1"
6147fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
6148fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo"
6149fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1
6150fd4e5da5Sopenharmony_ci%foo_name = OpString "foo"
6151fd4e5da5Sopenharmony_ci%void = OpTypeVoid
6152fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void
6153fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn
6154fd4e5da5Sopenharmony_ci%entry = OpLabel
6155fd4e5da5Sopenharmony_ciOpReturn
6156fd4e5da5Sopenharmony_ciOpFunctionEnd
6157fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo_name %foo_name
6158fd4e5da5Sopenharmony_ci)";
6159fd4e5da5Sopenharmony_ci
6160fd4e5da5Sopenharmony_ci  CompileSuccessfully(text);
6161fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
6162fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
6163fd4e5da5Sopenharmony_ci              HasSubstr("Kernel does not reference a function"));
6164fd4e5da5Sopenharmony_ci}
6165fd4e5da5Sopenharmony_ci
6166fd4e5da5Sopenharmony_ciTEST_F(ValidateClspvReflection, KernelNotAnEntryPoint) {
6167fd4e5da5Sopenharmony_ci  const std::string text = R"(
6168fd4e5da5Sopenharmony_ciOpCapability Shader
6169fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info"
6170fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.1"
6171fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
6172fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo"
6173fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1
6174fd4e5da5Sopenharmony_ci%foo_name = OpString "foo"
6175fd4e5da5Sopenharmony_ci%void = OpTypeVoid
6176fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void
6177fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn
6178fd4e5da5Sopenharmony_ci%entry = OpLabel
6179fd4e5da5Sopenharmony_ciOpReturn
6180fd4e5da5Sopenharmony_ciOpFunctionEnd
6181fd4e5da5Sopenharmony_ci%bar = OpFunction %void None %void_fn
6182fd4e5da5Sopenharmony_ci%bar_entry = OpLabel
6183fd4e5da5Sopenharmony_ciOpReturn
6184fd4e5da5Sopenharmony_ciOpFunctionEnd
6185fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %bar %foo_name
6186fd4e5da5Sopenharmony_ci)";
6187fd4e5da5Sopenharmony_ci
6188fd4e5da5Sopenharmony_ci  CompileSuccessfully(text);
6189fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
6190fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
6191fd4e5da5Sopenharmony_ci              HasSubstr("Kernel does not reference an entry-point"));
6192fd4e5da5Sopenharmony_ci}
6193fd4e5da5Sopenharmony_ci
6194fd4e5da5Sopenharmony_ciTEST_F(ValidateClspvReflection, KernelNotGLCompute) {
6195fd4e5da5Sopenharmony_ci  const std::string text = R"(
6196fd4e5da5Sopenharmony_ciOpCapability Shader
6197fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info"
6198fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.1"
6199fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
6200fd4e5da5Sopenharmony_ciOpEntryPoint Fragment %foo "foo"
6201fd4e5da5Sopenharmony_ciOpExecutionMode %foo OriginUpperLeft
6202fd4e5da5Sopenharmony_ci%foo_name = OpString "foo"
6203fd4e5da5Sopenharmony_ci%void = OpTypeVoid
6204fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void
6205fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn
6206fd4e5da5Sopenharmony_ci%entry = OpLabel
6207fd4e5da5Sopenharmony_ciOpReturn
6208fd4e5da5Sopenharmony_ciOpFunctionEnd
6209fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name
6210fd4e5da5Sopenharmony_ci)";
6211fd4e5da5Sopenharmony_ci
6212fd4e5da5Sopenharmony_ci  CompileSuccessfully(text);
6213fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
6214fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
6215fd4e5da5Sopenharmony_ci              HasSubstr("Kernel must refer only to GLCompute entry-points"));
6216fd4e5da5Sopenharmony_ci}
6217fd4e5da5Sopenharmony_ci
6218fd4e5da5Sopenharmony_ciTEST_F(ValidateClspvReflection, KernelNameMismatch) {
6219fd4e5da5Sopenharmony_ci  const std::string text = R"(
6220fd4e5da5Sopenharmony_ciOpCapability Shader
6221fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info"
6222fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.1"
6223fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
6224fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo"
6225fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1
6226fd4e5da5Sopenharmony_ci%foo_name = OpString "bar"
6227fd4e5da5Sopenharmony_ci%void = OpTypeVoid
6228fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void
6229fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn
6230fd4e5da5Sopenharmony_ci%entry = OpLabel
6231fd4e5da5Sopenharmony_ciOpReturn
6232fd4e5da5Sopenharmony_ciOpFunctionEnd
6233fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name
6234fd4e5da5Sopenharmony_ci)";
6235fd4e5da5Sopenharmony_ci
6236fd4e5da5Sopenharmony_ci  CompileSuccessfully(text);
6237fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
6238fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
6239fd4e5da5Sopenharmony_ci              HasSubstr("Name must match an entry-point for Kernel"));
6240fd4e5da5Sopenharmony_ci}
6241fd4e5da5Sopenharmony_ci
6242fd4e5da5Sopenharmony_ciTEST_F(ValidateClspvReflection, KernelArgumentsVersionGood) {
6243fd4e5da5Sopenharmony_ci  const std::string text = R"(
6244fd4e5da5Sopenharmony_ciOpCapability Shader
6245fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info"
6246fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.5"
6247fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
6248fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo"
6249fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1
6250fd4e5da5Sopenharmony_ci%foo_name = OpString "foo"
6251fd4e5da5Sopenharmony_ci%void = OpTypeVoid
6252fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void
6253fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0
6254fd4e5da5Sopenharmony_ci%int_1 = OpConstant %int 1
6255fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn
6256fd4e5da5Sopenharmony_ci%entry = OpLabel
6257fd4e5da5Sopenharmony_ciOpReturn
6258fd4e5da5Sopenharmony_ciOpFunctionEnd
6259fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name %int_1
6260fd4e5da5Sopenharmony_ci)";
6261fd4e5da5Sopenharmony_ci
6262fd4e5da5Sopenharmony_ci  CompileSuccessfully(text);
6263fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
6264fd4e5da5Sopenharmony_ci}
6265fd4e5da5Sopenharmony_ci
6266fd4e5da5Sopenharmony_ciTEST_F(ValidateClspvReflection, KernelArgumentsVersionBad) {
6267fd4e5da5Sopenharmony_ci  const std::string text = R"(
6268fd4e5da5Sopenharmony_ciOpCapability Shader
6269fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info"
6270fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.4"
6271fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
6272fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo"
6273fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1
6274fd4e5da5Sopenharmony_ci%foo_name = OpString "foo"
6275fd4e5da5Sopenharmony_ci%void = OpTypeVoid
6276fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void
6277fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0
6278fd4e5da5Sopenharmony_ci%int_1 = OpConstant %int 1
6279fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn
6280fd4e5da5Sopenharmony_ci%entry = OpLabel
6281fd4e5da5Sopenharmony_ciOpReturn
6282fd4e5da5Sopenharmony_ciOpFunctionEnd
6283fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name %int_1
6284fd4e5da5Sopenharmony_ci)";
6285fd4e5da5Sopenharmony_ci
6286fd4e5da5Sopenharmony_ci  CompileSuccessfully(text);
6287fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
6288fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
6289fd4e5da5Sopenharmony_ci              HasSubstr("Version 4 of the Kernel instruction can only have 2 "
6290fd4e5da5Sopenharmony_ci                        "additional operands"));
6291fd4e5da5Sopenharmony_ci}
6292fd4e5da5Sopenharmony_ci
6293fd4e5da5Sopenharmony_ciTEST_F(ValidateClspvReflection, KernelNumArgumentsNotInt) {
6294fd4e5da5Sopenharmony_ci  const std::string text = R"(
6295fd4e5da5Sopenharmony_ciOpCapability Shader
6296fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info"
6297fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.5"
6298fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
6299fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo"
6300fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1
6301fd4e5da5Sopenharmony_ci%foo_name = OpString "foo"
6302fd4e5da5Sopenharmony_ci%void = OpTypeVoid
6303fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void
6304fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0
6305fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0
6306fd4e5da5Sopenharmony_ci%float = OpTypeFloat 32
6307fd4e5da5Sopenharmony_ci%float_0 = OpConstant %float 0
6308fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn
6309fd4e5da5Sopenharmony_ci%entry = OpLabel
6310fd4e5da5Sopenharmony_ciOpReturn
6311fd4e5da5Sopenharmony_ciOpFunctionEnd
6312fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name %float_0
6313fd4e5da5Sopenharmony_ci)";
6314fd4e5da5Sopenharmony_ci
6315fd4e5da5Sopenharmony_ci  CompileSuccessfully(text);
6316fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
6317fd4e5da5Sopenharmony_ci  EXPECT_THAT(
6318fd4e5da5Sopenharmony_ci      getDiagnosticString(),
6319fd4e5da5Sopenharmony_ci      HasSubstr("NumArguments must be a 32-bit unsigned integer OpConstant"));
6320fd4e5da5Sopenharmony_ci}
6321fd4e5da5Sopenharmony_ci
6322fd4e5da5Sopenharmony_ciTEST_F(ValidateClspvReflection, KernelNumArgumentsNotConstant) {
6323fd4e5da5Sopenharmony_ci  const std::string text = R"(
6324fd4e5da5Sopenharmony_ciOpCapability Shader
6325fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info"
6326fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.5"
6327fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
6328fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo"
6329fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1
6330fd4e5da5Sopenharmony_ci%foo_name = OpString "foo"
6331fd4e5da5Sopenharmony_ci%void = OpTypeVoid
6332fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void
6333fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0
6334fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0
6335fd4e5da5Sopenharmony_ci%null = OpConstantNull %int
6336fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn
6337fd4e5da5Sopenharmony_ci%entry = OpLabel
6338fd4e5da5Sopenharmony_ciOpReturn
6339fd4e5da5Sopenharmony_ciOpFunctionEnd
6340fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name %null
6341fd4e5da5Sopenharmony_ci)";
6342fd4e5da5Sopenharmony_ci
6343fd4e5da5Sopenharmony_ci  CompileSuccessfully(text);
6344fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
6345fd4e5da5Sopenharmony_ci  EXPECT_THAT(
6346fd4e5da5Sopenharmony_ci      getDiagnosticString(),
6347fd4e5da5Sopenharmony_ci      HasSubstr("NumArguments must be a 32-bit unsigned integer OpConstant"));
6348fd4e5da5Sopenharmony_ci}
6349fd4e5da5Sopenharmony_ci
6350fd4e5da5Sopenharmony_ciTEST_F(ValidateClspvReflection, KernelFlagsNotInt) {
6351fd4e5da5Sopenharmony_ci  const std::string text = R"(
6352fd4e5da5Sopenharmony_ciOpCapability Shader
6353fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info"
6354fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.5"
6355fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
6356fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo"
6357fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1
6358fd4e5da5Sopenharmony_ci%foo_name = OpString "foo"
6359fd4e5da5Sopenharmony_ci%void = OpTypeVoid
6360fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void
6361fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0
6362fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0
6363fd4e5da5Sopenharmony_ci%float = OpTypeFloat 32
6364fd4e5da5Sopenharmony_ci%float_0 = OpConstant %float 0
6365fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn
6366fd4e5da5Sopenharmony_ci%entry = OpLabel
6367fd4e5da5Sopenharmony_ciOpReturn
6368fd4e5da5Sopenharmony_ciOpFunctionEnd
6369fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name %int_0 %float_0
6370fd4e5da5Sopenharmony_ci)";
6371fd4e5da5Sopenharmony_ci
6372fd4e5da5Sopenharmony_ci  CompileSuccessfully(text);
6373fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
6374fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
6375fd4e5da5Sopenharmony_ci              HasSubstr("Flags must be a 32-bit unsigned integer OpConstant"));
6376fd4e5da5Sopenharmony_ci}
6377fd4e5da5Sopenharmony_ci
6378fd4e5da5Sopenharmony_ciTEST_F(ValidateClspvReflection, KernelFlagsNotConstant) {
6379fd4e5da5Sopenharmony_ci  const std::string text = R"(
6380fd4e5da5Sopenharmony_ciOpCapability Shader
6381fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info"
6382fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.5"
6383fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
6384fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo"
6385fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1
6386fd4e5da5Sopenharmony_ci%foo_name = OpString "foo"
6387fd4e5da5Sopenharmony_ci%void = OpTypeVoid
6388fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void
6389fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0
6390fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0
6391fd4e5da5Sopenharmony_ci%null = OpConstantNull %int
6392fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn
6393fd4e5da5Sopenharmony_ci%entry = OpLabel
6394fd4e5da5Sopenharmony_ciOpReturn
6395fd4e5da5Sopenharmony_ciOpFunctionEnd
6396fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name %int_0 %null
6397fd4e5da5Sopenharmony_ci)";
6398fd4e5da5Sopenharmony_ci
6399fd4e5da5Sopenharmony_ci  CompileSuccessfully(text);
6400fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
6401fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
6402fd4e5da5Sopenharmony_ci              HasSubstr("Flags must be a 32-bit unsigned integer OpConstant"));
6403fd4e5da5Sopenharmony_ci}
6404fd4e5da5Sopenharmony_ci
6405fd4e5da5Sopenharmony_ciTEST_F(ValidateClspvReflection, KernelAttributesNotString) {
6406fd4e5da5Sopenharmony_ci  const std::string text = R"(
6407fd4e5da5Sopenharmony_ciOpCapability Shader
6408fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info"
6409fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.5"
6410fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
6411fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo"
6412fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1
6413fd4e5da5Sopenharmony_ci%foo_name = OpString "foo"
6414fd4e5da5Sopenharmony_ci%void = OpTypeVoid
6415fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void
6416fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0
6417fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0
6418fd4e5da5Sopenharmony_ci%float = OpTypeFloat 32
6419fd4e5da5Sopenharmony_ci%float_0 = OpConstant %float 0
6420fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn
6421fd4e5da5Sopenharmony_ci%entry = OpLabel
6422fd4e5da5Sopenharmony_ciOpReturn
6423fd4e5da5Sopenharmony_ciOpFunctionEnd
6424fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name %int_0 %int_0 %int_0
6425fd4e5da5Sopenharmony_ci)";
6426fd4e5da5Sopenharmony_ci
6427fd4e5da5Sopenharmony_ci  CompileSuccessfully(text);
6428fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
6429fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
6430fd4e5da5Sopenharmony_ci              HasSubstr("Attributes must be an OpString"));
6431fd4e5da5Sopenharmony_ci}
6432fd4e5da5Sopenharmony_ci
6433fd4e5da5Sopenharmony_ciusing ArgumentBasics =
6434fd4e5da5Sopenharmony_ci    spvtest::ValidateBase<std::pair<std::string, std::string>>;
6435fd4e5da5Sopenharmony_ci
6436fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
6437fd4e5da5Sopenharmony_ci    ValidateClspvReflectionArgumentKernel, ArgumentBasics,
6438fd4e5da5Sopenharmony_ci    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
6439fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentStorageBuffer", "%int_0 %int_0"),
6440fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentUniform", "%int_0 %int_0"),
6441fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentPodStorageBuffer",
6442fd4e5da5Sopenharmony_ci                       "%int_0 %int_0 %int_0 %int_4"),
6443fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentPodUniform", "%int_0 %int_0 %int_0 %int_4"),
6444fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentPodPushConstant", "%int_0 %int_4"),
6445fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentSampledImage", "%int_0 %int_0"),
6446fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentStorageImage", "%int_0 %int_0"),
6447fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentSampler", "%int_0 %int_0"),
6448fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentWorkgroup", "%int_0 %int_0"),
6449fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentPointerPushConstant", "%int_0 %int_4"),
6450fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentPointerUniform", "%int_0 %int_0 %int_0 %int_4"),
6451fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentStorageTexelBuffer", "%int_0 %int_0"),
6452fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentUniformTexelBuffer", "%int_0 %int_0")}));
6453fd4e5da5Sopenharmony_ci
6454fd4e5da5Sopenharmony_ciTEST_P(ArgumentBasics, KernelNotAnExtendedInstruction) {
6455fd4e5da5Sopenharmony_ci  const std::string ext_inst = std::get<0>(GetParam());
6456fd4e5da5Sopenharmony_ci  const std::string extra = std::get<1>(GetParam());
6457fd4e5da5Sopenharmony_ci  const std::string text = R"(
6458fd4e5da5Sopenharmony_ciOpCapability Shader
6459fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info"
6460fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.5"
6461fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
6462fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo"
6463fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1
6464fd4e5da5Sopenharmony_ci%foo_name = OpString "foo"
6465fd4e5da5Sopenharmony_ci%void = OpTypeVoid
6466fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0
6467fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0
6468fd4e5da5Sopenharmony_ci%int_4 = OpConstant %int 4
6469fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void
6470fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn
6471fd4e5da5Sopenharmony_ci%entry = OpLabel
6472fd4e5da5Sopenharmony_ciOpReturn
6473fd4e5da5Sopenharmony_ciOpFunctionEnd
6474fd4e5da5Sopenharmony_ci%in = OpExtInst %void %ext )" +
6475fd4e5da5Sopenharmony_ci                           ext_inst + " %int_0 %int_0 " + extra;
6476fd4e5da5Sopenharmony_ci
6477fd4e5da5Sopenharmony_ci  CompileSuccessfully(text);
6478fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
6479fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
6480fd4e5da5Sopenharmony_ci              HasSubstr("Kernel must be a Kernel extended instruction"));
6481fd4e5da5Sopenharmony_ci}
6482fd4e5da5Sopenharmony_ci
6483fd4e5da5Sopenharmony_ciTEST_P(ArgumentBasics, KernelFromDifferentImport) {
6484fd4e5da5Sopenharmony_ci  const std::string ext_inst = std::get<0>(GetParam());
6485fd4e5da5Sopenharmony_ci  const std::string extra = std::get<1>(GetParam());
6486fd4e5da5Sopenharmony_ci  const std::string text = R"(
6487fd4e5da5Sopenharmony_ciOpCapability Shader
6488fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info"
6489fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.5"
6490fd4e5da5Sopenharmony_ci%ext2 = OpExtInstImport "NonSemantic.ClspvReflection.5"
6491fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
6492fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo"
6493fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1
6494fd4e5da5Sopenharmony_ci%foo_name = OpString "foo"
6495fd4e5da5Sopenharmony_ci%void = OpTypeVoid
6496fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0
6497fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0
6498fd4e5da5Sopenharmony_ci%int_4 = OpConstant %int 4
6499fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void
6500fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn
6501fd4e5da5Sopenharmony_ci%entry = OpLabel
6502fd4e5da5Sopenharmony_ciOpReturn
6503fd4e5da5Sopenharmony_ciOpFunctionEnd
6504fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext2 Kernel %foo %foo_name
6505fd4e5da5Sopenharmony_ci%in = OpExtInst %void %ext )" +
6506fd4e5da5Sopenharmony_ci                           ext_inst + " %decl %int_0 " + extra;
6507fd4e5da5Sopenharmony_ci
6508fd4e5da5Sopenharmony_ci  CompileSuccessfully(text);
6509fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
6510fd4e5da5Sopenharmony_ci  EXPECT_THAT(
6511fd4e5da5Sopenharmony_ci      getDiagnosticString(),
6512fd4e5da5Sopenharmony_ci      HasSubstr("Kernel must be from the same extended instruction import"));
6513fd4e5da5Sopenharmony_ci}
6514fd4e5da5Sopenharmony_ci
6515fd4e5da5Sopenharmony_ciTEST_P(ArgumentBasics, KernelWrongExtendedInstruction) {
6516fd4e5da5Sopenharmony_ci  const std::string ext_inst = std::get<0>(GetParam());
6517fd4e5da5Sopenharmony_ci  const std::string extra = std::get<1>(GetParam());
6518fd4e5da5Sopenharmony_ci  const std::string text = R"(
6519fd4e5da5Sopenharmony_ciOpCapability Shader
6520fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info"
6521fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.5"
6522fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
6523fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo"
6524fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1
6525fd4e5da5Sopenharmony_ci%foo_name = OpString "foo"
6526fd4e5da5Sopenharmony_ci%void = OpTypeVoid
6527fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0
6528fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0
6529fd4e5da5Sopenharmony_ci%int_4 = OpConstant %int 4
6530fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void
6531fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn
6532fd4e5da5Sopenharmony_ci%entry = OpLabel
6533fd4e5da5Sopenharmony_ciOpReturn
6534fd4e5da5Sopenharmony_ciOpFunctionEnd
6535fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext ArgumentInfo %foo_name
6536fd4e5da5Sopenharmony_ci%in = OpExtInst %void %ext )" +
6537fd4e5da5Sopenharmony_ci                           ext_inst + " %decl %int_0 " + extra;
6538fd4e5da5Sopenharmony_ci
6539fd4e5da5Sopenharmony_ci  CompileSuccessfully(text);
6540fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
6541fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(),
6542fd4e5da5Sopenharmony_ci              HasSubstr("Kernel must be a Kernel extended instruction"));
6543fd4e5da5Sopenharmony_ci}
6544fd4e5da5Sopenharmony_ci
6545fd4e5da5Sopenharmony_ciTEST_P(ArgumentBasics, ArgumentInfo) {
6546fd4e5da5Sopenharmony_ci  const std::string ext_inst = std::get<0>(GetParam());
6547fd4e5da5Sopenharmony_ci  const std::string operands = std::get<1>(GetParam());
6548fd4e5da5Sopenharmony_ci  const std::string text = R"(
6549fd4e5da5Sopenharmony_ciOpCapability Shader
6550fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info"
6551fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.5"
6552fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
6553fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo"
6554fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1
6555fd4e5da5Sopenharmony_ci%foo_name = OpString "foo"
6556fd4e5da5Sopenharmony_ci%in_name = OpString "in"
6557fd4e5da5Sopenharmony_ci%void = OpTypeVoid
6558fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0
6559fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0
6560fd4e5da5Sopenharmony_ci%int_4 = OpConstant %int 4
6561fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void
6562fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn
6563fd4e5da5Sopenharmony_ci%entry = OpLabel
6564fd4e5da5Sopenharmony_ciOpReturn
6565fd4e5da5Sopenharmony_ciOpFunctionEnd
6566fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name
6567fd4e5da5Sopenharmony_ci%info = OpExtInst %void %ext ArgumentInfo %in_name
6568fd4e5da5Sopenharmony_ci%in = OpExtInst %void %ext )" +
6569fd4e5da5Sopenharmony_ci                           ext_inst + " %decl %int_0 " + operands + " %info";
6570fd4e5da5Sopenharmony_ci
6571fd4e5da5Sopenharmony_ci  CompileSuccessfully(text);
6572fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_SUCCESS, ValidateInstructions());
6573fd4e5da5Sopenharmony_ci}
6574fd4e5da5Sopenharmony_ci
6575fd4e5da5Sopenharmony_ciTEST_P(ArgumentBasics, ArgumentInfoNotAnExtendedInstruction) {
6576fd4e5da5Sopenharmony_ci  const std::string ext_inst = std::get<0>(GetParam());
6577fd4e5da5Sopenharmony_ci  const std::string operands = std::get<1>(GetParam());
6578fd4e5da5Sopenharmony_ci  const std::string text = R"(
6579fd4e5da5Sopenharmony_ciOpCapability Shader
6580fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info"
6581fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.5"
6582fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
6583fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo"
6584fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1
6585fd4e5da5Sopenharmony_ci%foo_name = OpString "foo"
6586fd4e5da5Sopenharmony_ci%void = OpTypeVoid
6587fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0
6588fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0
6589fd4e5da5Sopenharmony_ci%int_4 = OpConstant %int 4
6590fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void
6591fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn
6592fd4e5da5Sopenharmony_ci%entry = OpLabel
6593fd4e5da5Sopenharmony_ciOpReturn
6594fd4e5da5Sopenharmony_ciOpFunctionEnd
6595fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name
6596fd4e5da5Sopenharmony_ci%in = OpExtInst %void %ext )" +
6597fd4e5da5Sopenharmony_ci                           ext_inst + " %decl %int_0 " + operands + " %int_0";
6598fd4e5da5Sopenharmony_ci
6599fd4e5da5Sopenharmony_ci  CompileSuccessfully(text);
6600fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
6601fd4e5da5Sopenharmony_ci  EXPECT_THAT(
6602fd4e5da5Sopenharmony_ci      getDiagnosticString(),
6603fd4e5da5Sopenharmony_ci      HasSubstr("ArgInfo must be an ArgumentInfo extended instruction"));
6604fd4e5da5Sopenharmony_ci}
6605fd4e5da5Sopenharmony_ci
6606fd4e5da5Sopenharmony_ciTEST_P(ArgumentBasics, ArgumentInfoFromDifferentImport) {
6607fd4e5da5Sopenharmony_ci  const std::string ext_inst = std::get<0>(GetParam());
6608fd4e5da5Sopenharmony_ci  const std::string operands = std::get<1>(GetParam());
6609fd4e5da5Sopenharmony_ci  const std::string text = R"(
6610fd4e5da5Sopenharmony_ciOpCapability Shader
6611fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info"
6612fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.5"
6613fd4e5da5Sopenharmony_ci%ext2 = OpExtInstImport "NonSemantic.ClspvReflection.5"
6614fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
6615fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo"
6616fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1
6617fd4e5da5Sopenharmony_ci%foo_name = OpString "foo"
6618fd4e5da5Sopenharmony_ci%in_name = OpString "in"
6619fd4e5da5Sopenharmony_ci%void = OpTypeVoid
6620fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0
6621fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0
6622fd4e5da5Sopenharmony_ci%int_4 = OpConstant %int 4
6623fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void
6624fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn
6625fd4e5da5Sopenharmony_ci%entry = OpLabel
6626fd4e5da5Sopenharmony_ciOpReturn
6627fd4e5da5Sopenharmony_ciOpFunctionEnd
6628fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name
6629fd4e5da5Sopenharmony_ci%info = OpExtInst %void %ext2 ArgumentInfo %in_name
6630fd4e5da5Sopenharmony_ci%in = OpExtInst %void %ext )" +
6631fd4e5da5Sopenharmony_ci                           ext_inst + " %decl %int_0 " + operands + " %info";
6632fd4e5da5Sopenharmony_ci
6633fd4e5da5Sopenharmony_ci  CompileSuccessfully(text);
6634fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
6635fd4e5da5Sopenharmony_ci  EXPECT_THAT(
6636fd4e5da5Sopenharmony_ci      getDiagnosticString(),
6637fd4e5da5Sopenharmony_ci      HasSubstr("ArgInfo must be from the same extended instruction import"));
6638fd4e5da5Sopenharmony_ci}
6639fd4e5da5Sopenharmony_ci
6640fd4e5da5Sopenharmony_ciusing Uint32Constant =
6641fd4e5da5Sopenharmony_ci    spvtest::ValidateBase<std::pair<std::string, std::string>>;
6642fd4e5da5Sopenharmony_ci
6643fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
6644fd4e5da5Sopenharmony_ci    ValidateClspvReflectionUint32Constants, Uint32Constant,
6645fd4e5da5Sopenharmony_ci    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
6646fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentStorageBuffer %decl %float_0 %int_0 %int_0",
6647fd4e5da5Sopenharmony_ci                       "Ordinal"),
6648fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentStorageBuffer %decl %null %int_0 %int_0",
6649fd4e5da5Sopenharmony_ci                       "Ordinal"),
6650fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentStorageBuffer %decl %int_0 %float_0 %int_0",
6651fd4e5da5Sopenharmony_ci                       "DescriptorSet"),
6652fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentStorageBuffer %decl %int_0 %null %int_0",
6653fd4e5da5Sopenharmony_ci                       "DescriptorSet"),
6654fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentStorageBuffer %decl %int_0 %int_0 %float_0",
6655fd4e5da5Sopenharmony_ci                       "Binding"),
6656fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentStorageBuffer %decl %int_0 %int_0 %null",
6657fd4e5da5Sopenharmony_ci                       "Binding"),
6658fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentUniform %decl %float_0 %int_0 %int_0",
6659fd4e5da5Sopenharmony_ci                       "Ordinal"),
6660fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentUniform %decl %null %int_0 %int_0", "Ordinal"),
6661fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentUniform %decl %int_0 %float_0 %int_0",
6662fd4e5da5Sopenharmony_ci                       "DescriptorSet"),
6663fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentUniform %decl %int_0 %null %int_0",
6664fd4e5da5Sopenharmony_ci                       "DescriptorSet"),
6665fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentUniform %decl %int_0 %int_0 %float_0",
6666fd4e5da5Sopenharmony_ci                       "Binding"),
6667fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentUniform %decl %int_0 %int_0 %null", "Binding"),
6668fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentSampledImage %decl %float_0 %int_0 %int_0",
6669fd4e5da5Sopenharmony_ci                       "Ordinal"),
6670fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentSampledImage %decl %null %int_0 %int_0",
6671fd4e5da5Sopenharmony_ci                       "Ordinal"),
6672fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentSampledImage %decl %int_0 %float_0 %int_0",
6673fd4e5da5Sopenharmony_ci                       "DescriptorSet"),
6674fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentSampledImage %decl %int_0 %null %int_0",
6675fd4e5da5Sopenharmony_ci                       "DescriptorSet"),
6676fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentSampledImage %decl %int_0 %int_0 %float_0",
6677fd4e5da5Sopenharmony_ci                       "Binding"),
6678fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentSampledImage %decl %int_0 %int_0 %null",
6679fd4e5da5Sopenharmony_ci                       "Binding"),
6680fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentStorageImage %decl %float_0 %int_0 %int_0",
6681fd4e5da5Sopenharmony_ci                       "Ordinal"),
6682fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentStorageImage %decl %null %int_0 %int_0",
6683fd4e5da5Sopenharmony_ci                       "Ordinal"),
6684fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentStorageImage %decl %int_0 %float_0 %int_0",
6685fd4e5da5Sopenharmony_ci                       "DescriptorSet"),
6686fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentStorageImage %decl %int_0 %null %int_0",
6687fd4e5da5Sopenharmony_ci                       "DescriptorSet"),
6688fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentStorageImage %decl %int_0 %int_0 %float_0",
6689fd4e5da5Sopenharmony_ci                       "Binding"),
6690fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentStorageImage %decl %int_0 %int_0 %null",
6691fd4e5da5Sopenharmony_ci                       "Binding"),
6692fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentSampler %decl %float_0 %int_0 %int_0",
6693fd4e5da5Sopenharmony_ci                       "Ordinal"),
6694fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentSampler %decl %null %int_0 %int_0", "Ordinal"),
6695fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentSampler %decl %int_0 %float_0 %int_0",
6696fd4e5da5Sopenharmony_ci                       "DescriptorSet"),
6697fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentSampler %decl %int_0 %null %int_0",
6698fd4e5da5Sopenharmony_ci                       "DescriptorSet"),
6699fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentSampler %decl %int_0 %int_0 %float_0",
6700fd4e5da5Sopenharmony_ci                       "Binding"),
6701fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentSampler %decl %int_0 %int_0 %null", "Binding"),
6702fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentPodStorageBuffer %decl %float_0 %int_0 %int_0 "
6703fd4e5da5Sopenharmony_ci                       "%int_0 %int_4",
6704fd4e5da5Sopenharmony_ci                       "Ordinal"),
6705fd4e5da5Sopenharmony_ci        std::make_pair(
6706fd4e5da5Sopenharmony_ci            "ArgumentPodStorageBuffer %decl %null %int_0 %int_0 %int_0 %int_4",
6707fd4e5da5Sopenharmony_ci            "Ordinal"),
6708fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentPodStorageBuffer %decl %int_0 %float_0 %int_0 "
6709fd4e5da5Sopenharmony_ci                       "%int_0 %int_4",
6710fd4e5da5Sopenharmony_ci                       "DescriptorSet"),
6711fd4e5da5Sopenharmony_ci        std::make_pair(
6712fd4e5da5Sopenharmony_ci            "ArgumentPodStorageBuffer %decl %int_0 %null %int_0 %int_0 %int_4",
6713fd4e5da5Sopenharmony_ci            "DescriptorSet"),
6714fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentPodStorageBuffer %decl %int_0 %int_0 %float_0 "
6715fd4e5da5Sopenharmony_ci                       "%int_0 %int_4",
6716fd4e5da5Sopenharmony_ci                       "Binding"),
6717fd4e5da5Sopenharmony_ci        std::make_pair(
6718fd4e5da5Sopenharmony_ci            "ArgumentPodStorageBuffer %decl %int_0 %int_0 %null %int_0 %int_4",
6719fd4e5da5Sopenharmony_ci            "Binding"),
6720fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentPodStorageBuffer %decl %int_0 %int_0 %int_0 "
6721fd4e5da5Sopenharmony_ci                       "%float_0 %int_4",
6722fd4e5da5Sopenharmony_ci                       "Offset"),
6723fd4e5da5Sopenharmony_ci        std::make_pair(
6724fd4e5da5Sopenharmony_ci            "ArgumentPodStorageBuffer %decl %int_0 %int_0 %int_0 %null %int_4",
6725fd4e5da5Sopenharmony_ci            "Offset"),
6726fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentPodStorageBuffer %decl %int_0 %int_0 %int_0 "
6727fd4e5da5Sopenharmony_ci                       "%int_0 %float_0",
6728fd4e5da5Sopenharmony_ci                       "Size"),
6729fd4e5da5Sopenharmony_ci        std::make_pair(
6730fd4e5da5Sopenharmony_ci            "ArgumentPodStorageBuffer %decl %int_0 %int_0 %int_0 %int_0 %null",
6731fd4e5da5Sopenharmony_ci            "Size"),
6732fd4e5da5Sopenharmony_ci        std::make_pair(
6733fd4e5da5Sopenharmony_ci            "ArgumentPodUniform %decl %float_0 %int_0 %int_0 %int_0 %int_4",
6734fd4e5da5Sopenharmony_ci            "Ordinal"),
6735fd4e5da5Sopenharmony_ci        std::make_pair(
6736fd4e5da5Sopenharmony_ci            "ArgumentPodUniform %decl %null %int_0 %int_0 %int_0 %int_4",
6737fd4e5da5Sopenharmony_ci            "Ordinal"),
6738fd4e5da5Sopenharmony_ci        std::make_pair(
6739fd4e5da5Sopenharmony_ci            "ArgumentPodUniform %decl %int_0 %float_0 %int_0 %int_0 %int_4",
6740fd4e5da5Sopenharmony_ci            "DescriptorSet"),
6741fd4e5da5Sopenharmony_ci        std::make_pair(
6742fd4e5da5Sopenharmony_ci            "ArgumentPodUniform %decl %int_0 %null %int_0 %int_0 %int_4",
6743fd4e5da5Sopenharmony_ci            "DescriptorSet"),
6744fd4e5da5Sopenharmony_ci        std::make_pair(
6745fd4e5da5Sopenharmony_ci            "ArgumentPodUniform %decl %int_0 %int_0 %float_0 %int_0 %int_4",
6746fd4e5da5Sopenharmony_ci            "Binding"),
6747fd4e5da5Sopenharmony_ci        std::make_pair(
6748fd4e5da5Sopenharmony_ci            "ArgumentPodUniform %decl %int_0 %int_0 %null %int_0 %int_4",
6749fd4e5da5Sopenharmony_ci            "Binding"),
6750fd4e5da5Sopenharmony_ci        std::make_pair(
6751fd4e5da5Sopenharmony_ci            "ArgumentPodUniform %decl %int_0 %int_0 %int_0 %float_0 %int_4",
6752fd4e5da5Sopenharmony_ci            "Offset"),
6753fd4e5da5Sopenharmony_ci        std::make_pair(
6754fd4e5da5Sopenharmony_ci            "ArgumentPodUniform %decl %int_0 %int_0 %int_0 %null %int_4",
6755fd4e5da5Sopenharmony_ci            "Offset"),
6756fd4e5da5Sopenharmony_ci        std::make_pair(
6757fd4e5da5Sopenharmony_ci            "ArgumentPodUniform %decl %int_0 %int_0 %int_0 %int_0 %float_0",
6758fd4e5da5Sopenharmony_ci            "Size"),
6759fd4e5da5Sopenharmony_ci        std::make_pair(
6760fd4e5da5Sopenharmony_ci            "ArgumentPodUniform %decl %int_0 %int_0 %int_0 %int_0 %null",
6761fd4e5da5Sopenharmony_ci            "Size"),
6762fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentPodPushConstant %decl %float_0 %int_0 %int_4",
6763fd4e5da5Sopenharmony_ci                       "Ordinal"),
6764fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentPodPushConstant %decl %null %int_0 %int_4",
6765fd4e5da5Sopenharmony_ci                       "Ordinal"),
6766fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentPodPushConstant %decl %int_0 %float_0 %int_4",
6767fd4e5da5Sopenharmony_ci                       "Offset"),
6768fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentPodPushConstant %decl %int_0 %null %int_4",
6769fd4e5da5Sopenharmony_ci                       "Offset"),
6770fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentPodPushConstant %decl %int_0 %int_0 %float_0",
6771fd4e5da5Sopenharmony_ci                       "Size"),
6772fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentPodPushConstant %decl %int_0 %int_0 %null",
6773fd4e5da5Sopenharmony_ci                       "Size"),
6774fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentWorkgroup %decl %float_0 %int_0 %int_4",
6775fd4e5da5Sopenharmony_ci                       "Ordinal"),
6776fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentWorkgroup %decl %null %int_0 %int_4",
6777fd4e5da5Sopenharmony_ci                       "Ordinal"),
6778fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentWorkgroup %decl %int_0 %float_0 %int_4",
6779fd4e5da5Sopenharmony_ci                       "SpecId"),
6780fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentWorkgroup %decl %int_0 %null %int_4", "SpecId"),
6781fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentWorkgroup %decl %int_0 %int_0 %float_0",
6782fd4e5da5Sopenharmony_ci                       "ElemSize"),
6783fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentWorkgroup %decl %int_0 %int_0 %null",
6784fd4e5da5Sopenharmony_ci                       "ElemSize"),
6785fd4e5da5Sopenharmony_ci        std::make_pair("SpecConstantWorkgroupSize %float_0 %int_0 %int_4", "X"),
6786fd4e5da5Sopenharmony_ci        std::make_pair("SpecConstantWorkgroupSize %null %int_0 %int_4", "X"),
6787fd4e5da5Sopenharmony_ci        std::make_pair("SpecConstantWorkgroupSize %int_0 %float_0 %int_4", "Y"),
6788fd4e5da5Sopenharmony_ci        std::make_pair("SpecConstantWorkgroupSize %int_0 %null %int_4", "Y"),
6789fd4e5da5Sopenharmony_ci        std::make_pair("SpecConstantWorkgroupSize %int_0 %int_0 %float_0", "Z"),
6790fd4e5da5Sopenharmony_ci        std::make_pair("SpecConstantWorkgroupSize %int_0 %int_0 %null", "Z"),
6791fd4e5da5Sopenharmony_ci        std::make_pair("SpecConstantGlobalOffset %float_0 %int_0 %int_4", "X"),
6792fd4e5da5Sopenharmony_ci        std::make_pair("SpecConstantGlobalOffset %null %int_0 %int_4", "X"),
6793fd4e5da5Sopenharmony_ci        std::make_pair("SpecConstantGlobalOffset %int_0 %float_0 %int_4", "Y"),
6794fd4e5da5Sopenharmony_ci        std::make_pair("SpecConstantGlobalOffset %int_0 %null %int_4", "Y"),
6795fd4e5da5Sopenharmony_ci        std::make_pair("SpecConstantGlobalOffset %int_0 %int_0 %float_0", "Z"),
6796fd4e5da5Sopenharmony_ci        std::make_pair("SpecConstantGlobalOffset %int_0 %int_0 %null", "Z"),
6797fd4e5da5Sopenharmony_ci        std::make_pair("SpecConstantWorkDim %float_0", "Dim"),
6798fd4e5da5Sopenharmony_ci        std::make_pair("SpecConstantWorkDim %null", "Dim"),
6799fd4e5da5Sopenharmony_ci        std::make_pair("PushConstantGlobalOffset %float_0 %int_0", "Offset"),
6800fd4e5da5Sopenharmony_ci        std::make_pair("PushConstantGlobalOffset %null %int_0", "Offset"),
6801fd4e5da5Sopenharmony_ci        std::make_pair("PushConstantGlobalOffset %int_0 %float_0", "Size"),
6802fd4e5da5Sopenharmony_ci        std::make_pair("PushConstantGlobalOffset %int_0 %null", "Size"),
6803fd4e5da5Sopenharmony_ci        std::make_pair("PushConstantEnqueuedLocalSize %float_0 %int_0",
6804fd4e5da5Sopenharmony_ci                       "Offset"),
6805fd4e5da5Sopenharmony_ci        std::make_pair("PushConstantEnqueuedLocalSize %null %int_0", "Offset"),
6806fd4e5da5Sopenharmony_ci        std::make_pair("PushConstantEnqueuedLocalSize %int_0 %float_0", "Size"),
6807fd4e5da5Sopenharmony_ci        std::make_pair("PushConstantEnqueuedLocalSize %int_0 %null", "Size"),
6808fd4e5da5Sopenharmony_ci        std::make_pair("PushConstantGlobalSize %float_0 %int_0", "Offset"),
6809fd4e5da5Sopenharmony_ci        std::make_pair("PushConstantGlobalSize %null %int_0", "Offset"),
6810fd4e5da5Sopenharmony_ci        std::make_pair("PushConstantGlobalSize %int_0 %float_0", "Size"),
6811fd4e5da5Sopenharmony_ci        std::make_pair("PushConstantGlobalSize %int_0 %null", "Size"),
6812fd4e5da5Sopenharmony_ci        std::make_pair("PushConstantRegionOffset %float_0 %int_0", "Offset"),
6813fd4e5da5Sopenharmony_ci        std::make_pair("PushConstantRegionOffset %null %int_0", "Offset"),
6814fd4e5da5Sopenharmony_ci        std::make_pair("PushConstantRegionOffset %int_0 %float_0", "Size"),
6815fd4e5da5Sopenharmony_ci        std::make_pair("PushConstantRegionOffset %int_0 %null", "Size"),
6816fd4e5da5Sopenharmony_ci        std::make_pair("PushConstantNumWorkgroups %float_0 %int_0", "Offset"),
6817fd4e5da5Sopenharmony_ci        std::make_pair("PushConstantNumWorkgroups %null %int_0", "Offset"),
6818fd4e5da5Sopenharmony_ci        std::make_pair("PushConstantNumWorkgroups %int_0 %float_0", "Size"),
6819fd4e5da5Sopenharmony_ci        std::make_pair("PushConstantNumWorkgroups %int_0 %null", "Size"),
6820fd4e5da5Sopenharmony_ci        std::make_pair("PushConstantRegionGroupOffset %float_0 %int_0",
6821fd4e5da5Sopenharmony_ci                       "Offset"),
6822fd4e5da5Sopenharmony_ci        std::make_pair("PushConstantRegionGroupOffset %null %int_0", "Offset"),
6823fd4e5da5Sopenharmony_ci        std::make_pair("PushConstantRegionGroupOffset %int_0 %float_0", "Size"),
6824fd4e5da5Sopenharmony_ci        std::make_pair("PushConstantRegionGroupOffset %int_0 %null", "Size"),
6825fd4e5da5Sopenharmony_ci        std::make_pair("ConstantDataStorageBuffer %float_0 %int_0 %data",
6826fd4e5da5Sopenharmony_ci                       "DescriptorSet"),
6827fd4e5da5Sopenharmony_ci        std::make_pair("ConstantDataStorageBuffer %null %int_0 %data",
6828fd4e5da5Sopenharmony_ci                       "DescriptorSet"),
6829fd4e5da5Sopenharmony_ci        std::make_pair("ConstantDataStorageBuffer %int_0 %float_0 %data",
6830fd4e5da5Sopenharmony_ci                       "Binding"),
6831fd4e5da5Sopenharmony_ci        std::make_pair("ConstantDataStorageBuffer %int_0 %null %data",
6832fd4e5da5Sopenharmony_ci                       "Binding"),
6833fd4e5da5Sopenharmony_ci        std::make_pair("ConstantDataUniform %float_0 %int_0 %data",
6834fd4e5da5Sopenharmony_ci                       "DescriptorSet"),
6835fd4e5da5Sopenharmony_ci        std::make_pair("ConstantDataUniform %null %int_0 %data",
6836fd4e5da5Sopenharmony_ci                       "DescriptorSet"),
6837fd4e5da5Sopenharmony_ci        std::make_pair("ConstantDataUniform %int_0 %float_0 %data", "Binding"),
6838fd4e5da5Sopenharmony_ci        std::make_pair("ConstantDataUniform %int_0 %null %data", "Binding"),
6839fd4e5da5Sopenharmony_ci        std::make_pair("LiteralSampler %float_0 %int_0 %int_4",
6840fd4e5da5Sopenharmony_ci                       "DescriptorSet"),
6841fd4e5da5Sopenharmony_ci        std::make_pair("LiteralSampler %null %int_0 %int_4", "DescriptorSet"),
6842fd4e5da5Sopenharmony_ci        std::make_pair("LiteralSampler %int_0 %float_0 %int_4", "Binding"),
6843fd4e5da5Sopenharmony_ci        std::make_pair("LiteralSampler %int_0 %null %int_4", "Binding"),
6844fd4e5da5Sopenharmony_ci        std::make_pair("LiteralSampler %int_0 %int_0 %float_0", "Mask"),
6845fd4e5da5Sopenharmony_ci        std::make_pair("LiteralSampler %int_0 %int_0 %null", "Mask"),
6846fd4e5da5Sopenharmony_ci        std::make_pair(
6847fd4e5da5Sopenharmony_ci            "PropertyRequiredWorkgroupSize %decl %float_0 %int_1 %int_4", "X"),
6848fd4e5da5Sopenharmony_ci        std::make_pair(
6849fd4e5da5Sopenharmony_ci            "PropertyRequiredWorkgroupSize %decl %null %int_1 %int_4", "X"),
6850fd4e5da5Sopenharmony_ci        std::make_pair(
6851fd4e5da5Sopenharmony_ci            "PropertyRequiredWorkgroupSize %decl %int_1 %float_0 %int_4", "Y"),
6852fd4e5da5Sopenharmony_ci        std::make_pair(
6853fd4e5da5Sopenharmony_ci            "PropertyRequiredWorkgroupSize %decl %int_1 %null %int_4", "Y"),
6854fd4e5da5Sopenharmony_ci        std::make_pair(
6855fd4e5da5Sopenharmony_ci            "PropertyRequiredWorkgroupSize %decl %int_1 %int_1 %float_0", "Z"),
6856fd4e5da5Sopenharmony_ci        std::make_pair(
6857fd4e5da5Sopenharmony_ci            "PropertyRequiredWorkgroupSize %decl %int_1 %int_1 %null", "Z"),
6858fd4e5da5Sopenharmony_ci        std::make_pair("SpecConstantSubgroupMaxSize %float_0", "Size"),
6859fd4e5da5Sopenharmony_ci        std::make_pair("SpecConstantSubgroupMaxSize %null", "Size"),
6860fd4e5da5Sopenharmony_ci        std::make_pair(
6861fd4e5da5Sopenharmony_ci            "ArgumentPointerPushConstant %decl %float_0 %int_0 %int_0",
6862fd4e5da5Sopenharmony_ci            "Ordinal"),
6863fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentPointerPushConstant %decl %null %int_0 %int_0",
6864fd4e5da5Sopenharmony_ci                       "Ordinal"),
6865fd4e5da5Sopenharmony_ci        std::make_pair(
6866fd4e5da5Sopenharmony_ci            "ArgumentPointerPushConstant %decl %int_0 %float_0 %int_0",
6867fd4e5da5Sopenharmony_ci            "Offset"),
6868fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentPointerPushConstant %decl %int_0 %null %int_0",
6869fd4e5da5Sopenharmony_ci                       "Offset"),
6870fd4e5da5Sopenharmony_ci        std::make_pair(
6871fd4e5da5Sopenharmony_ci            "ArgumentPointerPushConstant %decl %int_0 %int_0 %float_0", "Size"),
6872fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentPointerPushConstant %decl %int_0 %int_0 %null",
6873fd4e5da5Sopenharmony_ci                       "Size"),
6874fd4e5da5Sopenharmony_ci        std::make_pair(
6875fd4e5da5Sopenharmony_ci            "ArgumentPointerUniform %decl %float_0 %int_0 %int_0 %int_0 %int_4",
6876fd4e5da5Sopenharmony_ci            "Ordinal"),
6877fd4e5da5Sopenharmony_ci        std::make_pair(
6878fd4e5da5Sopenharmony_ci            "ArgumentPointerUniform %decl %null %int_0 %int_0 %int_0 %int_4",
6879fd4e5da5Sopenharmony_ci            "Ordinal"),
6880fd4e5da5Sopenharmony_ci        std::make_pair(
6881fd4e5da5Sopenharmony_ci            "ArgumentPointerUniform %decl %int_0 %float_0 %int_0 %int_0 %int_4",
6882fd4e5da5Sopenharmony_ci            "DescriptorSet"),
6883fd4e5da5Sopenharmony_ci        std::make_pair(
6884fd4e5da5Sopenharmony_ci            "ArgumentPointerUniform %decl %int_0 %null %int_0 %int_0 %int_4",
6885fd4e5da5Sopenharmony_ci            "DescriptorSet"),
6886fd4e5da5Sopenharmony_ci        std::make_pair(
6887fd4e5da5Sopenharmony_ci            "ArgumentPointerUniform %decl %int_0 %int_0 %float_0 %int_0 %int_4",
6888fd4e5da5Sopenharmony_ci            "Binding"),
6889fd4e5da5Sopenharmony_ci        std::make_pair(
6890fd4e5da5Sopenharmony_ci            "ArgumentPointerUniform %decl %int_0 %int_0 %null %int_0 %int_4",
6891fd4e5da5Sopenharmony_ci            "Binding"),
6892fd4e5da5Sopenharmony_ci        std::make_pair(
6893fd4e5da5Sopenharmony_ci            "ArgumentPointerUniform %decl %int_0 %int_0 %int_0 %float_0 %int_4",
6894fd4e5da5Sopenharmony_ci            "Offset"),
6895fd4e5da5Sopenharmony_ci        std::make_pair(
6896fd4e5da5Sopenharmony_ci            "ArgumentPointerUniform %decl %int_0 %int_0 %int_0 %null %int_4",
6897fd4e5da5Sopenharmony_ci            "Offset"),
6898fd4e5da5Sopenharmony_ci        std::make_pair(
6899fd4e5da5Sopenharmony_ci            "ArgumentPointerUniform %decl %int_0 %int_0 %int_0 %int_0 %float_0",
6900fd4e5da5Sopenharmony_ci            "Size"),
6901fd4e5da5Sopenharmony_ci        std::make_pair(
6902fd4e5da5Sopenharmony_ci            "ArgumentPointerUniform %decl %int_0 %int_0 %int_0 %int_0 %null",
6903fd4e5da5Sopenharmony_ci            "Size"),
6904fd4e5da5Sopenharmony_ci        std::make_pair(
6905fd4e5da5Sopenharmony_ci            "ProgramScopeVariablesStorageBuffer %float_0 %int_0 %data",
6906fd4e5da5Sopenharmony_ci            "DescriptorSet"),
6907fd4e5da5Sopenharmony_ci        std::make_pair("ProgramScopeVariablesStorageBuffer %null %int_0 %data",
6908fd4e5da5Sopenharmony_ci                       "DescriptorSet"),
6909fd4e5da5Sopenharmony_ci        std::make_pair(
6910fd4e5da5Sopenharmony_ci            "ProgramScopeVariablesStorageBuffer %int_0 %float_0 %data",
6911fd4e5da5Sopenharmony_ci            "Binding"),
6912fd4e5da5Sopenharmony_ci        std::make_pair("ProgramScopeVariablesStorageBuffer %int_0 %null %data",
6913fd4e5da5Sopenharmony_ci                       "Binding"),
6914fd4e5da5Sopenharmony_ci        std::make_pair(
6915fd4e5da5Sopenharmony_ci            "ProgramScopeVariablePointerRelocation %float_0 %int_0 %int_4",
6916fd4e5da5Sopenharmony_ci            "ObjectOffset"),
6917fd4e5da5Sopenharmony_ci        std::make_pair(
6918fd4e5da5Sopenharmony_ci            "ProgramScopeVariablePointerRelocation %null %int_0 %int_4",
6919fd4e5da5Sopenharmony_ci            "ObjectOffset"),
6920fd4e5da5Sopenharmony_ci        std::make_pair(
6921fd4e5da5Sopenharmony_ci            "ProgramScopeVariablePointerRelocation %int_0 %float_0 %int_4",
6922fd4e5da5Sopenharmony_ci            "PointerOffset"),
6923fd4e5da5Sopenharmony_ci        std::make_pair(
6924fd4e5da5Sopenharmony_ci            "ProgramScopeVariablePointerRelocation %int_0 %null %int_4",
6925fd4e5da5Sopenharmony_ci            "PointerOffset"),
6926fd4e5da5Sopenharmony_ci        std::make_pair(
6927fd4e5da5Sopenharmony_ci            "ProgramScopeVariablePointerRelocation %int_0 %int_0 %float_0",
6928fd4e5da5Sopenharmony_ci            "PointerSize"),
6929fd4e5da5Sopenharmony_ci        std::make_pair(
6930fd4e5da5Sopenharmony_ci            "ProgramScopeVariablePointerRelocation %int_0 %int_0 %null",
6931fd4e5da5Sopenharmony_ci            "PointerSize"),
6932fd4e5da5Sopenharmony_ci        std::make_pair("ImageArgumentInfoChannelOrderPushConstant %decl "
6933fd4e5da5Sopenharmony_ci                       "%float_0 %int_0 %int_4",
6934fd4e5da5Sopenharmony_ci                       "Ordinal"),
6935fd4e5da5Sopenharmony_ci        std::make_pair("ImageArgumentInfoChannelOrderPushConstant %decl %null "
6936fd4e5da5Sopenharmony_ci                       "%int_0 %int_4",
6937fd4e5da5Sopenharmony_ci                       "Ordinal"),
6938fd4e5da5Sopenharmony_ci        std::make_pair("ImageArgumentInfoChannelOrderPushConstant %decl %int_0 "
6939fd4e5da5Sopenharmony_ci                       "%float_0 %int_4",
6940fd4e5da5Sopenharmony_ci                       "Offset"),
6941fd4e5da5Sopenharmony_ci        std::make_pair("ImageArgumentInfoChannelOrderPushConstant %decl %int_0 "
6942fd4e5da5Sopenharmony_ci                       "%null %int_4",
6943fd4e5da5Sopenharmony_ci                       "Offset"),
6944fd4e5da5Sopenharmony_ci        std::make_pair("ImageArgumentInfoChannelOrderPushConstant %decl %int_0 "
6945fd4e5da5Sopenharmony_ci                       "%int_0 %float_0",
6946fd4e5da5Sopenharmony_ci                       "Size"),
6947fd4e5da5Sopenharmony_ci        std::make_pair("ImageArgumentInfoChannelOrderPushConstant %decl %int_0 "
6948fd4e5da5Sopenharmony_ci                       "%int_0 %null",
6949fd4e5da5Sopenharmony_ci                       "Size"),
6950fd4e5da5Sopenharmony_ci        std::make_pair("ImageArgumentInfoChannelDataTypePushConstant %decl "
6951fd4e5da5Sopenharmony_ci                       "%float_0 %int_0 %int_4",
6952fd4e5da5Sopenharmony_ci                       "Ordinal"),
6953fd4e5da5Sopenharmony_ci        std::make_pair("ImageArgumentInfoChannelDataTypePushConstant %decl "
6954fd4e5da5Sopenharmony_ci                       "%null %int_0 %int_4",
6955fd4e5da5Sopenharmony_ci                       "Ordinal"),
6956fd4e5da5Sopenharmony_ci        std::make_pair("ImageArgumentInfoChannelDataTypePushConstant %decl "
6957fd4e5da5Sopenharmony_ci                       "%int_0 %float_0 %int_4",
6958fd4e5da5Sopenharmony_ci                       "Offset"),
6959fd4e5da5Sopenharmony_ci        std::make_pair("ImageArgumentInfoChannelDataTypePushConstant %decl "
6960fd4e5da5Sopenharmony_ci                       "%int_0 %null %int_4",
6961fd4e5da5Sopenharmony_ci                       "Offset"),
6962fd4e5da5Sopenharmony_ci        std::make_pair("ImageArgumentInfoChannelDataTypePushConstant %decl "
6963fd4e5da5Sopenharmony_ci                       "%int_0 %int_0 %float_0",
6964fd4e5da5Sopenharmony_ci                       "Size"),
6965fd4e5da5Sopenharmony_ci        std::make_pair("ImageArgumentInfoChannelDataTypePushConstant %decl "
6966fd4e5da5Sopenharmony_ci                       "%int_0 %int_0 %null",
6967fd4e5da5Sopenharmony_ci                       "Size"),
6968fd4e5da5Sopenharmony_ci        std::make_pair("ImageArgumentInfoChannelOrderUniform %decl %float_0 "
6969fd4e5da5Sopenharmony_ci                       "%int_0 %int_0 %int_0 %int_4",
6970fd4e5da5Sopenharmony_ci                       "Ordinal"),
6971fd4e5da5Sopenharmony_ci        std::make_pair("ImageArgumentInfoChannelOrderUniform %decl %null "
6972fd4e5da5Sopenharmony_ci                       "%int_0 %int_0 %int_0 %int_4",
6973fd4e5da5Sopenharmony_ci                       "Ordinal"),
6974fd4e5da5Sopenharmony_ci        std::make_pair("ImageArgumentInfoChannelOrderUniform %decl %int_0 "
6975fd4e5da5Sopenharmony_ci                       "%float_0 %int_0 %int_0 %int_4",
6976fd4e5da5Sopenharmony_ci                       "DescriptorSet"),
6977fd4e5da5Sopenharmony_ci        std::make_pair("ImageArgumentInfoChannelOrderUniform %decl %int_0 "
6978fd4e5da5Sopenharmony_ci                       "%null %int_0 %int_0 %int_4",
6979fd4e5da5Sopenharmony_ci                       "DescriptorSet"),
6980fd4e5da5Sopenharmony_ci        std::make_pair("ImageArgumentInfoChannelOrderUniform %decl %int_0 "
6981fd4e5da5Sopenharmony_ci                       "%int_0 %float_0 %int_0 %int_4",
6982fd4e5da5Sopenharmony_ci                       "Binding"),
6983fd4e5da5Sopenharmony_ci        std::make_pair("ImageArgumentInfoChannelOrderUniform %decl %int_0 "
6984fd4e5da5Sopenharmony_ci                       "%int_0 %null %int_0 %int_4",
6985fd4e5da5Sopenharmony_ci                       "Binding"),
6986fd4e5da5Sopenharmony_ci        std::make_pair("ImageArgumentInfoChannelOrderUniform %decl %int_0 "
6987fd4e5da5Sopenharmony_ci                       "%int_0 %int_0 %float_0 %int_4",
6988fd4e5da5Sopenharmony_ci                       "Offset"),
6989fd4e5da5Sopenharmony_ci        std::make_pair("ImageArgumentInfoChannelOrderUniform %decl %int_0 "
6990fd4e5da5Sopenharmony_ci                       "%int_0 %int_0 %null %int_4",
6991fd4e5da5Sopenharmony_ci                       "Offset"),
6992fd4e5da5Sopenharmony_ci        std::make_pair("ImageArgumentInfoChannelOrderUniform %decl %int_0 "
6993fd4e5da5Sopenharmony_ci                       "%int_0 %int_0 %int_0 %float_0",
6994fd4e5da5Sopenharmony_ci                       "Size"),
6995fd4e5da5Sopenharmony_ci        std::make_pair("ImageArgumentInfoChannelOrderUniform %decl %int_0 "
6996fd4e5da5Sopenharmony_ci                       "%int_0 %int_0 %int_0 %null",
6997fd4e5da5Sopenharmony_ci                       "Size"),
6998fd4e5da5Sopenharmony_ci        std::make_pair("ImageArgumentInfoChannelDataTypeUniform %decl %float_0 "
6999fd4e5da5Sopenharmony_ci                       "%int_0 %int_0 %int_0 %int_4",
7000fd4e5da5Sopenharmony_ci                       "Ordinal"),
7001fd4e5da5Sopenharmony_ci        std::make_pair("ImageArgumentInfoChannelDataTypeUniform %decl %null "
7002fd4e5da5Sopenharmony_ci                       "%int_0 %int_0 %int_0 %int_4",
7003fd4e5da5Sopenharmony_ci                       "Ordinal"),
7004fd4e5da5Sopenharmony_ci        std::make_pair("ImageArgumentInfoChannelDataTypeUniform %decl %int_0 "
7005fd4e5da5Sopenharmony_ci                       "%float_0 %int_0 %int_0 %int_4",
7006fd4e5da5Sopenharmony_ci                       "DescriptorSet"),
7007fd4e5da5Sopenharmony_ci        std::make_pair("ImageArgumentInfoChannelDataTypeUniform %decl %int_0 "
7008fd4e5da5Sopenharmony_ci                       "%null %int_0 %int_0 %int_4",
7009fd4e5da5Sopenharmony_ci                       "DescriptorSet"),
7010fd4e5da5Sopenharmony_ci        std::make_pair("ImageArgumentInfoChannelDataTypeUniform %decl %int_0 "
7011fd4e5da5Sopenharmony_ci                       "%int_0 %float_0 %int_0 %int_4",
7012fd4e5da5Sopenharmony_ci                       "Binding"),
7013fd4e5da5Sopenharmony_ci        std::make_pair("ImageArgumentInfoChannelDataTypeUniform %decl %int_0 "
7014fd4e5da5Sopenharmony_ci                       "%int_0 %null %int_0 %int_4",
7015fd4e5da5Sopenharmony_ci                       "Binding"),
7016fd4e5da5Sopenharmony_ci        std::make_pair("ImageArgumentInfoChannelDataTypeUniform %decl %int_0 "
7017fd4e5da5Sopenharmony_ci                       "%int_0 %int_0 %float_0 %int_4",
7018fd4e5da5Sopenharmony_ci                       "Offset"),
7019fd4e5da5Sopenharmony_ci        std::make_pair("ImageArgumentInfoChannelDataTypeUniform %decl %int_0 "
7020fd4e5da5Sopenharmony_ci                       "%int_0 %int_0 %null %int_4",
7021fd4e5da5Sopenharmony_ci                       "Offset"),
7022fd4e5da5Sopenharmony_ci        std::make_pair("ImageArgumentInfoChannelDataTypeUniform %decl %int_0 "
7023fd4e5da5Sopenharmony_ci                       "%int_0 %int_0 %int_0 %float_0",
7024fd4e5da5Sopenharmony_ci                       "Size"),
7025fd4e5da5Sopenharmony_ci        std::make_pair("ImageArgumentInfoChannelDataTypeUniform %decl %int_0 "
7026fd4e5da5Sopenharmony_ci                       "%int_0 %int_0 %int_0 %null",
7027fd4e5da5Sopenharmony_ci                       "Size"),
7028fd4e5da5Sopenharmony_ci        std::make_pair(
7029fd4e5da5Sopenharmony_ci            "ArgumentStorageTexelBuffer %decl %float_0 %int_0 %int_0",
7030fd4e5da5Sopenharmony_ci            "Ordinal"),
7031fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentStorageTexelBuffer %decl %null %int_0 %int_0",
7032fd4e5da5Sopenharmony_ci                       "Ordinal"),
7033fd4e5da5Sopenharmony_ci        std::make_pair(
7034fd4e5da5Sopenharmony_ci            "ArgumentStorageTexelBuffer %decl %int_0 %float_0 %int_0",
7035fd4e5da5Sopenharmony_ci            "DescriptorSet"),
7036fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentStorageTexelBuffer %decl %int_0 %null %int_0",
7037fd4e5da5Sopenharmony_ci                       "DescriptorSet"),
7038fd4e5da5Sopenharmony_ci        std::make_pair(
7039fd4e5da5Sopenharmony_ci            "ArgumentStorageTexelBuffer %decl %int_0 %int_0 %float_0",
7040fd4e5da5Sopenharmony_ci            "Binding"),
7041fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentStorageTexelBuffer %decl %int_0 %int_0 %null",
7042fd4e5da5Sopenharmony_ci                       "Binding"),
7043fd4e5da5Sopenharmony_ci        std::make_pair(
7044fd4e5da5Sopenharmony_ci            "ArgumentUniformTexelBuffer %decl %float_0 %int_0 %int_0",
7045fd4e5da5Sopenharmony_ci            "Ordinal"),
7046fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentUniformTexelBuffer %decl %null %int_0 %int_0",
7047fd4e5da5Sopenharmony_ci                       "Ordinal"),
7048fd4e5da5Sopenharmony_ci        std::make_pair(
7049fd4e5da5Sopenharmony_ci            "ArgumentUniformTexelBuffer %decl %int_0 %float_0 %int_0",
7050fd4e5da5Sopenharmony_ci            "DescriptorSet"),
7051fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentUniformTexelBuffer %decl %int_0 %null %int_0",
7052fd4e5da5Sopenharmony_ci                       "DescriptorSet"),
7053fd4e5da5Sopenharmony_ci        std::make_pair(
7054fd4e5da5Sopenharmony_ci            "ArgumentUniformTexelBuffer %decl %int_0 %int_0 %float_0",
7055fd4e5da5Sopenharmony_ci            "Binding"),
7056fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentUniformTexelBuffer %decl %int_0 %int_0 %null",
7057fd4e5da5Sopenharmony_ci                       "Binding"),
7058fd4e5da5Sopenharmony_ci        std::make_pair("ConstantDataPointerPushConstant %float_0 %int_4 %data",
7059fd4e5da5Sopenharmony_ci                       "Offset"),
7060fd4e5da5Sopenharmony_ci        std::make_pair("ConstantDataPointerPushConstant %null %int_4 %data",
7061fd4e5da5Sopenharmony_ci                       "Offset"),
7062fd4e5da5Sopenharmony_ci        std::make_pair("ConstantDataPointerPushConstant %int_0 %float_0 %data",
7063fd4e5da5Sopenharmony_ci                       "Size"),
7064fd4e5da5Sopenharmony_ci        std::make_pair("ConstantDataPointerPushConstant %int_0 %null %data",
7065fd4e5da5Sopenharmony_ci                       "Size"),
7066fd4e5da5Sopenharmony_ci        std::make_pair(
7067fd4e5da5Sopenharmony_ci            "ProgramScopeVariablePointerPushConstant %float_0 %int_4 %data",
7068fd4e5da5Sopenharmony_ci            "Offset"),
7069fd4e5da5Sopenharmony_ci        std::make_pair(
7070fd4e5da5Sopenharmony_ci            "ProgramScopeVariablePointerPushConstant %null %int_4 %data",
7071fd4e5da5Sopenharmony_ci            "Offset"),
7072fd4e5da5Sopenharmony_ci        std::make_pair(
7073fd4e5da5Sopenharmony_ci            "ProgramScopeVariablePointerPushConstant %int_0 %float_0 %data",
7074fd4e5da5Sopenharmony_ci            "Size"),
7075fd4e5da5Sopenharmony_ci        std::make_pair(
7076fd4e5da5Sopenharmony_ci            "ProgramScopeVariablePointerPushConstant %int_0 %null %data",
7077fd4e5da5Sopenharmony_ci            "Size"),
7078fd4e5da5Sopenharmony_ci        std::make_pair("PrintfInfo %float_0 %data %int_0 %int_0 %int_0",
7079fd4e5da5Sopenharmony_ci                       "PrintfID"),
7080fd4e5da5Sopenharmony_ci        std::make_pair("PrintfInfo %null %data %int_0 %int_0 %int_0",
7081fd4e5da5Sopenharmony_ci                       "PrintfID"),
7082fd4e5da5Sopenharmony_ci        std::make_pair("PrintfInfo %int_0 %data %float_0 %int_0 %int_0",
7083fd4e5da5Sopenharmony_ci                       "ArgumentSizes"),
7084fd4e5da5Sopenharmony_ci        std::make_pair("PrintfInfo %int_0 %data %null %int_0 %int_0",
7085fd4e5da5Sopenharmony_ci                       "ArgumentSizes"),
7086fd4e5da5Sopenharmony_ci        std::make_pair("PrintfInfo %int_0 %data %int_0 %float_0 %int_0",
7087fd4e5da5Sopenharmony_ci                       "ArgumentSizes"),
7088fd4e5da5Sopenharmony_ci        std::make_pair("PrintfInfo %int_0 %data %int_0 %null %int_0",
7089fd4e5da5Sopenharmony_ci                       "ArgumentSizes"),
7090fd4e5da5Sopenharmony_ci        std::make_pair("PrintfInfo %int_0 %data %int_0 %int_0 %null",
7091fd4e5da5Sopenharmony_ci                       "ArgumentSizes"),
7092fd4e5da5Sopenharmony_ci        std::make_pair("PrintfInfo %int_0 %data %int_0 %int_0 %float_0",
7093fd4e5da5Sopenharmony_ci                       "ArgumentSizes"),
7094fd4e5da5Sopenharmony_ci        std::make_pair("PrintfInfo %int_0 %data %int_0 %float_0",
7095fd4e5da5Sopenharmony_ci                       "ArgumentSizes"),
7096fd4e5da5Sopenharmony_ci        std::make_pair("PrintfInfo %int_0 %data %int_0 %null", "ArgumentSizes"),
7097fd4e5da5Sopenharmony_ci        std::make_pair("PrintfBufferStorageBuffer %float_0 %int_0 %int_4",
7098fd4e5da5Sopenharmony_ci                       "DescriptorSet"),
7099fd4e5da5Sopenharmony_ci        std::make_pair("PrintfBufferStorageBuffer %null %int_0 %int_4",
7100fd4e5da5Sopenharmony_ci                       "DescriptorSet"),
7101fd4e5da5Sopenharmony_ci        std::make_pair("PrintfBufferStorageBuffer %int_0 %float_0 %int_4",
7102fd4e5da5Sopenharmony_ci                       "Binding"),
7103fd4e5da5Sopenharmony_ci        std::make_pair("PrintfBufferStorageBuffer %int_0 %null %int_4",
7104fd4e5da5Sopenharmony_ci                       "Binding"),
7105fd4e5da5Sopenharmony_ci        std::make_pair("PrintfBufferStorageBuffer %int_0 %int_0 %float_0",
7106fd4e5da5Sopenharmony_ci                       "Size"),
7107fd4e5da5Sopenharmony_ci        std::make_pair("PrintfBufferStorageBuffer %int_0 %int_0 %null", "Size"),
7108fd4e5da5Sopenharmony_ci        std::make_pair("PrintfBufferPointerPushConstant %float_0 %int_0 %int_4",
7109fd4e5da5Sopenharmony_ci                       "Offset"),
7110fd4e5da5Sopenharmony_ci        std::make_pair("PrintfBufferPointerPushConstant %null %int_0 %int_4",
7111fd4e5da5Sopenharmony_ci                       "Offset"),
7112fd4e5da5Sopenharmony_ci        std::make_pair("PrintfBufferPointerPushConstant %int_0 %float_0 %int_4",
7113fd4e5da5Sopenharmony_ci                       "Size"),
7114fd4e5da5Sopenharmony_ci        std::make_pair("PrintfBufferPointerPushConstant %int_0 %null %int_4",
7115fd4e5da5Sopenharmony_ci                       "Size"),
7116fd4e5da5Sopenharmony_ci        std::make_pair("PrintfBufferPointerPushConstant %int_0 %int_0 %float_0",
7117fd4e5da5Sopenharmony_ci                       "BufferSize"),
7118fd4e5da5Sopenharmony_ci        std::make_pair("PrintfBufferPointerPushConstant %int_0 %int_0 %null",
7119fd4e5da5Sopenharmony_ci                       "BufferSize")}));
7120fd4e5da5Sopenharmony_ci
7121fd4e5da5Sopenharmony_ciTEST_P(Uint32Constant, Invalid) {
7122fd4e5da5Sopenharmony_ci  const std::string ext_inst = std::get<0>(GetParam());
7123fd4e5da5Sopenharmony_ci  const std::string name = std::get<1>(GetParam());
7124fd4e5da5Sopenharmony_ci  const std::string text = R"(
7125fd4e5da5Sopenharmony_ciOpCapability Shader
7126fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info"
7127fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.5"
7128fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
7129fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo"
7130fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1
7131fd4e5da5Sopenharmony_ci%foo_name = OpString "foo"
7132fd4e5da5Sopenharmony_ci%data = OpString "1234"
7133fd4e5da5Sopenharmony_ci%void = OpTypeVoid
7134fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0
7135fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0
7136fd4e5da5Sopenharmony_ci%int_1 = OpConstant %int 1
7137fd4e5da5Sopenharmony_ci%int_4 = OpConstant %int 4
7138fd4e5da5Sopenharmony_ci%null = OpConstantNull %int
7139fd4e5da5Sopenharmony_ci%float = OpTypeFloat 32
7140fd4e5da5Sopenharmony_ci%float_0 = OpConstant %float 0
7141fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void
7142fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn
7143fd4e5da5Sopenharmony_ci%entry = OpLabel
7144fd4e5da5Sopenharmony_ciOpReturn
7145fd4e5da5Sopenharmony_ciOpFunctionEnd
7146fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name
7147fd4e5da5Sopenharmony_ci%inst = OpExtInst %void %ext )" +
7148fd4e5da5Sopenharmony_ci                           ext_inst;
7149fd4e5da5Sopenharmony_ci
7150fd4e5da5Sopenharmony_ci  CompileSuccessfully(text);
7151fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
7152fd4e5da5Sopenharmony_ci  EXPECT_THAT(
7153fd4e5da5Sopenharmony_ci      getDiagnosticString(),
7154fd4e5da5Sopenharmony_ci      HasSubstr(name + " must be a 32-bit unsigned integer OpConstant"));
7155fd4e5da5Sopenharmony_ci}
7156fd4e5da5Sopenharmony_ci
7157fd4e5da5Sopenharmony_ciusing StringOperand =
7158fd4e5da5Sopenharmony_ci    spvtest::ValidateBase<std::pair<std::string, std::string>>;
7159fd4e5da5Sopenharmony_ci
7160fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
7161fd4e5da5Sopenharmony_ci    ValidateClspvReflectionStringOperands, StringOperand,
7162fd4e5da5Sopenharmony_ci    ::testing::ValuesIn(std::vector<std::pair<std::string, std::string>>{
7163fd4e5da5Sopenharmony_ci        std::make_pair("ConstantDataStorageBuffer %int_0 %int_0 %int_0",
7164fd4e5da5Sopenharmony_ci                       "Data"),
7165fd4e5da5Sopenharmony_ci        std::make_pair("ConstantDataUniform %int_0 %int_0 %int_0", "Data"),
7166fd4e5da5Sopenharmony_ci        std::make_pair(
7167fd4e5da5Sopenharmony_ci            "ProgramScopeVariablesStorageBuffer %int_0 %int_0 %int_0", "Data"),
7168fd4e5da5Sopenharmony_ci        std::make_pair("ConstantDataPointerPushConstant %int_0 %int_0 %int_0",
7169fd4e5da5Sopenharmony_ci                       "Data"),
7170fd4e5da5Sopenharmony_ci        std::make_pair(
7171fd4e5da5Sopenharmony_ci            "ProgramScopeVariablePointerPushConstant %int_0 %int_0 %int_0",
7172fd4e5da5Sopenharmony_ci            "Data"),
7173fd4e5da5Sopenharmony_ci        std::make_pair("PrintfInfo %int_0 %int_0", "FormatString")}));
7174fd4e5da5Sopenharmony_ci
7175fd4e5da5Sopenharmony_ciTEST_P(StringOperand, Invalid) {
7176fd4e5da5Sopenharmony_ci  const std::string ext_inst = std::get<0>(GetParam());
7177fd4e5da5Sopenharmony_ci  const std::string name = std::get<1>(GetParam());
7178fd4e5da5Sopenharmony_ci  const std::string text = R"(
7179fd4e5da5Sopenharmony_ciOpCapability Shader
7180fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info"
7181fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.5"
7182fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
7183fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo"
7184fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1
7185fd4e5da5Sopenharmony_ci%foo_name = OpString "foo"
7186fd4e5da5Sopenharmony_ci%data = OpString "1234"
7187fd4e5da5Sopenharmony_ci%void = OpTypeVoid
7188fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0
7189fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0
7190fd4e5da5Sopenharmony_ci%int_1 = OpConstant %int 1
7191fd4e5da5Sopenharmony_ci%int_4 = OpConstant %int 4
7192fd4e5da5Sopenharmony_ci%null = OpConstantNull %int
7193fd4e5da5Sopenharmony_ci%float = OpTypeFloat 32
7194fd4e5da5Sopenharmony_ci%float_0 = OpConstant %float 0
7195fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void
7196fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn
7197fd4e5da5Sopenharmony_ci%entry = OpLabel
7198fd4e5da5Sopenharmony_ciOpReturn
7199fd4e5da5Sopenharmony_ciOpFunctionEnd
7200fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name
7201fd4e5da5Sopenharmony_ci%inst = OpExtInst %void %ext )" +
7202fd4e5da5Sopenharmony_ci                           ext_inst;
7203fd4e5da5Sopenharmony_ci
7204fd4e5da5Sopenharmony_ci  CompileSuccessfully(text);
7205fd4e5da5Sopenharmony_ci  ASSERT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
7206fd4e5da5Sopenharmony_ci  EXPECT_THAT(getDiagnosticString(), HasSubstr(name + " must be an OpString"));
7207fd4e5da5Sopenharmony_ci}
7208fd4e5da5Sopenharmony_ci
7209fd4e5da5Sopenharmony_ciusing VersionCheck = spvtest::ValidateBase<std::pair<std::string, uint32_t>>;
7210fd4e5da5Sopenharmony_ci
7211fd4e5da5Sopenharmony_ciINSTANTIATE_TEST_SUITE_P(
7212fd4e5da5Sopenharmony_ci    ValidateClspvReflectionVersionCheck, VersionCheck,
7213fd4e5da5Sopenharmony_ci    ::testing::ValuesIn(std::vector<std::pair<std::string, uint32_t>>{
7214fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentStorageBuffer %decl %int_0 %int_0 %int_0", 1),
7215fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentUniform %decl %int_0 %int_0 %int_0", 1),
7216fd4e5da5Sopenharmony_ci        std::make_pair(
7217fd4e5da5Sopenharmony_ci            "ArgumentPodStorageBuffer %decl %int_0 %int_0 %int_0 %int_0 %int_0",
7218fd4e5da5Sopenharmony_ci            1),
7219fd4e5da5Sopenharmony_ci        std::make_pair(
7220fd4e5da5Sopenharmony_ci            "ArgumentPodUniform %decl %int_0 %int_0 %int_0 %int_0 %int_0", 1),
7221fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentPodPushConstant %decl %int_0 %int_0 %int_0", 1),
7222fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentSampledImage %decl %int_0 %int_0 %int_0", 1),
7223fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentStorageImage %decl %int_0 %int_0 %int_0", 1),
7224fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentSampler %decl %int_0 %int_0 %int_0", 1),
7225fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentWorkgroup %decl %int_0 %int_0 %int_0", 1),
7226fd4e5da5Sopenharmony_ci        std::make_pair("SpecConstantWorkgroupSize %int_0 %int_0 %int_0", 1),
7227fd4e5da5Sopenharmony_ci        std::make_pair("SpecConstantGlobalOffset %int_0 %int_0 %int_0", 1),
7228fd4e5da5Sopenharmony_ci        std::make_pair("SpecConstantWorkDim %int_0", 1),
7229fd4e5da5Sopenharmony_ci        std::make_pair("PushConstantGlobalOffset %int_0 %int_0", 1),
7230fd4e5da5Sopenharmony_ci        std::make_pair("PushConstantEnqueuedLocalSize %int_0 %int_0", 1),
7231fd4e5da5Sopenharmony_ci        std::make_pair("PushConstantGlobalSize %int_0 %int_0", 1),
7232fd4e5da5Sopenharmony_ci        std::make_pair("PushConstantRegionOffset %int_0 %int_0", 1),
7233fd4e5da5Sopenharmony_ci        std::make_pair("PushConstantNumWorkgroups %int_0 %int_0", 1),
7234fd4e5da5Sopenharmony_ci        std::make_pair("PushConstantRegionGroupOffset %int_0 %int_0", 1),
7235fd4e5da5Sopenharmony_ci        std::make_pair("ConstantDataStorageBuffer %int_0 %int_0 %data", 1),
7236fd4e5da5Sopenharmony_ci        std::make_pair("ConstantDataUniform %int_0 %int_0 %data", 1),
7237fd4e5da5Sopenharmony_ci        std::make_pair("LiteralSampler %int_0 %int_0 %int_0", 1),
7238fd4e5da5Sopenharmony_ci        std::make_pair(
7239fd4e5da5Sopenharmony_ci            "PropertyRequiredWorkgroupSize %decl %int_0 %int_0 %int_0", 1),
7240fd4e5da5Sopenharmony_ci        std::make_pair("SpecConstantSubgroupMaxSize %int_0", 2),
7241fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentPointerPushConstant %decl %int_0 %int_0 %int_0",
7242fd4e5da5Sopenharmony_ci                       3),
7243fd4e5da5Sopenharmony_ci        std::make_pair(
7244fd4e5da5Sopenharmony_ci            "ArgumentPointerUniform %decl %int_0 %int_0 %int_0 %int_0 %int_0",
7245fd4e5da5Sopenharmony_ci            3),
7246fd4e5da5Sopenharmony_ci        std::make_pair("ProgramScopeVariablesStorageBuffer %int_0 %int_0 %data",
7247fd4e5da5Sopenharmony_ci                       3),
7248fd4e5da5Sopenharmony_ci        std::make_pair(
7249fd4e5da5Sopenharmony_ci            "ProgramScopeVariablePointerRelocation %int_0 %int_0 %int_0", 3),
7250fd4e5da5Sopenharmony_ci        std::make_pair("ImageArgumentInfoChannelOrderPushConstant %decl %int_0 "
7251fd4e5da5Sopenharmony_ci                       "%int_0 %int_0",
7252fd4e5da5Sopenharmony_ci                       3),
7253fd4e5da5Sopenharmony_ci        std::make_pair("ImageArgumentInfoChannelDataTypePushConstant %decl "
7254fd4e5da5Sopenharmony_ci                       "%int_0 %int_0 %int_0",
7255fd4e5da5Sopenharmony_ci                       3),
7256fd4e5da5Sopenharmony_ci        std::make_pair("ImageArgumentInfoChannelOrderUniform %decl %int_0 "
7257fd4e5da5Sopenharmony_ci                       "%int_0 %int_0 %int_0 %int_0",
7258fd4e5da5Sopenharmony_ci                       3),
7259fd4e5da5Sopenharmony_ci        std::make_pair("ImageArgumentInfoChannelDataTypeUniform %decl %int_0 "
7260fd4e5da5Sopenharmony_ci                       "%int_0 %int_0 %int_0 %int_0",
7261fd4e5da5Sopenharmony_ci                       3),
7262fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentStorageTexelBuffer %decl %int_0 %int_0 %int_0",
7263fd4e5da5Sopenharmony_ci                       4),
7264fd4e5da5Sopenharmony_ci        std::make_pair("ArgumentUniformTexelBuffer %decl %int_0 %int_0 %int_0",
7265fd4e5da5Sopenharmony_ci                       4),
7266fd4e5da5Sopenharmony_ci        std::make_pair("ConstantDataPointerPushConstant %int_0 %int_0 %data",
7267fd4e5da5Sopenharmony_ci                       5),
7268fd4e5da5Sopenharmony_ci        std::make_pair(
7269fd4e5da5Sopenharmony_ci            "ProgramScopeVariablePointerPushConstant %int_0 %int_0 %data", 5),
7270fd4e5da5Sopenharmony_ci        std::make_pair("PrintfInfo %int_0 %data", 5),
7271fd4e5da5Sopenharmony_ci        std::make_pair("PrintfBufferStorageBuffer %int_0 %int_0 %int_0", 5),
7272fd4e5da5Sopenharmony_ci        std::make_pair("PrintfBufferPointerPushConstant %int_0 %int_0 %int_0",
7273fd4e5da5Sopenharmony_ci                       5)}));
7274fd4e5da5Sopenharmony_ci
7275fd4e5da5Sopenharmony_ciTEST_P(VersionCheck, V1) {
7276fd4e5da5Sopenharmony_ci  const std::string ext_inst = std::get<0>(GetParam());
7277fd4e5da5Sopenharmony_ci  const uint32_t version = std::get<1>(GetParam());
7278fd4e5da5Sopenharmony_ci  const std::string text = R"(
7279fd4e5da5Sopenharmony_ciOpCapability Shader
7280fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info"
7281fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.1"
7282fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
7283fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo"
7284fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1
7285fd4e5da5Sopenharmony_ci%foo_name = OpString "foo"
7286fd4e5da5Sopenharmony_ci%data = OpString "1234"
7287fd4e5da5Sopenharmony_ci%void = OpTypeVoid
7288fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0
7289fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0
7290fd4e5da5Sopenharmony_ci%int_1 = OpConstant %int 1
7291fd4e5da5Sopenharmony_ci%int_4 = OpConstant %int 4
7292fd4e5da5Sopenharmony_ci%null = OpConstantNull %int
7293fd4e5da5Sopenharmony_ci%float = OpTypeFloat 32
7294fd4e5da5Sopenharmony_ci%float_0 = OpConstant %float 0
7295fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void
7296fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn
7297fd4e5da5Sopenharmony_ci%entry = OpLabel
7298fd4e5da5Sopenharmony_ciOpReturn
7299fd4e5da5Sopenharmony_ciOpFunctionEnd
7300fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name
7301fd4e5da5Sopenharmony_ci%inst = OpExtInst %void %ext )" +
7302fd4e5da5Sopenharmony_ci                           ext_inst;
7303fd4e5da5Sopenharmony_ci
7304fd4e5da5Sopenharmony_ci  CompileSuccessfully(text);
7305fd4e5da5Sopenharmony_ci  if (version <= 1) {
7306fd4e5da5Sopenharmony_ci    EXPECT_EQ(SPV_SUCCESS, ValidateInstructions());
7307fd4e5da5Sopenharmony_ci  } else {
7308fd4e5da5Sopenharmony_ci    EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
7309fd4e5da5Sopenharmony_ci    EXPECT_THAT(getDiagnosticString(),
7310fd4e5da5Sopenharmony_ci                HasSubstr("requires version " + std::to_string(version) +
7311fd4e5da5Sopenharmony_ci                          ", but parsed version is 1"));
7312fd4e5da5Sopenharmony_ci  }
7313fd4e5da5Sopenharmony_ci}
7314fd4e5da5Sopenharmony_ci
7315fd4e5da5Sopenharmony_ciTEST_P(VersionCheck, V2) {
7316fd4e5da5Sopenharmony_ci  const std::string ext_inst = std::get<0>(GetParam());
7317fd4e5da5Sopenharmony_ci  const uint32_t version = std::get<1>(GetParam());
7318fd4e5da5Sopenharmony_ci  const std::string text = R"(
7319fd4e5da5Sopenharmony_ciOpCapability Shader
7320fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info"
7321fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.2"
7322fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
7323fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo"
7324fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1
7325fd4e5da5Sopenharmony_ci%foo_name = OpString "foo"
7326fd4e5da5Sopenharmony_ci%data = OpString "1234"
7327fd4e5da5Sopenharmony_ci%void = OpTypeVoid
7328fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0
7329fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0
7330fd4e5da5Sopenharmony_ci%int_1 = OpConstant %int 1
7331fd4e5da5Sopenharmony_ci%int_4 = OpConstant %int 4
7332fd4e5da5Sopenharmony_ci%null = OpConstantNull %int
7333fd4e5da5Sopenharmony_ci%float = OpTypeFloat 32
7334fd4e5da5Sopenharmony_ci%float_0 = OpConstant %float 0
7335fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void
7336fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn
7337fd4e5da5Sopenharmony_ci%entry = OpLabel
7338fd4e5da5Sopenharmony_ciOpReturn
7339fd4e5da5Sopenharmony_ciOpFunctionEnd
7340fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name
7341fd4e5da5Sopenharmony_ci%inst = OpExtInst %void %ext )" +
7342fd4e5da5Sopenharmony_ci                           ext_inst;
7343fd4e5da5Sopenharmony_ci
7344fd4e5da5Sopenharmony_ci  CompileSuccessfully(text);
7345fd4e5da5Sopenharmony_ci  if (version <= 2) {
7346fd4e5da5Sopenharmony_ci    EXPECT_EQ(SPV_SUCCESS, ValidateInstructions());
7347fd4e5da5Sopenharmony_ci  } else {
7348fd4e5da5Sopenharmony_ci    EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
7349fd4e5da5Sopenharmony_ci    EXPECT_THAT(getDiagnosticString(),
7350fd4e5da5Sopenharmony_ci                HasSubstr("requires version " + std::to_string(version) +
7351fd4e5da5Sopenharmony_ci                          ", but parsed version is 2"));
7352fd4e5da5Sopenharmony_ci  }
7353fd4e5da5Sopenharmony_ci}
7354fd4e5da5Sopenharmony_ci
7355fd4e5da5Sopenharmony_ciTEST_P(VersionCheck, V3) {
7356fd4e5da5Sopenharmony_ci  const std::string ext_inst = std::get<0>(GetParam());
7357fd4e5da5Sopenharmony_ci  const uint32_t version = std::get<1>(GetParam());
7358fd4e5da5Sopenharmony_ci  const std::string text = R"(
7359fd4e5da5Sopenharmony_ciOpCapability Shader
7360fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info"
7361fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.3"
7362fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
7363fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo"
7364fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1
7365fd4e5da5Sopenharmony_ci%foo_name = OpString "foo"
7366fd4e5da5Sopenharmony_ci%data = OpString "1234"
7367fd4e5da5Sopenharmony_ci%void = OpTypeVoid
7368fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0
7369fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0
7370fd4e5da5Sopenharmony_ci%int_1 = OpConstant %int 1
7371fd4e5da5Sopenharmony_ci%int_4 = OpConstant %int 4
7372fd4e5da5Sopenharmony_ci%null = OpConstantNull %int
7373fd4e5da5Sopenharmony_ci%float = OpTypeFloat 32
7374fd4e5da5Sopenharmony_ci%float_0 = OpConstant %float 0
7375fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void
7376fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn
7377fd4e5da5Sopenharmony_ci%entry = OpLabel
7378fd4e5da5Sopenharmony_ciOpReturn
7379fd4e5da5Sopenharmony_ciOpFunctionEnd
7380fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name
7381fd4e5da5Sopenharmony_ci%inst = OpExtInst %void %ext )" +
7382fd4e5da5Sopenharmony_ci                           ext_inst;
7383fd4e5da5Sopenharmony_ci
7384fd4e5da5Sopenharmony_ci  CompileSuccessfully(text);
7385fd4e5da5Sopenharmony_ci  if (version <= 3) {
7386fd4e5da5Sopenharmony_ci    EXPECT_EQ(SPV_SUCCESS, ValidateInstructions());
7387fd4e5da5Sopenharmony_ci  } else {
7388fd4e5da5Sopenharmony_ci    EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
7389fd4e5da5Sopenharmony_ci    EXPECT_THAT(getDiagnosticString(),
7390fd4e5da5Sopenharmony_ci                HasSubstr("requires version " + std::to_string(version) +
7391fd4e5da5Sopenharmony_ci                          ", but parsed version is 3"));
7392fd4e5da5Sopenharmony_ci  }
7393fd4e5da5Sopenharmony_ci}
7394fd4e5da5Sopenharmony_ci
7395fd4e5da5Sopenharmony_ciTEST_P(VersionCheck, V4) {
7396fd4e5da5Sopenharmony_ci  const std::string ext_inst = std::get<0>(GetParam());
7397fd4e5da5Sopenharmony_ci  const uint32_t version = std::get<1>(GetParam());
7398fd4e5da5Sopenharmony_ci  const std::string text = R"(
7399fd4e5da5Sopenharmony_ciOpCapability Shader
7400fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info"
7401fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.4"
7402fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
7403fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo"
7404fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1
7405fd4e5da5Sopenharmony_ci%foo_name = OpString "foo"
7406fd4e5da5Sopenharmony_ci%data = OpString "1234"
7407fd4e5da5Sopenharmony_ci%void = OpTypeVoid
7408fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0
7409fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0
7410fd4e5da5Sopenharmony_ci%int_1 = OpConstant %int 1
7411fd4e5da5Sopenharmony_ci%int_4 = OpConstant %int 4
7412fd4e5da5Sopenharmony_ci%null = OpConstantNull %int
7413fd4e5da5Sopenharmony_ci%float = OpTypeFloat 32
7414fd4e5da5Sopenharmony_ci%float_0 = OpConstant %float 0
7415fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void
7416fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn
7417fd4e5da5Sopenharmony_ci%entry = OpLabel
7418fd4e5da5Sopenharmony_ciOpReturn
7419fd4e5da5Sopenharmony_ciOpFunctionEnd
7420fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name
7421fd4e5da5Sopenharmony_ci%inst = OpExtInst %void %ext )" +
7422fd4e5da5Sopenharmony_ci                           ext_inst;
7423fd4e5da5Sopenharmony_ci
7424fd4e5da5Sopenharmony_ci  CompileSuccessfully(text);
7425fd4e5da5Sopenharmony_ci  if (version <= 4) {
7426fd4e5da5Sopenharmony_ci    EXPECT_EQ(SPV_SUCCESS, ValidateInstructions());
7427fd4e5da5Sopenharmony_ci  } else {
7428fd4e5da5Sopenharmony_ci    EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
7429fd4e5da5Sopenharmony_ci    EXPECT_THAT(getDiagnosticString(),
7430fd4e5da5Sopenharmony_ci                HasSubstr("requires version " + std::to_string(version) +
7431fd4e5da5Sopenharmony_ci                          ", but parsed version is 4"));
7432fd4e5da5Sopenharmony_ci  }
7433fd4e5da5Sopenharmony_ci}
7434fd4e5da5Sopenharmony_ci
7435fd4e5da5Sopenharmony_ciTEST_P(VersionCheck, V5) {
7436fd4e5da5Sopenharmony_ci  const std::string ext_inst = std::get<0>(GetParam());
7437fd4e5da5Sopenharmony_ci  const uint32_t version = std::get<1>(GetParam());
7438fd4e5da5Sopenharmony_ci  const std::string text = R"(
7439fd4e5da5Sopenharmony_ciOpCapability Shader
7440fd4e5da5Sopenharmony_ciOpExtension "SPV_KHR_non_semantic_info"
7441fd4e5da5Sopenharmony_ci%ext = OpExtInstImport "NonSemantic.ClspvReflection.5"
7442fd4e5da5Sopenharmony_ciOpMemoryModel Logical GLSL450
7443fd4e5da5Sopenharmony_ciOpEntryPoint GLCompute %foo "foo"
7444fd4e5da5Sopenharmony_ciOpExecutionMode %foo LocalSize 1 1 1
7445fd4e5da5Sopenharmony_ci%foo_name = OpString "foo"
7446fd4e5da5Sopenharmony_ci%data = OpString "1234"
7447fd4e5da5Sopenharmony_ci%void = OpTypeVoid
7448fd4e5da5Sopenharmony_ci%int = OpTypeInt 32 0
7449fd4e5da5Sopenharmony_ci%int_0 = OpConstant %int 0
7450fd4e5da5Sopenharmony_ci%int_1 = OpConstant %int 1
7451fd4e5da5Sopenharmony_ci%int_4 = OpConstant %int 4
7452fd4e5da5Sopenharmony_ci%null = OpConstantNull %int
7453fd4e5da5Sopenharmony_ci%float = OpTypeFloat 32
7454fd4e5da5Sopenharmony_ci%float_0 = OpConstant %float 0
7455fd4e5da5Sopenharmony_ci%void_fn = OpTypeFunction %void
7456fd4e5da5Sopenharmony_ci%foo = OpFunction %void None %void_fn
7457fd4e5da5Sopenharmony_ci%entry = OpLabel
7458fd4e5da5Sopenharmony_ciOpReturn
7459fd4e5da5Sopenharmony_ciOpFunctionEnd
7460fd4e5da5Sopenharmony_ci%decl = OpExtInst %void %ext Kernel %foo %foo_name
7461fd4e5da5Sopenharmony_ci%inst = OpExtInst %void %ext )" +
7462fd4e5da5Sopenharmony_ci                           ext_inst;
7463fd4e5da5Sopenharmony_ci
7464fd4e5da5Sopenharmony_ci  CompileSuccessfully(text);
7465fd4e5da5Sopenharmony_ci  if (version <= 5) {
7466fd4e5da5Sopenharmony_ci    EXPECT_EQ(SPV_SUCCESS, ValidateInstructions());
7467fd4e5da5Sopenharmony_ci  } else {
7468fd4e5da5Sopenharmony_ci    EXPECT_EQ(SPV_ERROR_INVALID_ID, ValidateInstructions());
7469fd4e5da5Sopenharmony_ci    EXPECT_THAT(getDiagnosticString(),
7470fd4e5da5Sopenharmony_ci                HasSubstr("requires version " + std::to_string(version) +
7471fd4e5da5Sopenharmony_ci                          ", but parsed version is 1"));
7472fd4e5da5Sopenharmony_ci  }
7473fd4e5da5Sopenharmony_ci}
7474fd4e5da5Sopenharmony_ci
7475fd4e5da5Sopenharmony_ci}  // namespace
7476fd4e5da5Sopenharmony_ci}  // namespace val
7477fd4e5da5Sopenharmony_ci}  // namespace spvtools
7478