diff options
author | Dan Gohman <dan433584@gmail.com> | 2015-11-13 01:42:29 +0000 |
---|---|---|
committer | Dan Gohman <dan433584@gmail.com> | 2015-11-13 01:42:29 +0000 |
commit | f19ed562889a144d067a170575f3f32526a1b028 (patch) | |
tree | 599a1e9fdb1d6cccf1765b90301e2a54f80f8502 /llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp | |
parent | 0f95ac4b05c99aa4a3e93096fc1d63b09eb03291 (diff) | |
download | bcm5719-llvm-f19ed562889a144d067a170575f3f32526a1b028.tar.gz bcm5719-llvm-f19ed562889a144d067a170575f3f32526a1b028.zip |
[WebAssembly] Inline asm support.
llvm-svn: 252997
Diffstat (limited to 'llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp')
-rw-r--r-- | llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp index bcee99578f5..0ab8888015e 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp @@ -77,6 +77,12 @@ private: void EmitFunctionBodyStart() override; void EmitInstruction(const MachineInstr *MI) override; void EmitEndOfAsmFile(Module &M) override; + bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, + unsigned AsmVariant, const char *ExtraCode, + raw_ostream &OS) override; + bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo, + unsigned AsmVariant, const char *ExtraCode, + raw_ostream &OS) override; std::string getRegTypeName(unsigned RegNo) const; const char *toString(MVT VT) const; @@ -275,6 +281,41 @@ void WebAssemblyAsmPrinter::EmitEndOfAsmFile(Module &M) { OutStreamer->EmitRawText(Text.substr(0, Text.size() - 1)); } +bool WebAssemblyAsmPrinter::PrintAsmOperand(const MachineInstr *MI, + unsigned OpNo, unsigned AsmVariant, + const char *ExtraCode, + raw_ostream &OS) { + if (AsmVariant != 0) + report_fatal_error("There are no defined alternate asm variants"); + + if (!ExtraCode) { + const MachineOperand &MO = MI->getOperand(OpNo); + if (MO.isImm()) + OS << MO.getImm(); + else + OS << regToString(MO); + return false; + } + + return AsmPrinter::PrintAsmOperand(MI, OpNo, AsmVariant, ExtraCode, OS); +} + +bool WebAssemblyAsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI, + unsigned OpNo, + unsigned AsmVariant, + const char *ExtraCode, + raw_ostream &OS) { + if (AsmVariant != 0) + report_fatal_error("There are no defined alternate asm variants"); + + if (!ExtraCode) { + OS << regToString(MI->getOperand(OpNo)); + return false; + } + + return AsmPrinter::PrintAsmMemoryOperand(MI, OpNo, AsmVariant, ExtraCode, OS); +} + // Force static initialization. extern "C" void LLVMInitializeWebAssemblyAsmPrinter() { RegisterAsmPrinter<WebAssemblyAsmPrinter> X(TheWebAssemblyTarget32); |