Skip to content

Commit 363440c

Browse files
ghehgbcardosolopes
andauthored
[CIR][CIRGen][Builtin][Neon] Lower neon_vaddvq_s64/s32, neon_vaddv_s32/u32, (#1240)
Co-authored-by: Bruno Cardoso Lopes <[email protected]>
1 parent 5f3b2c3 commit 363440c

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
@@ -2678,19 +2678,17 @@ static mlir::Value emitCommonNeonSISDBuiltinExpr(
26782678
case NEON::BI__builtin_neon_vaddlvq_u32:
26792679
return emitNeonCall(builder, {argTy}, ops, "aarch64.neon.uaddlv", resultTy,
26802680
loc);
2681-
case NEON::BI__builtin_neon_vaddv_s32:
2682-
llvm_unreachable(" neon_vaddv_s32 NYI ");
2683-
case NEON::BI__builtin_neon_vaddv_u32:
2684-
llvm_unreachable(" neon_vaddv_u32 NYI ");
26852681
case NEON::BI__builtin_neon_vaddv_f32:
26862682
case NEON::BI__builtin_neon_vaddvq_f32:
26872683
case NEON::BI__builtin_neon_vaddvq_f64:
26882684
return emitNeonCall(builder, {argTy}, ops, "aarch64.neon.faddv", resultTy,
26892685
loc);
2686+
case NEON::BI__builtin_neon_vaddv_s32:
26902687
case NEON::BI__builtin_neon_vaddvq_s32:
2691-
llvm_unreachable(" neon_vaddvq_s32 NYI ");
26922688
case NEON::BI__builtin_neon_vaddvq_s64:
2693-
llvm_unreachable(" neon_vaddvq_s64 NYI ");
2689+
return emitNeonCall(builder, {argTy}, ops, "aarch64.neon.saddv", resultTy,
2690+
loc);
2691+
case NEON::BI__builtin_neon_vaddv_u32:
26942692
case NEON::BI__builtin_neon_vaddvq_u32:
26952693
case NEON::BI__builtin_neon_vaddvq_u64:
26962694
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
@@ -18967,19 +18967,29 @@ float64x1_t test_vmax_f64(float64x1_t a, float64x1_t b) {
1896718967
// return vmaxv_u32(a);
1896818968
// }
1896918969

18970-
// NYI-LABEL: @test_vaddv_s32(
18971-
// NYI: [[VADDV_S32_I:%.*]] = call i32 @llvm.aarch64.neon.saddv.i32.v2i32(<2 x i32> %a)
18972-
// NYI: ret i32 [[VADDV_S32_I]]
18973-
// int32_t test_vaddv_s32(int32x2_t a) {
18974-
// return vaddv_s32(a);
18975-
// }
18970+
int32_t test_vaddv_s32(int32x2_t a) {
18971+
return vaddv_s32(a);
1897618972

18977-
// NYI-LABEL: @test_vaddv_u32(
18978-
// NYI: [[VADDV_U32_I:%.*]] = call i32 @llvm.aarch64.neon.uaddv.i32.v2i32(<2 x i32> %a)
18979-
// NYI: ret i32 [[VADDV_U32_I]]
18980-
// uint32_t test_vaddv_u32(uint32x2_t a) {
18981-
// return vaddv_u32(a);
18982-
// }
18973+
// CIR-LABEL: vaddv_s32
18974+
// CIR: cir.llvm.intrinsic "aarch64.neon.saddv" {{%.*}} : (!cir.vector<!s32i x 2>) -> !s32i
18975+
18976+
// LLVM-LABEL: test_vaddv_s32
18977+
// LLVM-SAME: (<2 x i32> [[a:%.*]])
18978+
// LLVM: [[VADDV_S32_I:%.*]] = call i32 @llvm.aarch64.neon.saddv.i32.v2i32(<2 x i32> [[a]])
18979+
// LLVM: ret i32 [[VADDV_S32_I]]
18980+
}
18981+
18982+
uint32_t test_vaddv_u32(uint32x2_t a) {
18983+
return vaddv_u32(a);
18984+
18985+
// CIR-LABEL: vaddv_u32
18986+
// CIR: cir.llvm.intrinsic "aarch64.neon.uaddv" {{%.*}} : (!cir.vector<!u32i x 2>) -> !u32i
18987+
18988+
// LLVM-LABEL: test_vaddv_u32
18989+
// LLVM-SAME: (<2 x i32> [[a:%.*]])
18990+
// LLVM: [[VADDV_U32_I:%.*]] = call i32 @llvm.aarch64.neon.uaddv.i32.v2i32(<2 x i32> [[a]])
18991+
// LLVM: ret i32 [[VADDV_U32_I]]
18992+
}
1898318993

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

0 commit comments

Comments
 (0)