reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced

References

lib/Target/X86/X86ISelLowering.cpp
25767   unsigned EltSizeInBits = VT.getScalarSizeInBits();
25774   assert(VT.isVector() && "Custom lowering only for vector shifts!");
25783   if (SupportedVectorVarShift(VT, Subtarget, Opc))
25788   if (Subtarget.hasXOP() && (VT == MVT::v2i64 || VT == MVT::v4i32 ||
25788   if (Subtarget.hasXOP() && (VT == MVT::v2i64 || VT == MVT::v4i32 ||
25789                              VT == MVT::v8i16 || VT == MVT::v16i8)) {
25789                              VT == MVT::v8i16 || VT == MVT::v16i8)) {
25791       SDValue Zero = DAG.getConstant(0, dl, VT);
25792       Amt = DAG.getNode(ISD::SUB, dl, VT, Zero, Amt);
25795       return DAG.getNode(X86ISD::VPSHL, dl, VT, R, Amt);
25797       return DAG.getNode(X86ISD::VPSHA, dl, VT, R, Amt);
25802   if (VT == MVT::v2i64 && Opc != ISD::SRA) {
25804     SDValue Amt0 = DAG.getVectorShuffle(VT, dl, Amt, Amt, {0, 0});
25805     SDValue Amt1 = DAG.getVectorShuffle(VT, dl, Amt, Amt, {1, 1});
25806     SDValue R0 = DAG.getNode(Opc, dl, VT, R, Amt0);
25807     SDValue R1 = DAG.getNode(Opc, dl, VT, R, Amt1);
25808     return DAG.getVectorShuffle(VT, dl, R0, R1, {0, 3});
25814   if ((VT == MVT::v2i64 || (VT == MVT::v4i64 && Subtarget.hasInt256())) &&
25814   if ((VT == MVT::v2i64 || (VT == MVT::v4i64 && Subtarget.hasInt256())) &&
25816     SDValue S = DAG.getConstant(APInt::getSignMask(64), dl, VT);
25817     SDValue M = DAG.getNode(ISD::SRL, dl, VT, S, Amt);
25818     R = DAG.getNode(ISD::SRL, dl, VT, R, Amt);
25819     R = DAG.getNode(ISD::XOR, dl, VT, R, M);
25820     R = DAG.getNode(ISD::SUB, dl, VT, R, M);
25834   if (ConstantAmt && (VT == MVT::v8i16 || VT == MVT::v4i32 ||
25834   if (ConstantAmt && (VT == MVT::v8i16 || VT == MVT::v4i32 ||
25835                       (VT == MVT::v16i16 && Subtarget.hasInt256()))) {
25837     unsigned NumElts = VT.getVectorNumElements();
25860         (VT != MVT::v16i16 ||
25861          is128BitLaneRepeatedShuffleMask(VT, ShuffleMask)) &&
25862         (VT == MVT::v4i32 || Subtarget.hasSSE41() || Opc != ISD::SHL ||
25868         SDValue Shift1 = getTargetVShiftByConstNode(X86OpcI, dl, VT, R,
25870         SDValue Shift2 = getTargetVShiftByConstNode(X86OpcI, dl, VT, R,
25872         return DAG.getVectorShuffle(VT, dl, Shift1, Shift2, ShuffleMask);
25881       return DAG.getNode(ISD::MUL, dl, VT, R, Scale);
25886       (VT == MVT::v8i16 || (VT == MVT::v16i16 && Subtarget.hasInt256()))) {
25886       (VT == MVT::v8i16 || (VT == MVT::v16i16 && Subtarget.hasInt256()))) {
25887     SDValue EltBits = DAG.getConstant(EltSizeInBits, dl, VT);
25888     SDValue RAmt = DAG.getNode(ISD::SUB, dl, VT, EltBits, Amt);
25890       SDValue Zero = DAG.getConstant(0, dl, VT);
25891       SDValue ZAmt = DAG.getSetCC(dl, VT, Amt, Zero, ISD::SETEQ);
25892       SDValue Res = DAG.getNode(ISD::MULHU, dl, VT, R, Scale);
25893       return DAG.getSelect(dl, VT, ZAmt, R, Res);
25902       (VT == MVT::v8i16 || (VT == MVT::v16i16 && Subtarget.hasInt256())) &&
25902       (VT == MVT::v8i16 || (VT == MVT::v16i16 && Subtarget.hasInt256())) &&
25906     SDValue EltBits = DAG.getConstant(EltSizeInBits, dl, VT);
25907     SDValue RAmt = DAG.getNode(ISD::SUB, dl, VT, EltBits, Amt);
25910           DAG.getSetCC(dl, VT, Amt, DAG.getConstant(0, dl, VT), ISD::SETEQ);
25910           DAG.getSetCC(dl, VT, Amt, DAG.getConstant(0, dl, VT), ISD::SETEQ);
25912           DAG.getSetCC(dl, VT, Amt, DAG.getConstant(1, dl, VT), ISD::SETEQ);
25912           DAG.getSetCC(dl, VT, Amt, DAG.getConstant(1, dl, VT), ISD::SETEQ);
25914           getTargetVShiftByConstNode(X86ISD::VSRAI, dl, VT, R, 1, DAG);
25915       SDValue Res = DAG.getNode(ISD::MULHS, dl, VT, R, Scale);
25916       Res = DAG.getSelect(dl, VT, Amt0, R, Res);
25917       return DAG.getSelect(dl, VT, Amt1, Sra1, Res);
25926   if (VT == MVT::v4i32) {
25929       Amt0 = DAG.getVectorShuffle(VT, dl, Amt, DAG.getUNDEF(VT), {0, 0, 0, 0});
25929       Amt0 = DAG.getVectorShuffle(VT, dl, Amt, DAG.getUNDEF(VT), {0, 0, 0, 0});
25930       Amt1 = DAG.getVectorShuffle(VT, dl, Amt, DAG.getUNDEF(VT), {1, 1, 1, 1});
25930       Amt1 = DAG.getVectorShuffle(VT, dl, Amt, DAG.getUNDEF(VT), {1, 1, 1, 1});
25931       Amt2 = DAG.getVectorShuffle(VT, dl, Amt, DAG.getUNDEF(VT), {2, 2, 2, 2});
25931       Amt2 = DAG.getVectorShuffle(VT, dl, Amt, DAG.getUNDEF(VT), {2, 2, 2, 2});
25932       Amt3 = DAG.getVectorShuffle(VT, dl, Amt, DAG.getUNDEF(VT), {3, 3, 3, 3});
25932       Amt3 = DAG.getVectorShuffle(VT, dl, Amt, DAG.getUNDEF(VT), {3, 3, 3, 3});
25939         SDValue Z = DAG.getConstant(0, dl, VT);
25940         Amt0 = DAG.getVectorShuffle(VT, dl, Amt, Z, {0, 4, -1, -1});
25941         Amt1 = DAG.getVectorShuffle(VT, dl, Amt, Z, {1, 5, -1, -1});
25942         Amt2 = DAG.getVectorShuffle(VT, dl, Amt, Z, {2, 6, -1, -1});
25943         Amt3 = DAG.getVectorShuffle(VT, dl, Amt, Z, {3, 7, -1, -1});
25960     SDValue R0 = DAG.getNode(ShOpc, dl, VT, R, DAG.getBitcast(VT, Amt0));
25960     SDValue R0 = DAG.getNode(ShOpc, dl, VT, R, DAG.getBitcast(VT, Amt0));
25961     SDValue R1 = DAG.getNode(ShOpc, dl, VT, R, DAG.getBitcast(VT, Amt1));
25961     SDValue R1 = DAG.getNode(ShOpc, dl, VT, R, DAG.getBitcast(VT, Amt1));
25962     SDValue R2 = DAG.getNode(ShOpc, dl, VT, R, DAG.getBitcast(VT, Amt2));
25962     SDValue R2 = DAG.getNode(ShOpc, dl, VT, R, DAG.getBitcast(VT, Amt2));
25963     SDValue R3 = DAG.getNode(ShOpc, dl, VT, R, DAG.getBitcast(VT, Amt3));
25963     SDValue R3 = DAG.getNode(ShOpc, dl, VT, R, DAG.getBitcast(VT, Amt3));
25968       SDValue R02 = DAG.getVectorShuffle(VT, dl, R0, R2, {0, -1, 6, -1});
25969       SDValue R13 = DAG.getVectorShuffle(VT, dl, R1, R3, {-1, 1, -1, 7});
25970       return DAG.getVectorShuffle(VT, dl, R02, R13, {0, 5, 2, 7});
25972     SDValue R01 = DAG.getVectorShuffle(VT, dl, R0, R1, {0, -1, -1, 5});
25973     SDValue R23 = DAG.getVectorShuffle(VT, dl, R2, R3, {2, -1, -1, 7});
25974     return DAG.getVectorShuffle(VT, dl, R01, R23, {0, 3, 4, 7});
25981   if ((Subtarget.hasInt256() && VT == MVT::v8i16) ||
25982       (Subtarget.canExtendTo512DQ() && VT == MVT::v16i16) ||
25983       (Subtarget.canExtendTo512DQ() && VT == MVT::v16i8) ||
25984       (Subtarget.canExtendTo512BW() && VT == MVT::v32i8) ||
25985       (Subtarget.hasBWI() && Subtarget.hasVLX() && VT == MVT::v16i8)) {
25986     assert((!Subtarget.hasBWI() || VT == MVT::v32i8 || VT == MVT::v16i8) &&
25986     assert((!Subtarget.hasBWI() || VT == MVT::v32i8 || VT == MVT::v16i8) &&
25989     MVT ExtVT = MVT::getVectorVT(EvtSVT, VT.getVectorNumElements());
25993     return DAG.getNode(ISD::TRUNCATE, dl, VT,
26000       (VT == MVT::v16i8 || VT == MVT::v64i8 ||
26000       (VT == MVT::v16i8 || VT == MVT::v64i8 ||
26001        (VT == MVT::v32i8 && Subtarget.hasInt256())) &&
26003     int NumElts = VT.getVectorNumElements();
26015     if (VT == MVT::v16i8 && Subtarget.hasInt256()) {
26020       return DAG.getZExtOrTrunc(R, dl, VT);
26035     SDValue LoR = DAG.getBitcast(VT16, getUnpackl(DAG, dl, VT, R, R));
26036     SDValue HiR = DAG.getBitcast(VT16, getUnpackh(DAG, dl, VT, R, R));
26043     return DAG.getNode(X86ISD::PACKUS, dl, VT, LoR, HiR);
26046   if (VT == MVT::v16i8 ||
26047       (VT == MVT::v32i8 && Subtarget.hasInt256() && !Subtarget.hasXOP()) ||
26048       (VT == MVT::v64i8 && Subtarget.hasBWI())) {
26049     MVT ExtVT = MVT::getVectorVT(MVT::i16, VT.getVectorNumElements() / 2);
26052       if (VT.is512BitVector()) {
26056         MVT MaskVT = MVT::getVectorVT(MVT::i1, VT.getVectorNumElements());
26057         V0 = DAG.getBitcast(VT, V0);
26058         V1 = DAG.getBitcast(VT, V1);
26059         Sel = DAG.getBitcast(VT, Sel);
26060         Sel = DAG.getSetCC(dl, MaskVT, DAG.getConstant(0, dl, VT), Sel,
26062         return DAG.getBitcast(SelVT, DAG.getSelect(dl, VT, Sel, V0, V1));
26066         V0 = DAG.getBitcast(VT, V0);
26067         V1 = DAG.getBitcast(VT, V1);
26068         Sel = DAG.getBitcast(VT, Sel);
26069         return DAG.getBitcast(SelVT, DAG.getSelect(dl, VT, Sel, V0, V1));
26084     Amt = DAG.getBitcast(VT, Amt);
26088       SDValue M = DAG.getNode(Opc, dl, VT, R, DAG.getConstant(4, dl, VT));
26088       SDValue M = DAG.getNode(Opc, dl, VT, R, DAG.getConstant(4, dl, VT));
26089       R = SignBitSelect(VT, Amt, M, R);
26092       Amt = DAG.getNode(ISD::ADD, dl, VT, Amt, Amt);
26095       M = DAG.getNode(Opc, dl, VT, R, DAG.getConstant(2, dl, VT));
26095       M = DAG.getNode(Opc, dl, VT, R, DAG.getConstant(2, dl, VT));
26096       R = SignBitSelect(VT, Amt, M, R);
26099       Amt = DAG.getNode(ISD::ADD, dl, VT, Amt, Amt);
26102       M = DAG.getNode(Opc, dl, VT, R, DAG.getConstant(1, dl, VT));
26102       M = DAG.getNode(Opc, dl, VT, R, DAG.getConstant(1, dl, VT));
26103       R = SignBitSelect(VT, Amt, M, R);
26111       SDValue ALo = getUnpackl(DAG, dl, VT, DAG.getUNDEF(VT), Amt);
26111       SDValue ALo = getUnpackl(DAG, dl, VT, DAG.getUNDEF(VT), Amt);
26112       SDValue AHi = getUnpackh(DAG, dl, VT, DAG.getUNDEF(VT), Amt);
26112       SDValue AHi = getUnpackh(DAG, dl, VT, DAG.getUNDEF(VT), Amt);
26113       SDValue RLo = getUnpackl(DAG, dl, VT, DAG.getUNDEF(VT), R);
26113       SDValue RLo = getUnpackl(DAG, dl, VT, DAG.getUNDEF(VT), R);
26114       SDValue RHi = getUnpackh(DAG, dl, VT, DAG.getUNDEF(VT), R);
26114       SDValue RHi = getUnpackh(DAG, dl, VT, DAG.getUNDEF(VT), R);
26150       return DAG.getNode(X86ISD::PACKUS, dl, VT, RLo, RHi);
26154   if (Subtarget.hasInt256() && !Subtarget.hasXOP() && VT == MVT::v16i16) {
26156     SDValue Z = DAG.getConstant(0, dl, VT);
26157     SDValue ALo = getUnpackl(DAG, dl, VT, Amt, Z);
26158     SDValue AHi = getUnpackh(DAG, dl, VT, Amt, Z);
26159     SDValue RLo = getUnpackl(DAG, dl, VT, Z, R);
26160     SDValue RHi = getUnpackh(DAG, dl, VT, Z, R);
26169     return DAG.getNode(X86ISD::PACKUS, dl, VT, Lo, Hi);
26172   if (VT == MVT::v8i16) {
26182         MVT ExtVT = MVT::getVectorVT(MVT::i8, VT.getVectorNumElements() * 2);
26186         return DAG.getBitcast(VT, DAG.getSelect(dl, ExtVT, Sel, V0, V1));
26192           getTargetVShiftByConstNode(X86ISD::VSRAI, dl, VT, Sel, 15, DAG);
26193       return DAG.getSelect(dl, VT, C, V0, V1);
26201           ISD::OR, dl, VT,
26202           getTargetVShiftByConstNode(X86ISD::VSHLI, dl, VT, Amt, 4, DAG),
26203           getTargetVShiftByConstNode(X86ISD::VSHLI, dl, VT, Amt, 12, DAG));
26205       Amt = getTargetVShiftByConstNode(X86ISD::VSHLI, dl, VT, Amt, 12, DAG);
26209     SDValue M = getTargetVShiftByConstNode(X86OpcI, dl, VT, R, 8, DAG);
26213     Amt = DAG.getNode(ISD::ADD, dl, VT, Amt, Amt);
26216     M = getTargetVShiftByConstNode(X86OpcI, dl, VT, R, 4, DAG);
26220     Amt = DAG.getNode(ISD::ADD, dl, VT, Amt, Amt);
26223     M = getTargetVShiftByConstNode(X86OpcI, dl, VT, R, 2, DAG);
26227     Amt = DAG.getNode(ISD::ADD, dl, VT, Amt, Amt);
26230     M = getTargetVShiftByConstNode(X86OpcI, dl, VT, R, 1, DAG);
26236   if (VT.is256BitVector())