134 bool UseX87 = !Subtarget.useSoftFloat() && Subtarget.hasX87();
151 if (Subtarget.isAtom())
153 else if (Subtarget.is64Bit())
162 if (Subtarget.hasSlowDivide32())
164 if (Subtarget.hasSlowDivide64() && Subtarget.is64Bit())
168 if (Subtarget.canUseCMPXCHG16B())
170 else if (Subtarget.canUseCMPXCHG8B())
183 if (Subtarget.is64Bit())
200 for (
auto VT : {MVT::f32, MVT::f64, MVT::f80}) {
206 if (Subtarget.canUseCMOV()) {
209 if (Subtarget.is64Bit())
218 if (Subtarget.is64Bit())
226 if (Subtarget.is64Bit())
237 if (Subtarget.is64Bit())
241 if (!Subtarget.useSoftFloat()) {
305 if (!Subtarget.is64Bit() && Subtarget.hasX87()) {
311 if (Subtarget.hasSSE2()) {
314 for (
MVT VT : { MVT::i8, MVT::i16, MVT::i32 }) {
318 if (Subtarget.is64Bit()) {
323 if (Subtarget.hasAVX10_2()) {
324 for (
MVT VT : {MVT::v8i8, MVT::v16i8, MVT::v32i8}) {
332 for (
MVT VT : {MVT::i32, MVT::v4i32, MVT::v8i32, MVT::v16i32, MVT::v2i64,
337 if (Subtarget.is64Bit()) {
348 if (!Subtarget.hasSSE2()) {
351 if (Subtarget.is64Bit()) {
356 }
else if (!Subtarget.is64Bit())
369 for (
auto VT : { MVT::i8, MVT::i16, MVT::i32, MVT::i64 }) {
380 for (
auto VT : { MVT::f32, MVT::f64, MVT::f80, MVT::f128,
381 MVT::i8, MVT::i16, MVT::i32, MVT::i64 }) {
385 if (Subtarget.is64Bit())
396 if (!Subtarget.useSoftFloat() && Subtarget.hasX87()) {
414 if (!Subtarget.hasBMI()) {
417 if (Subtarget.is64Bit()) {
423 if (Subtarget.hasLZCNT()) {
429 for (
auto VT : {MVT::i8, MVT::i16, MVT::i32, MVT::i64}) {
430 if (VT == MVT::i64 && !Subtarget.is64Bit())
444 (!Subtarget.useSoftFloat() && Subtarget.hasF16C()) ?
Custom :
Expand);
451 for (
auto VT : {MVT::f32, MVT::f64, MVT::f80, MVT::f128}) {
456 for (
MVT VT : {MVT::f32, MVT::f64, MVT::f80, MVT::f128}) {
469 if (Subtarget.is64Bit())
471 if (Subtarget.hasPOPCNT()) {
483 if (Subtarget.hasBMI2()) {
487 if (Subtarget.is64Bit())
493 if (!Subtarget.hasMOVBE())
497 for (
auto VT : { MVT::f32, MVT::f64, MVT::f80, MVT::f128 }) {
503 for (
auto VT : { MVT::i8, MVT::i16, MVT::i32, MVT::i64 }) {
504 if (VT == MVT::i64 && !Subtarget.is64Bit())
524 for (
auto VT : { MVT::i32, MVT::i64 }) {
525 if (VT == MVT::i64 && !Subtarget.is64Bit())
536 for (
auto VT : { MVT::i32, MVT::i64 }) {
537 if (VT == MVT::i64 && !Subtarget.is64Bit())
544 if (Subtarget.hasSSEPrefetch())
550 for (
auto VT : { MVT::i8, MVT::i16, MVT::i32, MVT::i64 }) {
560 if (!Subtarget.is64Bit())
563 if (Subtarget.is64Bit() && Subtarget.hasAVX()) {
570 if (Subtarget.canUseCMPXCHG16B())
574 if (!Subtarget.isTargetDarwin() && !Subtarget.isTargetELF() &&
575 !Subtarget.isTargetCygMing() && !Subtarget.isTargetWin64() &&
588 if (Subtarget.isTargetPS())
596 bool Is64Bit = Subtarget.is64Bit();
652 if (!Subtarget.useSoftFloat() && Subtarget.hasSSE2()) {
656 : &X86::FR16RegClass);
658 : &X86::FR32RegClass);
660 : &X86::FR64RegClass);
668 for (
auto VT : { MVT::f32, MVT::f64 }) {
689 setF16Action(MVT::f16,
Promote);
745 }
else if (!Subtarget.useSoftFloat() && Subtarget.hasSSE1() &&
746 (UseX87 || Is64Bit)) {
784 for (
auto VT : { MVT::f32, MVT::f64 }) {
797 if (UseX87 && (
getRegClassFor(MVT::f32) == &X86::RFP32RegClass)) {
798 addLegalFPImmediate(
APFloat(+0.0f));
799 addLegalFPImmediate(
APFloat(+1.0f));
800 addLegalFPImmediate(
APFloat(-0.0f));
801 addLegalFPImmediate(
APFloat(-1.0f));
803 addLegalFPImmediate(
APFloat(+0.0f));
808 addLegalFPImmediate(
APFloat(+0.0));
809 addLegalFPImmediate(
APFloat(+1.0));
810 addLegalFPImmediate(
APFloat(-0.0));
811 addLegalFPImmediate(
APFloat(-1.0));
813 addLegalFPImmediate(
APFloat(+0.0));
844 addLegalFPImmediate(TmpFlt);
846 addLegalFPImmediate(TmpFlt);
852 addLegalFPImmediate(TmpFlt2);
854 addLegalFPImmediate(TmpFlt2);
903 if (!Subtarget.useSoftFloat() && Subtarget.is64Bit() && Subtarget.hasSSE1()) {
905 : &X86::VR128RegClass);
982 for (
auto VT : { MVT::v8f16, MVT::v16f16, MVT::v32f16,
983 MVT::v4f32, MVT::v8f32, MVT::v16f32,
984 MVT::v2f64, MVT::v4f64, MVT::v8f64 }) {
1067 if (!Subtarget.useSoftFloat() && Subtarget.hasMMX()) {
1072 auto SetFPMinMaxAction = [&](
MVT VT) {
1083 if (!Subtarget.useSoftFloat() && Subtarget.hasSSE1()) {
1085 : &X86::VR128RegClass);
1087 SetFPMinMaxAction(MVT::f32);
1110 if (!Subtarget.useSoftFloat() && Subtarget.hasSSE2()) {
1112 : &X86::VR128RegClass);
1117 : &X86::VR128RegClass);
1119 : &X86::VR128RegClass);
1121 : &X86::VR128RegClass);
1123 : &X86::VR128RegClass);
1125 : &X86::VR128RegClass);
1127 for (
auto VT : { MVT::f64, MVT::v4f32, MVT::v2f64 })
1128 SetFPMinMaxAction(VT);
1164 if (Subtarget.hasPCLMUL()) {
1165 for (
auto VT : {MVT::i64, MVT::v4i32, MVT::v2i64}) {
1174 for (
auto VT : { MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64 }) {
1187 for (
auto VT : {MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64, MVT::i64}) {
1211 for (
auto VT : { MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64 }) {
1231 for (
auto VT : { MVT::v16i8, MVT::v8i16, MVT::v4i32 }) {
1239 for (
auto VT : { MVT::v8f16, MVT::v2f64, MVT::v2i64 }) {
1244 if (VT == MVT::v2i64 && !Subtarget.is64Bit())
1250 setF16Action(MVT::v8f16,
Expand);
1275 for (
auto VT : {MVT::v2i8, MVT::v4i8, MVT::v8i8, MVT::v2i16, MVT::v4i16}) {
1321 if (!Subtarget.hasAVX512())
1349 for (
auto VT : { MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64 }) {
1353 if (VT == MVT::v2i64)
continue;
1367 if (!Subtarget.useSoftFloat() && Subtarget.hasGFNI()) {
1373 for (
auto VT : {MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64}) {
1381 if (!Subtarget.useSoftFloat() && Subtarget.hasSSSE3()) {
1386 for (
auto VT : {MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64}) {
1398 if (Subtarget.hasNDD()) {
1406 if (!Subtarget.useSoftFloat() && Subtarget.hasSSE41()) {
1407 for (
MVT RoundedTy : {MVT::f32, MVT::f64, MVT::v4f32, MVT::v2f64}) {
1447 for (
auto VT : { MVT::v8i16, MVT::v4i32, MVT::v2i64 }) {
1462 if (Subtarget.is64Bit() && !Subtarget.hasAVX512()) {
1474 if (!Subtarget.useSoftFloat() && Subtarget.hasSSE42()) {
1478 if (!Subtarget.useSoftFloat() && Subtarget.hasXOP()) {
1479 for (
MVT VT : { MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64,
1480 MVT::v32i8, MVT::v16i16, MVT::v8i32, MVT::v4i64 }) {
1486 for (
auto VT : { MVT::i8, MVT::i16, MVT::i32, MVT::i64 })
1490 if (!Subtarget.useSoftFloat() && Subtarget.hasAVX()) {
1491 bool HasInt256 = Subtarget.hasInt256();
1494 : &X86::VR256RegClass);
1496 : &X86::VR256RegClass);
1498 : &X86::VR256RegClass);
1500 : &X86::VR256RegClass);
1502 : &X86::VR256RegClass);
1504 : &X86::VR256RegClass);
1506 : &X86::VR256RegClass);
1508 for (
auto VT : { MVT::v8f32, MVT::v4f64 }) {
1528 SetFPMinMaxAction(VT);
1569 if (!Subtarget.hasAVX512())
1574 for (
auto VT : { MVT::v32i8, MVT::v16i16, MVT::v8i32, MVT::v4i64 }) {
1588 if (VT == MVT::v4i64)
continue;
1609 for (
auto VT : { MVT::v16i16, MVT::v8i32, MVT::v4i64 }) {
1620 for (
auto VT : { MVT::v32i8, MVT::v16i16, MVT::v8i32, MVT::v4i64 }) {
1639 if (Subtarget.hasAnyFMA()) {
1640 for (
auto VT : { MVT::f32, MVT::f64, MVT::v4f32, MVT::v8f32,
1641 MVT::v2f64, MVT::v4f64 }) {
1647 for (
auto VT : { MVT::v32i8, MVT::v16i16, MVT::v8i32, MVT::v4i64 }) {
1688 for (
auto VT : { MVT::v32i8, MVT::v16i16, MVT::v8i32 }) {
1696 for (
auto VT : {MVT::v16i16, MVT::v8i32, MVT::v4i64}) {
1718 for (
auto VT : { MVT::v4i32, MVT::v8i32, MVT::v2i64, MVT::v4i64,
1719 MVT::v4f32, MVT::v8f32, MVT::v2f64, MVT::v4f64 }) {
1726 for (
auto VT : { MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64,
1727 MVT::v8f16, MVT::v4f32, MVT::v2f64 }) {
1732 for (
MVT VT : { MVT::v32i8, MVT::v16i16, MVT::v8i32, MVT::v4i64,
1733 MVT::v16f16, MVT::v8f32, MVT::v4f64 }) {
1744 setF16Action(MVT::v16f16,
Expand);
1754 if (Subtarget.hasPCLMUL()) {
1755 for (
auto VT : {MVT::v8i32, MVT::v4i64}) {
1773 for (
auto VT : { MVT::v4i32, MVT::v8i32, MVT::v2i64, MVT::v4i64,
1774 MVT::v4f32, MVT::v8f32, MVT::v2f64, MVT::v4f64 })
1778 if (Subtarget.hasGFNI()) {
1784 if (!Subtarget.useSoftFloat() && !Subtarget.hasFP16() &&
1785 Subtarget.hasF16C()) {
1786 for (
MVT VT : { MVT::f16, MVT::v2f16, MVT::v4f16, MVT::v8f16 }) {
1790 for (
MVT VT : { MVT::f32, MVT::v2f32, MVT::v4f32, MVT::v8f32 }) {
1805 if (!Subtarget.useSoftFloat() && Subtarget.hasAVX512()) {
1833 if (!Subtarget.hasDQI()) {
1846 for (
auto VT : { MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64 }) {
1852 for (
auto VT : { MVT::v1i1, MVT::v2i1, MVT::v4i1, MVT::v8i1, MVT::v16i1 })
1855 for (
auto VT : { MVT::v2i1, MVT::v4i1, MVT::v8i1, MVT::v16i1 }) {
1868 for (
auto VT : { MVT::v1i1, MVT::v2i1, MVT::v4i1, MVT::v8i1 })
1871 if (Subtarget.hasDQI() && Subtarget.hasVLX()) {
1872 for (
MVT VT : {MVT::v4f32, MVT::v8f32, MVT::v2f64, MVT::v4f64}) {
1881 if (!Subtarget.useSoftFloat() && Subtarget.useAVX512Regs()) {
1882 bool HasBWI = Subtarget.hasBWI();
1902 for (
MVT VT : { MVT::v16f32, MVT::v8f64 }) {
1903 SetFPMinMaxAction(VT);
1916 if (Subtarget.hasDQI())
1934 for (
MVT VT : { MVT::v16i1, MVT::v16i8 }) {
1941 for (
MVT VT : { MVT::v16i16, MVT::v16i32 }) {
1978 if (!Subtarget.hasVLX()) {
1979 for (
auto VT : {MVT::v4i32, MVT::v8i32, MVT::v2i64, MVT::v4i64,
1980 MVT::v4f32, MVT::v8f32, MVT::v2f64, MVT::v4f64}) {
2006 for (
auto VT : { MVT::v16f32, MVT::v8f64 }) {
2023 for (
auto VT : {MVT::v32i16, MVT::v16i32, MVT::v8i64}) {
2053 for (
auto VT : { MVT::v64i8, MVT::v32i16, MVT::v16i32, MVT::v8i64 }) {
2085 for (
auto VT : { MVT::v16i32, MVT::v8i64 }) {
2096 for (
auto VT : { MVT::v64i8, MVT::v32i16 }) {
2117 if (Subtarget.hasDQI() || Subtarget.hasFP16())
2123 if (Subtarget.hasDQI()) {
2130 if (Subtarget.hasCDI()) {
2132 for (
auto VT : { MVT::v16i32, MVT::v8i64} ) {
2137 if (Subtarget.hasVPOPCNTDQ()) {
2138 for (
auto VT : { MVT::v16i32, MVT::v8i64 })
2146 for (
auto VT : { MVT::v32i8, MVT::v16i16, MVT::v8i32, MVT::v4i64,
2147 MVT::v16f16, MVT::v8f32, MVT::v4f64 })
2150 for (
auto VT : { MVT::v64i8, MVT::v32i16, MVT::v16i32, MVT::v8i64,
2151 MVT::v32f16, MVT::v16f32, MVT::v8f64 }) {
2162 setF16Action(MVT::v32f16,
Expand);
2171 for (
auto VT : { MVT::v16i32, MVT::v8i64, MVT::v16f32, MVT::v8f64 }) {
2178 for (
auto VT : { MVT::v64i8, MVT::v32i16 }) {
2187 if (Subtarget.hasVBMI2()) {
2188 for (
auto VT : {MVT::v32i16, MVT::v16i32, MVT::v8i64}) {
2198 if (Subtarget.hasPCLMUL()) {
2199 for (
auto VT : {MVT::v16i32, MVT::v8i64}) {
2210 if (Subtarget.hasGFNI()) {
2216 if (!Subtarget.useSoftFloat() && Subtarget.hasVBMI2()) {
2217 for (
auto VT : {MVT::v8i16, MVT::v4i32, MVT::v2i64, MVT::v16i16, MVT::v8i32,
2232 if (!Subtarget.useSoftFloat() && Subtarget.hasAVX512()) {
2233 for (
MVT VT : {MVT::f16, MVT::f32, MVT::f64, MVT::v8f16, MVT::v4f32,
2234 MVT::v2f64, MVT::v16f16, MVT::v8f32, MVT::v4f64})
2243 if (Subtarget.hasDQI()) {
2248 "Unexpected operation action!");
2256 for (
auto VT : { MVT::v2i64, MVT::v4i64 }) {
2264 for (
auto VT : { MVT::v4i32, MVT::v8i32, MVT::v2i64, MVT::v4i64 }) {
2273 for (
auto VT : { MVT::v4i32, MVT::v8i32, MVT::v2i64, MVT::v4i64,
2274 MVT::v4f32, MVT::v8f32, MVT::v2f64, MVT::v4f64 })
2277 if (Subtarget.hasDQI()) {
2292 if (Subtarget.hasCDI()) {
2293 for (
auto VT : {MVT::i256, MVT::i512}) {
2294 if (VT == MVT::i512 && !Subtarget.useAVX512Regs())
2301 for (
auto VT : { MVT::v4i32, MVT::v8i32, MVT::v2i64, MVT::v4i64 }) {
2306 if (Subtarget.hasVPOPCNTDQ()) {
2307 for (
auto VT : {MVT::v4i32, MVT::v8i32, MVT::v2i64, MVT::v4i64})
2315 for (
MVT VT : {MVT::v8i32, MVT::v8f32, MVT::v4i32, MVT::v4f32, MVT::v4i64,
2316 MVT::v4f64, MVT::v2i64, MVT::v2f64, MVT::v16i8, MVT::v8i16,
2317 MVT::v16i16, MVT::v8i8})
2322 for (
MVT VT : {MVT::v16i32, MVT::v16f32, MVT::v8i64, MVT::v8f64})
2326 if (Subtarget.hasVLX())
2327 for (
MVT VT : {MVT::v8i32, MVT::v8f32, MVT::v4i32, MVT::v4f32, MVT::v4i64,
2328 MVT::v4f64, MVT::v2i64, MVT::v2f64})
2332 if (Subtarget.hasVBMI2())
2333 for (
MVT VT : {MVT::v32i16, MVT::v64i8})
2337 if (Subtarget.hasVBMI2() && Subtarget.hasVLX())
2338 for (
MVT VT : {MVT::v16i8, MVT::v8i16, MVT::v32i8, MVT::v16i16})
2344 if (!Subtarget.useSoftFloat() && Subtarget.hasBWI()) {
2348 for (
auto VT : { MVT::v32i1, MVT::v64i1 }) {
2361 for (
auto VT : { MVT::v16i1, MVT::v32i1 })
2369 for (
auto VT : {MVT::v32i8, MVT::v16i8, MVT::v16i16, MVT::v8i16,
2370 MVT::v16f16, MVT::v8f16}) {
2379 if (Subtarget.hasBITALG()) {
2380 for (
auto VT : { MVT::v16i8, MVT::v32i8, MVT::v8i16, MVT::v16i16 })
2384 if (Subtarget.hasBMM()) {
2390 for (
auto VT : {MVT::v16i8, MVT::v32i8, MVT::v64i8})
2395 if (!Subtarget.useSoftFloat() && Subtarget.hasFP16()) {
2396 auto setGroup = [&] (
MVT VT) {
2445 SetFPMinMaxAction(MVT::f16);
2463 if (Subtarget.useAVX512Regs()) {
2464 setGroup(MVT::v32f16);
2502 SetFPMinMaxAction(MVT::v32f16);
2512 if (Subtarget.hasVLX()) {
2513 setGroup(MVT::v8f16);
2514 setGroup(MVT::v16f16);
2551 SetFPMinMaxAction(MVT::v8f16);
2552 SetFPMinMaxAction(MVT::v16f16);
2559 if (!Subtarget.useSoftFloat() &&
2560 (Subtarget.hasAVXNECONVERT() || Subtarget.hasBF16())) {
2562 : &X86::VR128RegClass);
2563 addRegisterClass(MVT::v16bf16, Subtarget.hasAVX512() ? &X86::VR256XRegClass
2564 : &X86::VR256RegClass);
2570 for (
auto VT : {MVT::v8bf16, MVT::v16bf16}) {
2571 setF16Action(VT,
Expand);
2572 if (!Subtarget.hasBF16())
2589 if (!Subtarget.useSoftFloat() && Subtarget.hasBF16() &&
2590 Subtarget.useAVX512Regs()) {
2592 setF16Action(MVT::v32bf16,
Expand);
2603 if (!Subtarget.useSoftFloat() && Subtarget.hasAVX10_2()) {
2611 SetFPMinMaxAction(MVT::v32bf16);
2612 for (
auto VT : {MVT::v8bf16, MVT::v16bf16}) {
2620 SetFPMinMaxAction(VT);
2622 for (
auto VT : {MVT::f16, MVT::f32, MVT::f64}) {
2628 if (!Subtarget.useSoftFloat() && Subtarget.hasVLX()) {
2641 if (Subtarget.hasBWI()) {
2646 if (Subtarget.hasFP16()) {
2678 if (!Subtarget.useSoftFloat() && Subtarget.hasAMXTILE()) {
2686 if (!Subtarget.is64Bit()) {
2696 for (
auto VT : { MVT::i8, MVT::i16, MVT::i32, MVT::i64 }) {
2697 if (VT == MVT::i64 && !Subtarget.is64Bit())
2719 if (Subtarget.isTargetWin64()) {
2738 if (Subtarget.is32Bit() &&
2739 (Subtarget.isTargetWindowsMSVC() || Subtarget.isTargetWindowsItanium()))
2767 if (Subtarget.isOSWindows()) {
4804 unsigned IdxVal =
Op.getConstantOperandVal(2);
4810 if (IdxVal == 0 && Vec.
isUndef())
4813 MVT OpVT =
Op.getSimpleValueType();
4832 assert(IdxVal + SubVecNumElems <= NumElems &&
4834 "Unexpected index value in INSERT_SUBVECTOR");
4843 Vec = DAG.
getNode(X86ISD::KSHIFTR, dl, WideOpVT, Vec, ShiftBits);
4844 Vec = DAG.
getNode(X86ISD::KSHIFTL, dl, WideOpVT, Vec, ShiftBits);
4854 Undef, SubVec, ZeroIdx);
4857 assert(IdxVal != 0 &&
"Unexpected index");
4858 SubVec = DAG.
getNode(X86ISD::KSHIFTL, dl, WideOpVT, SubVec,
4864 assert(IdxVal != 0 &&
"Unexpected index");
4867 [](
SDValue V) { return V.isUndef(); })) {
4868 SubVec = DAG.
getNode(X86ISD::KSHIFTL, dl, WideOpVT, SubVec,
4872 unsigned ShiftLeft = NumElems - SubVecNumElems;
4873 unsigned ShiftRight = NumElems - SubVecNumElems - IdxVal;
4874 SubVec = DAG.
getNode(X86ISD::KSHIFTL, dl, WideOpVT, SubVec,
4876 if (ShiftRight != 0)
4877 SubVec = DAG.
getNode(X86ISD::KSHIFTR, dl, WideOpVT, SubVec,
4884 if (IdxVal + SubVecNumElems == NumElems) {
4885 SubVec = DAG.
getNode(X86ISD::KSHIFTL, dl, WideOpVT, SubVec,
4887 if (SubVecNumElems * 2 == NumElems) {
4897 Undef, Vec, ZeroIdx);
4900 Vec = DAG.
getNode(X86ISD::KSHIFTL, dl, WideOpVT, Vec, ShiftBits);
4901 Vec = DAG.
getNode(X86ISD::KSHIFTR, dl, WideOpVT, Vec, ShiftBits);
4914 unsigned ShiftLeft = NumElems - SubVecNumElems;
4915 unsigned ShiftRight = NumElems - SubVecNumElems - IdxVal;
4918 if (WideOpVT != MVT::v64i1 || Subtarget.is64Bit()) {
4924 SubVec = DAG.
getNode(X86ISD::KSHIFTL, dl, WideOpVT, SubVec,
4926 SubVec = DAG.
getNode(X86ISD::KSHIFTR, dl, WideOpVT, SubVec,
4935 SubVec = DAG.
getNode(X86ISD::KSHIFTL, dl, WideOpVT, SubVec,
4937 SubVec = DAG.
getNode(X86ISD::KSHIFTR, dl, WideOpVT, SubVec,
4941 unsigned LowShift = NumElems - IdxVal;
4948 unsigned HighShift = IdxVal + SubVecNumElems;
5400 bool AllowWholeUndefs =
true,
5401 bool AllowPartialUndefs =
false) {
5402 assert(EltBits.
empty() &&
"Expected an empty EltBits vector");
5406 EVT VT =
Op.getValueType();
5408 unsigned NumElts = SizeInBits / EltSizeInBits;
5411 if ((SizeInBits % EltSizeInBits) != 0)
5417 unsigned SrcEltSizeInBits = SrcEltBits[0].getBitWidth();
5418 assert((NumSrcElts * SrcEltSizeInBits) == SizeInBits &&
5419 "Constant bit sizes don't match");
5422 bool AllowUndefs = AllowWholeUndefs || AllowPartialUndefs;
5427 if (NumSrcElts == NumElts) {
5428 UndefElts = UndefSrcElts;
5429 EltBits.
assign(SrcEltBits.begin(), SrcEltBits.end());
5434 APInt UndefBits(SizeInBits, 0);
5435 APInt MaskBits(SizeInBits, 0);
5437 for (
unsigned i = 0; i != NumSrcElts; ++i) {
5438 unsigned BitOffset = i * SrcEltSizeInBits;
5439 if (UndefSrcElts[i])
5440 UndefBits.
setBits(BitOffset, BitOffset + SrcEltSizeInBits);
5441 MaskBits.
insertBits(SrcEltBits[i], BitOffset);
5445 UndefElts =
APInt(NumElts, 0);
5448 for (
unsigned i = 0; i != NumElts; ++i) {
5449 unsigned BitOffset = i * EltSizeInBits;
5454 if (!AllowWholeUndefs)
5462 if (UndefEltBits.
getBoolValue() && !AllowPartialUndefs)
5465 EltBits[i] = MaskBits.
extractBits(EltSizeInBits, BitOffset);
5472 unsigned UndefBitIndex) {
5476 Undefs.setBit(UndefBitIndex);
5486 CFP->getValueAPF().bitcastToAPInt());
5490 Type *Ty = CDS->getType();
5492 Type *EltTy = CDS->getElementType();
5496 if (!IsInteger && !IsFP)
5499 for (
unsigned I = 0,
E = CDS->getNumElements();
I !=
E; ++
I)
5501 Mask.insertBits(CDS->getElementAsAPInt(
I),
I * EltBits);
5503 Mask.insertBits(CDS->getElementAsAPFloat(
I).bitcastToAPInt(),
5514 return CastBitData(UndefSrcElts, SrcEltBits);
5521 return CastBitData(UndefSrcElts, SrcEltBits);
5525 APInt RawBits = Cst->getValueAPF().bitcastToAPInt();
5527 return CastBitData(UndefSrcElts, SrcEltBits);
5535 if (BV->getConstantRawBits(
true, SrcEltSizeInBits, SrcEltBits, Undefs)) {
5537 for (
unsigned I = 0,
E = SrcEltBits.
size();
I !=
E; ++
I)
5540 return CastBitData(UndefSrcElts, SrcEltBits);
5548 if (!CstTy->
isVectorTy() || (CstSizeInBits % SizeInBits) != 0)
5552 unsigned NumSrcElts = SizeInBits / SrcEltSizeInBits;
5553 if ((SizeInBits % SrcEltSizeInBits) != 0)
5556 APInt UndefSrcElts(NumSrcElts, 0);
5558 for (
unsigned i = 0; i != NumSrcElts; ++i)
5563 return CastBitData(UndefSrcElts, SrcEltBits);
5567 if (
Op.getOpcode() == X86ISD::VBROADCAST_LOAD &&
5573 SDValue Ptr = MemIntr->getBasePtr();
5576 unsigned NumSrcElts = SizeInBits / SrcEltSizeInBits;
5578 APInt UndefSrcElts(NumSrcElts, 0);
5580 if (CollectConstantBits(
C, SrcEltBits[0], UndefSrcElts, 0)) {
5581 if (UndefSrcElts[0])
5582 UndefSrcElts.
setBits(0, NumSrcElts);
5583 if (SrcEltBits[0].
getBitWidth() != SrcEltSizeInBits)
5584 SrcEltBits[0] = SrcEltBits[0].trunc(SrcEltSizeInBits);
5585 SrcEltBits.
append(NumSrcElts - 1, SrcEltBits[0]);
5586 return CastBitData(UndefSrcElts, SrcEltBits);
5592 if (
Op.getOpcode() == X86ISD::SUBV_BROADCAST_LOAD) {
5594 SDValue Ptr = MemIntr->getBasePtr();
5600 unsigned SubVecSizeInBits = MemIntr->getMemoryVT().getStoreSizeInBits();
5601 if (!CstTy->
isVectorTy() || (CstSizeInBits % SubVecSizeInBits) != 0 ||
5602 (SizeInBits % SubVecSizeInBits) != 0)
5605 unsigned NumSubElts = SubVecSizeInBits / CstEltSizeInBits;
5606 unsigned NumSubVecs = SizeInBits / SubVecSizeInBits;
5607 APInt UndefSubElts(NumSubElts, 0);
5609 APInt(CstEltSizeInBits, 0));
5610 for (
unsigned i = 0; i != NumSubElts; ++i) {
5614 for (
unsigned j = 1; j != NumSubVecs; ++j)
5615 SubEltBits[i + (j * NumSubElts)] = SubEltBits[i];
5619 return CastBitData(UndefSubElts, SubEltBits);
5624 if (
Op.getOpcode() == X86ISD::VZEXT_MOVL &&
5628 unsigned NumSrcElts = SizeInBits / SrcEltSizeInBits;
5630 APInt UndefSrcElts(NumSrcElts, 0);
5632 const APInt &
C =
Op.getOperand(0).getConstantOperandAPInt(0);
5633 SrcEltBits.
push_back(
C.zextOrTrunc(SrcEltSizeInBits));
5634 SrcEltBits.
append(NumSrcElts - 1,
APInt(SrcEltSizeInBits, 0));
5635 return CastBitData(UndefSrcElts, SrcEltBits);
5643 bool AllowUndefs = EltSizeInBits >= SrcEltSizeInBits;
5645 APInt UndefSrcElts, UndefSubElts;
5648 UndefSubElts, EltSubBits,
5649 AllowWholeUndefs && AllowUndefs,
5650 AllowPartialUndefs && AllowUndefs) &&
5652 UndefSrcElts, EltSrcBits,
5653 AllowWholeUndefs && AllowUndefs,
5654 AllowPartialUndefs && AllowUndefs)) {
5655 unsigned BaseIdx =
Op.getConstantOperandVal(2);
5656 UndefSrcElts.
insertBits(UndefSubElts, BaseIdx);
5657 for (
unsigned i = 0, e = EltSubBits.
size(); i != e; ++i)
5658 EltSrcBits[BaseIdx + i] = EltSubBits[i];
5659 return CastBitData(UndefSrcElts, EltSrcBits);
5666 EltBits, AllowWholeUndefs,
5667 AllowPartialUndefs)) {
5668 EVT SrcVT =
Op.getOperand(0).getValueType();
5669 unsigned NumSrcElts = SrcVT.
getSizeInBits() / EltSizeInBits;
5672 unsigned BaseIdx = BaseOfs / EltSizeInBits;
5675 (BaseOfs % EltSizeInBits) == 0 &&
"Bad subvector index");
5677 UndefElts = UndefElts.
extractBits(NumSubElts, BaseIdx);
5678 if ((BaseIdx + NumSubElts) != NumSrcElts)
5679 EltBits.
erase(EltBits.
begin() + BaseIdx + NumSubElts, EltBits.
end());
5692 if ((!AllowWholeUndefs || !AllowPartialUndefs) &&
5696 APInt UndefElts0, UndefElts1;
5700 UndefElts0, EltBits0, AllowWholeUndefs,
5701 AllowPartialUndefs))
5705 UndefElts1, EltBits1, AllowWholeUndefs,
5706 AllowPartialUndefs))
5710 for (
int i = 0; i != (int)NumElts; ++i) {
5715 }
else if (M < (
int)NumElts) {
5720 if (UndefElts1[M - NumElts])
5722 EltBits.
push_back(EltBits1[M - NumElts]);
5950 MVT VT =
N.getSimpleValueType();
5957 assert(Mask.empty() &&
"getTargetShuffleMask expects an empty Mask vector");
5958 assert(
Ops.empty() &&
"getTargetShuffleMask expects an empty Ops vector");
5961 bool IsFakeUnary =
false;
5962 switch (
N.getOpcode()) {
5963 case X86ISD::BLENDI:
5964 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
5965 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
5966 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
5968 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
5971 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
5972 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
5973 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
5975 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
5977 case X86ISD::INSERTPS:
5978 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
5979 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
5980 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
5982 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
5984 case X86ISD::EXTRQI:
5985 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
5988 int BitLen =
N.getConstantOperandVal(1);
5989 int BitIdx =
N.getConstantOperandVal(2);
5994 case X86ISD::INSERTQI:
5995 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
5996 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
5999 int BitLen =
N.getConstantOperandVal(2);
6000 int BitIdx =
N.getConstantOperandVal(3);
6002 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6005 case X86ISD::UNPCKH:
6006 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6007 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6009 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6011 case X86ISD::UNPCKL:
6012 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6013 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6015 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6017 case X86ISD::MOVHLPS:
6018 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6019 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6021 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6023 case X86ISD::MOVLHPS:
6024 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6025 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6027 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6029 case X86ISD::VALIGN:
6031 "Only 32-bit and 64-bit elements are supported!");
6032 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6033 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6034 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6036 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6037 Ops.push_back(
N.getOperand(1));
6038 Ops.push_back(
N.getOperand(0));
6040 case X86ISD::PALIGNR:
6042 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6043 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6044 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6046 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6047 Ops.push_back(
N.getOperand(1));
6048 Ops.push_back(
N.getOperand(0));
6050 case X86ISD::VSHLDQ:
6052 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6053 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6057 case X86ISD::VSRLDQ:
6059 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6060 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6064 case X86ISD::PSHUFD:
6065 case X86ISD::VPERMILPI:
6066 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6067 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6071 case X86ISD::PSHUFHW:
6072 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6073 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6077 case X86ISD::PSHUFLW:
6078 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6079 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6083 case X86ISD::VZEXT_MOVL:
6084 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6088 case X86ISD::VBROADCAST:
6092 if (
N.getOperand(0).getValueType() == VT) {
6098 case X86ISD::VPERMILPV: {
6099 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6101 SDValue MaskNode =
N.getOperand(1);
6109 case X86ISD::PSHUFB: {
6111 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6112 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6114 SDValue MaskNode =
N.getOperand(1);
6121 case X86ISD::VPERMI:
6122 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6123 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6130 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6131 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6134 case X86ISD::VPERM2X128:
6135 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6136 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6137 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6139 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6141 case X86ISD::SHUF128:
6142 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6143 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6144 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6146 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6148 case X86ISD::MOVSLDUP:
6149 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6153 case X86ISD::MOVSHDUP:
6154 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6158 case X86ISD::MOVDDUP:
6159 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6163 case X86ISD::VPERMIL2: {
6164 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6165 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6166 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6167 SDValue MaskNode =
N.getOperand(2);
6168 SDValue CtrlNode =
N.getOperand(3);
6170 unsigned CtrlImm = CtrlOp->getZExtValue();
6180 case X86ISD::VPPERM: {
6181 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6182 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6183 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6184 SDValue MaskNode =
N.getOperand(2);
6191 case X86ISD::VPERMV: {
6192 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6195 Ops.push_back(
N.getOperand(1));
6196 SDValue MaskNode =
N.getOperand(0);
6204 case X86ISD::VPERMV3: {
6205 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6206 assert(
N.getOperand(2).getValueType() == VT &&
"Unexpected value type");
6207 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(2);
6209 Ops.push_back(
N.getOperand(0));
6210 Ops.push_back(
N.getOperand(2));
6211 SDValue MaskNode =
N.getOperand(1);
6219 case X86ISD::COMPRESS: {
6221 SDValue PassThru =
N.getOperand(1);
6228 "Illegal compression mask");
6229 for (
unsigned I = 0;
I != NumElems; ++
I) {
6233 while (Mask.size() != NumElems) {
6234 Mask.push_back(NumElems + Mask.size());
6236 Ops.push_back(CmpVec);
6237 Ops.push_back(PassThru);
6240 case X86ISD::EXPAND: {
6242 SDValue PassThru =
N.getOperand(1);
6249 "Illegal expansion mask");
6250 unsigned ExpIndex = 0;
6251 for (
unsigned I = 0;
I != NumElems; ++
I) {
6253 Mask.push_back(
I + NumElems);
6255 Mask.push_back(ExpIndex++);
6257 Ops.push_back(ExpVec);
6258 Ops.push_back(PassThru);
6270 if (!AllowSentinelZero &&
isAnyZero(Mask))
6278 if (M >= (
int)Mask.size())
6284 Ops.push_back(
N.getOperand(0));
6285 if (!IsUnary || IsFakeUnary)
6286 Ops.push_back(
N.getOperand(1));
6569 bool ResolveKnownElts) {
6573 MVT VT =
N.getSimpleValueType();
6577 if ((NumBitsPerElt % 8) != 0 || (NumSizeInBits % 8) != 0)
6580 unsigned NumSizeInBytes = NumSizeInBits / 8;
6581 unsigned NumBytesPerElt = NumBitsPerElt / 8;
6583 unsigned Opcode =
N.getOpcode();
6589 Mask.append(ShuffleMask.begin(), ShuffleMask.end());
6590 Ops.push_back(
N.getOperand(0));
6591 Ops.push_back(
N.getOperand(1));
6597 case X86ISD::ANDNP: {
6603 bool IsAndN = (X86ISD::ANDNP == Opcode);
6604 uint64_t ZeroMask = IsAndN ? 255 : 0;
6611 assert(UndefElts.
isZero() &&
"Unexpected UNDEF element in AND/ANDNP mask");
6612 for (
int i = 0, e = (
int)EltBits.
size(); i != e; ++i) {
6613 const APInt &ByteBits = EltBits[i];
6614 if (ByteBits != 0 && ByteBits != 255)
6618 Ops.push_back(IsAndN ? N1 : N0);
6639 size_t MaskSize = std::max(SrcMask0.
size(), SrcMask1.
size());
6643 for (
int i = 0; i != (int)MaskSize; ++i) {
6653 Mask.push_back(i + MaskSize);
6654 else if (MaskSize == NumElts && !DemandedElts[i])
6659 Ops.push_back(
N.getOperand(0));
6660 Ops.push_back(
N.getOperand(1));
6665 unsigned NumSubElts =
N.getOperand(0).getValueType().getVectorNumElements();
6666 if (NumBitsPerElt == 64) {
6667 for (
unsigned I = 0,
E =
N.getNumOperands();
I !=
E; ++
I) {
6668 for (
unsigned M = 0; M != NumSubElts; ++M)
6669 Mask.push_back((
I * NumElts) + M);
6670 Ops.push_back(
N.getOperand(
I));
6679 EVT SubVT =
Sub.getValueType();
6681 uint64_t InsertIdx =
N.getConstantOperandVal(2);
6683 if (DemandedElts.
extractBits(NumSubElts, InsertIdx) == 0) {
6684 Mask.resize(NumElts);
6685 std::iota(Mask.begin(), Mask.end(), 0);
6691 if (
Depth > 0 && InsertIdx == NumSubElts && NumElts == (2 * NumSubElts) &&
6693 Src.getOperand(0).isUndef() &&
6694 Src.getOperand(1).getValueType() == SubVT &&
6695 Src.getConstantOperandVal(2) == 0 &&
6696 (NumBitsPerElt == 64 || Src.getOperand(1) ==
Sub) &&
6698 Mask.resize(NumElts);
6699 std::iota(Mask.begin(), Mask.begin() + NumSubElts, 0);
6700 std::iota(Mask.begin() + NumSubElts, Mask.end(), NumElts);
6701 Ops.push_back(Src.getOperand(1));
6706 if (InsertIdx != 0 && Src.isUndef() &&
6709 std::iota(Mask.begin() + InsertIdx, Mask.begin() + InsertIdx + NumSubElts,
6714 if (!
N->isOnlyUserOf(
Sub.getNode()))
6729 unsigned NumSubSrcSrcElts =
6731 unsigned MaxElts = std::max(NumElts, NumSubSrcSrcElts);
6732 assert((MaxElts % NumElts) == 0 && (MaxElts % NumSubSrcSrcElts) == 0 &&
6733 "Subvector valuetype mismatch");
6734 InsertIdx *= (MaxElts / NumElts);
6735 ExtractIdx *= (MaxElts / NumSubSrcSrcElts);
6736 NumSubElts *= (MaxElts / NumElts);
6737 bool SrcIsUndef = Src.isUndef();
6738 for (
int i = 0; i != (int)MaxElts; ++i)
6740 for (
int i = 0; i != (int)NumSubElts; ++i)
6741 Mask[InsertIdx + i] = (SrcIsUndef ? 0 : MaxElts) + ExtractIdx + i;
6744 Ops.push_back(SubSrcSrc);
6751 Depth + 1, ResolveKnownElts))
6761 if (SubMask.
size() != NumSubElts) {
6762 assert(((SubMask.
size() % NumSubElts) == 0 ||
6763 (NumSubElts % SubMask.
size()) == 0) &&
6764 "Illegal submask scale");
6765 if ((NumSubElts % SubMask.
size()) == 0) {
6766 int Scale = NumSubElts / SubMask.
size();
6769 SubMask = ScaledSubMask;
6771 int Scale = SubMask.
size() / NumSubElts;
6772 NumSubElts = SubMask.
size();
6782 for (
int i = 0; i != (int)NumElts; ++i)
6784 for (
int i = 0; i != (int)NumSubElts; ++i) {
6787 int InputIdx = M / NumSubElts;
6788 M = (NumElts * (1 + InputIdx)) + (M % NumSubElts);
6790 Mask[i + InsertIdx] = M;
6794 case X86ISD::PINSRB:
6795 case X86ISD::PINSRW:
6802 unsigned DstIdx = 0;
6806 N.getConstantOperandAPInt(2).uge(NumElts))
6808 DstIdx =
N.getConstantOperandVal(2);
6812 Ops.push_back(
N.getOperand(0));
6813 for (
unsigned i = 0; i != NumElts; ++i)
6833 if ((MinBitsPerElt % 8) != 0)
6853 unsigned DstByte = DstIdx * NumBytesPerElt;
6859 Ops.push_back(SrcVec);
6862 Ops.push_back(SrcVec);
6863 Ops.push_back(
N.getOperand(0));
6864 for (
int i = 0; i != (int)NumSizeInBytes; ++i)
6865 Mask.push_back(NumSizeInBytes + i);
6868 unsigned MinBytesPerElts = MinBitsPerElt / 8;
6869 MinBytesPerElts = std::min(MinBytesPerElts, NumBytesPerElt);
6870 for (
unsigned i = 0; i != MinBytesPerElts; ++i)
6871 Mask[DstByte + i] = SrcByte + i;
6872 for (
unsigned i = MinBytesPerElts; i < NumBytesPerElt; ++i)
6876 case X86ISD::PACKSS:
6877 case X86ISD::PACKUS: {
6882 "Unexpected input value type");
6884 APInt EltsLHS, EltsRHS;
6889 bool Offset0 =
false, Offset1 =
false;
6890 if (Opcode == X86ISD::PACKSS) {
6918 bool IsUnary = (N0 == N1);
6926 if (Offset0 || Offset1) {
6928 if ((Offset0 &&
isInRange(M, 0, NumElts)) ||
6929 (Offset1 &&
isInRange(M, NumElts, 2 * NumElts)))
6935 case X86ISD::BLENDV: {
6938 Ops.push_back(
N.getOperand(1));
6939 Ops.push_back(
N.getOperand(2));
6944 case X86ISD::VTRUNC: {
6946 EVT SrcVT = Src.getValueType();
6951 unsigned Scale = NumBitsPerSrcElt / NumBitsPerElt;
6952 assert((NumBitsPerSrcElt % NumBitsPerElt) == 0 &&
"Illegal truncation");
6953 for (
unsigned i = 0; i != NumSrcElts; ++i)
6954 Mask.push_back(i * Scale);
6970 for (
unsigned I = 0;
I != NumElts; ++
I)
6971 if (DemandedElts[
I] && !UndefElts[
I] &&
6972 (EltBits[
I].urem(8) != 0 || EltBits[
I].uge(NumBitsPerElt)))
6976 Ops.push_back(
N.getOperand(0));
6978 for (
unsigned I = 0;
I != NumElts; ++
I) {
6979 if (!DemandedElts[
I] || UndefElts[
I])
6981 unsigned ByteShift = EltBits[
I].getZExtValue() / 8;
6982 unsigned Lo =
I * NumBytesPerElt;
6983 unsigned Hi =
Lo + NumBytesPerElt;
6987 std::iota(Mask.begin() +
Lo + ByteShift, Mask.begin() +
Hi,
Lo);
6989 std::iota(Mask.begin() +
Lo, Mask.begin() +
Hi - ByteShift,
6995 case X86ISD::VSRLI: {
6996 uint64_t ShiftVal =
N.getConstantOperandVal(1);
6998 if (NumBitsPerElt <= ShiftVal) {
7004 if ((ShiftVal % 8) != 0)
7008 Ops.push_back(
N.getOperand(0));
7013 if (X86ISD::VSHLI == Opcode) {
7014 for (
unsigned i = 0; i != NumSizeInBytes; i += NumBytesPerElt)
7015 for (
unsigned j = ByteShift; j != NumBytesPerElt; ++j)
7016 Mask[i + j] = i + j - ByteShift;
7018 for (
unsigned i = 0; i != NumSizeInBytes; i += NumBytesPerElt)
7019 for (
unsigned j = ByteShift; j != NumBytesPerElt; ++j)
7020 Mask[i + j - ByteShift] = i + j;
7035 for (
unsigned I = 0;
I != NumElts; ++
I)
7036 if (DemandedElts[
I] && !UndefElts[
I] &&
7037 (EltBits[
I].urem(NumBitsPerElt) % 8) != 0)
7040 Ops.push_back(
N.getOperand(0));
7041 for (
unsigned I = 0;
I != NumElts; ++
I) {
7042 if (!DemandedElts[
I] || UndefElts[
I]) {
7046 int Offset = EltBits[
I].urem(NumBitsPerElt) / 8;
7048 int BaseIdx =
I * NumBytesPerElt;
7049 for (
int J = 0; J != (int)NumBytesPerElt; ++J) {
7050 Mask.push_back(BaseIdx + ((
Offset + J) % NumBytesPerElt));
7055 case X86ISD::VROTLI:
7056 case X86ISD::VROTRI: {
7058 uint64_t RotateVal =
N.getConstantOperandAPInt(1).urem(NumBitsPerElt);
7059 if ((RotateVal % 8) != 0)
7061 Ops.push_back(
N.getOperand(0));
7062 int Offset = RotateVal / 8;
7064 for (
int i = 0; i != (int)NumElts; ++i) {
7065 int BaseIdx = i * NumBytesPerElt;
7066 for (
int j = 0; j != (int)NumBytesPerElt; ++j) {
7067 Mask.push_back(BaseIdx + ((
Offset + j) % NumBytesPerElt));
7073 case X86ISD::VSHRD: {
7075 uint64_t ShiftVal =
N.getConstantOperandAPInt(2).urem(NumBitsPerElt);
7076 int Offset = ShiftVal / 8;
7077 if ((ShiftVal % 8) != 0 ||
Offset == 0)
7079 Ops.push_back(
N.getOperand(X86ISD::VSHRD == Opcode ? 1 : 0));
7080 Ops.push_back(
N.getOperand(X86ISD::VSHRD == Opcode ? 0 : 1));
7082 for (
int I = 0;
I != (int)NumElts; ++
I) {
7083 int BaseIdx = (
I * NumBytesPerElt) -
Offset;
7084 for (
int J = 0; J != (int)NumBytesPerElt; ++J) {
7085 int MaskIdx = BaseIdx + J;
7086 MaskIdx += J <
Offset ? (NumSizeInBytes + NumBytesPerElt) : 0;
7087 Mask.push_back(MaskIdx);
7092 case X86ISD::VBROADCAST: {
7094 if (!Src.getSimpleValueType().isVector()) {
7097 Src.getOperand(0).getValueType().getScalarType() !=
7100 Src = Src.getOperand(0);
7103 Mask.append(NumElts, 0);
7108 EVT SrcVT = Src.getValueType();
7113 (NumBitsPerSrcElt % 8) != 0)
7117 APInt DemandedSrcElts =
7122 assert((NumBitsPerElt % NumBitsPerSrcElt) == 0 &&
"Unexpected extension");
7123 unsigned Scale = NumBitsPerElt / NumBitsPerSrcElt;
7124 for (
unsigned I = 0;
I != NumElts; ++
I)
7125 Mask.append(Scale,
I);
7134 EVT SrcVT = Src.getValueType();
7777 bool IsAfterLegalize,
7778 unsigned Depth = 0) {
7795 IsAfterLegalize,
Depth + 1))
7800 unsigned NumElems = Elts.
size();
7802 int LastLoadedElt = -1;
7812 for (
unsigned i = 0; i < NumElems; ++i) {
7831 if (!
findEltLoadSrc(Elt, Loads[i], ByteOffsets[i]) || ByteOffsets[i] < 0)
7833 unsigned LoadSizeInBits = Loads[i]->getValueSizeInBits(0);
7834 if (((ByteOffsets[i] * 8) + EltSizeInBits) > LoadSizeInBits)
7842 "Incomplete element masks");
7845 if (UndefMask.
popcount() == NumElems)
7856 "Register/Memory size mismatch");
7858 assert(LDBase &&
"Did not find base load for merging consecutive loads");
7860 unsigned BaseSizeInBytes = BaseSizeInBits / 8;
7861 int NumLoadedElts = (1 + LastLoadedElt - FirstLoadedElt);
7862 int LoadSizeInBits = NumLoadedElts * BaseSizeInBits;
7863 assert((BaseSizeInBits % 8) == 0 &&
"Sub-byte element loads detected");
7866 if (ByteOffsets[FirstLoadedElt] != 0)
7873 int64_t ByteOffset = ByteOffsets[EltIdx];
7874 if (ByteOffset && (ByteOffset % BaseSizeInBytes) == 0) {
7875 int64_t BaseIdx = EltIdx - (ByteOffset / BaseSizeInBytes);
7876 return (0 <= BaseIdx && BaseIdx < (
int)NumElems && LoadMask[BaseIdx] &&
7877 Loads[BaseIdx] == Ld && ByteOffsets[BaseIdx] == 0);
7879 int Stride = EltIdx - FirstLoadedElt;
7885 unsigned BaseMemSizeInBits =
Base->getMemoryVT().getSizeInBits();
7886 if (((Stride * BaseSizeInBits) % BaseMemSizeInBits) == 0 &&
7887 (BaseMemSizeInBits % BaseSizeInBits) == 0) {
7888 unsigned Scale = BaseMemSizeInBits / BaseSizeInBits;
7898 bool IsConsecutiveLoad =
true;
7899 bool IsConsecutiveLoadWithZeros =
true;
7900 for (
int i = FirstLoadedElt + 1; i <= LastLoadedElt; ++i) {
7902 if (!CheckConsecutiveLoad(LDBase, i)) {
7903 IsConsecutiveLoad =
false;
7904 IsConsecutiveLoadWithZeros =
false;
7907 }
else if (ZeroMask[i]) {
7908 IsConsecutiveLoad =
false;
7915 "Cannot merge volatile or atomic loads.");
7919 for (
auto *LD : Loads)
7934 if (FirstLoadedElt == 0 &&
7935 (NumLoadedElts == (
int)NumElems || IsDereferenceable) &&
7936 (IsConsecutiveLoad || IsConsecutiveLoadWithZeros)) {
7947 return DAG.
getBitcast(VT, Elts[FirstLoadedElt]);
7950 return CreateLoad(VT, LDBase);
7954 if (!IsAfterLegalize && VT.
isVector()) {
7956 if ((NumMaskElts % NumElems) == 0) {
7957 unsigned Scale = NumMaskElts / NumElems;
7959 for (
unsigned i = 0; i < NumElems; ++i) {
7962 int Offset = ZeroMask[i] ? NumMaskElts : 0;
7963 for (
unsigned j = 0; j != Scale; ++j)
7964 ClearMask[(i * Scale) + j] = (i * Scale) + j +
Offset;
7966 SDValue V = CreateLoad(VT, LDBase);
7976 unsigned HalfNumElems = NumElems / 2;
7982 DAG, Subtarget, IsAfterLegalize,
Depth + 1);
7990 if (IsConsecutiveLoad && FirstLoadedElt == 0 &&
7991 ((LoadSizeInBits == 16 && Subtarget.hasFP16()) || LoadSizeInBits == 32 ||
7992 LoadSizeInBits == 64) &&
7999 if (!Subtarget.
hasSSE2() && VT == MVT::v4f32)
8007 for (
auto *LD : Loads)
8018 for (
unsigned SubElems = 1; SubElems < NumElems; SubElems *= 2) {
8019 unsigned RepeatSize = SubElems * BaseSizeInBits;
8020 unsigned ScalarSize = std::min(RepeatSize, 64u);
8021 if (!Subtarget.
hasAVX2() && ScalarSize < 32)
8026 if (RepeatSize > ScalarSize && SubElems == 1)
8031 for (
unsigned i = 0; i != NumElems && Match; ++i) {
8035 if (RepeatedLoads[i % SubElems].
isUndef())
8036 RepeatedLoads[i % SubElems] = Elt;
8038 Match &= (RepeatedLoads[i % SubElems] == Elt);
8042 Match &= !RepeatedLoads.
front().isUndef();
8043 Match &= !RepeatedLoads.
back().isUndef();
8051 if (RepeatSize > ScalarSize)
8053 RepeatSize / ScalarSize);
8059 RepeatVT, RepeatedLoads,
DL, DAG, Subtarget, IsAfterLegalize,
8061 SDValue Broadcast = RepeatLoad;
8062 if (RepeatSize > ScalarSize) {
8073 DAG.
getNode(X86ISD::VBROADCAST,
DL, BroadcastVT, RepeatLoad);
8088 VT, ReverseElts,
DL, DAG, Subtarget, IsAfterLegalize,
Depth + 1)) {
8090 std::iota(ReverseMask.
rbegin(), ReverseMask.
rend(), 0);
9150 "Illegal variable permute mask size");
9158 SDLoc(IndicesVec), SizeInBits);
9162 IndicesVT, IndicesVec);
9174 Subtarget, DAG,
SDLoc(IndicesVec));
9199 for (
uint64_t i = 0; i != Scale; ++i) {
9200 IndexScale |= Scale << (i * NumDstBits);
9201 IndexOffset |= i << (i * NumDstBits);
9211 unsigned Opcode = 0;
9217 Opcode = X86ISD::PSHUFB;
9220 if (Subtarget.hasVLX() && Subtarget.hasBWI())
9221 Opcode = X86ISD::VPERMV;
9223 Opcode = X86ISD::PSHUFB;
9224 ShuffleVT = MVT::v16i8;
9229 if (Subtarget.
hasAVX()) {
9230 Opcode = X86ISD::VPERMILPV;
9231 ShuffleVT = MVT::v4f32;
9233 Opcode = X86ISD::PSHUFB;
9234 ShuffleVT = MVT::v16i8;
9239 if (Subtarget.
hasAVX()) {
9242 Opcode = X86ISD::VPERMILPV;
9243 ShuffleVT = MVT::v2f64;
9255 if (Subtarget.hasVLX() && Subtarget.hasVBMI())
9256 Opcode = X86ISD::VPERMV;
9257 else if (Subtarget.hasXOP()) {
9264 DAG.
getNode(X86ISD::VPPERM,
DL, MVT::v16i8, LoSrc, HiSrc, LoIdx),
9265 DAG.
getNode(X86ISD::VPPERM,
DL, MVT::v16i8, LoSrc, HiSrc, HiIdx));
9266 }
else if (Subtarget.
hasAVX()) {
9289 if (Subtarget.hasVLX() && Subtarget.hasBWI())
9290 Opcode = X86ISD::VPERMV;
9291 else if (Subtarget.
hasAVX()) {
9293 IndicesVec = ScaleIndices(IndicesVec, 2);
9296 MVT::v32i8, DAG.
getBitcast(MVT::v32i8, SrcVec),
9297 DAG.
getBitcast(MVT::v32i8, IndicesVec),
DL, DAG, Subtarget));
9303 Opcode = X86ISD::VPERMV;
9304 else if (Subtarget.
hasAVX()) {
9307 {0, 1, 2, 3, 0, 1, 2, 3});
9309 {4, 5, 6, 7, 4, 5, 6, 7});
9310 if (Subtarget.hasXOP())
9312 VT, DAG.
getNode(X86ISD::VPERMIL2,
DL, MVT::v8f32, LoLo, HiHi,
9318 DAG.
getNode(X86ISD::VPERMILPV,
DL, MVT::v8f32, HiHi, IndicesVec),
9319 DAG.
getNode(X86ISD::VPERMILPV,
DL, MVT::v8f32, LoLo, IndicesVec),
9327 if (!Subtarget.hasVLX()) {
9329 SrcVec =
widenSubVector(WidenSrcVT, SrcVec,
false, Subtarget, DAG,
9331 IndicesVec =
widenSubVector(MVT::v8i64, IndicesVec,
false, Subtarget,
9332 DAG,
SDLoc(IndicesVec));
9337 Opcode = X86ISD::VPERMV;
9338 }
else if (Subtarget.
hasAVX()) {
9346 if (Subtarget.hasXOP())
9348 VT, DAG.
getNode(X86ISD::VPERMIL2,
DL, MVT::v4f64, LoLo, HiHi,
9354 DAG.
getNode(X86ISD::VPERMILPV,
DL, MVT::v4f64, HiHi, IndicesVec),
9355 DAG.
getNode(X86ISD::VPERMILPV,
DL, MVT::v4f64, LoLo, IndicesVec),
9361 if (Subtarget.hasVBMI())
9362 Opcode = X86ISD::VPERMV;
9365 if (Subtarget.hasBWI())
9366 Opcode = X86ISD::VPERMV;
9373 Opcode = X86ISD::VPERMV;
9381 "Illegal variable permute shuffle type");
9385 IndicesVec = ScaleIndices(IndicesVec, Scale);
9388 IndicesVec = DAG.
getBitcast(ShuffleIdxVT, IndicesVec);
9391 SDValue Res = Opcode == X86ISD::VPERMV
9392 ? DAG.
getNode(Opcode,
DL, ShuffleVT, IndicesVec, SrcVec)
9393 : DAG.
getNode(Opcode,
DL, ShuffleVT, SrcVec, IndicesVec);
14218 assert(Mask.size() == 8 &&
"Shuffle mask length doesn't match!");
14225 return DAG.
getNode(X86ISD::PSHUFLW,
DL, VT, V,
14230 for (
int i = 0; i != 4; ++i)
14231 HiMask[i] = (HiMask[i] < 0 ? HiMask[i] : (HiMask[i] - 4));
14232 return DAG.
getNode(X86ISD::PSHUFHW,
DL, VT, V,
14237 copy_if(LoMask, std::back_inserter(LoInputs), [](
int M) {
return M >= 0; });
14241 copy_if(HiMask, std::back_inserter(HiInputs), [](
int M) {
return M >= 0; });
14245 int NumHToL = LoInputs.
size() - NumLToL;
14247 int NumHToH = HiInputs.
size() - NumLToH;
14261 V = DAG.
getNode(X86ISD::PSHUFD,
DL, PSHUFDVT, V,
14266 if ((NumHToL + NumHToH) == 0 || (NumLToL + NumLToH) == 0) {
14267 int PSHUFDMask[4] = { -1, -1, -1, -1 };
14269 int DOffset = ((NumHToL + NumHToH) == 0 ? 0 : 2);
14272 for (
int DWord = 0; DWord != 4; ++DWord) {
14273 int M0 = Mask[2 * DWord + 0];
14274 int M1 = Mask[2 * DWord + 1];
14277 if (
M0 < 0 &&
M1 < 0)
14280 bool Match =
false;
14281 for (
int j = 0, e = DWordPairs.
size(); j < e; ++j) {
14282 auto &DWordPair = DWordPairs[j];
14285 DWordPair.first = (
M0 >= 0 ?
M0 : DWordPair.first);
14286 DWordPair.second = (
M1 >= 0 ?
M1 : DWordPair.second);
14287 PSHUFDMask[DWord] = DOffset + j;
14293 PSHUFDMask[DWord] = DOffset + DWordPairs.
size();
14298 if (DWordPairs.
size() <= 2) {
14299 DWordPairs.
resize(2, std::make_pair(-1, -1));
14300 int PSHUFHalfMask[4] = {DWordPairs[0].first, DWordPairs[0].second,
14301 DWordPairs[1].first, DWordPairs[1].second};
14306 std::fill(PSHUFHalfMask, PSHUFHalfMask + 4, SplatIdx);
14307 PSHUFDMask[0] = PSHUFDMask[2] = DOffset + 0;
14308 PSHUFDMask[1] = PSHUFDMask[3] = DOffset + 1;
14310 if ((NumHToL + NumHToH) == 0)
14311 return ShuffleDWordPairs(PSHUFHalfMask, PSHUFDMask, X86ISD::PSHUFLW);
14312 if ((NumLToL + NumLToH) == 0)
14313 return ShuffleDWordPairs(PSHUFHalfMask, PSHUFDMask, X86ISD::PSHUFHW);
14349 int AOffset,
int BOffset) {
14351 "Must call this with A having 3 or 1 inputs from the A half.");
14353 "Must call this with B having 1 or 3 inputs from the B half.");
14355 "Must call this with either 3:1 or 1:3 inputs (summing to 4).");
14357 bool ThreeAInputs = AToAInputs.
size() == 3;
14363 int ADWord = 0, BDWord = 0;
14364 int &TripleDWord = ThreeAInputs ? ADWord : BDWord;
14365 int &OneInputDWord = ThreeAInputs ? BDWord : ADWord;
14366 int TripleInputOffset = ThreeAInputs ? AOffset : BOffset;
14367 ArrayRef<int> TripleInputs = ThreeAInputs ? AToAInputs : BToAInputs;
14368 int OneInput = ThreeAInputs ? BToAInputs[0] : AToAInputs[0];
14369 int TripleInputSum = 0 + 1 + 2 + 3 + (4 * TripleInputOffset);
14370 int TripleNonInputIdx =
14371 TripleInputSum - std::accumulate(TripleInputs.
begin(), TripleInputs.
end(), 0);
14372 TripleDWord = TripleNonInputIdx / 2;
14376 OneInputDWord = (OneInput / 2) ^ 1;
14383 if (BToBInputs.
size() == 2 && AToBInputs.
size() == 2) {
14388 int NumFlippedAToBInputs =
llvm::count(AToBInputs, 2 * ADWord) +
14390 int NumFlippedBToBInputs =
llvm::count(BToBInputs, 2 * BDWord) +
14392 if ((NumFlippedAToBInputs == 1 &&
14393 (NumFlippedBToBInputs == 0 || NumFlippedBToBInputs == 2)) ||
14394 (NumFlippedBToBInputs == 1 &&
14395 (NumFlippedAToBInputs == 0 || NumFlippedAToBInputs == 2))) {
14400 auto FixFlippedInputs = [&V, &
DL, &Mask, &DAG](
int PinnedIdx,
int DWord,
14402 int FixIdx = PinnedIdx ^ 1;
14403 bool IsFixIdxInput =
is_contained(Inputs, PinnedIdx ^ 1);
14407 int FixFreeIdx = 2 * (DWord ^ (PinnedIdx / 2 == DWord));
14408 bool IsFixFreeIdxInput =
is_contained(Inputs, FixFreeIdx);
14409 if (IsFixIdxInput == IsFixFreeIdxInput)
14412 assert(IsFixIdxInput != IsFixFreeIdxInput &&
14413 "We need to be changing the number of flipped inputs!");
14414 int PSHUFHalfMask[] = {0, 1, 2, 3};
14415 std::swap(PSHUFHalfMask[FixFreeIdx % 4], PSHUFHalfMask[FixIdx % 4]);
14417 FixIdx < 4 ? X86ISD::PSHUFLW : X86ISD::PSHUFHW,
DL,
14421 for (
int &M : Mask)
14422 if (M >= 0 && M == FixIdx)
14424 else if (M >= 0 && M == FixFreeIdx)
14427 if (NumFlippedBToBInputs != 0) {
14429 BToAInputs.
size() == 3 ? TripleNonInputIdx : OneInput;
14430 FixFlippedInputs(BPinnedIdx, BDWord, BToBInputs);
14432 assert(NumFlippedAToBInputs != 0 &&
"Impossible given predicates!");
14433 int APinnedIdx = ThreeAInputs ? TripleNonInputIdx : OneInput;
14434 FixFlippedInputs(APinnedIdx, ADWord, AToBInputs);
14439 int PSHUFDMask[] = {0, 1, 2, 3};
14440 PSHUFDMask[ADWord] = BDWord;
14441 PSHUFDMask[BDWord] = ADWord;
14448 for (
int &M : Mask)
14449 if (M >= 0 && M/2 == ADWord)
14450 M = 2 * BDWord + M % 2;
14451 else if (M >= 0 && M/2 == BDWord)
14452 M = 2 * ADWord + M % 2;
14458 if ((NumLToL == 3 && NumHToL == 1) || (NumLToL == 1 && NumHToL == 3))
14459 return balanceSides(LToLInputs, HToLInputs, HToHInputs, LToHInputs, 0, 4);
14460 if ((NumHToH == 3 && NumLToH == 1) || (NumHToH == 1 && NumLToH == 3))
14461 return balanceSides(HToHInputs, LToHInputs, LToLInputs, HToLInputs, 4, 0);
14468 int PSHUFLMask[4] = {-1, -1, -1, -1};
14469 int PSHUFHMask[4] = {-1, -1, -1, -1};
14470 int PSHUFDMask[4] = {-1, -1, -1, -1};
14475 auto fixInPlaceInputs =
14479 if (InPlaceInputs.
empty())
14481 if (InPlaceInputs.
size() == 1) {
14482 SourceHalfMask[InPlaceInputs[0] - HalfOffset] =
14483 InPlaceInputs[0] - HalfOffset;
14484 PSHUFDMask[InPlaceInputs[0] / 2] = InPlaceInputs[0] / 2;
14487 if (IncomingInputs.
empty()) {
14489 for (
int Input : InPlaceInputs) {
14490 SourceHalfMask[
Input - HalfOffset] =
Input - HalfOffset;
14496 assert(InPlaceInputs.
size() == 2 &&
"Cannot handle 3 or 4 inputs!");
14497 SourceHalfMask[InPlaceInputs[0] - HalfOffset] =
14498 InPlaceInputs[0] - HalfOffset;
14501 int AdjIndex = InPlaceInputs[0] ^ 1;
14502 SourceHalfMask[AdjIndex - HalfOffset] = InPlaceInputs[1] - HalfOffset;
14504 PSHUFDMask[AdjIndex / 2] = AdjIndex / 2;
14506 fixInPlaceInputs(LToLInputs, HToLInputs, PSHUFLMask, LoMask, 0);
14507 fixInPlaceInputs(HToHInputs, LToHInputs, PSHUFHMask, HiMask, 4);
14513 auto moveInputsToRightHalf = [&PSHUFDMask](
14518 auto isWordClobbered = [](
ArrayRef<int> SourceHalfMask,
int Word) {
14519 return SourceHalfMask[Word] >= 0 && SourceHalfMask[Word] != Word;
14521 auto isDWordClobbered = [&isWordClobbered](
ArrayRef<int> SourceHalfMask,
14523 int LowWord = Word & ~1;
14524 int HighWord = Word | 1;
14525 return isWordClobbered(SourceHalfMask, LowWord) ||
14526 isWordClobbered(SourceHalfMask, HighWord);
14529 if (IncomingInputs.
empty())
14532 if (ExistingInputs.
empty()) {
14534 for (
int Input : IncomingInputs) {
14537 if (isWordClobbered(SourceHalfMask,
Input - SourceOffset)) {
14538 if (SourceHalfMask[SourceHalfMask[
Input - SourceOffset]] < 0) {
14539 SourceHalfMask[SourceHalfMask[
Input - SourceOffset]] =
14540 Input - SourceOffset;
14542 for (
int &M : HalfMask)
14543 if (M == SourceHalfMask[
Input - SourceOffset] + SourceOffset)
14545 else if (M ==
Input)
14546 M = SourceHalfMask[
Input - SourceOffset] + SourceOffset;
14548 assert(SourceHalfMask[SourceHalfMask[
Input - SourceOffset]] ==
14549 Input - SourceOffset &&
14550 "Previous placement doesn't match!");
14555 Input = SourceHalfMask[
Input - SourceOffset] + SourceOffset;
14559 if (PSHUFDMask[(
Input - SourceOffset + DestOffset) / 2] < 0)
14560 PSHUFDMask[(
Input - SourceOffset + DestOffset) / 2] =
Input / 2;
14562 assert(PSHUFDMask[(
Input - SourceOffset + DestOffset) / 2] ==
14564 "Previous placement doesn't match!");
14570 for (
int &M : HalfMask)
14571 if (M >= SourceOffset && M < SourceOffset + 4) {
14572 M = M - SourceOffset + DestOffset;
14573 assert(M >= 0 &&
"This should never wrap below zero!");
14581 if (IncomingInputs.
size() == 1) {
14582 if (isWordClobbered(SourceHalfMask, IncomingInputs[0] - SourceOffset)) {
14583 int InputFixed =
find(SourceHalfMask, -1) - std::begin(SourceHalfMask) +
14585 SourceHalfMask[InputFixed - SourceOffset] =
14586 IncomingInputs[0] - SourceOffset;
14588 IncomingInputs[0] = InputFixed;
14590 }
else if (IncomingInputs.
size() == 2) {
14591 if (IncomingInputs[0] / 2 != IncomingInputs[1] / 2 ||
14592 isDWordClobbered(SourceHalfMask, IncomingInputs[0] - SourceOffset)) {
14596 int InputsFixed[2] = {IncomingInputs[0] - SourceOffset,
14597 IncomingInputs[1] - SourceOffset};
14602 if (!isWordClobbered(SourceHalfMask, InputsFixed[0]) &&
14603 SourceHalfMask[InputsFixed[0] ^ 1] < 0) {
14604 SourceHalfMask[InputsFixed[0]] = InputsFixed[0];
14605 SourceHalfMask[InputsFixed[0] ^ 1] = InputsFixed[1];
14606 InputsFixed[1] = InputsFixed[0] ^ 1;
14607 }
else if (!isWordClobbered(SourceHalfMask, InputsFixed[1]) &&
14608 SourceHalfMask[InputsFixed[1] ^ 1] < 0) {
14609 SourceHalfMask[InputsFixed[1]] = InputsFixed[1];
14610 SourceHalfMask[InputsFixed[1] ^ 1] = InputsFixed[0];
14611 InputsFixed[0] = InputsFixed[1] ^ 1;
14612 }
else if (SourceHalfMask[2 * ((InputsFixed[0] / 2) ^ 1)] < 0 &&
14613 SourceHalfMask[2 * ((InputsFixed[0] / 2) ^ 1) + 1] < 0) {
14617 SourceHalfMask[2 * ((InputsFixed[0] / 2) ^ 1)] = InputsFixed[0];
14618 SourceHalfMask[2 * ((InputsFixed[0] / 2) ^ 1) + 1] = InputsFixed[1];
14619 InputsFixed[0] = 2 * ((InputsFixed[0] / 2) ^ 1);
14620 InputsFixed[1] = 2 * ((InputsFixed[0] / 2) ^ 1) + 1;
14626 for (
int i = 0; i < 4; ++i)
14627 assert((SourceHalfMask[i] < 0 || SourceHalfMask[i] == i) &&
14628 "We can't handle any clobbers here!");
14629 assert(InputsFixed[1] != (InputsFixed[0] ^ 1) &&
14630 "Cannot have adjacent inputs here!");
14632 SourceHalfMask[InputsFixed[0] ^ 1] = InputsFixed[1];
14633 SourceHalfMask[InputsFixed[1]] = InputsFixed[0] ^ 1;
14637 for (
int &M : FinalSourceHalfMask)
14638 if (M == (InputsFixed[0] ^ 1) + SourceOffset)
14639 M = InputsFixed[1] + SourceOffset;
14640 else if (M == InputsFixed[1] + SourceOffset)
14641 M = (InputsFixed[0] ^ 1) + SourceOffset;
14643 InputsFixed[1] = InputsFixed[0] ^ 1;
14647 for (
int &M : HalfMask)
14648 if (M == IncomingInputs[0])
14649 M = InputsFixed[0] + SourceOffset;
14650 else if (M == IncomingInputs[1])
14651 M = InputsFixed[1] + SourceOffset;
14653 IncomingInputs[0] = InputsFixed[0] + SourceOffset;
14654 IncomingInputs[1] = InputsFixed[1] + SourceOffset;
14661 int FreeDWord = (PSHUFDMask[DestOffset / 2] < 0 ? 0 : 1) + DestOffset / 2;
14662 assert(PSHUFDMask[FreeDWord] < 0 &&
"DWord not free");
14663 PSHUFDMask[FreeDWord] = IncomingInputs[0] / 2;
14664 for (
int &M : HalfMask)
14665 for (
int Input : IncomingInputs)
14667 M = FreeDWord * 2 +
Input % 2;
14669 moveInputsToRightHalf(HToLInputs, LToLInputs, PSHUFHMask, LoMask, HiMask,
14671 moveInputsToRightHalf(LToHInputs, HToHInputs, PSHUFLMask, HiMask, LoMask,
14677 V = DAG.
getNode(X86ISD::PSHUFLW,
DL, VT, V,
14680 V = DAG.
getNode(X86ISD::PSHUFHW,
DL, VT, V,
14691 "Failed to lift all the high half inputs to the low mask!");
14692 assert(
none_of(HiMask, [](
int M) {
return M >= 0 && M < 4; }) &&
14693 "Failed to lift all the low half inputs to the high mask!");
14697 V = DAG.
getNode(X86ISD::PSHUFLW,
DL, VT, V,
14701 for (
int &M : HiMask)
14705 V = DAG.
getNode(X86ISD::PSHUFHW,
DL, VT, V,
15067 assert(
V1.getSimpleValueType() == MVT::v16i8 &&
"Bad operand type!");
15069 assert(Mask.size() == 16 &&
"Unexpected mask size for v16 shuffle!");
15089 Zeroable, Subtarget, DAG))
15102 if (Subtarget.hasSSE4A())
15107 int NumV2Elements =
count_if(Mask, [](
int M) {
return M >= 16; });
15110 if (NumV2Elements == 0) {
15113 Mask, Subtarget, DAG))
15133 for (
int i = 0; i < 16; i += 2)
15134 if (Mask[i] >= 0 && Mask[i + 1] >= 0 && Mask[i] != Mask[i + 1])
15139 auto tryToWidenViaDuplication = [&]() ->
SDValue {
15140 if (!canWidenViaDuplication(Mask))
15143 copy_if(Mask, std::back_inserter(LoInputs),
15144 [](
int M) {
return M >= 0 && M < 8; });
15148 copy_if(Mask, std::back_inserter(HiInputs), [](
int M) {
return M >= 8; });
15152 bool TargetLo = LoInputs.
size() >= HiInputs.
size();
15153 ArrayRef<int> InPlaceInputs = TargetLo ? LoInputs : HiInputs;
15154 ArrayRef<int> MovingInputs = TargetLo ? HiInputs : LoInputs;
15156 int PreDupI16Shuffle[] = {-1, -1, -1, -1, -1, -1, -1, -1};
15158 for (
int I : InPlaceInputs) {
15159 PreDupI16Shuffle[
I/2] =
I/2;
15162 int j = TargetLo ? 0 : 4, je = j + 4;
15163 for (
int i = 0, ie = MovingInputs.
size(); i < ie; ++i) {
15166 if (PreDupI16Shuffle[j] != MovingInputs[i] / 2) {
15169 while (j < je && PreDupI16Shuffle[j] >= 0)
15177 PreDupI16Shuffle[j] = MovingInputs[i] / 2;
15181 LaneMap[MovingInputs[i]] = 2 * j + MovingInputs[i] % 2;
15186 DAG.
getUNDEF(MVT::v8i16), PreDupI16Shuffle));
15189 bool EvenInUse =
false, OddInUse =
false;
15190 for (
int i = 0; i < 16; i += 2) {
15191 EvenInUse |= (Mask[i + 0] >= 0);
15192 OddInUse |= (Mask[i + 1] >= 0);
15193 if (EvenInUse && OddInUse)
15196 V1 = DAG.
getNode(TargetLo ? X86ISD::UNPCKL : X86ISD::UNPCKH,
DL,
15197 MVT::v16i8, EvenInUse ?
V1 : DAG.
getUNDEF(MVT::v16i8),
15200 int PostDupI16Shuffle[8] = {-1, -1, -1, -1, -1, -1, -1, -1};
15201 for (
int i = 0; i < 16; ++i)
15202 if (Mask[i] >= 0) {
15203 int MappedMask = LaneMap[Mask[i]] - (TargetLo ? 0 : 8);
15204 assert(MappedMask < 8 &&
"Invalid v8 shuffle mask!");
15205 if (PostDupI16Shuffle[i / 2] < 0)
15206 PostDupI16Shuffle[i / 2] = MappedMask;
15208 assert(PostDupI16Shuffle[i / 2] == MappedMask &&
15209 "Conflicting entries in the original shuffle!");
15214 DAG.
getUNDEF(MVT::v8i16), PostDupI16Shuffle));
15216 if (
SDValue V = tryToWidenViaDuplication())
15230 Zeroable, Subtarget, DAG))
15234 bool IsSingleInput = V2.
isUndef();
15253 if (Subtarget.
hasSSSE3() && (IsSingleInput || NumEvenDrops != 1)) {
15254 bool V1InUse =
false;
15255 bool V2InUse =
false;
15258 DL, MVT::v16i8,
V1, V2, Mask, Zeroable, DAG, V1InUse, V2InUse);
15263 if (V1InUse && V2InUse) {
15266 Zeroable, Subtarget, DAG))
15278 DL, MVT::v16i8,
V1, V2, Mask, Subtarget, DAG))
15282 if (Subtarget.hasVBMI())
15287 if (Subtarget.hasXOP()) {
15289 return DAG.
getNode(X86ISD::VPPERM,
DL, MVT::v16i8,
V1, V2, MaskNode);
15295 DL, MVT::v16i8,
V1, V2, Mask, Subtarget, DAG))
15303 if (NumV2Elements == 1)
15305 DL, MVT::v16i8,
V1, V2, Mask, Zeroable, Subtarget, DAG))
15318 if (NumEvenDrops) {
15324 assert(NumEvenDrops <= 3 &&
15325 "No support for dropping even elements more than 3 times.");
15327 for (
unsigned i = 0; i != 8; i += 1 << (NumEvenDrops - 1))
15332 if (!IsSingleInput)
15338 IsSingleInput ?
V1 : V2);
15339 for (
int i = 1; i < NumEvenDrops; ++i) {
15340 Result = DAG.
getBitcast(MVT::v8i16, Result);
15341 Result = DAG.
getNode(X86ISD::PACKUS,
DL, MVT::v16i8, Result, Result);
15347 if (NumOddDrops == 1) {
15351 if (!IsSingleInput)
15352 V2 = DAG.
getNode(X86ISD::VSRLI,
DL, MVT::v8i16,
15355 return DAG.
getNode(X86ISD::PACKUS,
DL, MVT::v16i8,
V1,
15356 IsSingleInput ?
V1 : V2);
15360 if (NumV2Elements > 0)
15362 Zeroable, Subtarget, DAG);
15369 std::array<int, 8> LoBlendMask = {{-1, -1, -1, -1, -1, -1, -1, -1}};
15370 std::array<int, 8> HiBlendMask = {{-1, -1, -1, -1, -1, -1, -1, -1}};
15371 for (
int i = 0; i < 16; ++i)
15373 (i < 8 ? LoBlendMask[i] : HiBlendMask[i % 8]) = Mask[i];
15379 if (
none_of(LoBlendMask, [](
int M) {
return M >= 0 && M % 2 == 1; }) &&
15380 none_of(HiBlendMask, [](
int M) {
return M >= 0 && M % 2 == 1; })) {
15387 VHiHalf = DAG.
getUNDEF(MVT::v8i16);
15390 for (
int &M : LoBlendMask)
15393 for (
int &M : HiBlendMask)
15402 MVT::v8i16, DAG.
getNode(X86ISD::UNPCKL,
DL, MVT::v16i8, V, Zero));
15404 MVT::v8i16, DAG.
getNode(X86ISD::UNPCKH,
DL, MVT::v16i8, V, Zero));
15410 return DAG.
getNode(X86ISD::PACKUS,
DL, MVT::v16i8, LoV, HiV);
16395 int NumLaneElts = NumElts / NumLanes;
16400 for (
unsigned BroadcastSize : {16, 32, 64}) {
16409 for (
int i = 0; i != NumElts; i += NumBroadcastElts)
16410 for (
int j = 0; j != NumBroadcastElts; ++j) {
16411 int M = Mask[i + j];
16414 int &R = RepeatMask[j];
16415 if (0 != ((M % NumElts) / NumLaneElts))
16417 if (0 <= R && R != M)
16425 if (!FindRepeatingBroadcastMask(RepeatMask))
16433 for (
int i = 0; i != NumElts; i += NumBroadcastElts)
16434 for (
int j = 0; j != NumBroadcastElts; ++j)
16435 BroadcastMask[i + j] = j;
16439 if (BroadcastMask == Mask)
16457 auto ShuffleSubLanes = [&](
int SubLaneScale) {
16458 int NumSubLanes = NumLanes * SubLaneScale;
16459 int NumSubLaneElts = NumLaneElts / SubLaneScale;
16464 int TopSrcSubLane = -1;
16470 for (
int DstSubLane = 0; DstSubLane != NumSubLanes; ++DstSubLane) {
16475 for (
int Elt = 0; Elt != NumSubLaneElts; ++Elt) {
16476 int M = Mask[(DstSubLane * NumSubLaneElts) + Elt];
16479 int Lane = (M % NumElts) / NumLaneElts;
16480 if ((0 <= SrcLane) && (SrcLane != Lane))
16483 int LocalM = (M % NumLaneElts) + (M < NumElts ? 0 : NumElts);
16484 SubLaneMask[Elt] = LocalM;
16492 for (
int SubLane = 0; SubLane != SubLaneScale; ++SubLane) {
16494 for (
int i = 0; i != NumSubLaneElts; ++i) {
16495 if (
M1[i] < 0 || M2[i] < 0)
16497 if (
M1[i] != M2[i])
16503 auto &RepeatedSubLaneMask = RepeatedSubLaneMasks[SubLane];
16504 if (!MatchMasks(SubLaneMask, RepeatedSubLaneMask))
16508 for (
int i = 0; i != NumSubLaneElts; ++i) {
16509 int M = SubLaneMask[i];
16512 assert((RepeatedSubLaneMask[i] < 0 || RepeatedSubLaneMask[i] == M) &&
16513 "Unexpected mask element");
16514 RepeatedSubLaneMask[i] = M;
16519 int SrcSubLane = (SrcLane * SubLaneScale) + SubLane;
16520 TopSrcSubLane = std::max(TopSrcSubLane, SrcSubLane);
16521 Dst2SrcSubLanes[DstSubLane] = SrcSubLane;
16526 if (Dst2SrcSubLanes[DstSubLane] < 0)
16529 assert(0 <= TopSrcSubLane && TopSrcSubLane < NumSubLanes &&
16530 "Unexpected source lane");
16534 for (
int SubLane = 0; SubLane <= TopSrcSubLane; ++SubLane) {
16535 int Lane = SubLane / SubLaneScale;
16536 auto &RepeatedSubLaneMask = RepeatedSubLaneMasks[SubLane % SubLaneScale];
16537 for (
int Elt = 0; Elt != NumSubLaneElts; ++Elt) {
16538 int M = RepeatedSubLaneMask[Elt];
16541 int Idx = (SubLane * NumSubLaneElts) + Elt;
16542 RepeatedMask[Idx] = M + (Lane * NumLaneElts);
16548 for (
int i = 0; i != NumElts; i += NumSubLaneElts) {
16549 int SrcSubLane = Dst2SrcSubLanes[i / NumSubLaneElts];
16550 if (SrcSubLane < 0)
16552 for (
int j = 0; j != NumSubLaneElts; ++j)
16553 SubLaneMask[i + j] = j + (SrcSubLane * NumSubLaneElts);
16558 if (RepeatedMask == Mask || SubLaneMask == Mask)
16572 int MinSubLaneScale = 1, MaxSubLaneScale = 1;
16575 MinSubLaneScale = 2;
16577 (!OnlyLowestElts && V2.
isUndef() && VT == MVT::v32i8) ? 4 : 2;
16579 if (Subtarget.hasBWI() && VT == MVT::v64i8)
16580 MinSubLaneScale = MaxSubLaneScale = 4;
16582 for (
int Scale = MinSubLaneScale; Scale <= MaxSubLaneScale; Scale *= 2)
16583 if (
SDValue Shuffle = ShuffleSubLanes(Scale))