@@ -894,3 +894,79 @@ entry:
894894 store <1 x i32 > %m , ptr %p
895895 ret void
896896}
897+
898+
899+ define <16 x i8 > @or_rshrn_v16i16_7 (<16 x i16 > %a ) {
900+ ; CHECK-LABEL: or_rshrn_v16i16_7:
901+ ; CHECK: // %bb.0: // %entry
902+ ; CHECK-NEXT: shrn v0.8b, v0.8h, #7
903+ ; CHECK-NEXT: shrn2 v0.16b, v1.8h, #7
904+ ; CHECK-NEXT: ret
905+ entry:
906+ %b = or disjoint <16 x i16 > %a , <i16 64 , i16 64 , i16 64 , i16 64 , i16 64 , i16 64 , i16 64 , i16 64 , i16 64 , i16 64 , i16 64 , i16 64 , i16 64 , i16 64 , i16 64 , i16 64 >
907+ %s = lshr <16 x i16 > %b , <i16 7 , i16 7 , i16 7 , i16 7 , i16 7 , i16 7 , i16 7 , i16 7 , i16 7 , i16 7 , i16 7 , i16 7 , i16 7 , i16 7 , i16 7 , i16 7 >
908+ %m = trunc <16 x i16 > %s to <16 x i8 >
909+ ret <16 x i8 > %m
910+ }
911+
912+ define <16 x i8 > @or_rshrn_v16i16_8 (<16 x i16 > %a ) {
913+ ; CHECK-LABEL: or_rshrn_v16i16_8:
914+ ; CHECK: // %bb.0: // %entry
915+ ; CHECK-NEXT: uzp2 v0.16b, v0.16b, v1.16b
916+ ; CHECK-NEXT: ret
917+ entry:
918+ %b = or disjoint <16 x i16 > %a , <i16 128 , i16 128 , i16 128 , i16 128 , i16 128 , i16 128 , i16 128 , i16 128 , i16 128 , i16 128 , i16 128 , i16 128 , i16 128 , i16 128 , i16 128 , i16 128 >
919+ %s = lshr <16 x i16 > %b , <i16 8 , i16 8 , i16 8 , i16 8 , i16 8 , i16 8 , i16 8 , i16 8 , i16 8 , i16 8 , i16 8 , i16 8 , i16 8 , i16 8 , i16 8 , i16 8 >
920+ %m = trunc <16 x i16 > %s to <16 x i8 >
921+ ret <16 x i8 > %m
922+ }
923+
924+ define <8 x i16 > @or_rshrn_v8i32_15 (<8 x i32 > %a ) {
925+ ; CHECK-LABEL: or_rshrn_v8i32_15:
926+ ; CHECK: // %bb.0: // %entry
927+ ; CHECK-NEXT: shrn v0.4h, v0.4s, #15
928+ ; CHECK-NEXT: shrn2 v0.8h, v1.4s, #15
929+ ; CHECK-NEXT: ret
930+ entry:
931+ %b = or disjoint <8 x i32 > %a , <i32 16384 , i32 16384 , i32 16384 , i32 16384 , i32 16384 , i32 16384 , i32 16384 , i32 16384 >
932+ %s = lshr <8 x i32 > %b , <i32 15 , i32 15 , i32 15 , i32 15 , i32 15 , i32 15 , i32 15 , i32 15 >
933+ %m = trunc <8 x i32 > %s to <8 x i16 >
934+ ret <8 x i16 > %m
935+ }
936+
937+ define <8 x i16 > @or_rshrn_v8i32_16 (<8 x i32 > %a ) {
938+ ; CHECK-LABEL: or_rshrn_v8i32_16:
939+ ; CHECK: // %bb.0: // %entry
940+ ; CHECK-NEXT: uzp2 v0.8h, v0.8h, v1.8h
941+ ; CHECK-NEXT: ret
942+ entry:
943+ %b = or disjoint <8 x i32 > %a , <i32 32768 , i32 32768 , i32 32768 , i32 32768 , i32 32768 , i32 32768 , i32 32768 , i32 32768 >
944+ %s = lshr <8 x i32 > %b , <i32 16 , i32 16 , i32 16 , i32 16 , i32 16 , i32 16 , i32 16 , i32 16 >
945+ %m = trunc <8 x i32 > %s to <8 x i16 >
946+ ret <8 x i16 > %m
947+ }
948+
949+ define <4 x i32 > @or_rshrn_v4i64_31 (<4 x i64 > %a ) {
950+ ; CHECK-LABEL: or_rshrn_v4i64_31:
951+ ; CHECK: // %bb.0: // %entry
952+ ; CHECK-NEXT: shrn v0.2s, v0.2d, #31
953+ ; CHECK-NEXT: shrn2 v0.4s, v1.2d, #31
954+ ; CHECK-NEXT: ret
955+ entry:
956+ %b = or disjoint <4 x i64 > %a , <i64 1073741824 , i64 1073741824 , i64 1073741824 , i64 1073741824 >
957+ %s = lshr <4 x i64 > %b , <i64 31 , i64 31 , i64 31 , i64 31 >
958+ %m = trunc <4 x i64 > %s to <4 x i32 >
959+ ret <4 x i32 > %m
960+ }
961+
962+ define <4 x i32 > @or_rshrn_v4i64_32 (<4 x i64 > %a ) {
963+ ; CHECK-LABEL: or_rshrn_v4i64_32:
964+ ; CHECK: // %bb.0: // %entry
965+ ; CHECK-NEXT: uzp2 v0.4s, v0.4s, v1.4s
966+ ; CHECK-NEXT: ret
967+ entry:
968+ %b = or disjoint <4 x i64 > %a , <i64 2147483648 , i64 2147483648 , i64 2147483648 , i64 2147483648 >
969+ %s = lshr <4 x i64 > %b , <i64 32 , i64 32 , i64 32 , i64 32 >
970+ %m = trunc <4 x i64 > %s to <4 x i32 >
971+ ret <4 x i32 > %m
972+ }
0 commit comments