Skip to content

Commit 043cc5a

Browse files
[AArch64][compiler-rt] Add a function returning the current vector length (llvm#92921)
__arm_get_current_vg emits a cntd instruction if in streaming mode or SVE is available at runtime, otherwise it will return 0.
1 parent 42ebf3e commit 043cc5a

File tree

4 files changed

+135
-70
lines changed

4 files changed

+135
-70
lines changed

compiler-rt/lib/builtins/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -562,7 +562,7 @@ set(aarch64_SOURCES
562562
)
563563

564564
if(COMPILER_RT_HAS_AARCH64_SME AND COMPILER_RT_HAS_FNO_BUILTIN_FLAG AND (COMPILER_RT_HAS_AUXV OR COMPILER_RT_BAREMETAL_BUILD))
565-
list(APPEND aarch64_SOURCES aarch64/sme-abi.S aarch64/sme-abi-init.c aarch64/sme-libc-routines.c)
565+
list(APPEND aarch64_SOURCES aarch64/sme-abi.S aarch64/sme-abi-init.c aarch64/sme-abi-vg.c aarch64/sme-libc-routines.c)
566566
message(STATUS "AArch64 SME ABI routines enabled")
567567
set_source_files_properties(aarch64/sme-libc-routines.c PROPERTIES COMPILE_FLAGS "-fno-builtin")
568568
else()
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
2+
// See https://llvm.org/LICENSE.txt for license information.
3+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
4+
5+
#include "../cpu_model/aarch64.h"
6+
7+
struct FEATURES {
8+
long long features;
9+
};
10+
11+
extern struct FEATURES __aarch64_cpu_features;
12+
13+
struct SME_STATE {
14+
long PSTATE;
15+
long TPIDR2_EL0;
16+
};
17+
18+
extern struct SME_STATE __arm_sme_state(void) __arm_streaming_compatible;
19+
20+
extern bool __aarch64_has_sme_and_tpidr2_el0;
21+
22+
#if __GNUC__ >= 9
23+
#pragma GCC diagnostic ignored "-Wprio-ctor-dtor"
24+
#endif
25+
__attribute__((constructor(90))) static void get_aarch64_cpu_features(void) {
26+
if (!__aarch64_cpu_features.features)
27+
__init_cpu_features();
28+
}
29+
30+
__attribute__((target("sve"))) long
31+
__arm_get_current_vg(void) __arm_streaming_compatible {
32+
struct SME_STATE State = __arm_sme_state();
33+
bool HasSVE = __aarch64_cpu_features.features & (1ULL << FEAT_SVE);
34+
35+
if (!HasSVE && !__aarch64_has_sme_and_tpidr2_el0)
36+
return 0;
37+
38+
if (HasSVE || (State.PSTATE & 1)) {
39+
long vl;
40+
__asm__ __volatile__("cntd %0" : "=r"(vl));
41+
return vl;
42+
}
43+
44+
return 0;
45+
}

compiler-rt/lib/builtins/cpu_model/aarch64.c

Lines changed: 1 addition & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
//
1313
//===----------------------------------------------------------------------===//
1414

15-
#include "cpu_model.h"
15+
#include "aarch64.h"
1616

1717
#if !defined(__aarch64__)
1818
#error This file is intended only for aarch64-based targets
@@ -53,74 +53,6 @@ _Bool __aarch64_have_lse_atomics
5353
#endif
5454

5555
#if !defined(DISABLE_AARCH64_FMV)
56-
// CPUFeatures must correspond to the same AArch64 features in
57-
// AArch64TargetParser.h
58-
enum CPUFeatures {
59-
FEAT_RNG,
60-
FEAT_FLAGM,
61-
FEAT_FLAGM2,
62-
FEAT_FP16FML,
63-
FEAT_DOTPROD,
64-
FEAT_SM4,
65-
FEAT_RDM,
66-
FEAT_LSE,
67-
FEAT_FP,
68-
FEAT_SIMD,
69-
FEAT_CRC,
70-
FEAT_SHA1,
71-
FEAT_SHA2,
72-
FEAT_SHA3,
73-
FEAT_AES,
74-
FEAT_PMULL,
75-
FEAT_FP16,
76-
FEAT_DIT,
77-
FEAT_DPB,
78-
FEAT_DPB2,
79-
FEAT_JSCVT,
80-
FEAT_FCMA,
81-
FEAT_RCPC,
82-
FEAT_RCPC2,
83-
FEAT_FRINTTS,
84-
FEAT_DGH,
85-
FEAT_I8MM,
86-
FEAT_BF16,
87-
FEAT_EBF16,
88-
FEAT_RPRES,
89-
FEAT_SVE,
90-
FEAT_SVE_BF16,
91-
FEAT_SVE_EBF16,
92-
FEAT_SVE_I8MM,
93-
FEAT_SVE_F32MM,
94-
FEAT_SVE_F64MM,
95-
FEAT_SVE2,
96-
FEAT_SVE_AES,
97-
FEAT_SVE_PMULL128,
98-
FEAT_SVE_BITPERM,
99-
FEAT_SVE_SHA3,
100-
FEAT_SVE_SM4,
101-
FEAT_SME,
102-
FEAT_MEMTAG,
103-
FEAT_MEMTAG2,
104-
FEAT_MEMTAG3,
105-
FEAT_SB,
106-
FEAT_PREDRES,
107-
FEAT_SSBS,
108-
FEAT_SSBS2,
109-
FEAT_BTI,
110-
FEAT_LS64,
111-
FEAT_LS64_V,
112-
FEAT_LS64_ACCDATA,
113-
FEAT_WFXT,
114-
FEAT_SME_F64,
115-
FEAT_SME_I64,
116-
FEAT_SME2,
117-
FEAT_RCPC3,
118-
FEAT_MOPS,
119-
FEAT_MAX,
120-
FEAT_EXT = 62, // Reserved to indicate presence of additional features field
121-
// in __aarch64_cpu_features
122-
FEAT_INIT // Used as flag of features initialization completion
123-
};
12456

12557
// Architecture features used
12658
// in Function Multi Versioning
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
//===-- cpu_model/aarch64.h --------------------------------------------- -===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#include "cpu_model.h"
10+
11+
#if !defined(__aarch64__)
12+
#error This file is intended only for aarch64-based targets
13+
#endif
14+
15+
#if !defined(DISABLE_AARCH64_FMV)
16+
17+
// CPUFeatures must correspond to the same AArch64 features in
18+
// AArch64TargetParser.h
19+
enum CPUFeatures {
20+
FEAT_RNG,
21+
FEAT_FLAGM,
22+
FEAT_FLAGM2,
23+
FEAT_FP16FML,
24+
FEAT_DOTPROD,
25+
FEAT_SM4,
26+
FEAT_RDM,
27+
FEAT_LSE,
28+
FEAT_FP,
29+
FEAT_SIMD,
30+
FEAT_CRC,
31+
FEAT_SHA1,
32+
FEAT_SHA2,
33+
FEAT_SHA3,
34+
FEAT_AES,
35+
FEAT_PMULL,
36+
FEAT_FP16,
37+
FEAT_DIT,
38+
FEAT_DPB,
39+
FEAT_DPB2,
40+
FEAT_JSCVT,
41+
FEAT_FCMA,
42+
FEAT_RCPC,
43+
FEAT_RCPC2,
44+
FEAT_FRINTTS,
45+
FEAT_DGH,
46+
FEAT_I8MM,
47+
FEAT_BF16,
48+
FEAT_EBF16,
49+
FEAT_RPRES,
50+
FEAT_SVE,
51+
FEAT_SVE_BF16,
52+
FEAT_SVE_EBF16,
53+
FEAT_SVE_I8MM,
54+
FEAT_SVE_F32MM,
55+
FEAT_SVE_F64MM,
56+
FEAT_SVE2,
57+
FEAT_SVE_AES,
58+
FEAT_SVE_PMULL128,
59+
FEAT_SVE_BITPERM,
60+
FEAT_SVE_SHA3,
61+
FEAT_SVE_SM4,
62+
FEAT_SME,
63+
FEAT_MEMTAG,
64+
FEAT_MEMTAG2,
65+
FEAT_MEMTAG3,
66+
FEAT_SB,
67+
FEAT_PREDRES,
68+
FEAT_SSBS,
69+
FEAT_SSBS2,
70+
FEAT_BTI,
71+
FEAT_LS64,
72+
FEAT_LS64_V,
73+
FEAT_LS64_ACCDATA,
74+
FEAT_WFXT,
75+
FEAT_SME_F64,
76+
FEAT_SME_I64,
77+
FEAT_SME2,
78+
FEAT_RCPC3,
79+
FEAT_MOPS,
80+
FEAT_MAX,
81+
FEAT_EXT = 62, // Reserved to indicate presence of additional features field
82+
// in __aarch64_cpu_features
83+
FEAT_INIT // Used as flag of features initialization completion
84+
};
85+
86+
void __init_cpu_features(void);
87+
88+
#endif // !defined(DISABLE_AARCH64_FMV)

0 commit comments

Comments
 (0)