set up some infrastructure, some minor cleanups.
[oota-llvm.git] / lib / Target / X86 / X86MCCodeEmitter.cpp
1 //===-- X86/X86MCCodeEmitter.cpp - Convert X86 code to machine code -------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file implements the X86MCCodeEmitter class.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #define DEBUG_TYPE "x86-emitter"
15 #include "X86.h"
16 #include "X86InstrInfo.h"
17 #include "llvm/MC/MCCodeEmitter.h"
18 #include "llvm/MC/MCInst.h"
19 #include "llvm/Support/raw_ostream.h"
20 using namespace llvm;
21
22 namespace {
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;
28 public:
29   X86MCCodeEmitter(TargetMachine &tm) 
30     : TM(tm), TII(*TM.getInstrInfo()) {
31   }
32
33   ~X86MCCodeEmitter() {}
34   
35   void EmitByte(unsigned char C, raw_ostream &OS) const {
36     OS << (char)C;
37   }
38   
39   void EncodeInstruction(const MCInst &MI, raw_ostream &OS) const;
40   
41 };
42
43 } // end anonymous namespace
44
45
46 MCCodeEmitter *llvm::createX86MCCodeEmitter(const Target &,
47                                             TargetMachine &TM) {
48   return new X86MCCodeEmitter(TM);
49 }
50
51
52
53 void X86MCCodeEmitter::
54 EncodeInstruction(const MCInst &MI, raw_ostream &OS) const {
55   unsigned Opcode = MI.getOpcode();
56   const TargetInstrDesc &Desc = TII.get(Opcode);
57   
58   // Emit the lock opcode prefix as needed.
59   if (Desc.TSFlags & X86II::LOCK)
60     EmitByte(0xF0, OS);
61   
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!
66   case X86II::FS:
67     EmitByte(0x64, OS);
68     break;
69   case X86II::GS:
70     EmitByte(0x65, OS);
71     break;
72   }
73   
74   
75 }