diff options
author | Alon Zakai <alonzakai@gmail.com> | 2015-12-22 13:52:29 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2015-12-22 13:52:29 -0800 |
commit | 58cb71723a5243f8a347e51e9ceb20b664719585 (patch) | |
tree | c14958337e75c2be16450e19365ff0f3e8da74c4 /src/passes/LowerInt64.cpp | |
parent | 4726dcfd02ca4bea786fe4b6ef4629e3e2a1561d (diff) | |
download | binaryen-58cb71723a5243f8a347e51e9ceb20b664719585.tar.gz binaryen-58cb71723a5243f8a347e51e9ceb20b664719585.tar.bz2 binaryen-58cb71723a5243f8a347e51e9ceb20b664719585.zip |
load in LowerInt64
Diffstat (limited to 'src/passes/LowerInt64.cpp')
-rw-r--r-- | src/passes/LowerInt64.cpp | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/src/passes/LowerInt64.cpp b/src/passes/LowerInt64.cpp index 14bca0ad1..cb0643b83 100644 --- a/src/passes/LowerInt64.cpp +++ b/src/passes/LowerInt64.cpp @@ -117,7 +117,47 @@ struct LowerInt64 : public Pass { replaceCurrent(ret); } } + + // sets an expression to a local, and returns a block + Block* setToLocalForBlock(Expression *value, Name& local) { + auto ret = allocator->alloc<Block>(); + if (value->is<GetLocal>()) { + local = value->name; + } else if (value->is<SetLocal>()) { + local = value->name; + } else { + auto set = allocator.alloc<SetLocal>(); + set->name = local = namer->getUnique("temp"); + set->value = value; + set->type = value->type; + ret->list.push_back(set); + } + return ret; + } + + GetLocal* getLocal(Name name) { + auto ret = allocator->alloc<GetLocal>(); + ret->name = name; + ret->type = i32; + return ret; + } + void visitLoad(Load *curr) override { + if (curr->type == i64) { + Name local; + auto ret = setToLocalForBlock(curr->ptr, local); + curr->ptr = getLocal(local); + curr->type = i32; + curr->bytes = 4; + auto high = allocator->alloc<Load>(); + *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 { } |