summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
diff options
context:
space:
mode:
authorDan Gohman <dan433584@gmail.com>2015-11-06 19:45:01 +0000
committerDan Gohman <dan433584@gmail.com>2015-11-06 19:45:01 +0000
commit4b96d8d1ff42e5e9427d5f46efab889cfebda279 (patch)
tree2876e47368d26cf46f1e4a5d360e107d80a1a7a8 /llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
parent55ea67cea7f9fa45fe066c8670804582ad028faa (diff)
downloadbcm5719-llvm-4b96d8d1ff42e5e9427d5f46efab889cfebda279.tar.gz
bcm5719-llvm-4b96d8d1ff42e5e9427d5f46efab889cfebda279.zip
[WebAssembly] Make expression-stack pushing explicit
Modelling of the expression stack is evolving. This patch takes another step by making pushes explicit. Differential Revision: http://reviews.llvm.org/D14338 llvm-svn: 252334
Diffstat (limited to 'llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp')
-rw-r--r--llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp26
1 files changed, 19 insertions, 7 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
index 5a6f4354b22..7034892de8e 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
@@ -269,33 +269,39 @@ void WebAssemblyAsmPrinter::EmitInstruction(const MachineInstr *MI) {
switch (MI->getOpcode()) {
case TargetOpcode::COPY:
- OS << "get_local " << regToString(MI->getOperand(1));
+ OS << "get_local push, " << regToString(MI->getOperand(1));
break;
case WebAssembly::GLOBAL:
// TODO: wasm64
- OS << "i32.const " << toSymbol(MI->getOperand(1).getGlobal()->getName());
+ OS << "i32.const push, " << toSymbol(MI->getOperand(1).getGlobal()->getName());
break;
case WebAssembly::ARGUMENT_I32:
case WebAssembly::ARGUMENT_I64:
case WebAssembly::ARGUMENT_F32:
case WebAssembly::ARGUMENT_F64:
- OS << "get_local " << argToString(MI->getOperand(1));
+ OS << "get_local push, " << argToString(MI->getOperand(1));
break;
case WebAssembly::Const_I32:
- OS << "i32.const " << MI->getOperand(1).getImm();
+ OS << "i32.const push, " << MI->getOperand(1).getImm();
break;
case WebAssembly::Const_I64:
- OS << "i64.const " << MI->getOperand(1).getImm();
+ OS << "i64.const push, " << MI->getOperand(1).getImm();
break;
case WebAssembly::Const_F32:
- OS << "f32.const " << toString(MI->getOperand(1).getFPImm()->getValueAPF());
+ OS << "f32.const push, " << toString(MI->getOperand(1).getFPImm()->getValueAPF());
break;
case WebAssembly::Const_F64:
- OS << "f64.const " << toString(MI->getOperand(1).getFPImm()->getValueAPF());
+ OS << "f64.const push, " << toString(MI->getOperand(1).getFPImm()->getValueAPF());
break;
default: {
OS << OpcodeName(TII, MI);
bool NeedComma = false;
+ bool DefsPushed = false;
+ if (NumDefs != 0 && !MI->isCall()) {
+ OS << " push";
+ NeedComma = true;
+ DefsPushed = true;
+ }
for (const MachineOperand &MO : MI->uses()) {
if (MO.isReg() && MO.isImplicit())
continue;
@@ -322,6 +328,12 @@ void WebAssemblyAsmPrinter::EmitInstruction(const MachineInstr *MI) {
OS << toSymbol(MO.getMBB()->getSymbol()->getName());
break;
}
+ if (NumDefs != 0 && !DefsPushed) {
+ // Special-case for calls; print the push after the callee.
+ assert(MI->isCall());
+ OS << ", push";
+ DefsPushed = true;
+ }
}
break;
}
OpenPOWER on IntegriCloud