Convert Constant->emit() definitions to allow multiple targets to define them.

Wasn't sure how to allow TargetX8632 and TargetARM32
to both define "ConstantInteger32::emit(GlobalContext *)",
and define them differently if both targets happen to be
ifdef'ed into the code. Rearranged things so that it's now
"TargetFoo::emit(ConstantInteger32 *)", so that each
TargetFoo can have a separate definition.

Some targets may allow emitting some types of constants
while other targets do not (64-bit int for x86-64?).
Also they emit constants with a different style.
E.g., the prefix for x86 is "$" while the prefix for ARM
is "#" and there isn't a prefix for mips(?).
Renamed emitWithoutDollar to emitWithoutPrefix.

Did this sort of multi-method dispatch via a visitor
pattern, which is a bit verbose though.

We may be able to remove the emitWithoutDollar/Prefix for
ConstantPrimitive by just inlining that into the few places
that need it (only needed for ConstantInteger32). This
undoes the unreachable methods added by: https://codereview.chromium.org/1017373002/diff/60001/src/IceTargetLoweringX8632.cpp
The only place extra was for emitting calls to constants.
There was already an inlined instance for OperandX8632Mem.

BUG= https://code.google.com/p/nativeclient/issues/detail?id=4076
R=stichnot@chromium.org

Review URL: https://codereview.chromium.org/1129263005
diff --git a/src/IceOperand.cpp b/src/IceOperand.cpp
index 9338bdc..2d2c8cf 100644
--- a/src/IceOperand.cpp
+++ b/src/IceOperand.cpp
@@ -422,27 +422,28 @@
   }
 }
 
-void ConstantRelocatable::emitWithoutDollar(GlobalContext *Ctx) const {
-  if (!ALLOW_DUMP)
-    return;
-  Ostream &Str = Ctx->getStrEmit();
-  if (SuppressMangling)
-    Str << Name;
-  else
-    Str << Ctx->mangleName(Name);
-  if (Offset) {
-    if (Offset > 0)
-      Str << "+";
-    Str << Offset;
-  }
+template <> void ConstantInteger32::emit(TargetLowering *Target) const {
+  Target->emit(this);
 }
 
-void ConstantRelocatable::emit(GlobalContext *Ctx) const {
-  if (!ALLOW_DUMP)
-    return;
-  Ostream &Str = Ctx->getStrEmit();
-  Str << "$";
-  emitWithoutDollar(Ctx);
+template <> void ConstantInteger64::emit(TargetLowering *Target) const {
+  Target->emit(this);
+}
+
+template <> void ConstantFloat::emit(TargetLowering *Target) const {
+  Target->emit(this);
+}
+
+template <> void ConstantDouble::emit(TargetLowering *Target) const {
+  Target->emit(this);
+}
+
+void ConstantRelocatable::emit(TargetLowering *Target) const {
+  Target->emit(this);
+}
+
+void ConstantRelocatable::emitWithoutPrefix(TargetLowering *Target) const {
+  Target->emitWithoutPrefix(this);
 }
 
 void ConstantRelocatable::dump(const Cfg *Func, Ostream &Str) const {
@@ -458,6 +459,8 @@
     Str << "+" << Offset;
 }
 
+void ConstantUndef::emit(TargetLowering *Target) const { Target->emit(this); }
+
 void LiveRange::dump(Ostream &Str) const {
   if (!ALLOW_DUMP)
     return;