xref: /llvm-project/llvm/test/CodeGen/SPIRV/hlsl-intrinsics/imad.ll (revision cf3d6fded9eaf1372ccfde1d49dd91df6762d98c)
1; RUN: llc -O0 -verify-machineinstrs -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 %}
3
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
16
17define spir_func noundef i16 @test_mad_uint16_t(i16 noundef %p0, i16 noundef %p1, i16 noundef %p2) {
18entry:
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
26  ret i16 %4
27}
28
29define 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) {
30entry:
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
38  ret <2 x i16> %4
39}
40
41define 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) {
42entry:
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
50  ret <3 x i16> %4
51}
52
53define 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) {
54entry:
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
62  ret <4 x i16> %4
63}
64
65define spir_func noundef i16 @test_mad_int16_t(i16 noundef %p0, i16 noundef %p1, i16 noundef %p2) {
66entry:
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
74  ret i16 %4
75}
76
77define 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) {
78entry:
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
86  ret <2 x i16> %4
87}
88
89define 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) {
90entry:
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
98  ret <3 x i16> %4
99}
100
101define 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) {
102entry:
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
110  ret <4 x i16> %4
111}
112define spir_func noundef i32 @test_mad_int(i32 noundef %p0, i32 noundef %p1, i32 noundef %p2) {
113entry:
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
121  ret i32 %4
122}
123
124define spir_func noundef <2 x i32> @test_mad_int2(<2 x i32> noundef %p0, <2 x i32> noundef %p1, <2 x i32> noundef %p2) {
125entry:
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
133  ret <2 x i32> %4
134}
135
136define spir_func noundef <3 x i32> @test_mad_int3(<3 x i32> noundef %p0, <3 x i32> noundef %p1, <3 x i32> noundef %p2) {
137entry:
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
145  ret <3 x i32> %4
146}
147
148define spir_func noundef <4 x i32> @test_mad_int4(<4 x i32> noundef %p0, <4 x i32> noundef %p1, <4 x i32> noundef %p2) {
149entry:
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
157  ret <4 x i32> %4
158}
159
160define spir_func noundef i64 @test_mad_int64_t(i64 noundef %p0, i64 noundef %p1, i64 noundef %p2) {
161entry:
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
169  ret i64 %4
170}
171
172define 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) {
173entry:
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
181  ret <2 x i64> %4
182}
183
184define 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) {
185entry:
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
193  ret <3 x i64> %4
194}
195
196define 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) {
197entry:
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
205  ret <4 x i64> %4
206}
207
208define spir_func noundef i32 @test_mad_uint(i32 noundef %p0, i32 noundef %p1, i32 noundef %p2) {
209entry:
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
217  ret i32 %4
218}
219
220define spir_func noundef <2 x i32> @test_mad_uint2(<2 x i32> noundef %p0, <2 x i32> noundef %p1, <2 x i32> noundef %p2) {
221entry:
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
229  ret <2 x i32> %4
230}
231
232define spir_func noundef <3 x i32> @test_mad_uint3(<3 x i32> noundef %p0, <3 x i32> noundef %p1, <3 x i32> noundef %p2) {
233entry:
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
241  ret <3 x i32> %4
242}
243
244define spir_func noundef <4 x i32> @test_mad_uint4(<4 x i32> noundef %p0, <4 x i32> noundef %p1, <4 x i32> noundef %p2) {
245entry:
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
253  ret <4 x i32> %4
254}
255
256define spir_func noundef i64 @test_mad_uint64_t(i64 noundef %p0, i64 noundef %p1, i64 noundef %p2) {
257entry:
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
265  ret i64 %4
266}
267
268define 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) {
269entry:
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
277  ret <2 x i64> %4
278}
279
280define 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) {
281entry:
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
289  ret <3 x i64> %4
290}
291
292define 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) {
293entry:
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
301  ret <4 x i64> %4
302}
303