return DAG.getNode(Opcode, DL, VT, In);
}
+// Create OR(AND(LHS,MASK),AND(RHS,~MASK)) bit select pattern
+static SDValue getBitSelect(const SDLoc &DL, MVT VT, SDValue LHS, SDValue RHS,
+ SDValue Mask, SelectionDAG &DAG) {
+ LHS = DAG.getNode(ISD::AND, DL, VT, LHS, Mask);
+ RHS = DAG.getNode(X86ISD::ANDNP, DL, VT, Mask, RHS);
+ return DAG.getNode(ISD::OR, DL, VT, LHS, RHS);
+}
+
// Match (xor X, -1) -> X.
// Match extract_subvector(xor X, -1) -> extract_subvector(X).
// Match concat_vectors(xor X, -1, xor Y, -1) -> concat_vectors(X, Y).
}
SDValue V1Mask = DAG.getBuildVector(VT, DL, MaskOps);
- V1 = DAG.getNode(ISD::AND, DL, VT, V1, V1Mask);
- V2 = DAG.getNode(X86ISD::ANDNP, DL, VT, V1Mask, V2);
- return DAG.getNode(ISD::OR, DL, VT, V1, V2);
+ return getBitSelect(DL, VT, V1, V2, V1Mask, DAG);
}
static SDValue getVectorMaskingNode(SDValue Op, SDValue Mask,