]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/lib/Target/Hexagon/MCTargetDesc/HexagonMCCodeEmitter.h
Merge clang 7.0.1 and several follow-up changes
[FreeBSD/FreeBSD.git] / contrib / llvm / lib / Target / Hexagon / MCTargetDesc / HexagonMCCodeEmitter.h
1 //===- HexagonMCCodeEmitter.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 /// \file
11 /// Definition for classes that emit Hexagon machine code from MCInsts
12 ///
13 //===----------------------------------------------------------------------===//
14
15 #ifndef LLVM_LIB_TARGET_HEXAGON_MCTARGETDESC_HEXAGONMCCODEEMITTER_H
16 #define LLVM_LIB_TARGET_HEXAGON_MCTARGETDESC_HEXAGONMCCODEEMITTER_H
17
18 #include "MCTargetDesc/HexagonFixupKinds.h"
19 #include "llvm/MC/MCCodeEmitter.h"
20 #include "llvm/MC/MCExpr.h"
21 #include "llvm/MC/SubtargetFeature.h"
22 #include <cstddef>
23 #include <cstdint>
24 #include <memory>
25
26 namespace llvm {
27
28 class MCContext;
29 class MCInst;
30 class MCInstrInfo;
31 class MCOperand;
32 class MCSubtargetInfo;
33 class raw_ostream;
34
35 class HexagonMCCodeEmitter : public MCCodeEmitter {
36   MCContext &MCT;
37   MCInstrInfo const &MCII;
38
39   // A mutable state of the emitter when encoding bundles and duplexes.
40   struct EmitterState {
41     unsigned Addend = 0;
42     bool Extended = false;
43     bool SubInst1 = false;
44     const MCInst *Bundle = nullptr;
45     size_t Index = 0;
46   };
47   mutable EmitterState State;
48
49 public:
50   HexagonMCCodeEmitter(MCInstrInfo const &MII, MCContext &MCT)
51     : MCT(MCT), MCII(MII) {}
52
53   void encodeInstruction(MCInst const &MI, raw_ostream &OS,
54                          SmallVectorImpl<MCFixup> &Fixups,
55                          MCSubtargetInfo const &STI) const override;
56
57   void EncodeSingleInstruction(const MCInst &MI, raw_ostream &OS,
58                                SmallVectorImpl<MCFixup> &Fixups,
59                                const MCSubtargetInfo &STI,
60                                uint32_t Parse) const;
61
62   // TableGen'erated function for getting the
63   // binary encoding for an instruction.
64   uint64_t getBinaryCodeForInstr(MCInst const &MI,
65                                  SmallVectorImpl<MCFixup> &Fixups,
66                                  MCSubtargetInfo const &STI) const;
67
68   /// Return binary encoding of operand.
69   unsigned getMachineOpValue(MCInst const &MI, MCOperand const &MO,
70                              SmallVectorImpl<MCFixup> &Fixups,
71                              MCSubtargetInfo const &STI) const;
72
73 private:
74   // helper routine for getMachineOpValue()
75   unsigned getExprOpValue(const MCInst &MI, const MCOperand &MO,
76                           const MCExpr *ME, SmallVectorImpl<MCFixup> &Fixups,
77                           const MCSubtargetInfo &STI) const;
78
79   Hexagon::Fixups getFixupNoBits(MCInstrInfo const &MCII, const MCInst &MI,
80                                  const MCOperand &MO,
81                                  const MCSymbolRefExpr::VariantKind Kind) const;
82
83   // Return parse bits for instruction `MCI' inside bundle `MCB'
84   uint32_t parseBits(size_t Last, MCInst const &MCB, MCInst const &MCI) const;
85
86   uint64_t computeAvailableFeatures(const FeatureBitset &FB) const;
87   void verifyInstructionPredicates(const MCInst &MI,
88                                    uint64_t AvailableFeatures) const;
89 };
90
91 } // end namespace llvm
92
93 #endif // LLVM_LIB_TARGET_HEXAGON_MCTARGETDESC_HEXAGONMCCODEEMITTER_H