+ } else if (X86::isSHUFPMask(PermMask.Val)) {
+ unsigned NumElems = PermMask.getNumOperands();
+ SDOperand Elt = PermMask.getOperand(0);
+ if (cast<ConstantSDNode>(Elt)->getValue() >= NumElems) {
+ // Swap the operands and change mask.
+ std::vector<SDOperand> MaskVec;
+ for (unsigned i = NumElems / 2; i != NumElems; ++i)
+ MaskVec.push_back(PermMask.getOperand(i));
+ for (unsigned i = 0; i != NumElems / 2; ++i)
+ MaskVec.push_back(PermMask.getOperand(i));
+ PermMask =
+ DAG.getNode(ISD::BUILD_VECTOR, PermMask.getValueType(), MaskVec);
+ return DAG.getNode(ISD::VECTOR_SHUFFLE, VT, V2, V1, PermMask);
+ }
+ return SDOperand();