1 ; RUN: llc -O0 -mtriple=spirv-unknown-unknown %s -o - | FileCheck %s
2 ; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv-unknown-unknown %s -o - -filetype=obj | spirv-val %}
4 ; CHECK-DAG: %[[#int_16:]] = OpTypeInt 16 0
5 ; CHECK-DAG: %[[#vec2_16:]] = OpTypeVector %[[#int_16]] 2
6 ; CHECK-DAG: %[[#vec3_16:]] = OpTypeVector %[[#int_16]] 3
7 ; CHECK-DAG: %[[#vec4_16:]] = OpTypeVector %[[#int_16]] 4
8 ; CHECK-DAG: %[[#int_32:]] = OpTypeInt 32 0
9 ; CHECK-DAG: %[[#vec2_32:]] = OpTypeVector %[[#int_32]] 2
10 ; CHECK-DAG: %[[#vec3_32:]] = OpTypeVector %[[#int_32]] 3
11 ; CHECK-DAG: %[[#vec4_32:]] = OpTypeVector %[[#int_32]] 4
12 ; CHECK-DAG: %[[#int_64:]] = OpTypeInt 64 0
13 ; CHECK-DAG: %[[#vec2_64:]] = OpTypeVector %[[#int_64]] 2
14 ; CHECK-DAG: %[[#vec3_64:]] = OpTypeVector %[[#int_64]] 3
15 ; CHECK-DAG: %[[#vec4_64:]] = OpTypeVector %[[#int_64]] 4
17 define spir_func noundef i16 @test_mad_uint16_t(i16 noundef %p0, i16 noundef %p1, i16 noundef %p2) {
19 ; CHECK: %[[#arg0:]] = OpFunctionParameter %[[#]]
20 ; CHECK: %[[#arg1:]] = OpFunctionParameter %[[#]]
21 ; CHECK: %[[#arg2:]] = OpFunctionParameter %[[#]]
22 ; CHECK: %[[#mul:]] = OpIMul %[[#int_16]] %[[#arg0]] %[[#arg1]]
23 ; CHECK: OpIAdd %[[#int_16]] %[[#mul]] %[[#arg2]]
24 %3 = mul nuw i16 %p0, %p1
25 %4 = add nuw i16 %3, %p2
29 define spir_func noundef <2 x i16> @test_mad_uint16_t2(<2 x i16> noundef %p0, <2 x i16> noundef %p1, <2 x i16> noundef %p2) {
31 ; CHECK: %[[#arg0:]] = OpFunctionParameter %[[#]]
32 ; CHECK: %[[#arg1:]] = OpFunctionParameter %[[#]]
33 ; CHECK: %[[#arg2:]] = OpFunctionParameter %[[#]]
34 ; CHECK: %[[#mul:]] = OpIMul %[[#vec2_16]] %[[#arg0]] %[[#arg1]]
35 ; CHECK: OpIAdd %[[#vec2_16]] %[[#mul]] %[[#arg2]]
36 %3 = mul nuw <2 x i16> %p0, %p1
37 %4 = add nuw <2 x i16> %3, %p2
41 define spir_func noundef <3 x i16> @test_mad_uint16_t3(<3 x i16> noundef %p0, <3 x i16> noundef %p1, <3 x i16> noundef %p2) {
43 ; CHECK: %[[#arg0:]] = OpFunctionParameter %[[#]]
44 ; CHECK: %[[#arg1:]] = OpFunctionParameter %[[#]]
45 ; CHECK: %[[#arg2:]] = OpFunctionParameter %[[#]]
46 ; CHECK: %[[#mul:]] = OpIMul %[[#vec3_16]] %[[#arg0]] %[[#arg1]]
47 ; CHECK: OpIAdd %[[#vec3_16]] %[[#mul]] %[[#arg2]]
48 %3 = mul nuw <3 x i16> %p0, %p1
49 %4 = add nuw <3 x i16> %3, %p2
53 define spir_func noundef <4 x i16> @test_mad_uint16_t4(<4 x i16> noundef %p0, <4 x i16> noundef %p1, <4 x i16> noundef %p2) {
55 ; CHECK: %[[#arg0:]] = OpFunctionParameter %[[#]]
56 ; CHECK: %[[#arg1:]] = OpFunctionParameter %[[#]]
57 ; CHECK: %[[#arg2:]] = OpFunctionParameter %[[#]]
58 ; CHECK: %[[#mul:]] = OpIMul %[[#vec4_16]] %[[#arg0]] %[[#arg1]]
59 ; CHECK: OpIAdd %[[#vec4_16]] %[[#mul]] %[[#arg2]]
60 %3 = mul nuw <4 x i16> %p0, %p1
61 %4 = add nuw <4 x i16> %3, %p2
65 define spir_func noundef i16 @test_mad_int16_t(i16 noundef %p0, i16 noundef %p1, i16 noundef %p2) {
67 ; CHECK: %[[#arg0:]] = OpFunctionParameter %[[#]]
68 ; CHECK: %[[#arg1:]] = OpFunctionParameter %[[#]]
69 ; CHECK: %[[#arg2:]] = OpFunctionParameter %[[#]]
70 ; CHECK: %[[#mul:]] = OpIMul %[[#int_16]] %[[#arg0]] %[[#arg1]]
71 ; CHECK: OpIAdd %[[#int_16]] %[[#mul]] %[[#arg2]]
72 %3 = mul nsw i16 %p0, %p1
73 %4 = add nsw i16 %3, %p2
77 define spir_func noundef <2 x i16> @test_mad_int16_t2(<2 x i16> noundef %p0, <2 x i16> noundef %p1, <2 x i16> noundef %p2) {
79 ; CHECK: %[[#arg0:]] = OpFunctionParameter %[[#]]
80 ; CHECK: %[[#arg1:]] = OpFunctionParameter %[[#]]
81 ; CHECK: %[[#arg2:]] = OpFunctionParameter %[[#]]
82 ; CHECK: %[[#mul:]] = OpIMul %[[#vec2_16]] %[[#arg0]] %[[#arg1]]
83 ; CHECK: OpIAdd %[[#vec2_16]] %[[#mul]] %[[#arg2]]
84 %3 = mul nsw <2 x i16> %p0, %p1
85 %4 = add nsw <2 x i16> %3, %p2
89 define spir_func noundef <3 x i16> @test_mad_int16_t3(<3 x i16> noundef %p0, <3 x i16> noundef %p1, <3 x i16> noundef %p2) {
91 ; CHECK: %[[#arg0:]] = OpFunctionParameter %[[#]]
92 ; CHECK: %[[#arg1:]] = OpFunctionParameter %[[#]]
93 ; CHECK: %[[#arg2:]] = OpFunctionParameter %[[#]]
94 ; CHECK: %[[#mul:]] = OpIMul %[[#vec3_16]] %[[#arg0]] %[[#arg1]]
95 ; CHECK: OpIAdd %[[#vec3_16]] %[[#mul]] %[[#arg2]]
96 %3 = mul nsw <3 x i16> %p0, %p1
97 %4 = add nsw <3 x i16> %3, %p2
101 define spir_func noundef <4 x i16> @test_mad_int16_t4(<4 x i16> noundef %p0, <4 x i16> noundef %p1, <4 x i16> noundef %p2) {
103 ; CHECK: %[[#arg0:]] = OpFunctionParameter %[[#]]
104 ; CHECK: %[[#arg1:]] = OpFunctionParameter %[[#]]
105 ; CHECK: %[[#arg2:]] = OpFunctionParameter %[[#]]
106 ; CHECK: %[[#mul:]] = OpIMul %[[#vec4_16]] %[[#arg0]] %[[#arg1]]
107 ; CHECK: OpIAdd %[[#vec4_16]] %[[#mul]] %[[#arg2]]
108 %3 = mul nsw <4 x i16> %p0, %p1
109 %4 = add nsw <4 x i16> %3, %p2
112 define spir_func noundef i32 @test_mad_int(i32 noundef %p0, i32 noundef %p1, i32 noundef %p2) {
114 ; CHECK: %[[#arg0:]] = OpFunctionParameter %[[#]]
115 ; CHECK: %[[#arg1:]] = OpFunctionParameter %[[#]]
116 ; CHECK: %[[#arg2:]] = OpFunctionParameter %[[#]]
117 ; CHECK: %[[#mul:]] = OpIMul %[[#int_32]] %[[#arg0]] %[[#arg1]]
118 ; CHECK: OpIAdd %[[#int_32]] %[[#mul]] %[[#arg2]]
119 %3 = mul nsw i32 %p0, %p1
120 %4 = add nsw i32 %3, %p2
124 define spir_func noundef <2 x i32> @test_mad_int2(<2 x i32> noundef %p0, <2 x i32> noundef %p1, <2 x i32> noundef %p2) {
126 ; CHECK: %[[#arg0:]] = OpFunctionParameter %[[#]]
127 ; CHECK: %[[#arg1:]] = OpFunctionParameter %[[#]]
128 ; CHECK: %[[#arg2:]] = OpFunctionParameter %[[#]]
129 ; CHECK: %[[#mul:]] = OpIMul %[[#vec2_32]] %[[#arg0]] %[[#arg1]]
130 ; CHECK: OpIAdd %[[#vec2_32]] %[[#mul]] %[[#arg2]]
131 %3 = mul nsw <2 x i32> %p0, %p1
132 %4 = add nsw <2 x i32> %3, %p2
136 define spir_func noundef <3 x i32> @test_mad_int3(<3 x i32> noundef %p0, <3 x i32> noundef %p1, <3 x i32> noundef %p2) {
138 ; CHECK: %[[#arg0:]] = OpFunctionParameter %[[#]]
139 ; CHECK: %[[#arg1:]] = OpFunctionParameter %[[#]]
140 ; CHECK: %[[#arg2:]] = OpFunctionParameter %[[#]]
141 ; CHECK: %[[#mul:]] = OpIMul %[[#vec3_32]] %[[#arg0]] %[[#arg1]]
142 ; CHECK: OpIAdd %[[#vec3_32]] %[[#mul]] %[[#arg2]]
143 %3 = mul nsw <3 x i32> %p0, %p1
144 %4 = add nsw <3 x i32> %3, %p2
148 define spir_func noundef <4 x i32> @test_mad_int4(<4 x i32> noundef %p0, <4 x i32> noundef %p1, <4 x i32> noundef %p2) {
150 ; CHECK: %[[#arg0:]] = OpFunctionParameter %[[#]]
151 ; CHECK: %[[#arg1:]] = OpFunctionParameter %[[#]]
152 ; CHECK: %[[#arg2:]] = OpFunctionParameter %[[#]]
153 ; CHECK: %[[#mul:]] = OpIMul %[[#vec4_32]] %[[#arg0]] %[[#arg1]]
154 ; CHECK: OpIAdd %[[#vec4_32]] %[[#mul]] %[[#arg2]]
155 %3 = mul nsw <4 x i32> %p0, %p1
156 %4 = add nsw <4 x i32> %3, %p2
160 define spir_func noundef i64 @test_mad_int64_t(i64 noundef %p0, i64 noundef %p1, i64 noundef %p2) {
162 ; CHECK: %[[#arg0:]] = OpFunctionParameter %[[#]]
163 ; CHECK: %[[#arg1:]] = OpFunctionParameter %[[#]]
164 ; CHECK: %[[#arg2:]] = OpFunctionParameter %[[#]]
165 ; CHECK: %[[#mul:]] = OpIMul %[[#int_64]] %[[#arg0]] %[[#arg1]]
166 ; CHECK: OpIAdd %[[#int_64]] %[[#mul]] %[[#arg2]]
167 %3 = mul nsw i64 %p0, %p1
168 %4 = add nsw i64 %3, %p2
172 define spir_func noundef <2 x i64> @test_mad_int64_t2(<2 x i64> noundef %p0, <2 x i64> noundef %p1, <2 x i64> noundef %p2) {
174 ; CHECK: %[[#arg0:]] = OpFunctionParameter %[[#]]
175 ; CHECK: %[[#arg1:]] = OpFunctionParameter %[[#]]
176 ; CHECK: %[[#arg2:]] = OpFunctionParameter %[[#]]
177 ; CHECK: %[[#mul:]] = OpIMul %[[#vec2_64]] %[[#arg0]] %[[#arg1]]
178 ; CHECK: OpIAdd %[[#vec2_64]] %[[#mul]] %[[#arg2]]
179 %3 = mul nsw <2 x i64> %p0, %p1
180 %4 = add nsw <2 x i64> %3, %p2
184 define spir_func noundef <3 x i64> @test_mad_int64_t3(<3 x i64> noundef %p0, <3 x i64> noundef %p1, <3 x i64> noundef %p2) {
186 ; CHECK: %[[#arg0:]] = OpFunctionParameter %[[#]]
187 ; CHECK: %[[#arg1:]] = OpFunctionParameter %[[#]]
188 ; CHECK: %[[#arg2:]] = OpFunctionParameter %[[#]]
189 ; CHECK: %[[#mul:]] = OpIMul %[[#vec3_64]] %[[#arg0]] %[[#arg1]]
190 ; CHECK: OpIAdd %[[#vec3_64]] %[[#mul]] %[[#arg2]]
191 %3 = mul nsw <3 x i64> %p0, %p1
192 %4 = add nsw <3 x i64> %3, %p2
196 define spir_func noundef <4 x i64> @test_mad_int64_t4(<4 x i64> noundef %p0, <4 x i64> noundef %p1, <4 x i64> noundef %p2) {
198 ; CHECK: %[[#arg0:]] = OpFunctionParameter %[[#]]
199 ; CHECK: %[[#arg1:]] = OpFunctionParameter %[[#]]
200 ; CHECK: %[[#arg2:]] = OpFunctionParameter %[[#]]
201 ; CHECK: %[[#mul:]] = OpIMul %[[#vec4_64]] %[[#arg0]] %[[#arg1]]
202 ; CHECK: OpIAdd %[[#vec4_64]] %[[#mul]] %[[#arg2]]
203 %3 = mul nsw <4 x i64> %p0, %p1
204 %4 = add nsw <4 x i64> %3, %p2
208 define spir_func noundef i32 @test_mad_uint(i32 noundef %p0, i32 noundef %p1, i32 noundef %p2) {
210 ; CHECK: %[[#arg0:]] = OpFunctionParameter %[[#]]
211 ; CHECK: %[[#arg1:]] = OpFunctionParameter %[[#]]
212 ; CHECK: %[[#arg2:]] = OpFunctionParameter %[[#]]
213 ; CHECK: %[[#mul:]] = OpIMul %[[#int_32]] %[[#arg0]] %[[#arg1]]
214 ; CHECK: OpIAdd %[[#int_32]] %[[#mul]] %[[#arg2]]
215 %3 = mul nuw i32 %p0, %p1
216 %4 = add nuw i32 %3, %p2
220 define spir_func noundef <2 x i32> @test_mad_uint2(<2 x i32> noundef %p0, <2 x i32> noundef %p1, <2 x i32> noundef %p2) {
222 ; CHECK: %[[#arg0:]] = OpFunctionParameter %[[#]]
223 ; CHECK: %[[#arg1:]] = OpFunctionParameter %[[#]]
224 ; CHECK: %[[#arg2:]] = OpFunctionParameter %[[#]]
225 ; CHECK: %[[#mul:]] = OpIMul %[[#vec2_32]] %[[#arg0]] %[[#arg1]]
226 ; CHECK: OpIAdd %[[#vec2_32]] %[[#mul]] %[[#arg2]]
227 %3 = mul nuw <2 x i32> %p0, %p1
228 %4 = add nuw <2 x i32> %3, %p2
232 define spir_func noundef <3 x i32> @test_mad_uint3(<3 x i32> noundef %p0, <3 x i32> noundef %p1, <3 x i32> noundef %p2) {
234 ; CHECK: %[[#arg0:]] = OpFunctionParameter %[[#]]
235 ; CHECK: %[[#arg1:]] = OpFunctionParameter %[[#]]
236 ; CHECK: %[[#arg2:]] = OpFunctionParameter %[[#]]
237 ; CHECK: %[[#mul:]] = OpIMul %[[#vec3_32]] %[[#arg0]] %[[#arg1]]
238 ; CHECK: OpIAdd %[[#vec3_32]] %[[#mul]] %[[#arg2]]
239 %3 = mul nuw <3 x i32> %p0, %p1
240 %4 = add nuw <3 x i32> %3, %p2
244 define spir_func noundef <4 x i32> @test_mad_uint4(<4 x i32> noundef %p0, <4 x i32> noundef %p1, <4 x i32> noundef %p2) {
246 ; CHECK: %[[#arg0:]] = OpFunctionParameter %[[#]]
247 ; CHECK: %[[#arg1:]] = OpFunctionParameter %[[#]]
248 ; CHECK: %[[#arg2:]] = OpFunctionParameter %[[#]]
249 ; CHECK: %[[#mul:]] = OpIMul %[[#vec4_32]] %[[#arg0]] %[[#arg1]]
250 ; CHECK: OpIAdd %[[#vec4_32]] %[[#mul]] %[[#arg2]]
251 %3 = mul nuw <4 x i32> %p0, %p1
252 %4 = add nuw <4 x i32> %3, %p2
256 define spir_func noundef i64 @test_mad_uint64_t(i64 noundef %p0, i64 noundef %p1, i64 noundef %p2) {
258 ; CHECK: %[[#arg0:]] = OpFunctionParameter %[[#]]
259 ; CHECK: %[[#arg1:]] = OpFunctionParameter %[[#]]
260 ; CHECK: %[[#arg2:]] = OpFunctionParameter %[[#]]
261 ; CHECK: %[[#mul:]] = OpIMul %[[#int_64]] %[[#arg0]] %[[#arg1]]
262 ; CHECK: OpIAdd %[[#int_64]] %[[#mul]] %[[#arg2]]
263 %3 = mul nuw i64 %p0, %p1
264 %4 = add nuw i64 %3, %p2
268 define spir_func noundef <2 x i64> @test_mad_uint64_t2(<2 x i64> noundef %p0, <2 x i64> noundef %p1, <2 x i64> noundef %p2) {
270 ; CHECK: %[[#arg0:]] = OpFunctionParameter %[[#]]
271 ; CHECK: %[[#arg1:]] = OpFunctionParameter %[[#]]
272 ; CHECK: %[[#arg2:]] = OpFunctionParameter %[[#]]
273 ; CHECK: %[[#mul:]] = OpIMul %[[#vec2_64]] %[[#arg0]] %[[#arg1]]
274 ; CHECK: OpIAdd %[[#vec2_64]] %[[#mul]] %[[#arg2]]
275 %3 = mul nuw <2 x i64> %p0, %p1
276 %4 = add nuw <2 x i64> %3, %p2
280 define spir_func noundef <3 x i64> @test_mad_uint64_t3(<3 x i64> noundef %p0, <3 x i64> noundef %p1, <3 x i64> noundef %p2) {
282 ; CHECK: %[[#arg0:]] = OpFunctionParameter %[[#]]
283 ; CHECK: %[[#arg1:]] = OpFunctionParameter %[[#]]
284 ; CHECK: %[[#arg2:]] = OpFunctionParameter %[[#]]
285 ; CHECK: %[[#mul:]] = OpIMul %[[#vec3_64]] %[[#arg0]] %[[#arg1]]
286 ; CHECK: OpIAdd %[[#vec3_64]] %[[#mul]] %[[#arg2]]
287 %3 = mul nuw <3 x i64> %p0, %p1
288 %4 = add nuw <3 x i64> %3, %p2
292 define spir_func noundef <4 x i64> @test_mad_uint64_t4(<4 x i64> noundef %p0, <4 x i64> noundef %p1, <4 x i64> noundef %p2) {
294 ; CHECK: %[[#arg0:]] = OpFunctionParameter %[[#]]
295 ; CHECK: %[[#arg1:]] = OpFunctionParameter %[[#]]
296 ; CHECK: %[[#arg2:]] = OpFunctionParameter %[[#]]
297 ; CHECK: %[[#mul:]] = OpIMul %[[#vec4_64]] %[[#arg0]] %[[#arg1]]
298 ; CHECK: OpIAdd %[[#vec4_64]] %[[#mul]] %[[#arg2]]
299 %3 = mul nuw <4 x i64> %p0, %p1
300 %4 = add nuw <4 x i64> %3, %p2