diff options
-rwxr-xr-x | tests/runner.py | 2 | ||||
-rw-r--r-- | tools/js-optimizer.js | 18 | ||||
-rw-r--r-- | tools/test-js-optimizer-asm-regs-output.js | 15 |
3 files changed, 22 insertions, 13 deletions
diff --git a/tests/runner.py b/tests/runner.py index 4c698de3..a537f227 100755 --- a/tests/runner.py +++ b/tests/runner.py @@ -8566,6 +8566,8 @@ f.close() ['eliminateMemSafe']), (path_from_root('tools', 'eliminator', 'asm-eliminator-test.js'), open(path_from_root('tools', 'eliminator', 'asm-eliminator-test-output.js')).read(), ['eliminateAsm']), + (path_from_root('tools', 'test-js-optimizer-asm-regs.js'), open(path_from_root('tools', 'test-js-optimizer-asm-regs-output.js')).read(), + ['registerizeAsm']), ]: output = Popen([NODE_JS, path_from_root('tools', 'js-optimizer.js'), input] + passes, stdin=PIPE, stdout=PIPE).communicate()[0] self.assertIdentical(expected, output.replace('\r\n', '\n').replace('\n\n', '\n')) diff --git a/tools/js-optimizer.js b/tools/js-optimizer.js index 151bac22..a00f1aec 100644 --- a/tools/js-optimizer.js +++ b/tools/js-optimizer.js @@ -1390,7 +1390,7 @@ function registerize(ast, asm) { // we just use a fresh register to make sure we avoid this, but it could be // optimized to check for safe registers (free, and not used in this loop level). var varRegs = {}; // maps variables to the register they will use all their life - var freeRegs = []; + var freeRegsClasses = asm ? [[], []] : []; // two classes for asm, one otherwise var nextReg = 1; var fullNames = {}; var loopRegs = {}; // for each loop nesting level, the list of bound variables @@ -1402,6 +1402,7 @@ function registerize(ast, asm) { if (!varUses[name]) return false; // no uses left, or not a relevant variable if (optimizables[name]) activeOptimizables[name] = 1; var reg = varRegs[name]; + var freeRegs = asm ? freeRegsClasses[asmData.vars[name]] : freeRegsClasses; if (!reg) { // acquire register if (optimizables[name] && freeRegs.length > 0) { @@ -1409,7 +1410,7 @@ function registerize(ast, asm) { saved++; } else { reg = nextReg++; - fullNames[reg] = 'r' + reg; // TODO: even smaller names + fullNames[reg] = (asm ? (asmData.vars[name] ? 'd' : 'i') : 'r') + reg; // TODO: even smaller names } varRegs[name] = reg; } @@ -1450,8 +1451,14 @@ function registerize(ast, asm) { if (type in LOOP) { // Free registers that were locked to this loop if (loopRegs[loops]) { - freeRegs = freeRegs.concat(loopRegs[loops]); - loopRegs[loops] = []; + if (asm) { + loopRegs[loops].forEach(function(loopReg) { + freeRegsClasses[asmData.vars[loopReg]].push(loopReg); + }); + } else { + freeRegsClasses = freeRegsClasses.concat(loopRegs[loops]); + } + loopRegs[loops].length = 0; } loops--; } @@ -1471,7 +1478,8 @@ function registerize(ast, asm) { vars: {}, }; for (var i = 1; i < nextReg; i++) { - finalAsmData.vars['r' + i] = ASM_DOUBLE; // XXX split into register classes + var reg = fullNames[i]; + finalAsmData.vars[reg] = reg[0] == 'i' ? ASM_INT : ASM_DOUBLE; } denormalizeAsm(fun, finalAsmData); } diff --git a/tools/test-js-optimizer-asm-regs-output.js b/tools/test-js-optimizer-asm-regs-output.js index a746b8d8..299db727 100644 --- a/tools/test-js-optimizer-asm-regs-output.js +++ b/tools/test-js-optimizer-asm-regs-output.js @@ -1,13 +1,12 @@ function asm(x, y) { x = +x; y = y | 0; - var i1 = 0, i2 = 0; - var d1 = +0, d2 = +0; - i1 = (x+x)|0; - d1 = d(); - i2 = (i+2)|0; - print(i); - d2 = d1*5; - return d2; + var i1 = 0, d2 = +0, i3 = 0, d4 = +0; + i1 = x + x | 0; + d2 = d(); + i3 = i1 + 2 | 0; + print(i3); + d4 = d2 * 5; + return d4; } |