aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2013-07-20 21:15:29 -0700
committerAlon Zakai <alonzakai@gmail.com>2013-07-20 21:15:29 -0700
commit94c3b3ce73670e928a7613228ac9049aa709ff9a (patch)
treee1264203aab930934a6dc58b84fe42a6671a2db5
parenta5bb34ba04e1d17a59fda20f6a7e82c64f6ed6cc (diff)
allow sp to be modified in outlined code, by changing the model to where outlined code returns sp (which also parallels that we sent it as the single parameter)
-rw-r--r--tools/js-optimizer.js7
-rw-r--r--tools/test-js-optimizer-asm-outline1-output.js63
-rw-r--r--tools/test-js-optimizer-asm-outline2-output.js15
3 files changed, 56 insertions, 29 deletions
diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js
index 810edd46..eec384a4 100644
--- a/tools/js-optimizer.js
+++ b/tools/js-optimizer.js
@@ -3144,7 +3144,7 @@ function outline(ast) {
reps.push(['stat', ['assign', true, ['sub', ['name', getAsmType(v, asmData) == ASM_INT ? 'HEAP32' : 'HEAPF32'], ['binary', '>>', ['binary', '+', ['name', 'sp'], ['num', asmData.stackPos[v]]], ['num', '2']]], ['name', v]]]);
}
});
- reps.push(['stat', ['call', ['name', newIdent], [['name', 'sp']]]]);
+ reps.push(['stat', ['assign', true, ['name', 'sp'], makeAsmCoercion(['call', ['name', newIdent], [['name', 'sp']]], ASM_INT)]]);
for (var v in codeInfo.writes) {
if (!(v in owned)) {
reps.push(['stat', ['assign', true, ['name', v], makeAsmCoercion(['sub', ['name', getAsmType(v, asmData) == ASM_INT ? 'HEAP32' : 'HEAPF32'], ['binary', '>>', ['binary', '+', ['name', 'sp'], ['num', asmData.stackPos[v]]], ['num', '2']]], getAsmType(v, asmData))]]);
@@ -3278,6 +3278,8 @@ function outline(ast) {
code.push(['stat', ['assign', true, ['sub', ['name', getAsmType(v, asmData) == ASM_INT ? 'HEAP32' : 'HEAPF32'], ['binary', '>>', ['binary', '+', ['name', 'sp'], ['num', asmData.stackPos[v]]], ['num', '2']]], ['name', v]]]);
}
}
+ // add final return of sp. the model is that we send sp as the single param, and get it back out
+ code.push(['stat', ['return', makeAsmCoercion(['name', 'sp'], ASM_INT)]]);
// finalize
var newFunc = ['defun', newIdent, ['sp'], code];
var newAsmData = { params: { sp: ASM_INT }, vars: {} };
@@ -3285,8 +3287,7 @@ function outline(ast) {
if (v != 'sp') newAsmData.vars[v] = getAsmType(v, asmData);
}
for (var v in codeInfo.writes) {
- assert(v != 'sp');
- newAsmData.vars[v] = getAsmType(v, asmData);
+ if (v != 'sp') newAsmData.vars[v] = getAsmType(v, asmData);
}
denormalizeAsm(newFunc, newAsmData);
for (var v in owned) {
diff --git a/tools/test-js-optimizer-asm-outline1-output.js b/tools/test-js-optimizer-asm-outline1-output.js
index d3f469ef..2e5dfe48 100644
--- a/tools/test-js-optimizer-asm-outline1-output.js
+++ b/tools/test-js-optimizer-asm-outline1-output.js
@@ -8,10 +8,10 @@ function lin() {
c(4);
HEAP32[sp + 0 >> 2] = 0;
HEAP32[sp + 8 >> 2] = 0;
- lin$1(sp);
+ sp = lin$1(sp) | 0;
HEAP32[sp + 0 >> 2] = 0;
HEAP32[sp + 8 >> 2] = 0;
- lin$0(sp);
+ sp = lin$0(sp) | 0;
STACKTOP = sp;
}
function lin2() {
@@ -25,10 +25,10 @@ function lin2() {
c(4);
HEAP32[sp + 0 >> 2] = 0;
HEAP32[sp + 8 >> 2] = 0;
- lin2$1(sp);
+ sp = lin2$1(sp) | 0;
HEAP32[sp + 0 >> 2] = 0;
HEAP32[sp + 8 >> 2] = 0;
- lin2$0(sp);
+ sp = lin2$0(sp) | 0;
}
STACKTOP = sp;
}
@@ -44,10 +44,10 @@ function lin3() {
c(5);
HEAP32[sp + 0 >> 2] = 0;
HEAP32[sp + 8 >> 2] = 0;
- lin3$1(sp);
+ sp = lin3$1(sp) | 0;
HEAP32[sp + 0 >> 2] = 0;
HEAP32[sp + 8 >> 2] = 0;
- lin3$0(sp);
+ sp = lin3$0(sp) | 0;
if ((HEAP32[sp + 0 >> 2] | 0) == 6) {
STACKTOP = sp;
return HEAP32[sp + 8 >> 2] | 0;
@@ -67,10 +67,10 @@ function lin4() {
c(4);
HEAP32[sp + 0 >> 2] = 0;
HEAP32[sp + 8 >> 2] = 0;
- lin4$1(sp);
+ sp = lin4$1(sp) | 0;
HEAP32[sp + 0 >> 2] = 0;
HEAP32[sp + 8 >> 2] = 0;
- lin4$0(sp);
+ sp = lin4$0(sp) | 0;
if ((HEAP32[sp + 0 >> 2] | 0) == 1) {
break;
}
@@ -89,10 +89,10 @@ function lin5() {
c(4);
HEAP32[sp + 0 >> 2] = 0;
HEAP32[sp + 8 >> 2] = 0;
- lin5$1(sp);
+ sp = lin5$1(sp) | 0;
HEAP32[sp + 0 >> 2] = 0;
HEAP32[sp + 8 >> 2] = 0;
- lin5$0(sp);
+ sp = lin5$0(sp) | 0;
if ((HEAP32[sp + 0 >> 2] | 0) == 3) {
continue;
}
@@ -114,10 +114,10 @@ function mix() {
c(7);
HEAP32[sp + 0 >> 2] = 0;
HEAP32[sp + 8 >> 2] = 0;
- mix$1(sp);
+ sp = mix$1(sp) | 0;
HEAP32[sp + 0 >> 2] = 0;
HEAP32[sp + 8 >> 2] = 0;
- mix$0(sp);
+ sp = mix$0(sp) | 0;
if ((HEAP32[sp + 0 >> 2] | 0) == 1) {
break;
}
@@ -150,12 +150,12 @@ function vars(x, y) {
HEAP32[sp + 24 >> 2] = 0;
HEAP32[sp + 0 >> 2] = x;
HEAPF32[sp + 8 >> 2] = y;
- vars$1(sp);
+ sp = vars$1(sp) | 0;
HEAP32[sp + 16 >> 2] = 0;
HEAP32[sp + 24 >> 2] = 0;
HEAP32[sp + 0 >> 2] = x;
HEAPF32[sp + 8 >> 2] = y;
- vars$0(sp);
+ sp = vars$0(sp) | 0;
STACKTOP = sp;
}
function vars2(x, y) {
@@ -172,7 +172,7 @@ function vars2(x, y) {
HEAP32[sp + 40 >> 2] = 0;
HEAP32[sp + 16 >> 2] = a;
HEAPF32[sp + 24 >> 2] = b;
- vars2$0(sp);
+ sp = vars2$0(sp) | 0;
a = HEAP32[sp + 16 >> 2] | 0;
b = +HEAPF32[sp + 24 >> 2];
STACKTOP = sp;
@@ -188,14 +188,14 @@ function vars3(x, y) {
HEAP32[sp + 16 >> 2] = a;
HEAP32[sp + 0 >> 2] = x;
HEAPF32[sp + 8 >> 2] = y;
- vars3$1(sp);
+ sp = vars3$1(sp) | 0;
a = HEAP32[sp + 16 >> 2] | 0;
HEAP32[sp + 24 >> 2] = 0;
HEAP32[sp + 32 >> 2] = 0;
HEAP32[sp + 16 >> 2] = a;
HEAPF32[sp + 8 >> 2] = y;
HEAP32[sp + 0 >> 2] = x;
- vars3$0(sp);
+ sp = vars3$0(sp) | 0;
a = HEAP32[sp + 16 >> 2] | 0;
STACKTOP = sp;
}
@@ -212,7 +212,7 @@ function vars4(x, y) {
HEAP32[sp + 0 >> 2] = x;
HEAP32[sp + 16 >> 2] = a;
HEAPF32[sp + 24 >> 2] = b;
- vars4$1(sp);
+ sp = vars4$1(sp) | 0;
b = +HEAPF32[sp + 24 >> 2];
a = HEAP32[sp + 16 >> 2] | 0;
HEAP32[sp + 32 >> 2] = 0;
@@ -220,7 +220,7 @@ function vars4(x, y) {
HEAP32[sp + 16 >> 2] = a;
HEAP32[sp + 0 >> 2] = x;
HEAPF32[sp + 24 >> 2] = b;
- vars4$0(sp);
+ sp = vars4$0(sp) | 0;
a = HEAP32[sp + 16 >> 2] | 0;
b = +HEAPF32[sp + 24 >> 2];
STACKTOP = sp;
@@ -238,14 +238,14 @@ function vars_w_stack(x, y) {
HEAP32[sp + 16 >> 2] = x;
HEAP32[sp + 32 >> 2] = a;
HEAPF32[sp + 40 >> 2] = b;
- vars_w_stack$1(sp);
+ sp = vars_w_stack$1(sp) | 0;
b = +HEAPF32[sp + 40 >> 2];
a = HEAP32[sp + 32 >> 2] | 0;
HEAP32[sp + 56 >> 2] = 0;
HEAP32[sp + 64 >> 2] = 0;
HEAP32[sp + 32 >> 2] = a;
HEAPF32[sp + 40 >> 2] = b;
- vars_w_stack$0(sp);
+ sp = vars_w_stack$0(sp) | 0;
a = HEAP32[sp + 32 >> 2] | 0;
b = +HEAPF32[sp + 40 >> 2];
}
@@ -259,6 +259,7 @@ function lin$0(sp) {
c(18);
c(19);
c(20);
+ return sp | 0;
}
function lin$1(sp) {
sp = sp | 0;
@@ -270,6 +271,7 @@ function lin$1(sp) {
c(10);
c(11);
c(12);
+ return sp | 0;
}
function lin2$0(sp) {
sp = sp | 0;
@@ -281,6 +283,7 @@ function lin2$0(sp) {
c(18);
c(19);
c(20);
+ return sp | 0;
}
function lin2$1(sp) {
sp = sp | 0;
@@ -292,6 +295,7 @@ function lin2$1(sp) {
c(10);
c(11);
c(12);
+ return sp | 0;
}
function lin3$0(sp) {
sp = sp | 0;
@@ -307,6 +311,7 @@ function lin3$0(sp) {
HEAP32[sp + 8 >> 2] = 10;
break OL;
} while (0);
+ return sp | 0;
}
function lin3$1(sp) {
sp = sp | 0;
@@ -318,6 +323,7 @@ function lin3$1(sp) {
c(11);
c(12);
c(13);
+ return sp | 0;
}
function lin4$0(sp) {
sp = sp | 0;
@@ -333,6 +339,7 @@ function lin4$0(sp) {
HEAP32[sp + 0 >> 2] = 1;
break OL;
} while (0);
+ return sp | 0;
}
function lin4$1(sp) {
sp = sp | 0;
@@ -344,6 +351,7 @@ function lin4$1(sp) {
c(10);
c(11);
c(12);
+ return sp | 0;
}
function lin5$0(sp) {
sp = sp | 0;
@@ -359,6 +367,7 @@ function lin5$0(sp) {
HEAP32[sp + 0 >> 2] = 3;
break OL;
} while (0);
+ return sp | 0;
}
function lin5$1(sp) {
sp = sp | 0;
@@ -370,6 +379,7 @@ function lin5$1(sp) {
c(10);
c(11);
c(12);
+ return sp | 0;
}
function mix$0(sp) {
sp = sp | 0;
@@ -396,6 +406,7 @@ function mix$0(sp) {
HEAP32[sp + 8 >> 2] = 3;
break OL;
} while (0);
+ return sp | 0;
}
function mix$1(sp) {
sp = sp | 0;
@@ -407,6 +418,7 @@ function mix$1(sp) {
c(13);
c(14);
c(15);
+ return sp | 0;
}
function vars$0(sp) {
sp = sp | 0;
@@ -417,6 +429,7 @@ function vars$0(sp) {
c(6 + y * x);
c(7 + (x + y));
c(8 + y * x);
+ return sp | 0;
}
function vars$1(sp) {
sp = sp | 0;
@@ -427,6 +440,7 @@ function vars$1(sp) {
c(2 + y * x);
c(3 + (x + y));
c(4 + y * x);
+ return sp | 0;
}
function vars2$0(sp) {
sp = sp | 0;
@@ -439,6 +453,7 @@ function vars2$0(sp) {
b = c(6 + b);
HEAP32[sp + 16 >> 2] = a;
HEAPF32[sp + 24 >> 2] = b;
+ return sp | 0;
}
function vars3$0(sp) {
sp = sp | 0;
@@ -451,6 +466,7 @@ function vars3$0(sp) {
a = c(6 + y * x);
a = c(7 + a);
HEAP32[sp + 16 >> 2] = a;
+ return sp | 0;
}
function vars3$1(sp) {
sp = sp | 0;
@@ -463,6 +479,7 @@ function vars3$1(sp) {
a = c(2 + y * x);
a = c(3 + a);
HEAP32[sp + 16 >> 2] = a;
+ return sp | 0;
}
function vars4$0(sp) {
sp = sp | 0;
@@ -476,6 +493,7 @@ function vars4$0(sp) {
b = c(7 + a + x);
HEAP32[sp + 16 >> 2] = a;
HEAPF32[sp + 24 >> 2] = b;
+ return sp | 0;
}
function vars4$1(sp) {
sp = sp | 0;
@@ -490,6 +508,7 @@ function vars4$1(sp) {
a = c(3 + a);
HEAPF32[sp + 24 >> 2] = b;
HEAP32[sp + 16 >> 2] = a;
+ return sp | 0;
}
function vars_w_stack$0(sp) {
sp = sp | 0;
@@ -503,6 +522,7 @@ function vars_w_stack$0(sp) {
STACKTOP = sp;
HEAP32[sp + 32 >> 2] = a;
HEAPF32[sp + 40 >> 2] = b;
+ return sp | 0;
}
function vars_w_stack$1(sp) {
sp = sp | 0;
@@ -517,5 +537,6 @@ function vars_w_stack$1(sp) {
a = c(3 + a);
HEAPF32[sp + 40 >> 2] = b;
HEAP32[sp + 32 >> 2] = a;
+ return sp | 0;
}
diff --git a/tools/test-js-optimizer-asm-outline2-output.js b/tools/test-js-optimizer-asm-outline2-output.js
index f3ab307d..7de41008 100644
--- a/tools/test-js-optimizer-asm-outline2-output.js
+++ b/tools/test-js-optimizer-asm-outline2-output.js
@@ -13,10 +13,10 @@ function linear() {
cheez(1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0);
HEAP32[sp + 0 >> 2] = 0;
HEAP32[sp + 8 >> 2] = 0;
- linear$1(sp);
+ sp = linear$1(sp) | 0;
HEAP32[sp + 0 >> 2] = 0;
HEAP32[sp + 8 >> 2] = 0;
- linear$0(sp);
+ sp = linear$0(sp) | 0;
STACKTOP = sp;
}
function _free($mem) {
@@ -57,7 +57,7 @@ function _free($mem) {
HEAP32[sp + 8 >> 2] = $5;
HEAP32[sp + 216 >> 2] = $p_0;
HEAP32[sp + 208 >> 2] = $psize_0;
- _free$1(sp);
+ sp = _free$1(sp) | 0;
$p_0 = HEAP32[sp + 216 >> 2] | 0;
$psize_0 = HEAP32[sp + 208 >> 2] | 0;
if ((HEAP32[sp + 632 >> 2] | 0) == 5) {
@@ -94,7 +94,7 @@ function _free($mem) {
HEAP32[sp + 224 >> 2] = $189;
HEAP32[sp + 0 >> 2] = $mem;
HEAP32[sp + 16 >> 2] = $10;
- _free$2(sp);
+ sp = _free$2(sp) | 0;
if ((HEAP32[sp + 632 >> 2] | 0) == 5) {
return;
}
@@ -114,6 +114,7 @@ function linear$0(sp) {
cheez(1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0);
cheez(1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0);
cheez(1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0);
+ return sp | 0;
}
function linear$1(sp) {
sp = sp | 0;
@@ -130,6 +131,7 @@ function linear$1(sp) {
cheez(1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0);
cheez(1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0);
cheez(1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0);
+ return sp | 0;
}
function _free$0(sp) {
sp = sp | 0;
@@ -317,6 +319,7 @@ function _free$0(sp) {
break OL;
} while (0);
HEAP32[sp + 416 >> 2] = $psize_1;
+ return sp | 0;
}
function _free$1(sp) {
sp = sp | 0;
@@ -520,6 +523,7 @@ function _free$1(sp) {
} while (0);
HEAP32[sp + 216 >> 2] = $p_0;
HEAP32[sp + 208 >> 2] = $psize_0;
+ return sp | 0;
}
function _free$2(sp) {
sp = sp | 0;
@@ -561,7 +565,7 @@ function _free$2(sp) {
HEAP32[sp + 0 >> 2] = $mem;
HEAP32[sp + 16 >> 2] = $10;
HEAP32[sp + 416 >> 2] = $psize_1;
- _free$0(sp);
+ sp = _free$0(sp) | 0;
$psize_1 = HEAP32[sp + 416 >> 2] | 0;
if ((HEAP32[sp + 632 >> 2] | 0) == 5) {
HEAP32[sp + 632 >> 2] = 5;
@@ -702,5 +706,6 @@ function _free$2(sp) {
HEAP32[sp + 632 >> 2] = 5;
break OL;
} while (0);
+ return sp | 0;
}