summaryrefslogtreecommitdiff
path: root/src/passes/MemoryPacking.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/passes/MemoryPacking.cpp')
-rw-r--r--src/passes/MemoryPacking.cpp22
1 files changed, 12 insertions, 10 deletions
diff --git a/src/passes/MemoryPacking.cpp b/src/passes/MemoryPacking.cpp
index eac7fb7f0..1018ce1c7 100644
--- a/src/passes/MemoryPacking.cpp
+++ b/src/passes/MemoryPacking.cpp
@@ -76,9 +76,14 @@ const size_t DATA_DROP_SIZE = 3;
namespace {
-Expression* makeShiftedMemorySize(Builder& builder) {
+Expression*
+makeGtShiftedMemorySize(Builder& builder, Module& module, MemoryInit* curr) {
return builder.makeBinary(
- ShlInt32, builder.makeMemorySize(), builder.makeConst(int32_t(16)));
+ module.memory.is64() ? GtUInt64 : GtUInt32,
+ curr->dest,
+ builder.makeBinary(module.memory.is64() ? ShlInt64 : ShlInt32,
+ builder.makeMemorySize(),
+ builder.makeConstPtr(16)));
}
} // anonymous namespace
@@ -317,10 +322,9 @@ void MemoryPacking::optimizeBulkMemoryOps(PassRunner* runner, Module* module) {
assert(!mustNop || !mustTrap);
if (mustNop) {
// Offset and size are 0, so just trap if dest > memory.size
- replaceCurrent(builder.makeIf(
- builder.makeBinary(
- GtUInt32, curr->dest, makeShiftedMemorySize(builder)),
- builder.makeUnreachable()));
+ replaceCurrent(
+ builder.makeIf(makeGtShiftedMemorySize(builder, *getModule(), curr),
+ builder.makeUnreachable()));
} else if (mustTrap) {
// Drop dest, offset, and size then trap
replaceCurrent(builder.blockify(builder.makeDrop(curr->dest),
@@ -333,8 +337,7 @@ void MemoryPacking::optimizeBulkMemoryOps(PassRunner* runner, Module* module) {
replaceCurrent(builder.makeIf(
builder.makeBinary(
OrInt32,
- builder.makeBinary(
- GtUInt32, curr->dest, makeShiftedMemorySize(builder)),
+ makeGtShiftedMemorySize(builder, *getModule(), curr),
builder.makeBinary(OrInt32, curr->offset, curr->size)),
builder.makeUnreachable()));
}
@@ -527,8 +530,7 @@ void MemoryPacking::createReplacements(Module* module,
Expression* result = builder.makeIf(
builder.makeBinary(
OrInt32,
- builder.makeBinary(
- GtUInt32, init->dest, makeShiftedMemorySize(builder)),
+ makeGtShiftedMemorySize(builder, *module, init),
builder.makeGlobalGet(getDropStateGlobal(), Type::i32)),
builder.makeUnreachable());
replacements[init] = [result](Function*) { return result; };