134 bool UseX87 = !Subtarget.useSoftFloat() && Subtarget.hasX87();
151 if (Subtarget.isAtom())
153 else if (Subtarget.is64Bit())
162 if (Subtarget.hasSlowDivide32())
164 if (Subtarget.hasSlowDivide64() && Subtarget.is64Bit())
168 if (Subtarget.canUseCMPXCHG16B())
170 else if (Subtarget.canUseCMPXCHG8B())
183 if (Subtarget.is64Bit())
200 for (
auto VT : {MVT::f32, MVT::f64, MVT::f80}) {
206 if (Subtarget.canUseCMOV()) {
209 if (Subtarget.is64Bit())
218 if (Subtarget.is64Bit())
226 if (Subtarget.is64Bit())
237 if (Subtarget.is64Bit())
241 if (!Subtarget.useSoftFloat()) {
305 if (!Subtarget.is64Bit() && Subtarget.hasX87()) {
311 if (Subtarget.hasSSE2()) {
314 for (
MVT VT : { MVT::i8, MVT::i16, MVT::i32 }) {
318 if (Subtarget.is64Bit()) {
323 if (Subtarget.hasAVX10_2()) {
324 for (
MVT VT : {MVT::v8i8, MVT::v16i8, MVT::v32i8}) {
332 for (
MVT VT : {MVT::i32, MVT::v4i32, MVT::v8i32, MVT::v16i32, MVT::v2i64,
337 if (Subtarget.is64Bit()) {
348 if (!Subtarget.hasSSE2()) {
351 if (Subtarget.is64Bit()) {
356 }
else if (!Subtarget.is64Bit())
369 for (
auto VT : { MVT::i8, MVT::i16, MVT::i32, MVT::i64 }) {
380 for (
auto VT : { MVT::f32, MVT::f64, MVT::f80, MVT::f128,
381 MVT::i8, MVT::i16, MVT::i32, MVT::i64 }) {
385 if (Subtarget.is64Bit())
396 if (!Subtarget.useSoftFloat() && Subtarget.hasX87()) {
414 if (!Subtarget.hasBMI()) {
417 if (Subtarget.is64Bit()) {
423 if (Subtarget.hasLZCNT()) {
429 for (
auto VT : {MVT::i8, MVT::i16, MVT::i32, MVT::i64}) {
430 if (VT == MVT::i64 && !Subtarget.is64Bit())
444 (!Subtarget.useSoftFloat() && Subtarget.hasF16C()) ?
Custom :
Expand);
451 for (
auto VT : {MVT::f32, MVT::f64, MVT::f80, MVT::f128}) {
456 for (
MVT VT : {MVT::f32, MVT::f64, MVT::f80, MVT::f128}) {
469 if (Subtarget.is64Bit())
471 if (Subtarget.hasPOPCNT()) {
483 if (Subtarget.hasBMI2()) {
487 if (Subtarget.is64Bit())
493 if (!Subtarget.hasMOVBE())
497 for (
auto VT : { MVT::f32, MVT::f64, MVT::f80, MVT::f128 }) {
503 for (
auto VT : { MVT::i8, MVT::i16, MVT::i32, MVT::i64 }) {
504 if (VT == MVT::i64 && !Subtarget.is64Bit())
524 for (
auto VT : { MVT::i32, MVT::i64 }) {
525 if (VT == MVT::i64 && !Subtarget.is64Bit())
536 for (
auto VT : { MVT::i32, MVT::i64 }) {
537 if (VT == MVT::i64 && !Subtarget.is64Bit())
544 if (Subtarget.hasSSEPrefetch())
550 for (
auto VT : { MVT::i8, MVT::i16, MVT::i32, MVT::i64 }) {
560 if (!Subtarget.is64Bit())
563 if (Subtarget.is64Bit() && Subtarget.hasAVX()) {
570 if (Subtarget.canUseCMPXCHG16B())
575 if (Subtarget.isTargetWin32() && !Subtarget.isTargetCygMing() &&
588 if (Subtarget.isTargetPS())
596 bool Is64Bit = Subtarget.is64Bit();
652 if (!Subtarget.useSoftFloat() && Subtarget.hasSSE2()) {
656 : &X86::FR16RegClass);
658 : &X86::FR32RegClass);
660 : &X86::FR64RegClass);
668 for (
auto VT : { MVT::f32, MVT::f64 }) {
689 setF16Action(MVT::f16,
Promote);
748 }
else if (!Subtarget.useSoftFloat() && Subtarget.hasSSE1() &&
749 (UseX87 || Is64Bit)) {
787 for (
auto VT : { MVT::f32, MVT::f64 }) {
800 if (UseX87 && (
getRegClassFor(MVT::f32) == &X86::RFP32RegClass)) {
801 addLegalFPImmediate(
APFloat(+0.0f));
802 addLegalFPImmediate(
APFloat(+1.0f));
803 addLegalFPImmediate(
APFloat(-0.0f));
804 addLegalFPImmediate(
APFloat(-1.0f));
806 addLegalFPImmediate(
APFloat(+0.0f));
811 addLegalFPImmediate(
APFloat(+0.0));
812 addLegalFPImmediate(
APFloat(+1.0));
813 addLegalFPImmediate(
APFloat(-0.0));
814 addLegalFPImmediate(
APFloat(-1.0));
816 addLegalFPImmediate(
APFloat(+0.0));
847 addLegalFPImmediate(TmpFlt);
849 addLegalFPImmediate(TmpFlt);
855 addLegalFPImmediate(TmpFlt2);
857 addLegalFPImmediate(TmpFlt2);
906 if (!Subtarget.useSoftFloat() && Subtarget.is64Bit() && Subtarget.hasSSE1()) {
908 : &X86::VR128RegClass);
985 for (
auto VT : { MVT::v8f16, MVT::v16f16, MVT::v32f16,
986 MVT::v4f32, MVT::v8f32, MVT::v16f32,
987 MVT::v2f64, MVT::v4f64, MVT::v8f64 }) {
1070 if (!Subtarget.useSoftFloat() && Subtarget.hasMMX()) {
1075 auto SetFPMinMaxAction = [&](
MVT VT) {
1086 if (!Subtarget.useSoftFloat() && Subtarget.hasSSE1()) {
1088 : &X86::VR128RegClass);
1090 SetFPMinMaxAction(MVT::f32);
1113 if (!Subtarget.useSoftFloat() && Subtarget.hasSSE2()) {
1115 : &X86::VR128RegClass);
1120 : &X86::VR128RegClass);
1122 : &X86::VR128RegClass);
1124 : &X86::VR128RegClass);
1126 : &X86::VR128RegClass);
1128 : &X86::VR128RegClass);
1130 for (
auto VT : { MVT::f64, MVT::v4f32, MVT::v2f64 })
1131 SetFPMinMaxAction(VT);
1167 if (Subtarget.hasPCLMUL()) {
1168 for (
auto VT : {MVT::i64, MVT::v4i32, MVT::v2i64}) {
1177 for (
auto VT : { MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64 }) {
1187 for (
auto VT : {MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64, MVT::i64}) {
1214 for (
auto VT : { MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64 }) {
1234 for (
auto VT : { MVT::v16i8, MVT::v8i16, MVT::v4i32 }) {
1242 for (
auto VT : { MVT::v8f16, MVT::v2f64, MVT::v2i64 }) {
1247 if (VT == MVT::v2i64 && !Subtarget.is64Bit())
1253 setF16Action(MVT::v8f16,
Expand);
1278 for (
auto VT : {MVT::v2i8, MVT::v4i8, MVT::v8i8, MVT::v2i16, MVT::v4i16}) {
1324 if (!Subtarget.hasAVX512())
1352 for (
auto VT : { MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64 }) {
1356 if (VT == MVT::v2i64)
continue;
1370 if (!Subtarget.useSoftFloat() && Subtarget.hasGFNI()) {
1376 for (
auto VT : {MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64}) {
1384 if (!Subtarget.useSoftFloat() && Subtarget.hasSSSE3()) {
1389 for (
auto VT : {MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64}) {
1401 if (Subtarget.hasNDD()) {
1409 if (!Subtarget.useSoftFloat() && Subtarget.hasSSE41()) {
1410 for (
MVT RoundedTy : {MVT::f32, MVT::f64, MVT::v4f32, MVT::v2f64}) {
1450 for (
auto VT : { MVT::v8i16, MVT::v4i32, MVT::v2i64 }) {
1465 if (Subtarget.is64Bit() && !Subtarget.hasAVX512()) {
1477 if (!Subtarget.useSoftFloat() && Subtarget.hasSSE42()) {
1481 if (!Subtarget.useSoftFloat() && Subtarget.hasXOP()) {
1482 for (
MVT VT : { MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64,
1483 MVT::v32i8, MVT::v16i16, MVT::v8i32, MVT::v4i64 }) {
1489 for (
auto VT : { MVT::i8, MVT::i16, MVT::i32, MVT::i64 })
1493 if (!Subtarget.useSoftFloat() && Subtarget.hasAVX()) {
1494 bool HasInt256 = Subtarget.hasInt256();
1497 : &X86::VR256RegClass);
1499 : &X86::VR256RegClass);
1501 : &X86::VR256RegClass);
1503 : &X86::VR256RegClass);
1505 : &X86::VR256RegClass);
1507 : &X86::VR256RegClass);
1509 : &X86::VR256RegClass);
1511 for (
auto VT : { MVT::v8f32, MVT::v4f64 }) {
1531 SetFPMinMaxAction(VT);
1572 if (!Subtarget.hasAVX512())
1577 for (
auto VT : { MVT::v32i8, MVT::v16i16, MVT::v8i32, MVT::v4i64 }) {
1591 if (VT == MVT::v4i64)
continue;
1612 for (
auto VT : { MVT::v16i16, MVT::v8i32, MVT::v4i64 }) {
1623 for (
auto VT : { MVT::v32i8, MVT::v16i16, MVT::v8i32, MVT::v4i64 }) {
1642 if (Subtarget.hasAnyFMA()) {
1643 for (
auto VT : { MVT::f32, MVT::f64, MVT::v4f32, MVT::v8f32,
1644 MVT::v2f64, MVT::v4f64 }) {
1650 for (
auto VT : { MVT::v32i8, MVT::v16i16, MVT::v8i32, MVT::v4i64 }) {
1691 for (
auto VT : { MVT::v32i8, MVT::v16i16, MVT::v8i32 }) {
1699 for (
auto VT : {MVT::v16i16, MVT::v8i32, MVT::v4i64}) {
1721 for (
auto VT : { MVT::v4i32, MVT::v8i32, MVT::v2i64, MVT::v4i64,
1722 MVT::v4f32, MVT::v8f32, MVT::v2f64, MVT::v4f64 }) {
1729 for (
auto VT : { MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64,
1730 MVT::v8f16, MVT::v4f32, MVT::v2f64 }) {
1735 for (
MVT VT : { MVT::v32i8, MVT::v16i16, MVT::v8i32, MVT::v4i64,
1736 MVT::v16f16, MVT::v8f32, MVT::v4f64 }) {
1747 setF16Action(MVT::v16f16,
Expand);
1757 if (Subtarget.hasPCLMUL()) {
1758 for (
auto VT : {MVT::v8i32, MVT::v4i64}) {
1776 for (
auto VT : { MVT::v4i32, MVT::v8i32, MVT::v2i64, MVT::v4i64,
1777 MVT::v4f32, MVT::v8f32, MVT::v2f64, MVT::v4f64 })
1781 if (Subtarget.hasGFNI()) {
1787 if (!Subtarget.useSoftFloat() && !Subtarget.hasFP16() &&
1788 Subtarget.hasF16C()) {
1789 for (
MVT VT : { MVT::f16, MVT::v2f16, MVT::v4f16, MVT::v8f16 }) {
1793 for (
MVT VT : { MVT::f32, MVT::v2f32, MVT::v4f32, MVT::v8f32 }) {
1808 if (!Subtarget.useSoftFloat() && Subtarget.hasAVX512()) {
1836 if (!Subtarget.hasDQI()) {
1849 for (
auto VT : { MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64 }) {
1855 for (
auto VT : { MVT::v1i1, MVT::v2i1, MVT::v4i1, MVT::v8i1, MVT::v16i1 })
1858 for (
auto VT : { MVT::v2i1, MVT::v4i1, MVT::v8i1, MVT::v16i1 }) {
1871 for (
auto VT : { MVT::v1i1, MVT::v2i1, MVT::v4i1, MVT::v8i1 })
1874 if (Subtarget.hasDQI() && Subtarget.hasVLX()) {
1875 for (
MVT VT : {MVT::v4f32, MVT::v8f32, MVT::v2f64, MVT::v4f64}) {
1884 if (!Subtarget.useSoftFloat() && Subtarget.useAVX512Regs()) {
1885 bool HasBWI = Subtarget.hasBWI();
1905 for (
MVT VT : { MVT::v16f32, MVT::v8f64 }) {
1906 SetFPMinMaxAction(VT);
1919 if (Subtarget.hasDQI())
1937 for (
MVT VT : { MVT::v16i1, MVT::v16i8 }) {
1944 for (
MVT VT : { MVT::v16i16, MVT::v16i32 }) {
1981 if (!Subtarget.hasVLX()) {
1982 for (
auto VT : {MVT::v4i32, MVT::v8i32, MVT::v2i64, MVT::v4i64,
1983 MVT::v4f32, MVT::v8f32, MVT::v2f64, MVT::v4f64}) {
2009 for (
auto VT : { MVT::v16f32, MVT::v8f64 }) {
2026 for (
auto VT : {MVT::v32i16, MVT::v16i32, MVT::v8i64}) {
2056 for (
auto VT : { MVT::v64i8, MVT::v32i16, MVT::v16i32, MVT::v8i64 }) {
2088 for (
auto VT : { MVT::v16i32, MVT::v8i64 }) {
2099 for (
auto VT : { MVT::v64i8, MVT::v32i16 }) {
2120 if (Subtarget.hasDQI() || Subtarget.hasFP16())
2126 if (Subtarget.hasDQI()) {
2133 if (Subtarget.hasCDI()) {
2135 for (
auto VT : { MVT::v16i32, MVT::v8i64} ) {
2140 if (Subtarget.hasVPOPCNTDQ()) {
2141 for (
auto VT : { MVT::v16i32, MVT::v8i64 })
2149 for (
auto VT : { MVT::v32i8, MVT::v16i16, MVT::v8i32, MVT::v4i64,
2150 MVT::v16f16, MVT::v8f32, MVT::v4f64 })
2153 for (
auto VT : { MVT::v64i8, MVT::v32i16, MVT::v16i32, MVT::v8i64,
2154 MVT::v32f16, MVT::v16f32, MVT::v8f64 }) {
2165 setF16Action(MVT::v32f16,
Expand);
2174 for (
auto VT : { MVT::v16i32, MVT::v8i64, MVT::v16f32, MVT::v8f64 }) {
2181 for (
auto VT : { MVT::v64i8, MVT::v32i16 }) {
2190 if (Subtarget.hasVBMI2()) {
2191 for (
auto VT : {MVT::v32i16, MVT::v16i32, MVT::v8i64}) {
2201 if (Subtarget.hasPCLMUL()) {
2202 for (
auto VT : {MVT::v16i32, MVT::v8i64}) {
2213 if (Subtarget.hasGFNI()) {
2219 if (!Subtarget.useSoftFloat() && Subtarget.hasVBMI2()) {
2220 for (
auto VT : {MVT::v8i16, MVT::v4i32, MVT::v2i64, MVT::v16i16, MVT::v8i32,
2235 if (!Subtarget.useSoftFloat() && Subtarget.hasAVX512()) {
2236 for (
MVT VT : {MVT::f16, MVT::f32, MVT::f64, MVT::v8f16, MVT::v4f32,
2237 MVT::v2f64, MVT::v16f16, MVT::v8f32, MVT::v4f64})
2246 if (Subtarget.hasDQI()) {
2251 "Unexpected operation action!");
2259 for (
auto VT : { MVT::v2i64, MVT::v4i64 }) {
2267 for (
auto VT : { MVT::v4i32, MVT::v8i32, MVT::v2i64, MVT::v4i64 }) {
2276 for (
auto VT : { MVT::v4i32, MVT::v8i32, MVT::v2i64, MVT::v4i64,
2277 MVT::v4f32, MVT::v8f32, MVT::v2f64, MVT::v4f64 })
2280 if (Subtarget.hasDQI()) {
2295 if (Subtarget.hasCDI()) {
2296 for (
auto VT : {MVT::i256, MVT::i512}) {
2297 if (VT == MVT::i512 && !Subtarget.useAVX512Regs())
2304 for (
auto VT : { MVT::v4i32, MVT::v8i32, MVT::v2i64, MVT::v4i64 }) {
2309 if (Subtarget.hasVPOPCNTDQ()) {
2310 for (
auto VT : {MVT::v4i32, MVT::v8i32, MVT::v2i64, MVT::v4i64})
2318 for (
MVT VT : {MVT::v8i32, MVT::v8f32, MVT::v4i32, MVT::v4f32, MVT::v4i64,
2319 MVT::v4f64, MVT::v2i64, MVT::v2f64, MVT::v16i8, MVT::v8i16,
2320 MVT::v16i16, MVT::v8i8})
2325 for (
MVT VT : {MVT::v16i32, MVT::v16f32, MVT::v8i64, MVT::v8f64})
2329 if (Subtarget.hasVLX())
2330 for (
MVT VT : {MVT::v8i32, MVT::v8f32, MVT::v4i32, MVT::v4f32, MVT::v4i64,
2331 MVT::v4f64, MVT::v2i64, MVT::v2f64})
2335 if (Subtarget.hasVBMI2())
2336 for (
MVT VT : {MVT::v32i16, MVT::v64i8})
2340 if (Subtarget.hasVBMI2() && Subtarget.hasVLX())
2341 for (
MVT VT : {MVT::v16i8, MVT::v8i16, MVT::v32i8, MVT::v16i16})
2347 if (!Subtarget.useSoftFloat() && Subtarget.hasBWI()) {
2351 for (
auto VT : { MVT::v32i1, MVT::v64i1 }) {
2364 for (
auto VT : { MVT::v16i1, MVT::v32i1 })
2372 for (
auto VT : {MVT::v32i8, MVT::v16i8, MVT::v16i16, MVT::v8i16,
2373 MVT::v16f16, MVT::v8f16}) {
2382 if (Subtarget.hasBITALG()) {
2383 for (
auto VT : { MVT::v16i8, MVT::v32i8, MVT::v8i16, MVT::v16i16 })
2387 if (Subtarget.hasBMM()) {
2393 for (
auto VT : {MVT::v16i8, MVT::v32i8, MVT::v64i8})
2398 if (!Subtarget.useSoftFloat() && Subtarget.hasFP16()) {
2399 auto setGroup = [&] (
MVT VT) {
2448 SetFPMinMaxAction(MVT::f16);
2466 if (Subtarget.useAVX512Regs()) {
2467 setGroup(MVT::v32f16);
2505 SetFPMinMaxAction(MVT::v32f16);
2515 if (Subtarget.hasVLX()) {
2516 setGroup(MVT::v8f16);
2517 setGroup(MVT::v16f16);
2554 SetFPMinMaxAction(MVT::v8f16);
2555 SetFPMinMaxAction(MVT::v16f16);
2562 if (!Subtarget.useSoftFloat() &&
2563 (Subtarget.hasAVXNECONVERT() || Subtarget.hasBF16())) {
2565 : &X86::VR128RegClass);
2566 addRegisterClass(MVT::v16bf16, Subtarget.hasAVX512() ? &X86::VR256XRegClass
2567 : &X86::VR256RegClass);
2573 for (
auto VT : {MVT::v8bf16, MVT::v16bf16}) {
2574 setF16Action(VT,
Expand);
2575 if (!Subtarget.hasBF16())
2592 if (!Subtarget.useSoftFloat() && Subtarget.hasBF16() &&
2593 Subtarget.useAVX512Regs()) {
2595 setF16Action(MVT::v32bf16,
Expand);
2606 if (!Subtarget.useSoftFloat() && Subtarget.hasAVX10_2()) {
2623 SetFPMinMaxAction(MVT::v32bf16);
2624 for (
auto VT : {MVT::v8bf16, MVT::v16bf16}) {
2632 SetFPMinMaxAction(VT);
2634 for (
auto VT : {MVT::f16, MVT::f32, MVT::f64}) {
2640 if (!Subtarget.useSoftFloat() && Subtarget.hasVLX()) {
2653 if (Subtarget.hasBWI()) {
2658 if (Subtarget.hasFP16()) {
2690 if (!Subtarget.useSoftFloat() && Subtarget.hasAMXTILE()) {
2698 if (!Subtarget.is64Bit()) {
2708 for (
auto VT : { MVT::i8, MVT::i16, MVT::i32, MVT::i64 }) {
2709 if (VT == MVT::i64 && !Subtarget.is64Bit())
2731 if (Subtarget.isTargetWin64()) {
2750 if (Subtarget.is32Bit() &&
2751 (Subtarget.isTargetWindowsMSVC() || Subtarget.isTargetWindowsItanium()))
2779 if (Subtarget.isOSWindows()) {
4838 unsigned IdxVal =
Op.getConstantOperandVal(2);
4844 if (IdxVal == 0 && Vec.
isUndef())
4847 MVT OpVT =
Op.getSimpleValueType();
4866 assert(IdxVal + SubVecNumElems <= NumElems &&
4868 "Unexpected index value in INSERT_SUBVECTOR");
4877 Vec = DAG.
getNode(X86ISD::KSHIFTR, dl, WideOpVT, Vec, ShiftBits);
4878 Vec = DAG.
getNode(X86ISD::KSHIFTL, dl, WideOpVT, Vec, ShiftBits);
4888 Undef, SubVec, ZeroIdx);
4891 assert(IdxVal != 0 &&
"Unexpected index");
4892 SubVec = DAG.
getNode(X86ISD::KSHIFTL, dl, WideOpVT, SubVec,
4898 assert(IdxVal != 0 &&
"Unexpected index");
4901 [](
SDValue V) { return V.isUndef(); })) {
4902 SubVec = DAG.
getNode(X86ISD::KSHIFTL, dl, WideOpVT, SubVec,
4906 unsigned ShiftLeft = NumElems - SubVecNumElems;
4907 unsigned ShiftRight = NumElems - SubVecNumElems - IdxVal;
4908 SubVec = DAG.
getNode(X86ISD::KSHIFTL, dl, WideOpVT, SubVec,
4910 if (ShiftRight != 0)
4911 SubVec = DAG.
getNode(X86ISD::KSHIFTR, dl, WideOpVT, SubVec,
4918 if (IdxVal + SubVecNumElems == NumElems) {
4919 SubVec = DAG.
getNode(X86ISD::KSHIFTL, dl, WideOpVT, SubVec,
4921 if (SubVecNumElems * 2 == NumElems) {
4931 Undef, Vec, ZeroIdx);
4934 Vec = DAG.
getNode(X86ISD::KSHIFTL, dl, WideOpVT, Vec, ShiftBits);
4935 Vec = DAG.
getNode(X86ISD::KSHIFTR, dl, WideOpVT, Vec, ShiftBits);
4948 unsigned ShiftLeft = NumElems - SubVecNumElems;
4949 unsigned ShiftRight = NumElems - SubVecNumElems - IdxVal;
4952 if (WideOpVT != MVT::v64i1 || Subtarget.is64Bit()) {
4958 SubVec = DAG.
getNode(X86ISD::KSHIFTL, dl, WideOpVT, SubVec,
4960 SubVec = DAG.
getNode(X86ISD::KSHIFTR, dl, WideOpVT, SubVec,
4969 SubVec = DAG.
getNode(X86ISD::KSHIFTL, dl, WideOpVT, SubVec,
4971 SubVec = DAG.
getNode(X86ISD::KSHIFTR, dl, WideOpVT, SubVec,
4975 unsigned LowShift = NumElems - IdxVal;
4982 unsigned HighShift = IdxVal + SubVecNumElems;
5434 bool AllowWholeUndefs =
true,
5435 bool AllowPartialUndefs =
false) {
5436 assert(EltBits.
empty() &&
"Expected an empty EltBits vector");
5440 EVT VT =
Op.getValueType();
5442 unsigned NumElts = SizeInBits / EltSizeInBits;
5445 if ((SizeInBits % EltSizeInBits) != 0)
5451 unsigned SrcEltSizeInBits = SrcEltBits[0].getBitWidth();
5452 assert((NumSrcElts * SrcEltSizeInBits) == SizeInBits &&
5453 "Constant bit sizes don't match");
5456 bool AllowUndefs = AllowWholeUndefs || AllowPartialUndefs;
5461 if (NumSrcElts == NumElts) {
5462 UndefElts = UndefSrcElts;
5463 EltBits.
assign(SrcEltBits.begin(), SrcEltBits.end());
5468 APInt UndefBits(SizeInBits, 0);
5469 APInt MaskBits(SizeInBits, 0);
5471 for (
unsigned i = 0; i != NumSrcElts; ++i) {
5472 unsigned BitOffset = i * SrcEltSizeInBits;
5473 if (UndefSrcElts[i])
5474 UndefBits.
setBits(BitOffset, BitOffset + SrcEltSizeInBits);
5475 MaskBits.
insertBits(SrcEltBits[i], BitOffset);
5479 UndefElts =
APInt(NumElts, 0);
5482 for (
unsigned i = 0; i != NumElts; ++i) {
5483 unsigned BitOffset = i * EltSizeInBits;
5488 if (!AllowWholeUndefs)
5496 if (UndefEltBits.
getBoolValue() && !AllowPartialUndefs)
5499 EltBits[i] = MaskBits.
extractBits(EltSizeInBits, BitOffset);
5506 unsigned UndefBitIndex) {
5510 Undefs.setBit(UndefBitIndex);
5520 CFP->getValueAPF().bitcastToAPInt());
5524 Type *Ty = CDS->getType();
5525 if (Ty->isVectorTy()) {
5527 Type *EltTy = CDS->getElementType();
5531 if (!IsInteger && !IsFP)
5534 for (
unsigned I = 0,
E = CDS->getNumElements();
I !=
E; ++
I)
5536 Mask.insertBits(CDS->getElementAsAPInt(
I),
I * EltBits);
5538 Mask.insertBits(CDS->getElementAsAPFloat(
I).bitcastToAPInt(),
5550 return CastBitData(UndefSrcElts, SrcEltBits);
5557 return CastBitData(UndefSrcElts, SrcEltBits);
5561 APInt RawBits = Cst->getValueAPF().bitcastToAPInt();
5563 return CastBitData(UndefSrcElts, SrcEltBits);
5571 if (BV->getConstantRawBits(
true, SrcEltSizeInBits, SrcEltBits, Undefs)) {
5573 for (
unsigned I = 0,
E = SrcEltBits.
size();
I !=
E; ++
I)
5576 return CastBitData(UndefSrcElts, SrcEltBits);
5584 if (!CstTy->
isVectorTy() || (CstSizeInBits % SizeInBits) != 0)
5588 unsigned NumSrcElts = SizeInBits / SrcEltSizeInBits;
5589 if ((SizeInBits % SrcEltSizeInBits) != 0)
5592 APInt UndefSrcElts(NumSrcElts, 0);
5594 for (
unsigned i = 0; i != NumSrcElts; ++i)
5599 return CastBitData(UndefSrcElts, SrcEltBits);
5603 if (
Op.getOpcode() == X86ISD::VBROADCAST_LOAD &&
5609 SDValue Ptr = MemIntr->getBasePtr();
5612 unsigned NumSrcElts = SizeInBits / SrcEltSizeInBits;
5614 APInt UndefSrcElts(NumSrcElts, 0);
5616 if (CollectConstantBits(
C, SrcEltBits[0], UndefSrcElts, 0)) {
5617 if (UndefSrcElts[0])
5618 UndefSrcElts.
setBits(0, NumSrcElts);
5619 if (SrcEltBits[0].
getBitWidth() != SrcEltSizeInBits)
5620 SrcEltBits[0] = SrcEltBits[0].trunc(SrcEltSizeInBits);
5621 SrcEltBits.
append(NumSrcElts - 1, SrcEltBits[0]);
5622 return CastBitData(UndefSrcElts, SrcEltBits);
5628 if (
Op.getOpcode() == X86ISD::SUBV_BROADCAST_LOAD) {
5630 SDValue Ptr = MemIntr->getBasePtr();
5636 unsigned SubVecSizeInBits = MemIntr->getMemoryVT().getStoreSizeInBits();
5637 if (!CstTy->
isVectorTy() || (CstSizeInBits % SubVecSizeInBits) != 0 ||
5638 (SizeInBits % SubVecSizeInBits) != 0)
5641 unsigned NumSubElts = SubVecSizeInBits / CstEltSizeInBits;
5642 unsigned NumSubVecs = SizeInBits / SubVecSizeInBits;
5643 APInt UndefSubElts(NumSubElts, 0);
5645 APInt(CstEltSizeInBits, 0));
5646 for (
unsigned i = 0; i != NumSubElts; ++i) {
5650 for (
unsigned j = 1; j != NumSubVecs; ++j)
5651 SubEltBits[i + (j * NumSubElts)] = SubEltBits[i];
5655 return CastBitData(UndefSubElts, SubEltBits);
5660 if (
Op.getOpcode() == X86ISD::VZEXT_MOVL &&
5664 unsigned NumSrcElts = SizeInBits / SrcEltSizeInBits;
5666 APInt UndefSrcElts(NumSrcElts, 0);
5668 const APInt &
C =
Op.getOperand(0).getConstantOperandAPInt(0);
5669 SrcEltBits.
push_back(
C.zextOrTrunc(SrcEltSizeInBits));
5670 SrcEltBits.
append(NumSrcElts - 1,
APInt(SrcEltSizeInBits, 0));
5671 return CastBitData(UndefSrcElts, SrcEltBits);
5679 bool AllowUndefs = EltSizeInBits >= SrcEltSizeInBits;
5681 APInt UndefSrcElts, UndefSubElts;
5684 UndefSubElts, EltSubBits,
5685 AllowWholeUndefs && AllowUndefs,
5686 AllowPartialUndefs && AllowUndefs) &&
5688 UndefSrcElts, EltSrcBits,
5689 AllowWholeUndefs && AllowUndefs,
5690 AllowPartialUndefs && AllowUndefs)) {
5691 unsigned BaseIdx =
Op.getConstantOperandVal(2);
5692 UndefSrcElts.
insertBits(UndefSubElts, BaseIdx);
5693 for (
unsigned i = 0, e = EltSubBits.
size(); i != e; ++i)
5694 EltSrcBits[BaseIdx + i] = EltSubBits[i];
5695 return CastBitData(UndefSrcElts, EltSrcBits);
5702 EltBits, AllowWholeUndefs,
5703 AllowPartialUndefs)) {
5704 EVT SrcVT =
Op.getOperand(0).getValueType();
5705 unsigned NumSrcElts = SrcVT.
getSizeInBits() / EltSizeInBits;
5708 unsigned BaseIdx = BaseOfs / EltSizeInBits;
5711 (BaseOfs % EltSizeInBits) == 0 &&
"Bad subvector index");
5713 UndefElts = UndefElts.
extractBits(NumSubElts, BaseIdx);
5714 if ((BaseIdx + NumSubElts) != NumSrcElts)
5715 EltBits.
erase(EltBits.
begin() + BaseIdx + NumSubElts, EltBits.
end());
5728 if ((!AllowWholeUndefs || !AllowPartialUndefs) &&
5732 APInt UndefElts0, UndefElts1;
5736 UndefElts0, EltBits0, AllowWholeUndefs,
5737 AllowPartialUndefs))
5741 UndefElts1, EltBits1, AllowWholeUndefs,
5742 AllowPartialUndefs))
5746 for (
int i = 0; i != (int)NumElts; ++i) {
5751 }
else if (M < (
int)NumElts) {
5756 if (UndefElts1[M - NumElts])
5758 EltBits.
push_back(EltBits1[M - NumElts]);
5986 MVT VT =
N.getSimpleValueType();
5993 assert(Mask.empty() &&
"getTargetShuffleMask expects an empty Mask vector");
5994 assert(
Ops.empty() &&
"getTargetShuffleMask expects an empty Ops vector");
5997 bool IsFakeUnary =
false;
5998 switch (
N.getOpcode()) {
5999 case X86ISD::BLENDI:
6000 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6001 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6002 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6004 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6007 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6008 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6009 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6011 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6013 case X86ISD::INSERTPS:
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);
6020 case X86ISD::EXTRQI:
6021 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6024 int BitLen =
N.getConstantOperandVal(1);
6025 int BitIdx =
N.getConstantOperandVal(2);
6030 case X86ISD::INSERTQI:
6031 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6032 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6035 int BitLen =
N.getConstantOperandVal(2);
6036 int BitIdx =
N.getConstantOperandVal(3);
6038 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6041 case X86ISD::UNPCKH:
6042 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6043 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6045 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6047 case X86ISD::UNPCKL:
6048 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6049 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6051 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6053 case X86ISD::MOVHLPS:
6054 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6055 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6057 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6059 case X86ISD::MOVLHPS:
6060 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6061 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6063 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6065 case X86ISD::VALIGN:
6067 "Only 32-bit and 64-bit elements are supported!");
6068 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6069 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6070 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6072 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6073 Ops.push_back(
N.getOperand(1));
6074 Ops.push_back(
N.getOperand(0));
6076 case X86ISD::PALIGNR:
6078 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6079 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6080 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6082 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6083 Ops.push_back(
N.getOperand(1));
6084 Ops.push_back(
N.getOperand(0));
6086 case X86ISD::VSHLDQ:
6088 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6089 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6093 case X86ISD::VSRLDQ:
6095 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6096 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6100 case X86ISD::PSHUFD:
6101 case X86ISD::VPERMILPI:
6102 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6103 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6107 case X86ISD::PSHUFHW:
6108 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6109 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6113 case X86ISD::PSHUFLW:
6114 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6115 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6119 case X86ISD::VZEXT_MOVL:
6120 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6124 case X86ISD::VBROADCAST:
6128 if (
N.getOperand(0).getValueType() == VT) {
6134 case X86ISD::VPERMILPV: {
6135 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6137 SDValue MaskNode =
N.getOperand(1);
6145 case X86ISD::PSHUFB: {
6147 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6148 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6150 SDValue MaskNode =
N.getOperand(1);
6157 case X86ISD::VPERMI:
6158 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6159 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6166 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6167 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6170 case X86ISD::VPERM2X128:
6171 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6172 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6173 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6175 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6177 case X86ISD::SHUF128:
6178 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6179 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6180 ImmN =
N.getConstantOperandVal(
N.getNumOperands() - 1);
6182 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6184 case X86ISD::MOVSLDUP:
6185 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6189 case X86ISD::MOVSHDUP:
6190 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6194 case X86ISD::MOVDDUP:
6195 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6199 case X86ISD::VPERMIL2: {
6200 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6201 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6202 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6203 SDValue MaskNode =
N.getOperand(2);
6204 SDValue CtrlNode =
N.getOperand(3);
6206 unsigned CtrlImm = CtrlOp->getZExtValue();
6216 case X86ISD::VPPERM: {
6217 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6218 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6219 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(1);
6220 SDValue MaskNode =
N.getOperand(2);
6227 case X86ISD::VPERMV: {
6228 assert(
N.getOperand(1).getValueType() == VT &&
"Unexpected value type");
6231 Ops.push_back(
N.getOperand(1));
6232 SDValue MaskNode =
N.getOperand(0);
6240 case X86ISD::VPERMV3: {
6241 assert(
N.getOperand(0).getValueType() == VT &&
"Unexpected value type");
6242 assert(
N.getOperand(2).getValueType() == VT &&
"Unexpected value type");
6243 IsUnary = IsFakeUnary =
N.getOperand(0) ==
N.getOperand(2);
6245 Ops.push_back(
N.getOperand(0));
6246 Ops.push_back(
N.getOperand(2));
6247 SDValue MaskNode =
N.getOperand(1);
6255 case X86ISD::COMPRESS: {
6257 SDValue PassThru =
N.getOperand(1);
6264 "Illegal compression mask");
6265 for (
unsigned I = 0;
I != NumElems; ++
I) {
6269 while (Mask.size() != NumElems) {
6270 Mask.push_back(NumElems + Mask.size());
6272 Ops.push_back(CmpVec);
6273 Ops.push_back(PassThru);
6276 case X86ISD::EXPAND: {
6278 SDValue PassThru =
N.getOperand(1);
6285 "Illegal expansion mask");
6286 unsigned ExpIndex = 0;
6287 for (
unsigned I = 0;
I != NumElems; ++
I) {
6289 Mask.push_back(
I + NumElems);
6291 Mask.push_back(ExpIndex++);
6293 Ops.push_back(ExpVec);
6294 Ops.push_back(PassThru);
6306 if (!AllowSentinelZero &&
isAnyZero(Mask))
6314 if (M >= (
int)Mask.size())
6320 Ops.push_back(
N.getOperand(0));
6321 if (!IsUnary || IsFakeUnary)
6322 Ops.push_back(
N.getOperand(1));
6605 bool ResolveKnownElts) {
6609 MVT VT =
N.getSimpleValueType();
6613 if ((NumBitsPerElt % 8) != 0 || (NumSizeInBits % 8) != 0)
6616 unsigned NumSizeInBytes = NumSizeInBits / 8;
6617 unsigned NumBytesPerElt = NumBitsPerElt / 8;
6619 unsigned Opcode =
N.getOpcode();
6625 Mask.append(ShuffleMask.begin(), ShuffleMask.end());
6626 Ops.push_back(
N.getOperand(0));
6627 Ops.push_back(
N.getOperand(1));
6633 case X86ISD::ANDNP: {
6639 bool IsAndN = (X86ISD::ANDNP == Opcode);
6640 uint64_t ZeroMask = IsAndN ? 255 : 0;
6647 assert(UndefElts.
isZero() &&
"Unexpected UNDEF element in AND/ANDNP mask");
6648 for (
int i = 0, e = (
int)EltBits.
size(); i != e; ++i) {
6649 const APInt &ByteBits = EltBits[i];
6650 if (ByteBits != 0 && ByteBits != 255)
6654 Ops.push_back(IsAndN ? N1 : N0);
6675 size_t MaskSize = std::max(SrcMask0.
size(), SrcMask1.
size());
6679 for (
int i = 0; i != (int)MaskSize; ++i) {
6689 Mask.push_back(i + MaskSize);
6690 else if (MaskSize == NumElts && !DemandedElts[i])
6695 Ops.push_back(
N.getOperand(0));
6696 Ops.push_back(
N.getOperand(1));
6701 unsigned NumSubElts =
N.getOperand(0).getValueType().getVectorNumElements();
6702 if (NumBitsPerElt == 64) {
6703 for (
unsigned I = 0,
E =
N.getNumOperands();
I !=
E; ++
I) {
6704 for (
unsigned M = 0; M != NumSubElts; ++M)
6705 Mask.push_back((
I * NumElts) + M);
6706 Ops.push_back(
N.getOperand(
I));
6715 EVT SubVT =
Sub.getValueType();
6717 uint64_t InsertIdx =
N.getConstantOperandVal(2);
6719 if (DemandedElts.
extractBits(NumSubElts, InsertIdx) == 0) {
6720 Mask.resize(NumElts);
6721 std::iota(Mask.begin(), Mask.end(), 0);
6727 if (
Depth > 0 && InsertIdx == NumSubElts && NumElts == (2 * NumSubElts) &&
6729 Src.getOperand(0).isUndef() &&
6730 Src.getOperand(1).getValueType() == SubVT &&
6731 Src.getConstantOperandVal(2) == 0 &&
6732 (NumBitsPerElt == 64 || Src.getOperand(1) ==
Sub) &&
6734 Mask.resize(NumElts);
6735 std::iota(Mask.begin(), Mask.begin() + NumSubElts, 0);
6736 std::iota(Mask.begin() + NumSubElts, Mask.end(), NumElts);
6737 Ops.push_back(Src.getOperand(1));
6742 if (InsertIdx != 0 && Src.isUndef() &&
6745 std::iota(Mask.begin() + InsertIdx, Mask.begin() + InsertIdx + NumSubElts,
6750 if (!
N->isOnlyUserOf(
Sub.getNode()))
6765 unsigned NumSubSrcSrcElts =
6767 unsigned MaxElts = std::max(NumElts, NumSubSrcSrcElts);
6768 assert((MaxElts % NumElts) == 0 && (MaxElts % NumSubSrcSrcElts) == 0 &&
6769 "Subvector valuetype mismatch");
6770 InsertIdx *= (MaxElts / NumElts);
6771 ExtractIdx *= (MaxElts / NumSubSrcSrcElts);
6772 NumSubElts *= (MaxElts / NumElts);
6773 bool SrcIsUndef = Src.isUndef();
6774 for (
int i = 0; i != (int)MaxElts; ++i)
6776 for (
int i = 0; i != (int)NumSubElts; ++i)
6777 Mask[InsertIdx + i] = (SrcIsUndef ? 0 : MaxElts) + ExtractIdx + i;
6780 Ops.push_back(SubSrcSrc);
6787 Depth + 1, ResolveKnownElts))
6797 if (SubMask.
size() != NumSubElts) {
6798 assert(((SubMask.
size() % NumSubElts) == 0 ||
6799 (NumSubElts % SubMask.
size()) == 0) &&
6800 "Illegal submask scale");
6801 if ((NumSubElts % SubMask.
size()) == 0) {
6802 int Scale = NumSubElts / SubMask.
size();
6805 SubMask = ScaledSubMask;
6807 int Scale = SubMask.
size() / NumSubElts;
6808 NumSubElts = SubMask.
size();
6818 for (
int i = 0; i != (int)NumElts; ++i)
6820 for (
int i = 0; i != (int)NumSubElts; ++i) {
6823 int InputIdx = M / NumSubElts;
6824 M = (NumElts * (1 + InputIdx)) + (M % NumSubElts);
6826 Mask[i + InsertIdx] = M;
6830 case X86ISD::PINSRB:
6831 case X86ISD::PINSRW:
6838 unsigned DstIdx = 0;
6842 N.getConstantOperandAPInt(2).uge(NumElts))
6844 DstIdx =
N.getConstantOperandVal(2);
6848 Ops.push_back(
N.getOperand(0));
6849 for (
unsigned i = 0; i != NumElts; ++i)
6869 if ((MinBitsPerElt % 8) != 0)
6889 unsigned DstByte = DstIdx * NumBytesPerElt;
6895 Ops.push_back(SrcVec);
6898 Ops.push_back(SrcVec);
6899 Ops.push_back(
N.getOperand(0));
6900 for (
int i = 0; i != (int)NumSizeInBytes; ++i)
6901 Mask.push_back(NumSizeInBytes + i);
6904 unsigned MinBytesPerElts = MinBitsPerElt / 8;
6905 MinBytesPerElts = std::min(MinBytesPerElts, NumBytesPerElt);
6906 for (
unsigned i = 0; i != MinBytesPerElts; ++i)
6907 Mask[DstByte + i] = SrcByte + i;
6908 for (
unsigned i = MinBytesPerElts; i < NumBytesPerElt; ++i)
6912 case X86ISD::PACKSS:
6913 case X86ISD::PACKUS: {
6918 "Unexpected input value type");
6920 APInt EltsLHS, EltsRHS;
6925 bool Offset0 =
false, Offset1 =
false;
6926 if (Opcode == X86ISD::PACKSS) {
6954 bool IsUnary = (N0 == N1);
6962 if (Offset0 || Offset1) {
6964 if ((Offset0 &&
isInRange(M, 0, NumElts)) ||
6965 (Offset1 &&
isInRange(M, NumElts, 2 * NumElts)))
6971 case X86ISD::BLENDV: {
6974 Ops.push_back(
N.getOperand(1));
6975 Ops.push_back(
N.getOperand(2));
6980 case X86ISD::VTRUNC: {
6982 EVT SrcVT = Src.getValueType();
6987 unsigned Scale = NumBitsPerSrcElt / NumBitsPerElt;
6988 assert((NumBitsPerSrcElt % NumBitsPerElt) == 0 &&
"Illegal truncation");
6989 for (
unsigned i = 0; i != NumSrcElts; ++i)
6990 Mask.push_back(i * Scale);
7006 for (
unsigned I = 0;
I != NumElts; ++
I)
7007 if (DemandedElts[
I] && !UndefElts[
I] &&
7008 (EltBits[
I].urem(8) != 0 || EltBits[
I].uge(NumBitsPerElt)))
7012 Ops.push_back(
N.getOperand(0));
7014 for (
unsigned I = 0;
I != NumElts; ++
I) {
7015 if (!DemandedElts[
I] || UndefElts[
I])
7017 unsigned ByteShift = EltBits[
I].getZExtValue() / 8;
7018 unsigned Lo =
I * NumBytesPerElt;
7019 unsigned Hi =
Lo + NumBytesPerElt;
7023 std::iota(Mask.begin() +
Lo + ByteShift, Mask.begin() +
Hi,
Lo);
7025 std::iota(Mask.begin() +
Lo, Mask.begin() +
Hi - ByteShift,
7031 case X86ISD::VSRLI: {
7032 uint64_t ShiftVal =
N.getConstantOperandVal(1);
7034 if (NumBitsPerElt <= ShiftVal) {
7040 if ((ShiftVal % 8) != 0)
7044 Ops.push_back(
N.getOperand(0));
7049 if (X86ISD::VSHLI == Opcode) {
7050 for (
unsigned i = 0; i != NumSizeInBytes; i += NumBytesPerElt)
7051 for (
unsigned j = ByteShift; j != NumBytesPerElt; ++j)
7052 Mask[i + j] = i + j - ByteShift;
7054 for (
unsigned i = 0; i != NumSizeInBytes; i += NumBytesPerElt)
7055 for (
unsigned j = ByteShift; j != NumBytesPerElt; ++j)
7056 Mask[i + j - ByteShift] = i + j;
7071 for (
unsigned I = 0;
I != NumElts; ++
I)
7072 if (DemandedElts[
I] && !UndefElts[
I] &&
7073 (EltBits[
I].urem(NumBitsPerElt) % 8) != 0)
7076 Ops.push_back(
N.getOperand(0));
7077 for (
unsigned I = 0;
I != NumElts; ++
I) {
7078 if (!DemandedElts[
I] || UndefElts[
I]) {
7082 int Offset = EltBits[
I].urem(NumBitsPerElt) / 8;
7084 int BaseIdx =
I * NumBytesPerElt;
7085 for (
int J = 0; J != (int)NumBytesPerElt; ++J) {
7086 Mask.push_back(BaseIdx + ((
Offset + J) % NumBytesPerElt));
7091 case X86ISD::VROTLI:
7092 case X86ISD::VROTRI: {
7094 uint64_t RotateVal =
N.getConstantOperandAPInt(1).urem(NumBitsPerElt);
7095 if ((RotateVal % 8) != 0)
7097 Ops.push_back(
N.getOperand(0));
7098 int Offset = RotateVal / 8;
7100 for (
int i = 0; i != (int)NumElts; ++i) {
7101 int BaseIdx = i * NumBytesPerElt;
7102 for (
int j = 0; j != (int)NumBytesPerElt; ++j) {
7103 Mask.push_back(BaseIdx + ((
Offset + j) % NumBytesPerElt));
7109 case X86ISD::VSHRD: {
7111 uint64_t ShiftVal =
N.getConstantOperandAPInt(2).urem(NumBitsPerElt);
7112 int Offset = ShiftVal / 8;
7113 if ((ShiftVal % 8) != 0 ||
Offset == 0)
7115 Ops.push_back(
N.getOperand(X86ISD::VSHRD == Opcode ? 1 : 0));
7116 Ops.push_back(
N.getOperand(X86ISD::VSHRD == Opcode ? 0 : 1));
7118 for (
int I = 0;
I != (int)NumElts; ++
I) {
7119 int BaseIdx = (
I * NumBytesPerElt) -
Offset;
7120 for (
int J = 0; J != (int)NumBytesPerElt; ++J) {
7121 int MaskIdx = BaseIdx + J;
7122 MaskIdx += J <
Offset ? (NumSizeInBytes + NumBytesPerElt) : 0;
7123 Mask.push_back(MaskIdx);
7128 case X86ISD::VBROADCAST: {
7130 if (!Src.getSimpleValueType().isVector()) {
7133 Src.getOperand(0).getValueType().getScalarType() !=
7136 Src = Src.getOperand(0);
7139 Mask.append(NumElts, 0);
7144 EVT SrcVT = Src.getValueType();
7149 (NumBitsPerSrcElt % 8) != 0)
7153 APInt DemandedSrcElts =
7158 assert((NumBitsPerElt % NumBitsPerSrcElt) == 0 &&
"Unexpected extension");
7159 unsigned Scale = NumBitsPerElt / NumBitsPerSrcElt;
7160 for (
unsigned I = 0;
I != NumElts; ++
I)
7161 Mask.append(Scale,
I);
7170 EVT SrcVT = Src.getValueType();