diff options
Diffstat (limited to 'src/emscripten-optimizer')
-rw-r--r-- | src/emscripten-optimizer/optimizer-shared.cpp | 11 | ||||
-rw-r--r-- | src/emscripten-optimizer/optimizer.h | 3 | ||||
-rw-r--r-- | src/emscripten-optimizer/parser.cpp | 2 | ||||
-rw-r--r-- | src/emscripten-optimizer/parser.h | 12 |
4 files changed, 20 insertions, 8 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()); diff --git a/src/emscripten-optimizer/optimizer.h b/src/emscripten-optimizer/optimizer.h index 684fc0164..dc73962c5 100644 --- a/src/emscripten-optimizer/optimizer.h +++ b/src/emscripten-optimizer/optimizer.h @@ -49,12 +49,13 @@ enum AsmType { ASM_INT8X16, ASM_INT16X8, ASM_INT32X4, + ASM_INT64, // non-asm.js ASM_NONE // number of types }; struct AsmData; -AsmType detectType(cashew::Ref node, AsmData *asmData=nullptr, bool inVarDef=false, cashew::IString minifiedFround=cashew::IString()); +AsmType detectType(cashew::Ref node, AsmData *asmData=nullptr, bool inVarDef=false, cashew::IString minifiedFround=cashew::IString(), bool allowI64=false); struct AsmData { struct Local { diff --git a/src/emscripten-optimizer/parser.cpp b/src/emscripten-optimizer/parser.cpp index ef2891941..064c0efcf 100644 --- a/src/emscripten-optimizer/parser.cpp +++ b/src/emscripten-optimizer/parser.cpp @@ -54,6 +54,8 @@ IString TOPLEVEL("toplevel"), UNARY_PREFIX("unary-prefix"), UNARY_POSTFIX("unary-postfix"), MATH_FROUND("Math_fround"), + INT64("i64"), + INT64_CONST("i64_const"), SIMD_FLOAT32X4("SIMD_Float32x4"), SIMD_FLOAT64X2("SIMD_Float64x2"), SIMD_INT8X16("SIMD_Int8x16"), diff --git a/src/emscripten-optimizer/parser.h b/src/emscripten-optimizer/parser.h index 9429ff87f..060b71272 100644 --- a/src/emscripten-optimizer/parser.h +++ b/src/emscripten-optimizer/parser.h @@ -69,6 +69,8 @@ extern IString TOPLEVEL, UNARY_PREFIX, UNARY_POSTFIX, MATH_FROUND, + INT64, + INT64_CONST, SIMD_FLOAT32X4, SIMD_FLOAT64X2, SIMD_INT8X16, @@ -549,8 +551,8 @@ class Parser { if (value.isNumber()) { arg = parseFrag(value); src += value.size; - } else { - assert(value.type == OPERATOR); + } else if (value.type == OPERATOR) { + // negative number assert(value.str == MINUS); src += value.size; skipSpace(src); @@ -558,6 +560,12 @@ class Parser { assert(value2.isNumber()); arg = Builder::makePrefix(MINUS, parseFrag(value2)); src += value2.size; + } else { + // identifier and function call + assert(value.type == IDENT); + src += value.size; + skipSpace(src); + arg = parseCall(parseFrag(value), src); } Builder::appendCaseToSwitch(ret, arg); skipSpace(src); |