summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2015-12-22 15:16:16 -0800
committerAlon Zakai <alonzakai@gmail.com>2015-12-22 15:16:16 -0800
commit9fd7cfcb3f50eac87016170e8c130674fd37fcd0 (patch)
treebdfc1e87d164e2169635eed692c96a61fe95be20
parent50dca4285a53bf5107e0f44e695a1085d6a55d00 (diff)
downloadbinaryen-9fd7cfcb3f50eac87016170e8c130674fd37fcd0.tar.gz
binaryen-9fd7cfcb3f50eac87016170e8c130674fd37fcd0.tar.bz2
binaryen-9fd7cfcb3f50eac87016170e8c130674fd37fcd0.zip
visitStore in LowerInt64
-rw-r--r--src/passes/LowerInt64.cpp23
1 files changed, 20 insertions, 3 deletions
diff --git a/src/passes/LowerInt64.cpp b/src/passes/LowerInt64.cpp
index cb0643b83..ae3f773bd 100644
--- a/src/passes/LowerInt64.cpp
+++ b/src/passes/LowerInt64.cpp
@@ -119,8 +119,8 @@ struct LowerInt64 : public Pass {
}
// sets an expression to a local, and returns a block
- Block* setToLocalForBlock(Expression *value, Name& local) {
- auto ret = allocator->alloc<Block>();
+ Block* setToLocalForBlock(Expression *value, Name& local, Block *ret = nullptr) {
+ if (!ret) ret = allocator->alloc<Block>();
if (value->is<GetLocal>()) {
local = value->name;
} else if (value->is<SetLocal>()) {
@@ -153,13 +153,30 @@ struct LowerInt64 : public Pass {
*high = *curr;
high->ptr = getLocal(local);
high->offset += 4;
- ret->list.push_back(high);
ret->list.push_back(curr);
fixes[ret] = high;
replaceCurrent(ret);
}
}
void visitStore(Store *curr) override {
+ if (curr->type == i64) {
+ Name localPtr, localValue;
+ auto ret = setToLocalForBlock(curr->ptr, localPtr);
+ setToLocalForBlock(curr->value, localValue);
+ curr->ptr = getLocal(localPtr);
+ curr->value = getLocal(localValue);
+ curr->type = i32;
+ curr->bytes = 4;
+ auto high = allocator->alloc<Load>();
+ *high = *curr;
+ high->ptr = getLocal(localPtr);
+ high->value = getLocal(localValue);
+ high->offset += 4;
+ ret->list.push_back(high);
+ ret->list.push_back(curr);
+ fixes[ret] = high;
+ replaceCurrent(ret);
+ }
}
void visitConst(Const *curr) override {
}