Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / fixed-vectors-vwmul.ll
blob97c7f101c258275f402274701696fd3099aabe1b
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32
3 ; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64
5 define <2 x i16> @vwmul_v2i16(ptr %x, ptr %y) {
6 ; CHECK-LABEL: vwmul_v2i16:
7 ; CHECK:       # %bb.0:
8 ; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma
9 ; CHECK-NEXT:    vle8.v v9, (a0)
10 ; CHECK-NEXT:    vle8.v v10, (a1)
11 ; CHECK-NEXT:    vwmul.vv v8, v9, v10
12 ; CHECK-NEXT:    ret
13   %a = load <2 x i8>, ptr %x
14   %b = load <2 x i8>, ptr %y
15   %c = sext <2 x i8> %a to <2 x i16>
16   %d = sext <2 x i8> %b to <2 x i16>
17   %e = mul <2 x i16> %c, %d
18   ret <2 x i16> %e
21 define <2 x i16> @vwmul_v2i16_multiple_users(ptr %x, ptr %y, ptr %z) {
22 ; CHECK-LABEL: vwmul_v2i16_multiple_users:
23 ; CHECK:       # %bb.0:
24 ; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma
25 ; CHECK-NEXT:    vle8.v v8, (a0)
26 ; CHECK-NEXT:    vle8.v v9, (a1)
27 ; CHECK-NEXT:    vle8.v v10, (a2)
28 ; CHECK-NEXT:    vwmul.vv v11, v8, v9
29 ; CHECK-NEXT:    vwmul.vv v9, v8, v10
30 ; CHECK-NEXT:    vsetvli zero, zero, e16, mf4, ta, ma
31 ; CHECK-NEXT:    vor.vv v8, v11, v9
32 ; CHECK-NEXT:    ret
33   %a = load <2 x i8>, ptr %x
34   %b = load <2 x i8>, ptr %y
35   %b2 = load <2 x i8>, ptr %z
36   %c = sext <2 x i8> %a to <2 x i16>
37   %d = sext <2 x i8> %b to <2 x i16>
38   %d2 = sext <2 x i8> %b2 to <2 x i16>
39   %e = mul <2 x i16> %c, %d
40   %f = mul <2 x i16> %c, %d2
41   %g = or <2 x i16> %e, %f
42   ret <2 x i16> %g
45 define <4 x i16> @vwmul_v4i16(ptr %x, ptr %y) {
46 ; CHECK-LABEL: vwmul_v4i16:
47 ; CHECK:       # %bb.0:
48 ; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
49 ; CHECK-NEXT:    vle8.v v9, (a0)
50 ; CHECK-NEXT:    vle8.v v10, (a1)
51 ; CHECK-NEXT:    vwmul.vv v8, v9, v10
52 ; CHECK-NEXT:    ret
53   %a = load <4 x i8>, ptr %x
54   %b = load <4 x i8>, ptr %y
55   %c = sext <4 x i8> %a to <4 x i16>
56   %d = sext <4 x i8> %b to <4 x i16>
57   %e = mul <4 x i16> %c, %d
58   ret <4 x i16> %e
61 define <2 x i32> @vwmul_v2i32(ptr %x, ptr %y) {
62 ; CHECK-LABEL: vwmul_v2i32:
63 ; CHECK:       # %bb.0:
64 ; CHECK-NEXT:    vsetivli zero, 2, e16, mf4, ta, ma
65 ; CHECK-NEXT:    vle16.v v9, (a0)
66 ; CHECK-NEXT:    vle16.v v10, (a1)
67 ; CHECK-NEXT:    vwmul.vv v8, v9, v10
68 ; CHECK-NEXT:    ret
69   %a = load <2 x i16>, ptr %x
70   %b = load <2 x i16>, ptr %y
71   %c = sext <2 x i16> %a to <2 x i32>
72   %d = sext <2 x i16> %b to <2 x i32>
73   %e = mul <2 x i32> %c, %d
74   ret <2 x i32> %e
77 define <8 x i16> @vwmul_v8i16(ptr %x, ptr %y) {
78 ; CHECK-LABEL: vwmul_v8i16:
79 ; CHECK:       # %bb.0:
80 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
81 ; CHECK-NEXT:    vle8.v v9, (a0)
82 ; CHECK-NEXT:    vle8.v v10, (a1)
83 ; CHECK-NEXT:    vwmul.vv v8, v9, v10
84 ; CHECK-NEXT:    ret
85   %a = load <8 x i8>, ptr %x
86   %b = load <8 x i8>, ptr %y
87   %c = sext <8 x i8> %a to <8 x i16>
88   %d = sext <8 x i8> %b to <8 x i16>
89   %e = mul <8 x i16> %c, %d
90   ret <8 x i16> %e
93 define <4 x i32> @vwmul_v4i32(ptr %x, ptr %y) {
94 ; CHECK-LABEL: vwmul_v4i32:
95 ; CHECK:       # %bb.0:
96 ; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
97 ; CHECK-NEXT:    vle16.v v9, (a0)
98 ; CHECK-NEXT:    vle16.v v10, (a1)
99 ; CHECK-NEXT:    vwmul.vv v8, v9, v10
100 ; CHECK-NEXT:    ret
101   %a = load <4 x i16>, ptr %x
102   %b = load <4 x i16>, ptr %y
103   %c = sext <4 x i16> %a to <4 x i32>
104   %d = sext <4 x i16> %b to <4 x i32>
105   %e = mul <4 x i32> %c, %d
106   ret <4 x i32> %e
109 define <2 x i64> @vwmul_v2i64(ptr %x, ptr %y) {
110 ; CHECK-LABEL: vwmul_v2i64:
111 ; CHECK:       # %bb.0:
112 ; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
113 ; CHECK-NEXT:    vle32.v v9, (a0)
114 ; CHECK-NEXT:    vle32.v v10, (a1)
115 ; CHECK-NEXT:    vwmul.vv v8, v9, v10
116 ; CHECK-NEXT:    ret
117   %a = load <2 x i32>, ptr %x
118   %b = load <2 x i32>, ptr %y
119   %c = sext <2 x i32> %a to <2 x i64>
120   %d = sext <2 x i32> %b to <2 x i64>
121   %e = mul <2 x i64> %c, %d
122   ret <2 x i64> %e
125 define <16 x i16> @vwmul_v16i16(ptr %x, ptr %y) {
126 ; CHECK-LABEL: vwmul_v16i16:
127 ; CHECK:       # %bb.0:
128 ; CHECK-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
129 ; CHECK-NEXT:    vle8.v v10, (a0)
130 ; CHECK-NEXT:    vle8.v v11, (a1)
131 ; CHECK-NEXT:    vwmul.vv v8, v10, v11
132 ; CHECK-NEXT:    ret
133   %a = load <16 x i8>, ptr %x
134   %b = load <16 x i8>, ptr %y
135   %c = sext <16 x i8> %a to <16 x i16>
136   %d = sext <16 x i8> %b to <16 x i16>
137   %e = mul <16 x i16> %c, %d
138   ret <16 x i16> %e
141 define <8 x i32> @vwmul_v8i32(ptr %x, ptr %y) {
142 ; CHECK-LABEL: vwmul_v8i32:
143 ; CHECK:       # %bb.0:
144 ; CHECK-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
145 ; CHECK-NEXT:    vle16.v v10, (a0)
146 ; CHECK-NEXT:    vle16.v v11, (a1)
147 ; CHECK-NEXT:    vwmul.vv v8, v10, v11
148 ; CHECK-NEXT:    ret
149   %a = load <8 x i16>, ptr %x
150   %b = load <8 x i16>, ptr %y
151   %c = sext <8 x i16> %a to <8 x i32>
152   %d = sext <8 x i16> %b to <8 x i32>
153   %e = mul <8 x i32> %c, %d
154   ret <8 x i32> %e
157 define <4 x i64> @vwmul_v4i64(ptr %x, ptr %y) {
158 ; CHECK-LABEL: vwmul_v4i64:
159 ; CHECK:       # %bb.0:
160 ; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
161 ; CHECK-NEXT:    vle32.v v10, (a0)
162 ; CHECK-NEXT:    vle32.v v11, (a1)
163 ; CHECK-NEXT:    vwmul.vv v8, v10, v11
164 ; CHECK-NEXT:    ret
165   %a = load <4 x i32>, ptr %x
166   %b = load <4 x i32>, ptr %y
167   %c = sext <4 x i32> %a to <4 x i64>
168   %d = sext <4 x i32> %b to <4 x i64>
169   %e = mul <4 x i64> %c, %d
170   ret <4 x i64> %e
173 define <32 x i16> @vwmul_v32i16(ptr %x, ptr %y) {
174 ; CHECK-LABEL: vwmul_v32i16:
175 ; CHECK:       # %bb.0:
176 ; CHECK-NEXT:    li a2, 32
177 ; CHECK-NEXT:    vsetvli zero, a2, e8, m2, ta, ma
178 ; CHECK-NEXT:    vle8.v v12, (a0)
179 ; CHECK-NEXT:    vle8.v v14, (a1)
180 ; CHECK-NEXT:    vwmul.vv v8, v12, v14
181 ; CHECK-NEXT:    ret
182   %a = load <32 x i8>, ptr %x
183   %b = load <32 x i8>, ptr %y
184   %c = sext <32 x i8> %a to <32 x i16>
185   %d = sext <32 x i8> %b to <32 x i16>
186   %e = mul <32 x i16> %c, %d
187   ret <32 x i16> %e
190 define <16 x i32> @vwmul_v16i32(ptr %x, ptr %y) {
191 ; CHECK-LABEL: vwmul_v16i32:
192 ; CHECK:       # %bb.0:
193 ; CHECK-NEXT:    vsetivli zero, 16, e16, m2, ta, ma
194 ; CHECK-NEXT:    vle16.v v12, (a0)
195 ; CHECK-NEXT:    vle16.v v14, (a1)
196 ; CHECK-NEXT:    vwmul.vv v8, v12, v14
197 ; CHECK-NEXT:    ret
198   %a = load <16 x i16>, ptr %x
199   %b = load <16 x i16>, ptr %y
200   %c = sext <16 x i16> %a to <16 x i32>
201   %d = sext <16 x i16> %b to <16 x i32>
202   %e = mul <16 x i32> %c, %d
203   ret <16 x i32> %e
206 define <8 x  i64> @vwmul_v8i64(ptr %x, ptr %y) {
207 ; CHECK-LABEL: vwmul_v8i64:
208 ; CHECK:       # %bb.0:
209 ; CHECK-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
210 ; CHECK-NEXT:    vle32.v v12, (a0)
211 ; CHECK-NEXT:    vle32.v v14, (a1)
212 ; CHECK-NEXT:    vwmul.vv v8, v12, v14
213 ; CHECK-NEXT:    ret
214   %a = load <8 x  i32>, ptr %x
215   %b = load <8 x  i32>, ptr %y
216   %c = sext <8 x  i32> %a to <8 x  i64>
217   %d = sext <8 x  i32> %b to <8 x  i64>
218   %e = mul <8 x  i64> %c, %d
219   ret <8 x  i64> %e
222 define <64 x i16> @vwmul_v64i16(ptr %x, ptr %y) {
223 ; CHECK-LABEL: vwmul_v64i16:
224 ; CHECK:       # %bb.0:
225 ; CHECK-NEXT:    li a2, 64
226 ; CHECK-NEXT:    vsetvli zero, a2, e8, m4, ta, ma
227 ; CHECK-NEXT:    vle8.v v16, (a0)
228 ; CHECK-NEXT:    vle8.v v20, (a1)
229 ; CHECK-NEXT:    vwmul.vv v8, v16, v20
230 ; CHECK-NEXT:    ret
231   %a = load <64 x i8>, ptr %x
232   %b = load <64 x i8>, ptr %y
233   %c = sext <64 x i8> %a to <64 x i16>
234   %d = sext <64 x i8> %b to <64 x i16>
235   %e = mul <64 x i16> %c, %d
236   ret <64 x i16> %e
239 define <32 x i32> @vwmul_v32i32(ptr %x, ptr %y) {
240 ; CHECK-LABEL: vwmul_v32i32:
241 ; CHECK:       # %bb.0:
242 ; CHECK-NEXT:    li a2, 32
243 ; CHECK-NEXT:    vsetvli zero, a2, e16, m4, ta, ma
244 ; CHECK-NEXT:    vle16.v v16, (a0)
245 ; CHECK-NEXT:    vle16.v v20, (a1)
246 ; CHECK-NEXT:    vwmul.vv v8, v16, v20
247 ; CHECK-NEXT:    ret
248   %a = load <32 x i16>, ptr %x
249   %b = load <32 x i16>, ptr %y
250   %c = sext <32 x i16> %a to <32 x i32>
251   %d = sext <32 x i16> %b to <32 x i32>
252   %e = mul <32 x i32> %c, %d
253   ret <32 x i32> %e
256 define <16 x i64> @vwmul_v16i64(ptr %x, ptr %y) {
257 ; CHECK-LABEL: vwmul_v16i64:
258 ; CHECK:       # %bb.0:
259 ; CHECK-NEXT:    vsetivli zero, 16, e32, m4, ta, ma
260 ; CHECK-NEXT:    vle32.v v16, (a0)
261 ; CHECK-NEXT:    vle32.v v20, (a1)
262 ; CHECK-NEXT:    vwmul.vv v8, v16, v20
263 ; CHECK-NEXT:    ret
264   %a = load <16 x i32>, ptr %x
265   %b = load <16 x i32>, ptr %y
266   %c = sext <16 x i32> %a to <16 x i64>
267   %d = sext <16 x i32> %b to <16 x i64>
268   %e = mul <16 x i64> %c, %d
269   ret <16 x i64> %e
272 define <128 x i16> @vwmul_v128i16(ptr %x, ptr %y) {
273 ; CHECK-LABEL: vwmul_v128i16:
274 ; CHECK:       # %bb.0:
275 ; CHECK-NEXT:    addi sp, sp, -16
276 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
277 ; CHECK-NEXT:    csrr a2, vlenb
278 ; CHECK-NEXT:    slli a2, a2, 4
279 ; CHECK-NEXT:    sub sp, sp, a2
280 ; CHECK-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x10, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 16 * vlenb
281 ; CHECK-NEXT:    li a2, 128
282 ; CHECK-NEXT:    vsetvli zero, a2, e8, m8, ta, ma
283 ; CHECK-NEXT:    vle8.v v8, (a0)
284 ; CHECK-NEXT:    addi a0, sp, 16
285 ; CHECK-NEXT:    vs8r.v v8, (a0) # Unknown-size Folded Spill
286 ; CHECK-NEXT:    vle8.v v0, (a1)
287 ; CHECK-NEXT:    li a0, 64
288 ; CHECK-NEXT:    vsetvli zero, a0, e8, m8, ta, ma
289 ; CHECK-NEXT:    vslidedown.vx v16, v8, a0
290 ; CHECK-NEXT:    vslidedown.vx v8, v0, a0
291 ; CHECK-NEXT:    vsetvli zero, a0, e8, m4, ta, ma
292 ; CHECK-NEXT:    vwmul.vv v24, v16, v8
293 ; CHECK-NEXT:    csrr a0, vlenb
294 ; CHECK-NEXT:    slli a0, a0, 3
295 ; CHECK-NEXT:    add a0, sp, a0
296 ; CHECK-NEXT:    addi a0, a0, 16
297 ; CHECK-NEXT:    vs8r.v v24, (a0) # Unknown-size Folded Spill
298 ; CHECK-NEXT:    addi a0, sp, 16
299 ; CHECK-NEXT:    vl8r.v v16, (a0) # Unknown-size Folded Reload
300 ; CHECK-NEXT:    vwmul.vv v8, v16, v0
301 ; CHECK-NEXT:    csrr a0, vlenb
302 ; CHECK-NEXT:    slli a0, a0, 3
303 ; CHECK-NEXT:    add a0, sp, a0
304 ; CHECK-NEXT:    addi a0, a0, 16
305 ; CHECK-NEXT:    vl8r.v v16, (a0) # Unknown-size Folded Reload
306 ; CHECK-NEXT:    csrr a0, vlenb
307 ; CHECK-NEXT:    slli a0, a0, 4
308 ; CHECK-NEXT:    add sp, sp, a0
309 ; CHECK-NEXT:    addi sp, sp, 16
310 ; CHECK-NEXT:    ret
311   %a = load <128 x i8>, ptr %x
312   %b = load <128 x i8>, ptr %y
313   %c = sext <128 x i8> %a to <128 x i16>
314   %d = sext <128 x i8> %b to <128 x i16>
315   %e = mul <128 x i16> %c, %d
316   ret <128 x i16> %e
319 define <64 x i32> @vwmul_v64i32(ptr %x, ptr %y) {
320 ; CHECK-LABEL: vwmul_v64i32:
321 ; CHECK:       # %bb.0:
322 ; CHECK-NEXT:    addi sp, sp, -16
323 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
324 ; CHECK-NEXT:    csrr a2, vlenb
325 ; CHECK-NEXT:    slli a2, a2, 4
326 ; CHECK-NEXT:    sub sp, sp, a2
327 ; CHECK-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x10, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 16 * vlenb
328 ; CHECK-NEXT:    li a2, 64
329 ; CHECK-NEXT:    vsetvli zero, a2, e16, m8, ta, ma
330 ; CHECK-NEXT:    vle16.v v8, (a0)
331 ; CHECK-NEXT:    addi a0, sp, 16
332 ; CHECK-NEXT:    vs8r.v v8, (a0) # Unknown-size Folded Spill
333 ; CHECK-NEXT:    vle16.v v0, (a1)
334 ; CHECK-NEXT:    li a0, 32
335 ; CHECK-NEXT:    vsetvli zero, a0, e16, m8, ta, ma
336 ; CHECK-NEXT:    vslidedown.vx v16, v8, a0
337 ; CHECK-NEXT:    vslidedown.vx v8, v0, a0
338 ; CHECK-NEXT:    vsetvli zero, a0, e16, m4, ta, ma
339 ; CHECK-NEXT:    vwmul.vv v24, v16, v8
340 ; CHECK-NEXT:    csrr a0, vlenb
341 ; CHECK-NEXT:    slli a0, a0, 3
342 ; CHECK-NEXT:    add a0, sp, a0
343 ; CHECK-NEXT:    addi a0, a0, 16
344 ; CHECK-NEXT:    vs8r.v v24, (a0) # Unknown-size Folded Spill
345 ; CHECK-NEXT:    addi a0, sp, 16
346 ; CHECK-NEXT:    vl8r.v v16, (a0) # Unknown-size Folded Reload
347 ; CHECK-NEXT:    vwmul.vv v8, v16, v0
348 ; CHECK-NEXT:    csrr a0, vlenb
349 ; CHECK-NEXT:    slli a0, a0, 3
350 ; CHECK-NEXT:    add a0, sp, a0
351 ; CHECK-NEXT:    addi a0, a0, 16
352 ; CHECK-NEXT:    vl8r.v v16, (a0) # Unknown-size Folded Reload
353 ; CHECK-NEXT:    csrr a0, vlenb
354 ; CHECK-NEXT:    slli a0, a0, 4
355 ; CHECK-NEXT:    add sp, sp, a0
356 ; CHECK-NEXT:    addi sp, sp, 16
357 ; CHECK-NEXT:    ret
358   %a = load <64 x i16>, ptr %x
359   %b = load <64 x i16>, ptr %y
360   %c = sext <64 x i16> %a to <64 x i32>
361   %d = sext <64 x i16> %b to <64 x i32>
362   %e = mul <64 x i32> %c, %d
363   ret <64 x i32> %e
366 define <32 x i64> @vwmul_v32i64(ptr %x, ptr %y) {
367 ; CHECK-LABEL: vwmul_v32i64:
368 ; CHECK:       # %bb.0:
369 ; CHECK-NEXT:    addi sp, sp, -16
370 ; CHECK-NEXT:    .cfi_def_cfa_offset 16
371 ; CHECK-NEXT:    csrr a2, vlenb
372 ; CHECK-NEXT:    slli a2, a2, 4
373 ; CHECK-NEXT:    sub sp, sp, a2
374 ; CHECK-NEXT:    .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x10, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 16 * vlenb
375 ; CHECK-NEXT:    li a2, 32
376 ; CHECK-NEXT:    vsetvli zero, a2, e32, m8, ta, ma
377 ; CHECK-NEXT:    vle32.v v8, (a0)
378 ; CHECK-NEXT:    addi a0, sp, 16
379 ; CHECK-NEXT:    vs8r.v v8, (a0) # Unknown-size Folded Spill
380 ; CHECK-NEXT:    vle32.v v0, (a1)
381 ; CHECK-NEXT:    vsetivli zero, 16, e32, m8, ta, ma
382 ; CHECK-NEXT:    vslidedown.vi v16, v8, 16
383 ; CHECK-NEXT:    vslidedown.vi v8, v0, 16
384 ; CHECK-NEXT:    vsetivli zero, 16, e32, m4, ta, ma
385 ; CHECK-NEXT:    vwmul.vv v24, v16, v8
386 ; CHECK-NEXT:    csrr a0, vlenb
387 ; CHECK-NEXT:    slli a0, a0, 3
388 ; CHECK-NEXT:    add a0, sp, a0
389 ; CHECK-NEXT:    addi a0, a0, 16
390 ; CHECK-NEXT:    vs8r.v v24, (a0) # Unknown-size Folded Spill
391 ; CHECK-NEXT:    addi a0, sp, 16
392 ; CHECK-NEXT:    vl8r.v v16, (a0) # Unknown-size Folded Reload
393 ; CHECK-NEXT:    vwmul.vv v8, v16, v0
394 ; CHECK-NEXT:    csrr a0, vlenb
395 ; CHECK-NEXT:    slli a0, a0, 3
396 ; CHECK-NEXT:    add a0, sp, a0
397 ; CHECK-NEXT:    addi a0, a0, 16
398 ; CHECK-NEXT:    vl8r.v v16, (a0) # Unknown-size Folded Reload
399 ; CHECK-NEXT:    csrr a0, vlenb
400 ; CHECK-NEXT:    slli a0, a0, 4
401 ; CHECK-NEXT:    add sp, sp, a0
402 ; CHECK-NEXT:    addi sp, sp, 16
403 ; CHECK-NEXT:    ret
404   %a = load <32 x i32>, ptr %x
405   %b = load <32 x i32>, ptr %y
406   %c = sext <32 x i32> %a to <32 x i64>
407   %d = sext <32 x i32> %b to <32 x i64>
408   %e = mul <32 x i64> %c, %d
409   ret <32 x i64> %e
412 define <2 x i32> @vwmul_v2i32_v2i8(ptr %x, ptr %y) {
413 ; CHECK-LABEL: vwmul_v2i32_v2i8:
414 ; CHECK:       # %bb.0:
415 ; CHECK-NEXT:    vsetivli zero, 2, e16, mf4, ta, ma
416 ; CHECK-NEXT:    vle8.v v8, (a0)
417 ; CHECK-NEXT:    vle8.v v9, (a1)
418 ; CHECK-NEXT:    vsext.vf2 v10, v8
419 ; CHECK-NEXT:    vsext.vf2 v11, v9
420 ; CHECK-NEXT:    vwmul.vv v8, v10, v11
421 ; CHECK-NEXT:    ret
422   %a = load <2 x i8>, ptr %x
423   %b = load <2 x i8>, ptr %y
424   %c = sext <2 x i8> %a to <2 x i32>
425   %d = sext <2 x i8> %b to <2 x i32>
426   %e = mul <2 x i32> %c, %d
427   ret <2 x i32> %e
430 define <4 x i32> @vwmul_v4i32_v4i8_v4i16(ptr %x, ptr %y) {
431 ; CHECK-LABEL: vwmul_v4i32_v4i8_v4i16:
432 ; CHECK:       # %bb.0:
433 ; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
434 ; CHECK-NEXT:    vle8.v v8, (a0)
435 ; CHECK-NEXT:    vle16.v v9, (a1)
436 ; CHECK-NEXT:    vsext.vf2 v10, v8
437 ; CHECK-NEXT:    vwmul.vv v8, v10, v9
438 ; CHECK-NEXT:    ret
439   %a = load <4 x i8>, ptr %x
440   %b = load <4 x i16>, ptr %y
441   %c = sext <4 x i8> %a to <4 x i32>
442   %d = sext <4 x i16> %b to <4 x i32>
443   %e = mul <4 x i32> %c, %d
444   ret <4 x i32> %e
447 define <4 x i64> @vwmul_v4i64_v4i32_v4i8(ptr %x, ptr %y) {
448 ; CHECK-LABEL: vwmul_v4i64_v4i32_v4i8:
449 ; CHECK:       # %bb.0:
450 ; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
451 ; CHECK-NEXT:    vle8.v v8, (a1)
452 ; CHECK-NEXT:    vle32.v v10, (a0)
453 ; CHECK-NEXT:    vsext.vf4 v11, v8
454 ; CHECK-NEXT:    vwmul.vv v8, v10, v11
455 ; CHECK-NEXT:    ret
456   %a = load <4 x i32>, ptr %x
457   %b = load <4 x i8>, ptr %y
458   %c = sext <4 x i32> %a to <4 x i64>
459   %d = sext <4 x i8> %b to <4 x i64>
460   %e = mul <4 x i64> %c, %d
461   ret <4 x i64> %e
464 define <2 x i16> @vwmul_vx_v2i16(ptr %x, i8 %y) {
465 ; CHECK-LABEL: vwmul_vx_v2i16:
466 ; CHECK:       # %bb.0:
467 ; CHECK-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma
468 ; CHECK-NEXT:    vle8.v v9, (a0)
469 ; CHECK-NEXT:    vwmul.vx v8, v9, a1
470 ; CHECK-NEXT:    ret
471   %a = load <2 x i8>, ptr %x
472   %b = insertelement <2 x i8> poison, i8 %y, i32 0
473   %c = shufflevector <2 x i8> %b, <2 x i8> poison, <2 x i32> zeroinitializer
474   %d = sext <2 x i8> %a to <2 x i16>
475   %e = sext <2 x i8> %c to <2 x i16>
476   %f = mul <2 x i16> %d, %e
477   ret <2 x i16> %f
480 define <4 x i16> @vwmul_vx_v4i16(ptr %x, i8 %y) {
481 ; CHECK-LABEL: vwmul_vx_v4i16:
482 ; CHECK:       # %bb.0:
483 ; CHECK-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma
484 ; CHECK-NEXT:    vle8.v v9, (a0)
485 ; CHECK-NEXT:    vwmul.vx v8, v9, a1
486 ; CHECK-NEXT:    ret
487   %a = load <4 x i8>, ptr %x
488   %b = insertelement <4 x i8> poison, i8 %y, i32 0
489   %c = shufflevector <4 x i8> %b, <4 x i8> poison, <4 x i32> zeroinitializer
490   %d = sext <4 x i8> %a to <4 x i16>
491   %e = sext <4 x i8> %c to <4 x i16>
492   %f = mul <4 x i16> %d, %e
493   ret <4 x i16> %f
496 define <2 x i32> @vwmul_vx_v2i32(ptr %x, i16 %y) {
497 ; CHECK-LABEL: vwmul_vx_v2i32:
498 ; CHECK:       # %bb.0:
499 ; CHECK-NEXT:    vsetivli zero, 2, e16, mf4, ta, ma
500 ; CHECK-NEXT:    vle16.v v9, (a0)
501 ; CHECK-NEXT:    vwmul.vx v8, v9, a1
502 ; CHECK-NEXT:    ret
503   %a = load <2 x i16>, ptr %x
504   %b = insertelement <2 x i16> poison, i16 %y, i32 0
505   %c = shufflevector <2 x i16> %b, <2 x i16> poison, <2 x i32> zeroinitializer
506   %d = sext <2 x i16> %a to <2 x i32>
507   %e = sext <2 x i16> %c to <2 x i32>
508   %f = mul <2 x i32> %d, %e
509   ret <2 x i32> %f
512 define <8 x i16> @vwmul_vx_v8i16(ptr %x, i8 %y) {
513 ; CHECK-LABEL: vwmul_vx_v8i16:
514 ; CHECK:       # %bb.0:
515 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
516 ; CHECK-NEXT:    vle8.v v9, (a0)
517 ; CHECK-NEXT:    vwmul.vx v8, v9, a1
518 ; CHECK-NEXT:    ret
519   %a = load <8 x i8>, ptr %x
520   %b = insertelement <8 x i8> poison, i8 %y, i32 0
521   %c = shufflevector <8 x i8> %b, <8 x i8> poison, <8 x i32> zeroinitializer
522   %d = sext <8 x i8> %a to <8 x i16>
523   %e = sext <8 x i8> %c to <8 x i16>
524   %f = mul <8 x i16> %d, %e
525   ret <8 x i16> %f
528 define <4 x i32> @vwmul_vx_v4i32(ptr %x, i16 %y) {
529 ; CHECK-LABEL: vwmul_vx_v4i32:
530 ; CHECK:       # %bb.0:
531 ; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
532 ; CHECK-NEXT:    vle16.v v9, (a0)
533 ; CHECK-NEXT:    vwmul.vx v8, v9, a1
534 ; CHECK-NEXT:    ret
535   %a = load <4 x i16>, ptr %x
536   %b = insertelement <4 x i16> poison, i16 %y, i32 0
537   %c = shufflevector <4 x i16> %b, <4 x i16> poison, <4 x i32> zeroinitializer
538   %d = sext <4 x i16> %a to <4 x i32>
539   %e = sext <4 x i16> %c to <4 x i32>
540   %f = mul <4 x i32> %d, %e
541   ret <4 x i32> %f
544 define <2 x i64> @vwmul_vx_v2i64(ptr %x, i32 %y) {
545 ; CHECK-LABEL: vwmul_vx_v2i64:
546 ; CHECK:       # %bb.0:
547 ; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
548 ; CHECK-NEXT:    vle32.v v9, (a0)
549 ; CHECK-NEXT:    vwmul.vx v8, v9, a1
550 ; CHECK-NEXT:    ret
551   %a = load <2 x i32>, ptr %x
552   %b = insertelement <2 x i32> poison, i32 %y, i64 0
553   %c = shufflevector <2 x i32> %b, <2 x i32> poison, <2 x i32> zeroinitializer
554   %d = sext <2 x i32> %a to <2 x i64>
555   %e = sext <2 x i32> %c to <2 x i64>
556   %f = mul <2 x i64> %d, %e
557   ret <2 x i64> %f
560 define <16 x i16> @vwmul_vx_v16i16(ptr %x, i8 %y) {
561 ; CHECK-LABEL: vwmul_vx_v16i16:
562 ; CHECK:       # %bb.0:
563 ; CHECK-NEXT:    vsetivli zero, 16, e8, m1, ta, ma
564 ; CHECK-NEXT:    vle8.v v10, (a0)
565 ; CHECK-NEXT:    vwmul.vx v8, v10, a1
566 ; CHECK-NEXT:    ret
567   %a = load <16 x i8>, ptr %x
568   %b = insertelement <16 x i8> poison, i8 %y, i32 0
569   %c = shufflevector <16 x i8> %b, <16 x i8> poison, <16 x i32> zeroinitializer
570   %d = sext <16 x i8> %a to <16 x i16>
571   %e = sext <16 x i8> %c to <16 x i16>
572   %f = mul <16 x i16> %d, %e
573   ret <16 x i16> %f
576 define <8 x i32> @vwmul_vx_v8i32(ptr %x, i16 %y) {
577 ; CHECK-LABEL: vwmul_vx_v8i32:
578 ; CHECK:       # %bb.0:
579 ; CHECK-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
580 ; CHECK-NEXT:    vle16.v v10, (a0)
581 ; CHECK-NEXT:    vwmul.vx v8, v10, a1
582 ; CHECK-NEXT:    ret
583   %a = load <8 x i16>, ptr %x
584   %b = insertelement <8 x i16> poison, i16 %y, i32 0
585   %c = shufflevector <8 x i16> %b, <8 x i16> poison, <8 x i32> zeroinitializer
586   %d = sext <8 x i16> %a to <8 x i32>
587   %e = sext <8 x i16> %c to <8 x i32>
588   %f = mul <8 x i32> %d, %e
589   ret <8 x i32> %f
592 define <4 x i64> @vwmul_vx_v4i64(ptr %x, i32 %y) {
593 ; CHECK-LABEL: vwmul_vx_v4i64:
594 ; CHECK:       # %bb.0:
595 ; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
596 ; CHECK-NEXT:    vle32.v v10, (a0)
597 ; CHECK-NEXT:    vwmul.vx v8, v10, a1
598 ; CHECK-NEXT:    ret
599   %a = load <4 x i32>, ptr %x
600   %b = insertelement <4 x i32> poison, i32 %y, i64 0
601   %c = shufflevector <4 x i32> %b, <4 x i32> poison, <4 x i32> zeroinitializer
602   %d = sext <4 x i32> %a to <4 x i64>
603   %e = sext <4 x i32> %c to <4 x i64>
604   %f = mul <4 x i64> %d, %e
605   ret <4 x i64> %f
608 define <32 x i16> @vwmul_vx_v32i16(ptr %x, i8 %y) {
609 ; CHECK-LABEL: vwmul_vx_v32i16:
610 ; CHECK:       # %bb.0:
611 ; CHECK-NEXT:    li a2, 32
612 ; CHECK-NEXT:    vsetvli zero, a2, e8, m2, ta, ma
613 ; CHECK-NEXT:    vle8.v v12, (a0)
614 ; CHECK-NEXT:    vwmul.vx v8, v12, a1
615 ; CHECK-NEXT:    ret
616   %a = load <32 x i8>, ptr %x
617   %b = insertelement <32 x i8> poison, i8 %y, i32 0
618   %c = shufflevector <32 x i8> %b, <32 x i8> poison, <32 x i32> zeroinitializer
619   %d = sext <32 x i8> %a to <32 x i16>
620   %e = sext <32 x i8> %c to <32 x i16>
621   %f = mul <32 x i16> %d, %e
622   ret <32 x i16> %f
625 define <16 x i32> @vwmul_vx_v16i32(ptr %x, i16 %y) {
626 ; CHECK-LABEL: vwmul_vx_v16i32:
627 ; CHECK:       # %bb.0:
628 ; CHECK-NEXT:    vsetivli zero, 16, e16, m2, ta, ma
629 ; CHECK-NEXT:    vle16.v v12, (a0)
630 ; CHECK-NEXT:    vwmul.vx v8, v12, a1
631 ; CHECK-NEXT:    ret
632   %a = load <16 x i16>, ptr %x
633   %b = insertelement <16 x i16> poison, i16 %y, i32 0
634   %c = shufflevector <16 x i16> %b, <16 x i16> poison, <16 x i32> zeroinitializer
635   %d = sext <16 x i16> %a to <16 x i32>
636   %e = sext <16 x i16> %c to <16 x i32>
637   %f = mul <16 x i32> %d, %e
638   ret <16 x i32> %f
641 define <8 x i64> @vwmul_vx_v8i64(ptr %x, i32 %y) {
642 ; CHECK-LABEL: vwmul_vx_v8i64:
643 ; CHECK:       # %bb.0:
644 ; CHECK-NEXT:    vsetivli zero, 8, e32, m2, ta, ma
645 ; CHECK-NEXT:    vle32.v v12, (a0)
646 ; CHECK-NEXT:    vwmul.vx v8, v12, a1
647 ; CHECK-NEXT:    ret
648   %a = load <8 x i32>, ptr %x
649   %b = insertelement <8 x i32> poison, i32 %y, i64 0
650   %c = shufflevector <8 x i32> %b, <8 x i32> poison, <8 x i32> zeroinitializer
651   %d = sext <8 x i32> %a to <8 x i64>
652   %e = sext <8 x i32> %c to <8 x i64>
653   %f = mul <8 x i64> %d, %e
654   ret <8 x i64> %f
657 define <64 x i16> @vwmul_vx_v64i16(ptr %x, i8 %y) {
658 ; CHECK-LABEL: vwmul_vx_v64i16:
659 ; CHECK:       # %bb.0:
660 ; CHECK-NEXT:    li a2, 64
661 ; CHECK-NEXT:    vsetvli zero, a2, e8, m4, ta, ma
662 ; CHECK-NEXT:    vle8.v v16, (a0)
663 ; CHECK-NEXT:    vwmul.vx v8, v16, a1
664 ; CHECK-NEXT:    ret
665   %a = load <64 x i8>, ptr %x
666   %b = insertelement <64 x i8> poison, i8 %y, i32 0
667   %c = shufflevector <64 x i8> %b, <64 x i8> poison, <64 x i32> zeroinitializer
668   %d = sext <64 x i8> %a to <64 x i16>
669   %e = sext <64 x i8> %c to <64 x i16>
670   %f = mul <64 x i16> %d, %e
671   ret <64 x i16> %f
674 define <32 x i32> @vwmul_vx_v32i32(ptr %x, i16 %y) {
675 ; CHECK-LABEL: vwmul_vx_v32i32:
676 ; CHECK:       # %bb.0:
677 ; CHECK-NEXT:    li a2, 32
678 ; CHECK-NEXT:    vsetvli zero, a2, e16, m4, ta, ma
679 ; CHECK-NEXT:    vle16.v v16, (a0)
680 ; CHECK-NEXT:    vwmul.vx v8, v16, a1
681 ; CHECK-NEXT:    ret
682   %a = load <32 x i16>, ptr %x
683   %b = insertelement <32 x i16> poison, i16 %y, i32 0
684   %c = shufflevector <32 x i16> %b, <32 x i16> poison, <32 x i32> zeroinitializer
685   %d = sext <32 x i16> %a to <32 x i32>
686   %e = sext <32 x i16> %c to <32 x i32>
687   %f = mul <32 x i32> %d, %e
688   ret <32 x i32> %f
691 define <16 x i64> @vwmul_vx_v16i64(ptr %x, i32 %y) {
692 ; CHECK-LABEL: vwmul_vx_v16i64:
693 ; CHECK:       # %bb.0:
694 ; CHECK-NEXT:    vsetivli zero, 16, e32, m4, ta, ma
695 ; CHECK-NEXT:    vle32.v v16, (a0)
696 ; CHECK-NEXT:    vwmul.vx v8, v16, a1
697 ; CHECK-NEXT:    ret
698   %a = load <16 x i32>, ptr %x
699   %b = insertelement <16 x i32> poison, i32 %y, i64 0
700   %c = shufflevector <16 x i32> %b, <16 x i32> poison, <16 x i32> zeroinitializer
701   %d = sext <16 x i32> %a to <16 x i64>
702   %e = sext <16 x i32> %c to <16 x i64>
703   %f = mul <16 x i64> %d, %e
704   ret <16 x i64> %f
707 define <8 x i16> @vwmul_vx_v8i16_i8(ptr %x, ptr %y) {
708 ; CHECK-LABEL: vwmul_vx_v8i16_i8:
709 ; CHECK:       # %bb.0:
710 ; CHECK-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma
711 ; CHECK-NEXT:    vle8.v v9, (a0)
712 ; CHECK-NEXT:    lb a0, 0(a1)
713 ; CHECK-NEXT:    vwmul.vx v8, v9, a0
714 ; CHECK-NEXT:    ret
715   %a = load <8 x i8>, ptr %x
716   %b = load i8, ptr %y
717   %c = sext i8 %b to i16
718   %d = insertelement <8 x i16> poison, i16 %c, i32 0
719   %e = shufflevector <8 x i16> %d, <8 x i16> poison, <8 x i32> zeroinitializer
720   %f = sext <8 x i8> %a to <8 x i16>
721   %g = mul <8 x i16> %e, %f
722   ret <8 x i16> %g
725 define <8 x i16> @vwmul_vx_v8i16_i16(ptr %x, ptr %y) {
726 ; CHECK-LABEL: vwmul_vx_v8i16_i16:
727 ; CHECK:       # %bb.0:
728 ; CHECK-NEXT:    vsetivli zero, 8, e16, m1, ta, ma
729 ; CHECK-NEXT:    vle8.v v8, (a0)
730 ; CHECK-NEXT:    lh a0, 0(a1)
731 ; CHECK-NEXT:    vsext.vf2 v9, v8
732 ; CHECK-NEXT:    vmul.vx v8, v9, a0
733 ; CHECK-NEXT:    ret
734   %a = load <8 x i8>, ptr %x
735   %b = load i16, ptr %y
736   %d = insertelement <8 x i16> poison, i16 %b, i32 0
737   %e = shufflevector <8 x i16> %d, <8 x i16> poison, <8 x i32> zeroinitializer
738   %f = sext <8 x i8> %a to <8 x i16>
739   %g = mul <8 x i16> %e, %f
740   ret <8 x i16> %g
743 define <4 x i32> @vwmul_vx_v4i32_i8(ptr %x, ptr %y) {
744 ; CHECK-LABEL: vwmul_vx_v4i32_i8:
745 ; CHECK:       # %bb.0:
746 ; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
747 ; CHECK-NEXT:    vle16.v v9, (a0)
748 ; CHECK-NEXT:    lb a0, 0(a1)
749 ; CHECK-NEXT:    vwmul.vx v8, v9, a0
750 ; CHECK-NEXT:    ret
751   %a = load <4 x i16>, ptr %x
752   %b = load i8, ptr %y
753   %c = sext i8 %b to i32
754   %d = insertelement <4 x i32> poison, i32 %c, i32 0
755   %e = shufflevector <4 x i32> %d, <4 x i32> poison, <4 x i32> zeroinitializer
756   %f = sext <4 x i16> %a to <4 x i32>
757   %g = mul <4 x i32> %e, %f
758   ret <4 x i32> %g
761 define <4 x i32> @vwmul_vx_v4i32_i16(ptr %x, ptr %y) {
762 ; CHECK-LABEL: vwmul_vx_v4i32_i16:
763 ; CHECK:       # %bb.0:
764 ; CHECK-NEXT:    vsetivli zero, 4, e16, mf2, ta, ma
765 ; CHECK-NEXT:    vle16.v v9, (a0)
766 ; CHECK-NEXT:    lh a0, 0(a1)
767 ; CHECK-NEXT:    vwmul.vx v8, v9, a0
768 ; CHECK-NEXT:    ret
769   %a = load <4 x i16>, ptr %x
770   %b = load i16, ptr %y
771   %c = sext i16 %b to i32
772   %d = insertelement <4 x i32> poison, i32 %c, i32 0
773   %e = shufflevector <4 x i32> %d, <4 x i32> poison, <4 x i32> zeroinitializer
774   %f = sext <4 x i16> %a to <4 x i32>
775   %g = mul <4 x i32> %e, %f
776   ret <4 x i32> %g
779 define <4 x i32> @vwmul_vx_v4i32_i32(ptr %x, ptr %y) {
780 ; CHECK-LABEL: vwmul_vx_v4i32_i32:
781 ; CHECK:       # %bb.0:
782 ; CHECK-NEXT:    vsetivli zero, 4, e32, m1, ta, ma
783 ; CHECK-NEXT:    vle16.v v8, (a0)
784 ; CHECK-NEXT:    lw a0, 0(a1)
785 ; CHECK-NEXT:    vsext.vf2 v9, v8
786 ; CHECK-NEXT:    vmul.vx v8, v9, a0
787 ; CHECK-NEXT:    ret
788   %a = load <4 x i16>, ptr %x
789   %b = load i32, ptr %y
790   %d = insertelement <4 x i32> poison, i32 %b, i32 0
791   %e = shufflevector <4 x i32> %d, <4 x i32> poison, <4 x i32> zeroinitializer
792   %f = sext <4 x i16> %a to <4 x i32>
793   %g = mul <4 x i32> %e, %f
794   ret <4 x i32> %g
797 define <2 x i64> @vwmul_vx_v2i64_i8(ptr %x, ptr %y) {
798 ; CHECK-LABEL: vwmul_vx_v2i64_i8:
799 ; CHECK:       # %bb.0:
800 ; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
801 ; CHECK-NEXT:    vle32.v v9, (a0)
802 ; CHECK-NEXT:    lb a0, 0(a1)
803 ; CHECK-NEXT:    vwmul.vx v8, v9, a0
804 ; CHECK-NEXT:    ret
805   %a = load <2 x i32>, ptr %x
806   %b = load i8, ptr %y
807   %c = sext i8 %b to i64
808   %d = insertelement <2 x i64> poison, i64 %c, i64 0
809   %e = shufflevector <2 x i64> %d, <2 x i64> poison, <2 x i32> zeroinitializer
810   %f = sext <2 x i32> %a to <2 x i64>
811   %g = mul <2 x i64> %e, %f
812   ret <2 x i64> %g
815 define <2 x i64> @vwmul_vx_v2i64_i16(ptr %x, ptr %y) {
816 ; CHECK-LABEL: vwmul_vx_v2i64_i16:
817 ; CHECK:       # %bb.0:
818 ; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
819 ; CHECK-NEXT:    vle32.v v9, (a0)
820 ; CHECK-NEXT:    lh a0, 0(a1)
821 ; CHECK-NEXT:    vwmul.vx v8, v9, a0
822 ; CHECK-NEXT:    ret
823   %a = load <2 x i32>, ptr %x
824   %b = load i16, ptr %y
825   %c = sext i16 %b to i64
826   %d = insertelement <2 x i64> poison, i64 %c, i64 0
827   %e = shufflevector <2 x i64> %d, <2 x i64> poison, <2 x i32> zeroinitializer
828   %f = sext <2 x i32> %a to <2 x i64>
829   %g = mul <2 x i64> %e, %f
830   ret <2 x i64> %g
833 define <2 x i64> @vwmul_vx_v2i64_i32(ptr %x, ptr %y) {
834 ; CHECK-LABEL: vwmul_vx_v2i64_i32:
835 ; CHECK:       # %bb.0:
836 ; CHECK-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma
837 ; CHECK-NEXT:    vle32.v v9, (a0)
838 ; CHECK-NEXT:    lw a0, 0(a1)
839 ; CHECK-NEXT:    vwmul.vx v8, v9, a0
840 ; CHECK-NEXT:    ret
841   %a = load <2 x i32>, ptr %x
842   %b = load i32, ptr %y
843   %c = sext i32 %b to i64
844   %d = insertelement <2 x i64> poison, i64 %c, i64 0
845   %e = shufflevector <2 x i64> %d, <2 x i64> poison, <2 x i32> zeroinitializer
846   %f = sext <2 x i32> %a to <2 x i64>
847   %g = mul <2 x i64> %e, %f
848   ret <2 x i64> %g
851 define <2 x i64> @vwmul_vx_v2i64_i64(ptr %x, ptr %y) {
852 ; RV32-LABEL: vwmul_vx_v2i64_i64:
853 ; RV32:       # %bb.0:
854 ; RV32-NEXT:    addi sp, sp, -16
855 ; RV32-NEXT:    .cfi_def_cfa_offset 16
856 ; RV32-NEXT:    lw a2, 4(a1)
857 ; RV32-NEXT:    lw a1, 0(a1)
858 ; RV32-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
859 ; RV32-NEXT:    vle32.v v8, (a0)
860 ; RV32-NEXT:    sw a2, 12(sp)
861 ; RV32-NEXT:    sw a1, 8(sp)
862 ; RV32-NEXT:    addi a0, sp, 8
863 ; RV32-NEXT:    vlse64.v v9, (a0), zero
864 ; RV32-NEXT:    vsext.vf2 v10, v8
865 ; RV32-NEXT:    vmul.vv v8, v9, v10
866 ; RV32-NEXT:    addi sp, sp, 16
867 ; RV32-NEXT:    ret
869 ; RV64-LABEL: vwmul_vx_v2i64_i64:
870 ; RV64:       # %bb.0:
871 ; RV64-NEXT:    vsetivli zero, 2, e64, m1, ta, ma
872 ; RV64-NEXT:    vle32.v v8, (a0)
873 ; RV64-NEXT:    ld a0, 0(a1)
874 ; RV64-NEXT:    vsext.vf2 v9, v8
875 ; RV64-NEXT:    vmul.vx v8, v9, a0
876 ; RV64-NEXT:    ret
877   %a = load <2 x i32>, ptr %x
878   %b = load i64, ptr %y
879   %d = insertelement <2 x i64> poison, i64 %b, i64 0
880   %e = shufflevector <2 x i64> %d, <2 x i64> poison, <2 x i32> zeroinitializer
881   %f = sext <2 x i32> %a to <2 x i64>
882   %g = mul <2 x i64> %e, %f
883   ret <2 x i64> %g
886 define <2 x i16> @vwmul_v2i16_multiuse(ptr %x, ptr %y, ptr %z, ptr %w) {
887 ; CHECK-LABEL: vwmul_v2i16_multiuse:
888 ; CHECK:       # %bb.0:
889 ; CHECK-NEXT:    vsetivli zero, 2, e16, mf4, ta, ma
890 ; CHECK-NEXT:    vle8.v v8, (a0)
891 ; CHECK-NEXT:    vle8.v v9, (a1)
892 ; CHECK-NEXT:    vle8.v v10, (a2)
893 ; CHECK-NEXT:    vle8.v v11, (a3)
894 ; CHECK-NEXT:    vsext.vf2 v12, v8
895 ; CHECK-NEXT:    vsext.vf2 v8, v9
896 ; CHECK-NEXT:    vsext.vf2 v9, v10
897 ; CHECK-NEXT:    vsext.vf2 v10, v11
898 ; CHECK-NEXT:    vmul.vv v11, v12, v10
899 ; CHECK-NEXT:    vmul.vv v10, v8, v10
900 ; CHECK-NEXT:    vdivu.vv v8, v8, v9
901 ; CHECK-NEXT:    vor.vv v9, v11, v10
902 ; CHECK-NEXT:    vor.vv v8, v9, v8
903 ; CHECK-NEXT:    ret
904   %a = load <2 x i8>, ptr %x
905   %b = load <2 x i8>, ptr %y
906   %c = load <2 x i8>, ptr %z
907   %d = load <2 x i8>, ptr %w
909   %as = sext <2 x i8> %a to <2 x i16>
910   %bs = sext <2 x i8> %b to <2 x i16>
911   %cs = sext <2 x i8> %c to <2 x i16>
912   %ds = sext <2 x i8> %d to <2 x i16>
914   %e = mul <2 x i16> %as, %ds
915   %f = mul <2 x i16> %bs, %ds ; shares 1 use with %e
916   %g = udiv <2 x i16> %bs, %cs ; shares 1 use with %f, and no uses with %e
918   %h = or <2 x i16> %e, %f
919   %i = or <2 x i16> %h, %g
920   ret <2 x i16> %i