summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2015-11-27 20:18:51 -0800
committerAlon Zakai <alonzakai@gmail.com>2015-11-27 20:18:51 -0800
commit86491ff1fb2a7bebc357b28db74385785c0644ef (patch)
tree3032d5c5e3be4b6a5938effe79ff2d529187e9c7
parenta6c2f37ca6b0f1031ca706904766a836e1ea5668 (diff)
downloadbinaryen-86491ff1fb2a7bebc357b28db74385785c0644ef.tar.gz
binaryen-86491ff1fb2a7bebc357b28db74385785c0644ef.tar.bz2
binaryen-86491ff1fb2a7bebc357b28db74385785c0644ef.zip
wasm2asm progress
-rw-r--r--src/emscripten-optimizer/simple_ast.h8
-rw-r--r--src/wasm2asm.h50
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 {
}