diff options
author | Thomas Lively <tlively@google.com> | 2022-10-21 17:26:48 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-21 15:26:48 -0700 |
commit | 4c6fbb884fc6627828174c1e44f5f200dd2c6303 (patch) | |
tree | 81caa20c6ba768cc4ffa62ec1893d98ba9fd4cee /src/wasm/wat-parser.cpp | |
parent | 3e57307715e7f7c9f2f7cbc38f2bbcbb936af104 (diff) | |
download | binaryen-4c6fbb884fc6627828174c1e44f5f200dd2c6303.tar.gz binaryen-4c6fbb884fc6627828174c1e44f5f200dd2c6303.tar.bz2 binaryen-4c6fbb884fc6627828174c1e44f5f200dd2c6303.zip |
[Parser] Parse `memory.copy` and `memory.fill` (#5178)
Diffstat (limited to 'src/wasm/wat-parser.cpp')
-rw-r--r-- | src/wasm/wat-parser.cpp | 44 |
1 files changed, 42 insertions, 2 deletions
diff --git a/src/wasm/wat-parser.cpp b/src/wasm/wat-parser.cpp index 16f33d2d7..8aab01029 100644 --- a/src/wasm/wat-parser.cpp +++ b/src/wasm/wat-parser.cpp @@ -722,6 +722,9 @@ struct NullInstrParserCtx { return Ok{}; } + InstrT makeMemoryCopy(Index, MemoryT*, MemoryT*) { return Ok{}; } + InstrT makeMemoryFill(Index, MemoryT*) { return Ok{}; } + template<typename HeapTypeT> InstrT makeRefNull(Index, HeapTypeT) { return {}; } @@ -1690,6 +1693,33 @@ struct ParseDefsCtx : InstrParserCtx<ParseDefsCtx> { builder.makeSIMDLoadStoreLane( op, memarg.offset, memarg.align, lane, *ptr, *vec, *m)); } + + Result<> makeMemoryCopy(Index pos, Name* destMem, Name* srcMem) { + auto destMemory = self().getMemory(pos, destMem); + CHECK_ERR(destMemory); + auto srcMemory = self().getMemory(pos, srcMem); + CHECK_ERR(srcMemory); + auto size = pop(pos); + CHECK_ERR(size); + auto src = pop(pos); + CHECK_ERR(src); + auto dest = pop(pos); + CHECK_ERR(dest); + return push( + pos, builder.makeMemoryCopy(*dest, *src, *size, *destMemory, *srcMemory)); + } + + Result<> makeMemoryFill(Index pos, Name* mem) { + auto m = self().getMemory(pos, mem); + CHECK_ERR(m); + auto size = pop(pos); + CHECK_ERR(size); + auto val = pop(pos); + CHECK_ERR(val); + auto dest = pop(pos); + CHECK_ERR(dest); + return push(pos, builder.makeMemoryFill(*dest, *val, *size, *m)); + } }; // ================ @@ -2607,12 +2637,22 @@ Result<typename Ctx::InstrT> makeDataDrop(Ctx& ctx, Index pos) { template<typename Ctx> Result<typename Ctx::InstrT> makeMemoryCopy(Ctx& ctx, Index pos) { - return ctx.in.err("unimplemented instruction"); + auto destMem = maybeMemidx(ctx); + CHECK_ERR(destMem); + std::optional<typename Ctx::MemoryT> srcMem = std::nullopt; + if (destMem) { + auto mem = memidx(ctx); + CHECK_ERR(mem); + srcMem = *mem; + } + return ctx.makeMemoryCopy(pos, destMem.getPtr(), srcMem ? &*srcMem : nullptr); } template<typename Ctx> Result<typename Ctx::InstrT> makeMemoryFill(Ctx& ctx, Index pos) { - return ctx.in.err("unimplemented instruction"); + auto mem = maybeMemidx(ctx); + CHECK_ERR(mem); + return ctx.makeMemoryFill(pos, mem.getPtr()); } template<typename Ctx> |