Skip to content

Commit b6796c4

Browse files
authored
[CIR][CIRGen][Builtin][Neon] Lower builtin_neon_vqshld_n s64 and u64 (#1385)
Lower builtin_neon_vqshld_n s64 and u64
1 parent 37fa92a commit b6796c4

File tree

2 files changed

+31
-13
lines changed

2 files changed

+31
-13
lines changed

clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3832,7 +3832,17 @@ CIRGenFunction::emitAArch64BuiltinExpr(unsigned BuiltinID, const CallExpr *E,
38323832
}
38333833
case NEON::BI__builtin_neon_vqshld_n_u64:
38343834
case NEON::BI__builtin_neon_vqshld_n_s64: {
3835-
llvm_unreachable("NEON::BI__builtin_neon_vqshld_n_s64 NYI");
3835+
cir::IntType IntType = BuiltinID == NEON::BI__builtin_neon_vqshld_n_u64
3836+
? builder.getUInt64Ty()
3837+
: builder.getSInt64Ty();
3838+
3839+
const StringRef Intrinsic = BuiltinID == NEON::BI__builtin_neon_vqshld_n_u64
3840+
? "aarch64.neon.uqshl"
3841+
: "aarch64.neon.sqshl";
3842+
Ops.push_back(emitScalarExpr(E->getArg(1)));
3843+
Ops[1] = builder.createIntCast(Ops[1], IntType);
3844+
return emitNeonCall(builder, {IntType, IntType}, Ops, Intrinsic, IntType,
3845+
getLoc(E->getExprLoc()));
38363846
}
38373847
case NEON::BI__builtin_neon_vrshrd_n_u64:
38383848
case NEON::BI__builtin_neon_vrshrd_n_s64: {

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

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15472,12 +15472,16 @@ uint64_t test_vshld_n_u64(uint64_t a) {
1547215472
// return (int32_t)vqshls_n_s32(a, 31);
1547315473
// }
1547415474

15475-
// NYI-LABEL: @test_vqshld_n_s64(
15476-
// NYI: [[VQSHL_N:%.*]] = call i64 @llvm.aarch64.neon.sqshl.i64(i64 %a, i64 63)
15477-
// NYI: ret i64 [[VQSHL_N]]
15478-
// int64_t test_vqshld_n_s64(int64_t a) {
15479-
// return (int64_t)vqshld_n_s64(a, 63);
15480-
// }
15475+
int64_t test_vqshld_n_s64(int64_t a) {
15476+
return (int64_t)vqshld_n_s64(a, 63);
15477+
15478+
// CIR-LABEL: vqshld_n_s64
15479+
// CIR: [[TMP0:%.*]] = cir.llvm.intrinsic "aarch64.neon.sqshl" {{.*}}, {{.*}} : (!s64i, !s64i) -> !s64i
15480+
15481+
// LLVM-LABEL: @test_vqshld_n_s64(
15482+
// LLVM: [[VQSHL_N:%.*]] = call i64 @llvm.aarch64.neon.sqshl.i64(i64 %0, i64 63)
15483+
// LLVM: ret i64 [[VQSHL_N]]
15484+
}
1548115485

1548215486
// NYI-LABEL: @test_vqshl_n_s8(
1548315487
// NYI: [[VQSHL_N:%.*]] = call <8 x i8> @llvm.aarch64.neon.sqshl.v8i8(<8 x i8> %a, <8 x i8> zeroinitializer)
@@ -15631,12 +15635,16 @@ uint64_t test_vshld_n_u64(uint64_t a) {
1563115635
// return (uint32_t)vqshls_n_u32(a, 31);
1563215636
// }
1563315637

15634-
// NYI-LABEL: @test_vqshld_n_u64(
15635-
// NYI: [[VQSHL_N:%.*]] = call i64 @llvm.aarch64.neon.uqshl.i64(i64 %a, i64 63)
15636-
// NYI: ret i64 [[VQSHL_N]]
15637-
// uint64_t test_vqshld_n_u64(uint64_t a) {
15638-
// return (uint64_t)vqshld_n_u64(a, 63);
15639-
// }
15638+
uint64_t test_vqshld_n_u64(uint64_t a) {
15639+
return (uint64_t)vqshld_n_u64(a, 63);
15640+
15641+
// CIR-LABEL: vqshld_n_u64
15642+
// CIR: [[TMP0:%.*]] = cir.llvm.intrinsic "aarch64.neon.uqshl" {{.*}}, {{.*}} : (!u64i, !u64i) -> !u64i
15643+
15644+
// LLVM-LABEL: @test_vqshld_n_u64(
15645+
// LLVM: [[VQSHL_N:%.*]] = call i64 @llvm.aarch64.neon.uqshl.i64(i64 %0, i64 63)
15646+
// LLVM: ret i64 [[VQSHL_N]]
15647+
}
1564015648

1564115649
// NYI-LABEL: @test_vqshl_n_u64(
1564215650
// NYI: [[TMP0:%.*]] = bitcast <1 x i64> %a to <8 x i8>

0 commit comments

Comments
 (0)