Skip to content

Commit 0943911

Browse files
AmrDeveloperlanza
authored andcommitted
[CIR][CIRGen][Builtin][Neon] Lower neon_vshrd_n_u64 (#1353)
Lower `neon_vshrd_n_u64`
1 parent 58c03ea commit 0943911

File tree

2 files changed

+42
-12
lines changed

2 files changed

+42
-12
lines changed

clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3857,7 +3857,15 @@ CIRGenFunction::emitAArch64BuiltinExpr(unsigned BuiltinID, const CallExpr *E,
38573857
return builder.createShiftRight(Ops[0], bits);
38583858
}
38593859
case NEON::BI__builtin_neon_vshrd_n_u64: {
3860-
llvm_unreachable("NEON::BI__builtin_neon_vshrd_n_u64 NYI");
3860+
std::optional<llvm::APSInt> amt =
3861+
E->getArg(1)->getIntegerConstantExpr(getContext());
3862+
assert(amt && "Expected argument to be a constant");
3863+
uint64_t shiftAmt = amt->getZExtValue();
3864+
if (shiftAmt == 64)
3865+
return builder.getConstInt(getLoc(E->getExprLoc()), builder.getUInt64Ty(),
3866+
0);
3867+
3868+
return builder.createShiftRight(Ops[0], shiftAmt);
38613869
}
38623870
case NEON::BI__builtin_neon_vsrad_n_s64: {
38633871
std::optional<llvm::APSInt> amt =

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

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15174,18 +15174,40 @@ int64_t test_vshrd_n_s64(int64_t a) {
1517415174
// LLVM: ret i64 [[SHRD_N]]
1517515175
}
1517615176

15177-
// NYI-LABEL: @test_vshrd_n_u64(
15178-
// NYI: ret i64 0
15179-
// uint64_t test_vshrd_n_u64(uint64_t a) {
15180-
// return (uint64_t)vshrd_n_u64(a, 64);
15181-
// }
15177+
uint64_t test_vshrd_n_u64(uint64_t a) {
15178+
return (uint64_t)vshrd_n_u64(a, 64);
1518215179

15183-
// NYI-LABEL: @test_vshrd_n_u64_2(
15184-
// NYI: ret i64 0
15185-
// uint64_t test_vshrd_n_u64_2() {
15186-
// uint64_t a = UINT64_C(0xf000000000000000);
15187-
// return vshrd_n_u64(a, 64);
15188-
// }
15180+
// CIR-LABEL: vshrd_n_u64
15181+
// CIR: {{.*}} = cir.const #cir.int<0> : !u64i
15182+
// CIR: cir.return {{.*}} : !u64i
15183+
15184+
// LLVM-LABEL: @test_vshrd_n_u64(
15185+
// LLVM: ret i64 0
15186+
}
15187+
15188+
uint64_t test_vshrd_n_u64_2() {
15189+
uint64_t a = UINT64_C(0xf000000000000000);
15190+
return vshrd_n_u64(a, 64);
15191+
15192+
// CIR-LABEL: vshrd_n_u64
15193+
// CIR: {{.*}} = cir.const #cir.int<0> : !u64i
15194+
// CIR: cir.return {{.*}} : !u64i
15195+
15196+
// LLVM-LABEL: @test_vshrd_n_u64_2(
15197+
// LLVM: ret i64 0
15198+
15199+
}
15200+
15201+
uint64_t test_vshrd_n_u64_3(uint64_t a) {
15202+
return vshrd_n_u64(a, 1);
15203+
15204+
// CIR-LABEL: vshrd_n_u64
15205+
// CIR: {{%.*}} = cir.shift(right, {{%.*}} : !u64i, {{%.*}} : !u64i) -> !u64i
15206+
15207+
// LLVM-LABEL: @test_vshrd_n_u64_3(
15208+
// LLVM: [[SHRD_N:%.*]] = lshr i64 %0, 1
15209+
// LLVM: ret i64 [[SHRD_N]]
15210+
}
1518915211

1519015212
// NYI-LABEL: @test_vrshrd_n_s64(
1519115213
// NYI: [[VRSHR_N:%.*]] = call i64 @llvm.aarch64.neon.srshl.i64(i64 %a, i64 -63)

0 commit comments

Comments
 (0)