[llvm-commits] CVS: llvm/lib/Target/X86/InstSelectSimple.cpp MachineCodeEmitter.cpp Printer.cpp

Chris Lattner lattner at cs.uiuc.edu
Wed Dec 4 00:46:02 PST 2002


Changes in directory llvm/lib/Target/X86:

InstSelectSimple.cpp updated: 1.45 -> 1.46
MachineCodeEmitter.cpp updated: 1.4 -> 1.5
Printer.cpp updated: 1.20 -> 1.21

---
Log message:

Add support for referencing global variables/functions


---
Diffs of the changes:

Index: llvm/lib/Target/X86/InstSelectSimple.cpp
diff -u llvm/lib/Target/X86/InstSelectSimple.cpp:1.45 llvm/lib/Target/X86/InstSelectSimple.cpp:1.46
--- llvm/lib/Target/X86/InstSelectSimple.cpp:1.45	Tue Dec  3 14:30:12 2002
+++ llvm/lib/Target/X86/InstSelectSimple.cpp	Wed Dec  4 00:45:19 2002
@@ -133,8 +133,14 @@
       // If this operand is a constant, emit the code to copy the constant into
       // the register here...
       //
-      if (Constant *C = dyn_cast<Constant>(V))
+      if (Constant *C = dyn_cast<Constant>(V)) {
         copyConstantToRegister(C, Reg);
+      } else if (GlobalValue *GV = dyn_cast<GlobalValue>(V)) {
+        // Move the address of the global into the register
+        BuildMI(BB, X86::MOVir32, 1, Reg).addReg(GV);
+      } else {
+        assert(0 && "Don't know how to handle a value of this type!");
+      }
 
       return Reg;
     }


Index: llvm/lib/Target/X86/MachineCodeEmitter.cpp
diff -u llvm/lib/Target/X86/MachineCodeEmitter.cpp:1.4 llvm/lib/Target/X86/MachineCodeEmitter.cpp:1.5
--- llvm/lib/Target/X86/MachineCodeEmitter.cpp:1.4	Tue Dec  3 00:34:06 2002
+++ llvm/lib/Target/X86/MachineCodeEmitter.cpp	Wed Dec  4 00:45:19 2002
@@ -11,6 +11,7 @@
 #include "llvm/CodeGen/MachineCodeEmitter.h"
 #include "llvm/CodeGen/MachineFunction.h"
 #include "llvm/CodeGen/MachineInstr.h"
+#include "llvm/Value.h"
 
 namespace {
   class Emitter : public FunctionPass {
@@ -224,7 +225,12 @@
     MCE.emitByte(BaseOpcode + getX86RegNum(MI.getOperand(0).getReg()));
     if (MI.getNumOperands() == 2) {
       unsigned Size = 4;
-      emitConstant(MI.getOperand(1).getImmedValue(), Size);
+      if (Value *V = MI.getOperand(1).getVRegValue()) {
+        assert(Size == 4 && "Don't know how to emit non-pointer values!");
+        MCE.emitGlobalAddress(cast<GlobalValue>(V));
+      } else {
+        emitConstant(MI.getOperand(1).getImmedValue(), Size);
+      }
     }
     break;
   case X86II::MRMDestReg:


Index: llvm/lib/Target/X86/Printer.cpp
diff -u llvm/lib/Target/X86/Printer.cpp:1.20 llvm/lib/Target/X86/Printer.cpp:1.21
--- llvm/lib/Target/X86/Printer.cpp:1.20	Tue Dec  3 00:34:06 2002
+++ llvm/lib/Target/X86/Printer.cpp	Wed Dec  4 00:45:19 2002
@@ -96,6 +96,10 @@
                     const MRegisterInfo &RI) {
   switch (MO.getType()) {
   case MachineOperand::MO_VirtualRegister:
+    if (Value *V = MO.getVRegValue()) {
+      O << "<" << V->getName() << ">";
+      return;
+    }
   case MachineOperand::MO_MachineRegister:
     if (MO.getReg() < MRegisterInfo::FirstVirtualRegister)
       O << RI.get(MO.getReg()).Name;
@@ -172,11 +176,15 @@
     // There are currently two forms of acceptable AddRegFrm instructions.
     // Either the instruction JUST takes a single register (like inc, dec, etc),
     // or it takes a register and an immediate of the same size as the register
-    // (move immediate f.e.).
+    // (move immediate f.e.).  Note that this immediate value might be stored as
+    // an LLVM value, to represent, for example, loading the address of a global
+    // into a register.
     //
     assert(isReg(MI->getOperand(0)) &&
            (MI->getNumOperands() == 1 || 
-            (MI->getNumOperands() == 2 && isImmediate(MI->getOperand(1)))) &&
+            (MI->getNumOperands() == 2 &&
+             (MI->getOperand(1).getVRegValue() ||
+              isImmediate(MI->getOperand(1))))) &&
            "Illegal form for AddRegFrm instruction!");
 
     unsigned Reg = MI->getOperand(0).getReg();





More information about the llvm-commits mailing list