Allow X86 addressing modes to represent globals with offsets. Patch contributed
authorChris Lattner <sabre@nondot.org>
Fri, 15 Oct 2004 04:43:20 +0000 (04:43 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 15 Oct 2004 04:43:20 +0000 (04:43 +0000)
by Jeff Cohen!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@17008 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86InstrBuilder.h

index 3c8cfd73a16ee848d9189c9949248c4eb2d71d0d..c77eba76b106af99fd1d4d7f6ff4da79f2251716 100644 (file)
@@ -30,13 +30,13 @@ namespace llvm {
 
 /// X86AddressMode - This struct holds a generalized full x86 address mode.
 /// The base register can be a frame index, which will eventually be replaced
-/// with BP or SP and Disp being offsetted accordingly.
-/// FIXME: add support for globals as a new base type.
+/// with BP or SP and Disp being offsetted accordingly.  The displacement may
+/// also include the offset of a global value.
 struct X86AddressMode {
     enum {
       UnknownBase,
       RegBase,
-      FrameIndexBase
+      FrameIndexBase,
     } BaseType;
 
     union {
@@ -47,8 +47,9 @@ struct X86AddressMode {
     unsigned Scale;
     unsigned IndexReg;
     unsigned Disp;
+    GlobalValue *GV;
 
-    X86AddressMode() : BaseType(UnknownBase) {}
+    X86AddressMode() : BaseType(UnknownBase), GV(NULL) {}
 };
 
 /// addDirectMem - This function is used to add a direct memory reference to the
@@ -82,7 +83,11 @@ inline const MachineInstrBuilder &addFullAddress(const MachineInstrBuilder &MIB,
     MIB.addFrameIndex(AM.Base.FrameIndex);
   else
     assert (0);
-  return MIB.addZImm(AM.Scale).addReg(AM.IndexReg).addSImm(AM.Disp);
+  MIB.addZImm(AM.Scale).addReg(AM.IndexReg);
+  if (AM.GV)
+    return MIB.addGlobalAddress(AM.GV, false, AM.Disp);
+  else
+    return MIB.addSImm(AM.Disp);
 }
 
 /// addFrameReference - This function is used to add a reference to the base of