Skip to content

Commit 7522d50

Browse files
authored
[CIR][CIRGen][Builtin][Neon] Lower neon_vqmovn_v (#1071)
1 parent 2d4ba15 commit 7522d50

File tree

2 files changed

+82
-0
lines changed

2 files changed

+82
-0
lines changed

clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -2518,6 +2518,16 @@ mlir::Value CIRGenFunction::buildCommonNeonBuiltinExpr(
25182518
: "aarch64.neon.shadd";
25192519
break;
25202520
}
2521+
2522+
case NEON::BI__builtin_neon_vqmovn_v: {
2523+
intrincsName = (intrinicId != altLLVMIntrinsic) ? "aarch64.neon.uqxtn"
2524+
: "aarch64.neon.sqxtn";
2525+
argTypes.push_back(builder.getExtendedOrTruncatedElementVectorType(
2526+
vTy, true /* extended */,
2527+
mlir::cast<mlir::cir::IntType>(vTy.getEltType()).isSigned()));
2528+
break;
2529+
}
2530+
25212531
case NEON::BI__builtin_neon_vqmovun_v: {
25222532
intrincsName = "aarch64.neon.sqxtun";
25232533
argTypes.push_back(builder.getExtendedOrTruncatedElementVectorType(

clang/test/CIR/CodeGen/AArch64/neon-misc.c

+72
Original file line numberDiff line numberDiff line change
@@ -788,3 +788,75 @@ uint64x2_t test_vtstq_u64(uint64x2_t v1, uint64x2_t v2) {
788788
// LLVM: [[VTST_I:%.*]] = sext <2 x i1> [[TMP3]] to <2 x i64>
789789
// LLVM: ret <2 x i64> [[VTST_I]]
790790
}
791+
792+
int8x8_t test_vqmovn_s16(int16x8_t a) {
793+
return vqmovn_s16(a);
794+
795+
// CIR-LABEL: vqmovn_s16
796+
// {{%.*}} = cir.llvm.intrinsic "aarch64.neon.sqxtn" {{%.*}} : (!cir.vector<!s16i x 8>) -> !cir.vector<!s8i x 8>
797+
798+
// LLVM: {{.*}}@test_vqmovn_s16(<8 x i16>{{.*}}[[A:%[a-z0-9]+]])
799+
// LLVM: [[TMP0:%.*]] = bitcast <8 x i16> [[A]] to <16 x i8>
800+
// LLVM: [[VQMOVN_V1_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.sqxtn.v8i8(<8 x i16> [[A]])
801+
// LLVM: ret <8 x i8> [[VQMOVN_V1_I]]
802+
}
803+
804+
int16x4_t test_vqmovn_s32(int32x4_t a) {
805+
return vqmovn_s32(a);
806+
807+
// CIR-LABEL: vqmovn_s32
808+
// {{%.*}} = cir.llvm.intrinsic "aarch64.neon.sqxtn" {{%.*}} : (!cir.vector<!s32i x 4>) -> !cir.vector<!s16i x 4>
809+
810+
// LLVM: {{.*}}@test_vqmovn_s32(<4 x i32>{{.*}}[[A:%[a-z0-9]+]])
811+
// LLVM: [[TMP0:%.*]] = bitcast <4 x i32> [[A]] to <16 x i8>
812+
// LLVM: [[VQMOVN_V1_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.sqxtn.v4i16(<4 x i32> [[A]])
813+
// LLVM: ret <4 x i16> [[VQMOVN_V1_I]]
814+
}
815+
816+
int32x2_t test_vqmovn_s64(int64x2_t a) {
817+
return vqmovn_s64(a);
818+
819+
// CIR-LABEL: vqmovn_s64
820+
// {{%.*}} = cir.llvm.intrinsic "aarch64.neon.sqxtn" {{%.*}} : (!cir.vector<!s64i x 2>) -> !cir.vector<!s32i x 2>
821+
822+
// LLVM: {{.*}}@test_vqmovn_s64(<2 x i64>{{.*}}[[A:%[a-z0-9]+]])
823+
// LLVM: [[TMP0:%.*]] = bitcast <2 x i64> [[A]] to <16 x i8>
824+
// LLVM: [[VQMOVN_V1_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.sqxtn.v2i32(<2 x i64> [[A]])
825+
// LLVM: ret <2 x i32> [[VQMOVN_V1_I]]
826+
}
827+
828+
uint8x8_t test_vqmovn_u16(uint16x8_t a) {
829+
return vqmovn_u16(a);
830+
831+
// CIR-LABEL: vqmovn_u16
832+
// {{%.*}} = cir.llvm.intrinsic "aarch64.neon.uqxtn" {{%.*}} : (!cir.vector<!u16i x 8>) -> !cir.vector<!u8i x 8>
833+
834+
// LLVM: {{.*}}@test_vqmovn_u16(<8 x i16>{{.*}}[[A:%[a-z0-9]+]])
835+
// LLVM: [[TMP0:%.*]] = bitcast <8 x i16> [[A]] to <16 x i8>
836+
// LLVM: [[VQMOVN_V1_I:%.*]] = call <8 x i8> @llvm.aarch64.neon.uqxtn.v8i8(<8 x i16> [[A]])
837+
// LLVM: ret <8 x i8> [[VQMOVN_V1_I]]
838+
}
839+
840+
uint16x4_t test_vqmovn_u32(uint32x4_t a) {
841+
return vqmovn_u32(a);
842+
843+
// CIR-LABEL: vqmovn_u32
844+
// {{%.*}} = cir.llvm.intrinsic "aarch64.neon.uqxtn" {{%.*}} : (!cir.vector<!u32i x 4>) -> !cir.vector<!u16i x 4>
845+
846+
// LLVM: {{.*}}@test_vqmovn_u32(<4 x i32>{{.*}}[[A:%[a-z0-9]+]])
847+
// LLVM: [[TMP0:%.*]] = bitcast <4 x i32> [[A]] to <16 x i8>
848+
// LLVM: [[VQMOVN_V1_I:%.*]] = call <4 x i16> @llvm.aarch64.neon.uqxtn.v4i16(<4 x i32> [[A]])
849+
// LLVM: ret <4 x i16> [[VQMOVN_V1_I]]
850+
}
851+
852+
uint32x2_t test_vqmovn_u64(uint64x2_t a) {
853+
return vqmovn_u64(a);
854+
855+
// CIR-LABEL: vqmovn_u64
856+
// {{%.*}} = cir.llvm.intrinsic "aarch64.neon.uqxtn" {{%.*}} : (!cir.vector<!u64i x 2>) -> !cir.vector<!u32i x 2>
857+
858+
// LLVM: {{.*}}@test_vqmovn_u64(<2 x i64>{{.*}}[[A:%[a-z0-9]+]])
859+
// LLVM: [[TMP0:%.*]] = bitcast <2 x i64> [[A]] to <16 x i8>
860+
// LLVM: [[VQMOVN_V1_I:%.*]] = call <2 x i32> @llvm.aarch64.neon.uqxtn.v2i32(<2 x i64> [[A]])
861+
// LLVM: ret <2 x i32> [[VQMOVN_V1_I]]
862+
}

0 commit comments

Comments
 (0)