Path: blob/main/contrib/llvm-project/llvm/lib/TargetParser/CSKYTargetParser.cpp
35233 views
//===-- TargetParser - Parser for target features ---------------*- C++ -*-===//1//2// The LLVM Compiler Infrastructure3//4// This file is distributed under the University of Illinois Open Source5// License. See LICENSE.TXT for details.6//7//===----------------------------------------------------------------------===//8//9// This file implements a target parser to recognise CSKY hardware features10// such as CPU/ARCH names.11//12//===----------------------------------------------------------------------===//1314#include "llvm/TargetParser/CSKYTargetParser.h"15#include "llvm/ADT/StringSwitch.h"1617using namespace llvm;1819bool CSKY::getFPUFeatures(CSKYFPUKind CSKYFPUKind,20std::vector<StringRef> &Features) {2122if (CSKYFPUKind >= FK_LAST || CSKYFPUKind == FK_INVALID)23return false;2425switch (CSKYFPUKind) {26case FK_AUTO:27Features.push_back("+fpuv2_sf");28Features.push_back("+fpuv2_df");29Features.push_back("+fdivdu");30break;31case FK_FPV2:32Features.push_back("+fpuv2_sf");33Features.push_back("+fpuv2_df");34break;35case FK_FPV2_DIVD:36Features.push_back("+fpuv2_sf");37Features.push_back("+fpuv2_df");38Features.push_back("+fdivdu");39break;40case FK_FPV2_SF:41Features.push_back("+fpuv2_sf");42break;43case FK_FPV3:44Features.push_back("+fpuv3_hf");45Features.push_back("+fpuv3_hi");46Features.push_back("+fpuv3_sf");47Features.push_back("+fpuv3_df");48break;49case FK_FPV3_HF:50Features.push_back("+fpuv3_hf");51Features.push_back("+fpuv3_hi");52break;53case FK_FPV3_HSF:54Features.push_back("+fpuv3_hf");55Features.push_back("+fpuv3_hi");56Features.push_back("+fpuv3_sf");57break;58case FK_FPV3_SDF:59Features.push_back("+fpuv3_sf");60Features.push_back("+fpuv3_df");61break;62default:63llvm_unreachable("Unknown FPU Kind");64return false;65}6667return true;68}6970// ======================================================= //71// Information by ID72// ======================================================= //7374StringRef CSKY::getArchName(ArchKind AK) {75return ARCHNames[static_cast<unsigned>(AK)].getName();76}7778// The default cpu's name is same as arch name.79StringRef CSKY::getDefaultCPU(StringRef Arch) {80ArchKind AK = parseArch(Arch);81if (AK == CSKY::ArchKind::INVALID)82return StringRef();8384return Arch;85}8687// ======================================================= //88// Parsers89// ======================================================= //90CSKY::ArchKind CSKY::parseArch(StringRef Arch) {91for (const auto A : ARCHNames) {92if (A.getName() == Arch)93return A.ID;94}9596return CSKY::ArchKind::INVALID;97}9899CSKY::ArchKind CSKY::parseCPUArch(StringRef CPU) {100for (const auto C : CPUNames) {101if (CPU == C.getName())102return C.ArchID;103}104105return CSKY::ArchKind::INVALID;106}107108uint64_t CSKY::parseArchExt(StringRef ArchExt) {109for (const auto &A : CSKYARCHExtNames) {110if (ArchExt == A.getName())111return A.ID;112}113return AEK_INVALID;114}115116void CSKY::fillValidCPUArchList(SmallVectorImpl<StringRef> &Values) {117for (const CpuNames<CSKY::ArchKind> &Arch : CPUNames) {118if (Arch.ArchID != CSKY::ArchKind::INVALID)119Values.push_back(Arch.getName());120}121}122123StringRef CSKY::getFPUName(unsigned FPUKind) {124if (FPUKind >= FK_LAST)125return StringRef();126return FPUNames[FPUKind].getName();127}128129CSKY::FPUVersion CSKY::getFPUVersion(unsigned FPUKind) {130if (FPUKind >= FK_LAST)131return FPUVersion::NONE;132return FPUNames[FPUKind].FPUVer;133}134135uint64_t CSKY::getDefaultExtensions(StringRef CPU) {136return StringSwitch<uint64_t>(CPU)137#define CSKY_CPU_NAME(NAME, ID, DEFAULT_EXT) \138.Case(NAME, ARCHNames[static_cast<unsigned>(ArchKind::ID)].archBaseExt | \139DEFAULT_EXT)140#include "llvm/TargetParser/CSKYTargetParser.def"141.Default(CSKY::AEK_INVALID);142}143144StringRef CSKY::getArchExtName(uint64_t ArchExtKind) {145for (const auto &AE : CSKYARCHExtNames)146if (ArchExtKind == AE.ID)147return AE.getName();148return StringRef();149}150151static bool stripNegationPrefix(StringRef &Name) {152if (Name.starts_with("no")) {153Name = Name.substr(2);154return true;155}156return false;157}158159StringRef CSKY::getArchExtFeature(StringRef ArchExt) {160bool Negated = stripNegationPrefix(ArchExt);161for (const auto &AE : CSKYARCHExtNames) {162if (AE.Feature && ArchExt == AE.getName())163return StringRef(Negated ? AE.NegFeature : AE.Feature);164}165166return StringRef();167}168169bool CSKY::getExtensionFeatures(uint64_t Extensions,170std::vector<StringRef> &Features) {171if (Extensions == CSKY::AEK_INVALID)172return false;173174for (const auto &AE : CSKYARCHExtNames) {175if ((Extensions & AE.ID) == AE.ID && AE.Feature)176Features.push_back(AE.Feature);177}178179return true;180}181182183