aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tools/js-optimizer.js49
-rw-r--r--tools/test-js-optimizer-asm-outline1-output.js42
-rw-r--r--tools/test-js-optimizer-asm-outline1.js17
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 }