Skip to content

Commit 177d89b

Browse files
authored
[CIR][CIRGen][Builtin][Neon] Lower neon_vaddvq_u32 and neon_vaddvq_u64 (#1225)
1 parent 568b515 commit 177d89b

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
@@ -2656,6 +2656,7 @@ static mlir::Value emitCommonNeonSISDBuiltinExpr(
26562656
unsigned builtinID = info.BuiltinID;
26572657
clang::CIRGen::CIRGenBuilderTy &builder = cgf.getBuilder();
26582658
mlir::Type resultTy = cgf.convertType(expr->getType());
2659+
mlir::Type argTy = cgf.convertType(expr->getArg(0)->getType());
26592660
mlir::Location loc = cgf.getLoc(expr->getExprLoc());
26602661

26612662
switch (builtinID) {
@@ -2674,11 +2675,9 @@ static mlir::Value emitCommonNeonSISDBuiltinExpr(
26742675
llvm_unreachable(" neon_vaddlv_u32 NYI ");
26752676
case NEON::BI__builtin_neon_vaddlvq_s32:
26762677
llvm_unreachable(" neon_vaddlvq_s32 NYI ");
2677-
case NEON::BI__builtin_neon_vaddlvq_u32: {
2678-
mlir::Type argTy = cgf.convertType(expr->getArg(0)->getType());
2678+
case NEON::BI__builtin_neon_vaddlvq_u32:
26792679
return emitNeonCall(builder, {argTy}, ops, "aarch64.neon.uaddlv", resultTy,
26802680
loc);
2681-
}
26822681
case NEON::BI__builtin_neon_vaddv_f32:
26832682
llvm_unreachable(" neon_vaddv_f32 NYI ");
26842683
case NEON::BI__builtin_neon_vaddv_s32:
@@ -2694,9 +2693,9 @@ static mlir::Value emitCommonNeonSISDBuiltinExpr(
26942693
case NEON::BI__builtin_neon_vaddvq_s64:
26952694
llvm_unreachable(" neon_vaddvq_s64 NYI ");
26962695
case NEON::BI__builtin_neon_vaddvq_u32:
2697-
llvm_unreachable(" neon_vaddvq_u32 NYI ");
26982696
case NEON::BI__builtin_neon_vaddvq_u64:
2699-
llvm_unreachable(" neon_vaddvq_u64 NYI ");
2697+
return emitNeonCall(builder, {argTy}, ops, "aarch64.neon.uaddv", resultTy,
2698+
loc);
27002699
case NEON::BI__builtin_neon_vcaged_f64:
27012700
llvm_unreachable(" neon_vcaged_f64 NYI ");
27022701
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)