From 9fd7cfcb3f50eac87016170e8c130674fd37fcd0 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 22 Dec 2015 15:16:16 -0800 Subject: visitStore in LowerInt64 --- src/passes/LowerInt64.cpp | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) (limited to 'src') 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* setToLocalForBlock(Expression *value, Name& local, Block *ret = nullptr) { + if (!ret) ret = allocator->alloc(); if (value->is()) { local = value->name; } else if (value->is()) { @@ -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(); + *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 { } -- cgit v1.2.3