diff options
author | Alon Zakai <azakai@google.com> | 2021-06-02 13:24:22 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-06-02 13:24:22 -0700 |
commit | d8f2ddd4d680b059c2daded7f57051bf21d77297 (patch) | |
tree | 11a1f5d1e2621152bdfcef385201b950c379f0c5 /src/wasm/wasm-binary.cpp | |
parent | e40396003798678803f4091ac4132aefa3905d7a (diff) | |
download | binaryen-d8f2ddd4d680b059c2daded7f57051bf21d77297.tar.gz binaryen-d8f2ddd4d680b059c2daded7f57051bf21d77297.tar.bz2 binaryen-d8f2ddd4d680b059c2daded7f57051bf21d77297.zip |
[Wasm GC] Add negated BrOn* operations (#3913)
They are basically the flip versions. The only interesting part in the impl is that their
returned typed and sent types are different.
Spec: https://docs.google.com/document/d/1DklC3qVuOdLHSXB5UXghM_syCh-4cMinQ50ICiXnK3Q/edit
Diffstat (limited to 'src/wasm/wasm-binary.cpp')
-rw-r--r-- | src/wasm/wasm-binary.cpp | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index 12aa5f214..35bc468b1 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -3377,6 +3377,9 @@ BinaryConsts::ASTNodes WasmBinaryBuilder::readExpression(Expression*& curr) { case BinaryConsts::BrOnNull: maybeVisitBrOn(curr, code); break; + case BinaryConsts::BrOnNonNull: + maybeVisitBrOn(curr, code); + break; case BinaryConsts::Try: visitTryOrTryInBlock(curr); break; @@ -6333,24 +6336,39 @@ bool WasmBinaryBuilder::maybeVisitBrOn(Expression*& out, uint32_t code) { case BinaryConsts::BrOnNull: op = BrOnNull; break; + case BinaryConsts::BrOnNonNull: + op = BrOnNonNull; + break; case BinaryConsts::BrOnCast: op = BrOnCast; break; + case BinaryConsts::BrOnCastFail: + op = BrOnCastFail; + break; case BinaryConsts::BrOnFunc: op = BrOnFunc; break; + case BinaryConsts::BrOnNonFunc: + op = BrOnNonFunc; + break; case BinaryConsts::BrOnData: op = BrOnData; break; + case BinaryConsts::BrOnNonData: + op = BrOnNonData; + break; case BinaryConsts::BrOnI31: op = BrOnI31; break; + case BinaryConsts::BrOnNonI31: + op = BrOnNonI31; + break; default: return false; } auto name = getBreakTarget(getU32LEB()).name; Expression* rtt = nullptr; - if (op == BrOnCast) { + if (op == BrOnCast || op == BrOnCastFail) { rtt = popNonVoidExpression(); } auto* ref = popNonVoidExpression(); |