diff options
Diffstat (limited to 'llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp')
-rw-r--r-- | llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp | 26 |
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; } |