Skip to content

Commit d1535f3

Browse files
AmrDeveloperlanza
authored andcommitted
[CIR][CIRGen][Builtin][Neon] Lower neon_vaddlv s16 and u16 (llvm#1352)
Lower `neon_vaddlv_s16` and `neon_vaddlv_u16`
1 parent 8944243 commit d1535f3

File tree

2 files changed

+32
-4
lines changed

2 files changed

+32
-4
lines changed

clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4375,9 +4375,6 @@ CIRGenFunction::emitAArch64BuiltinExpr(unsigned BuiltinID, const CallExpr *E,
43754375
case NEON::BI__builtin_neon_vaddlv_u8: {
43764376
llvm_unreachable("NEON::BI__builtin_neon_vaddlv_u8 NYI");
43774377
}
4378-
case NEON::BI__builtin_neon_vaddlv_u16: {
4379-
llvm_unreachable("NEON::BI__builtin_neon_vaddlv_u16 NYI");
4380-
}
43814378
case NEON::BI__builtin_neon_vaddlvq_u8: {
43824379
llvm_unreachable("NEON::BI__builtin_neon_vaddlvq_u8 NYI");
43834380
}
@@ -4395,8 +4392,16 @@ CIRGenFunction::emitAArch64BuiltinExpr(unsigned BuiltinID, const CallExpr *E,
43954392
case NEON::BI__builtin_neon_vaddlv_s8: {
43964393
llvm_unreachable("NEON::BI__builtin_neon_vaddlv_s8 NYI");
43974394
}
4395+
case NEON::BI__builtin_neon_vaddlv_u16:
4396+
usgn = true;
4397+
[[fallthrough]];
43984398
case NEON::BI__builtin_neon_vaddlv_s16: {
4399-
llvm_unreachable("NEON::BI__builtin_neon_vaddlv_s16 NYI");
4399+
mlir::Type argTy = cir::VectorType::get(builder.getContext(),
4400+
usgn ? UInt16Ty : SInt16Ty, 4);
4401+
llvm::SmallVector<mlir::Value, 1> argOps = {emitScalarExpr(E->getArg(0))};
4402+
return emitNeonCall(builder, {argTy}, argOps,
4403+
usgn ? "aarch64.neon.uaddlv" : "aarch64.neon.saddlv",
4404+
usgn ? UInt32Ty : SInt32Ty, getLoc(E->getExprLoc()));
44004405
}
44014406
case NEON::BI__builtin_neon_vaddlvq_s8: {
44024407
llvm_unreachable("NEON::BI__builtin_neon_vaddlvq_s8 NYI");

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -906,6 +906,29 @@ int32_t test_vaddlvq_s16(int16x8_t a) {
906906
// LLVM: ret i32 [[VADDLV_I]]
907907
}
908908

909+
910+
int32_t test_vaddlv_s16(int16x4_t a) {
911+
return vaddlv_s16(a);
912+
913+
// CIR-LABEL: vaddlv_s16
914+
// CIR: cir.llvm.intrinsic "aarch64.neon.saddlv" {{%.*}}: (!cir.vector<!s16i x 4>) -> !s32i
915+
916+
// LLVM: {{.*}}test_vaddlv_s16(<4 x i16>{{.*}}[[A:%.*]])
917+
// LLVM: [[VADDLV_I:%.*]] = call i32 @llvm.aarch64.neon.saddlv.i32.v4i16(<4 x i16> [[A]])
918+
// LLVM: ret i32 [[VADDLV_I]]
919+
}
920+
921+
int32_t test_vaddlv_u16(uint16x4_t a) {
922+
return vaddlv_u16(a);
923+
924+
// CIR-LABEL: vaddlv_u16
925+
// CIR: cir.llvm.intrinsic "aarch64.neon.uaddlv" {{%.*}}: (!cir.vector<!u16i x 4>) -> !u32i
926+
927+
// LLVM: {{.*}}test_vaddlv_u16(<4 x i16>{{.*}}[[A:%.*]])
928+
// LLVM: [[VADDLV_I:%.*]] = call i32 @llvm.aarch64.neon.uaddlv.i32.v4i16(<4 x i16> [[A]])
929+
// LLVM: ret i32 [[VADDLV_I]]
930+
}
931+
909932
uint16_t test_vaddv_u16(uint16x4_t a) {
910933
return vaddv_u16(a);
911934

0 commit comments

Comments
 (0)