1//===-- PPCMCCodeEmitter.h - Convert PPC code to machine code -------------===//
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 the PPCMCCodeEmitter class.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_LIB_TARGET_PPC_MCCODEEMITTER_PPCCODEEMITTER_H
14#define LLVM_LIB_TARGET_PPC_MCCODEEMITTER_PPCCODEEMITTER_H
15
16#include "llvm/MC/MCAsmInfo.h"
17#include "llvm/MC/MCCodeEmitter.h"
18#include "llvm/MC/MCSubtargetInfo.h"
19#include "llvm/MC/MCInstrInfo.h"
20#include "llvm/MC/MCContext.h"
21#include "llvm/MC/MCInst.h"
22
23namespace llvm {
24
25class PPCMCCodeEmitter : public MCCodeEmitter {
26 const MCInstrInfo &MCII;
27 const MCContext &CTX;
28 bool IsLittleEndian;
29
30public:
31 PPCMCCodeEmitter(const MCInstrInfo &mcii, MCContext &ctx)
32 : MCII(mcii), CTX(ctx),
33 IsLittleEndian(ctx.getAsmInfo()->isLittleEndian()) {}
34 PPCMCCodeEmitter(const PPCMCCodeEmitter &) = delete;
35 void operator=(const PPCMCCodeEmitter &) = delete;
36 ~PPCMCCodeEmitter() override = default;
37
38 unsigned getDirectBrEncoding(const MCInst &MI, unsigned OpNo,
39 SmallVectorImpl<MCFixup> &Fixups,
40 const MCSubtargetInfo &STI) const;
41 unsigned getCondBrEncoding(const MCInst &MI, unsigned OpNo,
42 SmallVectorImpl<MCFixup> &Fixups,
43 const MCSubtargetInfo &STI) const;
44 unsigned getAbsDirectBrEncoding(const MCInst &MI, unsigned OpNo,
45 SmallVectorImpl<MCFixup> &Fixups,
46 const MCSubtargetInfo &STI) const;
47 unsigned getAbsCondBrEncoding(const MCInst &MI, unsigned OpNo,
48 SmallVectorImpl<MCFixup> &Fixups,
49 const MCSubtargetInfo &STI) const;
50 template <MCFixupKind Fixup>
51 uint64_t getImmEncoding(const MCInst &MI, unsigned OpNo,
52 SmallVectorImpl<MCFixup> &Fixups,
53 const MCSubtargetInfo &STI) const;
54 unsigned getDispRIEncoding(const MCInst &MI, unsigned OpNo,
55 SmallVectorImpl<MCFixup> &Fixups,
56 const MCSubtargetInfo &STI) const;
57 unsigned getDispRIXEncoding(const MCInst &MI, unsigned OpNo,
58 SmallVectorImpl<MCFixup> &Fixups,
59 const MCSubtargetInfo &STI) const;
60 unsigned getDispRIX16Encoding(const MCInst &MI, unsigned OpNo,
61 SmallVectorImpl<MCFixup> &Fixups,
62 const MCSubtargetInfo &STI) const;
63 unsigned getDispRIHashEncoding(const MCInst &MI, unsigned OpNo,
64 SmallVectorImpl<MCFixup> &Fixups,
65 const MCSubtargetInfo &STI) const;
66 uint64_t getDispRI34PCRelEncoding(const MCInst &MI, unsigned OpNo,
67 SmallVectorImpl<MCFixup> &Fixups,
68 const MCSubtargetInfo &STI) const;
69 uint64_t getDispRI34Encoding(const MCInst &MI, unsigned OpNo,
70 SmallVectorImpl<MCFixup> &Fixups,
71 const MCSubtargetInfo &STI) const;
72 unsigned getDispSPE8Encoding(const MCInst &MI, unsigned OpNo,
73 SmallVectorImpl<MCFixup> &Fixups,
74 const MCSubtargetInfo &STI) const;
75 unsigned getDispSPE4Encoding(const MCInst &MI, unsigned OpNo,
76 SmallVectorImpl<MCFixup> &Fixups,
77 const MCSubtargetInfo &STI) const;
78 unsigned getDispSPE2Encoding(const MCInst &MI, unsigned OpNo,
79 SmallVectorImpl<MCFixup> &Fixups,
80 const MCSubtargetInfo &STI) const;
81 unsigned getTLSRegEncoding(const MCInst &MI, unsigned OpNo,
82 SmallVectorImpl<MCFixup> &Fixups,
83 const MCSubtargetInfo &STI) const;
84 unsigned getTLSCallEncoding(const MCInst &MI, unsigned OpNo,
85 SmallVectorImpl<MCFixup> &Fixups,
86 const MCSubtargetInfo &STI) const;
87 unsigned get_crbitm_encoding(const MCInst &MI, unsigned OpNo,
88 SmallVectorImpl<MCFixup> &Fixups,
89 const MCSubtargetInfo &STI) const;
90 unsigned getVSRpEvenEncoding(const MCInst &MI, unsigned OpNo,
91 SmallVectorImpl<MCFixup> &Fixups,
92 const MCSubtargetInfo &STI) const;
93
94 /// getMachineOpValue - Return binary encoding of operand. If the machine
95 /// operand requires relocation, record the relocation and return zero.
96 uint64_t getMachineOpValue(const MCInst &MI, const MCOperand &MO,
97 SmallVectorImpl<MCFixup> &Fixups,
98 const MCSubtargetInfo &STI) const;
99
100 // getBinaryCodeForInstr - TableGen'erated function for getting the
101 // binary encoding for an instruction.
102 uint64_t getBinaryCodeForInstr(const MCInst &MI,
103 SmallVectorImpl<MCFixup> &Fixups,
104 const MCSubtargetInfo &STI) const;
105
106 void encodeInstruction(const MCInst &MI, SmallVectorImpl<char> &CB,
107 SmallVectorImpl<MCFixup> &Fixups,
108 const MCSubtargetInfo &STI) const override;
109
110 // Get the number of bytes used to encode the given MCInst.
111 unsigned getInstSizeInBytes(const MCInst &MI) const;
112
113 // Is this instruction a prefixed instruction.
114 bool isPrefixedInstruction(const MCInst &MI) const;
115
116 /// Check if Opcode corresponds to a call instruction that should be marked
117 /// with the NOTOC relocation.
118 bool isNoTOCCallInstr(const MCInst &MI) const;
119};
120
121} // namespace llvm
122
123#endif // LLVM_LIB_TARGET_PPC_MCCODEEMITTER_PPCCODEEMITTER_H
124