[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / CodeGen / Hexagon / autohvx / vmpy-parts.ll
blobc18672ba0a833e299872f60178673d940f2ee0dc
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -march=hexagon -mattr=+hvxv60,+hvx-length128b,-packets < %s | FileCheck --check-prefix=V60 %s
3 ; RUN: llc -march=hexagon -mattr=+hvxv62,+hvx-length128b,-packets < %s | FileCheck --check-prefix=V62 %s
5 define <32 x i32> @f0(<32 x i32> %a0, <32 x i32> %a1) #0 {
6 ; V60-LABEL: f0:
7 ; V60:       // %bb.0:
8 ; V60-NEXT:    {
9 ; V60-NEXT:     r0 = #16
10 ; V60-NEXT:    }
11 ; V60-NEXT:    {
12 ; V60-NEXT:     v2.w = vmpye(v1.w,v0.uh)
13 ; V60-NEXT:    }
14 ; V60-NEXT:    {
15 ; V60-NEXT:     v31.w = vasr(v0.w,r0)
16 ; V60-NEXT:    }
17 ; V60-NEXT:    {
18 ; V60-NEXT:     v3.w = vasr(v1.w,r0)
19 ; V60-NEXT:    }
20 ; V60-NEXT:    {
21 ; V60-NEXT:     v5:4.w = vmpy(v31.h,v1.uh)
22 ; V60-NEXT:    }
23 ; V60-NEXT:    {
24 ; V60-NEXT:     v31:30.w = vmpy(v31.h,v3.h)
25 ; V60-NEXT:    }
26 ; V60-NEXT:    {
27 ; V60-NEXT:     v7:6.w = vadd(v2.uh,v4.uh)
28 ; V60-NEXT:    }
29 ; V60-NEXT:    {
30 ; V60-NEXT:     v29:28.w = vadd(v2.h,v4.h)
31 ; V60-NEXT:    }
32 ; V60-NEXT:    {
33 ; V60-NEXT:     v29.w += vasr(v6.w,r0)
34 ; V60-NEXT:    }
35 ; V60-NEXT:    {
36 ; V60-NEXT:     v0.w = vadd(v29.w,v30.w)
37 ; V60-NEXT:    }
38 ; V60-NEXT:    {
39 ; V60-NEXT:     jumpr r31
40 ; V60-NEXT:    }
42 ; V62-LABEL: f0:
43 ; V62:       // %bb.0:
44 ; V62-NEXT:    {
45 ; V62-NEXT:     v3:2 = vmpye(v0.w,v1.uh)
46 ; V62-NEXT:    }
47 ; V62-NEXT:    {
48 ; V62-NEXT:     v3:2 += vmpyo(v0.w,v1.h)
49 ; V62-NEXT:    }
50 ; V62-NEXT:    {
51 ; V62-NEXT:     v0 = v3
52 ; V62-NEXT:    }
53 ; V62-NEXT:    {
54 ; V62-NEXT:     jumpr r31
55 ; V62-NEXT:    }
56   %v0 = call {<32 x i32>, <32 x i32>} @llvm.hexagon.V6.vmpyss.parts.128B(<32 x i32> %a0, <32 x i32> %a1)
57   %v1 = extractvalue {<32 x i32>, <32 x i32>} %v0, 0
58   ret <32 x i32> %v1
61 define <32 x i32> @f1(<32 x i32> %a0, <32 x i32> %a1) #0 {
62 ; V60-LABEL: f1:
63 ; V60:       // %bb.0:
64 ; V60-NEXT:    {
65 ; V60-NEXT:     v2.w = vmpyieo(v0.h,v1.h)
66 ; V60-NEXT:    }
67 ; V60-NEXT:    {
68 ; V60-NEXT:     v2.w += vmpyie(v0.w,v1.uh)
69 ; V60-NEXT:    }
70 ; V60-NEXT:    {
71 ; V60-NEXT:     v0 = v2
72 ; V60-NEXT:    }
73 ; V60-NEXT:    {
74 ; V60-NEXT:     jumpr r31
75 ; V60-NEXT:    }
77 ; V62-LABEL: f1:
78 ; V62:       // %bb.0:
79 ; V62-NEXT:    {
80 ; V62-NEXT:     v2.w = vmpyieo(v0.h,v1.h)
81 ; V62-NEXT:    }
82 ; V62-NEXT:    {
83 ; V62-NEXT:     v2.w += vmpyie(v0.w,v1.uh)
84 ; V62-NEXT:    }
85 ; V62-NEXT:    {
86 ; V62-NEXT:     v0 = v2
87 ; V62-NEXT:    }
88 ; V62-NEXT:    {
89 ; V62-NEXT:     jumpr r31
90 ; V62-NEXT:    }
91   %v0 = call {<32 x i32>, <32 x i32>} @llvm.hexagon.V6.vmpyss.parts.128B(<32 x i32> %a0, <32 x i32> %a1)
92   %v1 = extractvalue {<32 x i32>, <32 x i32>} %v0, 1
93   ret <32 x i32> %v1
96 define <32 x i32> @f2(<32 x i32> %a0, <32 x i32> %a1) #0 {
97 ; V60-LABEL: f2:
98 ; V60:       // %bb.0:
99 ; V60-NEXT:    {
100 ; V60-NEXT:     r1:0 = combine(#16,##33686018)
101 ; V60-NEXT:    }
102 ; V60-NEXT:    {
103 ; V60-NEXT:     v3:2.uw = vmpy(v0.uh,v1.uh)
104 ; V60-NEXT:    }
105 ; V60-NEXT:    {
106 ; V60-NEXT:     v30 = vxor(v30,v30)
107 ; V60-NEXT:    }
108 ; V60-NEXT:    {
109 ; V60-NEXT:     v4 = vsplat(r0)
110 ; V60-NEXT:    }
111 ; V60-NEXT:    {
112 ; V60-NEXT:     q0 = vcmp.gt(v30.w,v1.w)
113 ; V60-NEXT:    }
114 ; V60-NEXT:    {
115 ; V60-NEXT:     v2.uw = vlsr(v2.uw,r1)
116 ; V60-NEXT:    }
117 ; V60-NEXT:    {
118 ; V60-NEXT:     v4 = vdelta(v1,v4)
119 ; V60-NEXT:    }
120 ; V60-NEXT:    {
121 ; V60-NEXT:     v5:4.uw = vmpy(v0.uh,v4.uh)
122 ; V60-NEXT:    }
123 ; V60-NEXT:    {
124 ; V60-NEXT:     v5:4.w = vadd(v5.uh,v4.uh)
125 ; V60-NEXT:    }
126 ; V60-NEXT:    {
127 ; V60-NEXT:     v2.w = vadd(v4.w,v2.w)
128 ; V60-NEXT:    }
129 ; V60-NEXT:    {
130 ; V60-NEXT:     v5.w += vasr(v2.w,r1)
131 ; V60-NEXT:    }
132 ; V60-NEXT:    {
133 ; V60-NEXT:     v31.w = vadd(v3.w,v5.w)
134 ; V60-NEXT:    }
135 ; V60-NEXT:    {
136 ; V60-NEXT:     if (q0) v31.w -= v0.w
137 ; V60-NEXT:    }
138 ; V60-NEXT:    {
139 ; V60-NEXT:     v0 = v31
140 ; V60-NEXT:    }
141 ; V60-NEXT:    {
142 ; V60-NEXT:     jumpr r31
143 ; V60-NEXT:    }
145 ; V62-LABEL: f2:
146 ; V62:       // %bb.0:
147 ; V62-NEXT:    {
148 ; V62-NEXT:     v3:2 = vmpye(v0.w,v1.uh)
149 ; V62-NEXT:    }
150 ; V62-NEXT:    {
151 ; V62-NEXT:     v4 = vxor(v4,v4)
152 ; V62-NEXT:    }
153 ; V62-NEXT:    {
154 ; V62-NEXT:     q0 = vcmp.gt(v4.w,v0.w)
155 ; V62-NEXT:    }
156 ; V62-NEXT:    {
157 ; V62-NEXT:     v3:2 += vmpyo(v0.w,v1.h)
158 ; V62-NEXT:    }
159 ; V62-NEXT:    {
160 ; V62-NEXT:     if (q0) v3.w += v1.w
161 ; V62-NEXT:    }
162 ; V62-NEXT:    {
163 ; V62-NEXT:     v0 = v3
164 ; V62-NEXT:    }
165 ; V62-NEXT:    {
166 ; V62-NEXT:     jumpr r31
167 ; V62-NEXT:    }
168   %v0 = call {<32 x i32>, <32 x i32>} @llvm.hexagon.V6.vmpyus.parts.128B(<32 x i32> %a0, <32 x i32> %a1)
169   %v1 = extractvalue {<32 x i32>, <32 x i32>} %v0, 0
170   ret <32 x i32> %v1
173 define <32 x i32> @f3(<32 x i32> %a0, <32 x i32> %a1) #0 {
174 ; V60-LABEL: f3:
175 ; V60:       // %bb.0:
176 ; V60-NEXT:    {
177 ; V60-NEXT:     v2.w = vmpyieo(v0.h,v1.h)
178 ; V60-NEXT:    }
179 ; V60-NEXT:    {
180 ; V60-NEXT:     v2.w += vmpyie(v0.w,v1.uh)
181 ; V60-NEXT:    }
182 ; V60-NEXT:    {
183 ; V60-NEXT:     v0 = v2
184 ; V60-NEXT:    }
185 ; V60-NEXT:    {
186 ; V60-NEXT:     jumpr r31
187 ; V60-NEXT:    }
189 ; V62-LABEL: f3:
190 ; V62:       // %bb.0:
191 ; V62-NEXT:    {
192 ; V62-NEXT:     v2.w = vmpyieo(v0.h,v1.h)
193 ; V62-NEXT:    }
194 ; V62-NEXT:    {
195 ; V62-NEXT:     v2.w += vmpyie(v0.w,v1.uh)
196 ; V62-NEXT:    }
197 ; V62-NEXT:    {
198 ; V62-NEXT:     v0 = v2
199 ; V62-NEXT:    }
200 ; V62-NEXT:    {
201 ; V62-NEXT:     jumpr r31
202 ; V62-NEXT:    }
203   %v0 = call {<32 x i32>, <32 x i32>} @llvm.hexagon.V6.vmpyus.parts.128B(<32 x i32> %a0, <32 x i32> %a1)
204   %v1 = extractvalue {<32 x i32>, <32 x i32>} %v0, 1
205   ret <32 x i32> %v1
208 define <32 x i32> @f4(<32 x i32> %a0, <32 x i32> %a1) #0 {
209 ; V60-LABEL: f4:
210 ; V60:       // %bb.0:
211 ; V60-NEXT:    {
212 ; V60-NEXT:     r0 = ##33686018
213 ; V60-NEXT:    }
214 ; V60-NEXT:    {
215 ; V60-NEXT:     v3:2.uw = vmpy(v0.uh,v1.uh)
216 ; V60-NEXT:    }
217 ; V60-NEXT:    {
218 ; V60-NEXT:     r2 = #16
219 ; V60-NEXT:    }
220 ; V60-NEXT:    {
221 ; V60-NEXT:     v4 = vsplat(r0)
222 ; V60-NEXT:    }
223 ; V60-NEXT:    {
224 ; V60-NEXT:     v2.uw = vlsr(v2.uw,r2)
225 ; V60-NEXT:    }
226 ; V60-NEXT:    {
227 ; V60-NEXT:     v31 = vdelta(v1,v4)
228 ; V60-NEXT:    }
229 ; V60-NEXT:    {
230 ; V60-NEXT:     v1:0.uw = vmpy(v0.uh,v31.uh)
231 ; V60-NEXT:    }
232 ; V60-NEXT:    {
233 ; V60-NEXT:     v1:0.w = vadd(v1.uh,v0.uh)
234 ; V60-NEXT:    }
235 ; V60-NEXT:    {
236 ; V60-NEXT:     v0.w = vadd(v0.w,v2.w)
237 ; V60-NEXT:    }
238 ; V60-NEXT:    {
239 ; V60-NEXT:     v1.w += vasr(v0.w,r2)
240 ; V60-NEXT:    }
241 ; V60-NEXT:    {
242 ; V60-NEXT:     v0.w = vadd(v3.w,v1.w)
243 ; V60-NEXT:    }
244 ; V60-NEXT:    {
245 ; V60-NEXT:     jumpr r31
246 ; V60-NEXT:    }
248 ; V62-LABEL: f4:
249 ; V62:       // %bb.0:
250 ; V62-NEXT:    {
251 ; V62-NEXT:     v2 = vxor(v2,v2)
252 ; V62-NEXT:    }
253 ; V62-NEXT:    {
254 ; V62-NEXT:     v5:4 = vmpye(v0.w,v1.uh)
255 ; V62-NEXT:    }
256 ; V62-NEXT:    {
257 ; V62-NEXT:     q0 = vcmp.gt(v2.w,v0.w)
258 ; V62-NEXT:    }
259 ; V62-NEXT:    {
260 ; V62-NEXT:     q1 = vcmp.gt(v2.w,v1.w)
261 ; V62-NEXT:    }
262 ; V62-NEXT:    {
263 ; V62-NEXT:     v5:4 += vmpyo(v0.w,v1.h)
264 ; V62-NEXT:    }
265 ; V62-NEXT:    {
266 ; V62-NEXT:     v31 = vand(q0,v1)
267 ; V62-NEXT:    }
268 ; V62-NEXT:    {
269 ; V62-NEXT:     if (q1) v31.w += v0.w
270 ; V62-NEXT:    }
271 ; V62-NEXT:    {
272 ; V62-NEXT:     v0.w = vadd(v5.w,v31.w)
273 ; V62-NEXT:    }
274 ; V62-NEXT:    {
275 ; V62-NEXT:     jumpr r31
276 ; V62-NEXT:    }
277   %v0 = call {<32 x i32>, <32 x i32>} @llvm.hexagon.V6.vmpyuu.parts.128B(<32 x i32> %a0, <32 x i32> %a1)
278   %v1 = extractvalue {<32 x i32>, <32 x i32>} %v0, 0
279   ret <32 x i32> %v1
282 define <32 x i32> @f5(<32 x i32> %a0, <32 x i32> %a1) #0 {
283 ; V60-LABEL: f5:
284 ; V60:       // %bb.0:
285 ; V60-NEXT:    {
286 ; V60-NEXT:     v2.w = vmpyieo(v0.h,v1.h)
287 ; V60-NEXT:    }
288 ; V60-NEXT:    {
289 ; V60-NEXT:     v2.w += vmpyie(v0.w,v1.uh)
290 ; V60-NEXT:    }
291 ; V60-NEXT:    {
292 ; V60-NEXT:     v0 = v2
293 ; V60-NEXT:    }
294 ; V60-NEXT:    {
295 ; V60-NEXT:     jumpr r31
296 ; V60-NEXT:    }
298 ; V62-LABEL: f5:
299 ; V62:       // %bb.0:
300 ; V62-NEXT:    {
301 ; V62-NEXT:     v2.w = vmpyieo(v0.h,v1.h)
302 ; V62-NEXT:    }
303 ; V62-NEXT:    {
304 ; V62-NEXT:     v2.w += vmpyie(v0.w,v1.uh)
305 ; V62-NEXT:    }
306 ; V62-NEXT:    {
307 ; V62-NEXT:     v0 = v2
308 ; V62-NEXT:    }
309 ; V62-NEXT:    {
310 ; V62-NEXT:     jumpr r31
311 ; V62-NEXT:    }
312   %v0 = call {<32 x i32>, <32 x i32>} @llvm.hexagon.V6.vmpyuu.parts.128B(<32 x i32> %a0, <32 x i32> %a1)
313   %v1 = extractvalue {<32 x i32>, <32 x i32>} %v0, 1
314   ret <32 x i32> %v1
317 define <64 x i32> @f10(<32 x i32> %a0, <32 x i32> %a1) #0 {
318 ; V60-LABEL: f10:
319 ; V60:       // %bb.0:
320 ; V60-NEXT:    {
321 ; V60-NEXT:     r0 = ##33686018
322 ; V60-NEXT:    }
323 ; V60-NEXT:    {
324 ; V60-NEXT:     v3:2 = vcombine(v0,v1)
325 ; V60-NEXT:    }
326 ; V60-NEXT:    {
327 ; V60-NEXT:     v1:0.uw = vmpy(v0.uh,v1.uh)
328 ; V60-NEXT:    }
329 ; V60-NEXT:    {
330 ; V60-NEXT:     r2 = #16
331 ; V60-NEXT:    }
332 ; V60-NEXT:    {
333 ; V60-NEXT:     v5 = vsplat(r0)
334 ; V60-NEXT:    }
335 ; V60-NEXT:    {
336 ; V60-NEXT:     v4 = vxor(v4,v4)
337 ; V60-NEXT:    }
338 ; V60-NEXT:    {
339 ; V60-NEXT:     v6.uw = vlsr(v0.uw,r2)
340 ; V60-NEXT:    }
341 ; V60-NEXT:    {
342 ; V60-NEXT:     q1 = vcmp.gt(v4.w,v3.w)
343 ; V60-NEXT:    }
344 ; V60-NEXT:    {
345 ; V60-NEXT:     q0 = vcmp.gt(v4.w,v2.w)
346 ; V60-NEXT:    }
347 ; V60-NEXT:    {
348 ; V60-NEXT:     v5 = vdelta(v2,v5)
349 ; V60-NEXT:    }
350 ; V60-NEXT:    {
351 ; V60-NEXT:     v2 = vmux(q1,v2,v4)
352 ; V60-NEXT:    }
353 ; V60-NEXT:    {
354 ; V60-NEXT:     if (q0) v2.w += v3.w
355 ; V60-NEXT:    }
356 ; V60-NEXT:    {
357 ; V60-NEXT:     v9:8.uw = vmpy(v3.uh,v5.uh)
358 ; V60-NEXT:    }
359 ; V60-NEXT:    {
360 ; V60-NEXT:     v9:8.w = vadd(v9.uh,v8.uh)
361 ; V60-NEXT:    }
362 ; V60-NEXT:    {
363 ; V60-NEXT:     v31.w = vadd(v8.w,v6.w)
364 ; V60-NEXT:    }
365 ; V60-NEXT:    {
366 ; V60-NEXT:     v0.w += vasl(v8.w,r2)
367 ; V60-NEXT:    }
368 ; V60-NEXT:    {
369 ; V60-NEXT:     v9.w += vasr(v31.w,r2)
370 ; V60-NEXT:    }
371 ; V60-NEXT:    {
372 ; V60-NEXT:     v1.w = vadd(v1.w,v9.w)
373 ; V60-NEXT:    }
374 ; V60-NEXT:    {
375 ; V60-NEXT:     v1.w = vsub(v1.w,v2.w)
376 ; V60-NEXT:    }
377 ; V60-NEXT:    {
378 ; V60-NEXT:     jumpr r31
379 ; V60-NEXT:    }
381 ; V62-LABEL: f10:
382 ; V62:       // %bb.0:
383 ; V62-NEXT:    {
384 ; V62-NEXT:     v3:2 = vmpye(v0.w,v1.uh)
385 ; V62-NEXT:    }
386 ; V62-NEXT:    {
387 ; V62-NEXT:     v3:2 += vmpyo(v0.w,v1.h)
388 ; V62-NEXT:    }
389 ; V62-NEXT:    {
390 ; V62-NEXT:     v1:0 = vcombine(v3,v2)
391 ; V62-NEXT:    }
392 ; V62-NEXT:    {
393 ; V62-NEXT:     jumpr r31
394 ; V62-NEXT:    }
395   %v0 = call {<32 x i32>, <32 x i32>} @llvm.hexagon.V6.vmpyss.parts.128B(<32 x i32> %a0, <32 x i32> %a1)
396   %v1 = extractvalue {<32 x i32>, <32 x i32>} %v0, 0
397   %v2 = extractvalue {<32 x i32>, <32 x i32>} %v0, 1
398   %v3 = shufflevector <32 x i32> %v2, <32 x i32> %v1, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 48, i32 49, i32 50, i32 51, i32 52, i32 53, i32 54, i32 55, i32 56, i32 57, i32 58, i32 59, i32 60, i32 61, i32 62, i32 63>
399   ret <64 x i32> %v3
402 define <64 x i32> @f11(<32 x i32> %a0, <32 x i32> %a1) #0 {
403 ; V60-LABEL: f11:
404 ; V60:       // %bb.0:
405 ; V60-NEXT:    {
406 ; V60-NEXT:     r1:0 = combine(#16,##33686018)
407 ; V60-NEXT:    }
408 ; V60-NEXT:    {
409 ; V60-NEXT:     v3:2.uw = vmpy(v0.uh,v1.uh)
410 ; V60-NEXT:    }
411 ; V60-NEXT:    {
412 ; V60-NEXT:     v31 = vxor(v31,v31)
413 ; V60-NEXT:    }
414 ; V60-NEXT:    {
415 ; V60-NEXT:     v4 = vsplat(r0)
416 ; V60-NEXT:    }
417 ; V60-NEXT:    {
418 ; V60-NEXT:     q0 = vcmp.gt(v31.w,v1.w)
419 ; V60-NEXT:    }
420 ; V60-NEXT:    {
421 ; V60-NEXT:     v5.uw = vlsr(v2.uw,r1)
422 ; V60-NEXT:    }
423 ; V60-NEXT:    {
424 ; V60-NEXT:     v4 = vdelta(v1,v4)
425 ; V60-NEXT:    }
426 ; V60-NEXT:    {
427 ; V60-NEXT:     v7:6.uw = vmpy(v0.uh,v4.uh)
428 ; V60-NEXT:    }
429 ; V60-NEXT:    {
430 ; V60-NEXT:     v7:6.w = vadd(v7.uh,v6.uh)
431 ; V60-NEXT:    }
432 ; V60-NEXT:    {
433 ; V60-NEXT:     v30.w = vadd(v6.w,v5.w)
434 ; V60-NEXT:    }
435 ; V60-NEXT:    {
436 ; V60-NEXT:     v2.w += vasl(v6.w,r1)
437 ; V60-NEXT:    }
438 ; V60-NEXT:    {
439 ; V60-NEXT:     v7.w += vasr(v30.w,r1)
440 ; V60-NEXT:    }
441 ; V60-NEXT:    {
442 ; V60-NEXT:     v3.w = vadd(v3.w,v7.w)
443 ; V60-NEXT:    }
444 ; V60-NEXT:    {
445 ; V60-NEXT:     if (q0) v3.w -= v0.w
446 ; V60-NEXT:    }
447 ; V60-NEXT:    {
448 ; V60-NEXT:     v1:0 = vcombine(v3,v2)
449 ; V60-NEXT:    }
450 ; V60-NEXT:    {
451 ; V60-NEXT:     jumpr r31
452 ; V60-NEXT:    }
454 ; V62-LABEL: f11:
455 ; V62:       // %bb.0:
456 ; V62-NEXT:    {
457 ; V62-NEXT:     v3:2 = vmpye(v0.w,v1.uh)
458 ; V62-NEXT:    }
459 ; V62-NEXT:    {
460 ; V62-NEXT:     v4 = vxor(v4,v4)
461 ; V62-NEXT:    }
462 ; V62-NEXT:    {
463 ; V62-NEXT:     q0 = vcmp.gt(v4.w,v0.w)
464 ; V62-NEXT:    }
465 ; V62-NEXT:    {
466 ; V62-NEXT:     v3:2 += vmpyo(v0.w,v1.h)
467 ; V62-NEXT:    }
468 ; V62-NEXT:    {
469 ; V62-NEXT:     if (q0) v3.w += v1.w
470 ; V62-NEXT:    }
471 ; V62-NEXT:    {
472 ; V62-NEXT:     v1:0 = vcombine(v3,v2)
473 ; V62-NEXT:    }
474 ; V62-NEXT:    {
475 ; V62-NEXT:     jumpr r31
476 ; V62-NEXT:    }
477   %v0 = call {<32 x i32>, <32 x i32>} @llvm.hexagon.V6.vmpyus.parts.128B(<32 x i32> %a0, <32 x i32> %a1)
478   %v1 = extractvalue {<32 x i32>, <32 x i32>} %v0, 0
479   %v2 = extractvalue {<32 x i32>, <32 x i32>} %v0, 1
480   %v3 = shufflevector <32 x i32> %v2, <32 x i32> %v1, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 48, i32 49, i32 50, i32 51, i32 52, i32 53, i32 54, i32 55, i32 56, i32 57, i32 58, i32 59, i32 60, i32 61, i32 62, i32 63>
481   ret <64 x i32> %v3
484 define <64 x i32> @f12(<32 x i32> %a0, <32 x i32> %a1) #0 {
485 ; V60-LABEL: f12:
486 ; V60:       // %bb.0:
487 ; V60-NEXT:    {
488 ; V60-NEXT:     r1:0 = combine(#16,##33686018)
489 ; V60-NEXT:    }
490 ; V60-NEXT:    {
491 ; V60-NEXT:     v3:2.uw = vmpy(v0.uh,v1.uh)
492 ; V60-NEXT:    }
493 ; V60-NEXT:    {
494 ; V60-NEXT:     v4 = vsplat(r0)
495 ; V60-NEXT:    }
496 ; V60-NEXT:    {
497 ; V60-NEXT:     v5.uw = vlsr(v2.uw,r1)
498 ; V60-NEXT:    }
499 ; V60-NEXT:    {
500 ; V60-NEXT:     v30 = vdelta(v1,v4)
501 ; V60-NEXT:    }
502 ; V60-NEXT:    {
503 ; V60-NEXT:     v1:0.uw = vmpy(v0.uh,v30.uh)
504 ; V60-NEXT:    }
505 ; V60-NEXT:    {
506 ; V60-NEXT:     v1:0.w = vadd(v1.uh,v0.uh)
507 ; V60-NEXT:    }
508 ; V60-NEXT:    {
509 ; V60-NEXT:     v31.w = vadd(v0.w,v5.w)
510 ; V60-NEXT:    }
511 ; V60-NEXT:    {
512 ; V60-NEXT:     v2.w += vasl(v0.w,r1)
513 ; V60-NEXT:    }
514 ; V60-NEXT:    {
515 ; V60-NEXT:     v1.w += vasr(v31.w,r1)
516 ; V60-NEXT:    }
517 ; V60-NEXT:    {
518 ; V60-NEXT:     v3.w = vadd(v3.w,v1.w)
519 ; V60-NEXT:    }
520 ; V60-NEXT:    {
521 ; V60-NEXT:     v1:0 = vcombine(v3,v2)
522 ; V60-NEXT:    }
523 ; V60-NEXT:    {
524 ; V60-NEXT:     jumpr r31
525 ; V60-NEXT:    }
527 ; V62-LABEL: f12:
528 ; V62:       // %bb.0:
529 ; V62-NEXT:    {
530 ; V62-NEXT:     v4 = vxor(v4,v4)
531 ; V62-NEXT:    }
532 ; V62-NEXT:    {
533 ; V62-NEXT:     v3:2 = vmpye(v0.w,v1.uh)
534 ; V62-NEXT:    }
535 ; V62-NEXT:    {
536 ; V62-NEXT:     q0 = vcmp.gt(v4.w,v0.w)
537 ; V62-NEXT:    }
538 ; V62-NEXT:    {
539 ; V62-NEXT:     q1 = vcmp.gt(v4.w,v1.w)
540 ; V62-NEXT:    }
541 ; V62-NEXT:    {
542 ; V62-NEXT:     v3:2 += vmpyo(v0.w,v1.h)
543 ; V62-NEXT:    }
544 ; V62-NEXT:    {
545 ; V62-NEXT:     v31 = vand(q0,v1)
546 ; V62-NEXT:    }
547 ; V62-NEXT:    {
548 ; V62-NEXT:     if (q1) v31.w += v0.w
549 ; V62-NEXT:    }
550 ; V62-NEXT:    {
551 ; V62-NEXT:     v3.w = vadd(v3.w,v31.w)
552 ; V62-NEXT:    }
553 ; V62-NEXT:    {
554 ; V62-NEXT:     v1:0 = vcombine(v3,v2)
555 ; V62-NEXT:    }
556 ; V62-NEXT:    {
557 ; V62-NEXT:     jumpr r31
558 ; V62-NEXT:    }
559   %v0 = call {<32 x i32>, <32 x i32>} @llvm.hexagon.V6.vmpyuu.parts.128B(<32 x i32> %a0, <32 x i32> %a1)
560   %v1 = extractvalue {<32 x i32>, <32 x i32>} %v0, 0
561   %v2 = extractvalue {<32 x i32>, <32 x i32>} %v0, 1
562   %v3 = shufflevector <32 x i32> %v2, <32 x i32> %v1, <64 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47, i32 48, i32 49, i32 50, i32 51, i32 52, i32 53, i32 54, i32 55, i32 56, i32 57, i32 58, i32 59, i32 60, i32 61, i32 62, i32 63>
563   ret <64 x i32> %v3
566 declare {<32 x i32>, <32 x i32>} @llvm.hexagon.V6.vmpyss.parts.128B(<32 x i32>, <32 x i32>)
567 declare {<32 x i32>, <32 x i32>} @llvm.hexagon.V6.vmpyus.parts.128B(<32 x i32>, <32 x i32>)
568 declare {<32 x i32>, <32 x i32>} @llvm.hexagon.V6.vmpyuu.parts.128B(<32 x i32>, <32 x i32>)
570 attributes #0 = { nounwind }