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