xref: /freebsd-src/contrib/llvm-project/llvm/lib/TargetParser/LoongArchTargetParser.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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