xref: /freebsd-src/contrib/llvm-project/llvm/include/llvm/TargetParser/LoongArchTargetParser.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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   // Floating-point approximate reciprocal instructions are available.
51   FK_FRECIPE = 1 << 9,
52 };
53 
54 struct FeatureInfo {
55   StringRef Name;
56   FeatureKind Kind;
57 };
58 
59 enum class ArchKind {
60 #define LOONGARCH_ARCH(NAME, KIND, FEATURES) KIND,
61 #include "LoongArchTargetParser.def"
62 };
63 
64 struct ArchInfo {
65   StringRef Name;
66   ArchKind Kind;
67   uint32_t Features;
68 };
69 
70 bool isValidArchName(StringRef Arch);
71 bool getArchFeatures(StringRef Arch, std::vector<StringRef> &Features);
72 bool isValidCPUName(StringRef TuneCPU);
73 void fillValidCPUList(SmallVectorImpl<StringRef> &Values);
74 StringRef getDefaultArch(bool Is64Bit);
75 
76 } // namespace LoongArch
77 
78 } // namespace llvm
79 
80 #endif // LLVM_TARGETPARSER_LOONGARCHTARGETPARSER_H
81