[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