diff options
author | Alon Zakai <alonzakai@gmail.com> | 2015-12-22 15:16:16 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2015-12-22 15:16:16 -0800 |
commit | 9fd7cfcb3f50eac87016170e8c130674fd37fcd0 (patch) | |
tree | bdfc1e87d164e2169635eed692c96a61fe95be20 /src | |
parent | 50dca4285a53bf5107e0f44e695a1085d6a55d00 (diff) | |
download | binaryen-9fd7cfcb3f50eac87016170e8c130674fd37fcd0.tar.gz binaryen-9fd7cfcb3f50eac87016170e8c130674fd37fcd0.tar.bz2 binaryen-9fd7cfcb3f50eac87016170e8c130674fd37fcd0.zip |
visitStore in LowerInt64
Diffstat (limited to 'src')
-rw-r--r-- | src/passes/LowerInt64.cpp | 23 |
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 { } |