aboutsummaryrefslogtreecommitdiff
path: root/src/analyzer.js
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2012-12-05 18:58:30 -0800
committerAlon Zakai <alonzakai@gmail.com>2012-12-07 14:23:23 -0800
commit0d1f1ce225293a3683e87447bcc787cf2da8d7bd (patch)
treeb1e18fe06b54a88c1f0d3d7e4122d62fcfe6aac6 /src/analyzer.js
parent94ca29f86bf44bd7b072113093625e079266ae93 (diff)
legalize insertvalue
Diffstat (limited to 'src/analyzer.js')
-rw-r--r--src/analyzer.js19
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;