/*
 * Copyright 2019 WebAssembly Community Group participants
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "wasm-stack.h"
#include "ir/properties.h"
#include "wasm-binary.h"

namespace wasm {

static Name IMPOSSIBLE_CONTINUE("impossible-continue");

void BinaryInstWriter::emitResultType(Type type) {
  if (type == Type::unreachable) {
    parent.writeType(Type::none);
  } else if (type.isTuple()) {
    o << S32LEB(parent.getSignatureIndex(Signature(Type::none, type)));
  } else {
    parent.writeType(type);
  }
}

void BinaryInstWriter::visitBlock(Block* curr) {
  breakStack.push_back(curr->name);
  o << static_cast<int8_t>(BinaryConsts::Block);
  emitResultType(curr->type);
}

void BinaryInstWriter::visitIf(If* curr) {
  // the binary format requires this; we have a block if we need one
  // TODO: optimize this in Stack IR (if child is a block, we may break to this
  // instead)
  breakStack.emplace_back(IMPOSSIBLE_CONTINUE);
  o << static_cast<int8_t>(BinaryConsts::If);
  emitResultType(curr->type);
}

void BinaryInstWriter::emitIfElse(If* curr) {
  if (func) {
    parent.trackExpressionDelimiter(curr, func, BinaryLocations::Else);
  }
  o << static_cast<int8_t>(BinaryConsts::Else);
}

void BinaryInstWriter::emitStoreOpcode(uint8_t bytes, Type valueType) {
  switch (valueType.getBasic()) {
    case Type::i32: {
      switch (bytes) {
        case 1:
          o << static_cast<int8_t>(BinaryConsts::I32StoreMem8);
          break;
        case 2:
          o << static_cast<int8_t>(BinaryConsts::I32StoreMem16);
          break;
        case 4:
          o << static_cast<int8_t>(BinaryConsts::I32StoreMem);
          break;
        default:
          abort();
      }
      break;
    }
    case Type::i64: {
      switch (bytes) {
        case 1:
          o << static_cast<int8_t>(BinaryConsts::I64StoreMem8);
          break;
        case 2:
          o << static_cast<int8_t>(BinaryConsts::I64StoreMem16);
          break;
        case 4:
          o << static_cast<int8_t>(BinaryConsts::I64StoreMem32);
          break;
        case 8:
          o << static_cast<int8_t>(BinaryConsts::I64StoreMem);
          break;
        default:
          abort();
      }
      break;
    }
    case Type::f32: {
      switch (bytes) {
        case 2:
          o << static_cast<int8_t>(BinaryConsts::MiscPrefix)
            << U32LEB(BinaryConsts::F32_F16StoreMem);
          break;
        case 4:
          o << static_cast<int8_t>(BinaryConsts::F32StoreMem);
          break;
        default:
          WASM_UNREACHABLE("invalid store size");
      }
      break;
    }
    case Type::f64:
      o << static_cast<int8_t>(BinaryConsts::F64StoreMem);
      break;
    case Type::v128:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::V128Store);
      break;
    case Type::none:
    case Type::unreachable:
      WASM_UNREACHABLE("unexpected type");
  }
}

void BinaryInstWriter::emitLoadOpcode(unsigned bytes, bool signed_, Type type) {
  switch (type.getBasic()) {
    case Type::i32: {
      switch (bytes) {
        case 1:
          o << static_cast<int8_t>(signed_ ? BinaryConsts::I32LoadMem8S
                                           : BinaryConsts::I32LoadMem8U);
          break;
        case 2:
          o << static_cast<int8_t>(signed_ ? BinaryConsts::I32LoadMem16S
                                           : BinaryConsts::I32LoadMem16U);
          break;
        case 4:
          o << static_cast<int8_t>(BinaryConsts::I32LoadMem);
          break;
        default:
          abort();
      }
      break;
    }
    case Type::i64: {
      switch (bytes) {
        case 1:
          o << static_cast<int8_t>(signed_ ? BinaryConsts::I64LoadMem8S
                                           : BinaryConsts::I64LoadMem8U);
          break;
        case 2:
          o << static_cast<int8_t>(signed_ ? BinaryConsts::I64LoadMem16S
                                           : BinaryConsts::I64LoadMem16U);
          break;
        case 4:
          o << static_cast<int8_t>(signed_ ? BinaryConsts::I64LoadMem32S
                                           : BinaryConsts::I64LoadMem32U);
          break;
        case 8:
          o << static_cast<int8_t>(BinaryConsts::I64LoadMem);
          break;
        default:
          abort();
      }
      break;
    }
    case Type::f32: {
      switch (bytes) {
        case 2:
          o << static_cast<int8_t>(BinaryConsts::MiscPrefix)
            << U32LEB(BinaryConsts::F32_F16LoadMem);
          break;
        case 4:
          o << static_cast<int8_t>(BinaryConsts::F32LoadMem);
          break;
        default:
          WASM_UNREACHABLE("invalid load size");
      }
      break;
    }
    case Type::f64:
      o << static_cast<int8_t>(BinaryConsts::F64LoadMem);
      break;
    case Type::v128:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::V128Load);
      break;
    default:
      WASM_UNREACHABLE("unexpected type");
  }
}

void BinaryInstWriter::visitLoop(Loop* curr) {
  breakStack.push_back(curr->name);
  o << static_cast<int8_t>(BinaryConsts::Loop);
  emitResultType(curr->type);
}

void BinaryInstWriter::visitBreak(Break* curr) {
  auto type = curr->type;

  // See comment on |brIfsNeedingHandling| for the extra handling we need to
  // emit here for certain br_ifs. If we need that handling, we either use a
  // cast in simple cases, or scratch locals otherwise. We use the scratch
  // locals to stash the stack before the br_if (which contains the refined
  // types), then restore it later from those locals.
  bool needScratchLocals = false;
  // If we need locals, we must track how many we've used from each type as we
  // go, as a type might appear multiple times in the tuple. We know we have
  // enough of a range allocated for them, so we just increment as we go.
  std::unordered_map<Type, Index> scratchTypeUses;
  // Logic to stash and restore the stack, given a vector of types we are
  // stashing/restoring. We will first stash the entire stack, including the i32
  // condition, and after the br_if, restore the value (without the condition).
  auto stashStack = [&](const std::vector<Type>& types) {
    for (Index i = 0; i < types.size(); i++) {
      auto t = types[types.size() - i - 1];
      assert(scratchLocals.find(t) != scratchLocals.end());
      auto localIndex = scratchLocals[t] + scratchTypeUses[t]++;
      o << static_cast<int8_t>(BinaryConsts::LocalSet) << U32LEB(localIndex);
    }
  };
  auto restoreStack = [&](const std::vector<Type>& types) {
    // Use a copy of this data, as we will restore twice.
    auto currScratchTypeUses = scratchTypeUses;
    for (Index i = 0; i < types.size(); i++) {
      auto t = types[i];
      auto localIndex = scratchLocals[t] + --currScratchTypeUses[t];
      o << static_cast<int8_t>(BinaryConsts::LocalGet) << U32LEB(localIndex);
    }
  };

  // The types on the stack before the br_if. We need this if we use locals to
  // stash the stack.
  std::vector<Type> typesOnStack;

  auto needHandling = brIfsNeedingHandling.contains(curr);
  if (needHandling) {
    // Tuples always need scratch locals. Uncastable types do as well, we we
    // can't fix them up below with a simple cast.
    needScratchLocals = type.isTuple() || !type.isCastable();
    if (needScratchLocals) {
      // Stash all the values on the stack to those locals, then reload them for
      // the br_if to consume. Later, we can reload the refined values after the
      // br_if, for its parent to consume.

      typesOnStack = std::vector<Type>(type.begin(), type.end());
      typesOnStack.push_back(Type::i32);

      stashStack(typesOnStack);
      restoreStack(typesOnStack);
      // The stack is now in the same state as before, but we have copies in
      // locals for later.
    }
  }

  o << static_cast<int8_t>(curr->condition ? BinaryConsts::BrIf
                                           : BinaryConsts::Br)
    << U32LEB(getBreakIndex(curr->name));

  if (needHandling) {
    if (!needScratchLocals) {
      // We can just cast here, avoiding scratch locals. (Casting adds overhead,
      // but this is very rare, and it avoids adding locals, which would keep
      // growing the wasm with each roundtrip.)

      // Shim a tiny bit of IR, just enough to get visitRefCast to see what we
      // are casting, and to emit the proper thing.
      RefCast cast;
      cast.type = type;
      cast.ref = cast.desc = nullptr;
      visitRefCast(&cast);
    } else {
      // We need locals. Earlier we stashed the stack, so we just need to
      // restore the value from there (note we don't restore the condition),
      // after dropping the br_if's unrefined values.
      for (Index i = 0; i < type.size(); ++i) {
        o << static_cast<int8_t>(BinaryConsts::Drop);
      }
      assert(typesOnStack.back() == Type::i32);
      typesOnStack.pop_back();
      restoreStack(typesOnStack);
    }
  }
}

void BinaryInstWriter::visitSwitch(Switch* curr) {
  o << static_cast<int8_t>(BinaryConsts::BrTable)
    << U32LEB(curr->targets.size());
  for (auto target : curr->targets) {
    o << U32LEB(getBreakIndex(target));
  }
  o << U32LEB(getBreakIndex(curr->default_));
}

void BinaryInstWriter::visitCall(Call* curr) {
  int8_t op =
    curr->isReturn ? BinaryConsts::RetCallFunction : BinaryConsts::CallFunction;
  o << op << U32LEB(parent.getFunctionIndex(curr->target));
}

void BinaryInstWriter::visitCallIndirect(CallIndirect* curr) {
  Index tableIdx = parent.getTableIndex(curr->table);
  int8_t op =
    curr->isReturn ? BinaryConsts::RetCallIndirect : BinaryConsts::CallIndirect;
  o << op << U32LEB(parent.getTypeIndex(curr->heapType)) << U32LEB(tableIdx);
}

void BinaryInstWriter::visitLocalGet(LocalGet* curr) {
  if (deferredGets.contains(curr)) {
    // This local.get will be emitted as part of the instruction that consumes
    // it.
    return;
  }
  if (auto it = extractedGets.find(curr); it != extractedGets.end()) {
    // We have a tuple of locals to get, but we will only end up using one of
    // them, so we can just emit that one.
    o << static_cast<int8_t>(BinaryConsts::LocalGet)
      << U32LEB(mappedLocals[std::make_pair(curr->index, it->second)]);
    return;
  }
  size_t numValues = func->getLocalType(curr->index).size();
  for (Index i = 0; i < numValues; ++i) {
    o << static_cast<int8_t>(BinaryConsts::LocalGet)
      << U32LEB(mappedLocals[std::make_pair(curr->index, i)]);
  }
}

void BinaryInstWriter::visitLocalSet(LocalSet* curr) {
  size_t numValues = func->getLocalType(curr->index).size();
  // If this is a tuple, set all the elements with nonzero index.
  for (Index i = numValues - 1; i >= 1; --i) {
    o << static_cast<int8_t>(BinaryConsts::LocalSet)
      << U32LEB(mappedLocals[std::make_pair(curr->index, i)]);
  }
  if (!curr->isTee() || curr->type == Type::unreachable) {
    // This is not a tee or it is unreachable, so just finish setting the
    // values. We emit unreachable sets as sets rather than tees to avoid
    // pushing concrete types (which may not be correct for the next
    // instruction) onto polymorphic stacks.
    o << static_cast<int8_t>(BinaryConsts::LocalSet)
      << U32LEB(mappedLocals[std::make_pair(curr->index, 0)]);
  } else if (auto it = extractedGets.find(curr); it != extractedGets.end()) {
    // We only need to get the single extracted value.
    if (it->second == 0) {
      o << static_cast<int8_t>(BinaryConsts::LocalTee)
        << U32LEB(mappedLocals[std::make_pair(curr->index, 0)]);
    } else {
      o << static_cast<int8_t>(BinaryConsts::LocalSet)
        << U32LEB(mappedLocals[std::make_pair(curr->index, 0)]);
      o << static_cast<int8_t>(BinaryConsts::LocalGet)
        << U32LEB(mappedLocals[std::make_pair(curr->index, it->second)]);
    }
  } else {
    // We need to get all the values.
    o << static_cast<int8_t>(BinaryConsts::LocalTee)
      << U32LEB(mappedLocals[std::make_pair(curr->index, 0)]);
    for (Index i = 1; i < numValues; ++i) {
      o << static_cast<int8_t>(BinaryConsts::LocalGet)
        << U32LEB(mappedLocals[std::make_pair(curr->index, i)]);
    }
  }
}

void BinaryInstWriter::visitGlobalGet(GlobalGet* curr) {
  Index index = parent.getGlobalIndex(curr->name);
  if (auto it = extractedGets.find(curr); it != extractedGets.end()) {
    // We have a tuple of globals to get, but we will only end up using one of
    // them, so we can just emit that one.
    o << static_cast<int8_t>(BinaryConsts::GlobalGet)
      << U32LEB(index + it->second);
    return;
  }
  // Emit a global.get for each element if this is a tuple global
  size_t numValues = curr->type.size();
  for (Index i = 0; i < numValues; ++i) {
    o << static_cast<int8_t>(BinaryConsts::GlobalGet) << U32LEB(index + i);
  }
}

void BinaryInstWriter::visitGlobalSet(GlobalSet* curr) {
  // Emit a global.set for each element if this is a tuple global
  Index index = parent.getGlobalIndex(curr->name);
  size_t numValues = parent.getModule()->getGlobal(curr->name)->type.size();
  for (int i = numValues - 1; i >= 0; --i) {
    o << static_cast<int8_t>(BinaryConsts::GlobalSet) << U32LEB(index + i);
  }
}

void BinaryInstWriter::visitLoad(Load* curr) {
  if (curr->type == Type::unreachable) {
    // the pointer is unreachable, so we are never reached; just don't emit
    // a load
    return;
  }
  if (!curr->isAtomic()) {
    emitLoadOpcode(curr->bytes, curr->signed_, curr->type);
  } else {
    o << static_cast<int8_t>(BinaryConsts::AtomicPrefix);
    switch (curr->type.getBasic()) {
      case Type::i32: {
        switch (curr->bytes) {
          case 1:
            o << static_cast<int8_t>(BinaryConsts::I32AtomicLoad8U);
            break;
          case 2:
            o << static_cast<int8_t>(BinaryConsts::I32AtomicLoad16U);
            break;
          case 4:
            o << static_cast<int8_t>(BinaryConsts::I32AtomicLoad);
            break;
          default:
            WASM_UNREACHABLE("invalid load size");
        }
        break;
      }
      case Type::i64: {
        switch (curr->bytes) {
          case 1:
            o << static_cast<int8_t>(BinaryConsts::I64AtomicLoad8U);
            break;
          case 2:
            o << static_cast<int8_t>(BinaryConsts::I64AtomicLoad16U);
            break;
          case 4:
            o << static_cast<int8_t>(BinaryConsts::I64AtomicLoad32U);
            break;
          case 8:
            o << static_cast<int8_t>(BinaryConsts::I64AtomicLoad);
            break;
          default:
            WASM_UNREACHABLE("invalid load size");
        }
        break;
      }
      default:
        WASM_UNREACHABLE("unexpected type");
    }
  }
  emitMemoryAccess(curr->align,
                   curr->bytes,
                   curr->offset,
                   curr->memory,
                   curr->order,
                   /*isRMW=*/false);
}

void BinaryInstWriter::visitStore(Store* curr) {
  if (!curr->isAtomic()) {
    emitStoreOpcode(curr->bytes, curr->valueType);
  } else {
    o << static_cast<int8_t>(BinaryConsts::AtomicPrefix);
    switch (curr->valueType.getBasic()) {
      case Type::i32: {
        switch (curr->bytes) {
          case 1:
            o << static_cast<int8_t>(BinaryConsts::I32AtomicStore8);
            break;
          case 2:
            o << static_cast<int8_t>(BinaryConsts::I32AtomicStore16);
            break;
          case 4:
            o << static_cast<int8_t>(BinaryConsts::I32AtomicStore);
            break;
          default:
            WASM_UNREACHABLE("invalid store size");
        }
        break;
      }
      case Type::i64: {
        switch (curr->bytes) {
          case 1:
            o << static_cast<int8_t>(BinaryConsts::I64AtomicStore8);
            break;
          case 2:
            o << static_cast<int8_t>(BinaryConsts::I64AtomicStore16);
            break;
          case 4:
            o << static_cast<int8_t>(BinaryConsts::I64AtomicStore32);
            break;
          case 8:
            o << static_cast<int8_t>(BinaryConsts::I64AtomicStore);
            break;
          default:
            WASM_UNREACHABLE("invalid store size");
        }
        break;
      }
      default:
        WASM_UNREACHABLE("unexpected type");
    }
  }
  emitMemoryAccess(curr->align,
                   curr->bytes,
                   curr->offset,
                   curr->memory,
                   curr->order,
                   /*isRMW=*/false);
}

void BinaryInstWriter::visitAtomicRMW(AtomicRMW* curr) {
  o << static_cast<int8_t>(BinaryConsts::AtomicPrefix);

#define CASE_FOR_OP(Op)                                                        \
  case RMW##Op:                                                                \
    switch (curr->type.getBasic()) {                                           \
      case Type::i32:                                                          \
        switch (curr->bytes) {                                                 \
          case 1:                                                              \
            o << static_cast<int8_t>(BinaryConsts::I32AtomicRMW##Op##8U);      \
            break;                                                             \
          case 2:                                                              \
            o << static_cast<int8_t>(BinaryConsts::I32AtomicRMW##Op##16U);     \
            break;                                                             \
          case 4:                                                              \
            o << static_cast<int8_t>(BinaryConsts::I32AtomicRMW##Op);          \
            break;                                                             \
          default:                                                             \
            WASM_UNREACHABLE("invalid rmw size");                              \
        }                                                                      \
        break;                                                                 \
      case Type::i64:                                                          \
        switch (curr->bytes) {                                                 \
          case 1:                                                              \
            o << static_cast<int8_t>(BinaryConsts::I64AtomicRMW##Op##8U);      \
            break;                                                             \
          case 2:                                                              \
            o << static_cast<int8_t>(BinaryConsts::I64AtomicRMW##Op##16U);     \
            break;                                                             \
          case 4:                                                              \
            o << static_cast<int8_t>(BinaryConsts::I64AtomicRMW##Op##32U);     \
            break;                                                             \
          case 8:                                                              \
            o << static_cast<int8_t>(BinaryConsts::I64AtomicRMW##Op);          \
            break;                                                             \
          default:                                                             \
            WASM_UNREACHABLE("invalid rmw size");                              \
        }                                                                      \
        break;                                                                 \
      default:                                                                 \
        WASM_UNREACHABLE("unexpected type");                                   \
    }                                                                          \
    break

  switch (curr->op) {
    CASE_FOR_OP(Add);
    CASE_FOR_OP(Sub);
    CASE_FOR_OP(And);
    CASE_FOR_OP(Or);
    CASE_FOR_OP(Xor);
    CASE_FOR_OP(Xchg);
    default:
      WASM_UNREACHABLE("unexpected op");
  }
  emitMemoryAccess(curr->bytes,
                   curr->bytes,
                   curr->offset,
                   curr->memory,
                   curr->order,
                   /*isRMW=*/true);
}

void BinaryInstWriter::visitAtomicCmpxchg(AtomicCmpxchg* curr) {
  o << static_cast<int8_t>(BinaryConsts::AtomicPrefix);
  switch (curr->type.getBasic()) {
    case Type::i32:
      switch (curr->bytes) {
        case 1:
          o << static_cast<int8_t>(BinaryConsts::I32AtomicCmpxchg8U);
          break;
        case 2:
          o << static_cast<int8_t>(BinaryConsts::I32AtomicCmpxchg16U);
          break;
        case 4:
          o << static_cast<int8_t>(BinaryConsts::I32AtomicCmpxchg);
          break;
        default:
          WASM_UNREACHABLE("invalid size");
      }
      break;
    case Type::i64:
      switch (curr->bytes) {
        case 1:
          o << static_cast<int8_t>(BinaryConsts::I64AtomicCmpxchg8U);
          break;
        case 2:
          o << static_cast<int8_t>(BinaryConsts::I64AtomicCmpxchg16U);
          break;
        case 4:
          o << static_cast<int8_t>(BinaryConsts::I64AtomicCmpxchg32U);
          break;
        case 8:
          o << static_cast<int8_t>(BinaryConsts::I64AtomicCmpxchg);
          break;
        default:
          WASM_UNREACHABLE("invalid size");
      }
      break;
    default:
      WASM_UNREACHABLE("unexpected type");
  }
  emitMemoryAccess(curr->bytes,
                   curr->bytes,
                   curr->offset,
                   curr->memory,
                   curr->order,
                   /*isRMW=*/true);
}

void BinaryInstWriter::visitAtomicWait(AtomicWait* curr) {
  o << static_cast<int8_t>(BinaryConsts::AtomicPrefix);
  switch (curr->expectedType.getBasic()) {
    case Type::i32: {
      o << static_cast<int8_t>(BinaryConsts::I32AtomicWait);
      emitMemoryAccess(
        4, 4, curr->offset, curr->memory, MemoryOrder::SeqCst, /*isRMW=*/false);
      break;
    }
    case Type::i64: {
      o << static_cast<int8_t>(BinaryConsts::I64AtomicWait);
      emitMemoryAccess(
        8, 8, curr->offset, curr->memory, MemoryOrder::SeqCst, /*isRMW=*/false);
      break;
    }
    default:
      WASM_UNREACHABLE("unexpected type");
  }
}

void BinaryInstWriter::visitAtomicNotify(AtomicNotify* curr) {
  o << static_cast<int8_t>(BinaryConsts::AtomicPrefix)
    << static_cast<int8_t>(BinaryConsts::AtomicNotify);
  emitMemoryAccess(
    4, 4, curr->offset, curr->memory, MemoryOrder::SeqCst, /*isRMW=*/false);
}

void BinaryInstWriter::visitAtomicFence(AtomicFence* curr) {
  o << static_cast<int8_t>(BinaryConsts::AtomicPrefix)
    << static_cast<int8_t>(BinaryConsts::AtomicFence);

  parent.writeMemoryOrder(curr->order);
}

void BinaryInstWriter::visitPause(Pause* curr) {
  o << static_cast<int8_t>(BinaryConsts::AtomicPrefix)
    << U32LEB(BinaryConsts::Pause);
}

void BinaryInstWriter::visitSIMDExtract(SIMDExtract* curr) {
  o << static_cast<int8_t>(BinaryConsts::SIMDPrefix);
  switch (curr->op) {
    case ExtractLaneSVecI8x16:
      o << U32LEB(BinaryConsts::I8x16ExtractLaneS);
      break;
    case ExtractLaneUVecI8x16:
      o << U32LEB(BinaryConsts::I8x16ExtractLaneU);
      break;
    case ExtractLaneSVecI16x8:
      o << U32LEB(BinaryConsts::I16x8ExtractLaneS);
      break;
    case ExtractLaneUVecI16x8:
      o << U32LEB(BinaryConsts::I16x8ExtractLaneU);
      break;
    case ExtractLaneVecI32x4:
      o << U32LEB(BinaryConsts::I32x4ExtractLane);
      break;
    case ExtractLaneVecI64x2:
      o << U32LEB(BinaryConsts::I64x2ExtractLane);
      break;
    case ExtractLaneVecF16x8:
      o << U32LEB(BinaryConsts::F16x8ExtractLane);
      break;
    case ExtractLaneVecF32x4:
      o << U32LEB(BinaryConsts::F32x4ExtractLane);
      break;
    case ExtractLaneVecF64x2:
      o << U32LEB(BinaryConsts::F64x2ExtractLane);
      break;
  }
  o << static_cast<uint8_t>(curr->index);
}

void BinaryInstWriter::visitSIMDReplace(SIMDReplace* curr) {
  o << static_cast<int8_t>(BinaryConsts::SIMDPrefix);
  switch (curr->op) {
    case ReplaceLaneVecI8x16:
      o << U32LEB(BinaryConsts::I8x16ReplaceLane);
      break;
    case ReplaceLaneVecI16x8:
      o << U32LEB(BinaryConsts::I16x8ReplaceLane);
      break;
    case ReplaceLaneVecI32x4:
      o << U32LEB(BinaryConsts::I32x4ReplaceLane);
      break;
    case ReplaceLaneVecI64x2:
      o << U32LEB(BinaryConsts::I64x2ReplaceLane);
      break;
    case ReplaceLaneVecF16x8:
      o << U32LEB(BinaryConsts::F16x8ReplaceLane);
      break;
    case ReplaceLaneVecF32x4:
      o << U32LEB(BinaryConsts::F32x4ReplaceLane);
      break;
    case ReplaceLaneVecF64x2:
      o << U32LEB(BinaryConsts::F64x2ReplaceLane);
      break;
  }
  assert(curr->index < 16);
  o << static_cast<uint8_t>(curr->index);
}

void BinaryInstWriter::visitSIMDShuffle(SIMDShuffle* curr) {
  o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
    << U32LEB(BinaryConsts::I8x16Shuffle);
  for (uint8_t m : curr->mask) {
    o << m;
  }
}

void BinaryInstWriter::visitSIMDTernary(SIMDTernary* curr) {
  o << static_cast<int8_t>(BinaryConsts::SIMDPrefix);
  switch (curr->op) {
    case Bitselect:
      o << U32LEB(BinaryConsts::V128Bitselect);
      break;
    case RelaxedLaneselectI8x16:
      o << U32LEB(BinaryConsts::I8x16Laneselect);
      break;
    case RelaxedLaneselectI16x8:
      o << U32LEB(BinaryConsts::I16x8Laneselect);
      break;
    case RelaxedLaneselectI32x4:
      o << U32LEB(BinaryConsts::I32x4Laneselect);
      break;
    case RelaxedLaneselectI64x2:
      o << U32LEB(BinaryConsts::I64x2Laneselect);
      break;
    case MaddVecF16x8:
      o << U32LEB(BinaryConsts::F16x8Madd);
      break;
    case NmaddVecF16x8:
      o << U32LEB(BinaryConsts::F16x8Nmadd);
      break;
    case RelaxedMaddVecF32x4:
      o << U32LEB(BinaryConsts::F32x4RelaxedMadd);
      break;
    case RelaxedNmaddVecF32x4:
      o << U32LEB(BinaryConsts::F32x4RelaxedNmadd);
      break;
    case RelaxedMaddVecF64x2:
      o << U32LEB(BinaryConsts::F64x2RelaxedMadd);
      break;
    case RelaxedNmaddVecF64x2:
      o << U32LEB(BinaryConsts::F64x2RelaxedNmadd);
      break;
    case RelaxedDotI8x16I7x16AddSToVecI32x4:
      o << U32LEB(BinaryConsts::I32x4DotI8x16I7x16AddS);
      break;
  }
}

void BinaryInstWriter::visitSIMDShift(SIMDShift* curr) {
  o << static_cast<int8_t>(BinaryConsts::SIMDPrefix);
  switch (curr->op) {
    case ShlVecI8x16:
      o << U32LEB(BinaryConsts::I8x16Shl);
      break;
    case ShrSVecI8x16:
      o << U32LEB(BinaryConsts::I8x16ShrS);
      break;
    case ShrUVecI8x16:
      o << U32LEB(BinaryConsts::I8x16ShrU);
      break;
    case ShlVecI16x8:
      o << U32LEB(BinaryConsts::I16x8Shl);
      break;
    case ShrSVecI16x8:
      o << U32LEB(BinaryConsts::I16x8ShrS);
      break;
    case ShrUVecI16x8:
      o << U32LEB(BinaryConsts::I16x8ShrU);
      break;
    case ShlVecI32x4:
      o << U32LEB(BinaryConsts::I32x4Shl);
      break;
    case ShrSVecI32x4:
      o << U32LEB(BinaryConsts::I32x4ShrS);
      break;
    case ShrUVecI32x4:
      o << U32LEB(BinaryConsts::I32x4ShrU);
      break;
    case ShlVecI64x2:
      o << U32LEB(BinaryConsts::I64x2Shl);
      break;
    case ShrSVecI64x2:
      o << U32LEB(BinaryConsts::I64x2ShrS);
      break;
    case ShrUVecI64x2:
      o << U32LEB(BinaryConsts::I64x2ShrU);
      break;
  }
}

void BinaryInstWriter::visitSIMDLoad(SIMDLoad* curr) {
  o << static_cast<int8_t>(BinaryConsts::SIMDPrefix);
  switch (curr->op) {
    case Load8SplatVec128:
      o << U32LEB(BinaryConsts::V128Load8Splat);
      break;
    case Load16SplatVec128:
      o << U32LEB(BinaryConsts::V128Load16Splat);
      break;
    case Load32SplatVec128:
      o << U32LEB(BinaryConsts::V128Load32Splat);
      break;
    case Load64SplatVec128:
      o << U32LEB(BinaryConsts::V128Load64Splat);
      break;
    case Load8x8SVec128:
      o << U32LEB(BinaryConsts::V128Load8x8S);
      break;
    case Load8x8UVec128:
      o << U32LEB(BinaryConsts::V128Load8x8U);
      break;
    case Load16x4SVec128:
      o << U32LEB(BinaryConsts::V128Load16x4S);
      break;
    case Load16x4UVec128:
      o << U32LEB(BinaryConsts::V128Load16x4U);
      break;
    case Load32x2SVec128:
      o << U32LEB(BinaryConsts::V128Load32x2S);
      break;
    case Load32x2UVec128:
      o << U32LEB(BinaryConsts::V128Load32x2U);
      break;
    case Load32ZeroVec128:
      o << U32LEB(BinaryConsts::V128Load32Zero);
      break;
    case Load64ZeroVec128:
      o << U32LEB(BinaryConsts::V128Load64Zero);
      break;
  }
  assert(curr->align);
  emitMemoryAccess(curr->align,
                   /*(unused) bytes=*/0,
                   curr->offset,
                   curr->memory,
                   MemoryOrder::Unordered,
                   /*isRMW=*/false);
}

void BinaryInstWriter::visitSIMDLoadStoreLane(SIMDLoadStoreLane* curr) {
  o << static_cast<int8_t>(BinaryConsts::SIMDPrefix);
  switch (curr->op) {
    case Load8LaneVec128:
      o << U32LEB(BinaryConsts::V128Load8Lane);
      break;
    case Load16LaneVec128:
      o << U32LEB(BinaryConsts::V128Load16Lane);
      break;
    case Load32LaneVec128:
      o << U32LEB(BinaryConsts::V128Load32Lane);
      break;
    case Load64LaneVec128:
      o << U32LEB(BinaryConsts::V128Load64Lane);
      break;
    case Store8LaneVec128:
      o << U32LEB(BinaryConsts::V128Store8Lane);
      break;
    case Store16LaneVec128:
      o << U32LEB(BinaryConsts::V128Store16Lane);
      break;
    case Store32LaneVec128:
      o << U32LEB(BinaryConsts::V128Store32Lane);
      break;
    case Store64LaneVec128:
      o << U32LEB(BinaryConsts::V128Store64Lane);
      break;
  }
  assert(curr->align);
  emitMemoryAccess(curr->align,
                   /*(unused) bytes=*/0,
                   curr->offset,
                   curr->memory,
                   MemoryOrder::Unordered,
                   /*isRMW=*/false);
  o << curr->index;
}

void BinaryInstWriter::visitMemoryInit(MemoryInit* curr) {
  o << static_cast<int8_t>(BinaryConsts::MiscPrefix);
  o << U32LEB(BinaryConsts::MemoryInit);
  o << U32LEB(parent.getDataSegmentIndex(curr->segment));
  o << U32LEB(parent.getMemoryIndex(curr->memory));
}

void BinaryInstWriter::visitDataDrop(DataDrop* curr) {
  o << static_cast<int8_t>(BinaryConsts::MiscPrefix);
  o << U32LEB(BinaryConsts::DataDrop);
  o << U32LEB(parent.getDataSegmentIndex(curr->segment));
}

void BinaryInstWriter::visitMemoryCopy(MemoryCopy* curr) {
  o << static_cast<int8_t>(BinaryConsts::MiscPrefix);
  o << U32LEB(BinaryConsts::MemoryCopy);
  o << U32LEB(parent.getMemoryIndex(curr->destMemory));
  o << U32LEB(parent.getMemoryIndex(curr->sourceMemory));
}

void BinaryInstWriter::visitMemoryFill(MemoryFill* curr) {
  o << static_cast<int8_t>(BinaryConsts::MiscPrefix);
  o << U32LEB(BinaryConsts::MemoryFill);
  o << U32LEB(parent.getMemoryIndex(curr->memory));
}

void BinaryInstWriter::visitConst(Const* curr) {
  switch (curr->type.getBasic()) {
    case Type::i32: {
      o << static_cast<int8_t>(BinaryConsts::I32Const)
        << S32LEB(curr->value.geti32());
      break;
    }
    case Type::i64: {
      o << static_cast<int8_t>(BinaryConsts::I64Const)
        << S64LEB(curr->value.geti64());
      break;
    }
    case Type::f32: {
      o << static_cast<int8_t>(BinaryConsts::F32Const)
        << curr->value.reinterpreti32();
      break;
    }
    case Type::f64: {
      o << static_cast<int8_t>(BinaryConsts::F64Const)
        << curr->value.reinterpreti64();
      break;
    }
    case Type::v128: {
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::V128Const);
      std::array<uint8_t, 16> v = curr->value.getv128();
      for (size_t i = 0; i < 16; ++i) {
        o << static_cast<uint8_t>(v[i]);
      }
      break;
    }
    case Type::none:
    case Type::unreachable:
      WASM_UNREACHABLE("unexpected type");
  }
}

void BinaryInstWriter::visitUnary(Unary* curr) {
  switch (curr->op) {
    case ClzInt32:
      o << static_cast<int8_t>(BinaryConsts::I32Clz);
      break;
    case CtzInt32:
      o << static_cast<int8_t>(BinaryConsts::I32Ctz);
      break;
    case PopcntInt32:
      o << static_cast<int8_t>(BinaryConsts::I32Popcnt);
      break;
    case EqZInt32:
      o << static_cast<int8_t>(BinaryConsts::I32EqZ);
      break;
    case ClzInt64:
      o << static_cast<int8_t>(BinaryConsts::I64Clz);
      break;
    case CtzInt64:
      o << static_cast<int8_t>(BinaryConsts::I64Ctz);
      break;
    case PopcntInt64:
      o << static_cast<int8_t>(BinaryConsts::I64Popcnt);
      break;
    case EqZInt64:
      o << static_cast<int8_t>(BinaryConsts::I64EqZ);
      break;
    case NegFloat32:
      o << static_cast<int8_t>(BinaryConsts::F32Neg);
      break;
    case AbsFloat32:
      o << static_cast<int8_t>(BinaryConsts::F32Abs);
      break;
    case CeilFloat32:
      o << static_cast<int8_t>(BinaryConsts::F32Ceil);
      break;
    case FloorFloat32:
      o << static_cast<int8_t>(BinaryConsts::F32Floor);
      break;
    case TruncFloat32:
      o << static_cast<int8_t>(BinaryConsts::F32Trunc);
      break;
    case NearestFloat32:
      o << static_cast<int8_t>(BinaryConsts::F32Nearest);
      break;
    case SqrtFloat32:
      o << static_cast<int8_t>(BinaryConsts::F32Sqrt);
      break;
    case NegFloat64:
      o << static_cast<int8_t>(BinaryConsts::F64Neg);
      break;
    case AbsFloat64:
      o << static_cast<int8_t>(BinaryConsts::F64Abs);
      break;
    case CeilFloat64:
      o << static_cast<int8_t>(BinaryConsts::F64Ceil);
      break;
    case FloorFloat64:
      o << static_cast<int8_t>(BinaryConsts::F64Floor);
      break;
    case TruncFloat64:
      o << static_cast<int8_t>(BinaryConsts::F64Trunc);
      break;
    case NearestFloat64:
      o << static_cast<int8_t>(BinaryConsts::F64Nearest);
      break;
    case SqrtFloat64:
      o << static_cast<int8_t>(BinaryConsts::F64Sqrt);
      break;
    case ExtendSInt32:
      o << static_cast<int8_t>(BinaryConsts::I64SExtendI32);
      break;
    case ExtendUInt32:
      o << static_cast<int8_t>(BinaryConsts::I64UExtendI32);
      break;
    case WrapInt64:
      o << static_cast<int8_t>(BinaryConsts::I32WrapI64);
      break;
    case TruncUFloat32ToInt32:
      o << static_cast<int8_t>(BinaryConsts::I32UTruncF32);
      break;
    case TruncUFloat32ToInt64:
      o << static_cast<int8_t>(BinaryConsts::I64UTruncF32);
      break;
    case TruncSFloat32ToInt32:
      o << static_cast<int8_t>(BinaryConsts::I32STruncF32);
      break;
    case TruncSFloat32ToInt64:
      o << static_cast<int8_t>(BinaryConsts::I64STruncF32);
      break;
    case TruncUFloat64ToInt32:
      o << static_cast<int8_t>(BinaryConsts::I32UTruncF64);
      break;
    case TruncUFloat64ToInt64:
      o << static_cast<int8_t>(BinaryConsts::I64UTruncF64);
      break;
    case TruncSFloat64ToInt32:
      o << static_cast<int8_t>(BinaryConsts::I32STruncF64);
      break;
    case TruncSFloat64ToInt64:
      o << static_cast<int8_t>(BinaryConsts::I64STruncF64);
      break;
    case ConvertUInt32ToFloat32:
      o << static_cast<int8_t>(BinaryConsts::F32UConvertI32);
      break;
    case ConvertUInt32ToFloat64:
      o << static_cast<int8_t>(BinaryConsts::F64UConvertI32);
      break;
    case ConvertSInt32ToFloat32:
      o << static_cast<int8_t>(BinaryConsts::F32SConvertI32);
      break;
    case ConvertSInt32ToFloat64:
      o << static_cast<int8_t>(BinaryConsts::F64SConvertI32);
      break;
    case ConvertUInt64ToFloat32:
      o << static_cast<int8_t>(BinaryConsts::F32UConvertI64);
      break;
    case ConvertUInt64ToFloat64:
      o << static_cast<int8_t>(BinaryConsts::F64UConvertI64);
      break;
    case ConvertSInt64ToFloat32:
      o << static_cast<int8_t>(BinaryConsts::F32SConvertI64);
      break;
    case ConvertSInt64ToFloat64:
      o << static_cast<int8_t>(BinaryConsts::F64SConvertI64);
      break;
    case DemoteFloat64:
      o << static_cast<int8_t>(BinaryConsts::F32DemoteI64);
      break;
    case PromoteFloat32:
      o << static_cast<int8_t>(BinaryConsts::F64PromoteF32);
      break;
    case ReinterpretFloat32:
      o << static_cast<int8_t>(BinaryConsts::I32ReinterpretF32);
      break;
    case ReinterpretFloat64:
      o << static_cast<int8_t>(BinaryConsts::I64ReinterpretF64);
      break;
    case ReinterpretInt32:
      o << static_cast<int8_t>(BinaryConsts::F32ReinterpretI32);
      break;
    case ReinterpretInt64:
      o << static_cast<int8_t>(BinaryConsts::F64ReinterpretI64);
      break;
    case ExtendS8Int32:
      o << static_cast<int8_t>(BinaryConsts::I32ExtendS8);
      break;
    case ExtendS16Int32:
      o << static_cast<int8_t>(BinaryConsts::I32ExtendS16);
      break;
    case ExtendS8Int64:
      o << static_cast<int8_t>(BinaryConsts::I64ExtendS8);
      break;
    case ExtendS16Int64:
      o << static_cast<int8_t>(BinaryConsts::I64ExtendS16);
      break;
    case ExtendS32Int64:
      o << static_cast<int8_t>(BinaryConsts::I64ExtendS32);
      break;
    case TruncSatSFloat32ToInt32:
      o << static_cast<int8_t>(BinaryConsts::MiscPrefix)
        << U32LEB(BinaryConsts::I32STruncSatF32);
      break;
    case TruncSatUFloat32ToInt32:
      o << static_cast<int8_t>(BinaryConsts::MiscPrefix)
        << U32LEB(BinaryConsts::I32UTruncSatF32);
      break;
    case TruncSatSFloat64ToInt32:
      o << static_cast<int8_t>(BinaryConsts::MiscPrefix)
        << U32LEB(BinaryConsts::I32STruncSatF64);
      break;
    case TruncSatUFloat64ToInt32:
      o << static_cast<int8_t>(BinaryConsts::MiscPrefix)
        << U32LEB(BinaryConsts::I32UTruncSatF64);
      break;
    case TruncSatSFloat32ToInt64:
      o << static_cast<int8_t>(BinaryConsts::MiscPrefix)
        << U32LEB(BinaryConsts::I64STruncSatF32);
      break;
    case TruncSatUFloat32ToInt64:
      o << static_cast<int8_t>(BinaryConsts::MiscPrefix)
        << U32LEB(BinaryConsts::I64UTruncSatF32);
      break;
    case TruncSatSFloat64ToInt64:
      o << static_cast<int8_t>(BinaryConsts::MiscPrefix)
        << U32LEB(BinaryConsts::I64STruncSatF64);
      break;
    case TruncSatUFloat64ToInt64:
      o << static_cast<int8_t>(BinaryConsts::MiscPrefix)
        << U32LEB(BinaryConsts::I64UTruncSatF64);
      break;
    case SplatVecI8x16:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I8x16Splat);
      break;
    case SplatVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8Splat);
      break;
    case SplatVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4Splat);
      break;
    case SplatVecI64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I64x2Splat);
      break;
    case SplatVecF16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F16x8Splat);
      break;
    case SplatVecF32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F32x4Splat);
      break;
    case SplatVecF64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F64x2Splat);
      break;
    case NotVec128:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::V128Not);
      break;
    case AnyTrueVec128:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::V128AnyTrue);
      break;
    case AbsVecI8x16:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I8x16Abs);
      break;
    case NegVecI8x16:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I8x16Neg);
      break;
    case AllTrueVecI8x16:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I8x16AllTrue);
      break;
    case BitmaskVecI8x16:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I8x16Bitmask);
      break;
    case PopcntVecI8x16:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I8x16Popcnt);
      break;
    case AbsVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8Abs);
      break;
    case NegVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8Neg);
      break;
    case AllTrueVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8AllTrue);
      break;
    case BitmaskVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8Bitmask);
      break;
    case AbsVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4Abs);
      break;
    case NegVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4Neg);
      break;
    case AllTrueVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4AllTrue);
      break;
    case BitmaskVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4Bitmask);
      break;
    case AbsVecI64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I64x2Abs);
      break;
    case NegVecI64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I64x2Neg);
      break;
    case AllTrueVecI64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I64x2AllTrue);
      break;
    case BitmaskVecI64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I64x2Bitmask);
      break;
    case AbsVecF16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F16x8Abs);
      break;
    case NegVecF16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F16x8Neg);
      break;
    case SqrtVecF16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F16x8Sqrt);
      break;
    case CeilVecF16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F16x8Ceil);
      break;
    case FloorVecF16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F16x8Floor);
      break;
    case TruncVecF16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F16x8Trunc);
      break;
    case NearestVecF16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F16x8Nearest);
      break;
    case AbsVecF32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F32x4Abs);
      break;
    case NegVecF32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F32x4Neg);
      break;
    case SqrtVecF32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F32x4Sqrt);
      break;
    case CeilVecF32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F32x4Ceil);
      break;
    case FloorVecF32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F32x4Floor);
      break;
    case TruncVecF32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F32x4Trunc);
      break;
    case NearestVecF32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F32x4Nearest);
      break;
    case AbsVecF64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F64x2Abs);
      break;
    case NegVecF64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F64x2Neg);
      break;
    case SqrtVecF64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F64x2Sqrt);
      break;
    case CeilVecF64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F64x2Ceil);
      break;
    case FloorVecF64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F64x2Floor);
      break;
    case TruncVecF64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F64x2Trunc);
      break;
    case NearestVecF64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F64x2Nearest);
      break;
    case ExtAddPairwiseSVecI8x16ToI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8ExtaddPairwiseI8x16S);
      break;
    case ExtAddPairwiseUVecI8x16ToI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8ExtaddPairwiseI8x16U);
      break;
    case ExtAddPairwiseSVecI16x8ToI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4ExtaddPairwiseI16x8S);
      break;
    case ExtAddPairwiseUVecI16x8ToI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4ExtaddPairwiseI16x8U);
      break;
    case TruncSatSVecF32x4ToVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4TruncSatF32x4S);
      break;
    case TruncSatUVecF32x4ToVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4TruncSatF32x4U);
      break;
    case ConvertSVecI32x4ToVecF32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F32x4ConvertI32x4S);
      break;
    case ConvertUVecI32x4ToVecF32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F32x4ConvertI32x4U);
      break;
    case ExtendLowSVecI8x16ToVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8ExtendLowI8x16S);
      break;
    case ExtendHighSVecI8x16ToVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8ExtendHighI8x16S);
      break;
    case ExtendLowUVecI8x16ToVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8ExtendLowI8x16U);
      break;
    case ExtendHighUVecI8x16ToVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8ExtendHighI8x16U);
      break;
    case ExtendLowSVecI16x8ToVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4ExtendLowI16x8S);
      break;
    case ExtendHighSVecI16x8ToVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4ExtendHighI16x8S);
      break;
    case ExtendLowUVecI16x8ToVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4ExtendLowI16x8U);
      break;
    case ExtendHighUVecI16x8ToVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4ExtendHighI16x8U);
      break;
    case ExtendLowSVecI32x4ToVecI64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I64x2ExtendLowI32x4S);
      break;
    case ExtendHighSVecI32x4ToVecI64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I64x2ExtendHighI32x4S);
      break;
    case ExtendLowUVecI32x4ToVecI64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I64x2ExtendLowI32x4U);
      break;
    case ExtendHighUVecI32x4ToVecI64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I64x2ExtendHighI32x4U);
      break;
    case ConvertLowSVecI32x4ToVecF64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F64x2ConvertLowI32x4S);
      break;
    case ConvertLowUVecI32x4ToVecF64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F64x2ConvertLowI32x4U);
      break;
    case TruncSatZeroSVecF64x2ToVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4TruncSatF64x2SZero);
      break;
    case TruncSatZeroUVecF64x2ToVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4TruncSatF64x2UZero);
      break;
    case DemoteZeroVecF64x2ToVecF32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F32x4DemoteF64x2Zero);
      break;
    case PromoteLowVecF32x4ToVecF64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F64x2PromoteLowF32x4);
      break;
    case RelaxedTruncSVecF32x4ToVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4RelaxedTruncF32x4S);
      break;
    case RelaxedTruncUVecF32x4ToVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4RelaxedTruncF32x4U);
      break;
    case RelaxedTruncZeroSVecF64x2ToVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4RelaxedTruncF64x2SZero);
      break;
    case RelaxedTruncZeroUVecF64x2ToVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4RelaxedTruncF64x2UZero);
      break;
    case TruncSatSVecF16x8ToVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8TruncSatF16x8S);
      break;
    case TruncSatUVecF16x8ToVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8TruncSatF16x8U);
      break;
    case ConvertSVecI16x8ToVecF16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F16x8ConvertI16x8S);
      break;
    case ConvertUVecI16x8ToVecF16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F16x8ConvertI16x8U);
      break;
    case DemoteZeroVecF32x4ToVecF16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F16x8DemoteF32x4Zero);
      break;
    case DemoteZeroVecF64x2ToVecF16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F16x8DemoteF64x2Zero);
      break;
    case PromoteLowVecF16x8ToVecF32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F32x4PromoteLowF16x8);
      break;
    case InvalidUnary:
      WASM_UNREACHABLE("invalid unary op");
  }
}

void BinaryInstWriter::visitBinary(Binary* curr) {
  switch (curr->op) {
    case AddInt32:
      o << static_cast<int8_t>(BinaryConsts::I32Add);
      break;
    case SubInt32:
      o << static_cast<int8_t>(BinaryConsts::I32Sub);
      break;
    case MulInt32:
      o << static_cast<int8_t>(BinaryConsts::I32Mul);
      break;
    case DivSInt32:
      o << static_cast<int8_t>(BinaryConsts::I32DivS);
      break;
    case DivUInt32:
      o << static_cast<int8_t>(BinaryConsts::I32DivU);
      break;
    case RemSInt32:
      o << static_cast<int8_t>(BinaryConsts::I32RemS);
      break;
    case RemUInt32:
      o << static_cast<int8_t>(BinaryConsts::I32RemU);
      break;
    case AndInt32:
      o << static_cast<int8_t>(BinaryConsts::I32And);
      break;
    case OrInt32:
      o << static_cast<int8_t>(BinaryConsts::I32Or);
      break;
    case XorInt32:
      o << static_cast<int8_t>(BinaryConsts::I32Xor);
      break;
    case ShlInt32:
      o << static_cast<int8_t>(BinaryConsts::I32Shl);
      break;
    case ShrUInt32:
      o << static_cast<int8_t>(BinaryConsts::I32ShrU);
      break;
    case ShrSInt32:
      o << static_cast<int8_t>(BinaryConsts::I32ShrS);
      break;
    case RotLInt32:
      o << static_cast<int8_t>(BinaryConsts::I32RotL);
      break;
    case RotRInt32:
      o << static_cast<int8_t>(BinaryConsts::I32RotR);
      break;
    case EqInt32:
      o << static_cast<int8_t>(BinaryConsts::I32Eq);
      break;
    case NeInt32:
      o << static_cast<int8_t>(BinaryConsts::I32Ne);
      break;
    case LtSInt32:
      o << static_cast<int8_t>(BinaryConsts::I32LtS);
      break;
    case LtUInt32:
      o << static_cast<int8_t>(BinaryConsts::I32LtU);
      break;
    case LeSInt32:
      o << static_cast<int8_t>(BinaryConsts::I32LeS);
      break;
    case LeUInt32:
      o << static_cast<int8_t>(BinaryConsts::I32LeU);
      break;
    case GtSInt32:
      o << static_cast<int8_t>(BinaryConsts::I32GtS);
      break;
    case GtUInt32:
      o << static_cast<int8_t>(BinaryConsts::I32GtU);
      break;
    case GeSInt32:
      o << static_cast<int8_t>(BinaryConsts::I32GeS);
      break;
    case GeUInt32:
      o << static_cast<int8_t>(BinaryConsts::I32GeU);
      break;

    case AddInt64:
      o << static_cast<int8_t>(BinaryConsts::I64Add);
      break;
    case SubInt64:
      o << static_cast<int8_t>(BinaryConsts::I64Sub);
      break;
    case MulInt64:
      o << static_cast<int8_t>(BinaryConsts::I64Mul);
      break;
    case DivSInt64:
      o << static_cast<int8_t>(BinaryConsts::I64DivS);
      break;
    case DivUInt64:
      o << static_cast<int8_t>(BinaryConsts::I64DivU);
      break;
    case RemSInt64:
      o << static_cast<int8_t>(BinaryConsts::I64RemS);
      break;
    case RemUInt64:
      o << static_cast<int8_t>(BinaryConsts::I64RemU);
      break;
    case AndInt64:
      o << static_cast<int8_t>(BinaryConsts::I64And);
      break;
    case OrInt64:
      o << static_cast<int8_t>(BinaryConsts::I64Or);
      break;
    case XorInt64:
      o << static_cast<int8_t>(BinaryConsts::I64Xor);
      break;
    case ShlInt64:
      o << static_cast<int8_t>(BinaryConsts::I64Shl);
      break;
    case ShrUInt64:
      o << static_cast<int8_t>(BinaryConsts::I64ShrU);
      break;
    case ShrSInt64:
      o << static_cast<int8_t>(BinaryConsts::I64ShrS);
      break;
    case RotLInt64:
      o << static_cast<int8_t>(BinaryConsts::I64RotL);
      break;
    case RotRInt64:
      o << static_cast<int8_t>(BinaryConsts::I64RotR);
      break;
    case EqInt64:
      o << static_cast<int8_t>(BinaryConsts::I64Eq);
      break;
    case NeInt64:
      o << static_cast<int8_t>(BinaryConsts::I64Ne);
      break;
    case LtSInt64:
      o << static_cast<int8_t>(BinaryConsts::I64LtS);
      break;
    case LtUInt64:
      o << static_cast<int8_t>(BinaryConsts::I64LtU);
      break;
    case LeSInt64:
      o << static_cast<int8_t>(BinaryConsts::I64LeS);
      break;
    case LeUInt64:
      o << static_cast<int8_t>(BinaryConsts::I64LeU);
      break;
    case GtSInt64:
      o << static_cast<int8_t>(BinaryConsts::I64GtS);
      break;
    case GtUInt64:
      o << static_cast<int8_t>(BinaryConsts::I64GtU);
      break;
    case GeSInt64:
      o << static_cast<int8_t>(BinaryConsts::I64GeS);
      break;
    case GeUInt64:
      o << static_cast<int8_t>(BinaryConsts::I64GeU);
      break;

    case AddFloat32:
      o << static_cast<int8_t>(BinaryConsts::F32Add);
      break;
    case SubFloat32:
      o << static_cast<int8_t>(BinaryConsts::F32Sub);
      break;
    case MulFloat32:
      o << static_cast<int8_t>(BinaryConsts::F32Mul);
      break;
    case DivFloat32:
      o << static_cast<int8_t>(BinaryConsts::F32Div);
      break;
    case CopySignFloat32:
      o << static_cast<int8_t>(BinaryConsts::F32CopySign);
      break;
    case MinFloat32:
      o << static_cast<int8_t>(BinaryConsts::F32Min);
      break;
    case MaxFloat32:
      o << static_cast<int8_t>(BinaryConsts::F32Max);
      break;
    case EqFloat32:
      o << static_cast<int8_t>(BinaryConsts::F32Eq);
      break;
    case NeFloat32:
      o << static_cast<int8_t>(BinaryConsts::F32Ne);
      break;
    case LtFloat32:
      o << static_cast<int8_t>(BinaryConsts::F32Lt);
      break;
    case LeFloat32:
      o << static_cast<int8_t>(BinaryConsts::F32Le);
      break;
    case GtFloat32:
      o << static_cast<int8_t>(BinaryConsts::F32Gt);
      break;
    case GeFloat32:
      o << static_cast<int8_t>(BinaryConsts::F32Ge);
      break;

    case AddFloat64:
      o << static_cast<int8_t>(BinaryConsts::F64Add);
      break;
    case SubFloat64:
      o << static_cast<int8_t>(BinaryConsts::F64Sub);
      break;
    case MulFloat64:
      o << static_cast<int8_t>(BinaryConsts::F64Mul);
      break;
    case DivFloat64:
      o << static_cast<int8_t>(BinaryConsts::F64Div);
      break;
    case CopySignFloat64:
      o << static_cast<int8_t>(BinaryConsts::F64CopySign);
      break;
    case MinFloat64:
      o << static_cast<int8_t>(BinaryConsts::F64Min);
      break;
    case MaxFloat64:
      o << static_cast<int8_t>(BinaryConsts::F64Max);
      break;
    case EqFloat64:
      o << static_cast<int8_t>(BinaryConsts::F64Eq);
      break;
    case NeFloat64:
      o << static_cast<int8_t>(BinaryConsts::F64Ne);
      break;
    case LtFloat64:
      o << static_cast<int8_t>(BinaryConsts::F64Lt);
      break;
    case LeFloat64:
      o << static_cast<int8_t>(BinaryConsts::F64Le);
      break;
    case GtFloat64:
      o << static_cast<int8_t>(BinaryConsts::F64Gt);
      break;
    case GeFloat64:
      o << static_cast<int8_t>(BinaryConsts::F64Ge);
      break;

    case EqVecI8x16:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I8x16Eq);
      break;
    case NeVecI8x16:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I8x16Ne);
      break;
    case LtSVecI8x16:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I8x16LtS);
      break;
    case LtUVecI8x16:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I8x16LtU);
      break;
    case GtSVecI8x16:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I8x16GtS);
      break;
    case GtUVecI8x16:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I8x16GtU);
      break;
    case LeSVecI8x16:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I8x16LeS);
      break;
    case LeUVecI8x16:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I8x16LeU);
      break;
    case GeSVecI8x16:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I8x16GeS);
      break;
    case GeUVecI8x16:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I8x16GeU);
      break;
    case EqVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8Eq);
      break;
    case NeVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8Ne);
      break;
    case LtSVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8LtS);
      break;
    case LtUVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8LtU);
      break;
    case GtSVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8GtS);
      break;
    case GtUVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8GtU);
      break;
    case LeSVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8LeS);
      break;
    case LeUVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8LeU);
      break;
    case GeSVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8GeS);
      break;
    case GeUVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8GeU);
      break;
    case EqVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4Eq);
      break;
    case NeVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4Ne);
      break;
    case LtSVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4LtS);
      break;
    case LtUVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4LtU);
      break;
    case GtSVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4GtS);
      break;
    case GtUVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4GtU);
      break;
    case LeSVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4LeS);
      break;
    case LeUVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4LeU);
      break;
    case GeSVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4GeS);
      break;
    case GeUVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4GeU);
      break;
    case EqVecI64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I64x2Eq);
      break;
    case NeVecI64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I64x2Ne);
      break;
    case LtSVecI64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I64x2LtS);
      break;
    case GtSVecI64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I64x2GtS);
      break;
    case LeSVecI64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I64x2LeS);
      break;
    case GeSVecI64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I64x2GeS);
      break;
    case EqVecF16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F16x8Eq);
      break;
    case NeVecF16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F16x8Ne);
      break;
    case LtVecF16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F16x8Lt);
      break;
    case GtVecF16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F16x8Gt);
      break;
    case LeVecF16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F16x8Le);
      break;
    case GeVecF16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F16x8Ge);
      break;
    case EqVecF32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F32x4Eq);
      break;
    case NeVecF32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F32x4Ne);
      break;
    case LtVecF32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F32x4Lt);
      break;
    case GtVecF32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F32x4Gt);
      break;
    case LeVecF32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F32x4Le);
      break;
    case GeVecF32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F32x4Ge);
      break;
    case EqVecF64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F64x2Eq);
      break;
    case NeVecF64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F64x2Ne);
      break;
    case LtVecF64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F64x2Lt);
      break;
    case GtVecF64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F64x2Gt);
      break;
    case LeVecF64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F64x2Le);
      break;
    case GeVecF64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F64x2Ge);
      break;
    case AndVec128:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::V128And);
      break;
    case OrVec128:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::V128Or);
      break;
    case XorVec128:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::V128Xor);
      break;
    case AndNotVec128:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::V128Andnot);
      break;
    case AddVecI8x16:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I8x16Add);
      break;
    case AddSatSVecI8x16:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I8x16AddSatS);
      break;
    case AddSatUVecI8x16:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I8x16AddSatU);
      break;
    case SubVecI8x16:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I8x16Sub);
      break;
    case SubSatSVecI8x16:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I8x16SubSatS);
      break;
    case SubSatUVecI8x16:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I8x16SubSatU);
      break;
    case MinSVecI8x16:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I8x16MinS);
      break;
    case MinUVecI8x16:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I8x16MinU);
      break;
    case MaxSVecI8x16:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I8x16MaxS);
      break;
    case MaxUVecI8x16:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I8x16MaxU);
      break;
    case AvgrUVecI8x16:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I8x16AvgrU);
      break;
    case AddVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8Add);
      break;
    case AddSatSVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8AddSatS);
      break;
    case AddSatUVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8AddSatU);
      break;
    case SubVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8Sub);
      break;
    case SubSatSVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8SubSatS);
      break;
    case SubSatUVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8SubSatU);
      break;
    case MulVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8Mul);
      break;
    case MinSVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8MinS);
      break;
    case MinUVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8MinU);
      break;
    case MaxSVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8MaxS);
      break;
    case MaxUVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8MaxU);
      break;
    case AvgrUVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8AvgrU);
      break;
    case Q15MulrSatSVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8Q15MulrSatS);
      break;
    case ExtMulLowSVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8ExtmulLowI8x16S);
      break;
    case ExtMulHighSVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8ExtmulHighI8x16S);
      break;
    case ExtMulLowUVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8ExtmulLowI8x16U);
      break;
    case ExtMulHighUVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8ExtmulHighI8x16U);
      break;
    case AddVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4Add);
      break;
    case SubVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4Sub);
      break;
    case MulVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4Mul);
      break;
    case MinSVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4MinS);
      break;
    case MinUVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4MinU);
      break;
    case MaxSVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4MaxS);
      break;
    case MaxUVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4MaxU);
      break;
    case DotSVecI16x8ToVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4DotI16x8S);
      break;
    case ExtMulLowSVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4ExtmulLowI16x8S);
      break;
    case ExtMulHighSVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4ExtmulHighI16x8S);
      break;
    case ExtMulLowUVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4ExtmulLowI16x8U);
      break;
    case ExtMulHighUVecI32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I32x4ExtmulHighI16x8U);
      break;
    case AddVecI64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I64x2Add);
      break;
    case SubVecI64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I64x2Sub);
      break;
    case MulVecI64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I64x2Mul);
      break;
    case ExtMulLowSVecI64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I64x2ExtmulLowI32x4S);
      break;
    case ExtMulHighSVecI64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I64x2ExtmulHighI32x4S);
      break;
    case ExtMulLowUVecI64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I64x2ExtmulLowI32x4U);
      break;
    case ExtMulHighUVecI64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I64x2ExtmulHighI32x4U);
      break;

    case AddVecF16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F16x8Add);
      break;
    case SubVecF16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F16x8Sub);
      break;
    case MulVecF16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F16x8Mul);
      break;
    case DivVecF16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F16x8Div);
      break;
    case MinVecF16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F16x8Min);
      break;
    case MaxVecF16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F16x8Max);
      break;
    case PMinVecF16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F16x8Pmin);
      break;
    case PMaxVecF16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F16x8Pmax);
      break;
    case AddVecF32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F32x4Add);
      break;
    case SubVecF32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F32x4Sub);
      break;
    case MulVecF32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F32x4Mul);
      break;
    case DivVecF32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F32x4Div);
      break;
    case MinVecF32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F32x4Min);
      break;
    case MaxVecF32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F32x4Max);
      break;
    case PMinVecF32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F32x4Pmin);
      break;
    case PMaxVecF32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F32x4Pmax);
      break;
    case AddVecF64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F64x2Add);
      break;
    case SubVecF64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F64x2Sub);
      break;
    case MulVecF64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F64x2Mul);
      break;
    case DivVecF64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F64x2Div);
      break;
    case MinVecF64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F64x2Min);
      break;
    case MaxVecF64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F64x2Max);
      break;
    case PMinVecF64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F64x2Pmin);
      break;
    case PMaxVecF64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F64x2Pmax);
      break;

    case NarrowSVecI16x8ToVecI8x16:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I8x16NarrowI16x8S);
      break;
    case NarrowUVecI16x8ToVecI8x16:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I8x16NarrowI16x8U);
      break;
    case NarrowSVecI32x4ToVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8NarrowI32x4S);
      break;
    case NarrowUVecI32x4ToVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8NarrowI32x4U);
      break;

    case SwizzleVecI8x16:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I8x16Swizzle);
      break;

    case RelaxedSwizzleVecI8x16:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I8x16RelaxedSwizzle);
      break;
    case RelaxedMinVecF32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F32x4RelaxedMin);
      break;
    case RelaxedMaxVecF32x4:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F32x4RelaxedMax);
      break;
    case RelaxedMinVecF64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F64x2RelaxedMin);
      break;
    case RelaxedMaxVecF64x2:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::F64x2RelaxedMax);
      break;
    case RelaxedQ15MulrSVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8RelaxedQ15MulrS);
      break;
    case RelaxedDotI8x16I7x16SToVecI16x8:
      o << static_cast<int8_t>(BinaryConsts::SIMDPrefix)
        << U32LEB(BinaryConsts::I16x8DotI8x16I7x16S);
      break;

    case InvalidBinary:
      WASM_UNREACHABLE("invalid binary op");
  }
}

void BinaryInstWriter::visitSelect(Select* curr) {
  if (curr->type.isRef()) {
    o << static_cast<int8_t>(BinaryConsts::SelectWithType)
      << U32LEB(curr->type.size());
    for (size_t i = 0; i < curr->type.size(); i++) {
      parent.writeType(curr->type != Type::unreachable ? curr->type
                                                       : Type::none);
    }
  } else {
    o << static_cast<int8_t>(BinaryConsts::Select);
  }
}

void BinaryInstWriter::visitWideIntAddSub(WideIntAddSub* curr) {
  o << static_cast<int8_t>(BinaryConsts::MiscPrefix);
  switch (curr->op) {
    case AddInt128: {
      o << U32LEB(BinaryConsts::I64Add128);
      break;
    }
    case SubInt128: {
      o << U32LEB(BinaryConsts::I64Sub128);
      break;
    }
  }
}

void BinaryInstWriter::visitWideIntMul(WideIntMul* curr) {
  o << static_cast<int8_t>(BinaryConsts::MiscPrefix);
  switch (curr->op) {
    case MulWideSInt64: {
      o << U32LEB(BinaryConsts::I64MulWideS);
      break;
    }
    case MulWideUInt64: {
      o << U32LEB(BinaryConsts::I64MulWideU);
      break;
    }
  }
}

void BinaryInstWriter::visitReturn(Return* curr) {
  o << static_cast<int8_t>(BinaryConsts::Return);
}

void BinaryInstWriter::visitMemorySize(MemorySize* curr) {
  o << static_cast<int8_t>(BinaryConsts::MemorySize);
  o << U32LEB(parent.getMemoryIndex(curr->memory));
}

void BinaryInstWriter::visitMemoryGrow(MemoryGrow* curr) {
  o << static_cast<int8_t>(BinaryConsts::MemoryGrow);
  o << U32LEB(parent.getMemoryIndex(curr->memory));
}

void BinaryInstWriter::visitRefNull(RefNull* curr) {
  o << static_cast<int8_t>(BinaryConsts::RefNull);
  assert(curr->type.isInexact());
  parent.writeHeapType(curr->type.getHeapType(), Inexact);
}

void BinaryInstWriter::visitRefIsNull(RefIsNull* curr) {
  o << static_cast<int8_t>(BinaryConsts::RefIsNull);
}

void BinaryInstWriter::visitRefFunc(RefFunc* curr) {
  o << static_cast<int8_t>(BinaryConsts::RefFunc)
    << U32LEB(parent.getFunctionIndex(curr->func));
}

void BinaryInstWriter::visitRefEq(RefEq* curr) {
  o << static_cast<int8_t>(BinaryConsts::RefEq);
}

void BinaryInstWriter::visitTableGet(TableGet* curr) {
  o << static_cast<int8_t>(BinaryConsts::TableGet);
  o << U32LEB(parent.getTableIndex(curr->table));
}

void BinaryInstWriter::visitTableSet(TableSet* curr) {
  o << static_cast<int8_t>(BinaryConsts::TableSet);
  o << U32LEB(parent.getTableIndex(curr->table));
}

void BinaryInstWriter::visitTableSize(TableSize* curr) {
  o << static_cast<int8_t>(BinaryConsts::MiscPrefix)
    << U32LEB(BinaryConsts::TableSize);
  o << U32LEB(parent.getTableIndex(curr->table));
}

void BinaryInstWriter::visitTableGrow(TableGrow* curr) {
  o << static_cast<int8_t>(BinaryConsts::MiscPrefix)
    << U32LEB(BinaryConsts::TableGrow);
  o << U32LEB(parent.getTableIndex(curr->table));
}

void BinaryInstWriter::visitTableFill(TableFill* curr) {
  o << static_cast<int8_t>(BinaryConsts::MiscPrefix)
    << U32LEB(BinaryConsts::TableFill);
  o << U32LEB(parent.getTableIndex(curr->table));
}

void BinaryInstWriter::visitTableCopy(TableCopy* curr) {
  o << static_cast<int8_t>(BinaryConsts::MiscPrefix)
    << U32LEB(BinaryConsts::TableCopy);
  o << U32LEB(parent.getTableIndex(curr->destTable));
  o << U32LEB(parent.getTableIndex(curr->sourceTable));
}

void BinaryInstWriter::visitTableInit(TableInit* curr) {
  o << static_cast<int8_t>(BinaryConsts::MiscPrefix)
    << U32LEB(BinaryConsts::TableInit);
  o << U32LEB(parent.getElementSegmentIndex(curr->segment));
  o << U32LEB(parent.getTableIndex(curr->table));
}

void BinaryInstWriter::visitElemDrop(ElemDrop* curr) {
  o << static_cast<int8_t>(BinaryConsts::MiscPrefix)
    << U32LEB(BinaryConsts::ElemDrop);
  o << U32LEB(parent.getElementSegmentIndex(curr->segment));
}

void BinaryInstWriter::visitTry(Try* curr) {
  breakStack.push_back(curr->name);
  o << static_cast<int8_t>(BinaryConsts::Try);
  emitResultType(curr->type);
}

void BinaryInstWriter::visitTryTable(TryTable* curr) {
  o << static_cast<int8_t>(BinaryConsts::TryTable);
  emitResultType(curr->type);
  o << U32LEB(curr->catchTags.size());
  for (Index i = 0; i < curr->catchTags.size(); i++) {
    if (curr->catchTags[i]) {
      o << (curr->catchRefs[i] ? static_cast<int8_t>(BinaryConsts::CatchRef)
                               : static_cast<int8_t>(BinaryConsts::Catch));
      o << U32LEB(parent.getTagIndex(curr->catchTags[i]));
    } else {
      o << (curr->catchRefs[i] ? static_cast<int8_t>(BinaryConsts::CatchAllRef)
                               : static_cast<int8_t>(BinaryConsts::CatchAll));
    }
    o << U32LEB(getBreakIndex(curr->catchDests[i]));
  }
  // the binary format requires this; we have a block if we need one
  // catch_*** clauses should refer to block labels without entering the try
  // scope. So we do this at the end.
  breakStack.emplace_back(IMPOSSIBLE_CONTINUE);
}

void BinaryInstWriter::emitCatch(Try* curr, Index i) {
  if (func) {
    parent.trackExpressionDelimiter(curr, func, i);
  }
  o << static_cast<int8_t>(BinaryConsts::Catch_Legacy)
    << U32LEB(parent.getTagIndex(curr->catchTags[i]));
}

void BinaryInstWriter::emitCatchAll(Try* curr) {
  if (func) {
    parent.trackExpressionDelimiter(curr, func, curr->catchBodies.size());
  }
  o << static_cast<int8_t>(BinaryConsts::CatchAll_Legacy);
}

void BinaryInstWriter::emitDelegate(Try* curr) {
  // The delegate ends the scope in effect, and pops the try's name. Note that
  // the getBreakIndex is intentionally after that pop, as the delegate cannot
  // target its own try.
  assert(!breakStack.empty());
  breakStack.pop_back();
  o << static_cast<int8_t>(BinaryConsts::Delegate)
    << U32LEB(getBreakIndex(curr->delegateTarget));
}

void BinaryInstWriter::visitThrow(Throw* curr) {
  o << static_cast<int8_t>(BinaryConsts::Throw)
    << U32LEB(parent.getTagIndex(curr->tag));
}

void BinaryInstWriter::visitRethrow(Rethrow* curr) {
  o << static_cast<int8_t>(BinaryConsts::Rethrow)
    << U32LEB(getBreakIndex(curr->target));
}

void BinaryInstWriter::visitThrowRef(ThrowRef* curr) {
  o << static_cast<int8_t>(BinaryConsts::ThrowRef);
}

void BinaryInstWriter::visitNop(Nop* curr) {
  o << static_cast<int8_t>(BinaryConsts::Nop);
}

void BinaryInstWriter::visitUnreachable(Unreachable* curr) {
  o << static_cast<int8_t>(BinaryConsts::Unreachable);
}

void BinaryInstWriter::visitDrop(Drop* curr) {
  size_t numValues = curr->value->type.size();
  for (size_t i = 0; i < numValues; i++) {
    o << static_cast<int8_t>(BinaryConsts::Drop);
  }
}

void BinaryInstWriter::visitPop(Pop* curr) {
  // Turns into nothing in the binary format
}

void BinaryInstWriter::visitTupleMake(TupleMake* curr) {
  // Turns into nothing in the binary format
}

void BinaryInstWriter::visitTupleExtract(TupleExtract* curr) {
  if (extractedGets.contains(curr->tuple)) {
    // We already have just the extracted value on the stack.
    return;
  }
  size_t numVals = curr->tuple->type.size();
  // Drop all values after the one we want
  for (size_t i = curr->index + 1; i < numVals; ++i) {
    o << static_cast<int8_t>(BinaryConsts::Drop);
  }
  // If the extracted value is the only one left, we're done
  if (curr->index == 0) {
    return;
  }
  // Otherwise, save it to a scratch local, drop the others, then retrieve it
  assert(scratchLocals.find(curr->type) != scratchLocals.end());
  auto scratch = scratchLocals[curr->type];
  o << static_cast<int8_t>(BinaryConsts::LocalSet) << U32LEB(scratch);
  for (size_t i = 0; i < curr->index; ++i) {
    o << static_cast<int8_t>(BinaryConsts::Drop);
  }
  o << static_cast<int8_t>(BinaryConsts::LocalGet) << U32LEB(scratch);
}

void BinaryInstWriter::visitRefI31(RefI31* curr) {
  o << static_cast<int8_t>(BinaryConsts::GCPrefix)
    << U32LEB(curr->type.getHeapType().isShared() ? BinaryConsts::RefI31Shared
                                                  : BinaryConsts::RefI31);
}

void BinaryInstWriter::visitI31Get(I31Get* curr) {
  o << static_cast<int8_t>(BinaryConsts::GCPrefix)
    << U32LEB(curr->signed_ ? BinaryConsts::I31GetS : BinaryConsts::I31GetU);
}

void BinaryInstWriter::visitCallRef(CallRef* curr) {
  assert(curr->target->type != Type::unreachable);
  if (curr->target->type.isNull()) {
    emitUnreachable();
    return;
  }
  o << static_cast<int8_t>(curr->isReturn ? BinaryConsts::RetCallRef
                                          : BinaryConsts::CallRef);
  parent.writeIndexedHeapType(curr->target->type.getHeapType());
}

void BinaryInstWriter::visitRefTest(RefTest* curr) {
  o << static_cast<int8_t>(BinaryConsts::GCPrefix);
  if (curr->castType.isNullable()) {
    o << U32LEB(BinaryConsts::RefTestNull);
  } else {
    o << U32LEB(BinaryConsts::RefTest);
  }
  parent.writeHeapType(curr->castType.getHeapType(),
                       curr->castType.getExactness());
}

void BinaryInstWriter::visitRefCast(RefCast* curr) {
  if (curr->desc && curr->desc->type.isNull()) {
    emitUnreachable();
    return;
  }
  o << static_cast<int8_t>(BinaryConsts::GCPrefix);
  if (curr->type.isNullable()) {
    if (curr->desc) {
      o << U32LEB(BinaryConsts::RefCastDescEqNull);
    } else {
      o << U32LEB(BinaryConsts::RefCastNull);
    }
  } else {
    if (curr->desc) {
      o << U32LEB(BinaryConsts::RefCastDescEq);
    } else {
      o << U32LEB(BinaryConsts::RefCast);
    }
  }
  parent.writeHeapType(curr->type.getHeapType(), curr->type.getExactness());
}

void BinaryInstWriter::visitRefGetDesc(RefGetDesc* curr) {
  if (curr->ref->type.isNull()) {
    emitUnreachable();
    return;
  }
  o << static_cast<int8_t>(BinaryConsts::GCPrefix)
    << U32LEB(BinaryConsts::RefGetDesc);
  parent.writeIndexedHeapType(curr->ref->type.getHeapType());
}

void BinaryInstWriter::visitBrOn(BrOn* curr) {
  bool hasDesc = curr->op == BrOnCastDescEq || curr->op == BrOnCastDescEqFail;
  if (hasDesc && curr->desc->type.isNull()) {
    emitUnreachable();
    return;
  }
  switch (curr->op) {
    case BrOnNull:
      o << static_cast<int8_t>(BinaryConsts::BrOnNull);
      o << U32LEB(getBreakIndex(curr->name));
      return;
    case BrOnNonNull:
      o << static_cast<int8_t>(BinaryConsts::BrOnNonNull);
      o << U32LEB(getBreakIndex(curr->name));
      return;
    case BrOnCast:
      o << static_cast<int8_t>(BinaryConsts::GCPrefix)
        << U32LEB(BinaryConsts::BrOnCast);
      break;
    case BrOnCastFail:
      o << static_cast<int8_t>(BinaryConsts::GCPrefix)
        << U32LEB(BinaryConsts::BrOnCastFail);
      break;
    case BrOnCastDescEq:
      o << static_cast<int8_t>(BinaryConsts::GCPrefix)
        << U32LEB(BinaryConsts::BrOnCastDescEq);
      break;
    case BrOnCastDescEqFail:
      o << static_cast<int8_t>(BinaryConsts::GCPrefix)
        << U32LEB(BinaryConsts::BrOnCastDescEqFail);
      break;
  }
  assert(curr->ref->type.isRef());
  assert(hasDesc || Type::isSubType(curr->castType, curr->ref->type));
  uint8_t flags = (curr->ref->type.isNullable() ? 1 : 0) |
                  (curr->castType.isNullable() ? 2 : 0);
  o << flags;
  o << U32LEB(getBreakIndex(curr->name));
  parent.writeHeapType(curr->ref->type.getHeapType(),
                       curr->ref->type.getExactness());
  parent.writeHeapType(curr->castType.getHeapType(),
                       curr->castType.getExactness());
  return;
}

void BinaryInstWriter::visitStructNew(StructNew* curr) {
  o << static_cast<int8_t>(BinaryConsts::GCPrefix);
  if (curr->isWithDefault()) {
    if (curr->desc) {
      o << U32LEB(BinaryConsts::StructNewDefaultDesc);
    } else {
      o << U32LEB(BinaryConsts::StructNewDefault);
    }
  } else {
    if (curr->desc) {
      o << U32LEB(BinaryConsts::StructNewDesc);
    } else {
      o << U32LEB(BinaryConsts::StructNew);
    }
  }
  parent.writeIndexedHeapType(curr->type.getHeapType());
}

void BinaryInstWriter::visitStructGet(StructGet* curr) {
  if (curr->ref->type.isNull()) {
    emitUnreachable();
    return;
  }
  const auto& heapType = curr->ref->type.getHeapType();
  const auto& field = heapType.getStruct().fields[curr->index];
  bool atomic = curr->order != MemoryOrder::Unordered;
  int8_t op;
  if (field.type != Type::i32 || field.packedType == Field::NotPacked) {
    op = atomic ? BinaryConsts::StructAtomicGet : BinaryConsts::StructGet;
  } else if (curr->signed_) {
    op = atomic ? BinaryConsts::StructAtomicGetS : BinaryConsts::StructGetS;
  } else {
    op = atomic ? BinaryConsts::StructAtomicGetU : BinaryConsts::StructGetU;
  }
  auto prefix = atomic ? BinaryConsts::AtomicPrefix : BinaryConsts::GCPrefix;
  o << static_cast<int8_t>(prefix) << U32LEB(op);
  if (atomic) {
    parent.writeMemoryOrder(curr->order);
  }
  parent.writeIndexedHeapType(heapType);
  o << U32LEB(curr->index);
}

void BinaryInstWriter::visitStructSet(StructSet* curr) {
  if (curr->ref->type.isNull()) {
    emitUnreachable();
    return;
  }
  if (curr->order == MemoryOrder::Unordered) {
    o << static_cast<int8_t>(BinaryConsts::GCPrefix)
      << U32LEB(BinaryConsts::StructSet);
  } else {
    o << static_cast<int8_t>(BinaryConsts::AtomicPrefix)
      << U32LEB(BinaryConsts::StructAtomicSet);
    parent.writeMemoryOrder(curr->order);
  }
  parent.writeIndexedHeapType(curr->ref->type.getHeapType());
  o << U32LEB(curr->index);
}

void BinaryInstWriter::visitStructRMW(StructRMW* curr) {
  if (curr->ref->type.isNull()) {
    emitUnreachable();
    return;
  }
  o << static_cast<int8_t>(BinaryConsts::AtomicPrefix);
  switch (curr->op) {
    case RMWAdd:
      o << U32LEB(BinaryConsts::StructAtomicRMWAdd);
      break;
    case RMWSub:
      o << U32LEB(BinaryConsts::StructAtomicRMWSub);
      break;
    case RMWAnd:
      o << U32LEB(BinaryConsts::StructAtomicRMWAnd);
      break;
    case RMWOr:
      o << U32LEB(BinaryConsts::StructAtomicRMWOr);
      break;
    case RMWXor:
      o << U32LEB(BinaryConsts::StructAtomicRMWXor);
      break;
    case RMWXchg:
      o << U32LEB(BinaryConsts::StructAtomicRMWXchg);
      break;
  }
  parent.writeMemoryOrder(curr->order, /*isRMW=*/true);
  parent.writeIndexedHeapType(curr->ref->type.getHeapType());
  o << U32LEB(curr->index);
}

void BinaryInstWriter::visitStructCmpxchg(StructCmpxchg* curr) {
  if (curr->ref->type.isNull()) {
    emitUnreachable();
    return;
  }
  o << static_cast<int8_t>(BinaryConsts::AtomicPrefix)
    << U32LEB(BinaryConsts::StructAtomicRMWCmpxchg);
  parent.writeMemoryOrder(curr->order, /*isRMW=*/true);
  parent.writeIndexedHeapType(curr->ref->type.getHeapType());
  o << U32LEB(curr->index);
}

void BinaryInstWriter::visitStructWait(StructWait* curr) {
  if (curr->ref->type.isNull()) {
    emitUnreachable();
    return;
  }
  o << static_cast<int8_t>(BinaryConsts::AtomicPrefix)
    << U32LEB(BinaryConsts::StructWait);
  parent.writeIndexedHeapType(curr->ref->type.getHeapType());
  o << U32LEB(curr->index);
}

void BinaryInstWriter::visitStructNotify(StructNotify* curr) {
  if (curr->ref->type.isNull()) {
    emitUnreachable();
    return;
  }
  o << static_cast<int8_t>(BinaryConsts::AtomicPrefix)
    << U32LEB(BinaryConsts::StructNotify);
  parent.writeIndexedHeapType(curr->ref->type.getHeapType());
  o << U32LEB(curr->index);
}

void BinaryInstWriter::visitArrayNew(ArrayNew* curr) {
  o << static_cast<int8_t>(BinaryConsts::GCPrefix);
  if (curr->isWithDefault()) {
    o << U32LEB(BinaryConsts::ArrayNewDefault);
  } else {
    o << U32LEB(BinaryConsts::ArrayNew);
  }
  parent.writeIndexedHeapType(curr->type.getHeapType());
}

void BinaryInstWriter::visitArrayNewData(ArrayNewData* curr) {
  o << static_cast<int8_t>(BinaryConsts::GCPrefix);
  o << U32LEB(BinaryConsts::ArrayNewData);
  parent.writeIndexedHeapType(curr->type.getHeapType());
  o << U32LEB(parent.getDataSegmentIndex(curr->segment));
}

void BinaryInstWriter::visitArrayNewElem(ArrayNewElem* curr) {
  o << static_cast<int8_t>(BinaryConsts::GCPrefix);
  o << U32LEB(BinaryConsts::ArrayNewElem);
  parent.writeIndexedHeapType(curr->type.getHeapType());
  o << U32LEB(parent.getElementSegmentIndex(curr->segment));
}

void BinaryInstWriter::visitArrayNewFixed(ArrayNewFixed* curr) {
  o << static_cast<int8_t>(BinaryConsts::GCPrefix);
  o << U32LEB(BinaryConsts::ArrayNewFixed);
  parent.writeIndexedHeapType(curr->type.getHeapType());
  o << U32LEB(curr->values.size());
}

void BinaryInstWriter::visitArrayGet(ArrayGet* curr) {
  if (curr->ref->type.isNull()) {
    emitUnreachable();
    return;
  }
  auto heapType = curr->ref->type.getHeapType();
  const auto& field = heapType.getArray().element;
  bool atomic = curr->order != MemoryOrder::Unordered;
  int8_t op;
  if (field.type != Type::i32 || field.packedType == Field::NotPacked) {
    op = atomic ? BinaryConsts::ArrayAtomicGet : BinaryConsts::ArrayGet;
  } else if (curr->signed_) {
    op = atomic ? BinaryConsts::ArrayAtomicGetS : BinaryConsts::ArrayGetS;
  } else {
    op = atomic ? BinaryConsts::ArrayAtomicGetU : BinaryConsts::ArrayGetU;
  }
  auto prefix = atomic ? BinaryConsts::AtomicPrefix : BinaryConsts::GCPrefix;
  o << static_cast<int8_t>(prefix) << U32LEB(op);
  if (atomic) {
    parent.writeMemoryOrder(curr->order);
  }
  parent.writeIndexedHeapType(heapType);
}

void BinaryInstWriter::visitArraySet(ArraySet* curr) {
  if (curr->ref->type.isNull()) {
    emitUnreachable();
    return;
  }
  if (curr->order == MemoryOrder::Unordered) {
    o << static_cast<int8_t>(BinaryConsts::GCPrefix)
      << U32LEB(BinaryConsts::ArraySet);
  } else {
    o << static_cast<int8_t>(BinaryConsts::AtomicPrefix)
      << U32LEB(BinaryConsts::ArrayAtomicSet);
    parent.writeMemoryOrder(curr->order);
  }
  parent.writeIndexedHeapType(curr->ref->type.getHeapType());
}

void BinaryInstWriter::visitArrayLoad(ArrayLoad* curr) {
  if (curr->ref->type.isNull()) {
    emitUnreachable();
    return;
  }
  emitLoadOpcode(curr->bytes, curr->signed_, curr->type);
  uint32_t alignmentBits = BinaryConsts::HasBackingArrayMask;
  o << U32LEB(alignmentBits);
  parent.writeIndexedHeapType(curr->ref->type.getHeapType());
}

void BinaryInstWriter::visitArrayStore(ArrayStore* curr) {
  if (curr->ref->type.isNull()) {
    emitUnreachable();
    return;
  }
  emitStoreOpcode(curr->bytes, curr->value->type);
  uint32_t alignmentBits = BinaryConsts::HasBackingArrayMask;
  o << U32LEB(alignmentBits);
  parent.writeIndexedHeapType(curr->ref->type.getHeapType());
}

void BinaryInstWriter::visitArrayLen(ArrayLen* curr) {
  o << static_cast<int8_t>(BinaryConsts::GCPrefix)
    << U32LEB(BinaryConsts::ArrayLen);
}

void BinaryInstWriter::visitArrayCopy(ArrayCopy* curr) {
  if (curr->srcRef->type.isNull() || curr->destRef->type.isNull()) {
    emitUnreachable();
    return;
  }
  o << static_cast<int8_t>(BinaryConsts::GCPrefix)
    << U32LEB(BinaryConsts::ArrayCopy);
  parent.writeIndexedHeapType(curr->destRef->type.getHeapType());
  parent.writeIndexedHeapType(curr->srcRef->type.getHeapType());
}

void BinaryInstWriter::visitArrayFill(ArrayFill* curr) {
  if (curr->ref->type.isNull()) {
    emitUnreachable();
    return;
  }
  o << static_cast<int8_t>(BinaryConsts::GCPrefix)
    << U32LEB(BinaryConsts::ArrayFill);
  parent.writeIndexedHeapType(curr->ref->type.getHeapType());
}

void BinaryInstWriter::visitArrayInitData(ArrayInitData* curr) {
  if (curr->ref->type.isNull()) {
    emitUnreachable();
    return;
  }
  o << static_cast<int8_t>(BinaryConsts::GCPrefix);
  o << U32LEB(BinaryConsts::ArrayInitData);
  parent.writeIndexedHeapType(curr->ref->type.getHeapType());
  o << U32LEB(parent.getDataSegmentIndex(curr->segment));
}

void BinaryInstWriter::visitArrayInitElem(ArrayInitElem* curr) {
  if (curr->ref->type.isNull()) {
    emitUnreachable();
    return;
  }
  o << static_cast<int8_t>(BinaryConsts::GCPrefix);
  o << U32LEB(BinaryConsts::ArrayInitElem);
  parent.writeIndexedHeapType(curr->ref->type.getHeapType());
  o << U32LEB(parent.getElementSegmentIndex(curr->segment));
}

void BinaryInstWriter::visitArrayRMW(ArrayRMW* curr) {
  if (curr->ref->type.isNull()) {
    emitUnreachable();
    return;
  }
  o << static_cast<int8_t>(BinaryConsts::AtomicPrefix);
  switch (curr->op) {
    case RMWAdd:
      o << U32LEB(BinaryConsts::ArrayAtomicRMWAdd);
      break;
    case RMWSub:
      o << U32LEB(BinaryConsts::ArrayAtomicRMWSub);
      break;
    case RMWAnd:
      o << U32LEB(BinaryConsts::ArrayAtomicRMWAnd);
      break;
    case RMWOr:
      o << U32LEB(BinaryConsts::ArrayAtomicRMWOr);
      break;
    case RMWXor:
      o << U32LEB(BinaryConsts::ArrayAtomicRMWXor);
      break;
    case RMWXchg:
      o << U32LEB(BinaryConsts::ArrayAtomicRMWXchg);
      break;
  }
  parent.writeMemoryOrder(curr->order, /*isRMW=*/true);
  parent.writeIndexedHeapType(curr->ref->type.getHeapType());
}

void BinaryInstWriter::visitArrayCmpxchg(ArrayCmpxchg* curr) {
  if (curr->ref->type.isNull()) {
    emitUnreachable();
    return;
  }
  o << static_cast<int8_t>(BinaryConsts::AtomicPrefix)
    << U32LEB(BinaryConsts::ArrayAtomicRMWCmpxchg);
  parent.writeMemoryOrder(curr->order, /*isRMW=*/true);
  parent.writeIndexedHeapType(curr->ref->type.getHeapType());
}

void BinaryInstWriter::visitRefAs(RefAs* curr) {
  switch (curr->op) {
    case RefAsNonNull:
      o << static_cast<int8_t>(BinaryConsts::RefAsNonNull);
      break;
    case AnyConvertExtern:
      o << static_cast<int8_t>(BinaryConsts::GCPrefix)
        << U32LEB(BinaryConsts::AnyConvertExtern);
      break;
    case ExternConvertAny:
      o << static_cast<int8_t>(BinaryConsts::GCPrefix)
        << U32LEB(BinaryConsts::ExternConvertAny);
      break;
    default:
      WASM_UNREACHABLE("invalid ref.as_*");
  }
}

void BinaryInstWriter::visitStringNew(StringNew* curr) {
  if (curr->ref->type.isNull()) {
    // This is a bottom type, so this is an array-receiving operation that does
    // not receive an array. The spec allows this, but V8 does not, see
    // https://github.com/WebAssembly/stringref/issues/66
    // For now, just emit an unreachable here as this will definitely trap.
    emitUnreachable();
    return;
  }
  o << static_cast<int8_t>(BinaryConsts::GCPrefix);
  switch (curr->op) {
    case StringNewLossyUTF8Array:
      o << U32LEB(BinaryConsts::StringNewLossyUTF8Array);
      break;
    case StringNewWTF16Array:
      o << U32LEB(BinaryConsts::StringNewWTF16Array);
      break;
    case StringNewFromCodePoint:
      o << U32LEB(BinaryConsts::StringFromCodePoint);
      break;
    default:
      WASM_UNREACHABLE("invalid string.new*");
  }
}

void BinaryInstWriter::visitStringConst(StringConst* curr) {
  o << static_cast<int8_t>(BinaryConsts::GCPrefix)
    << U32LEB(BinaryConsts::StringConst)
    << U32LEB(parent.getStringIndex(curr->string));
}

void BinaryInstWriter::visitStringMeasure(StringMeasure* curr) {
  o << static_cast<int8_t>(BinaryConsts::GCPrefix);
  switch (curr->op) {
    case StringMeasureUTF8:
      o << U32LEB(BinaryConsts::StringMeasureUTF8);
      break;
    case StringMeasureWTF16:
      o << U32LEB(BinaryConsts::StringMeasureWTF16);
      break;
    default:
      WASM_UNREACHABLE("invalid string.new*");
  }
}

void BinaryInstWriter::visitStringEncode(StringEncode* curr) {
  if (curr->str->type.isNull()) {
    // See visitStringNew.
    emitUnreachable();
    return;
  }
  o << static_cast<int8_t>(BinaryConsts::GCPrefix);
  switch (curr->op) {
    case StringEncodeLossyUTF8Array:
      o << U32LEB(BinaryConsts::StringEncodeLossyUTF8Array);
      break;
    case StringEncodeWTF16Array:
      o << U32LEB(BinaryConsts::StringEncodeWTF16Array);
      break;
    default:
      WASM_UNREACHABLE("invalid string.new*");
  }
}

void BinaryInstWriter::visitStringConcat(StringConcat* curr) {
  o << static_cast<int8_t>(BinaryConsts::GCPrefix)
    << U32LEB(BinaryConsts::StringConcat);
}

void BinaryInstWriter::visitStringEq(StringEq* curr) {
  o << static_cast<int8_t>(BinaryConsts::GCPrefix);
  switch (curr->op) {
    case StringEqEqual:
      o << U32LEB(BinaryConsts::StringEq);
      break;
    case StringEqCompare:
      o << U32LEB(BinaryConsts::StringCompare);
      break;
    default:
      WASM_UNREACHABLE("invalid string.eq*");
  }
}

void BinaryInstWriter::visitStringTest(StringTest* curr) {
  o << static_cast<int8_t>(BinaryConsts::GCPrefix)
    << U32LEB(BinaryConsts::StringTest);
}

void BinaryInstWriter::visitStringWTF16Get(StringWTF16Get* curr) {
  // We need to convert the ref operand to a stringview, but it is under the pos
  // operand. Put the i32 in a scratch local, emit the conversion, then get the
  // i32 back onto the stack. If `pos` is a local.get anyway, then we can skip
  // the scratch local.
  bool posDeferred = false;
  Index posIndex;
  if (auto* get = curr->pos->dynCast<LocalGet>()) {
    assert(deferredGets.contains(get));
    posDeferred = true;
    posIndex = mappedLocals[{get->index, 0}];
  } else {
    posIndex = scratchLocals[Type::i32];
  }

  if (!posDeferred) {
    o << static_cast<int8_t>(BinaryConsts::LocalSet) << U32LEB(posIndex);
  }
  o << static_cast<int8_t>(BinaryConsts::GCPrefix)
    << U32LEB(BinaryConsts::StringAsWTF16);
  o << static_cast<int8_t>(BinaryConsts::LocalGet) << U32LEB(posIndex);
  o << static_cast<int8_t>(BinaryConsts::GCPrefix)
    << U32LEB(BinaryConsts::StringViewWTF16GetCodePoint);
}

void BinaryInstWriter::visitStringSliceWTF(StringSliceWTF* curr) {
  // We need to convert the ref operand to a stringview, but it is buried under
  // the start and end operands. Put the i32s in scratch locals, emit the
  // conversion, then get the i32s back onto the stack. If both `start` and
  // `end` are already local.gets, then we can skip the scratch locals.
  bool deferred = false;
  Index startIndex, endIndex;
  auto* startGet = curr->start->dynCast<LocalGet>();
  auto* endGet = curr->end->dynCast<LocalGet>();
  if (startGet && endGet) {
    assert(deferredGets.contains(startGet));
    assert(deferredGets.contains(endGet));
    deferred = true;
    startIndex = mappedLocals[{startGet->index, 0}];
    endIndex = mappedLocals[{endGet->index, 0}];
  } else {
    startIndex = scratchLocals[Type::i32];
    endIndex = startIndex + 1;
  }

  if (!deferred) {
    o << static_cast<int8_t>(BinaryConsts::LocalSet) << U32LEB(endIndex);
    o << static_cast<int8_t>(BinaryConsts::LocalSet) << U32LEB(startIndex);
  }
  o << static_cast<int8_t>(BinaryConsts::GCPrefix)
    << U32LEB(BinaryConsts::StringAsWTF16);
  o << static_cast<int8_t>(BinaryConsts::LocalGet) << U32LEB(startIndex);
  o << static_cast<int8_t>(BinaryConsts::LocalGet) << U32LEB(endIndex);
  o << static_cast<int8_t>(BinaryConsts::GCPrefix)
    << U32LEB(BinaryConsts::StringViewWTF16Slice);
}

void BinaryInstWriter::visitContNew(ContNew* curr) {
  o << static_cast<int8_t>(BinaryConsts::ContNew);
  parent.writeIndexedHeapType(curr->type.getHeapType());
}

void BinaryInstWriter::visitSuspend(Suspend* curr) {
  o << static_cast<int8_t>(BinaryConsts::Suspend)
    << U32LEB(parent.getTagIndex(curr->tag));
}

void BinaryInstWriter::visitContBind(ContBind* curr) {
  if (curr->cont->type.isNull()) {
    emitUnreachable();
    return;
  }
  o << static_cast<int8_t>(BinaryConsts::ContBind);
  parent.writeIndexedHeapType(curr->cont->type.getHeapType());
  parent.writeIndexedHeapType(curr->type.getHeapType());
}

void BinaryInstWriter::visitResume(Resume* curr) {
  if (curr->cont->type.isNull()) {
    emitUnreachable();
    return;
  }
  o << static_cast<int8_t>(BinaryConsts::Resume);
  parent.writeIndexedHeapType(curr->cont->type.getHeapType());

  size_t handlerNum = curr->handlerTags.size();
  o << U32LEB(handlerNum);
  for (size_t i = 0; i < handlerNum; i++) {
    if (curr->handlerBlocks[i].isNull()) {
      // on switch
      o << static_cast<int8_t>(BinaryConsts::OnSwitch)
        << U32LEB(parent.getTagIndex(curr->handlerTags[i]));
    } else {
      // on label
      o << static_cast<int8_t>(BinaryConsts::OnLabel)
        << U32LEB(parent.getTagIndex(curr->handlerTags[i]))
        << U32LEB(getBreakIndex(curr->handlerBlocks[i]));
    }
  }
}

void BinaryInstWriter::visitResumeThrow(ResumeThrow* curr) {
  if (curr->cont->type.isNull()) {
    emitUnreachable();
    return;
  }
  o << static_cast<int8_t>(curr->tag ? BinaryConsts::ResumeThrow
                                     : BinaryConsts::ResumeThrowRef);
  parent.writeIndexedHeapType(curr->cont->type.getHeapType());
  if (curr->tag) {
    o << U32LEB(parent.getTagIndex(curr->tag));
  }

  size_t handlerNum = curr->handlerTags.size();
  o << U32LEB(handlerNum);
  for (size_t i = 0; i < handlerNum; i++) {
    if (curr->handlerBlocks[i].isNull()) {
      // on switch
      o << static_cast<int8_t>(BinaryConsts::OnSwitch)
        << U32LEB(parent.getTagIndex(curr->handlerTags[i]));
    } else {
      // on label
      o << static_cast<int8_t>(BinaryConsts::OnLabel)
        << U32LEB(parent.getTagIndex(curr->handlerTags[i]))
        << U32LEB(getBreakIndex(curr->handlerBlocks[i]));
    }
  }
}

void BinaryInstWriter::visitStackSwitch(StackSwitch* curr) {
  if (curr->cont->type.isNull()) {
    emitUnreachable();
    return;
  }
  o << static_cast<int8_t>(BinaryConsts::Switch);
  parent.writeIndexedHeapType(curr->cont->type.getHeapType());
  o << U32LEB(parent.getTagIndex(curr->tag));
}

void BinaryInstWriter::emitScopeEnd(Expression* curr) {
  assert(!breakStack.empty());
  breakStack.pop_back();
  o << static_cast<int8_t>(BinaryConsts::End);
  if (func) {
    parent.trackExpressionEnd(curr, func);
  }
}

void BinaryInstWriter::emitFunctionEnd() {
  o << static_cast<int8_t>(BinaryConsts::End);
}

void BinaryInstWriter::emitUnreachable() {
  o << static_cast<int8_t>(BinaryConsts::Unreachable);
}

void BinaryInstWriter::emitUnreachableLocalSet(Index index) {
  LocalSet set;
  set.index = index;
  set.type = Type::none;
  set.value = nullptr;
  visitLocalSet(&set);
}

void BinaryInstWriter::mapLocalsAndEmitHeader() {
  assert(func && "BinaryInstWriter: function is not set");
  // Map params
  for (Index i = 0; i < func->getNumParams(); i++) {
    mappedLocals[std::make_pair(i, 0)] = i;
  }

  auto scratches = countScratchLocals();

  // Normally we map all locals of the same type into a range of adjacent
  // addresses, which is more compact. However, if we need to keep DWARF valid,
  // do not do any reordering at all - instead, do a trivial mapping that
  // keeps everything unmoved.
  //
  // Unless we have run DWARF-invalidating passes, all locals added during the
  // process that are not in DWARF info (tuple locals, tuple scratch locals,
  // locals to resolve stacky format, ..) have been all tacked on to the
  // existing locals and happen at the end, so as long as we print the local
  // types in order, we don't invalidate original local DWARF info here.
  if (DWARF) {
    Index mappedIndex = func->getVarIndexBase();
    for (Index i = func->getVarIndexBase(); i < func->getNumLocals(); i++) {
      size_t size = func->getLocalType(i).size();
      for (Index j = 0; j < size; j++) {
        mappedLocals[std::make_pair(i, j)] = mappedIndex++;
      }
    }

    size_t numBinaryLocals =
      mappedIndex - func->getVarIndexBase() + scratches.size();

    o << U32LEB(numBinaryLocals);

    for (Index i = func->getVarIndexBase(); i < func->getNumLocals(); i++) {
      for (const auto& type : func->getLocalType(i)) {
        o << U32LEB(1);
        parent.writeType(type);
      }
    }
    for (auto& [type, count] : scratches) {
      o << U32LEB(count);
      parent.writeType(type);
      scratchLocals[type] = mappedIndex;
      mappedIndex += count;
    }
    return;
  }

  for (auto type : func->vars) {
    for (const auto& t : type) {
      noteLocalType(t);
    }
  }

  for (auto& [type, count] : scratches) {
    noteLocalType(type, count);
  }

  if (parent.getModule()->features.hasReferenceTypes()) {
    // Sort local types in a way that keeps all MVP types together and all
    // reference types together. E.g. it is helpful to avoid a block of i32s in
    // between blocks of different reference types, since clearing out reference
    // types may require different work.
    //
    // See https://github.com/WebAssembly/binaryen/issues/4773
    //
    // In order to decide whether to put MVP types or reference types first,
    // look at the type of the first local. In an optimized binary we will have
    // sorted the locals by frequency of uses, so this way we'll keep the most
    // commonly-used local at the top, which should work well in many cases.
    bool refsFirst = !localTypes.empty() && localTypes[0].isRef();
    std::stable_sort(localTypes.begin(), localTypes.end(), [&](Type a, Type b) {
      if (refsFirst) {
        return a.isRef() && !b.isRef();
      } else {
        return !a.isRef() && b.isRef();
      }
    });
  }

  // Map IR (local index, tuple index) pairs to binary local indices. Since
  // locals are grouped by type, start by calculating the base indices for each
  // type.
  TypeIndexMap nextFreeIndex(parent.getModule()->features);
  Index baseIndex = func->getVarIndexBase();
  for (auto& type : localTypes) {
    nextFreeIndex[type] = baseIndex;
    baseIndex += numLocalsByType[type];
  }

  // Map the IR index pairs to indices.
  for (Index i = func->getVarIndexBase(); i < func->getNumLocals(); i++) {
    Index j = 0;
    for (const auto& type : func->getLocalType(i)) {
      mappedLocals[{i, j++}] = nextFreeIndex[type]++;
    }
  }

  // Map scratch locals to the remaining indices.
  for (auto& [type, _] : scratches) {
    scratchLocals[type] = nextFreeIndex[type];
  }

  o << U32LEB(localTypes.size());
  for (auto& localType : localTypes) {
    o << U32LEB(numLocalsByType[localType]);
    parent.writeType(localType);
  }
}

void BinaryInstWriter::noteLocalType(Type type, Index count) {
  auto& num = numLocalsByType[type];
  if (num == 0) {
    localTypes.push_back(type);
  }
  num += count;
}

BinaryInstWriter::TypeIndexMap BinaryInstWriter::countScratchLocals() {
  struct ScratchLocalFinder : PostWalker<ScratchLocalFinder> {
    BinaryInstWriter& parent;
    TypeIndexMap scratches;

    ScratchLocalFinder(BinaryInstWriter& parent)
      : parent(parent), scratches(parent.parent.getModule()->features) {}

    void visitTupleExtract(TupleExtract* curr) {
      if (curr->type == Type::unreachable) {
        // We will not emit this instruction anyway.
        return;
      }
      // Extracts from locals or globals are optimizable and do not require
      // scratch locals. Record them.
      auto* tuple = curr->tuple;
      if (tuple->is<LocalGet>() || tuple->is<LocalSet>() ||
          tuple->is<GlobalGet>()) {
        parent.extractedGets.insert({tuple, curr->index});
        return;
      }
      // Include a scratch register for each type of tuple.extract with nonzero
      // index present.
      if (curr->index != 0) {
        auto& count = scratches[curr->type];
        count = std::max(count, 1u);
      }
    }

    void visitStringWTF16Get(StringWTF16Get* curr) {
      if (curr->type == Type::unreachable) {
        return;
      }
      // If `pos` already a local.get, we can defer emitting that local.get
      // instead of using a scratch local.
      if (auto* get = curr->pos->dynCast<LocalGet>()) {
        parent.deferredGets.insert(get);
        return;
      }
      // Scratch local to hold the `pos` value while we emit a stringview
      // conversion for the `ref` value.
      auto& count = scratches[Type::i32];
      count = std::max(count, 1u);
    }

    void visitStringSliceWTF(StringSliceWTF* curr) {
      if (curr->type == Type::unreachable) {
        return;
      }
      // If `start` and `end` are already local.gets, we can defer emitting
      // those gets instead of using scratch locals.
      auto* startGet = curr->start->dynCast<LocalGet>();
      auto* endGet = curr->end->dynCast<LocalGet>();
      if (startGet && endGet) {
        parent.deferredGets.insert(startGet);
        parent.deferredGets.insert(endGet);
        return;
      }
      // Scratch locals to hold the `start` and `end` values while we emit a
      // stringview conversion for the `ref` value.
      auto& count = scratches[Type::i32];
      count = std::max(count, 2u);
    }

    // As mentioned in BinaryInstWriter::visitBreak, the type of br_if with a
    // value may be more refined in Binaryen IR compared to the wasm spec, as we
    // give it the type of the value, while the spec gives it the type of the
    // block it targets. To avoid problems we must handle the case where a br_if
    // has a value, the value is more refined then the target, and the value is
    // not dropped (the last condition is very rare in real-world wasm, making
    // all of this a quite unusual situation). First, detect such situations by
    // seeing if we have br_ifs that return reference types at all. We do so by
    // counting them, and as we go we ignore ones that are dropped, since a
    // dropped value is not a problem for us.
    //
    // Note that we do not check all the conditions here, such as if the type
    // matches the break target, or if the parent is a cast, which we leave for
    // a more expensive analysis later, which we only run if we see something
    // suspicious here.
    Index numDangerousBrIfs = 0;

    void visitBreak(Break* curr) {
      if (curr->type.hasRef()) {
        numDangerousBrIfs++;
      }
    }

    void visitDrop(Drop* curr) {
      if (curr->value->is<Break>() && curr->value->type.hasRef()) {
        // The value is exactly a br_if of a ref, that we just visited before
        // us. Undo the ++ from there as it can be ignored.
        assert(numDangerousBrIfs > 0);
        numDangerousBrIfs--;
      }
    }
  } finder(*this);
  finder.walk(func->body);

  if (!finder.numDangerousBrIfs || !parent.getModule()->features.hasGC()) {
    // Nothing more to do: either no such br_ifs, or GC is not enabled.
    //
    // The explicit check for GC is here because if only reference types are
    // enabled then we still may seem to need a fixup here, e.g. if a ref.func
    // is br_if'd to a block of type funcref. But that only appears that way
    // because in Binaryen IR we allow non-nullable types even without GC (and
    // if GC is not enabled then we always emit nullable types in the binary).
    // That is, even if we see a type difference without GC, it will vanish in
    // the binary format; there is never a need to add any ref.casts without GC
    // being enabled.
    return std::move(finder.scratches);
  }

  // There are dangerous-looking br_ifs, so we must do the harder work to
  // actually investigate them in detail, including tracking block types. By
  // being fully precise here, we'll only emit casts when absolutely necessary,
  // which avoids repeated roundtrips adding more and more code.
  struct RefinementScanner : public ExpressionStackWalker<RefinementScanner> {
    BinaryInstWriter& writer;
    ScratchLocalFinder& finder;

    RefinementScanner(BinaryInstWriter& writer, ScratchLocalFinder& finder)
      : writer(writer), finder(finder) {}

    void visitBreak(Break* curr) {
      auto type = curr->type;
      // See if this is one of the dangerous br_ifs we must handle.
      if (!type.hasRef()) {
        // Not even a reference.
        return;
      }
      auto* parent = getParent();
      if (parent) {
        if (parent->is<Drop>()) {
          // It is dropped anyhow.
          return;
        }
        if (auto* cast = parent->dynCast<RefCast>()) {
          if (Type::isSubType(cast->type, type)) {
            // It is cast to the same type or a better one. In particular this
            // handles the case of repeated roundtripping: After the first
            // roundtrip we emit a cast that we'll identify here, and not emit
            // an additional one.
            return;
          }
        }
      }
      auto* breakTarget = findBreakTarget(curr->name);
      auto unrefinedType = breakTarget->type;
      if (unrefinedType == type) {
        // It has the proper type anyhow.
        return;
      }

      // Mark the br_if as needing handling, and add the type to the set of
      // types we need scratch tuple locals for (if relevant).
      writer.brIfsNeedingHandling.insert(curr);

      // Simple cases can be handled by a cast. However, tuples and uncastable
      // types require us to use locals too.
      if (type.isTuple() || !type.isCastable()) {
        // We must allocate enough scratch locals for this tuple, plus the i32
        // of the condition, as we will stash it all so that we can restore the
        // fully refined value after the br_if.
        //
        // Note that we may need more than one per type in the tuple, if a type
        // appears more than once, so we count their appearances.
        InsertOrderedMap<Type, Index> scratchTypeUses;
        for (auto t : type) {
          scratchTypeUses[t]++;
        }
        // The condition.
        scratchTypeUses[Type::i32]++;
        for (auto& [type, uses] : scratchTypeUses) {
          auto& count = finder.scratches[type];
          count = std::max(count, uses);
        }
      }
    }
  } refinementScanner(*this, finder);
  refinementScanner.walk(func->body);

  return std::move(finder.scratches);
}

void BinaryInstWriter::emitMemoryAccess(size_t alignment,
                                        size_t bytes,
                                        uint64_t offset,
                                        Name memory,
                                        MemoryOrder order,
                                        bool isRMW,
                                        BackingType backing) {
  uint32_t alignmentBits = Bits::log2(alignment ? alignment : bytes);
  if (backing == BackingType::Array) {
    alignmentBits |= BinaryConsts::HasBackingArrayMask;
    o << U32LEB(alignmentBits);
    return;
  }
  uint32_t memoryIdx = parent.getMemoryIndex(memory);

  bool shouldWriteMemoryOrder = false;
  switch (order) {
    // On atomic memory accesses, the ordering is assumed to be SeqCst if not
    // specified. Omit it here for a smaller binary size.
    case MemoryOrder::Unordered:
    case MemoryOrder::SeqCst:
      break;
    case MemoryOrder::AcqRel: {
      shouldWriteMemoryOrder = true;
      alignmentBits |= BinaryConsts::HasMemoryOrderMask;
      break;
    }
  }

  if (memoryIdx > 0) {
    alignmentBits |= BinaryConsts::HasMemoryIndexMask;
  }
  o << U32LEB(alignmentBits);
  if (memoryIdx > 0) {
    o << U32LEB(memoryIdx);
  }
  if (shouldWriteMemoryOrder) {
    parent.writeMemoryOrder(order, isRMW);
  }

  bool memory64 = parent.getModule()->getMemory(memory)->is64();
  if (memory64) {
    o << U64LEB(offset);
  } else {
    o << U32LEB(offset);
  }
}

int32_t BinaryInstWriter::getBreakIndex(Name name) { // -1 if not found
  if (name == DELEGATE_CALLER_TARGET) {
    return breakStack.size();
  }
  for (int i = breakStack.size() - 1; i >= 0; i--) {
    if (breakStack[i] == name) {
      return breakStack.size() - 1 - i;
    }
  }
  WASM_UNREACHABLE("break index not found");
}

// Queues the expressions linearly in Stack IR (SIR)
class StackIRGenerator : public BinaryenIRWriter<StackIRGenerator> {
public:
  StackIRGenerator(Module& module, Function* func)
    : BinaryenIRWriter<StackIRGenerator>(func), module(module) {}

  void emit(Expression* curr);
  void emitScopeEnd(Expression* curr);
  void emitHeader() {}
  void emitIfElse(If* curr) {
    stackIR.push_back(makeStackInst(StackInst::IfElse, curr));
  }
  void emitCatch(Try* curr, Index i) {
    stackIR.push_back(makeStackInst(StackInst::Catch, curr));
  }
  void emitCatchAll(Try* curr) {
    stackIR.push_back(makeStackInst(StackInst::CatchAll, curr));
  }
  void emitDelegate(Try* curr) {
    stackIR.push_back(makeStackInst(StackInst::Delegate, curr));
  }
  void emitFunctionEnd() {}
  void emitUnreachable() {
    stackIR.push_back(makeStackInst(Builder(module).makeUnreachable()));
  }
  void emitUnreachableLocalSet(Index i) {
    Builder builder(module);
    auto unreachable = builder.makeUnreachable();
    auto set = builder.makeLocalSet(i, unreachable);
    emit(unreachable);
    emit(set);
  }
  void emitDebugLocation(Expression* curr) {}

  StackIR& getStackIR() { return stackIR; }

private:
  StackInst* makeStackInst(StackInst::Op op, Expression* origin);
  StackInst* makeStackInst(Expression* origin) {
    return makeStackInst(StackInst::Basic, origin);
  }

  Module& module;
  StackIR stackIR; // filled in write()
};

void StackIRGenerator::emit(Expression* curr) {
  StackInst* stackInst = nullptr;
  if (curr->is<Block>()) {
    stackInst = makeStackInst(StackInst::BlockBegin, curr);
  } else if (curr->is<If>()) {
    stackInst = makeStackInst(StackInst::IfBegin, curr);
  } else if (curr->is<Loop>()) {
    stackInst = makeStackInst(StackInst::LoopBegin, curr);
  } else if (curr->is<Try>()) {
    stackInst = makeStackInst(StackInst::TryBegin, curr);
  } else if (curr->is<TryTable>()) {
    stackInst = makeStackInst(StackInst::TryTableBegin, curr);
  } else {
    stackInst = makeStackInst(curr);
  }
  stackIR.push_back(stackInst);
}

void StackIRGenerator::emitScopeEnd(Expression* curr) {
  StackInst* stackInst = nullptr;
  if (curr->is<Block>()) {
    stackInst = makeStackInst(StackInst::BlockEnd, curr);
  } else if (curr->is<If>()) {
    stackInst = makeStackInst(StackInst::IfEnd, curr);
  } else if (curr->is<Loop>()) {
    stackInst = makeStackInst(StackInst::LoopEnd, curr);
  } else if (curr->is<Try>()) {
    stackInst = makeStackInst(StackInst::TryEnd, curr);
  } else if (curr->is<TryTable>()) {
    stackInst = makeStackInst(StackInst::TryTableEnd, curr);
  } else {
    WASM_UNREACHABLE("unexpected expr type");
  }
  stackIR.push_back(stackInst);
}

StackInst* StackIRGenerator::makeStackInst(StackInst::Op op,
                                           Expression* origin) {
  auto* ret = module.allocator.alloc<StackInst>();
  ret->op = op;
  ret->origin = origin;
  auto stackType = origin->type;
  if (Properties::isControlFlowStructure(origin)) {
    if (stackType == Type::unreachable) {
      // There are no unreachable blocks, loops, ifs, trys, or try_tables. we
      // emit extra unreachables to fix that up, so that they are valid as
      // having none type.
      stackType = Type::none;
    } else if (op != StackInst::BlockEnd && op != StackInst::IfEnd &&
               op != StackInst::LoopEnd && op != StackInst::TryEnd &&
               op != StackInst::TryTableEnd) {
      // If a concrete type is returned, we mark the end of the construct has
      // having that type (as it is pushed to the value stack at that point),
      // other parts are marked as none).
      stackType = Type::none;
    }
  }
  ret->type = stackType;
  return ret;
}

ModuleStackIR::ModuleStackIR(Module& wasm, const PassOptions& options)
  : analysis(wasm, [&](Function* func, StackIR& stackIR) {
      if (func->imported()) {
        return;
      }

      StackIRGenerator stackIRGen(wasm, func);
      stackIRGen.write();
      stackIR = std::move(stackIRGen.getStackIR());

      if (options.optimizeStackIR) {
        StackIROptimizer optimizer(func, stackIR, options, wasm.features);
        optimizer.run();
      }
    }) {}

void StackIRToBinaryWriter::write() {
  if (func->prologLocation) {
    parent.writeDebugLocation(*func->prologLocation);
  }
  writer.mapLocalsAndEmitHeader();
  // Stack to track indices of catches within a try
  SmallVector<Index, 4> catchIndexStack;
  for (auto* inst : stackIR) {
    if (!inst) {
      continue; // a nullptr is just something we can skip
    }
    switch (inst->op) {
      case StackInst::TryBegin:
        catchIndexStack.push_back(0);
        [[fallthrough]];
      case StackInst::Basic:
      case StackInst::BlockBegin:
      case StackInst::IfBegin:
      case StackInst::LoopBegin:
      case StackInst::TryTableBegin: {
        if (sourceMap) {
          parent.writeSourceMapLocation(inst->origin, func);
        }
        writer.visit(inst->origin);
        break;
      }
      case StackInst::TryEnd:
        catchIndexStack.pop_back();
        [[fallthrough]];
      case StackInst::BlockEnd:
      case StackInst::IfEnd:
      case StackInst::LoopEnd:
      case StackInst::TryTableEnd: {
        writer.emitScopeEnd(inst->origin);
        break;
      }
      case StackInst::IfElse: {
        writer.emitIfElse(inst->origin->cast<If>());
        break;
      }
      case StackInst::Catch: {
        writer.emitCatch(inst->origin->cast<Try>(), catchIndexStack.back()++);
        break;
      }
      case StackInst::CatchAll: {
        writer.emitCatchAll(inst->origin->cast<Try>());
        break;
      }
      case StackInst::Delegate: {
        writer.emitDelegate(inst->origin->cast<Try>());
        // Delegates end the try, like a TryEnd.
        catchIndexStack.pop_back();
        break;
      }
      default:
        WASM_UNREACHABLE("unexpected op");
    }
  }
  // Indicate the debug location corresponding to the end opcode that
  // terminates the function code.
  if (func->epilogLocation) {
    parent.writeDebugLocation(*func->epilogLocation);
  } else {
    // The end opcode has no debug location.
    parent.writeNoDebugLocation();
  }
  writer.emitFunctionEnd();
}

} // namespace wasm
