160 lines
3.9 KiB
C++
160 lines
3.9 KiB
C++
//===-- X86TargetParser - Parser for X86 features ---------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file implements a target parser to recognise X86 hardware features.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_SUPPORT_X86TARGETPARSERCOMMON_H
|
|
#define LLVM_SUPPORT_X86TARGETPARSERCOMMON_H
|
|
|
|
#include "llvm/ADT/SmallVector.h"
|
|
#include "llvm/ADT/StringMap.h"
|
|
|
|
namespace llvm {
|
|
class StringRef;
|
|
|
|
namespace X86 {
|
|
|
|
// This should be kept in sync with libcc/compiler-rt as its included by clang
|
|
// as a proxy for what's in libgcc/compiler-rt.
|
|
enum ProcessorVendors : unsigned {
|
|
VENDOR_DUMMY,
|
|
#define X86_VENDOR(ENUM, STRING) \
|
|
ENUM,
|
|
#include "llvm/Support/X86TargetParser.def"
|
|
VENDOR_OTHER
|
|
};
|
|
|
|
// This should be kept in sync with libcc/compiler-rt as its included by clang
|
|
// as a proxy for what's in libgcc/compiler-rt.
|
|
enum ProcessorTypes : unsigned {
|
|
CPU_TYPE_DUMMY,
|
|
#define X86_CPU_TYPE(ENUM, STRING) \
|
|
ENUM,
|
|
#include "llvm/Support/X86TargetParser.def"
|
|
CPU_TYPE_MAX
|
|
};
|
|
|
|
// This should be kept in sync with libcc/compiler-rt as its included by clang
|
|
// as a proxy for what's in libgcc/compiler-rt.
|
|
enum ProcessorSubtypes : unsigned {
|
|
CPU_SUBTYPE_DUMMY,
|
|
#define X86_CPU_SUBTYPE(ENUM, STRING) \
|
|
ENUM,
|
|
#include "llvm/Support/X86TargetParser.def"
|
|
CPU_SUBTYPE_MAX
|
|
};
|
|
|
|
// This should be kept in sync with libcc/compiler-rt as it should be used
|
|
// by clang as a proxy for what's in libgcc/compiler-rt.
|
|
enum ProcessorFeatures {
|
|
#define X86_FEATURE(ENUM, STRING) FEATURE_##ENUM,
|
|
#include "llvm/Support/X86TargetParser.def"
|
|
CPU_FEATURE_MAX
|
|
};
|
|
|
|
enum CPUKind {
|
|
CK_None,
|
|
CK_i386,
|
|
CK_i486,
|
|
CK_WinChipC6,
|
|
CK_WinChip2,
|
|
CK_C3,
|
|
CK_i586,
|
|
CK_Pentium,
|
|
CK_PentiumMMX,
|
|
CK_PentiumPro,
|
|
CK_i686,
|
|
CK_Pentium2,
|
|
CK_Pentium3,
|
|
CK_PentiumM,
|
|
CK_C3_2,
|
|
CK_Yonah,
|
|
CK_Pentium4,
|
|
CK_Prescott,
|
|
CK_Nocona,
|
|
CK_Core2,
|
|
CK_Penryn,
|
|
CK_Bonnell,
|
|
CK_Silvermont,
|
|
CK_Goldmont,
|
|
CK_GoldmontPlus,
|
|
CK_Tremont,
|
|
CK_Nehalem,
|
|
CK_Westmere,
|
|
CK_SandyBridge,
|
|
CK_IvyBridge,
|
|
CK_Haswell,
|
|
CK_Broadwell,
|
|
CK_SkylakeClient,
|
|
CK_SkylakeServer,
|
|
CK_Cascadelake,
|
|
CK_Cooperlake,
|
|
CK_Cannonlake,
|
|
CK_IcelakeClient,
|
|
CK_IcelakeServer,
|
|
CK_Tigerlake,
|
|
CK_SapphireRapids,
|
|
CK_Alderlake,
|
|
CK_KNL,
|
|
CK_KNM,
|
|
CK_Lakemont,
|
|
CK_K6,
|
|
CK_K6_2,
|
|
CK_K6_3,
|
|
CK_Athlon,
|
|
CK_AthlonXP,
|
|
CK_K8,
|
|
CK_K8SSE3,
|
|
CK_AMDFAM10,
|
|
CK_BTVER1,
|
|
CK_BTVER2,
|
|
CK_BDVER1,
|
|
CK_BDVER2,
|
|
CK_BDVER3,
|
|
CK_BDVER4,
|
|
CK_ZNVER1,
|
|
CK_ZNVER2,
|
|
CK_ZNVER3,
|
|
CK_x86_64,
|
|
CK_x86_64_v2,
|
|
CK_x86_64_v3,
|
|
CK_x86_64_v4,
|
|
CK_Geode,
|
|
};
|
|
|
|
/// Parse \p CPU string into a CPUKind. Will only accept 64-bit capable CPUs if
|
|
/// \p Only64Bit is true.
|
|
CPUKind parseArchX86(StringRef CPU, bool Only64Bit = false);
|
|
CPUKind parseTuneCPU(StringRef CPU, bool Only64Bit = false);
|
|
|
|
/// Provide a list of valid CPU names. If \p Only64Bit is true, the list will
|
|
/// only contain 64-bit capable CPUs.
|
|
void fillValidCPUArchList(SmallVectorImpl<StringRef> &Values,
|
|
bool Only64Bit = false);
|
|
/// Provide a list of valid -mtune names.
|
|
void fillValidTuneCPUList(SmallVectorImpl<StringRef> &Values,
|
|
bool Only64Bit = false);
|
|
|
|
/// Get the key feature prioritizing target multiversioning.
|
|
ProcessorFeatures getKeyFeature(CPUKind Kind);
|
|
|
|
/// Fill in the features that \p CPU supports into \p Features.
|
|
void getFeaturesForCPU(StringRef CPU, SmallVectorImpl<StringRef> &Features);
|
|
|
|
/// Set or clear entries in \p Features that are implied to be enabled/disabled
|
|
/// by the provided \p Feature.
|
|
void updateImpliedFeatures(StringRef Feature, bool Enabled,
|
|
StringMap<bool> &Features);
|
|
|
|
} // namespace X86
|
|
} // namespace llvm
|
|
|
|
#endif
|