1 //==-- LoongArch64TargetParser - Parser for LoongArch64 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 #ifndef LLVM_TARGETPARSER_LOONGARCHTARGETPARSER_H
15 #define LLVM_TARGETPARSER_LOONGARCHTARGETPARSER_H
16 
17 #include "llvm/TargetParser/Triple.h"
18 #include <vector>
19 
20 namespace llvm {
21 class StringRef;
22 
23 namespace LoongArch {
24 
25 enum FeatureKind : uint32_t {
26   // 64-bit ISA is available.
27   FK_64BIT = 1 << 1,
28 
29   // Single-precision floating-point instructions are available.
30   FK_FP32 = 1 << 2,
31 
32   // Double-precision floating-point instructions are available.
33   FK_FP64 = 1 << 3,
34 
35   // Loongson SIMD Extension is available.
36   FK_LSX = 1 << 4,
37 
38   // Loongson Advanced SIMD Extension is available.
39   FK_LASX = 1 << 5,
40 
41   // Loongson Binary Translation Extension is available.
42   FK_LBT = 1 << 6,
43 
44   // Loongson Virtualization Extension is available.
45   FK_LVZ = 1 << 7,
46 
47   // Allow memory accesses to be unaligned.
48   FK_UAL = 1 << 8,
49 };
50 
51 struct FeatureInfo {
52   StringRef Name;
53   FeatureKind Kind;
54 };
55 
56 enum class ArchKind {
57 #define LOONGARCH_ARCH(NAME, KIND, FEATURES) KIND,
58 #include "LoongArchTargetParser.def"
59 };
60 
61 struct ArchInfo {
62   StringRef Name;
63   ArchKind Kind;
64   uint32_t Features;
65 };
66 
67 bool isValidArchName(StringRef Arch);
68 bool getArchFeatures(StringRef Arch, std::vector<StringRef> &Features);
69 bool isValidCPUName(StringRef TuneCPU);
70 void fillValidCPUList(SmallVectorImpl<StringRef> &Values);
71 StringRef getDefaultArch(bool Is64Bit);
72 
73 } // namespace LoongArch
74 
75 } // namespace llvm
76 
77 #endif // LLVM_TARGETPARSER_LOONGARCHTARGETPARSER_H
78