diff options
-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 { } |