summaryrefslogtreecommitdiff
path: root/src/wasm/wasm-binary.cpp
diff options
context:
space:
mode:
authorAlon Zakai <azakai@google.com>2021-06-02 13:24:22 -0700
committerGitHub <noreply@github.com>2021-06-02 13:24:22 -0700
commitd8f2ddd4d680b059c2daded7f57051bf21d77297 (patch)
tree11a1f5d1e2621152bdfcef385201b950c379f0c5 /src/wasm/wasm-binary.cpp
parente40396003798678803f4091ac4132aefa3905d7a (diff)
downloadbinaryen-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.cpp20
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();