Skip to content

Commit 49b27b1

Browse files
author
Dinar Temirbulatov
authored
[AArch64][SME2] Add builtins to cast svbool from/to svcount. (#74720)
Add builtin: 'svreinterpret_b' to cast from svcount_t to svbool_t. Add builtin: 'svreinterpret_c' to cast from svbool_t to svcount_t. Patch by: Hassnaa Hamdi <[email protected]>
1 parent cb6c093 commit 49b27b1

File tree

3 files changed

+66
-0
lines changed

3 files changed

+66
-0
lines changed

clang/include/clang/Basic/arm_sve.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2161,6 +2161,9 @@ let TargetGuard = "sme2" in {
21612161
def SVSQRSHRU_X4 : SInst<"svqrshru[_n]_{0}[_{d}_x4]", "b4i", "il", MergeNone, "aarch64_sve_sqrshru_x4", [IsStreaming], [ImmCheck<1, ImmCheckShiftRight, 0>]>;
21622162

21632163
def SVSQRSHRUN_X4 : SInst<"svqrshrun[_n]_{0}[_{d}_x4]", "b4i", "il", MergeNone, "aarch64_sve_sqrshrun_x4", [IsStreaming], [ImmCheck<1, ImmCheckShiftRight, 0>]>;
2164+
2165+
def REINTERPRET_SVBOOL_TO_SVCOUNT : Inst<"svreinterpret[_c]", "}P", "Pc", MergeNone, "", [IsStreamingCompatible], []>;
2166+
def REINTERPRET_SVCOUNT_TO_SVBOOL : Inst<"svreinterpret[_b]", "P}", "Pc", MergeNone, "", [IsStreamingCompatible], []>;
21642167
}
21652168

21662169
let TargetGuard = "sve2p1" in {

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10211,6 +10211,22 @@ Value *CodeGenFunction::EmitAArch64SVEBuiltinExpr(unsigned BuiltinID,
1021110211
switch (BuiltinID) {
1021210212
default:
1021310213
return nullptr;
10214+
10215+
case SVE::BI__builtin_sve_svreinterpret_b: {
10216+
auto SVCountTy =
10217+
llvm::TargetExtType::get(getLLVMContext(), "aarch64.svcount");
10218+
Function *CastFromSVCountF =
10219+
CGM.getIntrinsic(Intrinsic::aarch64_sve_convert_to_svbool, SVCountTy);
10220+
return Builder.CreateCall(CastFromSVCountF, Ops[0]);
10221+
}
10222+
case SVE::BI__builtin_sve_svreinterpret_c: {
10223+
auto SVCountTy =
10224+
llvm::TargetExtType::get(getLLVMContext(), "aarch64.svcount");
10225+
Function *CastToSVCountF =
10226+
CGM.getIntrinsic(Intrinsic::aarch64_sve_convert_from_svbool, SVCountTy);
10227+
return Builder.CreateCall(CastToSVCountF, Ops[0]);
10228+
}
10229+
1021410230
case SVE::BI__builtin_sve_svpsel_lane_b8:
1021510231
case SVE::BI__builtin_sve_svpsel_lane_b16:
1021610232
case SVE::BI__builtin_sve_svpsel_lane_b32:
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
2+
3+
// REQUIRES: aarch64-registered-target
4+
5+
// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +sme2 -S -disable-O0-optnone -Werror -Wall -emit-llvm -o - %s | opt -S -p mem2reg,instcombine,tailcallelim | FileCheck %s
6+
// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +sme2 -S -disable-O0-optnone -Werror -Wall -emit-llvm -o - -x c++ %s | opt -S -p mem2reg,instcombine,tailcallelim | FileCheck %s -check-prefix=CPP-CHECK
7+
// RUN: %clang_cc1 -DSVE_OVERLOADED_FORMS -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +sme2 -S -disable-O0-optnone -Werror -Wall -emit-llvm -o - %s | opt -S -p mem2reg,instcombine,tailcallelim | FileCheck %s
8+
// RUN: %clang_cc1 -DSVE_OVERLOADED_FORMS -triple aarch64-none-linux-gnu -target-feature +sve -target-feature +sme2 -S -disable-O0-optnone -Werror -Wall -emit-llvm -o - -x c++ %s | opt -S -p mem2reg,instcombine,tailcallelim | FileCheck %s -check-prefix=CPP-CHECK
9+
10+
#include <arm_sme_draft_spec_subject_to_change.h>
11+
12+
#ifdef SVE_OVERLOADED_FORMS
13+
// A simple used,unused... macro, long enough to represent any SVE builtin.§
14+
#define SVE_ACLE_FUNC(A1,A2_UNUSED,A3,A4_UNUSED) A1##A3
15+
#else
16+
#define SVE_ACLE_FUNC(A1,A2,A3,A4) A1##A2##A3##A4
17+
#endif
18+
19+
// CHECK-LABEL: @test_svreinterpret_svbool_svcnt(
20+
// CHECK-NEXT: entry:
21+
// CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 16 x i1> @llvm.aarch64.sve.convert.to.svbool.taarch64.svcountt(target("aarch64.svcount") [[CNT:%.*]])
22+
// CHECK-NEXT: ret <vscale x 16 x i1> [[TMP0]]
23+
//
24+
// CPP-CHECK-LABEL: @_Z31test_svreinterpret_svbool_svcntu11__SVCount_t(
25+
// CPP-CHECK-NEXT: entry:
26+
// CPP-CHECK-NEXT: [[TMP0:%.*]] = tail call <vscale x 16 x i1> @llvm.aarch64.sve.convert.to.svbool.taarch64.svcountt(target("aarch64.svcount") [[CNT:%.*]])
27+
// CPP-CHECK-NEXT: ret <vscale x 16 x i1> [[TMP0]]
28+
//
29+
svbool_t test_svreinterpret_svbool_svcnt(svcount_t cnt) __arm_streaming_compatible
30+
{
31+
return SVE_ACLE_FUNC(svreinterpret,_b,,)(cnt);
32+
}
33+
34+
// CHECK-LABEL: @test_svreinterpret_svcnt_svbool(
35+
// CHECK-NEXT: entry:
36+
// CHECK-NEXT: [[TMP0:%.*]] = tail call target("aarch64.svcount") @llvm.aarch64.sve.convert.from.svbool.taarch64.svcountt(<vscale x 16 x i1> [[PG:%.*]])
37+
// CHECK-NEXT: ret target("aarch64.svcount") [[TMP0]]
38+
//
39+
// CPP-CHECK-LABEL: @_Z31test_svreinterpret_svcnt_svboolu10__SVBool_t(
40+
// CPP-CHECK-NEXT: entry:
41+
// CPP-CHECK-NEXT: [[TMP0:%.*]] = tail call target("aarch64.svcount") @llvm.aarch64.sve.convert.from.svbool.taarch64.svcountt(<vscale x 16 x i1> [[PG:%.*]])
42+
// CPP-CHECK-NEXT: ret target("aarch64.svcount") [[TMP0]]
43+
//
44+
svcount_t test_svreinterpret_svcnt_svbool(svbool_t pg) __arm_streaming_compatible
45+
{
46+
return SVE_ACLE_FUNC(svreinterpret,_c,,)(pg);
47+
}

0 commit comments

Comments
 (0)