xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchBaseInfo.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
181ad6265SDimitry Andric //=- LoongArchBaseInfo.h - Top level definitions for LoongArch MC -*- C++ -*-=//
281ad6265SDimitry Andric //
381ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
481ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
581ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
681ad6265SDimitry Andric //
781ad6265SDimitry Andric //===----------------------------------------------------------------------===//
881ad6265SDimitry Andric //
981ad6265SDimitry Andric // This file contains small standalone enum definitions and helper function
1081ad6265SDimitry Andric // definitions for the LoongArch target useful for the compiler back-end and the
1181ad6265SDimitry Andric // MC libraries.
1281ad6265SDimitry Andric //
1381ad6265SDimitry Andric //===----------------------------------------------------------------------===//
1481ad6265SDimitry Andric #ifndef LLVM_LIB_TARGET_LOONGARCH_MCTARGETDESC_LOONGARCHBASEINFO_H
1581ad6265SDimitry Andric #define LLVM_LIB_TARGET_LOONGARCH_MCTARGETDESC_LOONGARCHBASEINFO_H
1681ad6265SDimitry Andric 
1781ad6265SDimitry Andric #include "MCTargetDesc/LoongArchMCTargetDesc.h"
1881ad6265SDimitry Andric #include "llvm/ADT/StringRef.h"
1981ad6265SDimitry Andric #include "llvm/ADT/StringSwitch.h"
2081ad6265SDimitry Andric #include "llvm/MC/MCInstrDesc.h"
2106c3fb27SDimitry Andric #include "llvm/TargetParser/SubtargetFeature.h"
2281ad6265SDimitry Andric 
2381ad6265SDimitry Andric namespace llvm {
2481ad6265SDimitry Andric 
25bdd1243dSDimitry Andric // This namespace holds all of the target specific flags that instruction info
26bdd1243dSDimitry Andric // tracks.
27bdd1243dSDimitry Andric namespace LoongArchII {
28bdd1243dSDimitry Andric enum {
29bdd1243dSDimitry Andric   MO_None,
30bdd1243dSDimitry Andric   MO_CALL,
31bdd1243dSDimitry Andric   MO_CALL_PLT,
32bdd1243dSDimitry Andric   MO_PCREL_HI,
33bdd1243dSDimitry Andric   MO_PCREL_LO,
3406c3fb27SDimitry Andric   MO_PCREL64_LO,
3506c3fb27SDimitry Andric   MO_PCREL64_HI,
36bdd1243dSDimitry Andric   MO_GOT_PC_HI,
37bdd1243dSDimitry Andric   MO_GOT_PC_LO,
3806c3fb27SDimitry Andric   MO_GOT_PC64_LO,
3906c3fb27SDimitry Andric   MO_GOT_PC64_HI,
40bdd1243dSDimitry Andric   MO_LE_HI,
41bdd1243dSDimitry Andric   MO_LE_LO,
4206c3fb27SDimitry Andric   MO_LE64_LO,
4306c3fb27SDimitry Andric   MO_LE64_HI,
44bdd1243dSDimitry Andric   MO_IE_PC_HI,
45bdd1243dSDimitry Andric   MO_IE_PC_LO,
4606c3fb27SDimitry Andric   MO_IE_PC64_LO,
4706c3fb27SDimitry Andric   MO_IE_PC64_HI,
48bdd1243dSDimitry Andric   MO_LD_PC_HI,
49bdd1243dSDimitry Andric   MO_GD_PC_HI,
50*0fca6ea1SDimitry Andric   MO_CALL36,
51*0fca6ea1SDimitry Andric   MO_DESC_PC_HI,
52*0fca6ea1SDimitry Andric   MO_DESC_PC_LO,
53*0fca6ea1SDimitry Andric   MO_DESC64_PC_HI,
54*0fca6ea1SDimitry Andric   MO_DESC64_PC_LO,
55*0fca6ea1SDimitry Andric   MO_DESC_LD,
56*0fca6ea1SDimitry Andric   MO_DESC_CALL,
57bdd1243dSDimitry Andric   // TODO: Add more flags.
58bdd1243dSDimitry Andric };
59bdd1243dSDimitry Andric } // end namespace LoongArchII
60bdd1243dSDimitry Andric 
6181ad6265SDimitry Andric namespace LoongArchABI {
6281ad6265SDimitry Andric enum ABI {
6381ad6265SDimitry Andric   ABI_ILP32S,
6481ad6265SDimitry Andric   ABI_ILP32F,
6581ad6265SDimitry Andric   ABI_ILP32D,
6681ad6265SDimitry Andric   ABI_LP64S,
6781ad6265SDimitry Andric   ABI_LP64F,
6881ad6265SDimitry Andric   ABI_LP64D,
6981ad6265SDimitry Andric   ABI_Unknown
7081ad6265SDimitry Andric };
7181ad6265SDimitry Andric 
72*0fca6ea1SDimitry Andric ABI computeTargetABI(const Triple &TT, const FeatureBitset &FeatureBits,
73*0fca6ea1SDimitry Andric                      StringRef ABIName);
7481ad6265SDimitry Andric ABI getTargetABI(StringRef ABIName);
7581ad6265SDimitry Andric 
7681ad6265SDimitry Andric // Returns the register used to hold the stack pointer after realignment.
7781ad6265SDimitry Andric MCRegister getBPReg();
78972a253aSDimitry Andric } // end namespace LoongArchABI
7981ad6265SDimitry Andric 
80972a253aSDimitry Andric } // end namespace llvm
8181ad6265SDimitry Andric 
8281ad6265SDimitry Andric #endif // LLVM_LIB_TARGET_LOONGARCH_MCTARGETDESC_LOONGARCHBASEINFO_H
83