summaryrefslogtreecommitdiff
path: root/src/emscripten-optimizer/optimizer-shared.cpp
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2015-12-01 16:17:19 -0800
committerAlon Zakai <alonzakai@gmail.com>2015-12-01 16:53:19 -0800
commite7707396ea86ded822848b0fb40b8b1180ac4a84 (patch)
treecedae051586df3505db1d66546edbae8d7ce4855 /src/emscripten-optimizer/optimizer-shared.cpp
parente0cff3c71ffa5683173f968641bd78e6014cd5e3 (diff)
downloadbinaryen-e7707396ea86ded822848b0fb40b8b1180ac4a84.tar.gz
binaryen-e7707396ea86ded822848b0fb40b8b1180ac4a84.tar.bz2
binaryen-e7707396ea86ded822848b0fb40b8b1180ac4a84.zip
refactoring, and wasm2asm arags and locals
Diffstat (limited to 'src/emscripten-optimizer/optimizer-shared.cpp')
-rw-r--r--src/emscripten-optimizer/optimizer-shared.cpp52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/emscripten-optimizer/optimizer-shared.cpp b/src/emscripten-optimizer/optimizer-shared.cpp
index 6a8bbf9b5..09b458138 100644
--- a/src/emscripten-optimizer/optimizer-shared.cpp
+++ b/src/emscripten-optimizer/optimizer-shared.cpp
@@ -176,3 +176,55 @@ AsmSign detectSign(Ref node, IString minifiedFround) {
abort(); // avoid warning
}
+Ref makeAsmCoercedZero(AsmType type) {
+ switch (type) {
+ case ASM_INT: return ValueBuilder::makeNum(0); break;
+ case ASM_DOUBLE: return ValueBuilder::makeUnary(PLUS, ValueBuilder::makeNum(0)); break;
+ case ASM_FLOAT: {
+ if (!ASM_FLOAT_ZERO.isNull()) {
+ return ValueBuilder::makeName(ASM_FLOAT_ZERO);
+ } else {
+ return ValueBuilder::makeCall(MATH_FROUND, ValueBuilder::makeNum(0));
+ }
+ break;
+ }
+ case ASM_FLOAT32X4: {
+ return ValueBuilder::makeCall(SIMD_FLOAT32X4, ValueBuilder::makeNum(0), ValueBuilder::makeNum(0), ValueBuilder::makeNum(0), ValueBuilder::makeNum(0));
+ break;
+ }
+ case ASM_FLOAT64X2: {
+ return ValueBuilder::makeCall(SIMD_FLOAT64X2, ValueBuilder::makeNum(0), ValueBuilder::makeNum(0));
+ break;
+ }
+ case ASM_INT8X16: {
+ return ValueBuilder::makeCall(SIMD_INT8X16, ValueBuilder::makeNum(0), ValueBuilder::makeNum(0), ValueBuilder::makeNum(0), ValueBuilder::makeNum(0), ValueBuilder::makeNum(0), ValueBuilder::makeNum(0), ValueBuilder::makeNum(0), ValueBuilder::makeNum(0), ValueBuilder::makeNum(0), ValueBuilder::makeNum(0), ValueBuilder::makeNum(0), ValueBuilder::makeNum(0), ValueBuilder::makeNum(0), ValueBuilder::makeNum(0), ValueBuilder::makeNum(0), ValueBuilder::makeNum(0));
+ break;
+ }
+ case ASM_INT16X8: {
+ return ValueBuilder::makeCall(SIMD_INT16X8, ValueBuilder::makeNum(0), ValueBuilder::makeNum(0), ValueBuilder::makeNum(0), ValueBuilder::makeNum(0), ValueBuilder::makeNum(0), ValueBuilder::makeNum(0), ValueBuilder::makeNum(0), ValueBuilder::makeNum(0));
+ break;
+ }
+ case ASM_INT32X4: {
+ return ValueBuilder::makeCall(SIMD_INT32X4, ValueBuilder::makeNum(0), ValueBuilder::makeNum(0), ValueBuilder::makeNum(0), ValueBuilder::makeNum(0));
+ break;
+ }
+ default: assert(0);
+ }
+ abort();
+}
+
+Ref makeAsmCoercion(Ref node, AsmType type) {
+ switch (type) {
+ case ASM_INT: return ValueBuilder::makeBinary(node, OR, ValueBuilder::makeNum(0));
+ case ASM_DOUBLE: return ValueBuilder::makeUnary(PLUS, node);
+ case ASM_FLOAT: return ValueBuilder::makeCall(MATH_FROUND, node);
+ case ASM_FLOAT32X4: return ValueBuilder::makeCall(SIMD_FLOAT32X4_CHECK, node);
+ case ASM_FLOAT64X2: return ValueBuilder::makeCall(SIMD_FLOAT64X2_CHECK, node);
+ case ASM_INT8X16: return ValueBuilder::makeCall(SIMD_INT8X16_CHECK, node);
+ case ASM_INT16X8: return ValueBuilder::makeCall(SIMD_INT16X8_CHECK, node);
+ case ASM_INT32X4: return ValueBuilder::makeCall(SIMD_INT32X4_CHECK, node);
+ case ASM_NONE:
+ default: return node; // non-validating code, emit nothing XXX this is dangerous, we should only allow this when we know we are not validating
+ }
+}
+