25#include "llvm/IR/IntrinsicsS390.h"
37#define DEBUG_TYPE "systemz-lower"
43 cl::desc(
"Verify that narrow int args are properly extended per the "
50 : Op0(Op0In), Op1(Op1In), Chain(ChainIn),
51 Opcode(0), ICmpType(0), CCValid(0), CCMask(0) {}
101 if (Subtarget.hasHighWord())
107 if (Subtarget.hasVector()) {
116 if (Subtarget.hasVectorEnhancements1())
121 if (Subtarget.hasVector()) {
131 if (Subtarget.hasVector())
158 for (
unsigned I = MVT::FIRST_INTEGER_VALUETYPE;
159 I <= MVT::LAST_FP_VALUETYPE;
185 for (
unsigned I = MVT::FIRST_INTEGER_VALUETYPE;
186 I <= MVT::LAST_INTEGER_VALUETYPE;
217 if (Subtarget.hasPopulationCount())
243 (!Subtarget.hasFPExtension() && VT == MVT::i32) ?
Promote :
Custom;
264 if (!Subtarget.hasVectorEnhancements3()) {
291 if (Subtarget.hasVectorEnhancements3()) {
334 {MVT::i8, MVT::i16, MVT::i32},
Legal);
336 {MVT::i8, MVT::i16},
Legal);
357 if (Subtarget.hasMiscellaneousExtensions4()) {
364 if (Subtarget.hasMiscellaneousExtensions3()) {
457 if (VT != MVT::v2i64 || Subtarget.hasVectorEnhancements3()) {
462 if (Subtarget.hasVectorEnhancements3() &&
463 VT != MVT::v16i8 && VT != MVT::v8i16) {
473 if (Subtarget.hasVectorEnhancements1())
507 if (Subtarget.hasVector()) {
529 if (Subtarget.hasVectorEnhancements2()) {
555 for (
MVT VT : {MVT::f32, MVT::f64, MVT::f128}) {
569 for (
unsigned I = MVT::FIRST_FP_VALUETYPE;
570 I <= MVT::LAST_FP_VALUETYPE;
578 if (Subtarget.hasFPExtension()) {
606 if (Subtarget.hasFPExtension()) {
622 if (Subtarget.hasVector()) {
673 if (Subtarget.hasVectorEnhancements1()) {
680 if (Subtarget.hasVectorEnhancements1()) {
697 for (
MVT Type : {MVT::f64, MVT::v2f64, MVT::f32, MVT::v4f32, MVT::f128}) {
722 for (
auto VT : { MVT::f32, MVT::f64, MVT::f128,
723 MVT::v4f32, MVT::v2f64 }) {
734 if (!Subtarget.hasVectorEnhancements1()) {
740 if (Subtarget.hasVectorEnhancements1())
750 if (Subtarget.hasVectorEnhancements1()) {
762 if (!Subtarget.hasVector()) {
773 if (Subtarget.isTargetzOS()) {
838 return Subtarget.hasSoftFloat();
843 unsigned &NumIntermediates,
MVT &RegisterVT)
const {
845 if (Subtarget.hasVector() && VT.
isVectorOf(MVT::f16)) {
846 IntermediateVT = RegisterVT = MVT::v8f16;
847 return NumIntermediates =
851 Context, CC, VT, IntermediateVT, NumIntermediates, RegisterVT);
863 if (Subtarget.hasVector() && VT.
isVectorOf(MVT::f16))
871 if (Subtarget.hasVector() && VT.
isVectorOf(MVT::f16))
898 return Subtarget.hasVectorEnhancements1();
911 if (!Subtarget.hasVector() ||
912 (isFP128 && !Subtarget.hasVectorEnhancements1()))
921 uint64_t Byte = IntBits.lshr(
I * 8).trunc(8).getZExtValue();
928 Opcode = SystemZISD::BYTE_MASK;
934 if (SplatBitSize > 64)
937 auto TryValue = [&](uint64_t
Value) ->
bool {
941 OpVals.push_back(((
unsigned) SignedValue));
942 Opcode = SystemZISD::REPLICATE;
949 if (
TII->isRxSBGMask(
Value, SplatBitSize, Start, End)) {
953 OpVals.push_back(Start - (64 - SplatBitSize));
954 OpVals.push_back(End - (64 - SplatBitSize));
955 Opcode = SystemZISD::ROTATE_MASK;
967 uint64_t SplatBitsZ = SplatBits.getZExtValue();
968 uint64_t SplatUndefZ = SplatUndef.getZExtValue();
980 return TryValue(SplatBitsZ | Middle);
989 assert(IntBits.getBitWidth() == 128 &&
"Unsupported APInt.");
995 unsigned HalfSize = Width / 2;
1000 if (HighValue != LowValue || 8 > HalfSize)
1003 SplatBits = HighValue;
1007 SplatBitSize = Width;
1015 BVN->
isConstantSplat(IntBits, SplatUndef, SplatBitSize, HasAnyUndefs, 128,
1019 BVN->
isConstantSplat(SplatBits, SplatUndef, SplatBitSize, HasAnyUndefs, 8,
1024 bool ForCodeSize)
const {
1026 if (
Imm.isZero() ||
Imm.isNegZero())
1047 assert(
TRI->isTypeLegalForClass(*RC, MVT::i32) &&
"Invalid destination!");
1053 assert((PVT == MVT::i64 || PVT == MVT::i32) &&
"Invalid Pointer Size!");
1106 const int64_t FPOffset = 0;
1127 auto *SpecialRegs = Subtarget.getSpecialRegisters();
1128 bool HasFP = Subtarget.getFrameLowering()->hasFP(*MF);
1131 .
addReg(SpecialRegs->getFramePointerRegister())
1139 .
addReg(SpecialRegs->getStackPointerRegister())
1150 .
addReg(SpecialRegs->getStackPointerRegister())
1151 .
addImm(TFL->getBackchainOffset(*MF))
1162 MIB =
BuildMI(*ThisMBB,
MI,
DL,
TII->get(SystemZ::EH_SjLj_Setup))
1166 MIB.
addRegMask(RegInfo->getNoPreservedMask());
1187 MI.eraseFromParent();
1203 assert((PVT == MVT::i64 || PVT == MVT::i32) &&
"Invalid Pointer Size!");
1206 auto *SpecialRegs = Subtarget.getSpecialRegisters();
1213 const int64_t FPOffset = 0;
1225 SpecialRegs->getFramePointerRegister())
1247 SpecialRegs->getStackPointerRegister())
1256 .
addReg(SpecialRegs->getStackPointerRegister())
1257 .
addImm(TFL->getBackchainOffset(*MF))
1263 MI.eraseFromParent();
1294 if (Subtarget.hasInterlockedAccess1() &&
1327 EVT VT =
Y.getValueType();
1330 if (VT == MVT::i32 || VT == MVT::i64)
1331 return Subtarget.hasMiscellaneousExtensions3();
1334 if (VT.
isVector() || VT == MVT::i128)
1335 return Subtarget.hasVector();
1363 bool MVC = Ty->isIntegerTy(8);
1369static AddressingMode
1372 switch (
II->getIntrinsicID()) {
1374 case Intrinsic::memset:
1375 case Intrinsic::memmove:
1376 case Intrinsic::memcpy:
1383 if (SingleUser->getParent() ==
I->getParent()) {
1386 if (
C->getBitWidth() <= 64 &&
1396 if (LoadI->hasOneUse() && LoadI->getParent() ==
I->getParent())
1410 I->getOperand(0)->getType());
1412 bool IsVectorAccess = MemAccessTy->isVectorTy();
1417 Value *DataOp =
I->getOperand(0);
1419 IsVectorAccess =
true;
1425 User *LoadUser = *
I->user_begin();
1427 IsVectorAccess =
true;
1430 if (IsFPAccess || IsVectorAccess)
1449 Subtarget.hasVector() && (Ty->isVectorTy() || Ty->isIntegerTy(128));
1459 return AM.
Scale == 0;
1466 LLVMContext &Context, std::vector<EVT> &MemOps,
unsigned Limit,
1467 const MemOp &
Op,
unsigned DstAS,
unsigned SrcAS,
1468 const AttributeList &FuncAttributes,
EVT *LargestVT)
const {
1471 "Expected EmitTargetCodeForMemXXX() to handle AlwaysInline cases.");
1473 if (
Op.isZeroMemset())
1476 const int MVCFastLen = 16;
1479 if (
Op.isMemcpy() &&
Op.size() <= MVCFastLen)
1481 if (
Op.isMemset() &&
Op.size() - 1 <= MVCFastLen)
1485 if ((
Op.size() >= 16 && !
Op.isAligned(
Align(8))) ||
1486 (
Op.size() >= 25 &&
Op.size() <= 31))
1490 Context, MemOps, Limit,
Op, DstAS, SrcAS, FuncAttributes, LargestVT);
1495 const AttributeList &FuncAttributes)
const {
1496 return Subtarget.hasVector() ? MVT::v2i64 : MVT::Other;
1500 if (!FromType->isIntegerTy() || !ToType->
isIntegerTy())
1502 unsigned FromBits = FromType->getPrimitiveSizeInBits().getFixedValue();
1504 return FromBits > ToBits;
1512 return FromBits > ToBits;
1521 if (Constraint.
size() == 1) {
1522 switch (Constraint[0]) {
1548 }
else if (Constraint.
size() == 2 && Constraint[0] ==
'Z') {
1549 switch (Constraint[1]) {
1560 if (
StringRef(
"{@cc}").compare(Constraint) == 0)
1570 Value *CallOperandVal = Info.CallOperandVal;
1573 if (!CallOperandVal)
1577 switch (*Constraint) {
1596 if (Subtarget.hasVector())
1627 if (
C->getZExtValue() == 0x7fffffff)
1637static std::pair<unsigned, const TargetRegisterClass *>
1639 const unsigned *Map,
unsigned Size) {
1640 assert(*(Constraint.
end()-1) ==
'}' &&
"Missing '}'");
1641 if (isdigit(Constraint[2])) {
1646 return std::make_pair(Map[Index], RC);
1648 return std::make_pair(0U,
nullptr);
1651std::pair<unsigned, const TargetRegisterClass *>
1654 if (Constraint.
size() == 1) {
1656 switch (Constraint[0]) {
1661 return std::make_pair(0U, &SystemZ::GR64BitRegClass);
1663 return std::make_pair(0U, &SystemZ::GR128BitRegClass);
1664 return std::make_pair(0U, &SystemZ::GR32BitRegClass);
1668 return std::make_pair(0U, &SystemZ::ADDR64BitRegClass);
1669 else if (VT == MVT::i128)
1670 return std::make_pair(0U, &SystemZ::ADDR128BitRegClass);
1671 return std::make_pair(0U, &SystemZ::ADDR32BitRegClass);
1674 return std::make_pair(0U, &SystemZ::GRH32BitRegClass);
1679 return std::make_pair(0U, &SystemZ::FP16BitRegClass);
1681 return std::make_pair(0U, &SystemZ::FP64BitRegClass);
1683 return std::make_pair(0U, &SystemZ::FP128BitRegClass);
1684 return std::make_pair(0U, &SystemZ::FP32BitRegClass);
1689 if (Subtarget.hasVector()) {
1691 return std::make_pair(0U, &SystemZ::VR16BitRegClass);
1693 return std::make_pair(0U, &SystemZ::VR32BitRegClass);
1695 return std::make_pair(0U, &SystemZ::VR64BitRegClass);
1696 return std::make_pair(0U, &SystemZ::VR128BitRegClass);
1705 auto getVTSizeInBits = [&VT]() {
1713 if (Constraint[1] ==
'r') {
1714 if (getVTSizeInBits() == 32)
1717 if (getVTSizeInBits() == 128)
1723 if (Constraint[1] ==
'f') {
1725 return std::make_pair(
1727 if (getVTSizeInBits() == 16)
1730 if (getVTSizeInBits() == 32)
1733 if (getVTSizeInBits() == 128)
1739 if (Constraint[1] ==
'v') {
1740 if (!Subtarget.hasVector())
1741 return std::make_pair(
1743 if (getVTSizeInBits() == 16)
1746 if (getVTSizeInBits() == 32)
1749 if (getVTSizeInBits() == 64)
1755 if (Constraint[1] ==
'@') {
1756 if (
StringRef(
"{@cc}").compare(Constraint) == 0)
1757 return std::make_pair(SystemZ::CC, &SystemZ::CCRRegClass);
1770 .
Case(
"r4", Subtarget.isTargetXPLINK64() ? SystemZ::R4D
1771 : SystemZ::NoRegister)
1773 Subtarget.isTargetELF() ? SystemZ::R15D : SystemZ::NoRegister)
1781 return Subtarget.isTargetXPLINK64() ? SystemZ::R1D : SystemZ::R6D;
1786 return Subtarget.isTargetXPLINK64() ? SystemZ::R2D : SystemZ::R7D;
1801 if (
StringRef(
"{@cc}").compare(OpInfo.ConstraintCode) != 0)
1805 if (OpInfo.ConstraintVT.isVector() || !OpInfo.ConstraintVT.isInteger() ||
1806 OpInfo.ConstraintVT.getSizeInBits() < 8)
1821 if (Constraint.
size() == 1) {
1822 switch (Constraint[0]) {
1827 Op.getValueType()));
1834 Op.getValueType()));
1841 C->getSExtValue(),
SDLoc(
Op),
Op.getValueType()));
1848 C->getSExtValue(),
SDLoc(
Op),
Op.getValueType()));
1853 if (
C->getZExtValue() == 0x7fffffff)
1855 Op.getValueType()));
1866#define GET_CALLING_CONV_IMPL
1867#include "SystemZGenCallingConv.inc"
1871 static const MCPhysReg ScratchRegs[] = { SystemZ::R0D, SystemZ::R1D,
1877 Type *ToType)
const {
1940 if (BitCastToType == MVT::v2i64)
1967 MVT::Untyped,
Hi,
Lo);
1991 unsigned NumParts,
MVT PartVT, std::optional<CallingConv::ID> CC)
const {
1993 if (ValueVT.
getSizeInBits() == 128 && NumParts == 1 && PartVT == MVT::Untyped) {
2004 MVT PartVT,
EVT ValueVT, std::optional<CallingConv::ID> CC)
const {
2005 if (ValueVT.
getSizeInBits() == 128 && NumParts == 1 && PartVT == MVT::Untyped) {
2016template <
class ArgTy>
2019 MVT &PartVT,
unsigned &NumParts) {
2020 if (!Args[
I].Flags.isSplit())
2024 PartVT = ArgLocs[
I].getValVT();
2026 for (
unsigned PartIdx =
I + 1;; ++PartIdx) {
2027 assert(PartIdx != ArgLocs.
size() &&
"SplitEnd not found.");
2028 assert(ArgLocs[PartIdx].getValVT() == PartVT &&
"Unsupported split.");
2030 if (Args[PartIdx].Flags.isSplitEnd())
2054 unsigned NumFixedGPRs = 0;
2055 unsigned NumFixedFPRs = 0;
2056 for (
unsigned I = 0, E = ArgLocs.
size();
I != E; ++
I) {
2069 RC = &SystemZ::GR32BitRegClass;
2073 RC = &SystemZ::GR64BitRegClass;
2077 RC = &SystemZ::FP16BitRegClass;
2081 RC = &SystemZ::FP32BitRegClass;
2085 RC = &SystemZ::FP64BitRegClass;
2089 RC = &SystemZ::FP128BitRegClass;
2098 RC = &SystemZ::VR128BitRegClass;
2112 if (Subtarget.isTargetXPLINK64()) {
2115 ArgSPOffset += XPRegs.getCallFrameSize();
2126 unsigned SlotOffs = VA.
getLocVT() == MVT::f16 ? 6 : 4;
2130 ArgValue = DAG.
getLoad(LocVT,
DL, Chain, FIN,
2144 for (
unsigned PartIdx = 1; PartIdx < NumParts; ++PartIdx) {
2147 unsigned PartOffset = Ins[
I].PartOffset;
2152 assert(PartOffset &&
"Offset should be non-zero.");
2159 if (IsVarArg && Subtarget.isTargetXPLINK64()) {
2165 Subtarget.getSpecialRegisters());
2171 int64_t VarArgOffset = CCInfo.
getStackSize() + Regs->getCallFrameSize();
2176 if (IsVarArg && Subtarget.isTargetELF()) {
2189 int64_t RegSaveOffset =
2204 &SystemZ::FP64BitRegClass);
2216 if (Subtarget.isTargetXPLINK64()) {
2221 Subtarget.getSpecialRegisters());
2222 MRI.
addLiveIn(Regs->getADARegister(), ADAvReg);
2234 for (
unsigned I = 0,
E = ArgLocs.
size();
I !=
E; ++
I) {
2241 if (
Reg == SystemZ::R6H ||
Reg == SystemZ::R6L ||
Reg == SystemZ::R6D)
2243 if (Outs[
I].Flags.isSwiftSelf() || Outs[
I].Flags.isSwiftError())
2250 unsigned Offset,
bool LoadAdr =
false) {
2273 bool LoadAddr =
false;
2295 unsigned ADADelta = 0;
2296 unsigned EPADelta = 8;
2302 bool IsInternal = (
G->getGlobal()->hasInternalLinkage() ||
2303 G->getGlobal()->hasPrivateLinkage());
2310 Callee = DAG.
getNode(SystemZISD::PCREL_WRAPPER,
DL, PtrVT, Callee);
2356 if (Subtarget.isTargetXPLINK64())
2360 verifyNarrowIntegerArgs_Call(Outs, &MF.
getFunction(), Callee);
2364 CCState ArgCCInfo(CallConv, IsVarArg, MF, ArgLocs, Ctx);
2383 for (
unsigned I = 0, E = ArgLocs.
size();
I != E; ++
I) {
2391 unsigned NumParts = 1;
2395 SlotVT = Outs[
I].VT;
2402 DAG.
getStore(Chain,
DL, ArgValue, SpillSlot, StackPtrInfo));
2405 assert(Outs[
I].PartOffset == 0);
2406 for (
unsigned PartIdx = 1; PartIdx < NumParts; ++PartIdx) {
2409 unsigned PartOffset = Outs[
I].PartOffset;
2415 assert(PartOffset &&
"Offset should be non-zero.");
2417 SlotVT.
getStoreSize()) &&
"Not enough space for argument part!");
2419 ArgValue = SpillSlot;
2436 if (!StackPtr.getNode())
2443 else if (VA.
getLocVT() == MVT::f16)
2456 if (Subtarget.isTargetXPLINK64() && VA.
needsCustom()) {
2460 RegsToPass.
push_back(std::make_pair(SystemZ::R3D, ShadowArgValue));
2466 if (!MemOpChains.
empty())
2474 if (Subtarget.isTargetXPLINK64()) {
2479 ->getAddressOfCalleeRegister();
2482 Callee = DAG.
getRegister(CalleeReg, Callee.getValueType());
2489 Callee = DAG.
getNode(SystemZISD::PCREL_WRAPPER,
DL, PtrVT, Callee);
2492 Callee = DAG.
getNode(SystemZISD::PCREL_WRAPPER,
DL, PtrVT, Callee);
2493 }
else if (IsTailCall) {
2496 Callee = DAG.
getRegister(SystemZ::R1D, Callee.getValueType());
2501 for (
const auto &[Reg,
N] : RegsToPass) {
2508 Ops.push_back(Chain);
2509 Ops.push_back(Callee);
2513 for (
const auto &[Reg,
N] : RegsToPass)
2518 const uint32_t *Mask =
TRI->getCallPreservedMask(MF, CallConv);
2519 assert(Mask &&
"Missing call preserved mask for calling convention");
2524 Ops.push_back(Glue);
2533 Chain = DAG.
getNode(SystemZISD::CALL,
DL, NodeTys,
Ops);
2543 CCState RetCCInfo(CallConv, IsVarArg, MF, RetLocs, Ctx);
2550 VA.getLocVT(), Glue);
2567 bool DoesNotReturn,
bool IsReturnValueUsed)
const {
2569 Args.reserve(
Ops.size());
2575 Entry.IsZExt = !Entry.IsSExt;
2576 Args.push_back(Entry);
2587 .
setCallee(CallConv, RetTy, Callee, std::move(Args))
2598 const Type *RetTy)
const {
2601 for (
auto &Out : Outs)
2602 if (Out.ArgVT.isScalarInteger() && Out.ArgVT.getSizeInBits() > 64)
2606 CCState RetCCInfo(CallConv, IsVarArg, MF, RetLocs, Context);
2607 return RetCCInfo.
CheckReturn(Outs, RetCC_SystemZ);
2619 verifyNarrowIntegerArgs_Ret(Outs, &MF.
getFunction());
2627 if (RetLocs.
empty())
2628 return DAG.
getNode(SystemZISD::RET_GLUE,
DL, MVT::Other, Chain);
2637 for (
unsigned I = 0, E = RetLocs.
size();
I != E; ++
I) {
2659 return DAG.
getNode(SystemZISD::RET_GLUE,
DL, MVT::Other, RetOps);
2666 unsigned &CCValid) {
2667 unsigned Id =
Op.getConstantOperandVal(1);
2669 case Intrinsic::s390_tbegin:
2670 Opcode = SystemZISD::TBEGIN;
2674 case Intrinsic::s390_tbegin_nofloat:
2675 Opcode = SystemZISD::TBEGIN_NOFLOAT;
2679 case Intrinsic::s390_tend:
2680 Opcode = SystemZISD::TEND;
2693 unsigned Id =
Op.getConstantOperandVal(0);
2695 case Intrinsic::s390_vpkshs:
2696 case Intrinsic::s390_vpksfs:
2697 case Intrinsic::s390_vpksgs:
2698 Opcode = SystemZISD::PACKS_CC;
2702 case Intrinsic::s390_vpklshs:
2703 case Intrinsic::s390_vpklsfs:
2704 case Intrinsic::s390_vpklsgs:
2705 Opcode = SystemZISD::PACKLS_CC;
2709 case Intrinsic::s390_vceqbs:
2710 case Intrinsic::s390_vceqhs:
2711 case Intrinsic::s390_vceqfs:
2712 case Intrinsic::s390_vceqgs:
2713 case Intrinsic::s390_vceqqs:
2714 Opcode = SystemZISD::VICMPES;
2718 case Intrinsic::s390_vchbs:
2719 case Intrinsic::s390_vchhs:
2720 case Intrinsic::s390_vchfs:
2721 case Intrinsic::s390_vchgs:
2722 case Intrinsic::s390_vchqs:
2723 Opcode = SystemZISD::VICMPHS;
2727 case Intrinsic::s390_vchlbs:
2728 case Intrinsic::s390_vchlhs:
2729 case Intrinsic::s390_vchlfs:
2730 case Intrinsic::s390_vchlgs:
2731 case Intrinsic::s390_vchlqs:
2732 Opcode = SystemZISD::VICMPHLS;
2736 case Intrinsic::s390_vtm:
2737 Opcode = SystemZISD::VTM;
2741 case Intrinsic::s390_vfaebs:
2742 case Intrinsic::s390_vfaehs:
2743 case Intrinsic::s390_vfaefs:
2744 Opcode = SystemZISD::VFAE_CC;
2748 case Intrinsic::s390_vfaezbs:
2749 case Intrinsic::s390_vfaezhs:
2750 case Intrinsic::s390_vfaezfs:
2751 Opcode = SystemZISD::VFAEZ_CC;
2755 case Intrinsic::s390_vfeebs:
2756 case Intrinsic::s390_vfeehs:
2757 case Intrinsic::s390_vfeefs:
2758 Opcode = SystemZISD::VFEE_CC;
2762 case Intrinsic::s390_vfeezbs:
2763 case Intrinsic::s390_vfeezhs:
2764 case Intrinsic::s390_vfeezfs:
2765 Opcode = SystemZISD::VFEEZ_CC;
2769 case Intrinsic::s390_vfenebs:
2770 case Intrinsic::s390_vfenehs:
2771 case Intrinsic::s390_vfenefs:
2772 Opcode = SystemZISD::VFENE_CC;
2776 case Intrinsic::s390_vfenezbs:
2777 case Intrinsic::s390_vfenezhs:
2778 case Intrinsic::s390_vfenezfs:
2779 Opcode = SystemZISD::VFENEZ_CC;
2783 case Intrinsic::s390_vistrbs:
2784 case Intrinsic::s390_vistrhs:
2785 case Intrinsic::s390_vistrfs:
2786 Opcode = SystemZISD::VISTR_CC;
2790 case Intrinsic::s390_vstrcbs:
2791 case Intrinsic::s390_vstrchs:
2792 case Intrinsic::s390_vstrcfs:
2793 Opcode = SystemZISD::VSTRC_CC;
2797 case Intrinsic::s390_vstrczbs:
2798 case Intrinsic::s390_vstrczhs:
2799 case Intrinsic::s390_vstrczfs:
2800 Opcode = SystemZISD::VSTRCZ_CC;
2804 case Intrinsic::s390_vstrsb:
2805 case Intrinsic::s390_vstrsh:
2806 case Intrinsic::s390_vstrsf:
2807 Opcode = SystemZISD::VSTRS_CC;
2811 case Intrinsic::s390_vstrszb:
2812 case Intrinsic::s390_vstrszh:
2813 case Intrinsic::s390_vstrszf:
2814 Opcode = SystemZISD::VSTRSZ_CC;
2818 case Intrinsic::s390_vfcedbs:
2819 case Intrinsic::s390_vfcesbs:
2820 Opcode = SystemZISD::VFCMPES;
2824 case Intrinsic::s390_vfchdbs:
2825 case Intrinsic::s390_vfchsbs:
2826 Opcode = SystemZISD::VFCMPHS;
2830 case Intrinsic::s390_vfchedbs:
2831 case Intrinsic::s390_vfchesbs:
2832 Opcode = SystemZISD::VFCMPHES;
2836 case Intrinsic::s390_vftcidb:
2837 case Intrinsic::s390_vftcisb:
2838 Opcode = SystemZISD::VFTCI;
2842 case Intrinsic::s390_tdc:
2843 Opcode = SystemZISD::TDC;
2856 unsigned NumOps =
Op.getNumOperands();
2859 Ops.push_back(
Op.getOperand(0));
2861 Ops.push_back(
Op.getOperand(
I));
2863 assert(
Op->getNumValues() == 2 &&
"Expected only CC result and chain");
2877 unsigned NumOps =
Op.getNumOperands();
2883 assert((
Op.getConstantOperandVal(0) == Intrinsic::s390_tdc &&
I == 1) &&
2884 "Unhandled intrinsic with f16 operand.");
2887 Ops.push_back(CurrOper);
2901 case ISD::SET##X: return SystemZ::CCMASK_CMP_##X; \
2902 case ISD::SETO##X: return SystemZ::CCMASK_CMP_##X; \
2903 case ISD::SETU##X: return SystemZ::CCMASK_CMP_UO | SystemZ::CCMASK_CMP_##X
2929 if (!ConstOp1 || ConstOp1->getValueSizeInBits(0) > 64)
2932 int64_t
Value = ConstOp1->getSExtValue();
2948 if (!
C.Op0.hasOneUse() ||
2955 unsigned NumBits =
Load->getMemoryVT().getSizeInBits();
2956 if ((NumBits != 8 && NumBits != 16) ||
2957 NumBits !=
Load->getMemoryVT().getStoreSizeInBits())
2963 if (!ConstOp1 || ConstOp1->getValueSizeInBits(0) > 64)
2966 uint64_t Mask = (1 << NumBits) - 1;
2969 int64_t SignedValue = ConstOp1->getSExtValue();
2976 }
else if (NumBits == 8) {
3002 if (
C.Op0.getValueType() != MVT::i32 ||
3003 Load->getExtensionType() != ExtType) {
3005 Load->getBasePtr(),
Load->getPointerInfo(),
3006 Load->getMemoryVT(),
Load->getAlign(),
3007 Load->getMemOperand()->getFlags());
3013 if (
C.Op1.getValueType() != MVT::i32 ||
3014 Value != ConstOp1->getZExtValue())
3024 if (
Load->getMemoryVT() == MVT::i8)
3027 switch (
Load->getExtensionType()) {
3045 if (
C.Op0.isMachineOpcode() &&
3046 (
C.Op0.getMachineOpcode() == SystemZ::LOAD_STACK_GUARD))
3050 if (
C.Op0.getValueType() == MVT::i128)
3052 if (
C.Op0.getValueType() == MVT::f128)
3064 if (ConstOp1 && ConstOp1->getZExtValue() == 0)
3093 unsigned Opcode0 =
C.Op0.getOpcode();
3100 C.Op0.getConstantOperandVal(1) == 0xffffffff)
3115 ((
N->getOperand(0) ==
C.Op0 &&
N->getOperand(1) ==
C.Op1) ||
3116 (
N->getOperand(0) ==
C.Op1 &&
N->getOperand(1) ==
C.Op0))) {
3138 if (C1 && C1->isZero()) {
3157 if (
C.Op0.getOpcode() ==
ISD::SHL &&
C.Op0.getValueType() == MVT::i64 &&
3160 if (C1 && C1->getZExtValue() == 32) {
3161 SDValue ShlOp0 =
C.Op0.getOperand(0);
3180 C.Op0.getOperand(0).getOpcode() ==
ISD::LOAD &&
3183 C.Op1->getAsZExtVal() == 0) {
3185 if (L->getMemoryVT().getStoreSizeInBits().getFixedValue() <=
3186 C.Op0.getValueSizeInBits().getFixedValue()) {
3187 unsigned Type = L->getExtensionType();
3190 C.Op0 =
C.Op0.getOperand(0);
3206 if (
C.Opcode != SystemZISD::ICMP)
3216 if (!
C.Op1.isMachineOpcode() ||
3217 C.Op1.getMachineOpcode() != SystemZ::LOAD_STACK_GUARD)
3222 C.Opcode = SystemZISD::CMP_STACKGUARD;
3233 uint64_t Amount = Shift->getZExtValue();
3234 if (Amount >=
N.getValueSizeInBits())
3249 unsigned ICmpType) {
3250 assert(Mask != 0 &&
"ANDs with zero should have been removed by now");
3272 if (EffectivelyUnsigned && CmpVal > 0 && CmpVal <=
Low) {
3278 if (EffectivelyUnsigned && CmpVal <
Low) {
3286 if (CmpVal == Mask) {
3292 if (EffectivelyUnsigned && CmpVal >= Mask -
Low && CmpVal < Mask) {
3298 if (EffectivelyUnsigned && CmpVal > Mask -
Low && CmpVal <= Mask) {
3306 if (EffectivelyUnsigned && CmpVal >= Mask -
High && CmpVal <
High) {
3312 if (EffectivelyUnsigned && CmpVal > Mask -
High && CmpVal <=
High) {
3341 if (
C.Op0.getValueType() == MVT::i128) {
3347 if (Mask && Mask->getAPIntValue() == 0) {
3348 C.Opcode = SystemZISD::VTM;
3365 uint64_t CmpVal = ConstOp1->getZExtValue();
3372 NewC.Op0 =
C.Op0.getOperand(0);
3373 NewC.Op1 =
C.Op0.getOperand(1);
3377 MaskVal = Mask->getZExtValue();
3397 MaskVal = -(CmpVal & -CmpVal);
3406 unsigned NewCCMask, ShiftVal;
3410 (MaskVal >> ShiftVal != 0) &&
3411 ((CmpVal >> ShiftVal) << ShiftVal) == CmpVal &&
3413 MaskVal >> ShiftVal,
3417 MaskVal >>= ShiftVal;
3421 (MaskVal << ShiftVal != 0) &&
3422 ((CmpVal << ShiftVal) >> ShiftVal) == CmpVal &&
3424 MaskVal << ShiftVal,
3428 MaskVal <<= ShiftVal;
3437 C.Opcode = SystemZISD::TM;
3439 if (Mask && Mask->getZExtValue() == MaskVal)
3444 C.CCMask = NewCCMask;
3450 if (
C.Opcode != SystemZISD::ICMP)
3452 if (
C.Op0.getValueType() != MVT::i128)
3463 Src = Src.getOperand(0);
3466 unsigned Opcode = 0;
3467 if (Src.hasOneUse()) {
3468 switch (Src.getOpcode()) {
3469 case SystemZISD::VICMPE: Opcode = SystemZISD::VICMPES;
break;
3470 case SystemZISD::VICMPH: Opcode = SystemZISD::VICMPHS;
break;
3471 case SystemZISD::VICMPHL: Opcode = SystemZISD::VICMPHLS;
break;
3472 case SystemZISD::VFCMPE: Opcode = SystemZISD::VFCMPES;
break;
3473 case SystemZISD::VFCMPH: Opcode = SystemZISD::VFCMPHS;
break;
3474 case SystemZISD::VFCMPHE: Opcode = SystemZISD::VFCMPHES;
break;
3480 C.Op0 = Src->getOperand(0);
3481 C.Op1 = Src->getOperand(1);
3485 C.CCMask ^=
C.CCValid;
3497 C.Opcode = SystemZISD::VICMPES;
3509 bool Swap =
false, Invert =
false;
3521 C.Opcode = SystemZISD::UCMP128HI;
3523 C.Opcode = SystemZISD::SCMP128HI;
3528 C.CCMask ^=
C.CCValid;
3539 if (!Mask || Mask->getValueSizeInBits(0) > 64)
3542 if ((~
Known.Zero).getZExtValue() & ~Mask->getZExtValue())
3545 C.Op0 =
C.Op0.getOperand(0);
3557 C.CCValid = CCValid;
3560 C.CCMask = CC < 4 ? 1 << (3 - CC) : 0;
3563 C.CCMask = CC < 4 ? ~(1 << (3 - CC)) : -1;
3567 C.CCMask = CC < 4 ? ~0U << (4 - CC) : -1;
3570 C.CCMask = CC < 4 ? ~(~0U << (4 - CC)) : 0;
3574 C.CCMask = CC < 4 ? ~0U << (3 - CC) : -1;
3577 C.CCMask = CC < 4 ? ~(~0U << (3 - CC)) : 0;
3580 C.CCMask &= CCValid;
3588 bool IsSignaling =
false) {
3591 unsigned Opcode, CCValid;
3603 Comparison
C(CmpOp0, CmpOp1, Chain);
3605 if (
C.Op0.getValueType().isFloatingPoint()) {
3608 C.Opcode = SystemZISD::FCMP;
3609 else if (!IsSignaling)
3610 C.Opcode = SystemZISD::STRICT_FCMP;
3612 C.Opcode = SystemZISD::STRICT_FCMPS;
3617 C.Opcode = SystemZISD::ICMP;
3653 if (!
C.Op1.getNode()) {
3654 if (
C.Opcode == SystemZISD::CMP_STACKGUARD)
3655 return DAG.
getNode(SystemZISD::CMP_STACKGUARD,
DL, MVT::i32,
C.Op0);
3657 switch (
C.Op0.getOpcode()) {
3668 if (
C.Opcode == SystemZISD::ICMP)
3669 return DAG.
getNode(SystemZISD::ICMP,
DL, MVT::i32,
C.Op0,
C.Op1,
3671 if (
C.Opcode == SystemZISD::TM) {
3674 return DAG.
getNode(SystemZISD::TM,
DL, MVT::i32,
C.Op0,
C.Op1,
3677 if (
C.Opcode == SystemZISD::VICMPES ||
3678 C.Opcode == SystemZISD::VICMPHS ||
3679 C.Opcode == SystemZISD::VICMPHLS ||
3680 C.Opcode == SystemZISD::VFCMPES ||
3681 C.Opcode == SystemZISD::VFCMPHS ||
3682 C.Opcode == SystemZISD::VFCMPHES) {
3683 EVT IntVT =
C.Op0.getValueType().changeVectorElementTypeToInteger();
3690 return DAG.
getNode(
C.Opcode,
DL, VTs,
C.Chain,
C.Op0,
C.Op1);
3692 return DAG.
getNode(
C.Opcode,
DL, MVT::i32,
C.Op0,
C.Op1);
3701 Op0 = DAG.
getNode(Extend,
DL, MVT::i64, Op0);
3702 Op1 = DAG.
getNode(Extend,
DL, MVT::i64, Op1);
3727 unsigned CCValid,
unsigned CCMask) {
3732 return DAG.
getNode(SystemZISD::SELECT_CCMASK,
DL, MVT::i32,
Ops);
3810 int Mask[] = { Start, -1, Start + 1, -1 };
3814 return DAG.
getNode(SystemZISD::STRICT_VEXTEND,
DL, VTs, Chain,
Op);
3816 return DAG.
getNode(SystemZISD::VEXTEND,
DL, MVT::v2f64,
Op);
3830 !Subtarget.hasVectorEnhancements1()) {
3836 SDVTList VTs = DAG.
getVTList(MVT::v2i64, MVT::Other);
3849 return DAG.
getNode(SystemZISD::PACK,
DL, VT, HRes, LRes);
3852 SDVTList VTs = DAG.
getVTList(VT, MVT::Other);
3853 return DAG.
getNode(Opcode,
DL, VTs, Chain, CmpOp0, CmpOp1);
3855 return DAG.
getNode(Opcode,
DL, VT, CmpOp0, CmpOp1);
3868 bool IsSignaling)
const {
3871 assert (!IsSignaling || Chain);
3874 bool Invert =
false;
3882 assert(IsFP &&
"Unexpected integer comparison");
3884 DL, VT, CmpOp1, CmpOp0, Chain);
3886 DL, VT, CmpOp0, CmpOp1, Chain);
3890 LT.getValue(1),
GE.getValue(1));
3899 assert(IsFP &&
"Unexpected integer comparison");
3901 DL, VT, CmpOp1, CmpOp0, Chain);
3903 DL, VT, CmpOp0, CmpOp1, Chain);
3907 LT.getValue(1),
GT.getValue(1));
3928 Cmp = getVectorCmp(DAG, Opcode,
DL, VT, CmpOp0, CmpOp1, Chain);
3932 Cmp = getVectorCmp(DAG, Opcode,
DL, VT, CmpOp1, CmpOp0, Chain);
3937 Chain =
Cmp.getValue(1);
3945 if (Chain && Chain.
getNode() !=
Cmp.getNode()) {
3958 EVT VT =
Op.getValueType();
3960 return lowerVectorSETCC(DAG,
DL, VT, CC, CmpOp0, CmpOp1);
3969 bool IsSignaling)
const {
3975 EVT VT =
Op.getNode()->getValueType(0);
3977 SDValue Res = lowerVectorSETCC(DAG,
DL, VT, CC, CmpOp0, CmpOp1,
3978 Chain, IsSignaling);
4000 SystemZISD::BR_CCMASK,
DL,
Op.getValueType(),
Op.getOperand(0),
4034 C.CCMask ^=
C.CCValid;
4042 Op = SystemZISD::VICMPE;
4046 Op = SystemZISD::VICMPHL;
4048 Op = SystemZISD::VICMPH;
4087 C.Op1->getAsZExtVal() == 0) {
4094 if (Subtarget.hasVectorEnhancements3() &&
4095 C.Opcode == SystemZISD::ICMP &&
4096 C.Op0.getValueType() == MVT::i128 &&
4106 return DAG.
getNode(SystemZISD::SELECT_CCMASK,
DL,
Op.getValueType(),
Ops);
4112 const GlobalValue *GV =
Node->getGlobal();
4118 if (Subtarget.isPC32DBLSymbol(GV, CM)) {
4140 }
else if (Subtarget.isTargetELF()) {
4145 }
else if (Subtarget.isTargetzOS()) {
4176 Chain = DAG.
getCopyToReg(Chain,
DL, SystemZ::R2D, GOTOffset, Glue);
4181 Ops.push_back(Chain);
4183 Node->getValueType(0),
4192 const TargetRegisterInfo *
TRI = Subtarget.getRegisterInfo();
4193 const uint32_t *
Mask =
4195 assert(Mask &&
"Missing call preserved mask for calling convention");
4199 Ops.push_back(Glue);
4202 SDVTList NodeTys = DAG.
getVTList(MVT::Other, MVT::Glue);
4210SDValue SystemZTargetLowering::lowerThreadPointer(
const SDLoc &
DL,
4234 const GlobalValue *GV =
Node->getGlobal();
4242 SDValue TP = lowerThreadPointer(
DL, DAG);
4249 SystemZConstantPoolValue *CPV =
4258 Offset = lowerTLSGetOffset(Node, DAG, SystemZISD::TLS_GDCALL,
Offset);
4264 SystemZConstantPoolValue *CPV =
4273 Offset = lowerTLSGetOffset(Node, DAG, SystemZISD::TLS_LDCALL,
Offset);
4278 SystemZMachineFunctionInfo* MFI =
4307 SystemZConstantPoolValue *CPV =
4341 return DAG.
getNode(SystemZISD::PCREL_WRAPPER,
DL, PtrVT, Result);
4358 return DAG.
getNode(SystemZISD::PCREL_WRAPPER,
DL, PtrVT, Result);
4363 auto *TFL = Subtarget.getFrameLowering<SystemZFrameLowering>();
4365 MachineFrameInfo &MFI = MF.getFrameInfo();
4369 unsigned Depth =
Op.getConstantOperandVal(0);
4376 int BackChainIdx = TFL->getOrCreateFramePointerSaveIndex(MF);
4381 if (!MF.getSubtarget<SystemZSubtarget>().hasBackChain())
4387 MachinePointerInfo());
4402 unsigned Depth =
Op.getConstantOperandVal(0);
4407 if (!MF.
getSubtarget<SystemZSubtarget>().hasBackChain())
4410 SDValue FrameAddr = lowerFRAMEADDR(
Op, DAG);
4411 const auto *TFL = Subtarget.getFrameLowering<SystemZFrameLowering>();
4412 int Offset = TFL->getReturnAddressOffset(MF);
4416 MachinePointerInfo());
4421 SystemZCallingConventionRegisters *CCR = Subtarget.getSpecialRegisters();
4423 &SystemZ::GR64BitRegClass);
4431 EVT InVT =
In.getValueType();
4432 EVT ResVT =
Op.getValueType();
4440 LoadN->getBasePtr(), LoadN->getMemOperand());
4446 if (InVT == MVT::i32 && ResVT == MVT::f32) {
4448 if (Subtarget.hasHighWord()) {
4452 MVT::i64,
SDValue(U64, 0), In);
4460 DL, MVT::f32, Out64);
4462 if (InVT == MVT::f32 && ResVT == MVT::i32) {
4465 MVT::f64,
SDValue(U64, 0), In);
4467 if (Subtarget.hasHighWord())
4480 if (Subtarget.isTargetXPLINK64())
4481 return lowerVASTART_XPLINK(
Op, DAG);
4483 return lowerVASTART_ELF(
Op, DAG);
4489 SystemZMachineFunctionInfo *FuncInfo =
4490 MF.
getInfo<SystemZMachineFunctionInfo>();
4500 MachinePointerInfo(SV));
4506 SystemZMachineFunctionInfo *FuncInfo =
4507 MF.
getInfo<SystemZMachineFunctionInfo>();
4516 const unsigned NumFields = 4;
4527 for (
unsigned I = 0;
I < NumFields; ++
I) {
4532 MemOps[
I] = DAG.
getStore(Chain,
DL, Fields[
I], FieldAddr,
4533 MachinePointerInfo(SV,
Offset));
4553 nullptr, std::nullopt, MachinePointerInfo(DstSV),
4554 MachinePointerInfo(SrcSV));
4558SystemZTargetLowering::lowerDYNAMIC_STACKALLOC(
SDValue Op,
4560 if (Subtarget.isTargetXPLINK64())
4561 return lowerDYNAMIC_STACKALLOC_XPLINK(
Op, DAG);
4563 return lowerDYNAMIC_STACKALLOC_ELF(
Op, DAG);
4567SystemZTargetLowering::lowerDYNAMIC_STACKALLOC_XPLINK(
SDValue Op,
4569 const TargetFrameLowering *TFI = Subtarget.getFrameLowering();
4579 uint64_t AlignVal = (RealignOpt ?
Align->getAsZExtVal() : 0);
4582 uint64_t RequiredAlign = std::max(AlignVal, StackAlign);
4583 uint64_t ExtraAlignSpace = RequiredAlign - StackAlign;
4589 if (ExtraAlignSpace)
4593 bool IsSigned =
false;
4594 bool DoesNotReturn =
false;
4595 bool IsReturnValueUsed =
false;
4596 EVT VT =
Op.getValueType();
4606 auto &Regs = Subtarget.getSpecialRegisters<SystemZXPLINK64Registers>();
4618 if (ExtraAlignSpace) {
4630SystemZTargetLowering::lowerDYNAMIC_STACKALLOC_ELF(
SDValue Op,
4632 const TargetFrameLowering *TFI = Subtarget.getFrameLowering();
4635 bool StoreBackchain = MF.
getSubtarget<SystemZSubtarget>().hasBackChain();
4644 uint64_t AlignVal = (RealignOpt ?
Align->getAsZExtVal() : 0);
4647 uint64_t RequiredAlign = std::max(AlignVal, StackAlign);
4648 uint64_t ExtraAlignSpace = RequiredAlign - StackAlign;
4659 Backchain = DAG.
getLoad(MVT::i64,
DL, Chain, getBackchainAddress(OldSP, DAG),
4660 MachinePointerInfo());
4663 if (ExtraAlignSpace)
4670 NewSP = DAG.
getNode(SystemZISD::PROBED_ALLOCA,
DL,
4671 DAG.
getVTList(MVT::i64, MVT::Other), Chain, OldSP, NeededSpace);
4687 if (RequiredAlign > StackAlign) {
4697 Chain = DAG.
getStore(Chain,
DL, Backchain, getBackchainAddress(NewSP, DAG),
4698 MachinePointerInfo());
4704SDValue SystemZTargetLowering::lowerGET_DYNAMIC_AREA_OFFSET(
4708 return DAG.
getNode(SystemZISD::ADJDYNALLOC,
DL, MVT::i64);
4713 unsigned Opcode)
const {
4714 EVT VT =
Op.getValueType();
4720 assert(Subtarget.hasMiscellaneousExtensions2());
4725 Op.getOperand(0),
Op.getOperand(1), Even, Odd);
4731 EVT VT =
Op.getValueType();
4739 else if (Subtarget.hasMiscellaneousExtensions2())
4744 Op.getOperand(0),
Op.getOperand(1),
Ops[1],
Ops[0]);
4779 EVT VT =
Op.getValueType();
4792 Op.getOperand(0),
Op.getOperand(1),
Ops[1],
Ops[0]);
4800 EVT VT =
Op.getValueType();
4820 EVT VT =
Op.getValueType();
4827 Op.getOperand(0),
Op.getOperand(1),
Ops[1],
Ops[0]);
4832 assert(
Op.getValueType() == MVT::i64 &&
"Should be 64-bit operation");
4842 Known[1].Zero.getZExtValue() };
4844 if ((Masks[0] >> 32) == 0xffffffff && uint32_t(Masks[1]) == 0xffffffff)
4846 else if ((Masks[1] >> 32) == 0xffffffff && uint32_t(Masks[0]) == 0xffffffff)
4883 MVT::i64, HighOp, Low32);
4889 SDNode *
N =
Op.getNode();
4894 if (
N->getValueType(0) == MVT::i128) {
4895 unsigned BaseOp = 0;
4896 unsigned FlagOp = 0;
4897 bool IsBorrow =
false;
4898 switch (
Op.getOpcode()) {
4902 FlagOp = SystemZISD::VACC;
4906 FlagOp = SystemZISD::VSCBI;
4921 unsigned BaseOp = 0;
4922 unsigned CCValid = 0;
4923 unsigned CCMask = 0;
4925 switch (
Op.getOpcode()) {
4928 BaseOp = SystemZISD::SADDO;
4933 BaseOp = SystemZISD::SSUBO;
4938 BaseOp = SystemZISD::UADDO;
4943 BaseOp = SystemZISD::USUBO;
4949 SDVTList VTs = DAG.
getVTList(
N->getValueType(0), MVT::i32);
4953 if (
N->getValueType(1) == MVT::i1)
4979 SDNode *
N =
Op.getNode();
4980 MVT VT =
N->getSimpleValueType(0);
4991 if (VT == MVT::i128) {
4992 unsigned BaseOp = 0;
4993 unsigned FlagOp = 0;
4994 bool IsBorrow =
false;
4995 switch (
Op.getOpcode()) {
4998 BaseOp = SystemZISD::VAC;
4999 FlagOp = SystemZISD::VACCC;
5002 BaseOp = SystemZISD::VSBI;
5003 FlagOp = SystemZISD::VSBCBI;
5022 unsigned BaseOp = 0;
5023 unsigned CCValid = 0;
5024 unsigned CCMask = 0;
5026 switch (
Op.getOpcode()) {
5032 BaseOp = SystemZISD::ADDCARRY;
5040 BaseOp = SystemZISD::SUBCARRY;
5051 SDVTList VTs = DAG.
getVTList(VT, MVT::i32);
5055 if (
N->getValueType(1) == MVT::i1)
5063 EVT VT =
Op.getValueType();
5065 Op =
Op.getOperand(0);
5088 Op = DAG.
getNode(SystemZISD::VSRL_BY_SCALAR,
DL, VT,
Op, Shift);
5100 Op = DAG.
getNode(SystemZISD::VSUM,
DL, MVT::v4i32,
Op, Tmp);
5113 if (NumSignificantBits == 0)
5119 BitSize = std::min(BitSize, OrigBitSize);
5128 for (int64_t
I = BitSize / 2;
I >= 8;
I =
I / 2) {
5130 if (BitSize != OrigBitSize)
5167 EVT RegVT =
Op.getValueType();
5169 return lowerATOMIC_LDST_I128(
Op, DAG);
5170 return lowerLoadF16(
Op, DAG);
5176 if (
Node->getMemoryVT().getSizeInBits() == 128)
5177 return lowerATOMIC_LDST_I128(
Op, DAG);
5178 return lowerStoreF16(
Op, DAG);
5185 (
Node->getMemoryVT() == MVT::i128 ||
Node->getMemoryVT() == MVT::f128) &&
5186 "Only custom lowering i128 or f128.");
5199 EVT WideVT = MVT::i32;
5222 unsigned Opcode)
const {
5226 EVT NarrowVT =
Node->getMemoryVT();
5227 EVT WideVT = MVT::i32;
5228 if (NarrowVT == WideVT)
5235 MachineMemOperand *MMO =
Node->getMemOperand();
5239 if (Opcode == SystemZISD::ATOMIC_LOADW_SUB)
5241 Opcode = SystemZISD::ATOMIC_LOADW_ADD;
5246 SDValue AlignedAddr, BitShift, NegBitShift;
5254 if (Opcode != SystemZISD::ATOMIC_SWAPW)
5257 if (Opcode == SystemZISD::ATOMIC_LOADW_AND ||
5258 Opcode == SystemZISD::ATOMIC_LOADW_NAND)
5263 SDVTList VTList = DAG.
getVTList(WideVT, MVT::Other);
5264 SDValue Ops[] = { ChainIn, AlignedAddr, Src2, BitShift, NegBitShift,
5284 EVT MemVT =
Node->getMemoryVT();
5285 if (MemVT == MVT::i32 || MemVT == MVT::i64) {
5287 assert(
Op.getValueType() == MemVT &&
"Mismatched VTs");
5288 assert(Subtarget.hasInterlockedAccess1() &&
5289 "Should have been expanded by AtomicExpand pass.");
5295 Node->getChain(),
Node->getBasePtr(), NegSrc2,
5296 Node->getMemOperand());
5299 return lowerATOMIC_LOAD_OP(
Op, DAG, SystemZISD::ATOMIC_LOADW_SUB);
5310 MachineMemOperand *MMO =
Node->getMemOperand();
5313 if (
Node->getMemoryVT() == MVT::i128) {
5322 EVT NarrowVT =
Node->getMemoryVT();
5323 EVT WideVT = NarrowVT == MVT::i64 ? MVT::i64 : MVT::i32;
5324 if (NarrowVT == WideVT) {
5325 SDVTList Tys = DAG.
getVTList(WideVT, MVT::i32, MVT::Other);
5326 SDValue Ops[] = { ChainIn, Addr, CmpVal, SwapVal };
5328 DL, Tys,
Ops, NarrowVT, MMO);
5342 SDValue AlignedAddr, BitShift, NegBitShift;
5346 SDVTList VTList = DAG.
getVTList(WideVT, MVT::i32, MVT::Other);
5347 SDValue Ops[] = { ChainIn, AlignedAddr, CmpVal, SwapVal, BitShift,
5350 VTList,
Ops, NarrowVT, MMO);
5364SystemZTargetLowering::getTargetMMOFlags(
const Instruction &
I)
const {
5387 auto *Regs = Subtarget.getSpecialRegisters();
5390 "in GHC calling convention");
5392 Regs->getStackPointerRegister(),
Op.getValueType());
5398 auto *Regs = Subtarget.getSpecialRegisters();
5399 bool StoreBackchain = MF.
getSubtarget<SystemZSubtarget>().hasBackChain();
5403 "in GHC calling convention");
5410 if (StoreBackchain) {
5412 Chain,
DL, Regs->getStackPointerRegister(), MVT::i64);
5413 Backchain = DAG.
getLoad(MVT::i64,
DL, Chain, getBackchainAddress(OldSP, DAG),
5414 MachinePointerInfo());
5417 Chain = DAG.
getCopyToReg(Chain,
DL, Regs->getStackPointerRegister(), NewSP);
5420 Chain = DAG.
getStore(Chain,
DL, Backchain, getBackchainAddress(NewSP, DAG),
5421 MachinePointerInfo());
5428 bool IsData =
Op.getConstantOperandVal(4);
5431 return Op.getOperand(0);
5434 bool IsWrite =
Op.getConstantOperandVal(2);
5441 Node->getMemoryVT(),
Node->getMemOperand());
5445SystemZTargetLowering::lowerINTRINSIC_W_CHAIN(
SDValue Op,
5447 unsigned Opcode, CCValid;
5449 assert(
Op->getNumValues() == 2 &&
"Expected only CC result and chain");
5460SystemZTargetLowering::lowerINTRINSIC_WO_CHAIN(
SDValue Op,
5462 unsigned Opcode, CCValid;
5465 if (
Op->getNumValues() == 1)
5467 assert(
Op->getNumValues() == 2 &&
"Expected a CC and non-CC result");
5472 unsigned Id =
Op.getConstantOperandVal(0);
5474 case Intrinsic::thread_pointer:
5475 return lowerThreadPointer(SDLoc(
Op), DAG);
5477 case Intrinsic::s390_vpdi:
5478 return DAG.
getNode(SystemZISD::PERMUTE_DWORDS, SDLoc(
Op),
Op.getValueType(),
5479 Op.getOperand(1),
Op.getOperand(2),
Op.getOperand(3));
5481 case Intrinsic::s390_vperm:
5482 return DAG.
getNode(SystemZISD::PERMUTE, SDLoc(
Op),
Op.getValueType(),
5483 Op.getOperand(1),
Op.getOperand(2),
Op.getOperand(3));
5485 case Intrinsic::s390_vuphb:
5486 case Intrinsic::s390_vuphh:
5487 case Intrinsic::s390_vuphf:
5488 case Intrinsic::s390_vuphg:
5489 return DAG.
getNode(SystemZISD::UNPACK_HIGH, SDLoc(
Op),
Op.getValueType(),
5492 case Intrinsic::s390_vuplhb:
5493 case Intrinsic::s390_vuplhh:
5494 case Intrinsic::s390_vuplhf:
5495 case Intrinsic::s390_vuplhg:
5496 return DAG.
getNode(SystemZISD::UNPACKL_HIGH, SDLoc(
Op),
Op.getValueType(),
5499 case Intrinsic::s390_vuplb:
5500 case Intrinsic::s390_vuplhw:
5501 case Intrinsic::s390_vuplf:
5502 case Intrinsic::s390_vuplg:
5503 return DAG.
getNode(SystemZISD::UNPACK_LOW, SDLoc(
Op),
Op.getValueType(),
5506 case Intrinsic::s390_vupllb:
5507 case Intrinsic::s390_vupllh:
5508 case Intrinsic::s390_vupllf:
5509 case Intrinsic::s390_vupllg:
5510 return DAG.
getNode(SystemZISD::UNPACKL_LOW, SDLoc(
Op),
Op.getValueType(),
5513 case Intrinsic::s390_vsumb:
5514 case Intrinsic::s390_vsumh:
5515 case Intrinsic::s390_vsumgh:
5516 case Intrinsic::s390_vsumgf:
5517 case Intrinsic::s390_vsumqf:
5518 case Intrinsic::s390_vsumqg:
5519 return DAG.
getNode(SystemZISD::VSUM, SDLoc(
Op),
Op.getValueType(),
5520 Op.getOperand(1),
Op.getOperand(2));
5522 case Intrinsic::s390_vaq:
5524 Op.getOperand(1),
Op.getOperand(2));
5525 case Intrinsic::s390_vaccb:
5526 case Intrinsic::s390_vacch:
5527 case Intrinsic::s390_vaccf:
5528 case Intrinsic::s390_vaccg:
5529 case Intrinsic::s390_vaccq:
5530 return DAG.
getNode(SystemZISD::VACC, SDLoc(
Op),
Op.getValueType(),
5531 Op.getOperand(1),
Op.getOperand(2));
5532 case Intrinsic::s390_vacq:
5533 return DAG.
getNode(SystemZISD::VAC, SDLoc(
Op),
Op.getValueType(),
5534 Op.getOperand(1),
Op.getOperand(2),
Op.getOperand(3));
5535 case Intrinsic::s390_vacccq:
5536 return DAG.
getNode(SystemZISD::VACCC, SDLoc(
Op),
Op.getValueType(),
5537 Op.getOperand(1),
Op.getOperand(2),
Op.getOperand(3));
5539 case Intrinsic::s390_vsq:
5541 Op.getOperand(1),
Op.getOperand(2));
5542 case Intrinsic::s390_vscbib:
5543 case Intrinsic::s390_vscbih:
5544 case Intrinsic::s390_vscbif:
5545 case Intrinsic::s390_vscbig:
5546 case Intrinsic::s390_vscbiq:
5547 return DAG.
getNode(SystemZISD::VSCBI, SDLoc(
Op),
Op.getValueType(),
5548 Op.getOperand(1),
Op.getOperand(2));
5549 case Intrinsic::s390_vsbiq:
5550 return DAG.
getNode(SystemZISD::VSBI, SDLoc(
Op),
Op.getValueType(),
5551 Op.getOperand(1),
Op.getOperand(2),
Op.getOperand(3));
5552 case Intrinsic::s390_vsbcbiq:
5553 return DAG.
getNode(SystemZISD::VSBCBI, SDLoc(
Op),
Op.getValueType(),
5554 Op.getOperand(1),
Op.getOperand(2),
Op.getOperand(3));
5556 case Intrinsic::s390_vmhb:
5557 case Intrinsic::s390_vmhh:
5558 case Intrinsic::s390_vmhf:
5559 case Intrinsic::s390_vmhg:
5560 case Intrinsic::s390_vmhq:
5562 Op.getOperand(1),
Op.getOperand(2));
5563 case Intrinsic::s390_vmlhb:
5564 case Intrinsic::s390_vmlhh:
5565 case Intrinsic::s390_vmlhf:
5566 case Intrinsic::s390_vmlhg:
5567 case Intrinsic::s390_vmlhq:
5569 Op.getOperand(1),
Op.getOperand(2));
5571 case Intrinsic::s390_vmahb:
5572 case Intrinsic::s390_vmahh:
5573 case Intrinsic::s390_vmahf:
5574 case Intrinsic::s390_vmahg:
5575 case Intrinsic::s390_vmahq:
5576 return DAG.
getNode(SystemZISD::VMAH, SDLoc(
Op),
Op.getValueType(),
5577 Op.getOperand(1),
Op.getOperand(2),
Op.getOperand(3));
5578 case Intrinsic::s390_vmalhb:
5579 case Intrinsic::s390_vmalhh:
5580 case Intrinsic::s390_vmalhf:
5581 case Intrinsic::s390_vmalhg:
5582 case Intrinsic::s390_vmalhq:
5583 return DAG.
getNode(SystemZISD::VMALH, SDLoc(
Op),
Op.getValueType(),
5584 Op.getOperand(1),
Op.getOperand(2),
Op.getOperand(3));
5586 case Intrinsic::s390_vmeb:
5587 case Intrinsic::s390_vmeh:
5588 case Intrinsic::s390_vmef:
5589 case Intrinsic::s390_vmeg:
5590 return DAG.
getNode(SystemZISD::VME, SDLoc(
Op),
Op.getValueType(),
5591 Op.getOperand(1),
Op.getOperand(2));
5592 case Intrinsic::s390_vmleb:
5593 case Intrinsic::s390_vmleh:
5594 case Intrinsic::s390_vmlef:
5595 case Intrinsic::s390_vmleg:
5596 return DAG.
getNode(SystemZISD::VMLE, SDLoc(
Op),
Op.getValueType(),
5597 Op.getOperand(1),
Op.getOperand(2));
5598 case Intrinsic::s390_vmob:
5599 case Intrinsic::s390_vmoh:
5600 case Intrinsic::s390_vmof:
5601 case Intrinsic::s390_vmog:
5602 return DAG.
getNode(SystemZISD::VMO, SDLoc(
Op),
Op.getValueType(),
5603 Op.getOperand(1),
Op.getOperand(2));
5604 case Intrinsic::s390_vmlob:
5605 case Intrinsic::s390_vmloh:
5606 case Intrinsic::s390_vmlof:
5607 case Intrinsic::s390_vmlog:
5608 return DAG.
getNode(SystemZISD::VMLO, SDLoc(
Op),
Op.getValueType(),
5609 Op.getOperand(1),
Op.getOperand(2));
5611 case Intrinsic::s390_vmaeb:
5612 case Intrinsic::s390_vmaeh:
5613 case Intrinsic::s390_vmaef:
5614 case Intrinsic::s390_vmaeg:
5616 DAG.
getNode(SystemZISD::VME, SDLoc(
Op),
Op.getValueType(),
5617 Op.getOperand(1),
Op.getOperand(2)),
5619 case Intrinsic::s390_vmaleb:
5620 case Intrinsic::s390_vmaleh:
5621 case Intrinsic::s390_vmalef:
5622 case Intrinsic::s390_vmaleg:
5624 DAG.
getNode(SystemZISD::VMLE, SDLoc(
Op),
Op.getValueType(),
5625 Op.getOperand(1),
Op.getOperand(2)),
5627 case Intrinsic::s390_vmaob:
5628 case Intrinsic::s390_vmaoh:
5629 case Intrinsic::s390_vmaof:
5630 case Intrinsic::s390_vmaog:
5632 DAG.
getNode(SystemZISD::VMO, SDLoc(
Op),
Op.getValueType(),
5633 Op.getOperand(1),
Op.getOperand(2)),
5635 case Intrinsic::s390_vmalob:
5636 case Intrinsic::s390_vmaloh:
5637 case Intrinsic::s390_vmalof:
5638 case Intrinsic::s390_vmalog:
5640 DAG.
getNode(SystemZISD::VMLO, SDLoc(
Op),
Op.getValueType(),
5641 Op.getOperand(1),
Op.getOperand(2)),
5662 { SystemZISD::MERGE_HIGH, 8,
5663 { 0, 1, 2, 3, 4, 5, 6, 7, 16, 17, 18, 19, 20, 21, 22, 23 } },
5665 { SystemZISD::MERGE_HIGH, 4,
5666 { 0, 1, 2, 3, 16, 17, 18, 19, 4, 5, 6, 7, 20, 21, 22, 23 } },
5668 { SystemZISD::MERGE_HIGH, 2,
5669 { 0, 1, 16, 17, 2, 3, 18, 19, 4, 5, 20, 21, 6, 7, 22, 23 } },
5671 { SystemZISD::MERGE_HIGH, 1,
5672 { 0, 16, 1, 17, 2, 18, 3, 19, 4, 20, 5, 21, 6, 22, 7, 23 } },
5674 { SystemZISD::MERGE_LOW, 8,
5675 { 8, 9, 10, 11, 12, 13, 14, 15, 24, 25, 26, 27, 28, 29, 30, 31 } },
5677 { SystemZISD::MERGE_LOW, 4,
5678 { 8, 9, 10, 11, 24, 25, 26, 27, 12, 13, 14, 15, 28, 29, 30, 31 } },
5680 { SystemZISD::MERGE_LOW, 2,
5681 { 8, 9, 24, 25, 10, 11, 26, 27, 12, 13, 28, 29, 14, 15, 30, 31 } },
5683 { SystemZISD::MERGE_LOW, 1,
5684 { 8, 24, 9, 25, 10, 26, 11, 27, 12, 28, 13, 29, 14, 30, 15, 31 } },
5686 { SystemZISD::PACK, 4,
5687 { 4, 5, 6, 7, 12, 13, 14, 15, 20, 21, 22, 23, 28, 29, 30, 31 } },
5689 { SystemZISD::PACK, 2,
5690 { 2, 3, 6, 7, 10, 11, 14, 15, 18, 19, 22, 23, 26, 27, 30, 31 } },
5692 { SystemZISD::PACK, 1,
5693 { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31 } },
5695 { SystemZISD::PERMUTE_DWORDS, 4,
5696 { 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 } },
5698 { SystemZISD::PERMUTE_DWORDS, 1,
5699 { 0, 1, 2, 3, 4, 5, 6, 7, 24, 25, 26, 27, 28, 29, 30, 31 } }
5713 OpNo0 = OpNo1 = OpNos[1];
5714 }
else if (OpNos[1] < 0) {
5715 OpNo0 = OpNo1 = OpNos[0];
5733 unsigned &OpNo0,
unsigned &OpNo1) {
5734 int OpNos[] = { -1, -1 };
5747 if (OpNos[ModelOpNo] == 1 - RealOpNo)
5749 OpNos[ModelOpNo] = RealOpNo;
5757 unsigned &OpNo0,
unsigned &OpNo1) {
5774 int Elt = Bytes[From];
5777 Transform[From] = -1;
5779 while (
P.Bytes[To] != Elt) {
5784 Transform[From] = To;
5808 Bytes.
resize(NumElements * BytesPerElement, -1);
5809 for (
unsigned I = 0;
I < NumElements; ++
I) {
5810 int Index = VSN->getMaskElt(
I);
5812 for (
unsigned J = 0; J < BytesPerElement; ++J)
5813 Bytes[
I * BytesPerElement + J] = Index * BytesPerElement + J;
5817 if (SystemZISD::SPLAT == ShuffleOp.
getOpcode() &&
5820 Bytes.
resize(NumElements * BytesPerElement, -1);
5821 for (
unsigned I = 0;
I < NumElements; ++
I)
5822 for (
unsigned J = 0; J < BytesPerElement; ++J)
5823 Bytes[
I * BytesPerElement + J] = Index * BytesPerElement + J;
5834 unsigned BytesPerElement,
int &
Base) {
5836 for (
unsigned I = 0;
I < BytesPerElement; ++
I) {
5837 if (Bytes[Start +
I] >= 0) {
5838 unsigned Elem = Bytes[Start +
I];
5842 if (
unsigned(
Base) % Bytes.
size() + BytesPerElement > Bytes.
size())
5844 }
else if (
unsigned(
Base) != Elem -
I)
5857 unsigned &StartIndex,
unsigned &OpNo0,
5859 int OpNos[] = { -1, -1 };
5861 for (
unsigned I = 0;
I < 16; ++
I) {
5862 int Index = Bytes[
I];
5868 Shift = ExpectedShift;
5869 else if (Shift != ExpectedShift)
5873 if (OpNos[ModelOpNo] == 1 - RealOpNo)
5875 OpNos[ModelOpNo] = RealOpNo;
5888 unsigned InBytes = (
P.Opcode == SystemZISD::PERMUTE_DWORDS ? 8 :
5889 P.Opcode == SystemZISD::PACK ?
P.Operand * 2 :
5897 if (
P.Opcode == SystemZISD::PERMUTE_DWORDS) {
5899 Op = DAG.
getNode(SystemZISD::PERMUTE_DWORDS,
DL, InVT, Op0, Op1, Op2);
5900 }
else if (
P.Opcode == SystemZISD::PACK) {
5903 Op = DAG.
getNode(SystemZISD::PACK,
DL, OutVT, Op0, Op1);
5912 N =
N->getOperand(0);
5915 return Op->getZExtValue() == 0;
5921 for (
unsigned I = 0;
I < Num ;
I++)
5933 for (
unsigned I = 0;
I < 2; ++
I)
5937 unsigned StartIndex, OpNo0, OpNo1;
5939 return DAG.
getNode(SystemZISD::SHL_DOUBLE,
DL, MVT::v16i8,
Ops[OpNo0],
5946 if (ZeroVecIdx != UINT32_MAX) {
5947 bool MaskFirst =
true;
5952 if (OpNo == ZeroVecIdx &&
I == 0) {
5957 if (OpNo != ZeroVecIdx && Byte == 0) {
5964 if (ZeroIdx != -1) {
5967 if (Bytes[
I] >= 0) {
5970 if (OpNo == ZeroVecIdx)
5982 return DAG.
getNode(SystemZISD::PERMUTE,
DL, MVT::v16i8, Mask, Src,
5985 return DAG.
getNode(SystemZISD::PERMUTE,
DL, MVT::v16i8, Src, Mask,
5997 return DAG.
getNode(SystemZISD::PERMUTE,
DL, MVT::v16i8,
Ops[0],
6003struct GeneralShuffle {
6004 GeneralShuffle(EVT vt)
6005 : VT(vt), UnpackFromEltSize(UINT_MAX), UnpackLow(
false) {}
6009 void tryPrepareForUnpack();
6010 bool unpackWasPrepared() {
return UnpackFromEltSize <= 4; }
6025 unsigned UnpackFromEltSize;
6032void GeneralShuffle::addUndef() {
6034 for (
unsigned I = 0;
I < BytesPerElement; ++
I)
6035 Bytes.push_back(-1);
6044bool GeneralShuffle::add(
SDValue Op,
unsigned Elem) {
6050 EVT FromVT =
Op.getNode() ?
Op.getValueType() : VT;
6055 if (FromBytesPerElement < BytesPerElement)
6059 (FromBytesPerElement - BytesPerElement));
6062 while (
Op.getNode()) {
6064 Op =
Op.getOperand(0);
6080 }
else if (
Op.isUndef()) {
6089 for (; OpNo <
Ops.size(); ++OpNo)
6090 if (
Ops[OpNo] ==
Op)
6092 if (OpNo ==
Ops.size())
6097 for (
unsigned I = 0;
I < BytesPerElement; ++
I)
6098 Bytes.push_back(
Base +
I);
6107 if (
Ops.size() == 0)
6111 tryPrepareForUnpack();
6114 if (
Ops.size() == 1)
6126 unsigned Stride = 1;
6127 for (; Stride * 2 <
Ops.size(); Stride *= 2) {
6128 for (
unsigned I = 0;
I <
Ops.size() - Stride;
I += Stride * 2) {
6138 else if (OpNo ==
I + Stride)
6149 if (NewBytes[J] >= 0) {
6151 "Invalid double permute");
6154 assert(NewBytesMap[J] < 0 &&
"Invalid double permute");
6160 if (NewBytes[J] >= 0)
6176 unsigned OpNo0, OpNo1;
6180 else if (
const Permute *
P =
matchPermute(Bytes, OpNo0, OpNo1))
6185 Op = insertUnpackIfPrepared(DAG,
DL,
Op);
6192 dbgs() <<
Msg.c_str() <<
" { ";
6193 for (
unsigned I = 0;
I < Bytes.
size();
I++)
6194 dbgs() << Bytes[
I] <<
" ";
6202void GeneralShuffle::tryPrepareForUnpack() {
6204 if (ZeroVecOpNo == UINT32_MAX ||
Ops.size() == 1)
6209 if (
Ops.size() > 2 &&
6214 UnpackFromEltSize = 1;
6215 for (; UnpackFromEltSize <= 4; UnpackFromEltSize *= 2) {
6216 bool MatchUnpack =
true;
6219 unsigned ToEltSize = UnpackFromEltSize * 2;
6220 bool IsZextByte = (Elt % ToEltSize) < UnpackFromEltSize;
6223 if (Bytes[Elt] != -1) {
6225 if (IsZextByte != (OpNo == ZeroVecOpNo)) {
6226 MatchUnpack =
false;
6232 if (
Ops.size() == 2) {
6234 bool CanUseUnpackLow =
true, CanUseUnpackHigh =
true;
6236 if (SrcBytes[i] == -1)
6238 if (SrcBytes[i] % 16 !=
int(i))
6239 CanUseUnpackHigh =
false;
6241 CanUseUnpackLow =
false;
6242 if (!CanUseUnpackLow && !CanUseUnpackHigh) {
6243 UnpackFromEltSize = UINT_MAX;
6247 if (!CanUseUnpackHigh)
6253 if (UnpackFromEltSize > 4)
6256 LLVM_DEBUG(
dbgs() <<
"Preparing for final unpack of element size "
6257 << UnpackFromEltSize <<
". Zero vector is Op#" << ZeroVecOpNo
6259 dumpBytes(Bytes,
"Original Bytes vector:"););
6268 Elt += UnpackFromEltSize;
6269 for (
unsigned i = 0; i < UnpackFromEltSize; i++, Elt++,
B++)
6270 Bytes[
B] = Bytes[Elt];
6278 Ops.erase(&
Ops[ZeroVecOpNo]);
6280 if (Bytes[
I] >= 0) {
6282 if (OpNo > ZeroVecOpNo)
6293 if (!unpackWasPrepared())
6295 unsigned InBits = UnpackFromEltSize * 8;
6299 unsigned OutBits = InBits * 2;
6302 return DAG.
getNode(UnpackLow ? SystemZISD::UNPACKL_LOW
6303 : SystemZISD::UNPACKL_HIGH,
6304 DL, OutVT, PackedOp);
6309 for (
unsigned I = 1,
E =
Op.getNumOperands();
I !=
E; ++
I)
6310 if (!
Op.getOperand(
I).isUndef())
6326 if (
Value.isUndef())
6338 return DAG.
getNode(SystemZISD::REPLICATE,
DL, VT, Op1);
6341 return DAG.
getNode(SystemZISD::REPLICATE,
DL, VT, Op0);
6342 return DAG.
getNode(SystemZISD::MERGE_HIGH,
DL, VT,
6363 return DAG.
getNode(SystemZISD::JOIN_DWORDS,
DL, MVT::v2i64, Op0, Op1);
6379 GeneralShuffle GS(VT);
6381 bool FoundOne =
false;
6382 for (
unsigned I = 0;
I < NumElements; ++
I) {
6385 Op =
Op.getOperand(0);
6388 unsigned Elem =
Op.getConstantOperandVal(1);
6389 if (!GS.add(
Op.getOperand(0), Elem))
6392 }
else if (
Op.isUndef()) {
6406 if (!ResidueOps.
empty()) {
6407 while (ResidueOps.
size() < NumElements)
6409 for (
auto &
Op : GS.Ops) {
6410 if (!
Op.getNode()) {
6416 return GS.getNode(DAG,
SDLoc(BVN));
6419bool SystemZTargetLowering::isVectorElementLoad(
SDValue Op)
const {
6425 if (Subtarget.hasVectorEnhancements2() &&
Op.getOpcode() == SystemZISD::LRV)
6436 "Handling full vectors only.");
6456 if (Op01.
getOpcode() == SystemZISD::REPLICATE && Op01 == Op23)
6468 unsigned int NumElements = Elems.
size();
6469 unsigned int Count = 0;
6470 for (
auto Elem : Elems) {
6471 if (!Elem.isUndef()) {
6474 else if (Elem !=
Single) {
6498 bool AllLoads =
true;
6499 for (
auto Elem : Elems)
6500 if (!isVectorElementLoad(Elem)) {
6506 if (VT == MVT::v2i64 && !AllLoads)
6510 if (VT == MVT::v2f64 && !AllLoads)
6520 if (VT == MVT::v4f32 && !AllLoads)
6524 if (VT == MVT::v8f16 && !AllLoads) {
6533 if (Op0123.
getOpcode() == SystemZISD::REPLICATE && Op0123 == Op4567)
6542 unsigned NumConstants = 0;
6543 for (
unsigned I = 0;
I < NumElements; ++
I) {
6557 if (NumConstants > 0) {
6558 for (
unsigned I = 0;
I < NumElements; ++
I)
6569 std::map<const SDNode*, unsigned> UseCounts;
6570 SDNode *LoadMaxUses =
nullptr;
6571 for (
unsigned I = 0;
I < NumElements; ++
I)
6572 if (isVectorElementLoad(Elems[
I])) {
6573 SDNode *Ld = Elems[
I].getNode();
6574 unsigned Count = ++UseCounts[Ld];
6575 if (LoadMaxUses ==
nullptr || UseCounts[LoadMaxUses] <
Count)
6578 if (LoadMaxUses !=
nullptr) {
6579 ReplicatedVal =
SDValue(LoadMaxUses, 0);
6583 unsigned I1 = NumElements / 2 - 1;
6584 unsigned I2 = NumElements - 1;
6585 bool Def1 = !Elems[
I1].isUndef();
6586 bool Def2 = !Elems[I2].isUndef();
6600 for (
unsigned I = 0;
I < NumElements; ++
I)
6601 if (!
Done[
I] && !Elems[
I].
isUndef() && Elems[
I] != ReplicatedVal)
6611 EVT VT =
Op.getValueType();
6613 if (BVN->isConstant()) {
6614 if (SystemZVectorConstantInfo(BVN).isVectorConstantLegal(Subtarget))
6632 for (
unsigned I = 0;
I < NumElements; ++
I)
6634 return buildVector(DAG,
DL, VT,
Ops);
6641 EVT VT =
Op.getValueType();
6644 if (VSN->isSplat()) {
6646 unsigned Index = VSN->getSplatIndex();
6648 "Splat index should be defined and in first operand");
6654 return DAG.
getNode(SystemZISD::SPLAT,
DL, VT,
Op.getOperand(0),
6658 GeneralShuffle
GS(VT);
6659 for (
unsigned I = 0;
I < NumElements; ++
I) {
6660 int Elt = VSN->getMaskElt(
I);
6663 else if (!
GS.add(
Op.getOperand(
unsigned(Elt) / NumElements),
6664 unsigned(Elt) % NumElements))
6667 return GS.getNode(DAG, SDLoc(VSN));
6682 assert(
Op.getSimpleValueType() == MVT::i64 &&
6683 "Expexted to convert i64 to f16.");
6695 assert(
Op.getSimpleValueType() == MVT::f16 &&
6696 "Expected to convert f16 to i64.");
6713 EVT VT =
Op.getValueType();
6718 if (VT == MVT::v2f64 &&
6742SystemZTargetLowering::lowerEXTRACT_VECTOR_ELT(
SDValue Op,
6748 EVT VT =
Op.getValueType();
6762 MVT ExtrVT = IntVT == MVT::i16 ? MVT::i32 : IntVT;
6770SDValue SystemZTargetLowering::
6773 EVT OutVT =
Op.getValueType();
6777 unsigned StartOffset = 0;
6784 ArrayRef<int> ShuffleMask = SVN->
getMask();
6789 if (ToBits == 64 && OutNumElts == 2) {
6790 int NumElem = ToBits / FromBits;
6791 if (ShuffleMask[0] == NumElem - 1 && ShuffleMask[1] == 2 * NumElem - 1)
6797 int StartOffsetCandidate = -1;
6798 for (
int Elt = 0; Elt < OutNumElts; Elt++) {
6799 if (ShuffleMask[Elt] == -1)
6801 if (ShuffleMask[Elt] % OutNumElts == Elt) {
6802 if (StartOffsetCandidate == -1)
6803 StartOffsetCandidate = ShuffleMask[Elt] - Elt;
6804 if (StartOffsetCandidate == ShuffleMask[Elt] - Elt)
6807 StartOffsetCandidate = -1;
6810 if (StartOffsetCandidate != -1) {
6811 StartOffset = StartOffsetCandidate;
6820 unsigned Opcode = SystemZISD::UNPACK_HIGH;
6821 if (StartOffset >= OutNumElts) {
6822 Opcode = SystemZISD::UNPACK_LOW;
6823 StartOffset -= OutNumElts;
6825 PackedOp = DAG.
getNode(Opcode, SDLoc(PackedOp), OutVT, PackedOp);
6826 }
while (FromBits != ToBits);
6831SDValue SystemZTargetLowering::
6835 EVT OutVT =
Op.getValueType();
6839 unsigned NumInPerOut = InNumElts / OutNumElts;
6844 SmallVector<int, 16>
Mask(InNumElts);
6845 unsigned ZeroVecElt = InNumElts;
6846 for (
unsigned PackedElt = 0; PackedElt < OutNumElts; PackedElt++) {
6847 unsigned MaskElt = PackedElt * NumInPerOut;
6848 unsigned End = MaskElt + NumInPerOut - 1;
6849 for (; MaskElt < End; MaskElt++)
6850 Mask[MaskElt] = ZeroVecElt++;
6851 Mask[MaskElt] = PackedElt;
6858 unsigned ByScalar)
const {
6863 EVT VT =
Op.getValueType();
6868 APInt SplatBits, SplatUndef;
6869 unsigned SplatBitSize;
6873 if (BVN->isConstantSplat(SplatBits, SplatUndef, SplatBitSize, HasAnyUndefs,
6874 ElemBitSize,
true) &&
6875 SplatBitSize == ElemBitSize) {
6878 return DAG.
getNode(ByScalar,
DL, VT, Op0, Shift);
6881 BitVector UndefElements;
6887 return DAG.
getNode(ByScalar,
DL, VT, Op0, Shift);
6894 if (VSN->isSplat()) {
6895 SDValue VSNOp0 = VSN->getOperand(0);
6896 unsigned Index = VSN->getSplatIndex();
6898 "Splat index should be defined and in first operand");
6905 return DAG.
getNode(ByScalar,
DL, VT, Op0, Shift);
6923 uint64_t ShiftAmt = ShiftAmtNode->getZExtValue() & 127;
6924 if ((ShiftAmt & 7) == 0 || Subtarget.hasVectorEnhancements2()) {
6927 if (ShiftAmt > 120) {
6931 DAG.
getNode(SystemZISD::SHR_DOUBLE_BIT,
DL, MVT::v16i8, Op0, Op1,
6935 SmallVector<int, 16>
Mask(16);
6936 for (
unsigned Elt = 0; Elt < 16; Elt++)
6937 Mask[Elt] = (ShiftAmt >> 3) + Elt;
6939 if ((ShiftAmt & 7) == 0)
6943 DAG.
getNode(SystemZISD::SHL_DOUBLE_BIT,
DL, MVT::v16i8, Shuf1, Shuf2,
6961 uint64_t ShiftAmt = ShiftAmtNode->getZExtValue() & 127;
6962 if ((ShiftAmt & 7) == 0 || Subtarget.hasVectorEnhancements2()) {
6965 if (ShiftAmt > 120) {
6969 DAG.
getNode(SystemZISD::SHL_DOUBLE_BIT,
DL, MVT::v16i8, Op0, Op1,
6973 SmallVector<int, 16>
Mask(16);
6974 for (
unsigned Elt = 0; Elt < 16; Elt++)
6975 Mask[Elt] = 16 - (ShiftAmt >> 3) + Elt;
6977 if ((ShiftAmt & 7) == 0)
6981 DAG.
getNode(SystemZISD::SHR_DOUBLE_BIT,
DL, MVT::v16i8, Shuf2, Shuf1,
6993 MVT DstVT =
Op.getSimpleValueType();
6996 unsigned SrcAS =
N->getSrcAddressSpace();
6998 assert(SrcAS !=
N->getDestAddressSpace() &&
6999 "addrspacecast must be between different address spaces");
7007 }
else if (DstVT == MVT::i32) {
7021 if (
In.getSimpleValueType() != MVT::f16)
7028 SDValue Chain,
bool IsStrict)
const {
7029 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unexpected request for libcall!");
7032 std::tie(Result, Chain) =
7041 bool IsStrict =
Op->isStrictFPOpcode();
7043 MVT VT =
Op.getSimpleValueType();
7044 SDValue InOp =
Op.getOperand(IsStrict ? 1 : 0);
7052 if (!Subtarget.hasFPExtension() && !IsSigned)
7063 if (VT == MVT::i128) {
7066 return useLibCall(DAG, LC, VT, InOp,
DL, Chain, IsStrict);
7076 bool IsStrict =
Op->isStrictFPOpcode();
7078 MVT VT =
Op.getSimpleValueType();
7079 SDValue InOp =
Op.getOperand(IsStrict ? 1 : 0);
7084 if (VT == MVT::f16) {
7091 if (!Subtarget.hasFPExtension() && !IsSigned)
7094 if (InVT == MVT::i128) {
7097 return useLibCall(DAG, LC, VT, InOp,
DL, Chain, IsStrict);
7106 EVT RegVT =
Op.getValueType();
7107 assert(RegVT == MVT::f16 &&
"Expected to lower an f16 load.");
7114 assert(EVT(RegVT) == AtomicLd->getMemoryVT() &&
"Unhandled f16 load");
7116 AtomicLd->getChain(), AtomicLd->getBasePtr(),
7117 AtomicLd->getMemOperand());
7137 Shft, AtomicSt->getBasePtr(),
7138 AtomicSt->getMemOperand());
7148 MVT ResultVT =
Op.getSimpleValueType();
7150 unsigned Check =
Op.getConstantOperandVal(1);
7152 unsigned TDCMask = 0;
7187 MachinePointerInfo MPI =
7193 SystemZISD::STCKF,
DL, DAG.
getVTList(MVT::Other), StoreOps, MVT::i64,
7197 return DAG.
getLoad(MVT::i64,
DL, Chain, StackPtr, MPI);
7202 switch (
Op.getOpcode()) {
7204 return lowerFRAMEADDR(
Op, DAG);
7206 return lowerRETURNADDR(
Op, DAG);
7208 return lowerBR_CC(
Op, DAG);
7210 return lowerSELECT_CC(
Op, DAG);
7212 return lowerSETCC(
Op, DAG);
7214 return lowerSTRICT_FSETCC(
Op, DAG,
false);
7216 return lowerSTRICT_FSETCC(
Op, DAG,
true);
7228 return lowerBITCAST(
Op, DAG);
7230 return lowerVASTART(
Op, DAG);
7232 return lowerVACOPY(
Op, DAG);
7234 return lowerDYNAMIC_STACKALLOC(
Op, DAG);
7236 return lowerGET_DYNAMIC_AREA_OFFSET(
Op, DAG);
7238 return lowerMULH(
Op, DAG, SystemZISD::SMUL_LOHI);
7240 return lowerMULH(
Op, DAG, SystemZISD::UMUL_LOHI);
7242 return lowerSMUL_LOHI(
Op, DAG);
7244 return lowerUMUL_LOHI(
Op, DAG);
7246 return lowerSDIVREM(
Op, DAG);
7248 return lowerUDIVREM(
Op, DAG);
7253 return lowerXALUO(
Op, DAG);
7256 return lowerUADDSUBO_CARRY(
Op, DAG);
7258 return lowerOR(
Op, DAG);
7260 return lowerCTPOP(
Op, DAG);
7262 return lowerVECREDUCE_ADD(
Op, DAG);
7264 return lowerATOMIC_FENCE(
Op, DAG);
7266 return lowerATOMIC_LOAD_OP(
Op, DAG, SystemZISD::ATOMIC_SWAPW);
7268 return lowerATOMIC_STORE(
Op, DAG);
7270 return lowerATOMIC_LOAD(
Op, DAG);
7272 return lowerATOMIC_LOAD_OP(
Op, DAG, SystemZISD::ATOMIC_LOADW_ADD);
7274 return lowerATOMIC_LOAD_SUB(
Op, DAG);
7276 return lowerATOMIC_LOAD_OP(
Op, DAG, SystemZISD::ATOMIC_LOADW_AND);
7278 return lowerATOMIC_LOAD_OP(
Op, DAG, SystemZISD::ATOMIC_LOADW_OR);
7280 return lowerATOMIC_LOAD_OP(
Op, DAG, SystemZISD::ATOMIC_LOADW_XOR);
7282 return lowerATOMIC_LOAD_OP(
Op, DAG, SystemZISD::ATOMIC_LOADW_NAND);
7284 return lowerATOMIC_LOAD_OP(
Op, DAG, SystemZISD::ATOMIC_LOADW_MIN);
7286 return lowerATOMIC_LOAD_OP(
Op, DAG, SystemZISD::ATOMIC_LOADW_MAX);
7288 return lowerATOMIC_LOAD_OP(
Op, DAG, SystemZISD::ATOMIC_LOADW_UMIN);
7290 return lowerATOMIC_LOAD_OP(
Op, DAG, SystemZISD::ATOMIC_LOADW_UMAX);
7292 return lowerATOMIC_CMP_SWAP(
Op, DAG);
7294 return lowerSTACKSAVE(
Op, DAG);
7296 return lowerSTACKRESTORE(
Op, DAG);
7298 return lowerPREFETCH(
Op, DAG);
7300 return lowerINTRINSIC_W_CHAIN(
Op, DAG);
7302 return lowerINTRINSIC_WO_CHAIN(
Op, DAG);
7304 return lowerBUILD_VECTOR(
Op, DAG);
7306 return lowerVECTOR_SHUFFLE(
Op, DAG);
7308 return lowerSCALAR_TO_VECTOR(
Op, DAG);
7310 return lowerINSERT_VECTOR_ELT(
Op, DAG);
7312 return lowerEXTRACT_VECTOR_ELT(
Op, DAG);
7314 return lowerSIGN_EXTEND_VECTOR_INREG(
Op, DAG);
7316 return lowerZERO_EXTEND_VECTOR_INREG(
Op, DAG);
7318 return lowerShift(
Op, DAG, SystemZISD::VSHL_BY_SCALAR);
7320 return lowerShift(
Op, DAG, SystemZISD::VSRL_BY_SCALAR);
7322 return lowerShift(
Op, DAG, SystemZISD::VSRA_BY_SCALAR);
7326 return lowerShift(
Op, DAG, SystemZISD::VROTL_BY_SCALAR);
7328 return lowerFSHL(
Op, DAG);
7330 return lowerFSHR(
Op, DAG);
7333 return lowerFP_EXTEND(
Op, DAG);
7338 return lower_FP_TO_INT(
Op, DAG);
7343 return lower_INT_TO_FP(
Op, DAG);
7345 return lowerLoadF16(
Op, DAG);
7347 return lowerStoreF16(
Op, DAG);
7349 return lowerIS_FPCLASS(
Op, DAG);
7351 return lowerGET_ROUNDING(
Op, DAG);
7353 return lowerREADCYCLECOUNTER(
Op, DAG);
7375 &SystemZ::FP128BitRegClass);
7384 SystemZ::REG_SEQUENCE, SL, MVT::f128,
7399 &SystemZ::FP128BitRegClass);
7416 switch (
N->getOpcode()) {
7420 SDValue Ops[] = {
N->getOperand(0),
N->getOperand(1) };
7423 DL, Tys,
Ops, MVT::i128, MMO);
7426 if (
N->getValueType(0) == MVT::f128)
7440 SDValue Ops[] = {
N->getOperand(0), Val,
N->getOperand(2)};
7443 DL, Tys,
Ops, MVT::i128, MMO);
7449 MVT::Other, Res), 0);
7461 DL, Tys,
Ops, MVT::i128, MMO);
7475 EVT SrcVT = Src.getValueType();
7476 EVT ResVT =
N->getValueType(0);
7477 if (ResVT == MVT::i128 && SrcVT == MVT::f128)
7479 else if (SrcVT == MVT::i16 && ResVT == MVT::f16) {
7480 if (Subtarget.hasVector()) {
7488 }
else if (SrcVT == MVT::f16 && ResVT == MVT::i16) {
7490 Subtarget.hasVector()
7504 bool IsStrict =
N->isStrictFPOpcode();
7506 SDValue InOp =
N->getOperand(IsStrict ? 1 : 0);
7507 EVT ResVT =
N->getValueType(0);
7509 if (ResVT == MVT::f16) {
7532 bool IsStrict =
N->isStrictFPOpcode();
7534 EVT ResVT =
N->getValueType(0);
7535 SDValue InOp =
N->getOperand(IsStrict ? 1 : 0);
7538 if (InVT == MVT::f16) {
7544 std::tie(InF32, Chain) =
7569bool SystemZTargetLowering::canTreatAsByteVector(
EVT VT)
const {
7570 if (!Subtarget.hasVector())
7584 DAGCombinerInfo &DCI,
7592 unsigned Opcode =
Op.getOpcode();
7595 Op =
Op.getOperand(0);
7597 canTreatAsByteVector(
Op.getValueType())) {
7606 BytesPerElement,
First))
7613 if (Byte % BytesPerElement != 0)
7616 Index = Byte / BytesPerElement;
7620 canTreatAsByteVector(
Op.getValueType())) {
7623 EVT OpVT =
Op.getValueType();
7625 if (OpBytesPerElement < BytesPerElement)
7629 unsigned End = (
Index + 1) * BytesPerElement;
7630 if (End % OpBytesPerElement != 0)
7633 Op =
Op.getOperand(End / OpBytesPerElement - 1);
7637 if (!
Op.getValueType().isInteger()) {
7642 DCI.AddToWorklist(
Op.getNode());
7645 if (ResIntVT != ResVT) {
7646 DCI.AddToWorklist(
Op.getNode());
7653 canTreatAsByteVector(
Op.getValueType()) &&
7654 canTreatAsByteVector(
Op.getOperand(0).getValueType())) {
7656 EVT ExtVT =
Op.getValueType();
7657 EVT OpVT =
Op.getOperand(0).getValueType();
7660 unsigned Byte =
Index * BytesPerElement;
7661 unsigned SubByte =
Byte % ExtBytesPerElement;
7662 unsigned MinSubByte = ExtBytesPerElement - OpBytesPerElement;
7663 if (SubByte < MinSubByte ||
7664 SubByte + BytesPerElement > ExtBytesPerElement)
7667 Byte =
Byte / ExtBytesPerElement * OpBytesPerElement;
7669 Byte += SubByte - MinSubByte;
7670 if (Byte % BytesPerElement != 0)
7672 Op =
Op.getOperand(0);
7679 if (
Op.getValueType() != VecVT) {
7681 DCI.AddToWorklist(
Op.getNode());
7691SDValue SystemZTargetLowering::combineTruncateExtract(
7700 if (canTreatAsByteVector(VecVT)) {
7704 if (BytesPerElement % TruncBytes == 0) {
7710 unsigned Scale = BytesPerElement / TruncBytes;
7711 unsigned NewIndex = (IndexN->getZExtValue() + 1) * Scale - 1;
7718 EVT ResVT = (TruncBytes < 4 ? MVT::i32 : TruncVT);
7719 return combineExtract(
DL, ResVT, VecVT, Vec, NewIndex, DCI,
true);
7727SDValue SystemZTargetLowering::combineZERO_EXTEND(
7728 SDNode *
N, DAGCombinerInfo &DCI)
const {
7730 SelectionDAG &DAG = DCI.DAG;
7732 EVT VT =
N->getValueType(0);
7733 if (N0.
getOpcode() == SystemZISD::SELECT_CCMASK) {
7736 if (TrueOp && FalseOp) {
7746 DCI.CombineTo(N0.
getNode(), TruncSelect);
7789 return DAG.
getNode(SystemZISD::VSCBI, SDLoc(N0), VT, Op0, Op1);
7807SDValue SystemZTargetLowering::combineSIGN_EXTEND_INREG(
7808 SDNode *
N, DAGCombinerInfo &DCI)
const {
7812 SelectionDAG &DAG = DCI.DAG;
7814 EVT VT =
N->getValueType(0);
7828SDValue SystemZTargetLowering::combineSIGN_EXTEND(
7829 SDNode *
N, DAGCombinerInfo &DCI)
const {
7833 SelectionDAG &DAG = DCI.DAG;
7835 EVT VT =
N->getValueType(0);
7842 unsigned NewShlAmt = ShlAmt->getZExtValue() + Extra;
7843 unsigned NewSraAmt = SraAmt->getZExtValue() + Extra;
7859SDValue SystemZTargetLowering::combineMERGE(
7860 SDNode *
N, DAGCombinerInfo &DCI)
const {
7861 SelectionDAG &DAG = DCI.DAG;
7862 unsigned Opcode =
N->getOpcode();
7870 if (Op1 ==
N->getOperand(0))
7875 if (ElemBytes <= 4) {
7876 Opcode = (Opcode == SystemZISD::MERGE_HIGH ?
7877 SystemZISD::UNPACKL_HIGH : SystemZISD::UNPACKL_LOW);
7883 DCI.AddToWorklist(Op1.
getNode());
7886 DCI.AddToWorklist(
Op.getNode());
7895 LoPart = HiPart =
nullptr;
7900 if (
Use.getResNo() != 0)
7905 bool IsLoPart =
true;
7930 LoPart = HiPart =
nullptr;
7935 if (
Use.getResNo() != 0)
7941 User->getMachineOpcode() != TargetOpcode::EXTRACT_SUBREG)
7944 switch (
User->getConstantOperandVal(1)) {
7945 case SystemZ::subreg_l64:
7950 case SystemZ::subreg_h64:
7962SDValue SystemZTargetLowering::combineLOAD(
7963 SDNode *
N, DAGCombinerInfo &DCI)
const {
7964 SelectionDAG &DAG = DCI.DAG;
7965 EVT LdVT =
N->getValueType(0);
7969 MVT LoadNodeVT = LN->getBasePtr().getSimpleValueType();
7970 if (PtrVT != LoadNodeVT) {
7974 return DAG.
getExtLoad(LN->getExtensionType(),
DL, LN->getValueType(0),
7975 LN->getChain(), AddrSpaceCast, LN->getMemoryVT(),
7976 LN->getMemOperand());
7986 SDNode *LoPart, *HiPart;
7994 LD->getPointerInfo(),
LD->getBaseAlign(),
7995 LD->getMemOperand()->getFlags(),
LD->getAAInfo());
7997 DCI.CombineTo(HiPart, EltLoad,
true);
8004 LD->getPointerInfo().getWithOffset(8),
LD->getBaseAlign(),
8005 LD->getMemOperand()->getFlags(),
LD->getAAInfo());
8007 DCI.CombineTo(LoPart, EltLoad,
true);
8014 DCI.AddToWorklist(Chain.
getNode());
8029 for (SDUse &Use :
N->uses()) {
8030 if (
Use.getUser()->getOpcode() == SystemZISD::REPLICATE) {
8034 }
else if (
Use.getResNo() == 0)
8037 if (!Replicate || OtherUses.
empty())
8043 for (SDNode *U : OtherUses) {
8046 Ops.push_back((
Op.getNode() ==
N &&
Op.getResNo() == 0) ? Extract0 :
Op);
8052bool SystemZTargetLowering::canLoadStoreByteSwapped(
EVT VT)
const {
8053 if (VT == MVT::i16 || VT == MVT::i32 || VT == MVT::i64)
8055 if (Subtarget.hasVectorEnhancements2())
8056 if (VT == MVT::v8i16 || VT == MVT::v4i32 || VT == MVT::v2i64 || VT == MVT::i128)
8068 for (
unsigned i = 0; i < NumElts; ++i) {
8069 if (M[i] < 0)
continue;
8070 if ((
unsigned) M[i] != NumElts - 1 - i)
8078 for (
auto *U : StoredVal->
users()) {
8080 EVT CurrMemVT = ST->getMemoryVT().getScalarType();