diff options
author | Alon Zakai <alonzakai@gmail.com> | 2012-12-05 18:58:30 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2012-12-07 14:23:23 -0800 |
commit | 0d1f1ce225293a3683e87447bcc787cf2da8d7bd (patch) | |
tree | b1e18fe06b54a88c1f0d3d7e4122d62fcfe6aac6 /src/analyzer.js | |
parent | 94ca29f86bf44bd7b072113093625e079266ae93 (diff) |
legalize insertvalue
Diffstat (limited to 'src/analyzer.js')
-rw-r--r-- | src/analyzer.js | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/src/analyzer.js b/src/analyzer.js index cbede04e..bfb2dd7b 100644 --- a/src/analyzer.js +++ b/src/analyzer.js @@ -121,7 +121,7 @@ function analyzer(data, sidePass) { // Legalization if (USE_TYPED_ARRAYS == 2) { function getLegalVars(base, bits) { - assert(!isNumber(base)); + if (isNumber(base)) return getLegalLiterals(base, bits); var ret = new Array(Math.ceil(bits/32)); var i = 0; while (bits > 0) { @@ -463,6 +463,23 @@ function analyzer(data, sidePass) { i++; continue; } + case 'insertvalue': { + bits = getBits(value.type); + var toAdd = []; + var elements = getLegalVars(item.assignTo, bits); + var sourceElements = getLegalVars(item.ident, bits); + var modifiedIndex = value.indexes[0][0].text; + for (var j = 0; j < elements.length; j++) { + toAdd.push({ + intertype: 'value', + assignTo: elements[j].ident, + type: 'i' + elements[j].bits, + ident: j == modifiedIndex ? item.value.ident : sourceElements[j].ident + }); + } + i += removeAndAdd(label.lines, i, toAdd); + continue; + } case 'bitcast': { var inType = item.type2; var outType = item.type; |