106c3fb27SDimitry Andric //===-- LoongArchTargetParser - Parser for LoongArch features --*- C++ -*-====// 2bdd1243dSDimitry Andric // 3bdd1243dSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4bdd1243dSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5bdd1243dSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6bdd1243dSDimitry Andric // 7bdd1243dSDimitry Andric //===----------------------------------------------------------------------===// 8bdd1243dSDimitry Andric // 9bdd1243dSDimitry Andric // This file implements a target parser to recognise LoongArch hardware features 10bdd1243dSDimitry Andric // such as CPU/ARCH and extension names. 11bdd1243dSDimitry Andric // 12bdd1243dSDimitry Andric //===----------------------------------------------------------------------===// 13bdd1243dSDimitry Andric 14bdd1243dSDimitry Andric #include "llvm/TargetParser/LoongArchTargetParser.h" 15bdd1243dSDimitry Andric 16bdd1243dSDimitry Andric using namespace llvm; 17bdd1243dSDimitry Andric using namespace llvm::LoongArch; 18bdd1243dSDimitry Andric 19bdd1243dSDimitry Andric const FeatureInfo AllFeatures[] = { 20bdd1243dSDimitry Andric #define LOONGARCH_FEATURE(NAME, KIND) {NAME, KIND}, 21bdd1243dSDimitry Andric #include "llvm/TargetParser/LoongArchTargetParser.def" 22bdd1243dSDimitry Andric }; 23bdd1243dSDimitry Andric 24bdd1243dSDimitry Andric const ArchInfo AllArchs[] = { 25bdd1243dSDimitry Andric #define LOONGARCH_ARCH(NAME, KIND, FEATURES) \ 26bdd1243dSDimitry Andric {NAME, LoongArch::ArchKind::KIND, FEATURES}, 27bdd1243dSDimitry Andric #include "llvm/TargetParser/LoongArchTargetParser.def" 28bdd1243dSDimitry Andric }; 29bdd1243dSDimitry Andric 3006c3fb27SDimitry Andric bool LoongArch::isValidArchName(StringRef Arch) { 31bdd1243dSDimitry Andric for (const auto A : AllArchs) 32bdd1243dSDimitry Andric if (A.Name == Arch) 3306c3fb27SDimitry Andric return true; 3406c3fb27SDimitry Andric return false; 35bdd1243dSDimitry Andric } 36bdd1243dSDimitry Andric 37bdd1243dSDimitry Andric bool LoongArch::getArchFeatures(StringRef Arch, 38bdd1243dSDimitry Andric std::vector<StringRef> &Features) { 39bdd1243dSDimitry Andric for (const auto A : AllArchs) { 40bdd1243dSDimitry Andric if (A.Name == Arch) { 41bdd1243dSDimitry Andric for (const auto F : AllFeatures) 4206c3fb27SDimitry Andric if ((A.Features & F.Kind) == F.Kind) 43bdd1243dSDimitry Andric Features.push_back(F.Name); 44bdd1243dSDimitry Andric return true; 45bdd1243dSDimitry Andric } 46bdd1243dSDimitry Andric } 47*0fca6ea1SDimitry Andric 48*0fca6ea1SDimitry Andric if (Arch == "la64v1.0" || Arch == "la64v1.1") { 49*0fca6ea1SDimitry Andric Features.push_back("+64bit"); 50*0fca6ea1SDimitry Andric Features.push_back("+d"); 51*0fca6ea1SDimitry Andric Features.push_back("+lsx"); 52*0fca6ea1SDimitry Andric Features.push_back("+ual"); 53*0fca6ea1SDimitry Andric if (Arch == "la64v1.1") 54*0fca6ea1SDimitry Andric Features.push_back("+frecipe"); 55*0fca6ea1SDimitry Andric return true; 56*0fca6ea1SDimitry Andric } 57*0fca6ea1SDimitry Andric 58bdd1243dSDimitry Andric return false; 59bdd1243dSDimitry Andric } 608a4dda33SDimitry Andric 618a4dda33SDimitry Andric bool LoongArch::isValidCPUName(StringRef Name) { return isValidArchName(Name); } 628a4dda33SDimitry Andric 638a4dda33SDimitry Andric void LoongArch::fillValidCPUList(SmallVectorImpl<StringRef> &Values) { 648a4dda33SDimitry Andric for (const auto A : AllArchs) 658a4dda33SDimitry Andric Values.emplace_back(A.Name); 668a4dda33SDimitry Andric } 678a4dda33SDimitry Andric 688a4dda33SDimitry Andric StringRef LoongArch::getDefaultArch(bool Is64Bit) { 698a4dda33SDimitry Andric // TODO: use a real 32-bit arch name. 708a4dda33SDimitry Andric return Is64Bit ? "loongarch64" : ""; 718a4dda33SDimitry Andric } 72