Enhance address mode recovery

This adds some more patterns to address mode recovery to recover
ConstantRelocatables as displacements, and a few more generalizations that
catch indexed addressing.

BUG=
R=stichnot@chromium.org

Review URL: https://codereview.chromium.org/1428443002 .
diff --git a/src/IceInstX8632.cpp b/src/IceInstX8632.cpp
index 3a8c57c..0837eef 100644
--- a/src/IceInstX8632.cpp
+++ b/src/IceInstX8632.cpp
@@ -120,9 +120,10 @@
     llvm_unreachable("Invalid offset type for x86 mem operand");
   }
 
-  if (Base) {
+  if (Base || Index) {
     Str << "(";
-    Base->emit(Func);
+    if (Base)
+      Base->emit(Func);
     if (Index) {
       Str << ",";
       Index->emit(Func);
@@ -151,8 +152,8 @@
     Dumped = true;
   }
   if (Index) {
-    assert(Base);
-    Str << "+";
+    if (Base)
+      Str << "+";
     if (Shift > 0)
       Str << (1u << Shift) << "*";
     if (Func)
@@ -216,18 +217,16 @@
     return X8632::Traits::Address(
         RegX8632::getEncodedGPR(getBase()->getRegNum()),
         RegX8632::getEncodedGPR(getIndex()->getRegNum()),
-        X8632::Traits::ScaleFactor(getShift()), Disp);
+        X8632::Traits::ScaleFactor(getShift()), Disp, Fixup);
   } else if (getBase()) {
     return X8632::Traits::Address(
-        RegX8632::getEncodedGPR(getBase()->getRegNum()), Disp);
+        RegX8632::getEncodedGPR(getBase()->getRegNum()), Disp, Fixup);
   } else if (getIndex()) {
     return X8632::Traits::Address(
         RegX8632::getEncodedGPR(getIndex()->getRegNum()),
-        X8632::Traits::ScaleFactor(getShift()), Disp);
-  } else if (Fixup) {
-    return X8632::Traits::Address::Absolute(Disp, Fixup);
+        X8632::Traits::ScaleFactor(getShift()), Disp, Fixup);
   } else {
-    return X8632::Traits::Address::Absolute(Disp);
+    return X8632::Traits::Address(Disp, Fixup);
   }
 }
 
@@ -238,7 +237,8 @@
   int32_t Offset =
       Var->getStackOffset() + Target->getStackAdjustment() + getOffset();
   return X8632::Traits::Address(
-      RegX8632::getEncodedGPR(Target->getFrameOrStackReg()), Offset);
+      RegX8632::getEncodedGPR(Target->getFrameOrStackReg()), Offset,
+      AssemblerFixup::NoFixup);
 }
 
 void MachineTraits<TargetX8632>::VariableSplit::emit(const Cfg *Func) const {