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
getOImmOpValue(const MCInst & MI,unsigned Idx,SmallVectorImpl<MCFixup> & Fixups,const MCSubtargetInfo & STI) const30e8d8bef9SDimitry 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
getImmOpValueIDLY(const MCInst & MI,unsigned Idx,SmallVectorImpl<MCFixup> & Fixups,const MCSubtargetInfo & STI) const39349cc55cSDimitry 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
getImmOpValueMSBSize(const MCInst & MI,unsigned Idx,SmallVectorImpl<MCFixup> & Fixups,const MCSubtargetInfo & STI) const50349cc55cSDimitry 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
writeData(uint32_t Bin,unsigned Size,SmallVectorImpl<char> & CB)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
expandJBTF(const MCInst & MI,SmallVectorImpl<char> & CB,SmallVectorImpl<MCFixup> & Fixups,const MCSubtargetInfo & STI) const68*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
expandNEG(const MCInst & MI,SmallVectorImpl<char> & CB,SmallVectorImpl<MCFixup> & Fixups,const MCSubtargetInfo & STI) const94*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
expandRSUBI(const MCInst & MI,SmallVectorImpl<char> & CB,SmallVectorImpl<MCFixup> & Fixups,const MCSubtargetInfo & STI) const116*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
encodeInstruction(const MCInst & MI,SmallVectorImpl<char> & CB,SmallVectorImpl<MCFixup> & Fixups,const MCSubtargetInfo & STI) const138*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
getMachineOpValue(const MCInst & MI,const MCOperand & MO,SmallVectorImpl<MCFixup> & Fixups,const MCSubtargetInfo & STI) const235e8d8bef9SDimitry 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
getRegSeqImmOpValue(const MCInst & MI,unsigned Idx,SmallVectorImpl<MCFixup> & Fixups,const MCSubtargetInfo & STI) const249349cc55cSDimitry 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
getRegisterSeqOpValue(const MCInst & MI,unsigned Op,SmallVectorImpl<MCFixup> & Fixups,const MCSubtargetInfo & STI) const265349cc55cSDimitry 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
getImmJMPIX(const MCInst & MI,unsigned Idx,SmallVectorImpl<MCFixup> & Fixups,const MCSubtargetInfo & STI) const278349cc55cSDimitry 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
getTargetFixup(const MCExpr * Expr) const293fe6060f1SDimitry 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
createCSKYMCCodeEmitter(const MCInstrInfo & MCII,MCContext & Ctx)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