Home | History | Annotate | Line # | Download | only in MCTargetDesc
      1 //===-- PPCMCCodeEmitter.cpp - 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 #include "MCTargetDesc/PPCFixupKinds.h"
     14 #include "PPCInstrInfo.h"
     15 #include "PPCMCCodeEmitter.h"
     16 #include "llvm/ADT/SmallVector.h"
     17 #include "llvm/ADT/Statistic.h"
     18 #include "llvm/ADT/Triple.h"
     19 #include "llvm/MC/MCFixup.h"
     20 #include "llvm/MC/MCInstrDesc.h"
     21 #include "llvm/MC/MCRegisterInfo.h"
     22 #include "llvm/Support/Endian.h"
     23 #include "llvm/Support/EndianStream.h"
     24 #include "llvm/Support/ErrorHandling.h"
     25 #include "llvm/Support/MathExtras.h"
     26 #include "llvm/Support/raw_ostream.h"
     27 #include <cassert>
     28 #include <cstdint>
     29 
     30 using namespace llvm;
     31 
     32 #define DEBUG_TYPE "mccodeemitter"
     33 
     34 STATISTIC(MCNumEmitted, "Number of MC instructions emitted");
     35 
     36 MCCodeEmitter *llvm::createPPCMCCodeEmitter(const MCInstrInfo &MCII,
     37                                             const MCRegisterInfo &MRI,
     38                                             MCContext &Ctx) {
     39   return new PPCMCCodeEmitter(MCII, Ctx);
     40 }
     41 
     42 unsigned PPCMCCodeEmitter::
     43 getDirectBrEncoding(const MCInst &MI, unsigned OpNo,
     44                     SmallVectorImpl<MCFixup> &Fixups,
     45                     const MCSubtargetInfo &STI) const {
     46   const MCOperand &MO = MI.getOperand(OpNo);
     47 
     48   if (MO.isReg() || MO.isImm())
     49     return getMachineOpValue(MI, MO, Fixups, STI);
     50   // Add a fixup for the branch target.
     51   Fixups.push_back(MCFixup::create(0, MO.getExpr(),
     52                                    ((MI.getOpcode() == PPC::BL8_NOTOC ||
     53                                      MI.getOpcode() == PPC::BL8_NOTOC_TLS)
     54                                         ? (MCFixupKind)PPC::fixup_ppc_br24_notoc
     55                                         : (MCFixupKind)PPC::fixup_ppc_br24)));
     56   return 0;
     57 }
     58 
     59 unsigned PPCMCCodeEmitter::getCondBrEncoding(const MCInst &MI, unsigned OpNo,
     60                                      SmallVectorImpl<MCFixup> &Fixups,
     61                                      const MCSubtargetInfo &STI) const {
     62   const MCOperand &MO = MI.getOperand(OpNo);
     63   if (MO.isReg() || MO.isImm()) return getMachineOpValue(MI, MO, Fixups, STI);
     64 
     65   // Add a fixup for the branch target.
     66   Fixups.push_back(MCFixup::create(0, MO.getExpr(),
     67                                    (MCFixupKind)PPC::fixup_ppc_brcond14));
     68   return 0;
     69 }
     70 
     71 unsigned PPCMCCodeEmitter::
     72 getAbsDirectBrEncoding(const MCInst &MI, unsigned OpNo,
     73                        SmallVectorImpl<MCFixup> &Fixups,
     74                        const MCSubtargetInfo &STI) const {
     75   const MCOperand &MO = MI.getOperand(OpNo);
     76   if (MO.isReg() || MO.isImm()) return getMachineOpValue(MI, MO, Fixups, STI);
     77 
     78   // Add a fixup for the branch target.
     79   Fixups.push_back(MCFixup::create(0, MO.getExpr(),
     80                                    (MCFixupKind)PPC::fixup_ppc_br24abs));
     81   return 0;
     82 }
     83 
     84 unsigned PPCMCCodeEmitter::
     85 getAbsCondBrEncoding(const MCInst &MI, unsigned OpNo,
     86                      SmallVectorImpl<MCFixup> &Fixups,
     87                      const MCSubtargetInfo &STI) const {
     88   const MCOperand &MO = MI.getOperand(OpNo);
     89   if (MO.isReg() || MO.isImm()) return getMachineOpValue(MI, MO, Fixups, STI);
     90 
     91   // Add a fixup for the branch target.
     92   Fixups.push_back(MCFixup::create(0, MO.getExpr(),
     93                                    (MCFixupKind)PPC::fixup_ppc_brcond14abs));
     94   return 0;
     95 }
     96 
     97 unsigned
     98 PPCMCCodeEmitter::getVSRpEvenEncoding(const MCInst &MI, unsigned OpNo,
     99                                       SmallVectorImpl<MCFixup> &Fixups,
    100                                       const MCSubtargetInfo &STI) const {
    101   assert(MI.getOperand(OpNo).isReg() && "Operand should be a register");
    102   unsigned RegBits = getMachineOpValue(MI, MI.getOperand(OpNo), Fixups, STI)
    103                      << 1;
    104   return RegBits;
    105 }
    106 
    107 unsigned PPCMCCodeEmitter::getImm16Encoding(const MCInst &MI, unsigned OpNo,
    108                                        SmallVectorImpl<MCFixup> &Fixups,
    109                                        const MCSubtargetInfo &STI) const {
    110   const MCOperand &MO = MI.getOperand(OpNo);
    111   if (MO.isReg() || MO.isImm()) return getMachineOpValue(MI, MO, Fixups, STI);
    112 
    113   // Add a fixup for the immediate field.
    114   Fixups.push_back(MCFixup::create(IsLittleEndian? 0 : 2, MO.getExpr(),
    115                                    (MCFixupKind)PPC::fixup_ppc_half16));
    116   return 0;
    117 }
    118 
    119 uint64_t PPCMCCodeEmitter::getImm34Encoding(const MCInst &MI, unsigned OpNo,
    120                                             SmallVectorImpl<MCFixup> &Fixups,
    121                                             const MCSubtargetInfo &STI,
    122                                             MCFixupKind Fixup) const {
    123   const MCOperand &MO = MI.getOperand(OpNo);
    124   assert(!MO.isReg() && "Not expecting a register for this operand.");
    125   if (MO.isImm())
    126     return getMachineOpValue(MI, MO, Fixups, STI);
    127 
    128   // Add a fixup for the immediate field.
    129   Fixups.push_back(MCFixup::create(0, MO.getExpr(), Fixup));
    130   return 0;
    131 }
    132 
    133 uint64_t
    134 PPCMCCodeEmitter::getImm34EncodingNoPCRel(const MCInst &MI, unsigned OpNo,
    135                                           SmallVectorImpl<MCFixup> &Fixups,
    136                                           const MCSubtargetInfo &STI) const {
    137   return getImm34Encoding(MI, OpNo, Fixups, STI,
    138                           (MCFixupKind)PPC::fixup_ppc_imm34);
    139 }
    140 
    141 uint64_t
    142 PPCMCCodeEmitter::getImm34EncodingPCRel(const MCInst &MI, unsigned OpNo,
    143                                         SmallVectorImpl<MCFixup> &Fixups,
    144                                         const MCSubtargetInfo &STI) const {
    145   return getImm34Encoding(MI, OpNo, Fixups, STI,
    146                           (MCFixupKind)PPC::fixup_ppc_pcrel34);
    147 }
    148 
    149 unsigned PPCMCCodeEmitter::getMemRIEncoding(const MCInst &MI, unsigned OpNo,
    150                                             SmallVectorImpl<MCFixup> &Fixups,
    151                                             const MCSubtargetInfo &STI) const {
    152   // Encode (imm, reg) as a memri, which has the low 16-bits as the
    153   // displacement and the next 5 bits as the register #.
    154   assert(MI.getOperand(OpNo+1).isReg());
    155   unsigned RegBits = getMachineOpValue(MI, MI.getOperand(OpNo+1), Fixups, STI) << 16;
    156 
    157   const MCOperand &MO = MI.getOperand(OpNo);
    158   if (MO.isImm())
    159     return (getMachineOpValue(MI, MO, Fixups, STI) & 0xFFFF) | RegBits;
    160 
    161   // Add a fixup for the displacement field.
    162   Fixups.push_back(MCFixup::create(IsLittleEndian? 0 : 2, MO.getExpr(),
    163                                    (MCFixupKind)PPC::fixup_ppc_half16));
    164   return RegBits;
    165 }
    166 
    167 unsigned PPCMCCodeEmitter::getMemRIXEncoding(const MCInst &MI, unsigned OpNo,
    168                                        SmallVectorImpl<MCFixup> &Fixups,
    169                                        const MCSubtargetInfo &STI) const {
    170   // Encode (imm, reg) as a memrix, which has the low 14-bits as the
    171   // displacement and the next 5 bits as the register #.
    172   assert(MI.getOperand(OpNo+1).isReg());
    173   unsigned RegBits = getMachineOpValue(MI, MI.getOperand(OpNo+1), Fixups, STI) << 14;
    174 
    175   const MCOperand &MO = MI.getOperand(OpNo);
    176   if (MO.isImm())
    177     return ((getMachineOpValue(MI, MO, Fixups, STI) >> 2) & 0x3FFF) | RegBits;
    178 
    179   // Add a fixup for the displacement field.
    180   Fixups.push_back(MCFixup::create(IsLittleEndian? 0 : 2, MO.getExpr(),
    181                                    (MCFixupKind)PPC::fixup_ppc_half16ds));
    182   return RegBits;
    183 }
    184 
    185 unsigned PPCMCCodeEmitter::getMemRIX16Encoding(const MCInst &MI, unsigned OpNo,
    186                                        SmallVectorImpl<MCFixup> &Fixups,
    187                                        const MCSubtargetInfo &STI) const {
    188   // Encode (imm, reg) as a memrix16, which has the low 12-bits as the
    189   // displacement and the next 5 bits as the register #.
    190   assert(MI.getOperand(OpNo+1).isReg());
    191   unsigned RegBits = getMachineOpValue(MI, MI.getOperand(OpNo+1), Fixups, STI) << 12;
    192 
    193   const MCOperand &MO = MI.getOperand(OpNo);
    194   if (MO.isImm()) {
    195     assert(!(MO.getImm() % 16) &&
    196            "Expecting an immediate that is a multiple of 16");
    197     return ((getMachineOpValue(MI, MO, Fixups, STI) >> 4) & 0xFFF) | RegBits;
    198   }
    199 
    200   // Otherwise add a fixup for the displacement field.
    201   Fixups.push_back(MCFixup::create(IsLittleEndian? 0 : 2, MO.getExpr(),
    202                                    (MCFixupKind)PPC::fixup_ppc_half16ds));
    203   return RegBits;
    204 }
    205 
    206 unsigned
    207 PPCMCCodeEmitter::getMemRIHashEncoding(const MCInst &MI, unsigned OpNo,
    208                                        SmallVectorImpl<MCFixup> &Fixups,
    209                                        const MCSubtargetInfo &STI) const {
    210   // Encode (imm, reg) for the hash load/store to stack for the ROP Protection
    211   // instructions.
    212   const MCOperand &RegMO = MI.getOperand(OpNo + 1);
    213   const MCOperand &MO = MI.getOperand(OpNo);
    214 
    215   assert(RegMO.isReg() && "Base address must be a register.");
    216   assert(MO.isImm() && "Expecting an immediate operand.");
    217   assert(!(MO.getImm() % 8) && "Expecting offset to be 8 byte aligned.");
    218 
    219   unsigned RegBits = getMachineOpValue(MI, RegMO, Fixups, STI) << 6;
    220   unsigned DX = (MO.getImm() >> 3) & 0x3F;
    221   return RegBits | DX;
    222 }
    223 
    224 uint64_t
    225 PPCMCCodeEmitter::getMemRI34PCRelEncoding(const MCInst &MI, unsigned OpNo,
    226                                           SmallVectorImpl<MCFixup> &Fixups,
    227                                           const MCSubtargetInfo &STI) const {
    228   // Encode the PCRelative version of memri34: imm34(r0).
    229   // In the PC relative version the register for the address must be zero.
    230   // The 34 bit immediate can fall into one of three cases:
    231   // 1) It is a relocation to be filled in by the linker represented as:
    232   //    (MCExpr::SymbolRef)
    233   // 2) It is a relocation + SignedOffset represented as:
    234   //    (MCExpr::Binary(MCExpr::SymbolRef + MCExpr::Constant))
    235   // 3) It is a known value at compile time.
    236 
    237   // Make sure that the register is a zero as expected.
    238   assert(MI.getOperand(OpNo + 1).isImm() && "Expecting an immediate.");
    239   uint64_t RegBits =
    240     getMachineOpValue(MI, MI.getOperand(OpNo + 1), Fixups, STI) << 34;
    241   assert(RegBits == 0 && "Operand must be 0.");
    242 
    243   // If this is not a MCExpr then we are in case 3) and we are dealing with
    244   // a value known at compile time, not a relocation.
    245   const MCOperand &MO = MI.getOperand(OpNo);
    246   if (!MO.isExpr())
    247     return ((getMachineOpValue(MI, MO, Fixups, STI)) & 0x3FFFFFFFFUL) | RegBits;
    248 
    249   // At this point in the function it is known that MO is of type MCExpr.
    250   // Therefore we are dealing with either case 1) a symbol ref or
    251   // case 2) a symbol ref plus a constant.
    252   const MCExpr *Expr = MO.getExpr();
    253   switch (Expr->getKind()) {
    254   default:
    255     llvm_unreachable("Unsupported MCExpr for getMemRI34PCRelEncoding.");
    256   case MCExpr::SymbolRef: {
    257     // Relocation alone.
    258     const MCSymbolRefExpr *SRE = cast<MCSymbolRefExpr>(Expr);
    259     (void)SRE;
    260     // Currently these are the only valid PCRelative Relocations.
    261     assert((SRE->getKind() == MCSymbolRefExpr::VK_PCREL ||
    262             SRE->getKind() == MCSymbolRefExpr::VK_PPC_GOT_PCREL ||
    263             SRE->getKind() == MCSymbolRefExpr::VK_PPC_GOT_TLSGD_PCREL ||
    264             SRE->getKind() == MCSymbolRefExpr::VK_PPC_GOT_TLSLD_PCREL ||
    265             SRE->getKind() == MCSymbolRefExpr::VK_PPC_GOT_TPREL_PCREL) &&
    266            "VariantKind must be VK_PCREL or VK_PPC_GOT_PCREL or "
    267            "VK_PPC_GOT_TLSGD_PCREL or VK_PPC_GOT_TLSLD_PCREL or "
    268            "VK_PPC_GOT_TPREL_PCREL.");
    269     // Generate the fixup for the relocation.
    270     Fixups.push_back(
    271         MCFixup::create(0, Expr,
    272                         static_cast<MCFixupKind>(PPC::fixup_ppc_pcrel34)));
    273     // Put zero in the location of the immediate. The linker will fill in the
    274     // correct value based on the relocation.
    275     return 0;
    276   }
    277   case MCExpr::Binary: {
    278     // Relocation plus some offset.
    279     const MCBinaryExpr *BE = cast<MCBinaryExpr>(Expr);
    280     assert(BE->getOpcode() == MCBinaryExpr::Add &&
    281            "Binary expression opcode must be an add.");
    282 
    283     const MCExpr *LHS = BE->getLHS();
    284     const MCExpr *RHS = BE->getRHS();
    285 
    286     // Need to check in both directions. Reloc+Offset and Offset+Reloc.
    287     if (LHS->getKind() != MCExpr::SymbolRef)
    288       std::swap(LHS, RHS);
    289 
    290     if (LHS->getKind() != MCExpr::SymbolRef ||
    291         RHS->getKind() != MCExpr::Constant)
    292       llvm_unreachable("Expecting to have one constant and one relocation.");
    293 
    294     const MCSymbolRefExpr *SRE = cast<MCSymbolRefExpr>(LHS);
    295     (void)SRE;
    296     assert(isInt<34>(cast<MCConstantExpr>(RHS)->getValue()) &&
    297            "Value must fit in 34 bits.");
    298 
    299     // Currently these are the only valid PCRelative Relocations.
    300     assert((SRE->getKind() == MCSymbolRefExpr::VK_PCREL ||
    301             SRE->getKind() == MCSymbolRefExpr::VK_PPC_GOT_PCREL) &&
    302            "VariantKind must be VK_PCREL or VK_PPC_GOT_PCREL");
    303     // Generate the fixup for the relocation.
    304     Fixups.push_back(
    305         MCFixup::create(0, Expr,
    306                         static_cast<MCFixupKind>(PPC::fixup_ppc_pcrel34)));
    307     // Put zero in the location of the immediate. The linker will fill in the
    308     // correct value based on the relocation.
    309     return 0;
    310     }
    311   }
    312 }
    313 
    314 uint64_t
    315 PPCMCCodeEmitter::getMemRI34Encoding(const MCInst &MI, unsigned OpNo,
    316                                      SmallVectorImpl<MCFixup> &Fixups,
    317                                      const MCSubtargetInfo &STI) const {
    318   // Encode (imm, reg) as a memri34, which has the low 34-bits as the
    319   // displacement and the next 5 bits as the register #.
    320   assert(MI.getOperand(OpNo + 1).isReg() && "Expecting a register.");
    321   uint64_t RegBits = getMachineOpValue(MI, MI.getOperand(OpNo + 1), Fixups, STI)
    322                      << 34;
    323   const MCOperand &MO = MI.getOperand(OpNo);
    324   return ((getMachineOpValue(MI, MO, Fixups, STI)) & 0x3FFFFFFFFUL) | RegBits;
    325 }
    326 
    327 unsigned PPCMCCodeEmitter::getSPE8DisEncoding(const MCInst &MI, unsigned OpNo,
    328                                               SmallVectorImpl<MCFixup> &Fixups,
    329                                               const MCSubtargetInfo &STI)
    330                                               const {
    331   // Encode (imm, reg) as a spe8dis, which has the low 5-bits of (imm / 8)
    332   // as the displacement and the next 5 bits as the register #.
    333   assert(MI.getOperand(OpNo+1).isReg());
    334   uint32_t RegBits = getMachineOpValue(MI, MI.getOperand(OpNo+1), Fixups, STI) << 5;
    335 
    336   const MCOperand &MO = MI.getOperand(OpNo);
    337   assert(MO.isImm());
    338   uint32_t Imm = getMachineOpValue(MI, MO, Fixups, STI) >> 3;
    339   return reverseBits(Imm | RegBits) >> 22;
    340 }
    341 
    342 unsigned PPCMCCodeEmitter::getSPE4DisEncoding(const MCInst &MI, unsigned OpNo,
    343                                               SmallVectorImpl<MCFixup> &Fixups,
    344                                               const MCSubtargetInfo &STI)
    345                                               const {
    346   // Encode (imm, reg) as a spe4dis, which has the low 5-bits of (imm / 4)
    347   // as the displacement and the next 5 bits as the register #.
    348   assert(MI.getOperand(OpNo+1).isReg());
    349   uint32_t RegBits = getMachineOpValue(MI, MI.getOperand(OpNo+1), Fixups, STI) << 5;
    350 
    351   const MCOperand &MO = MI.getOperand(OpNo);
    352   assert(MO.isImm());
    353   uint32_t Imm = getMachineOpValue(MI, MO, Fixups, STI) >> 2;
    354   return reverseBits(Imm | RegBits) >> 22;
    355 }
    356 
    357 unsigned PPCMCCodeEmitter::getSPE2DisEncoding(const MCInst &MI, unsigned OpNo,
    358                                               SmallVectorImpl<MCFixup> &Fixups,
    359                                               const MCSubtargetInfo &STI)
    360                                               const {
    361   // Encode (imm, reg) as a spe2dis, which has the low 5-bits of (imm / 2)
    362   // as the displacement and the next 5 bits as the register #.
    363   assert(MI.getOperand(OpNo+1).isReg());
    364   uint32_t RegBits = getMachineOpValue(MI, MI.getOperand(OpNo+1), Fixups, STI) << 5;
    365 
    366   const MCOperand &MO = MI.getOperand(OpNo);
    367   assert(MO.isImm());
    368   uint32_t Imm = getMachineOpValue(MI, MO, Fixups, STI) >> 1;
    369   return reverseBits(Imm | RegBits) >> 22;
    370 }
    371 
    372 unsigned PPCMCCodeEmitter::getTLSRegEncoding(const MCInst &MI, unsigned OpNo,
    373                                        SmallVectorImpl<MCFixup> &Fixups,
    374                                        const MCSubtargetInfo &STI) const {
    375   const MCOperand &MO = MI.getOperand(OpNo);
    376   if (MO.isReg()) return getMachineOpValue(MI, MO, Fixups, STI);
    377 
    378   // Add a fixup for the TLS register, which simply provides a relocation
    379   // hint to the linker that this statement is part of a relocation sequence.
    380   // Return the thread-pointer register's encoding. Add a one byte displacement
    381   // if using PC relative memops.
    382   const MCExpr *Expr = MO.getExpr();
    383   const MCSymbolRefExpr *SRE = cast<MCSymbolRefExpr>(Expr);
    384   bool IsPCRel = SRE->getKind() == MCSymbolRefExpr::VK_PPC_TLS_PCREL;
    385   Fixups.push_back(MCFixup::create(IsPCRel ? 1 : 0, Expr,
    386                                    (MCFixupKind)PPC::fixup_ppc_nofixup));
    387   const Triple &TT = STI.getTargetTriple();
    388   bool isPPC64 = TT.isPPC64();
    389   return CTX.getRegisterInfo()->getEncodingValue(isPPC64 ? PPC::X13 : PPC::R2);
    390 }
    391 
    392 unsigned PPCMCCodeEmitter::getTLSCallEncoding(const MCInst &MI, unsigned OpNo,
    393                                        SmallVectorImpl<MCFixup> &Fixups,
    394                                        const MCSubtargetInfo &STI) const {
    395   // For special TLS calls, we need two fixups; one for the branch target
    396   // (__tls_get_addr), which we create via getDirectBrEncoding as usual,
    397   // and one for the TLSGD or TLSLD symbol, which is emitted here.
    398   const MCOperand &MO = MI.getOperand(OpNo+1);
    399   Fixups.push_back(MCFixup::create(0, MO.getExpr(),
    400                                    (MCFixupKind)PPC::fixup_ppc_nofixup));
    401   return getDirectBrEncoding(MI, OpNo, Fixups, STI);
    402 }
    403 
    404 unsigned PPCMCCodeEmitter::
    405 get_crbitm_encoding(const MCInst &MI, unsigned OpNo,
    406                     SmallVectorImpl<MCFixup> &Fixups,
    407                     const MCSubtargetInfo &STI) const {
    408   const MCOperand &MO = MI.getOperand(OpNo);
    409   assert((MI.getOpcode() == PPC::MTOCRF || MI.getOpcode() == PPC::MTOCRF8 ||
    410           MI.getOpcode() == PPC::MFOCRF || MI.getOpcode() == PPC::MFOCRF8) &&
    411          (MO.getReg() >= PPC::CR0 && MO.getReg() <= PPC::CR7));
    412   return 0x80 >> CTX.getRegisterInfo()->getEncodingValue(MO.getReg());
    413 }
    414 
    415 // Get the index for this operand in this instruction. This is needed for
    416 // computing the register number in PPCInstrInfo::getRegNumForOperand() for
    417 // any instructions that use a different numbering scheme for registers in
    418 // different operands.
    419 static unsigned getOpIdxForMO(const MCInst &MI, const MCOperand &MO) {
    420   for (unsigned i = 0; i < MI.getNumOperands(); i++) {
    421     const MCOperand &Op = MI.getOperand(i);
    422     if (&Op == &MO)
    423       return i;
    424   }
    425   llvm_unreachable("This operand is not part of this instruction");
    426   return ~0U; // Silence any warnings about no return.
    427 }
    428 
    429 uint64_t PPCMCCodeEmitter::
    430 getMachineOpValue(const MCInst &MI, const MCOperand &MO,
    431                   SmallVectorImpl<MCFixup> &Fixups,
    432                   const MCSubtargetInfo &STI) const {
    433   if (MO.isReg()) {
    434     // MTOCRF/MFOCRF should go through get_crbitm_encoding for the CR operand.
    435     // The GPR operand should come through here though.
    436     assert((MI.getOpcode() != PPC::MTOCRF && MI.getOpcode() != PPC::MTOCRF8 &&
    437             MI.getOpcode() != PPC::MFOCRF && MI.getOpcode() != PPC::MFOCRF8) ||
    438            MO.getReg() < PPC::CR0 || MO.getReg() > PPC::CR7);
    439     unsigned OpNo = getOpIdxForMO(MI, MO);
    440     unsigned Reg =
    441       PPCInstrInfo::getRegNumForOperand(MCII.get(MI.getOpcode()),
    442                                         MO.getReg(), OpNo);
    443     return CTX.getRegisterInfo()->getEncodingValue(Reg);
    444   }
    445 
    446   assert(MO.isImm() &&
    447          "Relocation required in an instruction that we cannot encode!");
    448   return MO.getImm();
    449 }
    450 
    451 void PPCMCCodeEmitter::encodeInstruction(
    452     const MCInst &MI, raw_ostream &OS, SmallVectorImpl<MCFixup> &Fixups,
    453     const MCSubtargetInfo &STI) const {
    454   verifyInstructionPredicates(MI,
    455                               computeAvailableFeatures(STI.getFeatureBits()));
    456 
    457   uint64_t Bits = getBinaryCodeForInstr(MI, Fixups, STI);
    458 
    459   // Output the constant in big/little endian byte order.
    460   unsigned Size = getInstSizeInBytes(MI);
    461   support::endianness E = IsLittleEndian ? support::little : support::big;
    462   switch (Size) {
    463   case 0:
    464     break;
    465   case 4:
    466     support::endian::write<uint32_t>(OS, Bits, E);
    467     break;
    468   case 8:
    469     // If we emit a pair of instructions, the first one is
    470     // always in the top 32 bits, even on little-endian.
    471     support::endian::write<uint32_t>(OS, Bits >> 32, E);
    472     support::endian::write<uint32_t>(OS, Bits, E);
    473     break;
    474   default:
    475     llvm_unreachable("Invalid instruction size");
    476   }
    477 
    478   ++MCNumEmitted; // Keep track of the # of mi's emitted.
    479 }
    480 
    481 // Get the number of bytes used to encode the given MCInst.
    482 unsigned PPCMCCodeEmitter::getInstSizeInBytes(const MCInst &MI) const {
    483   unsigned Opcode = MI.getOpcode();
    484   const MCInstrDesc &Desc = MCII.get(Opcode);
    485   return Desc.getSize();
    486 }
    487 
    488 bool PPCMCCodeEmitter::isPrefixedInstruction(const MCInst &MI) const {
    489   unsigned Opcode = MI.getOpcode();
    490   const PPCInstrInfo *InstrInfo = static_cast<const PPCInstrInfo*>(&MCII);
    491   return InstrInfo->isPrefixed(Opcode);
    492 }
    493 
    494 #define ENABLE_INSTR_PREDICATE_VERIFIER
    495 #include "PPCGenMCCodeEmitter.inc"
    496