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