diff options
-rw-r--r-- | src/jsifier.js | 20 | ||||
-rw-r--r-- | src/parseTools.js | 5 |
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; +} |