From 1bd821c52eb788deca5270d7797a3bc0b1d98857 Mon Sep 17 00:00:00 2001 From: stevenfontanella Date: Sat, 27 Dec 2025 00:17:40 +0000 Subject: [PATCH 1/6] Acquire/release memory ordering for loads --- src/binaryen-c.cpp | 3 +- src/parser/contexts.h | 10 +- src/parser/parsers.h | 37 +- src/passes/Print.cpp | 12 +- src/passes/SafeHeap.cpp | 38 +- src/support/string.h | 17 + src/tools/wasm-split/instrumenter.cpp | 8 +- src/wasm-binary.h | 6 +- src/wasm-builder.h | 13 +- src/wasm-ir-builder.h | 3 +- src/wasm-stack.h | 4 +- src/wasm.h | 2 +- src/wasm/wasm-binary.cpp | 284 +- src/wasm/wasm-ir-builder.cpp | 6 +- src/wasm/wasm-stack.cpp | 79 +- .../safe-heap_enable-threads_enable-simd.txt | 3184 ++++++++++------ ...safe-heap_enable-threads_enable-simd64.txt | 3210 +++++++++++------ ...mory-unused_enable-threads_enable-simd.txt | 3184 ++++++++++------ test/spec/relaxed-atomics.wast | 96 + 19 files changed, 6989 insertions(+), 3207 deletions(-) create mode 100644 test/spec/relaxed-atomics.wast diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp index 146a9089f1f..7f04231a2c9 100644 --- a/src/binaryen-c.cpp +++ b/src/binaryen-c.cpp @@ -1351,7 +1351,8 @@ BinaryenExpressionRef BinaryenAtomicLoad(BinaryenModuleRef module, offset, (Expression*)ptr, Type(type), - getMemoryName(module, memoryName))); + getMemoryName(module, memoryName), + MemoryOrder::SeqCst)); } BinaryenExpressionRef BinaryenAtomicStore(BinaryenModuleRef module, uint32_t bytes, diff --git a/src/parser/contexts.h b/src/parser/contexts.h index 474a49eaf38..df1e16ad3fb 100644 --- a/src/parser/contexts.h +++ b/src/parser/contexts.h @@ -555,7 +555,8 @@ struct NullInstrParserCtx { int, bool, MemoryIdxT*, - MemargT) { + MemargT, + MemoryOrder) { return Ok{}; } Result<> makeStore(Index, @@ -2235,12 +2236,13 @@ struct ParseDefsCtx : TypeParserCtx, AnnotationParserCtx { int bytes, bool isAtomic, Name* mem, - Memarg memarg) { + Memarg memarg, + MemoryOrder order) { auto m = getMemory(pos, mem); CHECK_ERR(m); if (isAtomic) { - return withLoc(pos, - irBuilder.makeAtomicLoad(bytes, memarg.offset, type, *m)); + return withLoc( + pos, irBuilder.makeAtomicLoad(bytes, memarg.offset, type, *m, order)); } return withLoc(pos, irBuilder.makeLoad( diff --git a/src/parser/parsers.h b/src/parser/parsers.h index a8f1495097d..bfea96f968d 100644 --- a/src/parser/parsers.h +++ b/src/parser/parsers.h @@ -49,6 +49,7 @@ template Result memtype(Ctx&); template Result memtypeContinued(Ctx&, Type addressType); template Result memorder(Ctx&); +template MaybeResult maybeMemOrder(Ctx&); template Result tabletype(Ctx&); template Result tabletypeContinued(Ctx&, Type addressType); @@ -860,6 +861,18 @@ template Result memorder(Ctx& ctx) { return MemoryOrder::SeqCst; } +// memorder ::= 'seqcst' | 'acqrel' +template MaybeResult maybeMemOrder(Ctx& ctx) { + if (ctx.in.takeKeyword("seqcst"sv)) { + return MemoryOrder::SeqCst; + } + if (ctx.in.takeKeyword("acqrel"sv)) { + return MemoryOrder::AcqRel; + } + + return {}; +} + // tabletype ::= (limits32 | 'i32' limits32 | 'i64' limit64) reftype template Result tabletype(Ctx& ctx) { Type addressType = Type::i32; @@ -1737,12 +1750,32 @@ Result<> makeLoad(Ctx& ctx, bool signed_, int bytes, bool isAtomic) { + auto mem = maybeMemidx(ctx); CHECK_ERR(mem); + + // We could only parse this when `isAtomic`, but this way gives a clearer + // error since `memIdx` can never be mistaken for a `memOrder`. + auto maybeOrder = maybeMemOrder(ctx); + CHECK_ERR(maybeOrder); + + if (maybeOrder && !isAtomic) { + return Err{"Memory ordering can only be provided for atomic loads."}; + } + auto arg = memarg(ctx, bytes); CHECK_ERR(arg); - return ctx.makeLoad( - pos, annotations, type, signed_, bytes, isAtomic, mem.getPtr(), *arg); + return ctx.makeLoad(pos, + annotations, + type, + signed_, + bytes, + isAtomic, + mem.getPtr(), + *arg, + maybeOrder ? *maybeOrder + : isAtomic ? MemoryOrder::SeqCst + : MemoryOrder::Unordered); } template diff --git a/src/passes/Print.cpp b/src/passes/Print.cpp index d2c76c67208..11e886d5a8b 100644 --- a/src/passes/Print.cpp +++ b/src/passes/Print.cpp @@ -574,6 +574,7 @@ struct PrintExpressionContents } restoreNormalColor(o); printMemoryName(curr->memory, o, wasm); + printMemoryOrder(curr->order, /*prependSpace=*/true, /*appendSpace=*/false); if (curr->offset) { o << " offset=" << curr->offset; } @@ -2323,7 +2324,9 @@ struct PrintExpressionContents o << index; } } - void printMemoryOrder(MemoryOrder order) { + + void + printMemoryOrder(MemoryOrder order, bool prependSpace, bool appendSpace) { switch (order) { // Unordered should have a different base instruction, so there is nothing // to print. We could be explicit and print seqcst, but we choose not to @@ -2332,10 +2335,15 @@ struct PrintExpressionContents case MemoryOrder::SeqCst: break; case MemoryOrder::AcqRel: - o << "acqrel "; + o << (prependSpace ? " " : "") << "acqrel" << (appendSpace ? " " : ""); break; } } + + void printMemoryOrder(MemoryOrder order) { + printMemoryOrder(order, /*prependSpace=*/false, /*appendSpace=*/true); + } + void visitStructGet(StructGet* curr) { auto heapType = curr->ref->type.getHeapType(); const auto& field = heapType.getStruct().fields[curr->index]; diff --git a/src/passes/SafeHeap.cpp b/src/passes/SafeHeap.cpp index 124f8a383bc..5d84fcc403a 100644 --- a/src/passes/SafeHeap.cpp +++ b/src/passes/SafeHeap.cpp @@ -26,6 +26,7 @@ #include "ir/import-utils.h" #include "ir/load-utils.h" #include "pass.h" +#include "support/string.h" #include "wasm-builder.h" #include "wasm.h" @@ -37,18 +38,28 @@ static const Name SEGFAULT_IMPORT("segfault"); static const Name ALIGNFAULT_IMPORT("alignfault"); static Name getLoadName(Load* curr) { - std::string ret = "SAFE_HEAP_LOAD_"; - ret += curr->type.toString(); - ret += "_" + std::to_string(curr->bytes) + "_"; + std::vector parts{curr->type.toString(), + std::to_string(curr->bytes)}; if (LoadUtils::isSignRelevant(curr) && !curr->signed_) { - ret += "U_"; + parts.push_back("U"); } - if (curr->isAtomic()) { - ret += "A"; - } else { - ret += std::to_string(curr->align); + + switch (curr->order) { + case MemoryOrder::Unordered: { + parts.push_back(std::to_string(curr->align)); + break; + } + case MemoryOrder::SeqCst: { + parts.push_back("SC"); + break; + } + case MemoryOrder::AcqRel: { + parts.push_back("AR"); + break; + } } - return ret; + + return "SAFE_HEAP_LOAD_" + String::join(parts, "_"); } static Name getStoreName(Store* curr) { @@ -232,10 +243,11 @@ struct SafeHeap : public Pass { if (align > bytes) { continue; } - for (auto isAtomic : {true, false}) { - load.order = - isAtomic ? MemoryOrder::SeqCst : MemoryOrder::Unordered; - if (isAtomic && + for (auto memoryOrder : {MemoryOrder::Unordered, + MemoryOrder::AcqRel, + MemoryOrder::SeqCst}) { + load.order = memoryOrder; + if (load.isAtomic() && !isPossibleAtomicOperation( align, bytes, module->memories[0]->shared, type)) { continue; diff --git a/src/support/string.h b/src/support/string.h index 56a7a81ab80..5d9da0e0cf0 100644 --- a/src/support/string.h +++ b/src/support/string.h @@ -58,6 +58,23 @@ class Split : public std::vector { } }; +template>> +std::string join(const std::vector& strs, std::string_view sep) { + if (strs.empty()) { + return ""; + } + + std::string ret = std::string(strs[0]); + for (size_t i = 1; i < strs.size(); i++) { + ret.append(sep); + ret.append(strs[i]); + } + + return ret; +} + // Handles bracketing in a list initially split by ",", but the list may // contain nested ","s. For example, // void foo(int, double) diff --git a/src/tools/wasm-split/instrumenter.cpp b/src/tools/wasm-split/instrumenter.cpp index 93971ed941b..085715ce246 100644 --- a/src/tools/wasm-split/instrumenter.cpp +++ b/src/tools/wasm-split/instrumenter.cpp @@ -287,8 +287,12 @@ void Instrumenter::addProfileExport(size_t numFuncs) { getAddr(), builder.makeBinary( MulInt32, getFuncIdx(), builder.makeConst(uint32_t(4)))), - builder.makeAtomicLoad( - 1, 0, getFuncIdx(), Type::i32, loadMemoryName), + builder.makeAtomicLoad(1, + 0, + getFuncIdx(), + Type::i32, + loadMemoryName, + MemoryOrder::SeqCst), Type::i32, wasm->memories[0]->name), builder.makeLocalSet( diff --git a/src/wasm-binary.h b/src/wasm-binary.h index f7a20190e5a..61e56950d22 100644 --- a/src/wasm-binary.h +++ b/src/wasm-binary.h @@ -1728,8 +1728,10 @@ class WasmBinaryReader { size_t inlineHintsLen = 0; void readInlineHints(size_t payloadLen); - Index readMemoryAccess(Address& alignment, Address& offset); - std::tuple getMemarg(); + std::tuple + readMemoryAccess(bool isAtomic, bool isRMW); + std::tuple getMemarg(bool isAtomic, + bool isRMW); MemoryOrder getMemoryOrder(bool isRMW = false); [[noreturn]] void throwError(std::string text) { diff --git a/src/wasm-builder.h b/src/wasm-builder.h index fb273b32568..6878e0dff7b 100644 --- a/src/wasm-builder.h +++ b/src/wasm-builder.h @@ -384,10 +384,17 @@ class Builder { ret->finalize(); return ret; } - Load* makeAtomicLoad( - unsigned bytes, Address offset, Expression* ptr, Type type, Name memory) { + Load* makeAtomicLoad(unsigned bytes, + Address offset, + Expression* ptr, + Type type, + Name memory, + MemoryOrder order) { + assert(order != MemoryOrder::Unordered && + "Atomic loads can't be unordered"); + Load* load = makeLoad(bytes, false, offset, bytes, ptr, type, memory); - load->order = MemoryOrder::SeqCst; + load->order = order; return load; } AtomicWait* makeAtomicWait(Expression* ptr, diff --git a/src/wasm-ir-builder.h b/src/wasm-ir-builder.h index e8bed5bc4fb..a3845b385c6 100644 --- a/src/wasm-ir-builder.h +++ b/src/wasm-ir-builder.h @@ -156,7 +156,8 @@ class IRBuilder : public UnifiedExpressionVisitor> { Name mem); Result<> makeStore( unsigned bytes, Address offset, unsigned align, Type type, Name mem); - Result<> makeAtomicLoad(unsigned bytes, Address offset, Type type, Name mem); + Result<> makeAtomicLoad( + unsigned bytes, Address offset, Type type, Name mem, MemoryOrder order); Result<> makeAtomicStore(unsigned bytes, Address offset, Type type, Name mem); Result<> makeAtomicRMW( AtomicRMWOp op, unsigned bytes, Address offset, Type type, Name mem); diff --git a/src/wasm-stack.h b/src/wasm-stack.h index 41118d1391e..961d2f5ab60 100644 --- a/src/wasm-stack.h +++ b/src/wasm-stack.h @@ -129,7 +129,9 @@ class BinaryInstWriter : public OverriddenVisitor { void emitMemoryAccess(size_t alignment, size_t bytes, uint64_t offset, - Name memory); + Name memory, + MemoryOrder order, + bool isRMW); int32_t getBreakIndex(Name name); WasmBinaryWriter& parent; diff --git a/src/wasm.h b/src/wasm.h index 5c36d5b40b9..d3636a5fc86 100644 --- a/src/wasm.h +++ b/src/wasm.h @@ -995,7 +995,7 @@ class Load : public SpecificExpression { Address align; Expression* ptr; Name memory; - MemoryOrder order; + MemoryOrder order = MemoryOrder::Unordered; bool isAtomic() const { return order != MemoryOrder::Unordered; } diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index 556fc535e32..b7af8de1427 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -3529,95 +3529,118 @@ Result<> WasmBinaryReader::readInst() { case BinaryConsts::F64Const: return builder.makeConst(getFloat64Literal()); case BinaryConsts::I32LoadMem8S: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeLoad(1, true, offset, align, Type::i32, mem); } case BinaryConsts::I32LoadMem8U: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeLoad(1, false, offset, align, Type::i32, mem); } case BinaryConsts::I32LoadMem16S: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeLoad(2, true, offset, align, Type::i32, mem); } case BinaryConsts::I32LoadMem16U: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeLoad(2, false, offset, align, Type::i32, mem); } case BinaryConsts::I32LoadMem: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeLoad(4, false, offset, align, Type::i32, mem); } case BinaryConsts::I64LoadMem8S: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeLoad(1, true, offset, align, Type::i64, mem); } case BinaryConsts::I64LoadMem8U: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeLoad(1, false, offset, align, Type::i64, mem); } case BinaryConsts::I64LoadMem16S: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeLoad(2, true, offset, align, Type::i64, mem); } case BinaryConsts::I64LoadMem16U: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeLoad(2, false, offset, align, Type::i64, mem); } case BinaryConsts::I64LoadMem32S: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeLoad(4, true, offset, align, Type::i64, mem); } case BinaryConsts::I64LoadMem32U: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeLoad(4, false, offset, align, Type::i64, mem); } case BinaryConsts::I64LoadMem: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeLoad(8, false, offset, align, Type::i64, mem); } case BinaryConsts::F32LoadMem: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeLoad(4, false, offset, align, Type::f32, mem); } case BinaryConsts::F64LoadMem: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeLoad(8, false, offset, align, Type::f64, mem); } case BinaryConsts::I32StoreMem8: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeStore(1, offset, align, Type::i32, mem); } case BinaryConsts::I32StoreMem16: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeStore(2, offset, align, Type::i32, mem); } case BinaryConsts::I32StoreMem: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeStore(4, offset, align, Type::i32, mem); } case BinaryConsts::I64StoreMem8: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeStore(1, offset, align, Type::i64, mem); } case BinaryConsts::I64StoreMem16: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeStore(2, offset, align, Type::i64, mem); } case BinaryConsts::I64StoreMem32: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeStore(4, offset, align, Type::i64, mem); } case BinaryConsts::I64StoreMem: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeStore(8, offset, align, Type::i64, mem); } case BinaryConsts::F32StoreMem: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeStore(4, offset, align, Type::f32, mem); } case BinaryConsts::F64StoreMem: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeStore(8, offset, align, Type::f64, mem); } case BinaryConsts::AtomicPrefix: { @@ -3625,89 +3648,110 @@ Result<> WasmBinaryReader::readInst() { switch (op) { case BinaryConsts::I32AtomicLoad8U: { // TODO: pass align through for validation. - auto [mem, align, offset] = getMemarg(); - return builder.makeAtomicLoad(1, offset, Type::i32, mem); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/true, /*isRMW=*/false); + return builder.makeAtomicLoad(1, offset, Type::i32, mem, memoryOrder); } case BinaryConsts::I32AtomicLoad16U: { - auto [mem, align, offset] = getMemarg(); - return builder.makeAtomicLoad(2, offset, Type::i32, mem); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/true, /*isRMW=*/false); + return builder.makeAtomicLoad(2, offset, Type::i32, mem, memoryOrder); } case BinaryConsts::I32AtomicLoad: { - auto [mem, align, offset] = getMemarg(); - return builder.makeAtomicLoad(4, offset, Type::i32, mem); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/true, /*isRMW=*/false); + return builder.makeAtomicLoad(4, offset, Type::i32, mem, memoryOrder); } case BinaryConsts::I64AtomicLoad8U: { - auto [mem, align, offset] = getMemarg(); - return builder.makeAtomicLoad(1, offset, Type::i64, mem); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/true, /*isRMW=*/false); + return builder.makeAtomicLoad(1, offset, Type::i64, mem, memoryOrder); } case BinaryConsts::I64AtomicLoad16U: { - auto [mem, align, offset] = getMemarg(); - return builder.makeAtomicLoad(2, offset, Type::i64, mem); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/true, /*isRMW=*/false); + return builder.makeAtomicLoad(2, offset, Type::i64, mem, memoryOrder); } case BinaryConsts::I64AtomicLoad32U: { - auto [mem, align, offset] = getMemarg(); - return builder.makeAtomicLoad(4, offset, Type::i64, mem); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/true, /*isRMW=*/false); + return builder.makeAtomicLoad(4, offset, Type::i64, mem, memoryOrder); } case BinaryConsts::I64AtomicLoad: { - auto [mem, align, offset] = getMemarg(); - return builder.makeAtomicLoad(8, offset, Type::i64, mem); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/true, /*isRMW=*/false); + return builder.makeAtomicLoad(8, offset, Type::i64, mem, memoryOrder); } case BinaryConsts::I32AtomicStore8: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/true, /*isRMW=*/false); return builder.makeAtomicStore(1, offset, Type::i32, mem); } case BinaryConsts::I32AtomicStore16: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/true, /*isRMW=*/false); return builder.makeAtomicStore(2, offset, Type::i32, mem); } case BinaryConsts::I32AtomicStore: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/true, /*isRMW=*/false); return builder.makeAtomicStore(4, offset, Type::i32, mem); } case BinaryConsts::I64AtomicStore8: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/true, /*isRMW=*/false); return builder.makeAtomicStore(1, offset, Type::i64, mem); } case BinaryConsts::I64AtomicStore16: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/true, /*isRMW=*/false); return builder.makeAtomicStore(2, offset, Type::i64, mem); } case BinaryConsts::I64AtomicStore32: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/true, /*isRMW=*/false); return builder.makeAtomicStore(4, offset, Type::i64, mem); } case BinaryConsts::I64AtomicStore: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/true, /*isRMW=*/false); return builder.makeAtomicStore(8, offset, Type::i64, mem); } #define RMW(op) \ case BinaryConsts::I32AtomicRMW##op: { \ - auto [mem, align, offset] = getMemarg(); \ + auto [mem, align, offset, memoryOrder] = \ + getMemarg(/*isAtomic=*/true, /*isRMW=*/true); \ return builder.makeAtomicRMW(RMW##op, 4, offset, Type::i32, mem); \ } \ case BinaryConsts::I32AtomicRMW##op##8U: { \ - auto [mem, align, offset] = getMemarg(); \ + auto [mem, align, offset, memoryOrder] = \ + getMemarg(/*isAtomic=*/true, /*isRMW=*/true); \ return builder.makeAtomicRMW(RMW##op, 1, offset, Type::i32, mem); \ } \ case BinaryConsts::I32AtomicRMW##op##16U: { \ - auto [mem, align, offset] = getMemarg(); \ + auto [mem, align, offset, memoryOrder] = \ + getMemarg(/*isAtomic=*/true, /*isRMW=*/true); \ return builder.makeAtomicRMW(RMW##op, 2, offset, Type::i32, mem); \ } \ case BinaryConsts::I64AtomicRMW##op: { \ - auto [mem, align, offset] = getMemarg(); \ + auto [mem, align, offset, memoryOrder] = \ + getMemarg(/*isAtomic=*/true, /*isRMW=*/true); \ return builder.makeAtomicRMW(RMW##op, 8, offset, Type::i64, mem); \ } \ case BinaryConsts::I64AtomicRMW##op##8U: { \ - auto [mem, align, offset] = getMemarg(); \ + auto [mem, align, offset, memoryOrder] = \ + getMemarg(/*isAtomic=*/true, /*isRMW=*/true); \ return builder.makeAtomicRMW(RMW##op, 1, offset, Type::i64, mem); \ } \ case BinaryConsts::I64AtomicRMW##op##16U: { \ - auto [mem, align, offset] = getMemarg(); \ + auto [mem, align, offset, memoryOrder] = \ + getMemarg(/*isAtomic=*/true, /*isRMW=*/true); \ return builder.makeAtomicRMW(RMW##op, 2, offset, Type::i64, mem); \ } \ case BinaryConsts::I64AtomicRMW##op##32U: { \ - auto [mem, align, offset] = getMemarg(); \ + auto [mem, align, offset, memoryOrder] = \ + getMemarg(/*isAtomic=*/true, /*isRMW=*/true); \ return builder.makeAtomicRMW(RMW##op, 4, offset, Type::i64, mem); \ } @@ -3719,43 +3763,53 @@ Result<> WasmBinaryReader::readInst() { RMW(Xchg); case BinaryConsts::I32AtomicCmpxchg: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/true, /*isRMW=*/true); return builder.makeAtomicCmpxchg(4, offset, Type::i32, mem); } case BinaryConsts::I32AtomicCmpxchg8U: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/true, /*isRMW=*/true); return builder.makeAtomicCmpxchg(1, offset, Type::i32, mem); } case BinaryConsts::I32AtomicCmpxchg16U: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/true, /*isRMW=*/true); return builder.makeAtomicCmpxchg(2, offset, Type::i32, mem); } case BinaryConsts::I64AtomicCmpxchg: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/true, /*isRMW=*/true); return builder.makeAtomicCmpxchg(8, offset, Type::i64, mem); } case BinaryConsts::I64AtomicCmpxchg8U: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/true, /*isRMW=*/true); return builder.makeAtomicCmpxchg(1, offset, Type::i64, mem); } case BinaryConsts::I64AtomicCmpxchg16U: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/true, /*isRMW=*/true); return builder.makeAtomicCmpxchg(2, offset, Type::i64, mem); } case BinaryConsts::I64AtomicCmpxchg32U: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/true, /*isRMW=*/true); return builder.makeAtomicCmpxchg(4, offset, Type::i64, mem); } case BinaryConsts::I32AtomicWait: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/true, /*isRMW=*/false); return builder.makeAtomicWait(Type::i32, offset, mem); } case BinaryConsts::I64AtomicWait: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/true, /*isRMW=*/false); return builder.makeAtomicWait(Type::i64, offset, mem); } case BinaryConsts::AtomicNotify: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/true, /*isRMW=*/false); return builder.makeAtomicNotify(offset, mem); } case BinaryConsts::AtomicFence: @@ -3892,11 +3946,13 @@ Result<> WasmBinaryReader::readInst() { return builder.makeElemDrop(elem); } case BinaryConsts::F32_F16LoadMem: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeLoad(2, false, offset, align, Type::f32, mem); } case BinaryConsts::F32_F16StoreMem: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeStore(2, offset, align, Type::f32, mem); } } @@ -4441,98 +4497,120 @@ Result<> WasmBinaryReader::readInst() { case BinaryConsts::V128Const: return builder.makeConst(getVec128Literal()); case BinaryConsts::V128Store: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeStore(16, offset, align, Type::v128, mem); } case BinaryConsts::V128Load: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeLoad(16, false, offset, align, Type::v128, mem); } case BinaryConsts::V128Load8Splat: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeSIMDLoad(Load8SplatVec128, offset, align, mem); } case BinaryConsts::V128Load16Splat: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeSIMDLoad(Load16SplatVec128, offset, align, mem); } case BinaryConsts::V128Load32Splat: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeSIMDLoad(Load32SplatVec128, offset, align, mem); } case BinaryConsts::V128Load64Splat: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeSIMDLoad(Load64SplatVec128, offset, align, mem); } case BinaryConsts::V128Load8x8S: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeSIMDLoad(Load8x8SVec128, offset, align, mem); } case BinaryConsts::V128Load8x8U: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeSIMDLoad(Load8x8UVec128, offset, align, mem); } case BinaryConsts::V128Load16x4S: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeSIMDLoad(Load16x4SVec128, offset, align, mem); } case BinaryConsts::V128Load16x4U: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeSIMDLoad(Load16x4UVec128, offset, align, mem); } case BinaryConsts::V128Load32x2S: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeSIMDLoad(Load32x2SVec128, offset, align, mem); } case BinaryConsts::V128Load32x2U: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeSIMDLoad(Load32x2UVec128, offset, align, mem); } case BinaryConsts::V128Load32Zero: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeSIMDLoad(Load32ZeroVec128, offset, align, mem); } case BinaryConsts::V128Load64Zero: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeSIMDLoad(Load64ZeroVec128, offset, align, mem); } case BinaryConsts::V128Load8Lane: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeSIMDLoadStoreLane( Load8LaneVec128, offset, align, getLaneIndex(16), mem); } case BinaryConsts::V128Load16Lane: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeSIMDLoadStoreLane( Load16LaneVec128, offset, align, getLaneIndex(8), mem); } case BinaryConsts::V128Load32Lane: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeSIMDLoadStoreLane( Load32LaneVec128, offset, align, getLaneIndex(4), mem); } case BinaryConsts::V128Load64Lane: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeSIMDLoadStoreLane( Load64LaneVec128, offset, align, getLaneIndex(2), mem); } case BinaryConsts::V128Store8Lane: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeSIMDLoadStoreLane( Store8LaneVec128, offset, align, getLaneIndex(16), mem); } case BinaryConsts::V128Store16Lane: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeSIMDLoadStoreLane( Store16LaneVec128, offset, align, getLaneIndex(8), mem); } case BinaryConsts::V128Store32Lane: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeSIMDLoadStoreLane( Store32LaneVec128, offset, align, getLaneIndex(4), mem); } case BinaryConsts::V128Store64Lane: { - auto [mem, align, offset] = getMemarg(); + auto [mem, align, offset, memoryOrder] = + getMemarg(/*isAtomic=*/false, /*isRMW=*/false); return builder.makeSIMDLoadStoreLane( Store64LaneVec128, offset, align, getLaneIndex(2), mem); } @@ -5462,13 +5540,25 @@ void WasmBinaryReader::readInlineHints(size_t payloadLen) { }); } -Index WasmBinaryReader::readMemoryAccess(Address& alignment, Address& offset) { +std::tuple +WasmBinaryReader::readMemoryAccess(bool isAtomic, bool isRMW) { auto rawAlignment = getU32LEB(); bool hasMemIdx = false; Index memIdx = 0; + + bool hasMemoryOrder = rawAlignment & (1 << 5); + if (hasMemoryOrder && !isAtomic) { + throwError("Memory order may only be set for atomic instructions."); + } + + if (hasMemoryOrder) { + // Clear the bit before we parse alignment + rawAlignment = rawAlignment & ~(1 << 5); + } + // Check bit 6 in the alignment to know whether a memory index is present per: // https://github.com/WebAssembly/multi-memory/blob/main/proposals/multi-memory/Overview.md - if (rawAlignment & (1 << (6))) { + if (rawAlignment & (1 << 6)) { hasMemIdx = true; // Clear the bit before we parse alignment rawAlignment = rawAlignment & ~(1 << 6); @@ -5478,24 +5568,30 @@ Index WasmBinaryReader::readMemoryAccess(Address& alignment, Address& offset) { throwError("Alignment must be of a reasonable size"); } - alignment = Bits::pow2(rawAlignment); + Address alignment = Bits::pow2(rawAlignment); + MemoryOrder memoryOrder = + isAtomic ? MemoryOrder::SeqCst : MemoryOrder::Unordered; if (hasMemIdx) { memIdx = getU32LEB(); } + if (hasMemoryOrder) { + memoryOrder = getMemoryOrder(isRMW); + } if (memIdx >= wasm.memories.size()) { throwError("Memory index out of range while reading memory alignment."); } auto* memory = wasm.memories[memIdx].get(); - offset = memory->addressType == Type::i32 ? getU32LEB() : getU64LEB(); + Address offset = memory->addressType == Type::i32 ? getU32LEB() : getU64LEB(); - return memIdx; + return {alignment, offset, memIdx, memoryOrder}; } // TODO: make this the only version -std::tuple WasmBinaryReader::getMemarg() { - Address alignment, offset; - auto memIdx = readMemoryAccess(alignment, offset); - return {getMemoryName(memIdx), alignment, offset}; +std::tuple +WasmBinaryReader::getMemarg(bool isAtomic, bool isRMW) { + auto [alignment, offset, memIdx, memoryOrder] = + readMemoryAccess(isAtomic, isRMW); + return {getMemoryName(memIdx), alignment, offset, memoryOrder}; } MemoryOrder WasmBinaryReader::getMemoryOrder(bool isRMW) { diff --git a/src/wasm/wasm-ir-builder.cpp b/src/wasm/wasm-ir-builder.cpp index 74ba7ee1fe4..200a9e0d107 100644 --- a/src/wasm/wasm-ir-builder.cpp +++ b/src/wasm/wasm-ir-builder.cpp @@ -1483,12 +1483,12 @@ Result<> IRBuilder::makeStore( return Ok{}; } -Result<> -IRBuilder::makeAtomicLoad(unsigned bytes, Address offset, Type type, Name mem) { +Result<> IRBuilder::makeAtomicLoad( + unsigned bytes, Address offset, Type type, Name mem, MemoryOrder order) { Load curr; curr.memory = mem; CHECK_ERR(visitLoad(&curr)); - push(builder.makeAtomicLoad(bytes, offset, curr.ptr, type, mem)); + push(builder.makeAtomicLoad(bytes, offset, curr.ptr, type, mem, order)); return Ok{}; } diff --git a/src/wasm/wasm-stack.cpp b/src/wasm/wasm-stack.cpp index 45a97fab3b7..805c3a5cf3f 100644 --- a/src/wasm/wasm-stack.cpp +++ b/src/wasm/wasm-stack.cpp @@ -361,7 +361,12 @@ void BinaryInstWriter::visitLoad(Load* curr) { WASM_UNREACHABLE("unexpected type"); } } - emitMemoryAccess(curr->align, curr->bytes, curr->offset, curr->memory); + emitMemoryAccess(curr->align, + curr->bytes, + curr->offset, + curr->memory, + curr->order, + /*isRMW=*/false); } void BinaryInstWriter::visitStore(Store* curr) { @@ -469,7 +474,12 @@ void BinaryInstWriter::visitStore(Store* curr) { WASM_UNREACHABLE("unexpected type"); } } - emitMemoryAccess(curr->align, curr->bytes, curr->offset, curr->memory); + emitMemoryAccess(curr->align, + curr->bytes, + curr->offset, + curr->memory, + curr->order, + /*isRMW=*/false); } void BinaryInstWriter::visitAtomicRMW(AtomicRMW* curr) { @@ -526,9 +536,12 @@ void BinaryInstWriter::visitAtomicRMW(AtomicRMW* curr) { default: WASM_UNREACHABLE("unexpected op"); } -#undef CASE_FOR_OP - - emitMemoryAccess(curr->bytes, curr->bytes, curr->offset, curr->memory); + emitMemoryAccess(curr->bytes, + curr->bytes, + curr->offset, + curr->memory, + MemoryOrder::SeqCst, + /*isRMW=*/true); } void BinaryInstWriter::visitAtomicCmpxchg(AtomicCmpxchg* curr) { @@ -570,7 +583,12 @@ void BinaryInstWriter::visitAtomicCmpxchg(AtomicCmpxchg* curr) { default: WASM_UNREACHABLE("unexpected type"); } - emitMemoryAccess(curr->bytes, curr->bytes, curr->offset, curr->memory); + emitMemoryAccess(curr->bytes, + curr->bytes, + curr->offset, + curr->memory, + MemoryOrder::SeqCst, + /*isRMW=*/true); } void BinaryInstWriter::visitAtomicWait(AtomicWait* curr) { @@ -578,12 +596,14 @@ void BinaryInstWriter::visitAtomicWait(AtomicWait* curr) { switch (curr->expectedType.getBasic()) { case Type::i32: { o << int8_t(BinaryConsts::I32AtomicWait); - emitMemoryAccess(4, 4, curr->offset, curr->memory); + emitMemoryAccess( + 4, 4, curr->offset, curr->memory, MemoryOrder::SeqCst, /*isRMW=*/false); break; } case Type::i64: { o << int8_t(BinaryConsts::I64AtomicWait); - emitMemoryAccess(8, 8, curr->offset, curr->memory); + emitMemoryAccess( + 8, 8, curr->offset, curr->memory, MemoryOrder::SeqCst, /*isRMW=*/false); break; } default: @@ -593,7 +613,8 @@ void BinaryInstWriter::visitAtomicWait(AtomicWait* curr) { void BinaryInstWriter::visitAtomicNotify(AtomicNotify* curr) { o << int8_t(BinaryConsts::AtomicPrefix) << int8_t(BinaryConsts::AtomicNotify); - emitMemoryAccess(4, 4, curr->offset, curr->memory); + emitMemoryAccess( + 4, 4, curr->offset, curr->memory, MemoryOrder::SeqCst, /*isRMW=*/false); } void BinaryInstWriter::visitAtomicFence(AtomicFence* curr) { @@ -800,8 +821,12 @@ void BinaryInstWriter::visitSIMDLoad(SIMDLoad* curr) { break; } assert(curr->align); - emitMemoryAccess( - curr->align, /*(unused) bytes=*/0, curr->offset, curr->memory); + emitMemoryAccess(curr->align, + /*(unused) bytes=*/0, + curr->offset, + curr->memory, + MemoryOrder::Unordered, + /*isRMW=*/false); } void BinaryInstWriter::visitSIMDLoadStoreLane(SIMDLoadStoreLane* curr) { @@ -833,8 +858,12 @@ void BinaryInstWriter::visitSIMDLoadStoreLane(SIMDLoadStoreLane* curr) { break; } assert(curr->align); - emitMemoryAccess( - curr->align, /*(unused) bytes=*/0, curr->offset, curr->memory); + emitMemoryAccess(curr->align, + /*(unused) bytes=*/0, + curr->offset, + curr->memory, + MemoryOrder::Unordered, + /*isRMW=*/false); o << curr->index; } @@ -3204,18 +3233,38 @@ InsertOrderedMap BinaryInstWriter::countScratchLocals() { void BinaryInstWriter::emitMemoryAccess(size_t alignment, size_t bytes, uint64_t offset, - Name memory) { + Name memory, + MemoryOrder order, + bool isRMW) { uint32_t alignmentBits = Bits::log2(alignment ? alignment : bytes); 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 |= 1 << 5; + break; + } + } + if (memoryIdx > 0) { // Set bit 6 in the alignment to indicate a memory index is present per: // https://github.com/WebAssembly/multi-memory/blob/main/proposals/multi-memory/Overview.md - alignmentBits = alignmentBits | 1 << 6; + alignmentBits |= 1 << 6; } o << U32LEB(alignmentBits); if (memoryIdx > 0) { o << U32LEB(memoryIdx); } + if (shouldWriteMemoryOrder) { + parent.writeMemoryOrder(order, isRMW); + } bool memory64 = parent.getModule()->getMemory(memory)->is64(); if (memory64) { diff --git a/test/passes/safe-heap_enable-threads_enable-simd.txt b/test/passes/safe-heap_enable-threads_enable-simd.txt index ffc912a3c74..30774a7bbd8 100644 --- a/test/passes/safe-heap_enable-threads_enable-simd.txt +++ b/test/passes/safe-heap_enable-threads_enable-simd.txt @@ -23,7 +23,7 @@ ) ) (drop - (call $SAFE_HEAP_LOAD_i32_4_A + (call $SAFE_HEAP_LOAD_i32_4_SC (i32.const 1) (i32.const 0) ) @@ -184,7 +184,7 @@ (v128.const i32x4 0x00000001 0x00000002 0x00000003 0x00000004) ) ) - (func $SAFE_HEAP_LOAD_i32_1_A (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -219,17 +219,11 @@ (unreachable) ) ) - (i32.shr_s - (i32.shl - (i32.atomic.load8_u - (local.get $2) - ) - (i32.const 24) - ) - (i32.const 24) + (i32.load8_s + (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_1_AR (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -264,11 +258,17 @@ (unreachable) ) ) - (i32.load8_s - (local.get $2) + (i32.shr_s + (i32.shl + (i32.atomic.load8_u acqrel + (local.get $2) + ) + (i32.const 24) + ) + (i32.const 24) ) ) - (func $SAFE_HEAP_LOAD_i32_1_U_A (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_1_SC (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -303,8 +303,14 @@ (unreachable) ) ) - (i32.atomic.load8_u - (local.get $2) + (i32.shr_s + (i32.shl + (i32.atomic.load8_u + (local.get $2) + ) + (i32.const 24) + ) + (i32.const 24) ) ) (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) @@ -346,7 +352,7 @@ (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_1_U_AR (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -364,7 +370,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 2) + (i32.const 1) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -381,11 +387,11 @@ (unreachable) ) ) - (i32.load16_s align=1 + (i32.atomic.load8_u acqrel (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_A (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_1_U_SC (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -403,7 +409,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 2) + (i32.const 1) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -420,26 +426,11 @@ (unreachable) ) ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load16_u - (local.get $2) - ) - (i32.const 16) - ) - (i32.const 16) + (i32.atomic.load8_u + (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -474,20 +465,11 @@ (unreachable) ) ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_s + (i32.load16_s align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -522,11 +504,20 @@ (unreachable) ) ) - (i32.load16_u align=1 + (if + (i32.and + (local.get $2) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i32.load16_s (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_U_A (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_2_AR (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -570,11 +561,17 @@ (call $alignfault) ) ) - (i32.atomic.load16_u - (local.get $2) + (i32.shr_s + (i32.shl + (i32.atomic.load16_u acqrel + (local.get $2) + ) + (i32.const 16) + ) + (i32.const 16) ) ) - (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_2_SC (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -618,11 +615,17 @@ (call $alignfault) ) ) - (i32.load16_u - (local.get $2) + (i32.shr_s + (i32.shl + (i32.atomic.load16_u + (local.get $2) + ) + (i32.const 16) + ) + (i32.const 16) ) ) - (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -640,7 +643,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 4) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -657,11 +660,11 @@ (unreachable) ) ) - (i32.load align=1 + (i32.load16_u align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -679,7 +682,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 4) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -705,11 +708,11 @@ (call $alignfault) ) ) - (i32.load align=2 + (i32.load16_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_4_A (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_2_U_AR (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -727,7 +730,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 4) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -747,17 +750,17 @@ (if (i32.and (local.get $2) - (i32.const 3) + (i32.const 1) ) (then (call $alignfault) ) ) - (i32.atomic.load + (i32.atomic.load16_u acqrel (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_2_U_SC (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -775,7 +778,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 4) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -795,17 +798,17 @@ (if (i32.and (local.get $2) - (i32.const 3) + (i32.const 1) ) (then (call $alignfault) ) ) - (i32.load + (i32.atomic.load16_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_1_A (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -823,7 +826,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 1) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -840,17 +843,11 @@ (unreachable) ) ) - (i64.shr_s - (i64.shl - (i64.atomic.load8_u - (local.get $2) - ) - (i64.const 56) - ) - (i64.const 56) + (i32.load align=1 + (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -868,7 +865,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 1) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -885,11 +882,20 @@ (unreachable) ) ) - (i64.load8_s + (if + (i32.and + (local.get $2) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i32.load align=2 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_1_U_A (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -907,7 +913,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 1) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -924,11 +930,20 @@ (unreachable) ) ) - (i64.atomic.load8_u + (if + (i32.and + (local.get $2) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (i32.load (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i32_4_AR (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -946,7 +961,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 1) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -963,11 +978,20 @@ (unreachable) ) ) - (i64.load8_u + (if + (i32.and + (local.get $2) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (i32.atomic.load acqrel (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i32_4_SC (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -985,7 +1009,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 2) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -1002,11 +1026,20 @@ (unreachable) ) ) - (i64.load16_s align=1 + (if + (i32.and + (local.get $2) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (i32.atomic.load (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_A (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1024,7 +1057,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 2) + (i32.const 1) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -1041,26 +1074,11 @@ (unreachable) ) ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load16_u - (local.get $2) - ) - (i64.const 48) - ) - (i64.const 48) + (i64.load8_s + (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_1_AR (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1078,7 +1096,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 2) + (i32.const 1) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -1095,20 +1113,17 @@ (unreachable) ) ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) + (i64.shr_s + (i64.shl + (i64.atomic.load8_u acqrel + (local.get $2) + ) + (i64.const 56) ) - ) - (i64.load16_s - (local.get $2) + (i64.const 56) ) ) - (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_1_SC (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1126,7 +1141,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 2) + (i32.const 1) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -1143,11 +1158,17 @@ (unreachable) ) ) - (i64.load16_u align=1 - (local.get $2) + (i64.shr_s + (i64.shl + (i64.atomic.load8_u + (local.get $2) + ) + (i64.const 56) + ) + (i64.const 56) ) ) - (func $SAFE_HEAP_LOAD_i64_2_U_A (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1165,7 +1186,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 2) + (i32.const 1) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -1182,20 +1203,11 @@ (unreachable) ) ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load16_u + (i64.load8_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_1_U_AR (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1213,7 +1225,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 2) + (i32.const 1) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -1230,20 +1242,50 @@ (unreachable) ) ) + (i64.atomic.load8_u acqrel + (local.get $2) + ) + ) + (func $SAFE_HEAP_LOAD_i64_1_U_SC (param $0 i32) (param $1 i32) (result i64) + (local $2 i32) + (local.set $2 + (i32.add + (local.get $0) + (local.get $1) + ) + ) (if - (i32.and - (local.get $2) - (i32.const 1) + (i32.or + (i32.eq + (local.get $2) + (i32.const 0) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $2) + (i32.const 1) + ) + (i32.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i32.lt_u + (local.get $2) + (local.get $0) + ) + ) ) (then - (call $alignfault) + (call $segfault) + (unreachable) ) ) - (i64.load16_u + (i64.atomic.load8_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1261,7 +1303,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 4) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -1278,11 +1320,11 @@ (unreachable) ) ) - (i64.load32_s align=1 + (i64.load16_s align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1300,7 +1342,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 4) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -1326,11 +1368,11 @@ (call $alignfault) ) ) - (i64.load32_s align=2 + (i64.load16_s (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_A (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_AR (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1348,7 +1390,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 4) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -1368,7 +1410,7 @@ (if (i32.and (local.get $2) - (i32.const 3) + (i32.const 1) ) (then (call $alignfault) @@ -1376,15 +1418,15 @@ ) (i64.shr_s (i64.shl - (i64.atomic.load32_u + (i64.atomic.load16_u acqrel (local.get $2) ) - (i64.const 32) + (i64.const 48) ) - (i64.const 32) + (i64.const 48) ) ) - (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_SC (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1402,7 +1444,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 4) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -1422,17 +1464,23 @@ (if (i32.and (local.get $2) - (i32.const 3) + (i32.const 1) ) (then (call $alignfault) ) ) - (i64.load32_s - (local.get $2) + (i64.shr_s + (i64.shl + (i64.atomic.load16_u + (local.get $2) + ) + (i64.const 48) + ) + (i64.const 48) ) ) - (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1450,7 +1498,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 4) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -1467,11 +1515,11 @@ (unreachable) ) ) - (i64.load32_u align=1 + (i64.load16_u align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1489,7 +1537,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 4) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -1515,11 +1563,11 @@ (call $alignfault) ) ) - (i64.load32_u align=2 + (i64.load16_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_U_A (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_U_AR (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1537,7 +1585,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 4) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -1557,17 +1605,17 @@ (if (i32.and (local.get $2) - (i32.const 3) + (i32.const 1) ) (then (call $alignfault) ) ) - (i64.atomic.load32_u + (i64.atomic.load16_u acqrel (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_U_SC (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1585,7 +1633,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 4) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -1605,17 +1653,17 @@ (if (i32.and (local.get $2) - (i32.const 3) + (i32.const 1) ) (then (call $alignfault) ) ) - (i64.load32_u + (i64.atomic.load16_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1633,7 +1681,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 8) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -1650,11 +1698,11 @@ (unreachable) ) ) - (i64.load align=1 + (i64.load32_s align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1672,7 +1720,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 8) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -1698,11 +1746,11 @@ (call $alignfault) ) ) - (i64.load align=2 + (i64.load32_s align=2 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1720,7 +1768,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 8) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -1746,11 +1794,11 @@ (call $alignfault) ) ) - (i64.load align=4 + (i64.load32_s (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_8_A (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_AR (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1768,7 +1816,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 8) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -1788,17 +1836,23 @@ (if (i32.and (local.get $2) - (i32.const 7) + (i32.const 3) ) (then (call $alignfault) ) ) - (i64.atomic.load - (local.get $2) + (i64.shr_s + (i64.shl + (i64.atomic.load32_u acqrel + (local.get $2) + ) + (i64.const 32) + ) + (i64.const 32) ) ) - (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_SC (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1816,7 +1870,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 8) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -1836,17 +1890,23 @@ (if (i32.and (local.get $2) - (i32.const 7) + (i32.const 3) ) (then (call $alignfault) ) ) - (i64.load - (local.get $2) + (i64.shr_s + (i64.shl + (i64.atomic.load32_u + (local.get $2) + ) + (i64.const 32) + ) + (i64.const 32) ) ) - (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) + (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1881,11 +1941,11 @@ (unreachable) ) ) - (f32.load align=1 + (i64.load32_u align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) + (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1929,11 +1989,11 @@ (call $alignfault) ) ) - (f32.load align=2 + (i64.load32_u align=2 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) + (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1977,11 +2037,11 @@ (call $alignfault) ) ) - (f32.load + (i64.load32_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) + (func $SAFE_HEAP_LOAD_i64_4_U_AR (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1999,7 +2059,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 8) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -2016,11 +2076,20 @@ (unreachable) ) ) - (f64.load align=1 + (if + (i32.and + (local.get $2) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (i64.atomic.load32_u acqrel (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) + (func $SAFE_HEAP_LOAD_i64_4_U_SC (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -2038,7 +2107,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 8) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -2058,17 +2127,17 @@ (if (i32.and (local.get $2) - (i32.const 1) + (i32.const 3) ) (then (call $alignfault) ) ) - (f64.load align=2 + (i64.atomic.load32_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) + (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -2103,20 +2172,11 @@ (unreachable) ) ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=4 + (i64.load align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) + (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -2154,17 +2214,17 @@ (if (i32.and (local.get $2) - (i32.const 7) + (i32.const 1) ) (then (call $alignfault) ) ) - (f64.load + (i64.load align=2 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) + (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -2182,7 +2242,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 16) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -2199,11 +2259,20 @@ (unreachable) ) ) - (v128.load align=1 + (if + (i32.and + (local.get $2) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (i64.load align=4 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) + (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -2221,7 +2290,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 16) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -2241,17 +2310,17 @@ (if (i32.and (local.get $2) - (i32.const 1) + (i32.const 7) ) (then (call $alignfault) ) ) - (v128.load align=2 + (i64.load (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) + (func $SAFE_HEAP_LOAD_i64_8_AR (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -2269,7 +2338,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 16) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -2289,17 +2358,17 @@ (if (i32.and (local.get $2) - (i32.const 3) + (i32.const 7) ) (then (call $alignfault) ) ) - (v128.load align=4 + (i64.atomic.load acqrel (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) + (func $SAFE_HEAP_LOAD_i64_8_SC (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -2317,7 +2386,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 16) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -2343,11 +2412,11 @@ (call $alignfault) ) ) - (v128.load align=8 + (i64.atomic.load (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i32) (param $1 i32) (result v128) + (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) (local $2 i32) (local.set $2 (i32.add @@ -2365,7 +2434,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 16) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -2382,22 +2451,13 @@ (unreachable) ) ) - (if - (i32.and - (local.get $2) - (i32.const 15) - ) - (then - (call $alignfault) - ) - ) - (v128.load + (f32.load align=1 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_1_A (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 + (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) + (local $2 i32) + (local.set $2 (i32.add (local.get $0) (local.get $1) @@ -2406,21 +2466,21 @@ (if (i32.or (i32.eq - (local.get $3) + (local.get $2) (i32.const 0) ) (i32.or (i32.gt_u (i32.add - (local.get $3) - (i32.const 1) + (local.get $2) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -2430,14 +2490,22 @@ (unreachable) ) ) - (i32.atomic.store8 - (local.get $3) + (if + (i32.and + (local.get $2) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (f32.load align=2 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 + (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) + (local $2 i32) + (local.set $2 (i32.add (local.get $0) (local.get $1) @@ -2446,21 +2514,21 @@ (if (i32.or (i32.eq - (local.get $3) + (local.get $2) (i32.const 0) ) (i32.or (i32.gt_u (i32.add - (local.get $3) - (i32.const 1) + (local.get $2) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -2470,14 +2538,22 @@ (unreachable) ) ) - (i32.store8 - (local.get $3) + (if + (i32.and + (local.get $2) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (f32.load (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 + (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) + (local $2 i32) + (local.set $2 (i32.add (local.get $0) (local.get $1) @@ -2486,21 +2562,21 @@ (if (i32.or (i32.eq - (local.get $3) + (local.get $2) (i32.const 0) ) (i32.or (i32.gt_u (i32.add - (local.get $3) - (i32.const 2) + (local.get $2) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -2510,14 +2586,13 @@ (unreachable) ) ) - (i32.store16 align=1 - (local.get $3) + (f64.load align=1 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_2_A (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 + (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) + (local $2 i32) + (local.set $2 (i32.add (local.get $0) (local.get $1) @@ -2526,21 +2601,21 @@ (if (i32.or (i32.eq - (local.get $3) + (local.get $2) (i32.const 0) ) (i32.or (i32.gt_u (i32.add - (local.get $3) - (i32.const 2) + (local.get $2) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -2552,21 +2627,20 @@ ) (if (i32.and - (local.get $3) + (local.get $2) (i32.const 1) ) (then (call $alignfault) ) ) - (i32.atomic.store16 - (local.get $3) + (f64.load align=2 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 + (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) + (local $2 i32) + (local.set $2 (i32.add (local.get $0) (local.get $1) @@ -2575,21 +2649,21 @@ (if (i32.or (i32.eq - (local.get $3) + (local.get $2) (i32.const 0) ) (i32.or (i32.gt_u (i32.add - (local.get $3) - (i32.const 2) + (local.get $2) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -2601,21 +2675,20 @@ ) (if (i32.and - (local.get $3) - (i32.const 1) + (local.get $2) + (i32.const 3) ) (then (call $alignfault) ) ) - (i32.store16 - (local.get $3) + (f64.load align=4 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 + (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) + (local $2 i32) + (local.set $2 (i32.add (local.get $0) (local.get $1) @@ -2624,21 +2697,21 @@ (if (i32.or (i32.eq - (local.get $3) + (local.get $2) (i32.const 0) ) (i32.or (i32.gt_u (i32.add - (local.get $3) - (i32.const 4) + (local.get $2) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -2648,14 +2721,22 @@ (unreachable) ) ) - (i32.store align=1 - (local.get $3) + (if + (i32.and + (local.get $2) + (i32.const 7) + ) + (then + (call $alignfault) + ) + ) + (f64.load (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 + (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) + (local $2 i32) + (local.set $2 (i32.add (local.get $0) (local.get $1) @@ -2664,21 +2745,21 @@ (if (i32.or (i32.eq - (local.get $3) + (local.get $2) (i32.const 0) ) (i32.or (i32.gt_u (i32.add - (local.get $3) - (i32.const 4) + (local.get $2) + (i32.const 16) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -2688,23 +2769,13 @@ (unreachable) ) ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.store align=2 - (local.get $3) + (v128.load align=1 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_4_A (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 + (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) + (local $2 i32) + (local.set $2 (i32.add (local.get $0) (local.get $1) @@ -2713,21 +2784,21 @@ (if (i32.or (i32.eq - (local.get $3) + (local.get $2) (i32.const 0) ) (i32.or (i32.gt_u (i32.add - (local.get $3) - (i32.const 4) + (local.get $2) + (i32.const 16) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -2739,21 +2810,20 @@ ) (if (i32.and - (local.get $3) - (i32.const 3) + (local.get $2) + (i32.const 1) ) (then (call $alignfault) ) ) - (i32.atomic.store - (local.get $3) + (v128.load align=2 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 + (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) + (local $2 i32) + (local.set $2 (i32.add (local.get $0) (local.get $1) @@ -2762,21 +2832,21 @@ (if (i32.or (i32.eq - (local.get $3) + (local.get $2) (i32.const 0) ) (i32.or (i32.gt_u (i32.add - (local.get $3) - (i32.const 4) + (local.get $2) + (i32.const 16) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -2788,21 +2858,20 @@ ) (if (i32.and - (local.get $3) + (local.get $2) (i32.const 3) ) (then (call $alignfault) ) ) - (i32.store - (local.get $3) + (v128.load align=4 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_1_A (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 + (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) + (local $2 i32) + (local.set $2 (i32.add (local.get $0) (local.get $1) @@ -2811,21 +2880,21 @@ (if (i32.or (i32.eq - (local.get $3) + (local.get $2) (i32.const 0) ) (i32.or (i32.gt_u (i32.add - (local.get $3) - (i32.const 1) + (local.get $2) + (i32.const 16) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -2835,14 +2904,22 @@ (unreachable) ) ) - (i64.atomic.store8 - (local.get $3) + (if + (i32.and + (local.get $2) + (i32.const 7) + ) + (then + (call $alignfault) + ) + ) + (v128.load align=8 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 + (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i32) (param $1 i32) (result v128) + (local $2 i32) + (local.set $2 (i32.add (local.get $0) (local.get $1) @@ -2851,21 +2928,21 @@ (if (i32.or (i32.eq - (local.get $3) + (local.get $2) (i32.const 0) ) (i32.or (i32.gt_u (i32.add - (local.get $3) - (i32.const 1) + (local.get $2) + (i32.const 16) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -2875,12 +2952,20 @@ (unreachable) ) ) - (i64.store8 - (local.get $3) + (if + (i32.and + (local.get $2) + (i32.const 15) + ) + (then + (call $alignfault) + ) + ) + (v128.load (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_1_A (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local.set $3 (i32.add @@ -2898,7 +2983,7 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 2) + (i32.const 1) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -2915,12 +3000,92 @@ (unreachable) ) ) - (i64.store16 align=1 + (i32.atomic.store8 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_2_A (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local.set $3 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.eq + (local.get $3) + (i32.const 0) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $3) + (i32.const 1) + ) + (i32.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i32.lt_u + (local.get $3) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (i32.store8 + (local.get $3) + (local.get $2) + ) + ) + (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local.set $3 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.eq + (local.get $3) + (i32.const 0) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $3) + (i32.const 2) + ) + (i32.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i32.lt_u + (local.get $3) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (i32.store16 align=1 + (local.get $3) + (local.get $2) + ) + ) + (func $SAFE_HEAP_STORE_i32_2_A (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local.set $3 (i32.add @@ -2964,12 +3129,12 @@ (call $alignfault) ) ) - (i64.atomic.store16 + (i32.atomic.store16 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local.set $3 (i32.add @@ -3013,12 +3178,12 @@ (call $alignfault) ) ) - (i64.store16 + (i32.store16 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local.set $3 (i32.add @@ -3053,12 +3218,12 @@ (unreachable) ) ) - (i64.store32 align=1 + (i32.store align=1 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local.set $3 (i32.add @@ -3102,12 +3267,12 @@ (call $alignfault) ) ) - (i64.store32 align=2 + (i32.store align=2 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_4_A (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_4_A (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local.set $3 (i32.add @@ -3151,12 +3316,12 @@ (call $alignfault) ) ) - (i64.atomic.store32 + (i32.atomic.store (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local.set $3 (i32.add @@ -3200,12 +3365,12 @@ (call $alignfault) ) ) - (i64.store32 + (i32.store (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i64_1_A (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -3223,7 +3388,7 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 8) + (i32.const 1) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -3240,12 +3405,12 @@ (unreachable) ) ) - (i64.store align=1 + (i64.atomic.store8 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -3263,7 +3428,7 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 8) + (i32.const 1) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -3280,21 +3445,12 @@ (unreachable) ) ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=2 + (i64.store8 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -3312,7 +3468,7 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 8) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -3329,21 +3485,12 @@ (unreachable) ) ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=4 + (i64.store16 align=1 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_8_A (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i64_2_A (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -3361,7 +3508,7 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 8) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -3381,18 +3528,18 @@ (if (i32.and (local.get $3) - (i32.const 7) + (i32.const 1) ) (then (call $alignfault) ) ) - (i64.atomic.store + (i64.atomic.store16 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -3410,7 +3557,7 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 8) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -3430,18 +3577,18 @@ (if (i32.and (local.get $3) - (i32.const 7) + (i32.const 1) ) (then (call $alignfault) ) ) - (i64.store + (i64.store16 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i32) (param $1 i32) (param $2 f32) + (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -3476,12 +3623,12 @@ (unreachable) ) ) - (f32.store align=1 + (i64.store32 align=1 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) + (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -3525,12 +3672,12 @@ (call $alignfault) ) ) - (f32.store align=2 + (i64.store32 align=2 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) + (func $SAFE_HEAP_STORE_i64_4_A (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -3574,12 +3721,12 @@ (call $alignfault) ) ) - (f32.store + (i64.atomic.store32 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) + (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -3597,7 +3744,7 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 8) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -3614,12 +3761,21 @@ (unreachable) ) ) - (f64.store align=1 + (if + (i32.and + (local.get $3) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (i64.store32 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) + (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -3654,21 +3810,12 @@ (unreachable) ) ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=2 + (i64.store align=1 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) + (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -3706,18 +3853,18 @@ (if (i32.and (local.get $3) - (i32.const 3) + (i32.const 1) ) (then (call $alignfault) ) ) - (f64.store align=4 + (i64.store align=2 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) + (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -3755,18 +3902,18 @@ (if (i32.and (local.get $3) - (i32.const 7) + (i32.const 3) ) (then (call $alignfault) ) ) - (f64.store + (i64.store align=4 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) + (func $SAFE_HEAP_STORE_i64_8_A (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -3784,7 +3931,7 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 16) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -3801,12 +3948,21 @@ (unreachable) ) ) - (v128.store align=1 + (if + (i32.and + (local.get $3) + (i32.const 7) + ) + (then + (call $alignfault) + ) + ) + (i64.atomic.store (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) + (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -3824,7 +3980,7 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 16) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -3844,18 +4000,18 @@ (if (i32.and (local.get $3) - (i32.const 1) + (i32.const 7) ) (then (call $alignfault) ) ) - (v128.store align=2 + (i64.store (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) + (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i32) (param $1 i32) (param $2 f32) (local $3 i32) (local.set $3 (i32.add @@ -3873,7 +4029,7 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 16) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -3890,21 +4046,12 @@ (unreachable) ) ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=4 + (f32.store align=1 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) + (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) (local $3 i32) (local.set $3 (i32.add @@ -3922,7 +4069,7 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 16) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -3942,18 +4089,18 @@ (if (i32.and (local.get $3) - (i32.const 7) + (i32.const 1) ) (then (call $alignfault) ) ) - (v128.store align=8 + (f32.store align=2 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) + (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) (local $3 i32) (local.set $3 (i32.add @@ -3971,7 +4118,7 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 16) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -3991,46 +4138,20 @@ (if (i32.and (local.get $3) - (i32.const 15) + (i32.const 3) ) (then (call $alignfault) ) ) - (v128.store + (f32.store (local.get $3) (local.get $2) ) ) -) -(module - (type $0 (func (param i32 i32) (result i64))) - (type $1 (func (param i32 i32 i64))) - (type $2 (func (param i32 i32) (result i32))) - (type $3 (func (param i32 i32 i32))) - (type $4 (func (param i32 i32) (result v128))) - (type $5 (func (param i32 i32 v128))) - (type $6 (func (param i32 i32) (result f64))) - (type $7 (func (param i32 i32 f64))) - (type $8 (func)) - (type $9 (func (param i32 i32) (result f32))) - (type $10 (func (param i32 i32 f32))) - (type $11 (func (result i32))) - (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i32))) - (import "env" "segfault" (func $segfault)) - (import "env" "alignfault" (func $alignfault)) - (memory $0 100 100) - (func $loads - (drop - (call $SAFE_HEAP_LOAD_i32_4_4 - (i32.const 1) - (i32.const 0) - ) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 + (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) + (local $3 i32) + (local.set $3 (i32.add (local.get $0) (local.get $1) @@ -4039,21 +4160,21 @@ (if (i32.or (i32.eq - (local.get $2) + (local.get $3) (i32.const 0) ) (i32.or (i32.gt_u (i32.add - (local.get $2) - (i32.const 1) + (local.get $3) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $2) + (local.get $3) (local.get $0) ) ) @@ -4063,13 +4184,14 @@ (unreachable) ) ) - (i32.load8_s + (f64.store align=1 + (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 + (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) + (local $3 i32) + (local.set $3 (i32.add (local.get $0) (local.get $1) @@ -4078,21 +4200,21 @@ (if (i32.or (i32.eq - (local.get $2) + (local.get $3) (i32.const 0) ) (i32.or (i32.gt_u (i32.add - (local.get $2) - (i32.const 1) + (local.get $3) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $2) + (local.get $3) (local.get $0) ) ) @@ -4102,13 +4224,23 @@ (unreachable) ) ) - (i32.load8_u + (if + (i32.and + (local.get $3) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (f64.store align=2 + (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 + (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) + (local $3 i32) + (local.set $3 (i32.add (local.get $0) (local.get $1) @@ -4117,21 +4249,21 @@ (if (i32.or (i32.eq - (local.get $2) + (local.get $3) (i32.const 0) ) (i32.or (i32.gt_u (i32.add - (local.get $2) - (i32.const 2) + (local.get $3) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $2) + (local.get $3) (local.get $0) ) ) @@ -4141,13 +4273,23 @@ (unreachable) ) ) - (i32.load16_s align=1 + (if + (i32.and + (local.get $3) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (f64.store align=4 + (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 + (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) + (local $3 i32) + (local.set $3 (i32.add (local.get $0) (local.get $1) @@ -4156,21 +4298,21 @@ (if (i32.or (i32.eq - (local.get $2) + (local.get $3) (i32.const 0) ) (i32.or (i32.gt_u (i32.add - (local.get $2) - (i32.const 2) + (local.get $3) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $2) + (local.get $3) (local.get $0) ) ) @@ -4182,20 +4324,21 @@ ) (if (i32.and - (local.get $2) - (i32.const 1) + (local.get $3) + (i32.const 7) ) (then (call $alignfault) ) ) - (i32.load16_s + (f64.store + (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 + (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) + (local $3 i32) + (local.set $3 (i32.add (local.get $0) (local.get $1) @@ -4204,21 +4347,21 @@ (if (i32.or (i32.eq - (local.get $2) + (local.get $3) (i32.const 0) ) (i32.or (i32.gt_u (i32.add - (local.get $2) - (i32.const 2) + (local.get $3) + (i32.const 16) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $2) + (local.get $3) (local.get $0) ) ) @@ -4228,13 +4371,14 @@ (unreachable) ) ) - (i32.load16_u align=1 + (v128.store align=1 + (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 + (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) + (local $3 i32) + (local.set $3 (i32.add (local.get $0) (local.get $1) @@ -4243,21 +4387,21 @@ (if (i32.or (i32.eq - (local.get $2) + (local.get $3) (i32.const 0) ) (i32.or (i32.gt_u (i32.add - (local.get $2) - (i32.const 2) + (local.get $3) + (i32.const 16) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $2) + (local.get $3) (local.get $0) ) ) @@ -4269,20 +4413,21 @@ ) (if (i32.and - (local.get $2) + (local.get $3) (i32.const 1) ) (then (call $alignfault) ) ) - (i32.load16_u + (v128.store align=2 + (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 + (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) + (local $3 i32) + (local.set $3 (i32.add (local.get $0) (local.get $1) @@ -4291,21 +4436,21 @@ (if (i32.or (i32.eq - (local.get $2) + (local.get $3) (i32.const 0) ) (i32.or (i32.gt_u (i32.add - (local.get $2) - (i32.const 4) + (local.get $3) + (i32.const 16) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $2) + (local.get $3) (local.get $0) ) ) @@ -4315,13 +4460,23 @@ (unreachable) ) ) - (i32.load align=1 + (if + (i32.and + (local.get $3) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (v128.store align=4 + (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 + (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) + (local $3 i32) + (local.set $3 (i32.add (local.get $0) (local.get $1) @@ -4330,21 +4485,21 @@ (if (i32.or (i32.eq - (local.get $2) + (local.get $3) (i32.const 0) ) (i32.or (i32.gt_u (i32.add - (local.get $2) - (i32.const 4) + (local.get $3) + (i32.const 16) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $2) + (local.get $3) (local.get $0) ) ) @@ -4356,20 +4511,21 @@ ) (if (i32.and - (local.get $2) - (i32.const 1) + (local.get $3) + (i32.const 7) ) (then (call $alignfault) ) ) - (i32.load align=2 + (v128.store align=8 + (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 + (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) + (local $3 i32) + (local.set $3 (i32.add (local.get $0) (local.get $1) @@ -4378,21 +4534,21 @@ (if (i32.or (i32.eq - (local.get $2) + (local.get $3) (i32.const 0) ) (i32.or (i32.gt_u (i32.add - (local.get $2) - (i32.const 4) + (local.get $3) + (i32.const 16) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $2) + (local.get $3) (local.get $0) ) ) @@ -4404,18 +4560,45 @@ ) (if (i32.and - (local.get $2) - (i32.const 3) + (local.get $3) + (i32.const 15) ) (then (call $alignfault) ) ) - (i32.load + (v128.store + (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) +) +(module + (type $0 (func (param i32 i32) (result i64))) + (type $1 (func (param i32 i32 i64))) + (type $2 (func (param i32 i32) (result i32))) + (type $3 (func (param i32 i32 i32))) + (type $4 (func (param i32 i32) (result v128))) + (type $5 (func (param i32 i32 v128))) + (type $6 (func (param i32 i32) (result f64))) + (type $7 (func (param i32 i32 f64))) + (type $8 (func)) + (type $9 (func (param i32 i32) (result f32))) + (type $10 (func (param i32 i32 f32))) + (type $11 (func (result i32))) + (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i32))) + (import "env" "segfault" (func $segfault)) + (import "env" "alignfault" (func $alignfault)) + (memory $0 100 100) + (func $loads + (drop + (call $SAFE_HEAP_LOAD_i32_4_4 + (i32.const 1) + (i32.const 0) + ) + ) + ) + (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -4450,11 +4633,11 @@ (unreachable) ) ) - (i64.load8_s + (i32.load8_s (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -4489,11 +4672,11 @@ (unreachable) ) ) - (i64.load8_u + (i32.load8_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -4528,11 +4711,11 @@ (unreachable) ) ) - (i64.load16_s align=1 + (i32.load16_s align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -4576,11 +4759,11 @@ (call $alignfault) ) ) - (i64.load16_s + (i32.load16_s (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -4615,11 +4798,11 @@ (unreachable) ) ) - (i64.load16_u align=1 + (i32.load16_u align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -4663,11 +4846,11 @@ (call $alignfault) ) ) - (i64.load16_u + (i32.load16_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -4702,11 +4885,11 @@ (unreachable) ) ) - (i64.load32_s align=1 + (i32.load align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -4750,11 +4933,11 @@ (call $alignfault) ) ) - (i64.load32_s align=2 + (i32.load align=2 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -4798,11 +4981,11 @@ (call $alignfault) ) ) - (i64.load32_s + (i32.load (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -4820,7 +5003,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 4) + (i32.const 1) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -4837,11 +5020,11 @@ (unreachable) ) ) - (i64.load32_u align=1 + (i64.load8_s (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -4859,7 +5042,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 4) + (i32.const 1) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -4876,20 +5059,50 @@ (unreachable) ) ) + (i64.load8_u + (local.get $2) + ) + ) + (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) + (local $2 i32) + (local.set $2 + (i32.add + (local.get $0) + (local.get $1) + ) + ) (if - (i32.and - (local.get $2) - (i32.const 1) + (i32.or + (i32.eq + (local.get $2) + (i32.const 0) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $2) + (i32.const 2) + ) + (i32.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i32.lt_u + (local.get $2) + (local.get $0) + ) + ) ) (then - (call $alignfault) + (call $segfault) + (unreachable) ) ) - (i64.load32_u align=2 + (i64.load16_s align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -4907,7 +5120,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 4) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -4927,17 +5140,17 @@ (if (i32.and (local.get $2) - (i32.const 3) + (i32.const 1) ) (then (call $alignfault) ) ) - (i64.load32_u + (i64.load16_s (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -4955,7 +5168,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 8) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -4972,11 +5185,11 @@ (unreachable) ) ) - (i64.load align=1 + (i64.load16_u align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -4994,7 +5207,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 8) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -5020,11 +5233,11 @@ (call $alignfault) ) ) - (i64.load align=2 + (i64.load16_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -5042,7 +5255,46 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 8) + (i32.const 4) + ) + (i32.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i32.lt_u + (local.get $2) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (i64.load32_s align=1 + (local.get $2) + ) + ) + (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) + (local $2 i32) + (local.set $2 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.eq + (local.get $2) + (i32.const 0) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $2) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -5062,17 +5314,17 @@ (if (i32.and (local.get $2) - (i32.const 3) + (i32.const 1) ) (then (call $alignfault) ) ) - (i64.load align=4 + (i64.load32_s align=2 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -5090,7 +5342,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 8) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -5110,17 +5362,17 @@ (if (i32.and (local.get $2) - (i32.const 7) + (i32.const 3) ) (then (call $alignfault) ) ) - (i64.load + (i64.load32_s (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) + (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -5155,11 +5407,11 @@ (unreachable) ) ) - (f32.load align=1 + (i64.load32_u align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) + (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -5203,11 +5455,11 @@ (call $alignfault) ) ) - (f32.load align=2 + (i64.load32_u align=2 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) + (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -5251,11 +5503,11 @@ (call $alignfault) ) ) - (f32.load + (i64.load32_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) + (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -5290,11 +5542,11 @@ (unreachable) ) ) - (f64.load align=1 + (i64.load align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) + (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -5338,11 +5590,11 @@ (call $alignfault) ) ) - (f64.load align=2 + (i64.load align=2 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) + (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -5386,11 +5638,11 @@ (call $alignfault) ) ) - (f64.load align=4 + (i64.load align=4 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) + (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -5434,11 +5686,11 @@ (call $alignfault) ) ) - (f64.load + (i64.load (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) + (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) (local $2 i32) (local.set $2 (i32.add @@ -5456,7 +5708,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 16) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -5473,11 +5725,11 @@ (unreachable) ) ) - (v128.load align=1 + (f32.load align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) + (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) (local $2 i32) (local.set $2 (i32.add @@ -5495,7 +5747,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 16) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -5521,11 +5773,11 @@ (call $alignfault) ) ) - (v128.load align=2 + (f32.load align=2 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) + (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) (local $2 i32) (local.set $2 (i32.add @@ -5543,7 +5795,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 16) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -5569,11 +5821,11 @@ (call $alignfault) ) ) - (v128.load align=4 + (f32.load (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) + (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) (local $2 i32) (local.set $2 (i32.add @@ -5591,7 +5843,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 16) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -5608,20 +5860,11 @@ (unreachable) ) ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=8 + (f64.load align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i32) (param $1 i32) (result v128) + (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) (local $2 i32) (local.set $2 (i32.add @@ -5639,7 +5882,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 16) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -5659,19 +5902,19 @@ (if (i32.and (local.get $2) - (i32.const 15) + (i32.const 1) ) (then (call $alignfault) ) ) - (v128.load + (f64.load align=2 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 + (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) + (local $2 i32) + (local.set $2 (i32.add (local.get $0) (local.get $1) @@ -5680,21 +5923,21 @@ (if (i32.or (i32.eq - (local.get $3) + (local.get $2) (i32.const 0) ) (i32.or (i32.gt_u (i32.add - (local.get $3) - (i32.const 1) + (local.get $2) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -5704,14 +5947,22 @@ (unreachable) ) ) - (i32.store8 - (local.get $3) + (if + (i32.and + (local.get $2) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (f64.load align=4 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 + (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) + (local $2 i32) + (local.set $2 (i32.add (local.get $0) (local.get $1) @@ -5720,21 +5971,21 @@ (if (i32.or (i32.eq - (local.get $3) + (local.get $2) (i32.const 0) ) (i32.or (i32.gt_u (i32.add - (local.get $3) - (i32.const 2) + (local.get $2) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -5744,14 +5995,22 @@ (unreachable) ) ) - (i32.store16 align=1 - (local.get $3) + (if + (i32.and + (local.get $2) + (i32.const 7) + ) + (then + (call $alignfault) + ) + ) + (f64.load (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 + (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) + (local $2 i32) + (local.set $2 (i32.add (local.get $0) (local.get $1) @@ -5760,21 +6019,60 @@ (if (i32.or (i32.eq - (local.get $3) + (local.get $2) (i32.const 0) ) (i32.or (i32.gt_u (i32.add - (local.get $3) - (i32.const 2) + (local.get $2) + (i32.const 16) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $3) + (local.get $2) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (v128.load align=1 + (local.get $2) + ) + ) + (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) + (local $2 i32) + (local.set $2 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.eq + (local.get $2) + (i32.const 0) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $2) + (i32.const 16) + ) + (i32.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i32.lt_u + (local.get $2) (local.get $0) ) ) @@ -5786,21 +6084,20 @@ ) (if (i32.and - (local.get $3) + (local.get $2) (i32.const 1) ) (then (call $alignfault) ) ) - (i32.store16 - (local.get $3) + (v128.load align=2 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 + (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) + (local $2 i32) + (local.set $2 (i32.add (local.get $0) (local.get $1) @@ -5809,21 +6106,21 @@ (if (i32.or (i32.eq - (local.get $3) + (local.get $2) (i32.const 0) ) (i32.or (i32.gt_u (i32.add - (local.get $3) - (i32.const 4) + (local.get $2) + (i32.const 16) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -5833,14 +6130,22 @@ (unreachable) ) ) - (i32.store align=1 - (local.get $3) + (if + (i32.and + (local.get $2) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (v128.load align=4 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 + (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) + (local $2 i32) + (local.set $2 (i32.add (local.get $0) (local.get $1) @@ -5849,21 +6154,21 @@ (if (i32.or (i32.eq - (local.get $3) + (local.get $2) (i32.const 0) ) (i32.or (i32.gt_u (i32.add - (local.get $3) - (i32.const 4) + (local.get $2) + (i32.const 16) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -5875,21 +6180,20 @@ ) (if (i32.and - (local.get $3) - (i32.const 1) + (local.get $2) + (i32.const 7) ) (then (call $alignfault) ) ) - (i32.store align=2 - (local.get $3) + (v128.load align=8 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 + (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i32) (param $1 i32) (result v128) + (local $2 i32) + (local.set $2 (i32.add (local.get $0) (local.get $1) @@ -5898,21 +6202,21 @@ (if (i32.or (i32.eq - (local.get $3) + (local.get $2) (i32.const 0) ) (i32.or (i32.gt_u (i32.add - (local.get $3) - (i32.const 4) + (local.get $2) + (i32.const 16) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -5924,19 +6228,18 @@ ) (if (i32.and - (local.get $3) - (i32.const 3) + (local.get $2) + (i32.const 15) ) (then (call $alignfault) ) ) - (i32.store - (local.get $3) + (v128.load (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local.set $3 (i32.add @@ -5971,12 +6274,12 @@ (unreachable) ) ) - (i64.store8 + (i32.store8 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local.set $3 (i32.add @@ -6011,12 +6314,12 @@ (unreachable) ) ) - (i64.store16 align=1 + (i32.store16 align=1 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local.set $3 (i32.add @@ -6060,12 +6363,12 @@ (call $alignfault) ) ) - (i64.store16 + (i32.store16 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local.set $3 (i32.add @@ -6100,12 +6403,12 @@ (unreachable) ) ) - (i64.store32 align=1 + (i32.store align=1 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local.set $3 (i32.add @@ -6149,12 +6452,12 @@ (call $alignfault) ) ) - (i64.store32 align=2 + (i32.store align=2 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local.set $3 (i32.add @@ -6198,12 +6501,12 @@ (call $alignfault) ) ) - (i64.store32 + (i32.store (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -6221,7 +6524,7 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 8) + (i32.const 1) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -6238,12 +6541,12 @@ (unreachable) ) ) - (i64.store align=1 + (i64.store8 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -6261,7 +6564,7 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 8) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -6278,21 +6581,12 @@ (unreachable) ) ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=2 + (i64.store16 align=1 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -6310,7 +6604,7 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 8) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -6330,18 +6624,18 @@ (if (i32.and (local.get $3) - (i32.const 3) + (i32.const 1) ) (then (call $alignfault) ) ) - (i64.store align=4 + (i64.store16 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -6359,7 +6653,7 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 8) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -6376,21 +6670,12 @@ (unreachable) ) ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.store + (i64.store32 align=1 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i32) (param $1 i32) (param $2 f32) + (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -6425,12 +6710,21 @@ (unreachable) ) ) - (f32.store align=1 + (if + (i32.and + (local.get $3) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i64.store32 align=2 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) + (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -6468,18 +6762,18 @@ (if (i32.and (local.get $3) - (i32.const 1) + (i32.const 3) ) (then (call $alignfault) ) ) - (f32.store align=2 + (i64.store32 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) + (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -6497,7 +6791,7 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 4) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -6514,21 +6808,12 @@ (unreachable) ) ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f32.store + (i64.store align=1 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) + (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -6563,12 +6848,21 @@ (unreachable) ) ) - (f64.store align=1 - (local.get $3) - (local.get $2) + (if + (i32.and + (local.get $3) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i64.store align=2 + (local.get $3) + (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) + (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -6606,18 +6900,18 @@ (if (i32.and (local.get $3) - (i32.const 1) + (i32.const 3) ) (then (call $alignfault) ) ) - (f64.store align=2 + (i64.store align=4 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) + (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -6655,18 +6949,18 @@ (if (i32.and (local.get $3) - (i32.const 3) + (i32.const 7) ) (then (call $alignfault) ) ) - (f64.store align=4 + (i64.store (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) + (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i32) (param $1 i32) (param $2 f32) (local $3 i32) (local.set $3 (i32.add @@ -6684,7 +6978,47 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 8) + (i32.const 4) + ) + (i32.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i32.lt_u + (local.get $3) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (f32.store align=1 + (local.get $3) + (local.get $2) + ) + ) + (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) + (local $3 i32) + (local.set $3 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.eq + (local.get $3) + (i32.const 0) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $3) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -6704,18 +7038,18 @@ (if (i32.and (local.get $3) - (i32.const 7) + (i32.const 1) ) (then (call $alignfault) ) ) - (f64.store + (f32.store align=2 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) + (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) (local $3 i32) (local.set $3 (i32.add @@ -6733,7 +7067,7 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 16) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -6750,12 +7084,21 @@ (unreachable) ) ) - (v128.store align=1 + (if + (i32.and + (local.get $3) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (f32.store (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) + (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) (local $3 i32) (local.set $3 (i32.add @@ -6773,7 +7116,47 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 16) + (i32.const 8) + ) + (i32.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i32.lt_u + (local.get $3) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (f64.store align=1 + (local.get $3) + (local.get $2) + ) + ) + (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) + (local $3 i32) + (local.set $3 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.eq + (local.get $3) + (i32.const 0) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $3) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -6799,12 +7182,12 @@ (call $alignfault) ) ) - (v128.store align=2 + (f64.store align=2 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) + (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) (local $3 i32) (local.set $3 (i32.add @@ -6822,7 +7205,7 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 16) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -6848,12 +7231,101 @@ (call $alignfault) ) ) - (v128.store align=4 + (f64.store align=4 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) + (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) + (local $3 i32) + (local.set $3 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.eq + (local.get $3) + (i32.const 0) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $3) + (i32.const 8) + ) + (i32.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i32.lt_u + (local.get $3) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (if + (i32.and + (local.get $3) + (i32.const 7) + ) + (then + (call $alignfault) + ) + ) + (f64.store + (local.get $3) + (local.get $2) + ) + ) + (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) + (local $3 i32) + (local.set $3 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.eq + (local.get $3) + (i32.const 0) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $3) + (i32.const 16) + ) + (i32.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i32.lt_u + (local.get $3) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (v128.store align=1 + (local.get $3) + (local.get $2) + ) + ) + (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) (local $3 i32) (local.set $3 (i32.add @@ -6870,15 +7342,575 @@ (i32.or (i32.gt_u (i32.add - (local.get $3) - (i32.const 16) + (local.get $3) + (i32.const 16) + ) + (i32.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i32.lt_u + (local.get $3) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (if + (i32.and + (local.get $3) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (v128.store align=2 + (local.get $3) + (local.get $2) + ) + ) + (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) + (local $3 i32) + (local.set $3 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.eq + (local.get $3) + (i32.const 0) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $3) + (i32.const 16) + ) + (i32.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i32.lt_u + (local.get $3) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (if + (i32.and + (local.get $3) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (v128.store align=4 + (local.get $3) + (local.get $2) + ) + ) + (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) + (local $3 i32) + (local.set $3 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.eq + (local.get $3) + (i32.const 0) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $3) + (i32.const 16) + ) + (i32.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i32.lt_u + (local.get $3) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (if + (i32.and + (local.get $3) + (i32.const 7) + ) + (then + (call $alignfault) + ) + ) + (v128.store align=8 + (local.get $3) + (local.get $2) + ) + ) + (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) + (local $3 i32) + (local.set $3 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.eq + (local.get $3) + (i32.const 0) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $3) + (i32.const 16) + ) + (i32.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i32.lt_u + (local.get $3) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (if + (i32.and + (local.get $3) + (i32.const 15) + ) + (then + (call $alignfault) + ) + ) + (v128.store + (local.get $3) + (local.get $2) + ) + ) +) +(module + (type $0 (func (param i32 i32) (result i64))) + (type $1 (func (param i32 i32) (result i32))) + (type $2 (func (param i32 i32 i64))) + (type $3 (func (param i32 i32 i32))) + (type $4 (func (param i32 i32) (result v128))) + (type $5 (func (param i32 i32 v128))) + (type $6 (func (param i32 i32) (result f64))) + (type $7 (func (param i32 i32 f64))) + (type $FUNCSIG$v (func)) + (type $9 (func (param i32 i32) (result f32))) + (type $10 (func (param i32 i32 f32))) + (type $11 (func (result i32))) + (import "env" "segfault" (func $segfault)) + (import "env" "alignfault" (func $alignfault)) + (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i32))) + (memory $0 100 100 shared) + (func $actions + (drop + (call $SAFE_HEAP_LOAD_i32_4_4 + (i32.const 1) + (i32.const 0) + ) + ) + (call $SAFE_HEAP_STORE_i32_4_4 + (i32.const 1) + (i32.const 0) + (i32.const 100) + ) + ) + (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local.set $2 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.eq + (local.get $2) + (i32.const 0) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $2) + (i32.const 1) + ) + (i32.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i32.lt_u + (local.get $2) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (i32.load8_s + (local.get $2) + ) + ) + (func $SAFE_HEAP_LOAD_i32_1_AR (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local.set $2 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.eq + (local.get $2) + (i32.const 0) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $2) + (i32.const 1) + ) + (i32.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i32.lt_u + (local.get $2) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (i32.shr_s + (i32.shl + (i32.atomic.load8_u acqrel + (local.get $2) + ) + (i32.const 24) + ) + (i32.const 24) + ) + ) + (func $SAFE_HEAP_LOAD_i32_1_SC (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local.set $2 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.eq + (local.get $2) + (i32.const 0) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $2) + (i32.const 1) + ) + (i32.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i32.lt_u + (local.get $2) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (i32.shr_s + (i32.shl + (i32.atomic.load8_u + (local.get $2) + ) + (i32.const 24) + ) + (i32.const 24) + ) + ) + (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local.set $2 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.eq + (local.get $2) + (i32.const 0) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $2) + (i32.const 1) + ) + (i32.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i32.lt_u + (local.get $2) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (i32.load8_u + (local.get $2) + ) + ) + (func $SAFE_HEAP_LOAD_i32_1_U_AR (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local.set $2 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.eq + (local.get $2) + (i32.const 0) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $2) + (i32.const 1) + ) + (i32.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i32.lt_u + (local.get $2) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (i32.atomic.load8_u acqrel + (local.get $2) + ) + ) + (func $SAFE_HEAP_LOAD_i32_1_U_SC (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local.set $2 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.eq + (local.get $2) + (i32.const 0) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $2) + (i32.const 1) + ) + (i32.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i32.lt_u + (local.get $2) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (i32.atomic.load8_u + (local.get $2) + ) + ) + (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local.set $2 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.eq + (local.get $2) + (i32.const 0) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $2) + (i32.const 2) + ) + (i32.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i32.lt_u + (local.get $2) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (i32.load16_s align=1 + (local.get $2) + ) + ) + (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local.set $2 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.eq + (local.get $2) + (i32.const 0) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $2) + (i32.const 2) + ) + (i32.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i32.lt_u + (local.get $2) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (if + (i32.and + (local.get $2) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i32.load16_s + (local.get $2) + ) + ) + (func $SAFE_HEAP_LOAD_i32_2_AR (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local.set $2 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.eq + (local.get $2) + (i32.const 0) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $2) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -6890,21 +7922,26 @@ ) (if (i32.and - (local.get $3) - (i32.const 7) + (local.get $2) + (i32.const 1) ) (then (call $alignfault) ) ) - (v128.store align=8 - (local.get $3) - (local.get $2) + (i32.shr_s + (i32.shl + (i32.atomic.load16_u acqrel + (local.get $2) + ) + (i32.const 16) + ) + (i32.const 16) ) ) - (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 + (func $SAFE_HEAP_LOAD_i32_2_SC (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local.set $2 (i32.add (local.get $0) (local.get $1) @@ -6913,21 +7950,21 @@ (if (i32.or (i32.eq - (local.get $3) + (local.get $2) (i32.const 0) ) (i32.or (i32.gt_u (i32.add - (local.get $3) - (i32.const 16) + (local.get $2) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -6939,50 +7976,24 @@ ) (if (i32.and - (local.get $3) - (i32.const 15) + (local.get $2) + (i32.const 1) ) (then (call $alignfault) ) ) - (v128.store - (local.get $3) - (local.get $2) - ) - ) -) -(module - (type $0 (func (param i32 i32) (result i64))) - (type $1 (func (param i32 i32) (result i32))) - (type $2 (func (param i32 i32 i64))) - (type $3 (func (param i32 i32 i32))) - (type $4 (func (param i32 i32) (result v128))) - (type $5 (func (param i32 i32 v128))) - (type $6 (func (param i32 i32) (result f64))) - (type $7 (func (param i32 i32 f64))) - (type $FUNCSIG$v (func)) - (type $9 (func (param i32 i32) (result f32))) - (type $10 (func (param i32 i32 f32))) - (type $11 (func (result i32))) - (import "env" "segfault" (func $segfault)) - (import "env" "alignfault" (func $alignfault)) - (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i32))) - (memory $0 100 100 shared) - (func $actions - (drop - (call $SAFE_HEAP_LOAD_i32_4_4 - (i32.const 1) - (i32.const 0) + (i32.shr_s + (i32.shl + (i32.atomic.load16_u + (local.get $2) + ) + (i32.const 16) ) - ) - (call $SAFE_HEAP_STORE_i32_4_4 - (i32.const 1) - (i32.const 0) - (i32.const 100) + (i32.const 16) ) ) - (func $SAFE_HEAP_LOAD_i32_1_A (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -7000,7 +8011,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 1) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -7017,17 +8028,11 @@ (unreachable) ) ) - (i32.shr_s - (i32.shl - (i32.atomic.load8_u - (local.get $2) - ) - (i32.const 24) - ) - (i32.const 24) + (i32.load16_u align=1 + (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -7045,7 +8050,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 1) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -7062,11 +8067,20 @@ (unreachable) ) ) - (i32.load8_s + (if + (i32.and + (local.get $2) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i32.load16_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_1_U_A (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_2_U_AR (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -7084,7 +8098,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 1) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -7101,11 +8115,20 @@ (unreachable) ) ) - (i32.atomic.load8_u + (if + (i32.and + (local.get $2) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i32.atomic.load16_u acqrel (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_2_U_SC (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -7123,7 +8146,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 1) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -7140,11 +8163,20 @@ (unreachable) ) ) - (i32.load8_u + (if + (i32.and + (local.get $2) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i32.atomic.load16_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -7162,7 +8194,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 2) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -7179,11 +8211,11 @@ (unreachable) ) ) - (i32.load16_s align=1 + (i32.load align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_A (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -7201,7 +8233,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 2) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -7227,17 +8259,11 @@ (call $alignfault) ) ) - (i32.shr_s - (i32.shl - (i32.atomic.load16_u - (local.get $2) - ) - (i32.const 16) - ) - (i32.const 16) + (i32.load align=2 + (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -7255,7 +8281,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 2) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -7275,17 +8301,17 @@ (if (i32.and (local.get $2) - (i32.const 1) + (i32.const 3) ) (then (call $alignfault) ) ) - (i32.load16_s + (i32.load (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_4_AR (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -7303,7 +8329,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 2) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -7320,11 +8346,20 @@ (unreachable) ) ) - (i32.load16_u align=1 + (if + (i32.and + (local.get $2) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (i32.atomic.load acqrel (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_U_A (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_4_SC (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -7342,7 +8377,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 2) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -7362,17 +8397,17 @@ (if (i32.and (local.get $2) - (i32.const 1) + (i32.const 3) ) (then (call $alignfault) ) ) - (i32.atomic.load16_u + (i32.atomic.load (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -7390,7 +8425,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 2) + (i32.const 1) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -7407,20 +8442,11 @@ (unreachable) ) ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_u + (i64.load8_s (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i64_1_AR (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -7438,7 +8464,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 4) + (i32.const 1) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -7455,11 +8481,17 @@ (unreachable) ) ) - (i32.load align=1 - (local.get $2) + (i64.shr_s + (i64.shl + (i64.atomic.load8_u acqrel + (local.get $2) + ) + (i64.const 56) + ) + (i64.const 56) ) ) - (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i64_1_SC (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -7477,7 +8509,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 4) + (i32.const 1) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -7494,20 +8526,56 @@ (unreachable) ) ) + (i64.shr_s + (i64.shl + (i64.atomic.load8_u + (local.get $2) + ) + (i64.const 56) + ) + (i64.const 56) + ) + ) + (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) + (local $2 i32) + (local.set $2 + (i32.add + (local.get $0) + (local.get $1) + ) + ) (if - (i32.and - (local.get $2) - (i32.const 1) + (i32.or + (i32.eq + (local.get $2) + (i32.const 0) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $2) + (i32.const 1) + ) + (i32.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i32.lt_u + (local.get $2) + (local.get $0) + ) + ) ) (then - (call $alignfault) + (call $segfault) + (unreachable) ) ) - (i32.load align=2 + (i64.load8_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_4_A (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i64_1_U_AR (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -7525,7 +8593,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 4) + (i32.const 1) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -7542,20 +8610,11 @@ (unreachable) ) ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load + (i64.atomic.load8_u acqrel (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i64_1_U_SC (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -7573,7 +8632,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 4) + (i32.const 1) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -7590,20 +8649,11 @@ (unreachable) ) ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.load + (i64.atomic.load8_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_1_A (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -7621,7 +8671,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 1) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -7638,17 +8688,11 @@ (unreachable) ) ) - (i64.shr_s - (i64.shl - (i64.atomic.load8_u - (local.get $2) - ) - (i64.const 56) - ) - (i64.const 56) + (i64.load16_s align=1 + (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -7666,7 +8710,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 1) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -7683,11 +8727,20 @@ (unreachable) ) ) - (i64.load8_s + (if + (i32.and + (local.get $2) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i64.load16_s (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_1_U_A (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_AR (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -7705,7 +8758,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 1) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -7722,11 +8775,26 @@ (unreachable) ) ) - (i64.atomic.load8_u - (local.get $2) + (if + (i32.and + (local.get $2) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i64.shr_s + (i64.shl + (i64.atomic.load16_u acqrel + (local.get $2) + ) + (i64.const 48) + ) + (i64.const 48) ) ) - (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_SC (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -7744,7 +8812,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 1) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -7761,11 +8829,26 @@ (unreachable) ) ) - (i64.load8_u - (local.get $2) + (if + (i32.and + (local.get $2) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i64.shr_s + (i64.shl + (i64.atomic.load16_u + (local.get $2) + ) + (i64.const 48) + ) + (i64.const 48) ) ) - (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -7800,11 +8883,11 @@ (unreachable) ) ) - (i64.load16_s align=1 + (i64.load16_u align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_A (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -7848,17 +8931,11 @@ (call $alignfault) ) ) - (i64.shr_s - (i64.shl - (i64.atomic.load16_u - (local.get $2) - ) - (i64.const 48) - ) - (i64.const 48) + (i64.load16_u + (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_U_AR (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -7902,11 +8979,11 @@ (call $alignfault) ) ) - (i64.load16_s + (i64.atomic.load16_u acqrel (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_U_SC (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -7941,11 +9018,20 @@ (unreachable) ) ) - (i64.load16_u align=1 + (if + (i32.and + (local.get $2) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i64.atomic.load16_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_U_A (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -7963,7 +9049,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 2) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -7980,20 +9066,11 @@ (unreachable) ) ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load16_u + (i64.load32_s align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -8011,7 +9088,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 2) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -8037,11 +9114,11 @@ (call $alignfault) ) ) - (i64.load16_u + (i64.load32_s align=2 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -8076,11 +9153,20 @@ (unreachable) ) ) - (i64.load32_s align=1 + (if + (i32.and + (local.get $2) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (i64.load32_s (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_AR (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -8118,17 +9204,23 @@ (if (i32.and (local.get $2) - (i32.const 1) + (i32.const 3) ) (then (call $alignfault) ) ) - (i64.load32_s align=2 - (local.get $2) + (i64.shr_s + (i64.shl + (i64.atomic.load32_u acqrel + (local.get $2) + ) + (i64.const 32) + ) + (i64.const 32) ) ) - (func $SAFE_HEAP_LOAD_i64_4_A (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_SC (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -8182,7 +9274,7 @@ (i64.const 32) ) ) - (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -8217,20 +9309,11 @@ (unreachable) ) ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s + (i64.load32_u align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -8265,11 +9348,20 @@ (unreachable) ) ) - (i64.load32_u align=1 + (if + (i32.and + (local.get $2) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i64.load32_u align=2 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -8307,17 +9399,17 @@ (if (i32.and (local.get $2) - (i32.const 1) + (i32.const 3) ) (then (call $alignfault) ) ) - (i64.load32_u align=2 + (i64.load32_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_U_A (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_U_AR (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -8361,11 +9453,11 @@ (call $alignfault) ) ) - (i64.atomic.load32_u + (i64.atomic.load32_u acqrel (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_U_SC (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -8409,7 +9501,7 @@ (call $alignfault) ) ) - (i64.load32_u + (i64.atomic.load32_u (local.get $2) ) ) @@ -8548,7 +9640,7 @@ (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_8_A (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -8592,11 +9684,11 @@ (call $alignfault) ) ) - (i64.atomic.load + (i64.load (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_8_AR (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -8640,7 +9732,55 @@ (call $alignfault) ) ) - (i64.load + (i64.atomic.load acqrel + (local.get $2) + ) + ) + (func $SAFE_HEAP_LOAD_i64_8_SC (param $0 i32) (param $1 i32) (result i64) + (local $2 i32) + (local.set $2 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.eq + (local.get $2) + (i32.const 0) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $2) + (i32.const 8) + ) + (i32.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i32.lt_u + (local.get $2) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (if + (i32.and + (local.get $2) + (i32.const 7) + ) + (then + (call $alignfault) + ) + ) + (i64.atomic.load (local.get $2) ) ) diff --git a/test/passes/safe-heap_enable-threads_enable-simd64.txt b/test/passes/safe-heap_enable-threads_enable-simd64.txt index 38482cd7d1c..7efa45937ee 100644 --- a/test/passes/safe-heap_enable-threads_enable-simd64.txt +++ b/test/passes/safe-heap_enable-threads_enable-simd64.txt @@ -23,7 +23,7 @@ ) ) (drop - (call $SAFE_HEAP_LOAD_i32_4_A + (call $SAFE_HEAP_LOAD_i32_4_SC (i64.const 1) (i64.const 0) ) @@ -184,7 +184,7 @@ (v128.const i32x4 0x00000001 0x00000002 0x00000003 0x00000004) ) ) - (func $SAFE_HEAP_LOAD_i32_1_A (param $0 i64) (param $1 i64) (result i32) + (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i64) (param $1 i64) (result i32) (local $2 i64) (local.set $2 (i64.add @@ -219,17 +219,11 @@ (unreachable) ) ) - (i32.shr_s - (i32.shl - (i32.atomic.load8_u - (local.get $2) - ) - (i32.const 24) - ) - (i32.const 24) + (i32.load8_s + (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i64) (param $1 i64) (result i32) + (func $SAFE_HEAP_LOAD_i32_1_AR (param $0 i64) (param $1 i64) (result i32) (local $2 i64) (local.set $2 (i64.add @@ -264,11 +258,17 @@ (unreachable) ) ) - (i32.load8_s - (local.get $2) + (i32.shr_s + (i32.shl + (i32.atomic.load8_u acqrel + (local.get $2) + ) + (i32.const 24) + ) + (i32.const 24) ) ) - (func $SAFE_HEAP_LOAD_i32_1_U_A (param $0 i64) (param $1 i64) (result i32) + (func $SAFE_HEAP_LOAD_i32_1_SC (param $0 i64) (param $1 i64) (result i32) (local $2 i64) (local.set $2 (i64.add @@ -303,8 +303,14 @@ (unreachable) ) ) - (i32.atomic.load8_u - (local.get $2) + (i32.shr_s + (i32.shl + (i32.atomic.load8_u + (local.get $2) + ) + (i32.const 24) + ) + (i32.const 24) ) ) (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i64) (param $1 i64) (result i32) @@ -346,7 +352,7 @@ (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i64) (param $1 i64) (result i32) + (func $SAFE_HEAP_LOAD_i32_1_U_AR (param $0 i64) (param $1 i64) (result i32) (local $2 i64) (local.set $2 (i64.add @@ -364,7 +370,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 2) + (i64.const 1) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -381,11 +387,11 @@ (unreachable) ) ) - (i32.load16_s align=1 + (i32.atomic.load8_u acqrel (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_A (param $0 i64) (param $1 i64) (result i32) + (func $SAFE_HEAP_LOAD_i32_1_U_SC (param $0 i64) (param $1 i64) (result i32) (local $2 i64) (local.set $2 (i64.add @@ -403,7 +409,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 2) + (i64.const 1) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -420,28 +426,11 @@ (unreachable) ) ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load16_u - (local.get $2) - ) - (i32.const 16) - ) - (i32.const 16) + (i32.atomic.load8_u + (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i64) (param $1 i64) (result i32) + (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i64) (param $1 i64) (result i32) (local $2 i64) (local.set $2 (i64.add @@ -476,22 +465,11 @@ (unreachable) ) ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_s + (i32.load16_s align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i64) (param $1 i64) (result i32) + (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i64) (param $1 i64) (result i32) (local $2 i64) (local.set $2 (i64.add @@ -526,11 +504,22 @@ (unreachable) ) ) - (i32.load16_u align=1 + (if + (i32.and + (i32.wrap_i64 + (local.get $2) + ) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i32.load16_s (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_U_A (param $0 i64) (param $1 i64) (result i32) + (func $SAFE_HEAP_LOAD_i32_2_AR (param $0 i64) (param $1 i64) (result i32) (local $2 i64) (local.set $2 (i64.add @@ -576,11 +565,17 @@ (call $alignfault) ) ) - (i32.atomic.load16_u - (local.get $2) + (i32.shr_s + (i32.shl + (i32.atomic.load16_u acqrel + (local.get $2) + ) + (i32.const 16) + ) + (i32.const 16) ) ) - (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i64) (param $1 i64) (result i32) + (func $SAFE_HEAP_LOAD_i32_2_SC (param $0 i64) (param $1 i64) (result i32) (local $2 i64) (local.set $2 (i64.add @@ -626,11 +621,17 @@ (call $alignfault) ) ) - (i32.load16_u - (local.get $2) + (i32.shr_s + (i32.shl + (i32.atomic.load16_u + (local.get $2) + ) + (i32.const 16) + ) + (i32.const 16) ) ) - (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i64) (param $1 i64) (result i32) + (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i64) (param $1 i64) (result i32) (local $2 i64) (local.set $2 (i64.add @@ -648,7 +649,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 4) + (i64.const 2) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -665,11 +666,11 @@ (unreachable) ) ) - (i32.load align=1 + (i32.load16_u align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i64) (param $1 i64) (result i32) + (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i64) (param $1 i64) (result i32) (local $2 i64) (local.set $2 (i64.add @@ -687,7 +688,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 4) + (i64.const 2) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -715,11 +716,11 @@ (call $alignfault) ) ) - (i32.load align=2 + (i32.load16_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_4_A (param $0 i64) (param $1 i64) (result i32) + (func $SAFE_HEAP_LOAD_i32_2_U_AR (param $0 i64) (param $1 i64) (result i32) (local $2 i64) (local.set $2 (i64.add @@ -737,7 +738,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 4) + (i64.const 2) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -759,17 +760,17 @@ (i32.wrap_i64 (local.get $2) ) - (i32.const 3) + (i32.const 1) ) (then (call $alignfault) ) ) - (i32.atomic.load + (i32.atomic.load16_u acqrel (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i64) (param $1 i64) (result i32) + (func $SAFE_HEAP_LOAD_i32_2_U_SC (param $0 i64) (param $1 i64) (result i32) (local $2 i64) (local.set $2 (i64.add @@ -787,7 +788,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 4) + (i64.const 2) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -809,17 +810,17 @@ (i32.wrap_i64 (local.get $2) ) - (i32.const 3) + (i32.const 1) ) (then (call $alignfault) ) ) - (i32.load + (i32.atomic.load16_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_1_A (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i64) (param $1 i64) (result i32) (local $2 i64) (local.set $2 (i64.add @@ -837,7 +838,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 1) + (i64.const 4) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -854,17 +855,11 @@ (unreachable) ) ) - (i64.shr_s - (i64.shl - (i64.atomic.load8_u - (local.get $2) - ) - (i64.const 56) - ) - (i64.const 56) + (i32.load align=1 + (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i64) (param $1 i64) (result i32) (local $2 i64) (local.set $2 (i64.add @@ -882,7 +877,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 1) + (i64.const 4) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -899,11 +894,22 @@ (unreachable) ) ) - (i64.load8_s + (if + (i32.and + (i32.wrap_i64 + (local.get $2) + ) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i32.load align=2 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_1_U_A (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i64) (param $1 i64) (result i32) (local $2 i64) (local.set $2 (i64.add @@ -921,7 +927,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 1) + (i64.const 4) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -938,11 +944,22 @@ (unreachable) ) ) - (i64.atomic.load8_u + (if + (i32.and + (i32.wrap_i64 + (local.get $2) + ) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (i32.load (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i32_4_AR (param $0 i64) (param $1 i64) (result i32) (local $2 i64) (local.set $2 (i64.add @@ -960,7 +977,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 1) + (i64.const 4) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -977,11 +994,22 @@ (unreachable) ) ) - (i64.load8_u + (if + (i32.and + (i32.wrap_i64 + (local.get $2) + ) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (i32.atomic.load acqrel (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i32_4_SC (param $0 i64) (param $1 i64) (result i32) (local $2 i64) (local.set $2 (i64.add @@ -999,7 +1027,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 2) + (i64.const 4) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -1016,11 +1044,22 @@ (unreachable) ) ) - (i64.load16_s align=1 + (if + (i32.and + (i32.wrap_i64 + (local.get $2) + ) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (i32.atomic.load (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_A (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -1038,7 +1077,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 2) + (i64.const 1) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -1055,28 +1094,11 @@ (unreachable) ) ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load16_u - (local.get $2) - ) - (i64.const 48) - ) - (i64.const 48) + (i64.load8_s + (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_1_AR (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -1094,7 +1116,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 2) + (i64.const 1) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -1111,22 +1133,17 @@ (unreachable) ) ) - (if - (i32.and - (i32.wrap_i64 + (i64.shr_s + (i64.shl + (i64.atomic.load8_u acqrel (local.get $2) ) - (i32.const 1) - ) - (then - (call $alignfault) + (i64.const 56) ) - ) - (i64.load16_s - (local.get $2) + (i64.const 56) ) ) - (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_1_SC (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -1144,7 +1161,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 2) + (i64.const 1) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -1161,11 +1178,17 @@ (unreachable) ) ) - (i64.load16_u align=1 - (local.get $2) - ) + (i64.shr_s + (i64.shl + (i64.atomic.load8_u + (local.get $2) + ) + (i64.const 56) + ) + (i64.const 56) + ) ) - (func $SAFE_HEAP_LOAD_i64_2_U_A (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -1183,7 +1206,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 2) + (i64.const 1) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -1200,22 +1223,11 @@ (unreachable) ) ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load16_u + (i64.load8_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_1_U_AR (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -1233,7 +1245,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 2) + (i64.const 1) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -1250,22 +1262,50 @@ (unreachable) ) ) + (i64.atomic.load8_u acqrel + (local.get $2) + ) + ) + (func $SAFE_HEAP_LOAD_i64_1_U_SC (param $0 i64) (param $1 i64) (result i64) + (local $2 i64) + (local.set $2 + (i64.add + (local.get $0) + (local.get $1) + ) + ) (if - (i32.and - (i32.wrap_i64 + (i32.or + (i64.eq (local.get $2) + (i64.const 0) + ) + (i32.or + (i64.gt_u + (i64.add + (local.get $2) + (i64.const 1) + ) + (i64.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i64.lt_u + (local.get $2) + (local.get $0) + ) ) - (i32.const 1) ) (then - (call $alignfault) + (call $segfault) + (unreachable) ) ) - (i64.load16_u + (i64.atomic.load8_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -1283,7 +1323,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 4) + (i64.const 2) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -1300,11 +1340,11 @@ (unreachable) ) ) - (i64.load32_s align=1 + (i64.load16_s align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -1322,7 +1362,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 4) + (i64.const 2) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -1350,11 +1390,11 @@ (call $alignfault) ) ) - (i64.load32_s align=2 + (i64.load16_s (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_A (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_AR (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -1372,7 +1412,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 4) + (i64.const 2) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -1394,7 +1434,7 @@ (i32.wrap_i64 (local.get $2) ) - (i32.const 3) + (i32.const 1) ) (then (call $alignfault) @@ -1402,15 +1442,15 @@ ) (i64.shr_s (i64.shl - (i64.atomic.load32_u + (i64.atomic.load16_u acqrel (local.get $2) ) - (i64.const 32) + (i64.const 48) ) - (i64.const 32) + (i64.const 48) ) ) - (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_SC (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -1428,7 +1468,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 4) + (i64.const 2) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -1450,17 +1490,23 @@ (i32.wrap_i64 (local.get $2) ) - (i32.const 3) + (i32.const 1) ) (then (call $alignfault) ) ) - (i64.load32_s - (local.get $2) + (i64.shr_s + (i64.shl + (i64.atomic.load16_u + (local.get $2) + ) + (i64.const 48) + ) + (i64.const 48) ) ) - (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -1478,7 +1524,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 4) + (i64.const 2) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -1495,11 +1541,11 @@ (unreachable) ) ) - (i64.load32_u align=1 + (i64.load16_u align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -1517,7 +1563,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 4) + (i64.const 2) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -1545,11 +1591,11 @@ (call $alignfault) ) ) - (i64.load32_u align=2 + (i64.load16_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_U_A (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_U_AR (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -1567,7 +1613,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 4) + (i64.const 2) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -1589,17 +1635,17 @@ (i32.wrap_i64 (local.get $2) ) - (i32.const 3) + (i32.const 1) ) (then (call $alignfault) ) ) - (i64.atomic.load32_u + (i64.atomic.load16_u acqrel (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_U_SC (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -1617,7 +1663,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 4) + (i64.const 2) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -1639,17 +1685,17 @@ (i32.wrap_i64 (local.get $2) ) - (i32.const 3) + (i32.const 1) ) (then (call $alignfault) ) ) - (i64.load32_u + (i64.atomic.load16_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -1667,7 +1713,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 8) + (i64.const 4) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -1684,11 +1730,11 @@ (unreachable) ) ) - (i64.load align=1 + (i64.load32_s align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -1706,7 +1752,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 8) + (i64.const 4) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -1734,11 +1780,11 @@ (call $alignfault) ) ) - (i64.load align=2 + (i64.load32_s align=2 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -1756,7 +1802,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 8) + (i64.const 4) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -1784,11 +1830,11 @@ (call $alignfault) ) ) - (i64.load align=4 + (i64.load32_s (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_8_A (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_AR (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -1806,7 +1852,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 8) + (i64.const 4) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -1828,17 +1874,23 @@ (i32.wrap_i64 (local.get $2) ) - (i32.const 7) + (i32.const 3) ) (then (call $alignfault) ) ) - (i64.atomic.load - (local.get $2) + (i64.shr_s + (i64.shl + (i64.atomic.load32_u acqrel + (local.get $2) + ) + (i64.const 32) + ) + (i64.const 32) ) ) - (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_SC (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -1856,7 +1908,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 8) + (i64.const 4) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -1878,17 +1930,23 @@ (i32.wrap_i64 (local.get $2) ) - (i32.const 7) + (i32.const 3) ) (then (call $alignfault) ) ) - (i64.load - (local.get $2) + (i64.shr_s + (i64.shl + (i64.atomic.load32_u + (local.get $2) + ) + (i64.const 32) + ) + (i64.const 32) ) ) - (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i64) (param $1 i64) (result f32) + (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -1923,11 +1981,11 @@ (unreachable) ) ) - (f32.load align=1 + (i64.load32_u align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i64) (param $1 i64) (result f32) + (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -1973,11 +2031,11 @@ (call $alignfault) ) ) - (f32.load align=2 + (i64.load32_u align=2 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i64) (param $1 i64) (result f32) + (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -2023,11 +2081,11 @@ (call $alignfault) ) ) - (f32.load + (i64.load32_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i64) (param $1 i64) (result f64) + (func $SAFE_HEAP_LOAD_i64_4_U_AR (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -2045,7 +2103,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 8) + (i64.const 4) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -2062,11 +2120,22 @@ (unreachable) ) ) - (f64.load align=1 + (if + (i32.and + (i32.wrap_i64 + (local.get $2) + ) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (i64.atomic.load32_u acqrel (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i64) (param $1 i64) (result f64) + (func $SAFE_HEAP_LOAD_i64_4_U_SC (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -2084,7 +2153,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 8) + (i64.const 4) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -2106,17 +2175,17 @@ (i32.wrap_i64 (local.get $2) ) - (i32.const 1) + (i32.const 3) ) (then (call $alignfault) ) ) - (f64.load align=2 + (i64.atomic.load32_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i64) (param $1 i64) (result f64) + (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -2151,22 +2220,11 @@ (unreachable) ) ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=4 + (i64.load align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i64) (param $1 i64) (result f64) + (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -2206,17 +2264,17 @@ (i32.wrap_i64 (local.get $2) ) - (i32.const 7) + (i32.const 1) ) (then (call $alignfault) ) ) - (f64.load + (i64.load align=2 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i64) (param $1 i64) (result v128) + (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -2234,7 +2292,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 16) + (i64.const 8) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -2251,11 +2309,22 @@ (unreachable) ) ) - (v128.load align=1 + (if + (i32.and + (i32.wrap_i64 + (local.get $2) + ) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (i64.load align=4 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i64) (param $1 i64) (result v128) + (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -2273,7 +2342,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 16) + (i64.const 8) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -2295,17 +2364,17 @@ (i32.wrap_i64 (local.get $2) ) - (i32.const 1) + (i32.const 7) ) (then (call $alignfault) ) ) - (v128.load align=2 + (i64.load (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i64) (param $1 i64) (result v128) + (func $SAFE_HEAP_LOAD_i64_8_AR (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -2323,7 +2392,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 16) + (i64.const 8) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -2345,17 +2414,17 @@ (i32.wrap_i64 (local.get $2) ) - (i32.const 3) + (i32.const 7) ) (then (call $alignfault) ) ) - (v128.load align=4 + (i64.atomic.load acqrel (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i64) (param $1 i64) (result v128) + (func $SAFE_HEAP_LOAD_i64_8_SC (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -2373,7 +2442,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 16) + (i64.const 8) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -2401,11 +2470,11 @@ (call $alignfault) ) ) - (v128.load align=8 + (i64.atomic.load (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i64) (param $1 i64) (result v128) + (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i64) (param $1 i64) (result f32) (local $2 i64) (local.set $2 (i64.add @@ -2423,7 +2492,46 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 16) + (i64.const 4) + ) + (i64.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i64.lt_u + (local.get $2) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (f32.load align=1 + (local.get $2) + ) + ) + (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i64) (param $1 i64) (result f32) + (local $2 i64) + (local.set $2 + (i64.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i64.eq + (local.get $2) + (i64.const 0) + ) + (i32.or + (i64.gt_u + (i64.add + (local.get $2) + (i64.const 4) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -2445,19 +2553,19 @@ (i32.wrap_i64 (local.get $2) ) - (i32.const 15) + (i32.const 1) ) (then (call $alignfault) ) ) - (v128.load + (f32.load align=2 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_1_A (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 + (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i64) (param $1 i64) (result f32) + (local $2 i64) + (local.set $2 (i64.add (local.get $0) (local.get $1) @@ -2466,21 +2574,21 @@ (if (i32.or (i64.eq - (local.get $3) + (local.get $2) (i64.const 0) ) (i32.or (i64.gt_u (i64.add - (local.get $3) - (i64.const 1) + (local.get $2) + (i64.const 4) ) (i64.load (call $emscripten_get_sbrk_ptr) ) ) (i64.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -2490,14 +2598,24 @@ (unreachable) ) ) - (i32.atomic.store8 - (local.get $3) + (if + (i32.and + (i32.wrap_i64 + (local.get $2) + ) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (f32.load (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 + (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i64) (param $1 i64) (result f64) + (local $2 i64) + (local.set $2 (i64.add (local.get $0) (local.get $1) @@ -2506,21 +2624,21 @@ (if (i32.or (i64.eq - (local.get $3) + (local.get $2) (i64.const 0) ) (i32.or (i64.gt_u (i64.add - (local.get $3) - (i64.const 1) + (local.get $2) + (i64.const 8) ) (i64.load (call $emscripten_get_sbrk_ptr) ) ) (i64.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -2530,14 +2648,13 @@ (unreachable) ) ) - (i32.store8 - (local.get $3) + (f64.load align=1 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 + (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i64) (param $1 i64) (result f64) + (local $2 i64) + (local.set $2 (i64.add (local.get $0) (local.get $1) @@ -2546,21 +2663,21 @@ (if (i32.or (i64.eq - (local.get $3) + (local.get $2) (i64.const 0) ) (i32.or (i64.gt_u (i64.add - (local.get $3) - (i64.const 2) + (local.get $2) + (i64.const 8) ) (i64.load (call $emscripten_get_sbrk_ptr) ) ) (i64.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -2570,14 +2687,24 @@ (unreachable) ) ) - (i32.store16 align=1 - (local.get $3) + (if + (i32.and + (i32.wrap_i64 + (local.get $2) + ) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (f64.load align=2 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_2_A (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 + (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i64) (param $1 i64) (result f64) + (local $2 i64) + (local.set $2 (i64.add (local.get $0) (local.get $1) @@ -2586,21 +2713,21 @@ (if (i32.or (i64.eq - (local.get $3) + (local.get $2) (i64.const 0) ) (i32.or (i64.gt_u (i64.add - (local.get $3) - (i64.const 2) + (local.get $2) + (i64.const 8) ) (i64.load (call $emscripten_get_sbrk_ptr) ) ) (i64.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -2613,22 +2740,21 @@ (if (i32.and (i32.wrap_i64 - (local.get $3) + (local.get $2) ) - (i32.const 1) + (i32.const 3) ) (then (call $alignfault) ) ) - (i32.atomic.store16 - (local.get $3) + (f64.load align=4 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 + (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i64) (param $1 i64) (result f64) + (local $2 i64) + (local.set $2 (i64.add (local.get $0) (local.get $1) @@ -2637,21 +2763,21 @@ (if (i32.or (i64.eq - (local.get $3) + (local.get $2) (i64.const 0) ) (i32.or (i64.gt_u (i64.add - (local.get $3) - (i64.const 2) + (local.get $2) + (i64.const 8) ) (i64.load (call $emscripten_get_sbrk_ptr) ) ) (i64.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -2664,22 +2790,21 @@ (if (i32.and (i32.wrap_i64 - (local.get $3) + (local.get $2) ) - (i32.const 1) + (i32.const 7) ) (then (call $alignfault) ) ) - (i32.store16 - (local.get $3) + (f64.load (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 + (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i64) (param $1 i64) (result v128) + (local $2 i64) + (local.set $2 (i64.add (local.get $0) (local.get $1) @@ -2688,21 +2813,21 @@ (if (i32.or (i64.eq - (local.get $3) + (local.get $2) (i64.const 0) ) (i32.or (i64.gt_u (i64.add - (local.get $3) - (i64.const 4) + (local.get $2) + (i64.const 16) ) (i64.load (call $emscripten_get_sbrk_ptr) ) ) (i64.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -2712,14 +2837,13 @@ (unreachable) ) ) - (i32.store align=1 - (local.get $3) + (v128.load align=1 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 + (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i64) (param $1 i64) (result v128) + (local $2 i64) + (local.set $2 (i64.add (local.get $0) (local.get $1) @@ -2728,21 +2852,21 @@ (if (i32.or (i64.eq - (local.get $3) + (local.get $2) (i64.const 0) ) (i32.or (i64.gt_u (i64.add - (local.get $3) - (i64.const 4) + (local.get $2) + (i64.const 16) ) (i64.load (call $emscripten_get_sbrk_ptr) ) ) (i64.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -2755,7 +2879,7 @@ (if (i32.and (i32.wrap_i64 - (local.get $3) + (local.get $2) ) (i32.const 1) ) @@ -2763,14 +2887,13 @@ (call $alignfault) ) ) - (i32.store align=2 - (local.get $3) + (v128.load align=2 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_4_A (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 + (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i64) (param $1 i64) (result v128) + (local $2 i64) + (local.set $2 (i64.add (local.get $0) (local.get $1) @@ -2779,21 +2902,21 @@ (if (i32.or (i64.eq - (local.get $3) + (local.get $2) (i64.const 0) ) (i32.or (i64.gt_u (i64.add - (local.get $3) - (i64.const 4) + (local.get $2) + (i64.const 16) ) (i64.load (call $emscripten_get_sbrk_ptr) ) ) (i64.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -2806,7 +2929,7 @@ (if (i32.and (i32.wrap_i64 - (local.get $3) + (local.get $2) ) (i32.const 3) ) @@ -2814,14 +2937,13 @@ (call $alignfault) ) ) - (i32.atomic.store - (local.get $3) + (v128.load align=4 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 + (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i64) (param $1 i64) (result v128) + (local $2 i64) + (local.set $2 (i64.add (local.get $0) (local.get $1) @@ -2830,21 +2952,21 @@ (if (i32.or (i64.eq - (local.get $3) + (local.get $2) (i64.const 0) ) (i32.or (i64.gt_u (i64.add - (local.get $3) - (i64.const 4) + (local.get $2) + (i64.const 16) ) (i64.load (call $emscripten_get_sbrk_ptr) ) ) (i64.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -2857,22 +2979,21 @@ (if (i32.and (i32.wrap_i64 - (local.get $3) + (local.get $2) ) - (i32.const 3) + (i32.const 7) ) (then (call $alignfault) ) ) - (i32.store - (local.get $3) + (v128.load align=8 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_1_A (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 + (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i64) (param $1 i64) (result v128) + (local $2 i64) + (local.set $2 (i64.add (local.get $0) (local.get $1) @@ -2881,21 +3002,21 @@ (if (i32.or (i64.eq - (local.get $3) + (local.get $2) (i64.const 0) ) (i32.or (i64.gt_u (i64.add - (local.get $3) - (i64.const 1) + (local.get $2) + (i64.const 16) ) (i64.load (call $emscripten_get_sbrk_ptr) ) ) (i64.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -2905,12 +3026,62 @@ (unreachable) ) ) - (i64.atomic.store8 + (if + (i32.and + (i32.wrap_i64 + (local.get $2) + ) + (i32.const 15) + ) + (then + (call $alignfault) + ) + ) + (v128.load + (local.get $2) + ) + ) + (func $SAFE_HEAP_STORE_i32_1_A (param $0 i64) (param $1 i64) (param $2 i32) + (local $3 i64) + (local.set $3 + (i64.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i64.eq + (local.get $3) + (i64.const 0) + ) + (i32.or + (i64.gt_u + (i64.add + (local.get $3) + (i64.const 1) + ) + (i64.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i64.lt_u + (local.get $3) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (i32.atomic.store8 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i64) (param $1 i64) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i64) (param $1 i64) (param $2 i32) (local $3 i64) (local.set $3 (i64.add @@ -2945,12 +3116,12 @@ (unreachable) ) ) - (i64.store8 + (i32.store8 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i64) (param $1 i64) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i64) (param $1 i64) (param $2 i32) (local $3 i64) (local.set $3 (i64.add @@ -2985,12 +3156,12 @@ (unreachable) ) ) - (i64.store16 align=1 + (i32.store16 align=1 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_2_A (param $0 i64) (param $1 i64) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_2_A (param $0 i64) (param $1 i64) (param $2 i32) (local $3 i64) (local.set $3 (i64.add @@ -3036,12 +3207,12 @@ (call $alignfault) ) ) - (i64.atomic.store16 + (i32.atomic.store16 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i64) (param $1 i64) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i64) (param $1 i64) (param $2 i32) (local $3 i64) (local.set $3 (i64.add @@ -3087,12 +3258,12 @@ (call $alignfault) ) ) - (i64.store16 + (i32.store16 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i64) (param $1 i64) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i64) (param $1 i64) (param $2 i32) (local $3 i64) (local.set $3 (i64.add @@ -3127,12 +3298,12 @@ (unreachable) ) ) - (i64.store32 align=1 + (i32.store align=1 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i64) (param $1 i64) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i64) (param $1 i64) (param $2 i32) (local $3 i64) (local.set $3 (i64.add @@ -3178,12 +3349,12 @@ (call $alignfault) ) ) - (i64.store32 align=2 + (i32.store align=2 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_4_A (param $0 i64) (param $1 i64) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_4_A (param $0 i64) (param $1 i64) (param $2 i32) (local $3 i64) (local.set $3 (i64.add @@ -3229,12 +3400,12 @@ (call $alignfault) ) ) - (i64.atomic.store32 + (i32.atomic.store (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i64) (param $1 i64) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i64) (param $1 i64) (param $2 i32) (local $3 i64) (local.set $3 (i64.add @@ -3280,12 +3451,12 @@ (call $alignfault) ) ) - (i64.store32 + (i32.store (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i64) (param $1 i64) (param $2 i64) + (func $SAFE_HEAP_STORE_i64_1_A (param $0 i64) (param $1 i64) (param $2 i64) (local $3 i64) (local.set $3 (i64.add @@ -3303,7 +3474,7 @@ (i64.gt_u (i64.add (local.get $3) - (i64.const 8) + (i64.const 1) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -3320,12 +3491,12 @@ (unreachable) ) ) - (i64.store align=1 + (i64.atomic.store8 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i64) (param $1 i64) (param $2 i64) + (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i64) (param $1 i64) (param $2 i64) (local $3 i64) (local.set $3 (i64.add @@ -3343,7 +3514,7 @@ (i64.gt_u (i64.add (local.get $3) - (i64.const 8) + (i64.const 1) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -3360,23 +3531,12 @@ (unreachable) ) ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=2 + (i64.store8 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i64) (param $1 i64) (param $2 i64) + (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i64) (param $1 i64) (param $2 i64) (local $3 i64) (local.set $3 (i64.add @@ -3394,7 +3554,7 @@ (i64.gt_u (i64.add (local.get $3) - (i64.const 8) + (i64.const 2) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -3411,23 +3571,12 @@ (unreachable) ) ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=4 + (i64.store16 align=1 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_8_A (param $0 i64) (param $1 i64) (param $2 i64) + (func $SAFE_HEAP_STORE_i64_2_A (param $0 i64) (param $1 i64) (param $2 i64) (local $3 i64) (local.set $3 (i64.add @@ -3445,7 +3594,7 @@ (i64.gt_u (i64.add (local.get $3) - (i64.const 8) + (i64.const 2) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -3467,18 +3616,18 @@ (i32.wrap_i64 (local.get $3) ) - (i32.const 7) + (i32.const 1) ) (then (call $alignfault) ) ) - (i64.atomic.store + (i64.atomic.store16 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i64) (param $1 i64) (param $2 i64) + (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i64) (param $1 i64) (param $2 i64) (local $3 i64) (local.set $3 (i64.add @@ -3496,7 +3645,7 @@ (i64.gt_u (i64.add (local.get $3) - (i64.const 8) + (i64.const 2) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -3518,18 +3667,18 @@ (i32.wrap_i64 (local.get $3) ) - (i32.const 7) + (i32.const 1) ) (then (call $alignfault) ) ) - (i64.store + (i64.store16 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i64) (param $1 i64) (param $2 f32) + (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i64) (param $1 i64) (param $2 i64) (local $3 i64) (local.set $3 (i64.add @@ -3564,12 +3713,12 @@ (unreachable) ) ) - (f32.store align=1 + (i64.store32 align=1 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i64) (param $1 i64) (param $2 f32) + (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i64) (param $1 i64) (param $2 i64) (local $3 i64) (local.set $3 (i64.add @@ -3615,12 +3764,12 @@ (call $alignfault) ) ) - (f32.store align=2 + (i64.store32 align=2 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i64) (param $1 i64) (param $2 f32) + (func $SAFE_HEAP_STORE_i64_4_A (param $0 i64) (param $1 i64) (param $2 i64) (local $3 i64) (local.set $3 (i64.add @@ -3666,12 +3815,12 @@ (call $alignfault) ) ) - (f32.store + (i64.atomic.store32 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i64) (param $1 i64) (param $2 f64) + (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i64) (param $1 i64) (param $2 i64) (local $3 i64) (local.set $3 (i64.add @@ -3689,7 +3838,7 @@ (i64.gt_u (i64.add (local.get $3) - (i64.const 8) + (i64.const 4) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -3706,12 +3855,23 @@ (unreachable) ) ) - (f64.store align=1 + (if + (i32.and + (i32.wrap_i64 + (local.get $3) + ) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (i64.store32 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i64) (param $1 i64) (param $2 f64) + (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i64) (param $1 i64) (param $2 i64) (local $3 i64) (local.set $3 (i64.add @@ -3746,23 +3906,12 @@ (unreachable) ) ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=2 + (i64.store align=1 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i64) (param $1 i64) (param $2 f64) + (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i64) (param $1 i64) (param $2 i64) (local $3 i64) (local.set $3 (i64.add @@ -3802,18 +3951,18 @@ (i32.wrap_i64 (local.get $3) ) - (i32.const 3) + (i32.const 1) ) (then (call $alignfault) ) ) - (f64.store align=4 + (i64.store align=2 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i64) (param $1 i64) (param $2 f64) + (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i64) (param $1 i64) (param $2 i64) (local $3 i64) (local.set $3 (i64.add @@ -3853,18 +4002,18 @@ (i32.wrap_i64 (local.get $3) ) - (i32.const 7) + (i32.const 3) ) (then (call $alignfault) ) ) - (f64.store + (i64.store align=4 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i64) (param $1 i64) (param $2 v128) + (func $SAFE_HEAP_STORE_i64_8_A (param $0 i64) (param $1 i64) (param $2 i64) (local $3 i64) (local.set $3 (i64.add @@ -3882,7 +4031,7 @@ (i64.gt_u (i64.add (local.get $3) - (i64.const 16) + (i64.const 8) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -3899,12 +4048,23 @@ (unreachable) ) ) - (v128.store align=1 + (if + (i32.and + (i32.wrap_i64 + (local.get $3) + ) + (i32.const 7) + ) + (then + (call $alignfault) + ) + ) + (i64.atomic.store (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i64) (param $1 i64) (param $2 v128) + (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i64) (param $1 i64) (param $2 i64) (local $3 i64) (local.set $3 (i64.add @@ -3922,7 +4082,7 @@ (i64.gt_u (i64.add (local.get $3) - (i64.const 16) + (i64.const 8) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -3944,18 +4104,18 @@ (i32.wrap_i64 (local.get $3) ) - (i32.const 1) + (i32.const 7) ) (then (call $alignfault) ) ) - (v128.store align=2 + (i64.store (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i64) (param $1 i64) (param $2 v128) + (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i64) (param $1 i64) (param $2 f32) (local $3 i64) (local.set $3 (i64.add @@ -3973,7 +4133,7 @@ (i64.gt_u (i64.add (local.get $3) - (i64.const 16) + (i64.const 4) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -3990,23 +4150,12 @@ (unreachable) ) ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=4 + (f32.store align=1 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i64) (param $1 i64) (param $2 v128) + (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i64) (param $1 i64) (param $2 f32) (local $3 i64) (local.set $3 (i64.add @@ -4024,7 +4173,7 @@ (i64.gt_u (i64.add (local.get $3) - (i64.const 16) + (i64.const 4) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -4046,18 +4195,18 @@ (i32.wrap_i64 (local.get $3) ) - (i32.const 7) + (i32.const 1) ) (then (call $alignfault) ) ) - (v128.store align=8 + (f32.store align=2 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i64) (param $1 i64) (param $2 v128) + (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i64) (param $1 i64) (param $2 f32) (local $3 i64) (local.set $3 (i64.add @@ -4075,7 +4224,7 @@ (i64.gt_u (i64.add (local.get $3) - (i64.const 16) + (i64.const 4) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -4097,46 +4246,20 @@ (i32.wrap_i64 (local.get $3) ) - (i32.const 15) + (i32.const 3) ) (then (call $alignfault) ) ) - (v128.store + (f32.store (local.get $3) (local.get $2) ) ) -) -(module - (type $0 (func (param i64 i64) (result i64))) - (type $1 (func (param i64 i64 i64))) - (type $2 (func (param i64 i64) (result i32))) - (type $3 (func (param i64 i64 i32))) - (type $4 (func (param i64 i64) (result v128))) - (type $5 (func (param i64 i64 v128))) - (type $6 (func (param i64 i64) (result f64))) - (type $7 (func (param i64 i64 f64))) - (type $8 (func)) - (type $9 (func (param i64 i64) (result f32))) - (type $10 (func (param i64 i64 f32))) - (type $11 (func (result i64))) - (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i64))) - (import "env" "segfault" (func $segfault)) - (import "env" "alignfault" (func $alignfault)) - (memory $0 i64 100 100) - (func $loads - (drop - (call $SAFE_HEAP_LOAD_i32_4_4 - (i64.const 1) - (i64.const 0) - ) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 + (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i64) (param $1 i64) (param $2 f64) + (local $3 i64) + (local.set $3 (i64.add (local.get $0) (local.get $1) @@ -4145,21 +4268,21 @@ (if (i32.or (i64.eq - (local.get $2) + (local.get $3) (i64.const 0) ) (i32.or (i64.gt_u (i64.add - (local.get $2) - (i64.const 1) + (local.get $3) + (i64.const 8) ) (i64.load (call $emscripten_get_sbrk_ptr) ) ) (i64.lt_u - (local.get $2) + (local.get $3) (local.get $0) ) ) @@ -4169,13 +4292,14 @@ (unreachable) ) ) - (i32.load8_s + (f64.store align=1 + (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 + (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i64) (param $1 i64) (param $2 f64) + (local $3 i64) + (local.set $3 (i64.add (local.get $0) (local.get $1) @@ -4184,21 +4308,21 @@ (if (i32.or (i64.eq - (local.get $2) + (local.get $3) (i64.const 0) ) (i32.or (i64.gt_u (i64.add - (local.get $2) - (i64.const 1) + (local.get $3) + (i64.const 8) ) (i64.load (call $emscripten_get_sbrk_ptr) ) ) (i64.lt_u - (local.get $2) + (local.get $3) (local.get $0) ) ) @@ -4208,13 +4332,25 @@ (unreachable) ) ) - (i32.load8_u + (if + (i32.and + (i32.wrap_i64 + (local.get $3) + ) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (f64.store align=2 + (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 + (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i64) (param $1 i64) (param $2 f64) + (local $3 i64) + (local.set $3 (i64.add (local.get $0) (local.get $1) @@ -4223,21 +4359,21 @@ (if (i32.or (i64.eq - (local.get $2) + (local.get $3) (i64.const 0) ) (i32.or (i64.gt_u (i64.add - (local.get $2) - (i64.const 2) + (local.get $3) + (i64.const 8) ) (i64.load (call $emscripten_get_sbrk_ptr) ) ) (i64.lt_u - (local.get $2) + (local.get $3) (local.get $0) ) ) @@ -4247,13 +4383,25 @@ (unreachable) ) ) - (i32.load16_s align=1 + (if + (i32.and + (i32.wrap_i64 + (local.get $3) + ) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (f64.store align=4 + (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 + (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i64) (param $1 i64) (param $2 f64) + (local $3 i64) + (local.set $3 (i64.add (local.get $0) (local.get $1) @@ -4262,21 +4410,21 @@ (if (i32.or (i64.eq - (local.get $2) + (local.get $3) (i64.const 0) ) (i32.or (i64.gt_u (i64.add - (local.get $2) - (i64.const 2) + (local.get $3) + (i64.const 8) ) (i64.load (call $emscripten_get_sbrk_ptr) ) ) (i64.lt_u - (local.get $2) + (local.get $3) (local.get $0) ) ) @@ -4289,21 +4437,22 @@ (if (i32.and (i32.wrap_i64 - (local.get $2) + (local.get $3) ) - (i32.const 1) + (i32.const 7) ) (then (call $alignfault) ) ) - (i32.load16_s + (f64.store + (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 + (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i64) (param $1 i64) (param $2 v128) + (local $3 i64) + (local.set $3 (i64.add (local.get $0) (local.get $1) @@ -4312,21 +4461,21 @@ (if (i32.or (i64.eq - (local.get $2) + (local.get $3) (i64.const 0) ) (i32.or (i64.gt_u (i64.add - (local.get $2) - (i64.const 2) + (local.get $3) + (i64.const 16) ) (i64.load (call $emscripten_get_sbrk_ptr) ) ) (i64.lt_u - (local.get $2) + (local.get $3) (local.get $0) ) ) @@ -4336,13 +4485,14 @@ (unreachable) ) ) - (i32.load16_u align=1 + (v128.store align=1 + (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 + (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i64) (param $1 i64) (param $2 v128) + (local $3 i64) + (local.set $3 (i64.add (local.get $0) (local.get $1) @@ -4351,21 +4501,21 @@ (if (i32.or (i64.eq - (local.get $2) + (local.get $3) (i64.const 0) ) (i32.or (i64.gt_u (i64.add - (local.get $2) - (i64.const 2) + (local.get $3) + (i64.const 16) ) (i64.load (call $emscripten_get_sbrk_ptr) ) ) (i64.lt_u - (local.get $2) + (local.get $3) (local.get $0) ) ) @@ -4378,7 +4528,7 @@ (if (i32.and (i32.wrap_i64 - (local.get $2) + (local.get $3) ) (i32.const 1) ) @@ -4386,13 +4536,14 @@ (call $alignfault) ) ) - (i32.load16_u + (v128.store align=2 + (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 + (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i64) (param $1 i64) (param $2 v128) + (local $3 i64) + (local.set $3 (i64.add (local.get $0) (local.get $1) @@ -4401,21 +4552,21 @@ (if (i32.or (i64.eq - (local.get $2) + (local.get $3) (i64.const 0) ) (i32.or (i64.gt_u (i64.add - (local.get $2) - (i64.const 4) + (local.get $3) + (i64.const 16) ) (i64.load (call $emscripten_get_sbrk_ptr) ) ) (i64.lt_u - (local.get $2) + (local.get $3) (local.get $0) ) ) @@ -4425,13 +4576,25 @@ (unreachable) ) ) - (i32.load align=1 + (if + (i32.and + (i32.wrap_i64 + (local.get $3) + ) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (v128.store align=4 + (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 + (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i64) (param $1 i64) (param $2 v128) + (local $3 i64) + (local.set $3 (i64.add (local.get $0) (local.get $1) @@ -4440,21 +4603,21 @@ (if (i32.or (i64.eq - (local.get $2) + (local.get $3) (i64.const 0) ) (i32.or (i64.gt_u (i64.add - (local.get $2) - (i64.const 4) + (local.get $3) + (i64.const 16) ) (i64.load (call $emscripten_get_sbrk_ptr) ) ) (i64.lt_u - (local.get $2) + (local.get $3) (local.get $0) ) ) @@ -4467,21 +4630,22 @@ (if (i32.and (i32.wrap_i64 - (local.get $2) + (local.get $3) ) - (i32.const 1) + (i32.const 7) ) (then (call $alignfault) ) ) - (i32.load align=2 + (v128.store align=8 + (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 + (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i64) (param $1 i64) (param $2 v128) + (local $3 i64) + (local.set $3 (i64.add (local.get $0) (local.get $1) @@ -4490,21 +4654,21 @@ (if (i32.or (i64.eq - (local.get $2) + (local.get $3) (i64.const 0) ) (i32.or (i64.gt_u (i64.add - (local.get $2) - (i64.const 4) + (local.get $3) + (i64.const 16) ) (i64.load (call $emscripten_get_sbrk_ptr) ) ) (i64.lt_u - (local.get $2) + (local.get $3) (local.get $0) ) ) @@ -4517,19 +4681,46 @@ (if (i32.and (i32.wrap_i64 - (local.get $2) + (local.get $3) ) - (i32.const 3) + (i32.const 15) ) (then (call $alignfault) ) ) - (i32.load + (v128.store + (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i64) (param $1 i64) (result i64) +) +(module + (type $0 (func (param i64 i64) (result i64))) + (type $1 (func (param i64 i64 i64))) + (type $2 (func (param i64 i64) (result i32))) + (type $3 (func (param i64 i64 i32))) + (type $4 (func (param i64 i64) (result v128))) + (type $5 (func (param i64 i64 v128))) + (type $6 (func (param i64 i64) (result f64))) + (type $7 (func (param i64 i64 f64))) + (type $8 (func)) + (type $9 (func (param i64 i64) (result f32))) + (type $10 (func (param i64 i64 f32))) + (type $11 (func (result i64))) + (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i64))) + (import "env" "segfault" (func $segfault)) + (import "env" "alignfault" (func $alignfault)) + (memory $0 i64 100 100) + (func $loads + (drop + (call $SAFE_HEAP_LOAD_i32_4_4 + (i64.const 1) + (i64.const 0) + ) + ) + ) + (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i64) (param $1 i64) (result i32) (local $2 i64) (local.set $2 (i64.add @@ -4564,11 +4755,11 @@ (unreachable) ) ) - (i64.load8_s + (i32.load8_s (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i64) (param $1 i64) (result i32) (local $2 i64) (local.set $2 (i64.add @@ -4603,11 +4794,11 @@ (unreachable) ) ) - (i64.load8_u + (i32.load8_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i64) (param $1 i64) (result i32) (local $2 i64) (local.set $2 (i64.add @@ -4642,11 +4833,11 @@ (unreachable) ) ) - (i64.load16_s align=1 + (i32.load16_s align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i64) (param $1 i64) (result i32) (local $2 i64) (local.set $2 (i64.add @@ -4692,11 +4883,11 @@ (call $alignfault) ) ) - (i64.load16_s + (i32.load16_s (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i64) (param $1 i64) (result i32) (local $2 i64) (local.set $2 (i64.add @@ -4731,11 +4922,11 @@ (unreachable) ) ) - (i64.load16_u align=1 + (i32.load16_u align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i64) (param $1 i64) (result i32) (local $2 i64) (local.set $2 (i64.add @@ -4781,11 +4972,11 @@ (call $alignfault) ) ) - (i64.load16_u + (i32.load16_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i64) (param $1 i64) (result i32) (local $2 i64) (local.set $2 (i64.add @@ -4820,11 +5011,11 @@ (unreachable) ) ) - (i64.load32_s align=1 + (i32.load align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i64) (param $1 i64) (result i32) (local $2 i64) (local.set $2 (i64.add @@ -4870,11 +5061,11 @@ (call $alignfault) ) ) - (i64.load32_s align=2 + (i32.load align=2 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i64) (param $1 i64) (result i32) (local $2 i64) (local.set $2 (i64.add @@ -4920,11 +5111,11 @@ (call $alignfault) ) ) - (i64.load32_s + (i32.load (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -4942,7 +5133,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 4) + (i64.const 1) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -4959,11 +5150,11 @@ (unreachable) ) ) - (i64.load32_u align=1 + (i64.load8_s (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -4981,7 +5172,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 4) + (i64.const 1) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -4998,22 +5189,50 @@ (unreachable) ) ) + (i64.load8_u + (local.get $2) + ) + ) + (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i64) (param $1 i64) (result i64) + (local $2 i64) + (local.set $2 + (i64.add + (local.get $0) + (local.get $1) + ) + ) (if - (i32.and - (i32.wrap_i64 + (i32.or + (i64.eq (local.get $2) + (i64.const 0) + ) + (i32.or + (i64.gt_u + (i64.add + (local.get $2) + (i64.const 2) + ) + (i64.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i64.lt_u + (local.get $2) + (local.get $0) + ) ) - (i32.const 1) ) (then - (call $alignfault) + (call $segfault) + (unreachable) ) ) - (i64.load32_u align=2 + (i64.load16_s align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -5031,7 +5250,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 4) + (i64.const 2) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -5053,17 +5272,17 @@ (i32.wrap_i64 (local.get $2) ) - (i32.const 3) + (i32.const 1) ) (then (call $alignfault) ) ) - (i64.load32_u + (i64.load16_s (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -5081,7 +5300,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 8) + (i64.const 2) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -5098,11 +5317,11 @@ (unreachable) ) ) - (i64.load align=1 + (i64.load16_u align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -5120,7 +5339,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 8) + (i64.const 2) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -5148,11 +5367,11 @@ (call $alignfault) ) ) - (i64.load align=2 + (i64.load16_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -5170,7 +5389,46 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 8) + (i64.const 4) + ) + (i64.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i64.lt_u + (local.get $2) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (i64.load32_s align=1 + (local.get $2) + ) + ) + (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i64) (param $1 i64) (result i64) + (local $2 i64) + (local.set $2 + (i64.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i64.eq + (local.get $2) + (i64.const 0) + ) + (i32.or + (i64.gt_u + (i64.add + (local.get $2) + (i64.const 4) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -5192,17 +5450,17 @@ (i32.wrap_i64 (local.get $2) ) - (i32.const 3) + (i32.const 1) ) (then (call $alignfault) ) ) - (i64.load align=4 + (i64.load32_s align=2 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -5220,7 +5478,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 8) + (i64.const 4) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -5242,17 +5500,17 @@ (i32.wrap_i64 (local.get $2) ) - (i32.const 7) + (i32.const 3) ) (then (call $alignfault) ) ) - (i64.load + (i64.load32_s (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i64) (param $1 i64) (result f32) + (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -5287,11 +5545,11 @@ (unreachable) ) ) - (f32.load align=1 + (i64.load32_u align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i64) (param $1 i64) (result f32) + (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -5337,11 +5595,11 @@ (call $alignfault) ) ) - (f32.load align=2 + (i64.load32_u align=2 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i64) (param $1 i64) (result f32) + (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -5387,11 +5645,11 @@ (call $alignfault) ) ) - (f32.load + (i64.load32_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i64) (param $1 i64) (result f64) + (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -5426,11 +5684,11 @@ (unreachable) ) ) - (f64.load align=1 + (i64.load align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i64) (param $1 i64) (result f64) + (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -5476,11 +5734,11 @@ (call $alignfault) ) ) - (f64.load align=2 + (i64.load align=2 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i64) (param $1 i64) (result f64) + (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -5526,11 +5784,11 @@ (call $alignfault) ) ) - (f64.load align=4 + (i64.load align=4 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i64) (param $1 i64) (result f64) + (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -5576,11 +5834,11 @@ (call $alignfault) ) ) - (f64.load + (i64.load (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i64) (param $1 i64) (result v128) + (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i64) (param $1 i64) (result f32) (local $2 i64) (local.set $2 (i64.add @@ -5598,7 +5856,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 16) + (i64.const 4) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -5615,11 +5873,11 @@ (unreachable) ) ) - (v128.load align=1 + (f32.load align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i64) (param $1 i64) (result v128) + (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i64) (param $1 i64) (result f32) (local $2 i64) (local.set $2 (i64.add @@ -5637,7 +5895,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 16) + (i64.const 4) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -5665,11 +5923,11 @@ (call $alignfault) ) ) - (v128.load align=2 + (f32.load align=2 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i64) (param $1 i64) (result v128) + (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i64) (param $1 i64) (result f32) (local $2 i64) (local.set $2 (i64.add @@ -5687,7 +5945,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 16) + (i64.const 4) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -5715,11 +5973,11 @@ (call $alignfault) ) ) - (v128.load align=4 + (f32.load (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i64) (param $1 i64) (result v128) + (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i64) (param $1 i64) (result f64) (local $2 i64) (local.set $2 (i64.add @@ -5737,7 +5995,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 16) + (i64.const 8) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -5754,22 +6012,11 @@ (unreachable) ) ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=8 + (f64.load align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i64) (param $1 i64) (result v128) + (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i64) (param $1 i64) (result f64) (local $2 i64) (local.set $2 (i64.add @@ -5787,7 +6034,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 16) + (i64.const 8) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -5809,19 +6056,19 @@ (i32.wrap_i64 (local.get $2) ) - (i32.const 15) + (i32.const 1) ) (then (call $alignfault) ) ) - (v128.load + (f64.load align=2 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 + (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i64) (param $1 i64) (result f64) + (local $2 i64) + (local.set $2 (i64.add (local.get $0) (local.get $1) @@ -5830,21 +6077,21 @@ (if (i32.or (i64.eq - (local.get $3) + (local.get $2) (i64.const 0) ) (i32.or (i64.gt_u (i64.add - (local.get $3) - (i64.const 1) + (local.get $2) + (i64.const 8) ) (i64.load (call $emscripten_get_sbrk_ptr) ) ) (i64.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -5854,14 +6101,24 @@ (unreachable) ) ) - (i32.store8 - (local.get $3) + (if + (i32.and + (i32.wrap_i64 + (local.get $2) + ) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (f64.load align=4 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 + (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i64) (param $1 i64) (result f64) + (local $2 i64) + (local.set $2 (i64.add (local.get $0) (local.get $1) @@ -5870,21 +6127,21 @@ (if (i32.or (i64.eq - (local.get $3) + (local.get $2) (i64.const 0) ) (i32.or (i64.gt_u (i64.add - (local.get $3) - (i64.const 2) + (local.get $2) + (i64.const 8) ) (i64.load (call $emscripten_get_sbrk_ptr) ) ) (i64.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -5894,14 +6151,24 @@ (unreachable) ) ) - (i32.store16 align=1 - (local.get $3) + (if + (i32.and + (i32.wrap_i64 + (local.get $2) + ) + (i32.const 7) + ) + (then + (call $alignfault) + ) + ) + (f64.load (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 + (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i64) (param $1 i64) (result v128) + (local $2 i64) + (local.set $2 (i64.add (local.get $0) (local.get $1) @@ -5910,21 +6177,60 @@ (if (i32.or (i64.eq - (local.get $3) + (local.get $2) (i64.const 0) ) (i32.or (i64.gt_u (i64.add - (local.get $3) - (i64.const 2) + (local.get $2) + (i64.const 16) ) (i64.load (call $emscripten_get_sbrk_ptr) ) ) (i64.lt_u - (local.get $3) + (local.get $2) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (v128.load align=1 + (local.get $2) + ) + ) + (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i64) (param $1 i64) (result v128) + (local $2 i64) + (local.set $2 + (i64.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i64.eq + (local.get $2) + (i64.const 0) + ) + (i32.or + (i64.gt_u + (i64.add + (local.get $2) + (i64.const 16) + ) + (i64.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i64.lt_u + (local.get $2) (local.get $0) ) ) @@ -5937,7 +6243,7 @@ (if (i32.and (i32.wrap_i64 - (local.get $3) + (local.get $2) ) (i32.const 1) ) @@ -5945,14 +6251,13 @@ (call $alignfault) ) ) - (i32.store16 - (local.get $3) + (v128.load align=2 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 + (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i64) (param $1 i64) (result v128) + (local $2 i64) + (local.set $2 (i64.add (local.get $0) (local.get $1) @@ -5961,21 +6266,21 @@ (if (i32.or (i64.eq - (local.get $3) + (local.get $2) (i64.const 0) ) (i32.or (i64.gt_u (i64.add - (local.get $3) - (i64.const 4) + (local.get $2) + (i64.const 16) ) (i64.load (call $emscripten_get_sbrk_ptr) ) ) (i64.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -5985,14 +6290,24 @@ (unreachable) ) ) - (i32.store align=1 - (local.get $3) + (if + (i32.and + (i32.wrap_i64 + (local.get $2) + ) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (v128.load align=4 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 + (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i64) (param $1 i64) (result v128) + (local $2 i64) + (local.set $2 (i64.add (local.get $0) (local.get $1) @@ -6001,21 +6316,21 @@ (if (i32.or (i64.eq - (local.get $3) + (local.get $2) (i64.const 0) ) (i32.or (i64.gt_u (i64.add - (local.get $3) - (i64.const 4) + (local.get $2) + (i64.const 16) ) (i64.load (call $emscripten_get_sbrk_ptr) ) ) (i64.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -6028,22 +6343,21 @@ (if (i32.and (i32.wrap_i64 - (local.get $3) + (local.get $2) ) - (i32.const 1) + (i32.const 7) ) (then (call $alignfault) ) ) - (i32.store align=2 - (local.get $3) + (v128.load align=8 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 + (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i64) (param $1 i64) (result v128) + (local $2 i64) + (local.set $2 (i64.add (local.get $0) (local.get $1) @@ -6052,21 +6366,21 @@ (if (i32.or (i64.eq - (local.get $3) + (local.get $2) (i64.const 0) ) (i32.or (i64.gt_u (i64.add - (local.get $3) - (i64.const 4) + (local.get $2) + (i64.const 16) ) (i64.load (call $emscripten_get_sbrk_ptr) ) ) (i64.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -6079,20 +6393,19 @@ (if (i32.and (i32.wrap_i64 - (local.get $3) + (local.get $2) ) - (i32.const 3) + (i32.const 15) ) (then (call $alignfault) ) ) - (i32.store - (local.get $3) + (v128.load (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i64) (param $1 i64) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i64) (param $1 i64) (param $2 i32) (local $3 i64) (local.set $3 (i64.add @@ -6127,12 +6440,12 @@ (unreachable) ) ) - (i64.store8 + (i32.store8 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i64) (param $1 i64) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i64) (param $1 i64) (param $2 i32) (local $3 i64) (local.set $3 (i64.add @@ -6167,12 +6480,12 @@ (unreachable) ) ) - (i64.store16 align=1 + (i32.store16 align=1 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i64) (param $1 i64) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i64) (param $1 i64) (param $2 i32) (local $3 i64) (local.set $3 (i64.add @@ -6218,12 +6531,12 @@ (call $alignfault) ) ) - (i64.store16 + (i32.store16 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i64) (param $1 i64) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i64) (param $1 i64) (param $2 i32) (local $3 i64) (local.set $3 (i64.add @@ -6258,12 +6571,12 @@ (unreachable) ) ) - (i64.store32 align=1 + (i32.store align=1 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i64) (param $1 i64) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i64) (param $1 i64) (param $2 i32) (local $3 i64) (local.set $3 (i64.add @@ -6309,12 +6622,12 @@ (call $alignfault) ) ) - (i64.store32 align=2 + (i32.store align=2 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i64) (param $1 i64) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i64) (param $1 i64) (param $2 i32) (local $3 i64) (local.set $3 (i64.add @@ -6360,12 +6673,12 @@ (call $alignfault) ) ) - (i64.store32 + (i32.store (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i64) (param $1 i64) (param $2 i64) + (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i64) (param $1 i64) (param $2 i64) (local $3 i64) (local.set $3 (i64.add @@ -6383,7 +6696,7 @@ (i64.gt_u (i64.add (local.get $3) - (i64.const 8) + (i64.const 1) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -6400,12 +6713,12 @@ (unreachable) ) ) - (i64.store align=1 + (i64.store8 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i64) (param $1 i64) (param $2 i64) + (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i64) (param $1 i64) (param $2 i64) (local $3 i64) (local.set $3 (i64.add @@ -6423,7 +6736,7 @@ (i64.gt_u (i64.add (local.get $3) - (i64.const 8) + (i64.const 2) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -6440,23 +6753,12 @@ (unreachable) ) ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=2 + (i64.store16 align=1 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i64) (param $1 i64) (param $2 i64) + (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i64) (param $1 i64) (param $2 i64) (local $3 i64) (local.set $3 (i64.add @@ -6474,7 +6776,7 @@ (i64.gt_u (i64.add (local.get $3) - (i64.const 8) + (i64.const 2) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -6496,18 +6798,18 @@ (i32.wrap_i64 (local.get $3) ) - (i32.const 3) + (i32.const 1) ) (then (call $alignfault) ) ) - (i64.store align=4 + (i64.store16 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i64) (param $1 i64) (param $2 i64) + (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i64) (param $1 i64) (param $2 i64) (local $3 i64) (local.set $3 (i64.add @@ -6525,7 +6827,7 @@ (i64.gt_u (i64.add (local.get $3) - (i64.const 8) + (i64.const 4) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -6542,23 +6844,12 @@ (unreachable) ) ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.store + (i64.store32 align=1 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i64) (param $1 i64) (param $2 f32) + (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i64) (param $1 i64) (param $2 i64) (local $3 i64) (local.set $3 (i64.add @@ -6593,12 +6884,23 @@ (unreachable) ) ) - (f32.store align=1 + (if + (i32.and + (i32.wrap_i64 + (local.get $3) + ) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i64.store32 align=2 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i64) (param $1 i64) (param $2 f32) + (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i64) (param $1 i64) (param $2 i64) (local $3 i64) (local.set $3 (i64.add @@ -6638,18 +6940,18 @@ (i32.wrap_i64 (local.get $3) ) - (i32.const 1) + (i32.const 3) ) (then (call $alignfault) ) ) - (f32.store align=2 + (i64.store32 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i64) (param $1 i64) (param $2 f32) + (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i64) (param $1 i64) (param $2 i64) (local $3 i64) (local.set $3 (i64.add @@ -6667,7 +6969,7 @@ (i64.gt_u (i64.add (local.get $3) - (i64.const 4) + (i64.const 8) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -6684,23 +6986,63 @@ (unreachable) ) ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) + (i64.store align=1 + (local.get $3) + (local.get $2) + ) + ) + (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i64) (param $1 i64) (param $2 i64) + (local $3 i64) + (local.set $3 + (i64.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i64.eq + (local.get $3) + (i64.const 0) + ) + (i32.or + (i64.gt_u + (i64.add + (local.get $3) + (i64.const 8) + ) + (i64.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i64.lt_u + (local.get $3) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (if + (i32.and + (i32.wrap_i64 + (local.get $3) + ) + (i32.const 1) ) (then (call $alignfault) ) ) - (f32.store + (i64.store align=2 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i64) (param $1 i64) (param $2 f64) + (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i64) (param $1 i64) (param $2 i64) (local $3 i64) (local.set $3 (i64.add @@ -6735,12 +7077,23 @@ (unreachable) ) ) - (f64.store align=1 + (if + (i32.and + (i32.wrap_i64 + (local.get $3) + ) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (i64.store align=4 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i64) (param $1 i64) (param $2 f64) + (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i64) (param $1 i64) (param $2 i64) (local $3 i64) (local.set $3 (i64.add @@ -6780,18 +7133,18 @@ (i32.wrap_i64 (local.get $3) ) - (i32.const 1) + (i32.const 7) ) (then (call $alignfault) ) ) - (f64.store align=2 + (i64.store (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i64) (param $1 i64) (param $2 f64) + (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i64) (param $1 i64) (param $2 f32) (local $3 i64) (local.set $3 (i64.add @@ -6809,7 +7162,47 @@ (i64.gt_u (i64.add (local.get $3) - (i64.const 8) + (i64.const 4) + ) + (i64.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i64.lt_u + (local.get $3) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (f32.store align=1 + (local.get $3) + (local.get $2) + ) + ) + (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i64) (param $1 i64) (param $2 f32) + (local $3 i64) + (local.set $3 + (i64.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i64.eq + (local.get $3) + (i64.const 0) + ) + (i32.or + (i64.gt_u + (i64.add + (local.get $3) + (i64.const 4) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -6831,18 +7224,18 @@ (i32.wrap_i64 (local.get $3) ) - (i32.const 3) + (i32.const 1) ) (then (call $alignfault) ) ) - (f64.store align=4 + (f32.store align=2 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i64) (param $1 i64) (param $2 f64) + (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i64) (param $1 i64) (param $2 f32) (local $3 i64) (local.set $3 (i64.add @@ -6860,7 +7253,7 @@ (i64.gt_u (i64.add (local.get $3) - (i64.const 8) + (i64.const 4) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -6882,18 +7275,18 @@ (i32.wrap_i64 (local.get $3) ) - (i32.const 7) + (i32.const 3) ) (then (call $alignfault) ) ) - (f64.store + (f32.store (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i64) (param $1 i64) (param $2 v128) + (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i64) (param $1 i64) (param $2 f64) (local $3 i64) (local.set $3 (i64.add @@ -6911,7 +7304,7 @@ (i64.gt_u (i64.add (local.get $3) - (i64.const 16) + (i64.const 8) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -6928,12 +7321,12 @@ (unreachable) ) ) - (v128.store align=1 + (f64.store align=1 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i64) (param $1 i64) (param $2 v128) + (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i64) (param $1 i64) (param $2 f64) (local $3 i64) (local.set $3 (i64.add @@ -6951,7 +7344,7 @@ (i64.gt_u (i64.add (local.get $3) - (i64.const 16) + (i64.const 8) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -6979,12 +7372,12 @@ (call $alignfault) ) ) - (v128.store align=2 + (f64.store align=2 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i64) (param $1 i64) (param $2 v128) + (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i64) (param $1 i64) (param $2 f64) (local $3 i64) (local.set $3 (i64.add @@ -7002,7 +7395,7 @@ (i64.gt_u (i64.add (local.get $3) - (i64.const 16) + (i64.const 8) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -7030,12 +7423,12 @@ (call $alignfault) ) ) - (v128.store align=4 + (f64.store align=4 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i64) (param $1 i64) (param $2 v128) + (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i64) (param $1 i64) (param $2 f64) (local $3 i64) (local.set $3 (i64.add @@ -7053,7 +7446,7 @@ (i64.gt_u (i64.add (local.get $3) - (i64.const 16) + (i64.const 8) ) (i64.load (call $emscripten_get_sbrk_ptr) @@ -7081,12 +7474,103 @@ (call $alignfault) ) ) - (v128.store align=8 + (f64.store (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i64) (param $1 i64) (param $2 v128) + (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i64) (param $1 i64) (param $2 v128) + (local $3 i64) + (local.set $3 + (i64.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i64.eq + (local.get $3) + (i64.const 0) + ) + (i32.or + (i64.gt_u + (i64.add + (local.get $3) + (i64.const 16) + ) + (i64.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i64.lt_u + (local.get $3) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (v128.store align=1 + (local.get $3) + (local.get $2) + ) + ) + (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i64) (param $1 i64) (param $2 v128) + (local $3 i64) + (local.set $3 + (i64.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i64.eq + (local.get $3) + (i64.const 0) + ) + (i32.or + (i64.gt_u + (i64.add + (local.get $3) + (i64.const 16) + ) + (i64.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i64.lt_u + (local.get $3) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (if + (i32.and + (i32.wrap_i64 + (local.get $3) + ) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (v128.store align=2 + (local.get $3) + (local.get $2) + ) + ) + (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i64) (param $1 i64) (param $2 v128) (local $3 i64) (local.set $3 (i64.add @@ -7103,15 +7587,590 @@ (i32.or (i64.gt_u (i64.add - (local.get $3) - (i64.const 16) + (local.get $3) + (i64.const 16) + ) + (i64.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i64.lt_u + (local.get $3) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (if + (i32.and + (i32.wrap_i64 + (local.get $3) + ) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (v128.store align=4 + (local.get $3) + (local.get $2) + ) + ) + (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i64) (param $1 i64) (param $2 v128) + (local $3 i64) + (local.set $3 + (i64.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i64.eq + (local.get $3) + (i64.const 0) + ) + (i32.or + (i64.gt_u + (i64.add + (local.get $3) + (i64.const 16) + ) + (i64.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i64.lt_u + (local.get $3) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (if + (i32.and + (i32.wrap_i64 + (local.get $3) + ) + (i32.const 7) + ) + (then + (call $alignfault) + ) + ) + (v128.store align=8 + (local.get $3) + (local.get $2) + ) + ) + (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i64) (param $1 i64) (param $2 v128) + (local $3 i64) + (local.set $3 + (i64.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i64.eq + (local.get $3) + (i64.const 0) + ) + (i32.or + (i64.gt_u + (i64.add + (local.get $3) + (i64.const 16) + ) + (i64.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i64.lt_u + (local.get $3) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (if + (i32.and + (i32.wrap_i64 + (local.get $3) + ) + (i32.const 15) + ) + (then + (call $alignfault) + ) + ) + (v128.store + (local.get $3) + (local.get $2) + ) + ) +) +(module + (type $0 (func (param i64 i64) (result i64))) + (type $1 (func (param i64 i64) (result i32))) + (type $2 (func (param i64 i64 i64))) + (type $3 (func (param i64 i64 i32))) + (type $4 (func (param i64 i64) (result v128))) + (type $5 (func (param i64 i64 v128))) + (type $6 (func (param i64 i64) (result f64))) + (type $7 (func (param i64 i64 f64))) + (type $FUNCSIG$v (func)) + (type $9 (func (param i64 i64) (result f32))) + (type $10 (func (param i64 i64 f32))) + (type $11 (func (result i64))) + (import "env" "emscripten_get_sbrk_ptr" (func $foo (result i64))) + (import "env" "segfault" (func $segfault)) + (import "env" "alignfault" (func $alignfault)) + (memory $0 i64 100 100 shared) + (func $actions + (drop + (call $SAFE_HEAP_LOAD_i32_4_4 + (i64.const 1) + (i64.const 0) + ) + ) + (call $SAFE_HEAP_STORE_i32_4_4 + (i64.const 1) + (i64.const 0) + (i32.const 100) + ) + ) + (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i64) (param $1 i64) (result i32) + (local $2 i64) + (local.set $2 + (i64.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i64.eq + (local.get $2) + (i64.const 0) + ) + (i32.or + (i64.gt_u + (i64.add + (local.get $2) + (i64.const 1) + ) + (i64.load + (call $foo) + ) + ) + (i64.lt_u + (local.get $2) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (i32.load8_s + (local.get $2) + ) + ) + (func $SAFE_HEAP_LOAD_i32_1_AR (param $0 i64) (param $1 i64) (result i32) + (local $2 i64) + (local.set $2 + (i64.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i64.eq + (local.get $2) + (i64.const 0) + ) + (i32.or + (i64.gt_u + (i64.add + (local.get $2) + (i64.const 1) + ) + (i64.load + (call $foo) + ) + ) + (i64.lt_u + (local.get $2) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (i32.shr_s + (i32.shl + (i32.atomic.load8_u acqrel + (local.get $2) + ) + (i32.const 24) + ) + (i32.const 24) + ) + ) + (func $SAFE_HEAP_LOAD_i32_1_SC (param $0 i64) (param $1 i64) (result i32) + (local $2 i64) + (local.set $2 + (i64.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i64.eq + (local.get $2) + (i64.const 0) + ) + (i32.or + (i64.gt_u + (i64.add + (local.get $2) + (i64.const 1) + ) + (i64.load + (call $foo) + ) + ) + (i64.lt_u + (local.get $2) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (i32.shr_s + (i32.shl + (i32.atomic.load8_u + (local.get $2) + ) + (i32.const 24) + ) + (i32.const 24) + ) + ) + (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i64) (param $1 i64) (result i32) + (local $2 i64) + (local.set $2 + (i64.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i64.eq + (local.get $2) + (i64.const 0) + ) + (i32.or + (i64.gt_u + (i64.add + (local.get $2) + (i64.const 1) + ) + (i64.load + (call $foo) + ) + ) + (i64.lt_u + (local.get $2) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (i32.load8_u + (local.get $2) + ) + ) + (func $SAFE_HEAP_LOAD_i32_1_U_AR (param $0 i64) (param $1 i64) (result i32) + (local $2 i64) + (local.set $2 + (i64.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i64.eq + (local.get $2) + (i64.const 0) + ) + (i32.or + (i64.gt_u + (i64.add + (local.get $2) + (i64.const 1) + ) + (i64.load + (call $foo) + ) + ) + (i64.lt_u + (local.get $2) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (i32.atomic.load8_u acqrel + (local.get $2) + ) + ) + (func $SAFE_HEAP_LOAD_i32_1_U_SC (param $0 i64) (param $1 i64) (result i32) + (local $2 i64) + (local.set $2 + (i64.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i64.eq + (local.get $2) + (i64.const 0) + ) + (i32.or + (i64.gt_u + (i64.add + (local.get $2) + (i64.const 1) + ) + (i64.load + (call $foo) + ) + ) + (i64.lt_u + (local.get $2) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (i32.atomic.load8_u + (local.get $2) + ) + ) + (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i64) (param $1 i64) (result i32) + (local $2 i64) + (local.set $2 + (i64.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i64.eq + (local.get $2) + (i64.const 0) + ) + (i32.or + (i64.gt_u + (i64.add + (local.get $2) + (i64.const 2) + ) + (i64.load + (call $foo) + ) + ) + (i64.lt_u + (local.get $2) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (i32.load16_s align=1 + (local.get $2) + ) + ) + (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i64) (param $1 i64) (result i32) + (local $2 i64) + (local.set $2 + (i64.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i64.eq + (local.get $2) + (i64.const 0) + ) + (i32.or + (i64.gt_u + (i64.add + (local.get $2) + (i64.const 2) + ) + (i64.load + (call $foo) + ) + ) + (i64.lt_u + (local.get $2) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (if + (i32.and + (i32.wrap_i64 + (local.get $2) + ) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i32.load16_s + (local.get $2) + ) + ) + (func $SAFE_HEAP_LOAD_i32_2_AR (param $0 i64) (param $1 i64) (result i32) + (local $2 i64) + (local.set $2 + (i64.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i64.eq + (local.get $2) + (i64.const 0) + ) + (i32.or + (i64.gt_u + (i64.add + (local.get $2) + (i64.const 2) + ) + (i64.load + (call $foo) + ) + ) + (i64.lt_u + (local.get $2) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (if + (i32.and + (i32.wrap_i64 + (local.get $2) + ) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i32.shr_s + (i32.shl + (i32.atomic.load16_u acqrel + (local.get $2) + ) + (i32.const 16) + ) + (i32.const 16) + ) + ) + (func $SAFE_HEAP_LOAD_i32_2_SC (param $0 i64) (param $1 i64) (result i32) + (local $2 i64) + (local.set $2 + (i64.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i64.eq + (local.get $2) + (i64.const 0) + ) + (i32.or + (i64.gt_u + (i64.add + (local.get $2) + (i64.const 2) ) (i64.load - (call $emscripten_get_sbrk_ptr) + (call $foo) ) ) (i64.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -7124,51 +8183,25 @@ (if (i32.and (i32.wrap_i64 - (local.get $3) + (local.get $2) ) - (i32.const 15) + (i32.const 1) ) (then (call $alignfault) ) ) - (v128.store - (local.get $3) - (local.get $2) - ) - ) -) -(module - (type $0 (func (param i64 i64) (result i64))) - (type $1 (func (param i64 i64) (result i32))) - (type $2 (func (param i64 i64 i64))) - (type $3 (func (param i64 i64 i32))) - (type $4 (func (param i64 i64) (result v128))) - (type $5 (func (param i64 i64 v128))) - (type $6 (func (param i64 i64) (result f64))) - (type $7 (func (param i64 i64 f64))) - (type $FUNCSIG$v (func)) - (type $9 (func (param i64 i64) (result f32))) - (type $10 (func (param i64 i64 f32))) - (type $11 (func (result i64))) - (import "env" "emscripten_get_sbrk_ptr" (func $foo (result i64))) - (import "env" "segfault" (func $segfault)) - (import "env" "alignfault" (func $alignfault)) - (memory $0 i64 100 100 shared) - (func $actions - (drop - (call $SAFE_HEAP_LOAD_i32_4_4 - (i64.const 1) - (i64.const 0) + (i32.shr_s + (i32.shl + (i32.atomic.load16_u + (local.get $2) + ) + (i32.const 16) ) - ) - (call $SAFE_HEAP_STORE_i32_4_4 - (i64.const 1) - (i64.const 0) - (i32.const 100) + (i32.const 16) ) ) - (func $SAFE_HEAP_LOAD_i32_1_A (param $0 i64) (param $1 i64) (result i32) + (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i64) (param $1 i64) (result i32) (local $2 i64) (local.set $2 (i64.add @@ -7186,7 +8219,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 1) + (i64.const 2) ) (i64.load (call $foo) @@ -7203,17 +8236,11 @@ (unreachable) ) ) - (i32.shr_s - (i32.shl - (i32.atomic.load8_u - (local.get $2) - ) - (i32.const 24) - ) - (i32.const 24) + (i32.load16_u align=1 + (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i64) (param $1 i64) (result i32) + (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i64) (param $1 i64) (result i32) (local $2 i64) (local.set $2 (i64.add @@ -7231,7 +8258,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 1) + (i64.const 2) ) (i64.load (call $foo) @@ -7248,11 +8275,22 @@ (unreachable) ) ) - (i32.load8_s + (if + (i32.and + (i32.wrap_i64 + (local.get $2) + ) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i32.load16_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_1_U_A (param $0 i64) (param $1 i64) (result i32) + (func $SAFE_HEAP_LOAD_i32_2_U_AR (param $0 i64) (param $1 i64) (result i32) (local $2 i64) (local.set $2 (i64.add @@ -7270,7 +8308,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 1) + (i64.const 2) ) (i64.load (call $foo) @@ -7287,11 +8325,22 @@ (unreachable) ) ) - (i32.atomic.load8_u + (if + (i32.and + (i32.wrap_i64 + (local.get $2) + ) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i32.atomic.load16_u acqrel (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i64) (param $1 i64) (result i32) + (func $SAFE_HEAP_LOAD_i32_2_U_SC (param $0 i64) (param $1 i64) (result i32) (local $2 i64) (local.set $2 (i64.add @@ -7309,7 +8358,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 1) + (i64.const 2) ) (i64.load (call $foo) @@ -7326,11 +8375,22 @@ (unreachable) ) ) - (i32.load8_u + (if + (i32.and + (i32.wrap_i64 + (local.get $2) + ) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i32.atomic.load16_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i64) (param $1 i64) (result i32) + (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i64) (param $1 i64) (result i32) (local $2 i64) (local.set $2 (i64.add @@ -7348,7 +8408,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 2) + (i64.const 4) ) (i64.load (call $foo) @@ -7365,11 +8425,11 @@ (unreachable) ) ) - (i32.load16_s align=1 + (i32.load align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_A (param $0 i64) (param $1 i64) (result i32) + (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i64) (param $1 i64) (result i32) (local $2 i64) (local.set $2 (i64.add @@ -7387,7 +8447,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 2) + (i64.const 4) ) (i64.load (call $foo) @@ -7415,17 +8475,11 @@ (call $alignfault) ) ) - (i32.shr_s - (i32.shl - (i32.atomic.load16_u - (local.get $2) - ) - (i32.const 16) - ) - (i32.const 16) + (i32.load align=2 + (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i64) (param $1 i64) (result i32) + (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i64) (param $1 i64) (result i32) (local $2 i64) (local.set $2 (i64.add @@ -7443,7 +8497,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 2) + (i64.const 4) ) (i64.load (call $foo) @@ -7465,17 +8519,17 @@ (i32.wrap_i64 (local.get $2) ) - (i32.const 1) + (i32.const 3) ) (then (call $alignfault) ) ) - (i32.load16_s + (i32.load (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i64) (param $1 i64) (result i32) + (func $SAFE_HEAP_LOAD_i32_4_AR (param $0 i64) (param $1 i64) (result i32) (local $2 i64) (local.set $2 (i64.add @@ -7493,7 +8547,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 2) + (i64.const 4) ) (i64.load (call $foo) @@ -7510,11 +8564,22 @@ (unreachable) ) ) - (i32.load16_u align=1 + (if + (i32.and + (i32.wrap_i64 + (local.get $2) + ) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (i32.atomic.load acqrel (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_U_A (param $0 i64) (param $1 i64) (result i32) + (func $SAFE_HEAP_LOAD_i32_4_SC (param $0 i64) (param $1 i64) (result i32) (local $2 i64) (local.set $2 (i64.add @@ -7532,7 +8597,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 2) + (i64.const 4) ) (i64.load (call $foo) @@ -7554,17 +8619,17 @@ (i32.wrap_i64 (local.get $2) ) - (i32.const 1) + (i32.const 3) ) (then (call $alignfault) ) ) - (i32.atomic.load16_u + (i32.atomic.load (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i64) (param $1 i64) (result i32) + (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -7582,7 +8647,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 2) + (i64.const 1) ) (i64.load (call $foo) @@ -7599,22 +8664,11 @@ (unreachable) ) ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_u + (i64.load8_s (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i64) (param $1 i64) (result i32) + (func $SAFE_HEAP_LOAD_i64_1_AR (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -7632,7 +8686,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 4) + (i64.const 1) ) (i64.load (call $foo) @@ -7649,11 +8703,17 @@ (unreachable) ) ) - (i32.load align=1 - (local.get $2) + (i64.shr_s + (i64.shl + (i64.atomic.load8_u acqrel + (local.get $2) + ) + (i64.const 56) + ) + (i64.const 56) ) ) - (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i64) (param $1 i64) (result i32) + (func $SAFE_HEAP_LOAD_i64_1_SC (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -7671,7 +8731,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 4) + (i64.const 1) ) (i64.load (call $foo) @@ -7688,22 +8748,17 @@ (unreachable) ) ) - (if - (i32.and - (i32.wrap_i64 + (i64.shr_s + (i64.shl + (i64.atomic.load8_u (local.get $2) ) - (i32.const 1) - ) - (then - (call $alignfault) + (i64.const 56) ) - ) - (i32.load align=2 - (local.get $2) + (i64.const 56) ) ) - (func $SAFE_HEAP_LOAD_i32_4_A (param $0 i64) (param $1 i64) (result i32) + (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -7721,7 +8776,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 4) + (i64.const 1) ) (i64.load (call $foo) @@ -7738,22 +8793,11 @@ (unreachable) ) ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load + (i64.load8_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i64) (param $1 i64) (result i32) + (func $SAFE_HEAP_LOAD_i64_1_U_AR (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -7771,7 +8815,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 4) + (i64.const 1) ) (i64.load (call $foo) @@ -7788,22 +8832,50 @@ (unreachable) ) ) + (i64.atomic.load8_u acqrel + (local.get $2) + ) + ) + (func $SAFE_HEAP_LOAD_i64_1_U_SC (param $0 i64) (param $1 i64) (result i64) + (local $2 i64) + (local.set $2 + (i64.add + (local.get $0) + (local.get $1) + ) + ) (if - (i32.and - (i32.wrap_i64 + (i32.or + (i64.eq (local.get $2) + (i64.const 0) + ) + (i32.or + (i64.gt_u + (i64.add + (local.get $2) + (i64.const 1) + ) + (i64.load + (call $foo) + ) + ) + (i64.lt_u + (local.get $2) + (local.get $0) + ) ) - (i32.const 3) ) (then - (call $alignfault) + (call $segfault) + (unreachable) ) ) - (i32.load + (i64.atomic.load8_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_1_A (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -7821,7 +8893,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 1) + (i64.const 2) ) (i64.load (call $foo) @@ -7838,17 +8910,11 @@ (unreachable) ) ) - (i64.shr_s - (i64.shl - (i64.atomic.load8_u - (local.get $2) - ) - (i64.const 56) - ) - (i64.const 56) + (i64.load16_s align=1 + (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -7866,7 +8932,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 1) + (i64.const 2) ) (i64.load (call $foo) @@ -7883,11 +8949,22 @@ (unreachable) ) ) - (i64.load8_s + (if + (i32.and + (i32.wrap_i64 + (local.get $2) + ) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i64.load16_s (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_1_U_A (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_AR (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -7905,7 +8982,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 1) + (i64.const 2) ) (i64.load (call $foo) @@ -7922,11 +8999,28 @@ (unreachable) ) ) - (i64.atomic.load8_u - (local.get $2) + (if + (i32.and + (i32.wrap_i64 + (local.get $2) + ) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i64.shr_s + (i64.shl + (i64.atomic.load16_u acqrel + (local.get $2) + ) + (i64.const 48) + ) + (i64.const 48) ) ) - (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_SC (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -7944,7 +9038,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 1) + (i64.const 2) ) (i64.load (call $foo) @@ -7961,11 +9055,28 @@ (unreachable) ) ) - (i64.load8_u - (local.get $2) + (if + (i32.and + (i32.wrap_i64 + (local.get $2) + ) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i64.shr_s + (i64.shl + (i64.atomic.load16_u + (local.get $2) + ) + (i64.const 48) + ) + (i64.const 48) ) ) - (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -8000,11 +9111,11 @@ (unreachable) ) ) - (i64.load16_s align=1 + (i64.load16_u align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_A (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -8050,17 +9161,11 @@ (call $alignfault) ) ) - (i64.shr_s - (i64.shl - (i64.atomic.load16_u - (local.get $2) - ) - (i64.const 48) - ) - (i64.const 48) + (i64.load16_u + (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_U_AR (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -8106,11 +9211,11 @@ (call $alignfault) ) ) - (i64.load16_s + (i64.atomic.load16_u acqrel (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_U_SC (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -8145,11 +9250,22 @@ (unreachable) ) ) - (i64.load16_u align=1 + (if + (i32.and + (i32.wrap_i64 + (local.get $2) + ) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i64.atomic.load16_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_U_A (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -8167,7 +9283,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 2) + (i64.const 4) ) (i64.load (call $foo) @@ -8184,22 +9300,11 @@ (unreachable) ) ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load16_u + (i64.load32_s align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -8217,7 +9322,7 @@ (i64.gt_u (i64.add (local.get $2) - (i64.const 2) + (i64.const 4) ) (i64.load (call $foo) @@ -8245,11 +9350,11 @@ (call $alignfault) ) ) - (i64.load16_u + (i64.load32_s align=2 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -8284,11 +9389,22 @@ (unreachable) ) ) - (i64.load32_s align=1 + (if + (i32.and + (i32.wrap_i64 + (local.get $2) + ) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (i64.load32_s (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_AR (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -8328,17 +9444,23 @@ (i32.wrap_i64 (local.get $2) ) - (i32.const 1) + (i32.const 3) ) (then (call $alignfault) ) ) - (i64.load32_s align=2 - (local.get $2) + (i64.shr_s + (i64.shl + (i64.atomic.load32_u acqrel + (local.get $2) + ) + (i64.const 32) + ) + (i64.const 32) ) ) - (func $SAFE_HEAP_LOAD_i64_4_A (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_SC (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -8394,7 +9516,7 @@ (i64.const 32) ) ) - (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -8429,22 +9551,11 @@ (unreachable) ) ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s + (i64.load32_u align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -8479,11 +9590,22 @@ (unreachable) ) ) - (i64.load32_u align=1 + (if + (i32.and + (i32.wrap_i64 + (local.get $2) + ) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i64.load32_u align=2 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -8523,17 +9645,17 @@ (i32.wrap_i64 (local.get $2) ) - (i32.const 1) + (i32.const 3) ) (then (call $alignfault) ) ) - (i64.load32_u align=2 + (i64.load32_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_U_A (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_U_AR (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -8579,11 +9701,11 @@ (call $alignfault) ) ) - (i64.atomic.load32_u + (i64.atomic.load32_u acqrel (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_U_SC (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -8629,7 +9751,7 @@ (call $alignfault) ) ) - (i64.load32_u + (i64.atomic.load32_u (local.get $2) ) ) @@ -8772,7 +9894,7 @@ (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_8_A (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -8818,11 +9940,11 @@ (call $alignfault) ) ) - (i64.atomic.load + (i64.load (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i64) (param $1 i64) (result i64) + (func $SAFE_HEAP_LOAD_i64_8_AR (param $0 i64) (param $1 i64) (result i64) (local $2 i64) (local.set $2 (i64.add @@ -8868,7 +9990,57 @@ (call $alignfault) ) ) - (i64.load + (i64.atomic.load acqrel + (local.get $2) + ) + ) + (func $SAFE_HEAP_LOAD_i64_8_SC (param $0 i64) (param $1 i64) (result i64) + (local $2 i64) + (local.set $2 + (i64.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i64.eq + (local.get $2) + (i64.const 0) + ) + (i32.or + (i64.gt_u + (i64.add + (local.get $2) + (i64.const 8) + ) + (i64.load + (call $foo) + ) + ) + (i64.lt_u + (local.get $2) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (if + (i32.and + (i32.wrap_i64 + (local.get $2) + ) + (i32.const 7) + ) + (then + (call $alignfault) + ) + ) + (i64.atomic.load (local.get $2) ) ) diff --git a/test/passes/safe-heap_low-memory-unused_enable-threads_enable-simd.txt b/test/passes/safe-heap_low-memory-unused_enable-threads_enable-simd.txt index 72b68f218e5..69a0ee4ed64 100644 --- a/test/passes/safe-heap_low-memory-unused_enable-threads_enable-simd.txt +++ b/test/passes/safe-heap_low-memory-unused_enable-threads_enable-simd.txt @@ -23,7 +23,7 @@ ) ) (drop - (call $SAFE_HEAP_LOAD_i32_4_A + (call $SAFE_HEAP_LOAD_i32_4_SC (i32.const 1) (i32.const 0) ) @@ -184,7 +184,7 @@ (v128.const i32x4 0x00000001 0x00000002 0x00000003 0x00000004) ) ) - (func $SAFE_HEAP_LOAD_i32_1_A (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -219,17 +219,11 @@ (unreachable) ) ) - (i32.shr_s - (i32.shl - (i32.atomic.load8_u - (local.get $2) - ) - (i32.const 24) - ) - (i32.const 24) + (i32.load8_s + (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_1_AR (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -264,11 +258,17 @@ (unreachable) ) ) - (i32.load8_s - (local.get $2) + (i32.shr_s + (i32.shl + (i32.atomic.load8_u acqrel + (local.get $2) + ) + (i32.const 24) + ) + (i32.const 24) ) ) - (func $SAFE_HEAP_LOAD_i32_1_U_A (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_1_SC (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -303,8 +303,14 @@ (unreachable) ) ) - (i32.atomic.load8_u - (local.get $2) + (i32.shr_s + (i32.shl + (i32.atomic.load8_u + (local.get $2) + ) + (i32.const 24) + ) + (i32.const 24) ) ) (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) @@ -346,7 +352,7 @@ (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_1_U_AR (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -364,7 +370,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 2) + (i32.const 1) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -381,11 +387,11 @@ (unreachable) ) ) - (i32.load16_s align=1 + (i32.atomic.load8_u acqrel (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_A (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_1_U_SC (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -403,7 +409,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 2) + (i32.const 1) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -420,26 +426,11 @@ (unreachable) ) ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load16_u - (local.get $2) - ) - (i32.const 16) - ) - (i32.const 16) + (i32.atomic.load8_u + (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -474,20 +465,11 @@ (unreachable) ) ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_s + (i32.load16_s align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -522,11 +504,20 @@ (unreachable) ) ) - (i32.load16_u align=1 + (if + (i32.and + (local.get $2) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i32.load16_s (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_U_A (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_2_AR (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -570,11 +561,17 @@ (call $alignfault) ) ) - (i32.atomic.load16_u - (local.get $2) + (i32.shr_s + (i32.shl + (i32.atomic.load16_u acqrel + (local.get $2) + ) + (i32.const 16) + ) + (i32.const 16) ) ) - (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_2_SC (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -618,11 +615,17 @@ (call $alignfault) ) ) - (i32.load16_u - (local.get $2) + (i32.shr_s + (i32.shl + (i32.atomic.load16_u + (local.get $2) + ) + (i32.const 16) + ) + (i32.const 16) ) ) - (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -640,7 +643,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 4) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -657,11 +660,11 @@ (unreachable) ) ) - (i32.load align=1 + (i32.load16_u align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -679,7 +682,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 4) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -705,11 +708,11 @@ (call $alignfault) ) ) - (i32.load align=2 + (i32.load16_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_4_A (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_2_U_AR (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -727,7 +730,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 4) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -747,17 +750,17 @@ (if (i32.and (local.get $2) - (i32.const 3) + (i32.const 1) ) (then (call $alignfault) ) ) - (i32.atomic.load + (i32.atomic.load16_u acqrel (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_2_U_SC (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -775,7 +778,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 4) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -795,17 +798,17 @@ (if (i32.and (local.get $2) - (i32.const 3) + (i32.const 1) ) (then (call $alignfault) ) ) - (i32.load + (i32.atomic.load16_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_1_A (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -823,7 +826,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 1) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -840,17 +843,11 @@ (unreachable) ) ) - (i64.shr_s - (i64.shl - (i64.atomic.load8_u - (local.get $2) - ) - (i64.const 56) - ) - (i64.const 56) + (i32.load align=1 + (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -868,7 +865,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 1) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -885,11 +882,20 @@ (unreachable) ) ) - (i64.load8_s + (if + (i32.and + (local.get $2) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i32.load align=2 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_1_U_A (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -907,7 +913,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 1) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -924,11 +930,20 @@ (unreachable) ) ) - (i64.atomic.load8_u + (if + (i32.and + (local.get $2) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (i32.load (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i32_4_AR (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -946,7 +961,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 1) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -963,11 +978,20 @@ (unreachable) ) ) - (i64.load8_u + (if + (i32.and + (local.get $2) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (i32.atomic.load acqrel (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i32_4_SC (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -985,7 +1009,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 2) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -1002,11 +1026,20 @@ (unreachable) ) ) - (i64.load16_s align=1 + (if + (i32.and + (local.get $2) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (i32.atomic.load (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_A (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1024,7 +1057,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 2) + (i32.const 1) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -1041,26 +1074,11 @@ (unreachable) ) ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load16_u - (local.get $2) - ) - (i64.const 48) - ) - (i64.const 48) + (i64.load8_s + (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_1_AR (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1078,7 +1096,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 2) + (i32.const 1) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -1095,20 +1113,17 @@ (unreachable) ) ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) + (i64.shr_s + (i64.shl + (i64.atomic.load8_u acqrel + (local.get $2) + ) + (i64.const 56) ) - ) - (i64.load16_s - (local.get $2) + (i64.const 56) ) ) - (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_1_SC (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1126,7 +1141,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 2) + (i32.const 1) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -1143,11 +1158,17 @@ (unreachable) ) ) - (i64.load16_u align=1 - (local.get $2) + (i64.shr_s + (i64.shl + (i64.atomic.load8_u + (local.get $2) + ) + (i64.const 56) + ) + (i64.const 56) ) ) - (func $SAFE_HEAP_LOAD_i64_2_U_A (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1165,7 +1186,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 2) + (i32.const 1) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -1182,20 +1203,11 @@ (unreachable) ) ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load16_u + (i64.load8_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_1_U_AR (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1213,7 +1225,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 2) + (i32.const 1) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -1230,20 +1242,50 @@ (unreachable) ) ) + (i64.atomic.load8_u acqrel + (local.get $2) + ) + ) + (func $SAFE_HEAP_LOAD_i64_1_U_SC (param $0 i32) (param $1 i32) (result i64) + (local $2 i32) + (local.set $2 + (i32.add + (local.get $0) + (local.get $1) + ) + ) (if - (i32.and - (local.get $2) - (i32.const 1) + (i32.or + (i32.lt_u + (local.get $2) + (i32.const 1024) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $2) + (i32.const 1) + ) + (i32.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i32.lt_u + (local.get $2) + (local.get $0) + ) + ) ) (then - (call $alignfault) + (call $segfault) + (unreachable) ) ) - (i64.load16_u + (i64.atomic.load8_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1261,7 +1303,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 4) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -1278,11 +1320,11 @@ (unreachable) ) ) - (i64.load32_s align=1 + (i64.load16_s align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1300,7 +1342,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 4) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -1326,11 +1368,11 @@ (call $alignfault) ) ) - (i64.load32_s align=2 + (i64.load16_s (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_A (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_AR (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1348,7 +1390,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 4) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -1368,7 +1410,7 @@ (if (i32.and (local.get $2) - (i32.const 3) + (i32.const 1) ) (then (call $alignfault) @@ -1376,15 +1418,15 @@ ) (i64.shr_s (i64.shl - (i64.atomic.load32_u + (i64.atomic.load16_u acqrel (local.get $2) ) - (i64.const 32) + (i64.const 48) ) - (i64.const 32) + (i64.const 48) ) ) - (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_SC (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1402,7 +1444,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 4) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -1422,17 +1464,23 @@ (if (i32.and (local.get $2) - (i32.const 3) + (i32.const 1) ) (then (call $alignfault) ) ) - (i64.load32_s - (local.get $2) + (i64.shr_s + (i64.shl + (i64.atomic.load16_u + (local.get $2) + ) + (i64.const 48) + ) + (i64.const 48) ) ) - (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1450,7 +1498,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 4) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -1467,11 +1515,11 @@ (unreachable) ) ) - (i64.load32_u align=1 + (i64.load16_u align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1489,7 +1537,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 4) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -1515,11 +1563,11 @@ (call $alignfault) ) ) - (i64.load32_u align=2 + (i64.load16_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_U_A (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_U_AR (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1537,7 +1585,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 4) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -1557,17 +1605,17 @@ (if (i32.and (local.get $2) - (i32.const 3) + (i32.const 1) ) (then (call $alignfault) ) ) - (i64.atomic.load32_u + (i64.atomic.load16_u acqrel (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_U_SC (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1585,7 +1633,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 4) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -1605,17 +1653,17 @@ (if (i32.and (local.get $2) - (i32.const 3) + (i32.const 1) ) (then (call $alignfault) ) ) - (i64.load32_u + (i64.atomic.load16_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1633,7 +1681,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 8) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -1650,11 +1698,11 @@ (unreachable) ) ) - (i64.load align=1 + (i64.load32_s align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1672,7 +1720,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 8) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -1698,11 +1746,11 @@ (call $alignfault) ) ) - (i64.load align=2 + (i64.load32_s align=2 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1720,7 +1768,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 8) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -1746,11 +1794,11 @@ (call $alignfault) ) ) - (i64.load align=4 + (i64.load32_s (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_8_A (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_AR (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1768,7 +1816,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 8) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -1788,17 +1836,23 @@ (if (i32.and (local.get $2) - (i32.const 7) + (i32.const 3) ) (then (call $alignfault) ) ) - (i64.atomic.load - (local.get $2) + (i64.shr_s + (i64.shl + (i64.atomic.load32_u acqrel + (local.get $2) + ) + (i64.const 32) + ) + (i64.const 32) ) ) - (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_SC (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1816,7 +1870,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 8) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -1836,17 +1890,23 @@ (if (i32.and (local.get $2) - (i32.const 7) + (i32.const 3) ) (then (call $alignfault) ) ) - (i64.load - (local.get $2) + (i64.shr_s + (i64.shl + (i64.atomic.load32_u + (local.get $2) + ) + (i64.const 32) + ) + (i64.const 32) ) ) - (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) + (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1881,11 +1941,11 @@ (unreachable) ) ) - (f32.load align=1 + (i64.load32_u align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) + (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1929,11 +1989,11 @@ (call $alignfault) ) ) - (f32.load align=2 + (i64.load32_u align=2 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) + (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1977,11 +2037,11 @@ (call $alignfault) ) ) - (f32.load + (i64.load32_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) + (func $SAFE_HEAP_LOAD_i64_4_U_AR (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -1999,7 +2059,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 8) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -2016,11 +2076,20 @@ (unreachable) ) ) - (f64.load align=1 + (if + (i32.and + (local.get $2) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (i64.atomic.load32_u acqrel (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) + (func $SAFE_HEAP_LOAD_i64_4_U_SC (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -2038,7 +2107,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 8) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -2058,17 +2127,17 @@ (if (i32.and (local.get $2) - (i32.const 1) + (i32.const 3) ) (then (call $alignfault) ) ) - (f64.load align=2 + (i64.atomic.load32_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) + (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -2103,20 +2172,11 @@ (unreachable) ) ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=4 + (i64.load align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) + (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -2154,17 +2214,17 @@ (if (i32.and (local.get $2) - (i32.const 7) + (i32.const 1) ) (then (call $alignfault) ) ) - (f64.load + (i64.load align=2 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) + (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -2182,7 +2242,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 16) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -2199,11 +2259,20 @@ (unreachable) ) ) - (v128.load align=1 + (if + (i32.and + (local.get $2) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (i64.load align=4 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) + (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -2221,7 +2290,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 16) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -2241,17 +2310,17 @@ (if (i32.and (local.get $2) - (i32.const 1) + (i32.const 7) ) (then (call $alignfault) ) ) - (v128.load align=2 + (i64.load (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) + (func $SAFE_HEAP_LOAD_i64_8_AR (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -2269,7 +2338,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 16) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -2289,17 +2358,17 @@ (if (i32.and (local.get $2) - (i32.const 3) + (i32.const 7) ) (then (call $alignfault) ) ) - (v128.load align=4 + (i64.atomic.load acqrel (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) + (func $SAFE_HEAP_LOAD_i64_8_SC (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -2317,7 +2386,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 16) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -2343,11 +2412,11 @@ (call $alignfault) ) ) - (v128.load align=8 + (i64.atomic.load (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i32) (param $1 i32) (result v128) + (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) (local $2 i32) (local.set $2 (i32.add @@ -2365,7 +2434,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 16) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -2382,22 +2451,13 @@ (unreachable) ) ) - (if - (i32.and - (local.get $2) - (i32.const 15) - ) - (then - (call $alignfault) - ) - ) - (v128.load + (f32.load align=1 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_1_A (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 + (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) + (local $2 i32) + (local.set $2 (i32.add (local.get $0) (local.get $1) @@ -2406,21 +2466,21 @@ (if (i32.or (i32.lt_u - (local.get $3) + (local.get $2) (i32.const 1024) ) (i32.or (i32.gt_u (i32.add - (local.get $3) - (i32.const 1) + (local.get $2) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -2430,14 +2490,22 @@ (unreachable) ) ) - (i32.atomic.store8 - (local.get $3) + (if + (i32.and + (local.get $2) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (f32.load align=2 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 + (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) + (local $2 i32) + (local.set $2 (i32.add (local.get $0) (local.get $1) @@ -2446,21 +2514,21 @@ (if (i32.or (i32.lt_u - (local.get $3) + (local.get $2) (i32.const 1024) ) (i32.or (i32.gt_u (i32.add - (local.get $3) - (i32.const 1) + (local.get $2) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -2470,14 +2538,22 @@ (unreachable) ) ) - (i32.store8 - (local.get $3) + (if + (i32.and + (local.get $2) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (f32.load (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 + (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) + (local $2 i32) + (local.set $2 (i32.add (local.get $0) (local.get $1) @@ -2486,21 +2562,21 @@ (if (i32.or (i32.lt_u - (local.get $3) + (local.get $2) (i32.const 1024) ) (i32.or (i32.gt_u (i32.add - (local.get $3) - (i32.const 2) + (local.get $2) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -2510,14 +2586,13 @@ (unreachable) ) ) - (i32.store16 align=1 - (local.get $3) + (f64.load align=1 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_2_A (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 + (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) + (local $2 i32) + (local.set $2 (i32.add (local.get $0) (local.get $1) @@ -2526,21 +2601,21 @@ (if (i32.or (i32.lt_u - (local.get $3) + (local.get $2) (i32.const 1024) ) (i32.or (i32.gt_u (i32.add - (local.get $3) - (i32.const 2) + (local.get $2) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -2552,21 +2627,20 @@ ) (if (i32.and - (local.get $3) + (local.get $2) (i32.const 1) ) (then (call $alignfault) ) ) - (i32.atomic.store16 - (local.get $3) + (f64.load align=2 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 + (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) + (local $2 i32) + (local.set $2 (i32.add (local.get $0) (local.get $1) @@ -2575,21 +2649,21 @@ (if (i32.or (i32.lt_u - (local.get $3) + (local.get $2) (i32.const 1024) ) (i32.or (i32.gt_u (i32.add - (local.get $3) - (i32.const 2) + (local.get $2) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -2601,21 +2675,20 @@ ) (if (i32.and - (local.get $3) - (i32.const 1) + (local.get $2) + (i32.const 3) ) (then (call $alignfault) ) ) - (i32.store16 - (local.get $3) + (f64.load align=4 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 + (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) + (local $2 i32) + (local.set $2 (i32.add (local.get $0) (local.get $1) @@ -2624,21 +2697,21 @@ (if (i32.or (i32.lt_u - (local.get $3) + (local.get $2) (i32.const 1024) ) (i32.or (i32.gt_u (i32.add - (local.get $3) - (i32.const 4) + (local.get $2) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -2648,14 +2721,22 @@ (unreachable) ) ) - (i32.store align=1 - (local.get $3) + (if + (i32.and + (local.get $2) + (i32.const 7) + ) + (then + (call $alignfault) + ) + ) + (f64.load (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 + (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) + (local $2 i32) + (local.set $2 (i32.add (local.get $0) (local.get $1) @@ -2664,21 +2745,21 @@ (if (i32.or (i32.lt_u - (local.get $3) + (local.get $2) (i32.const 1024) ) (i32.or (i32.gt_u (i32.add - (local.get $3) - (i32.const 4) + (local.get $2) + (i32.const 16) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -2688,23 +2769,13 @@ (unreachable) ) ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.store align=2 - (local.get $3) + (v128.load align=1 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_4_A (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 + (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) + (local $2 i32) + (local.set $2 (i32.add (local.get $0) (local.get $1) @@ -2713,21 +2784,21 @@ (if (i32.or (i32.lt_u - (local.get $3) + (local.get $2) (i32.const 1024) ) (i32.or (i32.gt_u (i32.add - (local.get $3) - (i32.const 4) + (local.get $2) + (i32.const 16) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -2739,21 +2810,20 @@ ) (if (i32.and - (local.get $3) - (i32.const 3) + (local.get $2) + (i32.const 1) ) (then (call $alignfault) ) ) - (i32.atomic.store - (local.get $3) + (v128.load align=2 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 + (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) + (local $2 i32) + (local.set $2 (i32.add (local.get $0) (local.get $1) @@ -2762,21 +2832,21 @@ (if (i32.or (i32.lt_u - (local.get $3) + (local.get $2) (i32.const 1024) ) (i32.or (i32.gt_u (i32.add - (local.get $3) - (i32.const 4) + (local.get $2) + (i32.const 16) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -2788,21 +2858,20 @@ ) (if (i32.and - (local.get $3) + (local.get $2) (i32.const 3) ) (then (call $alignfault) ) ) - (i32.store - (local.get $3) + (v128.load align=4 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_1_A (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 + (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) + (local $2 i32) + (local.set $2 (i32.add (local.get $0) (local.get $1) @@ -2811,21 +2880,21 @@ (if (i32.or (i32.lt_u - (local.get $3) + (local.get $2) (i32.const 1024) ) (i32.or (i32.gt_u (i32.add - (local.get $3) - (i32.const 1) + (local.get $2) + (i32.const 16) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -2835,14 +2904,22 @@ (unreachable) ) ) - (i64.atomic.store8 - (local.get $3) + (if + (i32.and + (local.get $2) + (i32.const 7) + ) + (then + (call $alignfault) + ) + ) + (v128.load align=8 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 + (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i32) (param $1 i32) (result v128) + (local $2 i32) + (local.set $2 (i32.add (local.get $0) (local.get $1) @@ -2851,21 +2928,21 @@ (if (i32.or (i32.lt_u - (local.get $3) + (local.get $2) (i32.const 1024) ) (i32.or (i32.gt_u (i32.add - (local.get $3) - (i32.const 1) + (local.get $2) + (i32.const 16) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -2875,12 +2952,20 @@ (unreachable) ) ) - (i64.store8 - (local.get $3) + (if + (i32.and + (local.get $2) + (i32.const 15) + ) + (then + (call $alignfault) + ) + ) + (v128.load (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_1_A (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local.set $3 (i32.add @@ -2898,7 +2983,7 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 2) + (i32.const 1) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -2915,12 +3000,92 @@ (unreachable) ) ) - (i64.store16 align=1 + (i32.atomic.store8 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_2_A (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local.set $3 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.lt_u + (local.get $3) + (i32.const 1024) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $3) + (i32.const 1) + ) + (i32.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i32.lt_u + (local.get $3) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (i32.store8 + (local.get $3) + (local.get $2) + ) + ) + (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) + (local $3 i32) + (local.set $3 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.lt_u + (local.get $3) + (i32.const 1024) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $3) + (i32.const 2) + ) + (i32.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i32.lt_u + (local.get $3) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (i32.store16 align=1 + (local.get $3) + (local.get $2) + ) + ) + (func $SAFE_HEAP_STORE_i32_2_A (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local.set $3 (i32.add @@ -2964,12 +3129,12 @@ (call $alignfault) ) ) - (i64.atomic.store16 + (i32.atomic.store16 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local.set $3 (i32.add @@ -3013,12 +3178,12 @@ (call $alignfault) ) ) - (i64.store16 + (i32.store16 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local.set $3 (i32.add @@ -3053,12 +3218,12 @@ (unreachable) ) ) - (i64.store32 align=1 + (i32.store align=1 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local.set $3 (i32.add @@ -3102,12 +3267,12 @@ (call $alignfault) ) ) - (i64.store32 align=2 + (i32.store align=2 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_4_A (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_4_A (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local.set $3 (i32.add @@ -3151,12 +3316,12 @@ (call $alignfault) ) ) - (i64.atomic.store32 + (i32.atomic.store (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local.set $3 (i32.add @@ -3200,12 +3365,12 @@ (call $alignfault) ) ) - (i64.store32 + (i32.store (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i64_1_A (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -3223,7 +3388,7 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 8) + (i32.const 1) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -3240,12 +3405,12 @@ (unreachable) ) ) - (i64.store align=1 + (i64.atomic.store8 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -3263,7 +3428,7 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 8) + (i32.const 1) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -3280,21 +3445,12 @@ (unreachable) ) ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=2 + (i64.store8 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -3312,7 +3468,7 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 8) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -3329,21 +3485,12 @@ (unreachable) ) ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=4 + (i64.store16 align=1 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_8_A (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i64_2_A (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -3361,7 +3508,7 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 8) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -3381,18 +3528,18 @@ (if (i32.and (local.get $3) - (i32.const 7) + (i32.const 1) ) (then (call $alignfault) ) ) - (i64.atomic.store + (i64.atomic.store16 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -3410,7 +3557,7 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 8) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -3430,18 +3577,18 @@ (if (i32.and (local.get $3) - (i32.const 7) + (i32.const 1) ) (then (call $alignfault) ) ) - (i64.store + (i64.store16 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i32) (param $1 i32) (param $2 f32) + (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -3476,12 +3623,12 @@ (unreachable) ) ) - (f32.store align=1 + (i64.store32 align=1 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) + (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -3525,12 +3672,12 @@ (call $alignfault) ) ) - (f32.store align=2 + (i64.store32 align=2 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) + (func $SAFE_HEAP_STORE_i64_4_A (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -3574,12 +3721,12 @@ (call $alignfault) ) ) - (f32.store + (i64.atomic.store32 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) + (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -3597,7 +3744,7 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 8) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -3614,12 +3761,21 @@ (unreachable) ) ) - (f64.store align=1 + (if + (i32.and + (local.get $3) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (i64.store32 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) + (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -3654,21 +3810,12 @@ (unreachable) ) ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=2 + (i64.store align=1 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) + (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -3706,18 +3853,18 @@ (if (i32.and (local.get $3) - (i32.const 3) + (i32.const 1) ) (then (call $alignfault) ) ) - (f64.store align=4 + (i64.store align=2 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) + (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -3755,18 +3902,18 @@ (if (i32.and (local.get $3) - (i32.const 7) + (i32.const 3) ) (then (call $alignfault) ) ) - (f64.store + (i64.store align=4 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) + (func $SAFE_HEAP_STORE_i64_8_A (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -3784,7 +3931,7 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 16) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -3801,12 +3948,21 @@ (unreachable) ) ) - (v128.store align=1 + (if + (i32.and + (local.get $3) + (i32.const 7) + ) + (then + (call $alignfault) + ) + ) + (i64.atomic.store (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) + (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -3824,7 +3980,7 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 16) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -3844,18 +4000,18 @@ (if (i32.and (local.get $3) - (i32.const 1) + (i32.const 7) ) (then (call $alignfault) ) ) - (v128.store align=2 + (i64.store (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) + (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i32) (param $1 i32) (param $2 f32) (local $3 i32) (local.set $3 (i32.add @@ -3873,7 +4029,7 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 16) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -3890,21 +4046,12 @@ (unreachable) ) ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=4 + (f32.store align=1 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) + (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) (local $3 i32) (local.set $3 (i32.add @@ -3922,7 +4069,7 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 16) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -3942,18 +4089,18 @@ (if (i32.and (local.get $3) - (i32.const 7) + (i32.const 1) ) (then (call $alignfault) ) ) - (v128.store align=8 + (f32.store align=2 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) + (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) (local $3 i32) (local.set $3 (i32.add @@ -3971,7 +4118,7 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 16) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -3991,46 +4138,20 @@ (if (i32.and (local.get $3) - (i32.const 15) + (i32.const 3) ) (then (call $alignfault) ) ) - (v128.store + (f32.store (local.get $3) (local.get $2) ) ) -) -(module - (type $0 (func (param i32 i32) (result i64))) - (type $1 (func (param i32 i32 i64))) - (type $2 (func (param i32 i32) (result i32))) - (type $3 (func (param i32 i32 i32))) - (type $4 (func (param i32 i32) (result v128))) - (type $5 (func (param i32 i32 v128))) - (type $6 (func (param i32 i32) (result f64))) - (type $7 (func (param i32 i32 f64))) - (type $8 (func)) - (type $9 (func (param i32 i32) (result f32))) - (type $10 (func (param i32 i32 f32))) - (type $11 (func (result i32))) - (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i32))) - (import "env" "segfault" (func $segfault)) - (import "env" "alignfault" (func $alignfault)) - (memory $0 100 100) - (func $loads - (drop - (call $SAFE_HEAP_LOAD_i32_4_4 - (i32.const 1) - (i32.const 0) - ) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 + (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) + (local $3 i32) + (local.set $3 (i32.add (local.get $0) (local.get $1) @@ -4039,21 +4160,21 @@ (if (i32.or (i32.lt_u - (local.get $2) + (local.get $3) (i32.const 1024) ) (i32.or (i32.gt_u (i32.add - (local.get $2) - (i32.const 1) + (local.get $3) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $2) + (local.get $3) (local.get $0) ) ) @@ -4063,13 +4184,14 @@ (unreachable) ) ) - (i32.load8_s + (f64.store align=1 + (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 + (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) + (local $3 i32) + (local.set $3 (i32.add (local.get $0) (local.get $1) @@ -4078,21 +4200,21 @@ (if (i32.or (i32.lt_u - (local.get $2) + (local.get $3) (i32.const 1024) ) (i32.or (i32.gt_u (i32.add - (local.get $2) - (i32.const 1) + (local.get $3) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $2) + (local.get $3) (local.get $0) ) ) @@ -4102,13 +4224,23 @@ (unreachable) ) ) - (i32.load8_u + (if + (i32.and + (local.get $3) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (f64.store align=2 + (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 + (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) + (local $3 i32) + (local.set $3 (i32.add (local.get $0) (local.get $1) @@ -4117,21 +4249,21 @@ (if (i32.or (i32.lt_u - (local.get $2) + (local.get $3) (i32.const 1024) ) (i32.or (i32.gt_u (i32.add - (local.get $2) - (i32.const 2) + (local.get $3) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $2) + (local.get $3) (local.get $0) ) ) @@ -4141,13 +4273,23 @@ (unreachable) ) ) - (i32.load16_s align=1 + (if + (i32.and + (local.get $3) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (f64.store align=4 + (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 + (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) + (local $3 i32) + (local.set $3 (i32.add (local.get $0) (local.get $1) @@ -4156,21 +4298,21 @@ (if (i32.or (i32.lt_u - (local.get $2) + (local.get $3) (i32.const 1024) ) (i32.or (i32.gt_u (i32.add - (local.get $2) - (i32.const 2) + (local.get $3) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $2) + (local.get $3) (local.get $0) ) ) @@ -4182,20 +4324,21 @@ ) (if (i32.and - (local.get $2) - (i32.const 1) + (local.get $3) + (i32.const 7) ) (then (call $alignfault) ) ) - (i32.load16_s + (f64.store + (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 + (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) + (local $3 i32) + (local.set $3 (i32.add (local.get $0) (local.get $1) @@ -4204,21 +4347,21 @@ (if (i32.or (i32.lt_u - (local.get $2) + (local.get $3) (i32.const 1024) ) (i32.or (i32.gt_u (i32.add - (local.get $2) - (i32.const 2) + (local.get $3) + (i32.const 16) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $2) + (local.get $3) (local.get $0) ) ) @@ -4228,13 +4371,14 @@ (unreachable) ) ) - (i32.load16_u align=1 + (v128.store align=1 + (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 + (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) + (local $3 i32) + (local.set $3 (i32.add (local.get $0) (local.get $1) @@ -4243,21 +4387,21 @@ (if (i32.or (i32.lt_u - (local.get $2) + (local.get $3) (i32.const 1024) ) (i32.or (i32.gt_u (i32.add - (local.get $2) - (i32.const 2) + (local.get $3) + (i32.const 16) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $2) + (local.get $3) (local.get $0) ) ) @@ -4269,20 +4413,21 @@ ) (if (i32.and - (local.get $2) + (local.get $3) (i32.const 1) ) (then (call $alignfault) ) ) - (i32.load16_u + (v128.store align=2 + (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 + (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) + (local $3 i32) + (local.set $3 (i32.add (local.get $0) (local.get $1) @@ -4291,21 +4436,21 @@ (if (i32.or (i32.lt_u - (local.get $2) + (local.get $3) (i32.const 1024) ) (i32.or (i32.gt_u (i32.add - (local.get $2) - (i32.const 4) + (local.get $3) + (i32.const 16) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $2) + (local.get $3) (local.get $0) ) ) @@ -4315,13 +4460,23 @@ (unreachable) ) ) - (i32.load align=1 + (if + (i32.and + (local.get $3) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (v128.store align=4 + (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 + (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) + (local $3 i32) + (local.set $3 (i32.add (local.get $0) (local.get $1) @@ -4330,21 +4485,21 @@ (if (i32.or (i32.lt_u - (local.get $2) + (local.get $3) (i32.const 1024) ) (i32.or (i32.gt_u (i32.add - (local.get $2) - (i32.const 4) + (local.get $3) + (i32.const 16) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $2) + (local.get $3) (local.get $0) ) ) @@ -4356,20 +4511,21 @@ ) (if (i32.and - (local.get $2) - (i32.const 1) + (local.get $3) + (i32.const 7) ) (then (call $alignfault) ) ) - (i32.load align=2 + (v128.store align=8 + (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 + (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) + (local $3 i32) + (local.set $3 (i32.add (local.get $0) (local.get $1) @@ -4378,21 +4534,21 @@ (if (i32.or (i32.lt_u - (local.get $2) + (local.get $3) (i32.const 1024) ) (i32.or (i32.gt_u (i32.add - (local.get $2) - (i32.const 4) + (local.get $3) + (i32.const 16) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $2) + (local.get $3) (local.get $0) ) ) @@ -4404,18 +4560,45 @@ ) (if (i32.and - (local.get $2) - (i32.const 3) + (local.get $3) + (i32.const 15) ) (then (call $alignfault) ) ) - (i32.load + (v128.store + (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) +) +(module + (type $0 (func (param i32 i32) (result i64))) + (type $1 (func (param i32 i32 i64))) + (type $2 (func (param i32 i32) (result i32))) + (type $3 (func (param i32 i32 i32))) + (type $4 (func (param i32 i32) (result v128))) + (type $5 (func (param i32 i32 v128))) + (type $6 (func (param i32 i32) (result f64))) + (type $7 (func (param i32 i32 f64))) + (type $8 (func)) + (type $9 (func (param i32 i32) (result f32))) + (type $10 (func (param i32 i32 f32))) + (type $11 (func (result i32))) + (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i32))) + (import "env" "segfault" (func $segfault)) + (import "env" "alignfault" (func $alignfault)) + (memory $0 100 100) + (func $loads + (drop + (call $SAFE_HEAP_LOAD_i32_4_4 + (i32.const 1) + (i32.const 0) + ) + ) + ) + (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -4450,11 +4633,11 @@ (unreachable) ) ) - (i64.load8_s + (i32.load8_s (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -4489,11 +4672,11 @@ (unreachable) ) ) - (i64.load8_u + (i32.load8_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -4528,11 +4711,11 @@ (unreachable) ) ) - (i64.load16_s align=1 + (i32.load16_s align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -4576,11 +4759,11 @@ (call $alignfault) ) ) - (i64.load16_s + (i32.load16_s (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -4615,11 +4798,11 @@ (unreachable) ) ) - (i64.load16_u align=1 + (i32.load16_u align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -4663,11 +4846,11 @@ (call $alignfault) ) ) - (i64.load16_u + (i32.load16_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -4702,11 +4885,11 @@ (unreachable) ) ) - (i64.load32_s align=1 + (i32.load align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -4750,11 +4933,11 @@ (call $alignfault) ) ) - (i64.load32_s align=2 + (i32.load align=2 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -4798,11 +4981,11 @@ (call $alignfault) ) ) - (i64.load32_s + (i32.load (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -4820,7 +5003,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 4) + (i32.const 1) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -4837,11 +5020,11 @@ (unreachable) ) ) - (i64.load32_u align=1 + (i64.load8_s (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -4859,7 +5042,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 4) + (i32.const 1) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -4876,20 +5059,50 @@ (unreachable) ) ) + (i64.load8_u + (local.get $2) + ) + ) + (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) + (local $2 i32) + (local.set $2 + (i32.add + (local.get $0) + (local.get $1) + ) + ) (if - (i32.and - (local.get $2) - (i32.const 1) + (i32.or + (i32.lt_u + (local.get $2) + (i32.const 1024) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $2) + (i32.const 2) + ) + (i32.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i32.lt_u + (local.get $2) + (local.get $0) + ) + ) ) (then - (call $alignfault) + (call $segfault) + (unreachable) ) ) - (i64.load32_u align=2 + (i64.load16_s align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -4907,7 +5120,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 4) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -4927,17 +5140,17 @@ (if (i32.and (local.get $2) - (i32.const 3) + (i32.const 1) ) (then (call $alignfault) ) ) - (i64.load32_u + (i64.load16_s (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -4955,7 +5168,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 8) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -4972,11 +5185,11 @@ (unreachable) ) ) - (i64.load align=1 + (i64.load16_u align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -4994,7 +5207,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 8) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -5020,11 +5233,11 @@ (call $alignfault) ) ) - (i64.load align=2 + (i64.load16_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -5042,7 +5255,46 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 8) + (i32.const 4) + ) + (i32.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i32.lt_u + (local.get $2) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (i64.load32_s align=1 + (local.get $2) + ) + ) + (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) + (local $2 i32) + (local.set $2 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.lt_u + (local.get $2) + (i32.const 1024) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $2) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -5062,17 +5314,17 @@ (if (i32.and (local.get $2) - (i32.const 3) + (i32.const 1) ) (then (call $alignfault) ) ) - (i64.load align=4 + (i64.load32_s align=2 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -5090,7 +5342,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 8) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -5110,17 +5362,17 @@ (if (i32.and (local.get $2) - (i32.const 7) + (i32.const 3) ) (then (call $alignfault) ) ) - (i64.load + (i64.load32_s (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) + (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -5155,11 +5407,11 @@ (unreachable) ) ) - (f32.load align=1 + (i64.load32_u align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) + (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -5203,11 +5455,11 @@ (call $alignfault) ) ) - (f32.load align=2 + (i64.load32_u align=2 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) + (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -5251,11 +5503,11 @@ (call $alignfault) ) ) - (f32.load + (i64.load32_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) + (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -5290,11 +5542,11 @@ (unreachable) ) ) - (f64.load align=1 + (i64.load align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) + (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -5338,11 +5590,11 @@ (call $alignfault) ) ) - (f64.load align=2 + (i64.load align=2 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) + (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -5386,11 +5638,11 @@ (call $alignfault) ) ) - (f64.load align=4 + (i64.load align=4 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) + (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -5434,11 +5686,11 @@ (call $alignfault) ) ) - (f64.load + (i64.load (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) + (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) (local $2 i32) (local.set $2 (i32.add @@ -5456,7 +5708,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 16) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -5473,11 +5725,11 @@ (unreachable) ) ) - (v128.load align=1 + (f32.load align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) + (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) (local $2 i32) (local.set $2 (i32.add @@ -5495,7 +5747,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 16) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -5521,11 +5773,11 @@ (call $alignfault) ) ) - (v128.load align=2 + (f32.load align=2 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) + (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) (local $2 i32) (local.set $2 (i32.add @@ -5543,7 +5795,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 16) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -5569,11 +5821,11 @@ (call $alignfault) ) ) - (v128.load align=4 + (f32.load (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) + (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) (local $2 i32) (local.set $2 (i32.add @@ -5591,7 +5843,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 16) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -5608,20 +5860,11 @@ (unreachable) ) ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=8 + (f64.load align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i32) (param $1 i32) (result v128) + (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) (local $2 i32) (local.set $2 (i32.add @@ -5639,7 +5882,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 16) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -5659,19 +5902,19 @@ (if (i32.and (local.get $2) - (i32.const 15) + (i32.const 1) ) (then (call $alignfault) ) ) - (v128.load + (f64.load align=2 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 + (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) + (local $2 i32) + (local.set $2 (i32.add (local.get $0) (local.get $1) @@ -5680,21 +5923,21 @@ (if (i32.or (i32.lt_u - (local.get $3) + (local.get $2) (i32.const 1024) ) (i32.or (i32.gt_u (i32.add - (local.get $3) - (i32.const 1) + (local.get $2) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -5704,14 +5947,22 @@ (unreachable) ) ) - (i32.store8 - (local.get $3) + (if + (i32.and + (local.get $2) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (f64.load align=4 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 + (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) + (local $2 i32) + (local.set $2 (i32.add (local.get $0) (local.get $1) @@ -5720,21 +5971,21 @@ (if (i32.or (i32.lt_u - (local.get $3) + (local.get $2) (i32.const 1024) ) (i32.or (i32.gt_u (i32.add - (local.get $3) - (i32.const 2) + (local.get $2) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -5744,14 +5995,22 @@ (unreachable) ) ) - (i32.store16 align=1 - (local.get $3) + (if + (i32.and + (local.get $2) + (i32.const 7) + ) + (then + (call $alignfault) + ) + ) + (f64.load (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 + (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) + (local $2 i32) + (local.set $2 (i32.add (local.get $0) (local.get $1) @@ -5760,21 +6019,60 @@ (if (i32.or (i32.lt_u - (local.get $3) + (local.get $2) (i32.const 1024) ) (i32.or (i32.gt_u (i32.add - (local.get $3) - (i32.const 2) + (local.get $2) + (i32.const 16) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $3) + (local.get $2) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (v128.load align=1 + (local.get $2) + ) + ) + (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) + (local $2 i32) + (local.set $2 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.lt_u + (local.get $2) + (i32.const 1024) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $2) + (i32.const 16) + ) + (i32.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i32.lt_u + (local.get $2) (local.get $0) ) ) @@ -5786,21 +6084,20 @@ ) (if (i32.and - (local.get $3) + (local.get $2) (i32.const 1) ) (then (call $alignfault) ) ) - (i32.store16 - (local.get $3) + (v128.load align=2 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 + (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) + (local $2 i32) + (local.set $2 (i32.add (local.get $0) (local.get $1) @@ -5809,21 +6106,21 @@ (if (i32.or (i32.lt_u - (local.get $3) + (local.get $2) (i32.const 1024) ) (i32.or (i32.gt_u (i32.add - (local.get $3) - (i32.const 4) + (local.get $2) + (i32.const 16) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -5833,14 +6130,22 @@ (unreachable) ) ) - (i32.store align=1 - (local.get $3) + (if + (i32.and + (local.get $2) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (v128.load align=4 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 + (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) + (local $2 i32) + (local.set $2 (i32.add (local.get $0) (local.get $1) @@ -5849,21 +6154,21 @@ (if (i32.or (i32.lt_u - (local.get $3) + (local.get $2) (i32.const 1024) ) (i32.or (i32.gt_u (i32.add - (local.get $3) - (i32.const 4) + (local.get $2) + (i32.const 16) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -5875,21 +6180,20 @@ ) (if (i32.and - (local.get $3) - (i32.const 1) + (local.get $2) + (i32.const 7) ) (then (call $alignfault) ) ) - (i32.store align=2 - (local.get $3) + (v128.load align=8 (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 + (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i32) (param $1 i32) (result v128) + (local $2 i32) + (local.set $2 (i32.add (local.get $0) (local.get $1) @@ -5898,21 +6202,21 @@ (if (i32.or (i32.lt_u - (local.get $3) + (local.get $2) (i32.const 1024) ) (i32.or (i32.gt_u (i32.add - (local.get $3) - (i32.const 4) + (local.get $2) + (i32.const 16) ) (i32.load (call $emscripten_get_sbrk_ptr) ) ) (i32.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -5924,19 +6228,18 @@ ) (if (i32.and - (local.get $3) - (i32.const 3) + (local.get $2) + (i32.const 15) ) (then (call $alignfault) ) ) - (i32.store - (local.get $3) + (v128.load (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local.set $3 (i32.add @@ -5971,12 +6274,12 @@ (unreachable) ) ) - (i64.store8 + (i32.store8 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local.set $3 (i32.add @@ -6011,12 +6314,12 @@ (unreachable) ) ) - (i64.store16 align=1 + (i32.store16 align=1 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local.set $3 (i32.add @@ -6060,12 +6363,12 @@ (call $alignfault) ) ) - (i64.store16 + (i32.store16 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local.set $3 (i32.add @@ -6100,12 +6403,12 @@ (unreachable) ) ) - (i64.store32 align=1 + (i32.store align=1 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local.set $3 (i32.add @@ -6149,12 +6452,12 @@ (call $alignfault) ) ) - (i64.store32 align=2 + (i32.store align=2 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i32) (param $1 i32) (param $2 i32) (local $3 i32) (local.set $3 (i32.add @@ -6198,12 +6501,12 @@ (call $alignfault) ) ) - (i64.store32 + (i32.store (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -6221,7 +6524,7 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 8) + (i32.const 1) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -6238,12 +6541,12 @@ (unreachable) ) ) - (i64.store align=1 + (i64.store8 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -6261,7 +6564,7 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 8) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -6278,21 +6581,12 @@ (unreachable) ) ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=2 + (i64.store16 align=1 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -6310,7 +6604,7 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 8) + (i32.const 2) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -6330,18 +6624,18 @@ (if (i32.and (local.get $3) - (i32.const 3) + (i32.const 1) ) (then (call $alignfault) ) ) - (i64.store align=4 + (i64.store16 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i32) (param $1 i32) (param $2 i64) + (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -6359,7 +6653,7 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 8) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -6376,21 +6670,12 @@ (unreachable) ) ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.store + (i64.store32 align=1 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i32) (param $1 i32) (param $2 f32) + (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -6425,12 +6710,21 @@ (unreachable) ) ) - (f32.store align=1 + (if + (i32.and + (local.get $3) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i64.store32 align=2 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) + (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -6468,18 +6762,18 @@ (if (i32.and (local.get $3) - (i32.const 1) + (i32.const 3) ) (then (call $alignfault) ) ) - (f32.store align=2 + (i64.store32 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) + (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -6497,7 +6791,7 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 4) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -6514,21 +6808,12 @@ (unreachable) ) ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f32.store + (i64.store align=1 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) + (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -6563,12 +6848,21 @@ (unreachable) ) ) - (f64.store align=1 - (local.get $3) - (local.get $2) + (if + (i32.and + (local.get $3) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i64.store align=2 + (local.get $3) + (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) + (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -6606,18 +6900,18 @@ (if (i32.and (local.get $3) - (i32.const 1) + (i32.const 3) ) (then (call $alignfault) ) ) - (f64.store align=2 + (i64.store align=4 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) + (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i32) (param $1 i32) (param $2 i64) (local $3 i32) (local.set $3 (i32.add @@ -6655,18 +6949,18 @@ (if (i32.and (local.get $3) - (i32.const 3) + (i32.const 7) ) (then (call $alignfault) ) ) - (f64.store align=4 + (i64.store (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) + (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i32) (param $1 i32) (param $2 f32) (local $3 i32) (local.set $3 (i32.add @@ -6684,7 +6978,47 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 8) + (i32.const 4) + ) + (i32.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i32.lt_u + (local.get $3) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (f32.store align=1 + (local.get $3) + (local.get $2) + ) + ) + (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) + (local $3 i32) + (local.set $3 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.lt_u + (local.get $3) + (i32.const 1024) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $3) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -6704,18 +7038,18 @@ (if (i32.and (local.get $3) - (i32.const 7) + (i32.const 1) ) (then (call $alignfault) ) ) - (f64.store + (f32.store align=2 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) + (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) (local $3 i32) (local.set $3 (i32.add @@ -6733,7 +7067,7 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 16) + (i32.const 4) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -6750,12 +7084,21 @@ (unreachable) ) ) - (v128.store align=1 + (if + (i32.and + (local.get $3) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (f32.store (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) + (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) (local $3 i32) (local.set $3 (i32.add @@ -6773,7 +7116,47 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 16) + (i32.const 8) + ) + (i32.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i32.lt_u + (local.get $3) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (f64.store align=1 + (local.get $3) + (local.get $2) + ) + ) + (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) + (local $3 i32) + (local.set $3 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.lt_u + (local.get $3) + (i32.const 1024) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $3) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -6799,12 +7182,12 @@ (call $alignfault) ) ) - (v128.store align=2 + (f64.store align=2 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) + (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) (local $3 i32) (local.set $3 (i32.add @@ -6822,7 +7205,7 @@ (i32.gt_u (i32.add (local.get $3) - (i32.const 16) + (i32.const 8) ) (i32.load (call $emscripten_get_sbrk_ptr) @@ -6848,12 +7231,101 @@ (call $alignfault) ) ) - (v128.store align=4 + (f64.store align=4 (local.get $3) (local.get $2) ) ) - (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) + (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) + (local $3 i32) + (local.set $3 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.lt_u + (local.get $3) + (i32.const 1024) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $3) + (i32.const 8) + ) + (i32.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i32.lt_u + (local.get $3) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (if + (i32.and + (local.get $3) + (i32.const 7) + ) + (then + (call $alignfault) + ) + ) + (f64.store + (local.get $3) + (local.get $2) + ) + ) + (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) + (local $3 i32) + (local.set $3 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.lt_u + (local.get $3) + (i32.const 1024) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $3) + (i32.const 16) + ) + (i32.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i32.lt_u + (local.get $3) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (v128.store align=1 + (local.get $3) + (local.get $2) + ) + ) + (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) (local $3 i32) (local.set $3 (i32.add @@ -6874,11 +7346,571 @@ (i32.const 16) ) (i32.load - (call $emscripten_get_sbrk_ptr) + (call $emscripten_get_sbrk_ptr) + ) + ) + (i32.lt_u + (local.get $3) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (if + (i32.and + (local.get $3) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (v128.store align=2 + (local.get $3) + (local.get $2) + ) + ) + (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) + (local $3 i32) + (local.set $3 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.lt_u + (local.get $3) + (i32.const 1024) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $3) + (i32.const 16) + ) + (i32.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i32.lt_u + (local.get $3) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (if + (i32.and + (local.get $3) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (v128.store align=4 + (local.get $3) + (local.get $2) + ) + ) + (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) + (local $3 i32) + (local.set $3 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.lt_u + (local.get $3) + (i32.const 1024) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $3) + (i32.const 16) + ) + (i32.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i32.lt_u + (local.get $3) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (if + (i32.and + (local.get $3) + (i32.const 7) + ) + (then + (call $alignfault) + ) + ) + (v128.store align=8 + (local.get $3) + (local.get $2) + ) + ) + (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) + (local $3 i32) + (local.set $3 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.lt_u + (local.get $3) + (i32.const 1024) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $3) + (i32.const 16) + ) + (i32.load + (call $emscripten_get_sbrk_ptr) + ) + ) + (i32.lt_u + (local.get $3) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (if + (i32.and + (local.get $3) + (i32.const 15) + ) + (then + (call $alignfault) + ) + ) + (v128.store + (local.get $3) + (local.get $2) + ) + ) +) +(module + (type $0 (func (param i32 i32) (result i64))) + (type $1 (func (param i32 i32) (result i32))) + (type $2 (func (param i32 i32 i64))) + (type $3 (func (param i32 i32 i32))) + (type $4 (func (param i32 i32) (result v128))) + (type $5 (func (param i32 i32 v128))) + (type $6 (func (param i32 i32) (result f64))) + (type $7 (func (param i32 i32 f64))) + (type $FUNCSIG$v (func)) + (type $9 (func (param i32 i32) (result f32))) + (type $10 (func (param i32 i32 f32))) + (type $11 (func (result i32))) + (import "env" "emscripten_get_sbrk_ptr" (func $foo (result i32))) + (import "env" "segfault" (func $segfault)) + (import "env" "alignfault" (func $alignfault)) + (memory $0 100 100 shared) + (func $actions + (drop + (call $SAFE_HEAP_LOAD_i32_4_4 + (i32.const 1) + (i32.const 0) + ) + ) + (call $SAFE_HEAP_STORE_i32_4_4 + (i32.const 1) + (i32.const 0) + (i32.const 100) + ) + ) + (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local.set $2 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.lt_u + (local.get $2) + (i32.const 1024) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $2) + (i32.const 1) + ) + (i32.load + (call $foo) + ) + ) + (i32.lt_u + (local.get $2) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (i32.load8_s + (local.get $2) + ) + ) + (func $SAFE_HEAP_LOAD_i32_1_AR (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local.set $2 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.lt_u + (local.get $2) + (i32.const 1024) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $2) + (i32.const 1) + ) + (i32.load + (call $foo) + ) + ) + (i32.lt_u + (local.get $2) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (i32.shr_s + (i32.shl + (i32.atomic.load8_u acqrel + (local.get $2) + ) + (i32.const 24) + ) + (i32.const 24) + ) + ) + (func $SAFE_HEAP_LOAD_i32_1_SC (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local.set $2 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.lt_u + (local.get $2) + (i32.const 1024) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $2) + (i32.const 1) + ) + (i32.load + (call $foo) + ) + ) + (i32.lt_u + (local.get $2) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (i32.shr_s + (i32.shl + (i32.atomic.load8_u + (local.get $2) + ) + (i32.const 24) + ) + (i32.const 24) + ) + ) + (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local.set $2 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.lt_u + (local.get $2) + (i32.const 1024) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $2) + (i32.const 1) + ) + (i32.load + (call $foo) + ) + ) + (i32.lt_u + (local.get $2) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (i32.load8_u + (local.get $2) + ) + ) + (func $SAFE_HEAP_LOAD_i32_1_U_AR (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local.set $2 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.lt_u + (local.get $2) + (i32.const 1024) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $2) + (i32.const 1) + ) + (i32.load + (call $foo) + ) + ) + (i32.lt_u + (local.get $2) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (i32.atomic.load8_u acqrel + (local.get $2) + ) + ) + (func $SAFE_HEAP_LOAD_i32_1_U_SC (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local.set $2 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.lt_u + (local.get $2) + (i32.const 1024) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $2) + (i32.const 1) + ) + (i32.load + (call $foo) + ) + ) + (i32.lt_u + (local.get $2) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (i32.atomic.load8_u + (local.get $2) + ) + ) + (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local.set $2 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.lt_u + (local.get $2) + (i32.const 1024) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $2) + (i32.const 2) + ) + (i32.load + (call $foo) + ) + ) + (i32.lt_u + (local.get $2) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (i32.load16_s align=1 + (local.get $2) + ) + ) + (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local.set $2 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.lt_u + (local.get $2) + (i32.const 1024) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $2) + (i32.const 2) + ) + (i32.load + (call $foo) + ) + ) + (i32.lt_u + (local.get $2) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (if + (i32.and + (local.get $2) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i32.load16_s + (local.get $2) + ) + ) + (func $SAFE_HEAP_LOAD_i32_2_AR (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local.set $2 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.lt_u + (local.get $2) + (i32.const 1024) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $2) + (i32.const 2) + ) + (i32.load + (call $foo) ) ) (i32.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -6890,21 +7922,26 @@ ) (if (i32.and - (local.get $3) - (i32.const 7) + (local.get $2) + (i32.const 1) ) (then (call $alignfault) ) ) - (v128.store align=8 - (local.get $3) - (local.get $2) + (i32.shr_s + (i32.shl + (i32.atomic.load16_u acqrel + (local.get $2) + ) + (i32.const 16) + ) + (i32.const 16) ) ) - (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 + (func $SAFE_HEAP_LOAD_i32_2_SC (param $0 i32) (param $1 i32) (result i32) + (local $2 i32) + (local.set $2 (i32.add (local.get $0) (local.get $1) @@ -6913,21 +7950,21 @@ (if (i32.or (i32.lt_u - (local.get $3) + (local.get $2) (i32.const 1024) ) (i32.or (i32.gt_u (i32.add - (local.get $3) - (i32.const 16) + (local.get $2) + (i32.const 2) ) (i32.load - (call $emscripten_get_sbrk_ptr) + (call $foo) ) ) (i32.lt_u - (local.get $3) + (local.get $2) (local.get $0) ) ) @@ -6939,50 +7976,24 @@ ) (if (i32.and - (local.get $3) - (i32.const 15) + (local.get $2) + (i32.const 1) ) (then (call $alignfault) ) ) - (v128.store - (local.get $3) - (local.get $2) - ) - ) -) -(module - (type $0 (func (param i32 i32) (result i64))) - (type $1 (func (param i32 i32) (result i32))) - (type $2 (func (param i32 i32 i64))) - (type $3 (func (param i32 i32 i32))) - (type $4 (func (param i32 i32) (result v128))) - (type $5 (func (param i32 i32 v128))) - (type $6 (func (param i32 i32) (result f64))) - (type $7 (func (param i32 i32 f64))) - (type $FUNCSIG$v (func)) - (type $9 (func (param i32 i32) (result f32))) - (type $10 (func (param i32 i32 f32))) - (type $11 (func (result i32))) - (import "env" "emscripten_get_sbrk_ptr" (func $foo (result i32))) - (import "env" "segfault" (func $segfault)) - (import "env" "alignfault" (func $alignfault)) - (memory $0 100 100 shared) - (func $actions - (drop - (call $SAFE_HEAP_LOAD_i32_4_4 - (i32.const 1) - (i32.const 0) + (i32.shr_s + (i32.shl + (i32.atomic.load16_u + (local.get $2) + ) + (i32.const 16) ) - ) - (call $SAFE_HEAP_STORE_i32_4_4 - (i32.const 1) - (i32.const 0) - (i32.const 100) + (i32.const 16) ) ) - (func $SAFE_HEAP_LOAD_i32_1_A (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -7000,7 +8011,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 1) + (i32.const 2) ) (i32.load (call $foo) @@ -7017,17 +8028,11 @@ (unreachable) ) ) - (i32.shr_s - (i32.shl - (i32.atomic.load8_u - (local.get $2) - ) - (i32.const 24) - ) - (i32.const 24) + (i32.load16_u align=1 + (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -7045,7 +8050,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 1) + (i32.const 2) ) (i32.load (call $foo) @@ -7062,11 +8067,20 @@ (unreachable) ) ) - (i32.load8_s + (if + (i32.and + (local.get $2) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i32.load16_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_1_U_A (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_2_U_AR (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -7084,7 +8098,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 1) + (i32.const 2) ) (i32.load (call $foo) @@ -7101,11 +8115,20 @@ (unreachable) ) ) - (i32.atomic.load8_u + (if + (i32.and + (local.get $2) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i32.atomic.load16_u acqrel (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_2_U_SC (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -7123,7 +8146,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 1) + (i32.const 2) ) (i32.load (call $foo) @@ -7140,11 +8163,20 @@ (unreachable) ) ) - (i32.load8_u + (if + (i32.and + (local.get $2) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i32.atomic.load16_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -7162,7 +8194,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 2) + (i32.const 4) ) (i32.load (call $foo) @@ -7179,11 +8211,11 @@ (unreachable) ) ) - (i32.load16_s align=1 + (i32.load align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_A (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -7201,7 +8233,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 2) + (i32.const 4) ) (i32.load (call $foo) @@ -7227,17 +8259,11 @@ (call $alignfault) ) ) - (i32.shr_s - (i32.shl - (i32.atomic.load16_u - (local.get $2) - ) - (i32.const 16) - ) - (i32.const 16) + (i32.load align=2 + (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -7255,7 +8281,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 2) + (i32.const 4) ) (i32.load (call $foo) @@ -7275,17 +8301,17 @@ (if (i32.and (local.get $2) - (i32.const 1) + (i32.const 3) ) (then (call $alignfault) ) ) - (i32.load16_s + (i32.load (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_4_AR (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -7303,7 +8329,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 2) + (i32.const 4) ) (i32.load (call $foo) @@ -7320,11 +8346,20 @@ (unreachable) ) ) - (i32.load16_u align=1 + (if + (i32.and + (local.get $2) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (i32.atomic.load acqrel (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_U_A (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i32_4_SC (param $0 i32) (param $1 i32) (result i32) (local $2 i32) (local.set $2 (i32.add @@ -7342,7 +8377,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 2) + (i32.const 4) ) (i32.load (call $foo) @@ -7362,17 +8397,17 @@ (if (i32.and (local.get $2) - (i32.const 1) + (i32.const 3) ) (then (call $alignfault) ) ) - (i32.atomic.load16_u + (i32.atomic.load (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -7390,7 +8425,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 2) + (i32.const 1) ) (i32.load (call $foo) @@ -7407,20 +8442,11 @@ (unreachable) ) ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_u + (i64.load8_s (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i64_1_AR (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -7438,7 +8464,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 4) + (i32.const 1) ) (i32.load (call $foo) @@ -7455,11 +8481,17 @@ (unreachable) ) ) - (i32.load align=1 - (local.get $2) + (i64.shr_s + (i64.shl + (i64.atomic.load8_u acqrel + (local.get $2) + ) + (i64.const 56) + ) + (i64.const 56) ) ) - (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i64_1_SC (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -7477,7 +8509,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 4) + (i32.const 1) ) (i32.load (call $foo) @@ -7494,20 +8526,56 @@ (unreachable) ) ) + (i64.shr_s + (i64.shl + (i64.atomic.load8_u + (local.get $2) + ) + (i64.const 56) + ) + (i64.const 56) + ) + ) + (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) + (local $2 i32) + (local.set $2 + (i32.add + (local.get $0) + (local.get $1) + ) + ) (if - (i32.and - (local.get $2) - (i32.const 1) + (i32.or + (i32.lt_u + (local.get $2) + (i32.const 1024) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $2) + (i32.const 1) + ) + (i32.load + (call $foo) + ) + ) + (i32.lt_u + (local.get $2) + (local.get $0) + ) + ) ) (then - (call $alignfault) + (call $segfault) + (unreachable) ) ) - (i32.load align=2 + (i64.load8_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_4_A (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i64_1_U_AR (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -7525,7 +8593,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 4) + (i32.const 1) ) (i32.load (call $foo) @@ -7542,20 +8610,11 @@ (unreachable) ) ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load + (i64.atomic.load8_u acqrel (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) + (func $SAFE_HEAP_LOAD_i64_1_U_SC (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -7573,7 +8632,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 4) + (i32.const 1) ) (i32.load (call $foo) @@ -7590,20 +8649,11 @@ (unreachable) ) ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.load + (i64.atomic.load8_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_1_A (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -7621,7 +8671,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 1) + (i32.const 2) ) (i32.load (call $foo) @@ -7638,17 +8688,11 @@ (unreachable) ) ) - (i64.shr_s - (i64.shl - (i64.atomic.load8_u - (local.get $2) - ) - (i64.const 56) - ) - (i64.const 56) + (i64.load16_s align=1 + (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -7666,7 +8710,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 1) + (i32.const 2) ) (i32.load (call $foo) @@ -7683,11 +8727,20 @@ (unreachable) ) ) - (i64.load8_s + (if + (i32.and + (local.get $2) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i64.load16_s (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_1_U_A (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_AR (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -7705,7 +8758,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 1) + (i32.const 2) ) (i32.load (call $foo) @@ -7722,11 +8775,26 @@ (unreachable) ) ) - (i64.atomic.load8_u - (local.get $2) + (if + (i32.and + (local.get $2) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i64.shr_s + (i64.shl + (i64.atomic.load16_u acqrel + (local.get $2) + ) + (i64.const 48) + ) + (i64.const 48) ) ) - (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_SC (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -7744,7 +8812,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 1) + (i32.const 2) ) (i32.load (call $foo) @@ -7761,11 +8829,26 @@ (unreachable) ) ) - (i64.load8_u - (local.get $2) + (if + (i32.and + (local.get $2) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i64.shr_s + (i64.shl + (i64.atomic.load16_u + (local.get $2) + ) + (i64.const 48) + ) + (i64.const 48) ) ) - (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -7800,11 +8883,11 @@ (unreachable) ) ) - (i64.load16_s align=1 + (i64.load16_u align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_A (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -7848,17 +8931,11 @@ (call $alignfault) ) ) - (i64.shr_s - (i64.shl - (i64.atomic.load16_u - (local.get $2) - ) - (i64.const 48) - ) - (i64.const 48) + (i64.load16_u + (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_U_AR (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -7902,11 +8979,11 @@ (call $alignfault) ) ) - (i64.load16_s + (i64.atomic.load16_u acqrel (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_2_U_SC (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -7941,11 +9018,20 @@ (unreachable) ) ) - (i64.load16_u align=1 + (if + (i32.and + (local.get $2) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i64.atomic.load16_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_U_A (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -7963,7 +9049,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 2) + (i32.const 4) ) (i32.load (call $foo) @@ -7980,20 +9066,11 @@ (unreachable) ) ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load16_u + (i64.load32_s align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -8011,7 +9088,7 @@ (i32.gt_u (i32.add (local.get $2) - (i32.const 2) + (i32.const 4) ) (i32.load (call $foo) @@ -8037,11 +9114,11 @@ (call $alignfault) ) ) - (i64.load16_u + (i64.load32_s align=2 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -8076,11 +9153,20 @@ (unreachable) ) ) - (i64.load32_s align=1 + (if + (i32.and + (local.get $2) + (i32.const 3) + ) + (then + (call $alignfault) + ) + ) + (i64.load32_s (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_AR (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -8118,17 +9204,23 @@ (if (i32.and (local.get $2) - (i32.const 1) + (i32.const 3) ) (then (call $alignfault) ) ) - (i64.load32_s align=2 - (local.get $2) + (i64.shr_s + (i64.shl + (i64.atomic.load32_u acqrel + (local.get $2) + ) + (i64.const 32) + ) + (i64.const 32) ) ) - (func $SAFE_HEAP_LOAD_i64_4_A (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_SC (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -8182,7 +9274,7 @@ (i64.const 32) ) ) - (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -8217,20 +9309,11 @@ (unreachable) ) ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s + (i64.load32_u align=1 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -8265,11 +9348,20 @@ (unreachable) ) ) - (i64.load32_u align=1 + (if + (i32.and + (local.get $2) + (i32.const 1) + ) + (then + (call $alignfault) + ) + ) + (i64.load32_u align=2 (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -8307,17 +9399,17 @@ (if (i32.and (local.get $2) - (i32.const 1) + (i32.const 3) ) (then (call $alignfault) ) ) - (i64.load32_u align=2 + (i64.load32_u (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_U_A (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_U_AR (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -8361,11 +9453,11 @@ (call $alignfault) ) ) - (i64.atomic.load32_u + (i64.atomic.load32_u acqrel (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_4_U_SC (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -8409,7 +9501,7 @@ (call $alignfault) ) ) - (i64.load32_u + (i64.atomic.load32_u (local.get $2) ) ) @@ -8548,7 +9640,7 @@ (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_8_A (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -8592,11 +9684,11 @@ (call $alignfault) ) ) - (i64.atomic.load + (i64.load (local.get $2) ) ) - (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) + (func $SAFE_HEAP_LOAD_i64_8_AR (param $0 i32) (param $1 i32) (result i64) (local $2 i32) (local.set $2 (i32.add @@ -8640,7 +9732,55 @@ (call $alignfault) ) ) - (i64.load + (i64.atomic.load acqrel + (local.get $2) + ) + ) + (func $SAFE_HEAP_LOAD_i64_8_SC (param $0 i32) (param $1 i32) (result i64) + (local $2 i32) + (local.set $2 + (i32.add + (local.get $0) + (local.get $1) + ) + ) + (if + (i32.or + (i32.lt_u + (local.get $2) + (i32.const 1024) + ) + (i32.or + (i32.gt_u + (i32.add + (local.get $2) + (i32.const 8) + ) + (i32.load + (call $foo) + ) + ) + (i32.lt_u + (local.get $2) + (local.get $0) + ) + ) + ) + (then + (call $segfault) + (unreachable) + ) + ) + (if + (i32.and + (local.get $2) + (i32.const 7) + ) + (then + (call $alignfault) + ) + ) + (i64.atomic.load (local.get $2) ) ) diff --git a/test/spec/relaxed-atomics.wast b/test/spec/relaxed-atomics.wast new file mode 100644 index 00000000000..d76a2f62b00 --- /dev/null +++ b/test/spec/relaxed-atomics.wast @@ -0,0 +1,96 @@ +(module + (memory $0 23 256 shared) + + (func $acqrel (result i32) + (i32.atomic.load acqrel + (i32.const 1) + ) + ) + (func $seqcst (result i32) + ;; seqcst may be omitted for atomic loads, it's the default + (drop (i32.atomic.load seqcst + (i32.const 1) + )) + ;; allows memory index before memory ordering immediate + (i32.atomic.load 0 seqcst + (i32.const 1) + ) + ) +) + +(assert_malformed + (module quote + "(memory $0 23 256 shared)" + "(func $acqrel (result i32)" + " (i32.load acqrel" + " (i32.const 1)" + " ) " + ") " + ) + "Memory ordering can only be provided for atomic loads." +) + +;; Parses acquire-release immediate +;; Equivalent to +;; (module +;; (memory $0 23 256 shared) +;; (func $load (result i32) +;; (i32.atomic.load acqrel +;; (i32.const 1) +;; ) +;; ) +;; ) +(module binary + "\00asm\01\00\00\00" ;; header + version + "\01\05\01\60\00\01\7f\03\02\01\00\05\05\01\03\17\80\02" ;; other sections + "\0a\0b\01" ;; code section + ;; func $load body + "\09\00" ;; size + decl count + "\41\01" ;; i32.const 1 + "\fe\10" ;; i32.atomic.load + "\22" ;; 2 | (1<<5): Alignment of 2 (32-bit load), with bit 5 set indicating that the next byte is a memory ordering + "\01" ;; acqrel ordering + "\00" ;; offset + "\0b" ;; end +) + +;; parses acquire-release immediate after memory index +(module binary + "\00asm\01\00\00\00" ;; header + version + "\01\05\01\60\00\01\7f\03\02\01\00\05\05\01\03\17\80\02" ;; other sections + "\0a\0c\01" ;; code section + ;; func $load body + "\0a\00" ;; size + decl count + "\41\01" ;; i32.const 1 + "\fe\10" ;; i32.atomic.load + "\62" ;; 2 | (1<<5) | (1<<6): Alignment of 2 (32-bit load), with bit 5 set indicating that the next byte is a memory ordering + "\00" ;; memory index + "\01" ;; acqrel ordering + "\00" ;; offset + "\0b" ;; end +) + +;; Parses optional seqcst memory ordering for atomic loads +;; This isn't covered by round-trip tests because we omit it by default. +;; Equivalent to +;; (module +;; (memory $0 23 256 shared) +;; (func $load (result i32) +;; (i32.atomic.load seqcst +;; (i32.const 1) +;; ) +;; ) +;; ) +(module binary + "\00asm\01\00\00\00" ;; header + version + "\01\05\01\60\00\01\7f\03\02\01\00\05\05\01\03\17\80\02" ;; other sections + "\0a\0b\01" ;; code section + ;; func $load body + "\09\00" ;; size + decl count + "\41\01" ;; i32.const 1 + "\fe\10" ;; i32.atomic.load + "\22" ;; 2 | (1<<5): Alignment of 2 (32-bit load), with bit 5 set indicating that the next byte is a memory ordering + "\00" ;; seqcst ordering + "\00" ;; offset + "\0b" ;; end +) From e8cc56f7727be31b10111fd1d3e498464e3e6ff0 Mon Sep 17 00:00:00 2001 From: stevenfontanella Date: Thu, 8 Jan 2026 19:47:59 +0000 Subject: [PATCH 2/6] Clean up the printing spacing logic for memory order --- src/passes/Print.cpp | 45 ++++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/src/passes/Print.cpp b/src/passes/Print.cpp index 11e886d5a8b..95921bf6a53 100644 --- a/src/passes/Print.cpp +++ b/src/passes/Print.cpp @@ -574,7 +574,7 @@ struct PrintExpressionContents } restoreNormalColor(o); printMemoryName(curr->memory, o, wasm); - printMemoryOrder(curr->order, /*prependSpace=*/true, /*appendSpace=*/false); + printMemoryOrder(curr->order); if (curr->offset) { o << " offset=" << curr->offset; } @@ -2325,8 +2325,7 @@ struct PrintExpressionContents } } - void - printMemoryOrder(MemoryOrder order, bool prependSpace, bool appendSpace) { + void printMemoryOrder(MemoryOrder order) { switch (order) { // Unordered should have a different base instruction, so there is nothing // to print. We could be explicit and print seqcst, but we choose not to @@ -2335,15 +2334,11 @@ struct PrintExpressionContents case MemoryOrder::SeqCst: break; case MemoryOrder::AcqRel: - o << (prependSpace ? " " : "") << "acqrel" << (appendSpace ? " " : ""); + o << " acqrel"; break; } } - void printMemoryOrder(MemoryOrder order) { - printMemoryOrder(order, /*prependSpace=*/false, /*appendSpace=*/true); - } - void visitStructGet(StructGet* curr) { auto heapType = curr->ref->type.getHeapType(); const auto& field = heapType.getStruct().fields[curr->index]; @@ -2353,25 +2348,27 @@ struct PrintExpressionContents } if (field.type == Type::i32 && field.packedType != Field::not_packed) { if (curr->signed_) { - printMedium(o, ".get_s "); + printMedium(o, ".get_s"); } else { - printMedium(o, ".get_u "); + printMedium(o, ".get_u"); } } else { - printMedium(o, ".get "); + printMedium(o, ".get"); } printMemoryOrder(curr->order); + o << ' '; printHeapTypeName(heapType); o << ' '; printFieldName(heapType, curr->index); } void visitStructSet(StructSet* curr) { if (curr->order == MemoryOrder::Unordered) { - printMedium(o, "struct.set "); + printMedium(o, "struct.set"); } else { - printMedium(o, "struct.atomic.set "); + printMedium(o, "struct.atomic.set"); } printMemoryOrder(curr->order); + o << ' '; auto heapType = curr->ref->type.getHeapType(); printHeapTypeName(heapType); o << ' '; @@ -2382,9 +2379,9 @@ struct PrintExpressionContents o << "struct.atomic.rmw."; printAtomicRMWOp(curr->op); restoreNormalColor(o); - o << ' '; printMemoryOrder(curr->order); printMemoryOrder(curr->order); + o << ' '; auto heapType = curr->ref->type.getHeapType(); printHeapTypeName(heapType); o << ' '; @@ -2392,10 +2389,11 @@ struct PrintExpressionContents } void visitStructCmpxchg(StructCmpxchg* curr) { prepareColor(o); - o << "struct.atomic.rmw.cmpxchg "; + o << "struct.atomic.rmw.cmpxchg"; restoreNormalColor(o); printMemoryOrder(curr->order); printMemoryOrder(curr->order); + o << ' '; auto heapType = curr->ref->type.getHeapType(); printHeapTypeName(heapType); o << ' '; @@ -2438,23 +2436,25 @@ struct PrintExpressionContents } if (element.type == Type::i32 && element.packedType != Field::not_packed) { if (curr->signed_) { - printMedium(o, ".get_s "); + printMedium(o, ".get_s"); } else { - printMedium(o, ".get_u "); + printMedium(o, ".get_u"); } } else { - printMedium(o, ".get "); + printMedium(o, ".get"); } printMemoryOrder(curr->order); + o << ' '; printHeapTypeName(curr->ref->type.getHeapType()); } void visitArraySet(ArraySet* curr) { if (curr->order == MemoryOrder::Unordered) { - printMedium(o, "array.set "); + printMedium(o, "array.set"); } else { - printMedium(o, "array.atomic.set "); + printMedium(o, "array.atomic.set"); } printMemoryOrder(curr->order); + o << ' '; printHeapTypeName(curr->ref->type.getHeapType()); } void visitArrayLen(ArrayLen* curr) { printMedium(o, "array.len"); } @@ -2485,18 +2485,19 @@ struct PrintExpressionContents o << "array.atomic.rmw."; printAtomicRMWOp(curr->op); restoreNormalColor(o); - o << ' '; printMemoryOrder(curr->order); printMemoryOrder(curr->order); + o << ' '; auto heapType = curr->ref->type.getHeapType(); printHeapTypeName(heapType); } void visitArrayCmpxchg(ArrayCmpxchg* curr) { prepareColor(o); - o << "array.atomic.rmw.cmpxchg "; + o << "array.atomic.rmw.cmpxchg"; restoreNormalColor(o); printMemoryOrder(curr->order); printMemoryOrder(curr->order); + o << ' '; auto heapType = curr->ref->type.getHeapType(); printHeapTypeName(heapType); } From 65f9be05c699a68821d6adfe1e06765fae19169c Mon Sep 17 00:00:00 2001 From: stevenfontanella Date: Thu, 8 Jan 2026 22:43:10 +0000 Subject: [PATCH 3/6] Add lit test for roundtripping --- test/lit/basic/relaxed-atomics.wast | 40 +++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 test/lit/basic/relaxed-atomics.wast diff --git a/test/lit/basic/relaxed-atomics.wast b/test/lit/basic/relaxed-atomics.wast new file mode 100644 index 00000000000..a6a759f1029 --- /dev/null +++ b/test/lit/basic/relaxed-atomics.wast @@ -0,0 +1,40 @@ +;; NOTE: Assertions have been generated by update_lit_checks.py and should not be edited. +;; RUN: wasm-opt -all %s --roundtrip -S -o - | filecheck %s --check-prefix=RTRIP + +(module + ;; RTRIP: (memory $0 23 256 shared) + (memory $0 23 256 shared) + + ;; RTRIP: (func $acqrel (type $0) (result i32) + ;; RTRIP-NEXT: (i32.atomic.load acqrel + ;; RTRIP-NEXT: (i32.const 1) + ;; RTRIP-NEXT: ) + ;; RTRIP-NEXT: ) + (func $acqrel (result i32) + (i32.atomic.load acqrel + (i32.const 1) + ) + ) + + ;; Optional seqcst ordering is dropped in text output. + ;; RTRIP: (func $seqcst (type $0) (result i32) + ;; RTRIP-NEXT: (drop + ;; RTRIP-NEXT: (i32.atomic.load + ;; RTRIP-NEXT: (i32.const 1) + ;; RTRIP-NEXT: ) + ;; RTRIP-NEXT: ) + ;; RTRIP-NEXT: (i32.atomic.load + ;; RTRIP-NEXT: (i32.const 1) + ;; RTRIP-NEXT: ) + ;; RTRIP-NEXT: ) + (func $seqcst (result i32) + ;; seqcst may be omitted for atomic loads, it's the default + (drop (i32.atomic.load seqcst + (i32.const 1) + )) + ;; allows memory index before memory ordering immediate + (i32.atomic.load 0 seqcst + (i32.const 1) + ) + ) +) From 986b64a0bc88a43dc6c973ca85f9bac8c89fc906 Mon Sep 17 00:00:00 2001 From: stevenfontanella Date: Thu, 8 Jan 2026 23:29:52 +0000 Subject: [PATCH 4/6] Update tests after merge --- .../safe-heap_enable-threads_enable-simd.wast | 3246 ++-- ...afe-heap_enable-threads_enable-simd64.wast | 3218 ++-- ...ory-unused_enable-threads_enable-simd.wast | 3248 ++-- .../safe-heap_enable-threads_enable-simd.txt | 11943 --------------- ...safe-heap_enable-threads_enable-simd64.txt | 12267 ---------------- ...mory-unused_enable-threads_enable-simd.txt | 11943 --------------- 6 files changed, 6618 insertions(+), 39247 deletions(-) delete mode 100644 test/passes/safe-heap_enable-threads_enable-simd.txt delete mode 100644 test/passes/safe-heap_enable-threads_enable-simd64.txt delete mode 100644 test/passes/safe-heap_low-memory-unused_enable-threads_enable-simd.txt diff --git a/test/lit/passes/safe-heap_enable-threads_enable-simd.wast b/test/lit/passes/safe-heap_enable-threads_enable-simd.wast index 6ba85e772b1..e5cf26c8cd1 100644 --- a/test/lit/passes/safe-heap_enable-threads_enable-simd.wast +++ b/test/lit/passes/safe-heap_enable-threads_enable-simd.wast @@ -45,7 +45,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_A + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_SC ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) @@ -242,7 +242,7 @@ ) ) ;; not shared -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -277,18 +277,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.shr_s -;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (i32.atomic.load8_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 24) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: (i32.load8_s +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_AR (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -323,12 +317,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_s -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load8_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -363,8 +363,14 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.load8_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -408,7 +414,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_AR (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -426,7 +432,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -443,12 +449,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s align=1 +;; CHECK-NEXT: (i32.atomic.load8_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -466,7 +472,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -483,27 +489,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.shr_s -;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (i32.atomic.load16_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 16) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -538,21 +529,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s +;; CHECK-NEXT: (i32.load16_s align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -587,12 +569,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_AR (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -636,12 +627,18 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.load16_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load16_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -685,12 +682,18 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -708,7 +711,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -725,12 +728,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=1 +;; CHECK-NEXT: (i32.load16_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -748,7 +751,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -774,12 +777,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=2 +;; CHECK-NEXT: (i32.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_AR (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -797,7 +800,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -817,18 +820,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.load +;; CHECK-NEXT: (i32.atomic.load16_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -846,7 +849,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -866,18 +869,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (i32.atomic.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -895,7 +898,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -912,18 +915,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.shr_s -;; CHECK-NEXT: (i64.shl -;; CHECK-NEXT: (i64.atomic.load8_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 56) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: (i32.load align=1 +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -941,7 +938,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -958,12 +955,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_s +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -981,7 +987,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -998,12 +1004,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load8_u +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_AR (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1021,7 +1036,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1038,12 +1053,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_u +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1061,7 +1085,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1078,12 +1102,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1101,7 +1134,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1118,27 +1151,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.shr_s -;; CHECK-NEXT: (i64.shl -;; CHECK-NEXT: (i64.atomic.load16_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 48) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: (i64.load8_s +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1156,7 +1174,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1173,21 +1191,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load8_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) ;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 56) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1205,7 +1220,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1222,12 +1237,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u align=1 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1245,7 +1266,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1262,21 +1283,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load16_u +;; CHECK-NEXT: (i64.load8_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1294,7 +1306,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1311,21 +1323,52 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load8_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_SC (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) ;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u +;; CHECK-NEXT: (i64.atomic.load8_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1343,7 +1386,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1360,12 +1403,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=1 +;; CHECK-NEXT: (i64.load16_s align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1383,7 +1426,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1409,12 +1452,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=2 +;; CHECK-NEXT: (i64.load16_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1432,7 +1475,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1452,7 +1495,7 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) @@ -1460,16 +1503,16 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.shr_s ;; CHECK-NEXT: (i64.shl -;; CHECK-NEXT: (i64.atomic.load32_u +;; CHECK-NEXT: (i64.atomic.load16_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: (i64.const 48) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: (i64.const 48) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1487,7 +1530,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1507,18 +1550,24 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1536,7 +1585,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1553,12 +1602,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=1 +;; CHECK-NEXT: (i64.load16_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1576,7 +1625,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1602,12 +1651,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=2 +;; CHECK-NEXT: (i64.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1625,7 +1674,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1645,18 +1694,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load32_u +;; CHECK-NEXT: (i64.atomic.load16_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1674,7 +1723,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1694,18 +1743,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u +;; CHECK-NEXT: (i64.atomic.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1723,7 +1772,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1740,12 +1789,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=1 +;; CHECK-NEXT: (i64.load32_s align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1763,7 +1812,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1789,12 +1838,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=2 +;; CHECK-NEXT: (i64.load32_s align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1812,7 +1861,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1838,12 +1887,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=4 +;; CHECK-NEXT: (i64.load32_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1861,7 +1910,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1881,18 +1930,24 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load32_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1910,7 +1965,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1930,18 +1985,24 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load32_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1976,12 +2037,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load align=1 +;; CHECK-NEXT: (i64.load32_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2025,12 +2086,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load align=2 +;; CHECK-NEXT: (i64.load32_u align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2074,12 +2135,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load +;; CHECK-NEXT: (i64.load32_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2097,7 +2158,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2114,12 +2175,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load32_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2137,7 +2207,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2157,18 +2227,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=2 +;; CHECK-NEXT: (i64.atomic.load32_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2203,21 +2273,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=4 +;; CHECK-NEXT: (i64.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2255,18 +2316,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load +;; CHECK-NEXT: (i64.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2284,7 +2345,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2301,12 +2362,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load align=4 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2324,7 +2394,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2344,18 +2414,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=2 +;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2373,7 +2443,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2393,18 +2463,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=4 +;; CHECK-NEXT: (i64.atomic.load acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2422,7 +2492,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2448,12 +2518,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=8 +;; CHECK-NEXT: (i64.atomic.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i32) (param $1 i32) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2471,7 +2541,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2488,23 +2558,14 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 15) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load +;; CHECK-NEXT: (f32.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_1_A (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2513,21 +2574,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2537,15 +2598,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store8 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2554,21 +2623,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2578,15 +2647,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store8 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2595,21 +2672,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2619,15 +2696,14 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 align=1 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (f64.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_A (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2636,21 +2712,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2662,22 +2738,21 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store16 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (f64.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2686,21 +2761,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2712,22 +2787,21 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (f64.load align=4 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2736,21 +2810,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2760,15 +2834,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store align=1 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2777,21 +2859,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2801,24 +2883,14 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store align=2 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_A (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2827,21 +2899,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2853,22 +2925,21 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2877,21 +2948,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2903,22 +2974,21 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load align=4 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_1_A (param $0 i32) (param $1 i32) (param $2 i64) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2927,21 +2997,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2951,15 +3021,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store8 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=8 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i32) (param $1 i32) (param $2 i64) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2968,21 +3046,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2992,13 +3070,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store8 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_1_A (param $0 i32) (param $1 i32) (param $2 i32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3016,7 +3102,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3033,13 +3119,95 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 align=1 +;; CHECK-NEXT: (i32.atomic.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_2_A (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store16 align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_A (param $0 i32) (param $1 i32) (param $2 i32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3083,13 +3251,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store16 +;; CHECK-NEXT: (i32.atomic.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3133,13 +3301,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 +;; CHECK-NEXT: (i32.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i32) (param $1 i32) (param $2 i32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3174,13 +3342,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 align=1 +;; CHECK-NEXT: (i32.store align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i32) (param $1 i32) (param $2 i32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3224,13 +3392,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 align=2 +;; CHECK-NEXT: (i32.store align=2 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_A (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_A (param $0 i32) (param $1 i32) (param $2 i32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3274,13 +3442,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store32 +;; CHECK-NEXT: (i32.atomic.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i32) (param $1 i32) (param $2 i32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3324,13 +3492,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 +;; CHECK-NEXT: (i32.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_1_A (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3348,7 +3516,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3365,13 +3533,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=1 +;; CHECK-NEXT: (i64.atomic.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3389,7 +3557,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3406,22 +3574,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=2 +;; CHECK-NEXT: (i64.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3439,7 +3598,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3456,22 +3615,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 3) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=4 +;; CHECK-NEXT: (i64.store16 align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_A (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_A (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3489,7 +3639,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3509,19 +3659,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store +;; CHECK-NEXT: (i64.atomic.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3539,7 +3689,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3559,19 +3709,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store +;; CHECK-NEXT: (i64.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i32) (param $1 i32) (param $2 f32) +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3606,13 +3756,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.store align=1 +;; CHECK-NEXT: (i64.store32 align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3656,13 +3806,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.store align=2 +;; CHECK-NEXT: (i64.store32 align=2 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_A (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3706,13 +3856,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.store +;; CHECK-NEXT: (i64.atomic.store32 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3730,7 +3880,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3747,13 +3897,22 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.store align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3788,22 +3947,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.store align=2 +;; CHECK-NEXT: (i64.store align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3841,19 +3991,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.store align=4 +;; CHECK-NEXT: (i64.store align=2 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3891,19 +4041,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.store +;; CHECK-NEXT: (i64.store align=4 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_A (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3921,7 +4071,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3938,13 +4088,22 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3962,7 +4121,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3982,19 +4141,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=2 +;; CHECK-NEXT: (i64.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i32) (param $1 i32) (param $2 f32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -4012,7 +4171,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4029,22 +4188,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 3) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=4 +;; CHECK-NEXT: (f32.store align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -4062,7 +4212,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4082,19 +4232,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=8 +;; CHECK-NEXT: (f32.store align=2 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -4112,7 +4262,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4132,67 +4282,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store +;; CHECK-NEXT: (f32.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -(module - (memory 100 100) - ;; CHECK: (type $0 (func (param i32 i32) (result i64))) - - ;; CHECK: (type $1 (func (param i32 i32 i64))) - - ;; CHECK: (type $2 (func (param i32 i32) (result i32))) - - ;; CHECK: (type $3 (func (param i32 i32 i32))) - - ;; CHECK: (type $4 (func (param i32 i32) (result v128))) - - ;; CHECK: (type $5 (func (param i32 i32 v128))) - - ;; CHECK: (type $6 (func (param i32 i32) (result f64))) - - ;; CHECK: (type $7 (func (param i32 i32 f64))) - - ;; CHECK: (type $8 (func)) - - ;; CHECK: (type $9 (func (param i32 i32) (result f32))) - - ;; CHECK: (type $10 (func (param i32 i32 f32))) - - ;; CHECK: (type $11 (func (result i32))) - - ;; CHECK: (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i32))) - - ;; CHECK: (import "env" "segfault" (func $segfault)) - - ;; CHECK: (import "env" "alignfault" (func $alignfault)) - - ;; CHECK: (memory $0 100 100) - ;; CHECK: (func $loads - ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_4 - ;; CHECK-NEXT: (i32.const 1) - ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - (func $loads - (drop (i32.load (i32.const 1))) - ) -) -;; pre-existing -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4201,21 +4305,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4225,14 +4329,15 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_s +;; CHECK-NEXT: (f64.store align=1 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4241,21 +4346,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4265,14 +4370,24 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_u +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=2 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4281,21 +4396,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4305,14 +4420,24 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=4 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4321,21 +4446,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4347,21 +4472,22 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s +;; CHECK-NEXT: (f64.store +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4370,21 +4496,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4394,14 +4520,15 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u align=1 +;; CHECK-NEXT: (v128.store align=1 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4410,21 +4537,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4436,21 +4563,22 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u +;; CHECK-NEXT: (v128.store align=2 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4459,21 +4587,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4483,14 +4611,24 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=4 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4499,21 +4637,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4525,21 +4663,22 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=2 +;; CHECK-NEXT: (v128.store align=8 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4548,21 +4687,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4574,21 +4713,68 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 15) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (v128.store +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) +(module + (memory 100 100) + ;; CHECK: (type $0 (func (param i32 i32) (result i64))) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 + ;; CHECK: (type $1 (func (param i32 i32 i64))) + + ;; CHECK: (type $2 (func (param i32 i32) (result i32))) + + ;; CHECK: (type $3 (func (param i32 i32 i32))) + + ;; CHECK: (type $4 (func (param i32 i32) (result v128))) + + ;; CHECK: (type $5 (func (param i32 i32 v128))) + + ;; CHECK: (type $6 (func (param i32 i32) (result f64))) + + ;; CHECK: (type $7 (func (param i32 i32 f64))) + + ;; CHECK: (type $8 (func)) + + ;; CHECK: (type $9 (func (param i32 i32) (result f32))) + + ;; CHECK: (type $10 (func (param i32 i32 f32))) + + ;; CHECK: (type $11 (func (result i32))) + + ;; CHECK: (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i32))) + + ;; CHECK: (import "env" "segfault" (func $segfault)) + + ;; CHECK: (import "env" "alignfault" (func $alignfault)) + + ;; CHECK: (memory $0 100 100) + + ;; CHECK: (func $loads + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_4 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $loads + (drop (i32.load (i32.const 1))) + ) +) +;; pre-existing +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4621,12 +4807,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_s +;; CHECK-NEXT: (i32.load8_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4661,12 +4847,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_u +;; CHECK-NEXT: (i32.load8_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4701,12 +4887,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s align=1 +;; CHECK-NEXT: (i32.load16_s align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4750,12 +4936,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s +;; CHECK-NEXT: (i32.load16_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4790,12 +4976,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u align=1 +;; CHECK-NEXT: (i32.load16_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4839,12 +5025,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u +;; CHECK-NEXT: (i32.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4879,12 +5065,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=1 +;; CHECK-NEXT: (i32.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4928,12 +5114,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=2 +;; CHECK-NEXT: (i32.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4977,12 +5163,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s +;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5000,7 +5186,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5017,12 +5203,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=1 +;; CHECK-NEXT: (i64.load8_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5040,7 +5226,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5057,21 +5243,52 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) ;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=2 +;; CHECK-NEXT: (i64.load16_s align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5089,7 +5306,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5109,18 +5326,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u +;; CHECK-NEXT: (i64.load16_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5138,7 +5355,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5155,12 +5372,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=1 +;; CHECK-NEXT: (i64.load16_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5178,7 +5395,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5204,12 +5421,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=2 +;; CHECK-NEXT: (i64.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5227,7 +5444,47 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5247,18 +5504,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=4 +;; CHECK-NEXT: (i64.load32_s align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5276,7 +5533,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5296,18 +5553,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (i64.load32_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5342,12 +5599,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load align=1 +;; CHECK-NEXT: (i64.load32_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5391,12 +5648,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load align=2 +;; CHECK-NEXT: (i64.load32_u align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5440,12 +5697,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load +;; CHECK-NEXT: (i64.load32_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5480,12 +5737,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=1 +;; CHECK-NEXT: (i64.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5529,12 +5786,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=2 +;; CHECK-NEXT: (i64.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5578,12 +5835,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=4 +;; CHECK-NEXT: (i64.load align=4 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5627,12 +5884,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load +;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5650,7 +5907,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5667,12 +5924,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=1 +;; CHECK-NEXT: (f32.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5690,7 +5947,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5716,12 +5973,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=2 +;; CHECK-NEXT: (f32.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5739,7 +5996,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5765,12 +6022,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=4 +;; CHECK-NEXT: (f32.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5788,7 +6045,47 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5808,18 +6105,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=8 +;; CHECK-NEXT: (f64.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i32) (param $1 i32) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5837,7 +6134,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5857,20 +6154,20 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load +;; CHECK-NEXT: (f64.load align=4 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -5879,21 +6176,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -5903,15 +6200,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store8 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -5920,21 +6225,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -5944,15 +6249,14 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 align=1 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -5961,21 +6265,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -5987,22 +6291,21 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -6011,21 +6314,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6035,15 +6338,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store align=1 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=4 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -6052,21 +6363,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6078,22 +6389,21 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store align=2 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load align=8 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -6102,21 +6412,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6128,20 +6438,19 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 15) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6176,13 +6485,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store8 +;; CHECK-NEXT: (i32.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6217,13 +6526,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 align=1 +;; CHECK-NEXT: (i32.store16 align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6267,13 +6576,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 +;; CHECK-NEXT: (i32.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i32) (param $1 i32) (param $2 i32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6308,13 +6617,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 align=1 +;; CHECK-NEXT: (i32.store align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i32) (param $1 i32) (param $2 i32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6358,13 +6667,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 align=2 +;; CHECK-NEXT: (i32.store align=2 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i32) (param $1 i32) (param $2 i32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6408,13 +6717,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 +;; CHECK-NEXT: (i32.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6432,7 +6741,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6449,13 +6758,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=1 +;; CHECK-NEXT: (i64.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6473,7 +6782,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6490,22 +6799,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=2 +;; CHECK-NEXT: (i64.store16 align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6523,7 +6823,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6543,19 +6843,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=4 +;; CHECK-NEXT: (i64.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6573,7 +6873,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6590,22 +6890,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 7) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store +;; CHECK-NEXT: (i64.store32 align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i32) (param $1 i32) (param $2 f32) +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6640,13 +6931,22 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.store align=1 -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6684,19 +6984,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.store align=2 +;; CHECK-NEXT: (i64.store32 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6714,7 +7014,48 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6734,19 +7075,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.store +;; CHECK-NEXT: (i64.store align=2 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6781,13 +7122,22 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.store align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=4 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6825,19 +7175,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.store align=2 +;; CHECK-NEXT: (i64.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i32) (param $1 i32) (param $2 f32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6855,7 +7205,48 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6875,19 +7266,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.store align=4 +;; CHECK-NEXT: (f32.store align=2 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6905,7 +7296,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6925,19 +7316,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.store +;; CHECK-NEXT: (f32.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6955,7 +7346,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6972,13 +7363,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=1 +;; CHECK-NEXT: (f64.store align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6996,7 +7387,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7022,13 +7413,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=2 +;; CHECK-NEXT: (f64.store align=2 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -7046,7 +7437,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7072,13 +7463,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=4 +;; CHECK-NEXT: (f64.store align=4 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -7096,7 +7487,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7122,13 +7513,54 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=8 +;; CHECK-NEXT: (f64.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -7139,21 +7571,667 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=4 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +(module + ;; CHECK: (type $0 (func (param i32 i32) (result i64))) + + ;; CHECK: (type $1 (func (param i32 i32) (result i32))) + + ;; CHECK: (type $2 (func (param i32 i32 i64))) + + ;; CHECK: (type $3 (func (param i32 i32 i32))) + + ;; CHECK: (type $4 (func (param i32 i32) (result v128))) + + ;; CHECK: (type $5 (func (param i32 i32 v128))) + + ;; CHECK: (type $6 (func (param i32 i32) (result f64))) + + ;; CHECK: (type $7 (func (param i32 i32 f64))) + + ;; CHECK: (type $FUNCSIG$v (func)) + (type $FUNCSIG$v (func)) + ;; CHECK: (type $9 (func (param i32 i32) (result f32))) + + ;; CHECK: (type $10 (func (param i32 i32 f32))) + + ;; CHECK: (type $11 (func (result i32))) + + ;; CHECK: (import "env" "segfault" (func $segfault)) + (import "env" "segfault" (func $segfault)) + ;; CHECK: (import "env" "alignfault" (func $alignfault)) + (import "env" "alignfault" (func $alignfault)) + ;; CHECK: (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i32))) + + ;; CHECK: (memory $0 100 100 shared) + (memory $0 100 100 shared) + ;; CHECK: (func $actions + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_4 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_4 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i32.const 100) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $actions + (drop (i32.load (i32.const 1))) + (i32.store (i32.const 1) (i32.const 100)) + ) +) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load8_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_AR (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load8_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_SC (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_AR (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load8_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_SC (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_AR (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load16_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_SC (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -7165,70 +8243,25 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -(module - ;; CHECK: (type $0 (func (param i32 i32) (result i64))) - - ;; CHECK: (type $1 (func (param i32 i32) (result i32))) - - ;; CHECK: (type $2 (func (param i32 i32 i64))) - ;; CHECK: (type $3 (func (param i32 i32 i32))) - - ;; CHECK: (type $4 (func (param i32 i32) (result v128))) - - ;; CHECK: (type $5 (func (param i32 i32 v128))) - - ;; CHECK: (type $6 (func (param i32 i32) (result f64))) - - ;; CHECK: (type $7 (func (param i32 i32 f64))) - - ;; CHECK: (type $FUNCSIG$v (func)) - (type $FUNCSIG$v (func)) - ;; CHECK: (type $9 (func (param i32 i32) (result f32))) - - ;; CHECK: (type $10 (func (param i32 i32 f32))) - - ;; CHECK: (type $11 (func (result i32))) - - ;; CHECK: (import "env" "segfault" (func $segfault)) - (import "env" "segfault" (func $segfault)) - ;; CHECK: (import "env" "alignfault" (func $alignfault)) - (import "env" "alignfault" (func $alignfault)) - ;; CHECK: (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i32))) - - ;; CHECK: (memory $0 100 100 shared) - (memory $0 100 100 shared) - ;; CHECK: (func $actions - ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_4 - ;; CHECK-NEXT: (i32.const 1) - ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_4 - ;; CHECK-NEXT: (i32.const 1) - ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: (i32.const 100) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - (func $actions - (drop (i32.load (i32.const 1))) - (i32.store (i32.const 1) (i32.const 100)) - ) -) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7246,7 +8279,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7263,18 +8296,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.shr_s -;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (i32.atomic.load8_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 24) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: (i32.load16_u align=1 +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7292,7 +8319,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7309,12 +8336,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_s +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_AR (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7332,7 +8368,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7349,12 +8385,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load16_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7372,7 +8417,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7389,12 +8434,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_u +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7412,7 +8466,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7429,12 +8483,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s align=1 +;; CHECK-NEXT: (i32.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7452,7 +8506,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7478,18 +8532,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.shr_s -;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (i32.atomic.load16_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 16) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.load align=2 +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7507,7 +8555,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7527,18 +8575,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s +;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_AR (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7556,7 +8604,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7573,12 +8621,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7596,7 +8653,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7616,18 +8673,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.load16_u +;; CHECK-NEXT: (i32.atomic.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7645,7 +8702,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7662,21 +8719,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u +;; CHECK-NEXT: (i64.load8_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7694,7 +8742,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7711,12 +8759,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=1 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load8_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7734,7 +8788,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7751,21 +8805,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) ;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=2 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 56) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7783,7 +8834,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7800,21 +8851,52 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_AR (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) ;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.load +;; CHECK-NEXT: (i64.atomic.load8_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7832,7 +8914,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7849,21 +8931,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (i64.atomic.load8_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7881,7 +8954,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7898,18 +8971,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.shr_s -;; CHECK-NEXT: (i64.shl -;; CHECK-NEXT: (i64.atomic.load8_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 56) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: (i64.load16_s align=1 +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7927,7 +8994,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7944,12 +9011,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_s +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7967,7 +9043,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7984,12 +9060,27 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load8_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load16_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8007,7 +9098,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -8024,12 +9115,27 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8064,12 +9170,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s align=1 +;; CHECK-NEXT: (i64.load16_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8113,18 +9219,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.shr_s -;; CHECK-NEXT: (i64.shl -;; CHECK-NEXT: (i64.atomic.load16_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 48) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: (i64.load16_u +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8168,12 +9268,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s +;; CHECK-NEXT: (i64.atomic.load16_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8208,12 +9308,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8231,7 +9340,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -8248,21 +9357,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load16_u +;; CHECK-NEXT: (i64.load32_s align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8280,7 +9380,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -8306,12 +9406,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u +;; CHECK-NEXT: (i64.load32_s align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8346,12 +9446,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8389,18 +9498,24 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=2 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load32_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8455,7 +9570,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8490,21 +9605,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s +;; CHECK-NEXT: (i64.load32_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8539,12 +9645,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_u align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8582,18 +9697,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=2 +;; CHECK-NEXT: (i64.load32_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8637,12 +9752,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load32_u +;; CHECK-NEXT: (i64.atomic.load32_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8686,7 +9801,7 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u +;; CHECK-NEXT: (i64.atomic.load32_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -8829,7 +9944,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8873,12 +9988,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load +;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8922,7 +10037,56 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (i64.atomic.load acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_SC (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) diff --git a/test/lit/passes/safe-heap_enable-threads_enable-simd64.wast b/test/lit/passes/safe-heap_enable-threads_enable-simd64.wast index 890887abd06..f4179d56cf3 100644 --- a/test/lit/passes/safe-heap_enable-threads_enable-simd64.wast +++ b/test/lit/passes/safe-heap_enable-threads_enable-simd64.wast @@ -45,7 +45,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_A + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_SC ;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) @@ -242,7 +242,7 @@ ) ) ;; not shared -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_A (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -277,18 +277,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.shr_s -;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (i32.atomic.load8_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 24) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: (i32.load8_s +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_AR (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -323,12 +317,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_s -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load8_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_A (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_SC (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -363,8 +363,14 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.load8_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -408,7 +414,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_AR (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -426,7 +432,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -443,12 +449,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s align=1 +;; CHECK-NEXT: (i32.atomic.load8_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_A (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_SC (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -466,7 +472,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -483,29 +489,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.shr_s -;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (i32.atomic.load16_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 16) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -540,23 +529,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s +;; CHECK-NEXT: (i32.load16_s align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -591,12 +569,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_A (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_AR (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -642,12 +631,18 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.load16_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load16_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_SC (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -693,12 +688,18 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -716,7 +717,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -733,12 +734,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=1 +;; CHECK-NEXT: (i32.load16_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -756,7 +757,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -784,12 +785,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=2 +;; CHECK-NEXT: (i32.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_A (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_AR (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -807,7 +808,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -829,18 +830,18 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.load +;; CHECK-NEXT: (i32.atomic.load16_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_SC (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -858,7 +859,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -880,18 +881,18 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (i32.atomic.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -909,7 +910,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -926,18 +927,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.shr_s -;; CHECK-NEXT: (i64.shl -;; CHECK-NEXT: (i64.atomic.load8_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 56) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: (i32.load align=1 +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -955,7 +950,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -972,12 +967,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_s +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -995,7 +1001,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1012,12 +1018,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load8_u +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_AR (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1035,7 +1052,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1052,12 +1069,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_u +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_SC (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1075,7 +1103,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1092,12 +1120,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1115,7 +1154,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1132,29 +1171,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.shr_s -;; CHECK-NEXT: (i64.shl -;; CHECK-NEXT: (i64.atomic.load16_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 48) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: (i64.load8_s +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_AR (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1172,7 +1194,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1189,23 +1211,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load8_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: (i64.const 56) ;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 56) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_SC (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1223,7 +1240,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1240,12 +1257,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u align=1 -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1263,7 +1286,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1280,23 +1303,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load16_u +;; CHECK-NEXT: (i64.load8_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_AR (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1314,7 +1326,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1331,23 +1343,52 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load8_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_SC (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) ;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq ;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u +;; CHECK-NEXT: (i64.atomic.load8_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1365,7 +1406,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1382,12 +1423,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=1 +;; CHECK-NEXT: (i64.load16_s align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1405,7 +1446,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1433,12 +1474,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=2 +;; CHECK-NEXT: (i64.load16_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_AR (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1456,7 +1497,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1478,7 +1519,7 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) @@ -1486,16 +1527,16 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.shr_s ;; CHECK-NEXT: (i64.shl -;; CHECK-NEXT: (i64.atomic.load32_u +;; CHECK-NEXT: (i64.atomic.load16_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: (i64.const 48) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: (i64.const 48) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_SC (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1513,7 +1554,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1535,18 +1576,24 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1564,7 +1611,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1581,12 +1628,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=1 +;; CHECK-NEXT: (i64.load16_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1604,7 +1651,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1632,12 +1679,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=2 +;; CHECK-NEXT: (i64.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_AR (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1655,7 +1702,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1677,18 +1724,18 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load32_u +;; CHECK-NEXT: (i64.atomic.load16_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_SC (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1706,7 +1753,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1728,18 +1775,18 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u +;; CHECK-NEXT: (i64.atomic.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1757,7 +1804,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1774,12 +1821,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=1 +;; CHECK-NEXT: (i64.load32_s align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1797,7 +1844,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1825,12 +1872,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=2 +;; CHECK-NEXT: (i64.load32_s align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1848,7 +1895,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1876,12 +1923,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=4 +;; CHECK-NEXT: (i64.load32_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_AR (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1899,7 +1946,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1921,18 +1968,24 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load32_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_SC (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -1950,7 +2003,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1972,18 +2025,24 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load32_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i64) (param $1 i64) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -2018,12 +2077,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load align=1 +;; CHECK-NEXT: (i64.load32_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i64) (param $1 i64) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -2069,12 +2128,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load align=2 +;; CHECK-NEXT: (i64.load32_u align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i64) (param $1 i64) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -2120,12 +2179,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load +;; CHECK-NEXT: (i64.load32_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i64) (param $1 i64) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_AR (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -2143,7 +2202,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2160,12 +2219,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load32_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i64) (param $1 i64) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_SC (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -2183,7 +2253,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2205,18 +2275,18 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=2 +;; CHECK-NEXT: (i64.atomic.load32_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i64) (param $1 i64) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -2251,23 +2321,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=4 +;; CHECK-NEXT: (i64.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i64) (param $1 i64) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -2307,18 +2366,18 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load +;; CHECK-NEXT: (i64.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i64) (param $1 i64) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -2336,7 +2395,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2353,12 +2412,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load align=4 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i64) (param $1 i64) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -2376,7 +2446,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2398,18 +2468,18 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=2 +;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i64) (param $1 i64) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_AR (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -2427,7 +2497,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2449,18 +2519,18 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=4 +;; CHECK-NEXT: (i64.atomic.load acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i64) (param $1 i64) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_SC (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -2478,7 +2548,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2506,12 +2576,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=8 +;; CHECK-NEXT: (i64.atomic.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i64) (param $1 i64) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i64) (param $1 i64) (result f32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -2529,7 +2599,47 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i64) (param $1 i64) (result f32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2551,20 +2661,20 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load +;; CHECK-NEXT: (f32.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_1_A (param $0 i64) (param $1 i64) (param $2 i32) -;; CHECK-NEXT: (local $3 i64) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i64) (param $1 i64) (result f32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2573,21 +2683,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2597,15 +2707,25 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store8 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i64) (param $1 i64) (param $2 i32) -;; CHECK-NEXT: (local $3 i64) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i64) (param $1 i64) (result f64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2614,21 +2734,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2638,15 +2758,14 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store8 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (f64.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i64) (param $1 i64) (param $2 i32) -;; CHECK-NEXT: (local $3 i64) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i64) (param $1 i64) (result f64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2655,21 +2774,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2679,15 +2798,25 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 align=1 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_A (param $0 i64) (param $1 i64) (param $2 i32) -;; CHECK-NEXT: (local $3 i64) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i64) (param $1 i64) (result f64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2696,21 +2825,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2723,23 +2852,22 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store16 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (f64.load align=4 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i64) (param $1 i64) (param $2 i32) -;; CHECK-NEXT: (local $3 i64) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i64) (param $1 i64) (result f64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2748,21 +2876,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2775,23 +2903,22 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (f64.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i64) (param $1 i64) (param $2 i32) -;; CHECK-NEXT: (local $3 i64) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i64) (param $1 i64) (result v128) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2800,21 +2927,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2824,15 +2951,14 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store align=1 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i64) (param $1 i64) (param $2 i32) -;; CHECK-NEXT: (local $3 i64) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i64) (param $1 i64) (result v128) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2841,21 +2967,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2868,7 +2994,7 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) @@ -2876,15 +3002,14 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store align=2 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_A (param $0 i64) (param $1 i64) (param $2 i32) -;; CHECK-NEXT: (local $3 i64) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i64) (param $1 i64) (result v128) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2893,21 +3018,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2920,7 +3045,7 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) @@ -2928,15 +3053,14 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load align=4 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i64) (param $1 i64) (param $2 i32) -;; CHECK-NEXT: (local $3 i64) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i64) (param $1 i64) (result v128) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2945,21 +3069,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2972,23 +3096,22 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load align=8 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_1_A (param $0 i64) (param $1 i64) (param $2 i64) -;; CHECK-NEXT: (local $3 i64) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i64) (param $1 i64) (result v128) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2997,15 +3120,66 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 1) -;; CHECK-NEXT: ) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_1_A (param $0 i64) (param $1 i64) (param $2 i32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) @@ -3021,13 +3195,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store8 +;; CHECK-NEXT: (i32.atomic.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i64) (param $1 i64) (param $2 i32) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -3062,13 +3236,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store8 +;; CHECK-NEXT: (i32.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i64) (param $1 i64) (param $2 i32) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -3103,13 +3277,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 align=1 +;; CHECK-NEXT: (i32.store16 align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_2_A (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_A (param $0 i64) (param $1 i64) (param $2 i32) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -3155,13 +3329,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store16 +;; CHECK-NEXT: (i32.atomic.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i64) (param $1 i64) (param $2 i32) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -3207,13 +3381,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 +;; CHECK-NEXT: (i32.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i64) (param $1 i64) (param $2 i32) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -3248,13 +3422,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 align=1 +;; CHECK-NEXT: (i32.store align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i64) (param $1 i64) (param $2 i32) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -3300,13 +3474,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 align=2 +;; CHECK-NEXT: (i32.store align=2 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_A (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_A (param $0 i64) (param $1 i64) (param $2 i32) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -3352,13 +3526,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store32 +;; CHECK-NEXT: (i32.atomic.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i64) (param $1 i64) (param $2 i32) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -3404,13 +3578,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 +;; CHECK-NEXT: (i32.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_1_A (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -3428,7 +3602,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3445,13 +3619,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=1 +;; CHECK-NEXT: (i64.atomic.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -3469,7 +3643,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3486,24 +3660,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=2 +;; CHECK-NEXT: (i64.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -3521,7 +3684,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3538,24 +3701,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=4 +;; CHECK-NEXT: (i64.store16 align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_A (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_A (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -3573,7 +3725,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3595,19 +3747,19 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store +;; CHECK-NEXT: (i64.atomic.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -3625,7 +3777,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3647,19 +3799,19 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store +;; CHECK-NEXT: (i64.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i64) (param $1 i64) (param $2 f32) +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -3694,13 +3846,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.store align=1 +;; CHECK-NEXT: (i64.store32 align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i64) (param $1 i64) (param $2 f32) +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -3746,13 +3898,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.store align=2 +;; CHECK-NEXT: (i64.store32 align=2 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i64) (param $1 i64) (param $2 f32) +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_A (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -3798,13 +3950,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.store +;; CHECK-NEXT: (i64.atomic.store32 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i64) (param $1 i64) (param $2 f64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -3822,7 +3974,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3839,13 +3991,24 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.store align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i64) (param $1 i64) (param $2 f64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -3880,24 +4043,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.store align=2 +;; CHECK-NEXT: (i64.store align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i64) (param $1 i64) (param $2 f64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -3937,19 +4089,19 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.store align=4 +;; CHECK-NEXT: (i64.store align=2 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i64) (param $1 i64) (param $2 f64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -3989,19 +4141,19 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.store +;; CHECK-NEXT: (i64.store align=4 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_A (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -4019,7 +4171,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4036,13 +4188,24 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -4060,7 +4223,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4082,19 +4245,19 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=2 +;; CHECK-NEXT: (i64.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i64) (param $1 i64) (param $2 f32) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -4112,7 +4275,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4129,24 +4292,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=4 +;; CHECK-NEXT: (f32.store align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i64) (param $1 i64) (param $2 f32) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -4164,7 +4316,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4186,19 +4338,19 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=8 +;; CHECK-NEXT: (f32.store align=2 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i64) (param $1 i64) (param $2 f32) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -4216,7 +4368,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4238,67 +4390,21 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store +;; CHECK-NEXT: (f32.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -(module - (memory i64 100 100) - ;; CHECK: (type $0 (func (param i64 i64) (result i64))) - - ;; CHECK: (type $1 (func (param i64 i64 i64))) - - ;; CHECK: (type $2 (func (param i64 i64) (result i32))) - - ;; CHECK: (type $3 (func (param i64 i64 i32))) - - ;; CHECK: (type $4 (func (param i64 i64) (result v128))) - - ;; CHECK: (type $5 (func (param i64 i64 v128))) - - ;; CHECK: (type $6 (func (param i64 i64) (result f64))) - - ;; CHECK: (type $7 (func (param i64 i64 f64))) - - ;; CHECK: (type $8 (func)) - - ;; CHECK: (type $9 (func (param i64 i64) (result f32))) - - ;; CHECK: (type $10 (func (param i64 i64 f32))) - - ;; CHECK: (type $11 (func (result i64))) - - ;; CHECK: (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i64))) - - ;; CHECK: (import "env" "segfault" (func $segfault)) - - ;; CHECK: (import "env" "alignfault" (func $alignfault)) - - ;; CHECK: (memory $0 i64 100 100) - ;; CHECK: (func $loads - ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_4 - ;; CHECK-NEXT: (i64.const 1) - ;; CHECK-NEXT: (i64.const 0) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - (func $loads - (drop (i32.load (i64.const 1))) - ) -) -;; pre-existing -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i64) (param $1 i64) (result i32) -;; CHECK-NEXT: (local $2 i64) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i64) (param $1 i64) (param $2 f64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4307,21 +4413,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4331,14 +4437,15 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_s +;; CHECK-NEXT: (f64.store align=1 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i64) (param $1 i64) (result i32) -;; CHECK-NEXT: (local $2 i64) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i64) (param $1 i64) (param $2 f64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4347,21 +4454,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4371,14 +4478,26 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_u +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=2 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i64) (param $1 i64) (result i32) -;; CHECK-NEXT: (local $2 i64) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i64) (param $1 i64) (param $2 f64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4387,21 +4506,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4411,14 +4530,26 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=4 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i64) (param $1 i64) (result i32) -;; CHECK-NEXT: (local $2 i64) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i64) (param $1 i64) (param $2 f64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4427,21 +4558,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4454,22 +4585,23 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s +;; CHECK-NEXT: (f64.store +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i64) (param $1 i64) (result i32) -;; CHECK-NEXT: (local $2 i64) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4478,21 +4610,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4502,14 +4634,15 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u align=1 +;; CHECK-NEXT: (v128.store align=1 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i64) (param $1 i64) (result i32) -;; CHECK-NEXT: (local $2 i64) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4518,21 +4651,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4545,7 +4678,7 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) @@ -4553,14 +4686,15 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u +;; CHECK-NEXT: (v128.store align=2 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i64) (param $1 i64) (result i32) -;; CHECK-NEXT: (local $2 i64) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4569,21 +4703,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4593,14 +4727,26 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=4 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i64) (param $1 i64) (result i32) -;; CHECK-NEXT: (local $2 i64) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4609,21 +4755,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4636,22 +4782,23 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=2 +;; CHECK-NEXT: (v128.store align=8 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i64) (param $1 i64) (result i32) -;; CHECK-NEXT: (local $2 i64) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4660,21 +4807,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4687,24 +4834,71 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 15) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (v128.store +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) +(module + (memory i64 100 100) + ;; CHECK: (type $0 (func (param i64 i64) (result i64))) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i64) (param $1 i64) (result i64) -;; CHECK-NEXT: (local $2 i64) -;; CHECK-NEXT: (local.set $2 -;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $0) + ;; CHECK: (type $1 (func (param i64 i64 i64))) + + ;; CHECK: (type $2 (func (param i64 i64) (result i32))) + + ;; CHECK: (type $3 (func (param i64 i64 i32))) + + ;; CHECK: (type $4 (func (param i64 i64) (result v128))) + + ;; CHECK: (type $5 (func (param i64 i64 v128))) + + ;; CHECK: (type $6 (func (param i64 i64) (result f64))) + + ;; CHECK: (type $7 (func (param i64 i64 f64))) + + ;; CHECK: (type $8 (func)) + + ;; CHECK: (type $9 (func (param i64 i64) (result f32))) + + ;; CHECK: (type $10 (func (param i64 i64 f32))) + + ;; CHECK: (type $11 (func (result i64))) + + ;; CHECK: (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i64))) + + ;; CHECK: (import "env" "segfault" (func $segfault)) + + ;; CHECK: (import "env" "alignfault" (func $alignfault)) + + ;; CHECK: (memory $0 i64 100 100) + + ;; CHECK: (func $loads + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_4 + ;; CHECK-NEXT: (i64.const 1) + ;; CHECK-NEXT: (i64.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $loads + (drop (i32.load (i64.const 1))) + ) +) +;; pre-existing +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4735,12 +4929,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_s +;; CHECK-NEXT: (i32.load8_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -4775,12 +4969,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_u +;; CHECK-NEXT: (i32.load8_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -4815,12 +5009,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s align=1 +;; CHECK-NEXT: (i32.load16_s align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -4866,12 +5060,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s +;; CHECK-NEXT: (i32.load16_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -4906,12 +5100,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u align=1 +;; CHECK-NEXT: (i32.load16_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -4957,12 +5151,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u +;; CHECK-NEXT: (i32.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -4997,12 +5191,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=1 +;; CHECK-NEXT: (i32.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5048,12 +5242,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=2 +;; CHECK-NEXT: (i32.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5099,12 +5293,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s +;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5122,7 +5316,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5139,12 +5333,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=1 +;; CHECK-NEXT: (i64.load8_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5162,7 +5356,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5179,23 +5373,52 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) ;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq ;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=2 +;; CHECK-NEXT: (i64.load16_s align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5213,7 +5436,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5235,18 +5458,18 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u +;; CHECK-NEXT: (i64.load16_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5264,7 +5487,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5281,12 +5504,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=1 +;; CHECK-NEXT: (i64.load16_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5304,7 +5527,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5332,12 +5555,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=2 +;; CHECK-NEXT: (i64.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5355,7 +5578,47 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5377,18 +5640,18 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=4 +;; CHECK-NEXT: (i64.load32_s align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5406,7 +5669,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5428,18 +5691,18 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (i64.load32_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i64) (param $1 i64) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5474,12 +5737,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load align=1 +;; CHECK-NEXT: (i64.load32_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i64) (param $1 i64) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5525,12 +5788,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load align=2 +;; CHECK-NEXT: (i64.load32_u align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i64) (param $1 i64) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5576,12 +5839,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load +;; CHECK-NEXT: (i64.load32_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i64) (param $1 i64) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5616,12 +5879,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=1 +;; CHECK-NEXT: (i64.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i64) (param $1 i64) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5667,12 +5930,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=2 +;; CHECK-NEXT: (i64.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i64) (param $1 i64) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5718,12 +5981,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=4 +;; CHECK-NEXT: (i64.load align=4 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i64) (param $1 i64) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5769,12 +6032,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load +;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i64) (param $1 i64) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i64) (param $1 i64) (result f32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5792,7 +6055,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5809,12 +6072,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=1 +;; CHECK-NEXT: (f32.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i64) (param $1 i64) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i64) (param $1 i64) (result f32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5832,7 +6095,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5860,12 +6123,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=2 +;; CHECK-NEXT: (f32.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i64) (param $1 i64) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i64) (param $1 i64) (result f32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5883,7 +6146,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5911,12 +6174,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=4 +;; CHECK-NEXT: (f32.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i64) (param $1 i64) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i64) (param $1 i64) (result f64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5934,7 +6197,47 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i64) (param $1 i64) (result f64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5956,18 +6259,18 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=8 +;; CHECK-NEXT: (f64.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i64) (param $1 i64) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i64) (param $1 i64) (result f64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -5985,7 +6288,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6007,20 +6310,20 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load +;; CHECK-NEXT: (f64.load align=4 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i64) (param $1 i64) (param $2 i32) -;; CHECK-NEXT: (local $3 i64) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i64) (param $1 i64) (result f64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -6029,21 +6332,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6053,15 +6356,25 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store8 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i64) (param $1 i64) (param $2 i32) -;; CHECK-NEXT: (local $3 i64) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i64) (param $1 i64) (result v128) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -6070,21 +6383,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6094,15 +6407,14 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 align=1 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i64) (param $1 i64) (param $2 i32) -;; CHECK-NEXT: (local $3 i64) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i64) (param $1 i64) (result v128) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -6111,21 +6423,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6138,7 +6450,7 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) @@ -6146,15 +6458,14 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i64) (param $1 i64) (param $2 i32) -;; CHECK-NEXT: (local $3 i64) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i64) (param $1 i64) (result v128) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -6163,21 +6474,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6187,15 +6498,25 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store align=1 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=4 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i64) (param $1 i64) (param $2 i32) -;; CHECK-NEXT: (local $3 i64) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i64) (param $1 i64) (result v128) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -6204,21 +6525,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6231,23 +6552,22 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store align=2 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load align=8 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i64) (param $1 i64) (param $2 i32) -;; CHECK-NEXT: (local $3 i64) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i64) (param $1 i64) (result v128) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -6256,21 +6576,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.eq -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i64.const 0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6283,21 +6603,20 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 15) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i64) (param $1 i64) (param $2 i32) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -6332,13 +6651,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store8 +;; CHECK-NEXT: (i32.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i64) (param $1 i64) (param $2 i32) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -6373,13 +6692,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 align=1 +;; CHECK-NEXT: (i32.store16 align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i64) (param $1 i64) (param $2 i32) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -6425,13 +6744,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 +;; CHECK-NEXT: (i32.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i64) (param $1 i64) (param $2 i32) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -6466,13 +6785,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 align=1 +;; CHECK-NEXT: (i32.store align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i64) (param $1 i64) (param $2 i32) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -6518,13 +6837,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 align=2 +;; CHECK-NEXT: (i32.store align=2 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i64) (param $1 i64) (param $2 i32) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -6570,13 +6889,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 +;; CHECK-NEXT: (i32.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -6594,7 +6913,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6611,13 +6930,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=1 +;; CHECK-NEXT: (i64.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -6635,7 +6954,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6652,24 +6971,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=2 +;; CHECK-NEXT: (i64.store16 align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -6687,7 +6995,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6709,19 +7017,19 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=4 +;; CHECK-NEXT: (i64.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -6739,7 +7047,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6756,24 +7064,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 7) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store +;; CHECK-NEXT: (i64.store32 align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i64) (param $1 i64) (param $2 f32) +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -6808,13 +7105,24 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.store align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 align=2 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i64) (param $1 i64) (param $2 f32) +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -6854,19 +7162,19 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.store align=2 +;; CHECK-NEXT: (i64.store32 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i64) (param $1 i64) (param $2 f32) +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -6884,7 +7192,48 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i64) (param $1 i64) (param $2 i64) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6906,19 +7255,19 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.store +;; CHECK-NEXT: (i64.store align=2 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i64) (param $1 i64) (param $2 f64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -6953,13 +7302,24 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.store align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=4 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i64) (param $1 i64) (param $2 f64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i64) (param $1 i64) (param $2 i64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -6999,19 +7359,19 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.store align=2 +;; CHECK-NEXT: (i64.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i64) (param $1 i64) (param $2 f64) +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i64) (param $1 i64) (param $2 f32) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -7029,7 +7389,48 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i64) (param $1 i64) (param $2 f32) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7051,19 +7452,19 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.store align=4 +;; CHECK-NEXT: (f32.store align=2 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i64) (param $1 i64) (param $2 f64) +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i64) (param $1 i64) (param $2 f32) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -7081,7 +7482,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7103,19 +7504,19 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.store +;; CHECK-NEXT: (f32.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i64) (param $1 i64) (param $2 f64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -7133,7 +7534,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7150,13 +7551,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=1 +;; CHECK-NEXT: (f64.store align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i64) (param $1 i64) (param $2 f64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -7174,7 +7575,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7202,13 +7603,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=2 +;; CHECK-NEXT: (f64.store align=2 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i64) (param $1 i64) (param $2 f64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -7226,7 +7627,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7254,13 +7655,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=4 +;; CHECK-NEXT: (f64.store align=4 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i64) (param $1 i64) (param $2 f64) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -7278,7 +7679,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: (i64.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7306,13 +7707,54 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=8 +;; CHECK-NEXT: (f64.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i64) (param $1 i64) (param $2 v128) ;; CHECK-NEXT: (local $3 i64) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i64.add @@ -7352,52 +7794,208 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store +;; CHECK-NEXT: (v128.store align=2 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -(module - ;; CHECK: (type $0 (func (param i64 i64) (result i64))) - ;; CHECK: (type $1 (func (param i64 i64) (result i32))) - - ;; CHECK: (type $2 (func (param i64 i64 i64))) - - ;; CHECK: (type $3 (func (param i64 i64 i32))) - - ;; CHECK: (type $4 (func (param i64 i64) (result v128))) - - ;; CHECK: (type $5 (func (param i64 i64 v128))) - - ;; CHECK: (type $6 (func (param i64 i64) (result f64))) - - ;; CHECK: (type $7 (func (param i64 i64 f64))) - - ;; CHECK: (type $FUNCSIG$v (func)) - (type $FUNCSIG$v (func)) - ;; CHECK: (type $9 (func (param i64 i64) (result f32))) - - ;; CHECK: (type $10 (func (param i64 i64 f32))) - - ;; CHECK: (type $11 (func (result i64))) - - ;; CHECK: (import "env" "emscripten_get_sbrk_ptr" (func $foo (result i64))) - (import "env" "emscripten_get_sbrk_ptr" (func $foo (result i64))) - ;; CHECK: (import "env" "segfault" (func $segfault)) - (import "env" "segfault" (func $segfault)) - ;; CHECK: (import "env" "alignfault" (func $alignfault)) - (import "env" "alignfault" (func $alignfault)) - ;; CHECK: (memory $0 i64 100 100 shared) - (memory $0 i64 100 100 shared) - ;; CHECK: (func $actions - ;; CHECK-NEXT: (drop +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=4 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i64) (param $1 i64) (param $2 v128) +;; CHECK-NEXT: (local $3 i64) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i64.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +(module + ;; CHECK: (type $0 (func (param i64 i64) (result i64))) + + ;; CHECK: (type $1 (func (param i64 i64) (result i32))) + + ;; CHECK: (type $2 (func (param i64 i64 i64))) + + ;; CHECK: (type $3 (func (param i64 i64 i32))) + + ;; CHECK: (type $4 (func (param i64 i64) (result v128))) + + ;; CHECK: (type $5 (func (param i64 i64 v128))) + + ;; CHECK: (type $6 (func (param i64 i64) (result f64))) + + ;; CHECK: (type $7 (func (param i64 i64 f64))) + + ;; CHECK: (type $FUNCSIG$v (func)) + (type $FUNCSIG$v (func)) + ;; CHECK: (type $9 (func (param i64 i64) (result f32))) + + ;; CHECK: (type $10 (func (param i64 i64 f32))) + + ;; CHECK: (type $11 (func (result i64))) + + ;; CHECK: (import "env" "emscripten_get_sbrk_ptr" (func $foo (result i64))) + (import "env" "emscripten_get_sbrk_ptr" (func $foo (result i64))) + ;; CHECK: (import "env" "segfault" (func $segfault)) + (import "env" "segfault" (func $segfault)) + ;; CHECK: (import "env" "alignfault" (func $alignfault)) + (import "env" "alignfault" (func $alignfault)) + ;; CHECK: (memory $0 i64 100 100 shared) + (memory $0 i64 100 100 shared) + ;; CHECK: (func $actions + ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_4 ;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: (i64.const 0) @@ -7414,7 +8012,407 @@ (i32.store (i64.const 1) (i32.const 100)) ) ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_A (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load8_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_AR (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load8_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_SC (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_AR (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load8_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_SC (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_AR (param $0 i64) (param $1 i64) (result i32) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load16_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_SC (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -7432,7 +8430,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -7449,18 +8447,29 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.shr_s ;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (i32.atomic.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -7478,7 +8487,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -7495,12 +8504,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_s +;; CHECK-NEXT: (i32.load16_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_A (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -7518,7 +8527,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -7535,12 +8544,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_AR (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -7558,7 +8578,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -7575,12 +8595,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_u +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load16_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_SC (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -7615,12 +8646,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_A (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -7638,7 +8680,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -7655,29 +8697,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.shr_s -;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (i32.atomic.load16_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 16) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.load align=1 +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -7695,7 +8720,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -7723,12 +8748,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s +;; CHECK-NEXT: (i32.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -7746,7 +8771,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -7763,12 +8788,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_A (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_AR (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -7786,7 +8822,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -7808,18 +8844,18 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.load16_u +;; CHECK-NEXT: (i32.atomic.load acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_SC (param $0 i64) (param $1 i64) (result i32) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -7837,7 +8873,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -7859,18 +8895,18 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u +;; CHECK-NEXT: (i32.atomic.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -7888,7 +8924,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -7905,12 +8941,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=1 +;; CHECK-NEXT: (i64.load8_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_AR (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -7928,7 +8964,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -7945,23 +8981,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load8_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: (i64.const 56) ;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=2 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 56) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_A (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_SC (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -7979,7 +9010,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -7996,23 +9027,58 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) ;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq ;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.load +;; CHECK-NEXT: (i64.load8_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i64) (param $1 i64) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_AR (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -8030,7 +9096,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 4) +;; CHECK-NEXT: (i64.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -8047,23 +9113,52 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load8_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_SC (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) ;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq ;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (i64.atomic.load8_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -8081,7 +9176,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -8098,18 +9193,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.shr_s -;; CHECK-NEXT: (i64.shl -;; CHECK-NEXT: (i64.atomic.load8_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 56) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: (i64.load16_s align=1 +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -8127,7 +9216,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -8144,12 +9233,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_s +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_AR (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -8167,7 +9267,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -8184,12 +9284,29 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load8_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load16_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_SC (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -8207,7 +9324,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 1) +;; CHECK-NEXT: (i64.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -8224,12 +9341,29 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -8264,12 +9398,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s align=1 +;; CHECK-NEXT: (i64.load16_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -8315,18 +9449,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.shr_s -;; CHECK-NEXT: (i64.shl -;; CHECK-NEXT: (i64.atomic.load16_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 48) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: (i64.load16_u +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_AR (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -8372,12 +9500,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s +;; CHECK-NEXT: (i64.atomic.load16_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_SC (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -8412,12 +9540,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -8435,7 +9574,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -8452,23 +9591,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load16_u +;; CHECK-NEXT: (i64.load32_s align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -8486,7 +9614,7 @@ ;; CHECK-NEXT: (i64.gt_u ;; CHECK-NEXT: (i64.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i64.const 2) +;; CHECK-NEXT: (i64.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (call $foo) @@ -8514,12 +9642,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u +;; CHECK-NEXT: (i64.load32_s align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -8554,12 +9682,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_AR (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -8599,18 +9738,24 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=2 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load32_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_SC (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -8667,7 +9812,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -8702,23 +9847,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (i32.wrap_i64 -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 3) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s +;; CHECK-NEXT: (i64.load32_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -8753,12 +9887,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_u align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -8798,18 +9943,18 @@ ;; CHECK-NEXT: (i32.wrap_i64 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=2 +;; CHECK-NEXT: (i64.load32_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_AR (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -8855,12 +10000,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load32_u +;; CHECK-NEXT: (i64.atomic.load32_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_SC (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -8906,7 +10051,7 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u +;; CHECK-NEXT: (i64.atomic.load32_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -9053,7 +10198,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_A (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -9099,12 +10244,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load +;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i64) (param $1 i64) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_AR (param $0 i64) (param $1 i64) (result i64) ;; CHECK-NEXT: (local $2 i64) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i64.add @@ -9150,7 +10295,58 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (i64.atomic.load acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_SC (param $0 i64) (param $1 i64) (result i64) +;; CHECK-NEXT: (local $2 i64) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.eq +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i64.gt_u +;; CHECK-NEXT: (i64.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (i32.wrap_i64 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) diff --git a/test/lit/passes/safe-heap_low-memory-unused_enable-threads_enable-simd.wast b/test/lit/passes/safe-heap_low-memory-unused_enable-threads_enable-simd.wast index f66e9bad90e..7aa9bf29e0d 100644 --- a/test/lit/passes/safe-heap_low-memory-unused_enable-threads_enable-simd.wast +++ b/test/lit/passes/safe-heap_low-memory-unused_enable-threads_enable-simd.wast @@ -45,7 +45,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_A + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_SC ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: (i32.const 0) ;; CHECK-NEXT: ) @@ -242,7 +242,7 @@ ) ) ;; not shared -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -277,18 +277,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.shr_s -;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (i32.atomic.load8_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 24) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: (i32.load8_s +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_AR (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -323,12 +317,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_s -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load8_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -363,8 +363,14 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.load8_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -408,7 +414,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_AR (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -426,7 +432,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -443,12 +449,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s align=1 +;; CHECK-NEXT: (i32.atomic.load8_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -466,7 +472,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -483,27 +489,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.shr_s -;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (i32.atomic.load16_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 16) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -538,21 +529,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s +;; CHECK-NEXT: (i32.load16_s align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -587,12 +569,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_AR (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -636,12 +627,18 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.load16_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load16_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -685,12 +682,18 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -708,7 +711,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -725,12 +728,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=1 +;; CHECK-NEXT: (i32.load16_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -748,7 +751,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -774,12 +777,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=2 +;; CHECK-NEXT: (i32.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_AR (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -797,7 +800,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -817,18 +820,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.load +;; CHECK-NEXT: (i32.atomic.load16_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -846,7 +849,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -866,18 +869,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (i32.atomic.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -895,7 +898,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -912,18 +915,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.shr_s -;; CHECK-NEXT: (i64.shl -;; CHECK-NEXT: (i64.atomic.load8_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 56) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: (i32.load align=1 +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -941,7 +938,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -958,12 +955,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_s +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -981,7 +987,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -998,12 +1004,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load8_u +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_AR (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1021,7 +1036,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1038,12 +1053,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_u +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1061,7 +1085,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1078,12 +1102,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1101,7 +1134,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1118,27 +1151,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.shr_s -;; CHECK-NEXT: (i64.shl -;; CHECK-NEXT: (i64.atomic.load16_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 48) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: (i64.load8_s +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1156,7 +1174,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1173,21 +1191,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load8_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) ;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 56) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1205,7 +1220,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1222,12 +1237,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u align=1 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1245,7 +1266,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1262,21 +1283,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load16_u +;; CHECK-NEXT: (i64.load8_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1294,7 +1306,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1311,21 +1323,52 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load8_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_SC (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) ;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u +;; CHECK-NEXT: (i64.atomic.load8_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1343,7 +1386,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1360,12 +1403,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=1 +;; CHECK-NEXT: (i64.load16_s align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1383,7 +1426,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1409,12 +1452,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=2 +;; CHECK-NEXT: (i64.load16_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1432,7 +1475,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1452,7 +1495,7 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) @@ -1460,16 +1503,16 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i64.shr_s ;; CHECK-NEXT: (i64.shl -;; CHECK-NEXT: (i64.atomic.load32_u +;; CHECK-NEXT: (i64.atomic.load16_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: (i64.const 48) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: (i64.const 48) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1487,7 +1530,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1507,18 +1550,24 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1536,7 +1585,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1553,12 +1602,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=1 +;; CHECK-NEXT: (i64.load16_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1576,7 +1625,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1602,12 +1651,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=2 +;; CHECK-NEXT: (i64.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1625,7 +1674,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1645,18 +1694,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load32_u +;; CHECK-NEXT: (i64.atomic.load16_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1674,7 +1723,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1694,18 +1743,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u +;; CHECK-NEXT: (i64.atomic.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1723,7 +1772,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1740,12 +1789,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=1 +;; CHECK-NEXT: (i64.load32_s align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1763,7 +1812,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1789,12 +1838,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=2 +;; CHECK-NEXT: (i64.load32_s align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1812,7 +1861,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1838,12 +1887,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=4 +;; CHECK-NEXT: (i64.load32_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1861,7 +1910,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1881,18 +1930,24 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load32_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1910,7 +1965,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -1930,18 +1985,24 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load32_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -1976,12 +2037,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load align=1 +;; CHECK-NEXT: (i64.load32_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2025,12 +2086,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load align=2 +;; CHECK-NEXT: (i64.load32_u align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2074,12 +2135,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load +;; CHECK-NEXT: (i64.load32_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2097,7 +2158,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2114,12 +2175,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load32_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2137,7 +2207,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2157,18 +2227,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=2 +;; CHECK-NEXT: (i64.atomic.load32_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2203,21 +2273,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=4 +;; CHECK-NEXT: (i64.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2255,18 +2316,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load +;; CHECK-NEXT: (i64.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2284,7 +2345,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2301,12 +2362,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load align=4 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2324,7 +2394,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2344,18 +2414,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=2 +;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2373,7 +2443,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2393,18 +2463,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=4 +;; CHECK-NEXT: (i64.atomic.load acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2422,7 +2492,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2448,12 +2518,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=8 +;; CHECK-NEXT: (i64.atomic.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i32) (param $1 i32) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -2471,7 +2541,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -2488,23 +2558,14 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 15) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load +;; CHECK-NEXT: (f32.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_1_A (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2513,21 +2574,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 1024) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2537,15 +2598,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store8 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2554,21 +2623,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 1024) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2578,15 +2647,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store8 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2595,21 +2672,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 1024) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2619,15 +2696,14 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 align=1 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (f64.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_A (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2636,21 +2712,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 1024) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2662,22 +2738,21 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store16 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (f64.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2686,21 +2761,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 1024) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2712,22 +2787,21 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (f64.load align=4 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2736,21 +2810,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 1024) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2760,15 +2834,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store align=1 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2777,21 +2859,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 1024) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2801,24 +2883,14 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store align=2 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_A (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2827,21 +2899,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 1024) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2853,22 +2925,21 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.store -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2877,21 +2948,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 1024) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2903,22 +2974,21 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load align=4 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_1_A (param $0 i32) (param $1 i32) (param $2 i64) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2927,21 +2997,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 1024) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2951,15 +3021,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store8 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=8 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i32) (param $1 i32) (param $2 i64) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -2968,21 +3046,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 1024) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -2992,13 +3070,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store8 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_1_A (param $0 i32) (param $1 i32) (param $2 i32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3016,7 +3102,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3033,13 +3119,95 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 align=1 +;; CHECK-NEXT: (i32.atomic.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_2_A (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.store16 align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_A (param $0 i32) (param $1 i32) (param $2 i32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3083,13 +3251,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store16 +;; CHECK-NEXT: (i32.atomic.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3133,13 +3301,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 +;; CHECK-NEXT: (i32.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i32) (param $1 i32) (param $2 i32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3174,13 +3342,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 align=1 +;; CHECK-NEXT: (i32.store align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i32) (param $1 i32) (param $2 i32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3224,13 +3392,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 align=2 +;; CHECK-NEXT: (i32.store align=2 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_A (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_A (param $0 i32) (param $1 i32) (param $2 i32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3274,13 +3442,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store32 +;; CHECK-NEXT: (i32.atomic.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i32) (param $1 i32) (param $2 i32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3324,13 +3492,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 +;; CHECK-NEXT: (i32.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_1_A (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3348,7 +3516,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3365,13 +3533,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=1 +;; CHECK-NEXT: (i64.atomic.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3389,7 +3557,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3406,22 +3574,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=2 +;; CHECK-NEXT: (i64.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3439,7 +3598,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3456,22 +3615,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 3) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=4 +;; CHECK-NEXT: (i64.store16 align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_A (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_A (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3489,7 +3639,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3509,19 +3659,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.store +;; CHECK-NEXT: (i64.atomic.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3539,7 +3689,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3559,19 +3709,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store +;; CHECK-NEXT: (i64.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i32) (param $1 i32) (param $2 f32) +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3606,13 +3756,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.store align=1 +;; CHECK-NEXT: (i64.store32 align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3656,13 +3806,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.store align=2 +;; CHECK-NEXT: (i64.store32 align=2 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_A (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3706,13 +3856,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.store +;; CHECK-NEXT: (i64.atomic.store32 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3730,7 +3880,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3747,13 +3897,22 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.store align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3788,22 +3947,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.store align=2 +;; CHECK-NEXT: (i64.store align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3841,19 +3991,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.store align=4 +;; CHECK-NEXT: (i64.store align=2 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3891,19 +4041,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.store +;; CHECK-NEXT: (i64.store align=4 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_A (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3921,7 +4071,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3938,13 +4088,22 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -3962,7 +4121,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -3982,19 +4141,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=2 +;; CHECK-NEXT: (i64.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i32) (param $1 i32) (param $2 f32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -4012,7 +4171,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4029,22 +4188,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 3) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=4 +;; CHECK-NEXT: (f32.store align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -4062,7 +4212,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4082,19 +4232,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=8 +;; CHECK-NEXT: (f32.store align=2 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -4112,7 +4262,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -4132,67 +4282,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store +;; CHECK-NEXT: (f32.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -(module - (memory 100 100) - ;; CHECK: (type $0 (func (param i32 i32) (result i64))) - - ;; CHECK: (type $1 (func (param i32 i32 i64))) - - ;; CHECK: (type $2 (func (param i32 i32) (result i32))) - - ;; CHECK: (type $3 (func (param i32 i32 i32))) - - ;; CHECK: (type $4 (func (param i32 i32) (result v128))) - - ;; CHECK: (type $5 (func (param i32 i32 v128))) - - ;; CHECK: (type $6 (func (param i32 i32) (result f64))) - - ;; CHECK: (type $7 (func (param i32 i32 f64))) - - ;; CHECK: (type $8 (func)) - - ;; CHECK: (type $9 (func (param i32 i32) (result f32))) - - ;; CHECK: (type $10 (func (param i32 i32 f32))) - - ;; CHECK: (type $11 (func (result i32))) - - ;; CHECK: (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i32))) - - ;; CHECK: (import "env" "segfault" (func $segfault)) - - ;; CHECK: (import "env" "alignfault" (func $alignfault)) - - ;; CHECK: (memory $0 100 100) - ;; CHECK: (func $loads - ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_4 - ;; CHECK-NEXT: (i32.const 1) - ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - (func $loads - (drop (i32.load (i32.const 1))) - ) -) -;; pre-existing -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4201,21 +4305,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (i32.const 1024) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4225,14 +4329,15 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_s +;; CHECK-NEXT: (f64.store align=1 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4241,21 +4346,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (i32.const 1024) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4265,14 +4370,24 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_u +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=2 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4281,21 +4396,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (i32.const 1024) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4305,14 +4420,24 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.store align=4 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4321,21 +4446,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (i32.const 1024) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4347,21 +4472,22 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s +;; CHECK-NEXT: (f64.store +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4370,21 +4496,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (i32.const 1024) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4394,14 +4520,15 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u align=1 +;; CHECK-NEXT: (v128.store align=1 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4410,21 +4537,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (i32.const 1024) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4436,21 +4563,22 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u +;; CHECK-NEXT: (v128.store align=2 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4459,21 +4587,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (i32.const 1024) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4483,14 +4611,24 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=4 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4499,21 +4637,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (i32.const 1024) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4525,21 +4663,22 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=2 +;; CHECK-NEXT: (v128.store align=8 +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4548,21 +4687,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (i32.const 1024) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -4574,21 +4713,68 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 15) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (v128.store +;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) +(module + (memory 100 100) + ;; CHECK: (type $0 (func (param i32 i32) (result i64))) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) -;; CHECK-NEXT: (local $2 i32) -;; CHECK-NEXT: (local.set $2 + ;; CHECK: (type $1 (func (param i32 i32 i64))) + + ;; CHECK: (type $2 (func (param i32 i32) (result i32))) + + ;; CHECK: (type $3 (func (param i32 i32 i32))) + + ;; CHECK: (type $4 (func (param i32 i32) (result v128))) + + ;; CHECK: (type $5 (func (param i32 i32 v128))) + + ;; CHECK: (type $6 (func (param i32 i32) (result f64))) + + ;; CHECK: (type $7 (func (param i32 i32 f64))) + + ;; CHECK: (type $8 (func)) + + ;; CHECK: (type $9 (func (param i32 i32) (result f32))) + + ;; CHECK: (type $10 (func (param i32 i32 f32))) + + ;; CHECK: (type $11 (func (result i32))) + + ;; CHECK: (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i32))) + + ;; CHECK: (import "env" "segfault" (func $segfault)) + + ;; CHECK: (import "env" "alignfault" (func $alignfault)) + + ;; CHECK: (memory $0 100 100) + + ;; CHECK: (func $loads + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_4 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $loads + (drop (i32.load (i32.const 1))) + ) +) +;; pre-existing +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -4621,12 +4807,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_s +;; CHECK-NEXT: (i32.load8_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4661,12 +4847,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_u +;; CHECK-NEXT: (i32.load8_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4701,12 +4887,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s align=1 +;; CHECK-NEXT: (i32.load16_s align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4750,12 +4936,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s +;; CHECK-NEXT: (i32.load16_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4790,12 +4976,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u align=1 +;; CHECK-NEXT: (i32.load16_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4839,12 +5025,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u +;; CHECK-NEXT: (i32.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4879,12 +5065,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=1 +;; CHECK-NEXT: (i32.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4928,12 +5114,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=2 +;; CHECK-NEXT: (i32.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -4977,12 +5163,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s +;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5000,7 +5186,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5017,12 +5203,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=1 +;; CHECK-NEXT: (i64.load8_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5040,7 +5226,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5057,21 +5243,52 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) ;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=2 +;; CHECK-NEXT: (i64.load16_s align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5089,7 +5306,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5109,18 +5326,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u +;; CHECK-NEXT: (i64.load16_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5138,7 +5355,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5155,12 +5372,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=1 +;; CHECK-NEXT: (i64.load16_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5178,7 +5395,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5204,12 +5421,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=2 +;; CHECK-NEXT: (i64.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5227,7 +5444,47 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5247,18 +5504,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load align=4 +;; CHECK-NEXT: (i64.load32_s align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5276,7 +5533,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5296,18 +5553,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (i64.load32_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5342,12 +5599,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load align=1 +;; CHECK-NEXT: (i64.load32_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5391,12 +5648,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load align=2 +;; CHECK-NEXT: (i64.load32_u align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5440,12 +5697,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.load +;; CHECK-NEXT: (i64.load32_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5480,12 +5737,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=1 +;; CHECK-NEXT: (i64.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5529,12 +5786,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=2 +;; CHECK-NEXT: (i64.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5578,12 +5835,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load align=4 +;; CHECK-NEXT: (i64.load align=4 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5627,12 +5884,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.load +;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5650,7 +5907,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5667,12 +5924,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=1 +;; CHECK-NEXT: (f32.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5690,7 +5947,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5716,12 +5973,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=2 +;; CHECK-NEXT: (f32.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5739,7 +5996,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5765,12 +6022,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=4 +;; CHECK-NEXT: (f32.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5788,7 +6045,47 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5808,18 +6105,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load align=8 +;; CHECK-NEXT: (f64.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i32) (param $1 i32) (result v128) +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -5837,7 +6134,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -5857,20 +6154,20 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.load +;; CHECK-NEXT: (f64.load align=4 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -5879,21 +6176,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 1024) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -5903,15 +6200,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store8 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f64.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -5920,21 +6225,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 1024) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -5944,15 +6249,14 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 align=1 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -5961,21 +6265,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 1024) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -5987,22 +6291,21 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store16 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -6011,21 +6314,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 1024) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6035,15 +6338,23 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store align=1 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.load align=4 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -6052,21 +6363,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 1024) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6078,22 +6389,21 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store align=2 -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load align=8 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i32) (param $1 i32) (param $2 i32) -;; CHECK-NEXT: (local $3 i32) -;; CHECK-NEXT: (local.set $3 +;; CHECK: (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i32) (param $1 i32) (result v128) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: (local.get $1) @@ -6102,21 +6412,21 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 1024) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -6128,20 +6438,19 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 15) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.store -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (v128.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6176,13 +6485,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store8 +;; CHECK-NEXT: (i32.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6217,13 +6526,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 align=1 +;; CHECK-NEXT: (i32.store16 align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6267,13 +6576,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store16 +;; CHECK-NEXT: (i32.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i32) (param $1 i32) (param $2 i32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6308,13 +6617,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 align=1 +;; CHECK-NEXT: (i32.store align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i32) (param $1 i32) (param $2 i32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6358,13 +6667,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 align=2 +;; CHECK-NEXT: (i32.store align=2 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i32) (param $1 i32) (param $2 i32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6408,13 +6717,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store32 +;; CHECK-NEXT: (i32.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6432,7 +6741,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6449,13 +6758,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=1 +;; CHECK-NEXT: (i64.store8 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6473,7 +6782,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6490,22 +6799,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=2 +;; CHECK-NEXT: (i64.store16 align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6523,7 +6823,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6543,19 +6843,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store align=4 +;; CHECK-NEXT: (i64.store16 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6573,7 +6873,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6590,22 +6890,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 7) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.store +;; CHECK-NEXT: (i64.store32 align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i32) (param $1 i32) (param $2 f32) +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6640,13 +6931,22 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.store align=1 -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store32 align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) +;; CHECK: (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6684,19 +6984,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.store align=2 +;; CHECK-NEXT: (i64.store32 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6714,7 +7014,48 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i32) (param $1 i32) (param $2 i64) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6734,19 +7075,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f32.store +;; CHECK-NEXT: (i64.store align=2 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6781,13 +7122,22 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.store align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.store align=4 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK: (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i32) (param $1 i32) (param $2 i64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6825,19 +7175,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 7) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.store align=2 +;; CHECK-NEXT: (i64.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i32) (param $1 i32) (param $2 f32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6855,7 +7205,48 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (f32.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6875,19 +7266,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.store align=4 +;; CHECK-NEXT: (f32.store align=2 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) +;; CHECK: (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6905,7 +7296,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6925,19 +7316,19 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (f64.store +;; CHECK-NEXT: (f32.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6955,7 +7346,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -6972,13 +7363,13 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=1 +;; CHECK-NEXT: (f64.store align=1 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -6996,7 +7387,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7022,13 +7413,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=2 +;; CHECK-NEXT: (f64.store align=2 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -7046,7 +7437,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7072,13 +7463,13 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=4 +;; CHECK-NEXT: (f64.store align=4 ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK: (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -7096,7 +7487,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.const 8) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) @@ -7122,13 +7513,54 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store align=8 +;; CHECK-NEXT: (f64.store ;; CHECK-NEXT: (local.get $3) ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=1 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) ;; CHECK-NEXT: (local $3 i32) ;; CHECK-NEXT: (local.set $3 ;; CHECK-NEXT: (i32.add @@ -7139,21 +7571,667 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=2 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=4 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store align=8 +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) +;; CHECK-NEXT: (local $3 i32) +;; CHECK-NEXT: (local.set $3 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (v128.store +;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +(module + ;; CHECK: (type $0 (func (param i32 i32) (result i64))) + + ;; CHECK: (type $1 (func (param i32 i32) (result i32))) + + ;; CHECK: (type $2 (func (param i32 i32 i64))) + + ;; CHECK: (type $3 (func (param i32 i32 i32))) + + ;; CHECK: (type $4 (func (param i32 i32) (result v128))) + + ;; CHECK: (type $5 (func (param i32 i32 v128))) + + ;; CHECK: (type $6 (func (param i32 i32) (result f64))) + + ;; CHECK: (type $7 (func (param i32 i32 f64))) + + ;; CHECK: (type $FUNCSIG$v (func)) + (type $FUNCSIG$v (func)) + ;; CHECK: (type $9 (func (param i32 i32) (result f32))) + + ;; CHECK: (type $10 (func (param i32 i32 f32))) + + ;; CHECK: (type $11 (func (result i32))) + + ;; CHECK: (import "env" "emscripten_get_sbrk_ptr" (func $foo (result i32))) + (import "env" "emscripten_get_sbrk_ptr" (func $foo (result i32))) + ;; CHECK: (import "env" "segfault" (func $segfault)) + (import "env" "segfault" (func $segfault)) + ;; CHECK: (import "env" "alignfault" (func $alignfault)) + (import "env" "alignfault" (func $alignfault)) + ;; CHECK: (memory $0 100 100 shared) + (memory $0 100 100 shared) + ;; CHECK: (func $actions + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_4 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_4 + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: (i32.const 100) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $actions + (drop (i32.load (i32.const 1))) + (i32.store (i32.const 1) (i32.const 100)) + ) +) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load8_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_AR (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load8_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_SC (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_AR (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load8_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_SC (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_s align=1 +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_s +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_AR (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load16_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_SC (param $0 i32) (param $1 i32) (result i32) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (i32.const 1024) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.or ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load -;; CHECK-NEXT: (call $emscripten_get_sbrk_ptr) +;; CHECK-NEXT: (call $foo) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.lt_u -;; CHECK-NEXT: (local.get $3) +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: (local.get $0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -7165,70 +8243,25 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (i32.const 15) +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (v128.store -;; CHECK-NEXT: (local.get $3) -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.shr_s +;; CHECK-NEXT: (i32.shl +;; CHECK-NEXT: (i32.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.const 16) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -(module - ;; CHECK: (type $0 (func (param i32 i32) (result i64))) - - ;; CHECK: (type $1 (func (param i32 i32) (result i32))) - - ;; CHECK: (type $2 (func (param i32 i32 i64))) - ;; CHECK: (type $3 (func (param i32 i32 i32))) - - ;; CHECK: (type $4 (func (param i32 i32) (result v128))) - - ;; CHECK: (type $5 (func (param i32 i32 v128))) - - ;; CHECK: (type $6 (func (param i32 i32) (result f64))) - - ;; CHECK: (type $7 (func (param i32 i32 f64))) - - ;; CHECK: (type $FUNCSIG$v (func)) - (type $FUNCSIG$v (func)) - ;; CHECK: (type $9 (func (param i32 i32) (result f32))) - - ;; CHECK: (type $10 (func (param i32 i32 f32))) - - ;; CHECK: (type $11 (func (result i32))) - - ;; CHECK: (import "env" "emscripten_get_sbrk_ptr" (func $foo (result i32))) - (import "env" "emscripten_get_sbrk_ptr" (func $foo (result i32))) - ;; CHECK: (import "env" "segfault" (func $segfault)) - (import "env" "segfault" (func $segfault)) - ;; CHECK: (import "env" "alignfault" (func $alignfault)) - (import "env" "alignfault" (func $alignfault)) - ;; CHECK: (memory $0 100 100 shared) - (memory $0 100 100 shared) - ;; CHECK: (func $actions - ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (call $SAFE_HEAP_LOAD_i32_4_4 - ;; CHECK-NEXT: (i32.const 1) - ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: (call $SAFE_HEAP_STORE_i32_4_4 - ;; CHECK-NEXT: (i32.const 1) - ;; CHECK-NEXT: (i32.const 0) - ;; CHECK-NEXT: (i32.const 100) - ;; CHECK-NEXT: ) - ;; CHECK-NEXT: ) - (func $actions - (drop (i32.load (i32.const 1))) - (i32.store (i32.const 1) (i32.const 100)) - ) -) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7246,7 +8279,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -7263,18 +8296,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.shr_s -;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (i32.atomic.load8_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 24) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 24) +;; CHECK-NEXT: (i32.load16_u align=1 +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7292,7 +8319,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -7309,12 +8336,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_s +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_AR (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7332,7 +8368,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -7349,12 +8385,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.load8_u +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load16_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7372,7 +8417,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -7389,12 +8434,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load8_u +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7412,7 +8466,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -7429,12 +8483,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s align=1 +;; CHECK-NEXT: (i32.load align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7452,7 +8506,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -7478,18 +8532,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.shr_s -;; CHECK-NEXT: (i32.shl -;; CHECK-NEXT: (i32.atomic.load16_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 16) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.const 16) +;; CHECK-NEXT: (i32.load align=2 +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7507,7 +8555,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -7527,18 +8575,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_s +;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_AR (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7556,7 +8604,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -7573,12 +8621,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.atomic.load acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_SC (param $0 i32) (param $1 i32) (result i32) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7596,7 +8653,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -7616,18 +8673,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.load16_u +;; CHECK-NEXT: (i32.atomic.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7645,7 +8702,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -7662,21 +8719,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load16_u +;; CHECK-NEXT: (i64.load8_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7694,7 +8742,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -7711,12 +8759,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=1 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load8_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7734,7 +8788,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -7751,21 +8805,18 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 56) ;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load align=2 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.const 56) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_A (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7783,7 +8834,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -7800,21 +8851,52 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load8_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_AR (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) ;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.atomic.load +;; CHECK-NEXT: (i64.atomic.load8_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7832,7 +8914,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 4) +;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -7849,21 +8931,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (i64.atomic.load8_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7881,7 +8954,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -7898,18 +8971,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.shr_s -;; CHECK-NEXT: (i64.shl -;; CHECK-NEXT: (i64.atomic.load8_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 56) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 56) +;; CHECK-NEXT: (i64.load16_s align=1 +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7927,7 +8994,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -7944,12 +9011,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_s +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load16_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -7967,7 +9043,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -7984,12 +9060,27 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load8_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load16_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8007,7 +9098,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -8024,12 +9115,27 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load8_u -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load16_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 48) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8064,12 +9170,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s align=1 +;; CHECK-NEXT: (i64.load16_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8113,18 +9219,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.shr_s -;; CHECK-NEXT: (i64.shl -;; CHECK-NEXT: (i64.atomic.load16_u -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 48) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.const 48) +;; CHECK-NEXT: (i64.load16_u +;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8168,12 +9268,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_s +;; CHECK-NEXT: (i64.atomic.load16_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8208,12 +9308,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load16_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8231,7 +9340,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -8248,21 +9357,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load16_u +;; CHECK-NEXT: (i64.load32_s align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8280,7 +9380,7 @@ ;; CHECK-NEXT: (i32.gt_u ;; CHECK-NEXT: (i32.add ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 2) +;; CHECK-NEXT: (i32.const 4) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (i32.load ;; CHECK-NEXT: (call $foo) @@ -8306,12 +9406,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load16_u +;; CHECK-NEXT: (i64.load32_s align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8346,12 +9446,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 3) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_s ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8389,18 +9498,24 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s align=2 -;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i64.shr_s +;; CHECK-NEXT: (i64.shl +;; CHECK-NEXT: (i64.atomic.load32_u acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.const 32) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8455,7 +9570,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8490,21 +9605,12 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (if -;; CHECK-NEXT: (i32.and -;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 3) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (then -;; CHECK-NEXT: (call $alignfault) -;; CHECK-NEXT: ) -;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_s +;; CHECK-NEXT: (i64.load32_u align=1 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8539,12 +9645,21 @@ ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=1 +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.load32_u align=2 ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8582,18 +9697,18 @@ ;; CHECK-NEXT: (if ;; CHECK-NEXT: (i32.and ;; CHECK-NEXT: (local.get $2) -;; CHECK-NEXT: (i32.const 1) +;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (then ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u align=2 +;; CHECK-NEXT: (i64.load32_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8637,12 +9752,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load32_u +;; CHECK-NEXT: (i64.atomic.load32_u acqrel ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_4_U_SC (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8686,7 +9801,7 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load32_u +;; CHECK-NEXT: (i64.atomic.load32_u ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) @@ -8829,7 +9944,7 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_A (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8873,12 +9988,12 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.atomic.load +;; CHECK-NEXT: (i64.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_AR (param $0 i32) (param $1 i32) (result i64) ;; CHECK-NEXT: (local $2 i32) ;; CHECK-NEXT: (local.set $2 ;; CHECK-NEXT: (i32.add @@ -8922,7 +10037,56 @@ ;; CHECK-NEXT: (call $alignfault) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) -;; CHECK-NEXT: (i64.load +;; CHECK-NEXT: (i64.atomic.load acqrel +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) + +;; CHECK: (func $SAFE_HEAP_LOAD_i64_8_SC (param $0 i32) (param $1 i32) (result i64) +;; CHECK-NEXT: (local $2 i32) +;; CHECK-NEXT: (local.set $2 +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: (local.get $1) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 1024) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.or +;; CHECK-NEXT: (i32.gt_u +;; CHECK-NEXT: (i32.add +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 8) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.load +;; CHECK-NEXT: (call $foo) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i32.lt_u +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (local.get $0) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $segfault) +;; CHECK-NEXT: (unreachable) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (if +;; CHECK-NEXT: (i32.and +;; CHECK-NEXT: (local.get $2) +;; CHECK-NEXT: (i32.const 7) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (then +;; CHECK-NEXT: (call $alignfault) +;; CHECK-NEXT: ) +;; CHECK-NEXT: ) +;; CHECK-NEXT: (i64.atomic.load ;; CHECK-NEXT: (local.get $2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) diff --git a/test/passes/safe-heap_enable-threads_enable-simd.txt b/test/passes/safe-heap_enable-threads_enable-simd.txt deleted file mode 100644 index 30774a7bbd8..00000000000 --- a/test/passes/safe-heap_enable-threads_enable-simd.txt +++ /dev/null @@ -1,11943 +0,0 @@ -(module - (type $0 (func (param i32 i32) (result i64))) - (type $1 (func (param i32 i32) (result i32))) - (type $2 (func (param i32 i32 i64))) - (type $3 (func (param i32 i32 i32))) - (type $4 (func (param i32 i32) (result v128))) - (type $5 (func (param i32 i32 v128))) - (type $6 (func)) - (type $7 (func (param i32 i32) (result f64))) - (type $8 (func (param i32 i32 f64))) - (type $9 (func (param i32 i32) (result f32))) - (type $10 (func (param i32 i32 f32))) - (type $11 (func (result i32))) - (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i32))) - (import "env" "segfault" (func $segfault)) - (import "env" "alignfault" (func $alignfault)) - (memory $0 100 100 shared) - (func $loads - (drop - (call $SAFE_HEAP_LOAD_i32_4_4 - (i32.const 1) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i32_4_SC - (i32.const 1) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i32_4_4 - (i32.const 2) - (i32.const 31) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i32_4_2 - (i32.const 3) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i32_4_1 - (i32.const 4) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i32_1_1 - (i32.const 5) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i32_2_U_2 - (i32.const 6) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i64_1_1 - (i32.const 7) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i64_2_U_2 - (i32.const 8) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i64_4_4 - (i32.const 9) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i64_8_4 - (i32.const 10) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i64_8_8 - (i32.const 11) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_f32_4_4 - (i32.const 12) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_f64_8_8 - (i32.const 13) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_v128_16_16 - (i32.const 14) - (i32.const 0) - ) - ) - ) - (func $stores - (call $SAFE_HEAP_STORE_i32_4_4 - (i32.const 1) - (i32.const 0) - (i32.const 100) - ) - (call $SAFE_HEAP_STORE_i32_4_A - (i32.const 1) - (i32.const 0) - (i32.const 100) - ) - (call $SAFE_HEAP_STORE_i32_4_4 - (i32.const 2) - (i32.const 31) - (i32.const 200) - ) - (call $SAFE_HEAP_STORE_i32_4_2 - (i32.const 3) - (i32.const 0) - (i32.const 300) - ) - (call $SAFE_HEAP_STORE_i32_4_1 - (i32.const 4) - (i32.const 0) - (i32.const 400) - ) - (call $SAFE_HEAP_STORE_i32_1_1 - (i32.const 5) - (i32.const 0) - (i32.const 500) - ) - (call $SAFE_HEAP_STORE_i32_2_2 - (i32.const 6) - (i32.const 0) - (i32.const 600) - ) - (call $SAFE_HEAP_STORE_i64_1_1 - (i32.const 7) - (i32.const 0) - (i64.const 700) - ) - (call $SAFE_HEAP_STORE_i64_2_2 - (i32.const 8) - (i32.const 0) - (i64.const 800) - ) - (call $SAFE_HEAP_STORE_i64_4_4 - (i32.const 9) - (i32.const 0) - (i64.const 900) - ) - (call $SAFE_HEAP_STORE_i64_8_4 - (i32.const 10) - (i32.const 0) - (i64.const 1000) - ) - (call $SAFE_HEAP_STORE_i64_8_8 - (i32.const 11) - (i32.const 0) - (i64.const 1100) - ) - (call $SAFE_HEAP_STORE_f32_4_4 - (i32.const 12) - (i32.const 0) - (f32.const 1200) - ) - (call $SAFE_HEAP_STORE_f64_8_8 - (i32.const 13) - (i32.const 0) - (f64.const 1300) - ) - (call $SAFE_HEAP_STORE_v128_16_16 - (i32.const 14) - (i32.const 0) - (v128.const i32x4 0x00000001 0x00000002 0x00000003 0x00000004) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load8_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_AR (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load8_u acqrel - (local.get $2) - ) - (i32.const 24) - ) - (i32.const 24) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_SC (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load8_u - (local.get $2) - ) - (i32.const 24) - ) - (i32.const 24) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_U_AR (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.atomic.load8_u acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_U_SC (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.atomic.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load16_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_AR (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load16_u acqrel - (local.get $2) - ) - (i32.const 16) - ) - (i32.const 16) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_SC (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load16_u - (local.get $2) - ) - (i32.const 16) - ) - (i32.const 16) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load16_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_AR (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load16_u acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_SC (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_AR (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_SC (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load8_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_AR (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load8_u acqrel - (local.get $2) - ) - (i64.const 56) - ) - (i64.const 56) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_SC (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load8_u - (local.get $2) - ) - (i64.const 56) - ) - (i64.const 56) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_U_AR (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.atomic.load8_u acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_U_SC (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.atomic.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load16_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load16_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_AR (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load16_u acqrel - (local.get $2) - ) - (i64.const 48) - ) - (i64.const 48) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_SC (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load16_u - (local.get $2) - ) - (i64.const 48) - ) - (i64.const 48) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load16_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_AR (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load16_u acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_SC (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load32_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_AR (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load32_u acqrel - (local.get $2) - ) - (i64.const 32) - ) - (i64.const 32) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_SC (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load32_u - (local.get $2) - ) - (i64.const 32) - ) - (i64.const 32) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load32_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_u align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_AR (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load32_u acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_SC (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load32_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_AR (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_SC (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f32.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f32.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f32.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f64.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (f64.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (v128.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=8 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 15) - ) - (then - (call $alignfault) - ) - ) - (v128.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_1_A (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.atomic.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store16 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_A (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_A (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_1_A (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.atomic.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store16 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_A (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store32 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store32 align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_A (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.store32 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store32 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_A (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i32) (param $1 i32) (param $2 f32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f32.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f32.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f32.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f64.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (f64.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (v128.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 15) - ) - (then - (call $alignfault) - ) - ) - (v128.store - (local.get $3) - (local.get $2) - ) - ) -) -(module - (type $0 (func (param i32 i32) (result i64))) - (type $1 (func (param i32 i32 i64))) - (type $2 (func (param i32 i32) (result i32))) - (type $3 (func (param i32 i32 i32))) - (type $4 (func (param i32 i32) (result v128))) - (type $5 (func (param i32 i32 v128))) - (type $6 (func (param i32 i32) (result f64))) - (type $7 (func (param i32 i32 f64))) - (type $8 (func)) - (type $9 (func (param i32 i32) (result f32))) - (type $10 (func (param i32 i32 f32))) - (type $11 (func (result i32))) - (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i32))) - (import "env" "segfault" (func $segfault)) - (import "env" "alignfault" (func $alignfault)) - (memory $0 100 100) - (func $loads - (drop - (call $SAFE_HEAP_LOAD_i32_4_4 - (i32.const 1) - (i32.const 0) - ) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load8_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load16_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load16_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load8_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load16_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load16_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load16_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load32_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load32_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_u align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f32.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f32.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f32.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f64.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (f64.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (v128.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=8 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 15) - ) - (then - (call $alignfault) - ) - ) - (v128.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store16 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store16 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store32 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store32 align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store32 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i32) (param $1 i32) (param $2 f32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f32.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f32.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f32.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f64.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (f64.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (v128.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 15) - ) - (then - (call $alignfault) - ) - ) - (v128.store - (local.get $3) - (local.get $2) - ) - ) -) -(module - (type $0 (func (param i32 i32) (result i64))) - (type $1 (func (param i32 i32) (result i32))) - (type $2 (func (param i32 i32 i64))) - (type $3 (func (param i32 i32 i32))) - (type $4 (func (param i32 i32) (result v128))) - (type $5 (func (param i32 i32 v128))) - (type $6 (func (param i32 i32) (result f64))) - (type $7 (func (param i32 i32 f64))) - (type $FUNCSIG$v (func)) - (type $9 (func (param i32 i32) (result f32))) - (type $10 (func (param i32 i32 f32))) - (type $11 (func (result i32))) - (import "env" "segfault" (func $segfault)) - (import "env" "alignfault" (func $alignfault)) - (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i32))) - (memory $0 100 100 shared) - (func $actions - (drop - (call $SAFE_HEAP_LOAD_i32_4_4 - (i32.const 1) - (i32.const 0) - ) - ) - (call $SAFE_HEAP_STORE_i32_4_4 - (i32.const 1) - (i32.const 0) - (i32.const 100) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load8_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_AR (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load8_u acqrel - (local.get $2) - ) - (i32.const 24) - ) - (i32.const 24) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_SC (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load8_u - (local.get $2) - ) - (i32.const 24) - ) - (i32.const 24) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_U_AR (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.atomic.load8_u acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_U_SC (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.atomic.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load16_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_AR (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load16_u acqrel - (local.get $2) - ) - (i32.const 16) - ) - (i32.const 16) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_SC (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load16_u - (local.get $2) - ) - (i32.const 16) - ) - (i32.const 16) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load16_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_AR (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load16_u acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_SC (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_AR (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_SC (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load8_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_AR (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load8_u acqrel - (local.get $2) - ) - (i64.const 56) - ) - (i64.const 56) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_SC (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load8_u - (local.get $2) - ) - (i64.const 56) - ) - (i64.const 56) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_U_AR (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.atomic.load8_u acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_U_SC (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.atomic.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load16_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load16_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_AR (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load16_u acqrel - (local.get $2) - ) - (i64.const 48) - ) - (i64.const 48) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_SC (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load16_u - (local.get $2) - ) - (i64.const 48) - ) - (i64.const 48) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load16_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_AR (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load16_u acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_SC (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load32_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_AR (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load32_u acqrel - (local.get $2) - ) - (i64.const 32) - ) - (i64.const 32) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_SC (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load32_u - (local.get $2) - ) - (i64.const 32) - ) - (i64.const 32) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load32_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_u align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_AR (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load32_u acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_SC (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load32_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_AR (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_SC (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f32.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f32.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f32.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f64.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (f64.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (v128.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=8 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $2) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 15) - ) - (then - (call $alignfault) - ) - ) - (v128.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_1_A (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.atomic.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store16 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_A (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_A (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_1_A (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.atomic.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store16 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_A (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store32 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store32 align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_A (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.store32 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store32 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_A (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i32) (param $1 i32) (param $2 f32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f32.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f32.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f32.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f64.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (f64.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (v128.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.eq - (local.get $3) - (i32.const 0) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 15) - ) - (then - (call $alignfault) - ) - ) - (v128.store - (local.get $3) - (local.get $2) - ) - ) -) diff --git a/test/passes/safe-heap_enable-threads_enable-simd64.txt b/test/passes/safe-heap_enable-threads_enable-simd64.txt deleted file mode 100644 index 7efa45937ee..00000000000 --- a/test/passes/safe-heap_enable-threads_enable-simd64.txt +++ /dev/null @@ -1,12267 +0,0 @@ -(module - (type $0 (func (param i64 i64) (result i64))) - (type $1 (func (param i64 i64) (result i32))) - (type $2 (func (param i64 i64 i64))) - (type $3 (func (param i64 i64 i32))) - (type $4 (func (param i64 i64) (result v128))) - (type $5 (func (param i64 i64 v128))) - (type $6 (func)) - (type $7 (func (param i64 i64) (result f64))) - (type $8 (func (param i64 i64 f64))) - (type $9 (func (param i64 i64) (result f32))) - (type $10 (func (param i64 i64 f32))) - (type $11 (func (result i64))) - (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i64))) - (import "env" "segfault" (func $segfault)) - (import "env" "alignfault" (func $alignfault)) - (memory $0 i64 100 100 shared) - (func $loads - (drop - (call $SAFE_HEAP_LOAD_i32_4_4 - (i64.const 1) - (i64.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i32_4_SC - (i64.const 1) - (i64.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i32_4_4 - (i64.const 2) - (i64.const 31) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i32_4_2 - (i64.const 3) - (i64.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i32_4_1 - (i64.const 4) - (i64.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i32_1_1 - (i64.const 5) - (i64.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i32_2_U_2 - (i64.const 6) - (i64.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i64_1_1 - (i64.const 7) - (i64.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i64_2_U_2 - (i64.const 8) - (i64.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i64_4_4 - (i64.const 9) - (i64.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i64_8_4 - (i64.const 10) - (i64.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i64_8_8 - (i64.const 11) - (i64.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_f32_4_4 - (i64.const 12) - (i64.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_f64_8_8 - (i64.const 13) - (i64.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_v128_16_16 - (i64.const 14) - (i64.const 0) - ) - ) - ) - (func $stores - (call $SAFE_HEAP_STORE_i32_4_4 - (i64.const 1) - (i64.const 0) - (i32.const 100) - ) - (call $SAFE_HEAP_STORE_i32_4_A - (i64.const 1) - (i64.const 0) - (i32.const 100) - ) - (call $SAFE_HEAP_STORE_i32_4_4 - (i64.const 2) - (i64.const 31) - (i32.const 200) - ) - (call $SAFE_HEAP_STORE_i32_4_2 - (i64.const 3) - (i64.const 0) - (i32.const 300) - ) - (call $SAFE_HEAP_STORE_i32_4_1 - (i64.const 4) - (i64.const 0) - (i32.const 400) - ) - (call $SAFE_HEAP_STORE_i32_1_1 - (i64.const 5) - (i64.const 0) - (i32.const 500) - ) - (call $SAFE_HEAP_STORE_i32_2_2 - (i64.const 6) - (i64.const 0) - (i32.const 600) - ) - (call $SAFE_HEAP_STORE_i64_1_1 - (i64.const 7) - (i64.const 0) - (i64.const 700) - ) - (call $SAFE_HEAP_STORE_i64_2_2 - (i64.const 8) - (i64.const 0) - (i64.const 800) - ) - (call $SAFE_HEAP_STORE_i64_4_4 - (i64.const 9) - (i64.const 0) - (i64.const 900) - ) - (call $SAFE_HEAP_STORE_i64_8_4 - (i64.const 10) - (i64.const 0) - (i64.const 1000) - ) - (call $SAFE_HEAP_STORE_i64_8_8 - (i64.const 11) - (i64.const 0) - (i64.const 1100) - ) - (call $SAFE_HEAP_STORE_f32_4_4 - (i64.const 12) - (i64.const 0) - (f32.const 1200) - ) - (call $SAFE_HEAP_STORE_f64_8_8 - (i64.const 13) - (i64.const 0) - (f64.const 1300) - ) - (call $SAFE_HEAP_STORE_v128_16_16 - (i64.const 14) - (i64.const 0) - (v128.const i32x4 0x00000001 0x00000002 0x00000003 0x00000004) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load8_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_AR (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load8_u acqrel - (local.get $2) - ) - (i32.const 24) - ) - (i32.const 24) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_SC (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load8_u - (local.get $2) - ) - (i32.const 24) - ) - (i32.const 24) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_U_AR (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.atomic.load8_u acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_U_SC (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.atomic.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load16_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_AR (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load16_u acqrel - (local.get $2) - ) - (i32.const 16) - ) - (i32.const 16) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_SC (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load16_u - (local.get $2) - ) - (i32.const 16) - ) - (i32.const 16) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load16_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_AR (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load16_u acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_SC (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_AR (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_SC (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load8_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_AR (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load8_u acqrel - (local.get $2) - ) - (i64.const 56) - ) - (i64.const 56) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_SC (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load8_u - (local.get $2) - ) - (i64.const 56) - ) - (i64.const 56) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_U_AR (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.atomic.load8_u acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_U_SC (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.atomic.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load16_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load16_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_AR (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load16_u acqrel - (local.get $2) - ) - (i64.const 48) - ) - (i64.const 48) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_SC (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load16_u - (local.get $2) - ) - (i64.const 48) - ) - (i64.const 48) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load16_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_AR (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load16_u acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_SC (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load32_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_AR (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load32_u acqrel - (local.get $2) - ) - (i64.const 32) - ) - (i64.const 32) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_SC (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load32_u - (local.get $2) - ) - (i64.const 32) - ) - (i64.const 32) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load32_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_u align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_AR (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load32_u acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_SC (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load32_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_AR (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_SC (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i64) (param $1 i64) (result f32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f32.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i64) (param $1 i64) (result f32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f32.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i64) (param $1 i64) (result f32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f32.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i64) (param $1 i64) (result f64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f64.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i64) (param $1 i64) (result f64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i64) (param $1 i64) (result f64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i64) (param $1 i64) (result f64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (f64.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i64) (param $1 i64) (result v128) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (v128.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i64) (param $1 i64) (result v128) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i64) (param $1 i64) (result v128) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i64) (param $1 i64) (result v128) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=8 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i64) (param $1 i64) (result v128) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 15) - ) - (then - (call $alignfault) - ) - ) - (v128.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_1_A (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.atomic.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store16 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_A (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_A (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_1_A (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.atomic.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store16 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_A (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store32 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store32 align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_A (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.store32 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store32 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_A (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i64) (param $1 i64) (param $2 f32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f32.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i64) (param $1 i64) (param $2 f32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f32.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i64) (param $1 i64) (param $2 f32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f32.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i64) (param $1 i64) (param $2 f64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f64.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i64) (param $1 i64) (param $2 f64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i64) (param $1 i64) (param $2 f64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i64) (param $1 i64) (param $2 f64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (f64.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i64) (param $1 i64) (param $2 v128) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (v128.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i64) (param $1 i64) (param $2 v128) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i64) (param $1 i64) (param $2 v128) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i64) (param $1 i64) (param $2 v128) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i64) (param $1 i64) (param $2 v128) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 15) - ) - (then - (call $alignfault) - ) - ) - (v128.store - (local.get $3) - (local.get $2) - ) - ) -) -(module - (type $0 (func (param i64 i64) (result i64))) - (type $1 (func (param i64 i64 i64))) - (type $2 (func (param i64 i64) (result i32))) - (type $3 (func (param i64 i64 i32))) - (type $4 (func (param i64 i64) (result v128))) - (type $5 (func (param i64 i64 v128))) - (type $6 (func (param i64 i64) (result f64))) - (type $7 (func (param i64 i64 f64))) - (type $8 (func)) - (type $9 (func (param i64 i64) (result f32))) - (type $10 (func (param i64 i64 f32))) - (type $11 (func (result i64))) - (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i64))) - (import "env" "segfault" (func $segfault)) - (import "env" "alignfault" (func $alignfault)) - (memory $0 i64 100 100) - (func $loads - (drop - (call $SAFE_HEAP_LOAD_i32_4_4 - (i64.const 1) - (i64.const 0) - ) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load8_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load16_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load16_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load8_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load16_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load16_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load16_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load32_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load32_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_u align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i64) (param $1 i64) (result f32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f32.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i64) (param $1 i64) (result f32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f32.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i64) (param $1 i64) (result f32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f32.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i64) (param $1 i64) (result f64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f64.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i64) (param $1 i64) (result f64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i64) (param $1 i64) (result f64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i64) (param $1 i64) (result f64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (f64.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i64) (param $1 i64) (result v128) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (v128.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i64) (param $1 i64) (result v128) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i64) (param $1 i64) (result v128) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i64) (param $1 i64) (result v128) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=8 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i64) (param $1 i64) (result v128) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 15) - ) - (then - (call $alignfault) - ) - ) - (v128.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store16 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 1) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store16 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 2) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store32 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store32 align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store32 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i64) (param $1 i64) (param $2 f32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f32.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i64) (param $1 i64) (param $2 f32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f32.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i64) (param $1 i64) (param $2 f32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f32.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i64) (param $1 i64) (param $2 f64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f64.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i64) (param $1 i64) (param $2 f64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i64) (param $1 i64) (param $2 f64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i64) (param $1 i64) (param $2 f64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (f64.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i64) (param $1 i64) (param $2 v128) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (v128.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i64) (param $1 i64) (param $2 v128) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i64) (param $1 i64) (param $2 v128) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i64) (param $1 i64) (param $2 v128) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i64) (param $1 i64) (param $2 v128) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 16) - ) - (i64.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 15) - ) - (then - (call $alignfault) - ) - ) - (v128.store - (local.get $3) - (local.get $2) - ) - ) -) -(module - (type $0 (func (param i64 i64) (result i64))) - (type $1 (func (param i64 i64) (result i32))) - (type $2 (func (param i64 i64 i64))) - (type $3 (func (param i64 i64 i32))) - (type $4 (func (param i64 i64) (result v128))) - (type $5 (func (param i64 i64 v128))) - (type $6 (func (param i64 i64) (result f64))) - (type $7 (func (param i64 i64 f64))) - (type $FUNCSIG$v (func)) - (type $9 (func (param i64 i64) (result f32))) - (type $10 (func (param i64 i64 f32))) - (type $11 (func (result i64))) - (import "env" "emscripten_get_sbrk_ptr" (func $foo (result i64))) - (import "env" "segfault" (func $segfault)) - (import "env" "alignfault" (func $alignfault)) - (memory $0 i64 100 100 shared) - (func $actions - (drop - (call $SAFE_HEAP_LOAD_i32_4_4 - (i64.const 1) - (i64.const 0) - ) - ) - (call $SAFE_HEAP_STORE_i32_4_4 - (i64.const 1) - (i64.const 0) - (i32.const 100) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load8_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_AR (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load8_u acqrel - (local.get $2) - ) - (i32.const 24) - ) - (i32.const 24) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_SC (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load8_u - (local.get $2) - ) - (i32.const 24) - ) - (i32.const 24) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_U_AR (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.atomic.load8_u acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_U_SC (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.atomic.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load16_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_AR (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load16_u acqrel - (local.get $2) - ) - (i32.const 16) - ) - (i32.const 16) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_SC (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load16_u - (local.get $2) - ) - (i32.const 16) - ) - (i32.const 16) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load16_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_AR (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load16_u acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_SC (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_AR (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_SC (param $0 i64) (param $1 i64) (result i32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load8_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_AR (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load8_u acqrel - (local.get $2) - ) - (i64.const 56) - ) - (i64.const 56) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_SC (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load8_u - (local.get $2) - ) - (i64.const 56) - ) - (i64.const 56) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_U_AR (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.atomic.load8_u acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_U_SC (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 1) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.atomic.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load16_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load16_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_AR (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load16_u acqrel - (local.get $2) - ) - (i64.const 48) - ) - (i64.const 48) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_SC (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load16_u - (local.get $2) - ) - (i64.const 48) - ) - (i64.const 48) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load16_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_AR (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load16_u acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_SC (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load32_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_AR (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load32_u acqrel - (local.get $2) - ) - (i64.const 32) - ) - (i64.const 32) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_SC (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load32_u - (local.get $2) - ) - (i64.const 32) - ) - (i64.const 32) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load32_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_u align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_AR (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load32_u acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_SC (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load32_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_AR (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_SC (param $0 i64) (param $1 i64) (result i64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i64) (param $1 i64) (result f32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f32.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i64) (param $1 i64) (result f32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f32.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i64) (param $1 i64) (result f32) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f32.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i64) (param $1 i64) (result f64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f64.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i64) (param $1 i64) (result f64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i64) (param $1 i64) (result f64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i64) (param $1 i64) (result f64) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 8) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (f64.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i64) (param $1 i64) (result v128) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 16) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (v128.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i64) (param $1 i64) (result v128) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 16) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i64) (param $1 i64) (result v128) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 16) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i64) (param $1 i64) (result v128) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 16) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=8 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i64) (param $1 i64) (result v128) - (local $2 i64) - (local.set $2 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $2) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $2) - (i64.const 16) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $2) - ) - (i32.const 15) - ) - (then - (call $alignfault) - ) - ) - (v128.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_1_A (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 1) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.atomic.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 1) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store16 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_A (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_A (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i64) (param $1 i64) (param $2 i32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_1_A (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 1) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.atomic.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 1) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store16 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_A (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 2) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store32 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store32 align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_A (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.store32 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store32 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_A (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i64) (param $1 i64) (param $2 i64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i64) (param $1 i64) (param $2 f32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f32.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i64) (param $1 i64) (param $2 f32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f32.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i64) (param $1 i64) (param $2 f32) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 4) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f32.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i64) (param $1 i64) (param $2 f64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f64.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i64) (param $1 i64) (param $2 f64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i64) (param $1 i64) (param $2 f64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i64) (param $1 i64) (param $2 f64) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 8) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (f64.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i64) (param $1 i64) (param $2 v128) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 16) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (v128.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i64) (param $1 i64) (param $2 v128) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 16) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i64) (param $1 i64) (param $2 v128) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 16) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i64) (param $1 i64) (param $2 v128) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 16) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i64) (param $1 i64) (param $2 v128) - (local $3 i64) - (local.set $3 - (i64.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i64.eq - (local.get $3) - (i64.const 0) - ) - (i32.or - (i64.gt_u - (i64.add - (local.get $3) - (i64.const 16) - ) - (i64.load - (call $foo) - ) - ) - (i64.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (i32.wrap_i64 - (local.get $3) - ) - (i32.const 15) - ) - (then - (call $alignfault) - ) - ) - (v128.store - (local.get $3) - (local.get $2) - ) - ) -) diff --git a/test/passes/safe-heap_low-memory-unused_enable-threads_enable-simd.txt b/test/passes/safe-heap_low-memory-unused_enable-threads_enable-simd.txt deleted file mode 100644 index 69a0ee4ed64..00000000000 --- a/test/passes/safe-heap_low-memory-unused_enable-threads_enable-simd.txt +++ /dev/null @@ -1,11943 +0,0 @@ -(module - (type $0 (func (param i32 i32) (result i64))) - (type $1 (func (param i32 i32) (result i32))) - (type $2 (func (param i32 i32 i64))) - (type $3 (func (param i32 i32 i32))) - (type $4 (func (param i32 i32) (result v128))) - (type $5 (func (param i32 i32 v128))) - (type $6 (func)) - (type $7 (func (param i32 i32) (result f64))) - (type $8 (func (param i32 i32 f64))) - (type $9 (func (param i32 i32) (result f32))) - (type $10 (func (param i32 i32 f32))) - (type $11 (func (result i32))) - (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i32))) - (import "env" "segfault" (func $segfault)) - (import "env" "alignfault" (func $alignfault)) - (memory $0 100 100 shared) - (func $loads - (drop - (call $SAFE_HEAP_LOAD_i32_4_4 - (i32.const 1) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i32_4_SC - (i32.const 1) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i32_4_4 - (i32.const 2) - (i32.const 31) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i32_4_2 - (i32.const 3) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i32_4_1 - (i32.const 4) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i32_1_1 - (i32.const 5) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i32_2_U_2 - (i32.const 6) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i64_1_1 - (i32.const 7) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i64_2_U_2 - (i32.const 8) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i64_4_4 - (i32.const 9) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i64_8_4 - (i32.const 10) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_i64_8_8 - (i32.const 11) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_f32_4_4 - (i32.const 12) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_f64_8_8 - (i32.const 13) - (i32.const 0) - ) - ) - (drop - (call $SAFE_HEAP_LOAD_v128_16_16 - (i32.const 14) - (i32.const 0) - ) - ) - ) - (func $stores - (call $SAFE_HEAP_STORE_i32_4_4 - (i32.const 1) - (i32.const 0) - (i32.const 100) - ) - (call $SAFE_HEAP_STORE_i32_4_A - (i32.const 1) - (i32.const 0) - (i32.const 100) - ) - (call $SAFE_HEAP_STORE_i32_4_4 - (i32.const 2) - (i32.const 31) - (i32.const 200) - ) - (call $SAFE_HEAP_STORE_i32_4_2 - (i32.const 3) - (i32.const 0) - (i32.const 300) - ) - (call $SAFE_HEAP_STORE_i32_4_1 - (i32.const 4) - (i32.const 0) - (i32.const 400) - ) - (call $SAFE_HEAP_STORE_i32_1_1 - (i32.const 5) - (i32.const 0) - (i32.const 500) - ) - (call $SAFE_HEAP_STORE_i32_2_2 - (i32.const 6) - (i32.const 0) - (i32.const 600) - ) - (call $SAFE_HEAP_STORE_i64_1_1 - (i32.const 7) - (i32.const 0) - (i64.const 700) - ) - (call $SAFE_HEAP_STORE_i64_2_2 - (i32.const 8) - (i32.const 0) - (i64.const 800) - ) - (call $SAFE_HEAP_STORE_i64_4_4 - (i32.const 9) - (i32.const 0) - (i64.const 900) - ) - (call $SAFE_HEAP_STORE_i64_8_4 - (i32.const 10) - (i32.const 0) - (i64.const 1000) - ) - (call $SAFE_HEAP_STORE_i64_8_8 - (i32.const 11) - (i32.const 0) - (i64.const 1100) - ) - (call $SAFE_HEAP_STORE_f32_4_4 - (i32.const 12) - (i32.const 0) - (f32.const 1200) - ) - (call $SAFE_HEAP_STORE_f64_8_8 - (i32.const 13) - (i32.const 0) - (f64.const 1300) - ) - (call $SAFE_HEAP_STORE_v128_16_16 - (i32.const 14) - (i32.const 0) - (v128.const i32x4 0x00000001 0x00000002 0x00000003 0x00000004) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load8_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_AR (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load8_u acqrel - (local.get $2) - ) - (i32.const 24) - ) - (i32.const 24) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_SC (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load8_u - (local.get $2) - ) - (i32.const 24) - ) - (i32.const 24) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_U_AR (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.atomic.load8_u acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_U_SC (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.atomic.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load16_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_AR (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load16_u acqrel - (local.get $2) - ) - (i32.const 16) - ) - (i32.const 16) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_SC (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load16_u - (local.get $2) - ) - (i32.const 16) - ) - (i32.const 16) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load16_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_AR (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load16_u acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_SC (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_AR (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_SC (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load8_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_AR (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load8_u acqrel - (local.get $2) - ) - (i64.const 56) - ) - (i64.const 56) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_SC (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load8_u - (local.get $2) - ) - (i64.const 56) - ) - (i64.const 56) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_U_AR (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.atomic.load8_u acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_U_SC (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.atomic.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load16_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load16_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_AR (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load16_u acqrel - (local.get $2) - ) - (i64.const 48) - ) - (i64.const 48) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_SC (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load16_u - (local.get $2) - ) - (i64.const 48) - ) - (i64.const 48) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load16_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_AR (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load16_u acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_SC (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load32_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_AR (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load32_u acqrel - (local.get $2) - ) - (i64.const 32) - ) - (i64.const 32) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_SC (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load32_u - (local.get $2) - ) - (i64.const 32) - ) - (i64.const 32) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load32_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_u align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_AR (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load32_u acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_SC (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load32_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_AR (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_SC (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f32.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f32.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f32.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f64.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (f64.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (v128.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=8 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 15) - ) - (then - (call $alignfault) - ) - ) - (v128.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_1_A (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.atomic.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store16 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_A (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_A (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_1_A (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.atomic.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store16 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_A (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store32 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store32 align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_A (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.store32 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store32 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_A (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i32) (param $1 i32) (param $2 f32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f32.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f32.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f32.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f64.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (f64.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (v128.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 15) - ) - (then - (call $alignfault) - ) - ) - (v128.store - (local.get $3) - (local.get $2) - ) - ) -) -(module - (type $0 (func (param i32 i32) (result i64))) - (type $1 (func (param i32 i32 i64))) - (type $2 (func (param i32 i32) (result i32))) - (type $3 (func (param i32 i32 i32))) - (type $4 (func (param i32 i32) (result v128))) - (type $5 (func (param i32 i32 v128))) - (type $6 (func (param i32 i32) (result f64))) - (type $7 (func (param i32 i32 f64))) - (type $8 (func)) - (type $9 (func (param i32 i32) (result f32))) - (type $10 (func (param i32 i32 f32))) - (type $11 (func (result i32))) - (import "env" "emscripten_get_sbrk_ptr" (func $emscripten_get_sbrk_ptr (result i32))) - (import "env" "segfault" (func $segfault)) - (import "env" "alignfault" (func $alignfault)) - (memory $0 100 100) - (func $loads - (drop - (call $SAFE_HEAP_LOAD_i32_4_4 - (i32.const 1) - (i32.const 0) - ) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load8_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load16_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load16_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load8_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load16_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load16_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load16_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load32_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load32_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_u align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f32.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f32.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f32.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f64.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (f64.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (v128.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=8 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 15) - ) - (then - (call $alignfault) - ) - ) - (v128.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store16 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store16 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store32 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store32 align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store32 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i32) (param $1 i32) (param $2 f32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f32.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f32.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f32.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f64.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (f64.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (v128.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $emscripten_get_sbrk_ptr) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 15) - ) - (then - (call $alignfault) - ) - ) - (v128.store - (local.get $3) - (local.get $2) - ) - ) -) -(module - (type $0 (func (param i32 i32) (result i64))) - (type $1 (func (param i32 i32) (result i32))) - (type $2 (func (param i32 i32 i64))) - (type $3 (func (param i32 i32 i32))) - (type $4 (func (param i32 i32) (result v128))) - (type $5 (func (param i32 i32 v128))) - (type $6 (func (param i32 i32) (result f64))) - (type $7 (func (param i32 i32 f64))) - (type $FUNCSIG$v (func)) - (type $9 (func (param i32 i32) (result f32))) - (type $10 (func (param i32 i32 f32))) - (type $11 (func (result i32))) - (import "env" "emscripten_get_sbrk_ptr" (func $foo (result i32))) - (import "env" "segfault" (func $segfault)) - (import "env" "alignfault" (func $alignfault)) - (memory $0 100 100 shared) - (func $actions - (drop - (call $SAFE_HEAP_LOAD_i32_4_4 - (i32.const 1) - (i32.const 0) - ) - ) - (call $SAFE_HEAP_STORE_i32_4_4 - (i32.const 1) - (i32.const 0) - (i32.const 100) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load8_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_AR (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load8_u acqrel - (local.get $2) - ) - (i32.const 24) - ) - (i32.const 24) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_SC (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load8_u - (local.get $2) - ) - (i32.const 24) - ) - (i32.const 24) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_U_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_U_AR (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.atomic.load8_u acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_1_U_SC (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.atomic.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load16_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_AR (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load16_u acqrel - (local.get $2) - ) - (i32.const 16) - ) - (i32.const 16) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_SC (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.shr_s - (i32.shl - (i32.atomic.load16_u - (local.get $2) - ) - (i32.const 16) - ) - (i32.const 16) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load16_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_AR (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load16_u acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_2_U_SC (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_1 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_2 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_4 (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_AR (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i32_4_SC (param $0 i32) (param $1 i32) (result i32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load8_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_AR (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load8_u acqrel - (local.get $2) - ) - (i64.const 56) - ) - (i64.const 56) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_SC (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load8_u - (local.get $2) - ) - (i64.const 56) - ) - (i64.const 56) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_U_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_U_AR (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.atomic.load8_u acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_1_U_SC (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 1) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.atomic.load8_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load16_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load16_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_AR (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load16_u acqrel - (local.get $2) - ) - (i64.const 48) - ) - (i64.const 48) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_SC (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load16_u - (local.get $2) - ) - (i64.const 48) - ) - (i64.const 48) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load16_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_AR (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load16_u acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_2_U_SC (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load16_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load32_s align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_4 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_s - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_AR (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load32_u acqrel - (local.get $2) - ) - (i64.const 32) - ) - (i64.const 32) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_SC (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.shr_s - (i64.shl - (i64.atomic.load32_u - (local.get $2) - ) - (i64.const 32) - ) - (i64.const 32) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load32_u align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_u align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_4 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load32_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_AR (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load32_u acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_4_U_SC (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load32_u - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_1 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_2 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_4 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_8 (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_AR (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load acqrel - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_i64_8_SC (param $0 i32) (param $1 i32) (result i64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_1 (param $0 i32) (param $1 i32) (result f32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f32.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_2 (param $0 i32) (param $1 i32) (result f32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f32.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f32_4_4 (param $0 i32) (param $1 i32) (result f32) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f32.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_1 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f64.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_2 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_4 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_f64_8_8 (param $0 i32) (param $1 i32) (result f64) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 8) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (f64.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_1 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (v128.load align=1 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_2 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=2 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_4 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=4 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_8 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.load align=8 - (local.get $2) - ) - ) - (func $SAFE_HEAP_LOAD_v128_16_16 (param $0 i32) (param $1 i32) (result v128) - (local $2 i32) - (local.set $2 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $2) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $2) - (i32.const 16) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $2) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $2) - (i32.const 15) - ) - (then - (call $alignfault) - ) - ) - (v128.load - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_1_A (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.atomic.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_1_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store16 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_A (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_2_2 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_1 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i32.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_2 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i32.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_A (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.atomic.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i32_4_4 (param $0 i32) (param $1 i32) (param $2 i32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i32.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_1_A (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.atomic.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_1_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 1) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store16 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_A (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_2_2 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 2) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store16 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store32 align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_2 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store32 align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_A (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.store32 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_4_4 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store32 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_1 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (i64.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_2 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_4 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (i64.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_A (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.atomic.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_i64_8_8 (param $0 i32) (param $1 i32) (param $2 i64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (i64.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_1 (param $0 i32) (param $1 i32) (param $2 f32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f32.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_2 (param $0 i32) (param $1 i32) (param $2 f32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f32.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f32_4_4 (param $0 i32) (param $1 i32) (param $2 f32) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 4) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f32.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_1 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (f64.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_2 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_4 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (f64.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_f64_8_8 (param $0 i32) (param $1 i32) (param $2 f64) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 8) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (f64.store - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_1 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (v128.store align=1 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_2 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 1) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=2 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_4 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 3) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=4 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_8 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 7) - ) - (then - (call $alignfault) - ) - ) - (v128.store align=8 - (local.get $3) - (local.get $2) - ) - ) - (func $SAFE_HEAP_STORE_v128_16_16 (param $0 i32) (param $1 i32) (param $2 v128) - (local $3 i32) - (local.set $3 - (i32.add - (local.get $0) - (local.get $1) - ) - ) - (if - (i32.or - (i32.lt_u - (local.get $3) - (i32.const 1024) - ) - (i32.or - (i32.gt_u - (i32.add - (local.get $3) - (i32.const 16) - ) - (i32.load - (call $foo) - ) - ) - (i32.lt_u - (local.get $3) - (local.get $0) - ) - ) - ) - (then - (call $segfault) - (unreachable) - ) - ) - (if - (i32.and - (local.get $3) - (i32.const 15) - ) - (then - (call $alignfault) - ) - ) - (v128.store - (local.get $3) - (local.get $2) - ) - ) -) From 8c67dbbafd13bfa8696e1365dea75d0f6746dd36 Mon Sep 17 00:00:00 2001 From: stevenfontanella Date: Fri, 9 Jan 2026 00:00:49 +0000 Subject: [PATCH 5/6] Change to memarg --- src/wasm-binary.h | 5 +- src/wasm/wasm-binary.cpp | 259 +++++++++++++++------------------------ 2 files changed, 100 insertions(+), 164 deletions(-) diff --git a/src/wasm-binary.h b/src/wasm-binary.h index 61e56950d22..9a01d161816 100644 --- a/src/wasm-binary.h +++ b/src/wasm-binary.h @@ -1730,8 +1730,9 @@ class WasmBinaryReader { std::tuple readMemoryAccess(bool isAtomic, bool isRMW); - std::tuple getMemarg(bool isAtomic, - bool isRMW); + std::tuple getAtomicMemarg(); + std::tuple getRMWMemarg(); + std::tuple getMemarg(); MemoryOrder getMemoryOrder(bool isRMW = false); [[noreturn]] void throwError(std::string text) { diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index b7af8de1427..134ea828f5c 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -1331,9 +1331,10 @@ static void writeBase64VLQ(std::ostream& out, int32_t n) { } // more VLG digit will follow -- add continuation bit (0x20), // base64 codes 'g'..'z', '0'..'9', '+', '/' - out << char(digit < 20 - ? 'g' + digit - : digit < 30 ? '0' + digit - 20 : digit == 30 ? '+' : '/'); + out << char(digit < 20 ? 'g' + digit + : digit < 30 ? '0' + digit - 20 + : digit == 30 ? '+' + : '/'); } } @@ -3529,118 +3530,95 @@ Result<> WasmBinaryReader::readInst() { case BinaryConsts::F64Const: return builder.makeConst(getFloat64Literal()); case BinaryConsts::I32LoadMem8S: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeLoad(1, true, offset, align, Type::i32, mem); } case BinaryConsts::I32LoadMem8U: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeLoad(1, false, offset, align, Type::i32, mem); } case BinaryConsts::I32LoadMem16S: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeLoad(2, true, offset, align, Type::i32, mem); } case BinaryConsts::I32LoadMem16U: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeLoad(2, false, offset, align, Type::i32, mem); } case BinaryConsts::I32LoadMem: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeLoad(4, false, offset, align, Type::i32, mem); } case BinaryConsts::I64LoadMem8S: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeLoad(1, true, offset, align, Type::i64, mem); } case BinaryConsts::I64LoadMem8U: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeLoad(1, false, offset, align, Type::i64, mem); } case BinaryConsts::I64LoadMem16S: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeLoad(2, true, offset, align, Type::i64, mem); } case BinaryConsts::I64LoadMem16U: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeLoad(2, false, offset, align, Type::i64, mem); } case BinaryConsts::I64LoadMem32S: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeLoad(4, true, offset, align, Type::i64, mem); } case BinaryConsts::I64LoadMem32U: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeLoad(4, false, offset, align, Type::i64, mem); } case BinaryConsts::I64LoadMem: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeLoad(8, false, offset, align, Type::i64, mem); } case BinaryConsts::F32LoadMem: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeLoad(4, false, offset, align, Type::f32, mem); } case BinaryConsts::F64LoadMem: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeLoad(8, false, offset, align, Type::f64, mem); } case BinaryConsts::I32StoreMem8: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeStore(1, offset, align, Type::i32, mem); } case BinaryConsts::I32StoreMem16: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeStore(2, offset, align, Type::i32, mem); } case BinaryConsts::I32StoreMem: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeStore(4, offset, align, Type::i32, mem); } case BinaryConsts::I64StoreMem8: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeStore(1, offset, align, Type::i64, mem); } case BinaryConsts::I64StoreMem16: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeStore(2, offset, align, Type::i64, mem); } case BinaryConsts::I64StoreMem32: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeStore(4, offset, align, Type::i64, mem); } case BinaryConsts::I64StoreMem: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeStore(8, offset, align, Type::i64, mem); } case BinaryConsts::F32StoreMem: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeStore(4, offset, align, Type::f32, mem); } case BinaryConsts::F64StoreMem: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeStore(8, offset, align, Type::f64, mem); } case BinaryConsts::AtomicPrefix: { @@ -3648,110 +3626,89 @@ Result<> WasmBinaryReader::readInst() { switch (op) { case BinaryConsts::I32AtomicLoad8U: { // TODO: pass align through for validation. - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/true, /*isRMW=*/false); + auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); return builder.makeAtomicLoad(1, offset, Type::i32, mem, memoryOrder); } case BinaryConsts::I32AtomicLoad16U: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/true, /*isRMW=*/false); + auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); return builder.makeAtomicLoad(2, offset, Type::i32, mem, memoryOrder); } case BinaryConsts::I32AtomicLoad: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/true, /*isRMW=*/false); + auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); return builder.makeAtomicLoad(4, offset, Type::i32, mem, memoryOrder); } case BinaryConsts::I64AtomicLoad8U: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/true, /*isRMW=*/false); + auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); return builder.makeAtomicLoad(1, offset, Type::i64, mem, memoryOrder); } case BinaryConsts::I64AtomicLoad16U: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/true, /*isRMW=*/false); + auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); return builder.makeAtomicLoad(2, offset, Type::i64, mem, memoryOrder); } case BinaryConsts::I64AtomicLoad32U: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/true, /*isRMW=*/false); + auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); return builder.makeAtomicLoad(4, offset, Type::i64, mem, memoryOrder); } case BinaryConsts::I64AtomicLoad: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/true, /*isRMW=*/false); + auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); return builder.makeAtomicLoad(8, offset, Type::i64, mem, memoryOrder); } case BinaryConsts::I32AtomicStore8: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/true, /*isRMW=*/false); + auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); return builder.makeAtomicStore(1, offset, Type::i32, mem); } case BinaryConsts::I32AtomicStore16: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/true, /*isRMW=*/false); + auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); return builder.makeAtomicStore(2, offset, Type::i32, mem); } case BinaryConsts::I32AtomicStore: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/true, /*isRMW=*/false); + auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); return builder.makeAtomicStore(4, offset, Type::i32, mem); } case BinaryConsts::I64AtomicStore8: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/true, /*isRMW=*/false); + auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); return builder.makeAtomicStore(1, offset, Type::i64, mem); } case BinaryConsts::I64AtomicStore16: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/true, /*isRMW=*/false); + auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); return builder.makeAtomicStore(2, offset, Type::i64, mem); } case BinaryConsts::I64AtomicStore32: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/true, /*isRMW=*/false); + auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); return builder.makeAtomicStore(4, offset, Type::i64, mem); } case BinaryConsts::I64AtomicStore: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/true, /*isRMW=*/false); + auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); return builder.makeAtomicStore(8, offset, Type::i64, mem); } #define RMW(op) \ case BinaryConsts::I32AtomicRMW##op: { \ - auto [mem, align, offset, memoryOrder] = \ - getMemarg(/*isAtomic=*/true, /*isRMW=*/true); \ + auto [mem, align, offset, memoryOrder] = getRMWMemarg(); \ return builder.makeAtomicRMW(RMW##op, 4, offset, Type::i32, mem); \ } \ case BinaryConsts::I32AtomicRMW##op##8U: { \ - auto [mem, align, offset, memoryOrder] = \ - getMemarg(/*isAtomic=*/true, /*isRMW=*/true); \ + auto [mem, align, offset, memoryOrder] = getRMWMemarg(); \ return builder.makeAtomicRMW(RMW##op, 1, offset, Type::i32, mem); \ } \ case BinaryConsts::I32AtomicRMW##op##16U: { \ - auto [mem, align, offset, memoryOrder] = \ - getMemarg(/*isAtomic=*/true, /*isRMW=*/true); \ + auto [mem, align, offset, memoryOrder] = getRMWMemarg(); \ return builder.makeAtomicRMW(RMW##op, 2, offset, Type::i32, mem); \ } \ case BinaryConsts::I64AtomicRMW##op: { \ - auto [mem, align, offset, memoryOrder] = \ - getMemarg(/*isAtomic=*/true, /*isRMW=*/true); \ + auto [mem, align, offset, memoryOrder] = getRMWMemarg(); \ return builder.makeAtomicRMW(RMW##op, 8, offset, Type::i64, mem); \ } \ case BinaryConsts::I64AtomicRMW##op##8U: { \ - auto [mem, align, offset, memoryOrder] = \ - getMemarg(/*isAtomic=*/true, /*isRMW=*/true); \ + auto [mem, align, offset, memoryOrder] = getRMWMemarg(); \ return builder.makeAtomicRMW(RMW##op, 1, offset, Type::i64, mem); \ } \ case BinaryConsts::I64AtomicRMW##op##16U: { \ - auto [mem, align, offset, memoryOrder] = \ - getMemarg(/*isAtomic=*/true, /*isRMW=*/true); \ + auto [mem, align, offset, memoryOrder] = getRMWMemarg(); \ return builder.makeAtomicRMW(RMW##op, 2, offset, Type::i64, mem); \ } \ case BinaryConsts::I64AtomicRMW##op##32U: { \ - auto [mem, align, offset, memoryOrder] = \ - getMemarg(/*isAtomic=*/true, /*isRMW=*/true); \ + auto [mem, align, offset, memoryOrder] = getRMWMemarg(); \ return builder.makeAtomicRMW(RMW##op, 4, offset, Type::i64, mem); \ } @@ -3763,53 +3720,43 @@ Result<> WasmBinaryReader::readInst() { RMW(Xchg); case BinaryConsts::I32AtomicCmpxchg: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/true, /*isRMW=*/true); + auto [mem, align, offset, memoryOrder] = getRMWMemarg(); return builder.makeAtomicCmpxchg(4, offset, Type::i32, mem); } case BinaryConsts::I32AtomicCmpxchg8U: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/true, /*isRMW=*/true); + auto [mem, align, offset, memoryOrder] = getRMWMemarg(); return builder.makeAtomicCmpxchg(1, offset, Type::i32, mem); } case BinaryConsts::I32AtomicCmpxchg16U: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/true, /*isRMW=*/true); + auto [mem, align, offset, memoryOrder] = getRMWMemarg(); return builder.makeAtomicCmpxchg(2, offset, Type::i32, mem); } case BinaryConsts::I64AtomicCmpxchg: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/true, /*isRMW=*/true); + auto [mem, align, offset, memoryOrder] = getRMWMemarg(); return builder.makeAtomicCmpxchg(8, offset, Type::i64, mem); } case BinaryConsts::I64AtomicCmpxchg8U: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/true, /*isRMW=*/true); + auto [mem, align, offset, memoryOrder] = getRMWMemarg(); return builder.makeAtomicCmpxchg(1, offset, Type::i64, mem); } case BinaryConsts::I64AtomicCmpxchg16U: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/true, /*isRMW=*/true); + auto [mem, align, offset, memoryOrder] = getRMWMemarg(); return builder.makeAtomicCmpxchg(2, offset, Type::i64, mem); } case BinaryConsts::I64AtomicCmpxchg32U: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/true, /*isRMW=*/true); + auto [mem, align, offset, memoryOrder] = getRMWMemarg(); return builder.makeAtomicCmpxchg(4, offset, Type::i64, mem); } case BinaryConsts::I32AtomicWait: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/true, /*isRMW=*/false); + auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); return builder.makeAtomicWait(Type::i32, offset, mem); } case BinaryConsts::I64AtomicWait: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/true, /*isRMW=*/false); + auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); return builder.makeAtomicWait(Type::i64, offset, mem); } case BinaryConsts::AtomicNotify: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/true, /*isRMW=*/false); + auto [mem, align, offset, memoryOrder] = getAtomicMemarg(); return builder.makeAtomicNotify(offset, mem); } case BinaryConsts::AtomicFence: @@ -3946,13 +3893,11 @@ Result<> WasmBinaryReader::readInst() { return builder.makeElemDrop(elem); } case BinaryConsts::F32_F16LoadMem: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeLoad(2, false, offset, align, Type::f32, mem); } case BinaryConsts::F32_F16StoreMem: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeStore(2, offset, align, Type::f32, mem); } } @@ -4497,120 +4442,98 @@ Result<> WasmBinaryReader::readInst() { case BinaryConsts::V128Const: return builder.makeConst(getVec128Literal()); case BinaryConsts::V128Store: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeStore(16, offset, align, Type::v128, mem); } case BinaryConsts::V128Load: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeLoad(16, false, offset, align, Type::v128, mem); } case BinaryConsts::V128Load8Splat: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeSIMDLoad(Load8SplatVec128, offset, align, mem); } case BinaryConsts::V128Load16Splat: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeSIMDLoad(Load16SplatVec128, offset, align, mem); } case BinaryConsts::V128Load32Splat: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeSIMDLoad(Load32SplatVec128, offset, align, mem); } case BinaryConsts::V128Load64Splat: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeSIMDLoad(Load64SplatVec128, offset, align, mem); } case BinaryConsts::V128Load8x8S: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeSIMDLoad(Load8x8SVec128, offset, align, mem); } case BinaryConsts::V128Load8x8U: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeSIMDLoad(Load8x8UVec128, offset, align, mem); } case BinaryConsts::V128Load16x4S: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeSIMDLoad(Load16x4SVec128, offset, align, mem); } case BinaryConsts::V128Load16x4U: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeSIMDLoad(Load16x4UVec128, offset, align, mem); } case BinaryConsts::V128Load32x2S: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeSIMDLoad(Load32x2SVec128, offset, align, mem); } case BinaryConsts::V128Load32x2U: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeSIMDLoad(Load32x2UVec128, offset, align, mem); } case BinaryConsts::V128Load32Zero: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeSIMDLoad(Load32ZeroVec128, offset, align, mem); } case BinaryConsts::V128Load64Zero: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeSIMDLoad(Load64ZeroVec128, offset, align, mem); } case BinaryConsts::V128Load8Lane: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeSIMDLoadStoreLane( Load8LaneVec128, offset, align, getLaneIndex(16), mem); } case BinaryConsts::V128Load16Lane: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeSIMDLoadStoreLane( Load16LaneVec128, offset, align, getLaneIndex(8), mem); } case BinaryConsts::V128Load32Lane: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeSIMDLoadStoreLane( Load32LaneVec128, offset, align, getLaneIndex(4), mem); } case BinaryConsts::V128Load64Lane: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeSIMDLoadStoreLane( Load64LaneVec128, offset, align, getLaneIndex(2), mem); } case BinaryConsts::V128Store8Lane: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeSIMDLoadStoreLane( Store8LaneVec128, offset, align, getLaneIndex(16), mem); } case BinaryConsts::V128Store16Lane: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeSIMDLoadStoreLane( Store16LaneVec128, offset, align, getLaneIndex(8), mem); } case BinaryConsts::V128Store32Lane: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeSIMDLoadStoreLane( Store32LaneVec128, offset, align, getLaneIndex(4), mem); } case BinaryConsts::V128Store64Lane: { - auto [mem, align, offset, memoryOrder] = - getMemarg(/*isAtomic=*/false, /*isRMW=*/false); + auto [mem, align, offset] = getMemarg(); return builder.makeSIMDLoadStoreLane( Store64LaneVec128, offset, align, getLaneIndex(2), mem); } @@ -5586,14 +5509,26 @@ WasmBinaryReader::readMemoryAccess(bool isAtomic, bool isRMW) { return {alignment, offset, memIdx, memoryOrder}; } -// TODO: make this the only version std::tuple -WasmBinaryReader::getMemarg(bool isAtomic, bool isRMW) { +WasmBinaryReader::getAtomicMemarg() { auto [alignment, offset, memIdx, memoryOrder] = - readMemoryAccess(isAtomic, isRMW); + readMemoryAccess(/*isAtomic=*/true, /*isRMW=*/false); return {getMemoryName(memIdx), alignment, offset, memoryOrder}; } +std::tuple +WasmBinaryReader::getRMWMemarg() { + auto [alignment, offset, memIdx, memoryOrder] = + readMemoryAccess(/*isAtomic=*/true, /*isRMW=*/true); + return {getMemoryName(memIdx), alignment, offset, memoryOrder}; +} + +std::tuple WasmBinaryReader::getMemarg() { + auto [alignment, offset, memIdx, _] = + readMemoryAccess(/*isAtomic=*/false, /*isRMW=*/false); + return {getMemoryName(memIdx), alignment, offset}; +} + MemoryOrder WasmBinaryReader::getMemoryOrder(bool isRMW) { auto code = getInt8(); switch (code) { From 82281d4b42dae1a881f8add4c9abd70ea9d3946a Mon Sep 17 00:00:00 2001 From: stevenfontanella Date: Fri, 9 Jan 2026 00:45:48 +0000 Subject: [PATCH 6/6] PR fixes --- src/wasm-binary.h | 3 +++ src/wasm/wasm-binary.cpp | 13 +++++-------- src/wasm/wasm-stack.cpp | 6 ++---- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/wasm-binary.h b/src/wasm-binary.h index 9a01d161816..78a0a6e2434 100644 --- a/src/wasm-binary.h +++ b/src/wasm-binary.h @@ -358,6 +358,9 @@ enum BrOnCastFlag { constexpr uint32_t ExactImport = 1 << 5; +constexpr uint32_t HasMemoryOrderMask = 1 << 5; +constexpr uint32_t HasMemoryIndexMask = 1 << 6; + enum EncodedType { // value types i32 = -0x1, // 0x7f diff --git a/src/wasm/wasm-binary.cpp b/src/wasm/wasm-binary.cpp index 134ea828f5c..d24f7da423f 100644 --- a/src/wasm/wasm-binary.cpp +++ b/src/wasm/wasm-binary.cpp @@ -5466,25 +5466,22 @@ void WasmBinaryReader::readInlineHints(size_t payloadLen) { std::tuple WasmBinaryReader::readMemoryAccess(bool isAtomic, bool isRMW) { auto rawAlignment = getU32LEB(); - bool hasMemIdx = false; Index memIdx = 0; - bool hasMemoryOrder = rawAlignment & (1 << 5); + bool hasMemoryOrder = rawAlignment & BinaryConsts::HasMemoryOrderMask; if (hasMemoryOrder && !isAtomic) { throwError("Memory order may only be set for atomic instructions."); } if (hasMemoryOrder) { // Clear the bit before we parse alignment - rawAlignment = rawAlignment & ~(1 << 5); + rawAlignment = rawAlignment & ~BinaryConsts::HasMemoryOrderMask; } - // Check bit 6 in the alignment to know whether a memory index is present per: - // https://github.com/WebAssembly/multi-memory/blob/main/proposals/multi-memory/Overview.md - if (rawAlignment & (1 << 6)) { - hasMemIdx = true; + bool hasMemIdx = rawAlignment & BinaryConsts::HasMemoryIndexMask; + if (hasMemIdx) { // Clear the bit before we parse alignment - rawAlignment = rawAlignment & ~(1 << 6); + rawAlignment = rawAlignment & ~BinaryConsts::HasMemoryIndexMask; } if (rawAlignment > 8) { diff --git a/src/wasm/wasm-stack.cpp b/src/wasm/wasm-stack.cpp index 805c3a5cf3f..ce2d6c737fd 100644 --- a/src/wasm/wasm-stack.cpp +++ b/src/wasm/wasm-stack.cpp @@ -3248,15 +3248,13 @@ void BinaryInstWriter::emitMemoryAccess(size_t alignment, break; case MemoryOrder::AcqRel: { shouldWriteMemoryOrder = true; - alignmentBits |= 1 << 5; + alignmentBits |= BinaryConsts::HasMemoryOrderMask; break; } } if (memoryIdx > 0) { - // Set bit 6 in the alignment to indicate a memory index is present per: - // https://github.com/WebAssembly/multi-memory/blob/main/proposals/multi-memory/Overview.md - alignmentBits |= 1 << 6; + alignmentBits |= BinaryConsts::HasMemoryIndexMask; } o << U32LEB(alignmentBits); if (memoryIdx > 0) {