diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-07-20 21:15:29 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-07-20 21:15:29 -0700 |
commit | 94c3b3ce73670e928a7613228ac9049aa709ff9a (patch) | |
tree | e1264203aab930934a6dc58b84fe42a6671a2db5 /tools | |
parent | a5bb34ba04e1d17a59fda20f6a7e82c64f6ed6cc (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)
Diffstat (limited to 'tools')
-rw-r--r-- | tools/js-optimizer.js | 7 | ||||
-rw-r--r-- | tools/test-js-optimizer-asm-outline1-output.js | 63 | ||||
-rw-r--r-- | tools/test-js-optimizer-asm-outline2-output.js | 15 |
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; } |