@@ -3514,6 +3514,92 @@ define <vscale x 4 x i32> @vslidedown_vi(<vscale x 4 x i32> %a, iXLen %vl) {
3514
3514
ret <vscale x 4 x i32 > %2
3515
3515
}
3516
3516
3517
+ define <vscale x 4 x i32 > @vslide1up_vx (<vscale x 4 x i32 > %a , iXLen %b , iXLen %vl ) {
3518
+ ; NOVLOPT-LABEL: vslide1up_vx:
3519
+ ; NOVLOPT: # %bb.0:
3520
+ ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
3521
+ ; NOVLOPT-NEXT: vslide1up.vx v10, v8, a0
3522
+ ; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
3523
+ ; NOVLOPT-NEXT: vadd.vv v8, v10, v10
3524
+ ; NOVLOPT-NEXT: ret
3525
+ ;
3526
+ ; VLOPT-LABEL: vslide1up_vx:
3527
+ ; VLOPT: # %bb.0:
3528
+ ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
3529
+ ; VLOPT-NEXT: vslide1up.vx v10, v8, a0
3530
+ ; VLOPT-NEXT: vadd.vv v8, v10, v10
3531
+ ; VLOPT-NEXT: ret
3532
+ %1 = call <vscale x 4 x i32 > @llvm.riscv.vslide1up (<vscale x 4 x i32 > poison, <vscale x 4 x i32 > %a , iXLen %b , iXLen -1 )
3533
+ %2 = call <vscale x 4 x i32 > @llvm.riscv.vadd (<vscale x 4 x i32 > poison, <vscale x 4 x i32 > %1 , <vscale x 4 x i32 > %1 , iXLen %vl )
3534
+ ret <vscale x 4 x i32 > %2
3535
+ }
3536
+
3537
+ define <vscale x 4 x float > @vfslide1up_vf (<vscale x 4 x float > %a , float %b , iXLen %vl ) {
3538
+ ; NOVLOPT-LABEL: vfslide1up_vf:
3539
+ ; NOVLOPT: # %bb.0:
3540
+ ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3541
+ ; NOVLOPT-NEXT: vfslide1up.vf v10, v8, fa0
3542
+ ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3543
+ ; NOVLOPT-NEXT: vfadd.vv v8, v10, v10
3544
+ ; NOVLOPT-NEXT: ret
3545
+ ;
3546
+ ; VLOPT-LABEL: vfslide1up_vf:
3547
+ ; VLOPT: # %bb.0:
3548
+ ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3549
+ ; VLOPT-NEXT: vfslide1up.vf v10, v8, fa0
3550
+ ; VLOPT-NEXT: vfadd.vv v8, v10, v10
3551
+ ; VLOPT-NEXT: ret
3552
+ %1 = call <vscale x 4 x float > @llvm.riscv.vfslide1up (<vscale x 4 x float > poison, <vscale x 4 x float > %a , float %b , iXLen -1 )
3553
+ %2 = call <vscale x 4 x float > @llvm.riscv.vfadd (<vscale x 4 x float > poison, <vscale x 4 x float > %1 , <vscale x 4 x float > %1 , iXLen 7 , iXLen %vl )
3554
+ ret <vscale x 4 x float > %2
3555
+ }
3556
+
3557
+ ; Negative test – not safe to reduce vl
3558
+
3559
+ define <vscale x 4 x i32 > @vslide1down_vx (<vscale x 4 x i32 > %a , iXLen %b , iXLen %vl ) {
3560
+ ; NOVLOPT-LABEL: vslide1down_vx:
3561
+ ; NOVLOPT: # %bb.0:
3562
+ ; NOVLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
3563
+ ; NOVLOPT-NEXT: vslide1down.vx v8, v8, a0
3564
+ ; NOVLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
3565
+ ; NOVLOPT-NEXT: vadd.vv v8, v8, v8
3566
+ ; NOVLOPT-NEXT: ret
3567
+ ;
3568
+ ; VLOPT-LABEL: vslide1down_vx:
3569
+ ; VLOPT: # %bb.0:
3570
+ ; VLOPT-NEXT: vsetvli a2, zero, e32, m2, ta, ma
3571
+ ; VLOPT-NEXT: vslide1down.vx v8, v8, a0
3572
+ ; VLOPT-NEXT: vsetvli zero, a1, e32, m2, ta, ma
3573
+ ; VLOPT-NEXT: vadd.vv v8, v8, v8
3574
+ ; VLOPT-NEXT: ret
3575
+ %1 = call <vscale x 4 x i32 > @llvm.riscv.vslide1down (<vscale x 4 x i32 > poison, <vscale x 4 x i32 > %a , iXLen %b , iXLen -1 )
3576
+ %2 = call <vscale x 4 x i32 > @llvm.riscv.vadd (<vscale x 4 x i32 > poison, <vscale x 4 x i32 > %1 , <vscale x 4 x i32 > %1 , iXLen %vl )
3577
+ ret <vscale x 4 x i32 > %2
3578
+ }
3579
+
3580
+ ; Negative test – not safe to reduce vl
3581
+
3582
+ define <vscale x 4 x float > @vfslide1down_vf (<vscale x 4 x float > %a , float %b , iXLen %vl ) {
3583
+ ; NOVLOPT-LABEL: vfslide1down_vf:
3584
+ ; NOVLOPT: # %bb.0:
3585
+ ; NOVLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3586
+ ; NOVLOPT-NEXT: vfslide1down.vf v8, v8, fa0
3587
+ ; NOVLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3588
+ ; NOVLOPT-NEXT: vfadd.vv v8, v8, v8
3589
+ ; NOVLOPT-NEXT: ret
3590
+ ;
3591
+ ; VLOPT-LABEL: vfslide1down_vf:
3592
+ ; VLOPT: # %bb.0:
3593
+ ; VLOPT-NEXT: vsetvli a1, zero, e32, m2, ta, ma
3594
+ ; VLOPT-NEXT: vfslide1down.vf v8, v8, fa0
3595
+ ; VLOPT-NEXT: vsetvli zero, a0, e32, m2, ta, ma
3596
+ ; VLOPT-NEXT: vfadd.vv v8, v8, v8
3597
+ ; VLOPT-NEXT: ret
3598
+ %1 = call <vscale x 4 x float > @llvm.riscv.vfslide1down (<vscale x 4 x float > poison, <vscale x 4 x float > %a , float %b , iXLen -1 )
3599
+ %2 = call <vscale x 4 x float > @llvm.riscv.vfadd (<vscale x 4 x float > poison, <vscale x 4 x float > %1 , <vscale x 4 x float > %1 , iXLen 7 , iXLen %vl )
3600
+ ret <vscale x 4 x float > %2
3601
+ }
3602
+
3517
3603
define <vscale x 4 x float > @vfadd_vv (<vscale x 4 x float > %a , <vscale x 4 x float > %b , iXLen %vl ) {
3518
3604
; NOVLOPT-LABEL: vfadd_vv:
3519
3605
; NOVLOPT: # %bb.0:
0 commit comments