Skip to content

Commit 5f68f6c

Browse files
authored
[CIR][CIRGen][Builtin][Neon] Lower vrsrad_n u64 and s64 (#1379)
Lower vrsrad_n u64 and s64
1 parent 6492b9b commit 5f68f6c

File tree

2 files changed

+45
-15
lines changed

2 files changed

+45
-15
lines changed

clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3840,7 +3840,21 @@ CIRGenFunction::emitAArch64BuiltinExpr(unsigned BuiltinID, const CallExpr *E,
38403840
}
38413841
case NEON::BI__builtin_neon_vrsrad_n_u64:
38423842
case NEON::BI__builtin_neon_vrsrad_n_s64: {
3843-
llvm_unreachable("NEON::BI__builtin_neon_vrsrad_n_s64 NYI");
3843+
cir::IntType IntType = BuiltinID == NEON::BI__builtin_neon_vrsrad_n_u64
3844+
? builder.getUInt64Ty()
3845+
: builder.getSInt64Ty();
3846+
Ops[1] = builder.createBitcast(Ops[1], IntType);
3847+
Ops.push_back(builder.createNeg(emitScalarExpr(E->getArg(2))));
3848+
3849+
const StringRef Intrinsic = BuiltinID == NEON::BI__builtin_neon_vrsrad_n_u64
3850+
? "aarch64.neon.urshl"
3851+
: "aarch64.neon.srshl";
3852+
3853+
llvm::SmallVector<mlir::Value, 2> args = {
3854+
Ops[1], builder.createIntCast(Ops[2], IntType)};
3855+
Ops[1] = emitNeonCall(builder, {IntType, IntType}, args, Intrinsic, IntType,
3856+
getLoc(E->getExprLoc()));
3857+
return builder.createAdd(Ops[0], builder.createBitcast(Ops[1], IntType));
38443858
}
38453859
case NEON::BI__builtin_neon_vshld_n_s64:
38463860
case NEON::BI__builtin_neon_vshld_n_u64: {

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

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15327,13 +15327,21 @@ uint64x1_t test_vsra_n_u64(uint64x1_t a, uint64x1_t b) {
1532715327
// LLVM: ret <1 x i64> [[TMP4]]
1532815328
}
1532915329

15330-
// NYI-LABEL: @test_vrsrad_n_s64(
15331-
// NYI: [[TMP0:%.*]] = call i64 @llvm.aarch64.neon.srshl.i64(i64 %b, i64 -63)
15332-
// NYI: [[TMP1:%.*]] = add i64 %a, [[TMP0]]
15333-
// NYI: ret i64 [[TMP1]]
15334-
// int64_t test_vrsrad_n_s64(int64_t a, int64_t b) {
15335-
// return (int64_t)vrsrad_n_s64(a, b, 63);
15336-
// }
15330+
int64_t test_vrsrad_n_s64(int64_t a, int64_t b) {
15331+
return (int64_t)vrsrad_n_s64(a, b, 63);
15332+
15333+
// CIR-LABEL: vrsrad_n_s64
15334+
// CIR: [[TMP0:%.*]] = cir.const #cir.int<63> : !s32i
15335+
// CIR: [[TMP1:%.*]] = cir.unary(minus, [[TMP0]]) : !s32i, !s32i
15336+
// CIR: [[TMP2:%.*]] = cir.cast(integral, [[TMP1]] : !s32i), !s64i
15337+
// CIR: [[TMP3:%.*]] = cir.llvm.intrinsic "aarch64.neon.srshl" {{.*}}, [[TMP2]] : (!s64i, !s64i) -> !s64i
15338+
// CIR: [[TMP4:%.*]] = cir.binop(add, {{.*}}, [[TMP3]]) : !s64i
15339+
15340+
// LLVM-LABEL: @test_vrsrad_n_s64(
15341+
// LLVM: [[TMP0:%.*]] = call i64 @llvm.aarch64.neon.srshl.i64(i64 %1, i64 -63)
15342+
// LLVM: [[TMP1:%.*]] = add i64 %0, [[TMP0]]
15343+
// LLVM: ret i64 [[TMP1]]
15344+
}
1533715345

1533815346
int64x1_t test_vrsra_n_s64(int64x1_t a, int64x1_t b) {
1533915347
return vrsra_n_s64(a, b, 1);
@@ -15355,13 +15363,21 @@ int64x1_t test_vrsra_n_s64(int64x1_t a, int64x1_t b) {
1535515363
// LLVM: ret <1 x i64> [[TMP3]]
1535615364
}
1535715365

15358-
// NYI-LABEL: @test_vrsrad_n_u64(
15359-
// NYI: [[TMP0:%.*]] = call i64 @llvm.aarch64.neon.urshl.i64(i64 %b, i64 -63)
15360-
// NYI: [[TMP1:%.*]] = add i64 %a, [[TMP0]]
15361-
// NYI: ret i64 [[TMP1]]
15362-
// uint64_t test_vrsrad_n_u64(uint64_t a, uint64_t b) {
15363-
// return (uint64_t)vrsrad_n_u64(a, b, 63);
15364-
// }
15366+
uint64_t test_vrsrad_n_u64(uint64_t a, uint64_t b) {
15367+
return (uint64_t)vrsrad_n_u64(a, b, 63);
15368+
15369+
// CIR-LABEL:vrsrad_n_u64
15370+
// CIR: [[TMP0:%.*]] = cir.const #cir.int<63> : !s32i
15371+
// CIR: [[TMP1:%.*]] = cir.unary(minus, [[TMP0]]) : !s32i, !s32i
15372+
// CIR: [[TMP2:%.*]] = cir.cast(integral, [[TMP1]] : !s32i), !u64i
15373+
// CIR: [[TMP3:%.*]] = cir.llvm.intrinsic "aarch64.neon.urshl" {{.*}}, [[TMP2]] : (!u64i, !u64i) -> !u64i
15374+
// CIR: [[TMP4:%.*]] = cir.binop(add, {{.*}}, [[TMP3]]) : !u64i
15375+
15376+
// LLVM-LABEL: @test_vrsrad_n_u64(
15377+
// LLVM: [[TMP0:%.*]] = call i64 @llvm.aarch64.neon.urshl.i64(i64 %1, i64 -63)
15378+
// LLVM: [[TMP1:%.*]] = add i64 %0, [[TMP0]]
15379+
// LLVM: ret i64 [[TMP1]]
15380+
}
1536515381

1536615382
uint64x1_t test_vrsra_n_u64(uint64x1_t a, uint64x1_t b) {
1536715383
return vrsra_n_u64(a, b, 1);

0 commit comments

Comments
 (0)