@@ -3528,4 +3528,47 @@ entry:
3528
3528
ret void
3529
3529
}
3530
3530
3531
+ define <4 x i32 > @sext_rshrn (<4 x i32 > noundef %a ) {
3532
+ ; CHECK-LABEL: sext_rshrn:
3533
+ ; CHECK: // %bb.0: // %entry
3534
+ ; CHECK-NEXT: movi.4s v1, #16, lsl #8
3535
+ ; CHECK-NEXT: add.4s v0, v0, v1
3536
+ ; CHECK-NEXT: ushr.4s v0, v0, #13
3537
+ ; CHECK-NEXT: shl.4s v0, v0, #16
3538
+ ; CHECK-NEXT: sshr.4s v0, v0, #16
3539
+ ; CHECK-NEXT: ret
3540
+ entry:
3541
+ %vrshrn_n1 = tail call <4 x i16 > @llvm.aarch64.neon.rshrn.v4i16 (<4 x i32 > %a , i32 13 )
3542
+ %vmovl.i = sext <4 x i16 > %vrshrn_n1 to <4 x i32 >
3543
+ ret <4 x i32 > %vmovl.i
3544
+ }
3545
+
3546
+ define <4 x i32 > @zext_rshrn (<4 x i32 > noundef %a ) {
3547
+ ; CHECK-LABEL: zext_rshrn:
3548
+ ; CHECK: // %bb.0: // %entry
3549
+ ; CHECK-NEXT: movi.4s v1, #16, lsl #8
3550
+ ; CHECK-NEXT: add.4s v0, v0, v1
3551
+ ; CHECK-NEXT: ushr.4s v0, v0, #13
3552
+ ; CHECK-NEXT: bic.4s v0, #7, lsl #16
3553
+ ; CHECK-NEXT: ret
3554
+ entry:
3555
+ %vrshrn_n1 = tail call <4 x i16 > @llvm.aarch64.neon.rshrn.v4i16 (<4 x i32 > %a , i32 13 )
3556
+ %vmovl.i = zext <4 x i16 > %vrshrn_n1 to <4 x i32 >
3557
+ ret <4 x i32 > %vmovl.i
3558
+ }
3559
+
3560
+ define <4 x i16 > @mul_rshrn (<4 x i32 > noundef %a ) {
3561
+ ; CHECK-LABEL: mul_rshrn:
3562
+ ; CHECK: // %bb.0: // %entry
3563
+ ; CHECK-NEXT: mov w8, #4099 // =0x1003
3564
+ ; CHECK-NEXT: dup.4s v1, w8
3565
+ ; CHECK-NEXT: add.4s v0, v0, v1
3566
+ ; CHECK-NEXT: shrn.4h v0, v0, #13
3567
+ ; CHECK-NEXT: ret
3568
+ entry:
3569
+ %b = add <4 x i32 > %a , <i32 3 , i32 3 , i32 3 , i32 3 >
3570
+ %vrshrn_n1 = tail call <4 x i16 > @llvm.aarch64.neon.rshrn.v4i16 (<4 x i32 > %b , i32 13 )
3571
+ ret <4 x i16 > %vrshrn_n1
3572
+ }
3573
+
3531
3574
declare <2 x i64 > @llvm.aarch64.neon.addp.v2i64 (<2 x i64 >, <2 x i64 >)
0 commit comments