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()) {
484 bool SlowPDEP = Subtarget.isPDEPSlow();
485 bool SlowPEXT = Subtarget.isPEXTSlow();
490 if (Subtarget.is64Bit()) {
498 if (!Subtarget.hasMOVBE())
502 for (
auto VT : { MVT::f32, MVT::f64, MVT::f80, MVT::f128 }) {
508 for (
auto VT : { MVT::i8, MVT::i16, MVT::i32, MVT::i64 }) {
509 if (VT == MVT::i64 && !Subtarget.is64Bit())
529 for (
auto VT : { MVT::i32, MVT::i64 }) {
530 if (VT == MVT::i64 && !Subtarget.is64Bit())
541 for (
auto VT : { MVT::i32, MVT::i64 }) {
542 if (VT == MVT::i64 && !Subtarget.is64Bit())
549 if (Subtarget.hasSSEPrefetch())
555 for (
auto VT : { MVT::i8, MVT::i16, MVT::i32, MVT::i64 }) {
565 if (!Subtarget.is64Bit())
568 if (Subtarget.is64Bit() && Subtarget.hasAVX()) {
575 if (Subtarget.canUseCMPXCHG16B())
580 if (Subtarget.isTargetWin32() && !Subtarget.isTargetCygMing() &&
593 if (Subtarget.isTargetPS())
601 bool Is64Bit = Subtarget.is64Bit();
657 if (!Subtarget.useSoftFloat() && Subtarget.hasSSE2()) {
661 : &X86::FR16RegClass);
663 : &X86::FR32RegClass);
665 : &X86::FR64RegClass);
673 for (
auto VT : { MVT::f32, MVT::f64 }) {
694 setF16Action(MVT::f16,
Promote);
753 }
else if (!Subtarget.useSoftFloat() && Subtarget.hasSSE1() &&
754 (UseX87 || Is64Bit)) {
792 for (
auto VT : { MVT::f32, MVT::f64 }) {
805 if (UseX87 && (
getRegClassFor(MVT::f32) == &X86::RFP32RegClass)) {
806 addLegalFPImmediate(
APFloat(+0.0f));
807 addLegalFPImmediate(
APFloat(+1.0f));
808 addLegalFPImmediate(
APFloat(-0.0f));
809 addLegalFPImmediate(
APFloat(-1.0f));
811 addLegalFPImmediate(
APFloat(+0.0f));
816 addLegalFPImmediate(
APFloat(+0.0));
817 addLegalFPImmediate(
APFloat(+1.0));
818 addLegalFPImmediate(
APFloat(-0.0));
819 addLegalFPImmediate(
APFloat(-1.0));
821 addLegalFPImmediate(
APFloat(+0.0));
852 addLegalFPImmediate(TmpFlt);
854 addLegalFPImmediate(TmpFlt);
860 addLegalFPImmediate(TmpFlt2);
862 addLegalFPImmediate(TmpFlt2);
911 if (!Subtarget.useSoftFloat() && Subtarget.is64Bit() && Subtarget.hasSSE1()) {
913 : &X86::VR128RegClass);
990 for (
auto VT : { MVT::v8f16, MVT::v16f16, MVT::v32f16,
991 MVT::v4f32, MVT::v8f32, MVT::v16f32,
992 MVT::v2f64, MVT::v4f64, MVT::v8f64 }) {
1075 if (!Subtarget.useSoftFloat() && Subtarget.hasMMX()) {
1080 auto SetFPMinMaxAction = [&](
MVT VT) {
1091 if (!Subtarget.useSoftFloat() && Subtarget.hasSSE1()) {
1093 : &X86::VR128RegClass);
1095 SetFPMinMaxAction(MVT::f32);
1118 if (!Subtarget.useSoftFloat() && Subtarget.hasSSE2()) {
1120 : &X86::VR128RegClass);
1125 : &X86::VR128RegClass);
1127 : &X86::VR128RegClass);
1129 : &X86::VR128RegClass);
1131 : &X86::VR128RegClass);
1133 : &X86::VR128RegClass);
1135 for (
auto VT : { MVT::f64, MVT::v4f32, MVT::v2f64 })
1136 SetFPMinMaxAction(VT);
1172 if (Subtarget.hasPCLMUL()) {
1173 for (
auto VT : {MVT::i64, MVT::v4i32, MVT::v2i64}) {
1182 for (
auto VT : { MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64 }) {
1192 for (
auto VT : {MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64, MVT::i64}) {
1219 for (
auto VT : { MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64 }) {
1239 for (
auto VT : { MVT::v16i8, MVT::v8i16, MVT::v4i32 }) {
1247 for (
auto VT : { MVT::v8f16, MVT::v2f64, MVT::v2i64 }) {
1252 if (VT == MVT::v2i64 && !Subtarget.is64Bit())
1258 setF16Action(MVT::v8f16,
Expand);
1283 for (
auto VT : {MVT::v2i8, MVT::v4i8, MVT::v8i8, MVT::v2i16, MVT::v4i16}) {
1329 if (!Subtarget.hasAVX512())
1357 for (
auto VT : { MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64 }) {
1361 if (VT == MVT::v2i64)
continue;
1375 if (!Subtarget.useSoftFloat() && Subtarget.hasGFNI()) {
1381 for (
auto VT : {MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64}) {
1389 if (!Subtarget.useSoftFloat() && Subtarget.hasSSSE3()) {
1394 for (
auto VT : {MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64}) {
1406 if (Subtarget.hasNDD()) {
1414 if (!Subtarget.useSoftFloat() && Subtarget.hasSSE41()) {
1415 for (
MVT RoundedTy : {MVT::f32, MVT::f64, MVT::v4f32, MVT::v2f64}) {
1455 for (
auto VT : { MVT::v8i16, MVT::v4i32, MVT::v2i64 }) {
1470 if (Subtarget.is64Bit() && !Subtarget.hasAVX512()) {
1482 if (!Subtarget.useSoftFloat() && Subtarget.hasSSE42()) {
1486 if (!Subtarget.useSoftFloat() && Subtarget.hasXOP()) {
1487 for (
MVT VT : { MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64,
1488 MVT::v32i8, MVT::v16i16, MVT::v8i32, MVT::v4i64 }) {
1494 for (
auto VT : { MVT::i8, MVT::i16, MVT::i32, MVT::i64 })
1498 if (!Subtarget.useSoftFloat() && Subtarget.hasAVX()) {
1499 bool HasInt256 = Subtarget.hasInt256();
1502 : &X86::VR256RegClass);
1504 : &X86::VR256RegClass);
1506 : &X86::VR256RegClass);
1508 : &X86::VR256RegClass);
1510 : &X86::VR256RegClass);
1512 : &X86::VR256RegClass);
1514 : &X86::VR256RegClass);
1516 for (
auto VT : { MVT::v8f32, MVT::v4f64 }) {
1536 SetFPMinMaxAction(VT);
1577 if (!Subtarget.hasAVX512())
1582 for (
auto VT : { MVT::v32i8, MVT::v16i16, MVT::v8i32, MVT::v4i64 }) {
1596 if (VT == MVT::v4i64)
continue;
1617 for (
auto VT : { MVT::v16i16, MVT::v8i32, MVT::v4i64 }) {
1628 for (
auto VT : { MVT::v32i8, MVT::v16i16, MVT::v8i32, MVT::v4i64 }) {
1647 if (Subtarget.hasAnyFMA()) {
1648 for (
auto VT : { MVT::f32, MVT::f64, MVT::v4f32, MVT::v8f32,
1649 MVT::v2f64, MVT::v4f64 }) {
1655 for (
auto VT : { MVT::v32i8, MVT::v16i16, MVT::v8i32, MVT::v4i64 }) {
1696 for (
auto VT : { MVT::v32i8, MVT::v16i16, MVT::v8i32 }) {
1704 for (
auto VT : {MVT::v16i16, MVT::v8i32, MVT::v4i64}) {
1726 for (
auto VT : { MVT::v4i32, MVT::v8i32, MVT::v2i64, MVT::v4i64,
1727 MVT::v4f32, MVT::v8f32, MVT::v2f64, MVT::v4f64 }) {
1734 for (
auto VT : { MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64,
1735 MVT::v8f16, MVT::v4f32, MVT::v2f64 }) {
1740 for (
MVT VT : { MVT::v32i8, MVT::v16i16, MVT::v8i32, MVT::v4i64,
1741 MVT::v16f16, MVT::v8f32, MVT::v4f64 }) {
1752 setF16Action(MVT::v16f16,
Expand);
1762 if (Subtarget.hasPCLMUL()) {
1763 for (
auto VT : {MVT::v8i32, MVT::v4i64}) {
1781 for (
auto VT : { MVT::v4i32, MVT::v8i32, MVT::v2i64, MVT::v4i64,
1782 MVT::v4f32, MVT::v8f32, MVT::v2f64, MVT::v4f64 })
1786 if (Subtarget.hasBMI2() && Subtarget.isPDEPSlow())
1787 for (
auto VT : {MVT::v4i32, MVT::v8i32, MVT::v2i64, MVT::v4i64})
1790 if (Subtarget.hasBMI2() && Subtarget.isPEXTSlow())
1791 for (
auto VT : {MVT::v4i32, MVT::v8i32, MVT::v2i64, MVT::v4i64})
1795 if (Subtarget.hasGFNI()) {
1801 if (!Subtarget.useSoftFloat() && !Subtarget.hasFP16() &&
1802 Subtarget.hasF16C()) {
1803 for (
MVT VT : { MVT::f16, MVT::v2f16, MVT::v4f16, MVT::v8f16 }) {
1807 for (
MVT VT : { MVT::f32, MVT::v2f32, MVT::v4f32, MVT::v8f32 }) {
1822 if (!Subtarget.useSoftFloat() && Subtarget.hasAVX512()) {
1850 if (!Subtarget.hasDQI()) {
1863 for (
auto VT : { MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64 }) {
1869 for (
auto VT : { MVT::v1i1, MVT::v2i1, MVT::v4i1, MVT::v8i1, MVT::v16i1 })
1872 for (
auto VT : { MVT::v2i1, MVT::v4i1, MVT::v8i1, MVT::v16i1 }) {
1885 for (
auto VT : { MVT::v1i1, MVT::v2i1, MVT::v4i1, MVT::v8i1 })
1888 if (Subtarget.hasDQI() && Subtarget.hasVLX()) {
1889 for (
MVT VT : {MVT::v4f32, MVT::v8f32, MVT::v2f64, MVT::v4f64}) {
1898 if (!Subtarget.useSoftFloat() && Subtarget.useAVX512Regs()) {
1899 bool HasBWI = Subtarget.hasBWI();
1919 for (
MVT VT : { MVT::v16f32, MVT::v8f64 }) {
1920 SetFPMinMaxAction(VT);
1933 if (Subtarget.hasDQI())
1951 for (
MVT VT : { MVT::v16i1, MVT::v16i8 }) {
1958 for (
MVT VT : { MVT::v16i16, MVT::v16i32 }) {
1995 if (!Subtarget.hasVLX()) {
1996 for (
auto VT : {MVT::v4i32, MVT::v8i32, MVT::v2i64, MVT::v4i64,
1997 MVT::v4f32, MVT::v8f32, MVT::v2f64, MVT::v4f64}) {
2023 for (
auto VT : { MVT::v16f32, MVT::v8f64 }) {
2040 for (
auto VT : {MVT::v32i16, MVT::v16i32, MVT::v8i64}) {
2070 for (
auto VT : { MVT::v64i8, MVT::v32i16, MVT::v16i32, MVT::v8i64 }) {
2102 for (
auto VT : { MVT::v16i32, MVT::v8i64 }) {
2113 for (
auto VT : { MVT::v64i8, MVT::v32i16 }) {
2134 if (Subtarget.hasDQI() || Subtarget.hasFP16())
2140 if (Subtarget.hasDQI()) {
2147 if (Subtarget.hasCDI()) {
2149 for (
auto VT : { MVT::v16i32, MVT::v8i64} ) {
2154 if (Subtarget.hasVPOPCNTDQ()) {
2155 for (
auto VT : { MVT::v16i32, MVT::v8i64 })
2163 for (
auto VT : { MVT::v32i8, MVT::v16i16, MVT::v8i32, MVT::v4i64,
2164 MVT::v16f16, MVT::v8f32, MVT::v4f64 })
2167 for (
auto VT : { MVT::v64i8, MVT::v32i16, MVT::v16i32, MVT::v8i64,
2168 MVT::v32f16, MVT::v16f32, MVT::v8f64 }) {
2179 setF16Action(MVT::v32f16,
Expand);
2188 for (
auto VT : { MVT::v16i32, MVT::v8i64, MVT::v16f32, MVT::v8f64 }) {
2195 for (
auto VT : { MVT::v64i8, MVT::v32i16 }) {
2204 if (Subtarget.hasVBMI2()) {
2205 for (
auto VT : {MVT::v32i16, MVT::v16i32, MVT::v8i64}) {
2215 if (Subtarget.hasPCLMUL()) {
2216 for (
auto VT : {MVT::v16i32, MVT::v8i64}) {
2227 if (Subtarget.hasGFNI()) {
2233 if (!Subtarget.useSoftFloat() && Subtarget.hasVBMI2()) {
2234 for (
auto VT : {MVT::v8i16, MVT::v4i32, MVT::v2i64, MVT::v16i16, MVT::v8i32,
2249 if (!Subtarget.useSoftFloat() && Subtarget.hasAVX512()) {
2250 for (
MVT VT : {MVT::f16, MVT::f32, MVT::f64, MVT::v8f16, MVT::v4f32,
2251 MVT::v2f64, MVT::v16f16, MVT::v8f32, MVT::v4f64})
2260 if (Subtarget.hasDQI()) {
2265 "Unexpected operation action!");
2273 for (
auto VT : { MVT::v2i64, MVT::v4i64 }) {
2281 for (
auto VT : { MVT::v4i32, MVT::v8i32, MVT::v2i64, MVT::v4i64 }) {
2290 for (
auto VT : { MVT::v4i32, MVT::v8i32, MVT::v2i64, MVT::v4i64,
2291 MVT::v4f32, MVT::v8f32, MVT::v2f64, MVT::v4f64 })
2294 if (Subtarget.hasDQI()) {
2309 if (Subtarget.hasCDI()) {
2310 for (
auto VT : {MVT::i256, MVT::i512}) {
2311 if (VT == MVT::i512 && !Subtarget.useAVX512Regs())
2318 for (
auto VT : { MVT::v4i32, MVT::v8i32, MVT::v2i64, MVT::v4i64 }) {
2323 if (Subtarget.hasVPOPCNTDQ()) {
2324 for (
auto VT : {MVT::v4i32, MVT::v8i32, MVT::v2i64, MVT::v4i64})
2332 for (
MVT VT : {MVT::v8i32, MVT::v8f32, MVT::v4i32, MVT::v4f32, MVT::v4i64,
2333 MVT::v4f64, MVT::v2i64, MVT::v2f64, MVT::v16i8, MVT::v8i16,
2334 MVT::v16i16, MVT::v8i8})
2339 for (
MVT VT : {MVT::v16i32, MVT::v16f32, MVT::v8i64, MVT::v8f64})
2343 if (Subtarget.hasVLX())
2344 for (
MVT VT : {MVT::v8i32, MVT::v8f32, MVT::v4i32, MVT::v4f32, MVT::v4i64,
2345 MVT::v4f64, MVT::v2i64, MVT::v2f64})
2349 if (Subtarget.hasVBMI2())
2350 for (
MVT VT : {MVT::v32i16, MVT::v64i8})
2354 if (Subtarget.hasVBMI2() && Subtarget.hasVLX())
2355 for (
MVT VT : {MVT::v16i8, MVT::v8i16, MVT::v32i8, MVT::v16i16})
2361 if (!Subtarget.useSoftFloat() && Subtarget.hasBWI()) {
2365 for (
auto VT : { MVT::v32i1, MVT::v64i1 }) {
2378 for (
auto VT : { MVT::v16i1, MVT::v32i1 })
2386 for (
auto VT : {MVT::v32i8, MVT::v16i8, MVT::v16i16, MVT::v8i16,
2387 MVT::v16f16, MVT::v8f16}) {
2396 if (Subtarget.hasBITALG()) {
2397 for (
auto VT : { MVT::v16i8, MVT::v32i8, MVT::v8i16, MVT::v16i16 })
2401 if (Subtarget.hasBMM()) {
2407 for (
auto VT : {MVT::v16i8, MVT::v32i8, MVT::v64i8})
2412 if (!Subtarget.useSoftFloat() && Subtarget.hasFP16()) {
2413 auto setGroup = [&] (
MVT VT) {
2462 SetFPMinMaxAction(MVT::f16);
2480 if (Subtarget.useAVX512Regs()) {
2481 setGroup(MVT::v32f16);
2519 SetFPMinMaxAction(MVT::v32f16);
2529 if (Subtarget.hasVLX()) {
2530 setGroup(MVT::v8f16);
2531 setGroup(MVT::v16f16);
2568 SetFPMinMaxAction(MVT::v8f16);
2569 SetFPMinMaxAction(MVT::v16f16);
2576 if (!Subtarget.useSoftFloat() &&
2577 (Subtarget.hasAVXNECONVERT() || Subtarget.hasBF16())) {
2579 : &X86::VR128RegClass);
2580 addRegisterClass(MVT::v16bf16, Subtarget.hasAVX512() ? &X86::VR256XRegClass
2581 : &X86::VR256RegClass);
2587 for (
auto VT : {MVT::v8bf16, MVT::v16bf16}) {
2588 setF16Action(VT,
Expand);
2589 if (!Subtarget.hasBF16())
2606 if (!Subtarget.useSoftFloat() && Subtarget.hasBF16() &&
2607 Subtarget.useAVX512Regs()) {
2609 setF16Action(MVT::v32bf16,
Expand);
2620 if (!Subtarget.useSoftFloat() && Subtarget.hasAVX10_2()) {
2637 SetFPMinMaxAction(MVT::v32bf16);
2638 for (
auto VT : {MVT::v8bf16, MVT::v16bf16}) {
2646 SetFPMinMaxAction(VT);
2648 for (
auto VT : {MVT::f16, MVT::f32, MVT::f64}) {
2654 if (!Subtarget.useSoftFloat() && Subtarget.hasVLX()) {
2667 if (Subtarget.hasBWI()) {
2672 if (Subtarget.hasFP16()) {
2704 if (!Subtarget.useSoftFloat() && Subtarget.hasAMXTILE()) {
2712 if (!Subtarget.is64Bit()) {
2722 for (
auto VT : { MVT::i8, MVT::i16, MVT::i32, MVT::i64 }) {
2723 if (VT == MVT::i64 && !Subtarget.is64Bit())
2745 if (Subtarget.isTargetWin64()) {
2764 if (Subtarget.is32Bit() &&
2765 (Subtarget.isTargetWindowsMSVC() || Subtarget.isTargetWindowsItanium()))
2793 if (Subtarget.isOSWindows()) {
4852 unsigned IdxVal =
Op.getConstantOperandVal(2);
4858 if (IdxVal == 0 && Vec.
isUndef())
4861 MVT OpVT =
Op.getSimpleValueType();
4880 assert(IdxVal + SubVecNumElems <= NumElems &&
4882 "Unexpected index value in INSERT_SUBVECTOR");
4891 Vec = DAG.
getNode(X86ISD::KSHIFTR, dl, WideOpVT, Vec, ShiftBits);
4892 Vec = DAG.
getNode(X86ISD::KSHIFTL, dl, WideOpVT, Vec, ShiftBits);
4902 Undef, SubVec, ZeroIdx);
4905 assert(IdxVal != 0 &&
"Unexpected index");
4906 SubVec = DAG.
getNode(X86ISD::KSHIFTL, dl, WideOpVT, SubVec,
4912 assert(IdxVal != 0 &&
"Unexpected index");
4915 [](
SDValue V) { return V.isUndef(); })) {
4916 SubVec = DAG.
getNode(X86ISD::KSHIFTL, dl, WideOpVT, SubVec,
4920 unsigned ShiftLeft = NumElems - SubVecNumElems;
4921 unsigned ShiftRight = NumElems - SubVecNumElems - IdxVal;
4922 SubVec = DAG.
getNode(X86ISD::KSHIFTL, dl, WideOpVT, SubVec,
4924 if (ShiftRight != 0)
4925 SubVec = DAG.
getNode(X86ISD::KSHIFTR, dl, WideOpVT, SubVec,
4932 if (IdxVal + SubVecNumElems == NumElems) {
4933 SubVec = DAG.
getNode(X86ISD::KSHIFTL, dl, WideOpVT, SubVec,
4935 if (SubVecNumElems * 2 == NumElems) {
4945 Undef, Vec, ZeroIdx);
4948 Vec = DAG.
getNode(X86ISD::KSHIFTL, dl, WideOpVT, Vec, ShiftBits);
4949 Vec = DAG.
getNode(X86ISD::KSHIFTR, dl, WideOpVT, Vec, ShiftBits);
4962 unsigned ShiftLeft = NumElems - SubVecNumElems;
4963 unsigned ShiftRight = NumElems - SubVecNumElems - IdxVal;
4966 if (WideOpVT != MVT::v64i1 || Subtarget.is64Bit()) {
4972 SubVec = DAG.
getNode(X86ISD::KSHIFTL, dl, WideOpVT, SubVec,
4974 SubVec = DAG.
getNode(X86ISD::KSHIFTR, dl, WideOpVT, SubVec,
4983 SubVec = DAG.
getNode(X86ISD::KSHIFTL, dl, WideOpVT, SubVec,
4985 SubVec = DAG.
getNode(X86ISD::KSHIFTR, dl, WideOpVT, SubVec,
4989 unsigned LowShift = NumElems - IdxVal;
4996 unsigned HighShift = IdxVal + SubVecNumElems;
5448 bool AllowWholeUndefs =
true,
5449 bool AllowPartialUndefs =
false) {
5450 assert(EltBits.
empty() &&
"Expected an empty EltBits vector");
5454 EVT VT =
Op.getValueType();
5456 unsigned NumElts = SizeInBits / EltSizeInBits;
5459 if ((SizeInBits % EltSizeInBits) != 0)
5465 unsigned SrcEltSizeInBits = SrcEltBits[0].getBitWidth();
5466 assert((NumSrcElts * SrcEltSizeInBits) == SizeInBits &&
5467 "Constant bit sizes don't match");
5470 bool AllowUndefs = AllowWholeUndefs || AllowPartialUndefs;
5475 if (NumSrcElts == NumElts) {
5476 UndefElts = UndefSrcElts;
5477 EltBits.
assign(SrcEltBits.begin(), SrcEltBits.end());
5482 APInt UndefBits(SizeInBits, 0);
5483 APInt MaskBits(SizeInBits, 0);
5485 for (
unsigned i = 0; i != NumSrcElts; ++i) {
5486 unsigned BitOffset = i * SrcEltSizeInBits;
5487 if (UndefSrcElts[i])
5488 UndefBits.
setBits(BitOffset, BitOffset + SrcEltSizeInBits);
5489 MaskBits.
insertBits(SrcEltBits[i], BitOffset);
5493 UndefElts =
APInt(NumElts, 0);
5496 for (
unsigned i = 0; i != NumElts; ++i) {
5497 unsigned BitOffset = i * EltSizeInBits;
5502 if (!AllowWholeUndefs)
5510 if (UndefEltBits.
getBoolValue() && !AllowPartialUndefs)
5513 EltBits[i] = MaskBits.
extractBits(EltSizeInBits, BitOffset);
5520 unsigned UndefBitIndex) {
5524 Undefs.setBit(UndefBitIndex);
5534 CFP->getValueAPF().bitcastToAPInt());
5538 Type *Ty = CDS->getType();
5539 if (Ty->isVectorTy()) {
5541 Type *EltTy = CDS->getElementType();
5545 if (!IsInteger && !IsFP)
5548 for (
unsigned I = 0,
E = CDS->getNumElements();
I !=
E; ++
I)
5550 Mask.insertBits(CDS->getElementAsAPInt(
I),
I * EltBits);
5552 Mask.insertBits(CDS->getElementAsAPFloat(
I).bitcastToAPInt(),
5564 return CastBitData(UndefSrcElts, SrcEltBits);
5571 return CastBitData(UndefSrcElts, SrcEltBits);
5575 APInt RawBits = Cst->getValueAPF().bitcastToAPInt();
5577 return CastBitData(UndefSrcElts, SrcEltBits);
5585 if (BV->getConstantRawBits(
true, SrcEltSizeInBits, SrcEltBits, Undefs)) {
5587 for (
unsigned I = 0,
E = SrcEltBits.
size();
I !=
E; ++
I)
5590 return CastBitData(UndefSrcElts, SrcEltBits);
5598 if (!CstTy->
isVectorTy() || (CstSizeInBits % SizeInBits) != 0)
5602 unsigned NumSrcElts = SizeInBits / SrcEltSizeInBits;
5603 if ((SizeInBits % SrcEltSizeInBits) != 0)
5606 APInt UndefSrcElts(NumSrcElts, 0);
5608 for (
unsigned i = 0; i != NumSrcElts; ++i)
5613 return CastBitData(UndefSrcElts, SrcEltBits);
5617 if (
Op.getOpcode() == X86ISD::VBROADCAST_LOAD &&
5623 SDValue Ptr = MemIntr->getBasePtr();
5626 unsigned NumSrcElts = SizeInBits / SrcEltSizeInBits;
5628 APInt UndefSrcElts(NumSrcElts, 0);
5630 if (CollectConstantBits(
C, SrcEltBits[0], UndefSrcElts, 0)) {
5631 if (UndefSrcElts[0])
5632 UndefSrcElts.
setBits(0, NumSrcElts);
5633 if (SrcEltBits[0].
getBitWidth() != SrcEltSizeInBits)
5634 SrcEltBits[0] = SrcEltBits[0].trunc(SrcEltSizeInBits);
5635 SrcEltBits.
append(NumSrcElts - 1, SrcEltBits[0]);
5636 return CastBitData(UndefSrcElts, SrcEltBits);
5642 if (
Op.getOpcode() == X86ISD::SUBV_BROADCAST_LOAD) {
5644 SDValue Ptr = MemIntr->getBasePtr();
5650 unsigned SubVecSizeInBits = MemIntr->getMemoryVT().getStoreSizeInBits();
5651 if (!CstTy->
isVectorTy() || (CstSizeInBits % SubVecSizeInBits) != 0 ||
5652 (SizeInBits % SubVecSizeInBits) != 0)
5655 unsigned NumSubElts = SubVecSizeInBits / CstEltSizeInBits;
5656 unsigned NumSubVecs = SizeInBits / SubVecSizeInBits;
5657 APInt UndefSubElts(NumSubElts, 0);
5659 APInt(CstEltSizeInBits, 0));
5660 for (
unsigned i = 0; i != NumSubElts; ++i) {
5664 for (
unsigned j = 1; j != NumSubVecs; ++j)
5665 SubEltBits[i + (j * NumSubElts)] = SubEltBits[i];
5669 return CastBitData(UndefSubElts, SubEltBits);
5674 if (
Op.getOpcode() == X86ISD::VZEXT_MOVL &&
5678 unsigned NumSrcElts = SizeInBits / SrcEltSizeInBits;
5680 APInt UndefSrcElts(NumSrcElts, 0);
5682 const APInt &
C =
Op.getOperand(0).getConstantOperandAPInt(0);
5683 SrcEltBits.
push_back(
C.zextOrTrunc(SrcEltSizeInBits));
5684 SrcEltBits.
append(NumSrcElts - 1,
APInt(SrcEltSizeInBits, 0));
5685 return CastBitData(UndefSrcElts, SrcEltBits);
5693 bool AllowUndefs = EltSizeInBits >= SrcEltSizeInBits;
5695 APInt UndefSrcElts, UndefSubElts;
5698 UndefSubElts, EltSubBits,
5699 AllowWholeUndefs && AllowUndefs,
5700 AllowPartialUndefs && AllowUndefs) &&
5702 UndefSrcElts, EltSrcBits,
5703 AllowWholeUndefs && AllowUndefs,
5704 AllowPartialUndefs && AllowUndefs)) {
5705 unsigned BaseIdx =
Op.getConstantOperandVal(2);
5706 UndefSrcElts.
insertBits(UndefSubElts, BaseIdx);
5707 for (
unsigned i = 0, e = EltSubBits.
size(); i != e; ++i)
5708 EltSrcBits[BaseIdx + i] = EltSubBits[i];
5709 return CastBitData(UndefSrcElts, EltSrcBits);
5716 EltBits, AllowWholeUndefs,
5717 AllowPartialUndefs)) {
5718 EVT SrcVT =
Op.getOperand(0).getValueType();
5719 unsigned NumSrcElts = SrcVT.
getSizeInBits() / EltSizeInBits;
5722 unsigned BaseIdx = BaseOfs / EltSizeInBits;
5725 (BaseOfs % EltSizeInBits) == 0 &&
"Bad subvector index");
5727 UndefElts = UndefElts.
extractBits(NumSubElts, BaseIdx);
5728 if ((BaseIdx + NumSubElts) != NumSrcElts)
5729 EltBits.
erase(EltBits.
begin() + BaseIdx + NumSubElts, EltBits.
end());
5742 if ((!AllowWholeUndefs || !AllowPartialUndefs) &&
5746 APInt UndefElts0, UndefElts1;
5750 UndefElts0, EltBits0, AllowWholeUndefs,
5751 AllowPartialUndefs))
5755 UndefElts1, EltBits1, AllowWholeUndefs,
5756 AllowPartialUndefs))
5760 for (
int i = 0; i != (int)NumElts; ++i) {
5765 }
else if (M < (
int)NumElts) {
5770 if (UndefElts1[M - NumElts])
5772 EltBits.
push_back(EltBits1[M - NumElts]);
6000 MVT VT =
N.getSimpleValueType();
6007 assert(Mask.empty() &&
"getTargetShuffleMask expects an empty Mask vector");
6008 assert(
Ops.empty() &&
"getTargetShuffleMask expects an empty Ops vector");
6011 bool IsFakeUnary =
false;
6012 switch (
N.getOpcode()) {
6013 case X86ISD::BLENDI:
6014 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6015 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6016 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6018 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6021 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6022 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6023 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6025 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6027 case X86ISD::INSERTPS:
6028 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6029 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6030 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6032 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6034 case X86ISD::EXTRQI:
6035 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6038 int BitLen =
N.getConstantOperandVal(1);
6039 int BitIdx =
N.getConstantOperandVal(2);
6044 case X86ISD::INSERTQI:
6045 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6046 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6049 int BitLen =
N.getConstantOperandVal(2);
6050 int BitIdx =
N.getConstantOperandVal(3);
6052 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6055 case X86ISD::UNPCKH:
6056 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6057 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6059 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6061 case X86ISD::UNPCKL:
6062 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6063 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6065 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6067 case X86ISD::MOVHLPS:
6068 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6069 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6071 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6073 case X86ISD::MOVLHPS:
6074 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6075 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6077 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6079 case X86ISD::VALIGN:
6081 "Only 32-bit and 64-bit elements are supported!");
6082 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6083 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6084 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6086 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6087 Ops.push_back(
N.getOperand(1));
6088 Ops.push_back(
N.getOperand(0));
6090 case X86ISD::PALIGNR:
6092 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6093 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6094 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6096 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6097 Ops.push_back(
N.getOperand(1));
6098 Ops.push_back(
N.getOperand(0));
6100 case X86ISD::VSHLDQ:
6102 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6103 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6107 case X86ISD::VSRLDQ:
6109 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6110 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6114 case X86ISD::PSHUFD:
6115 case X86ISD::VPERMILPI:
6116 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6117 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6121 case X86ISD::PSHUFHW:
6122 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6123 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6127 case X86ISD::PSHUFLW:
6128 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6129 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6133 case X86ISD::VZEXT_MOVL:
6134 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6138 case X86ISD::VBROADCAST:
6142 if (
N.getOperand(0).getValueType() == VT) {
6148 case X86ISD::VPERMILPV: {
6149 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6151 SDValue MaskNode =
N.getOperand(1);
6159 case X86ISD::PSHUFB: {
6161 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6162 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6164 SDValue MaskNode =
N.getOperand(1);
6171 case X86ISD::VPERMI:
6172 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6173 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6180 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6181 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6184 case X86ISD::VPERM2X128:
6185 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6186 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6187 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6189 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6191 case X86ISD::SHUF128:
6192 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6193 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6194 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6196 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6198 case X86ISD::MOVSLDUP:
6199 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6203 case X86ISD::MOVSHDUP:
6204 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6208 case X86ISD::MOVDDUP:
6209 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6213 case X86ISD::VPERMIL2: {
6214 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6215 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6216 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6217 SDValue MaskNode =
N.getOperand(2);
6218 SDValue CtrlNode =
N.getOperand(3);
6220 unsigned CtrlImm = CtrlOp->getZExtValue();
6230 case X86ISD::VPPERM: {
6231 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6232 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6233 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6234 SDValue MaskNode =
N.getOperand(2);
6241 case X86ISD::VPERMV: {
6242 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6245 Ops.push_back(
N.getOperand(1));
6246 SDValue MaskNode =
N.getOperand(0);
6254 case X86ISD::VPERMV3: {
6255 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6256 assert(
N.getOperand(2).getValueType() == VT &&
"Unexpected value type");
6257 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(2);
6259 Ops.push_back(
N.getOperand(0));
6260 Ops.push_back(
N.getOperand(2));
6261 SDValue MaskNode =
N.getOperand(1);
6269 case X86ISD::COMPRESS: {
6271 SDValue PassThru =
N.getOperand(1);
6278 "Illegal compression mask");
6279 for (
unsigned I = 0;
I != NumElems; ++
I) {
6283 while (Mask.size() != NumElems) {
6284 Mask.push_back(NumElems + Mask.size());
6286 Ops.push_back(CmpVec);
6287 Ops.push_back(PassThru);
6290 case X86ISD::EXPAND: {
6292 SDValue PassThru =
N.getOperand(1);
6299 "Illegal expansion mask");
6300 unsigned ExpIndex = 0;
6301 for (
unsigned I = 0;
I != NumElems; ++
I) {
6303 Mask.push_back(
I + NumElems);
6305 Mask.push_back(ExpIndex++);
6307 Ops.push_back(ExpVec);
6308 Ops.push_back(PassThru);
6320 if (!AllowSentinelZero &&
isAnyZero(Mask))
6328 if (M >= (
int)Mask.size())
6334 Ops.push_back(
N.getOperand(0));
6335 if (!IsUnary || IsFakeUnary)
6336 Ops.push_back(
N.getOperand(1));
6619 bool ResolveKnownElts) {
6623 MVT VT =
N.getSimpleValueType();
6627 if ((NumBitsPerElt % 8) != 0 || (NumSizeInBits % 8) != 0)
6630 unsigned NumSizeInBytes = NumSizeInBits / 8;
6631 unsigned NumBytesPerElt = NumBitsPerElt / 8;
6633 unsigned Opcode =
N.getOpcode();
6639 Mask.append(ShuffleMask.begin(), ShuffleMask.end());
6640 Ops.push_back(
N.getOperand(0));
6641 Ops.push_back(
N.getOperand(1));
6647 case X86ISD::ANDNP: {
6653 bool IsAndN = (X86ISD::ANDNP == Opcode);
6654 uint64_t ZeroMask = IsAndN ? 255 : 0;
6661 assert(UndefElts.
isZero() &&
"Unexpected UNDEF element in AND/ANDNP mask");
6662 for (
int i = 0, e = (
int)EltBits.
size(); i != e; ++i) {
6663 const APInt &ByteBits = EltBits[i];
6664 if (ByteBits != 0 && ByteBits != 255)
6668 Ops.push_back(IsAndN ? N1 : N0);
6689 size_t MaskSize = std::max(SrcMask0.
size(), SrcMask1.
size());
6693 for (
int i = 0; i != (int)MaskSize; ++i) {
6703 Mask.push_back(i + MaskSize);
6704 else if (MaskSize == NumElts && !DemandedElts[i])
6709 Ops.push_back(
N.getOperand(0));
6710 Ops.push_back(
N.getOperand(1));
6715 unsigned NumSubElts =
N.getOperand(0).getValueType().getVectorNumElements();
6716 if (NumBitsPerElt == 64) {
6717 for (
unsigned I = 0,
E =
N.getNumOperands();
I !=
E; ++
I) {
6718 for (
unsigned M = 0; M != NumSubElts; ++M)
6719 Mask.push_back((
I * NumElts) + M);
6720 Ops.push_back(
N.getOperand(
I));
6729 EVT SubVT =
Sub.getValueType();
6731 uint64_t InsertIdx =
N.getConstantOperandVal(2);
6733 if (DemandedElts.
extractBits(NumSubElts, InsertIdx) == 0) {
6734 Mask.resize(NumElts);
6735 std::iota(Mask.begin(), Mask.end(), 0);
6741 if (
Depth > 0 && InsertIdx == NumSubElts && NumElts == (2 * NumSubElts) &&
6743 Src.getOperand(0).isUndef() &&
6744 Src.getOperand(1).getValueType() == SubVT &&
6745 Src.getConstantOperandVal(2) == 0 &&
6746 (NumBitsPerElt == 64 || Src.getOperand(1) ==
Sub) &&
6748 Mask.resize(NumElts);
6749 std::iota(Mask.begin(), Mask.begin() + NumSubElts, 0);
6750 std::iota(Mask.begin() + NumSubElts, Mask.end(), NumElts);
6751 Ops.push_back(Src.getOperand(1));
6756 if (InsertIdx != 0 && Src.isUndef() &&
6759 std::iota(Mask.begin() + InsertIdx, Mask.begin() + InsertIdx + NumSubElts,
6764 if (!
N->isOnlyUserOf(
Sub.getNode()))
6779 unsigned NumSubSrcSrcElts =
6781 unsigned MaxElts = std::max(NumElts, NumSubSrcSrcElts);
6782 assert((MaxElts % NumElts) == 0 && (MaxElts % NumSubSrcSrcElts) == 0 &&
6783 "Subvector valuetype mismatch");
6784 InsertIdx *= (MaxElts / NumElts);
6785 ExtractIdx *= (MaxElts / NumSubSrcSrcElts);
6786 NumSubElts *= (MaxElts / NumElts);
6787 bool SrcIsUndef = Src.isUndef();
6788 for (
int i = 0; i != (int)MaxElts; ++i)
6790 for (
int i = 0; i != (int)NumSubElts; ++i)
6791 Mask[InsertIdx + i] = (SrcIsUndef ? 0 : MaxElts) + ExtractIdx + i;
6794 Ops.push_back(SubSrcSrc);
6801 Depth + 1, ResolveKnownElts))
6811 if (SubMask.
size() != NumSubElts) {
6812 assert(((SubMask.
size() % NumSubElts) == 0 ||
6813 (NumSubElts % SubMask.
size()) == 0) &&
6814 "Illegal submask scale");
6815 if ((NumSubElts % SubMask.
size()) == 0) {
6816 int Scale = NumSubElts / SubMask.
size();
6819 SubMask = ScaledSubMask;
6821 int Scale = SubMask.
size() / NumSubElts;
6822 NumSubElts = SubMask.
size();
6832 for (
int i = 0; i != (int)NumElts; ++i)
6834 for (
int i = 0; i != (int)NumSubElts; ++i) {
6837 int InputIdx = M / NumSubElts;
6838 M = (NumElts * (1 + InputIdx)) + (M % NumSubElts);
6840 Mask[i + InsertIdx] = M;
6844 case X86ISD::PINSRB:
6845 case X86ISD::PINSRW:
6852 unsigned DstIdx = 0;
6856 N.getConstantOperandAPInt(2).uge(NumElts))
6858 DstIdx =
N.getConstantOperandVal(2);
6862 Ops.push_back(
N.getOperand(0));
6863 for (
unsigned i = 0; i != NumElts; ++i)
6883 if ((MinBitsPerElt % 8) != 0)
6903 unsigned DstByte = DstIdx * NumBytesPerElt;
6909 Ops.push_back(SrcVec);
6912 Ops.push_back(SrcVec);
6913 Ops.push_back(
N.getOperand(0));
6914 for (
int i = 0; i != (int)NumSizeInBytes; ++i)
6915 Mask.push_back(NumSizeInBytes + i);
6918 unsigned MinBytesPerElts = MinBitsPerElt / 8;
6919 MinBytesPerElts = std::min(MinBytesPerElts, NumBytesPerElt);
6920 for (
unsigned i = 0; i != MinBytesPerElts; ++i)
6921 Mask[DstByte + i] = SrcByte + i;
6922 for (
unsigned i = MinBytesPerElts; i < NumBytesPerElt; ++i)
6926 case X86ISD::PACKSS:
6927 case X86ISD::PACKUS: {
6932 "Unexpected input value type");
6934 APInt EltsLHS, EltsRHS;
6939 bool Offset0 =
false, Offset1 =
false;
6940 if (Opcode == X86ISD::PACKSS) {
6968 bool IsUnary = (N0 == N1);
6976 if (Offset0 || Offset1) {
6978 if ((Offset0 &&
isInRange(M, 0, NumElts)) ||
6979 (Offset1 &&
isInRange(M, NumElts, 2 * NumElts)))
6985 case X86ISD::BLENDV: {
6988 Ops.push_back(
N.getOperand(1));
6989 Ops.push_back(
N.getOperand(2));
6994 case X86ISD::VTRUNC: {
6996 EVT SrcVT = Src.getValueType();
7001 unsigned Scale = NumBitsPerSrcElt / NumBitsPerElt;
7002 assert((NumBitsPerSrcElt % NumBitsPerElt) == 0 &&
"Illegal truncation");
7003 for (
unsigned i = 0; i != NumSrcElts; ++i)
7004 Mask.push_back(i * Scale);
7020 for (
unsigned I = 0;
I != NumElts; ++
I)
7021 if (DemandedElts[
I] && !UndefElts[
I] &&
7022 (EltBits[
I].urem(8) != 0 || EltBits[
I].uge(NumBitsPerElt)))
7026 Ops.push_back(
N.getOperand(0));
7028 for (
unsigned I = 0;
I != NumElts; ++
I) {
7029 if (!DemandedElts[
I] || UndefElts[
I])
7031 unsigned ByteShift = EltBits[
I].getZExtValue() / 8;
7032 unsigned Lo =
I * NumBytesPerElt;
7033 unsigned Hi =
Lo + NumBytesPerElt;
7037 std::iota(Mask.begin() +
Lo + ByteShift, Mask.begin() +
Hi,
Lo);
7039 std::iota(Mask.begin() +
Lo, Mask.begin() +
Hi - ByteShift,
7045 case X86ISD::VSRLI: {
7046 uint64_t ShiftVal =
N.getConstantOperandVal(1);
7048 if (NumBitsPerElt <= ShiftVal) {
7054 if ((ShiftVal % 8) != 0)
7058 Ops.push_back(
N.getOperand(0));
7063 if (X86ISD::VSHLI == Opcode) {
7064 for (
unsigned i = 0; i != NumSizeInBytes; i += NumBytesPerElt)
7065 for (
unsigned j = ByteShift; j != NumBytesPerElt; ++j)
7066 Mask[i + j] = i + j - ByteShift;
7068 for (
unsigned i = 0; i != NumSizeInBytes; i += NumBytesPerElt)
7069 for (
unsigned j = ByteShift; j != NumBytesPerElt; ++j)
7070 Mask[i + j - ByteShift] = i + j;
7085 for (
unsigned I = 0;
I != NumElts; ++
I)
7086 if (DemandedElts[
I] && !UndefElts[
I] &&
7087 (EltBits[
I].urem(NumBitsPerElt) % 8) != 0)
7090 Ops.push_back(
N.getOperand(0));
7091 for (
unsigned I = 0;
I != NumElts; ++
I) {
7092 if (!DemandedElts[
I] || UndefElts[
I]) {
7096 int Offset = EltBits[
I].urem(NumBitsPerElt) / 8;
7098 int BaseIdx =
I * NumBytesPerElt;
7099 for (
int J = 0; J != (int)NumBytesPerElt; ++J) {
7100 Mask.push_back(BaseIdx + ((
Offset + J) % NumBytesPerElt));
7105 case X86ISD::VROTLI:
7106 case X86ISD::VROTRI: {
7108 uint64_t RotateVal =
N.getConstantOperandAPInt(1).urem(NumBitsPerElt);
7109 if ((RotateVal % 8) != 0)
7111 Ops.push_back(
N.getOperand(0));
7112 int Offset = RotateVal / 8;
7114 for (
int i = 0; i != (int)NumElts; ++i) {
7115 int BaseIdx = i * NumBytesPerElt;
7116 for (
int j = 0; j != (int)NumBytesPerElt; ++j) {
7117 Mask.push_back(BaseIdx + ((
Offset + j) % NumBytesPerElt));
7123 case X86ISD::VSHRD: {
7125 uint64_t ShiftVal =
N.getConstantOperandAPInt(2).urem(NumBitsPerElt);
7126 int Offset = ShiftVal / 8;
7127 if ((ShiftVal % 8) != 0 ||
Offset == 0)
7129 Ops.push_back(
N.getOperand(X86ISD::VSHRD == Opcode ? 1 : 0));
7130 Ops.push_back(
N.getOperand(X86ISD::VSHRD == Opcode ? 0 : 1));
7132 for (
int I = 0;
I != (int)NumElts; ++
I) {
7133 int BaseIdx = (
I * NumBytesPerElt) -
Offset;
7134 for (
int J = 0; J != (int)NumBytesPerElt; ++J) {
7135 int MaskIdx = BaseIdx + J;
7136 MaskIdx += J <
Offset ? (NumSizeInBytes + NumBytesPerElt) : 0;
7137 Mask.push_back(MaskIdx);
7142 case X86ISD::VBROADCAST: {
7144 if (!Src.getSimpleValueType().isVector()) {
7147 Src.getOperand(0).getValueType().getScalarType() !=
7150 Src = Src.getOperand(0);
7153 Mask.append(NumElts, 0);
7158 EVT SrcVT = Src.getValueType();
7163 (NumBitsPerSrcElt % 8) != 0)
7167 APInt DemandedSrcElts =
7172 assert((NumBitsPerElt % NumBitsPerSrcElt) == 0 &&
"Unexpected extension");
7173 unsigned Scale = NumBitsPerElt / NumBitsPerSrcElt;
7174 for (
unsigned I = 0;
I != NumElts; ++
I)
7175 Mask.append(Scale,
I);
7184 EVT SrcVT = Src.getValueType();