Skip to content

Commit beff42d

Browse files
AmrDeveloperlanza
authored andcommitted
[CIR][CIRGen][Builtin][Neon] Lower vqaddd_s64 and vqaddd_u64 (llvm#1599)
Lower vqaddd_s64 and vqaddd_u64
1 parent cf39106 commit beff42d

File tree

2 files changed

+27
-14
lines changed

2 files changed

+27
-14
lines changed

clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2849,9 +2849,11 @@ static mlir::Value emitCommonNeonSISDBuiltinExpr(
28492849
case NEON::BI__builtin_neon_vqaddb_u8:
28502850
llvm_unreachable(" neon_vqaddb_u8 NYI ");
28512851
case NEON::BI__builtin_neon_vqaddd_s64:
2852-
llvm_unreachable(" neon_vqaddd_s64 NYI ");
2852+
return emitNeonCall(builder, {argTy}, ops, "aarch64.neon.sqadd", resultTy,
2853+
loc);
28532854
case NEON::BI__builtin_neon_vqaddd_u64:
2854-
llvm_unreachable(" neon_vqaddd_u64 NYI ");
2855+
return emitNeonCall(builder, {argTy}, ops, "aarch64.neon.uqadd", resultTy,
2856+
loc);
28552857
case NEON::BI__builtin_neon_vqaddh_s16:
28562858
llvm_unreachable(" neon_vqaddh_s16 NYI ");
28572859
case NEON::BI__builtin_neon_vqaddh_u16:

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

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10046,12 +10046,29 @@ int32_t test_vqadds_s32(int32_t a, int32_t b) {
1004610046
// LLVM: ret i32 [[VQADDS_S32_I]]
1004710047
}
1004810048

10049-
// NYI-LABEL: @test_vqaddd_s64(
10050-
// NYI: [[VQADDD_S64_I:%.*]] = call i64 @llvm.aarch64.neon.sqadd.i64(i64 %a, i64 %b)
10051-
// NYI: ret i64 [[VQADDD_S64_I]]
10052-
// int64_t test_vqaddd_s64(int64_t a, int64_t b) {
10053-
// return vqaddd_s64(a, b);
10054-
// }
10049+
int64_t test_vqaddd_s64(int64_t a, int64_t b) {
10050+
return vqaddd_s64(a, b);
10051+
10052+
// CIR: vqaddd_s64
10053+
// CIR: cir.llvm.intrinsic "aarch64.neon.sqadd" {{%.*}}, {{%.*}} : (!s64i, !s64i) -> !s64i
10054+
10055+
// LLVM-LABEL: @test_vqaddd_s64
10056+
// LLVM-SAME: (i64{{.*}}[[a:%.*]], i64{{.*}}[[b:%.*]])
10057+
// LLVM: [[VQADD_S64_I:%.*]] = call i64 @llvm.aarch64.neon.sqadd.i64(i64 [[a]], i64 [[b]])
10058+
// LLVM: ret i64 [[VQADD_S64_I]]
10059+
}
10060+
10061+
uint64_t test_vqaddd_u64(uint64_t a, uint64_t b) {
10062+
return vqaddd_u64(a, b);
10063+
10064+
// CIR: vqaddd_u64
10065+
// CIR: cir.llvm.intrinsic "aarch64.neon.uqadd" {{%.*}}, {{%.*}} : (!u64i, !u64i) -> !u64i
10066+
10067+
// LLVM-LABEL: @test_vqaddd_u64
10068+
// LLVM-SAME: (i64{{.*}}[[a:%.*]], i64{{.*}}[[b:%.*]])
10069+
// LLVM: [[VQADD_U64_I:%.*]] = call i64 @llvm.aarch64.neon.uqadd.i64(i64 [[a]], i64 [[b]])
10070+
// LLVM: ret i64 [[VQADD_U64_I]]
10071+
}
1005510072

1005610073
// NYI-LABEL: @test_vqaddb_u8(
1005710074
// NYI: [[TMP0:%.*]] = insertelement <8 x i8> poison, i8 %a, i64 0
@@ -10085,12 +10102,6 @@ uint32_t test_vqadds_u32(uint32_t a, uint32_t b) {
1008510102
// LLVM: ret i32 [[VQADDS_U32_I]]
1008610103
}
1008710104

10088-
// NYI-LABEL: @test_vqaddd_u64(
10089-
// NYI: [[VQADDD_U64_I:%.*]] = call i64 @llvm.aarch64.neon.uqadd.i64(i64 %a, i64 %b)
10090-
// NYI: ret i64 [[VQADDD_U64_I]]
10091-
// uint64_t test_vqaddd_u64(uint64_t a, uint64_t b) {
10092-
// return vqaddd_u64(a, b);
10093-
// }
1009410105

1009510106
// NYI-LABEL: @test_vqsubb_s8(
1009610107
// NYI: [[TMP0:%.*]] = insertelement <8 x i8> poison, i8 %a, i64 0

0 commit comments

Comments
 (0)