set up some infrastructure, some minor cleanups.
authorChris Lattner <sabre@nondot.org>
Wed, 3 Feb 2010 21:43:43 +0000 (21:43 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 3 Feb 2010 21:43:43 +0000 (21:43 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@95260 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86MCCodeEmitter.cpp

index 0578c6d8c8822d17564b954da28530babee710a8..d5613b2dda9245c2495ca5fc2dfda2b554f37ef8 100644 (file)
 
 #define DEBUG_TYPE "x86-emitter"
 #include "X86.h"
-#include "X86TargetMachine.h"
+#include "X86InstrInfo.h"
 #include "llvm/MC/MCCodeEmitter.h"
+#include "llvm/MC/MCInst.h"
+#include "llvm/Support/raw_ostream.h"
 using namespace llvm;
 
 namespace {
 class X86MCCodeEmitter : public MCCodeEmitter {
   X86MCCodeEmitter(const X86MCCodeEmitter &); // DO NOT IMPLEMENT
   void operator=(const X86MCCodeEmitter &); // DO NOT IMPLEMENT
-  X86TargetMachine &TM;
+  const TargetMachine &TM;
+  const TargetInstrInfo &TII;
 public:
-  X86MCCodeEmitter(X86TargetMachine &tm) : TM(tm) {
+  X86MCCodeEmitter(TargetMachine &tm) 
+    : TM(tm), TII(*TM.getInstrInfo()) {
   }
 
   ~X86MCCodeEmitter() {}
   
-  void EncodeInstruction(const MCInst &MI, raw_ostream &OS) const {
+  void EmitByte(unsigned char C, raw_ostream &OS) const {
+    OS << (char)C;
   }
+  
+  void EncodeInstruction(const MCInst &MI, raw_ostream &OS) const;
+  
 };
 
 } // end anonymous namespace
@@ -37,5 +45,31 @@ public:
 
 MCCodeEmitter *llvm::createX86MCCodeEmitter(const Target &,
                                             TargetMachine &TM) {
-  return new X86MCCodeEmitter(static_cast<X86TargetMachine&>(TM));
+  return new X86MCCodeEmitter(TM);
+}
+
+
+
+void X86MCCodeEmitter::
+EncodeInstruction(const MCInst &MI, raw_ostream &OS) const {
+  unsigned Opcode = MI.getOpcode();
+  const TargetInstrDesc &Desc = TII.get(Opcode);
+  
+  // Emit the lock opcode prefix as needed.
+  if (Desc.TSFlags & X86II::LOCK)
+    EmitByte(0xF0, OS);
+  
+  // Emit segment override opcode prefix as needed.
+  switch (Desc.TSFlags & X86II::SegOvrMask) {
+  default: assert(0 && "Invalid segment!");
+  case 0: break;  // No segment override!
+  case X86II::FS:
+    EmitByte(0x64, OS);
+    break;
+  case X86II::GS:
+    EmitByte(0x65, OS);
+    break;
+  }
+  
+  
 }