diff options
-rw-r--r-- | tools/js-optimizer.js | 49 | ||||
-rw-r--r-- | tools/test-js-optimizer-asm-outline1-output.js | 42 | ||||
-rw-r--r-- | tools/test-js-optimizer-asm-outline1.js | 17 |
3 files changed, 84 insertions, 24 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 78439d61..db2941c9 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -3220,9 +3220,10 @@ function outline(ast) { var newFunc = ['defun', newIdent, ['sp'], code]; var newAsmData = { params: { sp: ASM_INT }, vars: {} }; for (var v in codeInfo.reads) { - newAsmData.vars[v] = getAsmType(asmData, v); + if (v != 'sp') newAsmData.vars[v] = getAsmType(asmData, v); } for (var v in codeInfo.writes) { + assert(v != 'sp'); newAsmData.vars[v] = getAsmType(asmData, v); } denormalizeAsm(newFunc, newAsmData); @@ -3313,12 +3314,12 @@ function outline(ast) { traverse(stats, function(node, type) { if (type === 'assign' && node[2][0] === 'name' && node[2][1] === 'STACKTOP') { var value = node[3]; - assert(value[0] == 'binary' && value[1] == '|' && value[2][0] == 'name' && value[2][1] == 'STACKTOP' && value[3][0] == 'num'); - value[3][1] += extraSpace; + assert(value[0] == 'binary' && value[1] == '|' && value[2][0] == 'binary' && value[2][1] == '+' && value[2][2][0] == 'name' && value[2][2][1] == 'STACKTOP' && value[2][3][0] == 'num'); + value[2][3][1] += extraSpace; return true; } }); - } else { + } else if (!('sp' in asmData.params)) { // if sp is a param, then we are an outlined function, no need to add stack support for us // add sp variable and stack bump var index = getFirstIndexInNormalized(func, asmData); stats.splice(index, 0, @@ -3326,28 +3327,28 @@ function outline(ast) { ['stat', makeAssign(['name', 'STACKTOP'], ['binary', '|', ['binary', '+', ['name', 'STACKTOP'], ['num', extraSpace]], ['num', 0]])] ); asmData.vars.sp = ASM_INT; // no need to add to vars, we are about to denormalize anyhow - } - // pop the stack in returns - function makePop() { - return ['stat', makeAssign(['name', 'STACKTOP'], ['name', 'sp'])]; - } - traverse(func, function(node, type) { - var stats = getStatements(node); - if (!stats) return; - for (var i = 0; i < stats.length; i++) { - var subNode = stats[i]; - if (subNode[0] === 'stat') subNode = subNode[1]; - if (subNode[0] == 'return') { - stats.splice(i, 0, makePop()); - i++; + // we added sp, so we must add stack popping + function makePop() { + return ['stat', makeAssign(['name', 'STACKTOP'], ['name', 'sp'])]; + } + traverse(func, function(node, type) { + var stats = getStatements(node); + if (!stats) return; + for (var i = 0; i < stats.length; i++) { + var subNode = stats[i]; + if (subNode[0] === 'stat') subNode = subNode[1]; + if (subNode[0] == 'return') { + stats.splice(i, 0, makePop()); + i++; + } } + }); + // pop the stack at the end if there is not a return + var last = stats[stats.length-1]; + if (last[0] === 'stat') last = last[1]; + if (last[0] !== 'return') { + stats.push(makePop()); } - }); - // pop the stack at the end if there is not a return - var last = stats[stats.length-1]; - if (last[0] === 'stat') last = last[1]; - if (last[0] !== 'return') { - stats.push(makePop()); } } } diff --git a/tools/test-js-optimizer-asm-outline1-output.js b/tools/test-js-optimizer-asm-outline1-output.js index d279a045..04a4d3e8 100644 --- a/tools/test-js-optimizer-asm-outline1-output.js +++ b/tools/test-js-optimizer-asm-outline1-output.js @@ -193,6 +193,24 @@ function vars4(x, y) { b = HEAPF32[sp + 24 >> 2]; STACKTOP = sp; } +function vars_w_stack(x, y) { + x = x | 0; + y = +y; + var a = 0, b = +0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 72 | 0; + a = x + y; + HEAPF32[sp + 8 >> 2] = y; + HEAP32[sp + 0 >> 2] = x; + HEAP32[sp + 16 >> 2] = a; + vars_w_stack$1(sp); + b = HEAPF32[sp + 24 >> 2]; + a = HEAP32[sp + 16 >> 2]; + HEAP32[sp + 16 >> 2] = a; + vars_w_stack$0(sp); + a = HEAP32[sp + 16 >> 2]; + b = HEAPF32[sp + 24 >> 2]; +} function lin$0(sp) { sp = sp | 0; c(13); @@ -422,4 +440,28 @@ function vars4$1(sp) { HEAPF32[sp + 24 >> 2] = y * x; HEAP32[sp + 16 >> 2] = a; } +function vars_w_stack$0(sp) { + sp = sp | 0; + var a = 0, b = +0; + a = HEAP32[sp + 16 >> 2]; + a = c(4 + a); + a = c(5 + a); + a = c(6 + a); + b = c(7 + a); + STACKTOP = sp; + HEAP32[sp + 16 >> 2] = a; + HEAPF32[sp + 24 >> 2] = b; +} +function vars_w_stack$1(sp) { + sp = sp | 0; + var y = +0, x = 0, a = 0; + a = HEAP32[sp + 16 >> 2]; + x = HEAP32[sp + 0 >> 2]; + y = HEAPF32[sp + 8 >> 2]; + a = c(1 + a); + a = c(2 + a); + a = c(3 + a); + HEAPF32[sp + 24 >> 2] = y * x; + HEAP32[sp + 16 >> 2] = a; +} diff --git a/tools/test-js-optimizer-asm-outline1.js b/tools/test-js-optimizer-asm-outline1.js index 09cb2839..0c4b205a 100644 --- a/tools/test-js-optimizer-asm-outline1.js +++ b/tools/test-js-optimizer-asm-outline1.js @@ -213,5 +213,22 @@ function vars4(x, y) { a = c(6+a); b = c(7+a+x); } +function vars_w_stack(x, y) { + x = x | 0; + y = +y; + var a = 0, b = +0, sp = 0; + sp = STACKTOP; + STACKTOP = STACKTOP + 16 | 0; + a = x+y; + b = y*x; + a = c(1+a); + a = c(2+a); + a = c(3+a); + a = c(4+a); + a = c(5+a); + a = c(6+a); + b = c(7+a); + STACKTOP = sp; +} // EMSCRIPTEN_GENERATED_FUNCTIONS // EXTRA_INFO: { "sizeToOutline": 30 } |