aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/jsifier.js20
-rw-r--r--src/parseTools.js5
2 files changed, 22 insertions, 3 deletions
diff --git a/src/jsifier.js b/src/jsifier.js
index c8e2e7cc..c18b4f59 100644
--- a/src/jsifier.js
+++ b/src/jsifier.js
@@ -1362,12 +1362,26 @@ function JSify(data, functionsOnly, givenFunctions) {
}
function insertelementHandler(item) {
var base = getVectorBaseType(item.type);
- var ident = item.ident;
- if (ident == 0) ident = base + '32x4.zero()';
+ var ident = ensureVector(item.ident, base);
return ident + '.with' + SIMDLane[finalizeLLVMParameter(item.index)] + '(' + finalizeLLVMParameter(item.value) + ')';
}
function shufflevectorHandler(item) {
- return 'TODO';
+ var base = getVectorBaseType(item.type);
+ var first = ensureVector(item.ident, base);
+ var second = ensureVector(finalizeLLVMParameter(item.value), base);
+ var mask;
+ if (item.mask.intertype === 'value') {
+ assert(item.mask.ident === 'zeroinitializer');
+ mask = [0, 0, 0, 0];
+ } else {
+ assert(item.mask.intertype === 'vector');
+ mask = item.mask.idents;
+ }
+ for (var i = 0; i < 4; i++) assert(mask[0] == 0 || mask == 1);
+ i = 0;
+ return base + '32x4(' + mask.map(function(m) {
+ return (m == 1 ? second : first) + '.' + simdLane[i++];
+ }).join(',') + ')';
}
function indirectbrHandler(item) {
var phiSets = calcPhiSets(item);
diff --git a/src/parseTools.js b/src/parseTools.js
index e921e5ca..95eecc87 100644
--- a/src/parseTools.js
+++ b/src/parseTools.js
@@ -2626,4 +2626,9 @@ function addVariable(ident, type, funcData) {
}
var SIMDLane = ['X', 'Y', 'Z', 'W'];
+var simdLane = ['x', 'y', 'z', 'w'];
+
+function ensureVector(ident, base) {
+ return ident == 0 ? base + '32x4.zero()' : ident;
+}