diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-10-17 18:09:43 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-10-18 13:00:49 -0700 |
commit | b085d4ce9b5fd880b6ea7306104baaf37dca4f20 (patch) | |
tree | 5f870b02f50928a38f78230cdb5e1107ae81d6a2 /src | |
parent | e623c44997c1dffd0ff3b8215b0ecdb076c68715 (diff) |
shufflevector
Diffstat (limited to 'src')
-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; +} |