blob: ba85ed7ee6260c46ab49a167ae1ec64525aa0ee9 [file] [log] [blame]
//===-- 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.
//
//===----------------------------------------------------------------------===//
#include "llvm/Support/X86TargetParser.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/ADT/Triple.h"
using namespace llvm;
bool checkCPUKind(llvm::X86::CPUKind Kind, bool Only64Bit) {
using namespace X86;
// Perform any per-CPU checks necessary to determine if this CPU is
// acceptable.
switch (Kind) {
case CK_None:
// No processor selected!
return false;
#define PROC(ENUM, STRING, IS64BIT) \
case CK_##ENUM: \
return IS64BIT || !Only64Bit;
#include "llvm/Support/X86TargetParser.def"
}
llvm_unreachable("Unhandled CPU kind");
}
X86::CPUKind llvm::X86::parseArchX86(StringRef CPU, bool Only64Bit) {
X86::CPUKind Kind = llvm::StringSwitch<CPUKind>(CPU)
#define PROC(ENUM, STRING, IS64BIT) .Case(STRING, CK_##ENUM)
#define PROC_ALIAS(ENUM, ALIAS) .Case(ALIAS, CK_##ENUM)
#include "llvm/Support/X86TargetParser.def"
.Default(CK_None);
if (!checkCPUKind(Kind, Only64Bit))
Kind = CK_None;
return Kind;
}
void llvm::X86::fillValidCPUArchList(SmallVectorImpl<StringRef> &Values,
bool Only64Bit) {
#define PROC(ENUM, STRING, IS64BIT) \
if (IS64BIT || !Only64Bit) \
Values.emplace_back(STRING);
// For aliases we need to lookup the CPUKind to get the 64-bit ness.
#define PROC_ALIAS(ENUM, ALIAS) \
if (checkCPUKind(CK_##ENUM, Only64Bit)) \
Values.emplace_back(ALIAS);
#include "llvm/Support/X86TargetParser.def"
}