diff options
author | Thomas Lively <tlively@google.com> | 2022-10-13 15:55:22 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-13 15:55:22 -0500 |
commit | 9c3b95a388d48cfd2430e138606f781c831fb2f2 (patch) | |
tree | 041bc931d6b5aaac01d5b2b681a85774c0dc7c06 /src/wasm/wat-parser.cpp | |
parent | 577376d181a06ae2d053b503b95e5d7ea571c638 (diff) | |
download | binaryen-9c3b95a388d48cfd2430e138606f781c831fb2f2.tar.gz binaryen-9c3b95a388d48cfd2430e138606f781c831fb2f2.tar.bz2 binaryen-9c3b95a388d48cfd2430e138606f781c831fb2f2.zip |
[Parser] Parse `local.set` and `local.tee` (#5138)
Diffstat (limited to 'src/wasm/wat-parser.cpp')
-rw-r--r-- | src/wasm/wat-parser.cpp | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/src/wasm/wat-parser.cpp b/src/wasm/wat-parser.cpp index 23961ac3f..1ee2bd2c8 100644 --- a/src/wasm/wat-parser.cpp +++ b/src/wasm/wat-parser.cpp @@ -583,6 +583,8 @@ struct NullInstrParserCtx { InstrT makeF64Const(Index, double) { return Ok{}; } InstrT makeLocalGet(Index pos, LocalT local) { return Ok{}; } + InstrT makeLocalTee(Index pos, LocalT local) { return Ok{}; } + InstrT makeLocalSet(Index pos, LocalT local) { return Ok{}; } template<typename HeapTypeT> InstrT makeRefNull(Index, HeapTypeT) { return {}; @@ -1258,6 +1260,27 @@ struct ParseDefsCtx : InstrParserCtx<ParseDefsCtx> { assert(local < func->getNumLocals()); return push(pos, builder.makeLocalGet(local, func->getLocalType(local))); } + + Result<> makeLocalTee(Index pos, Index local) { + if (!func) { + return in.err(pos, "local.tee must be inside a function"); + } + assert(local < func->getNumLocals()); + auto val = pop(pos); + CHECK_ERR(val); + return push(pos, + builder.makeLocalTee(local, *val, func->getLocalType(local))); + } + + Result<> makeLocalSet(Index pos, Index local) { + if (!func) { + return in.err(pos, "local.set must be inside a function"); + } + assert(local < func->getNumLocals()); + auto val = pop(pos); + CHECK_ERR(val); + return push(pos, builder.makeLocalSet(local, *val)); + } }; // ================ @@ -1881,12 +1904,16 @@ Result<typename Ctx::InstrT> makeLocalGet(Ctx& ctx, Index pos) { template<typename Ctx> Result<typename Ctx::InstrT> makeLocalTee(Ctx& ctx, Index pos) { - return ctx.in.err("unimplemented instruction"); + auto local = localidx(ctx); + CHECK_ERR(local); + return ctx.makeLocalTee(pos, *local); } template<typename Ctx> Result<typename Ctx::InstrT> makeLocalSet(Ctx& ctx, Index pos) { - return ctx.in.err("unimplemented instruction"); + auto local = localidx(ctx); + CHECK_ERR(local); + return ctx.makeLocalSet(pos, *local); } template<typename Ctx> |