119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===-- MBlazeMCCodeEmitter.cpp - Convert MBlaze code to machine code -----===//
219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//                     The LLVM Compiler Infrastructure
419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This file is distributed under the University of Illinois Open Source
619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// License. See LICENSE.TXT for details.
719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===//
919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
1019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This file implements the MBlazeMCCodeEmitter class.
1119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
1219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===//
1319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
1419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#define DEBUG_TYPE "mccodeemitter"
1519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "MCTargetDesc/MBlazeBaseInfo.h"
1619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "MCTargetDesc/MBlazeMCTargetDesc.h"
1719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCCodeEmitter.h"
1819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCExpr.h"
1919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCInst.h"
2019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCInstrInfo.h"
2119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCSubtargetInfo.h"
2219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCSymbol.h"
2319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/MC/MCFixup.h"
2419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/ADT/Statistic.h"
2519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Support/raw_ostream.h"
2619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanusing namespace llvm;
2719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
2819bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanSTATISTIC(MCNumEmitted, "Number of MC instructions emitted");
2919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
3019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumannamespace {
3119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanclass MBlazeMCCodeEmitter : public MCCodeEmitter {
3219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MBlazeMCCodeEmitter(const MBlazeMCCodeEmitter &); // DO NOT IMPLEMENT
3319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  void operator=(const MBlazeMCCodeEmitter &); // DO NOT IMPLEMENT
3419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const MCInstrInfo &MCII;
3519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
3619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanpublic:
3719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MBlazeMCCodeEmitter(const MCInstrInfo &mcii, const MCSubtargetInfo &sti,
3819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                      MCContext &ctx)
3919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    : MCII(mcii) {
4019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
4119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
4219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  ~MBlazeMCCodeEmitter() {}
4319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
4419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // getBinaryCodeForInstr - TableGen'erated function for getting the
4519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // binary encoding for an instruction.
4619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned getBinaryCodeForInstr(const MCInst &MI) const;
4719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
4819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  /// getMachineOpValue - Return binary encoding of operand. If the machine
4919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  /// operand requires relocation, record the relocation and return zero.
5019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned getMachineOpValue(const MCInst &MI,const MCOperand &MO) const;
5119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned getMachineOpValue(const MCInst &MI, unsigned OpIdx) const {
5219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return getMachineOpValue(MI, MI.getOperand(OpIdx));
5319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
5419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
5519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  static unsigned GetMBlazeRegNum(const MCOperand &MO) {
5619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // FIXME: getMBlazeRegisterNumbering() is sufficient?
5719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    assert(0 && "MBlazeMCCodeEmitter::GetMBlazeRegNum() not yet implemented.");
5819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return 0;
5919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
6019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
6119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  void EmitByte(unsigned char C, unsigned &CurByte, raw_ostream &OS) const {
6219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // The MicroBlaze uses a bit reversed format so we need to reverse the
6319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // order of the bits. Taken from:
6419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // http://graphics.stanford.edu/~seander/bithacks.html
6519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    C = ((C * 0x80200802ULL) & 0x0884422110ULL) * 0x0101010101ULL >> 32;
6619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
6719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    OS << (char)C;
6819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    ++CurByte;
6919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
7019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
7119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  void EmitRawByte(unsigned char C, unsigned &CurByte, raw_ostream &OS) const {
7219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    OS << (char)C;
7319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    ++CurByte;
7419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
7519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
7619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  void EmitConstant(uint64_t Val, unsigned Size, unsigned &CurByte,
7719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                    raw_ostream &OS) const {
7819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    assert(Size <= 8 && "size too big in emit constant");
7919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
8019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    for (unsigned i = 0; i != Size; ++i) {
8119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      EmitByte(Val & 255, CurByte, OS);
8219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Val >>= 8;
8319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
8419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
8519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
8619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  void EmitIMM(const MCOperand &imm, unsigned &CurByte, raw_ostream &OS) const;
8719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  void EmitIMM(const MCInst &MI, unsigned &CurByte, raw_ostream &OS) const;
8819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
8919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  void EmitImmediate(const MCInst &MI, unsigned opNo, bool pcrel,
9019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                     unsigned &CurByte, raw_ostream &OS,
9119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                     SmallVectorImpl<MCFixup> &Fixups) const;
9219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
9319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  void EncodeInstruction(const MCInst &MI, raw_ostream &OS,
9419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                         SmallVectorImpl<MCFixup> &Fixups) const;
9519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman};
9619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
9719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} // end anonymous namespace
9819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
9919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
10019bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanMCCodeEmitter *llvm::createMBlazeMCCodeEmitter(const MCInstrInfo &MCII,
10119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                               const MCSubtargetInfo &STI,
10219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                               MCContext &Ctx) {
10319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return new MBlazeMCCodeEmitter(MCII, STI, Ctx);
10419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
10519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
10619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// getMachineOpValue - Return binary encoding of operand. If the machine
10719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman/// operand requires relocation, record the relocation and return zero.
10819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanunsigned MBlazeMCCodeEmitter::getMachineOpValue(const MCInst &MI,
10919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                                             const MCOperand &MO) const {
11019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (MO.isReg())
11119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return getMBlazeRegisterNumbering(MO.getReg());
11219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  else if (MO.isImm())
11319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return static_cast<unsigned>(MO.getImm());
11419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  else if (MO.isExpr())
11519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return 0; // The relocation has already been recorded at this point.
11619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  else {
11719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#ifndef NDEBUG
11819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    errs() << MO;
11919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#endif
12019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    llvm_unreachable(0);
12119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
12219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return 0;
12319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
12419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
12519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MBlazeMCCodeEmitter::
12619bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanEmitIMM(const MCOperand &imm, unsigned &CurByte, raw_ostream &OS) const {
12719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  int32_t val = (int32_t)imm.getImm();
12819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (val > 32767 || val < -32768) {
12919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    EmitByte(0x0D, CurByte, OS);
13019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    EmitByte(0x00, CurByte, OS);
13119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    EmitRawByte((val >> 24) & 0xFF, CurByte, OS);
13219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    EmitRawByte((val >> 16) & 0xFF, CurByte, OS);
13319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
13419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
13519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
13619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MBlazeMCCodeEmitter::
13719bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanEmitIMM(const MCInst &MI, unsigned &CurByte,raw_ostream &OS) const {
13819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  switch (MI.getOpcode()) {
13919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  default: break;
14019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
14119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MBlaze::ADDIK32:
14219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MBlaze::ORI32:
14319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MBlaze::BRLID32:
14419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    EmitByte(0x0D, CurByte, OS);
14519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    EmitByte(0x00, CurByte, OS);
14619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    EmitRawByte(0, CurByte, OS);
14719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    EmitRawByte(0, CurByte, OS);
14819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
14919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
15019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
15119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MBlazeMCCodeEmitter::
15219bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanEmitImmediate(const MCInst &MI, unsigned opNo, bool pcrel, unsigned &CurByte,
15319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman              raw_ostream &OS, SmallVectorImpl<MCFixup> &Fixups) const {
15419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  assert(MI.getNumOperands()>opNo && "Not enought operands for instruction");
15519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
15619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  MCOperand oper = MI.getOperand(opNo);
15719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
15819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  if (oper.isImm()) {
15919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    EmitIMM(oper, CurByte, OS);
16019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  } else if (oper.isExpr()) {
16119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    MCFixupKind FixupKind;
16219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    switch (MI.getOpcode()) {
16319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    default:
16419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      FixupKind = pcrel ? FK_PCRel_2 : FK_Data_2;
16519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Fixups.push_back(MCFixup::Create(0,oper.getExpr(),FixupKind));
16619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      break;
16719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    case MBlaze::ORI32:
16819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    case MBlaze::ADDIK32:
16919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    case MBlaze::BRLID32:
17019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      FixupKind = pcrel ? FK_PCRel_4 : FK_Data_4;
17119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      Fixups.push_back(MCFixup::Create(0,oper.getExpr(),FixupKind));
17219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      break;
17319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
17419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
17519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
17619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
17719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
17819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
17919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanvoid MBlazeMCCodeEmitter::
18019bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanEncodeInstruction(const MCInst &MI, raw_ostream &OS,
18119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                  SmallVectorImpl<MCFixup> &Fixups) const {
18219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned Opcode = MI.getOpcode();
18319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  const MCInstrDesc &Desc = MCII.get(Opcode);
18419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  uint64_t TSFlags = Desc.TSFlags;
18519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Keep track of the current byte being emitted.
18619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned CurByte = 0;
18719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
18819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  // Emit an IMM instruction if the instruction we are encoding requires it
18919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitIMM(MI,CurByte,OS);
19019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
19119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  switch ((TSFlags & MBlazeII::FormMask)) {
19219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  default: break;
19319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MBlazeII::FPseudo:
19419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    // Pseudo instructions don't get encoded.
19519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return;
19619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MBlazeII::FRRI:
19719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    EmitImmediate(MI, 2, false, CurByte, OS, Fixups);
19819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    break;
19919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MBlazeII::FRIR:
20019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    EmitImmediate(MI, 1, false, CurByte, OS, Fixups);
20119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    break;
20219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MBlazeII::FCRI:
20319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    EmitImmediate(MI, 1, true, CurByte, OS, Fixups);
20419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    break;
20519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MBlazeII::FRCI:
20619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    EmitImmediate(MI, 1, true, CurByte, OS, Fixups);
20719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  case MBlazeII::FCCI:
20819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    EmitImmediate(MI, 0, true, CurByte, OS, Fixups);
20919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    break;
21019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
21119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
21219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  ++MCNumEmitted;  // Keep track of the # of mi's emitted
21319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  unsigned Value = getBinaryCodeForInstr(MI);
21419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  EmitConstant(Value, 4, CurByte, OS);
21519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
21619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
21719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// FIXME: These #defines shouldn't be necessary. Instead, tblgen should
21819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// be able to generate code emitter helpers for either variant, like it
21919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// does for the AsmWriter.
22019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#define MBlazeCodeEmitter MBlazeMCCodeEmitter
22119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#define MachineInstr MCInst
22219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "MBlazeGenCodeEmitter.inc"
22319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#undef MBlazeCodeEmitter
22419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#undef MachineInstr
225