aboutsummaryrefslogtreecommitdiff
path: root/src/analyzer.js
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2012-12-05 16:38:32 -0800
committerAlon Zakai <alonzakai@gmail.com>2012-12-07 14:23:23 -0800
commit3b285840597c19062b03ff72230d43c6e8f947b6 (patch)
tree52c4f3c118acb85e720b3c2c5f58b9935fdb1d1f /src/analyzer.js
parentb6466081c6023181cdbfc3421c78966edfdf7c44 (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.js18
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;