Skip to content

Commit ff8e44c

Browse files
ghehglanza
authored andcommitted
[CIR][CIRGen][Builtin][Neon] Lower neon_vaddvq_u32 and neon_vaddvq_u64 (#1225)
1 parent 5c50ed9 commit ff8e44c

File tree

2 files changed

+26
-5
lines changed

2 files changed

+26
-5
lines changed

clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2654,6 +2654,7 @@ static mlir::Value emitCommonNeonSISDBuiltinExpr(
26542654
unsigned builtinID = info.BuiltinID;
26552655
clang::CIRGen::CIRGenBuilderTy &builder = cgf.getBuilder();
26562656
mlir::Type resultTy = cgf.convertType(expr->getType());
2657+
mlir::Type argTy = cgf.convertType(expr->getArg(0)->getType());
26572658
mlir::Location loc = cgf.getLoc(expr->getExprLoc());
26582659

26592660
switch (builtinID) {
@@ -2672,11 +2673,9 @@ static mlir::Value emitCommonNeonSISDBuiltinExpr(
26722673
llvm_unreachable(" neon_vaddlv_u32 NYI ");
26732674
case NEON::BI__builtin_neon_vaddlvq_s32:
26742675
llvm_unreachable(" neon_vaddlvq_s32 NYI ");
2675-
case NEON::BI__builtin_neon_vaddlvq_u32: {
2676-
mlir::Type argTy = cgf.convertType(expr->getArg(0)->getType());
2676+
case NEON::BI__builtin_neon_vaddlvq_u32:
26772677
return emitNeonCall(builder, {argTy}, ops, "aarch64.neon.uaddlv", resultTy,
26782678
loc);
2679-
}
26802679
case NEON::BI__builtin_neon_vaddv_f32:
26812680
llvm_unreachable(" neon_vaddv_f32 NYI ");
26822681
case NEON::BI__builtin_neon_vaddv_s32:
@@ -2692,9 +2691,9 @@ static mlir::Value emitCommonNeonSISDBuiltinExpr(
26922691
case NEON::BI__builtin_neon_vaddvq_s64:
26932692
llvm_unreachable(" neon_vaddvq_s64 NYI ");
26942693
case NEON::BI__builtin_neon_vaddvq_u32:
2695-
llvm_unreachable(" neon_vaddvq_u32 NYI ");
26962694
case NEON::BI__builtin_neon_vaddvq_u64:
2697-
llvm_unreachable(" neon_vaddvq_u64 NYI ");
2695+
return emitNeonCall(builder, {argTy}, ops, "aarch64.neon.uaddv", resultTy,
2696+
loc);
26982697
case NEON::BI__builtin_neon_vcaged_f64:
26992698
llvm_unreachable(" neon_vcaged_f64 NYI ");
27002699
case NEON::BI__builtin_neon_vcages_f32:

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -919,3 +919,25 @@ int16_t test_vaddv_s16(int16x4_t a) {
919919
// LLVM-NEXT: [[TMP0:%.*]] = trunc i32 [[VADDV_I]] to i16
920920
// LLVM-NEXT: ret i16 [[TMP0]]
921921
}
922+
923+
uint32_t test_vaddvq_u32(uint32x4_t a) {
924+
return vaddvq_u32(a);
925+
926+
// CIR-LABEL: vaddvq_u32
927+
// CIR: cir.llvm.intrinsic "aarch64.neon.uaddv" {{%.*}} : (!cir.vector<!u32i x 4>) -> !u32i
928+
929+
// LLVM-LABEL: test_vaddvq_u32
930+
// LLVM: [[VADDVQ_U32_I:%.*]] = call i32 @llvm.aarch64.neon.uaddv.i32.v4i32(<4 x i32> {{%.*}})
931+
// LLVM: ret i32 [[VADDVQ_U32_I]]
932+
}
933+
934+
uint64_t test_vaddvq_u64(uint64x2_t a) {
935+
return vaddvq_u64(a);
936+
937+
// CIR-LABEL: vaddvq_u64
938+
// CIR: cir.llvm.intrinsic "aarch64.neon.uaddv" {{%.*}} : (!cir.vector<!u64i x 2>) -> !u64i
939+
940+
// LLVM-LABEL: test_vaddvq_u64
941+
// LLVM: [[VADDVQ_U64_I:%.*]] = call i64 @llvm.aarch64.neon.uaddv.i64.v2i64(<2 x i64> {{%.*}})
942+
// LLVM: ret i64 [[VADDVQ_U64_I]]
943+
}

0 commit comments

Comments
 (0)