diff options
author | Alon Zakai <alonzakai@gmail.com> | 2014-01-08 11:41:10 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2014-01-08 11:41:10 -0800 |
commit | 12440cd193df54161a90f62467c0ab2a11166b4a (patch) | |
tree | e6c038f49426ad7c157c6922f405baf6b73e27dc | |
parent | 1e1ad3bf3aa144bac8fb61d2fa644e12a1d0b6a1 (diff) |
implement shufflevector
-rw-r--r-- | lib/Target/JSBackend/JSBackend.cpp | 24 |
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 { |