blob: 2d5083023a117d580289bf6ee2da597a23103a18 [file] [log] [blame]
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001//===-- X86TargetParser - Parser for X86 features ---------------*- 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 implements a target parser to recognise X86 hardware features.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_SUPPORT_X86TARGETPARSERCOMMON_H
14#define LLVM_SUPPORT_X86TARGETPARSERCOMMON_H
15
16#include "llvm/ADT/SmallVector.h"
17#include "llvm/ADT/StringMap.h"
18
19namespace llvm {
20class StringRef;
21
22namespace X86 {
23
24// This should be kept in sync with libcc/compiler-rt as its included by clang
25// as a proxy for what's in libgcc/compiler-rt.
26enum ProcessorVendors : unsigned {
27 VENDOR_DUMMY,
28#define X86_VENDOR(ENUM, STRING) \
29 ENUM,
30#include "llvm/Support/X86TargetParser.def"
31 VENDOR_OTHER
32};
33
34// This should be kept in sync with libcc/compiler-rt as its included by clang
35// as a proxy for what's in libgcc/compiler-rt.
36enum ProcessorTypes : unsigned {
37 CPU_TYPE_DUMMY,
38#define X86_CPU_TYPE(ENUM, STRING) \
39 ENUM,
40#include "llvm/Support/X86TargetParser.def"
41 CPU_TYPE_MAX
42};
43
44// This should be kept in sync with libcc/compiler-rt as its included by clang
45// as a proxy for what's in libgcc/compiler-rt.
46enum ProcessorSubtypes : unsigned {
47 CPU_SUBTYPE_DUMMY,
48#define X86_CPU_SUBTYPE(ENUM, STRING) \
49 ENUM,
50#include "llvm/Support/X86TargetParser.def"
51 CPU_SUBTYPE_MAX
52};
53
54// This should be kept in sync with libcc/compiler-rt as it should be used
55// by clang as a proxy for what's in libgcc/compiler-rt.
56enum ProcessorFeatures {
57#define X86_FEATURE(ENUM, STRING) FEATURE_##ENUM,
58#include "llvm/Support/X86TargetParser.def"
59 CPU_FEATURE_MAX
60};
61
62enum CPUKind {
63 CK_None,
64 CK_i386,
65 CK_i486,
66 CK_WinChipC6,
67 CK_WinChip2,
68 CK_C3,
69 CK_i586,
70 CK_Pentium,
71 CK_PentiumMMX,
72 CK_PentiumPro,
73 CK_i686,
74 CK_Pentium2,
75 CK_Pentium3,
76 CK_PentiumM,
77 CK_C3_2,
78 CK_Yonah,
79 CK_Pentium4,
80 CK_Prescott,
81 CK_Nocona,
82 CK_Core2,
83 CK_Penryn,
84 CK_Bonnell,
85 CK_Silvermont,
86 CK_Goldmont,
87 CK_GoldmontPlus,
88 CK_Tremont,
89 CK_Nehalem,
90 CK_Westmere,
91 CK_SandyBridge,
92 CK_IvyBridge,
93 CK_Haswell,
94 CK_Broadwell,
95 CK_SkylakeClient,
96 CK_SkylakeServer,
97 CK_Cascadelake,
98 CK_Cooperlake,
99 CK_Cannonlake,
100 CK_IcelakeClient,
101 CK_IcelakeServer,
102 CK_Tigerlake,
103 CK_SapphireRapids,
104 CK_Alderlake,
105 CK_KNL,
106 CK_KNM,
107 CK_Lakemont,
108 CK_K6,
109 CK_K6_2,
110 CK_K6_3,
111 CK_Athlon,
112 CK_AthlonXP,
113 CK_K8,
114 CK_K8SSE3,
115 CK_AMDFAM10,
116 CK_BTVER1,
117 CK_BTVER2,
118 CK_BDVER1,
119 CK_BDVER2,
120 CK_BDVER3,
121 CK_BDVER4,
122 CK_ZNVER1,
123 CK_ZNVER2,
124 CK_ZNVER3,
125 CK_x86_64,
126 CK_x86_64_v2,
127 CK_x86_64_v3,
128 CK_x86_64_v4,
129 CK_Geode,
130};
131
132/// Parse \p CPU string into a CPUKind. Will only accept 64-bit capable CPUs if
133/// \p Only64Bit is true.
134CPUKind parseArchX86(StringRef CPU, bool Only64Bit = false);
135CPUKind parseTuneCPU(StringRef CPU, bool Only64Bit = false);
136
137/// Provide a list of valid CPU names. If \p Only64Bit is true, the list will
138/// only contain 64-bit capable CPUs.
139void fillValidCPUArchList(SmallVectorImpl<StringRef> &Values,
140 bool Only64Bit = false);
141/// Provide a list of valid -mtune names.
142void fillValidTuneCPUList(SmallVectorImpl<StringRef> &Values,
143 bool Only64Bit = false);
144
145/// Get the key feature prioritizing target multiversioning.
146ProcessorFeatures getKeyFeature(CPUKind Kind);
147
148/// Fill in the features that \p CPU supports into \p Features.
149void getFeaturesForCPU(StringRef CPU, SmallVectorImpl<StringRef> &Features);
150
151/// Set or clear entries in \p Features that are implied to be enabled/disabled
152/// by the provided \p Feature.
153void updateImpliedFeatures(StringRef Feature, bool Enabled,
154 StringMap<bool> &Features);
155
156} // namespace X86
157} // namespace llvm
158
159#endif