32#define DEBUG_TYPE "legalize-types"
42void DAGTypeLegalizer::PromoteIntegerResult(
SDNode *
N,
unsigned ResNo) {
47 if (CustomLowerNode(
N,
N->getValueType(ResNo),
true)) {
52 switch (
N->getOpcode()) {
55 dbgs() <<
"PromoteIntegerResult #" << ResNo <<
": ";
56 N->dump(&DAG);
dbgs() <<
"\n";
63 case ISD::VP_BITREVERSE:
66 case ISD::BSWAP: Res = PromoteIntRes_BSWAP(
N);
break;
69 case ISD::VP_CTLZ_ZERO_UNDEF:
72 case ISD::CTLZ: Res = PromoteIntRes_CTLZ(
N);
break;
73 case ISD::CTLS: Res = PromoteIntRes_CTLS(
N);
break;
76 case ISD::CTPOP: Res = PromoteIntRes_CTPOP_PARITY(
N);
break;
77 case ISD::VP_CTTZ_ZERO_UNDEF:
80 case ISD::CTTZ: Res = PromoteIntRes_CTTZ(
N);
break;
81 case ISD::VP_CTTZ_ELTS_ZERO_UNDEF:
82 case ISD::VP_CTTZ_ELTS:
83 Res = PromoteIntRes_VP_CttzElements(
N);
86 Res = PromoteIntRes_EXTRACT_VECTOR_ELT(
N);
break;
96 Res = PromoteIntRes_VECTOR_COMPRESS(
N);
102 Res = PromoteIntRes_Select(
N);
107 case ISD::SETCC: Res = PromoteIntRes_SETCC(
N);
break;
109 case ISD::SMAX: Res = PromoteIntRes_SExtIntBinOp(
N);
break;
111 case ISD::UMAX: Res = PromoteIntRes_UMINUMAX(
N);
break;
114 case ISD::VP_SHL: Res = PromoteIntRes_SHL(
N);
break;
116 Res = PromoteIntRes_SIGN_EXTEND_INREG(
N);
break;
118 case ISD::VP_SRA: Res = PromoteIntRes_SRA(
N);
break;
120 case ISD::VP_SRL: Res = PromoteIntRes_SRL(
N);
break;
121 case ISD::VP_TRUNCATE:
124 case ISD::UNDEF: Res = PromoteIntRes_UNDEF(
N);
break;
125 case ISD::VAARG: Res = PromoteIntRes_VAARG(
N);
break;
129 Res = PromoteIntRes_EXTRACT_SUBVECTOR(
N);
break;
131 Res = PromoteIntRes_INSERT_SUBVECTOR(
N);
break;
133 Res = PromoteIntRes_VECTOR_REVERSE(
N);
break;
135 Res = PromoteIntRes_VECTOR_SHUFFLE(
N);
break;
138 Res = PromoteIntRes_VECTOR_SPLICE(
N);
142 Res = PromoteIntRes_VECTOR_INTERLEAVE_DEINTERLEAVE(
N);
145 Res = PromoteIntRes_INSERT_VECTOR_ELT(
N);
break;
147 Res = PromoteIntRes_BUILD_VECTOR(
N);
151 Res = PromoteIntRes_ScalarOp(
N);
155 Res = PromoteIntRes_CONCAT_VECTORS(
N);
break;
160 Res = PromoteIntRes_EXTEND_VECTOR_INREG(
N);
break;
163 Res = PromoteIntRes_VECTOR_FIND_LAST_ACTIVE(
N);
167 Res = PromoteIntRes_GET_ACTIVE_LANE_MASK(
N);
173 Res = PromoteIntRes_PARTIAL_REDUCE_MLA(
N);
177 case ISD::VP_SIGN_EXTEND:
179 case ISD::VP_ZERO_EXTEND:
182 case ISD::VP_FP_TO_SINT:
183 case ISD::VP_FP_TO_UINT:
191 Res = PromoteIntRes_FP_TO_XINT_SAT(
N);
break;
195 Res = PromoteIntRes_FP_TO_FP16_BF16(
N);
199 Res = PromoteIntRes_STRICT_FP_TO_FP16_BF16(
N);
214 case ISD::VP_MUL: Res = PromoteIntRes_SimpleIntBinOp(
N);
break;
224 case ISD::VP_SREM: Res = PromoteIntRes_SExtIntBinOp(
N);
break;
234 case ISD::VP_UREM: Res = PromoteIntRes_ZExtIntBinOp(
N);
break;
237 case ISD::SSUBO: Res = PromoteIntRes_SADDSUBO(
N, ResNo);
break;
239 case ISD::USUBO: Res = PromoteIntRes_UADDSUBO(
N, ResNo);
break;
241 case ISD::UMULO: Res = PromoteIntRes_XMULO(
N, ResNo);
break;
257 Res = PromoteIntRes_ADDSUBSHLSAT<EmptyMatchContext>(
N);
259 case ISD::VP_SADDSAT:
260 case ISD::VP_UADDSAT:
261 case ISD::VP_SSUBSAT:
262 case ISD::VP_USUBSAT:
263 Res = PromoteIntRes_ADDSUBSHLSAT<VPMatchContext>(
N);
268 Res = PromoteIntRes_CMP(
N);
281 case ISD::ABS: Res = PromoteIntRes_ABS(
N);
break;
314 Res = PromoteIntRes_VECREDUCE(
N);
317 case ISD::VP_REDUCE_ADD:
318 case ISD::VP_REDUCE_MUL:
319 case ISD::VP_REDUCE_AND:
320 case ISD::VP_REDUCE_OR:
321 case ISD::VP_REDUCE_XOR:
322 case ISD::VP_REDUCE_SMAX:
323 case ISD::VP_REDUCE_SMIN:
324 case ISD::VP_REDUCE_UMAX:
325 case ISD::VP_REDUCE_UMIN:
326 Res = PromoteIntRes_VP_REDUCE(
N);
331 Res = PromoteIntRes_LOOP_DEPENDENCE_MASK(
N);
335 Res = PromoteIntRes_FREEZE(
N);
340 Res = PromoteIntRes_Rotate(
N);
345 Res = PromoteIntRes_FunnelShift(
N);
350 Res = PromoteIntRes_VPFunnelShift(
N);
356 Res = PromoteIntRes_CLMUL(
N);
360 Res = PromoteIntRes_IS_FPCLASS(
N);
363 Res = PromoteIntRes_FFREXP(
N);
368 Res = PromoteIntRes_XRINT(
N);
372 Res = PromoteIntRes_PATCHPOINT(
N);
375 Res = PromoteIntRes_READ_REGISTER(
N);
381 SetPromotedInteger(
SDValue(
N, ResNo), Res);
386 SDValue Op = DisintegrateMERGE_VALUES(
N, ResNo);
387 return GetPromotedInteger(
Op);
390SDValue DAGTypeLegalizer::PromoteIntRes_LOOP_DEPENDENCE_MASK(
SDNode *
N) {
392 EVT NewVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
393 return DAG.getNode(
N->getOpcode(), SDLoc(
N), NewVT,
N->ops());
398 SDValue Op = SExtPromotedInteger(
N->getOperand(0));
400 Op.getValueType(),
Op,
N->getOperand(1));
405 SDValue Op = ZExtPromotedInteger(
N->getOperand(0));
407 Op.getValueType(),
Op,
N->getOperand(1));
411 EVT ResVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
414 switch (TLI.getExtendForAtomicOps()) {
430 DAG.getAtomicLoad(ExtType, SDLoc(
N),
N->getMemoryVT(), ResVT,
431 N->getChain(),
N->getBasePtr(),
N->getMemOperand());
441 switch (TLI.getExtendForAtomicRMWArg(
N->getOpcode())) {
443 Op2 = SExtPromotedInteger(Op2);
446 Op2 = ZExtPromotedInteger(Op2);
449 Op2 = GetPromotedInteger(Op2);
454 SDValue Res = DAG.getAtomic(
N->getOpcode(), SDLoc(
N),
456 N->getChain(),
N->getBasePtr(),
457 Op2,
N->getMemOperand());
468 EVT SVT = getSetCCResultType(
N->getOperand(2).getValueType());
469 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(1));
473 if (!TLI.isTypeLegal(SVT))
476 SDVTList VTs = DAG.getVTList(
N->getValueType(0), SVT, MVT::Other);
477 SDValue Res = DAG.getAtomicCmpSwap(
479 N->getChain(),
N->getBasePtr(),
N->getOperand(2),
N->getOperand(3),
483 return DAG.getSExtOrTrunc(Res.
getValue(1), SDLoc(
N), NVT);
489 SDValue Op3 = GetPromotedInteger(
N->getOperand(3));
490 switch (TLI.getExtendForAtomicCmpSwapArg()) {
492 Op2 = SExtPromotedInteger(Op2);
495 Op2 = ZExtPromotedInteger(Op2);
498 Op2 = GetPromotedInteger(Op2);
505 DAG.getVTList(Op2.
getValueType(),
N->getValueType(1), MVT::Other);
506 SDValue Res = DAG.getAtomicCmpSwap(
507 N->getOpcode(), SDLoc(
N),
N->getMemoryVT(), VTs,
N->getChain(),
508 N->getBasePtr(), Op2, Op3,
N->getMemOperand());
510 for (
unsigned i = 1, NumResults =
N->getNumValues(); i < NumResults; ++i)
518 EVT NInVT = TLI.getTypeToTransformTo(*DAG.getContext(), InVT);
519 EVT OutVT =
N->getValueType(0);
520 EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT);
523 switch (getTypeAction(InVT)) {
529 return DAG.getNode(
ISD::BITCAST, dl, NOutVT, GetPromotedInteger(InOp));
533 return DAG.getNode(
ISD::ANY_EXTEND, dl, NOutVT, GetSoftenedFloat(InOp));
536 return DAG.getNode(
ISD::ANY_EXTEND, dl, NOutVT, GetSoftPromotedHalf(InOp));
544 BitConvertToInteger(GetScalarizedVector(InOp)));
553 GetSplitVector(
N->getOperand(0),
Lo,
Hi);
554 Lo = BitConvertToInteger(
Lo);
555 Hi = BitConvertToInteger(
Hi);
557 if (DAG.getDataLayout().isBigEndian())
563 JoinIntegers(
Lo,
Hi));
578 if (DAG.getDataLayout().isBigEndian()) {
582 DAG.getShiftAmountConstant(ShiftAmt, NOutVT, dl));
597 if (isTypeLegal(WideOutVT)) {
598 InOp = DAG.getBitcast(WideOutVT, GetWidenedVector(InOp));
600 DAG.getVectorIdxConstant(0, dl));
609 DAG.getDataLayout().isLittleEndian()) {
620 if (isTypeLegal(WideVecVT)) {
622 DAG.getUNDEF(WideVecVT), InOp,
623 DAG.getVectorIdxConstant(0, dl));
631 CreateStackStoreLoad(InOp, OutVT));
635 SDValue V = GetPromotedInteger(
N->getOperand(0));
637 V.getValueType(), V);
641 SDValue Op = GetPromotedInteger(
N->getOperand(0));
642 EVT OVT =
N->getValueType(0);
643 EVT NVT =
Op.getValueType();
651 !TLI.isOperationLegalOrCustomOrPromote(
ISD::BSWAP, NVT)) {
652 if (
SDValue Res = TLI.expandBSWAP(
N, DAG))
657 SDValue ShAmt = DAG.getShiftAmountConstant(DiffBits, NVT, dl);
663 return DAG.getNode(ISD::VP_SRL, dl, NVT,
664 DAG.getNode(ISD::VP_BSWAP, dl, NVT,
Op, Mask, EVL), ShAmt,
669 SDValue Op = GetPromotedInteger(
N->getOperand(0));
670 EVT OVT =
N->getValueType(0);
671 EVT NVT =
Op.getValueType();
680 if (
SDValue Res = TLI.expandBITREVERSE(
N, DAG))
685 SDValue ShAmt = DAG.getShiftAmountConstant(DiffBits, NVT, dl);
691 return DAG.
getNode(ISD::VP_SRL, dl, NVT,
692 DAG.getNode(ISD::VP_BITREVERSE, dl, NVT,
Op, Mask, EVL),
700 TLI.getTypeToTransformTo(*DAG.getContext(),
701 N->getValueType(0)), JoinIntegers(
N->getOperand(0),
706 EVT VT =
N->getValueType(0);
713 TLI.getTypeToTransformTo(*DAG.getContext(), VT),
720 EVT OVT =
N->getValueType(0);
721 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), OVT);
727 if (!OVT.
isVector() && TLI.isTypeLegal(NVT) &&
728 !TLI.isOperationLegalOrCustomOrPromote(
ISD::CTLZ, NVT) &&
730 if (
SDValue Result = TLI.expandCTLZ(
N, DAG)) {
736 unsigned CtlzOpcode =
N->getOpcode();
737 if (CtlzOpcode ==
ISD::CTLZ || CtlzOpcode == ISD::VP_CTLZ) {
739 SDValue ExtractLeadingBits = DAG.getConstant(
742 if (!
N->isVPOpcode()) {
744 SDValue Op = ZExtPromotedInteger(
N->getOperand(0));
745 return DAG.getNode(
ISD::SUB, dl, NVT,
746 DAG.getNode(
N->getOpcode(), dl, NVT,
Op),
752 SDValue Op = VPZExtPromotedInteger(
N->getOperand(0), Mask, EVL);
753 return DAG.getNode(ISD::VP_SUB, dl, NVT,
754 DAG.getNode(
N->getOpcode(), dl, NVT,
Op, Mask, EVL),
755 ExtractLeadingBits, Mask, EVL);
758 CtlzOpcode == ISD::VP_CTLZ_ZERO_UNDEF) {
760 SDValue Op = GetPromotedInteger(
N->getOperand(0));
764 DAG.getShiftAmountConstant(SHLAmount,
Op.getValueType(), dl);
765 if (!
N->isVPOpcode()) {
767 return DAG.getNode(CtlzOpcode, dl, NVT,
Op);
772 Op = DAG.getNode(ISD::VP_SHL, dl, NVT,
Op, ShiftConst, Mask, EVL);
773 return DAG.getNode(CtlzOpcode, dl, NVT,
Op, Mask, EVL);
779 EVT OVT =
N->getValueType(0);
780 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), OVT);
783 SDValue ExtractLeadingBits = DAG.getConstant(
786 SDValue Op = SExtPromotedInteger(
N->getOperand(0));
792 EVT OVT =
N->getValueType(0);
793 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), OVT);
801 !TLI.isOperationLegalOrCustomOrPromote(
ISD::CTPOP, NVT)) {
802 if (
SDValue Result = TLI.expandCTPOP(
N, DAG)) {
809 if (!
N->isVPOpcode()) {
810 SDValue Op = ZExtPromotedInteger(
N->getOperand(0));
811 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
Op.getValueType(),
Op);
816 SDValue Op = VPZExtPromotedInteger(
N->getOperand(0), Mask, EVL);
817 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
Op.getValueType(),
Op, Mask,
822 SDValue Op = GetPromotedInteger(
N->getOperand(0));
823 EVT OVT =
N->getValueType(0);
824 EVT NVT =
Op.getValueType();
831 if (!OVT.
isVector() && TLI.isTypeLegal(NVT) &&
832 !TLI.isOperationLegalOrCustomOrPromote(
ISD::CTTZ, NVT) &&
836 if (
SDValue Result = TLI.expandCTTZ(
N, DAG)) {
842 unsigned NewOpc =
N->getOpcode();
843 if (NewOpc ==
ISD::CTTZ || NewOpc == ISD::VP_CTTZ) {
850 Op = DAG.getNode(
ISD::OR, dl, NVT,
Op, DAG.getConstant(TopBit, dl, NVT));
854 DAG.getNode(ISD::VP_OR, dl, NVT,
Op, DAG.getConstant(TopBit, dl, NVT),
855 N->getOperand(1),
N->getOperand(2));
856 NewOpc = ISD::VP_CTTZ_ZERO_UNDEF;
859 if (!
N->isVPOpcode())
860 return DAG.getNode(NewOpc, dl, NVT,
Op);
861 return DAG.getNode(NewOpc, dl, NVT,
Op,
N->getOperand(1),
N->getOperand(2));
864SDValue DAGTypeLegalizer::PromoteIntRes_VP_CttzElements(
SDNode *
N) {
866 EVT NewVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
867 return DAG.getNode(
N->getOpcode(),
DL, NewVT,
N->ops());
870SDValue DAGTypeLegalizer::PromoteIntRes_EXTRACT_VECTOR_ELT(
SDNode *
N) {
872 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
879 if (TLI.getTypeAction(*DAG.getContext(), Op0.
getValueType())
885 EVT SVT =
In.getValueType().getScalarType();
888 return DAG.getAnyExtOrTrunc(Ext, dl, NVT);
896 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
898 TLI.getPreferredFPToIntOpcode(
N->getOpcode(),
N->getValueType(0), NVT);
902 if (
N->isStrictFPOpcode()) {
903 Res = DAG.
getNode(NewOpc, dl, {NVT, MVT::Other},
904 {
N->getOperand(0),
N->getOperand(1)});
908 }
else if (NewOpc == ISD::VP_FP_TO_SINT || NewOpc == ISD::VP_FP_TO_UINT) {
909 Res = DAG.
getNode(NewOpc, dl, NVT, {
N->getOperand(0),
N->getOperand(1),
912 Res = DAG.
getNode(NewOpc, dl, NVT,
N->getOperand(0));
924 N->getOpcode() == ISD::VP_FP_TO_UINT)
928 DAG.getValueType(
N->getValueType(0).getScalarType()));
931SDValue DAGTypeLegalizer::PromoteIntRes_FP_TO_XINT_SAT(
SDNode *
N) {
933 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
935 return DAG.getNode(
N->getOpcode(), dl, NVT,
N->getOperand(0),
939SDValue DAGTypeLegalizer::PromoteIntRes_FP_TO_FP16_BF16(
SDNode *
N) {
940 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
943 return DAG.getNode(
N->getOpcode(), dl, NVT,
N->getOperand(0));
946SDValue DAGTypeLegalizer::PromoteIntRes_STRICT_FP_TO_FP16_BF16(
SDNode *
N) {
947 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
950 SDValue Res = DAG.
getNode(
N->getOpcode(), dl, DAG.getVTList(NVT, MVT::Other),
951 N->getOperand(0),
N->getOperand(1));
957 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
959 return DAG.getNode(
N->getOpcode(), dl, NVT,
N->getOperand(0));
963 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
967 DAG.
getNode(
N->getOpcode(), dl, {NVT, MVT::Other},
N->getOperand(0));
976 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
979 if (getTypeAction(
N->getOperand(0).getValueType())
981 SDValue Res = GetPromotedInteger(
N->getOperand(0));
990 DAG.getValueType(
N->getOperand(0).getValueType()));
992 return DAG.getZeroExtendInReg(Res, dl,
N->getOperand(0).getValueType());
999 if (
N->getNumOperands() != 1) {
1000 assert(
N->getNumOperands() == 3 &&
"Unexpected number of operands!");
1001 assert(
N->isVPOpcode() &&
"Expected VP opcode");
1002 return DAG.getNode(
N->getOpcode(), dl, NVT,
N->getOperand(0),
1003 N->getOperand(1),
N->getOperand(2));
1005 return DAG.getNode(
N->getOpcode(), dl, NVT,
N->getOperand(0));
1010 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
1014 SDValue Res = DAG.getExtLoad(ExtType, dl, NVT,
N->getChain(),
N->getBasePtr(),
1015 N->getMemoryVT(),
N->getMemOperand());
1024 assert(!
N->isIndexed() &&
"Indexed vp_load during type legalization!");
1025 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
1028 :
N->getExtensionType();
1031 DAG.getExtLoadVP(ExtType, dl, NVT,
N->getChain(),
N->getBasePtr(),
1032 N->getMask(),
N->getVectorLength(),
N->getMemoryVT(),
1033 N->getMemOperand(),
N->isExpandingLoad());
1041 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
1042 SDValue ExtPassThru = GetPromotedInteger(
N->getPassThru());
1049 SDValue Res = DAG.getMaskedLoad(NVT, dl,
N->getChain(),
N->getBasePtr(),
1050 N->getOffset(),
N->getMask(), ExtPassThru,
1051 N->getMemoryVT(),
N->getMemOperand(),
1052 N->getAddressingMode(), ExtType,
1053 N->isExpandingLoad());
1061 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
1062 SDValue ExtPassThru = GetPromotedInteger(
N->getPassThru());
1064 "Gather result type and the passThru argument type should be the same");
1071 SDValue Ops[] = {
N->getChain(), ExtPassThru,
N->getMask(),
N->getBasePtr(),
1072 N->getIndex(),
N->getScale() };
1073 SDValue Res = DAG.getMaskedGather(DAG.getVTList(NVT, MVT::Other),
1074 N->getMemoryVT(), dl,
Ops,
1075 N->getMemOperand(),
N->getIndexType(),
1083SDValue DAGTypeLegalizer::PromoteIntRes_VECTOR_COMPRESS(
SDNode *
N) {
1084 SDValue Vec = GetPromotedInteger(
N->getOperand(0));
1085 SDValue Passthru = GetPromotedInteger(
N->getOperand(2));
1087 N->getOperand(1), Passthru);
1094 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(1));
1095 EVT VT =
N->getValueType(0);
1096 EVT SVT = getSetCCResultType(VT);
1097 SDValue Ops[3] = {
N->getOperand(0),
N->getOperand(1) };
1098 unsigned NumOps =
N->getNumOperands();
1101 Ops[2] = PromoteTargetBoolean(
N->getOperand(2), VT);
1109 ReplaceValueWith(
SDValue(
N, 0), Res);
1112 return DAG.getBoolExtOrTrunc(Res.
getValue(1), dl, NVT, VT);
1115template <
class MatchContextClass>
1127 MatchContextClass matcher(DAG, TLI,
N);
1129 unsigned Opcode = matcher.getRootBaseOpcode();
1135 SExtOrZExtPromotedOperands(Op1, Op2);
1141 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), OVT);
1143 if (TLI.isSExtCheaperThanZExt(OVT, NVT)) {
1144 Op1 = SExtPromotedInteger(Op1);
1145 Op2 = SExtPromotedInteger(Op2);
1146 return matcher.getNode(
ISD::UADDSAT, dl, NVT, Op1, Op2);
1149 Op1 = ZExtPromotedInteger(Op1);
1150 Op2 = ZExtPromotedInteger(Op2);
1153 SDValue SatMax = DAG.getConstant(MaxVal, dl, NVT);
1155 return matcher.getNode(
ISD::UMIN, dl, NVT,
Add, SatMax);
1162 Op1 = GetPromotedInteger(Op1);
1164 Op2 = ZExtPromotedInteger(Op2);
1166 Op1 = SExtPromotedInteger(Op1);
1167 Op2 = SExtPromotedInteger(Op2);
1174 if (IsShift || matcher.isOperationLegal(Opcode, PromotedType)) {
1187 "addition, subtraction or left shift");
1190 unsigned SHLAmount = NewBits - OldBits;
1192 DAG.getShiftAmountConstant(SHLAmount, PromotedType, dl);
1197 SDValue Result = matcher.getNode(Opcode, dl, PromotedType, Op1, Op2);
1198 return matcher.getNode(ShiftOp, dl, PromotedType, Result, ShiftAmount);
1204 SDValue SatMin = DAG.getConstant(MinVal, dl, PromotedType);
1205 SDValue SatMax = DAG.getConstant(MaxVal, dl, PromotedType);
1206 SDValue Result = matcher.getNode(AddOp, dl, PromotedType, Op1, Op2);
1207 Result = matcher.getNode(
ISD::SMIN, dl, PromotedType, Result, SatMax);
1208 Result = matcher.getNode(
ISD::SMAX, dl, PromotedType, Result, SatMin);
1215 SDValue Op1Promoted, Op2Promoted;
1221 Op1Promoted = SExtPromotedInteger(
N->getOperand(0));
1222 Op2Promoted = SExtPromotedInteger(
N->getOperand(1));
1224 Op1Promoted = ZExtPromotedInteger(
N->getOperand(0));
1225 Op2Promoted = ZExtPromotedInteger(
N->getOperand(1));
1227 EVT OldType =
N->getOperand(0).getValueType();
1239 DAG.getShiftAmountConstant(DiffSize, PromotedType, dl));
1240 SDValue Result = DAG.getNode(
N->getOpcode(), dl, PromotedType, Op1Promoted,
1241 Op2Promoted,
N->getOperand(2));
1243 return DAG.getNode(ShiftOp, dl, PromotedType, Result,
1244 DAG.getShiftAmountConstant(DiffSize, PromotedType, dl));
1246 return DAG.getNode(
N->getOpcode(), dl, PromotedType, Op1Promoted, Op2Promoted,
1251 unsigned SatW,
bool Signed,
1254 EVT VT = V.getValueType();
1281 EVT VT =
LHS.getValueType();
1297 assert(Res &&
"Expanding DIVFIX with wide type failed?");
1303 "Tried to saturate to more than the original type?");
1312 SDValue Op1Promoted, Op2Promoted;
1318 Op1Promoted = SExtPromotedInteger(
N->getOperand(0));
1319 Op2Promoted = SExtPromotedInteger(
N->getOperand(1));
1321 Op1Promoted = ZExtPromotedInteger(
N->getOperand(0));
1322 Op2Promoted = ZExtPromotedInteger(
N->getOperand(1));
1325 unsigned Scale =
N->getConstantOperandVal(2);
1329 if (TLI.isTypeLegal(PromotedType)) {
1331 TLI.getFixedPointOperationAction(
N->getOpcode(), PromotedType, Scale);
1334 N->getValueType(0).getScalarSizeInBits();
1338 DAG.getShiftAmountConstant(Diff, PromotedType, dl));
1339 SDValue Res = DAG.
getNode(
N->getOpcode(), dl, PromotedType, Op1Promoted,
1340 Op2Promoted,
N->getOperand(2));
1343 DAG.getShiftAmountConstant(Diff, PromotedType, dl));
1349 if (
SDValue Res = TLI.expandFixedPointDiv(
N->getOpcode(), dl, Op1Promoted,
1350 Op2Promoted, Scale, DAG)) {
1353 N->getValueType(0).getScalarSizeInBits(),
1361 N->getValueType(0).getScalarSizeInBits());
1364SDValue DAGTypeLegalizer::PromoteIntRes_SADDSUBO(
SDNode *
N,
unsigned ResNo) {
1366 return PromoteIntRes_Overflow(
N);
1370 SDValue LHS = SExtPromotedInteger(
N->getOperand(0));
1371 SDValue RHS = SExtPromotedInteger(
N->getOperand(1));
1372 EVT OVT =
N->getOperand(0).getValueType();
1373 EVT NVT =
LHS.getValueType();
1383 DAG.getValueType(OVT));
1385 Ofl = DAG.getSetCC(dl,
N->getValueType(1), Ofl, Res,
ISD::SETNE);
1388 ReplaceValueWith(
SDValue(
N, 1), Ofl);
1394 EVT PromotedResultTy =
1395 TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
1396 return DAG.
getNode(
N->getOpcode(), SDLoc(
N), PromotedResultTy,
1397 N->getOperand(0),
N->getOperand(1));
1403 SDValue LHS = GetPromotedInteger(
N->getOperand(1));
1404 SDValue RHS = GetPromotedInteger(
N->getOperand(2));
1406 unsigned Opcode =
N->getOpcode();
1407 if (Opcode == ISD::VP_SELECT || Opcode == ISD::VP_MERGE)
1408 return DAG.getNode(Opcode, SDLoc(
N),
LHS.getValueType(), Mask,
LHS,
RHS,
1410 return DAG.getNode(Opcode, SDLoc(
N),
LHS.getValueType(), Mask,
LHS,
RHS);
1414 SDValue LHS = GetPromotedInteger(
N->getOperand(2));
1415 SDValue RHS = GetPromotedInteger(
N->getOperand(3));
1417 LHS.getValueType(),
N->getOperand(0),
1418 N->getOperand(1),
LHS,
RHS,
N->getOperand(4));
1423 EVT InVT =
N->getOperand(OpNo).getValueType();
1424 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
1426 EVT SVT = getSetCCResultType(InVT);
1433 InVT = TLI.getTypeToTransformTo(*DAG.getContext(), InVT);
1434 SVT = getSetCCResultType(InVT);
1442 assert(SVT.
isVector() ==
N->getOperand(OpNo).getValueType().isVector() &&
1443 "Vector compare must return a vector result!");
1447 if (
N->isStrictFPOpcode()) {
1448 SDVTList VTs = DAG.getVTList({SVT, MVT::Other});
1449 SDValue Opers[] = {
N->getOperand(0),
N->getOperand(1),
1450 N->getOperand(2),
N->getOperand(3)};
1451 SetCC = DAG.
getNode(
N->getOpcode(), dl, VTs, Opers,
N->getFlags());
1456 SetCC = DAG.
getNode(
N->getOpcode(), dl, SVT,
N->getOperand(0),
1457 N->getOperand(1),
N->getOperand(2),
N->getFlags());
1460 return DAG.getSExtOrTrunc(SetCC, dl, NVT);
1467 EVT NResVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
1472 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(1));
1473 EVT VT =
N->getValueType(0);
1477 DAG.
getNode(
N->getOpcode(), dl, DAG.getVTList(VT, NVT),
N->getOperand(0));
1479 ReplaceValueWith(
SDValue(
N, 0), Res);
1484 SDValue LHS = GetPromotedInteger(
N->getOperand(0));
1486 if (
N->getOpcode() != ISD::VP_SHL) {
1488 RHS = ZExtPromotedInteger(
RHS);
1490 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
LHS.getValueType(),
LHS,
RHS);
1496 RHS = VPZExtPromotedInteger(
RHS, Mask, EVL);
1497 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
LHS.getValueType(),
LHS,
RHS,
1501SDValue DAGTypeLegalizer::PromoteIntRes_SIGN_EXTEND_INREG(
SDNode *
N) {
1502 SDValue Op = GetPromotedInteger(
N->getOperand(0));
1504 Op.getValueType(),
Op,
N->getOperand(1));
1507SDValue DAGTypeLegalizer::PromoteIntRes_SimpleIntBinOp(
SDNode *
N) {
1511 SDValue LHS = GetPromotedInteger(
N->getOperand(0));
1512 SDValue RHS = GetPromotedInteger(
N->getOperand(1));
1513 if (
N->getNumOperands() == 2)
1514 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
LHS.getValueType(),
LHS,
RHS);
1515 assert(
N->getNumOperands() == 4 &&
"Unexpected number of operands!");
1516 assert(
N->isVPOpcode() &&
"Expected VP opcode");
1517 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
LHS.getValueType(),
LHS,
RHS,
1518 N->getOperand(2),
N->getOperand(3));
1522 if (
N->getNumOperands() == 2) {
1524 SDValue LHS = SExtPromotedInteger(
N->getOperand(0));
1525 SDValue RHS = SExtPromotedInteger(
N->getOperand(1));
1526 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
LHS.getValueType(),
LHS,
RHS);
1528 assert(
N->getNumOperands() == 4 &&
"Unexpected number of operands!");
1529 assert(
N->isVPOpcode() &&
"Expected VP opcode");
1533 SDValue LHS = VPSExtPromotedInteger(
N->getOperand(0), Mask, EVL);
1534 SDValue RHS = VPSExtPromotedInteger(
N->getOperand(1), Mask, EVL);
1535 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
LHS.getValueType(),
LHS,
RHS,
1540 if (
N->getNumOperands() == 2) {
1542 SDValue LHS = ZExtPromotedInteger(
N->getOperand(0));
1543 SDValue RHS = ZExtPromotedInteger(
N->getOperand(1));
1544 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
LHS.getValueType(),
LHS,
RHS);
1546 assert(
N->getNumOperands() == 4 &&
"Unexpected number of operands!");
1547 assert(
N->isVPOpcode() &&
"Expected VP opcode");
1551 SDValue LHS = VPZExtPromotedInteger(
N->getOperand(0), Mask, EVL);
1552 SDValue RHS = VPZExtPromotedInteger(
N->getOperand(1), Mask, EVL);
1553 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
LHS.getValueType(),
LHS,
RHS,
1563 SExtOrZExtPromotedOperands(
LHS,
RHS);
1565 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
1571 if (
N->getOpcode() != ISD::VP_SRA) {
1573 SDValue LHS = SExtPromotedInteger(
N->getOperand(0));
1575 RHS = ZExtPromotedInteger(
RHS);
1576 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
LHS.getValueType(),
LHS,
RHS);
1582 SDValue LHS = VPSExtPromotedInteger(
N->getOperand(0), Mask, EVL);
1584 RHS = VPZExtPromotedInteger(
RHS, Mask, EVL);
1585 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
LHS.getValueType(),
LHS,
RHS,
1591 if (
N->getOpcode() != ISD::VP_SRL) {
1593 SDValue LHS = ZExtPromotedInteger(
N->getOperand(0));
1595 RHS = ZExtPromotedInteger(
RHS);
1596 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
LHS.getValueType(),
LHS,
RHS);
1602 SDValue LHS = VPZExtPromotedInteger(
N->getOperand(0), Mask, EVL);
1604 RHS = VPZExtPromotedInteger(
RHS, Mask, EVL);
1605 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
LHS.getValueType(),
LHS,
RHS,
1611 SDValue Res = TLI.expandROT(
N,
true , DAG);
1612 ReplaceValueWith(
SDValue(
N, 0), Res);
1617 SDValue Hi = GetPromotedInteger(
N->getOperand(0));
1618 SDValue Lo = GetPromotedInteger(
N->getOperand(1));
1621 Amt = ZExtPromotedInteger(Amt);
1625 EVT OldVT =
N->getOperand(0).getValueType();
1626 EVT VT =
Lo.getValueType();
1627 unsigned Opcode =
N->getOpcode();
1634 DAG.getConstant(OldBits,
DL, AmtVT));
1642 !TLI.isOperationLegalOrCustom(Opcode, VT)) {
1643 SDValue HiShift = DAG.getShiftAmountConstant(OldBits, VT,
DL);
1645 Lo = DAG.getZeroExtendInReg(
Lo,
DL, OldVT);
1655 DAG.getShiftAmountConstant(NewBits - OldBits, VT,
DL));
1661 DAG.getConstant(NewBits - OldBits,
DL, AmtVT));
1663 return DAG.getNode(Opcode,
DL, VT,
Hi,
Lo, Amt);
1667SDValue DAGTypeLegalizer::PromoteIntRes_VPFunnelShift(
SDNode *
N) {
1668 SDValue Hi = GetPromotedInteger(
N->getOperand(0));
1669 SDValue Lo = GetPromotedInteger(
N->getOperand(1));
1674 Amt = VPZExtPromotedInteger(Amt, Mask, EVL);
1678 EVT OldVT =
N->getOperand(0).getValueType();
1679 EVT VT =
Lo.getValueType();
1680 unsigned Opcode =
N->getOpcode();
1681 bool IsFSHR = Opcode == ISD::VP_FSHR;
1686 Amt = DAG.
getNode(ISD::VP_UREM,
DL, AmtVT, Amt,
1687 DAG.getConstant(OldBits,
DL, AmtVT), Mask, EVL);
1695 !TLI.isOperationLegalOrCustom(Opcode, VT)) {
1696 SDValue HiShift = DAG.getConstant(OldBits,
DL, VT);
1697 Hi = DAG.
getNode(ISD::VP_SHL,
DL, VT,
Hi, HiShift, Mask, EVL);
1698 Lo = DAG.getVPZeroExtendInReg(
Lo, Mask, EVL,
DL, OldVT);
1700 Res = DAG.
getNode(IsFSHR ? ISD::VP_SRL : ISD::VP_SHL,
DL, VT, Res, Amt,
1703 Res = DAG.
getNode(ISD::VP_SRL,
DL, VT, Res, HiShift, Mask, EVL);
1708 SDValue ShiftOffset = DAG.getConstant(NewBits - OldBits,
DL, AmtVT);
1709 Lo = DAG.getNode(ISD::VP_SHL,
DL, VT,
Lo, ShiftOffset, Mask, EVL);
1714 Amt = DAG.
getNode(ISD::VP_ADD,
DL, AmtVT, Amt, ShiftOffset, Mask, EVL);
1716 return DAG.getNode(Opcode,
DL, VT,
Hi,
Lo, Amt, Mask, EVL);
1720 unsigned Opcode =
N->getOpcode();
1723 EVT OldVT =
N->getOperand(0).getValueType();
1724 EVT VT = TLI.getTypeToTransformTo(*DAG.getContext(), OldVT);
1727 if (!TLI.isOperationLegalOrCustomOrPromote(
ISD::CLMUL, VT)) {
1728 if (
SDValue Res = TLI.expandCLMUL(
N, DAG))
1731 SDValue X = GetPromotedInteger(
N->getOperand(0));
1732 SDValue Y = GetPromotedInteger(
N->getOperand(1));
1736 SDValue X = ZExtPromotedInteger(
N->getOperand(0));
1737 SDValue Y = ZExtPromotedInteger(
N->getOperand(1));
1741 if (NewBits < 2 * OldBits) {
1743 unsigned ShAmt = Opcode ==
ISD::CLMULH ? OldBits : OldBits - 1;
1745 DAG.getShiftAmountConstant(ShAmt, VT,
DL));
1747 ShAmt = Opcode ==
ISD::CLMULH ? NewBits - OldBits : NewBits - OldBits + 1;
1749 DAG.getShiftAmountConstant(ShAmt, VT,
DL));
1754 unsigned ShAmt = Opcode ==
ISD::CLMULH ? OldBits : OldBits - 1;
1756 DAG.getShiftAmountConstant(ShAmt, VT,
DL));
1760 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
1772 Res = GetPromotedInteger(InOp);
1779 "Dst and Src must have the same number of elements");
1781 "Promoted vector type must be a power of two");
1784 GetSplitVector(InOp, EOp1, EOp2);
1792 assert(
N->getOpcode() == ISD::VP_TRUNCATE &&
1793 "Expected VP_TRUNCATE opcode");
1794 SDValue MaskLo, MaskHi, EVLLo, EVLHi;
1795 std::tie(MaskLo, MaskHi) = SplitMask(
N->getOperand(1));
1796 std::tie(EVLLo, EVLHi) =
1797 DAG.SplitEVL(
N->getOperand(2),
N->getValueType(0), dl);
1798 EOp1 = DAG.
getNode(ISD::VP_TRUNCATE, dl, HalfNVT, EOp1, MaskLo, EVLLo);
1799 EOp2 = DAG.
getNode(ISD::VP_TRUNCATE, dl, HalfNVT, EOp2, MaskHi, EVLHi);
1806 SDValue WideInOp = GetWidenedVector(InOp);
1811 N->getValueType(0).getScalarType(), NumElem);
1820 SDValue ZeroIdx = DAG.getVectorIdxConstant(0, dl);
1826 if (
N->getOpcode() == ISD::VP_TRUNCATE)
1827 return DAG.getNode(ISD::VP_TRUNCATE, dl, NVT, Res,
N->getOperand(1),
1832SDValue DAGTypeLegalizer::PromoteIntRes_UADDSUBO(
SDNode *
N,
unsigned ResNo) {
1834 return PromoteIntRes_Overflow(
N);
1838 SDValue LHS = ZExtPromotedInteger(
N->getOperand(0));
1839 SDValue RHS = ZExtPromotedInteger(
N->getOperand(1));
1840 EVT OVT =
N->getOperand(0).getValueType();
1841 EVT NVT =
LHS.getValueType();
1850 SDValue Ofl = DAG.getZeroExtendInReg(Res, dl, OVT);
1852 Ofl = DAG.getSetCC(dl,
N->getValueType(1), Ofl, Res,
ISD::SETNE);
1855 ReplaceValueWith(
SDValue(
N, 1), Ofl);
1866 return PromoteIntRes_Overflow(
N);
1878 SDValue LHS = SExtPromotedInteger(
N->getOperand(0));
1879 SDValue RHS = SExtPromotedInteger(
N->getOperand(1));
1881 EVT ValueVTs[] = {
LHS.getValueType(),
N->getValueType(1)};
1884 SDValue Res = DAG.
getNode(
N->getOpcode(), SDLoc(
N), DAG.getVTList(ValueVTs),
1895 assert(ResNo == 1 &&
"Don't know how to promote other results yet.");
1896 return PromoteIntRes_Overflow(
N);
1900 EVT OVT =
N->getValueType(0);
1901 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), OVT);
1907 !TLI.isOperationLegalOrCustomOrPromote(
ISD::ABS, NVT) &&
1908 !TLI.isOperationLegal(
ISD::SMAX, NVT)) {
1909 if (
SDValue Res = TLI.expandABS(
N, DAG))
1913 SDValue Op0 = SExtPromotedInteger(
N->getOperand(0));
1917SDValue DAGTypeLegalizer::PromoteIntRes_XMULO(
SDNode *
N,
unsigned ResNo) {
1920 return PromoteIntRes_Overflow(
N);
1924 EVT SmallVT =
LHS.getValueType();
1931 LHS = SExtPromotedInteger(
LHS);
1932 RHS = SExtPromotedInteger(
RHS);
1934 LHS = ZExtPromotedInteger(
LHS);
1935 RHS = ZExtPromotedInteger(
RHS);
1937 SDVTList VTs = DAG.getVTList(
LHS.getValueType(),
N->getValueType(1));
1949 DAG.getShiftAmountConstant(Shift,
Mul.getValueType(),
DL));
1950 Overflow = DAG.getSetCC(
DL,
N->getValueType(1),
Hi,
1951 DAG.getConstant(0,
DL,
Hi.getValueType()),
1956 Mul, DAG.getValueType(SmallVT));
1966 ReplaceValueWith(
SDValue(
N, 1), Overflow);
1971 return DAG.getUNDEF(TLI.getTypeToTransformTo(*DAG.getContext(),
1972 N->getValueType(0)));
1976 EVT VT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
1978 const APInt &MulImm =
N->getConstantOperandAPInt(0);
1985 EVT VT =
N->getValueType(0);
1988 MVT RegVT = TLI.getRegisterType(*DAG.getContext(), VT);
1989 unsigned NumRegs = TLI.getNumRegisters(*DAG.getContext(), VT);
1993 for (
unsigned i = 0; i < NumRegs; ++i) {
1994 Parts[i] = DAG.getVAArg(RegVT, dl, Chain, Ptr,
N->getOperand(2),
1995 N->getConstantOperandVal(3));
2000 if (DAG.getDataLayout().isBigEndian())
2001 std::reverse(Parts.begin(), Parts.end());
2004 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
2006 for (
unsigned i = 1; i < NumRegs; ++i) {
2011 DAG.getShiftAmountConstant(i * RegVT.
getSizeInBits(), NVT, dl));
2017 ReplaceValueWith(
SDValue(
N, 1), Chain);
2030bool DAGTypeLegalizer::PromoteIntegerOperand(
SDNode *
N,
unsigned OpNo) {
2033 if (CustomLowerNode(
N,
N->getOperand(OpNo).getValueType(),
false)) {
2038 switch (
N->getOpcode()) {
2041 dbgs() <<
"PromoteIntegerOperand Op #" << OpNo <<
": ";
2042 N->dump(&DAG);
dbgs() <<
"\n";
2048 Res = PromoteIntOp_ANY_EXTEND_VECTOR_INREG(
N);
2054 case ISD::BR_CC: Res = PromoteIntOp_BR_CC(
N, OpNo);
break;
2055 case ISD::BRCOND: Res = PromoteIntOp_BRCOND(
N, OpNo);
break;
2061 Res = PromoteIntOp_FAKE_USE(
N);
2064 Res = PromoteIntOp_INSERT_VECTOR_ELT(
N, OpNo);
2068 Res = PromoteIntOp_ScalarOp(
N);
2071 case ISD::SELECT: Res = PromoteIntOp_SELECT(
N, OpNo);
break;
2074 case ISD::SETCC: Res = PromoteIntOp_SETCC(
N, OpNo);
break;
2076 case ISD::VP_SIGN_EXTEND: Res = PromoteIntOp_VP_SIGN_EXTEND(
N);
break;
2077 case ISD::VP_SINT_TO_FP:
2094 Res = PromoteIntOp_VECTOR_COMPRESS(
N, OpNo);
2096 case ISD::VP_TRUNCATE:
2100 case ISD::VP_UINT_TO_FP:
2105 case ISD::VP_ZERO_EXTEND: Res = PromoteIntOp_VP_ZERO_EXTEND(
N);
break;
2116 Res = PromoteIntOp_Shift(
N);
2120 case ISD::UCMP: Res = PromoteIntOp_CMP(
N);
break;
2123 case ISD::FSHR: Res = PromoteIntOp_FunnelShift(
N);
break;
2149 case ISD::VP_REDUCE_ADD:
2150 case ISD::VP_REDUCE_MUL:
2151 case ISD::VP_REDUCE_AND:
2152 case ISD::VP_REDUCE_OR:
2153 case ISD::VP_REDUCE_XOR:
2154 case ISD::VP_REDUCE_SMAX:
2155 case ISD::VP_REDUCE_SMIN:
2156 case ISD::VP_REDUCE_UMAX:
2157 case ISD::VP_REDUCE_UMIN:
2158 Res = PromoteIntOp_VP_REDUCE(
N, OpNo);
2163 Res = PromoteIntOp_STACKMAP(
N, OpNo);
2166 Res = PromoteIntOp_PATCHPOINT(
N, OpNo);
2169 Res = PromoteIntOp_WRITE_REGISTER(
N, OpNo);
2171 case ISD::EXPERIMENTAL_VP_STRIDED_LOAD:
2172 case ISD::EXPERIMENTAL_VP_STRIDED_STORE:
2173 Res = PromoteIntOp_VP_STRIDED(
N, OpNo);
2175 case ISD::EXPERIMENTAL_VP_SPLICE:
2176 Res = PromoteIntOp_VP_SPLICE(
N, OpNo);
2179 Res = PromoteIntOp_VECTOR_HISTOGRAM(
N, OpNo);
2182 Res = PromoteIntOp_VECTOR_FIND_LAST_ACTIVE(
N, OpNo);
2185 Res = PromoteIntOp_GET_ACTIVE_LANE_MASK(
N);
2190 Res = PromoteIntOp_PARTIAL_REDUCE_MLA(
N);
2195 if (!Res.
getNode())
return false;
2202 const bool IsStrictFp =
N->isStrictFPOpcode();
2204 N->getNumValues() == (IsStrictFp ? 2 : 1) &&
2205 "Invalid operand expansion");
2209 ReplaceValueWith(
SDValue(
N, 0), Res);
2223 if (TLI.isSExtCheaperThanZExt(
LHS.getValueType(), OpL.
getValueType())) {
2227 unsigned OpLEffectiveBits =
2228 DAG.computeKnownBits(OpL).countMaxActiveBits();
2229 unsigned OpREffectiveBits =
2230 DAG.computeKnownBits(OpR).countMaxActiveBits();
2231 if (OpLEffectiveBits <=
LHS.getScalarValueSizeInBits() &&
2232 OpREffectiveBits <=
RHS.getScalarValueSizeInBits()) {
2239 LHS = SExtPromotedInteger(
LHS);
2240 RHS = SExtPromotedInteger(
RHS);
2249 unsigned OpLEffectiveBits = DAG.ComputeMaxSignificantBits(OpL);
2250 unsigned OpREffectiveBits = DAG.ComputeMaxSignificantBits(OpR);
2251 if (OpLEffectiveBits <=
LHS.getScalarValueSizeInBits() &&
2252 OpREffectiveBits <=
RHS.getScalarValueSizeInBits()) {
2259 LHS = ZExtPromotedInteger(
LHS);
2260 RHS = ZExtPromotedInteger(
RHS);
2274 LHS = SExtPromotedInteger(
LHS);
2275 RHS = SExtPromotedInteger(
RHS);
2280 "Unknown integer comparison!");
2282 SExtOrZExtPromotedOperands(
LHS,
RHS);
2286 SDValue Op = GetPromotedInteger(
N->getOperand(0));
2290SDValue DAGTypeLegalizer::PromoteIntOp_ANY_EXTEND_VECTOR_INREG(
SDNode *
N) {
2291 SDValue Op = GetPromotedInteger(
N->getOperand(0));
2292 EVT ResVT =
N->getValueType(0);
2293 EVT OpVT =
Op.getValueType();
2296 Op = DAG.getExtractSubvector(SDLoc(
Op), NewVT,
Op, 0);
2301 SDValue Op1 = GetPromotedInteger(
N->getOperand(1));
2302 return DAG.getAtomic(
N->getOpcode(), SDLoc(
N),
N->getMemoryVT(),
2303 N->getChain(), Op1,
N->getBasePtr(),
N->getMemOperand());
2307 EVT OutVT =
N->getValueType(0);
2310 EVT NInVT = TLI.getTypeToTransformTo(*DAG.getContext(), InVT);
2313 switch (getTypeAction(InVT)) {
2317 DAG.getDataLayout().isLittleEndian()) {
2327 if (isTypeLegal(WideVecVT)) {
2328 SDValue Promoted = GetPromotedInteger(InOp);
2331 DAG.getVectorIdxConstant(0, dl));
2344 return CreateStackStoreLoad(InOp, OutVT);
2347SDValue DAGTypeLegalizer::PromoteIntOp_BR_CC(
SDNode *
N,
unsigned OpNo) {
2348 assert(OpNo == 2 &&
"Don't know how to promote this operand!");
2356 return SDValue(DAG.UpdateNodeOperands(
N,
N->getOperand(0),
2357 N->getOperand(1),
LHS,
RHS,
N->getOperand(4)),
2361SDValue DAGTypeLegalizer::PromoteIntOp_BRCOND(
SDNode *
N,
unsigned OpNo) {
2362 assert(OpNo == 1 &&
"only know how to promote condition");
2365 SDValue Cond = PromoteTargetBoolean(
N->getOperand(1), MVT::Other);
2368 return SDValue(DAG.UpdateNodeOperands(
N,
N->getOperand(0),
Cond,
2369 N->getOperand(2)), 0);
2374 EVT OVT =
N->getOperand(0).getValueType();
2375 SDValue Lo = ZExtPromotedInteger(
N->getOperand(0));
2376 SDValue Hi = GetPromotedInteger(
N->getOperand(1));
2377 assert(
Lo.getValueType() ==
N->getValueType(0) &&
"Operand over promoted?");
2382 DAG.getShiftAmountConstant(OVT.
getSizeInBits(),
N->getValueType(0), dl));
2383 return DAG.getNode(
ISD::OR, dl,
N->getValueType(0),
Lo,
Hi);
2392 assert(!((NumElts & 1) && (!TLI.isTypeLegal(VecVT))) &&
2393 "Legal vector of one illegal element?");
2398 assert(
N->getOperand(0).getValueSizeInBits() >=
2399 N->getValueType(0).getScalarSizeInBits() &&
2400 "Type of inserted value narrower than vector element type!");
2403 for (
unsigned i = 0; i < NumElts; ++i)
2404 NewOps.
push_back(GetPromotedInteger(
N->getOperand(i)));
2406 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
2409SDValue DAGTypeLegalizer::PromoteIntOp_INSERT_VECTOR_ELT(
SDNode *
N,
2416 assert(
N->getOperand(1).getValueSizeInBits() >=
2417 N->getValueType(0).getScalarSizeInBits() &&
2418 "Type of inserted value narrower than vector element type!");
2419 return SDValue(DAG.UpdateNodeOperands(
N,
N->getOperand(0),
2420 GetPromotedInteger(
N->getOperand(1)),
2425 assert(OpNo == 2 &&
"Different operand and result vector types?");
2428 SDValue Idx = DAG.getZExtOrTrunc(
N->getOperand(2), SDLoc(
N),
2429 TLI.getVectorIdxTy(DAG.getDataLayout()));
2430 return SDValue(DAG.UpdateNodeOperands(
N,
N->getOperand(0),
2431 N->getOperand(1), Idx), 0);
2435 SDValue Op = GetPromotedInteger(
N->getOperand(0));
2439 return SDValue(DAG.UpdateNodeOperands(
N,
Op), 0);
2442SDValue DAGTypeLegalizer::PromoteIntOp_SELECT(
SDNode *
N,
unsigned OpNo) {
2443 assert(OpNo == 0 &&
"Only know how to promote the condition!");
2445 EVT OpTy =
N->getOperand(1).getValueType();
2448 if (
SDValue Res = WidenVSELECTMask(
N))
2449 return DAG.getNode(
N->getOpcode(), SDLoc(
N),
N->getValueType(0),
2450 Res,
N->getOperand(1),
N->getOperand(2));
2454 Cond = PromoteTargetBoolean(
Cond, OpVT);
2456 return SDValue(DAG.UpdateNodeOperands(
N,
Cond,
N->getOperand(1),
2457 N->getOperand(2)), 0);
2460SDValue DAGTypeLegalizer::PromoteIntOp_SELECT_CC(
SDNode *
N,
unsigned OpNo) {
2461 assert(OpNo == 0 &&
"Don't know how to promote this operand!");
2469 N->getOperand(3),
N->getOperand(4)), 0);
2472SDValue DAGTypeLegalizer::PromoteIntOp_SETCC(
SDNode *
N,
unsigned OpNo) {
2473 assert(OpNo == 0 &&
"Don't know how to promote this operand!");
2481 return SDValue(DAG.UpdateNodeOperands(
N,
LHS,
RHS,
N->getOperand(2)), 0);
2483 assert(
N->getOpcode() == ISD::VP_SETCC &&
"Expected VP_SETCC opcode");
2486 N->getOperand(3),
N->getOperand(4)),
2491 return SDValue(DAG.UpdateNodeOperands(
N,
N->getOperand(0),
2492 ZExtPromotedInteger(
N->getOperand(1))), 0);
2500 LHS = SExtPromotedInteger(
LHS);
2501 RHS = SExtPromotedInteger(
RHS);
2503 SExtOrZExtPromotedOperands(
LHS,
RHS);
2510 return SDValue(DAG.UpdateNodeOperands(
N,
N->getOperand(0),
N->getOperand(1),
2511 ZExtPromotedInteger(
N->getOperand(2))), 0);
2515 SDValue Op = GetPromotedInteger(
N->getOperand(0));
2519 Op, DAG.getValueType(
N->getOperand(0).getValueType()));
2522SDValue DAGTypeLegalizer::PromoteIntOp_VP_SIGN_EXTEND(
SDNode *
N) {
2524 EVT VT =
N->getValueType(0);
2525 SDValue Op = GetPromotedInteger(
N->getOperand(0));
2527 Op = DAG.getNode(ISD::VP_ZERO_EXTEND, dl, VT,
Op,
N->getOperand(1),
2531 SDValue ShAmt = DAG.getShiftAmountConstant(Diff, VT, dl);
2533 SDValue Shl = DAG.getNode(ISD::VP_SHL, dl, VT,
Op, ShAmt,
N->getOperand(1),
2535 return DAG.getNode(ISD::VP_SRA, dl, VT, Shl, ShAmt,
N->getOperand(1),
2540 if (
N->getOpcode() == ISD::VP_SINT_TO_FP)
2541 return SDValue(DAG.UpdateNodeOperands(
N,
2542 SExtPromotedInteger(
N->getOperand(0)),
2543 N->getOperand(1),
N->getOperand(2)),
2545 return SDValue(DAG.UpdateNodeOperands(
N,
2546 SExtPromotedInteger(
N->getOperand(0))), 0);
2549SDValue DAGTypeLegalizer::PromoteIntOp_STRICT_SINT_TO_FP(
SDNode *
N) {
2550 return SDValue(DAG.UpdateNodeOperands(
N,
N->getOperand(0),
2551 SExtPromotedInteger(
N->getOperand(1))), 0);
2556 SDValue Ch =
N->getChain(), Ptr =
N->getBasePtr();
2559 SDValue Val = GetPromotedInteger(
N->getValue());
2562 return DAG.getTruncStore(Ch, dl, Val, Ptr,
2563 N->getMemoryVT(),
N->getMemOperand());
2569 assert(OpNo == 1 &&
"Unexpected operand for promotion");
2570 assert(!
N->isIndexed() &&
"expecting unindexed vp_store!");
2572 SDValue DataOp = GetPromotedInteger(
N->getValue());
2573 return DAG.getTruncStoreVP(
N->getChain(), SDLoc(
N), DataOp,
N->getBasePtr(),
2574 N->getMask(),
N->getVectorLength(),
2575 N->getMemoryVT(),
N->getMemOperand(),
2576 N->isCompressingStore());
2587 Mask = PromoteTargetBoolean(Mask, DataVT);
2590 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
2593 assert(OpNo == 1 &&
"Unexpected operand for promotion");
2594 DataOp = GetPromotedInteger(DataOp);
2596 return DAG.getMaskedStore(
N->getChain(), SDLoc(
N), DataOp,
N->getBasePtr(),
2597 N->getOffset(), Mask,
N->getMemoryVT(),
2598 N->getMemOperand(),
N->getAddressingMode(),
2599 true,
N->isCompressingStore());
2604 assert(OpNo == 3 &&
"Only know how to promote the mask!");
2605 EVT DataVT =
N->getValueType(0);
2606 SDValue Mask = PromoteTargetBoolean(
N->getOperand(OpNo), DataVT);
2608 NewOps[OpNo] =
Mask;
2609 SDNode *Res = DAG.UpdateNodeOperands(
N, NewOps);
2625 EVT DataVT =
N->getValueType(0);
2626 NewOps[OpNo] = PromoteTargetBoolean(
N->getOperand(OpNo), DataVT);
2627 }
else if (OpNo == 4) {
2629 if (
N->isIndexSigned())
2631 NewOps[OpNo] = SExtPromotedInteger(
N->getOperand(OpNo));
2633 NewOps[OpNo] = ZExtPromotedInteger(
N->getOperand(OpNo));
2635 NewOps[OpNo] = GetPromotedInteger(
N->getOperand(OpNo));
2637 SDNode *Res = DAG.UpdateNodeOperands(
N, NewOps);
2649 bool TruncateStore =
N->isTruncatingStore();
2654 EVT DataVT =
N->getValue().getValueType();
2655 NewOps[OpNo] = PromoteTargetBoolean(
N->getOperand(OpNo), DataVT);
2656 }
else if (OpNo == 4) {
2658 if (
N->isIndexSigned())
2660 NewOps[OpNo] = SExtPromotedInteger(
N->getOperand(OpNo));
2662 NewOps[OpNo] = ZExtPromotedInteger(
N->getOperand(OpNo));
2664 NewOps[OpNo] = GetPromotedInteger(
N->getOperand(OpNo));
2665 TruncateStore =
true;
2668 return DAG.getMaskedScatter(DAG.getVTList(MVT::Other),
N->getMemoryVT(),
2669 SDLoc(
N), NewOps,
N->getMemOperand(),
2670 N->getIndexType(), TruncateStore);
2675 assert(OpNo == 1 &&
"Can only promote VECTOR_COMPRESS mask.");
2679 SDValue Mask = PromoteTargetBoolean(
N->getOperand(1), VT);
2684 SDValue Op = GetPromotedInteger(
N->getOperand(0));
2685 if (
N->getOpcode() == ISD::VP_TRUNCATE)
2686 return DAG.getNode(ISD::VP_TRUNCATE, SDLoc(
N),
N->getValueType(0),
Op,
2687 N->getOperand(1),
N->getOperand(2));
2692 if (
N->getOpcode() == ISD::VP_UINT_TO_FP)
2693 return SDValue(DAG.UpdateNodeOperands(
N,
2694 ZExtPromotedInteger(
N->getOperand(0)),
2695 N->getOperand(1),
N->getOperand(2)),
2697 return SDValue(DAG.UpdateNodeOperands(
N,
2698 ZExtPromotedInteger(
N->getOperand(0))), 0);
2701SDValue DAGTypeLegalizer::PromoteIntOp_STRICT_UINT_TO_FP(
SDNode *
N) {
2702 return SDValue(DAG.UpdateNodeOperands(
N,
N->getOperand(0),
2703 ZExtPromotedInteger(
N->getOperand(1))), 0);
2710 EVT VT =
N->getValueType(0);
2715 if (
N->getFlags().hasNonNeg() &&
Op.getValueType() == VT &&
2716 TLI.isSExtCheaperThanZExt(Src.getValueType(), VT)) {
2717 unsigned OpEffectiveBits = DAG.ComputeMaxSignificantBits(
Op);
2718 if (OpEffectiveBits <= Src.getScalarValueSizeInBits())
2723 return DAG.getZeroExtendInReg(
Op, dl, Src.getValueType());
2726SDValue DAGTypeLegalizer::PromoteIntOp_VP_ZERO_EXTEND(
SDNode *
N) {
2728 EVT VT =
N->getValueType(0);
2729 SDValue Op = GetPromotedInteger(
N->getOperand(0));
2731 Op = DAG.getNode(ISD::VP_ZERO_EXTEND, dl, VT,
Op,
N->getOperand(1),
2733 return DAG.getVPZeroExtendInReg(
Op,
N->getOperand(1),
N->getOperand(2), dl,
2734 N->getOperand(0).getValueType());
2738 SDValue Op2 = ZExtPromotedInteger(
N->getOperand(2));
2740 DAG.UpdateNodeOperands(
N,
N->getOperand(0),
N->getOperand(1), Op2), 0);
2743SDValue DAGTypeLegalizer::PromoteIntOp_FRAMERETURNADDR(
SDNode *
N) {
2745 SDValue Op = ZExtPromotedInteger(
N->getOperand(0));
2746 return SDValue(DAG.UpdateNodeOperands(
N,
Op), 0);
2755 unsigned OpOffset = IsStrict ? 1 : 0;
2762 RTLIB::LibcallImpl LCImpl = DAG.getLibcalls().getLibcallImpl(LC);
2763 if (LCImpl == RTLIB::Unsupported) {
2769 if (IsPowI &&
N->getValueType(0).isVector())
2770 return DAG.UnrollVectorOp(
N);
2772 NewOps[1 + OpOffset] = SExtPromotedInteger(
N->getOperand(1 + OpOffset));
2773 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
2783 assert(DAG.getLibInfo().getIntSize() ==
2784 N->getOperand(1 + OpOffset).getValueType().getSizeInBits() &&
2785 "POWI exponent should match with sizeof(int) when doing the libcall.");
2786 TargetLowering::MakeLibCallOptions CallOptions;
2788 SDValue Ops[2] = {
N->getOperand(0 + OpOffset),
N->getOperand(1 + OpOffset)};
2789 std::pair<SDValue, SDValue> Tmp = TLI.makeLibCall(
2790 DAG, LCImpl,
N->getValueType(0),
Ops, CallOptions, SDLoc(
N), Chain);
2791 ReplaceValueWith(
SDValue(
N, 0), Tmp.first);
2793 ReplaceValueWith(
SDValue(
N, 1), Tmp.second);
2798 switch (
N->getOpcode()) {
2806 case ISD::VP_REDUCE_ADD:
2807 case ISD::VP_REDUCE_MUL:
2808 case ISD::VP_REDUCE_AND:
2809 case ISD::VP_REDUCE_OR:
2810 case ISD::VP_REDUCE_XOR:
2814 case ISD::VP_REDUCE_SMAX:
2815 case ISD::VP_REDUCE_SMIN:
2819 case ISD::VP_REDUCE_UMAX:
2820 case ISD::VP_REDUCE_UMIN:
2830 return GetPromotedInteger(V);
2832 return SExtPromotedInteger(V);
2834 return ZExtPromotedInteger(V);
2840 SDValue Op = PromoteIntOpVectorReduction(
N,
N->getOperand(0));
2842 EVT OrigEltVT =
N->getOperand(0).getValueType().getVectorElementType();
2843 EVT InVT =
Op.getValueType();
2845 EVT ResVT =
N->getValueType(0);
2846 unsigned Opcode =
N->getOpcode();
2863 switch (TLI.getBooleanContents(InVT)) {
2866 Op = ZExtPromotedInteger(
N->getOperand(0));
2869 Op = SExtPromotedInteger(
N->getOperand(0));
2882 switch (TLI.getBooleanContents(InVT)) {
2885 Op = ZExtPromotedInteger(
N->getOperand(0));
2888 Op = SExtPromotedInteger(
N->getOperand(0));
2894 return DAG.getNode(Opcode, SDLoc(
N), ResVT,
Op);
2898 SDValue Reduce = DAG.getNode(Opcode, dl, EltVT,
Op);
2902SDValue DAGTypeLegalizer::PromoteIntOp_VP_REDUCE(
SDNode *
N,
unsigned OpNo) {
2909 NewOps[2] = PromoteTargetBoolean(
Op,
N->getOperand(1).getValueType());
2910 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
2913 assert(OpNo == 1 &&
"Unexpected operand for promotion");
2915 Op = PromoteIntOpVectorReduction(
N,
Op);
2919 EVT VT =
N->getValueType(0);
2920 EVT EltVT =
Op.getValueType().getScalarType();
2923 return DAG.getNode(
N->getOpcode(), SDLoc(
N), VT, NewOps);
2935 SDValue Op = ZExtPromotedInteger(
N->getOperand(1));
2936 return SDValue(DAG.UpdateNodeOperands(
N,
N->getOperand(0),
Op), 0);
2939SDValue DAGTypeLegalizer::PromoteIntOp_STACKMAP(
SDNode *
N,
unsigned OpNo) {
2942 NewOps[OpNo] = GetPromotedInteger(NewOps[OpNo]);
2943 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
2946SDValue DAGTypeLegalizer::PromoteIntOp_PATCHPOINT(
SDNode *
N,
unsigned OpNo) {
2949 NewOps[OpNo] = GetPromotedInteger(NewOps[OpNo]);
2950 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
2955 const Function &Fn = DAG.getMachineFunction().getFunction();
2957 "cannot use llvm.write_register with illegal type", Fn,
2959 return N->getOperand(0);
2962SDValue DAGTypeLegalizer::PromoteIntOp_VP_STRIDED(
SDNode *
N,
unsigned OpNo) {
2963 assert((
N->getOpcode() == ISD::EXPERIMENTAL_VP_STRIDED_LOAD && OpNo == 3) ||
2964 (
N->getOpcode() == ISD::EXPERIMENTAL_VP_STRIDED_STORE && OpNo == 4));
2967 NewOps[OpNo] = SExtPromotedInteger(
N->getOperand(OpNo));
2969 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
2972SDValue DAGTypeLegalizer::PromoteIntOp_VP_SPLICE(
SDNode *
N,
unsigned OpNo) {
2976 NewOps[OpNo] = SExtPromotedInteger(
N->getOperand(OpNo));
2977 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
2980 assert((OpNo == 4 || OpNo == 5) &&
"Unexpected operand for promotion");
2982 NewOps[OpNo] = ZExtPromotedInteger(
N->getOperand(OpNo));
2983 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
2986SDValue DAGTypeLegalizer::PromoteIntOp_VECTOR_HISTOGRAM(
SDNode *
N,
2988 assert(OpNo == 1 &&
"Unexpected operand for promotion");
2990 NewOps[1] = GetPromotedInteger(
N->getOperand(1));
2991 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
2994SDValue DAGTypeLegalizer::PromoteIntOp_VECTOR_FIND_LAST_ACTIVE(
SDNode *
N,
2997 NewOps[OpNo] = GetPromotedInteger(
N->getOperand(OpNo));
2998 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
3001SDValue DAGTypeLegalizer::PromoteIntOp_GET_ACTIVE_LANE_MASK(
SDNode *
N) {
3003 NewOps[0] = ZExtPromotedInteger(
N->getOperand(0));
3004 NewOps[1] = ZExtPromotedInteger(
N->getOperand(1));
3005 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
3008SDValue DAGTypeLegalizer::PromoteIntOp_PARTIAL_REDUCE_MLA(
SDNode *
N) {
3010 switch (
N->getOpcode()) {
3012 NewOps[1] = SExtPromotedInteger(
N->getOperand(1));
3013 NewOps[2] = SExtPromotedInteger(
N->getOperand(2));
3016 NewOps[1] = ZExtPromotedInteger(
N->getOperand(1));
3017 NewOps[2] = ZExtPromotedInteger(
N->getOperand(2));
3020 NewOps[1] = SExtPromotedInteger(
N->getOperand(1));
3021 NewOps[2] = ZExtPromotedInteger(
N->getOperand(2));
3026 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
3037void DAGTypeLegalizer::ExpandIntegerResult(
SDNode *
N,
unsigned ResNo) {
3043 if (CustomLowerNode(
N,
N->getValueType(ResNo),
true))
3046 switch (
N->getOpcode()) {
3049 dbgs() <<
"ExpandIntegerResult #" << ResNo <<
": ";
3050 N->dump(&DAG);
dbgs() <<
"\n";
3127 std::pair<SDValue, SDValue> Tmp = ExpandAtomic(
N);
3128 SplitInteger(Tmp.first,
Lo,
Hi);
3129 ReplaceValueWith(
SDValue(
N, 1), Tmp.second);
3134 SDVTList VTs = DAG.getVTList(
N->getValueType(0), MVT::Other);
3135 SDValue Tmp = DAG.getAtomicCmpSwap(
3137 N->getOperand(0),
N->getOperand(1),
N->getOperand(2),
N->getOperand(3),
3146 SplitInteger(Tmp,
Lo,
Hi);
3225 ExpandIntRes_Rotate(
N,
Lo,
Hi);
3230 ExpandIntRes_FunnelShift(
N,
Lo,
Hi);
3236 ExpandIntRes_CLMUL(
N,
Lo,
Hi);
3240 ExpandIntRes_VSCALE(
N,
Lo,
Hi);
3244 ExpandIntRes_READ_REGISTER(
N,
Lo,
Hi);
3254std::pair <SDValue, SDValue> DAGTypeLegalizer::ExpandAtomic(
SDNode *Node) {
3255 unsigned Opc =
Node->getOpcode();
3261 EVT RetVT =
Node->getValueType(0);
3262 TargetLowering::MakeLibCallOptions CallOptions;
3265 RTLIB::LibcallImpl LCImpl = DAG.getLibcalls().getLibcallImpl(LC);
3266 if (LCImpl != RTLIB::Unsupported) {
3268 Ops.push_back(
Node->getOperand(1));
3271 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
3272 "Unexpected atomic op or value type!");
3274 LCImpl = DAG.getLibcalls().getLibcallImpl(LC);
3276 return TLI.makeLibCall(DAG, LCImpl, RetVT,
Ops, CallOptions, SDLoc(Node),
3277 Node->getOperand(0));
3282void DAGTypeLegalizer::ExpandShiftByConstant(
SDNode *
N,
const APInt &Amt,
3287 GetExpandedInteger(
N->getOperand(0), InL, InH);
3302 if (Amt.
uge(VTBits)) {
3303 Lo =
Hi = DAG.getConstant(0,
DL, NVT);
3304 }
else if (Amt.
ugt(NVTBits)) {
3305 Lo = DAG.getConstant(0,
DL, NVT);
3307 DAG.getShiftAmountConstant(Amt - NVTBits, NVT,
DL));
3308 }
else if (Amt == NVTBits) {
3309 Lo = DAG.getConstant(0,
DL, NVT);
3313 DAG.getShiftAmountConstant(Amt, NVT,
DL));
3317 DAG.getShiftAmountConstant(Amt, NVT,
DL)),
3319 DAG.getShiftAmountConstant(-Amt + NVTBits, NVT,
DL)));
3325 if (Amt.
uge(VTBits)) {
3326 Lo =
Hi = DAG.getConstant(0,
DL, NVT);
3327 }
else if (Amt.
ugt(NVTBits)) {
3329 DAG.getShiftAmountConstant(Amt - NVTBits, NVT,
DL));
3330 Hi = DAG.getConstant(0,
DL, NVT);
3331 }
else if (Amt == NVTBits) {
3333 Hi = DAG.getConstant(0,
DL, NVT);
3338 DAG.getShiftAmountConstant(Amt, NVT,
DL)),
3340 DAG.getShiftAmountConstant(-Amt + NVTBits, NVT,
DL)));
3342 DAG.getShiftAmountConstant(Amt, NVT,
DL));
3348 if (Amt.
uge(VTBits)) {
3350 DAG.getShiftAmountConstant(NVTBits - 1, NVT,
DL));
3351 }
else if (Amt.
ugt(NVTBits)) {
3353 DAG.getShiftAmountConstant(Amt - NVTBits, NVT,
DL));
3355 DAG.getShiftAmountConstant(NVTBits - 1, NVT,
DL));
3356 }
else if (Amt == NVTBits) {
3359 DAG.getShiftAmountConstant(NVTBits - 1, NVT,
DL));
3364 DAG.getShiftAmountConstant(Amt, NVT,
DL)),
3366 DAG.getShiftAmountConstant(-Amt + NVTBits, NVT,
DL)));
3368 DAG.getShiftAmountConstant(Amt, NVT,
DL));
3376bool DAGTypeLegalizer::
3378 unsigned Opc =
N->getOpcode();
3381 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
3386 "Expanded integer type size not a power of two!");
3390 KnownBits Known = DAG.computeKnownBits(Amt);
3393 if (((Known.
Zero | Known.
One) & HighBitMask) == 0)
3398 GetExpandedInteger(In, InL, InH);
3405 DAG.getConstant(~HighBitMask, dl, ShTy));
3410 Lo = DAG.getConstant(0, dl, NVT);
3411 Hi = DAG.getNode(
ISD::SHL, dl, NVT, InL, Amt);
3414 Hi = DAG.getConstant(0, dl, NVT);
3415 Lo = DAG.getNode(
ISD::SRL, dl, NVT, InH, Amt);
3419 DAG.getConstant(NVTBits - 1, dl, ShTy));
3420 Lo = DAG.getNode(
ISD::SRA, dl, NVT, InH, Amt);
3432 DAG.getConstant(NVTBits - 1, dl, ShTy));
3448 SDValue Sh1 = DAG.getNode(Op2, dl, NVT, InL, DAG.getConstant(1, dl, ShTy));
3450 SDValue Sh2 = DAG.getNode(Op2, dl, NVT, Sh1, Amt2);
3452 Lo = DAG.getNode(
Opc, dl, NVT, InL, Amt);
3453 Hi = DAG.getNode(
ISD::OR, dl, NVT, DAG.getNode(Op1, dl, NVT, InH, Amt),Sh2);
3465bool DAGTypeLegalizer::
3468 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
3472 "Expanded integer type size not a power of two!");
3477 GetExpandedInteger(
N->getOperand(0), InL, InH);
3479 SDValue NVBitsNode = DAG.getConstant(NVTBits, dl, ShTy);
3482 SDValue isShort = DAG.getSetCC(dl, getSetCCResultType(ShTy),
3485 Amt, DAG.getConstant(0, dl, ShTy),
3489 switch (
N->getOpcode()) {
3495 DAG.getNode(
ISD::SHL, dl, NVT, InH, Amt),
3496 DAG.getNode(
ISD::SRL, dl, NVT, InL, AmtLack));
3499 LoL = DAG.getConstant(0, dl, NVT);
3502 Lo = DAG.getSelect(dl, NVT, isShort, LoS, LoL);
3503 Hi = DAG.getSelect(dl, NVT,
isZero, InH,
3504 DAG.getSelect(dl, NVT, isShort, HiS, HiL));
3510 DAG.getNode(
ISD::SRL, dl, NVT, InL, Amt),
3513 DAG.getNode(
ISD::SHL, dl, NVT, InH, AmtLack));
3516 HiL = DAG.getConstant(0, dl, NVT);
3519 Lo = DAG.getSelect(dl, NVT,
isZero, InL,
3520 DAG.getSelect(dl, NVT, isShort, LoS, LoL));
3521 Hi = DAG.getSelect(dl, NVT, isShort, HiS, HiL);
3527 DAG.getNode(
ISD::SRL, dl, NVT, InL, Amt),
3528 DAG.getNode(
ISD::SHL, dl, NVT, InH, AmtLack));
3532 DAG.getConstant(NVTBits - 1, dl, ShTy));
3535 Lo = DAG.getSelect(dl, NVT,
isZero, InL,
3536 DAG.getSelect(dl, NVT, isShort, LoS, LoL));
3537 Hi = DAG.getSelect(dl, NVT, isShort, HiS, HiL);
3562 EVT NewVT = getSetCCResultType(
LHS.getValueType());
3567 Res = DAG.getBoolExtOrTrunc(Res,
DL,
N->getValueType(0), NewVT);
3568 SplitInteger(Res,
Lo,
Hi);
3571void DAGTypeLegalizer::ExpandIntRes_MINMAX(
SDNode *
N,
3580 unsigned NumBits =
N->getValueType(0).getScalarSizeInBits();
3581 unsigned NumHalfBits = NumBits / 2;
3582 if (DAG.ComputeNumSignBits(
LHS) > NumHalfBits &&
3583 DAG.ComputeNumSignBits(
RHS) > NumHalfBits) {
3584 SDValue LHSL, LHSH, RHSL, RHSH;
3585 GetExpandedInteger(
LHS, LHSL, LHSH);
3586 GetExpandedInteger(
RHS, RHSL, RHSH);
3589 Lo = DAG.getNode(
N->getOpcode(),
DL, NVT, LHSL, RHSL);
3591 DAG.getShiftAmountConstant(NumHalfBits - 1, NVT,
DL));
3599 SDValue LHSL, LHSH, RHSL, RHSH;
3600 GetExpandedInteger(
LHS, LHSL, LHSH);
3601 GetExpandedInteger(
RHS, RHSL, RHSH);
3603 EVT CCT = getSetCCResultType(NVT);
3606 DAG.getSetCC(
DL, CCT, LHSH, DAG.getConstant(0,
DL, NVT),
ISD::SETLT);
3608 Lo = DAG.getSelect(
DL, NVT, HiNeg, LHSL, DAG.getAllOnesConstant(
DL, NVT));
3610 Lo = DAG.getSelect(
DL, NVT, HiNeg, DAG.getConstant(0,
DL, NVT), LHSL);
3612 Hi = DAG.getNode(
N->getOpcode(),
DL, NVT, {LHSH, RHSH});
3616 const APInt *RHSVal =
nullptr;
3618 RHSVal = &RHSConst->getAPIntValue();
3625 SDValue LHSL, LHSH, RHSL, RHSH;
3626 GetExpandedInteger(
LHS, LHSL, LHSH);
3627 GetExpandedInteger(
RHS, RHSL, RHSH);
3629 EVT CCT = getSetCCResultType(NVT);
3635 Hi = DAG.getNode(
N->getOpcode(),
DL, NVT, {LHSH, RHSH});
3638 SDValue IsHiLeft = DAG.getSetCC(
DL, CCT, LHSH, RHSH, CondC);
3642 SDValue LoCmp = DAG.getSelect(
DL, NVT, IsHiLeft, LHSL, RHSL);
3645 SDValue LoMinMax = DAG.getNode(LoOpc,
DL, NVT, {LHSL, RHSL});
3647 Lo = DAG.getSelect(
DL, NVT, IsHiEq, LoMinMax, LoCmp);
3654 switch (
N->getOpcode()) {
3681 EVT VT =
N->getValueType(0);
3682 EVT CCT = getSetCCResultType(VT);
3685 SplitInteger(Result,
Lo,
Hi);
3689 SDValue ExpandedCMP = TLI.expandCMP(
N, DAG);
3690 SplitInteger(ExpandedCMP,
Lo,
Hi);
3693void DAGTypeLegalizer::ExpandIntRes_ADDSUB(
SDNode *
N,
3697 SDValue LHSL, LHSH, RHSL, RHSH;
3698 GetExpandedInteger(
N->getOperand(0), LHSL, LHSH);
3699 GetExpandedInteger(
N->getOperand(1), RHSL, RHSH);
3702 SDValue LoOps[2] = { LHSL, RHSL };
3703 SDValue HiOps[3] = { LHSH, RHSH };
3705 bool HasOpCarry = TLI.isOperationLegalOrCustom(
3707 TLI.getTypeToExpandTo(*DAG.getContext(), NVT));
3709 SDVTList VTList = DAG.getVTList(NVT, getSetCCResultType(NVT));
3713 Hi = DAG.computeKnownBits(HiOps[2]).isZero()
3719 Hi = DAG.computeKnownBits(HiOps[2]).isZero()
3732 TLI.isOperationLegalOrCustom(
N->getOpcode() ==
ISD::ADD ?
3734 TLI.getTypeToExpandTo(*DAG.getContext(), NVT));
3737 SDVTList VTList = DAG.getVTList(NVT, MVT::Glue);
3751 TLI.isOperationLegalOrCustom(
N->getOpcode() ==
ISD::ADD ?
3753 TLI.getTypeToExpandTo(*DAG.getContext(), NVT));
3757 EVT OvfVT = getSetCCResultType(NVT);
3758 SDVTList VTList = DAG.getVTList(NVT, OvfVT);
3773 OVF = DAG.
getNode(
ISD::AND, dl, OvfVT, DAG.getConstant(1, dl, OvfVT), OVF);
3776 OVF = DAG.getZExtOrTrunc(OVF, dl, NVT);
3780 OVF = DAG.getSExtOrTrunc(OVF, dl, NVT);
3792 Cmp = DAG.getSetCC(dl, getSetCCResultType(NVT),
Lo,
3796 Cmp = DAG.getSetCC(dl, getSetCCResultType(NVT), LoOps[0],
3799 Cmp = DAG.getSetCC(dl, getSetCCResultType(NVT), LoOps[0],
3802 Cmp = DAG.getSetCC(dl, getSetCCResultType(NVT),
Lo, LoOps[0],
3807 Carry = DAG.getZExtOrTrunc(Cmp, dl, NVT);
3809 Carry = DAG.getSelect(dl, NVT, Cmp, DAG.getConstant(1, dl, NVT),
3810 DAG.getConstant(0, dl, NVT));
3813 Hi = DAG.getNode(
ISD::SUB, dl, NVT, HiOps[0], Carry);
3822 DAG.getSetCC(dl, getSetCCResultType(LoOps[0].
getValueType()),
3827 Borrow = DAG.getZExtOrTrunc(Cmp, dl, NVT);
3829 Borrow = DAG.getSelect(dl, NVT, Cmp, DAG.getConstant(1, dl, NVT),
3830 DAG.getConstant(0, dl, NVT));
3836void DAGTypeLegalizer::ExpandIntRes_ADDSUBC(
SDNode *
N,
3839 SDValue LHSL, LHSH, RHSL, RHSH;
3841 GetExpandedInteger(
N->getOperand(0), LHSL, LHSH);
3842 GetExpandedInteger(
N->getOperand(1), RHSL, RHSH);
3843 SDVTList VTList = DAG.getVTList(LHSL.
getValueType(), MVT::Glue);
3844 SDValue LoOps[2] = { LHSL, RHSL };
3845 SDValue HiOps[3] = { LHSH, RHSH };
3859 ReplaceValueWith(
SDValue(
N, 1),
Hi.getValue(1));
3862void DAGTypeLegalizer::ExpandIntRes_ADDSUBE(
SDNode *
N,
3865 SDValue LHSL, LHSH, RHSL, RHSH;
3867 GetExpandedInteger(
N->getOperand(0), LHSL, LHSH);
3868 GetExpandedInteger(
N->getOperand(1), RHSL, RHSH);
3869 SDVTList VTList = DAG.getVTList(LHSL.
getValueType(), MVT::Glue);
3871 SDValue HiOps[3] = { LHSH, RHSH };
3873 Lo = DAG.
getNode(
N->getOpcode(), dl, VTList, LoOps);
3875 Hi = DAG.
getNode(
N->getOpcode(), dl, VTList, HiOps);
3879 ReplaceValueWith(
SDValue(
N, 1),
Hi.getValue(1));
3882void DAGTypeLegalizer::ExpandIntRes_UADDSUBO(
SDNode *
N,
3890 unsigned CarryOp, NoCarryOp;
3892 switch(
N->getOpcode()) {
3907 bool HasCarryOp = TLI.isOperationLegalOrCustom(
3908 CarryOp, TLI.getTypeToExpandTo(*DAG.getContext(),
LHS.getValueType()));
3912 SDValue LHSL, LHSH, RHSL, RHSH;
3913 GetExpandedInteger(
LHS, LHSL, LHSH);
3914 GetExpandedInteger(
RHS, RHSL, RHSH);
3915 SDVTList VTList = DAG.getVTList(LHSL.
getValueType(),
N->getValueType(1));
3916 SDValue LoOps[2] = { LHSL, RHSL };
3917 SDValue HiOps[3] = { LHSH, RHSH };
3919 Lo = DAG.
getNode(
N->getOpcode(), dl, VTList, LoOps);
3921 Hi = DAG.
getNode(CarryOp, dl, VTList, HiOps);
3928 SplitInteger(Sum,
Lo,
Hi);
3934 Ovf = DAG.getSetCC(dl,
N->getValueType(1),
Or,
3935 DAG.getConstant(0, dl,
Lo.getValueType()),
ISD::SETEQ);
3939 DAG.getSetCC(dl,
N->getValueType(1),
LHS,
3944 Ovf = DAG.getSetCC(dl,
N->getValueType(1), Sum,
LHS,
Cond);
3950 ReplaceValueWith(
SDValue(
N, 1), Ovf);
3956 SDValue LHSL, LHSH, RHSL, RHSH;
3958 GetExpandedInteger(
N->getOperand(0), LHSL, LHSH);
3959 GetExpandedInteger(
N->getOperand(1), RHSL, RHSH);
3960 SDVTList VTList = DAG.getVTList(LHSL.
getValueType(),
N->getValueType(1));
3964 Lo = DAG.
getNode(
N->getOpcode(), dl, VTList, LoOps);
3966 Hi = DAG.
getNode(
N->getOpcode(), dl, VTList, HiOps);
3970 ReplaceValueWith(
SDValue(
N, 1),
Hi.getValue(1));
3973void DAGTypeLegalizer::ExpandIntRes_SADDSUBO_CARRY(
SDNode *
N,
3976 SDValue LHSL, LHSH, RHSL, RHSH;
3978 GetExpandedInteger(
N->getOperand(0), LHSL, LHSH);
3979 GetExpandedInteger(
N->getOperand(1), RHSL, RHSH);
3980 SDVTList VTList = DAG.getVTList(LHSL.
getValueType(),
N->getValueType(1));
3985 Lo = DAG.getNode(CarryOp, dl, VTList, { LHSL, RHSL,
N->
getOperand(2) });
3986 Hi = DAG.getNode(
N->getOpcode(), dl, VTList, { LHSH, RHSH, Lo.getValue(1) });
3990 ReplaceValueWith(
SDValue(
N, 1),
Hi.getValue(1));
3993void DAGTypeLegalizer::ExpandIntRes_ANY_EXTEND(
SDNode *
N,
3995 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
3998 if (
Op.getValueType().bitsLE(NVT)) {
4001 Hi = DAG.getUNDEF(NVT);
4005 assert(getTypeAction(
Op.getValueType()) ==
4007 "Only know how to promote this result!");
4010 "Operand over promoted?");
4012 SplitInteger(Res,
Lo,
Hi);
4016void DAGTypeLegalizer::ExpandIntRes_AssertSext(
SDNode *
N,
4019 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
4020 EVT NVT =
Lo.getValueType();
4025 if (NVTBits < EVTBits) {
4028 EVTBits - NVTBits)));
4033 DAG.getShiftAmountConstant(NVTBits - 1, NVT, dl));
4037void DAGTypeLegalizer::ExpandIntRes_AssertZext(
SDNode *
N,
4040 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
4041 EVT NVT =
Lo.getValueType();
4046 if (NVTBits < EVTBits) {
4049 EVTBits - NVTBits)));
4053 Hi = DAG.getConstant(0, dl, NVT);
4057void DAGTypeLegalizer::ExpandIntRes_BITREVERSE(
SDNode *
N,
4060 GetExpandedInteger(
N->getOperand(0),
Hi,
Lo);
4065void DAGTypeLegalizer::ExpandIntRes_BSWAP(
SDNode *
N,
4068 GetExpandedInteger(
N->getOperand(0),
Hi,
Lo);
4077 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
4078 EVT NVT =
Lo.getValueType();
4081 Hi = DAG.getConstant(0, dl, NVT);
4084void DAGTypeLegalizer::ExpandIntRes_Constant(
SDNode *
N,
4086 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
4089 const APInt &Cst =
Constant->getAPIntValue();
4090 bool IsTarget =
Constant->isTargetOpcode();
4091 bool IsOpaque =
Constant->isOpaque();
4093 Lo = DAG.getConstant(Cst.
trunc(NBitWidth), dl, NVT, IsTarget, IsOpaque);
4094 Hi = DAG.getConstant(Cst.
lshr(NBitWidth).
trunc(NBitWidth), dl, NVT, IsTarget,
4102 GetExpandedInteger(N0,
Lo,
Hi);
4103 EVT NVT =
Lo.getValueType();
4109 Hi = DAG.getConstant(0, dl, NVT);
4119 bool HasSubCarry = TLI.isOperationLegalOrCustom(
4124 DAG.getShiftAmountConstant(NVT.
getSizeInBits() - 1, NVT, dl));
4125 SDVTList VTList = DAG.getVTList(NVT, getSetCCResultType(NVT));
4134 EVT VT =
N->getValueType(0);
4136 DAG.getConstant(0, dl, VT), N0);
4138 SplitInteger(Neg, NegLo, NegHi);
4140 SDValue HiIsNeg = DAG.getSetCC(dl, getSetCCResultType(NVT),
Hi,
4142 Lo = DAG.getSelect(dl, NVT, HiIsNeg, NegLo,
Lo);
4143 Hi = DAG.getSelect(dl, NVT, HiIsNeg, NegHi,
Hi);
4146void DAGTypeLegalizer::ExpandIntRes_CTLZ(
SDNode *
N,
4150 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
4151 EVT NVT =
Lo.getValueType();
4153 SDValue HiNotZero = DAG.getSetCC(dl, getSetCCResultType(NVT),
Hi,
4156 SDValue LoLZ = DAG.getNode(
N->getOpcode(), dl, NVT,
Lo);
4159 Lo = DAG.getSelect(dl, NVT, HiNotZero, HiLZ,
4160 DAG.getNode(
ISD::ADD, dl, NVT, LoLZ,
4163 Hi = DAG.getConstant(0, dl, NVT);
4168 SplitInteger(Result,
Lo,
Hi);
4173 EVT VT =
N->getValueType(0);
4178 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
4179 "LibCall explicitly requested, but not available");
4181 if (RTLIB::LibcallImpl LCImpl = DAG.getLibcalls().getLibcallImpl(LC)) {
4182 TargetLowering::MakeLibCallOptions CallOptions;
4186 TLI.makeLibCall(DAG, LCImpl, IntVT,
Op, CallOptions,
DL).first;
4187 SplitInteger(DAG.getSExtOrTrunc(Res,
DL, VT),
Lo,
Hi);
4195 GetExpandedInteger(
Op,
Lo,
Hi);
4196 EVT NVT =
Lo.getValueType();
4199 Hi = DAG.getConstant(0,
DL, NVT);
4202void DAGTypeLegalizer::ExpandIntRes_CTTZ(
SDNode *
N,
4206 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
4207 EVT NVT =
Lo.getValueType();
4209 SDValue LoNotZero = DAG.getSetCC(dl, getSetCCResultType(NVT),
Lo,
4215 Lo = DAG.getSelect(dl, NVT, LoNotZero, LoLZ,
4216 DAG.getNode(
ISD::ADD, dl, NVT, HiLZ,
4219 Hi = DAG.getConstant(0, dl, NVT);
4225 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
4232 DAG.getShiftAmountConstant(NBitWidth - 1, NVT, dl));
4236 ReplaceValueWith(
SDValue(
N, 1), Chain);
4244 Chain =
Op.getValue(1);
4253 EVT VT =
N->getValueType(0);
4257 bool IsStrict =
N->isStrictFPOpcode();
4259 SDValue Op =
N->getOperand(IsStrict ? 1 : 0);
4263 Op.getValueType() == MVT::bf16) {
4269 EVT OpVT =
Op.getValueType();
4273 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unexpected fp-to-xint conversion!");
4274 TargetLowering::MakeLibCallOptions CallOptions;
4279 std::pair<SDValue, SDValue> Tmp = TLI.makeLibCall(DAG, LC, VT,
Op,
4280 CallOptions, dl, Chain);
4281 SplitInteger(Tmp.first,
Lo,
Hi);
4284 ReplaceValueWith(
SDValue(
N, 1), Tmp.second);
4289 SDValue Res = TLI.expandFP_TO_INT_SAT(
N, DAG);
4290 SplitInteger(Res,
Lo,
Hi);
4296 bool IsStrict =
N->isStrictFPOpcode();
4297 SDValue Op =
N->getOperand(IsStrict ? 1 : 0);
4300 EVT VT =
Op.getValueType();
4302 if (VT == MVT::f16) {
4308 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
4312 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unexpected lround input type!");
4316 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unexpected lrint input type!");
4320 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unexpected llround input type!");
4324 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unexpected llrint input type!");
4328 EVT RetVT =
N->getValueType(0);
4330 TargetLowering::MakeLibCallOptions CallOptions;
4332 std::pair<SDValue, SDValue> Tmp = TLI.makeLibCall(DAG, LC, RetVT,
4333 Op, CallOptions, dl,
4335 SplitInteger(Tmp.first,
Lo,
Hi);
4337 if (
N->isStrictFPOpcode())
4338 ReplaceValueWith(
SDValue(
N, 1), Tmp.second);
4341void DAGTypeLegalizer::ExpandIntRes_LOAD(
LoadSDNode *
N,
4343 assert(!
N->isAtomic() &&
"Should have been a ATOMIC_LOAD?");
4346 ExpandRes_NormalLoad(
N,
Lo,
Hi);
4352 EVT VT =
N->getValueType(0);
4353 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
4358 AAMDNodes AAInfo =
N->getAAInfo();
4363 if (
N->getMemoryVT().bitsLE(NVT)) {
4364 EVT MemVT =
N->getMemoryVT();
4366 Lo = DAG.getExtLoad(ExtType, dl, NVT, Ch, Ptr,
N->getPointerInfo(), MemVT,
4367 N->getBaseAlign(), MMOFlags, AAInfo);
4375 unsigned LoSize =
Lo.getValueSizeInBits();
4377 DAG.getShiftAmountConstant(LoSize - 1, NVT, dl));
4380 Hi = DAG.getConstant(0, dl, NVT);
4384 Hi = DAG.getUNDEF(NVT);
4386 }
else if (DAG.getDataLayout().isLittleEndian()) {
4388 Lo = DAG.getLoad(NVT, dl, Ch, Ptr,
N->getPointerInfo(),
N->getBaseAlign(),
4391 unsigned ExcessBits =
4398 Hi = DAG.getExtLoad(ExtType, dl, NVT, Ch, Ptr,
4399 N->getPointerInfo().getWithOffset(IncrementSize), NEVT,
4400 N->getBaseAlign(), MMOFlags, AAInfo);
4409 EVT MemVT =
N->getMemoryVT();
4412 unsigned ExcessBits = (EBytes - IncrementSize)*8;
4415 Hi = DAG.getExtLoad(ExtType, dl, NVT, Ch, Ptr,
N->getPointerInfo(),
4418 N->getBaseAlign(), MMOFlags, AAInfo);
4424 N->getPointerInfo().getWithOffset(IncrementSize),
4426 N->getBaseAlign(), MMOFlags, AAInfo);
4438 DAG.getShiftAmountConstant(ExcessBits, NVT, dl)));
4442 DAG.getShiftAmountConstant(
4449 ReplaceValueWith(
SDValue(
N, 1), Ch);
4452void DAGTypeLegalizer::ExpandIntRes_Logical(
SDNode *
N,
4456 GetExpandedInteger(
N->getOperand(0), LL, LH);
4457 GetExpandedInteger(
N->getOperand(1), RL, RH);
4461 Flags.setDisjoint(
N->getFlags().hasDisjoint());
4463 Lo = DAG.getNode(
N->getOpcode(), dl, LL.
getValueType(), LL, RL, Flags);
4464 Hi = DAG.getNode(
N->getOpcode(), dl, LL.
getValueType(), LH, RH, Flags);
4467void DAGTypeLegalizer::ExpandIntRes_MUL(
SDNode *
N,
4469 EVT VT =
N->getValueType(0);
4470 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
4474 GetExpandedInteger(
N->getOperand(0), LL, LH);
4475 GetExpandedInteger(
N->getOperand(1), RL, RH);
4477 if (TLI.expandMUL(
N,
Lo,
Hi, NVT, DAG,
4484 RTLIB::LibcallImpl LCImpl = DAG.getLibcalls().getLibcallImpl(LC);
4485 if (LCImpl == RTLIB::Unsupported) {
4488 TLI.forceExpandMultiply(DAG, dl,
false,
Lo,
Hi, LL, RL, LH, RH);
4494 SDValue Ops[2] = {
N->getOperand(0),
N->getOperand(1) };
4495 TargetLowering::MakeLibCallOptions CallOptions;
4497 SplitInteger(TLI.makeLibCall(DAG, LCImpl, VT,
Ops, CallOptions, dl).first,
Lo,
4504 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
4505 SDVTList VTs = DAG.getVTList(NVT, NVT, MVT::Other);
4506 SDValue R = DAG.getNode(
N->getOpcode(),
DL, VTs,
N->getOperand(0));
4509 ReplaceValueWith(
SDValue(
N, 1),
R.getValue(2));
4514 SplitInteger(Result,
Lo,
Hi);
4520 SplitInteger(Result,
Lo,
Hi);
4526 SplitInteger(Result,
Lo,
Hi);
4537 EVT VT =
N->getValueType(0);
4541 uint64_t Scale =
N->getConstantOperandVal(2);
4553 EVT BoolVT = getSetCCResultType(VT);
4555 Result = DAG.getNode(MulOp, dl, DAG.getVTList(VT, BoolVT),
LHS,
RHS);
4561 SDValue SatMin = DAG.getConstant(MinVal, dl, VT);
4562 SDValue SatMax = DAG.getConstant(MaxVal, dl, VT);
4568 Result = DAG.getSelect(dl, VT, ProdNeg, SatMin, SatMax);
4569 Result = DAG.getSelect(dl, VT, Overflow, Result, Product);
4574 SDValue SatMax = DAG.getConstant(MaxVal, dl, VT);
4575 Result = DAG.getSelect(dl, VT, Overflow, SatMax, Product);
4578 SplitInteger(Result,
Lo,
Hi);
4584 assert(Scale <= VTSize &&
"Scale can't be larger than the value type size.");
4586 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
4588 GetExpandedInteger(
LHS, LL, LH);
4589 GetExpandedInteger(
RHS, RL, RH);
4593 if (!TLI.expandMUL_LOHI(LoHiOp, VT, dl,
LHS,
RHS, Result, NVT, DAG,
4600 TLI.forceExpandWideMUL(DAG, dl,
Signed,
LHS,
RHS, LoTmp, HiTmp);
4601 SplitInteger(LoTmp, Result[0], Result[1]);
4602 SplitInteger(HiTmp, Result[2], Result[3]);
4604 assert(
Result.size() == 4 &&
"Unexpected number of partlets in the result");
4607 assert((VTSize == NVTSize * 2) &&
"Expected the new value type to be half "
4608 "the size of the current value type");
4629 uint64_t Part0 = Scale / NVTSize;
4630 if (Scale % NVTSize) {
4631 SDValue ShiftAmount = DAG.getShiftAmountConstant(Scale % NVTSize, NVT, dl);
4634 Hi = DAG.getNode(
ISD::FSHR, dl, NVT, Result[Part0 + 2], Result[Part0 + 1],
4646 if (Scale == VTSize)
4665 SDValue NVTZero = DAG.getConstant(0, dl, NVT);
4666 SDValue NVTNeg1 = DAG.getAllOnesConstant(dl, NVT);
4667 EVT BoolNVT = getSetCCResultType(NVT);
4670 if (Scale < NVTSize) {
4673 DAG.getNode(
ISD::SRL, dl, NVT, ResultHL,
4674 DAG.getShiftAmountConstant(Scale, NVT, dl));
4675 SDValue Tmp = DAG.getNode(
ISD::OR, dl, NVT, HLAdjusted, ResultHH);
4676 SatMax = DAG.getSetCC(dl, BoolNVT, Tmp, NVTZero,
ISD::SETNE);
4677 }
else if (Scale == NVTSize) {
4679 SatMax = DAG.getSetCC(dl, BoolNVT, ResultHH, NVTZero,
ISD::SETNE);
4680 }
else if (Scale < VTSize) {
4684 DAG.getShiftAmountConstant(Scale - NVTSize, NVT, dl));
4685 SatMax = DAG.getSetCC(dl, BoolNVT, HLAdjusted, NVTZero,
ISD::SETNE);
4688 "(and saturation can't happen with Scale==VTSize).");
4690 Hi = DAG.getSelect(dl, NVT, SatMax, NVTNeg1,
Hi);
4691 Lo = DAG.getSelect(dl, NVT, SatMax, NVTNeg1,
Lo);
4695 if (Scale < NVTSize) {
4700 unsigned OverflowBits = VTSize - Scale + 1;
4701 assert(OverflowBits <= VTSize && OverflowBits > NVTSize &&
4702 "Extent of overflow bits must start within HL");
4703 SDValue HLHiMask = DAG.getConstant(
4705 SDValue HLLoMask = DAG.getConstant(
4712 DAG.getNode(
ISD::AND, dl, BoolNVT, HHEQ0, HLUGT));
4718 DAG.getNode(
ISD::AND, dl, BoolNVT, HHEQ, HLULT));
4719 }
else if (Scale == NVTSize) {
4725 DAG.getNode(
ISD::AND, dl, BoolNVT, HHEQ0, HLNeg));
4731 DAG.getNode(
ISD::AND, dl, BoolNVT, HHEQ, HLPos));
4732 }
else if (Scale < VTSize) {
4735 unsigned OverflowBits = VTSize - Scale + 1;
4736 SDValue HHHiMask = DAG.getConstant(
4738 SDValue HHLoMask = DAG.getConstant(
4740 SatMax = DAG.getSetCC(dl, BoolNVT, ResultHH, HHLoMask,
ISD::SETGT);
4741 SatMin = DAG.getSetCC(dl, BoolNVT, ResultHH, HHHiMask,
ISD::SETLT);
4748 Hi = DAG.getSelect(dl, NVT, SatMax, DAG.getConstant(MaxHi, dl, NVT),
Hi);
4749 Lo = DAG.getSelect(dl, NVT, SatMax, DAG.getConstant(MaxLo, dl, NVT),
Lo);
4752 Hi = DAG.getSelect(dl, NVT, SatMin, DAG.getConstant(MinHi, dl, NVT),
Hi);
4753 Lo = DAG.getSelect(dl, NVT, SatMin, NVTZero,
Lo);
4760 SDValue Res = TLI.expandFixedPointDiv(
N->getOpcode(), dl,
N->getOperand(0),
4762 N->getConstantOperandVal(2), DAG);
4766 N->getConstantOperandVal(2), TLI, DAG);
4767 SplitInteger(Res,
Lo,
Hi);
4770void DAGTypeLegalizer::ExpandIntRes_SADDSUBO(
SDNode *Node,
4773 "Node has unexpected Opcode");
4783 bool HasCarryOp = TLI.isOperationLegalOrCustom(
4784 CarryOp, TLI.getTypeToExpandTo(*DAG.getContext(),
LHS.getValueType()));
4788 SDValue LHSL, LHSH, RHSL, RHSH;
4789 GetExpandedInteger(
LHS, LHSL, LHSH);
4790 GetExpandedInteger(
RHS, RHSL, RHSH);
4791 SDVTList VTList = DAG.getVTList(LHSL.
getValueType(),
Node->getValueType(1));
4794 Hi = DAG.getNode(CarryOp, dl, VTList, { LHSH, RHSH,
Lo.
getValue(1) });
4803 SplitInteger(Sum,
Lo,
Hi);
4828 EVT VT =
LHS.getValueType();
4831 SignsMatch = DAG.getNOT(dl, SignsMatch, VT);
4835 EVT OType =
Node->getValueType(1);
4836 Ovf = DAG.getSetCC(dl, OType, Ovf, DAG.getConstant(0, dl, VT),
ISD::SETLT);
4840 ReplaceValueWith(
SDValue(Node, 1), Ovf);
4843void DAGTypeLegalizer::ExpandIntRes_SDIV(
SDNode *
N,
4845 EVT VT =
N->getValueType(0);
4847 SDValue Ops[2] = {
N->getOperand(0),
N->getOperand(1) };
4856 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unsupported SDIV!");
4858 TargetLowering::MakeLibCallOptions CallOptions;
4860 SplitInteger(TLI.makeLibCall(DAG, LC, VT,
Ops, CallOptions, dl).first,
Lo,
Hi);
4863void DAGTypeLegalizer::ExpandIntRes_ShiftThroughStack(
SDNode *
N,
SDValue &
Lo,
4866 SDValue Shiftee =
N->getOperand(0);
4873 LoadVT = TLI.getTypeToTransformTo(*DAG.getContext(), LoadVT);
4874 }
while (!TLI.isTypeLegal(LoadVT));
4879 "Shifting unit is not a a power of two!");
4881 const bool IsOneStepShift =
4882 DAG.computeKnownBits(ShAmt).countMinTrailingZeros() >=
4887 if (!IsOneStepShift)
4888 ShAmt = DAG.getFreeze(ShAmt);
4891 assert(VTBitWidth % 8 == 0 &&
"Shifting a not byte multiple value?");
4892 unsigned VTByteWidth = VTBitWidth / 8;
4894 "Shiftee type size is not a power of two!");
4895 unsigned StackSlotByteWidth = 2 * VTByteWidth;
4896 unsigned StackSlotBitWidth = 8 * StackSlotByteWidth;
4901 Align StackAlign = DAG.getReducedAlign(StackSlotVT,
false);
4903 DAG.CreateStackTemporary(StackSlotVT.
getStoreSize(), StackAlign);
4904 EVT PtrTy =
StackPtr.getValueType();
4905 SDValue Ch = DAG.getEntryNode();
4908 DAG.getMachineFunction(),
4914 unsigned WideningOpc =
4916 Init = DAG.
getNode(WideningOpc, dl, StackSlotVT, Shiftee);
4919 SDValue AllZeros = DAG.getConstant(0, dl, VT);
4923 Ch = DAG.getStore(Ch, dl, Init, StackPtr, StackPtrInfo, StackAlign);
4929 Flags.setExact(IsOneStepShift);
4932 DAG.getConstant(
Log2_32(ShiftUnitInBits), dl, ShAmtVT), Flags);
4934 DAG.getNode(
ISD::SHL, dl, ShAmtVT, SrlTmp,
4935 DAG.getConstant(
Log2_32(ShiftUnitInBits), dl, ShAmtVT));
4938 DAG.getNode(
ISD::SRL, dl, ShAmtVT, BitOffset,
4943 DAG.getConstant(VTByteWidth - 1, dl, ShAmtVT));
4950 if (DAG.getDataLayout().isBigEndian())
4951 WillIndexUpwards = !WillIndexUpwards;
4954 if (WillIndexUpwards) {
4957 AdjStackPtr = DAG.getMemBasePlusOffset(
4958 StackPtr, DAG.getConstant(VTByteWidth, dl, PtrTy), dl);
4959 ByteOffset = DAG.getNegative(ByteOffset, dl, ShAmtVT);
4963 ByteOffset = DAG.getSExtOrTrunc(ByteOffset, dl, PtrTy);
4964 AdjStackPtr = DAG.getMemBasePlusOffset(AdjStackPtr, ByteOffset, dl);
4968 DAG.getLoad(VT, dl, Ch, AdjStackPtr,
4973 if (!IsOneStepShift) {
4975 DAG.getNode(
ISD::AND, dl, ShAmtVT, ShAmt,
4976 DAG.getConstant(ShiftUnitInBits - 1, dl, ShAmtVT));
4977 Res = DAG.
getNode(
N->getOpcode(), dl, VT, Res, ShAmtRem);
4981 SplitInteger(Res,
Lo,
Hi);
4984void DAGTypeLegalizer::ExpandIntRes_Shift(
SDNode *
N,
4986 EVT VT =
N->getValueType(0);
4987 unsigned Opc =
N->getOpcode();
4993 return ExpandShiftByConstant(
N, CN->getAPIntValue(),
Lo,
Hi);
4997 if (ExpandShiftWithKnownAmountBit(
N,
Lo,
Hi))
5014 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
5016 const bool LegalOrCustom =
5020 unsigned ExpansionFactor = 1;
5022 for (EVT TmpVT = NVT;;) {
5023 EVT NewTMPVT = TLI.getTypeToTransformTo(*DAG.getContext(), TmpVT);
5024 if (NewTMPVT == TmpVT)
5031 TLI.preferredShiftLegalizationStrategy(DAG,
N, ExpansionFactor);
5034 return ExpandIntRes_ShiftThroughStack(
N,
Lo,
Hi);
5036 if (LegalOrCustom &&
5040 GetExpandedInteger(
N->getOperand(0), LHSL, LHSH);
5046 SDValue ShiftOp =
N->getOperand(1);
5047 EVT ShiftTy = TLI.getShiftAmountTy(VT, DAG.getDataLayout());
5049 ShiftOp = DAG.getZExtOrTrunc(ShiftOp, dl, ShiftTy);
5052 Lo = DAG.
getNode(PartsOpc, dl, DAG.getVTList(VT, VT),
Ops);
5053 Hi =
Lo.getValue(1);
5058 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
5072 if (RTLIB::LibcallImpl LibcallImpl = DAG.getLibcalls().getLibcallImpl(LC)) {
5075 SDValue ShAmt = DAG.getZExtOrTrunc(
N->getOperand(1), dl, ShAmtTy);
5077 TargetLowering::MakeLibCallOptions CallOptions;
5080 TLI.makeLibCall(DAG, LibcallImpl, VT,
Ops, CallOptions, dl).first,
Lo,
5085 if (!ExpandShiftWithUnknownAmountBit(
N,
Lo,
Hi))
5089void DAGTypeLegalizer::ExpandIntRes_SIGN_EXTEND(
SDNode *
N,
5091 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
5094 if (
Op.getValueType().bitsLE(NVT)) {
5100 DAG.getShiftAmountConstant(LoSize - 1, NVT, dl));
5104 assert(getTypeAction(
Op.getValueType()) ==
5106 "Only know how to promote this result!");
5109 "Operand over promoted?");
5111 SplitInteger(Res,
Lo,
Hi);
5119void DAGTypeLegalizer::
5122 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
5125 if (EVT.
bitsLE(
Lo.getValueType())) {
5133 DAG.getShiftAmountConstant(
Hi.getValueSizeInBits() - 1,
5134 Hi.getValueType(), dl));
5145void DAGTypeLegalizer::ExpandIntRes_SREM(
SDNode *
N,
5147 EVT VT =
N->getValueType(0);
5149 SDValue Ops[2] = {
N->getOperand(0),
N->getOperand(1) };
5158 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unsupported SREM!");
5160 TargetLowering::MakeLibCallOptions CallOptions;
5162 SplitInteger(TLI.makeLibCall(DAG, LC, VT,
Ops, CallOptions, dl).first,
Lo,
Hi);
5165void DAGTypeLegalizer::ExpandIntRes_TRUNCATE(
SDNode *
N,
5167 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
5177void DAGTypeLegalizer::ExpandIntRes_XMULO(
SDNode *
N,
5179 EVT VT =
N->getValueType(0);
5198 SDValue LHSHigh, LHSLow, RHSHigh, RHSLow;
5199 GetExpandedInteger(
LHS, LHSLow, LHSHigh);
5200 GetExpandedInteger(
RHS, RHSLow, RHSHigh);
5202 EVT BitVT =
N->getValueType(1);
5203 SDVTList VTHalfWithO = DAG.getVTList(HalfVT, BitVT);
5205 SDValue HalfZero = DAG.getConstant(0, dl, HalfVT);
5207 DAG.getSetCC(dl, BitVT, LHSHigh, HalfZero,
ISD::SETNE),
5208 DAG.getSetCC(dl, BitVT, RHSHigh, HalfZero,
ISD::SETNE));
5227 SplitInteger(Three,
Lo,
Hi);
5231 ReplaceValueWith(
SDValue(
N, 1), Overflow);
5236 EVT PtrVT = TLI.getPointerTy(DAG.getDataLayout());
5241 RTLIB::LibcallImpl LCImpl = DAG.getLibcalls().getLibcallImpl(LC);
5245 if (LCImpl == RTLIB::Unsupported ||
5247 DAG.getMachineFunction().getName()) {
5250 TLI.forceExpandWideMUL(DAG, dl,
true,
N->getOperand(0),
5251 N->getOperand(1), MulLo, MulHi);
5256 DAG.getSetCC(dl,
N->getValueType(1), MulHi, SRA,
ISD::SETNE);
5257 SplitInteger(MulLo,
Lo,
Hi);
5258 ReplaceValueWith(
SDValue(
N, 1), Overflow);
5262 SDValue Temp = DAG.CreateStackTemporary(PtrVT);
5265 DAG.getStore(DAG.getEntryNode(), dl, DAG.getConstant(0, dl, PtrVT), Temp,
5266 MachinePointerInfo());
5270 EVT ArgVT =
Op.getValueType();
5272 TargetLowering::ArgListEntry
Entry(
Op, ArgTy);
5273 Entry.IsSExt =
true;
5274 Entry.IsZExt =
false;
5275 Args.push_back(Entry);
5279 TargetLowering::ArgListEntry
Entry(
5281 Entry.IsSExt =
true;
5282 Entry.IsZExt =
false;
5283 Args.push_back(Entry);
5285 SDValue Func = DAG.getExternalSymbol(LCImpl, PtrVT);
5287 TargetLowering::CallLoweringInfo CLI(DAG);
5290 .setLibCallee(DAG.getLibcalls().getLibcallImplCallingConv(LCImpl), RetTy,
5291 Func, std::move(Args))
5294 std::pair<SDValue, SDValue> CallInfo = TLI.LowerCallTo(CLI);
5296 SplitInteger(CallInfo.first,
Lo,
Hi);
5298 DAG.getLoad(PtrVT, dl, CallInfo.second, Temp, MachinePointerInfo());
5299 SDValue Ofl = DAG.getSetCC(dl,
N->getValueType(1), Temp2,
5300 DAG.getConstant(0, dl, PtrVT),
5303 ReplaceValueWith(
SDValue(
N, 1), Ofl);
5306void DAGTypeLegalizer::ExpandIntRes_UDIV(
SDNode *
N,
5308 EVT VT =
N->getValueType(0);
5310 SDValue Ops[2] = {
N->getOperand(0),
N->getOperand(1) };
5320 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
5322 if (isTypeLegal(NVT)) {
5324 GetExpandedInteger(
N->getOperand(0), InL, InH);
5326 if (TLI.expandDIVREMByConstant(
N, Result, NVT, DAG, InL, InH)) {
5335 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unsupported UDIV!");
5337 TargetLowering::MakeLibCallOptions CallOptions;
5338 SplitInteger(TLI.makeLibCall(DAG, LC, VT,
Ops, CallOptions, dl).first,
Lo,
Hi);
5341void DAGTypeLegalizer::ExpandIntRes_UREM(
SDNode *
N,
5343 EVT VT =
N->getValueType(0);
5345 SDValue Ops[2] = {
N->getOperand(0),
N->getOperand(1) };
5355 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
5357 if (isTypeLegal(NVT)) {
5359 GetExpandedInteger(
N->getOperand(0), InL, InH);
5361 if (TLI.expandDIVREMByConstant(
N, Result, NVT, DAG, InL, InH)) {
5370 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
"Unsupported UREM!");
5372 TargetLowering::MakeLibCallOptions CallOptions;
5373 SplitInteger(TLI.makeLibCall(DAG, LC, VT,
Ops, CallOptions, dl).first,
Lo,
Hi);
5376void DAGTypeLegalizer::ExpandIntRes_ZERO_EXTEND(
SDNode *
N,
5378 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
5381 if (
Op.getValueType().bitsLE(NVT)) {
5384 Hi = DAG.getConstant(0, dl, NVT);
5388 assert(getTypeAction(
Op.getValueType()) ==
5390 "Only know how to promote this result!");
5393 "Operand over promoted?");
5395 SplitInteger(Res,
Lo,
Hi);
5397 Hi = DAG.getZeroExtendInReg(
Hi, dl,
5403void DAGTypeLegalizer::ExpandIntRes_ATOMIC_LOAD(
SDNode *
N,
5407 SDVTList VTs = DAG.getVTList(VT, MVT::i1, MVT::Other);
5409 SDValue Swap = DAG.getAtomicCmpSwap(
5418void DAGTypeLegalizer::ExpandIntRes_VECREDUCE(
SDNode *
N,
5422 SDValue Res = TLI.expandVecReduce(
N, DAG);
5423 SplitInteger(Res,
Lo,
Hi);
5426void DAGTypeLegalizer::ExpandIntRes_Rotate(
SDNode *
N,
5432 N->getOperand(0),
N->getOperand(1));
5433 SplitInteger(Res,
Lo,
Hi);
5440 GetExpandedInteger(
N->getOperand(0), In3, In4);
5441 GetExpandedInteger(
N->getOperand(1), In1, In2);
5445 unsigned Opc =
N->getOpcode();
5448 EVT ShAmtCCVT = getSetCCResultType(ShAmtVT);
5453 DAG.getConstant(HalfVTBits,
DL, ShAmtVT));
5455 DAG.getSetCC(
DL, ShAmtCCVT, AndNode, DAG.getConstant(0,
DL, ShAmtVT),
5459 EVT NewShAmtVT = TLI.getShiftAmountTy(HalfVT, DAG.getDataLayout());
5460 SDValue NewShAmt = DAG.getAnyExtOrTrunc(ShAmt,
DL, NewShAmtVT);
5465 Lo = DAG.getNode(
Opc,
DL, HalfVT, Select2, Select1, NewShAmt);
5466 Hi = DAG.getNode(
Opc,
DL, HalfVT, Select3, Select2, NewShAmt);
5471 SDValue Res = TLI.expandCLMUL(
N, DAG);
5472 return SplitInteger(Res,
Lo,
Hi);
5476 GetExpandedInteger(
N->getOperand(0), LL, LH);
5477 GetExpandedInteger(
N->getOperand(1), RL, RH);
5491 Hi = DAG.getNode(
ISD::XOR,
DL, HalfVT, LoH, HiLoCross);
5496 EVT VT =
N->getValueType(0);
5503 SDValue VScaleBase = DAG.getVScale(dl, HalfVT, One);
5506 SplitInteger(Res,
Lo,
Hi);
5513 "cannot use llvm.read_register with illegal type", Fn,
N->getDebugLoc()));
5514 ReplaceValueWith(
SDValue(
N, 1),
N->getOperand(0));
5516 std::tie(LoVT, HiVT) = DAG.GetSplitDestVTs(
N->getValueType(0));
5517 Lo = DAG.getPOISON(LoVT);
5518 Hi = DAG.getPOISON(HiVT);
5529bool DAGTypeLegalizer::ExpandIntegerOperand(
SDNode *
N,
unsigned OpNo) {
5533 if (CustomLowerNode(
N,
N->getOperand(OpNo).getValueType(),
false))
5536 switch (
N->getOpcode()) {
5539 dbgs() <<
"ExpandIntegerOperand Op #" << OpNo <<
": ";
5540 N->dump(&DAG);
dbgs() <<
"\n";
5545 case ISD::BR_CC: Res = ExpandIntOp_BR_CC(
N);
break;
5549 Res = ExpandOp_FAKE_USE(
N);
5555 case ISD::SETCC: Res = ExpandIntOp_SETCC(
N);
break;
5568 case ISD::ROTR: Res = ExpandIntOp_Shift(
N);
break;
5573 case ISD::UCMP: Res = ExpandIntOp_CMP(
N);
break;
5577 Res = ExpandIntOp_STACKMAP(
N, OpNo);
5580 Res = ExpandIntOp_PATCHPOINT(
N, OpNo);
5582 case ISD::EXPERIMENTAL_VP_STRIDED_LOAD:
5583 case ISD::EXPERIMENTAL_VP_STRIDED_STORE:
5584 Res = ExpandIntOp_VP_STRIDED(
N, OpNo);
5587 Res = ExpandIntOp_WRITE_REGISTER(
N, OpNo);
5592 if (!Res.
getNode())
return false;
5600 "Invalid operand expansion");
5602 ReplaceValueWith(
SDValue(
N, 0), Res);
5608void DAGTypeLegalizer::IntegerExpandSetCCOperands(
SDValue &NewLHS,
5612 SDValue LHSLo, LHSHi, RHSLo, RHSHi;
5613 GetExpandedInteger(NewLHS, LHSLo, LHSHi);
5614 GetExpandedInteger(NewRHS, RHSLo, RHSHi);
5627 NewRHS = DAG.getConstant(0, dl, NewLHS.
getValueType());
5634 if ((CCCode ==
ISD::SETLT && CST->isZero()) ||
5635 (CCCode ==
ISD::SETGT && CST->isAllOnes())) {
5666 LoCmp = TLI.SimplifySetCC(getSetCCResultType(LHSLo.
getValueType()), LHSLo,
5667 RHSLo, LowCC,
false, DagCombineInfo, dl);
5669 LoCmp = DAG.getSetCC(dl, getSetCCResultType(LHSLo.
getValueType()), LHSLo,
5673 HiCmp = TLI.SimplifySetCC(getSetCCResultType(LHSHi.
getValueType()), LHSHi,
5674 RHSHi, CCCode,
false, DagCombineInfo, dl);
5678 LHSHi, RHSHi, DAG.getCondCode(CCCode));
5687 if ((EqAllowed && (HiCmpC && HiCmpC->
isZero())) ||
5689 ((HiCmpC && HiCmpC->
isOne()) || (LoCmpC && LoCmpC->
isZero())))) {
5698 if (LHSHi == RHSHi) {
5707 EVT ExpandVT = TLI.getTypeToExpandTo(*DAG.getContext(), HiVT);
5708 bool HasSETCCCARRY = TLI.isOperationLegalOrCustom(
ISD::SETCCCARRY, ExpandVT);
5711 if (HasSETCCCARRY) {
5714 bool FlipOperands =
false;
5731 SDVTList VTList = DAG.getVTList(LoVT, getSetCCResultType(LoVT));
5735 DAG.getCondCode(CCCode));
5741 NewLHS = TLI.SimplifySetCC(getSetCCResultType(HiVT), LHSHi, RHSHi,
ISD::SETEQ,
5742 false, DagCombineInfo, dl);
5745 DAG.getSetCC(dl, getSetCCResultType(HiVT), LHSHi, RHSHi,
ISD::SETEQ);
5746 NewLHS = DAG.getSelect(dl, LoCmp.
getValueType(), NewLHS, LoCmp, HiCmp);
5753 IntegerExpandSetCCOperands(NewLHS, NewRHS, CCCode, SDLoc(
N));
5758 NewRHS = DAG.getConstant(0, SDLoc(
N), NewLHS.
getValueType());
5763 return SDValue(DAG.UpdateNodeOperands(
N,
N->getOperand(0),
5764 DAG.getCondCode(CCCode), NewLHS, NewRHS,
5765 N->getOperand(4)), 0);
5771 IntegerExpandSetCCOperands(NewLHS, NewRHS, CCCode, SDLoc(
N));
5776 NewRHS = DAG.getConstant(0, SDLoc(
N), NewLHS.
getValueType());
5781 return SDValue(DAG.UpdateNodeOperands(
N, NewLHS, NewRHS,
5782 N->getOperand(2),
N->getOperand(3),
5783 DAG.getCondCode(CCCode)), 0);
5789 IntegerExpandSetCCOperands(NewLHS, NewRHS, CCCode, SDLoc(
N));
5794 "Unexpected setcc expansion!");
5800 DAG.UpdateNodeOperands(
N, NewLHS, NewRHS, DAG.getCondCode(CCCode)), 0);
5808 SDLoc dl = SDLoc(
N);
5810 SDValue LHSLo, LHSHi, RHSLo, RHSHi;
5811 GetExpandedInteger(
LHS, LHSLo, LHSHi);
5812 GetExpandedInteger(
RHS, RHSLo, RHSHi);
5825 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
5835 GetExpandedInteger(
N->getOperand(1),
Lo,
Hi);
5836 return SDValue(DAG.UpdateNodeOperands(
N,
N->getOperand(0),
Lo), 0);
5840 return TLI.expandCMP(
N, DAG);
5848 GetExpandedInteger(
N->getOperand(0),
Lo,
Hi);
5849 return SDValue(DAG.UpdateNodeOperands(
N,
Lo), 0);
5853 bool IsStrict =
N->isStrictFPOpcode();
5857 SDValue Op =
N->getOperand(IsStrict ? 1 : 0);
5858 EVT DstVT =
N->getValueType(0);
5861 assert(LC != RTLIB::UNKNOWN_LIBCALL &&
5862 "Don't know how to expand this XINT_TO_FP!");
5863 TargetLowering::MakeLibCallOptions CallOptions;
5865 std::pair<SDValue, SDValue> Tmp =
5866 TLI.makeLibCall(DAG, LC, DstVT,
Op, CallOptions, SDLoc(
N), Chain);
5871 ReplaceValueWith(
SDValue(
N, 1), Tmp.second);
5872 ReplaceValueWith(
SDValue(
N, 0), Tmp.first);
5877 assert(!
N->isAtomic() &&
"Should have been a ATOMIC_STORE?");
5880 return ExpandOp_NormalStore(
N, OpNo);
5883 assert(OpNo == 1 &&
"Can only expand the stored value so far");
5885 EVT VT =
N->getOperand(1).getValueType();
5886 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
5890 AAMDNodes AAInfo =
N->getAAInfo();
5896 if (
N->getMemoryVT().bitsLE(NVT)) {
5897 GetExpandedInteger(
N->getValue(),
Lo,
Hi);
5898 return DAG.getTruncStore(Ch, dl,
Lo, Ptr,
N->getPointerInfo(),
5899 N->getMemoryVT(),
N->getBaseAlign(), MMOFlags,
5903 if (DAG.getDataLayout().isLittleEndian()) {
5905 GetExpandedInteger(
N->getValue(),
Lo,
Hi);
5907 Lo = DAG.getStore(Ch, dl,
Lo, Ptr,
N->getPointerInfo(),
N->getBaseAlign(),
5910 unsigned ExcessBits =
5917 Hi = DAG.getTruncStore(Ch, dl,
Hi, Ptr,
5918 N->getPointerInfo().getWithOffset(IncrementSize),
5919 NEVT,
N->getBaseAlign(), MMOFlags, AAInfo);
5925 GetExpandedInteger(
N->getValue(),
Lo,
Hi);
5927 EVT ExtVT =
N->getMemoryVT();
5930 unsigned ExcessBits = (EBytes - IncrementSize)*8;
5938 DAG.getShiftAmountConstant(NVT.
getSizeInBits() - ExcessBits, NVT, dl));
5942 DAG.getShiftAmountConstant(ExcessBits, NVT, dl)));
5946 Hi = DAG.getTruncStore(Ch, dl,
Hi, Ptr,
N->getPointerInfo(), HiVT,
5947 N->getBaseAlign(), MMOFlags, AAInfo);
5952 Lo = DAG.getTruncStore(Ch, dl,
Lo, Ptr,
5953 N->getPointerInfo().getWithOffset(IncrementSize),
5955 N->getBaseAlign(), MMOFlags, AAInfo);
5961 GetExpandedInteger(
N->getOperand(0), InL, InH);
5970 N->getOperand(0),
N->getOperand(2),
N->getOperand(1),
5975SDValue DAGTypeLegalizer::ExpandIntOp_VP_STRIDED(
SDNode *
N,
unsigned OpNo) {
5976 assert((
N->getOpcode() == ISD::EXPERIMENTAL_VP_STRIDED_LOAD && OpNo == 3) ||
5977 (
N->getOpcode() == ISD::EXPERIMENTAL_VP_STRIDED_STORE && OpNo == 4));
5981 GetExpandedInteger(NewOps[OpNo], NewOps[OpNo],
Hi);
5983 return SDValue(DAG.UpdateNodeOperands(
N, NewOps), 0);
5986SDValue DAGTypeLegalizer::ExpandIntOp_WRITE_REGISTER(
SDNode *
N,
unsigned OpNo) {
5989 "cannot use llvm.write_register with illegal type", Fn,
5992 return N->getOperand(0);
5995SDValue DAGTypeLegalizer::PromoteIntRes_VECTOR_SPLICE(
SDNode *
N) {
5998 SDValue V0 = GetPromotedInteger(
N->getOperand(0));
5999 SDValue V1 = GetPromotedInteger(
N->getOperand(1));
6002 return DAG.getNode(
N->getOpcode(), dl, OutVT, V0, V1,
N->getOperand(2));
6005SDValue DAGTypeLegalizer::PromoteIntRes_VECTOR_INTERLEAVE_DEINTERLEAVE(
SDNode *
N) {
6007 unsigned Factor =
N->getNumOperands();
6010 for (
unsigned i = 0; i != Factor; i++)
6011 Ops[i] = GetPromotedInteger(
N->getOperand(i));
6016 for (
unsigned i = 0; i != Factor; i++)
6022SDValue DAGTypeLegalizer::PromoteIntRes_EXTRACT_SUBVECTOR(
SDNode *
N) {
6024 EVT OutVT =
N->getValueType(0);
6025 EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT);
6026 assert(NOutVT.
isVector() &&
"This type must be promoted to a vector type");
6030 SDValue BaseIdx =
N->getOperand(1);
6047 DAG.getConstant(
alignDown(IdxVal, NElts), dl,
6051 DAG.getConstant(IdxVal % NElts, dl, BaseIdx.
getValueType()));
6057 SDValue Ops[] = {GetWidenedVector(InOp0), BaseIdx};
6066 SDValue Ops[] = { GetPromotedInteger(InOp0), BaseIdx };
6070 "Promoted operand has an element type greater than result");
6083 InOp0 = GetPromotedInteger(InOp0);
6090 Ops.reserve(OutNumElems);
6091 for (
unsigned i = 0; i != OutNumElems; ++i) {
6096 N->getOperand(0), Index);
6097 SDValue Op = DAG.getAnyExtOrTrunc(Ext, dl, NOutVTElem);
6102 return DAG.getBuildVector(NOutVT, dl,
Ops);
6105SDValue DAGTypeLegalizer::PromoteIntRes_INSERT_SUBVECTOR(
SDNode *
N) {
6106 EVT OutVT =
N->getValueType(0);
6107 EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT);
6108 assert(NOutVT.
isVector() &&
"This type must be promoted to a vector type");
6120 Vec = GetPromotedInteger(Vec);
6126SDValue DAGTypeLegalizer::PromoteIntRes_VECTOR_REVERSE(
SDNode *
N) {
6129 SDValue V0 = GetPromotedInteger(
N->getOperand(0));
6135SDValue DAGTypeLegalizer::PromoteIntRes_VECTOR_SHUFFLE(
SDNode *
N) {
6137 EVT VT =
N->getValueType(0);
6142 SDValue V0 = GetPromotedInteger(
N->getOperand(0));
6143 SDValue V1 = GetPromotedInteger(
N->getOperand(1));
6146 return DAG.getVectorShuffle(OutVT, dl, V0, V1, NewMask);
6150 EVT OutVT =
N->getValueType(0);
6151 EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT);
6152 assert(NOutVT.
isVector() &&
"This type must be promoted to a vector type");
6153 unsigned NumElems =
N->getNumOperands();
6160 Ops.reserve(NumElems);
6161 for (
unsigned i = 0; i != NumElems; ++i) {
6163 EVT OpVT =
Op.getValueType();
6168 if (OpVT.
bitsLT(NOutVTElem)) {
6174 ExtOpc = NOutExtOpc;
6175 Op = DAG.getNode(ExtOpc, dl, NOutVTElem,
Op);
6180 return DAG.getBuildVector(NOutVT, dl,
Ops);
6187 assert(!
N->getOperand(0).getValueType().isVector() &&
6188 "Input must be a scalar");
6190 EVT OutVT =
N->getValueType(0);
6191 EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT);
6192 assert(NOutVT.
isVector() &&
"This type must be promoted to a vector type");
6196 return DAG.getNode(
N->getOpcode(), dl, NOutVT,
Op);
6201 EVT OutVT =
N->getValueType(0);
6202 EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT);
6204 "Type must be promoted to a scalable vector type");
6205 const APInt &StepVal =
N->getConstantOperandAPInt(0);
6206 return DAG.getStepVector(dl, NOutVT,
6210SDValue DAGTypeLegalizer::PromoteIntRes_CONCAT_VECTORS(
SDNode *
N) {
6213 EVT OutVT =
N->getValueType(0);
6214 EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT);
6215 assert(NOutVT.
isVector() &&
"This type must be promoted to a vector type");
6217 unsigned NumOperands =
N->getNumOperands();
6222 SDUse *MaxSizedValue = std::max_element(
6224 EVT AVT = A.getValueType().getVectorElementType();
6225 EVT BVT = B.getValueType().getVectorElementType();
6226 return AVT.getScalarSizeInBits() < BVT.getScalarSizeInBits();
6232 for (
unsigned I = 0;
I < NumOperands; ++
I) {
6234 EVT OpVT =
Op.getValueType();
6236 Op = GetPromotedInteger(
Op);
6239 "Unhandled legalization type");
6243 Op = DAG.getAnyExtOrTrunc(
6251 return DAG.getAnyExtOrTrunc(
6259 unsigned NumElem =
N->getOperand(0).getValueType().getVectorNumElements();
6260 assert(NumElem * NumOperands == NumOutElem &&
6261 "Unexpected number of elements");
6265 for (
unsigned i = 0; i < NumOperands; ++i) {
6268 Op = GetPromotedInteger(
Op);
6269 EVT SclrTy =
Op.getValueType().getVectorElementType();
6270 assert(NumElem ==
Op.getValueType().getVectorNumElements() &&
6271 "Unexpected number of elements");
6273 for (
unsigned j = 0;
j < NumElem; ++
j) {
6275 DAG.getVectorIdxConstant(j, dl));
6276 Ops[i * NumElem +
j] = DAG.getAnyExtOrTrunc(Ext, dl, OutElemTy);
6280 return DAG.getBuildVector(NOutVT, dl,
Ops);
6283SDValue DAGTypeLegalizer::PromoteIntRes_EXTEND_VECTOR_INREG(
SDNode *
N) {
6284 EVT VT =
N->getValueType(0);
6285 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
6286 assert(NVT.
isVector() &&
"This type must be promoted to a vector type");
6294 if (getTypeAction(
N->getOperand(0).getValueType())
6298 switch(
N->getOpcode()) {
6300 Promoted = SExtPromotedInteger(
N->getOperand(0));
6303 Promoted = ZExtPromotedInteger(
N->getOperand(0));
6306 Promoted = GetPromotedInteger(
N->getOperand(0));
6318 DAG.getVectorIdxConstant(0, dl));
6320 return DAG.getNode(
N->getOpcode(), dl, NVT, Promoted);
6324 return DAG.getNode(
N->getOpcode(), dl, NVT,
N->getOperand(0));
6327SDValue DAGTypeLegalizer::PromoteIntRes_VECTOR_FIND_LAST_ACTIVE(
SDNode *
N) {
6328 EVT VT =
N->getValueType(0);
6329 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
6333SDValue DAGTypeLegalizer::PromoteIntRes_GET_ACTIVE_LANE_MASK(
SDNode *
N) {
6334 EVT VT =
N->getValueType(0);
6335 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
6339SDValue DAGTypeLegalizer::PromoteIntRes_PARTIAL_REDUCE_MLA(
SDNode *
N) {
6341 EVT VT =
N->getValueType(0);
6342 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
6343 SDValue ExtAcc = GetPromotedInteger(
N->getOperand(0));
6344 return DAG.getNode(
N->getOpcode(),
DL, NVT, ExtAcc,
N->getOperand(1),
6348SDValue DAGTypeLegalizer::PromoteIntRes_INSERT_VECTOR_ELT(
SDNode *
N) {
6349 EVT OutVT =
N->getValueType(0);
6350 EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT);
6351 assert(NOutVT.
isVector() &&
"This type must be promoted to a vector type");
6356 SDValue V0 = GetPromotedInteger(
N->getOperand(0));
6359 NOutVTElem,
N->getOperand(1));
6361 V0, ConvElem,
N->getOperand(2));
6368 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
6369 return DAG.getNode(
N->getOpcode(), dl, NVT,
N->ops());
6377 SDValue Start = PromoteIntOpVectorReduction(
N,
N->getOperand(0));
6378 return DAG.getNode(
N->getOpcode(),
DL,
Start.getValueType(), Start,
6379 N->getOperand(1),
N->getOperand(2),
N->getOperand(3));
6383 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
6386 assert(
N->getNumValues() == 3 &&
"Expected 3 values for PATCHPOINT");
6387 SDVTList VTList = DAG.getVTList({NVT, MVT::Other, MVT::Glue});
6395 DAG.ReplaceAllUsesOfValuesWith(From, To, 2);
6400SDValue DAGTypeLegalizer::PromoteIntRes_READ_REGISTER(
SDNode *
N) {
6403 "cannot use llvm.read_register with illegal type", Fn,
N->getDebugLoc()));
6405 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
N->getValueType(0));
6406 ReplaceValueWith(
SDValue(
N, 1),
N->getOperand(0));
6407 return DAG.getPOISON(NVT);
6410SDValue DAGTypeLegalizer::PromoteIntOp_EXTRACT_VECTOR_ELT(
SDNode *
N) {
6412 SDValue V0 = GetPromotedInteger(
N->getOperand(0));
6413 SDValue V1 = DAG.getZExtOrTrunc(
N->getOperand(1), dl,
6414 TLI.getVectorIdxTy(DAG.getDataLayout()));
6421 return DAG.getAnyExtOrTrunc(Ext, dl,
N->getValueType(0));
6424SDValue DAGTypeLegalizer::PromoteIntOp_INSERT_SUBVECTOR(
SDNode *
N) {
6429 SDValue V1 = GetPromotedInteger(
N->getOperand(1));
6434 V0 = DAG.getAnyExtOrTrunc(V0, dl, PromVT);
6436 return DAG.getAnyExtOrTrunc(Ext, dl,
N->getValueType(0));
6448 TLI.getTypeToTransformTo(*DAG.getContext(), InVT1), V1);
6449 return DAG.getNode(
N->getOpcode(), dl,
N->getValueType(0), V0, VPromoted);
6452SDValue DAGTypeLegalizer::PromoteIntOp_EXTRACT_SUBVECTOR(
SDNode *
N) {
6454 SDValue V0 = GetPromotedInteger(
N->getOperand(0));
6462SDValue DAGTypeLegalizer::PromoteIntOp_CONCAT_VECTORS(
SDNode *
N) {
6465 EVT ResVT =
N->getValueType(0);
6466 unsigned NumElems =
N->getNumOperands();
6469 SDValue ResVec = DAG.getUNDEF(ResVT);
6473 unsigned OpNumElts =
Op.getValueType().getVectorMinNumElements();
6475 DAG.getIntPtrConstant(
OpIdx * OpNumElts, dl));
6487 for (
unsigned VecIdx = 0; VecIdx != NumElems; ++VecIdx) {
6488 SDValue Incoming = GetPromotedInteger(
N->getOperand(VecIdx));
6492 for (
unsigned i=0; i<NumElem; ++i) {
6495 DAG.getVectorIdxConstant(i, dl));
6501 return DAG.getBuildVector(
N->getValueType(0), dl, NewOps);
6504SDValue DAGTypeLegalizer::ExpandIntOp_STACKMAP(
SDNode *
N,
unsigned OpNo) {
6517 for (
unsigned I = 0;
I < OpNo;
I++)
6520 EVT Ty =
Op.getValueType();
6521 SDLoc
DL = SDLoc(
N);
6524 DAG.getTargetConstant(StackMaps::ConstantOp,
DL, MVT::i64));
6532 for (
unsigned I = OpNo + 1;
I <
N->getNumOperands();
I++)
6537 for (
unsigned ResNum = 0; ResNum <
N->getNumValues(); ResNum++)
6543SDValue DAGTypeLegalizer::ExpandIntOp_PATCHPOINT(
SDNode *
N,
unsigned OpNo) {
6556 for (
unsigned I = 0;
I < OpNo;
I++)
6559 EVT Ty =
Op.getValueType();
6560 SDLoc
DL = SDLoc(
N);
6563 DAG.getTargetConstant(StackMaps::ConstantOp,
DL, MVT::i64));
6571 for (
unsigned I = OpNo + 1;
I <
N->getNumOperands();
I++)
6576 for (
unsigned ResNum = 0; ResNum <
N->getNumValues(); ResNum++)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
const size_t AbstractManglingParser< Derived, Alloc >::NumOps
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
static SDValue SaturateWidenedDIVFIX(SDValue V, SDLoc &dl, unsigned SatW, bool Signed, const TargetLowering &TLI, SelectionDAG &DAG)
static SDValue fpExtendHelper(SDValue Op, SDValue &Chain, bool IsStrict, EVT VT, SDLoc DL, SelectionDAG &DAG)
static SDValue earlyExpandDIVFIX(SDNode *N, SDValue LHS, SDValue RHS, unsigned Scale, const TargetLowering &TLI, SelectionDAG &DAG, unsigned SatW=0)
static unsigned getExtendForIntVecReduction(SDNode *N)
static std::pair< ISD::CondCode, ISD::NodeType > getExpandedMinMaxOps(int Op)
static bool isZero(Value *V, const DataLayout &DL, DominatorTree *DT, AssumptionCache *AC)
MachineInstr unsigned OpIdx
const SmallVectorImpl< MachineOperand > & Cond
static Type * getValueType(Value *V)
Returns the type of the given value/instruction V.
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
This file describes how to lower LLVM code to machine code.
Class for arbitrary precision integers.
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
unsigned getActiveBits() const
Compute the number of active bits in the value.
LLVM_ABI APInt trunc(unsigned width) const
Truncate to new width.
static APInt getMaxValue(unsigned numBits)
Gets maximum unsigned value of APInt for specific bit width.
unsigned countLeadingOnes() const
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
bool intersects(const APInt &RHS) const
This operation tests if there are any pairs of corresponding bits between this APInt and RHS that are...
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
unsigned countTrailingZeros() const
unsigned countLeadingZeros() const
LLVM_ABI APInt sext(unsigned width) const
Sign extend to a new width.
bool isSubsetOf(const APInt &RHS) const
This operation checks that all bits set in this APInt are also set in RHS.
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
static APInt getHighBitsSet(unsigned numBits, unsigned hiBitsSet)
Constructs an APInt value that has the top hiBitsSet bits set.
unsigned countTrailingOnes() const
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
ArrayRef< T > slice(size_t N, size_t M) const
slice(n, m) - Chop off the first N elements of the array, and keep M elements in the array.
This is an SDNode representing atomic operations.
const APInt & getValue() const
Return the constant as an APInt value reference.
const ConstantInt * getConstantIntValue() const
uint64_t getZExtValue() const
@ NewNode
This is a new node, not before seen, that was created in the process of legalizing some other node.
const Function & getFunction() const
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
LLVM_ABI void diagnose(const DiagnosticInfo &DI)
Report a message to the currently installed diagnostic handler.
This class is used to represent ISD::LOAD nodes.
unsigned getVectorNumElements() const
TypeSize getSizeInBits() const
Returns the size of the specified MVT in bits.
static MVT getVectorVT(MVT VT, unsigned NumElements)
MVT getVectorElementType() const
Flags
Flags values. These may be or'd together.
This class is used to represent an MGATHER node.
This class is used to represent an MLOAD node.
This class is used to represent an MSCATTER node.
This class is used to represent an MSTORE node.
MachineMemOperand * getMemOperand() const
Return a MachineMemOperand object describing the memory reference performed by operation.
EVT getMemoryVT() const
Return the type of the in-memory value.
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
Wrapper class for IR location info (IR ordering and DebugLoc) to be passed into SDNode creation funct...
Represents one node in the SelectionDAG.
bool isStrictFPOpcode()
Test if this node is a strict floating point pseudo-op.
unsigned getOpcode() const
Return the SelectionDAG opcode value for this node.
SDNodeFlags getFlags() const
uint64_t getAsZExtVal() const
Helper method returns the zero-extended integer value of a ConstantSDNode.
const SDValue & getOperand(unsigned Num) const
EVT getValueType(unsigned ResNo) const
Return the type of a specified result.
EVT getValueType() const
Convenience function for get().getValueType().
Unlike LLVM values, Selection DAG nodes may return multiple values as the result of a computation.
SDNode * getNode() const
get the SDNode which holds the desired result
SDValue getValue(unsigned R) const
EVT getValueType() const
Return the ValueType of the referenced return value.
uint64_t getScalarValueSizeInBits() const
This is used to represent a portion of an LLVM function in a low-level Data Dependence DAG representa...
SDValue getExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT, unsigned Opcode)
Convert Op, which must be of integer type, to the integer type VT, by either any/sign/zero-extending ...
LLVM_ABI SDValue getConstant(uint64_t Val, const SDLoc &DL, EVT VT, bool isTarget=false, bool isOpaque=false)
Create a ConstantSDNode wrapping a constant value.
LLVM_ABI SDValue getNode(unsigned Opcode, const SDLoc &DL, EVT VT, ArrayRef< SDUse > Ops)
Gets or creates the specified node.
LLVM_ABI SDValue getZExtOrTrunc(SDValue Op, const SDLoc &DL, EVT VT)
Convert Op, which must be of integer type, to the integer type VT, by either zero-extending or trunca...
LLVMContext * getContext() const
ArrayRef< int > getMask() const
void reserve(size_type N)
void push_back(const T &Elt)
This class is used to represent ISD::STORE nodes.
LegalizeAction
This enum indicates whether operations are valid for a target, and if not, what action should be used...
ShiftLegalizationStrategy
Return the preferred strategy to legalize tihs SHIFT instruction, with ExpansionFactor being the recu...
@ TypeScalarizeScalableVector
BooleanContent
Enum that describes how the target represents true/false values.
@ ZeroOrOneBooleanContent
@ UndefinedBooleanContent
@ ZeroOrNegativeOneBooleanContent
std::vector< ArgListEntry > ArgListTy
static ISD::NodeType getExtendForContent(BooleanContent Content)
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
SDValue expandFixedPointDiv(unsigned Opcode, const SDLoc &dl, SDValue LHS, SDValue RHS, unsigned Scale, SelectionDAG &DAG) const
Method for building the DAG expansion of ISD::[US]DIVFIX[SAT].
static constexpr TypeSize getFixed(ScalarTy ExactSize)
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
This class is used to represent a VP_LOAD node.
This class is used to represent a VP_STORE node.
constexpr bool hasKnownScalarFactor(const FixedOrScalableQuantity &RHS) const
Returns true if there exists a value X where RHS.multiplyCoefficientBy(X) will result in a value whos...
constexpr ScalarTy getKnownScalarFactor(const FixedOrScalableQuantity &RHS) const
Returns a value X where RHS.multiplyCoefficientBy(X) will result in a value whose quantity matches ou...
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
constexpr LeafTy divideCoefficientBy(ScalarTy RHS) const
We do not provide the '/' operator here because division for polynomial types does not work in the sa...
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
bool isNON_EXTLoad(const SDNode *N)
Returns true if the specified node is a non-extending load.
NodeType
ISD::NodeType enum - This enum defines the target-independent operators for a SelectionDAG.
@ SETCC
SetCC operator - This evaluates to a true value iff the condition is true.
@ MERGE_VALUES
MERGE_VALUES - This node takes multiple discrete operands and returns them all as its individual resu...
@ STRICT_FSETCC
STRICT_FSETCC/STRICT_FSETCCS - Constrained versions of SETCC, used for floating-point operands only.
@ POISON
POISON - A poison node.
@ PARTIAL_REDUCE_SMLA
PARTIAL_REDUCE_[U|S]MLA(Accumulator, Input1, Input2) The partial reduction nodes sign or zero extend ...
@ LOOP_DEPENDENCE_RAW_MASK
@ MLOAD
Masked load and store - consecutive vector load and store operations with additional mask operand tha...
@ SMUL_LOHI
SMUL_LOHI/UMUL_LOHI - Multiply two integers of type iN, producing a signed/unsigned value of type i[2...
@ INSERT_SUBVECTOR
INSERT_SUBVECTOR(VECTOR1, VECTOR2, IDX) - Returns a vector with VECTOR2 inserted into VECTOR1.
@ BSWAP
Byte Swap and Counting operators.
@ SMULFIX
RESULT = [US]MULFIX(LHS, RHS, SCALE) - Perform fixed point multiplication on 2 integers with the same...
@ ATOMIC_STORE
OUTCHAIN = ATOMIC_STORE(INCHAIN, val, ptr) This corresponds to "store atomic" instruction.
@ ADDC
Carry-setting nodes for multiple precision addition and subtraction.
@ ADD
Simple integer binary arithmetic operators.
@ LOAD
LOAD and STORE have token chains as their first operand, then the same operands as an LLVM load/store...
@ SMULFIXSAT
Same as the corresponding unsaturated fixed point instructions, but the result is clamped between the...
@ ANY_EXTEND
ANY_EXTEND - Used for integer types. The high bits are undefined.
@ VECTOR_FIND_LAST_ACTIVE
Finds the index of the last active mask element Operands: Mask.
@ ATOMIC_CMP_SWAP_WITH_SUCCESS
Val, Success, OUTCHAIN = ATOMIC_CMP_SWAP_WITH_SUCCESS(INCHAIN, ptr, cmp, swap) N.b.
@ SINT_TO_FP
[SU]INT_TO_FP - These operators convert integers (whose interpreted sign depends on the first letter)...
@ CONCAT_VECTORS
CONCAT_VECTORS(VECTOR0, VECTOR1, ...) - Given a number of values of vector type with the same length ...
@ ABS
ABS - Determine the unsigned absolute value of a signed integer value of the same bitwidth.
@ SIGN_EXTEND_VECTOR_INREG
SIGN_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register sign-extension of the low ...
@ SDIVREM
SDIVREM/UDIVREM - Divide two integers and produce both a quotient and remainder result.
@ FP16_TO_FP
FP16_TO_FP, FP_TO_FP16 - These operators are used to perform promotions and truncation for half-preci...
@ FAKE_USE
FAKE_USE represents a use of the operand but does not do anything.
@ BITCAST
BITCAST - This operator converts between integer, vector and FP values, as if the value was stored to...
@ BUILD_PAIR
BUILD_PAIR - This is the opposite of EXTRACT_ELEMENT in some ways.
@ CLMUL
Carry-less multiplication operations.
@ FLDEXP
FLDEXP - ldexp, inspired by libm (op0 * 2**op1).
@ SDIVFIX
RESULT = [US]DIVFIX(LHS, RHS, SCALE) - Perform fixed point division on 2 integers with the same width...
@ SET_ROUNDING
Set rounding mode.
@ SIGN_EXTEND
Conversion operators.
@ AVGCEILS
AVGCEILS/AVGCEILU - Rounding averaging add - Add two integers using an integer of type i[N+2],...
@ SCALAR_TO_VECTOR
SCALAR_TO_VECTOR(VAL) - This represents the operation of loading a scalar value into element 0 of the...
@ READSTEADYCOUNTER
READSTEADYCOUNTER - This corresponds to the readfixedcounter intrinsic.
@ CTTZ_ZERO_UNDEF
Bit counting operators with an undefined result for zero inputs.
@ SETCCCARRY
Like SetCC, ops #0 and #1 are the LHS and RHS operands to compare, but op #2 is a boolean indicating ...
@ BR_CC
BR_CC - Conditional branch.
@ SSUBO
Same for subtraction.
@ VECTOR_INTERLEAVE
VECTOR_INTERLEAVE(VEC1, VEC2, ...) - Returns N vectors from N input vectors, where N is the factor to...
@ STEP_VECTOR
STEP_VECTOR(IMM) - Returns a scalable vector whose lanes are comprised of a linear sequence of unsign...
@ IS_FPCLASS
Performs a check of floating point class property, defined by IEEE-754.
@ SSUBSAT
RESULT = [US]SUBSAT(LHS, RHS) - Perform saturation subtraction on 2 integers with the same bit width ...
@ SELECT
Select(COND, TRUEVAL, FALSEVAL).
@ ATOMIC_LOAD
Val, OUTCHAIN = ATOMIC_LOAD(INCHAIN, ptr) This corresponds to "load atomic" instruction.
@ UNDEF
UNDEF - An undefined node.
@ EXTRACT_ELEMENT
EXTRACT_ELEMENT - This is used to get the lower or upper (determined by a Constant,...
@ SPLAT_VECTOR
SPLAT_VECTOR(VAL) - Returns a vector with the scalar value VAL duplicated in all lanes.
@ GET_ACTIVE_LANE_MASK
GET_ACTIVE_LANE_MASK - this corrosponds to the llvm.get.active.lane.mask intrinsic.
@ SADDO
RESULT, BOOL = [SU]ADDO(LHS, RHS) - Overflow-aware nodes for addition.
@ ARITH_FENCE
ARITH_FENCE - This corresponds to a arithmetic fence intrinsic.
@ CTLS
Count leading redundant sign bits.
@ VECREDUCE_ADD
Integer reductions may have a result type larger than the vector element type.
@ GET_ROUNDING
Returns current rounding mode: -1 Undefined 0 Round to 0 1 Round to nearest, ties to even 2 Round to ...
@ SHL
Shift and rotation operations.
@ VECTOR_SHUFFLE
VECTOR_SHUFFLE(VEC1, VEC2) - Returns a vector, of the same type as VEC1/VEC2.
@ EXTRACT_SUBVECTOR
EXTRACT_SUBVECTOR(VECTOR, IDX) - Returns a subvector from VECTOR.
@ READ_REGISTER
READ_REGISTER, WRITE_REGISTER - This node represents llvm.register on the DAG, which implements the n...
@ EXTRACT_VECTOR_ELT
EXTRACT_VECTOR_ELT(VECTOR, IDX) - Returns a single element from VECTOR identified by the (potentially...
@ ZERO_EXTEND
ZERO_EXTEND - Used for integer types, zeroing the new bits.
@ SELECT_CC
Select with condition operator - This selects between a true value and a false value (ops #2 and #3) ...
@ VSCALE
VSCALE(IMM) - Returns the runtime scaling factor used to calculate the number of elements within a sc...
@ ATOMIC_CMP_SWAP
Val, OUTCHAIN = ATOMIC_CMP_SWAP(INCHAIN, ptr, cmp, swap) For double-word atomic operations: ValLo,...
@ SSHLSAT
RESULT = [US]SHLSAT(LHS, RHS) - Perform saturation left shift.
@ PATCHPOINT
The llvm.experimental.patchpoint.
@ SMULO
Same for multiplication.
@ VECTOR_SPLICE_LEFT
VECTOR_SPLICE_LEFT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1, VEC2) left by OFFSET elements an...
@ ANY_EXTEND_VECTOR_INREG
ANY_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register any-extension of the low la...
@ SIGN_EXTEND_INREG
SIGN_EXTEND_INREG - This operator atomically performs a SHL/SRA pair to sign extend a small value in ...
@ SMIN
[US]{MIN/MAX} - Binary minimum or maximum of signed or unsigned integers.
@ VECTOR_REVERSE
VECTOR_REVERSE(VECTOR) - Returns a vector, of the same type as VECTOR, whose elements are shuffled us...
@ SDIVFIXSAT
Same as the corresponding unsaturated fixed point instructions, but the result is clamped between the...
@ FP_EXTEND
X = FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
@ VSELECT
Select with a vector condition (op #0) and two vector operands (ops #1 and #2), returning a vector re...
@ UADDO_CARRY
Carry-using nodes for multiple precision addition and subtraction.
@ STRICT_SINT_TO_FP
STRICT_[US]INT_TO_FP - Convert a signed or unsigned integer to a floating point value.
@ MGATHER
Masked gather and scatter - load and store operations for a vector of random addresses with additiona...
@ BF16_TO_FP
BF16_TO_FP, FP_TO_BF16 - These operators are used to perform promotions and truncation for bfloat16.
@ FRAMEADDR
FRAMEADDR, RETURNADDR - These nodes represent llvm.frameaddress and llvm.returnaddress on the DAG.
@ STRICT_FP_TO_SINT
STRICT_FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
@ FP_TO_SINT
FP_TO_[US]INT - Convert a floating point value to a signed or unsigned integer.
@ READCYCLECOUNTER
READCYCLECOUNTER - This corresponds to the readcyclecounter intrinsic.
@ STRICT_FP_EXTEND
X = STRICT_FP_EXTEND(Y) - Extend a smaller FP type into a larger FP type.
@ AND
Bitwise operators - logical and, logical or, logical xor.
@ SCMP
[US]CMP - 3-way comparison of signed or unsigned integers.
@ AVGFLOORS
AVGFLOORS/AVGFLOORU - Averaging add - Add two integers using an integer of type i[N+1],...
@ VECTOR_SPLICE_RIGHT
VECTOR_SPLICE_RIGHT(VEC1, VEC2, OFFSET) - Shifts CONCAT_VECTORS(VEC1,VEC2) right by OFFSET elements a...
@ ADDE
Carry-using nodes for multiple precision addition and subtraction.
@ STACKMAP
The llvm.experimental.stackmap intrinsic.
@ SPLAT_VECTOR_PARTS
SPLAT_VECTOR_PARTS(SCALAR1, SCALAR2, ...) - Returns a vector with the scalar values joined together a...
@ FREEZE
FREEZE - FREEZE(VAL) returns an arbitrary value if VAL is UNDEF (or is evaluated to UNDEF),...
@ INSERT_VECTOR_ELT
INSERT_VECTOR_ELT(VECTOR, VAL, IDX) - Returns VECTOR with the element at IDX replaced with VAL.
@ TokenFactor
TokenFactor - This node takes multiple tokens as input and produces a single token result.
@ ATOMIC_SWAP
Val, OUTCHAIN = ATOMIC_SWAP(INCHAIN, ptr, amt) Val, OUTCHAIN = ATOMIC_LOAD_[OpName](INCHAIN,...
@ FFREXP
FFREXP - frexp, extract fractional and exponent component of a floating-point value.
@ VECTOR_COMPRESS
VECTOR_COMPRESS(Vec, Mask, Passthru) consecutively place vector elements based on mask e....
@ ZERO_EXTEND_VECTOR_INREG
ZERO_EXTEND_VECTOR_INREG(Vector) - This operator represents an in-register zero-extension of the low ...
@ EXPERIMENTAL_VECTOR_HISTOGRAM
Experimental vector histogram intrinsic Operands: Input Chain, Inc, Mask, Base, Index,...
@ FP_TO_SINT_SAT
FP_TO_[US]INT_SAT - Convert floating point value in operand 0 to a signed or unsigned scalar integer ...
@ TRUNCATE
TRUNCATE - Completely drop the high bits.
@ VAARG
VAARG - VAARG has four operands: an input chain, a pointer, a SRCVALUE, and the alignment.
@ BRCOND
BRCOND - Conditional branch.
@ SHL_PARTS
SHL_PARTS/SRA_PARTS/SRL_PARTS - These operators are used for expanded integer shift operations.
@ AssertSext
AssertSext, AssertZext - These nodes record if a register contains a value that has already been zero...
@ SADDSAT
RESULT = [US]ADDSAT(LHS, RHS) - Perform saturation addition on 2 integers with the same bit width (W)...
@ VECTOR_DEINTERLEAVE
VECTOR_DEINTERLEAVE(VEC1, VEC2, ...) - Returns N vectors from N input vectors, where N is the factor ...
@ ABDS
ABDS/ABDU - Absolute difference - Return the absolute difference between two numbers interpreted as s...
@ SADDO_CARRY
Carry-using overflow-aware nodes for multiple precision addition and subtraction.
@ BUILD_VECTOR
BUILD_VECTOR(ELT0, ELT1, ELT2, ELT3,...) - Return a fixed-width vector with the specified,...
@ LOOP_DEPENDENCE_WAR_MASK
The llvm.loop.dependence.
bool isNormalStore(const SDNode *N)
Returns true if the specified node is a non-truncating and unindexed store.
bool isTrueWhenEqual(CondCode Cond)
Return true if the specified condition returns true if the two operands to the condition are equal.
bool isUNINDEXEDLoad(const SDNode *N)
Returns true if the specified node is an unindexed load.
bool isSignedIntSetCC(CondCode Code)
Return true if this is a setcc instruction that performs a signed comparison when used with integer o...
bool isUNINDEXEDStore(const SDNode *N)
Returns true if the specified node is an unindexed store.
CondCode
ISD::CondCode enum - These are ordered carefully to make the bitfields below work out,...
LoadExtType
LoadExtType enum - This enum defines the three variants of LOADEXT (load with extension).
bool isUnsignedIntSetCC(CondCode Code)
Return true if this is a setcc instruction that performs an unsigned comparison when used with intege...
bool isNormalLoad(const SDNode *N)
Returns true if the specified node is a non-extending and unindexed load.
bool isIntEqualitySetCC(CondCode Code)
Return true if this is a setcc instruction that performs an equality comparison when used with intege...
LLVM_ABI Libcall getPOWI(EVT RetVT)
getPOWI - Return the POWI_* value for the given types, or UNKNOWN_LIBCALL if there is none.
LLVM_ABI Libcall getSINTTOFP(EVT OpVT, EVT RetVT)
getSINTTOFP - Return the SINTTOFP_*_* value for the given types, or UNKNOWN_LIBCALL if there is none.
LLVM_ABI Libcall getUREM(EVT VT)
LLVM_ABI Libcall getSHL(EVT VT)
LLVM_ABI Libcall getSYNC(unsigned Opc, MVT VT)
Return the SYNC_FETCH_AND_* value for the given opcode and type, or UNKNOWN_LIBCALL if there is none.
LLVM_ABI Libcall getLDEXP(EVT RetVT)
getLDEXP - Return the LDEXP_* value for the given types, or UNKNOWN_LIBCALL if there is none.
LLVM_ABI Libcall getUINTTOFP(EVT OpVT, EVT RetVT)
getUINTTOFP - Return the UINTTOFP_*_* value for the given types, or UNKNOWN_LIBCALL if there is none.
LLVM_ABI Libcall getSDIV(EVT VT)
LLVM_ABI Libcall getSRL(EVT VT)
LLVM_ABI Libcall getSRA(EVT VT)
LLVM_ABI Libcall getUDIV(EVT VT)
LLVM_ABI Libcall getFPTOUINT(EVT OpVT, EVT RetVT)
getFPTOUINT - Return the FPTOUINT_*_* value for the given types, or UNKNOWN_LIBCALL if there is none.
LLVM_ABI Libcall getLLROUND(EVT VT)
LLVM_ABI Libcall getLROUND(EVT VT)
LLVM_ABI Libcall getFPTOSINT(EVT OpVT, EVT RetVT)
getFPTOSINT - Return the FPTOSINT_*_* value for the given types, or UNKNOWN_LIBCALL if there is none.
LLVM_ABI Libcall getLRINT(EVT RetVT)
LLVM_ABI Libcall getOUTLINE_ATOMIC(unsigned Opc, AtomicOrdering Order, MVT VT)
Return the outline atomics value for the given opcode, atomic ordering and type, or UNKNOWN_LIBCALL i...
LLVM_ABI Libcall getLLRINT(EVT RetVT)
LLVM_ABI Libcall getSREM(EVT VT)
LLVM_ABI Libcall getMUL(EVT VT)
LLVM_ABI Libcall getCTPOP(EVT VT)
LLVM_ABI Libcall getMULO(EVT VT)
NodeAddr< NodeBase * > Node
NodeAddr< FuncNode * > Func
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI bool isNullConstant(SDValue V)
Returns true if V is a constant integer zero.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
constexpr T alignDown(U Value, V Align, W Skew=0)
Returns the largest unsigned integer less than or equal to Value and is Skew mod Align.
unsigned Log2_32(uint32_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
@ Success
The lock was released successfully.
AtomicOrdering
Atomic ordering for LLVM's memory model.
@ Or
Bitwise or logical OR of integers.
@ Mul
Product of integers.
@ Xor
Bitwise or logical XOR of integers.
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI bool isOneConstant(SDValue V)
Returns true if V is a constant integer one.
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
LLVM_ABI bool isAllOnesConstant(SDValue V)
Returns true if V is an integer constant with all bits set.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
TypeSize getStoreSize() const
Return the number of bytes overwritten by a store of the specified value type.
bool isSimple() const
Test if the given EVT is simple (as opposed to being extended).
static EVT getVectorVT(LLVMContext &Context, EVT VT, unsigned NumElements, bool IsScalable=false)
Returns the EVT that represents a vector NumElements in length, where each element is of type VT.
bool bitsLT(EVT VT) const
Return true if this has less bits than VT.
ElementCount getVectorElementCount() const
TypeSize getSizeInBits() const
Return the size of the specified value type in bits.
bool isByteSized() const
Return true if the bit size is a multiple of 8.
unsigned getVectorMinNumElements() const
Given a vector type, return the minimum number of elements it contains.
uint64_t getScalarSizeInBits() const
TypeSize getStoreSizeInBits() const
Return the number of bits overwritten by a store of the specified value type.
EVT changeVectorElementType(LLVMContext &Context, EVT EltVT) const
Return a VT for a vector type whose attributes match ourselves with the exception of the element type...
MVT getSimpleVT() const
Return the SimpleValueType held in the specified simple EVT.
static EVT getIntegerVT(LLVMContext &Context, unsigned BitWidth)
Returns the EVT that represents an integer with the given number of bits.
bool isVector() const
Return true if this is a vector value type.
EVT getScalarType() const
If this is a vector type, return the element type, otherwise return this.
bool bitsGE(EVT VT) const
Return true if this has no less bits than VT.
bool bitsEq(EVT VT) const
Return true if this has the same number of bits as VT.
LLVM_ABI Type * getTypeForEVT(LLVMContext &Context) const
This method returns an LLVM type corresponding to the specified EVT.
bool isScalableVector() const
Return true if this is a vector type where the runtime length is machine dependent.
EVT getVectorElementType() const
Given a vector type, return the type of each element.
EVT changeElementType(LLVMContext &Context, EVT EltVT) const
Return a VT for a type whose attributes match ourselves with the exception of the element type that i...
unsigned getVectorNumElements() const
Given a vector type, return the number of elements it contains.
bool bitsLE(EVT VT) const
Return true if this has no more bits than VT.
EVT getHalfNumVectorElementsVT(LLVMContext &Context) const
static LLVM_ABI MachinePointerInfo getUnknownStack(MachineFunction &MF)
Stack memory without other information.
static LLVM_ABI MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.
static StringRef getLibcallImplName(RTLIB::LibcallImpl CallImpl)
Get the libcall routine name for the specified libcall implementation.
MakeLibCallOptions & setTypeListBeforeSoften(ArrayRef< EVT > OpsVT, EVT RetVT)
MakeLibCallOptions & setIsSigned(bool Value=true)