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
isValidArchName(StringRef Arch)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
getArchFeatures(StringRef Arch,std::vector<StringRef> & Features)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
isValidCPUName(StringRef Name)618a4dda33SDimitry Andric bool LoongArch::isValidCPUName(StringRef Name) { return isValidArchName(Name); }
628a4dda33SDimitry Andric
fillValidCPUList(SmallVectorImpl<StringRef> & Values)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
getDefaultArch(bool Is64Bit)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