diff options
author | Alon Zakai <alonzakai@gmail.com> | 2016-09-30 17:04:25 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-09-30 17:04:25 -0700 |
commit | 58832ad0b8a197ece6165bfe163f634a21f8bd6d (patch) | |
tree | b6f56bb970a53996d5bd6fabf1187a7139997f9f /src/emscripten-optimizer/optimizer-shared.cpp | |
parent | cbe71a99f3b53db81cfd23f7a12f2010daeff65d (diff) | |
download | binaryen-58832ad0b8a197ece6165bfe163f634a21f8bd6d.tar.gz binaryen-58832ad0b8a197ece6165bfe163f634a21f8bd6d.tar.bz2 binaryen-58832ad0b8a197ece6165bfe163f634a21f8bd6d.zip |
asm2wasm i64 support (#723)
* support i64 intrinsics from fastcomp, adding --wasm-only flag
* refactor callImport logic in asm2wasm to avoid recomputing wasm types again
* legalize illegal i64 params in exports and imports
* do safe i64 binary ops depending on precision
* fix addVar, only assert on names if we are using a name
Diffstat (limited to 'src/emscripten-optimizer/optimizer-shared.cpp')
-rw-r--r-- | src/emscripten-optimizer/optimizer-shared.cpp | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/src/emscripten-optimizer/optimizer-shared.cpp b/src/emscripten-optimizer/optimizer-shared.cpp index 6831d81b0..57b7921fa 100644 --- a/src/emscripten-optimizer/optimizer-shared.cpp +++ b/src/emscripten-optimizer/optimizer-shared.cpp @@ -52,7 +52,7 @@ HeapInfo parseHeap(const char *name) { return ret; } -AsmType detectType(Ref node, AsmData *asmData, bool inVarDef, IString minifiedFround) { +AsmType detectType(Ref node, AsmData *asmData, bool inVarDef, IString minifiedFround, bool allowI64) { switch (node[0]->getCString()[0]) { case 'n': { if (node[0] == NUM) { @@ -79,7 +79,7 @@ AsmType detectType(Ref node, AsmData *asmData, bool inVarDef, IString minifiedFr if (node[0] == UNARY_PREFIX) { switch (node[1]->getCString()[0]) { case '+': return ASM_DOUBLE; - case '-': return detectType(node[2], asmData, inVarDef, minifiedFround); + case '-': return detectType(node[2], asmData, inVarDef, minifiedFround, allowI64); case '!': case '~': return ASM_INT; } break; @@ -91,6 +91,7 @@ AsmType detectType(Ref node, AsmData *asmData, bool inVarDef, IString minifiedFr if (node[1][0] == NAME) { IString name = node[1][1]->getIString(); if (name == MATH_FROUND || name == minifiedFround) return ASM_FLOAT; + else if (allowI64 && (name == INT64 || name == INT64_CONST)) return ASM_INT64; else if (name == SIMD_FLOAT32X4 || name == SIMD_FLOAT32X4_CHECK) return ASM_FLOAT32X4; else if (name == SIMD_FLOAT64X2 || name == SIMD_FLOAT64X2_CHECK) return ASM_FLOAT64X2; else if (name == SIMD_INT8X16 || name == SIMD_INT8X16_CHECK) return ASM_INT8X16; @@ -99,7 +100,7 @@ AsmType detectType(Ref node, AsmData *asmData, bool inVarDef, IString minifiedFr } return ASM_NONE; } else if (node[0] == CONDITIONAL) { - return detectType(node[2], asmData, inVarDef, minifiedFround); + return detectType(node[2], asmData, inVarDef, minifiedFround, allowI64); } break; } @@ -107,7 +108,7 @@ AsmType detectType(Ref node, AsmData *asmData, bool inVarDef, IString minifiedFr if (node[0] == BINARY) { switch (node[1]->getCString()[0]) { case '+': case '-': - case '*': case '/': case '%': return detectType(node[2], asmData, inVarDef, minifiedFround); + case '*': case '/': case '%': return detectType(node[2], asmData, inVarDef, minifiedFround, allowI64); case '|': case '&': case '^': case '<': case '>': // handles <<, >>, >>=, <=, >= case '=': case '!': { // handles ==, != return ASM_INT; @@ -118,7 +119,7 @@ AsmType detectType(Ref node, AsmData *asmData, bool inVarDef, IString minifiedFr } case 's': { if (node[0] == SEQ) { - return detectType(node[2], asmData, inVarDef, minifiedFround); + return detectType(node[2], asmData, inVarDef, minifiedFround, allowI64); } else if (node[0] == SUB) { assert(node[1][0] == NAME); HeapInfo info = parseHeap(node[1][1]->getCString()); |