Skip to content

Commit a0fe0fb

Browse files
authored
[CIR][CIRGen][Builtin][Neon] Lower neon_vaddlv s16 and u16 (#1352)
Lower `neon_vaddlv_s16` and `neon_vaddlv_u16`
1 parent 13a8b5d commit a0fe0fb

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
@@ -905,6 +905,29 @@ int32_t test_vaddlvq_s16(int16x8_t a) {
905905
// LLVM: ret i32 [[VADDLV_I]]
906906
}
907907

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

0 commit comments

Comments
 (0)