diff options
author | Alon Zakai <alonzakai@gmail.com> | 2015-12-01 16:17:19 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2015-12-01 16:53:19 -0800 |
commit | e7707396ea86ded822848b0fb40b8b1180ac4a84 (patch) | |
tree | cedae051586df3505db1d66546edbae8d7ce4855 /src/emscripten-optimizer/optimizer-shared.cpp | |
parent | e0cff3c71ffa5683173f968641bd78e6014cd5e3 (diff) | |
download | binaryen-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.cpp | 52 |
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 + } +} + |