File tree Expand file tree Collapse file tree 4 files changed +135
-70
lines changed
Expand file tree Collapse file tree 4 files changed +135
-70
lines changed Original file line number Diff line number Diff line change @@ -562,7 +562,7 @@ set(aarch64_SOURCES
562562)
563563
564564if (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" )
568568else ()
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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
Original file line number Diff line number Diff line change 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)
You can’t perform that action at this time.
0 commit comments