//===-- 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_TARGETPARSER_X86TARGETPARSER_H
 
#define LLVM_TARGETPARSER_X86TARGETPARSER_H
 
 
 
#include "llvm/ADT/ArrayRef.h"
 
#include "llvm/ADT/StringMap.h"
 
 
 
namespace llvm {
 
template <typename T> class SmallVectorImpl;
 
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/TargetParser/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/TargetParser/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/TargetParser/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/TargetParser/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_Rocketlake,
 
  CK_IcelakeServer,
 
  CK_Tigerlake,
 
  CK_SapphireRapids,
 
  CK_Alderlake,
 
  CK_Raptorlake,
 
  CK_Meteorlake,
 
  CK_Sierraforest,
 
  CK_Grandridge,
 
  CK_Graniterapids,
 
  CK_Emeraldrapids,
 
  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_ZNVER4,
 
  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);
 
 
 
uint64_t getCpuSupportsMask(ArrayRef<StringRef> FeatureStrs);
 
unsigned getFeaturePriority(ProcessorFeatures Feat);
 
 
 
} // namespace X86
 
} // namespace llvm
 
 
 
#endif