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
562
562
)
563
563
564
564
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 )
566
566
message (STATUS "AArch64 SME ABI routines enabled" )
567
567
set_source_files_properties (aarch64/sme-libc-routines.c PROPERTIES COMPILE_FLAGS "-fno-builtin" )
568
568
else ()
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 12
12
//
13
13
//===----------------------------------------------------------------------===//
14
14
15
- #include "cpu_model .h"
15
+ #include "aarch64 .h"
16
16
17
17
#if !defined(__aarch64__ )
18
18
#error This file is intended only for aarch64-based targets
@@ -53,74 +53,6 @@ _Bool __aarch64_have_lse_atomics
53
53
#endif
54
54
55
55
#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
- };
124
56
125
57
// Architecture features used
126
58
// 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