Skip to content

Commit 23d1d95

Browse files
[LLVM][compiler-rt][AArch64] Refactor AArch64 CPU features (#97777)
This patch refactors the AArch64 CPUFeatures enum into a separate include file that is identical between LLVM and compiler-rt. This, along with a test in compiler-rt to ensure that the two stay in sync.
1 parent 44248d2 commit 23d1d95

File tree

6 files changed

+190
-137
lines changed

6 files changed

+190
-137
lines changed
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
//===- AArch64CPUFeatures.inc - AArch64 CPU Features enum -------*- C++ -*-===//
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+
// This file defines the CPUFeatures enum for AArch64 to facilitate better
10+
// testing of this code between LLVM and compiler-rt, primarily that the files
11+
// are an exact match.
12+
//
13+
// This file has two identical copies. The primary copy lives in LLVM and
14+
// the other one sits in compiler-rt/lib/builtins/cpu_model directory. To make
15+
// changes in this file, first modify the primary copy and copy it over to
16+
// compiler-rt. compiler-rt tests will fail if the two files are not synced up.
17+
//
18+
//===----------------------------------------------------------------------===//
19+
20+
#ifndef AARCH64_CPU_FEATURS_INC_H
21+
#define AARCH64_CPU_FEATURS_INC_H
22+
23+
// Function Multi Versioning CPU features.
24+
enum CPUFeatures {
25+
FEAT_RNG,
26+
FEAT_FLAGM,
27+
FEAT_FLAGM2,
28+
FEAT_FP16FML,
29+
FEAT_DOTPROD,
30+
FEAT_SM4,
31+
FEAT_RDM,
32+
FEAT_LSE,
33+
FEAT_FP,
34+
FEAT_SIMD,
35+
FEAT_CRC,
36+
FEAT_SHA1,
37+
FEAT_SHA2,
38+
FEAT_SHA3,
39+
FEAT_AES,
40+
FEAT_PMULL,
41+
FEAT_FP16,
42+
FEAT_DIT,
43+
FEAT_DPB,
44+
FEAT_DPB2,
45+
FEAT_JSCVT,
46+
FEAT_FCMA,
47+
FEAT_RCPC,
48+
FEAT_RCPC2,
49+
FEAT_FRINTTS,
50+
FEAT_DGH,
51+
FEAT_I8MM,
52+
FEAT_BF16,
53+
FEAT_EBF16,
54+
FEAT_RPRES,
55+
FEAT_SVE,
56+
FEAT_SVE_BF16,
57+
FEAT_SVE_EBF16,
58+
FEAT_SVE_I8MM,
59+
FEAT_SVE_F32MM,
60+
FEAT_SVE_F64MM,
61+
FEAT_SVE2,
62+
FEAT_SVE_AES,
63+
FEAT_SVE_PMULL128,
64+
FEAT_SVE_BITPERM,
65+
FEAT_SVE_SHA3,
66+
FEAT_SVE_SM4,
67+
FEAT_SME,
68+
FEAT_MEMTAG,
69+
FEAT_MEMTAG2,
70+
FEAT_MEMTAG3,
71+
FEAT_SB,
72+
FEAT_PREDRES,
73+
FEAT_SSBS,
74+
FEAT_SSBS2,
75+
FEAT_BTI,
76+
FEAT_LS64,
77+
FEAT_LS64_V,
78+
FEAT_LS64_ACCDATA,
79+
FEAT_WFXT,
80+
FEAT_SME_F64,
81+
FEAT_SME_I64,
82+
FEAT_SME2,
83+
FEAT_RCPC3,
84+
FEAT_MOPS,
85+
FEAT_MAX,
86+
FEAT_EXT = 62, // Reserved to indicate presence of additional features field
87+
// in __aarch64_cpu_features
88+
FEAT_INIT // Used as flag of features initialization completion
89+
};
90+
91+
#endif

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

Lines changed: 1 addition & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -14,74 +14,7 @@
1414

1515
#if !defined(DISABLE_AARCH64_FMV)
1616

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-
};
17+
#include "AArch64CPUFeatures.inc"
8518

8619
void __init_cpu_features(void);
8720

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
;
2+
; NOTE: if this test fails, please make sure the relevant copies are identical
3+
; copies of each other.
4+
;
5+
; RUN: diff %crt_src/lib/builtins/cpu_model/AArch64CPUFeatures.inc %llvm_src/include/llvm/TargetParser/AArch64CPUFeatures.inc

compiler-rt/test/builtins/lit.cfg.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
config.test_source_root = os.path.dirname(__file__)
1010

1111
# Test suffixes.
12-
config.suffixes = [".c", ".cpp", ".m", ".mm"]
12+
config.suffixes = [".c", ".cpp", ".m", ".mm", ".test"]
1313
extra_flags = ["-Wall"]
1414
if config.compiler_id == "GNU":
1515
# detect incorrect declarations of libgcc functions
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
//===- AArch64CPUFeatures.inc - AArch64 CPU Features enum -------*- C++ -*-===//
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+
// This file defines the CPUFeatures enum for AArch64 to facilitate better
10+
// testing of this code between LLVM and compiler-rt, primarily that the files
11+
// are an exact match.
12+
//
13+
// This file has two identical copies. The primary copy lives in LLVM and
14+
// the other one sits in compiler-rt/lib/builtins/cpu_model directory. To make
15+
// changes in this file, first modify the primary copy and copy it over to
16+
// compiler-rt. compiler-rt tests will fail if the two files are not synced up.
17+
//
18+
//===----------------------------------------------------------------------===//
19+
20+
#ifndef AARCH64_CPU_FEATURS_INC_H
21+
#define AARCH64_CPU_FEATURS_INC_H
22+
23+
// Function Multi Versioning CPU features.
24+
enum CPUFeatures {
25+
FEAT_RNG,
26+
FEAT_FLAGM,
27+
FEAT_FLAGM2,
28+
FEAT_FP16FML,
29+
FEAT_DOTPROD,
30+
FEAT_SM4,
31+
FEAT_RDM,
32+
FEAT_LSE,
33+
FEAT_FP,
34+
FEAT_SIMD,
35+
FEAT_CRC,
36+
FEAT_SHA1,
37+
FEAT_SHA2,
38+
FEAT_SHA3,
39+
FEAT_AES,
40+
FEAT_PMULL,
41+
FEAT_FP16,
42+
FEAT_DIT,
43+
FEAT_DPB,
44+
FEAT_DPB2,
45+
FEAT_JSCVT,
46+
FEAT_FCMA,
47+
FEAT_RCPC,
48+
FEAT_RCPC2,
49+
FEAT_FRINTTS,
50+
FEAT_DGH,
51+
FEAT_I8MM,
52+
FEAT_BF16,
53+
FEAT_EBF16,
54+
FEAT_RPRES,
55+
FEAT_SVE,
56+
FEAT_SVE_BF16,
57+
FEAT_SVE_EBF16,
58+
FEAT_SVE_I8MM,
59+
FEAT_SVE_F32MM,
60+
FEAT_SVE_F64MM,
61+
FEAT_SVE2,
62+
FEAT_SVE_AES,
63+
FEAT_SVE_PMULL128,
64+
FEAT_SVE_BITPERM,
65+
FEAT_SVE_SHA3,
66+
FEAT_SVE_SM4,
67+
FEAT_SME,
68+
FEAT_MEMTAG,
69+
FEAT_MEMTAG2,
70+
FEAT_MEMTAG3,
71+
FEAT_SB,
72+
FEAT_PREDRES,
73+
FEAT_SSBS,
74+
FEAT_SSBS2,
75+
FEAT_BTI,
76+
FEAT_LS64,
77+
FEAT_LS64_V,
78+
FEAT_LS64_ACCDATA,
79+
FEAT_WFXT,
80+
FEAT_SME_F64,
81+
FEAT_SME_I64,
82+
FEAT_SME2,
83+
FEAT_RCPC3,
84+
FEAT_MOPS,
85+
FEAT_MAX,
86+
FEAT_EXT = 62, // Reserved to indicate presence of additional features field
87+
// in __aarch64_cpu_features
88+
FEAT_INIT // Used as flag of features initialization completion
89+
};
90+
91+
#endif

llvm/include/llvm/TargetParser/AArch64TargetParser.h

Lines changed: 1 addition & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -34,74 +34,7 @@ namespace AArch64 {
3434
struct ArchInfo;
3535
struct CpuInfo;
3636

37-
// Function Multi Versioning CPU features. They must be kept in sync with
38-
// compiler-rt enum CPUFeatures in lib/builtins/cpu_model/aarch64.c with
39-
// FEAT_MAX as sentinel.
40-
enum CPUFeatures {
41-
FEAT_RNG,
42-
FEAT_FLAGM,
43-
FEAT_FLAGM2,
44-
FEAT_FP16FML,
45-
FEAT_DOTPROD,
46-
FEAT_SM4,
47-
FEAT_RDM,
48-
FEAT_LSE,
49-
FEAT_FP,
50-
FEAT_SIMD,
51-
FEAT_CRC,
52-
FEAT_SHA1,
53-
FEAT_SHA2,
54-
FEAT_SHA3,
55-
FEAT_AES,
56-
FEAT_PMULL,
57-
FEAT_FP16,
58-
FEAT_DIT,
59-
FEAT_DPB,
60-
FEAT_DPB2,
61-
FEAT_JSCVT,
62-
FEAT_FCMA,
63-
FEAT_RCPC,
64-
FEAT_RCPC2,
65-
FEAT_FRINTTS,
66-
FEAT_DGH,
67-
FEAT_I8MM,
68-
FEAT_BF16,
69-
FEAT_EBF16,
70-
FEAT_RPRES,
71-
FEAT_SVE,
72-
FEAT_SVE_BF16,
73-
FEAT_SVE_EBF16,
74-
FEAT_SVE_I8MM,
75-
FEAT_SVE_F32MM,
76-
FEAT_SVE_F64MM,
77-
FEAT_SVE2,
78-
FEAT_SVE_AES,
79-
FEAT_SVE_PMULL128,
80-
FEAT_SVE_BITPERM,
81-
FEAT_SVE_SHA3,
82-
FEAT_SVE_SM4,
83-
FEAT_SME,
84-
FEAT_MEMTAG,
85-
FEAT_MEMTAG2,
86-
FEAT_MEMTAG3,
87-
FEAT_SB,
88-
FEAT_PREDRES,
89-
FEAT_SSBS,
90-
FEAT_SSBS2,
91-
FEAT_BTI,
92-
FEAT_LS64,
93-
FEAT_LS64_V,
94-
FEAT_LS64_ACCDATA,
95-
FEAT_WFXT,
96-
FEAT_SME_F64,
97-
FEAT_SME_I64,
98-
FEAT_SME2,
99-
FEAT_RCPC3,
100-
FEAT_MOPS,
101-
FEAT_MAX,
102-
FEAT_EXT = 62,
103-
FEAT_INIT
104-
};
37+
#include "llvm/TargetParser/AArch64CPUFeatures.inc"
10538

10639
static_assert(FEAT_MAX < 62,
10740
"Number of features in CPUFeatures are limited to 62 entries");

0 commit comments

Comments
 (0)