75 bool UseX87 = !Subtarget.useSoftFloat() && Subtarget.hasX87();
76 MVT PtrVT = Subtarget.isTarget64BitLP64() ? MVT::i64 : MVT::i32;
92 if (Subtarget.isAtom())
94 else if (Subtarget.is64Bit())
103 if (Subtarget.hasSlowDivide32())
105 if (Subtarget.hasSlowDivide64() && Subtarget.is64Bit())
109 if (Subtarget.canUseCMPXCHG16B())
111 else if (Subtarget.canUseCMPXCHG8B())
124 if (Subtarget.is64Bit())
141 for (
auto VT : {MVT::f32, MVT::f64, MVT::f80}) {
147 if (Subtarget.canUseCMOV()) {
150 if (Subtarget.is64Bit())
159 if (Subtarget.is64Bit())
167 if (Subtarget.is64Bit())
178 if (Subtarget.is64Bit())
182 if (!Subtarget.useSoftFloat()) {
246 if (!Subtarget.is64Bit() && Subtarget.hasX87()) {
257 if (!Subtarget.hasSSE2()) {
260 if (Subtarget.is64Bit()) {
265 }
else if (!Subtarget.is64Bit())
278 for (
auto VT : { MVT::i8, MVT::i16, MVT::i32, MVT::i64 }) {
289 for (
auto VT : { MVT::f32, MVT::f64, MVT::f80, MVT::f128,
290 MVT::i8, MVT::i16, MVT::i32, MVT::i64 }) {
294 if (Subtarget.is64Bit())
305 if (!Subtarget.useSoftFloat() && Subtarget.hasX87()) {
323 if (!Subtarget.hasBMI()) {
326 if (Subtarget.is64Bit()) {
332 if (Subtarget.hasLZCNT()) {
338 for (
auto VT : {MVT::i8, MVT::i16, MVT::i32, MVT::i64}) {
339 if (VT == MVT::i64 && !Subtarget.is64Bit())
353 (!Subtarget.useSoftFloat() && Subtarget.hasF16C()) ?
Custom :
Expand);
360 for (
auto VT : {MVT::f32, MVT::f64, MVT::f80, MVT::f128}) {
365 for (
MVT VT : {MVT::f32, MVT::f64, MVT::f80, MVT::f128}) {
378 if (Subtarget.is64Bit())
380 if (Subtarget.hasPOPCNT()) {
392 if (Subtarget.hasBMI2()) {
393 bool SlowPDEP = Subtarget.isPDEPSlow();
394 bool SlowPEXT = Subtarget.isPEXTSlow();
399 if (Subtarget.is64Bit()) {
407 if (!Subtarget.hasMOVBE())
411 for (
auto VT : { MVT::f32, MVT::f64, MVT::f80, MVT::f128 }) {
417 for (
auto VT : { MVT::i8, MVT::i16, MVT::i32, MVT::i64 }) {
418 if (VT == MVT::i64 && !Subtarget.is64Bit())
438 for (
auto VT : { MVT::i32, MVT::i64 }) {
439 if (VT == MVT::i64 && !Subtarget.is64Bit())
450 for (
auto VT : { MVT::i32, MVT::i64 }) {
451 if (VT == MVT::i64 && !Subtarget.is64Bit())
458 if (Subtarget.hasSSEPrefetch())
464 for (
auto VT : { MVT::i8, MVT::i16, MVT::i32, MVT::i64 }) {
474 if (!Subtarget.is64Bit())
477 if (Subtarget.is64Bit() && Subtarget.hasAVX()) {
484 if (Subtarget.canUseCMPXCHG16B())
495 if (Subtarget.isTargetPS())
503 bool Is64Bit = Subtarget.is64Bit();
559 if (!Subtarget.useSoftFloat() && Subtarget.hasSSE2()) {
563 : &X86::FR16RegClass);
565 : &X86::FR32RegClass);
567 : &X86::FR64RegClass);
575 for (
auto VT : { MVT::f32, MVT::f64 }) {
596 setF16Action(MVT::f16,
Promote);
655 }
else if (!Subtarget.useSoftFloat() && Subtarget.hasSSE1() &&
656 (UseX87 || Is64Bit)) {
694 for (
auto VT : { MVT::f32, MVT::f64 }) {
707 if (UseX87 && (
getRegClassFor(MVT::f32) == &X86::RFP32RegClass)) {
708 addLegalFPImmediate(
APFloat(+0.0f));
709 addLegalFPImmediate(
APFloat(+1.0f));
710 addLegalFPImmediate(
APFloat(-0.0f));
711 addLegalFPImmediate(
APFloat(-1.0f));
713 addLegalFPImmediate(
APFloat(+0.0f));
718 addLegalFPImmediate(
APFloat(+0.0));
719 addLegalFPImmediate(
APFloat(+1.0));
720 addLegalFPImmediate(
APFloat(-0.0));
721 addLegalFPImmediate(
APFloat(-1.0));
723 addLegalFPImmediate(
APFloat(+0.0));
754 addLegalFPImmediate(TmpFlt);
756 addLegalFPImmediate(TmpFlt);
762 addLegalFPImmediate(TmpFlt2);
764 addLegalFPImmediate(TmpFlt2);
813 if (!Subtarget.useSoftFloat() && Subtarget.is64Bit() && Subtarget.hasSSE1()) {
815 : &X86::VR128RegClass);
892 for (
auto VT : { MVT::v8f16, MVT::v16f16, MVT::v32f16,
893 MVT::v4f32, MVT::v8f32, MVT::v16f32,
894 MVT::v2f64, MVT::v4f64, MVT::v8f64 }) {
977 if (!Subtarget.useSoftFloat() && Subtarget.hasMMX()) {
982 auto SetFPMinMaxAction = [&](
MVT VT) {
993 if (!Subtarget.useSoftFloat() && Subtarget.hasSSE1()) {
995 : &X86::VR128RegClass);
997 SetFPMinMaxAction(MVT::f32);
1020 if (!Subtarget.useSoftFloat() && Subtarget.hasSSE2()) {
1022 : &X86::VR128RegClass);
1027 : &X86::VR128RegClass);
1029 : &X86::VR128RegClass);
1031 : &X86::VR128RegClass);
1033 : &X86::VR128RegClass);
1035 : &X86::VR128RegClass);
1037 for (
auto VT : { MVT::f64, MVT::v4f32, MVT::v2f64 })
1038 SetFPMinMaxAction(VT);
1057 if (!Subtarget.is64Bit()) {
1079 if (Subtarget.hasPCLMUL()) {
1080 for (
auto VT : {MVT::i64, MVT::v4i32, MVT::v2i64}) {
1089 for (
auto VT : { MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64 }) {
1099 for (
auto VT : {MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64, MVT::i64}) {
1126 for (
auto VT : { MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64 }) {
1146 for (
auto VT : { MVT::v16i8, MVT::v8i16, MVT::v4i32 }) {
1154 for (
auto VT : { MVT::v8f16, MVT::v2f64, MVT::v2i64 }) {
1159 if (VT == MVT::v2i64 && !Subtarget.is64Bit())
1165 setF16Action(MVT::v8f16,
Expand);
1190 for (
auto VT : {MVT::v2i8, MVT::v4i8, MVT::v8i8, MVT::v2i16, MVT::v4i16}) {
1199 for (
MVT VT : {MVT::i8, MVT::i16, MVT::i32, MVT::i64}) {
1200 if (VT == MVT::i64 && !Subtarget.is64Bit())
1245 if (!Subtarget.hasAVX512())
1273 for (
auto VT : { MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64 }) {
1277 if (VT == MVT::v2i64)
continue;
1291 if (!Subtarget.useSoftFloat() && Subtarget.hasGFNI()) {
1297 for (
auto VT : {MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64}) {
1305 if (!Subtarget.useSoftFloat() && Subtarget.hasSSSE3()) {
1310 for (
auto VT : {MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64}) {
1322 if (Subtarget.hasNDD()) {
1330 if (!Subtarget.useSoftFloat() && Subtarget.hasSSE41()) {
1331 for (
MVT RoundedTy : {MVT::f32, MVT::f64, MVT::v4f32, MVT::v2f64}) {
1371 for (
auto VT : { MVT::v8i16, MVT::v4i32, MVT::v2i64 }) {
1386 if (Subtarget.is64Bit() && !Subtarget.hasAVX512()) {
1398 if (!Subtarget.useSoftFloat() && Subtarget.hasSSE42()) {
1402 if (!Subtarget.useSoftFloat() && Subtarget.hasXOP()) {
1403 for (
MVT VT : { MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64,
1404 MVT::v32i8, MVT::v16i16, MVT::v8i32, MVT::v4i64 }) {
1410 for (
auto VT : { MVT::i8, MVT::i16, MVT::i32, MVT::i64 })
1414 if (!Subtarget.useSoftFloat() && Subtarget.hasAVX()) {
1415 bool HasInt256 = Subtarget.hasInt256();
1418 : &X86::VR256RegClass);
1420 : &X86::VR256RegClass);
1422 : &X86::VR256RegClass);
1424 : &X86::VR256RegClass);
1426 : &X86::VR256RegClass);
1428 : &X86::VR256RegClass);
1430 : &X86::VR256RegClass);
1432 for (
auto VT : { MVT::v8f32, MVT::v4f64 }) {
1452 SetFPMinMaxAction(VT);
1493 if (!Subtarget.hasAVX512())
1498 for (
auto VT : { MVT::v32i8, MVT::v16i16, MVT::v8i32, MVT::v4i64 }) {
1512 if (VT == MVT::v4i64)
continue;
1533 for (
auto VT : { MVT::v16i16, MVT::v8i32, MVT::v4i64 }) {
1544 for (
auto VT : { MVT::v32i8, MVT::v16i16, MVT::v8i32, MVT::v4i64 }) {
1563 if (Subtarget.hasAnyFMA()) {
1564 for (
auto VT : { MVT::f32, MVT::f64, MVT::v4f32, MVT::v8f32,
1565 MVT::v2f64, MVT::v4f64 }) {
1571 for (
auto VT : { MVT::v32i8, MVT::v16i16, MVT::v8i32, MVT::v4i64 }) {
1612 for (
auto VT : { MVT::v32i8, MVT::v16i16, MVT::v8i32 }) {
1620 for (
auto VT : {MVT::v16i16, MVT::v8i32, MVT::v4i64}) {
1642 for (
auto VT : { MVT::v4i32, MVT::v8i32, MVT::v2i64, MVT::v4i64,
1643 MVT::v4f32, MVT::v8f32, MVT::v2f64, MVT::v4f64 }) {
1650 for (
auto VT : { MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64,
1651 MVT::v8f16, MVT::v4f32, MVT::v2f64 }) {
1656 for (
MVT VT : { MVT::v32i8, MVT::v16i16, MVT::v8i32, MVT::v4i64,
1657 MVT::v16f16, MVT::v8f32, MVT::v4f64 }) {
1668 setF16Action(MVT::v16f16,
Expand);
1678 if (Subtarget.hasPCLMUL()) {
1679 for (
auto VT : {MVT::v8i32, MVT::v4i64}) {
1690 if (Subtarget.is64Bit()) {
1702 for (
auto VT : { MVT::v4i32, MVT::v8i32, MVT::v2i64, MVT::v4i64,
1703 MVT::v4f32, MVT::v8f32, MVT::v2f64, MVT::v4f64 })
1707 if (Subtarget.hasBMI2() && Subtarget.isPDEPSlow())
1708 for (
auto VT : {MVT::v4i32, MVT::v8i32, MVT::v2i64, MVT::v4i64})
1711 if (Subtarget.hasBMI2() && Subtarget.isPEXTSlow())
1712 for (
auto VT : {MVT::v4i32, MVT::v8i32, MVT::v2i64, MVT::v4i64})
1716 if (Subtarget.hasGFNI()) {
1722 if (!Subtarget.useSoftFloat() && !Subtarget.hasFP16() &&
1723 Subtarget.hasF16C()) {
1724 for (
MVT VT : { MVT::f16, MVT::v2f16, MVT::v4f16, MVT::v8f16 }) {
1728 for (
MVT VT : { MVT::f32, MVT::v2f32, MVT::v4f32, MVT::v8f32 }) {
1743 if (!Subtarget.useSoftFloat() && Subtarget.hasAVX512()) {
1771 if (!Subtarget.hasDQI()) {
1784 for (
auto VT : { MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64 }) {
1790 for (
auto VT : { MVT::v1i1, MVT::v2i1, MVT::v4i1, MVT::v8i1, MVT::v16i1 })
1793 for (
auto VT : { MVT::v2i1, MVT::v4i1, MVT::v8i1, MVT::v16i1 }) {
1806 for (
auto VT : { MVT::v1i1, MVT::v2i1, MVT::v4i1, MVT::v8i1 })
1809 if (Subtarget.hasDQI() && Subtarget.hasVLX()) {
1810 for (
MVT VT : {MVT::v4f32, MVT::v8f32, MVT::v2f64, MVT::v4f64}) {
1819 if (!Subtarget.useSoftFloat() && Subtarget.useAVX512Regs()) {
1820 bool HasBWI = Subtarget.hasBWI();
1840 for (
MVT VT : { MVT::v16f32, MVT::v8f64 }) {
1841 SetFPMinMaxAction(VT);
1854 if (Subtarget.hasDQI())
1872 for (
MVT VT : { MVT::v16i1, MVT::v16i8 }) {
1879 for (
MVT VT : { MVT::v16i16, MVT::v16i32 }) {
1916 if (!Subtarget.hasVLX()) {
1917 for (
auto VT : {MVT::v4i32, MVT::v8i32, MVT::v2i64, MVT::v4i64,
1918 MVT::v4f32, MVT::v8f32, MVT::v2f64, MVT::v4f64}) {
1944 for (
auto VT : { MVT::v16f32, MVT::v8f64 }) {
1961 for (
auto VT : {MVT::v32i16, MVT::v16i32, MVT::v8i64}) {
1990 for (
auto VT : { MVT::v64i8, MVT::v32i16, MVT::v16i32, MVT::v8i64 }) {
2022 for (
auto VT : { MVT::v16i32, MVT::v8i64 }) {
2033 for (
auto VT : { MVT::v64i8, MVT::v32i16 }) {
2054 if (Subtarget.hasDQI() || Subtarget.hasFP16())
2060 if (Subtarget.hasDQI()) {
2064 if (Subtarget.hasCDI()) {
2066 for (
auto VT : { MVT::v16i32, MVT::v8i64} ) {
2071 if (Subtarget.hasVPOPCNTDQ()) {
2072 for (
auto VT : { MVT::v16i32, MVT::v8i64 })
2080 for (
auto VT : { MVT::v32i8, MVT::v16i16, MVT::v8i32, MVT::v4i64,
2081 MVT::v16f16, MVT::v8f32, MVT::v4f64 })
2084 for (
auto VT : { MVT::v64i8, MVT::v32i16, MVT::v16i32, MVT::v8i64,
2085 MVT::v32f16, MVT::v16f32, MVT::v8f64 }) {
2096 setF16Action(MVT::v32f16,
Expand);
2105 for (
auto VT : { MVT::v16i32, MVT::v8i64, MVT::v16f32, MVT::v8f64 }) {
2112 for (
auto VT : { MVT::v64i8, MVT::v32i16 }) {
2121 if (Subtarget.hasVBMI2()) {
2122 for (
auto VT : {MVT::v32i16, MVT::v16i32, MVT::v8i64}) {
2132 if (Subtarget.hasPCLMUL()) {
2133 for (
auto VT : {MVT::v16i32, MVT::v8i64}) {
2144 if (Subtarget.hasGFNI()) {
2150 if (!Subtarget.useSoftFloat() && Subtarget.hasVBMI2()) {
2151 for (
auto VT : {MVT::v8i16, MVT::v4i32, MVT::v2i64, MVT::v16i16, MVT::v8i32,
2166 if (!Subtarget.useSoftFloat() && Subtarget.hasAVX512()) {
2167 for (
MVT VT : {MVT::f16, MVT::f32, MVT::f64, MVT::v8f16, MVT::v4f32,
2168 MVT::v2f64, MVT::v16f16, MVT::v8f32, MVT::v4f64})
2177 if (Subtarget.hasDQI()) {
2182 "Unexpected operation action!");
2190 for (
auto VT : { MVT::v2i64, MVT::v4i64 }) {
2198 for (
auto VT : { MVT::v4i32, MVT::v8i32, MVT::v2i64, MVT::v4i64 }) {
2207 for (
auto VT : { MVT::v4i32, MVT::v8i32, MVT::v2i64, MVT::v4i64,
2208 MVT::v4f32, MVT::v8f32, MVT::v2f64, MVT::v4f64 })
2211 if (Subtarget.hasDQI()) {
2226 if (Subtarget.hasCDI()) {
2227 for (
auto VT : {MVT::i256, MVT::i512}) {
2228 if (VT == MVT::i512 && !Subtarget.useAVX512Regs())
2235 for (
auto VT : { MVT::v4i32, MVT::v8i32, MVT::v2i64, MVT::v4i64 }) {
2240 if (Subtarget.hasVPOPCNTDQ()) {
2241 for (
auto VT : {MVT::v4i32, MVT::v8i32, MVT::v2i64, MVT::v4i64})
2249 for (
MVT VT : {MVT::v8i32, MVT::v8f32, MVT::v4i32, MVT::v4f32, MVT::v4i64,
2250 MVT::v4f64, MVT::v2i64, MVT::v2f64, MVT::v16i8, MVT::v8i16,
2251 MVT::v16i16, MVT::v8i8})
2256 for (
MVT VT : {MVT::v16i32, MVT::v16f32, MVT::v8i64, MVT::v8f64})
2260 if (Subtarget.hasVLX())
2261 for (
MVT VT : {MVT::v8i32, MVT::v8f32, MVT::v4i32, MVT::v4f32, MVT::v4i64,
2262 MVT::v4f64, MVT::v2i64, MVT::v2f64})
2266 if (Subtarget.hasVBMI2())
2267 for (
MVT VT : {MVT::v32i16, MVT::v64i8})
2271 if (Subtarget.hasVBMI2() && Subtarget.hasVLX())
2272 for (
MVT VT : {MVT::v16i8, MVT::v8i16, MVT::v32i8, MVT::v16i16})
2278 if (!Subtarget.useSoftFloat() && Subtarget.hasBWI()) {
2282 for (
auto VT : { MVT::v32i1, MVT::v64i1 }) {
2295 for (
auto VT : { MVT::v16i1, MVT::v32i1 })
2303 for (
auto VT : {MVT::v32i8, MVT::v16i8, MVT::v16i16, MVT::v8i16,
2304 MVT::v16f16, MVT::v8f16}) {
2313 if (Subtarget.hasBITALG()) {
2314 for (
auto VT : { MVT::v16i8, MVT::v32i8, MVT::v8i16, MVT::v16i16 })
2318 if (Subtarget.hasBMM()) {
2324 for (
auto VT : {MVT::v16i8, MVT::v32i8, MVT::v64i8})
2329 if (!Subtarget.useSoftFloat() && Subtarget.hasFP16()) {
2330 auto setGroup = [&] (
MVT VT) {
2379 SetFPMinMaxAction(MVT::f16);
2397 if (Subtarget.useAVX512Regs()) {
2398 setGroup(MVT::v32f16);
2436 SetFPMinMaxAction(MVT::v32f16);
2450 if (Subtarget.hasVLX()) {
2451 setGroup(MVT::v8f16);
2452 setGroup(MVT::v16f16);
2489 SetFPMinMaxAction(MVT::v8f16);
2490 SetFPMinMaxAction(MVT::v16f16);
2497 if (!Subtarget.useSoftFloat() &&
2498 (Subtarget.hasAVXNECONVERT() || Subtarget.hasBF16())) {
2500 : &X86::VR128RegClass);
2501 addRegisterClass(MVT::v16bf16, Subtarget.hasAVX512() ? &X86::VR256XRegClass
2502 : &X86::VR256RegClass);
2507 for (
auto VT : {MVT::v8bf16, MVT::v16bf16}) {
2508 setF16Action(VT,
Expand);
2509 if (!Subtarget.hasBF16())
2529 if (!Subtarget.useSoftFloat() && Subtarget.hasBF16() &&
2530 Subtarget.useAVX512Regs()) {
2532 setF16Action(MVT::v32bf16,
Expand);
2545 if (!Subtarget.useSoftFloat() && Subtarget.hasAVX10_2()) {
2546 for (
MVT VT : {MVT::v8i8, MVT::v16i8, MVT::v32i8}) {
2554 for (
MVT VT : {MVT::i32, MVT::i64, MVT::v4i32, MVT::v8i32, MVT::v16i32,
2555 MVT::v2i64, MVT::v4i64}) {
2556 if (VT == MVT::i64 && !Subtarget.is64Bit())
2573 if (Subtarget.useAVX512Regs()) {
2581 SetFPMinMaxAction(MVT::v32bf16);
2586 for (
auto VT : {MVT::v8bf16, MVT::v16bf16}) {
2595 SetFPMinMaxAction(VT);
2597 for (
auto VT : {MVT::f16, MVT::f32, MVT::f64}) {
2610 if (!Subtarget.useSoftFloat()) {
2611 bool HasVNNI = Subtarget.hasVNNI() || Subtarget.hasAVXVNNI();
2612 bool HasVNNIINT8 = Subtarget.hasAVXVNNIINT8() || Subtarget.hasAVX10_2();
2613 bool HasVNNIINT16 = Subtarget.hasAVXVNNIINT16() || Subtarget.hasAVX10_2();
2614 for (
MVT AccVT : {MVT::v4i32, MVT::v8i32, MVT::v16i32}) {
2615 if (AccVT == MVT::v16i32 && !Subtarget.useAVX512Regs())
2617 unsigned NumElts = AccVT.getVectorNumElements();
2635 if (Subtarget.hasBF16())
2639 if (Subtarget.hasAVX10_2())
2646 if (!Subtarget.useSoftFloat() && Subtarget.hasVLX()) {
2659 if (Subtarget.hasBWI()) {
2664 if (Subtarget.hasFP16()) {
2696 if (!Subtarget.useSoftFloat() && Subtarget.hasAMXTILE()) {
2704 if (!Subtarget.is64Bit()) {
2714 for (
auto VT : { MVT::i8, MVT::i16, MVT::i32, MVT::i64 }) {
2715 if (VT == MVT::i64 && !Subtarget.is64Bit())
2737 if (Subtarget.isTargetWin64()) {
2756 if (Subtarget.is32Bit() &&
2757 (Subtarget.isTargetWindowsMSVC() || Subtarget.isTargetWindowsItanium()))
2785 if (Subtarget.isOSWindows()) {
4864 unsigned IdxVal =
Op.getConstantOperandVal(2);
4870 if (IdxVal == 0 && Vec.
isUndef())
4873 MVT OpVT =
Op.getSimpleValueType();
4892 assert(IdxVal + SubVecNumElems <= NumElems &&
4894 "Unexpected index value in INSERT_SUBVECTOR");
4903 Vec = DAG.
getNode(X86ISD::KSHIFTR, dl, WideOpVT, Vec, ShiftBits);
4904 Vec = DAG.
getNode(X86ISD::KSHIFTL, dl, WideOpVT, Vec, ShiftBits);
4914 Undef, SubVec, ZeroIdx);
4917 assert(IdxVal != 0 &&
"Unexpected index");
4918 SubVec = DAG.
getNode(X86ISD::KSHIFTL, dl, WideOpVT, SubVec,
4924 assert(IdxVal != 0 &&
"Unexpected index");
4927 [](
SDValue V) { return V.isUndef(); })) {
4928 SubVec = DAG.
getNode(X86ISD::KSHIFTL, dl, WideOpVT, SubVec,
4932 unsigned ShiftLeft = NumElems - SubVecNumElems;
4933 unsigned ShiftRight = NumElems - SubVecNumElems - IdxVal;
4934 SubVec = DAG.
getNode(X86ISD::KSHIFTL, dl, WideOpVT, SubVec,
4936 if (ShiftRight != 0)
4937 SubVec = DAG.
getNode(X86ISD::KSHIFTR, dl, WideOpVT, SubVec,
4944 if (IdxVal + SubVecNumElems == NumElems) {
4945 SubVec = DAG.
getNode(X86ISD::KSHIFTL, dl, WideOpVT, SubVec,
4947 if (SubVecNumElems * 2 == NumElems) {
4957 Undef, Vec, ZeroIdx);
4960 Vec = DAG.
getNode(X86ISD::KSHIFTL, dl, WideOpVT, Vec, ShiftBits);
4961 Vec = DAG.
getNode(X86ISD::KSHIFTR, dl, WideOpVT, Vec, ShiftBits);
4974 unsigned ShiftLeft = NumElems - SubVecNumElems;
4975 unsigned ShiftRight = NumElems - SubVecNumElems - IdxVal;
4978 if (WideOpVT != MVT::v64i1 || Subtarget.is64Bit()) {
4984 SubVec = DAG.
getNode(X86ISD::KSHIFTL, dl, WideOpVT, SubVec,
4986 SubVec = DAG.
getNode(X86ISD::KSHIFTR, dl, WideOpVT, SubVec,
4995 SubVec = DAG.
getNode(X86ISD::KSHIFTL, dl, WideOpVT, SubVec,
4997 SubVec = DAG.
getNode(X86ISD::KSHIFTR, dl, WideOpVT, SubVec,
5001 unsigned LowShift = NumElems - IdxVal;
5008 unsigned HighShift = IdxVal + SubVecNumElems;
5464 bool AllowWholeUndefs =
true,
5465 bool AllowPartialUndefs =
false) {
5466 assert(EltBits.
empty() &&
"Expected an empty EltBits vector");
5470 EVT VT =
Op.getValueType();
5472 unsigned NumElts = SizeInBits / EltSizeInBits;
5475 if ((SizeInBits % EltSizeInBits) != 0)
5481 unsigned SrcEltSizeInBits = SrcEltBits[0].getBitWidth();
5482 assert((NumSrcElts * SrcEltSizeInBits) == SizeInBits &&
5483 "Constant bit sizes don't match");
5486 bool AllowUndefs = AllowWholeUndefs || AllowPartialUndefs;
5491 if (NumSrcElts == NumElts) {
5492 UndefElts = UndefSrcElts;
5493 EltBits.
assign(SrcEltBits.begin(), SrcEltBits.end());
5498 APInt UndefBits(SizeInBits, 0);
5499 APInt MaskBits(SizeInBits, 0);
5501 for (
unsigned i = 0; i != NumSrcElts; ++i) {
5502 unsigned BitOffset = i * SrcEltSizeInBits;
5503 if (UndefSrcElts[i])
5504 UndefBits.
setBits(BitOffset, BitOffset + SrcEltSizeInBits);
5505 MaskBits.
insertBits(SrcEltBits[i], BitOffset);
5509 UndefElts =
APInt(NumElts, 0);
5512 for (
unsigned i = 0; i != NumElts; ++i) {
5513 unsigned BitOffset = i * EltSizeInBits;
5518 if (!AllowWholeUndefs)
5526 if (UndefEltBits.
getBoolValue() && !AllowPartialUndefs)
5529 EltBits[i] = MaskBits.
extractBits(EltSizeInBits, BitOffset);
5536 unsigned UndefBitIndex) {
5540 Undefs.setBit(UndefBitIndex);
5550 CFP->getValueAPF().bitcastToAPInt());
5554 Type *Ty = CDS->getType();
5555 if (Ty->isVectorTy()) {
5557 Type *EltTy = CDS->getElementType();
5561 if (!IsInteger && !IsFP)
5564 for (
unsigned I = 0,
E = CDS->getNumElements();
I !=
E; ++
I)
5566 Mask.insertBits(CDS->getElementAsAPInt(
I),
I * EltBits);
5568 Mask.insertBits(CDS->getElementAsAPFloat(
I).bitcastToAPInt(),
5580 return CastBitData(UndefSrcElts, SrcEltBits);
5587 return CastBitData(UndefSrcElts, SrcEltBits);
5591 APInt RawBits = Cst->getValueAPF().bitcastToAPInt();
5593 return CastBitData(UndefSrcElts, SrcEltBits);
5601 if (BV->getConstantRawBits(
true, SrcEltSizeInBits, SrcEltBits, Undefs)) {
5603 for (
unsigned I = 0,
E = SrcEltBits.
size();
I !=
E; ++
I)
5606 return CastBitData(UndefSrcElts, SrcEltBits);
5614 if (!CstTy->
isVectorTy() || (CstSizeInBits % SizeInBits) != 0)
5618 unsigned NumSrcElts = SizeInBits / SrcEltSizeInBits;
5619 if ((SizeInBits % SrcEltSizeInBits) != 0)
5622 APInt UndefSrcElts(NumSrcElts, 0);
5624 for (
unsigned i = 0; i != NumSrcElts; ++i)
5629 return CastBitData(UndefSrcElts, SrcEltBits);
5633 if (
Op.getOpcode() == X86ISD::VBROADCAST_LOAD &&
5639 SDValue Ptr = MemIntr->getBasePtr();
5642 unsigned NumSrcElts = SizeInBits / SrcEltSizeInBits;
5644 APInt UndefSrcElts(NumSrcElts, 0);
5646 if (CollectConstantBits(
C, SrcEltBits[0], UndefSrcElts, 0)) {
5647 if (UndefSrcElts[0])
5648 UndefSrcElts.
setBits(0, NumSrcElts);
5649 if (SrcEltBits[0].
getBitWidth() != SrcEltSizeInBits)
5650 SrcEltBits[0] = SrcEltBits[0].trunc(SrcEltSizeInBits);
5651 SrcEltBits.
append(NumSrcElts - 1, SrcEltBits[0]);
5652 return CastBitData(UndefSrcElts, SrcEltBits);
5658 if (
Op.getOpcode() == X86ISD::SUBV_BROADCAST_LOAD) {
5660 SDValue Ptr = MemIntr->getBasePtr();
5666 unsigned SubVecSizeInBits = MemIntr->getMemoryVT().getStoreSizeInBits();
5667 if (!CstTy->
isVectorTy() || (CstSizeInBits % SubVecSizeInBits) != 0 ||
5668 (SizeInBits % SubVecSizeInBits) != 0)
5671 unsigned NumSubElts = SubVecSizeInBits / CstEltSizeInBits;
5672 unsigned NumSubVecs = SizeInBits / SubVecSizeInBits;
5673 APInt UndefSubElts(NumSubElts, 0);
5675 APInt(CstEltSizeInBits, 0));
5676 for (
unsigned i = 0; i != NumSubElts; ++i) {
5680 for (
unsigned j = 1; j != NumSubVecs; ++j)
5681 SubEltBits[i + (j * NumSubElts)] = SubEltBits[i];
5685 return CastBitData(UndefSubElts, SubEltBits);
5690 if (
Op.getOpcode() == X86ISD::VZEXT_MOVL &&
5694 unsigned NumSrcElts = SizeInBits / SrcEltSizeInBits;
5696 APInt UndefSrcElts(NumSrcElts, 0);
5698 const APInt &
C =
Op.getOperand(0).getConstantOperandAPInt(0);
5699 SrcEltBits.
push_back(
C.zextOrTrunc(SrcEltSizeInBits));
5700 SrcEltBits.
append(NumSrcElts - 1,
APInt(SrcEltSizeInBits, 0));
5701 return CastBitData(UndefSrcElts, SrcEltBits);
5709 bool AllowUndefs = EltSizeInBits >= SrcEltSizeInBits;
5711 APInt UndefSrcElts, UndefSubElts;
5714 UndefSubElts, EltSubBits,
5715 AllowWholeUndefs && AllowUndefs,
5716 AllowPartialUndefs && AllowUndefs) &&
5718 UndefSrcElts, EltSrcBits,
5719 AllowWholeUndefs && AllowUndefs,
5720 AllowPartialUndefs && AllowUndefs)) {
5721 unsigned BaseIdx =
Op.getConstantOperandVal(2);
5722 UndefSrcElts.
insertBits(UndefSubElts, BaseIdx);
5723 for (
unsigned i = 0, e = EltSubBits.
size(); i != e; ++i)
5724 EltSrcBits[BaseIdx + i] = EltSubBits[i];
5725 return CastBitData(UndefSrcElts, EltSrcBits);
5732 EltBits, AllowWholeUndefs,
5733 AllowPartialUndefs)) {
5734 EVT SrcVT =
Op.getOperand(0).getValueType();
5735 unsigned NumSrcElts = SrcVT.
getSizeInBits() / EltSizeInBits;
5738 unsigned BaseIdx = BaseOfs / EltSizeInBits;
5741 (BaseOfs % EltSizeInBits) == 0 &&
"Bad subvector index");
5743 UndefElts = UndefElts.
extractBits(NumSubElts, BaseIdx);
5744 if ((BaseIdx + NumSubElts) != NumSrcElts)
5745 EltBits.
erase(EltBits.
begin() + BaseIdx + NumSubElts, EltBits.
end());
5758 if ((!AllowWholeUndefs || !AllowPartialUndefs) &&
5762 APInt UndefElts0, UndefElts1;
5766 UndefElts0, EltBits0, AllowWholeUndefs,
5767 AllowPartialUndefs))
5771 UndefElts1, EltBits1, AllowWholeUndefs,
5772 AllowPartialUndefs))
5776 for (
int i = 0; i != (int)NumElts; ++i) {
5781 }
else if (M < (
int)NumElts) {
5786 if (UndefElts1[M - NumElts])
5788 EltBits.
push_back(EltBits1[M - NumElts]);
6016 MVT VT =
N.getSimpleValueType();
6023 assert(Mask.empty() &&
"getTargetShuffleMask expects an empty Mask vector");
6024 assert(
Ops.empty() &&
"getTargetShuffleMask expects an empty Ops vector");
6027 bool IsFakeUnary =
false;
6028 switch (
N.getOpcode()) {
6029 case X86ISD::BLENDI:
6030 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6031 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6032 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6034 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6037 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6038 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6039 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6041 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6043 case X86ISD::INSERTPS:
6044 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6045 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6046 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6048 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6050 case X86ISD::EXTRQI:
6051 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6054 int BitLen =
N.getConstantOperandVal(1);
6055 int BitIdx =
N.getConstantOperandVal(2);
6060 case X86ISD::INSERTQI:
6061 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6062 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6065 int BitLen =
N.getConstantOperandVal(2);
6066 int BitIdx =
N.getConstantOperandVal(3);
6068 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6071 case X86ISD::UNPCKH:
6072 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6073 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6075 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6077 case X86ISD::UNPCKL:
6078 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6079 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6081 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6083 case X86ISD::MOVHLPS:
6084 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6085 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6087 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6089 case X86ISD::MOVLHPS:
6090 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6091 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6093 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6095 case X86ISD::VALIGN:
6097 "Only 32-bit and 64-bit elements are supported!");
6098 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6099 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6100 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6102 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6103 Ops.push_back(
N.getOperand(1));
6104 Ops.push_back(
N.getOperand(0));
6106 case X86ISD::PALIGNR:
6108 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6109 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6110 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6112 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6113 Ops.push_back(
N.getOperand(1));
6114 Ops.push_back(
N.getOperand(0));
6116 case X86ISD::VSHLDQ:
6118 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6119 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6123 case X86ISD::VSRLDQ:
6125 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6126 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6130 case X86ISD::PSHUFD:
6131 case X86ISD::VPERMILPI:
6132 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6133 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6137 case X86ISD::PSHUFHW:
6138 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6139 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6143 case X86ISD::PSHUFLW:
6144 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6145 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6149 case X86ISD::VZEXT_MOVL:
6150 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6154 case X86ISD::VBROADCAST:
6158 if (
N.getOperand(0).getValueType() == VT) {
6164 case X86ISD::VPERMILPV: {
6165 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6167 SDValue MaskNode =
N.getOperand(1);
6175 case X86ISD::PSHUFB: {
6177 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6178 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6180 SDValue MaskNode =
N.getOperand(1);
6187 case X86ISD::VPERMI:
6188 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6189 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6196 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6197 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6200 case X86ISD::VPERM2X128:
6201 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6202 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6203 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6205 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6207 case X86ISD::SHUF128:
6208 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6209 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6210 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6212 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6214 case X86ISD::MOVSLDUP:
6215 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6219 case X86ISD::MOVSHDUP:
6220 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6224 case X86ISD::MOVDDUP:
6225 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6229 case X86ISD::VPERMIL2: {
6230 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6231 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6232 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6233 SDValue MaskNode =
N.getOperand(2);
6234 SDValue CtrlNode =
N.getOperand(3);
6236 unsigned CtrlImm = CtrlOp->getZExtValue();
6246 case X86ISD::VPPERM: {
6247 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6248 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6249 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6250 SDValue MaskNode =
N.getOperand(2);
6257 case X86ISD::VPERMV: {
6258 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6261 Ops.push_back(
N.getOperand(1));
6262 SDValue MaskNode =
N.getOperand(0);
6270 case X86ISD::VPERMV3: {
6271 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6272 assert(
N.getOperand(2).getValueType() == VT &&
"Unexpected value type");
6273 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(2);
6275 Ops.push_back(
N.getOperand(0));
6276 Ops.push_back(
N.getOperand(2));
6277 SDValue MaskNode =
N.getOperand(1);
6285 case X86ISD::COMPRESS: {
6287 SDValue PassThru =
N.getOperand(1);
6294 "Illegal compression mask");
6295 for (
unsigned I = 0;
I != NumElems; ++
I) {
6299 while (Mask.size() != NumElems) {
6300 Mask.push_back(NumElems + Mask.size());
6302 Ops.push_back(CmpVec);
6303 Ops.push_back(PassThru);
6306 case X86ISD::EXPAND: {
6308 SDValue PassThru =
N.getOperand(1);
6315 "Illegal expansion mask");
6316 unsigned ExpIndex = 0;
6317 for (
unsigned I = 0;
I != NumElems; ++
I) {
6319 Mask.push_back(
I + NumElems);
6321 Mask.push_back(ExpIndex++);
6323 Ops.push_back(ExpVec);
6324 Ops.push_back(PassThru);
6336 if (!AllowSentinelZero &&
isAnyZero(Mask))
6344 if (M >= (
int)Mask.size())
6350 Ops.push_back(
N.getOperand(0));
6351 if (!IsUnary || IsFakeUnary)
6352 Ops.push_back(
N.getOperand(1));
6635 bool ResolveKnownElts) {
6639 MVT VT =
N.getSimpleValueType();
6643 if ((NumBitsPerElt % 8) != 0 || (NumSizeInBits % 8) != 0)
6646 unsigned NumSizeInBytes = NumSizeInBits / 8;
6647 unsigned NumBytesPerElt = NumBitsPerElt / 8;
6649 unsigned Opcode =
N.getOpcode();
6655 Mask.append(ShuffleMask.begin(), ShuffleMask.end());
6656 Ops.push_back(
N.getOperand(0));
6657 Ops.push_back(
N.getOperand(1));
6663 case X86ISD::ANDNP: {
6669 bool IsAndN = (X86ISD::ANDNP == Opcode);
6670 uint64_t ZeroMask = IsAndN ? 255 : 0;
6677 assert(UndefElts.
isZero() &&
"Unexpected UNDEF element in AND/ANDNP mask");
6678 for (
int i = 0, e = (
int)EltBits.
size(); i != e; ++i) {
6679 const APInt &ByteBits = EltBits[i];
6680 if (ByteBits != 0 && ByteBits != 255)
6684 Ops.push_back(IsAndN ? N1 : N0);
6705 size_t MaskSize = std::max(SrcMask0.
size(), SrcMask1.
size());
6709 for (
int i = 0; i != (int)MaskSize; ++i) {
6719 Mask.push_back(i + MaskSize);
6720 else if (MaskSize == NumElts && !DemandedElts[i])
6725 Ops.push_back(
N.getOperand(0));
6726 Ops.push_back(
N.getOperand(1));
6731 unsigned NumSubElts =
N.getOperand(0).getValueType().getVectorNumElements();
6732 if (NumBitsPerElt == 64) {
6733 for (
unsigned I = 0,
E =
N.getNumOperands();
I !=
E; ++
I) {
6734 for (
unsigned M = 0; M != NumSubElts; ++M)
6735 Mask.push_back((
I * NumElts) + M);
6736 Ops.push_back(
N.getOperand(
I));
6745 EVT SubVT =
Sub.getValueType();
6747 uint64_t InsertIdx =
N.getConstantOperandVal(2);
6749 if (DemandedElts.
extractBits(NumSubElts, InsertIdx) == 0) {
6750 Mask.resize(NumElts);
6751 std::iota(Mask.begin(), Mask.end(), 0);
6757 if (
Depth > 0 && InsertIdx == NumSubElts && NumElts == (2 * NumSubElts) &&
6759 Src.getOperand(0).isUndef() &&
6760 Src.getOperand(1).getValueType() == SubVT &&
6761 Src.getConstantOperandVal(2) == 0 &&
6762 (NumBitsPerElt == 64 || Src.getOperand(1) ==
Sub) &&
6764 Mask.resize(NumElts);
6765 std::iota(Mask.begin(), Mask.begin() + NumSubElts, 0);
6766 std::iota(Mask.begin() + NumSubElts, Mask.end(), NumElts);
6767 Ops.push_back(Src.getOperand(1));
6772 if (InsertIdx != 0 && Src.isUndef() &&
6775 std::iota(Mask.begin() + InsertIdx, Mask.begin() + InsertIdx + NumSubElts,
6780 if (!
N->isOnlyUserOf(
Sub.getNode()))
6795 unsigned NumSubSrcSrcElts =
6797 unsigned MaxElts = std::max(NumElts, NumSubSrcSrcElts);
6798 assert((MaxElts % NumElts) == 0 && (MaxElts % NumSubSrcSrcElts) == 0 &&
6799 "Subvector valuetype mismatch");
6800 InsertIdx *= (MaxElts / NumElts);
6801 ExtractIdx *= (MaxElts / NumSubSrcSrcElts);
6802 NumSubElts *= (MaxElts / NumElts);
6803 bool SrcIsUndef = Src.isUndef();
6804 for (
int i = 0; i != (int)MaxElts; ++i)
6806 for (
int i = 0; i != (int)NumSubElts; ++i)
6807 Mask[InsertIdx + i] = (SrcIsUndef ? 0 : MaxElts) + ExtractIdx + i;
6810 Ops.push_back(SubSrcSrc);
6817 Depth + 1, ResolveKnownElts))
6827 if (SubMask.
size() != NumSubElts) {
6828 assert(((SubMask.
size() % NumSubElts) == 0 ||
6829 (NumSubElts % SubMask.
size()) == 0) &&
6830 "Illegal submask scale");
6831 if ((NumSubElts % SubMask.
size()) == 0) {
6832 int Scale = NumSubElts / SubMask.
size();
6835 SubMask = ScaledSubMask;
6837 int Scale = SubMask.
size() / NumSubElts;
6838 NumSubElts = SubMask.
size();
6848 for (
int i = 0; i != (int)NumElts; ++i)
6850 for (
int i = 0; i != (int)NumSubElts; ++i) {
6853 int InputIdx = M / NumSubElts;
6854 M = (NumElts * (1 + InputIdx)) + (M % NumSubElts);
6856 Mask[i + InsertIdx] = M;
6860 case X86ISD::PINSRB:
6861 case X86ISD::PINSRW:
6868 unsigned DstIdx = 0;
6872 N.getConstantOperandAPInt(2).uge(NumElts))
6874 DstIdx =
N.getConstantOperandVal(2);
6878 Ops.push_back(
N.getOperand(0));
6879 for (
unsigned i = 0; i != NumElts; ++i)
6899 if ((MinBitsPerElt % 8) != 0)
6919 unsigned DstByte = DstIdx * NumBytesPerElt;
6925 Ops.push_back(SrcVec);
6928 Ops.push_back(SrcVec);
6929 Ops.push_back(
N.getOperand(0));
6930 for (
int i = 0; i != (int)NumSizeInBytes; ++i)
6931 Mask.push_back(NumSizeInBytes + i);
6934 unsigned MinBytesPerElts = MinBitsPerElt / 8;
6935 MinBytesPerElts = std::min(MinBytesPerElts, NumBytesPerElt);
6936 for (
unsigned i = 0; i != MinBytesPerElts; ++i)
6937 Mask[DstByte + i] = SrcByte + i;
6938 for (
unsigned i = MinBytesPerElts; i < NumBytesPerElt; ++i)
6942 case X86ISD::PACKSS:
6943 case X86ISD::PACKUS: {
6948 "Unexpected input value type");
6950 APInt EltsLHS, EltsRHS;
6955 bool Offset0 =
false, Offset1 =
false;
6956 if (Opcode == X86ISD::PACKSS) {
6984 bool IsUnary = (N0 == N1);
6992 if (Offset0 || Offset1) {
6994 if ((Offset0 &&
isInRange(M, 0, NumElts)) ||
6995 (Offset1 &&
isInRange(M, NumElts, 2 * NumElts)))
7001 case X86ISD::BLENDV: {
7004 Ops.push_back(
N.getOperand(1));
7005 Ops.push_back(
N.getOperand(2));
7010 case X86ISD::VTRUNC: {
7012 EVT SrcVT = Src.getValueType();
7017 unsigned Scale = NumBitsPerSrcElt / NumBitsPerElt;
7018 assert((NumBitsPerSrcElt % NumBitsPerElt) == 0 &&
"Illegal truncation");
7019 for (
unsigned i = 0; i != NumSrcElts; ++i)
7020 Mask.push_back(i * Scale);
7036 for (
unsigned I = 0;
I != NumElts; ++
I)
7037 if (DemandedElts[
I] && !UndefElts[
I] &&
7038 (EltBits[
I].urem(8) != 0 || EltBits[
I].uge(NumBitsPerElt)))
7042 Ops.push_back(
N.getOperand(0));
7044 for (
unsigned I = 0;
I != NumElts; ++
I) {
7045 if (!DemandedElts[
I] || UndefElts[
I])
7047 unsigned ByteShift = EltBits[
I].getZExtValue() / 8;
7048 unsigned Lo =
I * NumBytesPerElt;
7049 unsigned Hi =
Lo + NumBytesPerElt;
7053 std::iota(Mask.begin() +
Lo + ByteShift, Mask.begin() +
Hi,
Lo);
7055 std::iota(Mask.begin() +
Lo, Mask.begin() +
Hi - ByteShift,
7061 case X86ISD::VSRLI: {
7062 uint64_t ShiftVal =
N.getConstantOperandVal(1);
7064 if (NumBitsPerElt <= ShiftVal) {
7070 if ((ShiftVal % 8) != 0)
7074 Ops.push_back(
N.getOperand(0));
7079 if (X86ISD::VSHLI == Opcode) {
7080 for (
unsigned i = 0; i != NumSizeInBytes; i += NumBytesPerElt)
7081 for (
unsigned j = ByteShift; j != NumBytesPerElt; ++j)
7082 Mask[i + j] = i + j - ByteShift;
7084 for (
unsigned i = 0; i != NumSizeInBytes; i += NumBytesPerElt)
7085 for (
unsigned j = ByteShift; j != NumBytesPerElt; ++j)
7086 Mask[i + j - ByteShift] = i + j;
7101 for (
unsigned I = 0;
I != NumElts; ++
I)
7102 if (DemandedElts[
I] && !UndefElts[
I] &&
7103 (EltBits[
I].urem(NumBitsPerElt) % 8) != 0)
7106 Ops.push_back(
N.getOperand(0));
7107 for (
unsigned I = 0;
I != NumElts; ++
I) {
7108 if (!DemandedElts[
I] || UndefElts[
I]) {
7112 int Offset = EltBits[
I].urem(NumBitsPerElt) / 8;
7114 int BaseIdx =
I * NumBytesPerElt;
7115 for (
int J = 0; J != (int)NumBytesPerElt; ++J) {
7116 Mask.push_back(BaseIdx + ((
Offset + J) % NumBytesPerElt));
7121 case X86ISD::VROTLI:
7122 case X86ISD::VROTRI: {
7124 uint64_t RotateVal =
N.getConstantOperandAPInt(1).urem(NumBitsPerElt);
7125 if ((RotateVal % 8) != 0)
7127 Ops.push_back(
N.getOperand(0));
7128 int Offset = RotateVal / 8;
7130 for (
int i = 0; i != (int)NumElts; ++i) {
7131 int BaseIdx = i * NumBytesPerElt;
7132 for (
int j = 0; j != (int)NumBytesPerElt; ++j) {
7133 Mask.push_back(BaseIdx + ((
Offset + j) % NumBytesPerElt));
7139 case X86ISD::VSHRD: {
7141 uint64_t ShiftVal =
N.getConstantOperandAPInt(2).urem(NumBitsPerElt);
7142 int Offset = ShiftVal / 8;
7143 if ((ShiftVal % 8) != 0 ||
Offset == 0)
7145 Ops.push_back(
N.getOperand(X86ISD::VSHRD == Opcode ? 1 : 0));
7146 Ops.push_back(
N.getOperand(X86ISD::VSHRD == Opcode ? 0 : 1));
7148 for (
int I = 0;
I != (int)NumElts; ++
I) {
7149 int BaseIdx = (
I * NumBytesPerElt) -
Offset;
7150 for (
int J = 0; J != (int)NumBytesPerElt; ++J) {
7151 int MaskIdx = BaseIdx + J;
7152 MaskIdx += J <
Offset ? (NumSizeInBytes + NumBytesPerElt) : 0;
7153 Mask.push_back(MaskIdx);
7158 case X86ISD::VBROADCAST: {
7160 if (!Src.getSimpleValueType().isVector()) {
7163 Src.getOperand(0).getValueType().getScalarType() !=
7166 Src = Src.getOperand(0);
7169 Mask.append(NumElts, 0);
7174 EVT SrcVT = Src.getValueType();
7179 (NumBitsPerSrcElt % 8) != 0)
7183 APInt DemandedSrcElts =
7188 assert((NumBitsPerElt % NumBitsPerSrcElt) == 0 &&
"Unexpected extension");
7189 unsigned Scale = NumBitsPerElt / NumBitsPerSrcElt;
7190 for (
unsigned I = 0;
I != NumElts; ++
I)
7191 Mask.append(Scale,
I);
7200 EVT SrcVT = Src.getValueType();
7843 bool IsAfterLegalize,
7844 unsigned Depth = 0) {
7861 IsAfterLegalize,
Depth + 1))
7866 unsigned NumElems = Elts.
size();
7868 int LastLoadedElt = -1;
7878 for (
unsigned i = 0; i < NumElems; ++i) {
7897 if (!
findEltLoadSrc(Elt, Loads[i], ByteOffsets[i]) || ByteOffsets[i] < 0)
7899 unsigned LoadSizeInBits = Loads[i]->getValueSizeInBits(0);
7900 if (((ByteOffsets[i] * 8) + EltSizeInBits) > LoadSizeInBits)
7908 "Incomplete element masks");
7911 if (UndefMask.
popcount() == NumElems)
7922 "Register/Memory size mismatch");
7924 assert(LDBase &&
"Did not find base load for merging consecutive loads");
7926 unsigned BaseSizeInBytes = BaseSizeInBits / 8;
7927 int NumLoadedElts = (1 + LastLoadedElt - FirstLoadedElt);
7928 int LoadSizeInBits = NumLoadedElts * BaseSizeInBits;
7929 assert((BaseSizeInBits % 8) == 0 &&
"Sub-byte element loads detected");
7932 if (ByteOffsets[FirstLoadedElt] != 0)
7939 int64_t ByteOffset = ByteOffsets[EltIdx];
7940 if (ByteOffset && (ByteOffset % BaseSizeInBytes) == 0) {
7941 int64_t BaseIdx = EltIdx - (ByteOffset / BaseSizeInBytes);
7942 return (0 <= BaseIdx && BaseIdx < (
int)NumElems && LoadMask[BaseIdx] &&
7943 Loads[BaseIdx] == Ld && ByteOffsets[BaseIdx] == 0);
7945 int Stride = EltIdx - FirstLoadedElt;
7951 unsigned BaseMemSizeInBits =
Base->getMemoryVT().getSizeInBits();
7952 if (((Stride * BaseSizeInBits) % BaseMemSizeInBits) == 0 &&
7953 (BaseMemSizeInBits % BaseSizeInBits) == 0) {
7954 unsigned Scale = BaseMemSizeInBits / BaseSizeInBits;
7964 bool IsConsecutiveLoad =
true;
7965 bool IsConsecutiveLoadWithZeros =
true;
7966 for (
int i = FirstLoadedElt + 1; i <= LastLoadedElt; ++i) {
7968 if (!CheckConsecutiveLoad(LDBase, i)) {
7969 IsConsecutiveLoad =
false;
7970 IsConsecutiveLoadWithZeros =
false;
7973 }
else if (ZeroMask[i]) {
7974 IsConsecutiveLoad =
false;
7981 "Cannot merge volatile or atomic loads.");
7985 for (
auto *LD : Loads)
8000 if (FirstLoadedElt == 0 &&
8001 (NumLoadedElts == (
int)NumElems || IsDereferenceable) &&
8002 (IsConsecutiveLoad || IsConsecutiveLoadWithZeros)) {
8013 return DAG.
getBitcast(VT, Elts[FirstLoadedElt]);
8016 return CreateLoad(VT, LDBase);
8020 if (!IsAfterLegalize && VT.
isVector()) {
8022 if ((NumMaskElts % NumElems) == 0) {
8023 unsigned Scale = NumMaskElts / NumElems;
8025 for (
unsigned i = 0; i < NumElems; ++i) {
8028 int Offset = ZeroMask[i] ? NumMaskElts : 0;
8029 for (
unsigned j = 0; j != Scale; ++j)
8030 ClearMask[(i * Scale) + j] = (i * Scale) + j +
Offset;
8032 SDValue V = CreateLoad(VT, LDBase);
8042 unsigned HalfNumElems = NumElems / 2;
8048 DAG, Subtarget, IsAfterLegalize,
Depth + 1);
8056 if (IsConsecutiveLoad && FirstLoadedElt == 0 &&
8057 ((LoadSizeInBits == 16 && Subtarget.hasFP16()) || LoadSizeInBits == 32 ||
8058 LoadSizeInBits == 64) &&
8065 if (!Subtarget.
hasSSE2() && VT == MVT::v4f32)
8073 for (
auto *LD : Loads)
8084 for (
unsigned SubElems = 1; SubElems < NumElems; SubElems *= 2) {
8085 unsigned RepeatSize = SubElems * BaseSizeInBits;
8086 unsigned ScalarSize = std::min(RepeatSize, 64u);
8087 if (!Subtarget.
hasAVX2() && ScalarSize < 32)
8092 if (RepeatSize > ScalarSize && SubElems == 1)
8097 for (
unsigned i = 0; i != NumElems && Match; ++i) {
8101 if (RepeatedLoads[i % SubElems].
isUndef())
8102 RepeatedLoads[i % SubElems] = Elt;
8104 Match &= (RepeatedLoads[i % SubElems] == Elt);
8108 Match &= !RepeatedLoads.
front().isUndef();
8109 Match &= !RepeatedLoads.
back().isUndef();
8117 if (RepeatSize > ScalarSize)
8119 RepeatSize / ScalarSize);
8125 RepeatVT, RepeatedLoads,
DL, DAG, Subtarget, IsAfterLegalize,
8127 SDValue Broadcast = RepeatLoad;
8128 if (RepeatSize > ScalarSize) {
8139 DAG.
getNode(X86ISD::VBROADCAST,
DL, BroadcastVT, RepeatLoad);
8151 if (
Depth <= 1 && Subtarget.
hasAVX2() && !IsConsecutiveLoad &&
8154 unsigned WideEltBits = 0;
8155 for (
unsigned Trial : {16u, 32u, 64u}) {
8156 if (Trial <= BaseSizeInBits || Trial % BaseSizeInBits != 0)
8158 unsigned LaneStride = Trial / BaseSizeInBits;
8159 bool AllMatch =
true;
8160 for (
unsigned K = 1;
K < NumElems && AllMatch; ++
K) {
8161 AllMatch = AllMatch && ByteOffsets[
K] == 0 &&
8163 Loads[
K], LDBase, BaseSizeInBytes,
K * LaneStride);
8166 WideEltBits = Trial;
8170 if (WideEltBits != 0) {
8176 unsigned StrideBytes = WideEltBits / 8;
8181 for (
unsigned WideRegBits : {512u, 256u, 128u}) {
8182 unsigned LanesPerWideLoad = WideRegBits / WideEltBits;
8183 if (LanesPerWideLoad < 2 || NumElems % LanesPerWideLoad != 0)
8187 unsigned PieceEltBits =
8188 std::max(BaseSizeInBits, 128 / LanesPerWideLoad);
8197 unsigned NumWideLoads = NumElems / LanesPerWideLoad;
8198 unsigned BytesPerWideLoad = WideRegBits / 8;
8201 bool CanShift = NumWideLoads >= 2;
8202 if (!RangeSafe && !CanShift)
8204 unsigned TailBits = WideEltBits - BaseSizeInBits;
8208 for (
unsigned K = 0;
K != NumWideLoads; ++
K) {
8209 bool ShiftLast = !RangeSafe &&
K == NumWideLoads - 1;
8210 unsigned Offset =
K * BytesPerWideLoad;
8220 for (
auto *LD : Loads)
8243 VT, ReverseElts,
DL, DAG, Subtarget, IsAfterLegalize,
Depth + 1)) {
8245 std::iota(ReverseMask.
rbegin(), ReverseMask.
rend(), 0);
8391 "Unsupported vector type for broadcast.");
8398 assert((NumElts % Sequence.size()) == 0 &&
"Sequence doesn't fit.");
8399 if (Sequence.size() == 1)
8409 if (!Sequence.empty() && Subtarget.hasCDI()) {
8411 unsigned SeqLen = Sequence.size();
8412 bool UpperZeroOrUndef =
8417 if (UpperZeroOrUndef && ((Op0.getOpcode() ==
ISD::BITCAST) ||
8422 : Op0.getOperand(0).getOperand(0);
8425 if ((EltType == MVT::i64 && MaskVT == MVT::v8i1) ||
8426 (EltType == MVT::i32 && MaskVT == MVT::v16i1)) {
8432 SDValue Bcst = DAG.
getNode(X86ISD::VBROADCASTM, dl, BcstVT, BOperand);
8440 unsigned NumUndefElts = UndefElements.
count();
8441 if (!Ld || (NumElts - NumUndefElts) <= 1) {
8443 unsigned SplatBitSize;
8456 if (SplatBitSize == 32 || SplatBitSize == 64 ||
8457 (SplatBitSize < 32 && Subtarget.
hasAVX2())) {
8474 if (SplatBitSize > 64) {
8486 Ops, VVT, MPI, Alignment,
8496 if (!Ld || NumElts - NumUndefElts != 1)
8498 unsigned ScalarSize = Ld.getValueSizeInBits();
8499 if (!(UndefElements[0] || (ScalarSize != 32 && ScalarSize != 64)))
8503 bool ConstSplatVal =
8512 if (!ConstSplatVal && !IsLoad && !BVOp->
isOnlyUserOf(Ld.getNode()))
8515 unsigned ScalarSize = Ld.getValueSizeInBits();
8531 if (ConstSplatVal && (Subtarget.
hasAVX2() || OptForSize)) {
8532 EVT CVT = Ld.getValueType();
8539 if (ScalarSize == 32 ||
8540 (ScalarSize == 64 && (IsGE256 || Subtarget.hasVLX())) ||
8541 (CVT == MVT::f16 && Subtarget.
hasAVX2()) ||
8542 (OptForSize && (ScalarSize == 64 || Subtarget.
hasAVX2()))) {
8545 C = CI->getConstantIntValue();
8547 C = CF->getConstantFPValue();
8549 assert(
C &&
"Invalid constant type");
8566 (ScalarSize == 32 || (IsGE256 && ScalarSize == 64)))
8567 return DAG.
getNode(X86ISD::VBROADCAST, dl, VT, Ld);
8574 if (!Ld->hasNUsesOfValue(NumElts - NumUndefElts, 0))
8577 if (ScalarSize == 32 || (IsGE256 && ScalarSize == 64) ||
8578 (Subtarget.hasVLX() && ScalarSize == 64)) {
8581 SDValue Ops[] = {LN->getChain(), LN->getBasePtr()};
8584 LN->getMemoryVT(), LN->getMemOperand());
8591 if (Subtarget.
hasInt256() && Ld.getValueType().isInteger() &&
8592 (ScalarSize == 8 || ScalarSize == 16 || ScalarSize == 64)) {
8595 SDValue Ops[] = {LN->getChain(), LN->getBasePtr()};
8598 LN->getMemoryVT(), LN->getMemOperand());
8603 if (ScalarSize == 16 && Subtarget.hasFP16() && IsGE256)
8604 return DAG.
getNode(X86ISD::VBROADCAST, dl, VT, Ld);
9162 "Illegal variable permute mask size");
9170 SDLoc(IndicesVec), SizeInBits);
9174 IndicesVT, IndicesVec);
9186 Subtarget, DAG,
SDLoc(IndicesVec));
9201 EVT SrcVT = Idx.getValueType();
9211 for (
uint64_t i = 0; i != Scale; ++i) {
9212 IndexScale |= Scale << (i * NumDstBits);
9213 IndexOffset |= i << (i * NumDstBits);
9223 unsigned Opcode = 0;
9229 Opcode = X86ISD::PSHUFB;
9232 if (Subtarget.hasVLX() && Subtarget.hasBWI())
9233 Opcode = X86ISD::VPERMV;
9235 Opcode = X86ISD::PSHUFB;
9236 ShuffleVT = MVT::v16i8;
9241 if (Subtarget.
hasAVX()) {
9242 Opcode = X86ISD::VPERMILPV;
9243 ShuffleVT = MVT::v4f32;
9245 Opcode = X86ISD::PSHUFB;
9246 ShuffleVT = MVT::v16i8;
9251 if (Subtarget.
hasAVX()) {
9254 Opcode = X86ISD::VPERMILPV;
9255 ShuffleVT = MVT::v2f64;
9267 if (Subtarget.hasVLX() && Subtarget.hasVBMI())
9268 Opcode = X86ISD::VPERMV;
9269 else if (Subtarget.hasXOP()) {
9276 DAG.
getNode(X86ISD::VPPERM,
DL, MVT::v16i8, LoSrc, HiSrc, LoIdx),
9277 DAG.
getNode(X86ISD::VPPERM,
DL, MVT::v16i8, LoSrc, HiSrc, HiIdx));
9278 }
else if (Subtarget.
hasAVX()) {
9289 EVT VT = Idx.getValueType();
9301 if (Subtarget.hasVLX() && Subtarget.hasBWI())
9302 Opcode = X86ISD::VPERMV;
9303 else if (Subtarget.
hasAVX()) {
9305 IndicesVec = ScaleIndices(IndicesVec, 2);
9308 MVT::v32i8, DAG.
getBitcast(MVT::v32i8, SrcVec),
9309 DAG.
getBitcast(MVT::v32i8, IndicesVec),
DL, DAG, Subtarget));
9315 Opcode = X86ISD::VPERMV;
9316 else if (Subtarget.
hasAVX()) {
9319 {0, 1, 2, 3, 0, 1, 2, 3});
9321 {4, 5, 6, 7, 4, 5, 6, 7});
9322 if (Subtarget.hasXOP())
9324 VT, DAG.
getNode(X86ISD::VPERMIL2,
DL, MVT::v8f32, LoLo, HiHi,
9330 DAG.
getNode(X86ISD::VPERMILPV,
DL, MVT::v8f32, HiHi, IndicesVec),
9331 DAG.
getNode(X86ISD::VPERMILPV,
DL, MVT::v8f32, LoLo, IndicesVec),
9339 if (!Subtarget.hasVLX()) {
9341 SrcVec =
widenSubVector(WidenSrcVT, SrcVec,
false, Subtarget, DAG,
9343 IndicesVec =
widenSubVector(MVT::v8i64, IndicesVec,
false, Subtarget,
9344 DAG,
SDLoc(IndicesVec));
9349 Opcode = X86ISD::VPERMV;
9350 }
else if (Subtarget.
hasAVX()) {
9358 if (Subtarget.hasXOP())
9360 VT, DAG.
getNode(X86ISD::VPERMIL2,
DL, MVT::v4f64, LoLo, HiHi,
9366 DAG.
getNode(X86ISD::VPERMILPV,
DL, MVT::v4f64, HiHi, IndicesVec),
9367 DAG.
getNode(X86ISD::VPERMILPV,
DL, MVT::v4f64, LoLo, IndicesVec),
9373 if (Subtarget.hasVBMI())
9374 Opcode = X86ISD::VPERMV;
9377 if (Subtarget.hasBWI())
9378 Opcode = X86ISD::VPERMV;
9385 Opcode = X86ISD::VPERMV;
9393 "Illegal variable permute shuffle type");
9397 IndicesVec = ScaleIndices(IndicesVec, Scale);
9400 IndicesVec = DAG.
getBitcast(ShuffleIdxVT, IndicesVec);
9403 SDValue Res = Opcode == X86ISD::VPERMV
9404 ? DAG.
getNode(Opcode,
DL, ShuffleVT, IndicesVec, SrcVec)
9405 : DAG.
getNode(Opcode,
DL, ShuffleVT, SrcVec, IndicesVec);
14230 assert(Mask.size() == 8 &&
"Shuffle mask length doesn't match!");
14237 return DAG.
getNode(X86ISD::PSHUFLW,
DL, VT, V,
14242 for (
int i = 0; i != 4; ++i)
14243 HiMask[i] = (HiMask[i] < 0 ? HiMask[i] : (HiMask[i] - 4));
14244 return DAG.
getNode(X86ISD::PSHUFHW,
DL, VT, V,
14249 copy_if(LoMask, std::back_inserter(LoInputs), [](
int M) {
return M >= 0; });
14253 copy_if(HiMask, std::back_inserter(HiInputs), [](
int M) {
return M >= 0; });
14257 int NumHToL = LoInputs.
size() - NumLToL;
14259 int NumHToH = HiInputs.
size() - NumLToH;
14273 V = DAG.
getNode(X86ISD::PSHUFD,
DL, PSHUFDVT, V,
14278 if ((NumHToL + NumHToH) == 0 || (NumLToL + NumLToH) == 0) {
14279 int PSHUFDMask[4] = { -1, -1, -1, -1 };
14281 int DOffset = ((NumHToL + NumHToH) == 0 ? 0 : 2);
14284 for (
int DWord = 0; DWord != 4; ++DWord) {
14285 int M0 = Mask[2 * DWord + 0];
14286 int M1 = Mask[2 * DWord + 1];
14289 if (
M0 < 0 &&
M1 < 0)
14292 bool Match =
false;
14293 for (
int j = 0, e = DWordPairs.
size(); j < e; ++j) {
14294 auto &DWordPair = DWordPairs[j];
14297 DWordPair.first = (
M0 >= 0 ?
M0 : DWordPair.first);
14298 DWordPair.second = (
M1 >= 0 ?
M1 : DWordPair.second);
14299 PSHUFDMask[DWord] = DOffset + j;
14305 PSHUFDMask[DWord] = DOffset + DWordPairs.
size();
14310 if (DWordPairs.
size() <= 2) {
14311 DWordPairs.
resize(2, std::make_pair(-1, -1));
14312 int PSHUFHalfMask[4] = {DWordPairs[0].first, DWordPairs[0].second,
14313 DWordPairs[1].first, DWordPairs[1].second};
14318 std::fill(PSHUFHalfMask, PSHUFHalfMask + 4, SplatIdx);
14319 PSHUFDMask[0] = PSHUFDMask[2] = DOffset + 0;
14320 PSHUFDMask[1] = PSHUFDMask[3] = DOffset + 1;
14322 if ((NumHToL + NumHToH) == 0)
14323 return ShuffleDWordPairs(PSHUFHalfMask, PSHUFDMask, X86ISD::PSHUFLW);
14324 if ((NumLToL + NumLToH) == 0)
14325 return ShuffleDWordPairs(PSHUFHalfMask, PSHUFDMask, X86ISD::PSHUFHW);
14361 int AOffset,
int BOffset) {
14363 "Must call this with A having 3 or 1 inputs from the A half.");
14365 "Must call this with B having 1 or 3 inputs from the B half.");
14367 "Must call this with either 3:1 or 1:3 inputs (summing to 4).");
14369 bool ThreeAInputs = AToAInputs.
size() == 3;
14375 int ADWord = 0, BDWord = 0;
14376 int &TripleDWord = ThreeAInputs ? ADWord : BDWord;
14377 int &OneInputDWord = ThreeAInputs ? BDWord : ADWord;
14378 int TripleInputOffset = ThreeAInputs ? AOffset : BOffset;
14379 ArrayRef<int> TripleInputs = ThreeAInputs ? AToAInputs : BToAInputs;
14380 int OneInput = ThreeAInputs ? BToAInputs[0] : AToAInputs[0];
14381 int TripleInputSum = 0 + 1 + 2 + 3 + (4 * TripleInputOffset);
14382 int TripleNonInputIdx =
14383 TripleInputSum - std::accumulate(TripleInputs.
begin(), TripleInputs.
end(), 0);
14384 TripleDWord = TripleNonInputIdx / 2;
14388 OneInputDWord = (OneInput / 2) ^ 1;
14395 if (BToBInputs.
size() == 2 && AToBInputs.
size() == 2) {
14400 int NumFlippedAToBInputs =
llvm::count(AToBInputs, 2 * ADWord) +
14402 int NumFlippedBToBInputs =
llvm::count(BToBInputs, 2 * BDWord) +
14404 if ((NumFlippedAToBInputs == 1 &&
14405 (NumFlippedBToBInputs == 0 || NumFlippedBToBInputs == 2)) ||
14406 (NumFlippedBToBInputs == 1 &&
14407 (NumFlippedAToBInputs == 0 || NumFlippedAToBInputs == 2))) {
14412 auto FixFlippedInputs = [&V, &
DL, &Mask, &DAG](
int PinnedIdx,
int DWord,
14414 int FixIdx = PinnedIdx ^ 1;
14415 bool IsFixIdxInput =
is_contained(Inputs, PinnedIdx ^ 1);
14419 int FixFreeIdx = 2 * (DWord ^ (PinnedIdx / 2 == DWord));
14420 bool IsFixFreeIdxInput =
is_contained(Inputs, FixFreeIdx);
14421 if (IsFixIdxInput == IsFixFreeIdxInput)
14424 assert(IsFixIdxInput != IsFixFreeIdxInput &&
14425 "We need to be changing the number of flipped inputs!");
14426 int PSHUFHalfMask[] = {0, 1, 2, 3};
14427 std::swap(PSHUFHalfMask[FixFreeIdx % 4], PSHUFHalfMask[FixIdx % 4]);
14429 FixIdx < 4 ? X86ISD::PSHUFLW : X86ISD::PSHUFHW,
DL,
14433 for (
int &M : Mask)
14434 if (M >= 0 && M == FixIdx)
14436 else if (M >= 0 && M == FixFreeIdx)
14439 if (NumFlippedBToBInputs != 0) {
14441 BToAInputs.
size() == 3 ? TripleNonInputIdx : OneInput;
14442 FixFlippedInputs(BPinnedIdx, BDWord, BToBInputs);
14444 assert(NumFlippedAToBInputs != 0 &&
"Impossible given predicates!");
14445 int APinnedIdx = ThreeAInputs ? TripleNonInputIdx : OneInput;
14446 FixFlippedInputs(APinnedIdx, ADWord, AToBInputs);
14451 int PSHUFDMask[] = {0, 1, 2, 3};
14452 PSHUFDMask[ADWord] = BDWord;
14453 PSHUFDMask[BDWord] = ADWord;
14460 for (
int &M : Mask)
14461 if (M >= 0 && M/2 == ADWord)
14462 M = 2 * BDWord + M % 2;
14463 else if (M >= 0 && M/2 == BDWord)
14464 M = 2 * ADWord + M % 2;
14470 if ((NumLToL == 3 && NumHToL == 1) || (NumLToL == 1 && NumHToL == 3))
14471 return balanceSides(LToLInputs, HToLInputs, HToHInputs, LToHInputs, 0, 4);
14472 if ((NumHToH == 3 && NumLToH == 1) || (NumHToH == 1 && NumLToH == 3))
14473 return balanceSides(HToHInputs, LToHInputs, LToLInputs, HToLInputs, 4, 0);
14480 int PSHUFLMask[4] = {-1, -1, -1, -1};
14481 int PSHUFHMask[4] = {-1, -1, -1, -1};
14482 int PSHUFDMask[4] = {-1, -1, -1, -1};
14487 auto fixInPlaceInputs =
14491 if (InPlaceInputs.
empty())
14493 if (InPlaceInputs.
size() == 1) {
14494 SourceHalfMask[InPlaceInputs[0] - HalfOffset] =
14495 InPlaceInputs[0] - HalfOffset;
14496 PSHUFDMask[InPlaceInputs[0] / 2] = InPlaceInputs[0] / 2;
14499 if (IncomingInputs.
empty()) {
14501 for (
int Input : InPlaceInputs) {
14502 SourceHalfMask[
Input - HalfOffset] =
Input - HalfOffset;
14508 assert(InPlaceInputs.
size() == 2 &&
"Cannot handle 3 or 4 inputs!");
14509 SourceHalfMask[InPlaceInputs[0] - HalfOffset] =
14510 InPlaceInputs[0] - HalfOffset;
14513 int AdjIndex = InPlaceInputs[0] ^ 1;
14514 SourceHalfMask[AdjIndex - HalfOffset] = InPlaceInputs[1] - HalfOffset;
14516 PSHUFDMask[AdjIndex / 2] = AdjIndex / 2;
14518 fixInPlaceInputs(LToLInputs, HToLInputs, PSHUFLMask, LoMask, 0);
14519 fixInPlaceInputs(HToHInputs, LToHInputs, PSHUFHMask, HiMask, 4);
14525 auto moveInputsToRightHalf = [&PSHUFDMask](
14530 auto isWordClobbered = [](
ArrayRef<int> SourceHalfMask,
int Word) {
14531 return SourceHalfMask[Word] >= 0 && SourceHalfMask[Word] != Word;
14533 auto isDWordClobbered = [&isWordClobbered](
ArrayRef<int> SourceHalfMask,
14535 int LowWord = Word & ~1;
14536 int HighWord = Word | 1;
14537 return isWordClobbered(SourceHalfMask, LowWord) ||
14538 isWordClobbered(SourceHalfMask, HighWord);
14541 if (IncomingInputs.
empty())
14544 if (ExistingInputs.
empty()) {
14546 for (
int Input : IncomingInputs) {
14549 if (isWordClobbered(SourceHalfMask,
Input - SourceOffset)) {
14550 if (SourceHalfMask[SourceHalfMask[
Input - SourceOffset]] < 0) {
14551 SourceHalfMask[SourceHalfMask[
Input - SourceOffset]] =
14552 Input - SourceOffset;
14554 for (
int &M : HalfMask)
14555 if (M == SourceHalfMask[
Input - SourceOffset] + SourceOffset)
14557 else if (M ==
Input)
14558 M = SourceHalfMask[
Input - SourceOffset] + SourceOffset;
14560 assert(SourceHalfMask[SourceHalfMask[
Input - SourceOffset]] ==
14561 Input - SourceOffset &&
14562 "Previous placement doesn't match!");
14567 Input = SourceHalfMask[
Input - SourceOffset] + SourceOffset;
14571 if (PSHUFDMask[(
Input - SourceOffset + DestOffset) / 2] < 0)
14572 PSHUFDMask[(
Input - SourceOffset + DestOffset) / 2] =
Input / 2;
14574 assert(PSHUFDMask[(
Input - SourceOffset + DestOffset) / 2] ==
14576 "Previous placement doesn't match!");
14582 for (
int &M : HalfMask)
14583 if (M >= SourceOffset && M < SourceOffset + 4) {
14584 M = M - SourceOffset + DestOffset;
14585 assert(M >= 0 &&
"This should never wrap below zero!");
14593 if (IncomingInputs.
size() == 1) {
14594 if (isWordClobbered(SourceHalfMask, IncomingInputs[0] - SourceOffset)) {
14595 int InputFixed =
find(SourceHalfMask, -1) - std::begin(SourceHalfMask) +
14597 SourceHalfMask[InputFixed - SourceOffset] =
14598 IncomingInputs[0] - SourceOffset;
14600 IncomingInputs[0] = InputFixed;
14602 }
else if (IncomingInputs.
size() == 2) {
14603 if (IncomingInputs[0] / 2 != IncomingInputs[1] / 2 ||
14604 isDWordClobbered(SourceHalfMask, IncomingInputs[0] - SourceOffset)) {
14608 int InputsFixed[2] = {IncomingInputs[0] - SourceOffset,
14609 IncomingInputs[1] - SourceOffset};
14614 if (!isWordClobbered(SourceHalfMask, InputsFixed[0]) &&
14615 SourceHalfMask[InputsFixed[0] ^ 1] < 0) {
14616 SourceHalfMask[InputsFixed[0]] = InputsFixed[0];
14617 SourceHalfMask[InputsFixed[0] ^ 1] = InputsFixed[1];
14618 InputsFixed[1] = InputsFixed[0] ^ 1;
14619 }
else if (!isWordClobbered(SourceHalfMask, InputsFixed[1]) &&
14620 SourceHalfMask[InputsFixed[1] ^ 1] < 0) {
14621 SourceHalfMask[InputsFixed[1]] = InputsFixed[1];
14622 SourceHalfMask[InputsFixed[1] ^ 1] = InputsFixed[0];
14623 InputsFixed[0] = InputsFixed[1] ^ 1;
14624 }
else if (SourceHalfMask[2 * ((InputsFixed[0] / 2) ^ 1)] < 0 &&
14625 SourceHalfMask[2 * ((InputsFixed[0] / 2) ^ 1) + 1] < 0) {
14629 SourceHalfMask[2 * ((InputsFixed[0] / 2) ^ 1)] = InputsFixed[0];
14630 SourceHalfMask[2 * ((InputsFixed[0] / 2) ^ 1) + 1] = InputsFixed[1];
14631 InputsFixed[0] = 2 * ((InputsFixed[0] / 2) ^ 1);
14632 InputsFixed[1] = 2 * ((InputsFixed[0] / 2) ^ 1) + 1;
14638 for (
int i = 0; i < 4; ++i)
14639 assert((SourceHalfMask[i] < 0 || SourceHalfMask[i] == i) &&
14640 "We can't handle any clobbers here!");
14641 assert(InputsFixed[1] != (InputsFixed[0] ^ 1) &&
14642 "Cannot have adjacent inputs here!");
14644 SourceHalfMask[InputsFixed[0] ^ 1] = InputsFixed[1];
14645 SourceHalfMask[InputsFixed[1]] = InputsFixed[0] ^ 1;
14649 for (
int &M : FinalSourceHalfMask)
14650 if (M == (InputsFixed[0] ^ 1) + SourceOffset)
14651 M = InputsFixed[1] + SourceOffset;
14652 else if (M == InputsFixed[1] + SourceOffset)
14653 M = (InputsFixed[0] ^ 1) + SourceOffset;
14655 InputsFixed[1] = InputsFixed[0] ^ 1;
14659 for (
int &M : HalfMask)
14660 if (M == IncomingInputs[0])
14661 M = InputsFixed[0] + SourceOffset;
14662 else if (M == IncomingInputs[1])
14663 M = InputsFixed[1] + SourceOffset;
14665 IncomingInputs[0] = InputsFixed[0] + SourceOffset;
14666 IncomingInputs[1] = InputsFixed[1] + SourceOffset;
14673 int FreeDWord = (PSHUFDMask[DestOffset / 2] < 0 ? 0 : 1) + DestOffset / 2;
14674 assert(PSHUFDMask[FreeDWord] < 0 &&
"DWord not free");
14675 PSHUFDMask[FreeDWord] = IncomingInputs[0] / 2;
14676 for (
int &M : HalfMask)
14677 for (
int Input : IncomingInputs)
14679 M = FreeDWord * 2 +
Input % 2;
14681 moveInputsToRightHalf(HToLInputs, LToLInputs, PSHUFHMask, LoMask, HiMask,
14683 moveInputsToRightHalf(LToHInputs, HToHInputs, PSHUFLMask, HiMask, LoMask,
14689 V = DAG.
getNode(X86ISD::PSHUFLW,
DL, VT, V,
14692 V = DAG.
getNode(X86ISD::PSHUFHW,
DL, VT, V,
14703 "Failed to lift all the high half inputs to the low mask!");
14704 assert(
none_of(HiMask, [](
int M) {
return M >= 0 && M < 4; }) &&
14705 "Failed to lift all the low half inputs to the high mask!");
14709 V = DAG.
getNode(X86ISD::PSHUFLW,
DL, VT, V,
14713 for (
int &M : HiMask)
14717 V = DAG.
getNode(X86ISD::PSHUFHW,
DL, VT, V,
15079 assert(
V1.getSimpleValueType() == MVT::v16i8 &&
"Bad operand type!");
15081 assert(Mask.size() == 16 &&
"Unexpected mask size for v16 shuffle!");
15101 Zeroable, Subtarget, DAG))
15114 if (Subtarget.hasSSE4A())
15119 int NumV2Elements =
count_if(Mask, [](
int M) {
return M >= 16; });
15122 if (NumV2Elements == 0) {
15125 Mask, Subtarget, DAG))
15145 for (
int i = 0; i < 16; i += 2)
15146 if (Mask[i] >= 0 && Mask[i + 1] >= 0 && Mask[i] != Mask[i + 1])
15151 auto tryToWidenViaDuplication = [&]() ->
SDValue {
15152 if (!canWidenViaDuplication(Mask))
15155 copy_if(Mask, std::back_inserter(LoInputs),
15156 [](
int M) {
return M >= 0 && M < 8; });
15160 copy_if(Mask, std::back_inserter(HiInputs), [](
int M) {
return M >= 8; });
15164 bool TargetLo = LoInputs.
size() >= HiInputs.
size();
15165 ArrayRef<int> InPlaceInputs = TargetLo ? LoInputs : HiInputs;
15166 ArrayRef<int> MovingInputs = TargetLo ? HiInputs : LoInputs;
15168 int PreDupI16Shuffle[] = {-1, -1, -1, -1, -1, -1, -1, -1};
15170 for (
int I : InPlaceInputs) {
15171 PreDupI16Shuffle[
I/2] =
I/2;
15174 int j = TargetLo ? 0 : 4, je = j + 4;
15175 for (
int i = 0, ie = MovingInputs.
size(); i < ie; ++i) {
15178 if (PreDupI16Shuffle[j] != MovingInputs[i] / 2) {
15181 while (j < je && PreDupI16Shuffle[j] >= 0)
15189 PreDupI16Shuffle[j] = MovingInputs[i] / 2;
15193 LaneMap[MovingInputs[i]] = 2 * j + MovingInputs[i] % 2;
15198 DAG.
getUNDEF(MVT::v8i16), PreDupI16Shuffle));
15201 bool EvenInUse =
false, OddInUse =
false;
15202 for (
int i = 0; i < 16; i += 2) {
15203 EvenInUse |= (Mask[i + 0] >= 0);
15204 OddInUse |= (Mask[i + 1] >= 0);
15205 if (EvenInUse && OddInUse)
15208 V1 = DAG.
getNode(TargetLo ? X86ISD::UNPCKL : X86ISD::UNPCKH,
DL,
15209 MVT::v16i8, EvenInUse ?
V1 : DAG.
getUNDEF(MVT::v16i8),
15212 int PostDupI16Shuffle[8] = {-1, -1, -1, -1, -1, -1, -1, -1};
15213 for (
int i = 0; i < 16; ++i)
15214 if (Mask[i] >= 0) {
15215 int MappedMask = LaneMap[Mask[i]] - (TargetLo ? 0 : 8);
15216 assert(MappedMask < 8 &&
"Invalid v8 shuffle mask!");
15217 if (PostDupI16Shuffle[i / 2] < 0)
15218 PostDupI16Shuffle[i / 2] = MappedMask;
15220 assert(PostDupI16Shuffle[i / 2] == MappedMask &&
15221 "Conflicting entries in the original shuffle!");
15226 DAG.
getUNDEF(MVT::v8i16), PostDupI16Shuffle));
15228 if (
SDValue V = tryToWidenViaDuplication())
15242 Zeroable, Subtarget, DAG))
15246 bool IsSingleInput = V2.
isUndef();
15265 if (Subtarget.
hasSSSE3() && (IsSingleInput || NumEvenDrops != 1)) {
15266 bool V1InUse =
false;
15267 bool V2InUse =
false;
15270 DL, MVT::v16i8,
V1, V2, Mask, Zeroable, DAG, V1InUse, V2InUse);
15275 if (V1InUse && V2InUse) {
15278 Zeroable, Subtarget, DAG))
15290 DL, MVT::v16i8,
V1, V2, Mask, Subtarget, DAG))
15294 if (Subtarget.hasVBMI())
15299 if (Subtarget.hasXOP()) {
15301 return DAG.
getNode(X86ISD::VPPERM,
DL, MVT::v16i8,
V1, V2, MaskNode);
15307 DL, MVT::v16i8,
V1, V2, Mask, Subtarget, DAG))
15315 if (NumV2Elements == 1)
15317 DL, MVT::v16i8,
V1, V2, Mask, Zeroable, Subtarget, DAG))
15330 if (NumEvenDrops) {
15336 assert(NumEvenDrops <= 3 &&
15337 "No support for dropping even elements more than 3 times.");
15339 for (
unsigned i = 0; i != 8; i += 1 << (NumEvenDrops - 1))
15344 if (!IsSingleInput)
15350 IsSingleInput ?
V1 : V2);
15351 for (
int i = 1; i < NumEvenDrops; ++i) {
15352 Result = DAG.
getBitcast(MVT::v8i16, Result);
15353 Result = DAG.
getNode(X86ISD::PACKUS,
DL, MVT::v16i8, Result, Result);
15359 if (NumOddDrops == 1) {
15363 if (!IsSingleInput)
15364 V2 = DAG.
getNode(X86ISD::VSRLI,
DL, MVT::v8i16,
15367 return DAG.
getNode(X86ISD::PACKUS,
DL, MVT::v16i8,
V1,
15368 IsSingleInput ?
V1 : V2);
15372 if (NumV2Elements > 0)
15374 Zeroable, Subtarget, DAG);
15381 std::array<int, 8> LoBlendMask = {{-1, -1, -1, -1, -1, -1, -1, -1}};
15382 std::array<int, 8> HiBlendMask = {{-1, -1, -1, -1, -1, -1, -1, -1}};
15383 for (
int i = 0; i < 16; ++i)
15385 (i < 8 ? LoBlendMask[i] : HiBlendMask[i % 8]) = Mask[i];
15391 if (
none_of(LoBlendMask, [](
int M) {
return M >= 0 && M % 2 == 1; }) &&
15392 none_of(HiBlendMask, [](
int M) {
return M >= 0 && M % 2 == 1; })) {
15399 VHiHalf = DAG.
getUNDEF(MVT::v8i16);
15402 for (
int &M : LoBlendMask)
15405 for (
int &M : HiBlendMask)
15414 MVT::v8i16, DAG.
getNode(X86ISD::UNPCKL,
DL, MVT::v16i8, V, Zero));
15416 MVT::v8i16, DAG.
getNode(X86ISD::UNPCKH,
DL, MVT::v16i8, V, Zero));
15422 return DAG.
getNode(X86ISD::PACKUS,
DL, MVT::v16i8, LoV, HiV);