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;