@@ -347,3 +347,94 @@ entry:
347347 store <2 x double > %shuffle.i5 , ptr %out , align 8
348348 ret void
349349}
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