1 // RUN: mlir-opt -split-input-file -verify-diagnostics %s | FileCheck %s
3 //===----------------------------------------------------------------------===//
5 //===----------------------------------------------------------------------===//
7 func.func @exp(%arg0 : f32) -> () {
8 // CHECK: spirv.GL.Exp {{%.*}} : f32
9 %2 = spirv.GL.Exp %arg0 : f32
13 func.func @expvec(%arg0 : vector<3xf16>) -> () {
14 // CHECK: spirv.GL.Exp {{%.*}} : vector<3xf16>
15 %2 = spirv.GL.Exp %arg0 : vector<3xf16>
21 func.func @exp(%arg0 : i32) -> () {
22 // expected-error @+1 {{op operand #0 must be 16/32-bit float or vector of 16/32-bit float values}}
23 %2 = spirv.GL.Exp %arg0 : i32
29 func.func @exp(%arg0 : vector<5xf32>) -> () {
30 // expected-error @+1 {{op operand #0 must be 16/32-bit float or vector of 16/32-bit float values of length 2/3/4}}
31 %2 = spirv.GL.Exp %arg0 : vector<5xf32>
37 func.func @exp(%arg0 : f32, %arg1 : f32) -> () {
38 // expected-error @+1 {{expected ':'}}
39 %2 = spirv.GL.Exp %arg0, %arg1 : i32
45 func.func @exp(%arg0 : i32) -> () {
46 // expected-error @+1 {{expected non-function type}}
47 %2 = spirv.GL.Exp %arg0 :
53 //===----------------------------------------------------------------------===//
54 // spirv.GL.{F|S|U}{Max|Min}
55 //===----------------------------------------------------------------------===//
57 func.func @fmaxmin(%arg0 : f32, %arg1 : f32) {
58 // CHECK: spirv.GL.FMax {{%.*}}, {{%.*}} : f32
59 %1 = spirv.GL.FMax %arg0, %arg1 : f32
60 // CHECK: spirv.GL.FMin {{%.*}}, {{%.*}} : f32
61 %2 = spirv.GL.FMin %arg0, %arg1 : f32
65 func.func @fmaxminvec(%arg0 : vector<3xf16>, %arg1 : vector<3xf16>) {
66 // CHECK: spirv.GL.FMax {{%.*}}, {{%.*}} : vector<3xf16>
67 %1 = spirv.GL.FMax %arg0, %arg1 : vector<3xf16>
68 // CHECK: spirv.GL.FMin {{%.*}}, {{%.*}} : vector<3xf16>
69 %2 = spirv.GL.FMin %arg0, %arg1 : vector<3xf16>
73 func.func @fmaxminf64(%arg0 : f64, %arg1 : f64) {
74 // CHECK: spirv.GL.FMax {{%.*}}, {{%.*}} : f64
75 %1 = spirv.GL.FMax %arg0, %arg1 : f64
76 // CHECK: spirv.GL.FMin {{%.*}}, {{%.*}} : f64
77 %2 = spirv.GL.FMin %arg0, %arg1 : f64
81 func.func @iminmax(%arg0: i32, %arg1: i32) {
82 // CHECK: spirv.GL.SMax {{%.*}}, {{%.*}} : i32
83 %1 = spirv.GL.SMax %arg0, %arg1 : i32
84 // CHECK: spirv.GL.UMax {{%.*}}, {{%.*}} : i32
85 %2 = spirv.GL.UMax %arg0, %arg1 : i32
86 // CHECK: spirv.GL.SMin {{%.*}}, {{%.*}} : i32
87 %3 = spirv.GL.SMin %arg0, %arg1 : i32
88 // CHECK: spirv.GL.UMin {{%.*}}, {{%.*}} : i32
89 %4 = spirv.GL.UMin %arg0, %arg1 : i32
95 //===----------------------------------------------------------------------===//
96 // spirv.GL.InverseSqrt
97 //===----------------------------------------------------------------------===//
99 func.func @inversesqrt(%arg0 : f32) -> () {
100 // CHECK: spirv.GL.InverseSqrt {{%.*}} : f32
101 %2 = spirv.GL.InverseSqrt %arg0 : f32
105 func.func @inversesqrtvec(%arg0 : vector<3xf16>) -> () {
106 // CHECK: spirv.GL.InverseSqrt {{%.*}} : vector<3xf16>
107 %2 = spirv.GL.InverseSqrt %arg0 : vector<3xf16>
113 //===----------------------------------------------------------------------===//
115 //===----------------------------------------------------------------------===//
117 func.func @sqrt(%arg0 : f32) -> () {
118 // CHECK: spirv.GL.Sqrt {{%.*}} : f32
119 %2 = spirv.GL.Sqrt %arg0 : f32
123 func.func @sqrtvec(%arg0 : vector<3xf16>) -> () {
124 // CHECK: spirv.GL.Sqrt {{%.*}} : vector<3xf16>
125 %2 = spirv.GL.Sqrt %arg0 : vector<3xf16>
129 //===----------------------------------------------------------------------===//
131 //===----------------------------------------------------------------------===//
133 func.func @cos(%arg0 : f32) -> () {
134 // CHECK: spirv.GL.Cos {{%.*}} : f32
135 %2 = spirv.GL.Cos %arg0 : f32
139 func.func @cosvec(%arg0 : vector<3xf16>) -> () {
140 // CHECK: spirv.GL.Cos {{%.*}} : vector<3xf16>
141 %2 = spirv.GL.Cos %arg0 : vector<3xf16>
145 //===----------------------------------------------------------------------===//
147 //===----------------------------------------------------------------------===//
149 func.func @sin(%arg0 : f32) -> () {
150 // CHECK: spirv.GL.Sin {{%.*}} : f32
151 %2 = spirv.GL.Sin %arg0 : f32
155 func.func @sinvec(%arg0 : vector<3xf16>) -> () {
156 // CHECK: spirv.GL.Sin {{%.*}} : vector<3xf16>
157 %2 = spirv.GL.Sin %arg0 : vector<3xf16>
161 //===----------------------------------------------------------------------===//
163 //===----------------------------------------------------------------------===//
165 func.func @tan(%arg0 : f32) -> () {
166 // CHECK: spirv.GL.Tan {{%.*}} : f32
167 %2 = spirv.GL.Tan %arg0 : f32
171 func.func @tanvec(%arg0 : vector<3xf16>) -> () {
172 // CHECK: spirv.GL.Tan {{%.*}} : vector<3xf16>
173 %2 = spirv.GL.Tan %arg0 : vector<3xf16>
177 //===----------------------------------------------------------------------===//
179 //===----------------------------------------------------------------------===//
181 func.func @acos(%arg0 : f32) -> () {
182 // CHECK: spirv.GL.Acos {{%.*}} : f32
183 %2 = spirv.GL.Acos %arg0 : f32
187 func.func @acosvec(%arg0 : vector<3xf16>) -> () {
188 // CHECK: spirv.GL.Acos {{%.*}} : vector<3xf16>
189 %2 = spirv.GL.Acos %arg0 : vector<3xf16>
193 //===----------------------------------------------------------------------===//
195 //===----------------------------------------------------------------------===//
197 func.func @asin(%arg0 : f32) -> () {
198 // CHECK: spirv.GL.Asin {{%.*}} : f32
199 %2 = spirv.GL.Asin %arg0 : f32
203 func.func @asinvec(%arg0 : vector<3xf16>) -> () {
204 // CHECK: spirv.GL.Asin {{%.*}} : vector<3xf16>
205 %2 = spirv.GL.Asin %arg0 : vector<3xf16>
209 //===----------------------------------------------------------------------===//
211 //===----------------------------------------------------------------------===//
213 func.func @atan(%arg0 : f32) -> () {
214 // CHECK: spirv.GL.Atan {{%.*}} : f32
215 %2 = spirv.GL.Atan %arg0 : f32
219 func.func @atanvec(%arg0 : vector<3xf16>) -> () {
220 // CHECK: spirv.GL.Atan {{%.*}} : vector<3xf16>
221 %2 = spirv.GL.Atan %arg0 : vector<3xf16>
225 //===----------------------------------------------------------------------===//
227 //===----------------------------------------------------------------------===//
229 func.func @sinh(%arg0 : f32) -> () {
230 // CHECK: spirv.GL.Sinh {{%.*}} : f32
231 %2 = spirv.GL.Sinh %arg0 : f32
235 func.func @sinhvec(%arg0 : vector<3xf16>) -> () {
236 // CHECK: spirv.GL.Sinh {{%.*}} : vector<3xf16>
237 %2 = spirv.GL.Sinh %arg0 : vector<3xf16>
241 //===----------------------------------------------------------------------===//
243 //===----------------------------------------------------------------------===//
245 func.func @cosh(%arg0 : f32) -> () {
246 // CHECK: spirv.GL.Cosh {{%.*}} : f32
247 %2 = spirv.GL.Cosh %arg0 : f32
251 func.func @coshvec(%arg0 : vector<3xf16>) -> () {
252 // CHECK: spirv.GL.Cosh {{%.*}} : vector<3xf16>
253 %2 = spirv.GL.Cosh %arg0 : vector<3xf16>
257 //===----------------------------------------------------------------------===//
259 //===----------------------------------------------------------------------===//
261 func.func @pow(%arg0 : f32, %arg1 : f32) -> () {
262 // CHECK: spirv.GL.Pow {{%.*}}, {{%.*}} : f32
263 %2 = spirv.GL.Pow %arg0, %arg1 : f32
267 func.func @powvec(%arg0 : vector<3xf16>, %arg1 : vector<3xf16>) -> () {
268 // CHECK: spirv.GL.Pow {{%.*}}, {{%.*}} : vector<3xf16>
269 %2 = spirv.GL.Pow %arg0, %arg1 : vector<3xf16>
275 //===----------------------------------------------------------------------===//
277 //===----------------------------------------------------------------------===//
279 func.func @round(%arg0 : f32) -> () {
280 // CHECK: spirv.GL.Round {{%.*}} : f32
281 %2 = spirv.GL.Round %arg0 : f32
285 func.func @roundvec(%arg0 : vector<3xf16>) -> () {
286 // CHECK: spirv.GL.Round {{%.*}} : vector<3xf16>
287 %2 = spirv.GL.Round %arg0 : vector<3xf16>
291 //===----------------------------------------------------------------------===//
292 // spirv.GL.RoundEven
293 //===----------------------------------------------------------------------===//
295 func.func @round_even(%arg0 : f32) -> () {
296 // CHECK: spirv.GL.RoundEven {{%.*}} : f32
297 %2 = spirv.GL.RoundEven %arg0 : f32
301 func.func @round_even_vec(%arg0 : vector<3xf16>) -> () {
302 // CHECK: spirv.GL.RoundEven {{%.*}} : vector<3xf16>
303 %2 = spirv.GL.RoundEven %arg0 : vector<3xf16>
309 //===----------------------------------------------------------------------===//
311 //===----------------------------------------------------------------------===//
313 func.func @fclamp(%arg0 : f32, %min : f32, %max : f32) -> () {
314 // CHECK: spirv.GL.FClamp {{%[^,]*}}, {{%[^,]*}}, {{%[^,]*}} : f32
315 %2 = spirv.GL.FClamp %arg0, %min, %max : f32
321 func.func @fclamp(%arg0 : vector<3xf32>, %min : vector<3xf32>, %max : vector<3xf32>) -> () {
322 // CHECK: spirv.GL.FClamp {{%[^,]*}}, {{%[^,]*}}, {{%[^,]*}} : vector<3xf32>
323 %2 = spirv.GL.FClamp %arg0, %min, %max : vector<3xf32>
329 //===----------------------------------------------------------------------===//
331 //===----------------------------------------------------------------------===//
333 func.func @uclamp(%arg0 : ui32, %min : ui32, %max : ui32) -> () {
334 // CHECK: spirv.GL.UClamp {{%[^,]*}}, {{%[^,]*}}, {{%[^,]*}} : ui32
335 %2 = spirv.GL.UClamp %arg0, %min, %max : ui32
341 func.func @uclamp(%arg0 : vector<4xi32>, %min : vector<4xi32>, %max : vector<4xi32>) -> () {
342 // CHECK: spirv.GL.UClamp {{%[^,]*}}, {{%[^,]*}}, {{%[^,]*}} : vector<4xi32>
343 %2 = spirv.GL.UClamp %arg0, %min, %max : vector<4xi32>
349 func.func @uclamp(%arg0 : si32, %min : si32, %max : si32) -> () {
350 // CHECK: spirv.GL.UClamp
351 %2 = spirv.GL.UClamp %arg0, %min, %max : si32
357 //===----------------------------------------------------------------------===//
359 //===----------------------------------------------------------------------===//
361 func.func @sclamp(%arg0 : si32, %min : si32, %max : si32) -> () {
362 // CHECK: spirv.GL.SClamp {{%[^,]*}}, {{%[^,]*}}, {{%[^,]*}} : si32
363 %2 = spirv.GL.SClamp %arg0, %min, %max : si32
369 func.func @sclamp(%arg0 : vector<4xsi32>, %min : vector<4xsi32>, %max : vector<4xsi32>) -> () {
370 // CHECK: spirv.GL.SClamp {{%[^,]*}}, {{%[^,]*}}, {{%[^,]*}} : vector<4xsi32>
371 %2 = spirv.GL.SClamp %arg0, %min, %max : vector<4xsi32>
377 func.func @sclamp(%arg0 : i32, %min : i32, %max : i32) -> () {
378 // CHECK: spirv.GL.SClamp
379 %2 = spirv.GL.SClamp %arg0, %min, %max : i32
385 //===----------------------------------------------------------------------===//
387 //===----------------------------------------------------------------------===//
389 func.func @fma(%a : f32, %b : f32, %c : f32) -> () {
390 // CHECK: spirv.GL.Fma {{%[^,]*}}, {{%[^,]*}}, {{%[^,]*}} : f32
391 %2 = spirv.GL.Fma %a, %b, %c : f32
397 func.func @fma(%a : vector<3xf32>, %b : vector<3xf32>, %c : vector<3xf32>) -> () {
398 // CHECK: spirv.GL.Fma {{%[^,]*}}, {{%[^,]*}}, {{%[^,]*}} : vector<3xf32>
399 %2 = spirv.GL.Fma %a, %b, %c : vector<3xf32>
404 //===----------------------------------------------------------------------===//
405 // spirv.GL.FrexpStruct
406 //===----------------------------------------------------------------------===//
408 func.func @frexp_struct(%arg0 : f32) -> () {
409 // CHECK: spirv.GL.FrexpStruct {{%.*}} : f32 -> !spirv.struct<(f32, i32)>
410 %2 = spirv.GL.FrexpStruct %arg0 : f32 -> !spirv.struct<(f32, i32)>
414 func.func @frexp_struct_64(%arg0 : f64) -> () {
415 // CHECK: spirv.GL.FrexpStruct {{%.*}} : f64 -> !spirv.struct<(f64, i32)>
416 %2 = spirv.GL.FrexpStruct %arg0 : f64 -> !spirv.struct<(f64, i32)>
420 func.func @frexp_struct_vec(%arg0 : vector<3xf32>) -> () {
421 // CHECK: spirv.GL.FrexpStruct {{%.*}} : vector<3xf32> -> !spirv.struct<(vector<3xf32>, vector<3xi32>)>
422 %2 = spirv.GL.FrexpStruct %arg0 : vector<3xf32> -> !spirv.struct<(vector<3xf32>, vector<3xi32>)>
428 func.func @frexp_struct_mismatch_type(%arg0 : f32) -> () {
429 // expected-error @+1 {{member zero of the resulting struct type must be the same type as the operand}}
430 %2 = spirv.GL.FrexpStruct %arg0 : f32 -> !spirv.struct<(vector<3xf32>, i32)>
436 func.func @frexp_struct_wrong_type(%arg0 : i32) -> () {
437 // expected-error @+1 {{op operand #0 must be 16/32/64-bit float or vector of 16/32/64-bit float values}}
438 %2 = spirv.GL.FrexpStruct %arg0 : i32 -> !spirv.struct<(i32, i32)>
444 func.func @frexp_struct_mismatch_num_components(%arg0 : vector<3xf32>) -> () {
445 // expected-error @+1 {{member one of the resulting struct type must have the same number of components as the operand type}}
446 %2 = spirv.GL.FrexpStruct %arg0 : vector<3xf32> -> !spirv.struct<(vector<3xf32>, vector<2xi32>)>
452 func.func @frexp_struct_not_i32(%arg0 : f32) -> () {
453 // expected-error @+1 {{member one of the resulting struct type must be a scalar or vector of 32 bit integer type}}
454 %2 = spirv.GL.FrexpStruct %arg0 : f32 -> !spirv.struct<(f32, i64)>
460 //===----------------------------------------------------------------------===//
462 //===----------------------------------------------------------------------===//
464 func.func @ldexp(%arg0 : f32, %arg1 : i32) -> () {
465 // CHECK: {{%.*}} = spirv.GL.Ldexp {{%.*}} : f32, {{%.*}} : i32 -> f32
466 %0 = spirv.GL.Ldexp %arg0 : f32, %arg1 : i32 -> f32
471 func.func @ldexp_vec(%arg0 : vector<3xf32>, %arg1 : vector<3xi32>) -> () {
472 // CHECK: {{%.*}} = spirv.GL.Ldexp {{%.*}} : vector<3xf32>, {{%.*}} : vector<3xi32> -> vector<3xf32>
473 %0 = spirv.GL.Ldexp %arg0 : vector<3xf32>, %arg1 : vector<3xi32> -> vector<3xf32>
479 func.func @ldexp_wrong_type_scalar(%arg0 : f32, %arg1 : vector<2xi32>) -> () {
480 // expected-error @+1 {{operands must both be scalars or vectors}}
481 %0 = spirv.GL.Ldexp %arg0 : f32, %arg1 : vector<2xi32> -> f32
487 func.func @ldexp_wrong_type_vec_1(%arg0 : vector<3xf32>, %arg1 : i32) -> () {
488 // expected-error @+1 {{operands must both be scalars or vectors}}
489 %0 = spirv.GL.Ldexp %arg0 : vector<3xf32>, %arg1 : i32 -> vector<3xf32>
495 func.func @ldexp_wrong_type_vec_2(%arg0 : vector<3xf32>, %arg1 : vector<2xi32>) -> () {
496 // expected-error @+1 {{operands must have the same number of elements}}
497 %0 = spirv.GL.Ldexp %arg0 : vector<3xf32>, %arg1 : vector<2xi32> -> vector<3xf32>
503 //===----------------------------------------------------------------------===//
505 //===----------------------------------------------------------------------===//
507 func.func @fmix(%arg0 : f32, %arg1 : f32, %arg2 : f32) -> () {
508 // CHECK: {{%.*}} = spirv.GL.FMix {{%.*}} : f32, {{%.*}} : f32, {{%.*}} : f32 -> f32
509 %0 = spirv.GL.FMix %arg0 : f32, %arg1 : f32, %arg2 : f32 -> f32
513 func.func @fmix_vector(%arg0 : vector<3xf32>, %arg1 : vector<3xf32>, %arg2 : vector<3xf32>) -> () {
514 // CHECK: {{%.*}} = spirv.GL.FMix {{%.*}} : vector<3xf32>, {{%.*}} : vector<3xf32>, {{%.*}} : vector<3xf32> -> vector<3xf32>
515 %0 = spirv.GL.FMix %arg0 : vector<3xf32>, %arg1 : vector<3xf32>, %arg2 : vector<3xf32> -> vector<3xf32>
521 //===----------------------------------------------------------------------===//
523 //===----------------------------------------------------------------------===//
525 func.func @findumsb(%arg0 : i32) -> () {
526 // CHECK: spirv.GL.FindUMsb {{%.*}} : i32
527 %2 = spirv.GL.FindUMsb %arg0 : i32
531 func.func @findumsb_vector(%arg0 : vector<3xi32>) -> () {
532 // CHECK: spirv.GL.FindUMsb {{%.*}} : vector<3xi32>
533 %2 = spirv.GL.FindUMsb %arg0 : vector<3xi32>
539 func.func @findumsb(%arg0 : i64) -> () {
540 // expected-error @+1 {{operand #0 must be Int32 or vector of Int32}}
541 %2 = spirv.GL.FindUMsb %arg0 : i64