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