aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xtests/runner.py2
-rw-r--r--tools/js-optimizer.js18
-rw-r--r--tools/test-js-optimizer-asm-regs-output.js15
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;
}