diff options
author | Alon Zakai <alonzakai@gmail.com> | 2015-11-27 20:18:51 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2015-11-27 20:18:51 -0800 |
commit | 86491ff1fb2a7bebc357b28db74385785c0644ef (patch) | |
tree | 3032d5c5e3be4b6a5938effe79ff2d529187e9c7 | |
parent | a6c2f37ca6b0f1031ca706904766a836e1ea5668 (diff) | |
download | binaryen-86491ff1fb2a7bebc357b28db74385785c0644ef.tar.gz binaryen-86491ff1fb2a7bebc357b28db74385785c0644ef.tar.bz2 binaryen-86491ff1fb2a7bebc357b28db74385785c0644ef.zip |
wasm2asm progress
-rw-r--r-- | src/emscripten-optimizer/simple_ast.h | 8 | ||||
-rw-r--r-- | src/wasm2asm.h | 50 |
2 files changed, 58 insertions, 0 deletions
diff --git a/src/emscripten-optimizer/simple_ast.h b/src/emscripten-optimizer/simple_ast.h index 42ce3fc72..396f225d7 100644 --- a/src/emscripten-optimizer/simple_ast.h +++ b/src/emscripten-optimizer/simple_ast.h @@ -1343,6 +1343,14 @@ public: ret[2]->push_back(arg); return ret; } + static Ref makeCall(IString target, Ref arg1, Ref arg2) { + Ref ret = &makeRawArray(3)->push_back(makeRawString(CALL)) + .push_back(makeName(target)) + .push_back(makeRawArray()); + ret[2]->push_back(arg1); + ret[2]->push_back(arg2); + return ret; + } static void appendToCall(Ref call, Ref element) { assert(call[0] == CALL); diff --git a/src/wasm2asm.h b/src/wasm2asm.h index c5fb08e3d..b10c16de9 100644 --- a/src/wasm2asm.h +++ b/src/wasm2asm.h @@ -622,6 +622,56 @@ Ref Wasm2AsmBuilder::processFunctionBody(Expression* curr, IString result) { } } void visitBinary(Binary *curr) override { + if (isStatement(curr)) { + ScopedTemp tempLeft(curr->left->type, parent); + GetLocal fakeLocalLeft; + fakeLocalLeft.name = temp.getName(); + ScopedTemp tempRight(curr->right->type, parent); + GetLocal fakeLocalRight; + fakeLocalRight.name = temp.getName(); + Binary fakeBinary = *curr; + fakeBinary.value = &fakeLocal; + Ref ret = blockify(visitAndAssign(curr->left, tempLeft)); + ret[1]->push_back(visitAndAssign(curr->right, tempRight)); + ret[1]->push_back(visit(&fakeBinary, result)); + return ret; + } + // normal binary + Ref left = visit(curr->left, EXPRESSION_RESULT); + Ref right = visit(curr->right, EXPRESSION_RESULT); + switch (curr->op) { + case Add: return ValueBuilder::makeBinary(left, PLUS, right); + case Sub: return ValueBuilder::makeBinary(left, MINUS, right); + case Mul: return ValueBuilder::makeBinary(left, MUL, right); + case DivS: return ValueBuilder::makeBinary(left, DIV, right); + case DivU: return ValueBuilder::makeBinary(left, DIV, right); + case RemS: return ValueBuilder::makeBinary(left, REM, right); + case RemU: return ValueBuilder::makeBinary(left, REM, right); + case And: return ValueBuilder::makeBinary(left, AND, right); + case Or: return ValueBuilder::makeBinary(left, OR, right); + case Xor: return ValueBuilder::makeBinary(left, XOR, right); + case Shl: return ValueBuilder::makeBinary(left, SHL, right); + case ShrU: return ValueBuilder::makeBinary(left, TRSHR, right); + case ShrS: return ValueBuilder::makeBinary(left, ASHR, right); + case Div: return ValueBuilder::makeBinary(left, DIV, right); + case Min: return ValueBuilder::makeCall(MATH_MIN, left, right); + case Max: return ValueBuilder::makeCall(MATH_MAX, left, right); + case Eq: return ValueBuilder::makeBinary(left, EQ, right); + case Ne: return ValueBuilder::makeBinary(left, NE, right); + case LtS: return ValueBuilder::makeBinary(left, LT, right); + case LtU: return ValueBuilder::makeBinary(left, LT, right); + case LeS: return ValueBuilder::makeBinary(left, LE, right); + case LeU: return ValueBuilder::makeBinary(left, LE, right); + case GtS: return ValueBuilder::makeBinary(left, GT, right); + case GtU: return ValueBuilder::makeBinary(left, GT, right); + case GeS: return ValueBuilder::makeBinary(left, GE, right); + case GeU: return ValueBuilder::makeBinary(left, GE, right); + case Lt: return ValueBuilder::makeBinary(left, LT, right); + case Le: return ValueBuilder::makeBinary(left, LE, right); + case Gt: return ValueBuilder::makeBinary(left, GT, right); + case Ge: return ValueBuilder::makeBinary(left, GE, right); + default: abort(); + } } void visitSelect(Select *curr) override { } |