]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCTargetDesc.h
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[FreeBSD/FreeBSD.git] / contrib / llvm / lib / Target / Hexagon / MCTargetDesc / HexagonMCTargetDesc.h
1 //===-- HexagonMCTargetDesc.h - Hexagon Target Descriptions -----*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file provides Hexagon specific target descriptions.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #ifndef LLVM_LIB_TARGET_HEXAGON_MCTARGETDESC_HEXAGONMCTARGETDESC_H
15 #define LLVM_LIB_TARGET_HEXAGON_MCTARGETDESC_HEXAGONMCTARGETDESC_H
16
17 #include "llvm/Support/CommandLine.h"
18 #include <cstdint>
19 #include <string>
20
21 #define Hexagon_POINTER_SIZE 4
22
23 #define Hexagon_PointerSize (Hexagon_POINTER_SIZE)
24 #define Hexagon_PointerSize_Bits (Hexagon_POINTER_SIZE * 8)
25 #define Hexagon_WordSize Hexagon_PointerSize
26 #define Hexagon_WordSize_Bits Hexagon_PointerSize_Bits
27
28 // allocframe saves LR and FP on stack before allocating
29 // a new stack frame. This takes 8 bytes.
30 #define HEXAGON_LRFP_SIZE 8
31
32 // Normal instruction size (in bytes).
33 #define HEXAGON_INSTR_SIZE 4
34
35 // Maximum number of words and instructions in a packet.
36 #define HEXAGON_PACKET_SIZE 4
37 #define HEXAGON_MAX_PACKET_SIZE (HEXAGON_PACKET_SIZE * HEXAGON_INSTR_SIZE)
38 // Minimum number of instructions in an end-loop packet.
39 #define HEXAGON_PACKET_INNER_SIZE 2
40 #define HEXAGON_PACKET_OUTER_SIZE 3
41 // Maximum number of instructions in a packet before shuffling,
42 // including a compound one or a duplex or an extender.
43 #define HEXAGON_PRESHUFFLE_PACKET_SIZE (HEXAGON_PACKET_SIZE + 3)
44
45 // Name of the global offset table as defined by the Hexagon ABI
46 #define HEXAGON_GOT_SYM_NAME "_GLOBAL_OFFSET_TABLE_"
47
48 namespace llvm {
49
50 struct InstrItinerary;
51 struct InstrStage;
52 class FeatureBitset;
53 class MCAsmBackend;
54 class MCCodeEmitter;
55 class MCContext;
56 class MCInstrInfo;
57 class MCObjectTargetWriter;
58 class MCRegisterInfo;
59 class MCSubtargetInfo;
60 class MCTargetOptions;
61 class Target;
62 class Triple;
63 class StringRef;
64 class raw_ostream;
65 class raw_pwrite_stream;
66
67 Target &getTheHexagonTarget();
68 extern cl::opt<bool> HexagonDisableCompound;
69 extern cl::opt<bool> HexagonDisableDuplex;
70 extern const InstrStage HexagonStages[];
71
72 MCInstrInfo *createHexagonMCInstrInfo();
73 MCRegisterInfo *createHexagonMCRegisterInfo(StringRef TT);
74
75 namespace Hexagon_MC {
76   StringRef selectHexagonCPU(StringRef CPU);
77
78   FeatureBitset completeHVXFeatures(const FeatureBitset &FB);
79   /// Create a Hexagon MCSubtargetInfo instance. This is exposed so Asm parser,
80   /// etc. do not need to go through TargetRegistry.
81   MCSubtargetInfo *createHexagonMCSubtargetInfo(const Triple &TT, StringRef CPU,
82                                                 StringRef FS);
83   unsigned GetELFFlags(const MCSubtargetInfo &STI);
84 }
85
86 MCCodeEmitter *createHexagonMCCodeEmitter(const MCInstrInfo &MCII,
87                                           const MCRegisterInfo &MRI,
88                                           MCContext &MCT);
89
90 MCAsmBackend *createHexagonAsmBackend(const Target &T,
91                                       const MCSubtargetInfo &STI,
92                                       const MCRegisterInfo &MRI,
93                                       const MCTargetOptions &Options);
94
95 std::unique_ptr<MCObjectTargetWriter>
96 createHexagonELFObjectWriter(uint8_t OSABI, StringRef CPU);
97
98 unsigned HexagonGetLastSlot();
99
100 } // End llvm namespace
101
102 // Define symbolic names for Hexagon registers.  This defines a mapping from
103 // register name to register number.
104 //
105 #define GET_REGINFO_ENUM
106 #include "HexagonGenRegisterInfo.inc"
107
108 // Defines symbolic names for the Hexagon instructions.
109 //
110 #define GET_INSTRINFO_ENUM
111 #define GET_INSTRINFO_SCHED_ENUM
112 #include "HexagonGenInstrInfo.inc"
113
114 #define GET_SUBTARGETINFO_ENUM
115 #include "HexagonGenSubtargetInfo.inc"
116
117 #endif // LLVM_LIB_TARGET_HEXAGON_MCTARGETDESC_HEXAGONMCTARGETDESC_H