xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/CSKY/MCTargetDesc/CSKYMCCodeEmitter.cpp (revision 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e)
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