Skip to content

Commit 97c6e1e

Browse files
committed
[CIR][CIRGen][Builtin][Neon] Lower neon_vaddvq_s64, neon_vaddvq_s32,
1 parent 8d649fb commit 97c6e1e

File tree

3 files changed

+50
-18
lines changed

3 files changed

+50
-18
lines changed

clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2680,18 +2680,16 @@ static mlir::Value emitCommonNeonSISDBuiltinExpr(
26802680
loc);
26812681
case NEON::BI__builtin_neon_vaddv_f32:
26822682
llvm_unreachable(" neon_vaddv_f32 NYI ");
2683-
case NEON::BI__builtin_neon_vaddv_s32:
2684-
llvm_unreachable(" neon_vaddv_s32 NYI ");
2685-
case NEON::BI__builtin_neon_vaddv_u32:
2686-
llvm_unreachable(" neon_vaddv_u32 NYI ");
26872683
case NEON::BI__builtin_neon_vaddvq_f32:
26882684
llvm_unreachable(" neon_vaddvq_f32 NYI ");
26892685
case NEON::BI__builtin_neon_vaddvq_f64:
26902686
llvm_unreachable(" neon_vaddvq_f64 NYI ");
2687+
case NEON::BI__builtin_neon_vaddv_s32:
26912688
case NEON::BI__builtin_neon_vaddvq_s32:
2692-
llvm_unreachable(" neon_vaddvq_s32 NYI ");
26932689
case NEON::BI__builtin_neon_vaddvq_s64:
2694-
llvm_unreachable(" neon_vaddvq_s64 NYI ");
2690+
return emitNeonCall(builder, {argTy}, ops, "aarch64.neon.saddv", resultTy,
2691+
loc);
2692+
case NEON::BI__builtin_neon_vaddv_u32:
26952693
case NEON::BI__builtin_neon_vaddvq_u32:
26962694
case NEON::BI__builtin_neon_vaddvq_u64:
26972695
return emitNeonCall(builder, {argTy}, ops, "aarch64.neon.uaddv", resultTy,

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -952,3 +952,27 @@ uint64_t test_vaddvq_u64(uint64x2_t a) {
952952
// LLVM: [[VADDVQ_U64_I:%.*]] = call i64 @llvm.aarch64.neon.uaddv.i64.v2i64(<2 x i64> {{%.*}})
953953
// LLVM: ret i64 [[VADDVQ_U64_I]]
954954
}
955+
956+
int32_t test_vaddvq_s32(int32x4_t a) {
957+
return vaddvq_s32(a);
958+
959+
// CIR-LABEL: vaddvq_s32
960+
// CIR: cir.llvm.intrinsic "aarch64.neon.saddv" {{%.*}} : (!cir.vector<!s32i x 4>) -> !s32i
961+
962+
// LLVM-LABEL: test_vaddvq_s32
963+
// LLVM-SAME: (<4 x i32> [[a:%.*]])
964+
// LLVM: [[VADDVQ_S32_I:%.*]] = call i32 @llvm.aarch64.neon.saddv.i32.v4i32(<4 x i32> [[a]])
965+
// LLVM: ret i32 [[VADDVQ_S32_I]]
966+
}
967+
968+
int64_t test_vaddvq_s64(int64x2_t a) {
969+
return vaddvq_s64(a);
970+
971+
// CIR-LABEL: vaddvq_s64
972+
// CIR: cir.llvm.intrinsic "aarch64.neon.saddv" {{%.*}} : (!cir.vector<!s64i x 2>) -> !s64i
973+
974+
// LLVM-LABEL: test_vaddvq_s64
975+
// LLVM-SAME: (<2 x i64> [[a:%.*]])
976+
// LLVM: [[VADDVQ_S64_I:%.*]] = call i64 @llvm.aarch64.neon.saddv.i64.v2i64(<2 x i64> [[a]])
977+
// LLVM: ret i64 [[VADDVQ_S64_I]]
978+
}

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

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18872,19 +18872,29 @@ uint64x1_t test_vrsra_n_u64(uint64x1_t a, uint64x1_t b) {
1887218872
// return vmaxv_u32(a);
1887318873
// }
1887418874

18875-
// NYI-LABEL: @test_vaddv_s32(
18876-
// NYI: [[VADDV_S32_I:%.*]] = call i32 @llvm.aarch64.neon.saddv.i32.v2i32(<2 x i32> %a)
18877-
// NYI: ret i32 [[VADDV_S32_I]]
18878-
// int32_t test_vaddv_s32(int32x2_t a) {
18879-
// return vaddv_s32(a);
18880-
// }
18875+
int32_t test_vaddv_s32(int32x2_t a) {
18876+
return vaddv_s32(a);
1888118877

18882-
// NYI-LABEL: @test_vaddv_u32(
18883-
// NYI: [[VADDV_U32_I:%.*]] = call i32 @llvm.aarch64.neon.uaddv.i32.v2i32(<2 x i32> %a)
18884-
// NYI: ret i32 [[VADDV_U32_I]]
18885-
// uint32_t test_vaddv_u32(uint32x2_t a) {
18886-
// return vaddv_u32(a);
18887-
// }
18878+
// CIR-LABEL: vaddv_s32
18879+
// CIR: cir.llvm.intrinsic "aarch64.neon.saddv" {{%.*}} : (!cir.vector<!s32i x 2>) -> !s32i
18880+
18881+
// LLVM-LABEL: test_vaddv_s32
18882+
// LLVM-SAME: (<2 x i32> [[a:%.*]])
18883+
// LLVM: [[VADDV_S32_I:%.*]] = call i32 @llvm.aarch64.neon.saddv.i32.v2i32(<2 x i32> [[a]])
18884+
// LLVM: ret i32 [[VADDV_S32_I]]
18885+
}
18886+
18887+
uint32_t test_vaddv_u32(uint32x2_t a) {
18888+
return vaddv_u32(a);
18889+
18890+
// CIR-LABEL: vaddv_u32
18891+
// CIR: cir.llvm.intrinsic "aarch64.neon.uaddv" {{%.*}} : (!cir.vector<!u32i x 2>) -> !u32i
18892+
18893+
// LLVM-LABEL: test_vaddv_u32
18894+
// LLVM-SAME: (<2 x i32> [[a:%.*]])
18895+
// LLVM: [[VADDV_U32_I:%.*]] = call i32 @llvm.aarch64.neon.uaddv.i32.v2i32(<2 x i32> [[a]])
18896+
// LLVM: ret i32 [[VADDV_U32_I]]
18897+
}
1888818898

1888918899
// NYI-LABEL: @test_vaddlv_s32(
1889018900
// NYI: [[VADDLV_S32_I:%.*]] = call i64 @llvm.aarch64.neon.saddlv.i64.v2i32(<2 x i32> %a)

0 commit comments

Comments
 (0)