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 60349cc55cSDimitry Andric static void writeData(uint32_t Bin, unsigned Size, raw_ostream &OS) { 61349cc55cSDimitry Andric uint16_t LO16 = static_cast<uint16_t>(Bin); 62349cc55cSDimitry Andric uint16_t HI16 = static_cast<uint16_t>(Bin >> 16); 63349cc55cSDimitry Andric 64349cc55cSDimitry Andric if (Size == 4) 65349cc55cSDimitry Andric support::endian::write<uint16_t>(OS, HI16, support::little); 66349cc55cSDimitry Andric 67349cc55cSDimitry Andric support::endian::write<uint16_t>(OS, LO16, support::little); 68349cc55cSDimitry Andric } 69349cc55cSDimitry Andric 7081ad6265SDimitry Andric void CSKYMCCodeEmitter::expandJBTF(const MCInst &MI, raw_ostream &OS, 7181ad6265SDimitry Andric SmallVectorImpl<MCFixup> &Fixups, 7281ad6265SDimitry Andric const MCSubtargetInfo &STI) const { 7381ad6265SDimitry Andric 7481ad6265SDimitry Andric MCInst TmpInst; 7581ad6265SDimitry Andric 7681ad6265SDimitry Andric uint32_t Binary; 7781ad6265SDimitry Andric 7881ad6265SDimitry Andric TmpInst = 7981ad6265SDimitry Andric MCInstBuilder(MI.getOpcode() == CSKY::JBT_E ? CSKY::BF16 : CSKY::BT16) 8081ad6265SDimitry Andric .addOperand(MI.getOperand(0)) 8181ad6265SDimitry Andric .addImm(6); 8281ad6265SDimitry Andric Binary = getBinaryCodeForInstr(TmpInst, Fixups, STI); 8381ad6265SDimitry Andric writeData(Binary, 2, OS); 8481ad6265SDimitry Andric 85*06c3fb27SDimitry Andric if (!STI.hasFeature(CSKY::Has2E3)) 8681ad6265SDimitry Andric TmpInst = MCInstBuilder(CSKY::BR32) 8781ad6265SDimitry Andric .addOperand(MI.getOperand(1)) 8881ad6265SDimitry Andric .addOperand(MI.getOperand(2)); 8981ad6265SDimitry Andric else 9081ad6265SDimitry Andric TmpInst = MCInstBuilder(CSKY::JMPI32).addOperand(MI.getOperand(2)); 9181ad6265SDimitry Andric Binary = getBinaryCodeForInstr(TmpInst, Fixups, STI); 9281ad6265SDimitry Andric Fixups[Fixups.size() - 1].setOffset(2); 9381ad6265SDimitry Andric writeData(Binary, 4, OS); 9481ad6265SDimitry Andric } 9581ad6265SDimitry Andric 9681ad6265SDimitry Andric void CSKYMCCodeEmitter::expandNEG(const MCInst &MI, raw_ostream &OS, 9781ad6265SDimitry Andric SmallVectorImpl<MCFixup> &Fixups, 9881ad6265SDimitry Andric const MCSubtargetInfo &STI) const { 9981ad6265SDimitry Andric 10081ad6265SDimitry Andric MCInst TmpInst; 10181ad6265SDimitry Andric uint32_t Binary; 10281ad6265SDimitry Andric unsigned Size = MI.getOpcode() == CSKY::NEG32 ? 4 : 2; 10381ad6265SDimitry Andric 10481ad6265SDimitry Andric TmpInst = MCInstBuilder(Size == 4 ? CSKY::NOT32 : CSKY::NOT16) 10581ad6265SDimitry Andric .addOperand(MI.getOperand(0)) 10681ad6265SDimitry Andric .addOperand(MI.getOperand(1)); 10781ad6265SDimitry Andric Binary = getBinaryCodeForInstr(TmpInst, Fixups, STI); 10881ad6265SDimitry Andric writeData(Binary, Size, OS); 10981ad6265SDimitry Andric 11081ad6265SDimitry Andric TmpInst = MCInstBuilder(Size == 4 ? CSKY::ADDI32 : CSKY::ADDI16) 11181ad6265SDimitry Andric .addOperand(MI.getOperand(0)) 11281ad6265SDimitry Andric .addOperand(MI.getOperand(0)) 11381ad6265SDimitry Andric .addImm(1); 11481ad6265SDimitry Andric Binary = getBinaryCodeForInstr(TmpInst, Fixups, STI); 11581ad6265SDimitry Andric writeData(Binary, Size, OS); 11681ad6265SDimitry Andric } 11781ad6265SDimitry Andric 11881ad6265SDimitry Andric void CSKYMCCodeEmitter::expandRSUBI(const MCInst &MI, raw_ostream &OS, 11981ad6265SDimitry Andric SmallVectorImpl<MCFixup> &Fixups, 12081ad6265SDimitry Andric const MCSubtargetInfo &STI) const { 12181ad6265SDimitry Andric 12281ad6265SDimitry Andric MCInst TmpInst; 12381ad6265SDimitry Andric uint32_t Binary; 12481ad6265SDimitry Andric unsigned Size = MI.getOpcode() == CSKY::RSUBI32 ? 4 : 2; 12581ad6265SDimitry Andric 12681ad6265SDimitry Andric TmpInst = MCInstBuilder(Size == 4 ? CSKY::NOT32 : CSKY::NOT16) 12781ad6265SDimitry Andric .addOperand(MI.getOperand(0)) 12881ad6265SDimitry Andric .addOperand(MI.getOperand(1)); 12981ad6265SDimitry Andric Binary = getBinaryCodeForInstr(TmpInst, Fixups, STI); 13081ad6265SDimitry Andric writeData(Binary, Size, OS); 13181ad6265SDimitry Andric 13281ad6265SDimitry Andric TmpInst = MCInstBuilder(Size == 4 ? CSKY::ADDI32 : CSKY::ADDI16) 13381ad6265SDimitry Andric .addOperand(MI.getOperand(0)) 13481ad6265SDimitry Andric .addOperand(MI.getOperand(0)) 13581ad6265SDimitry Andric .addImm(MI.getOperand(2).getImm() + 1); 13681ad6265SDimitry Andric Binary = getBinaryCodeForInstr(TmpInst, Fixups, STI); 13781ad6265SDimitry Andric writeData(Binary, Size, OS); 13881ad6265SDimitry Andric } 13981ad6265SDimitry Andric 140e8d8bef9SDimitry Andric void CSKYMCCodeEmitter::encodeInstruction(const MCInst &MI, raw_ostream &OS, 141e8d8bef9SDimitry Andric SmallVectorImpl<MCFixup> &Fixups, 142e8d8bef9SDimitry Andric const MCSubtargetInfo &STI) const { 143e8d8bef9SDimitry Andric const MCInstrDesc &Desc = MII.get(MI.getOpcode()); 144e8d8bef9SDimitry Andric unsigned Size = Desc.getSize(); 145349cc55cSDimitry Andric 14681ad6265SDimitry Andric MCInst TmpInst; 14781ad6265SDimitry Andric 14881ad6265SDimitry Andric switch (MI.getOpcode()) { 14981ad6265SDimitry Andric default: 15081ad6265SDimitry Andric TmpInst = MI; 15181ad6265SDimitry Andric break; 15281ad6265SDimitry Andric case CSKY::JBT_E: 15381ad6265SDimitry Andric case CSKY::JBF_E: 15481ad6265SDimitry Andric expandJBTF(MI, OS, Fixups, STI); 15581ad6265SDimitry Andric MCNumEmitted += 2; 15681ad6265SDimitry Andric return; 15781ad6265SDimitry Andric case CSKY::NEG32: 15881ad6265SDimitry Andric case CSKY::NEG16: 15981ad6265SDimitry Andric expandNEG(MI, OS, Fixups, STI); 16081ad6265SDimitry Andric MCNumEmitted += 2; 16181ad6265SDimitry Andric return; 16281ad6265SDimitry Andric case CSKY::RSUBI32: 16381ad6265SDimitry Andric case CSKY::RSUBI16: 16481ad6265SDimitry Andric expandRSUBI(MI, OS, Fixups, STI); 16581ad6265SDimitry Andric MCNumEmitted += 2; 16681ad6265SDimitry Andric return; 16781ad6265SDimitry Andric case CSKY::JBSR32: 16881ad6265SDimitry Andric TmpInst = MCInstBuilder(CSKY::BSR32).addOperand(MI.getOperand(0)); 16981ad6265SDimitry Andric break; 17081ad6265SDimitry Andric case CSKY::JBR16: 17181ad6265SDimitry Andric TmpInst = MCInstBuilder(CSKY::BR16).addOperand(MI.getOperand(0)); 17281ad6265SDimitry Andric break; 17381ad6265SDimitry Andric case CSKY::JBR32: 17481ad6265SDimitry Andric TmpInst = MCInstBuilder(CSKY::BR32).addOperand(MI.getOperand(0)); 17581ad6265SDimitry Andric break; 17681ad6265SDimitry Andric case CSKY::JBT16: 17781ad6265SDimitry Andric TmpInst = MCInstBuilder(CSKY::BT16) 17881ad6265SDimitry Andric .addOperand(MI.getOperand(0)) 17981ad6265SDimitry Andric .addOperand(MI.getOperand(1)); 18081ad6265SDimitry Andric break; 18181ad6265SDimitry Andric case CSKY::JBT32: 18281ad6265SDimitry Andric TmpInst = MCInstBuilder(CSKY::BT32) 18381ad6265SDimitry Andric .addOperand(MI.getOperand(0)) 18481ad6265SDimitry Andric .addOperand(MI.getOperand(1)); 18581ad6265SDimitry Andric break; 18681ad6265SDimitry Andric case CSKY::JBF16: 18781ad6265SDimitry Andric TmpInst = MCInstBuilder(CSKY::BF16) 18881ad6265SDimitry Andric .addOperand(MI.getOperand(0)) 18981ad6265SDimitry Andric .addOperand(MI.getOperand(1)); 19081ad6265SDimitry Andric break; 19181ad6265SDimitry Andric case CSKY::JBF32: 19281ad6265SDimitry Andric TmpInst = MCInstBuilder(CSKY::BF32) 19381ad6265SDimitry Andric .addOperand(MI.getOperand(0)) 19481ad6265SDimitry Andric .addOperand(MI.getOperand(1)); 19581ad6265SDimitry Andric break; 19681ad6265SDimitry Andric case CSKY::LRW32_Gen: 19781ad6265SDimitry Andric TmpInst = MCInstBuilder(CSKY::LRW32) 19881ad6265SDimitry Andric .addOperand(MI.getOperand(0)) 19981ad6265SDimitry Andric .addOperand(MI.getOperand(2)); 20081ad6265SDimitry Andric break; 20181ad6265SDimitry Andric case CSKY::LRW16_Gen: 20281ad6265SDimitry Andric TmpInst = MCInstBuilder(CSKY::LRW16) 20381ad6265SDimitry Andric .addOperand(MI.getOperand(0)) 20481ad6265SDimitry Andric .addOperand(MI.getOperand(2)); 20581ad6265SDimitry Andric break; 20681ad6265SDimitry Andric case CSKY::CMPLEI32: 20781ad6265SDimitry Andric TmpInst = MCInstBuilder(CSKY::CMPLTI32) 20881ad6265SDimitry Andric .addOperand(MI.getOperand(0)) 20981ad6265SDimitry Andric .addOperand(MI.getOperand(1)) 21081ad6265SDimitry Andric .addImm(MI.getOperand(2).getImm() + 1); 21181ad6265SDimitry Andric break; 21281ad6265SDimitry Andric case CSKY::CMPLEI16: 21381ad6265SDimitry Andric TmpInst = MCInstBuilder(CSKY::CMPLTI16) 21481ad6265SDimitry Andric .addOperand(MI.getOperand(0)) 21581ad6265SDimitry Andric .addOperand(MI.getOperand(1)) 21681ad6265SDimitry Andric .addImm(MI.getOperand(2).getImm() + 1); 21781ad6265SDimitry Andric break; 21881ad6265SDimitry Andric case CSKY::ROTRI32: 21981ad6265SDimitry Andric TmpInst = MCInstBuilder(CSKY::ROTLI32) 22081ad6265SDimitry Andric .addOperand(MI.getOperand(0)) 22181ad6265SDimitry Andric .addOperand(MI.getOperand(1)) 22281ad6265SDimitry Andric .addImm(32 - MI.getOperand(2).getImm()); 22381ad6265SDimitry Andric break; 22481ad6265SDimitry Andric case CSKY::BGENI: 22581ad6265SDimitry Andric auto V = 1 << MI.getOperand(1).getImm(); 22681ad6265SDimitry Andric TmpInst = 22781ad6265SDimitry Andric MCInstBuilder(CSKY::MOVI32).addOperand(MI.getOperand(0)).addImm(V); 22881ad6265SDimitry Andric break; 22981ad6265SDimitry Andric } 23081ad6265SDimitry Andric 231349cc55cSDimitry Andric ++MCNumEmitted; 232349cc55cSDimitry Andric 23381ad6265SDimitry Andric uint32_t Bin = getBinaryCodeForInstr(TmpInst, Fixups, STI); 234e8d8bef9SDimitry Andric 235e8d8bef9SDimitry Andric uint16_t LO16 = static_cast<uint16_t>(Bin); 236e8d8bef9SDimitry Andric uint16_t HI16 = static_cast<uint16_t>(Bin >> 16); 237e8d8bef9SDimitry Andric 238e8d8bef9SDimitry Andric if (Size == 4) 239e8d8bef9SDimitry Andric support::endian::write<uint16_t>(OS, HI16, support::little); 240e8d8bef9SDimitry Andric 241e8d8bef9SDimitry Andric support::endian::write<uint16_t>(OS, LO16, support::little); 242e8d8bef9SDimitry Andric } 243e8d8bef9SDimitry Andric 244e8d8bef9SDimitry Andric unsigned 245e8d8bef9SDimitry Andric CSKYMCCodeEmitter::getMachineOpValue(const MCInst &MI, const MCOperand &MO, 246e8d8bef9SDimitry Andric SmallVectorImpl<MCFixup> &Fixups, 247e8d8bef9SDimitry Andric const MCSubtargetInfo &STI) const { 248e8d8bef9SDimitry Andric if (MO.isReg()) 249e8d8bef9SDimitry Andric return Ctx.getRegisterInfo()->getEncodingValue(MO.getReg()); 250e8d8bef9SDimitry Andric 251e8d8bef9SDimitry Andric if (MO.isImm()) 252e8d8bef9SDimitry Andric return static_cast<unsigned>(MO.getImm()); 253e8d8bef9SDimitry Andric 254e8d8bef9SDimitry Andric llvm_unreachable("Unhandled expression!"); 255e8d8bef9SDimitry Andric return 0; 256e8d8bef9SDimitry Andric } 257e8d8bef9SDimitry Andric 258349cc55cSDimitry Andric unsigned 259349cc55cSDimitry Andric CSKYMCCodeEmitter::getRegSeqImmOpValue(const MCInst &MI, unsigned Idx, 260349cc55cSDimitry Andric SmallVectorImpl<MCFixup> &Fixups, 261349cc55cSDimitry Andric const MCSubtargetInfo &STI) const { 262349cc55cSDimitry Andric assert(MI.getOperand(Idx).isReg() && "Unexpected MO type."); 263349cc55cSDimitry Andric assert(MI.getOperand(Idx + 1).isImm() && "Unexpected MO type."); 264349cc55cSDimitry Andric 265349cc55cSDimitry Andric unsigned Ry = MI.getOperand(Idx).getReg(); 266349cc55cSDimitry Andric unsigned Rz = MI.getOperand(Idx + 1).getImm(); 267349cc55cSDimitry Andric 268349cc55cSDimitry Andric unsigned Imm = Ctx.getRegisterInfo()->getEncodingValue(Rz) - 269349cc55cSDimitry Andric Ctx.getRegisterInfo()->getEncodingValue(Ry); 270349cc55cSDimitry Andric 271349cc55cSDimitry Andric return ((Ctx.getRegisterInfo()->getEncodingValue(Ry) << 5) | Imm); 272349cc55cSDimitry Andric } 273349cc55cSDimitry Andric 274349cc55cSDimitry Andric unsigned 275349cc55cSDimitry Andric CSKYMCCodeEmitter::getRegisterSeqOpValue(const MCInst &MI, unsigned Op, 276349cc55cSDimitry Andric SmallVectorImpl<MCFixup> &Fixups, 277349cc55cSDimitry Andric const MCSubtargetInfo &STI) const { 278349cc55cSDimitry Andric unsigned Reg1 = 279349cc55cSDimitry Andric Ctx.getRegisterInfo()->getEncodingValue(MI.getOperand(Op).getReg()); 280349cc55cSDimitry Andric unsigned Reg2 = 281349cc55cSDimitry Andric Ctx.getRegisterInfo()->getEncodingValue(MI.getOperand(Op + 1).getReg()); 282349cc55cSDimitry Andric 283349cc55cSDimitry Andric unsigned Binary = ((Reg1 & 0x1f) << 5) | (Reg2 - Reg1); 284349cc55cSDimitry Andric 285349cc55cSDimitry Andric return Binary; 286349cc55cSDimitry Andric } 287349cc55cSDimitry Andric 288349cc55cSDimitry Andric unsigned CSKYMCCodeEmitter::getImmJMPIX(const MCInst &MI, unsigned Idx, 289349cc55cSDimitry Andric SmallVectorImpl<MCFixup> &Fixups, 290349cc55cSDimitry Andric const MCSubtargetInfo &STI) const { 291349cc55cSDimitry Andric if (MI.getOperand(Idx).getImm() == 16) 292349cc55cSDimitry Andric return 0; 293349cc55cSDimitry Andric else if (MI.getOperand(Idx).getImm() == 24) 294349cc55cSDimitry Andric return 1; 295349cc55cSDimitry Andric else if (MI.getOperand(Idx).getImm() == 32) 296349cc55cSDimitry Andric return 2; 297349cc55cSDimitry Andric else if (MI.getOperand(Idx).getImm() == 40) 298349cc55cSDimitry Andric return 3; 299349cc55cSDimitry Andric else 300349cc55cSDimitry Andric assert(0); 301349cc55cSDimitry Andric } 302349cc55cSDimitry Andric 303fe6060f1SDimitry Andric MCFixupKind CSKYMCCodeEmitter::getTargetFixup(const MCExpr *Expr) const { 304fe6060f1SDimitry Andric const CSKYMCExpr *CSKYExpr = cast<CSKYMCExpr>(Expr); 305fe6060f1SDimitry Andric 306fe6060f1SDimitry Andric switch (CSKYExpr->getKind()) { 307fe6060f1SDimitry Andric default: 308fe6060f1SDimitry Andric llvm_unreachable("Unhandled fixup kind!"); 309fe6060f1SDimitry Andric case CSKYMCExpr::VK_CSKY_ADDR: 310fe6060f1SDimitry Andric return MCFixupKind(CSKY::fixup_csky_addr32); 311349cc55cSDimitry Andric case CSKYMCExpr::VK_CSKY_ADDR_HI16: 312349cc55cSDimitry Andric return MCFixupKind(CSKY::fixup_csky_addr_hi16); 313349cc55cSDimitry Andric case CSKYMCExpr::VK_CSKY_ADDR_LO16: 314349cc55cSDimitry Andric return MCFixupKind(CSKY::fixup_csky_addr_lo16); 315349cc55cSDimitry Andric case CSKYMCExpr::VK_CSKY_GOT: 316349cc55cSDimitry Andric return MCFixupKind(CSKY::fixup_csky_got32); 317349cc55cSDimitry Andric case CSKYMCExpr::VK_CSKY_GOTPC: 318349cc55cSDimitry Andric return MCFixupKind(CSKY::fixup_csky_gotpc); 319349cc55cSDimitry Andric case CSKYMCExpr::VK_CSKY_GOTOFF: 320349cc55cSDimitry Andric return MCFixupKind(CSKY::fixup_csky_gotoff); 321349cc55cSDimitry Andric case CSKYMCExpr::VK_CSKY_PLT: 322349cc55cSDimitry Andric return MCFixupKind(CSKY::fixup_csky_plt32); 323349cc55cSDimitry Andric case CSKYMCExpr::VK_CSKY_PLT_IMM18_BY4: 324349cc55cSDimitry Andric return MCFixupKind(CSKY::fixup_csky_plt_imm18_scale4); 325349cc55cSDimitry Andric case CSKYMCExpr::VK_CSKY_GOT_IMM18_BY4: 326349cc55cSDimitry Andric return MCFixupKind(CSKY::fixup_csky_got_imm18_scale4); 327fe6060f1SDimitry Andric } 328fe6060f1SDimitry Andric } 329fe6060f1SDimitry Andric 330e8d8bef9SDimitry Andric MCCodeEmitter *llvm::createCSKYMCCodeEmitter(const MCInstrInfo &MCII, 331e8d8bef9SDimitry Andric MCContext &Ctx) { 332e8d8bef9SDimitry Andric return new CSKYMCCodeEmitter(Ctx, MCII); 333e8d8bef9SDimitry Andric } 334e8d8bef9SDimitry Andric 335e8d8bef9SDimitry Andric #include "CSKYGenMCCodeEmitter.inc" 336