diff options
author | Alon Zakai <alonzakai@gmail.com> | 2012-12-04 18:29:59 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2012-12-07 14:23:23 -0800 |
commit | 28fbac595bf2aca4002ef6d784ffcb6906093bd3 (patch) | |
tree | 8f436234e2cab5bd4c1829f6cddc3d0aa0110591 /tools/js-optimizer.js | |
parent | 01abee3ccd7d32f16ab0fc792c29652a8d8daed9 (diff) |
registerizeAsm
Diffstat (limited to 'tools/js-optimizer.js')
-rw-r--r-- | tools/js-optimizer.js | 18 |
1 files changed, 13 insertions, 5 deletions
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); } |