@@ -255,3 +255,120 @@ entry:
255
255
%out = mul nsw <8 x i16 > %broadcast.splat , %ext.b
256
256
ret <8 x i16 > %out
257
257
}
258
+
259
+ define <8 x i16 > @shufsext_v8i8_v8i16 (<8 x i8 > %src , <8 x i8 > %b ) {
260
+ ; CHECK-LABEL: shufsext_v8i8_v8i16:
261
+ ; CHECK: // %bb.0: // %entry
262
+ ; CHECK-NEXT: sshll v0.8h, v0.8b, #0
263
+ ; CHECK-NEXT: sshll v1.8h, v1.8b, #0
264
+ ; CHECK-NEXT: rev64 v0.8h, v0.8h
265
+ ; CHECK-NEXT: ext v0.16b, v0.16b, v0.16b, #8
266
+ ; CHECK-NEXT: mul v0.8h, v0.8h, v1.8h
267
+ ; CHECK-NEXT: ret
268
+ entry:
269
+ %in = sext <8 x i8 > %src to <8 x i16 >
270
+ %ext.b = sext <8 x i8 > %b to <8 x i16 >
271
+ %shuf = shufflevector <8 x i16 > %in , <8 x i16 > undef , <8 x i32 > <i32 7 , i32 6 , i32 5 , i32 4 , i32 3 , i32 2 , i32 1 , i32 0 >
272
+ %out = mul nsw <8 x i16 > %shuf , %ext.b
273
+ ret <8 x i16 > %out
274
+ }
275
+
276
+ define <2 x i64 > @shufsext_v2i32_v2i64 (<2 x i32 > %src , <2 x i32 > %b ) {
277
+ ; CHECK-LABEL: shufsext_v2i32_v2i64:
278
+ ; CHECK: // %bb.0: // %entry
279
+ ; CHECK-NEXT: sshll v0.2d, v0.2s, #0
280
+ ; CHECK-NEXT: sshll v1.2d, v1.2s, #0
281
+ ; CHECK-NEXT: ext v0.16b, v0.16b, v0.16b, #8
282
+ ; CHECK-NEXT: fmov x9, d1
283
+ ; CHECK-NEXT: mov x8, v1.d[1]
284
+ ; CHECK-NEXT: fmov x10, d0
285
+ ; CHECK-NEXT: mov x11, v0.d[1]
286
+ ; CHECK-NEXT: mul x9, x10, x9
287
+ ; CHECK-NEXT: mul x8, x11, x8
288
+ ; CHECK-NEXT: fmov d0, x9
289
+ ; CHECK-NEXT: mov v0.d[1], x8
290
+ ; CHECK-NEXT: ret
291
+ entry:
292
+ %in = sext <2 x i32 > %src to <2 x i64 >
293
+ %ext.b = sext <2 x i32 > %b to <2 x i64 >
294
+ %shuf = shufflevector <2 x i64 > %in , <2 x i64 > undef , <2 x i32 > <i32 1 , i32 0 >
295
+ %out = mul nsw <2 x i64 > %shuf , %ext.b
296
+ ret <2 x i64 > %out
297
+ }
298
+
299
+ define <8 x i16 > @shufzext_v8i8_v8i16 (<8 x i8 > %src , <8 x i8 > %b ) {
300
+ ; CHECK-LABEL: shufzext_v8i8_v8i16:
301
+ ; CHECK: // %bb.0: // %entry
302
+ ; CHECK-NEXT: ushll v0.8h, v0.8b, #0
303
+ ; CHECK-NEXT: ushll v1.8h, v1.8b, #0
304
+ ; CHECK-NEXT: rev64 v0.8h, v0.8h
305
+ ; CHECK-NEXT: ext v0.16b, v0.16b, v0.16b, #8
306
+ ; CHECK-NEXT: mul v0.8h, v0.8h, v1.8h
307
+ ; CHECK-NEXT: ret
308
+ entry:
309
+ %in = zext <8 x i8 > %src to <8 x i16 >
310
+ %ext.b = zext <8 x i8 > %b to <8 x i16 >
311
+ %shuf = shufflevector <8 x i16 > %in , <8 x i16 > undef , <8 x i32 > <i32 7 , i32 6 , i32 5 , i32 4 , i32 3 , i32 2 , i32 1 , i32 0 >
312
+ %out = mul nsw <8 x i16 > %shuf , %ext.b
313
+ ret <8 x i16 > %out
314
+ }
315
+
316
+ define <2 x i64 > @shufzext_v2i32_v2i64 (<2 x i32 > %src , <2 x i32 > %b ) {
317
+ ; CHECK-LABEL: shufzext_v2i32_v2i64:
318
+ ; CHECK: // %bb.0: // %entry
319
+ ; CHECK-NEXT: sshll v0.2d, v0.2s, #0
320
+ ; CHECK-NEXT: sshll v1.2d, v1.2s, #0
321
+ ; CHECK-NEXT: ext v0.16b, v0.16b, v0.16b, #8
322
+ ; CHECK-NEXT: fmov x9, d1
323
+ ; CHECK-NEXT: mov x8, v1.d[1]
324
+ ; CHECK-NEXT: fmov x10, d0
325
+ ; CHECK-NEXT: mov x11, v0.d[1]
326
+ ; CHECK-NEXT: mul x9, x10, x9
327
+ ; CHECK-NEXT: mul x8, x11, x8
328
+ ; CHECK-NEXT: fmov d0, x9
329
+ ; CHECK-NEXT: mov v0.d[1], x8
330
+ ; CHECK-NEXT: ret
331
+ entry:
332
+ %in = sext <2 x i32 > %src to <2 x i64 >
333
+ %ext.b = sext <2 x i32 > %b to <2 x i64 >
334
+ %shuf = shufflevector <2 x i64 > %in , <2 x i64 > undef , <2 x i32 > <i32 1 , i32 0 >
335
+ %out = mul nsw <2 x i64 > %shuf , %ext.b
336
+ ret <2 x i64 > %out
337
+ }
338
+
339
+ define <8 x i16 > @shufzext_v8i8_v8i16_twoin (<8 x i8 > %src1 , <8 x i8 > %src2 , <8 x i8 > %b ) {
340
+ ; CHECK-LABEL: shufzext_v8i8_v8i16_twoin:
341
+ ; CHECK: // %bb.0: // %entry
342
+ ; CHECK-NEXT: ushll v0.8h, v0.8b, #0
343
+ ; CHECK-NEXT: ushll v1.8h, v1.8b, #0
344
+ ; CHECK-NEXT: trn1 v0.8h, v0.8h, v1.8h
345
+ ; CHECK-NEXT: ushll v1.8h, v2.8b, #0
346
+ ; CHECK-NEXT: mul v0.8h, v0.8h, v1.8h
347
+ ; CHECK-NEXT: ret
348
+ entry:
349
+ %in1 = zext <8 x i8 > %src1 to <8 x i16 >
350
+ %in2 = zext <8 x i8 > %src2 to <8 x i16 >
351
+ %ext.b = zext <8 x i8 > %b to <8 x i16 >
352
+ %shuf = shufflevector <8 x i16 > %in1 , <8 x i16 > %in2 , <8 x i32 > <i32 0 , i32 8 , i32 2 , i32 10 , i32 4 , i32 12 , i32 6 , i32 14 >
353
+ %out = mul nsw <8 x i16 > %shuf , %ext.b
354
+ ret <8 x i16 > %out
355
+ }
356
+
357
+ define <8 x i16 > @shufszext_v8i8_v8i16_twoin (<8 x i8 > %src1 , <8 x i8 > %src2 , <8 x i8 > %b ) {
358
+ ; CHECK-LABEL: shufszext_v8i8_v8i16_twoin:
359
+ ; CHECK: // %bb.0: // %entry
360
+ ; CHECK-NEXT: ushll v0.8h, v0.8b, #0
361
+ ; CHECK-NEXT: sshll v1.8h, v1.8b, #0
362
+ ; CHECK-NEXT: trn1 v0.8h, v0.8h, v1.8h
363
+ ; CHECK-NEXT: ushll v1.8h, v2.8b, #0
364
+ ; CHECK-NEXT: mul v0.8h, v0.8h, v1.8h
365
+ ; CHECK-NEXT: ret
366
+ entry:
367
+ %in1 = zext <8 x i8 > %src1 to <8 x i16 >
368
+ %in2 = sext <8 x i8 > %src2 to <8 x i16 >
369
+ %ext.b = zext <8 x i8 > %b to <8 x i16 >
370
+ %shuf = shufflevector <8 x i16 > %in1 , <8 x i16 > %in2 , <8 x i32 > <i32 0 , i32 8 , i32 2 , i32 10 , i32 4 , i32 12 , i32 6 , i32 14 >
371
+ %out = mul nsw <8 x i16 > %shuf , %ext.b
372
+ ret <8 x i16 > %out
373
+ }
374
+
0 commit comments