//===-- 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(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 &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" }