blob: d5613b2dda9245c2495ca5fc2dfda2b554f37ef8 [file] [log] [blame]
Chris Lattner45762472010-02-03 21:24:49 +00001//===-- 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"
Chris Lattner92b1dfe2010-02-03 21:43:43 +000016#include "X86InstrInfo.h"
Chris Lattner45762472010-02-03 21:24:49 +000017#include "llvm/MC/MCCodeEmitter.h"
Chris Lattner92b1dfe2010-02-03 21:43:43 +000018#include "llvm/MC/MCInst.h"
19#include "llvm/Support/raw_ostream.h"
Chris Lattner45762472010-02-03 21:24:49 +000020using namespace llvm;
21
22namespace {
23class X86MCCodeEmitter : public MCCodeEmitter {
24 X86MCCodeEmitter(const X86MCCodeEmitter &); // DO NOT IMPLEMENT
25 void operator=(const X86MCCodeEmitter &); // DO NOT IMPLEMENT
Chris Lattner92b1dfe2010-02-03 21:43:43 +000026 const TargetMachine &TM;
27 const TargetInstrInfo &TII;
Chris Lattner45762472010-02-03 21:24:49 +000028public:
Chris Lattner92b1dfe2010-02-03 21:43:43 +000029 X86MCCodeEmitter(TargetMachine &tm)
30 : TM(tm), TII(*TM.getInstrInfo()) {
Chris Lattner45762472010-02-03 21:24:49 +000031 }
32
33 ~X86MCCodeEmitter() {}
34
Chris Lattner92b1dfe2010-02-03 21:43:43 +000035 void EmitByte(unsigned char C, raw_ostream &OS) const {
36 OS << (char)C;
Chris Lattner45762472010-02-03 21:24:49 +000037 }
Chris Lattner92b1dfe2010-02-03 21:43:43 +000038
39 void EncodeInstruction(const MCInst &MI, raw_ostream &OS) const;
40
Chris Lattner45762472010-02-03 21:24:49 +000041};
42
43} // end anonymous namespace
44
45
46MCCodeEmitter *llvm::createX86MCCodeEmitter(const Target &,
47 TargetMachine &TM) {
Chris Lattner92b1dfe2010-02-03 21:43:43 +000048 return new X86MCCodeEmitter(TM);
49}
50
51
52
53void X86MCCodeEmitter::
54EncodeInstruction(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
Chris Lattner45762472010-02-03 21:24:49 +000075}