1e8d8bef9SDimitry Andric //===-- CSKYMCCodeEmitter.cpp - CSKY Code Emitter interface ---------------===// 2e8d8bef9SDimitry Andric // 3e8d8bef9SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4e8d8bef9SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5e8d8bef9SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6e8d8bef9SDimitry Andric // 7e8d8bef9SDimitry Andric //===----------------------------------------------------------------------===// 8e8d8bef9SDimitry Andric // 9e8d8bef9SDimitry Andric // This file implements the CSKYMCCodeEmitter class. 10e8d8bef9SDimitry Andric // 11e8d8bef9SDimitry Andric //===----------------------------------------------------------------------===// 12e8d8bef9SDimitry Andric 13e8d8bef9SDimitry Andric #include "CSKYMCCodeEmitter.h" 14349cc55cSDimitry Andric #include "CSKYMCExpr.h" 15e8d8bef9SDimitry Andric #include "MCTargetDesc/CSKYMCTargetDesc.h" 16e8d8bef9SDimitry Andric #include "llvm/ADT/Statistic.h" 17e8d8bef9SDimitry Andric #include "llvm/MC/MCInstBuilder.h" 18e8d8bef9SDimitry Andric #include "llvm/MC/MCInstrInfo.h" 1981ad6265SDimitry Andric #include "llvm/MC/MCRegisterInfo.h" 2081ad6265SDimitry Andric #include "llvm/MC/MCSubtargetInfo.h" 2181ad6265SDimitry Andric #include "llvm/Support/Casting.h" 22e8d8bef9SDimitry Andric #include "llvm/Support/EndianStream.h" 23e8d8bef9SDimitry Andric 24e8d8bef9SDimitry Andric using namespace llvm; 25e8d8bef9SDimitry Andric 26e8d8bef9SDimitry Andric #define DEBUG_TYPE "csky-mccode-emitter" 27e8d8bef9SDimitry Andric 28e8d8bef9SDimitry Andric STATISTIC(MCNumEmitted, "Number of MC instructions emitted"); 29e8d8bef9SDimitry Andric 30e8d8bef9SDimitry Andric unsigned CSKYMCCodeEmitter::getOImmOpValue(const MCInst &MI, unsigned Idx, 31e8d8bef9SDimitry Andric SmallVectorImpl<MCFixup> &Fixups, 32e8d8bef9SDimitry Andric const MCSubtargetInfo &STI) const { 33e8d8bef9SDimitry Andric const MCOperand &MO = MI.getOperand(Idx); 34e8d8bef9SDimitry Andric assert(MO.isImm() && "Unexpected MO type."); 35e8d8bef9SDimitry Andric return MO.getImm() - 1; 36e8d8bef9SDimitry Andric } 37e8d8bef9SDimitry Andric 38349cc55cSDimitry Andric unsigned 39349cc55cSDimitry Andric CSKYMCCodeEmitter::getImmOpValueIDLY(const MCInst &MI, unsigned Idx, 40349cc55cSDimitry Andric SmallVectorImpl<MCFixup> &Fixups, 41349cc55cSDimitry Andric const MCSubtargetInfo &STI) const { 42349cc55cSDimitry Andric const MCOperand &MO = MI.getOperand(Idx); 43349cc55cSDimitry Andric assert(MO.isImm() && "Unexpected MO type."); 44349cc55cSDimitry Andric 45349cc55cSDimitry Andric auto V = (MO.getImm() <= 3) ? 4 : MO.getImm(); 46349cc55cSDimitry Andric return V - 1; 47349cc55cSDimitry Andric } 48349cc55cSDimitry Andric 49349cc55cSDimitry Andric unsigned 50349cc55cSDimitry Andric CSKYMCCodeEmitter::getImmOpValueMSBSize(const MCInst &MI, unsigned Idx, 51349cc55cSDimitry Andric SmallVectorImpl<MCFixup> &Fixups, 52349cc55cSDimitry Andric const MCSubtargetInfo &STI) const { 53349cc55cSDimitry Andric const MCOperand &MSB = MI.getOperand(Idx); 54349cc55cSDimitry Andric const MCOperand &LSB = MI.getOperand(Idx + 1); 55349cc55cSDimitry Andric assert(MSB.isImm() && LSB.isImm() && "Unexpected MO type."); 56349cc55cSDimitry Andric 57349cc55cSDimitry Andric return MSB.getImm() - LSB.getImm(); 58349cc55cSDimitry Andric } 59349cc55cSDimitry Andric 60*5f757f3fSDimitry Andric static void writeData(uint32_t Bin, unsigned Size, SmallVectorImpl<char> &CB) { 61349cc55cSDimitry Andric if (Size == 4) 62*5f757f3fSDimitry Andric support::endian::write(CB, static_cast<uint16_t>(Bin >> 16), 63*5f757f3fSDimitry Andric llvm::endianness::little); 64*5f757f3fSDimitry Andric support::endian::write(CB, static_cast<uint16_t>(Bin), 65*5f757f3fSDimitry Andric llvm::endianness::little); 66349cc55cSDimitry Andric } 67349cc55cSDimitry Andric 68*5f757f3fSDimitry Andric void CSKYMCCodeEmitter::expandJBTF(const MCInst &MI, SmallVectorImpl<char> &CB, 6981ad6265SDimitry Andric SmallVectorImpl<MCFixup> &Fixups, 7081ad6265SDimitry Andric const MCSubtargetInfo &STI) const { 7181ad6265SDimitry Andric 7281ad6265SDimitry Andric MCInst TmpInst; 7381ad6265SDimitry Andric 7481ad6265SDimitry Andric uint32_t Binary; 7581ad6265SDimitry Andric 7681ad6265SDimitry Andric TmpInst = 7781ad6265SDimitry Andric MCInstBuilder(MI.getOpcode() == CSKY::JBT_E ? CSKY::BF16 : CSKY::BT16) 7881ad6265SDimitry Andric .addOperand(MI.getOperand(0)) 7981ad6265SDimitry Andric .addImm(6); 8081ad6265SDimitry Andric Binary = getBinaryCodeForInstr(TmpInst, Fixups, STI); 81*5f757f3fSDimitry Andric writeData(Binary, 2, CB); 8281ad6265SDimitry Andric 8306c3fb27SDimitry Andric if (!STI.hasFeature(CSKY::Has2E3)) 8481ad6265SDimitry Andric TmpInst = MCInstBuilder(CSKY::BR32) 8581ad6265SDimitry Andric .addOperand(MI.getOperand(1)) 8681ad6265SDimitry Andric .addOperand(MI.getOperand(2)); 8781ad6265SDimitry Andric else 8881ad6265SDimitry Andric TmpInst = MCInstBuilder(CSKY::JMPI32).addOperand(MI.getOperand(2)); 8981ad6265SDimitry Andric Binary = getBinaryCodeForInstr(TmpInst, Fixups, STI); 9081ad6265SDimitry Andric Fixups[Fixups.size() - 1].setOffset(2); 91*5f757f3fSDimitry Andric writeData(Binary, 4, CB); 9281ad6265SDimitry Andric } 9381ad6265SDimitry Andric 94*5f757f3fSDimitry Andric void CSKYMCCodeEmitter::expandNEG(const MCInst &MI, SmallVectorImpl<char> &CB, 9581ad6265SDimitry Andric SmallVectorImpl<MCFixup> &Fixups, 9681ad6265SDimitry Andric const MCSubtargetInfo &STI) const { 9781ad6265SDimitry Andric 9881ad6265SDimitry Andric MCInst TmpInst; 9981ad6265SDimitry Andric uint32_t Binary; 10081ad6265SDimitry Andric unsigned Size = MI.getOpcode() == CSKY::NEG32 ? 4 : 2; 10181ad6265SDimitry Andric 10281ad6265SDimitry Andric TmpInst = MCInstBuilder(Size == 4 ? CSKY::NOT32 : CSKY::NOT16) 10381ad6265SDimitry Andric .addOperand(MI.getOperand(0)) 10481ad6265SDimitry Andric .addOperand(MI.getOperand(1)); 10581ad6265SDimitry Andric Binary = getBinaryCodeForInstr(TmpInst, Fixups, STI); 106*5f757f3fSDimitry Andric writeData(Binary, Size, CB); 10781ad6265SDimitry Andric 10881ad6265SDimitry Andric TmpInst = MCInstBuilder(Size == 4 ? CSKY::ADDI32 : CSKY::ADDI16) 10981ad6265SDimitry Andric .addOperand(MI.getOperand(0)) 11081ad6265SDimitry Andric .addOperand(MI.getOperand(0)) 11181ad6265SDimitry Andric .addImm(1); 11281ad6265SDimitry Andric Binary = getBinaryCodeForInstr(TmpInst, Fixups, STI); 113*5f757f3fSDimitry Andric writeData(Binary, Size, CB); 11481ad6265SDimitry Andric } 11581ad6265SDimitry Andric 116*5f757f3fSDimitry Andric void CSKYMCCodeEmitter::expandRSUBI(const MCInst &MI, SmallVectorImpl<char> &CB, 11781ad6265SDimitry Andric SmallVectorImpl<MCFixup> &Fixups, 11881ad6265SDimitry Andric const MCSubtargetInfo &STI) const { 11981ad6265SDimitry Andric 12081ad6265SDimitry Andric MCInst TmpInst; 12181ad6265SDimitry Andric uint32_t Binary; 12281ad6265SDimitry Andric unsigned Size = MI.getOpcode() == CSKY::RSUBI32 ? 4 : 2; 12381ad6265SDimitry Andric 12481ad6265SDimitry Andric TmpInst = MCInstBuilder(Size == 4 ? CSKY::NOT32 : CSKY::NOT16) 12581ad6265SDimitry Andric .addOperand(MI.getOperand(0)) 12681ad6265SDimitry Andric .addOperand(MI.getOperand(1)); 12781ad6265SDimitry Andric Binary = getBinaryCodeForInstr(TmpInst, Fixups, STI); 128*5f757f3fSDimitry Andric writeData(Binary, Size, CB); 12981ad6265SDimitry Andric 13081ad6265SDimitry Andric TmpInst = MCInstBuilder(Size == 4 ? CSKY::ADDI32 : CSKY::ADDI16) 13181ad6265SDimitry Andric .addOperand(MI.getOperand(0)) 13281ad6265SDimitry Andric .addOperand(MI.getOperand(0)) 13381ad6265SDimitry Andric .addImm(MI.getOperand(2).getImm() + 1); 13481ad6265SDimitry Andric Binary = getBinaryCodeForInstr(TmpInst, Fixups, STI); 135*5f757f3fSDimitry Andric writeData(Binary, Size, CB); 13681ad6265SDimitry Andric } 13781ad6265SDimitry Andric 138*5f757f3fSDimitry Andric void CSKYMCCodeEmitter::encodeInstruction(const MCInst &MI, 139*5f757f3fSDimitry Andric SmallVectorImpl<char> &CB, 140e8d8bef9SDimitry Andric SmallVectorImpl<MCFixup> &Fixups, 141e8d8bef9SDimitry Andric const MCSubtargetInfo &STI) const { 142e8d8bef9SDimitry Andric const MCInstrDesc &Desc = MII.get(MI.getOpcode()); 143e8d8bef9SDimitry Andric unsigned Size = Desc.getSize(); 144349cc55cSDimitry Andric 14581ad6265SDimitry Andric MCInst TmpInst; 14681ad6265SDimitry Andric 14781ad6265SDimitry Andric switch (MI.getOpcode()) { 14881ad6265SDimitry Andric default: 14981ad6265SDimitry Andric TmpInst = MI; 15081ad6265SDimitry Andric break; 15181ad6265SDimitry Andric case CSKY::JBT_E: 15281ad6265SDimitry Andric case CSKY::JBF_E: 153*5f757f3fSDimitry Andric expandJBTF(MI, CB, Fixups, STI); 15481ad6265SDimitry Andric MCNumEmitted += 2; 15581ad6265SDimitry Andric return; 15681ad6265SDimitry Andric case CSKY::NEG32: 15781ad6265SDimitry Andric case CSKY::NEG16: 158*5f757f3fSDimitry Andric expandNEG(MI, CB, Fixups, STI); 15981ad6265SDimitry Andric MCNumEmitted += 2; 16081ad6265SDimitry Andric return; 16181ad6265SDimitry Andric case CSKY::RSUBI32: 16281ad6265SDimitry Andric case CSKY::RSUBI16: 163*5f757f3fSDimitry Andric expandRSUBI(MI, CB, Fixups, STI); 16481ad6265SDimitry Andric MCNumEmitted += 2; 16581ad6265SDimitry Andric return; 16681ad6265SDimitry Andric case CSKY::JBSR32: 16781ad6265SDimitry Andric TmpInst = MCInstBuilder(CSKY::BSR32).addOperand(MI.getOperand(0)); 16881ad6265SDimitry Andric break; 16981ad6265SDimitry Andric case CSKY::JBR16: 17081ad6265SDimitry Andric TmpInst = MCInstBuilder(CSKY::BR16).addOperand(MI.getOperand(0)); 17181ad6265SDimitry Andric break; 17281ad6265SDimitry Andric case CSKY::JBR32: 17381ad6265SDimitry Andric TmpInst = MCInstBuilder(CSKY::BR32).addOperand(MI.getOperand(0)); 17481ad6265SDimitry Andric break; 17581ad6265SDimitry Andric case CSKY::JBT16: 17681ad6265SDimitry Andric TmpInst = MCInstBuilder(CSKY::BT16) 17781ad6265SDimitry Andric .addOperand(MI.getOperand(0)) 17881ad6265SDimitry Andric .addOperand(MI.getOperand(1)); 17981ad6265SDimitry Andric break; 18081ad6265SDimitry Andric case CSKY::JBT32: 18181ad6265SDimitry Andric TmpInst = MCInstBuilder(CSKY::BT32) 18281ad6265SDimitry Andric .addOperand(MI.getOperand(0)) 18381ad6265SDimitry Andric .addOperand(MI.getOperand(1)); 18481ad6265SDimitry Andric break; 18581ad6265SDimitry Andric case CSKY::JBF16: 18681ad6265SDimitry Andric TmpInst = MCInstBuilder(CSKY::BF16) 18781ad6265SDimitry Andric .addOperand(MI.getOperand(0)) 18881ad6265SDimitry Andric .addOperand(MI.getOperand(1)); 18981ad6265SDimitry Andric break; 19081ad6265SDimitry Andric case CSKY::JBF32: 19181ad6265SDimitry Andric TmpInst = MCInstBuilder(CSKY::BF32) 19281ad6265SDimitry Andric .addOperand(MI.getOperand(0)) 19381ad6265SDimitry Andric .addOperand(MI.getOperand(1)); 19481ad6265SDimitry Andric break; 19581ad6265SDimitry Andric case CSKY::LRW32_Gen: 19681ad6265SDimitry Andric TmpInst = MCInstBuilder(CSKY::LRW32) 19781ad6265SDimitry Andric .addOperand(MI.getOperand(0)) 19881ad6265SDimitry Andric .addOperand(MI.getOperand(2)); 19981ad6265SDimitry Andric break; 20081ad6265SDimitry Andric case CSKY::LRW16_Gen: 20181ad6265SDimitry Andric TmpInst = MCInstBuilder(CSKY::LRW16) 20281ad6265SDimitry Andric .addOperand(MI.getOperand(0)) 20381ad6265SDimitry Andric .addOperand(MI.getOperand(2)); 20481ad6265SDimitry Andric break; 20581ad6265SDimitry Andric case CSKY::CMPLEI32: 20681ad6265SDimitry Andric TmpInst = MCInstBuilder(CSKY::CMPLTI32) 20781ad6265SDimitry Andric .addOperand(MI.getOperand(0)) 20881ad6265SDimitry Andric .addOperand(MI.getOperand(1)) 20981ad6265SDimitry Andric .addImm(MI.getOperand(2).getImm() + 1); 21081ad6265SDimitry Andric break; 21181ad6265SDimitry Andric case CSKY::CMPLEI16: 21281ad6265SDimitry Andric TmpInst = MCInstBuilder(CSKY::CMPLTI16) 21381ad6265SDimitry Andric .addOperand(MI.getOperand(0)) 21481ad6265SDimitry Andric .addOperand(MI.getOperand(1)) 21581ad6265SDimitry Andric .addImm(MI.getOperand(2).getImm() + 1); 21681ad6265SDimitry Andric break; 21781ad6265SDimitry Andric case CSKY::ROTRI32: 21881ad6265SDimitry Andric TmpInst = MCInstBuilder(CSKY::ROTLI32) 21981ad6265SDimitry Andric .addOperand(MI.getOperand(0)) 22081ad6265SDimitry Andric .addOperand(MI.getOperand(1)) 22181ad6265SDimitry Andric .addImm(32 - MI.getOperand(2).getImm()); 22281ad6265SDimitry Andric break; 22381ad6265SDimitry Andric case CSKY::BGENI: 22481ad6265SDimitry Andric auto V = 1 << MI.getOperand(1).getImm(); 22581ad6265SDimitry Andric TmpInst = 22681ad6265SDimitry Andric MCInstBuilder(CSKY::MOVI32).addOperand(MI.getOperand(0)).addImm(V); 22781ad6265SDimitry Andric break; 22881ad6265SDimitry Andric } 22981ad6265SDimitry Andric 230349cc55cSDimitry Andric ++MCNumEmitted; 231*5f757f3fSDimitry Andric writeData(getBinaryCodeForInstr(TmpInst, Fixups, STI), Size, CB); 232e8d8bef9SDimitry Andric } 233e8d8bef9SDimitry Andric 234e8d8bef9SDimitry Andric unsigned 235e8d8bef9SDimitry Andric CSKYMCCodeEmitter::getMachineOpValue(const MCInst &MI, const MCOperand &MO, 236e8d8bef9SDimitry Andric SmallVectorImpl<MCFixup> &Fixups, 237e8d8bef9SDimitry Andric const MCSubtargetInfo &STI) const { 238e8d8bef9SDimitry Andric if (MO.isReg()) 239e8d8bef9SDimitry Andric return Ctx.getRegisterInfo()->getEncodingValue(MO.getReg()); 240e8d8bef9SDimitry Andric 241e8d8bef9SDimitry Andric if (MO.isImm()) 242e8d8bef9SDimitry Andric return static_cast<unsigned>(MO.getImm()); 243e8d8bef9SDimitry Andric 244e8d8bef9SDimitry Andric llvm_unreachable("Unhandled expression!"); 245e8d8bef9SDimitry Andric return 0; 246e8d8bef9SDimitry Andric } 247e8d8bef9SDimitry Andric 248349cc55cSDimitry Andric unsigned 249349cc55cSDimitry Andric CSKYMCCodeEmitter::getRegSeqImmOpValue(const MCInst &MI, unsigned Idx, 250349cc55cSDimitry Andric SmallVectorImpl<MCFixup> &Fixups, 251349cc55cSDimitry Andric const MCSubtargetInfo &STI) const { 252349cc55cSDimitry Andric assert(MI.getOperand(Idx).isReg() && "Unexpected MO type."); 253349cc55cSDimitry Andric assert(MI.getOperand(Idx + 1).isImm() && "Unexpected MO type."); 254349cc55cSDimitry Andric 255349cc55cSDimitry Andric unsigned Ry = MI.getOperand(Idx).getReg(); 256349cc55cSDimitry Andric unsigned Rz = MI.getOperand(Idx + 1).getImm(); 257349cc55cSDimitry Andric 258349cc55cSDimitry Andric unsigned Imm = Ctx.getRegisterInfo()->getEncodingValue(Rz) - 259349cc55cSDimitry Andric Ctx.getRegisterInfo()->getEncodingValue(Ry); 260349cc55cSDimitry Andric 261349cc55cSDimitry Andric return ((Ctx.getRegisterInfo()->getEncodingValue(Ry) << 5) | Imm); 262349cc55cSDimitry Andric } 263349cc55cSDimitry Andric 264349cc55cSDimitry Andric unsigned 265349cc55cSDimitry Andric CSKYMCCodeEmitter::getRegisterSeqOpValue(const MCInst &MI, unsigned Op, 266349cc55cSDimitry Andric SmallVectorImpl<MCFixup> &Fixups, 267349cc55cSDimitry Andric const MCSubtargetInfo &STI) const { 268349cc55cSDimitry Andric unsigned Reg1 = 269349cc55cSDimitry Andric Ctx.getRegisterInfo()->getEncodingValue(MI.getOperand(Op).getReg()); 270349cc55cSDimitry Andric unsigned Reg2 = 271349cc55cSDimitry Andric Ctx.getRegisterInfo()->getEncodingValue(MI.getOperand(Op + 1).getReg()); 272349cc55cSDimitry Andric 273349cc55cSDimitry Andric unsigned Binary = ((Reg1 & 0x1f) << 5) | (Reg2 - Reg1); 274349cc55cSDimitry Andric 275349cc55cSDimitry Andric return Binary; 276349cc55cSDimitry Andric } 277349cc55cSDimitry Andric 278349cc55cSDimitry Andric unsigned CSKYMCCodeEmitter::getImmJMPIX(const MCInst &MI, unsigned Idx, 279349cc55cSDimitry Andric SmallVectorImpl<MCFixup> &Fixups, 280349cc55cSDimitry Andric const MCSubtargetInfo &STI) const { 281349cc55cSDimitry Andric if (MI.getOperand(Idx).getImm() == 16) 282349cc55cSDimitry Andric return 0; 283349cc55cSDimitry Andric else if (MI.getOperand(Idx).getImm() == 24) 284349cc55cSDimitry Andric return 1; 285349cc55cSDimitry Andric else if (MI.getOperand(Idx).getImm() == 32) 286349cc55cSDimitry Andric return 2; 287349cc55cSDimitry Andric else if (MI.getOperand(Idx).getImm() == 40) 288349cc55cSDimitry Andric return 3; 289349cc55cSDimitry Andric else 290349cc55cSDimitry Andric assert(0); 291349cc55cSDimitry Andric } 292349cc55cSDimitry Andric 293fe6060f1SDimitry Andric MCFixupKind CSKYMCCodeEmitter::getTargetFixup(const MCExpr *Expr) const { 294fe6060f1SDimitry Andric const CSKYMCExpr *CSKYExpr = cast<CSKYMCExpr>(Expr); 295fe6060f1SDimitry Andric 296fe6060f1SDimitry Andric switch (CSKYExpr->getKind()) { 297fe6060f1SDimitry Andric default: 298fe6060f1SDimitry Andric llvm_unreachable("Unhandled fixup kind!"); 299fe6060f1SDimitry Andric case CSKYMCExpr::VK_CSKY_ADDR: 300fe6060f1SDimitry Andric return MCFixupKind(CSKY::fixup_csky_addr32); 301349cc55cSDimitry Andric case CSKYMCExpr::VK_CSKY_ADDR_HI16: 302349cc55cSDimitry Andric return MCFixupKind(CSKY::fixup_csky_addr_hi16); 303349cc55cSDimitry Andric case CSKYMCExpr::VK_CSKY_ADDR_LO16: 304349cc55cSDimitry Andric return MCFixupKind(CSKY::fixup_csky_addr_lo16); 305349cc55cSDimitry Andric case CSKYMCExpr::VK_CSKY_GOT: 306349cc55cSDimitry Andric return MCFixupKind(CSKY::fixup_csky_got32); 307349cc55cSDimitry Andric case CSKYMCExpr::VK_CSKY_GOTPC: 308349cc55cSDimitry Andric return MCFixupKind(CSKY::fixup_csky_gotpc); 309349cc55cSDimitry Andric case CSKYMCExpr::VK_CSKY_GOTOFF: 310349cc55cSDimitry Andric return MCFixupKind(CSKY::fixup_csky_gotoff); 311349cc55cSDimitry Andric case CSKYMCExpr::VK_CSKY_PLT: 312349cc55cSDimitry Andric return MCFixupKind(CSKY::fixup_csky_plt32); 313349cc55cSDimitry Andric case CSKYMCExpr::VK_CSKY_PLT_IMM18_BY4: 314349cc55cSDimitry Andric return MCFixupKind(CSKY::fixup_csky_plt_imm18_scale4); 315349cc55cSDimitry Andric case CSKYMCExpr::VK_CSKY_GOT_IMM18_BY4: 316349cc55cSDimitry Andric return MCFixupKind(CSKY::fixup_csky_got_imm18_scale4); 317fe6060f1SDimitry Andric } 318fe6060f1SDimitry Andric } 319fe6060f1SDimitry Andric 320e8d8bef9SDimitry Andric MCCodeEmitter *llvm::createCSKYMCCodeEmitter(const MCInstrInfo &MCII, 321e8d8bef9SDimitry Andric MCContext &Ctx) { 322e8d8bef9SDimitry Andric return new CSKYMCCodeEmitter(Ctx, MCII); 323e8d8bef9SDimitry Andric } 324e8d8bef9SDimitry Andric 325e8d8bef9SDimitry Andric #include "CSKYGenMCCodeEmitter.inc" 326