diff options
author | Alon Zakai <alonzakai@gmail.com> | 2012-12-05 16:38:32 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2012-12-07 14:23:23 -0800 |
commit | 3b285840597c19062b03ff72230d43c6e8f947b6 (patch) | |
tree | 52c4f3c118acb85e720b3c2c5f58b9935fdb1d1f /src/analyzer.js | |
parent | b6466081c6023181cdbfc3421c78966edfdf7c44 (diff) |
start to legalize structural return values into one direct return plus the rest in globals
Diffstat (limited to 'src/analyzer.js')
-rw-r--r-- | src/analyzer.js | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/src/analyzer.js b/src/analyzer.js index 751c0970..6f9bf44a 100644 --- a/src/analyzer.js +++ b/src/analyzer.js @@ -294,7 +294,7 @@ function analyzer(data, sidePass) { i += removeAndAdd(label.lines, i, toAdd); continue; } - // call, return: Return value is in an unlegalized array literal. Not fully optimal. + // call, return: Return the first 32 bits, the rest are in temp case 'call': { bits = getBits(value.type); var elements = getLegalVars(item.assignTo, bits); @@ -303,15 +303,17 @@ function analyzer(data, sidePass) { legalizeFunctionParameters(value.params); if (value.assignTo) { // legalize return value - var j = 0; - toAdd = toAdd.concat(elements.map(function(element) { - return { + value.assignTo = elements[0].ident; + for (var j = 1; j < elements.length; j++) { + var element = elements[j]; + toAdd.push({ intertype: 'value', assignTo: element.ident, - type: 'i' + bits, - ident: value.assignTo + '[' + (j++) + ']' - }; - })); + type: element.bits, + ident: 'tempRet' + (j++) + }); + assert(j<10); // TODO: dynamically create more than 10 tempRet-s + } } i += removeAndAdd(label.lines, i, toAdd); continue; |