brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.8 KiB · 5fea08e Raw
183 lines · cpp
1//===-- TargetParser - Parser for target features ---------------*- C++ -*-===//2//3//                     The LLVM Compiler Infrastructure4//5// This file is distributed under the University of Illinois Open Source6// License. See LICENSE.TXT for details.7//8//===----------------------------------------------------------------------===//9//10// This file implements a target parser to recognise CSKY hardware features11// such as CPU/ARCH names.12//13//===----------------------------------------------------------------------===//14 15#include "llvm/TargetParser/CSKYTargetParser.h"16#include "llvm/ADT/SmallVector.h"17#include "llvm/ADT/StringSwitch.h"18 19using namespace llvm;20 21bool CSKY::getFPUFeatures(CSKYFPUKind CSKYFPUKind,22                          std::vector<StringRef> &Features) {23 24  if (CSKYFPUKind >= FK_LAST || CSKYFPUKind == FK_INVALID)25    return false;26 27  switch (CSKYFPUKind) {28  case FK_AUTO:29    Features.push_back("+fpuv2_sf");30    Features.push_back("+fpuv2_df");31    Features.push_back("+fdivdu");32    break;33  case FK_FPV2:34    Features.push_back("+fpuv2_sf");35    Features.push_back("+fpuv2_df");36    break;37  case FK_FPV2_DIVD:38    Features.push_back("+fpuv2_sf");39    Features.push_back("+fpuv2_df");40    Features.push_back("+fdivdu");41    break;42  case FK_FPV2_SF:43    Features.push_back("+fpuv2_sf");44    break;45  case FK_FPV3:46    Features.push_back("+fpuv3_hf");47    Features.push_back("+fpuv3_hi");48    Features.push_back("+fpuv3_sf");49    Features.push_back("+fpuv3_df");50    break;51  case FK_FPV3_HF:52    Features.push_back("+fpuv3_hf");53    Features.push_back("+fpuv3_hi");54    break;55  case FK_FPV3_HSF:56    Features.push_back("+fpuv3_hf");57    Features.push_back("+fpuv3_hi");58    Features.push_back("+fpuv3_sf");59    break;60  case FK_FPV3_SDF:61    Features.push_back("+fpuv3_sf");62    Features.push_back("+fpuv3_df");63    break;64  default:65    llvm_unreachable("Unknown FPU Kind");66    return false;67  }68 69  return true;70}71 72// ======================================================= //73// Information by ID74// ======================================================= //75 76StringRef CSKY::getArchName(ArchKind AK) {77  return ARCHNames[static_cast<unsigned>(AK)].getName();78}79 80// The default cpu's name is same as arch name.81StringRef CSKY::getDefaultCPU(StringRef Arch) {82  ArchKind AK = parseArch(Arch);83  if (AK == CSKY::ArchKind::INVALID)84    return StringRef();85 86  return Arch;87}88 89// ======================================================= //90// Parsers91// ======================================================= //92CSKY::ArchKind CSKY::parseArch(StringRef Arch) {93  for (const auto A : ARCHNames) {94    if (A.getName() == Arch)95      return A.ID;96  }97 98  return CSKY::ArchKind::INVALID;99}100 101CSKY::ArchKind CSKY::parseCPUArch(StringRef CPU) {102  for (const auto C : CPUNames) {103    if (CPU == C.getName())104      return C.ArchID;105  }106 107  return CSKY::ArchKind::INVALID;108}109 110uint64_t CSKY::parseArchExt(StringRef ArchExt) {111  for (const auto &A : CSKYARCHExtNames) {112    if (ArchExt == A.getName())113      return A.ID;114  }115  return AEK_INVALID;116}117 118void CSKY::fillValidCPUArchList(SmallVectorImpl<StringRef> &Values) {119  for (const CpuNames<CSKY::ArchKind> &Arch : CPUNames) {120    if (Arch.ArchID != CSKY::ArchKind::INVALID)121      Values.push_back(Arch.getName());122  }123}124 125StringRef CSKY::getFPUName(unsigned FPUKind) {126  if (FPUKind >= FK_LAST)127    return StringRef();128  return FPUNames[FPUKind].getName();129}130 131CSKY::FPUVersion CSKY::getFPUVersion(unsigned FPUKind) {132  if (FPUKind >= FK_LAST)133    return FPUVersion::NONE;134  return FPUNames[FPUKind].FPUVer;135}136 137uint64_t CSKY::getDefaultExtensions(StringRef CPU) {138  return StringSwitch<uint64_t>(CPU)139#define CSKY_CPU_NAME(NAME, ID, DEFAULT_EXT)                                   \140  .Case(NAME, ARCHNames[static_cast<unsigned>(ArchKind::ID)].archBaseExt |     \141                  DEFAULT_EXT)142#include "llvm/TargetParser/CSKYTargetParser.def"143      .Default(CSKY::AEK_INVALID);144}145 146StringRef CSKY::getArchExtName(uint64_t ArchExtKind) {147  for (const auto &AE : CSKYARCHExtNames)148    if (ArchExtKind == AE.ID)149      return AE.getName();150  return StringRef();151}152 153static bool stripNegationPrefix(StringRef &Name) {154  if (Name.starts_with("no")) {155    Name = Name.substr(2);156    return true;157  }158  return false;159}160 161StringRef CSKY::getArchExtFeature(StringRef ArchExt) {162  bool Negated = stripNegationPrefix(ArchExt);163  for (const auto &AE : CSKYARCHExtNames) {164    if (AE.Feature && ArchExt == AE.getName())165      return StringRef(Negated ? AE.NegFeature : AE.Feature);166  }167 168  return StringRef();169}170 171bool CSKY::getExtensionFeatures(uint64_t Extensions,172                                std::vector<StringRef> &Features) {173  if (Extensions == CSKY::AEK_INVALID)174    return false;175 176  for (const auto &AE : CSKYARCHExtNames) {177    if ((Extensions & AE.ID) == AE.ID && AE.Feature)178      Features.push_back(AE.Feature);179  }180 181  return true;182}183