aboutsummaryrefslogtreecommitdiff
path: root/lib/Target/JSBackend/JSBackend.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Target/JSBackend/JSBackend.cpp')
-rw-r--r--lib/Target/JSBackend/JSBackend.cpp24
1 files changed, 24 insertions, 0 deletions
diff --git a/lib/Target/JSBackend/JSBackend.cpp b/lib/Target/JSBackend/JSBackend.cpp
index 8e572f734a..7fb4208744 100644
--- a/lib/Target/JSBackend/JSBackend.cpp
+++ b/lib/Target/JSBackend/JSBackend.cpp
@@ -857,6 +857,30 @@ bool JSWriter::generateSIMDInstruction(const std::string &iName, const Instructi
Code << "(" + getValueAsStr(III->getOperand(0)) + ',' + getValueAsStr(III->getOperand(1)) + ')';
break;
}
+ case Instruction::ShuffleVector: {
+ if (VT->getElementType()->isIntegerTy()) {
+ Code << "int32x4(";
+ } else {
+ Code << "float32x4(";
+ }
+ const ShuffleVectorInst *SVI = cast<ShuffleVectorInst>(I);
+ std::string A = getValueAsStr(I->getOperand(0));
+ std::string B = getValueAsStr(I->getOperand(1));
+ for (unsigned int i = 0; i < 4; i++) {
+ int Mask = SVI->getMaskValue(i);
+ if (Mask < 0) {
+ Code << "0";
+ } else if (Mask < 4) {
+ Code << A + "." + simdLane[Mask];
+ } else {
+ assert(Mask < 8);
+ Code << B + "." + simdLane[Mask-4];
+ }
+ if (i < 3) Code << ",";
+ }
+ Code << ')';
+ break;
+ }
}
return true;
} else {