From 7ea9b53194e78fc6655dfca8f69f3f8ef84d9939 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 26 Nov 2015 19:45:44 -0800 Subject: wasm2asm progress --- src/emscripten-optimizer/simple_ast.h | 10 ++++++++++ src/wasm2asm.h | 29 +++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) (limited to 'src') diff --git a/src/emscripten-optimizer/simple_ast.h b/src/emscripten-optimizer/simple_ast.h index b524a4b2b..9e19249ab 100644 --- a/src/emscripten-optimizer/simple_ast.h +++ b/src/emscripten-optimizer/simple_ast.h @@ -1533,6 +1533,16 @@ public: .push_back(target) .push_back(value); } + + static Ref makeSub(Ref obj, Ref index) { + return &makeRawArray(2)->push_back(makeRawString(SUB)) + .push_back(obj) + .push_back(index); + } + + static Ref makePtrShift(Ref ptr, int shifts) { + return makeBinary(ptr, RSHIFT, makeInt(shifts)); + } }; // Tolerates 0.0 in the input; does not trust a +() to be there. diff --git a/src/wasm2asm.h b/src/wasm2asm.h index f261b7d57..664477a8d 100644 --- a/src/wasm2asm.h +++ b/src/wasm2asm.h @@ -288,6 +288,9 @@ Ref Wasm2AsmBuilder::processFunctionBody(Expression* curr, IString result) { } } + IString getName() { + return temp; + } Ref getAstName() { return ValueBuilder::makeName(temp); } @@ -499,6 +502,32 @@ Ref Wasm2AsmBuilder::processFunctionBody(Expression* curr, IString result) { return ret; } void visitLoad(Load *curr) override { + if (isStatement(curr)) { + ScopedTemp temp(i32, parent); + GetLocal fakeLocal; + fakeLocal.name = temp.getName(); + Load fakeLoad = *curr; + fakeLoad.ptr = &fakeLocal; + Ref ret = blockify(visit(curr->value, temp)); + ret[1]->push_back(visit(&fakeLoad, result)); + return ret; + } + // normal load + assert(curr->bytes == curr->align); // TODO: unaligned, i64 + Ref ptr = visit(curr->ptr, EXPRESSION_RESULT); + switch (curr->type) { + case i32: { + switch (curr->bytes) { + case 1: return ValueBuilder::makeSub(ValueBuilder::makeName(curr->signed_ ? HEAP8 : HEAPU8 ), ValueBuilder::makePtrShift(ptr, 0)); + case 2: return ValueBuilder::makeSub(ValueBuilder::makeName(curr->signed_ ? HEAP16 : HEAPU16), ValueBuilder::makePtrShift(ptr, 1)); + case 4: return ValueBuilder::makeSub(ValueBuilder::makeName(curr->signed_ ? HEAP32 : HEAPU32), ValueBuilder::makePtrShift(ptr, 2)); + default: abort(); + } + } + case f32: return ValueBuilder::makeSub(ValueBuilder::makeName(HEAPF32), ValueBuilder::makePtrShift(ptr, 2)); + case f64: return ValueBuilder::makeSub(ValueBuilder::makeName(HEAPF64), ValueBuilder::makePtrShift(ptr, 3)); + default: abort(); + } } void visitStore(Store *curr) override { } -- cgit v1.2.3