Skip to content

Commit 518dbfa

Browse files
ghehgbcardosolopes
authored andcommitted
[CIR][CIRGen][Builtin][Neon] Lower neon_vaddvq_s64/s32, neon_vaddv_s32/u32, (llvm#1240)
Co-authored-by: Bruno Cardoso Lopes <[email protected]>
1 parent 9033dae commit 518dbfa

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
@@ -2676,19 +2676,17 @@ static mlir::Value emitCommonNeonSISDBuiltinExpr(
26762676
case NEON::BI__builtin_neon_vaddlvq_u32:
26772677
return emitNeonCall(builder, {argTy}, ops, "aarch64.neon.uaddlv", resultTy,
26782678
loc);
2679-
case NEON::BI__builtin_neon_vaddv_s32:
2680-
llvm_unreachable(" neon_vaddv_s32 NYI ");
2681-
case NEON::BI__builtin_neon_vaddv_u32:
2682-
llvm_unreachable(" neon_vaddv_u32 NYI ");
26832679
case NEON::BI__builtin_neon_vaddv_f32:
26842680
case NEON::BI__builtin_neon_vaddvq_f32:
26852681
case NEON::BI__builtin_neon_vaddvq_f64:
26862682
return emitNeonCall(builder, {argTy}, ops, "aarch64.neon.faddv", resultTy,
26872683
loc);
2684+
case NEON::BI__builtin_neon_vaddv_s32:
26882685
case NEON::BI__builtin_neon_vaddvq_s32:
2689-
llvm_unreachable(" neon_vaddvq_s32 NYI ");
26902686
case NEON::BI__builtin_neon_vaddvq_s64:
2691-
llvm_unreachable(" neon_vaddvq_s64 NYI ");
2687+
return emitNeonCall(builder, {argTy}, ops, "aarch64.neon.saddv", resultTy,
2688+
loc);
2689+
case NEON::BI__builtin_neon_vaddv_u32:
26922690
case NEON::BI__builtin_neon_vaddvq_u32:
26932691
case NEON::BI__builtin_neon_vaddvq_u64:
26942692
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
@@ -953,3 +953,27 @@ uint64_t test_vaddvq_u64(uint64x2_t a) {
953953
// LLVM: [[VADDVQ_U64_I:%.*]] = call i64 @llvm.aarch64.neon.uaddv.i64.v2i64(<2 x i64> {{%.*}})
954954
// LLVM: ret i64 [[VADDVQ_U64_I]]
955955
}
956+
957+
int32_t test_vaddvq_s32(int32x4_t a) {
958+
return vaddvq_s32(a);
959+
960+
// CIR-LABEL: vaddvq_s32
961+
// CIR: cir.llvm.intrinsic "aarch64.neon.saddv" {{%.*}} : (!cir.vector<!s32i x 4>) -> !s32i
962+
963+
// LLVM-LABEL: test_vaddvq_s32
964+
// LLVM-SAME: (<4 x i32> [[a:%.*]])
965+
// LLVM: [[VADDVQ_S32_I:%.*]] = call i32 @llvm.aarch64.neon.saddv.i32.v4i32(<4 x i32> [[a]])
966+
// LLVM: ret i32 [[VADDVQ_S32_I]]
967+
}
968+
969+
int64_t test_vaddvq_s64(int64x2_t a) {
970+
return vaddvq_s64(a);
971+
972+
// CIR-LABEL: vaddvq_s64
973+
// CIR: cir.llvm.intrinsic "aarch64.neon.saddv" {{%.*}} : (!cir.vector<!s64i x 2>) -> !s64i
974+
975+
// LLVM-LABEL: test_vaddvq_s64
976+
// LLVM-SAME: (<2 x i64> [[a:%.*]])
977+
// LLVM: [[VADDVQ_S64_I:%.*]] = call i64 @llvm.aarch64.neon.saddv.i64.v2i64(<2 x i64> [[a]])
978+
// LLVM: ret i64 [[VADDVQ_S64_I]]
979+
}

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

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18968,19 +18968,29 @@ float64x1_t test_vmax_f64(float64x1_t a, float64x1_t b) {
1896818968
// return vmaxv_u32(a);
1896918969
// }
1897018970

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

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

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

0 commit comments

Comments
 (0)