From 737c22d30798c491eea3b401b948b9327ac979de Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 20 Sep 2021 10:47:14 -0700 Subject: [Wasm GC] Add static variants of ref.test, ref.cast, and br_on_cast* (#4163) These variants take a HeapType that is the type we intend to cast to, and do not take an RTT. These are intended to be more statically optimizable. For now though this PR just implements the minimum to get them parsing and to get through the optimizer without crashing. Spec: https://docs.google.com/document/d/1afthjsL_B9UaMqCA5ekgVmOm75BVFu6duHNsN9-gnXw/edit# See #4149 --- src/wasm/wasm-binary.cpp | 43 +++++++++++++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 12 deletions(-) (limited to 'src/wasm/wasm-binary.cpp') diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index dad6f9320..e1ff43988 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -6419,23 +6419,33 @@ bool WasmBinaryBuilder::maybeVisitI31Get(Expression*& out, uint32_t code) { } bool WasmBinaryBuilder::maybeVisitRefTest(Expression*& out, uint32_t code) { - if (code != BinaryConsts::RefTest) { - return false; + if (code == BinaryConsts::RefTest) { + auto* rtt = popNonVoidExpression(); + auto* ref = popNonVoidExpression(); + out = Builder(wasm).makeRefTest(ref, rtt); + return true; + } else if (code == BinaryConsts::RefTestStatic) { + auto intendedType = getIndexedHeapType(); + auto* ref = popNonVoidExpression(); + out = Builder(wasm).makeRefTest(ref, intendedType); + return true; } - auto* rtt = popNonVoidExpression(); - auto* ref = popNonVoidExpression(); - out = Builder(wasm).makeRefTest(ref, rtt); - return true; + return false; } bool WasmBinaryBuilder::maybeVisitRefCast(Expression*& out, uint32_t code) { - if (code != BinaryConsts::RefCast) { - return false; + if (code == BinaryConsts::RefCast) { + auto* rtt = popNonVoidExpression(); + auto* ref = popNonVoidExpression(); + out = Builder(wasm).makeRefCast(ref, rtt); + return true; + } else if (code == BinaryConsts::RefCastStatic) { + auto intendedType = getIndexedHeapType(); + auto* ref = popNonVoidExpression(); + out = Builder(wasm).makeRefCast(ref, intendedType); + return true; } - auto* rtt = popNonVoidExpression(); - auto* ref = popNonVoidExpression(); - out = Builder(wasm).makeRefCast(ref, rtt); - return true; + return false; } bool WasmBinaryBuilder::maybeVisitBrOn(Expression*& out, uint32_t code) { @@ -6448,9 +6458,11 @@ bool WasmBinaryBuilder::maybeVisitBrOn(Expression*& out, uint32_t code) { op = BrOnNonNull; break; case BinaryConsts::BrOnCast: + case BinaryConsts::BrOnCastStatic: op = BrOnCast; break; case BinaryConsts::BrOnCastFail: + case BinaryConsts::BrOnCastStaticFail: op = BrOnCastFail; break; case BinaryConsts::BrOnFunc: @@ -6475,6 +6487,13 @@ bool WasmBinaryBuilder::maybeVisitBrOn(Expression*& out, uint32_t code) { return false; } auto name = getBreakTarget(getU32LEB()).name; + if (code == BinaryConsts::BrOnCastStatic || + code == BinaryConsts::BrOnCastStaticFail) { + auto intendedType = getIndexedHeapType(); + auto* ref = popNonVoidExpression(); + out = Builder(wasm).makeBrOn(op, name, ref, intendedType); + return true; + } Expression* rtt = nullptr; if (op == BrOnCast || op == BrOnCastFail) { rtt = popNonVoidExpression(); -- cgit v1.2.3