1 //===-- X86/X86MCCodeEmitter.cpp - Convert X86 code to machine code -------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements the X86MCCodeEmitter class.
12 //===----------------------------------------------------------------------===//
14 #define DEBUG_TYPE "x86-emitter"
16 #include "X86InstrInfo.h"
17 #include "llvm/MC/MCCodeEmitter.h"
18 #include "llvm/MC/MCInst.h"
19 #include "llvm/Support/raw_ostream.h"
23 class X86MCCodeEmitter : public MCCodeEmitter {
24 X86MCCodeEmitter(const X86MCCodeEmitter &); // DO NOT IMPLEMENT
25 void operator=(const X86MCCodeEmitter &); // DO NOT IMPLEMENT
26 const TargetMachine &TM;
27 const TargetInstrInfo &TII;
29 X86MCCodeEmitter(TargetMachine &tm)
30 : TM(tm), TII(*TM.getInstrInfo()) {
33 ~X86MCCodeEmitter() {}
35 void EmitByte(unsigned char C, raw_ostream &OS) const {
39 void EncodeInstruction(const MCInst &MI, raw_ostream &OS) const;
43 } // end anonymous namespace
46 MCCodeEmitter *llvm::createX86MCCodeEmitter(const Target &,
48 return new X86MCCodeEmitter(TM);
53 void X86MCCodeEmitter::
54 EncodeInstruction(const MCInst &MI, raw_ostream &OS) const {
55 unsigned Opcode = MI.getOpcode();
56 const TargetInstrDesc &Desc = TII.get(Opcode);
58 // Emit the lock opcode prefix as needed.
59 if (Desc.TSFlags & X86II::LOCK)
62 // Emit segment override opcode prefix as needed.
63 switch (Desc.TSFlags & X86II::SegOvrMask) {
64 default: assert(0 && "Invalid segment!");
65 case 0: break; // No segment override!