From 22442924a8d1b32473fcfa56f9421b8ae58f7b8b Mon Sep 17 00:00:00 2001 From: Thomas Lively Date: Tue, 21 Aug 2018 21:03:18 +0000 Subject: [WebAssembly] v128.const Summary: This CL implements v128.const for each vector type. New operand types are added to ensure the vector contents can be serialized without LEB encoding. Tests are added for instruction selection, encoding, assembly and disassembly. Reviewers: aheejin, dschuff, aardappel Subscribers: sbc100, jgravelle-google, sunfish, llvm-commits Differential Revision: https://reviews.llvm.org/D50873 llvm-svn: 340336 --- .../Disassembler/WebAssemblyDisassembler.cpp | 33 +++++++++++++++++++--- 1 file changed, 29 insertions(+), 4 deletions(-) (limited to 'llvm/lib/Target/WebAssembly/Disassembler/WebAssemblyDisassembler.cpp') diff --git a/llvm/lib/Target/WebAssembly/Disassembler/WebAssemblyDisassembler.cpp b/llvm/lib/Target/WebAssembly/Disassembler/WebAssemblyDisassembler.cpp index 2f0960271e3..9f6797da3a2 100644 --- a/llvm/lib/Target/WebAssembly/Disassembler/WebAssemblyDisassembler.cpp +++ b/llvm/lib/Target/WebAssembly/Disassembler/WebAssemblyDisassembler.cpp @@ -92,14 +92,18 @@ static bool parseLEBImmediate(MCInst &MI, uint64_t &Size, } template -bool parseFPImmediate(MCInst &MI, uint64_t &Size, ArrayRef Bytes) { +bool parseImmediate(MCInst &MI, uint64_t &Size, ArrayRef Bytes) { if (Size + sizeof(T) > Bytes.size()) return false; T Val; memcpy(&Val, Bytes.data() + Size, sizeof(T)); support::endian::byte_swap(Val); Size += sizeof(T); - MI.addOperand(MCOperand::createFPImm(static_cast(Val))); + if (std::is_floating_point::value) { + MI.addOperand(MCOperand::createFPImm(static_cast(Val))); + } else { + MI.addOperand(MCOperand::createImm(static_cast(Val))); + } return true; } @@ -160,12 +164,33 @@ MCDisassembler::DecodeStatus WebAssemblyDisassembler::getInstruction( } // FP operands. case WebAssembly::OPERAND_F32IMM: { - if (!parseFPImmediate(MI, Size, Bytes)) + if (!parseImmediate(MI, Size, Bytes)) return MCDisassembler::Fail; break; } case WebAssembly::OPERAND_F64IMM: { - if (!parseFPImmediate(MI, Size, Bytes)) + if (!parseImmediate(MI, Size, Bytes)) + return MCDisassembler::Fail; + break; + } + // Vector lane operands (not LEB encoded). + case WebAssembly::OPERAND_VEC_I8IMM: { + if (!parseImmediate(MI, Size, Bytes)) + return MCDisassembler::Fail; + break; + } + case WebAssembly::OPERAND_VEC_I16IMM: { + if (!parseImmediate(MI, Size, Bytes)) + return MCDisassembler::Fail; + break; + } + case WebAssembly::OPERAND_VEC_I32IMM: { + if (!parseImmediate(MI, Size, Bytes)) + return MCDisassembler::Fail; + break; + } + case WebAssembly::OPERAND_VEC_I64IMM: { + if (!parseImmediate(MI, Size, Bytes)) return MCDisassembler::Fail; break; } -- cgit v1.2.3