|  | //===-- PPCMCCodeEmitter.h - Convert PPC code to machine code -------------===// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file is distributed under the University of Illinois Open Source | 
|  | // License. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | // This file implements the PPCMCCodeEmitter class. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #ifndef LLVM_LIB_TARGET_PPC_MCCODEEMITTER_PPCCODEEMITTER_H | 
|  | #define LLVM_LIB_TARGET_PPC_MCCODEEMITTER_PPCCODEEMITTER_H | 
|  |  | 
|  | #include "llvm/MC/MCAsmInfo.h" | 
|  | #include "llvm/MC/MCCodeEmitter.h" | 
|  | #include "llvm/MC/MCSubtargetInfo.h" | 
|  | #include "llvm/MC/MCInstrInfo.h" | 
|  | #include "llvm/MC/MCContext.h" | 
|  | #include "llvm/MC/MCInst.h" | 
|  |  | 
|  | namespace llvm { | 
|  |  | 
|  | class PPCMCCodeEmitter : public MCCodeEmitter { | 
|  | const MCInstrInfo &MCII; | 
|  | const MCContext &CTX; | 
|  | bool IsLittleEndian; | 
|  |  | 
|  | public: | 
|  | PPCMCCodeEmitter(const MCInstrInfo &mcii, MCContext &ctx) | 
|  | : MCII(mcii), CTX(ctx), | 
|  | IsLittleEndian(ctx.getAsmInfo()->isLittleEndian()) {} | 
|  | PPCMCCodeEmitter(const PPCMCCodeEmitter &) = delete; | 
|  | void operator=(const PPCMCCodeEmitter &) = delete; | 
|  | ~PPCMCCodeEmitter() override = default; | 
|  |  | 
|  | unsigned getDirectBrEncoding(const MCInst &MI, unsigned OpNo, | 
|  | SmallVectorImpl<MCFixup> &Fixups, | 
|  | const MCSubtargetInfo &STI) const; | 
|  | unsigned getCondBrEncoding(const MCInst &MI, unsigned OpNo, | 
|  | SmallVectorImpl<MCFixup> &Fixups, | 
|  | const MCSubtargetInfo &STI) const; | 
|  | unsigned getAbsDirectBrEncoding(const MCInst &MI, unsigned OpNo, | 
|  | SmallVectorImpl<MCFixup> &Fixups, | 
|  | const MCSubtargetInfo &STI) const; | 
|  | unsigned getAbsCondBrEncoding(const MCInst &MI, unsigned OpNo, | 
|  | SmallVectorImpl<MCFixup> &Fixups, | 
|  | const MCSubtargetInfo &STI) const; | 
|  | unsigned getImm16Encoding(const MCInst &MI, unsigned OpNo, | 
|  | SmallVectorImpl<MCFixup> &Fixups, | 
|  | const MCSubtargetInfo &STI) const; | 
|  | unsigned getMemRIEncoding(const MCInst &MI, unsigned OpNo, | 
|  | SmallVectorImpl<MCFixup> &Fixups, | 
|  | const MCSubtargetInfo &STI) const; | 
|  | unsigned getMemRIXEncoding(const MCInst &MI, unsigned OpNo, | 
|  | SmallVectorImpl<MCFixup> &Fixups, | 
|  | const MCSubtargetInfo &STI) const; | 
|  | unsigned getMemRIX16Encoding(const MCInst &MI, unsigned OpNo, | 
|  | SmallVectorImpl<MCFixup> &Fixups, | 
|  | const MCSubtargetInfo &STI) const; | 
|  | unsigned getSPE8DisEncoding(const MCInst &MI, unsigned OpNo, | 
|  | SmallVectorImpl<MCFixup> &Fixups, | 
|  | const MCSubtargetInfo &STI) const; | 
|  | unsigned getSPE4DisEncoding(const MCInst &MI, unsigned OpNo, | 
|  | SmallVectorImpl<MCFixup> &Fixups, | 
|  | const MCSubtargetInfo &STI) const; | 
|  | unsigned getSPE2DisEncoding(const MCInst &MI, unsigned OpNo, | 
|  | SmallVectorImpl<MCFixup> &Fixups, | 
|  | const MCSubtargetInfo &STI) const; | 
|  | unsigned getTLSRegEncoding(const MCInst &MI, unsigned OpNo, | 
|  | SmallVectorImpl<MCFixup> &Fixups, | 
|  | const MCSubtargetInfo &STI) const; | 
|  | unsigned getTLSCallEncoding(const MCInst &MI, unsigned OpNo, | 
|  | SmallVectorImpl<MCFixup> &Fixups, | 
|  | const MCSubtargetInfo &STI) const; | 
|  | unsigned get_crbitm_encoding(const MCInst &MI, unsigned OpNo, | 
|  | SmallVectorImpl<MCFixup> &Fixups, | 
|  | const MCSubtargetInfo &STI) const; | 
|  |  | 
|  | /// getMachineOpValue - Return binary encoding of operand. If the machine | 
|  | /// operand requires relocation, record the relocation and return zero. | 
|  | unsigned getMachineOpValue(const MCInst &MI, const MCOperand &MO, | 
|  | SmallVectorImpl<MCFixup> &Fixups, | 
|  | const MCSubtargetInfo &STI) const; | 
|  |  | 
|  | // getBinaryCodeForInstr - TableGen'erated function for getting the | 
|  | // binary encoding for an instruction. | 
|  | uint64_t getBinaryCodeForInstr(const MCInst &MI, | 
|  | SmallVectorImpl<MCFixup> &Fixups, | 
|  | const MCSubtargetInfo &STI) const; | 
|  |  | 
|  | void encodeInstruction(const MCInst &MI, raw_ostream &OS, | 
|  | SmallVectorImpl<MCFixup> &Fixups, | 
|  | const MCSubtargetInfo &STI) const override; | 
|  |  | 
|  | // Get the number of bytes used to encode the given MCInst. | 
|  | unsigned getInstSizeInBytes(const MCInst &MI) const; | 
|  |  | 
|  | private: | 
|  | uint64_t computeAvailableFeatures(const FeatureBitset &FB) const; | 
|  | void verifyInstructionPredicates(const MCInst &MI, | 
|  | uint64_t AvailableFeatures) const; | 
|  | }; | 
|  |  | 
|  | } // namespace llvm | 
|  |  | 
|  | #endif // LLVM_LIB_TARGET_PPC_MCCODEEMITTER_PPCCODEEMITTER_H |