@@ -347,3 +347,94 @@ entry:
347
347
store <2 x double > %shuffle.i5 , ptr %out , align 8
348
348
ret void
349
349
}
350
+
351
+ define void @vnsrl_0_i8_undef (ptr %in , ptr %out ) {
352
+ ; CHECK-LABEL: vnsrl_0_i8_undef:
353
+ ; CHECK: # %bb.0: # %entry
354
+ ; CHECK-NEXT: vsetivli zero, 16, e8, mf2, ta, ma
355
+ ; CHECK-NEXT: vle8.v v8, (a0)
356
+ ; CHECK-NEXT: vsetivli zero, 8, e8, mf4, ta, ma
357
+ ; CHECK-NEXT: vnsrl.wi v8, v8, 0
358
+ ; CHECK-NEXT: vse8.v v8, (a1)
359
+ ; CHECK-NEXT: ret
360
+ entry:
361
+ %0 = load <16 x i8 >, ptr %in , align 1
362
+ %shuffle.i5 = shufflevector <16 x i8 > %0 , <16 x i8 > poison, <8 x i32 > <i32 0 , i32 2 , i32 4 , i32 6 , i32 8 , i32 10 , i32 undef , i32 undef >
363
+ store <8 x i8 > %shuffle.i5 , ptr %out , align 1
364
+ ret void
365
+ }
366
+
367
+ define void @vnsrl_0_i8_undef2 (ptr %in , ptr %out ) {
368
+ ; CHECK-LABEL: vnsrl_0_i8_undef2:
369
+ ; CHECK: # %bb.0: # %entry
370
+ ; CHECK-NEXT: vsetivli zero, 16, e8, mf2, ta, ma
371
+ ; CHECK-NEXT: vle8.v v8, (a0)
372
+ ; CHECK-NEXT: vsetivli zero, 8, e8, mf4, ta, ma
373
+ ; CHECK-NEXT: vnsrl.wi v8, v8, 0
374
+ ; CHECK-NEXT: vse8.v v8, (a1)
375
+ ; CHECK-NEXT: ret
376
+ entry:
377
+ %0 = load <16 x i8 >, ptr %in , align 1
378
+ %shuffle.i5 = shufflevector <16 x i8 > %0 , <16 x i8 > poison, <8 x i32 > <i32 0 , i32 2 , i32 undef , i32 6 , i32 undef , i32 10 , i32 12 , i32 14 >
379
+ store <8 x i8 > %shuffle.i5 , ptr %out , align 1
380
+ ret void
381
+ }
382
+
383
+ ; TODO: Allow an undef initial element
384
+ define void @vnsrl_0_i8_undef3 (ptr %in , ptr %out ) {
385
+ ; CHECK-LABEL: vnsrl_0_i8_undef3:
386
+ ; CHECK: # %bb.0: # %entry
387
+ ; CHECK-NEXT: vsetivli zero, 16, e8, mf2, ta, ma
388
+ ; CHECK-NEXT: vle8.v v8, (a0)
389
+ ; CHECK-NEXT: lui a0, 24640
390
+ ; CHECK-NEXT: addi a0, a0, 6
391
+ ; CHECK-NEXT: vsetivli zero, 8, e32, m1, ta, ma
392
+ ; CHECK-NEXT: vmv.v.x v9, a0
393
+ ; CHECK-NEXT: vsetvli zero, zero, e8, mf4, ta, ma
394
+ ; CHECK-NEXT: vrgather.vv v10, v8, v9
395
+ ; CHECK-NEXT: vid.v v9
396
+ ; CHECK-NEXT: vadd.vv v9, v9, v9
397
+ ; CHECK-NEXT: vadd.vi v9, v9, -8
398
+ ; CHECK-NEXT: li a0, -32
399
+ ; CHECK-NEXT: vmv.s.x v0, a0
400
+ ; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
401
+ ; CHECK-NEXT: vslidedown.vi v8, v8, 8
402
+ ; CHECK-NEXT: vsetivli zero, 8, e8, mf4, ta, mu
403
+ ; CHECK-NEXT: vrgather.vv v10, v8, v9, v0.t
404
+ ; CHECK-NEXT: vse8.v v10, (a1)
405
+ ; CHECK-NEXT: ret
406
+ entry:
407
+ %0 = load <16 x i8 >, ptr %in , align 1
408
+ %shuffle.i5 = shufflevector <16 x i8 > %0 , <16 x i8 > poison, <8 x i32 > <i32 undef , i32 undef , i32 4 , i32 6 , i32 6 , i32 10 , i32 12 , i32 14 >
409
+ store <8 x i8 > %shuffle.i5 , ptr %out , align 1
410
+ ret void
411
+ }
412
+
413
+ ; Not a vnsrl (checking for a prior pattern matching bug)
414
+ define void @vnsrl_0_i8_undef_negative (ptr %in , ptr %out ) {
415
+ ; CHECK-LABEL: vnsrl_0_i8_undef_negative:
416
+ ; CHECK: # %bb.0: # %entry
417
+ ; CHECK-NEXT: vsetivli zero, 16, e8, mf2, ta, ma
418
+ ; CHECK-NEXT: vle8.v v8, (a0)
419
+ ; CHECK-NEXT: lui a0, %hi(.LCPI17_0)
420
+ ; CHECK-NEXT: addi a0, a0, %lo(.LCPI17_0)
421
+ ; CHECK-NEXT: vsetivli zero, 8, e8, mf4, ta, ma
422
+ ; CHECK-NEXT: vle8.v v9, (a0)
423
+ ; CHECK-NEXT: vrgather.vv v10, v8, v9
424
+ ; CHECK-NEXT: vid.v v9
425
+ ; CHECK-NEXT: vadd.vv v9, v9, v9
426
+ ; CHECK-NEXT: vadd.vi v9, v9, -8
427
+ ; CHECK-NEXT: li a0, 48
428
+ ; CHECK-NEXT: vmv.s.x v0, a0
429
+ ; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
430
+ ; CHECK-NEXT: vslidedown.vi v8, v8, 8
431
+ ; CHECK-NEXT: vsetivli zero, 8, e8, mf4, ta, mu
432
+ ; CHECK-NEXT: vrgather.vv v10, v8, v9, v0.t
433
+ ; CHECK-NEXT: vse8.v v10, (a1)
434
+ ; CHECK-NEXT: ret
435
+ entry:
436
+ %0 = load <16 x i8 >, ptr %in , align 1
437
+ %shuffle.i5 = shufflevector <16 x i8 > %0 , <16 x i8 > poison, <8 x i32 > <i32 0 , i32 2 , i32 4 , i32 6 , i32 8 , i32 10 , i32 undef , i32 1 >
438
+ store <8 x i8 > %shuffle.i5 , ptr %out , align 1
439
+ ret void
440
+ }
0 commit comments