1 //===----- LegalizeIntegerTypes.cpp - Legalization of integer types -------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file implements integer type expansion and promotion for LegalizeTypes. 11 // Promotion is the act of changing a computation in an illegal type into a 12 // computation in a larger type. For example, implementing i8 arithmetic in an 13 // i32 register (often needed on powerpc). 14 // Expansion is the act of changing a computation in an illegal type into a 15 // computation in two identical registers of a smaller type. For example, 16 // implementing i64 arithmetic in two i32 registers (often needed on 32-bit 17 // targets). 18 // 19 //===----------------------------------------------------------------------===// 20 21 #include "LegalizeTypes.h" 22 #include "llvm/IR/DerivedTypes.h" 23 #include "llvm/Support/ErrorHandling.h" 24 #include "llvm/Support/KnownBits.h" 25 #include "llvm/Support/raw_ostream.h" 26 using namespace llvm; 27 28 #define DEBUG_TYPE "legalize-types" 29 30 //===----------------------------------------------------------------------===// 31 // Integer Result Promotion 32 //===----------------------------------------------------------------------===// 33 34 /// PromoteIntegerResult - This method is called when a result of a node is 35 /// found to be in need of promotion to a larger type. At this point, the node 36 /// may also have invalid operands or may have other results that need 37 /// expansion, we just know that (at least) one result needs promotion. 38 void DAGTypeLegalizer::PromoteIntegerResult(SDNode *N, unsigned ResNo) { 39 LLVM_DEBUG(dbgs() << "Promote integer result: "; N->dump(&DAG); 40 dbgs() << "\n"); 41 SDValue Res = SDValue(); 42 43 // See if the target wants to custom expand this node. 44 if (CustomLowerNode(N, N->getValueType(ResNo), true)) { 45 LLVM_DEBUG(dbgs() << "Node has been custom expanded, done\n"); 46 return; 47 } 48 49 switch (N->getOpcode()) { 50 default: 51 #ifndef NDEBUG 52 dbgs() << "PromoteIntegerResult #" << ResNo << ": "; 53 N->dump(&DAG); dbgs() << "\n"; 54 #endif 55 llvm_unreachable("Do not know how to promote this operator!"); 56 case ISD::MERGE_VALUES:Res = PromoteIntRes_MERGE_VALUES(N, ResNo); break; 57 case ISD::AssertSext: Res = PromoteIntRes_AssertSext(N); break; 58 case ISD::AssertZext: Res = PromoteIntRes_AssertZext(N); break; 59 case ISD::BITCAST: Res = PromoteIntRes_BITCAST(N); break; 60 case ISD::BITREVERSE: Res = PromoteIntRes_BITREVERSE(N); break; 61 case ISD::BSWAP: Res = PromoteIntRes_BSWAP(N); break; 62 case ISD::BUILD_PAIR: Res = PromoteIntRes_BUILD_PAIR(N); break; 63 case ISD::Constant: Res = PromoteIntRes_Constant(N); break; 64 case ISD::CTLZ_ZERO_UNDEF: 65 case ISD::CTLZ: Res = PromoteIntRes_CTLZ(N); break; 66 case ISD::CTPOP: Res = PromoteIntRes_CTPOP(N); break; 67 case ISD::CTTZ_ZERO_UNDEF: 68 case ISD::CTTZ: Res = PromoteIntRes_CTTZ(N); break; 69 case ISD::EXTRACT_VECTOR_ELT: 70 Res = PromoteIntRes_EXTRACT_VECTOR_ELT(N); break; 71 case ISD::LOAD: Res = PromoteIntRes_LOAD(cast<LoadSDNode>(N)); break; 72 case ISD::MLOAD: Res = PromoteIntRes_MLOAD(cast<MaskedLoadSDNode>(N)); 73 break; 74 case ISD::MGATHER: Res = PromoteIntRes_MGATHER(cast<MaskedGatherSDNode>(N)); 75 break; 76 case ISD::SELECT: Res = PromoteIntRes_SELECT(N); break; 77 case ISD::VSELECT: Res = PromoteIntRes_VSELECT(N); break; 78 case ISD::SELECT_CC: Res = PromoteIntRes_SELECT_CC(N); break; 79 case ISD::SETCC: Res = PromoteIntRes_SETCC(N); break; 80 case ISD::SMIN: 81 case ISD::SMAX: Res = PromoteIntRes_SExtIntBinOp(N); break; 82 case ISD::UMIN: 83 case ISD::UMAX: Res = PromoteIntRes_ZExtIntBinOp(N); break; 84 85 case ISD::SHL: Res = PromoteIntRes_SHL(N); break; 86 case ISD::SIGN_EXTEND_INREG: 87 Res = PromoteIntRes_SIGN_EXTEND_INREG(N); break; 88 case ISD::SRA: Res = PromoteIntRes_SRA(N); break; 89 case ISD::SRL: Res = PromoteIntRes_SRL(N); break; 90 case ISD::TRUNCATE: Res = PromoteIntRes_TRUNCATE(N); break; 91 case ISD::UNDEF: Res = PromoteIntRes_UNDEF(N); break; 92 case ISD::VAARG: Res = PromoteIntRes_VAARG(N); break; 93 94 case ISD::EXTRACT_SUBVECTOR: 95 Res = PromoteIntRes_EXTRACT_SUBVECTOR(N); break; 96 case ISD::VECTOR_SHUFFLE: 97 Res = PromoteIntRes_VECTOR_SHUFFLE(N); break; 98 case ISD::INSERT_VECTOR_ELT: 99 Res = PromoteIntRes_INSERT_VECTOR_ELT(N); break; 100 case ISD::BUILD_VECTOR: 101 Res = PromoteIntRes_BUILD_VECTOR(N); break; 102 case ISD::SCALAR_TO_VECTOR: 103 Res = PromoteIntRes_SCALAR_TO_VECTOR(N); break; 104 case ISD::CONCAT_VECTORS: 105 Res = PromoteIntRes_CONCAT_VECTORS(N); break; 106 107 case ISD::ANY_EXTEND_VECTOR_INREG: 108 case ISD::SIGN_EXTEND_VECTOR_INREG: 109 case ISD::ZERO_EXTEND_VECTOR_INREG: 110 Res = PromoteIntRes_EXTEND_VECTOR_INREG(N); break; 111 112 case ISD::SIGN_EXTEND: 113 case ISD::ZERO_EXTEND: 114 case ISD::ANY_EXTEND: Res = PromoteIntRes_INT_EXTEND(N); break; 115 116 case ISD::FP_TO_SINT: 117 case ISD::FP_TO_UINT: Res = PromoteIntRes_FP_TO_XINT(N); break; 118 119 case ISD::FP_TO_FP16: Res = PromoteIntRes_FP_TO_FP16(N); break; 120 121 case ISD::AND: 122 case ISD::OR: 123 case ISD::XOR: 124 case ISD::ADD: 125 case ISD::SUB: 126 case ISD::MUL: Res = PromoteIntRes_SimpleIntBinOp(N); break; 127 128 case ISD::SDIV: 129 case ISD::SREM: Res = PromoteIntRes_SExtIntBinOp(N); break; 130 131 case ISD::UDIV: 132 case ISD::UREM: Res = PromoteIntRes_ZExtIntBinOp(N); break; 133 134 case ISD::SADDO: 135 case ISD::SSUBO: Res = PromoteIntRes_SADDSUBO(N, ResNo); break; 136 case ISD::UADDO: 137 case ISD::USUBO: Res = PromoteIntRes_UADDSUBO(N, ResNo); break; 138 case ISD::SMULO: 139 case ISD::UMULO: Res = PromoteIntRes_XMULO(N, ResNo); break; 140 141 case ISD::ADDCARRY: 142 case ISD::SUBCARRY: Res = PromoteIntRes_ADDSUBCARRY(N, ResNo); break; 143 144 case ISD::ATOMIC_LOAD: 145 Res = PromoteIntRes_Atomic0(cast<AtomicSDNode>(N)); break; 146 147 case ISD::ATOMIC_LOAD_ADD: 148 case ISD::ATOMIC_LOAD_SUB: 149 case ISD::ATOMIC_LOAD_AND: 150 case ISD::ATOMIC_LOAD_CLR: 151 case ISD::ATOMIC_LOAD_OR: 152 case ISD::ATOMIC_LOAD_XOR: 153 case ISD::ATOMIC_LOAD_NAND: 154 case ISD::ATOMIC_LOAD_MIN: 155 case ISD::ATOMIC_LOAD_MAX: 156 case ISD::ATOMIC_LOAD_UMIN: 157 case ISD::ATOMIC_LOAD_UMAX: 158 case ISD::ATOMIC_SWAP: 159 Res = PromoteIntRes_Atomic1(cast<AtomicSDNode>(N)); break; 160 161 case ISD::ATOMIC_CMP_SWAP: 162 case ISD::ATOMIC_CMP_SWAP_WITH_SUCCESS: 163 Res = PromoteIntRes_AtomicCmpSwap(cast<AtomicSDNode>(N), ResNo); 164 break; 165 } 166 167 // If the result is null then the sub-method took care of registering it. 168 if (Res.getNode()) 169 SetPromotedInteger(SDValue(N, ResNo), Res); 170 } 171 172 SDValue DAGTypeLegalizer::PromoteIntRes_MERGE_VALUES(SDNode *N, 173 unsigned ResNo) { 174 SDValue Op = DisintegrateMERGE_VALUES(N, ResNo); 175 return GetPromotedInteger(Op); 176 } 177 178 SDValue DAGTypeLegalizer::PromoteIntRes_AssertSext(SDNode *N) { 179 // Sign-extend the new bits, and continue the assertion. 180 SDValue Op = SExtPromotedInteger(N->getOperand(0)); 181 return DAG.getNode(ISD::AssertSext, SDLoc(N), 182 Op.getValueType(), Op, N->getOperand(1)); 183 } 184 185 SDValue DAGTypeLegalizer::PromoteIntRes_AssertZext(SDNode *N) { 186 // Zero the new bits, and continue the assertion. 187 SDValue Op = ZExtPromotedInteger(N->getOperand(0)); 188 return DAG.getNode(ISD::AssertZext, SDLoc(N), 189 Op.getValueType(), Op, N->getOperand(1)); 190 } 191 192 SDValue DAGTypeLegalizer::PromoteIntRes_Atomic0(AtomicSDNode *N) { 193 EVT ResVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)); 194 SDValue Res = DAG.getAtomic(N->getOpcode(), SDLoc(N), 195 N->getMemoryVT(), ResVT, 196 N->getChain(), N->getBasePtr(), 197 N->getMemOperand()); 198 // Legalize the chain result - switch anything that used the old chain to 199 // use the new one. 200 ReplaceValueWith(SDValue(N, 1), Res.getValue(1)); 201 return Res; 202 } 203 204 SDValue DAGTypeLegalizer::PromoteIntRes_Atomic1(AtomicSDNode *N) { 205 SDValue Op2 = GetPromotedInteger(N->getOperand(2)); 206 SDValue Res = DAG.getAtomic(N->getOpcode(), SDLoc(N), 207 N->getMemoryVT(), 208 N->getChain(), N->getBasePtr(), 209 Op2, N->getMemOperand()); 210 // Legalize the chain result - switch anything that used the old chain to 211 // use the new one. 212 ReplaceValueWith(SDValue(N, 1), Res.getValue(1)); 213 return Res; 214 } 215 216 SDValue DAGTypeLegalizer::PromoteIntRes_AtomicCmpSwap(AtomicSDNode *N, 217 unsigned ResNo) { 218 if (ResNo == 1) { 219 assert(N->getOpcode() == ISD::ATOMIC_CMP_SWAP_WITH_SUCCESS); 220 EVT SVT = getSetCCResultType(N->getOperand(2).getValueType()); 221 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(1)); 222 223 // Only use the result of getSetCCResultType if it is legal, 224 // otherwise just use the promoted result type (NVT). 225 if (!TLI.isTypeLegal(SVT)) 226 SVT = NVT; 227 228 SDVTList VTs = DAG.getVTList(N->getValueType(0), SVT, MVT::Other); 229 SDValue Res = DAG.getAtomicCmpSwap( 230 ISD::ATOMIC_CMP_SWAP_WITH_SUCCESS, SDLoc(N), N->getMemoryVT(), VTs, 231 N->getChain(), N->getBasePtr(), N->getOperand(2), N->getOperand(3), 232 N->getMemOperand()); 233 ReplaceValueWith(SDValue(N, 0), Res.getValue(0)); 234 ReplaceValueWith(SDValue(N, 2), Res.getValue(2)); 235 return Res.getValue(1); 236 } 237 238 SDValue Op2 = GetPromotedInteger(N->getOperand(2)); 239 SDValue Op3 = GetPromotedInteger(N->getOperand(3)); 240 SDVTList VTs = 241 DAG.getVTList(Op2.getValueType(), N->getValueType(1), MVT::Other); 242 SDValue Res = DAG.getAtomicCmpSwap( 243 N->getOpcode(), SDLoc(N), N->getMemoryVT(), VTs, N->getChain(), 244 N->getBasePtr(), Op2, Op3, N->getMemOperand()); 245 // Update the use to N with the newly created Res. 246 for (unsigned i = 1, NumResults = N->getNumValues(); i < NumResults; ++i) 247 ReplaceValueWith(SDValue(N, i), Res.getValue(i)); 248 return Res; 249 } 250 251 SDValue DAGTypeLegalizer::PromoteIntRes_BITCAST(SDNode *N) { 252 SDValue InOp = N->getOperand(0); 253 EVT InVT = InOp.getValueType(); 254 EVT NInVT = TLI.getTypeToTransformTo(*DAG.getContext(), InVT); 255 EVT OutVT = N->getValueType(0); 256 EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT); 257 SDLoc dl(N); 258 259 switch (getTypeAction(InVT)) { 260 case TargetLowering::TypeLegal: 261 break; 262 case TargetLowering::TypePromoteInteger: 263 if (NOutVT.bitsEq(NInVT) && !NOutVT.isVector() && !NInVT.isVector()) 264 // The input promotes to the same size. Convert the promoted value. 265 return DAG.getNode(ISD::BITCAST, dl, NOutVT, GetPromotedInteger(InOp)); 266 break; 267 case TargetLowering::TypeSoftenFloat: 268 // Promote the integer operand by hand. 269 return DAG.getNode(ISD::ANY_EXTEND, dl, NOutVT, GetSoftenedFloat(InOp)); 270 case TargetLowering::TypePromoteFloat: { 271 // Convert the promoted float by hand. 272 if (!NOutVT.isVector()) 273 return DAG.getNode(ISD::FP_TO_FP16, dl, NOutVT, GetPromotedFloat(InOp)); 274 break; 275 } 276 case TargetLowering::TypeExpandInteger: 277 case TargetLowering::TypeExpandFloat: 278 break; 279 case TargetLowering::TypeScalarizeVector: 280 // Convert the element to an integer and promote it by hand. 281 if (!NOutVT.isVector()) 282 return DAG.getNode(ISD::ANY_EXTEND, dl, NOutVT, 283 BitConvertToInteger(GetScalarizedVector(InOp))); 284 break; 285 case TargetLowering::TypeSplitVector: { 286 // For example, i32 = BITCAST v2i16 on alpha. Convert the split 287 // pieces of the input into integers and reassemble in the final type. 288 SDValue Lo, Hi; 289 GetSplitVector(N->getOperand(0), Lo, Hi); 290 Lo = BitConvertToInteger(Lo); 291 Hi = BitConvertToInteger(Hi); 292 293 if (DAG.getDataLayout().isBigEndian()) 294 std::swap(Lo, Hi); 295 296 InOp = DAG.getNode(ISD::ANY_EXTEND, dl, 297 EVT::getIntegerVT(*DAG.getContext(), 298 NOutVT.getSizeInBits()), 299 JoinIntegers(Lo, Hi)); 300 return DAG.getNode(ISD::BITCAST, dl, NOutVT, InOp); 301 } 302 case TargetLowering::TypeWidenVector: 303 // The input is widened to the same size. Convert to the widened value. 304 // Make sure that the outgoing value is not a vector, because this would 305 // make us bitcast between two vectors which are legalized in different ways. 306 if (NOutVT.bitsEq(NInVT) && !NOutVT.isVector()) 307 return DAG.getNode(ISD::BITCAST, dl, NOutVT, GetWidenedVector(InOp)); 308 } 309 310 return DAG.getNode(ISD::ANY_EXTEND, dl, NOutVT, 311 CreateStackStoreLoad(InOp, OutVT)); 312 } 313 314 SDValue DAGTypeLegalizer::PromoteIntRes_BSWAP(SDNode *N) { 315 SDValue Op = GetPromotedInteger(N->getOperand(0)); 316 EVT OVT = N->getValueType(0); 317 EVT NVT = Op.getValueType(); 318 SDLoc dl(N); 319 320 unsigned DiffBits = NVT.getScalarSizeInBits() - OVT.getScalarSizeInBits(); 321 return DAG.getNode( 322 ISD::SRL, dl, NVT, DAG.getNode(ISD::BSWAP, dl, NVT, Op), 323 DAG.getConstant(DiffBits, dl, 324 TLI.getShiftAmountTy(NVT, DAG.getDataLayout()))); 325 } 326 327 SDValue DAGTypeLegalizer::PromoteIntRes_BITREVERSE(SDNode *N) { 328 SDValue Op = GetPromotedInteger(N->getOperand(0)); 329 EVT OVT = N->getValueType(0); 330 EVT NVT = Op.getValueType(); 331 SDLoc dl(N); 332 333 unsigned DiffBits = NVT.getScalarSizeInBits() - OVT.getScalarSizeInBits(); 334 return DAG.getNode( 335 ISD::SRL, dl, NVT, DAG.getNode(ISD::BITREVERSE, dl, NVT, Op), 336 DAG.getConstant(DiffBits, dl, 337 TLI.getShiftAmountTy(NVT, DAG.getDataLayout()))); 338 } 339 340 SDValue DAGTypeLegalizer::PromoteIntRes_BUILD_PAIR(SDNode *N) { 341 // The pair element type may be legal, or may not promote to the same type as 342 // the result, for example i14 = BUILD_PAIR (i7, i7). Handle all cases. 343 return DAG.getNode(ISD::ANY_EXTEND, SDLoc(N), 344 TLI.getTypeToTransformTo(*DAG.getContext(), 345 N->getValueType(0)), JoinIntegers(N->getOperand(0), 346 N->getOperand(1))); 347 } 348 349 SDValue DAGTypeLegalizer::PromoteIntRes_Constant(SDNode *N) { 350 EVT VT = N->getValueType(0); 351 // FIXME there is no actual debug info here 352 SDLoc dl(N); 353 // Zero extend things like i1, sign extend everything else. It shouldn't 354 // matter in theory which one we pick, but this tends to give better code? 355 unsigned Opc = VT.isByteSized() ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND; 356 SDValue Result = DAG.getNode(Opc, dl, 357 TLI.getTypeToTransformTo(*DAG.getContext(), VT), 358 SDValue(N, 0)); 359 assert(isa<ConstantSDNode>(Result) && "Didn't constant fold ext?"); 360 return Result; 361 } 362 363 SDValue DAGTypeLegalizer::PromoteIntRes_CTLZ(SDNode *N) { 364 // Zero extend to the promoted type and do the count there. 365 SDValue Op = ZExtPromotedInteger(N->getOperand(0)); 366 SDLoc dl(N); 367 EVT OVT = N->getValueType(0); 368 EVT NVT = Op.getValueType(); 369 Op = DAG.getNode(N->getOpcode(), dl, NVT, Op); 370 // Subtract off the extra leading bits in the bigger type. 371 return DAG.getNode( 372 ISD::SUB, dl, NVT, Op, 373 DAG.getConstant(NVT.getScalarSizeInBits() - OVT.getScalarSizeInBits(), dl, 374 NVT)); 375 } 376 377 SDValue DAGTypeLegalizer::PromoteIntRes_CTPOP(SDNode *N) { 378 // Zero extend to the promoted type and do the count there. 379 SDValue Op = ZExtPromotedInteger(N->getOperand(0)); 380 return DAG.getNode(ISD::CTPOP, SDLoc(N), Op.getValueType(), Op); 381 } 382 383 SDValue DAGTypeLegalizer::PromoteIntRes_CTTZ(SDNode *N) { 384 SDValue Op = GetPromotedInteger(N->getOperand(0)); 385 EVT OVT = N->getValueType(0); 386 EVT NVT = Op.getValueType(); 387 SDLoc dl(N); 388 if (N->getOpcode() == ISD::CTTZ) { 389 // The count is the same in the promoted type except if the original 390 // value was zero. This can be handled by setting the bit just off 391 // the top of the original type. 392 auto TopBit = APInt::getOneBitSet(NVT.getScalarSizeInBits(), 393 OVT.getScalarSizeInBits()); 394 Op = DAG.getNode(ISD::OR, dl, NVT, Op, DAG.getConstant(TopBit, dl, NVT)); 395 } 396 return DAG.getNode(N->getOpcode(), dl, NVT, Op); 397 } 398 399 SDValue DAGTypeLegalizer::PromoteIntRes_EXTRACT_VECTOR_ELT(SDNode *N) { 400 SDLoc dl(N); 401 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)); 402 return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, NVT, N->getOperand(0), 403 N->getOperand(1)); 404 } 405 406 SDValue DAGTypeLegalizer::PromoteIntRes_FP_TO_XINT(SDNode *N) { 407 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)); 408 unsigned NewOpc = N->getOpcode(); 409 SDLoc dl(N); 410 411 // If we're promoting a UINT to a larger size and the larger FP_TO_UINT is 412 // not Legal, check to see if we can use FP_TO_SINT instead. (If both UINT 413 // and SINT conversions are Custom, there is no way to tell which is 414 // preferable. We choose SINT because that's the right thing on PPC.) 415 if (N->getOpcode() == ISD::FP_TO_UINT && 416 !TLI.isOperationLegal(ISD::FP_TO_UINT, NVT) && 417 TLI.isOperationLegalOrCustom(ISD::FP_TO_SINT, NVT)) 418 NewOpc = ISD::FP_TO_SINT; 419 420 SDValue Res = DAG.getNode(NewOpc, dl, NVT, N->getOperand(0)); 421 422 // Assert that the converted value fits in the original type. If it doesn't 423 // (eg: because the value being converted is too big), then the result of the 424 // original operation was undefined anyway, so the assert is still correct. 425 // 426 // NOTE: fp-to-uint to fp-to-sint promotion guarantees zero extend. For example: 427 // before legalization: fp-to-uint16, 65534. -> 0xfffe 428 // after legalization: fp-to-sint32, 65534. -> 0x0000fffe 429 return DAG.getNode(N->getOpcode() == ISD::FP_TO_UINT ? 430 ISD::AssertZext : ISD::AssertSext, dl, NVT, Res, 431 DAG.getValueType(N->getValueType(0).getScalarType())); 432 } 433 434 SDValue DAGTypeLegalizer::PromoteIntRes_FP_TO_FP16(SDNode *N) { 435 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)); 436 SDLoc dl(N); 437 438 return DAG.getNode(N->getOpcode(), dl, NVT, N->getOperand(0)); 439 } 440 441 SDValue DAGTypeLegalizer::PromoteIntRes_INT_EXTEND(SDNode *N) { 442 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)); 443 SDLoc dl(N); 444 445 if (getTypeAction(N->getOperand(0).getValueType()) 446 == TargetLowering::TypePromoteInteger) { 447 SDValue Res = GetPromotedInteger(N->getOperand(0)); 448 assert(Res.getValueType().bitsLE(NVT) && "Extension doesn't make sense!"); 449 450 // If the result and operand types are the same after promotion, simplify 451 // to an in-register extension. 452 if (NVT == Res.getValueType()) { 453 // The high bits are not guaranteed to be anything. Insert an extend. 454 if (N->getOpcode() == ISD::SIGN_EXTEND) 455 return DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, NVT, Res, 456 DAG.getValueType(N->getOperand(0).getValueType())); 457 if (N->getOpcode() == ISD::ZERO_EXTEND) 458 return DAG.getZeroExtendInReg(Res, dl, 459 N->getOperand(0).getValueType().getScalarType()); 460 assert(N->getOpcode() == ISD::ANY_EXTEND && "Unknown integer extension!"); 461 return Res; 462 } 463 } 464 465 // Otherwise, just extend the original operand all the way to the larger type. 466 return DAG.getNode(N->getOpcode(), dl, NVT, N->getOperand(0)); 467 } 468 469 SDValue DAGTypeLegalizer::PromoteIntRes_LOAD(LoadSDNode *N) { 470 assert(ISD::isUNINDEXEDLoad(N) && "Indexed load during type legalization!"); 471 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)); 472 ISD::LoadExtType ExtType = 473 ISD::isNON_EXTLoad(N) ? ISD::EXTLOAD : N->getExtensionType(); 474 SDLoc dl(N); 475 SDValue Res = DAG.getExtLoad(ExtType, dl, NVT, N->getChain(), N->getBasePtr(), 476 N->getMemoryVT(), N->getMemOperand()); 477 478 // Legalize the chain result - switch anything that used the old chain to 479 // use the new one. 480 ReplaceValueWith(SDValue(N, 1), Res.getValue(1)); 481 return Res; 482 } 483 484 SDValue DAGTypeLegalizer::PromoteIntRes_MLOAD(MaskedLoadSDNode *N) { 485 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)); 486 SDValue ExtSrc0 = GetPromotedInteger(N->getSrc0()); 487 488 SDLoc dl(N); 489 SDValue Res = DAG.getMaskedLoad(NVT, dl, N->getChain(), N->getBasePtr(), 490 N->getMask(), ExtSrc0, N->getMemoryVT(), 491 N->getMemOperand(), ISD::SEXTLOAD); 492 // Legalize the chain result - switch anything that used the old chain to 493 // use the new one. 494 ReplaceValueWith(SDValue(N, 1), Res.getValue(1)); 495 return Res; 496 } 497 498 SDValue DAGTypeLegalizer::PromoteIntRes_MGATHER(MaskedGatherSDNode *N) { 499 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)); 500 SDValue ExtSrc0 = GetPromotedInteger(N->getValue()); 501 assert(NVT == ExtSrc0.getValueType() && 502 "Gather result type and the passThru agrument type should be the same"); 503 504 SDLoc dl(N); 505 SDValue Ops[] = {N->getChain(), ExtSrc0, N->getMask(), N->getBasePtr(), 506 N->getIndex(), N->getScale() }; 507 SDValue Res = DAG.getMaskedGather(DAG.getVTList(NVT, MVT::Other), 508 N->getMemoryVT(), dl, Ops, 509 N->getMemOperand()); 510 // Legalize the chain result - switch anything that used the old chain to 511 // use the new one. 512 ReplaceValueWith(SDValue(N, 1), Res.getValue(1)); 513 return Res; 514 } 515 516 /// Promote the overflow flag of an overflowing arithmetic node. 517 SDValue DAGTypeLegalizer::PromoteIntRes_Overflow(SDNode *N) { 518 // Simply change the return type of the boolean result. 519 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(1)); 520 EVT ValueVTs[] = { N->getValueType(0), NVT }; 521 SDValue Ops[3] = { N->getOperand(0), N->getOperand(1) }; 522 unsigned NumOps = N->getNumOperands(); 523 assert(NumOps <= 3 && "Too many operands"); 524 if (NumOps == 3) 525 Ops[2] = N->getOperand(2); 526 527 SDValue Res = DAG.getNode(N->getOpcode(), SDLoc(N), 528 DAG.getVTList(ValueVTs), makeArrayRef(Ops, NumOps)); 529 530 // Modified the sum result - switch anything that used the old sum to use 531 // the new one. 532 ReplaceValueWith(SDValue(N, 0), Res); 533 534 return SDValue(Res.getNode(), 1); 535 } 536 537 SDValue DAGTypeLegalizer::PromoteIntRes_SADDSUBO(SDNode *N, unsigned ResNo) { 538 if (ResNo == 1) 539 return PromoteIntRes_Overflow(N); 540 541 // The operation overflowed iff the result in the larger type is not the 542 // sign extension of its truncation to the original type. 543 SDValue LHS = SExtPromotedInteger(N->getOperand(0)); 544 SDValue RHS = SExtPromotedInteger(N->getOperand(1)); 545 EVT OVT = N->getOperand(0).getValueType(); 546 EVT NVT = LHS.getValueType(); 547 SDLoc dl(N); 548 549 // Do the arithmetic in the larger type. 550 unsigned Opcode = N->getOpcode() == ISD::SADDO ? ISD::ADD : ISD::SUB; 551 SDValue Res = DAG.getNode(Opcode, dl, NVT, LHS, RHS); 552 553 // Calculate the overflow flag: sign extend the arithmetic result from 554 // the original type. 555 SDValue Ofl = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, NVT, Res, 556 DAG.getValueType(OVT)); 557 // Overflowed if and only if this is not equal to Res. 558 Ofl = DAG.getSetCC(dl, N->getValueType(1), Ofl, Res, ISD::SETNE); 559 560 // Use the calculated overflow everywhere. 561 ReplaceValueWith(SDValue(N, 1), Ofl); 562 563 return Res; 564 } 565 566 SDValue DAGTypeLegalizer::PromoteIntRes_SELECT(SDNode *N) { 567 SDValue LHS = GetPromotedInteger(N->getOperand(1)); 568 SDValue RHS = GetPromotedInteger(N->getOperand(2)); 569 return DAG.getSelect(SDLoc(N), 570 LHS.getValueType(), N->getOperand(0), LHS, RHS); 571 } 572 573 SDValue DAGTypeLegalizer::PromoteIntRes_VSELECT(SDNode *N) { 574 SDValue Mask = N->getOperand(0); 575 576 SDValue LHS = GetPromotedInteger(N->getOperand(1)); 577 SDValue RHS = GetPromotedInteger(N->getOperand(2)); 578 return DAG.getNode(ISD::VSELECT, SDLoc(N), 579 LHS.getValueType(), Mask, LHS, RHS); 580 } 581 582 SDValue DAGTypeLegalizer::PromoteIntRes_SELECT_CC(SDNode *N) { 583 SDValue LHS = GetPromotedInteger(N->getOperand(2)); 584 SDValue RHS = GetPromotedInteger(N->getOperand(3)); 585 return DAG.getNode(ISD::SELECT_CC, SDLoc(N), 586 LHS.getValueType(), N->getOperand(0), 587 N->getOperand(1), LHS, RHS, N->getOperand(4)); 588 } 589 590 SDValue DAGTypeLegalizer::PromoteIntRes_SETCC(SDNode *N) { 591 EVT InVT = N->getOperand(0).getValueType(); 592 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)); 593 594 EVT SVT = getSetCCResultType(InVT); 595 596 // If we got back a type that needs to be promoted, this likely means the 597 // the input type also needs to be promoted. So get the promoted type for 598 // the input and try the query again. 599 if (getTypeAction(SVT) == TargetLowering::TypePromoteInteger) { 600 if (getTypeAction(InVT) == TargetLowering::TypePromoteInteger) { 601 InVT = TLI.getTypeToTransformTo(*DAG.getContext(), InVT); 602 SVT = getSetCCResultType(InVT); 603 } else { 604 // Input type isn't promoted, just use the default promoted type. 605 SVT = NVT; 606 } 607 } 608 609 SDLoc dl(N); 610 assert(SVT.isVector() == N->getOperand(0).getValueType().isVector() && 611 "Vector compare must return a vector result!"); 612 613 // Get the SETCC result using the canonical SETCC type. 614 SDValue SetCC = DAG.getNode(N->getOpcode(), dl, SVT, N->getOperand(0), 615 N->getOperand(1), N->getOperand(2)); 616 617 // Convert to the expected type. 618 return DAG.getSExtOrTrunc(SetCC, dl, NVT); 619 } 620 621 SDValue DAGTypeLegalizer::PromoteIntRes_SHL(SDNode *N) { 622 SDValue LHS = GetPromotedInteger(N->getOperand(0)); 623 SDValue RHS = N->getOperand(1); 624 if (getTypeAction(RHS.getValueType()) == TargetLowering::TypePromoteInteger) 625 RHS = ZExtPromotedInteger(RHS); 626 return DAG.getNode(ISD::SHL, SDLoc(N), LHS.getValueType(), LHS, RHS); 627 } 628 629 SDValue DAGTypeLegalizer::PromoteIntRes_SIGN_EXTEND_INREG(SDNode *N) { 630 SDValue Op = GetPromotedInteger(N->getOperand(0)); 631 return DAG.getNode(ISD::SIGN_EXTEND_INREG, SDLoc(N), 632 Op.getValueType(), Op, N->getOperand(1)); 633 } 634 635 SDValue DAGTypeLegalizer::PromoteIntRes_SimpleIntBinOp(SDNode *N) { 636 // The input may have strange things in the top bits of the registers, but 637 // these operations don't care. They may have weird bits going out, but 638 // that too is okay if they are integer operations. 639 SDValue LHS = GetPromotedInteger(N->getOperand(0)); 640 SDValue RHS = GetPromotedInteger(N->getOperand(1)); 641 return DAG.getNode(N->getOpcode(), SDLoc(N), 642 LHS.getValueType(), LHS, RHS); 643 } 644 645 SDValue DAGTypeLegalizer::PromoteIntRes_SExtIntBinOp(SDNode *N) { 646 // Sign extend the input. 647 SDValue LHS = SExtPromotedInteger(N->getOperand(0)); 648 SDValue RHS = SExtPromotedInteger(N->getOperand(1)); 649 return DAG.getNode(N->getOpcode(), SDLoc(N), 650 LHS.getValueType(), LHS, RHS); 651 } 652 653 SDValue DAGTypeLegalizer::PromoteIntRes_ZExtIntBinOp(SDNode *N) { 654 // Zero extend the input. 655 SDValue LHS = ZExtPromotedInteger(N->getOperand(0)); 656 SDValue RHS = ZExtPromotedInteger(N->getOperand(1)); 657 return DAG.getNode(N->getOpcode(), SDLoc(N), 658 LHS.getValueType(), LHS, RHS); 659 } 660 661 SDValue DAGTypeLegalizer::PromoteIntRes_SRA(SDNode *N) { 662 // The input value must be properly sign extended. 663 SDValue LHS = SExtPromotedInteger(N->getOperand(0)); 664 SDValue RHS = N->getOperand(1); 665 if (getTypeAction(RHS.getValueType()) == TargetLowering::TypePromoteInteger) 666 RHS = ZExtPromotedInteger(RHS); 667 return DAG.getNode(ISD::SRA, SDLoc(N), LHS.getValueType(), LHS, RHS); 668 } 669 670 SDValue DAGTypeLegalizer::PromoteIntRes_SRL(SDNode *N) { 671 // The input value must be properly zero extended. 672 SDValue LHS = ZExtPromotedInteger(N->getOperand(0)); 673 SDValue RHS = N->getOperand(1); 674 if (getTypeAction(RHS.getValueType()) == TargetLowering::TypePromoteInteger) 675 RHS = ZExtPromotedInteger(RHS); 676 return DAG.getNode(ISD::SRL, SDLoc(N), LHS.getValueType(), LHS, RHS); 677 } 678 679 SDValue DAGTypeLegalizer::PromoteIntRes_TRUNCATE(SDNode *N) { 680 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)); 681 SDValue Res; 682 SDValue InOp = N->getOperand(0); 683 SDLoc dl(N); 684 685 switch (getTypeAction(InOp.getValueType())) { 686 default: llvm_unreachable("Unknown type action!"); 687 case TargetLowering::TypeLegal: 688 case TargetLowering::TypeExpandInteger: 689 Res = InOp; 690 break; 691 case TargetLowering::TypePromoteInteger: 692 Res = GetPromotedInteger(InOp); 693 break; 694 case TargetLowering::TypeSplitVector: { 695 EVT InVT = InOp.getValueType(); 696 assert(InVT.isVector() && "Cannot split scalar types"); 697 unsigned NumElts = InVT.getVectorNumElements(); 698 assert(NumElts == NVT.getVectorNumElements() && 699 "Dst and Src must have the same number of elements"); 700 assert(isPowerOf2_32(NumElts) && 701 "Promoted vector type must be a power of two"); 702 703 SDValue EOp1, EOp2; 704 GetSplitVector(InOp, EOp1, EOp2); 705 706 EVT HalfNVT = EVT::getVectorVT(*DAG.getContext(), NVT.getScalarType(), 707 NumElts/2); 708 EOp1 = DAG.getNode(ISD::TRUNCATE, dl, HalfNVT, EOp1); 709 EOp2 = DAG.getNode(ISD::TRUNCATE, dl, HalfNVT, EOp2); 710 711 return DAG.getNode(ISD::CONCAT_VECTORS, dl, NVT, EOp1, EOp2); 712 } 713 case TargetLowering::TypeWidenVector: { 714 SDValue WideInOp = GetWidenedVector(InOp); 715 716 // Truncate widened InOp. 717 unsigned NumElem = WideInOp.getValueType().getVectorNumElements(); 718 EVT TruncVT = EVT::getVectorVT(*DAG.getContext(), 719 N->getValueType(0).getScalarType(), NumElem); 720 SDValue WideTrunc = DAG.getNode(ISD::TRUNCATE, dl, TruncVT, WideInOp); 721 722 // Zero extend so that the elements are of same type as those of NVT 723 EVT ExtVT = EVT::getVectorVT(*DAG.getContext(), NVT.getVectorElementType(), 724 NumElem); 725 SDValue WideExt = DAG.getNode(ISD::ZERO_EXTEND, dl, ExtVT, WideTrunc); 726 727 // Extract the low NVT subvector. 728 MVT IdxTy = TLI.getVectorIdxTy(DAG.getDataLayout()); 729 SDValue ZeroIdx = DAG.getConstant(0, dl, IdxTy); 730 return DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, NVT, WideExt, ZeroIdx); 731 } 732 } 733 734 // Truncate to NVT instead of VT 735 return DAG.getNode(ISD::TRUNCATE, dl, NVT, Res); 736 } 737 738 SDValue DAGTypeLegalizer::PromoteIntRes_UADDSUBO(SDNode *N, unsigned ResNo) { 739 if (ResNo == 1) 740 return PromoteIntRes_Overflow(N); 741 742 // The operation overflowed iff the result in the larger type is not the 743 // zero extension of its truncation to the original type. 744 SDValue LHS = ZExtPromotedInteger(N->getOperand(0)); 745 SDValue RHS = ZExtPromotedInteger(N->getOperand(1)); 746 EVT OVT = N->getOperand(0).getValueType(); 747 EVT NVT = LHS.getValueType(); 748 SDLoc dl(N); 749 750 // Do the arithmetic in the larger type. 751 unsigned Opcode = N->getOpcode() == ISD::UADDO ? ISD::ADD : ISD::SUB; 752 SDValue Res = DAG.getNode(Opcode, dl, NVT, LHS, RHS); 753 754 // Calculate the overflow flag: zero extend the arithmetic result from 755 // the original type. 756 SDValue Ofl = DAG.getZeroExtendInReg(Res, dl, OVT); 757 // Overflowed if and only if this is not equal to Res. 758 Ofl = DAG.getSetCC(dl, N->getValueType(1), Ofl, Res, ISD::SETNE); 759 760 // Use the calculated overflow everywhere. 761 ReplaceValueWith(SDValue(N, 1), Ofl); 762 763 return Res; 764 } 765 766 SDValue DAGTypeLegalizer::PromoteIntRes_ADDSUBCARRY(SDNode *N, unsigned ResNo) { 767 if (ResNo == 1) 768 return PromoteIntRes_Overflow(N); 769 770 // We need to sign-extend the operands so the carry value computed by the 771 // wide operation will be equivalent to the carry value computed by the 772 // narrow operation. 773 // An ADDCARRY can generate carry only if any of the operands has its 774 // most significant bit set. Sign extension propagates the most significant 775 // bit into the higher bits which means the extra bit that the narrow 776 // addition would need (i.e. the carry) will be propagated through the higher 777 // bits of the wide addition. 778 // A SUBCARRY can generate borrow only if LHS < RHS and this property will be 779 // preserved by sign extension. 780 SDValue LHS = SExtPromotedInteger(N->getOperand(0)); 781 SDValue RHS = SExtPromotedInteger(N->getOperand(1)); 782 783 EVT ValueVTs[] = {LHS.getValueType(), N->getValueType(1)}; 784 785 // Do the arithmetic in the wide type. 786 SDValue Res = DAG.getNode(N->getOpcode(), SDLoc(N), DAG.getVTList(ValueVTs), 787 LHS, RHS, N->getOperand(2)); 788 789 // Update the users of the original carry/borrow value. 790 ReplaceValueWith(SDValue(N, 1), Res.getValue(1)); 791 792 return SDValue(Res.getNode(), 0); 793 } 794 795 SDValue DAGTypeLegalizer::PromoteIntRes_XMULO(SDNode *N, unsigned ResNo) { 796 // Promote the overflow bit trivially. 797 if (ResNo == 1) 798 return PromoteIntRes_Overflow(N); 799 800 SDValue LHS = N->getOperand(0), RHS = N->getOperand(1); 801 SDLoc DL(N); 802 EVT SmallVT = LHS.getValueType(); 803 804 // To determine if the result overflowed in a larger type, we extend the 805 // input to the larger type, do the multiply (checking if it overflows), 806 // then also check the high bits of the result to see if overflow happened 807 // there. 808 if (N->getOpcode() == ISD::SMULO) { 809 LHS = SExtPromotedInteger(LHS); 810 RHS = SExtPromotedInteger(RHS); 811 } else { 812 LHS = ZExtPromotedInteger(LHS); 813 RHS = ZExtPromotedInteger(RHS); 814 } 815 SDVTList VTs = DAG.getVTList(LHS.getValueType(), N->getValueType(1)); 816 SDValue Mul = DAG.getNode(N->getOpcode(), DL, VTs, LHS, RHS); 817 818 // Overflow occurred if it occurred in the larger type, or if the high part 819 // of the result does not zero/sign-extend the low part. Check this second 820 // possibility first. 821 SDValue Overflow; 822 if (N->getOpcode() == ISD::UMULO) { 823 // Unsigned overflow occurred if the high part is non-zero. 824 SDValue Hi = DAG.getNode(ISD::SRL, DL, Mul.getValueType(), Mul, 825 DAG.getIntPtrConstant(SmallVT.getSizeInBits(), 826 DL)); 827 Overflow = DAG.getSetCC(DL, N->getValueType(1), Hi, 828 DAG.getConstant(0, DL, Hi.getValueType()), 829 ISD::SETNE); 830 } else { 831 // Signed overflow occurred if the high part does not sign extend the low. 832 SDValue SExt = DAG.getNode(ISD::SIGN_EXTEND_INREG, DL, Mul.getValueType(), 833 Mul, DAG.getValueType(SmallVT)); 834 Overflow = DAG.getSetCC(DL, N->getValueType(1), SExt, Mul, ISD::SETNE); 835 } 836 837 // The only other way for overflow to occur is if the multiplication in the 838 // larger type itself overflowed. 839 Overflow = DAG.getNode(ISD::OR, DL, N->getValueType(1), Overflow, 840 SDValue(Mul.getNode(), 1)); 841 842 // Use the calculated overflow everywhere. 843 ReplaceValueWith(SDValue(N, 1), Overflow); 844 return Mul; 845 } 846 847 SDValue DAGTypeLegalizer::PromoteIntRes_UNDEF(SDNode *N) { 848 return DAG.getUNDEF(TLI.getTypeToTransformTo(*DAG.getContext(), 849 N->getValueType(0))); 850 } 851 852 SDValue DAGTypeLegalizer::PromoteIntRes_VAARG(SDNode *N) { 853 SDValue Chain = N->getOperand(0); // Get the chain. 854 SDValue Ptr = N->getOperand(1); // Get the pointer. 855 EVT VT = N->getValueType(0); 856 SDLoc dl(N); 857 858 MVT RegVT = TLI.getRegisterType(*DAG.getContext(), VT); 859 unsigned NumRegs = TLI.getNumRegisters(*DAG.getContext(), VT); 860 // The argument is passed as NumRegs registers of type RegVT. 861 862 SmallVector<SDValue, 8> Parts(NumRegs); 863 for (unsigned i = 0; i < NumRegs; ++i) { 864 Parts[i] = DAG.getVAArg(RegVT, dl, Chain, Ptr, N->getOperand(2), 865 N->getConstantOperandVal(3)); 866 Chain = Parts[i].getValue(1); 867 } 868 869 // Handle endianness of the load. 870 if (DAG.getDataLayout().isBigEndian()) 871 std::reverse(Parts.begin(), Parts.end()); 872 873 // Assemble the parts in the promoted type. 874 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)); 875 SDValue Res = DAG.getNode(ISD::ZERO_EXTEND, dl, NVT, Parts[0]); 876 for (unsigned i = 1; i < NumRegs; ++i) { 877 SDValue Part = DAG.getNode(ISD::ZERO_EXTEND, dl, NVT, Parts[i]); 878 // Shift it to the right position and "or" it in. 879 Part = DAG.getNode(ISD::SHL, dl, NVT, Part, 880 DAG.getConstant(i * RegVT.getSizeInBits(), dl, 881 TLI.getPointerTy(DAG.getDataLayout()))); 882 Res = DAG.getNode(ISD::OR, dl, NVT, Res, Part); 883 } 884 885 // Modified the chain result - switch anything that used the old chain to 886 // use the new one. 887 ReplaceValueWith(SDValue(N, 1), Chain); 888 889 return Res; 890 } 891 892 //===----------------------------------------------------------------------===// 893 // Integer Operand Promotion 894 //===----------------------------------------------------------------------===// 895 896 /// PromoteIntegerOperand - This method is called when the specified operand of 897 /// the specified node is found to need promotion. At this point, all of the 898 /// result types of the node are known to be legal, but other operands of the 899 /// node may need promotion or expansion as well as the specified one. 900 bool DAGTypeLegalizer::PromoteIntegerOperand(SDNode *N, unsigned OpNo) { 901 LLVM_DEBUG(dbgs() << "Promote integer operand: "; N->dump(&DAG); 902 dbgs() << "\n"); 903 SDValue Res = SDValue(); 904 905 if (CustomLowerNode(N, N->getOperand(OpNo).getValueType(), false)) { 906 LLVM_DEBUG(dbgs() << "Node has been custom lowered, done\n"); 907 return false; 908 } 909 910 switch (N->getOpcode()) { 911 default: 912 #ifndef NDEBUG 913 dbgs() << "PromoteIntegerOperand Op #" << OpNo << ": "; 914 N->dump(&DAG); dbgs() << "\n"; 915 #endif 916 llvm_unreachable("Do not know how to promote this operator's operand!"); 917 918 case ISD::ANY_EXTEND: Res = PromoteIntOp_ANY_EXTEND(N); break; 919 case ISD::ATOMIC_STORE: 920 Res = PromoteIntOp_ATOMIC_STORE(cast<AtomicSDNode>(N)); 921 break; 922 case ISD::BITCAST: Res = PromoteIntOp_BITCAST(N); break; 923 case ISD::BR_CC: Res = PromoteIntOp_BR_CC(N, OpNo); break; 924 case ISD::BRCOND: Res = PromoteIntOp_BRCOND(N, OpNo); break; 925 case ISD::BUILD_PAIR: Res = PromoteIntOp_BUILD_PAIR(N); break; 926 case ISD::BUILD_VECTOR: Res = PromoteIntOp_BUILD_VECTOR(N); break; 927 case ISD::CONCAT_VECTORS: Res = PromoteIntOp_CONCAT_VECTORS(N); break; 928 case ISD::EXTRACT_VECTOR_ELT: Res = PromoteIntOp_EXTRACT_VECTOR_ELT(N); break; 929 case ISD::INSERT_VECTOR_ELT: 930 Res = PromoteIntOp_INSERT_VECTOR_ELT(N, OpNo);break; 931 case ISD::SCALAR_TO_VECTOR: 932 Res = PromoteIntOp_SCALAR_TO_VECTOR(N); break; 933 case ISD::VSELECT: 934 case ISD::SELECT: Res = PromoteIntOp_SELECT(N, OpNo); break; 935 case ISD::SELECT_CC: Res = PromoteIntOp_SELECT_CC(N, OpNo); break; 936 case ISD::SETCC: Res = PromoteIntOp_SETCC(N, OpNo); break; 937 case ISD::SIGN_EXTEND: Res = PromoteIntOp_SIGN_EXTEND(N); break; 938 case ISD::SINT_TO_FP: Res = PromoteIntOp_SINT_TO_FP(N); break; 939 case ISD::STORE: Res = PromoteIntOp_STORE(cast<StoreSDNode>(N), 940 OpNo); break; 941 case ISD::MSTORE: Res = PromoteIntOp_MSTORE(cast<MaskedStoreSDNode>(N), 942 OpNo); break; 943 case ISD::MLOAD: Res = PromoteIntOp_MLOAD(cast<MaskedLoadSDNode>(N), 944 OpNo); break; 945 case ISD::MGATHER: Res = PromoteIntOp_MGATHER(cast<MaskedGatherSDNode>(N), 946 OpNo); break; 947 case ISD::MSCATTER: Res = PromoteIntOp_MSCATTER(cast<MaskedScatterSDNode>(N), 948 OpNo); break; 949 case ISD::TRUNCATE: Res = PromoteIntOp_TRUNCATE(N); break; 950 case ISD::FP16_TO_FP: 951 case ISD::UINT_TO_FP: Res = PromoteIntOp_UINT_TO_FP(N); break; 952 case ISD::ZERO_EXTEND: Res = PromoteIntOp_ZERO_EXTEND(N); break; 953 case ISD::EXTRACT_SUBVECTOR: Res = PromoteIntOp_EXTRACT_SUBVECTOR(N); break; 954 955 case ISD::SHL: 956 case ISD::SRA: 957 case ISD::SRL: 958 case ISD::ROTL: 959 case ISD::ROTR: Res = PromoteIntOp_Shift(N); break; 960 961 case ISD::ADDCARRY: 962 case ISD::SUBCARRY: Res = PromoteIntOp_ADDSUBCARRY(N, OpNo); break; 963 } 964 965 // If the result is null, the sub-method took care of registering results etc. 966 if (!Res.getNode()) return false; 967 968 // If the result is N, the sub-method updated N in place. Tell the legalizer 969 // core about this. 970 if (Res.getNode() == N) 971 return true; 972 973 assert(Res.getValueType() == N->getValueType(0) && N->getNumValues() == 1 && 974 "Invalid operand expansion"); 975 976 ReplaceValueWith(SDValue(N, 0), Res); 977 return false; 978 } 979 980 /// PromoteSetCCOperands - Promote the operands of a comparison. This code is 981 /// shared among BR_CC, SELECT_CC, and SETCC handlers. 982 void DAGTypeLegalizer::PromoteSetCCOperands(SDValue &NewLHS,SDValue &NewRHS, 983 ISD::CondCode CCCode) { 984 // We have to insert explicit sign or zero extends. Note that we could 985 // insert sign extends for ALL conditions, but zero extend is cheaper on 986 // many machines (an AND instead of two shifts), so prefer it. 987 switch (CCCode) { 988 default: llvm_unreachable("Unknown integer comparison!"); 989 case ISD::SETEQ: 990 case ISD::SETNE: { 991 SDValue OpL = GetPromotedInteger(NewLHS); 992 SDValue OpR = GetPromotedInteger(NewRHS); 993 994 // We would prefer to promote the comparison operand with sign extension. 995 // If the width of OpL/OpR excluding the duplicated sign bits is no greater 996 // than the width of NewLHS/NewRH, we can avoid inserting real truncate 997 // instruction, which is redudant eventually. 998 unsigned OpLEffectiveBits = 999 OpL.getScalarValueSizeInBits() - DAG.ComputeNumSignBits(OpL) + 1; 1000 unsigned OpREffectiveBits = 1001 OpR.getScalarValueSizeInBits() - DAG.ComputeNumSignBits(OpR) + 1; 1002 if (OpLEffectiveBits <= NewLHS.getScalarValueSizeInBits() && 1003 OpREffectiveBits <= NewRHS.getScalarValueSizeInBits()) { 1004 NewLHS = OpL; 1005 NewRHS = OpR; 1006 } else { 1007 NewLHS = ZExtPromotedInteger(NewLHS); 1008 NewRHS = ZExtPromotedInteger(NewRHS); 1009 } 1010 break; 1011 } 1012 case ISD::SETUGE: 1013 case ISD::SETUGT: 1014 case ISD::SETULE: 1015 case ISD::SETULT: 1016 // ALL of these operations will work if we either sign or zero extend 1017 // the operands (including the unsigned comparisons!). Zero extend is 1018 // usually a simpler/cheaper operation, so prefer it. 1019 NewLHS = ZExtPromotedInteger(NewLHS); 1020 NewRHS = ZExtPromotedInteger(NewRHS); 1021 break; 1022 case ISD::SETGE: 1023 case ISD::SETGT: 1024 case ISD::SETLT: 1025 case ISD::SETLE: 1026 NewLHS = SExtPromotedInteger(NewLHS); 1027 NewRHS = SExtPromotedInteger(NewRHS); 1028 break; 1029 } 1030 } 1031 1032 SDValue DAGTypeLegalizer::PromoteIntOp_ANY_EXTEND(SDNode *N) { 1033 SDValue Op = GetPromotedInteger(N->getOperand(0)); 1034 return DAG.getNode(ISD::ANY_EXTEND, SDLoc(N), N->getValueType(0), Op); 1035 } 1036 1037 SDValue DAGTypeLegalizer::PromoteIntOp_ATOMIC_STORE(AtomicSDNode *N) { 1038 SDValue Op2 = GetPromotedInteger(N->getOperand(2)); 1039 return DAG.getAtomic(N->getOpcode(), SDLoc(N), N->getMemoryVT(), 1040 N->getChain(), N->getBasePtr(), Op2, N->getMemOperand()); 1041 } 1042 1043 SDValue DAGTypeLegalizer::PromoteIntOp_BITCAST(SDNode *N) { 1044 // This should only occur in unusual situations like bitcasting to an 1045 // x86_fp80, so just turn it into a store+load 1046 return CreateStackStoreLoad(N->getOperand(0), N->getValueType(0)); 1047 } 1048 1049 SDValue DAGTypeLegalizer::PromoteIntOp_BR_CC(SDNode *N, unsigned OpNo) { 1050 assert(OpNo == 2 && "Don't know how to promote this operand!"); 1051 1052 SDValue LHS = N->getOperand(2); 1053 SDValue RHS = N->getOperand(3); 1054 PromoteSetCCOperands(LHS, RHS, cast<CondCodeSDNode>(N->getOperand(1))->get()); 1055 1056 // The chain (Op#0), CC (#1) and basic block destination (Op#4) are always 1057 // legal types. 1058 return SDValue(DAG.UpdateNodeOperands(N, N->getOperand(0), 1059 N->getOperand(1), LHS, RHS, N->getOperand(4)), 1060 0); 1061 } 1062 1063 SDValue DAGTypeLegalizer::PromoteIntOp_BRCOND(SDNode *N, unsigned OpNo) { 1064 assert(OpNo == 1 && "only know how to promote condition"); 1065 1066 // Promote all the way up to the canonical SetCC type. 1067 SDValue Cond = PromoteTargetBoolean(N->getOperand(1), MVT::Other); 1068 1069 // The chain (Op#0) and basic block destination (Op#2) are always legal types. 1070 return SDValue(DAG.UpdateNodeOperands(N, N->getOperand(0), Cond, 1071 N->getOperand(2)), 0); 1072 } 1073 1074 SDValue DAGTypeLegalizer::PromoteIntOp_BUILD_PAIR(SDNode *N) { 1075 // Since the result type is legal, the operands must promote to it. 1076 EVT OVT = N->getOperand(0).getValueType(); 1077 SDValue Lo = ZExtPromotedInteger(N->getOperand(0)); 1078 SDValue Hi = GetPromotedInteger(N->getOperand(1)); 1079 assert(Lo.getValueType() == N->getValueType(0) && "Operand over promoted?"); 1080 SDLoc dl(N); 1081 1082 Hi = DAG.getNode(ISD::SHL, dl, N->getValueType(0), Hi, 1083 DAG.getConstant(OVT.getSizeInBits(), dl, 1084 TLI.getPointerTy(DAG.getDataLayout()))); 1085 return DAG.getNode(ISD::OR, dl, N->getValueType(0), Lo, Hi); 1086 } 1087 1088 SDValue DAGTypeLegalizer::PromoteIntOp_BUILD_VECTOR(SDNode *N) { 1089 // The vector type is legal but the element type is not. This implies 1090 // that the vector is a power-of-two in length and that the element 1091 // type does not have a strange size (eg: it is not i1). 1092 EVT VecVT = N->getValueType(0); 1093 unsigned NumElts = VecVT.getVectorNumElements(); 1094 assert(!((NumElts & 1) && (!TLI.isTypeLegal(VecVT))) && 1095 "Legal vector of one illegal element?"); 1096 1097 // Promote the inserted value. The type does not need to match the 1098 // vector element type. Check that any extra bits introduced will be 1099 // truncated away. 1100 assert(N->getOperand(0).getValueSizeInBits() >= 1101 N->getValueType(0).getScalarSizeInBits() && 1102 "Type of inserted value narrower than vector element type!"); 1103 1104 SmallVector<SDValue, 16> NewOps; 1105 for (unsigned i = 0; i < NumElts; ++i) 1106 NewOps.push_back(GetPromotedInteger(N->getOperand(i))); 1107 1108 return SDValue(DAG.UpdateNodeOperands(N, NewOps), 0); 1109 } 1110 1111 SDValue DAGTypeLegalizer::PromoteIntOp_INSERT_VECTOR_ELT(SDNode *N, 1112 unsigned OpNo) { 1113 if (OpNo == 1) { 1114 // Promote the inserted value. This is valid because the type does not 1115 // have to match the vector element type. 1116 1117 // Check that any extra bits introduced will be truncated away. 1118 assert(N->getOperand(1).getValueSizeInBits() >= 1119 N->getValueType(0).getScalarSizeInBits() && 1120 "Type of inserted value narrower than vector element type!"); 1121 return SDValue(DAG.UpdateNodeOperands(N, N->getOperand(0), 1122 GetPromotedInteger(N->getOperand(1)), 1123 N->getOperand(2)), 1124 0); 1125 } 1126 1127 assert(OpNo == 2 && "Different operand and result vector types?"); 1128 1129 // Promote the index. 1130 SDValue Idx = DAG.getZExtOrTrunc(N->getOperand(2), SDLoc(N), 1131 TLI.getVectorIdxTy(DAG.getDataLayout())); 1132 return SDValue(DAG.UpdateNodeOperands(N, N->getOperand(0), 1133 N->getOperand(1), Idx), 0); 1134 } 1135 1136 SDValue DAGTypeLegalizer::PromoteIntOp_SCALAR_TO_VECTOR(SDNode *N) { 1137 // Integer SCALAR_TO_VECTOR operands are implicitly truncated, so just promote 1138 // the operand in place. 1139 return SDValue(DAG.UpdateNodeOperands(N, 1140 GetPromotedInteger(N->getOperand(0))), 0); 1141 } 1142 1143 SDValue DAGTypeLegalizer::PromoteIntOp_SELECT(SDNode *N, unsigned OpNo) { 1144 assert(OpNo == 0 && "Only know how to promote the condition!"); 1145 SDValue Cond = N->getOperand(0); 1146 EVT OpTy = N->getOperand(1).getValueType(); 1147 1148 if (N->getOpcode() == ISD::VSELECT) 1149 if (SDValue Res = WidenVSELECTAndMask(N)) 1150 return Res; 1151 1152 // Promote all the way up to the canonical SetCC type. 1153 EVT OpVT = N->getOpcode() == ISD::SELECT ? OpTy.getScalarType() : OpTy; 1154 Cond = PromoteTargetBoolean(Cond, OpVT); 1155 1156 return SDValue(DAG.UpdateNodeOperands(N, Cond, N->getOperand(1), 1157 N->getOperand(2)), 0); 1158 } 1159 1160 SDValue DAGTypeLegalizer::PromoteIntOp_SELECT_CC(SDNode *N, unsigned OpNo) { 1161 assert(OpNo == 0 && "Don't know how to promote this operand!"); 1162 1163 SDValue LHS = N->getOperand(0); 1164 SDValue RHS = N->getOperand(1); 1165 PromoteSetCCOperands(LHS, RHS, cast<CondCodeSDNode>(N->getOperand(4))->get()); 1166 1167 // The CC (#4) and the possible return values (#2 and #3) have legal types. 1168 return SDValue(DAG.UpdateNodeOperands(N, LHS, RHS, N->getOperand(2), 1169 N->getOperand(3), N->getOperand(4)), 0); 1170 } 1171 1172 SDValue DAGTypeLegalizer::PromoteIntOp_SETCC(SDNode *N, unsigned OpNo) { 1173 assert(OpNo == 0 && "Don't know how to promote this operand!"); 1174 1175 SDValue LHS = N->getOperand(0); 1176 SDValue RHS = N->getOperand(1); 1177 PromoteSetCCOperands(LHS, RHS, cast<CondCodeSDNode>(N->getOperand(2))->get()); 1178 1179 // The CC (#2) is always legal. 1180 return SDValue(DAG.UpdateNodeOperands(N, LHS, RHS, N->getOperand(2)), 0); 1181 } 1182 1183 SDValue DAGTypeLegalizer::PromoteIntOp_Shift(SDNode *N) { 1184 return SDValue(DAG.UpdateNodeOperands(N, N->getOperand(0), 1185 ZExtPromotedInteger(N->getOperand(1))), 0); 1186 } 1187 1188 SDValue DAGTypeLegalizer::PromoteIntOp_SIGN_EXTEND(SDNode *N) { 1189 SDValue Op = GetPromotedInteger(N->getOperand(0)); 1190 SDLoc dl(N); 1191 Op = DAG.getNode(ISD::ANY_EXTEND, dl, N->getValueType(0), Op); 1192 return DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, Op.getValueType(), 1193 Op, DAG.getValueType(N->getOperand(0).getValueType())); 1194 } 1195 1196 SDValue DAGTypeLegalizer::PromoteIntOp_SINT_TO_FP(SDNode *N) { 1197 return SDValue(DAG.UpdateNodeOperands(N, 1198 SExtPromotedInteger(N->getOperand(0))), 0); 1199 } 1200 1201 SDValue DAGTypeLegalizer::PromoteIntOp_STORE(StoreSDNode *N, unsigned OpNo){ 1202 assert(ISD::isUNINDEXEDStore(N) && "Indexed store during type legalization!"); 1203 SDValue Ch = N->getChain(), Ptr = N->getBasePtr(); 1204 SDLoc dl(N); 1205 1206 SDValue Val = GetPromotedInteger(N->getValue()); // Get promoted value. 1207 1208 // Truncate the value and store the result. 1209 return DAG.getTruncStore(Ch, dl, Val, Ptr, 1210 N->getMemoryVT(), N->getMemOperand()); 1211 } 1212 1213 SDValue DAGTypeLegalizer::PromoteIntOp_MSTORE(MaskedStoreSDNode *N, 1214 unsigned OpNo) { 1215 1216 SDValue DataOp = N->getValue(); 1217 EVT DataVT = DataOp.getValueType(); 1218 SDValue Mask = N->getMask(); 1219 SDLoc dl(N); 1220 1221 bool TruncateStore = false; 1222 if (OpNo == 2) { 1223 // Mask comes before the data operand. If the data operand is legal, we just 1224 // promote the mask. 1225 // When the data operand has illegal type, we should legalize the data 1226 // operand first. The mask will be promoted/splitted/widened according to 1227 // the data operand type. 1228 if (TLI.isTypeLegal(DataVT)) { 1229 Mask = PromoteTargetBoolean(Mask, DataVT); 1230 // Update in place. 1231 SmallVector<SDValue, 4> NewOps(N->op_begin(), N->op_end()); 1232 NewOps[2] = Mask; 1233 return SDValue(DAG.UpdateNodeOperands(N, NewOps), 0); 1234 } 1235 1236 if (getTypeAction(DataVT) == TargetLowering::TypePromoteInteger) 1237 return PromoteIntOp_MSTORE(N, 3); 1238 if (getTypeAction(DataVT) == TargetLowering::TypeWidenVector) 1239 return WidenVecOp_MSTORE(N, 3); 1240 assert (getTypeAction(DataVT) == TargetLowering::TypeSplitVector); 1241 return SplitVecOp_MSTORE(N, 3); 1242 } else { // Data operand 1243 assert(OpNo == 3 && "Unexpected operand for promotion"); 1244 DataOp = GetPromotedInteger(DataOp); 1245 TruncateStore = true; 1246 } 1247 1248 return DAG.getMaskedStore(N->getChain(), dl, DataOp, N->getBasePtr(), Mask, 1249 N->getMemoryVT(), N->getMemOperand(), 1250 TruncateStore, N->isCompressingStore()); 1251 } 1252 1253 SDValue DAGTypeLegalizer::PromoteIntOp_MLOAD(MaskedLoadSDNode *N, 1254 unsigned OpNo) { 1255 assert(OpNo == 2 && "Only know how to promote the mask!"); 1256 EVT DataVT = N->getValueType(0); 1257 SDValue Mask = PromoteTargetBoolean(N->getOperand(OpNo), DataVT); 1258 SmallVector<SDValue, 4> NewOps(N->op_begin(), N->op_end()); 1259 NewOps[OpNo] = Mask; 1260 return SDValue(DAG.UpdateNodeOperands(N, NewOps), 0); 1261 } 1262 1263 SDValue DAGTypeLegalizer::PromoteIntOp_MGATHER(MaskedGatherSDNode *N, 1264 unsigned OpNo) { 1265 1266 SmallVector<SDValue, 5> NewOps(N->op_begin(), N->op_end()); 1267 if (OpNo == 2) { 1268 // The Mask 1269 EVT DataVT = N->getValueType(0); 1270 NewOps[OpNo] = PromoteTargetBoolean(N->getOperand(OpNo), DataVT); 1271 } else if (OpNo == 4) { 1272 // Need to sign extend the index since the bits will likely be used. 1273 NewOps[OpNo] = SExtPromotedInteger(N->getOperand(OpNo)); 1274 } else 1275 NewOps[OpNo] = GetPromotedInteger(N->getOperand(OpNo)); 1276 1277 SDValue Res = SDValue(DAG.UpdateNodeOperands(N, NewOps), 0); 1278 // updated in place. 1279 if (Res.getNode() == N) 1280 return Res; 1281 1282 ReplaceValueWith(SDValue(N, 0), Res.getValue(0)); 1283 ReplaceValueWith(SDValue(N, 1), Res.getValue(1)); 1284 return SDValue(); 1285 } 1286 1287 SDValue DAGTypeLegalizer::PromoteIntOp_MSCATTER(MaskedScatterSDNode *N, 1288 unsigned OpNo) { 1289 SmallVector<SDValue, 5> NewOps(N->op_begin(), N->op_end()); 1290 if (OpNo == 2) { 1291 // The Mask 1292 EVT DataVT = N->getValue().getValueType(); 1293 NewOps[OpNo] = PromoteTargetBoolean(N->getOperand(OpNo), DataVT); 1294 } else if (OpNo == 4) { 1295 // Need to sign extend the index since the bits will likely be used. 1296 NewOps[OpNo] = SExtPromotedInteger(N->getOperand(OpNo)); 1297 } else 1298 NewOps[OpNo] = GetPromotedInteger(N->getOperand(OpNo)); 1299 return SDValue(DAG.UpdateNodeOperands(N, NewOps), 0); 1300 } 1301 1302 SDValue DAGTypeLegalizer::PromoteIntOp_TRUNCATE(SDNode *N) { 1303 SDValue Op = GetPromotedInteger(N->getOperand(0)); 1304 return DAG.getNode(ISD::TRUNCATE, SDLoc(N), N->getValueType(0), Op); 1305 } 1306 1307 SDValue DAGTypeLegalizer::PromoteIntOp_UINT_TO_FP(SDNode *N) { 1308 return SDValue(DAG.UpdateNodeOperands(N, 1309 ZExtPromotedInteger(N->getOperand(0))), 0); 1310 } 1311 1312 SDValue DAGTypeLegalizer::PromoteIntOp_ZERO_EXTEND(SDNode *N) { 1313 SDLoc dl(N); 1314 SDValue Op = GetPromotedInteger(N->getOperand(0)); 1315 Op = DAG.getNode(ISD::ANY_EXTEND, dl, N->getValueType(0), Op); 1316 return DAG.getZeroExtendInReg(Op, dl, 1317 N->getOperand(0).getValueType().getScalarType()); 1318 } 1319 1320 SDValue DAGTypeLegalizer::PromoteIntOp_ADDSUBCARRY(SDNode *N, unsigned OpNo) { 1321 assert(OpNo == 2 && "Don't know how to promote this operand!"); 1322 1323 SDValue LHS = N->getOperand(0); 1324 SDValue RHS = N->getOperand(1); 1325 SDValue Carry = N->getOperand(2); 1326 SDLoc DL(N); 1327 1328 auto VT = getSetCCResultType(LHS.getValueType()); 1329 TargetLoweringBase::BooleanContent BoolType = TLI.getBooleanContents(VT); 1330 switch (BoolType) { 1331 case TargetLoweringBase::UndefinedBooleanContent: 1332 Carry = DAG.getAnyExtOrTrunc(Carry, DL, VT); 1333 break; 1334 case TargetLoweringBase::ZeroOrOneBooleanContent: 1335 Carry = DAG.getZExtOrTrunc(Carry, DL, VT); 1336 break; 1337 case TargetLoweringBase::ZeroOrNegativeOneBooleanContent: 1338 Carry = DAG.getSExtOrTrunc(Carry, DL, VT); 1339 break; 1340 } 1341 1342 return SDValue(DAG.UpdateNodeOperands(N, LHS, RHS, Carry), 0); 1343 } 1344 1345 //===----------------------------------------------------------------------===// 1346 // Integer Result Expansion 1347 //===----------------------------------------------------------------------===// 1348 1349 /// ExpandIntegerResult - This method is called when the specified result of the 1350 /// specified node is found to need expansion. At this point, the node may also 1351 /// have invalid operands or may have other results that need promotion, we just 1352 /// know that (at least) one result needs expansion. 1353 void DAGTypeLegalizer::ExpandIntegerResult(SDNode *N, unsigned ResNo) { 1354 LLVM_DEBUG(dbgs() << "Expand integer result: "; N->dump(&DAG); 1355 dbgs() << "\n"); 1356 SDValue Lo, Hi; 1357 Lo = Hi = SDValue(); 1358 1359 // See if the target wants to custom expand this node. 1360 if (CustomLowerNode(N, N->getValueType(ResNo), true)) 1361 return; 1362 1363 switch (N->getOpcode()) { 1364 default: 1365 #ifndef NDEBUG 1366 dbgs() << "ExpandIntegerResult #" << ResNo << ": "; 1367 N->dump(&DAG); dbgs() << "\n"; 1368 #endif 1369 llvm_unreachable("Do not know how to expand the result of this operator!"); 1370 1371 case ISD::MERGE_VALUES: SplitRes_MERGE_VALUES(N, ResNo, Lo, Hi); break; 1372 case ISD::SELECT: SplitRes_SELECT(N, Lo, Hi); break; 1373 case ISD::SELECT_CC: SplitRes_SELECT_CC(N, Lo, Hi); break; 1374 case ISD::UNDEF: SplitRes_UNDEF(N, Lo, Hi); break; 1375 1376 case ISD::BITCAST: ExpandRes_BITCAST(N, Lo, Hi); break; 1377 case ISD::BUILD_PAIR: ExpandRes_BUILD_PAIR(N, Lo, Hi); break; 1378 case ISD::EXTRACT_ELEMENT: ExpandRes_EXTRACT_ELEMENT(N, Lo, Hi); break; 1379 case ISD::EXTRACT_VECTOR_ELT: ExpandRes_EXTRACT_VECTOR_ELT(N, Lo, Hi); break; 1380 case ISD::VAARG: ExpandRes_VAARG(N, Lo, Hi); break; 1381 1382 case ISD::ANY_EXTEND: ExpandIntRes_ANY_EXTEND(N, Lo, Hi); break; 1383 case ISD::AssertSext: ExpandIntRes_AssertSext(N, Lo, Hi); break; 1384 case ISD::AssertZext: ExpandIntRes_AssertZext(N, Lo, Hi); break; 1385 case ISD::BITREVERSE: ExpandIntRes_BITREVERSE(N, Lo, Hi); break; 1386 case ISD::BSWAP: ExpandIntRes_BSWAP(N, Lo, Hi); break; 1387 case ISD::Constant: ExpandIntRes_Constant(N, Lo, Hi); break; 1388 case ISD::CTLZ_ZERO_UNDEF: 1389 case ISD::CTLZ: ExpandIntRes_CTLZ(N, Lo, Hi); break; 1390 case ISD::CTPOP: ExpandIntRes_CTPOP(N, Lo, Hi); break; 1391 case ISD::CTTZ_ZERO_UNDEF: 1392 case ISD::CTTZ: ExpandIntRes_CTTZ(N, Lo, Hi); break; 1393 case ISD::FLT_ROUNDS_: ExpandIntRes_FLT_ROUNDS(N, Lo, Hi); break; 1394 case ISD::FP_TO_SINT: ExpandIntRes_FP_TO_SINT(N, Lo, Hi); break; 1395 case ISD::FP_TO_UINT: ExpandIntRes_FP_TO_UINT(N, Lo, Hi); break; 1396 case ISD::LOAD: ExpandIntRes_LOAD(cast<LoadSDNode>(N), Lo, Hi); break; 1397 case ISD::MUL: ExpandIntRes_MUL(N, Lo, Hi); break; 1398 case ISD::READCYCLECOUNTER: ExpandIntRes_READCYCLECOUNTER(N, Lo, Hi); break; 1399 case ISD::SDIV: ExpandIntRes_SDIV(N, Lo, Hi); break; 1400 case ISD::SIGN_EXTEND: ExpandIntRes_SIGN_EXTEND(N, Lo, Hi); break; 1401 case ISD::SIGN_EXTEND_INREG: ExpandIntRes_SIGN_EXTEND_INREG(N, Lo, Hi); break; 1402 case ISD::SREM: ExpandIntRes_SREM(N, Lo, Hi); break; 1403 case ISD::TRUNCATE: ExpandIntRes_TRUNCATE(N, Lo, Hi); break; 1404 case ISD::UDIV: ExpandIntRes_UDIV(N, Lo, Hi); break; 1405 case ISD::UREM: ExpandIntRes_UREM(N, Lo, Hi); break; 1406 case ISD::ZERO_EXTEND: ExpandIntRes_ZERO_EXTEND(N, Lo, Hi); break; 1407 case ISD::ATOMIC_LOAD: ExpandIntRes_ATOMIC_LOAD(N, Lo, Hi); break; 1408 1409 case ISD::ATOMIC_LOAD_ADD: 1410 case ISD::ATOMIC_LOAD_SUB: 1411 case ISD::ATOMIC_LOAD_AND: 1412 case ISD::ATOMIC_LOAD_CLR: 1413 case ISD::ATOMIC_LOAD_OR: 1414 case ISD::ATOMIC_LOAD_XOR: 1415 case ISD::ATOMIC_LOAD_NAND: 1416 case ISD::ATOMIC_LOAD_MIN: 1417 case ISD::ATOMIC_LOAD_MAX: 1418 case ISD::ATOMIC_LOAD_UMIN: 1419 case ISD::ATOMIC_LOAD_UMAX: 1420 case ISD::ATOMIC_SWAP: 1421 case ISD::ATOMIC_CMP_SWAP: { 1422 std::pair<SDValue, SDValue> Tmp = ExpandAtomic(N); 1423 SplitInteger(Tmp.first, Lo, Hi); 1424 ReplaceValueWith(SDValue(N, 1), Tmp.second); 1425 break; 1426 } 1427 case ISD::ATOMIC_CMP_SWAP_WITH_SUCCESS: { 1428 AtomicSDNode *AN = cast<AtomicSDNode>(N); 1429 SDVTList VTs = DAG.getVTList(N->getValueType(0), MVT::Other); 1430 SDValue Tmp = DAG.getAtomicCmpSwap( 1431 ISD::ATOMIC_CMP_SWAP, SDLoc(N), AN->getMemoryVT(), VTs, 1432 N->getOperand(0), N->getOperand(1), N->getOperand(2), N->getOperand(3), 1433 AN->getMemOperand()); 1434 1435 // Expanding to the strong ATOMIC_CMP_SWAP node means we can determine 1436 // success simply by comparing the loaded value against the ingoing 1437 // comparison. 1438 SDValue Success = DAG.getSetCC(SDLoc(N), N->getValueType(1), Tmp, 1439 N->getOperand(2), ISD::SETEQ); 1440 1441 SplitInteger(Tmp, Lo, Hi); 1442 ReplaceValueWith(SDValue(N, 1), Success); 1443 ReplaceValueWith(SDValue(N, 2), Tmp.getValue(1)); 1444 break; 1445 } 1446 1447 case ISD::AND: 1448 case ISD::OR: 1449 case ISD::XOR: ExpandIntRes_Logical(N, Lo, Hi); break; 1450 1451 case ISD::UMAX: 1452 case ISD::SMAX: 1453 case ISD::UMIN: 1454 case ISD::SMIN: ExpandIntRes_MINMAX(N, Lo, Hi); break; 1455 1456 case ISD::ADD: 1457 case ISD::SUB: ExpandIntRes_ADDSUB(N, Lo, Hi); break; 1458 1459 case ISD::ADDC: 1460 case ISD::SUBC: ExpandIntRes_ADDSUBC(N, Lo, Hi); break; 1461 1462 case ISD::ADDE: 1463 case ISD::SUBE: ExpandIntRes_ADDSUBE(N, Lo, Hi); break; 1464 1465 case ISD::ADDCARRY: 1466 case ISD::SUBCARRY: ExpandIntRes_ADDSUBCARRY(N, Lo, Hi); break; 1467 1468 case ISD::SHL: 1469 case ISD::SRA: 1470 case ISD::SRL: ExpandIntRes_Shift(N, Lo, Hi); break; 1471 1472 case ISD::SADDO: 1473 case ISD::SSUBO: ExpandIntRes_SADDSUBO(N, Lo, Hi); break; 1474 case ISD::UADDO: 1475 case ISD::USUBO: ExpandIntRes_UADDSUBO(N, Lo, Hi); break; 1476 case ISD::UMULO: 1477 case ISD::SMULO: ExpandIntRes_XMULO(N, Lo, Hi); break; 1478 } 1479 1480 // If Lo/Hi is null, the sub-method took care of registering results etc. 1481 if (Lo.getNode()) 1482 SetExpandedInteger(SDValue(N, ResNo), Lo, Hi); 1483 } 1484 1485 /// Lower an atomic node to the appropriate builtin call. 1486 std::pair <SDValue, SDValue> DAGTypeLegalizer::ExpandAtomic(SDNode *Node) { 1487 unsigned Opc = Node->getOpcode(); 1488 MVT VT = cast<AtomicSDNode>(Node)->getMemoryVT().getSimpleVT(); 1489 RTLIB::Libcall LC = RTLIB::getSYNC(Opc, VT); 1490 assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unexpected atomic op or value type!"); 1491 1492 return ExpandChainLibCall(LC, Node, false); 1493 } 1494 1495 /// N is a shift by a value that needs to be expanded, 1496 /// and the shift amount is a constant 'Amt'. Expand the operation. 1497 void DAGTypeLegalizer::ExpandShiftByConstant(SDNode *N, const APInt &Amt, 1498 SDValue &Lo, SDValue &Hi) { 1499 SDLoc DL(N); 1500 // Expand the incoming operand to be shifted, so that we have its parts 1501 SDValue InL, InH; 1502 GetExpandedInteger(N->getOperand(0), InL, InH); 1503 1504 // Though Amt shouldn't usually be 0, it's possible. E.g. when legalization 1505 // splitted a vector shift, like this: <op1, op2> SHL <0, 2>. 1506 if (!Amt) { 1507 Lo = InL; 1508 Hi = InH; 1509 return; 1510 } 1511 1512 EVT NVT = InL.getValueType(); 1513 unsigned VTBits = N->getValueType(0).getSizeInBits(); 1514 unsigned NVTBits = NVT.getSizeInBits(); 1515 EVT ShTy = N->getOperand(1).getValueType(); 1516 1517 if (N->getOpcode() == ISD::SHL) { 1518 if (Amt.ugt(VTBits)) { 1519 Lo = Hi = DAG.getConstant(0, DL, NVT); 1520 } else if (Amt.ugt(NVTBits)) { 1521 Lo = DAG.getConstant(0, DL, NVT); 1522 Hi = DAG.getNode(ISD::SHL, DL, 1523 NVT, InL, DAG.getConstant(Amt - NVTBits, DL, ShTy)); 1524 } else if (Amt == NVTBits) { 1525 Lo = DAG.getConstant(0, DL, NVT); 1526 Hi = InL; 1527 } else { 1528 Lo = DAG.getNode(ISD::SHL, DL, NVT, InL, DAG.getConstant(Amt, DL, ShTy)); 1529 Hi = DAG.getNode(ISD::OR, DL, NVT, 1530 DAG.getNode(ISD::SHL, DL, NVT, InH, 1531 DAG.getConstant(Amt, DL, ShTy)), 1532 DAG.getNode(ISD::SRL, DL, NVT, InL, 1533 DAG.getConstant(-Amt + NVTBits, DL, ShTy))); 1534 } 1535 return; 1536 } 1537 1538 if (N->getOpcode() == ISD::SRL) { 1539 if (Amt.ugt(VTBits)) { 1540 Lo = Hi = DAG.getConstant(0, DL, NVT); 1541 } else if (Amt.ugt(NVTBits)) { 1542 Lo = DAG.getNode(ISD::SRL, DL, 1543 NVT, InH, DAG.getConstant(Amt - NVTBits, DL, ShTy)); 1544 Hi = DAG.getConstant(0, DL, NVT); 1545 } else if (Amt == NVTBits) { 1546 Lo = InH; 1547 Hi = DAG.getConstant(0, DL, NVT); 1548 } else { 1549 Lo = DAG.getNode(ISD::OR, DL, NVT, 1550 DAG.getNode(ISD::SRL, DL, NVT, InL, 1551 DAG.getConstant(Amt, DL, ShTy)), 1552 DAG.getNode(ISD::SHL, DL, NVT, InH, 1553 DAG.getConstant(-Amt + NVTBits, DL, ShTy))); 1554 Hi = DAG.getNode(ISD::SRL, DL, NVT, InH, DAG.getConstant(Amt, DL, ShTy)); 1555 } 1556 return; 1557 } 1558 1559 assert(N->getOpcode() == ISD::SRA && "Unknown shift!"); 1560 if (Amt.ugt(VTBits)) { 1561 Hi = Lo = DAG.getNode(ISD::SRA, DL, NVT, InH, 1562 DAG.getConstant(NVTBits - 1, DL, ShTy)); 1563 } else if (Amt.ugt(NVTBits)) { 1564 Lo = DAG.getNode(ISD::SRA, DL, NVT, InH, 1565 DAG.getConstant(Amt - NVTBits, DL, ShTy)); 1566 Hi = DAG.getNode(ISD::SRA, DL, NVT, InH, 1567 DAG.getConstant(NVTBits - 1, DL, ShTy)); 1568 } else if (Amt == NVTBits) { 1569 Lo = InH; 1570 Hi = DAG.getNode(ISD::SRA, DL, NVT, InH, 1571 DAG.getConstant(NVTBits - 1, DL, ShTy)); 1572 } else { 1573 Lo = DAG.getNode(ISD::OR, DL, NVT, 1574 DAG.getNode(ISD::SRL, DL, NVT, InL, 1575 DAG.getConstant(Amt, DL, ShTy)), 1576 DAG.getNode(ISD::SHL, DL, NVT, InH, 1577 DAG.getConstant(-Amt + NVTBits, DL, ShTy))); 1578 Hi = DAG.getNode(ISD::SRA, DL, NVT, InH, DAG.getConstant(Amt, DL, ShTy)); 1579 } 1580 } 1581 1582 /// ExpandShiftWithKnownAmountBit - Try to determine whether we can simplify 1583 /// this shift based on knowledge of the high bit of the shift amount. If we 1584 /// can tell this, we know that it is >= 32 or < 32, without knowing the actual 1585 /// shift amount. 1586 bool DAGTypeLegalizer:: 1587 ExpandShiftWithKnownAmountBit(SDNode *N, SDValue &Lo, SDValue &Hi) { 1588 SDValue Amt = N->getOperand(1); 1589 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)); 1590 EVT ShTy = Amt.getValueType(); 1591 unsigned ShBits = ShTy.getScalarSizeInBits(); 1592 unsigned NVTBits = NVT.getScalarSizeInBits(); 1593 assert(isPowerOf2_32(NVTBits) && 1594 "Expanded integer type size not a power of two!"); 1595 SDLoc dl(N); 1596 1597 APInt HighBitMask = APInt::getHighBitsSet(ShBits, ShBits - Log2_32(NVTBits)); 1598 KnownBits Known; 1599 DAG.computeKnownBits(N->getOperand(1), Known); 1600 1601 // If we don't know anything about the high bits, exit. 1602 if (((Known.Zero|Known.One) & HighBitMask) == 0) 1603 return false; 1604 1605 // Get the incoming operand to be shifted. 1606 SDValue InL, InH; 1607 GetExpandedInteger(N->getOperand(0), InL, InH); 1608 1609 // If we know that any of the high bits of the shift amount are one, then we 1610 // can do this as a couple of simple shifts. 1611 if (Known.One.intersects(HighBitMask)) { 1612 // Mask out the high bit, which we know is set. 1613 Amt = DAG.getNode(ISD::AND, dl, ShTy, Amt, 1614 DAG.getConstant(~HighBitMask, dl, ShTy)); 1615 1616 switch (N->getOpcode()) { 1617 default: llvm_unreachable("Unknown shift"); 1618 case ISD::SHL: 1619 Lo = DAG.getConstant(0, dl, NVT); // Low part is zero. 1620 Hi = DAG.getNode(ISD::SHL, dl, NVT, InL, Amt); // High part from Lo part. 1621 return true; 1622 case ISD::SRL: 1623 Hi = DAG.getConstant(0, dl, NVT); // Hi part is zero. 1624 Lo = DAG.getNode(ISD::SRL, dl, NVT, InH, Amt); // Lo part from Hi part. 1625 return true; 1626 case ISD::SRA: 1627 Hi = DAG.getNode(ISD::SRA, dl, NVT, InH, // Sign extend high part. 1628 DAG.getConstant(NVTBits - 1, dl, ShTy)); 1629 Lo = DAG.getNode(ISD::SRA, dl, NVT, InH, Amt); // Lo part from Hi part. 1630 return true; 1631 } 1632 } 1633 1634 // If we know that all of the high bits of the shift amount are zero, then we 1635 // can do this as a couple of simple shifts. 1636 if (HighBitMask.isSubsetOf(Known.Zero)) { 1637 // Calculate 31-x. 31 is used instead of 32 to avoid creating an undefined 1638 // shift if x is zero. We can use XOR here because x is known to be smaller 1639 // than 32. 1640 SDValue Amt2 = DAG.getNode(ISD::XOR, dl, ShTy, Amt, 1641 DAG.getConstant(NVTBits - 1, dl, ShTy)); 1642 1643 unsigned Op1, Op2; 1644 switch (N->getOpcode()) { 1645 default: llvm_unreachable("Unknown shift"); 1646 case ISD::SHL: Op1 = ISD::SHL; Op2 = ISD::SRL; break; 1647 case ISD::SRL: 1648 case ISD::SRA: Op1 = ISD::SRL; Op2 = ISD::SHL; break; 1649 } 1650 1651 // When shifting right the arithmetic for Lo and Hi is swapped. 1652 if (N->getOpcode() != ISD::SHL) 1653 std::swap(InL, InH); 1654 1655 // Use a little trick to get the bits that move from Lo to Hi. First 1656 // shift by one bit. 1657 SDValue Sh1 = DAG.getNode(Op2, dl, NVT, InL, DAG.getConstant(1, dl, ShTy)); 1658 // Then compute the remaining shift with amount-1. 1659 SDValue Sh2 = DAG.getNode(Op2, dl, NVT, Sh1, Amt2); 1660 1661 Lo = DAG.getNode(N->getOpcode(), dl, NVT, InL, Amt); 1662 Hi = DAG.getNode(ISD::OR, dl, NVT, DAG.getNode(Op1, dl, NVT, InH, Amt),Sh2); 1663 1664 if (N->getOpcode() != ISD::SHL) 1665 std::swap(Hi, Lo); 1666 return true; 1667 } 1668 1669 return false; 1670 } 1671 1672 /// ExpandShiftWithUnknownAmountBit - Fully general expansion of integer shift 1673 /// of any size. 1674 bool DAGTypeLegalizer:: 1675 ExpandShiftWithUnknownAmountBit(SDNode *N, SDValue &Lo, SDValue &Hi) { 1676 SDValue Amt = N->getOperand(1); 1677 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)); 1678 EVT ShTy = Amt.getValueType(); 1679 unsigned NVTBits = NVT.getSizeInBits(); 1680 assert(isPowerOf2_32(NVTBits) && 1681 "Expanded integer type size not a power of two!"); 1682 SDLoc dl(N); 1683 1684 // Get the incoming operand to be shifted. 1685 SDValue InL, InH; 1686 GetExpandedInteger(N->getOperand(0), InL, InH); 1687 1688 SDValue NVBitsNode = DAG.getConstant(NVTBits, dl, ShTy); 1689 SDValue AmtExcess = DAG.getNode(ISD::SUB, dl, ShTy, Amt, NVBitsNode); 1690 SDValue AmtLack = DAG.getNode(ISD::SUB, dl, ShTy, NVBitsNode, Amt); 1691 SDValue isShort = DAG.getSetCC(dl, getSetCCResultType(ShTy), 1692 Amt, NVBitsNode, ISD::SETULT); 1693 SDValue isZero = DAG.getSetCC(dl, getSetCCResultType(ShTy), 1694 Amt, DAG.getConstant(0, dl, ShTy), 1695 ISD::SETEQ); 1696 1697 SDValue LoS, HiS, LoL, HiL; 1698 switch (N->getOpcode()) { 1699 default: llvm_unreachable("Unknown shift"); 1700 case ISD::SHL: 1701 // Short: ShAmt < NVTBits 1702 LoS = DAG.getNode(ISD::SHL, dl, NVT, InL, Amt); 1703 HiS = DAG.getNode(ISD::OR, dl, NVT, 1704 DAG.getNode(ISD::SHL, dl, NVT, InH, Amt), 1705 DAG.getNode(ISD::SRL, dl, NVT, InL, AmtLack)); 1706 1707 // Long: ShAmt >= NVTBits 1708 LoL = DAG.getConstant(0, dl, NVT); // Lo part is zero. 1709 HiL = DAG.getNode(ISD::SHL, dl, NVT, InL, AmtExcess); // Hi from Lo part. 1710 1711 Lo = DAG.getSelect(dl, NVT, isShort, LoS, LoL); 1712 Hi = DAG.getSelect(dl, NVT, isZero, InH, 1713 DAG.getSelect(dl, NVT, isShort, HiS, HiL)); 1714 return true; 1715 case ISD::SRL: 1716 // Short: ShAmt < NVTBits 1717 HiS = DAG.getNode(ISD::SRL, dl, NVT, InH, Amt); 1718 LoS = DAG.getNode(ISD::OR, dl, NVT, 1719 DAG.getNode(ISD::SRL, dl, NVT, InL, Amt), 1720 // FIXME: If Amt is zero, the following shift generates an undefined result 1721 // on some architectures. 1722 DAG.getNode(ISD::SHL, dl, NVT, InH, AmtLack)); 1723 1724 // Long: ShAmt >= NVTBits 1725 HiL = DAG.getConstant(0, dl, NVT); // Hi part is zero. 1726 LoL = DAG.getNode(ISD::SRL, dl, NVT, InH, AmtExcess); // Lo from Hi part. 1727 1728 Lo = DAG.getSelect(dl, NVT, isZero, InL, 1729 DAG.getSelect(dl, NVT, isShort, LoS, LoL)); 1730 Hi = DAG.getSelect(dl, NVT, isShort, HiS, HiL); 1731 return true; 1732 case ISD::SRA: 1733 // Short: ShAmt < NVTBits 1734 HiS = DAG.getNode(ISD::SRA, dl, NVT, InH, Amt); 1735 LoS = DAG.getNode(ISD::OR, dl, NVT, 1736 DAG.getNode(ISD::SRL, dl, NVT, InL, Amt), 1737 DAG.getNode(ISD::SHL, dl, NVT, InH, AmtLack)); 1738 1739 // Long: ShAmt >= NVTBits 1740 HiL = DAG.getNode(ISD::SRA, dl, NVT, InH, // Sign of Hi part. 1741 DAG.getConstant(NVTBits - 1, dl, ShTy)); 1742 LoL = DAG.getNode(ISD::SRA, dl, NVT, InH, AmtExcess); // Lo from Hi part. 1743 1744 Lo = DAG.getSelect(dl, NVT, isZero, InL, 1745 DAG.getSelect(dl, NVT, isShort, LoS, LoL)); 1746 Hi = DAG.getSelect(dl, NVT, isShort, HiS, HiL); 1747 return true; 1748 } 1749 } 1750 1751 static std::pair<ISD::CondCode, ISD::NodeType> getExpandedMinMaxOps(int Op) { 1752 1753 switch (Op) { 1754 default: llvm_unreachable("invalid min/max opcode"); 1755 case ISD::SMAX: 1756 return std::make_pair(ISD::SETGT, ISD::UMAX); 1757 case ISD::UMAX: 1758 return std::make_pair(ISD::SETUGT, ISD::UMAX); 1759 case ISD::SMIN: 1760 return std::make_pair(ISD::SETLT, ISD::UMIN); 1761 case ISD::UMIN: 1762 return std::make_pair(ISD::SETULT, ISD::UMIN); 1763 } 1764 } 1765 1766 void DAGTypeLegalizer::ExpandIntRes_MINMAX(SDNode *N, 1767 SDValue &Lo, SDValue &Hi) { 1768 SDLoc DL(N); 1769 ISD::NodeType LoOpc; 1770 ISD::CondCode CondC; 1771 std::tie(CondC, LoOpc) = getExpandedMinMaxOps(N->getOpcode()); 1772 1773 // Expand the subcomponents. 1774 SDValue LHSL, LHSH, RHSL, RHSH; 1775 GetExpandedInteger(N->getOperand(0), LHSL, LHSH); 1776 GetExpandedInteger(N->getOperand(1), RHSL, RHSH); 1777 1778 // Value types 1779 EVT NVT = LHSL.getValueType(); 1780 EVT CCT = getSetCCResultType(NVT); 1781 1782 // Hi part is always the same op 1783 Hi = DAG.getNode(N->getOpcode(), DL, NVT, {LHSH, RHSH}); 1784 1785 // We need to know whether to select Lo part that corresponds to 'winning' 1786 // Hi part or if Hi parts are equal. 1787 SDValue IsHiLeft = DAG.getSetCC(DL, CCT, LHSH, RHSH, CondC); 1788 SDValue IsHiEq = DAG.getSetCC(DL, CCT, LHSH, RHSH, ISD::SETEQ); 1789 1790 // Lo part corresponding to the 'winning' Hi part 1791 SDValue LoCmp = DAG.getSelect(DL, NVT, IsHiLeft, LHSL, RHSL); 1792 1793 // Recursed Lo part if Hi parts are equal, this uses unsigned version 1794 SDValue LoMinMax = DAG.getNode(LoOpc, DL, NVT, {LHSL, RHSL}); 1795 1796 Lo = DAG.getSelect(DL, NVT, IsHiEq, LoMinMax, LoCmp); 1797 } 1798 1799 void DAGTypeLegalizer::ExpandIntRes_ADDSUB(SDNode *N, 1800 SDValue &Lo, SDValue &Hi) { 1801 SDLoc dl(N); 1802 // Expand the subcomponents. 1803 SDValue LHSL, LHSH, RHSL, RHSH; 1804 GetExpandedInteger(N->getOperand(0), LHSL, LHSH); 1805 GetExpandedInteger(N->getOperand(1), RHSL, RHSH); 1806 1807 EVT NVT = LHSL.getValueType(); 1808 SDValue LoOps[2] = { LHSL, RHSL }; 1809 SDValue HiOps[3] = { LHSH, RHSH }; 1810 1811 bool HasOpCarry = TLI.isOperationLegalOrCustom( 1812 N->getOpcode() == ISD::ADD ? ISD::ADDCARRY : ISD::SUBCARRY, 1813 TLI.getTypeToExpandTo(*DAG.getContext(), NVT)); 1814 if (HasOpCarry) { 1815 SDVTList VTList = DAG.getVTList(NVT, getSetCCResultType(NVT)); 1816 if (N->getOpcode() == ISD::ADD) { 1817 Lo = DAG.getNode(ISD::UADDO, dl, VTList, LoOps); 1818 HiOps[2] = Lo.getValue(1); 1819 Hi = DAG.getNode(ISD::ADDCARRY, dl, VTList, HiOps); 1820 } else { 1821 Lo = DAG.getNode(ISD::USUBO, dl, VTList, LoOps); 1822 HiOps[2] = Lo.getValue(1); 1823 Hi = DAG.getNode(ISD::SUBCARRY, dl, VTList, HiOps); 1824 } 1825 return; 1826 } 1827 1828 // Do not generate ADDC/ADDE or SUBC/SUBE if the target does not support 1829 // them. TODO: Teach operation legalization how to expand unsupported 1830 // ADDC/ADDE/SUBC/SUBE. The problem is that these operations generate 1831 // a carry of type MVT::Glue, but there doesn't seem to be any way to 1832 // generate a value of this type in the expanded code sequence. 1833 bool hasCarry = 1834 TLI.isOperationLegalOrCustom(N->getOpcode() == ISD::ADD ? 1835 ISD::ADDC : ISD::SUBC, 1836 TLI.getTypeToExpandTo(*DAG.getContext(), NVT)); 1837 1838 if (hasCarry) { 1839 SDVTList VTList = DAG.getVTList(NVT, MVT::Glue); 1840 if (N->getOpcode() == ISD::ADD) { 1841 Lo = DAG.getNode(ISD::ADDC, dl, VTList, LoOps); 1842 HiOps[2] = Lo.getValue(1); 1843 Hi = DAG.getNode(ISD::ADDE, dl, VTList, HiOps); 1844 } else { 1845 Lo = DAG.getNode(ISD::SUBC, dl, VTList, LoOps); 1846 HiOps[2] = Lo.getValue(1); 1847 Hi = DAG.getNode(ISD::SUBE, dl, VTList, HiOps); 1848 } 1849 return; 1850 } 1851 1852 bool hasOVF = 1853 TLI.isOperationLegalOrCustom(N->getOpcode() == ISD::ADD ? 1854 ISD::UADDO : ISD::USUBO, 1855 TLI.getTypeToExpandTo(*DAG.getContext(), NVT)); 1856 TargetLoweringBase::BooleanContent BoolType = TLI.getBooleanContents(NVT); 1857 1858 if (hasOVF) { 1859 EVT OvfVT = getSetCCResultType(NVT); 1860 SDVTList VTList = DAG.getVTList(NVT, OvfVT); 1861 int RevOpc; 1862 if (N->getOpcode() == ISD::ADD) { 1863 RevOpc = ISD::SUB; 1864 Lo = DAG.getNode(ISD::UADDO, dl, VTList, LoOps); 1865 Hi = DAG.getNode(ISD::ADD, dl, NVT, makeArrayRef(HiOps, 2)); 1866 } else { 1867 RevOpc = ISD::ADD; 1868 Lo = DAG.getNode(ISD::USUBO, dl, VTList, LoOps); 1869 Hi = DAG.getNode(ISD::SUB, dl, NVT, makeArrayRef(HiOps, 2)); 1870 } 1871 SDValue OVF = Lo.getValue(1); 1872 1873 switch (BoolType) { 1874 case TargetLoweringBase::UndefinedBooleanContent: 1875 OVF = DAG.getNode(ISD::AND, dl, OvfVT, DAG.getConstant(1, dl, OvfVT), OVF); 1876 LLVM_FALLTHROUGH; 1877 case TargetLoweringBase::ZeroOrOneBooleanContent: 1878 OVF = DAG.getZExtOrTrunc(OVF, dl, NVT); 1879 Hi = DAG.getNode(N->getOpcode(), dl, NVT, Hi, OVF); 1880 break; 1881 case TargetLoweringBase::ZeroOrNegativeOneBooleanContent: 1882 OVF = DAG.getSExtOrTrunc(OVF, dl, NVT); 1883 Hi = DAG.getNode(RevOpc, dl, NVT, Hi, OVF); 1884 } 1885 return; 1886 } 1887 1888 if (N->getOpcode() == ISD::ADD) { 1889 Lo = DAG.getNode(ISD::ADD, dl, NVT, LoOps); 1890 Hi = DAG.getNode(ISD::ADD, dl, NVT, makeArrayRef(HiOps, 2)); 1891 SDValue Cmp1 = DAG.getSetCC(dl, getSetCCResultType(NVT), Lo, LoOps[0], 1892 ISD::SETULT); 1893 1894 if (BoolType == TargetLoweringBase::ZeroOrOneBooleanContent) { 1895 SDValue Carry = DAG.getZExtOrTrunc(Cmp1, dl, NVT); 1896 Hi = DAG.getNode(ISD::ADD, dl, NVT, Hi, Carry); 1897 return; 1898 } 1899 1900 SDValue Carry1 = DAG.getSelect(dl, NVT, Cmp1, 1901 DAG.getConstant(1, dl, NVT), 1902 DAG.getConstant(0, dl, NVT)); 1903 SDValue Cmp2 = DAG.getSetCC(dl, getSetCCResultType(NVT), Lo, LoOps[1], 1904 ISD::SETULT); 1905 SDValue Carry2 = DAG.getSelect(dl, NVT, Cmp2, 1906 DAG.getConstant(1, dl, NVT), Carry1); 1907 Hi = DAG.getNode(ISD::ADD, dl, NVT, Hi, Carry2); 1908 } else { 1909 Lo = DAG.getNode(ISD::SUB, dl, NVT, LoOps); 1910 Hi = DAG.getNode(ISD::SUB, dl, NVT, makeArrayRef(HiOps, 2)); 1911 SDValue Cmp = 1912 DAG.getSetCC(dl, getSetCCResultType(LoOps[0].getValueType()), 1913 LoOps[0], LoOps[1], ISD::SETULT); 1914 1915 SDValue Borrow; 1916 if (BoolType == TargetLoweringBase::ZeroOrOneBooleanContent) 1917 Borrow = DAG.getZExtOrTrunc(Cmp, dl, NVT); 1918 else 1919 Borrow = DAG.getSelect(dl, NVT, Cmp, DAG.getConstant(1, dl, NVT), 1920 DAG.getConstant(0, dl, NVT)); 1921 1922 Hi = DAG.getNode(ISD::SUB, dl, NVT, Hi, Borrow); 1923 } 1924 } 1925 1926 void DAGTypeLegalizer::ExpandIntRes_ADDSUBC(SDNode *N, 1927 SDValue &Lo, SDValue &Hi) { 1928 // Expand the subcomponents. 1929 SDValue LHSL, LHSH, RHSL, RHSH; 1930 SDLoc dl(N); 1931 GetExpandedInteger(N->getOperand(0), LHSL, LHSH); 1932 GetExpandedInteger(N->getOperand(1), RHSL, RHSH); 1933 SDVTList VTList = DAG.getVTList(LHSL.getValueType(), MVT::Glue); 1934 SDValue LoOps[2] = { LHSL, RHSL }; 1935 SDValue HiOps[3] = { LHSH, RHSH }; 1936 1937 if (N->getOpcode() == ISD::ADDC) { 1938 Lo = DAG.getNode(ISD::ADDC, dl, VTList, LoOps); 1939 HiOps[2] = Lo.getValue(1); 1940 Hi = DAG.getNode(ISD::ADDE, dl, VTList, HiOps); 1941 } else { 1942 Lo = DAG.getNode(ISD::SUBC, dl, VTList, LoOps); 1943 HiOps[2] = Lo.getValue(1); 1944 Hi = DAG.getNode(ISD::SUBE, dl, VTList, HiOps); 1945 } 1946 1947 // Legalized the flag result - switch anything that used the old flag to 1948 // use the new one. 1949 ReplaceValueWith(SDValue(N, 1), Hi.getValue(1)); 1950 } 1951 1952 void DAGTypeLegalizer::ExpandIntRes_ADDSUBE(SDNode *N, 1953 SDValue &Lo, SDValue &Hi) { 1954 // Expand the subcomponents. 1955 SDValue LHSL, LHSH, RHSL, RHSH; 1956 SDLoc dl(N); 1957 GetExpandedInteger(N->getOperand(0), LHSL, LHSH); 1958 GetExpandedInteger(N->getOperand(1), RHSL, RHSH); 1959 SDVTList VTList = DAG.getVTList(LHSL.getValueType(), MVT::Glue); 1960 SDValue LoOps[3] = { LHSL, RHSL, N->getOperand(2) }; 1961 SDValue HiOps[3] = { LHSH, RHSH }; 1962 1963 Lo = DAG.getNode(N->getOpcode(), dl, VTList, LoOps); 1964 HiOps[2] = Lo.getValue(1); 1965 Hi = DAG.getNode(N->getOpcode(), dl, VTList, HiOps); 1966 1967 // Legalized the flag result - switch anything that used the old flag to 1968 // use the new one. 1969 ReplaceValueWith(SDValue(N, 1), Hi.getValue(1)); 1970 } 1971 1972 void DAGTypeLegalizer::ExpandIntRes_UADDSUBO(SDNode *N, 1973 SDValue &Lo, SDValue &Hi) { 1974 SDValue LHS = N->getOperand(0); 1975 SDValue RHS = N->getOperand(1); 1976 SDLoc dl(N); 1977 1978 SDValue Ovf; 1979 1980 bool HasOpCarry = TLI.isOperationLegalOrCustom( 1981 N->getOpcode() == ISD::ADD ? ISD::ADDCARRY : ISD::SUBCARRY, 1982 TLI.getTypeToExpandTo(*DAG.getContext(), LHS.getValueType())); 1983 1984 if (HasOpCarry) { 1985 // Expand the subcomponents. 1986 SDValue LHSL, LHSH, RHSL, RHSH; 1987 GetExpandedInteger(LHS, LHSL, LHSH); 1988 GetExpandedInteger(RHS, RHSL, RHSH); 1989 SDVTList VTList = DAG.getVTList(LHSL.getValueType(), N->getValueType(1)); 1990 SDValue LoOps[2] = { LHSL, RHSL }; 1991 SDValue HiOps[3] = { LHSH, RHSH }; 1992 1993 unsigned Opc = N->getOpcode() == ISD::UADDO ? ISD::ADDCARRY : ISD::SUBCARRY; 1994 Lo = DAG.getNode(N->getOpcode(), dl, VTList, LoOps); 1995 HiOps[2] = Lo.getValue(1); 1996 Hi = DAG.getNode(Opc, dl, VTList, HiOps); 1997 1998 Ovf = Hi.getValue(1); 1999 } else { 2000 // Expand the result by simply replacing it with the equivalent 2001 // non-overflow-checking operation. 2002 auto Opc = N->getOpcode() == ISD::UADDO ? ISD::ADD : ISD::SUB; 2003 SDValue Sum = DAG.getNode(Opc, dl, LHS.getValueType(), LHS, RHS); 2004 SplitInteger(Sum, Lo, Hi); 2005 2006 // Calculate the overflow: addition overflows iff a + b < a, and subtraction 2007 // overflows iff a - b > a. 2008 auto Cond = N->getOpcode() == ISD::UADDO ? ISD::SETULT : ISD::SETUGT; 2009 Ovf = DAG.getSetCC(dl, N->getValueType(1), Sum, LHS, Cond); 2010 } 2011 2012 // Legalized the flag result - switch anything that used the old flag to 2013 // use the new one. 2014 ReplaceValueWith(SDValue(N, 1), Ovf); 2015 } 2016 2017 void DAGTypeLegalizer::ExpandIntRes_ADDSUBCARRY(SDNode *N, 2018 SDValue &Lo, SDValue &Hi) { 2019 // Expand the subcomponents. 2020 SDValue LHSL, LHSH, RHSL, RHSH; 2021 SDLoc dl(N); 2022 GetExpandedInteger(N->getOperand(0), LHSL, LHSH); 2023 GetExpandedInteger(N->getOperand(1), RHSL, RHSH); 2024 SDVTList VTList = DAG.getVTList(LHSL.getValueType(), N->getValueType(1)); 2025 SDValue LoOps[3] = { LHSL, RHSL, N->getOperand(2) }; 2026 SDValue HiOps[3] = { LHSH, RHSH, SDValue() }; 2027 2028 Lo = DAG.getNode(N->getOpcode(), dl, VTList, LoOps); 2029 HiOps[2] = Lo.getValue(1); 2030 Hi = DAG.getNode(N->getOpcode(), dl, VTList, HiOps); 2031 2032 // Legalized the flag result - switch anything that used the old flag to 2033 // use the new one. 2034 ReplaceValueWith(SDValue(N, 1), Hi.getValue(1)); 2035 } 2036 2037 void DAGTypeLegalizer::ExpandIntRes_ANY_EXTEND(SDNode *N, 2038 SDValue &Lo, SDValue &Hi) { 2039 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)); 2040 SDLoc dl(N); 2041 SDValue Op = N->getOperand(0); 2042 if (Op.getValueType().bitsLE(NVT)) { 2043 // The low part is any extension of the input (which degenerates to a copy). 2044 Lo = DAG.getNode(ISD::ANY_EXTEND, dl, NVT, Op); 2045 Hi = DAG.getUNDEF(NVT); // The high part is undefined. 2046 } else { 2047 // For example, extension of an i48 to an i64. The operand type necessarily 2048 // promotes to the result type, so will end up being expanded too. 2049 assert(getTypeAction(Op.getValueType()) == 2050 TargetLowering::TypePromoteInteger && 2051 "Only know how to promote this result!"); 2052 SDValue Res = GetPromotedInteger(Op); 2053 assert(Res.getValueType() == N->getValueType(0) && 2054 "Operand over promoted?"); 2055 // Split the promoted operand. This will simplify when it is expanded. 2056 SplitInteger(Res, Lo, Hi); 2057 } 2058 } 2059 2060 void DAGTypeLegalizer::ExpandIntRes_AssertSext(SDNode *N, 2061 SDValue &Lo, SDValue &Hi) { 2062 SDLoc dl(N); 2063 GetExpandedInteger(N->getOperand(0), Lo, Hi); 2064 EVT NVT = Lo.getValueType(); 2065 EVT EVT = cast<VTSDNode>(N->getOperand(1))->getVT(); 2066 unsigned NVTBits = NVT.getSizeInBits(); 2067 unsigned EVTBits = EVT.getSizeInBits(); 2068 2069 if (NVTBits < EVTBits) { 2070 Hi = DAG.getNode(ISD::AssertSext, dl, NVT, Hi, 2071 DAG.getValueType(EVT::getIntegerVT(*DAG.getContext(), 2072 EVTBits - NVTBits))); 2073 } else { 2074 Lo = DAG.getNode(ISD::AssertSext, dl, NVT, Lo, DAG.getValueType(EVT)); 2075 // The high part replicates the sign bit of Lo, make it explicit. 2076 Hi = DAG.getNode(ISD::SRA, dl, NVT, Lo, 2077 DAG.getConstant(NVTBits - 1, dl, 2078 TLI.getPointerTy(DAG.getDataLayout()))); 2079 } 2080 } 2081 2082 void DAGTypeLegalizer::ExpandIntRes_AssertZext(SDNode *N, 2083 SDValue &Lo, SDValue &Hi) { 2084 SDLoc dl(N); 2085 GetExpandedInteger(N->getOperand(0), Lo, Hi); 2086 EVT NVT = Lo.getValueType(); 2087 EVT EVT = cast<VTSDNode>(N->getOperand(1))->getVT(); 2088 unsigned NVTBits = NVT.getSizeInBits(); 2089 unsigned EVTBits = EVT.getSizeInBits(); 2090 2091 if (NVTBits < EVTBits) { 2092 Hi = DAG.getNode(ISD::AssertZext, dl, NVT, Hi, 2093 DAG.getValueType(EVT::getIntegerVT(*DAG.getContext(), 2094 EVTBits - NVTBits))); 2095 } else { 2096 Lo = DAG.getNode(ISD::AssertZext, dl, NVT, Lo, DAG.getValueType(EVT)); 2097 // The high part must be zero, make it explicit. 2098 Hi = DAG.getConstant(0, dl, NVT); 2099 } 2100 } 2101 2102 void DAGTypeLegalizer::ExpandIntRes_BITREVERSE(SDNode *N, 2103 SDValue &Lo, SDValue &Hi) { 2104 SDLoc dl(N); 2105 GetExpandedInteger(N->getOperand(0), Hi, Lo); // Note swapped operands. 2106 Lo = DAG.getNode(ISD::BITREVERSE, dl, Lo.getValueType(), Lo); 2107 Hi = DAG.getNode(ISD::BITREVERSE, dl, Hi.getValueType(), Hi); 2108 } 2109 2110 void DAGTypeLegalizer::ExpandIntRes_BSWAP(SDNode *N, 2111 SDValue &Lo, SDValue &Hi) { 2112 SDLoc dl(N); 2113 GetExpandedInteger(N->getOperand(0), Hi, Lo); // Note swapped operands. 2114 Lo = DAG.getNode(ISD::BSWAP, dl, Lo.getValueType(), Lo); 2115 Hi = DAG.getNode(ISD::BSWAP, dl, Hi.getValueType(), Hi); 2116 } 2117 2118 void DAGTypeLegalizer::ExpandIntRes_Constant(SDNode *N, 2119 SDValue &Lo, SDValue &Hi) { 2120 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)); 2121 unsigned NBitWidth = NVT.getSizeInBits(); 2122 auto Constant = cast<ConstantSDNode>(N); 2123 const APInt &Cst = Constant->getAPIntValue(); 2124 bool IsTarget = Constant->isTargetOpcode(); 2125 bool IsOpaque = Constant->isOpaque(); 2126 SDLoc dl(N); 2127 Lo = DAG.getConstant(Cst.trunc(NBitWidth), dl, NVT, IsTarget, IsOpaque); 2128 Hi = DAG.getConstant(Cst.lshr(NBitWidth).trunc(NBitWidth), dl, NVT, IsTarget, 2129 IsOpaque); 2130 } 2131 2132 void DAGTypeLegalizer::ExpandIntRes_CTLZ(SDNode *N, 2133 SDValue &Lo, SDValue &Hi) { 2134 SDLoc dl(N); 2135 // ctlz (HiLo) -> Hi != 0 ? ctlz(Hi) : (ctlz(Lo)+32) 2136 GetExpandedInteger(N->getOperand(0), Lo, Hi); 2137 EVT NVT = Lo.getValueType(); 2138 2139 SDValue HiNotZero = DAG.getSetCC(dl, getSetCCResultType(NVT), Hi, 2140 DAG.getConstant(0, dl, NVT), ISD::SETNE); 2141 2142 SDValue LoLZ = DAG.getNode(N->getOpcode(), dl, NVT, Lo); 2143 SDValue HiLZ = DAG.getNode(ISD::CTLZ_ZERO_UNDEF, dl, NVT, Hi); 2144 2145 Lo = DAG.getSelect(dl, NVT, HiNotZero, HiLZ, 2146 DAG.getNode(ISD::ADD, dl, NVT, LoLZ, 2147 DAG.getConstant(NVT.getSizeInBits(), dl, 2148 NVT))); 2149 Hi = DAG.getConstant(0, dl, NVT); 2150 } 2151 2152 void DAGTypeLegalizer::ExpandIntRes_CTPOP(SDNode *N, 2153 SDValue &Lo, SDValue &Hi) { 2154 SDLoc dl(N); 2155 // ctpop(HiLo) -> ctpop(Hi)+ctpop(Lo) 2156 GetExpandedInteger(N->getOperand(0), Lo, Hi); 2157 EVT NVT = Lo.getValueType(); 2158 Lo = DAG.getNode(ISD::ADD, dl, NVT, DAG.getNode(ISD::CTPOP, dl, NVT, Lo), 2159 DAG.getNode(ISD::CTPOP, dl, NVT, Hi)); 2160 Hi = DAG.getConstant(0, dl, NVT); 2161 } 2162 2163 void DAGTypeLegalizer::ExpandIntRes_CTTZ(SDNode *N, 2164 SDValue &Lo, SDValue &Hi) { 2165 SDLoc dl(N); 2166 // cttz (HiLo) -> Lo != 0 ? cttz(Lo) : (cttz(Hi)+32) 2167 GetExpandedInteger(N->getOperand(0), Lo, Hi); 2168 EVT NVT = Lo.getValueType(); 2169 2170 SDValue LoNotZero = DAG.getSetCC(dl, getSetCCResultType(NVT), Lo, 2171 DAG.getConstant(0, dl, NVT), ISD::SETNE); 2172 2173 SDValue LoLZ = DAG.getNode(ISD::CTTZ_ZERO_UNDEF, dl, NVT, Lo); 2174 SDValue HiLZ = DAG.getNode(N->getOpcode(), dl, NVT, Hi); 2175 2176 Lo = DAG.getSelect(dl, NVT, LoNotZero, LoLZ, 2177 DAG.getNode(ISD::ADD, dl, NVT, HiLZ, 2178 DAG.getConstant(NVT.getSizeInBits(), dl, 2179 NVT))); 2180 Hi = DAG.getConstant(0, dl, NVT); 2181 } 2182 2183 void DAGTypeLegalizer::ExpandIntRes_FLT_ROUNDS(SDNode *N, SDValue &Lo, 2184 SDValue &Hi) { 2185 SDLoc dl(N); 2186 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)); 2187 unsigned NBitWidth = NVT.getSizeInBits(); 2188 2189 EVT ShiftAmtTy = TLI.getShiftAmountTy(NVT, DAG.getDataLayout()); 2190 Lo = DAG.getNode(ISD::FLT_ROUNDS_, dl, NVT); 2191 // The high part is the sign of Lo, as -1 is a valid value for FLT_ROUNDS 2192 Hi = DAG.getNode(ISD::SRA, dl, NVT, Lo, 2193 DAG.getConstant(NBitWidth - 1, dl, ShiftAmtTy)); 2194 } 2195 2196 void DAGTypeLegalizer::ExpandIntRes_FP_TO_SINT(SDNode *N, SDValue &Lo, 2197 SDValue &Hi) { 2198 SDLoc dl(N); 2199 EVT VT = N->getValueType(0); 2200 2201 SDValue Op = N->getOperand(0); 2202 if (getTypeAction(Op.getValueType()) == TargetLowering::TypePromoteFloat) 2203 Op = GetPromotedFloat(Op); 2204 2205 RTLIB::Libcall LC = RTLIB::getFPTOSINT(Op.getValueType(), VT); 2206 assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unexpected fp-to-sint conversion!"); 2207 SplitInteger(TLI.makeLibCall(DAG, LC, VT, Op, true/*irrelevant*/, dl).first, 2208 Lo, Hi); 2209 } 2210 2211 void DAGTypeLegalizer::ExpandIntRes_FP_TO_UINT(SDNode *N, SDValue &Lo, 2212 SDValue &Hi) { 2213 SDLoc dl(N); 2214 EVT VT = N->getValueType(0); 2215 2216 SDValue Op = N->getOperand(0); 2217 if (getTypeAction(Op.getValueType()) == TargetLowering::TypePromoteFloat) 2218 Op = GetPromotedFloat(Op); 2219 2220 RTLIB::Libcall LC = RTLIB::getFPTOUINT(Op.getValueType(), VT); 2221 assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unexpected fp-to-uint conversion!"); 2222 SplitInteger(TLI.makeLibCall(DAG, LC, VT, Op, false/*irrelevant*/, dl).first, 2223 Lo, Hi); 2224 } 2225 2226 void DAGTypeLegalizer::ExpandIntRes_LOAD(LoadSDNode *N, 2227 SDValue &Lo, SDValue &Hi) { 2228 if (ISD::isNormalLoad(N)) { 2229 ExpandRes_NormalLoad(N, Lo, Hi); 2230 return; 2231 } 2232 2233 assert(ISD::isUNINDEXEDLoad(N) && "Indexed load during type legalization!"); 2234 2235 EVT VT = N->getValueType(0); 2236 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT); 2237 SDValue Ch = N->getChain(); 2238 SDValue Ptr = N->getBasePtr(); 2239 ISD::LoadExtType ExtType = N->getExtensionType(); 2240 unsigned Alignment = N->getAlignment(); 2241 MachineMemOperand::Flags MMOFlags = N->getMemOperand()->getFlags(); 2242 AAMDNodes AAInfo = N->getAAInfo(); 2243 SDLoc dl(N); 2244 2245 assert(NVT.isByteSized() && "Expanded type not byte sized!"); 2246 2247 if (N->getMemoryVT().bitsLE(NVT)) { 2248 EVT MemVT = N->getMemoryVT(); 2249 2250 Lo = DAG.getExtLoad(ExtType, dl, NVT, Ch, Ptr, N->getPointerInfo(), MemVT, 2251 Alignment, MMOFlags, AAInfo); 2252 2253 // Remember the chain. 2254 Ch = Lo.getValue(1); 2255 2256 if (ExtType == ISD::SEXTLOAD) { 2257 // The high part is obtained by SRA'ing all but one of the bits of the 2258 // lo part. 2259 unsigned LoSize = Lo.getValueSizeInBits(); 2260 Hi = DAG.getNode(ISD::SRA, dl, NVT, Lo, 2261 DAG.getConstant(LoSize - 1, dl, 2262 TLI.getPointerTy(DAG.getDataLayout()))); 2263 } else if (ExtType == ISD::ZEXTLOAD) { 2264 // The high part is just a zero. 2265 Hi = DAG.getConstant(0, dl, NVT); 2266 } else { 2267 assert(ExtType == ISD::EXTLOAD && "Unknown extload!"); 2268 // The high part is undefined. 2269 Hi = DAG.getUNDEF(NVT); 2270 } 2271 } else if (DAG.getDataLayout().isLittleEndian()) { 2272 // Little-endian - low bits are at low addresses. 2273 Lo = DAG.getLoad(NVT, dl, Ch, Ptr, N->getPointerInfo(), Alignment, MMOFlags, 2274 AAInfo); 2275 2276 unsigned ExcessBits = 2277 N->getMemoryVT().getSizeInBits() - NVT.getSizeInBits(); 2278 EVT NEVT = EVT::getIntegerVT(*DAG.getContext(), ExcessBits); 2279 2280 // Increment the pointer to the other half. 2281 unsigned IncrementSize = NVT.getSizeInBits()/8; 2282 Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr, 2283 DAG.getConstant(IncrementSize, dl, Ptr.getValueType())); 2284 Hi = DAG.getExtLoad(ExtType, dl, NVT, Ch, Ptr, 2285 N->getPointerInfo().getWithOffset(IncrementSize), NEVT, 2286 MinAlign(Alignment, IncrementSize), MMOFlags, AAInfo); 2287 2288 // Build a factor node to remember that this load is independent of the 2289 // other one. 2290 Ch = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo.getValue(1), 2291 Hi.getValue(1)); 2292 } else { 2293 // Big-endian - high bits are at low addresses. Favor aligned loads at 2294 // the cost of some bit-fiddling. 2295 EVT MemVT = N->getMemoryVT(); 2296 unsigned EBytes = MemVT.getStoreSize(); 2297 unsigned IncrementSize = NVT.getSizeInBits()/8; 2298 unsigned ExcessBits = (EBytes - IncrementSize)*8; 2299 2300 // Load both the high bits and maybe some of the low bits. 2301 Hi = DAG.getExtLoad(ExtType, dl, NVT, Ch, Ptr, N->getPointerInfo(), 2302 EVT::getIntegerVT(*DAG.getContext(), 2303 MemVT.getSizeInBits() - ExcessBits), 2304 Alignment, MMOFlags, AAInfo); 2305 2306 // Increment the pointer to the other half. 2307 Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr, 2308 DAG.getConstant(IncrementSize, dl, Ptr.getValueType())); 2309 // Load the rest of the low bits. 2310 Lo = DAG.getExtLoad(ISD::ZEXTLOAD, dl, NVT, Ch, Ptr, 2311 N->getPointerInfo().getWithOffset(IncrementSize), 2312 EVT::getIntegerVT(*DAG.getContext(), ExcessBits), 2313 MinAlign(Alignment, IncrementSize), MMOFlags, AAInfo); 2314 2315 // Build a factor node to remember that this load is independent of the 2316 // other one. 2317 Ch = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo.getValue(1), 2318 Hi.getValue(1)); 2319 2320 if (ExcessBits < NVT.getSizeInBits()) { 2321 // Transfer low bits from the bottom of Hi to the top of Lo. 2322 Lo = DAG.getNode( 2323 ISD::OR, dl, NVT, Lo, 2324 DAG.getNode(ISD::SHL, dl, NVT, Hi, 2325 DAG.getConstant(ExcessBits, dl, 2326 TLI.getPointerTy(DAG.getDataLayout())))); 2327 // Move high bits to the right position in Hi. 2328 Hi = DAG.getNode(ExtType == ISD::SEXTLOAD ? ISD::SRA : ISD::SRL, dl, NVT, 2329 Hi, 2330 DAG.getConstant(NVT.getSizeInBits() - ExcessBits, dl, 2331 TLI.getPointerTy(DAG.getDataLayout()))); 2332 } 2333 } 2334 2335 // Legalize the chain result - switch anything that used the old chain to 2336 // use the new one. 2337 ReplaceValueWith(SDValue(N, 1), Ch); 2338 } 2339 2340 void DAGTypeLegalizer::ExpandIntRes_Logical(SDNode *N, 2341 SDValue &Lo, SDValue &Hi) { 2342 SDLoc dl(N); 2343 SDValue LL, LH, RL, RH; 2344 GetExpandedInteger(N->getOperand(0), LL, LH); 2345 GetExpandedInteger(N->getOperand(1), RL, RH); 2346 Lo = DAG.getNode(N->getOpcode(), dl, LL.getValueType(), LL, RL); 2347 Hi = DAG.getNode(N->getOpcode(), dl, LL.getValueType(), LH, RH); 2348 } 2349 2350 void DAGTypeLegalizer::ExpandIntRes_MUL(SDNode *N, 2351 SDValue &Lo, SDValue &Hi) { 2352 EVT VT = N->getValueType(0); 2353 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT); 2354 SDLoc dl(N); 2355 2356 SDValue LL, LH, RL, RH; 2357 GetExpandedInteger(N->getOperand(0), LL, LH); 2358 GetExpandedInteger(N->getOperand(1), RL, RH); 2359 2360 if (TLI.expandMUL(N, Lo, Hi, NVT, DAG, 2361 TargetLowering::MulExpansionKind::OnlyLegalOrCustom, 2362 LL, LH, RL, RH)) 2363 return; 2364 2365 // If nothing else, we can make a libcall. 2366 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL; 2367 if (VT == MVT::i16) 2368 LC = RTLIB::MUL_I16; 2369 else if (VT == MVT::i32) 2370 LC = RTLIB::MUL_I32; 2371 else if (VT == MVT::i64) 2372 LC = RTLIB::MUL_I64; 2373 else if (VT == MVT::i128) 2374 LC = RTLIB::MUL_I128; 2375 2376 if (LC == RTLIB::UNKNOWN_LIBCALL || !TLI.getLibcallName(LC)) { 2377 // We'll expand the multiplication by brute force because we have no other 2378 // options. This is a trivially-generalized version of the code from 2379 // Hacker's Delight (itself derived from Knuth's Algorithm M from section 2380 // 4.3.1). 2381 unsigned Bits = NVT.getSizeInBits(); 2382 unsigned HalfBits = Bits >> 1; 2383 SDValue Mask = DAG.getConstant(APInt::getLowBitsSet(Bits, HalfBits), dl, 2384 NVT); 2385 SDValue LLL = DAG.getNode(ISD::AND, dl, NVT, LL, Mask); 2386 SDValue RLL = DAG.getNode(ISD::AND, dl, NVT, RL, Mask); 2387 2388 SDValue T = DAG.getNode(ISD::MUL, dl, NVT, LLL, RLL); 2389 SDValue TL = DAG.getNode(ISD::AND, dl, NVT, T, Mask); 2390 2391 EVT ShiftAmtTy = TLI.getShiftAmountTy(NVT, DAG.getDataLayout()); 2392 if (APInt::getMaxValue(ShiftAmtTy.getSizeInBits()).ult(HalfBits)) { 2393 // The type from TLI is too small to fit the shift amount we want. 2394 // Override it with i32. The shift will have to be legalized. 2395 ShiftAmtTy = MVT::i32; 2396 } 2397 SDValue Shift = DAG.getConstant(HalfBits, dl, ShiftAmtTy); 2398 SDValue TH = DAG.getNode(ISD::SRL, dl, NVT, T, Shift); 2399 SDValue LLH = DAG.getNode(ISD::SRL, dl, NVT, LL, Shift); 2400 SDValue RLH = DAG.getNode(ISD::SRL, dl, NVT, RL, Shift); 2401 2402 SDValue U = DAG.getNode(ISD::ADD, dl, NVT, 2403 DAG.getNode(ISD::MUL, dl, NVT, LLH, RLL), TH); 2404 SDValue UL = DAG.getNode(ISD::AND, dl, NVT, U, Mask); 2405 SDValue UH = DAG.getNode(ISD::SRL, dl, NVT, U, Shift); 2406 2407 SDValue V = DAG.getNode(ISD::ADD, dl, NVT, 2408 DAG.getNode(ISD::MUL, dl, NVT, LLL, RLH), UL); 2409 SDValue VH = DAG.getNode(ISD::SRL, dl, NVT, V, Shift); 2410 2411 SDValue W = DAG.getNode(ISD::ADD, dl, NVT, 2412 DAG.getNode(ISD::MUL, dl, NVT, LLH, RLH), 2413 DAG.getNode(ISD::ADD, dl, NVT, UH, VH)); 2414 Lo = DAG.getNode(ISD::ADD, dl, NVT, TL, 2415 DAG.getNode(ISD::SHL, dl, NVT, V, Shift)); 2416 2417 Hi = DAG.getNode(ISD::ADD, dl, NVT, W, 2418 DAG.getNode(ISD::ADD, dl, NVT, 2419 DAG.getNode(ISD::MUL, dl, NVT, RH, LL), 2420 DAG.getNode(ISD::MUL, dl, NVT, RL, LH))); 2421 return; 2422 } 2423 2424 SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) }; 2425 SplitInteger(TLI.makeLibCall(DAG, LC, VT, Ops, true/*irrelevant*/, dl).first, 2426 Lo, Hi); 2427 } 2428 2429 void DAGTypeLegalizer::ExpandIntRes_READCYCLECOUNTER(SDNode *N, SDValue &Lo, 2430 SDValue &Hi) { 2431 SDLoc DL(N); 2432 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)); 2433 SDVTList VTs = DAG.getVTList(NVT, NVT, MVT::Other); 2434 SDValue R = DAG.getNode(N->getOpcode(), DL, VTs, N->getOperand(0)); 2435 Lo = R.getValue(0); 2436 Hi = R.getValue(1); 2437 ReplaceValueWith(SDValue(N, 1), R.getValue(2)); 2438 } 2439 2440 void DAGTypeLegalizer::ExpandIntRes_SADDSUBO(SDNode *Node, 2441 SDValue &Lo, SDValue &Hi) { 2442 SDValue LHS = Node->getOperand(0); 2443 SDValue RHS = Node->getOperand(1); 2444 SDLoc dl(Node); 2445 2446 // Expand the result by simply replacing it with the equivalent 2447 // non-overflow-checking operation. 2448 SDValue Sum = DAG.getNode(Node->getOpcode() == ISD::SADDO ? 2449 ISD::ADD : ISD::SUB, dl, LHS.getValueType(), 2450 LHS, RHS); 2451 SplitInteger(Sum, Lo, Hi); 2452 2453 // Compute the overflow. 2454 // 2455 // LHSSign -> LHS >= 0 2456 // RHSSign -> RHS >= 0 2457 // SumSign -> Sum >= 0 2458 // 2459 // Add: 2460 // Overflow -> (LHSSign == RHSSign) && (LHSSign != SumSign) 2461 // Sub: 2462 // Overflow -> (LHSSign != RHSSign) && (LHSSign != SumSign) 2463 // 2464 EVT OType = Node->getValueType(1); 2465 SDValue Zero = DAG.getConstant(0, dl, LHS.getValueType()); 2466 2467 SDValue LHSSign = DAG.getSetCC(dl, OType, LHS, Zero, ISD::SETGE); 2468 SDValue RHSSign = DAG.getSetCC(dl, OType, RHS, Zero, ISD::SETGE); 2469 SDValue SignsMatch = DAG.getSetCC(dl, OType, LHSSign, RHSSign, 2470 Node->getOpcode() == ISD::SADDO ? 2471 ISD::SETEQ : ISD::SETNE); 2472 2473 SDValue SumSign = DAG.getSetCC(dl, OType, Sum, Zero, ISD::SETGE); 2474 SDValue SumSignNE = DAG.getSetCC(dl, OType, LHSSign, SumSign, ISD::SETNE); 2475 2476 SDValue Cmp = DAG.getNode(ISD::AND, dl, OType, SignsMatch, SumSignNE); 2477 2478 // Use the calculated overflow everywhere. 2479 ReplaceValueWith(SDValue(Node, 1), Cmp); 2480 } 2481 2482 void DAGTypeLegalizer::ExpandIntRes_SDIV(SDNode *N, 2483 SDValue &Lo, SDValue &Hi) { 2484 EVT VT = N->getValueType(0); 2485 SDLoc dl(N); 2486 SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) }; 2487 2488 if (TLI.getOperationAction(ISD::SDIVREM, VT) == TargetLowering::Custom) { 2489 SDValue Res = DAG.getNode(ISD::SDIVREM, dl, DAG.getVTList(VT, VT), Ops); 2490 SplitInteger(Res.getValue(0), Lo, Hi); 2491 return; 2492 } 2493 2494 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL; 2495 if (VT == MVT::i16) 2496 LC = RTLIB::SDIV_I16; 2497 else if (VT == MVT::i32) 2498 LC = RTLIB::SDIV_I32; 2499 else if (VT == MVT::i64) 2500 LC = RTLIB::SDIV_I64; 2501 else if (VT == MVT::i128) 2502 LC = RTLIB::SDIV_I128; 2503 assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported SDIV!"); 2504 2505 SplitInteger(TLI.makeLibCall(DAG, LC, VT, Ops, true, dl).first, Lo, Hi); 2506 } 2507 2508 void DAGTypeLegalizer::ExpandIntRes_Shift(SDNode *N, 2509 SDValue &Lo, SDValue &Hi) { 2510 EVT VT = N->getValueType(0); 2511 SDLoc dl(N); 2512 2513 // If we can emit an efficient shift operation, do so now. Check to see if 2514 // the RHS is a constant. 2515 if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(N->getOperand(1))) 2516 return ExpandShiftByConstant(N, CN->getAPIntValue(), Lo, Hi); 2517 2518 // If we can determine that the high bit of the shift is zero or one, even if 2519 // the low bits are variable, emit this shift in an optimized form. 2520 if (ExpandShiftWithKnownAmountBit(N, Lo, Hi)) 2521 return; 2522 2523 // If this target supports shift_PARTS, use it. First, map to the _PARTS opc. 2524 unsigned PartsOpc; 2525 if (N->getOpcode() == ISD::SHL) { 2526 PartsOpc = ISD::SHL_PARTS; 2527 } else if (N->getOpcode() == ISD::SRL) { 2528 PartsOpc = ISD::SRL_PARTS; 2529 } else { 2530 assert(N->getOpcode() == ISD::SRA && "Unknown shift!"); 2531 PartsOpc = ISD::SRA_PARTS; 2532 } 2533 2534 // Next check to see if the target supports this SHL_PARTS operation or if it 2535 // will custom expand it. 2536 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT); 2537 TargetLowering::LegalizeAction Action = TLI.getOperationAction(PartsOpc, NVT); 2538 if ((Action == TargetLowering::Legal && TLI.isTypeLegal(NVT)) || 2539 Action == TargetLowering::Custom) { 2540 // Expand the subcomponents. 2541 SDValue LHSL, LHSH; 2542 GetExpandedInteger(N->getOperand(0), LHSL, LHSH); 2543 EVT VT = LHSL.getValueType(); 2544 2545 // If the shift amount operand is coming from a vector legalization it may 2546 // have an illegal type. Fix that first by casting the operand, otherwise 2547 // the new SHL_PARTS operation would need further legalization. 2548 SDValue ShiftOp = N->getOperand(1); 2549 EVT ShiftTy = TLI.getShiftAmountTy(VT, DAG.getDataLayout()); 2550 assert(ShiftTy.getScalarSizeInBits() >= 2551 Log2_32_Ceil(VT.getScalarSizeInBits()) && 2552 "ShiftAmountTy is too small to cover the range of this type!"); 2553 if (ShiftOp.getValueType() != ShiftTy) 2554 ShiftOp = DAG.getZExtOrTrunc(ShiftOp, dl, ShiftTy); 2555 2556 SDValue Ops[] = { LHSL, LHSH, ShiftOp }; 2557 Lo = DAG.getNode(PartsOpc, dl, DAG.getVTList(VT, VT), Ops); 2558 Hi = Lo.getValue(1); 2559 return; 2560 } 2561 2562 // Otherwise, emit a libcall. 2563 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL; 2564 bool isSigned; 2565 if (N->getOpcode() == ISD::SHL) { 2566 isSigned = false; /*sign irrelevant*/ 2567 if (VT == MVT::i16) 2568 LC = RTLIB::SHL_I16; 2569 else if (VT == MVT::i32) 2570 LC = RTLIB::SHL_I32; 2571 else if (VT == MVT::i64) 2572 LC = RTLIB::SHL_I64; 2573 else if (VT == MVT::i128) 2574 LC = RTLIB::SHL_I128; 2575 } else if (N->getOpcode() == ISD::SRL) { 2576 isSigned = false; 2577 if (VT == MVT::i16) 2578 LC = RTLIB::SRL_I16; 2579 else if (VT == MVT::i32) 2580 LC = RTLIB::SRL_I32; 2581 else if (VT == MVT::i64) 2582 LC = RTLIB::SRL_I64; 2583 else if (VT == MVT::i128) 2584 LC = RTLIB::SRL_I128; 2585 } else { 2586 assert(N->getOpcode() == ISD::SRA && "Unknown shift!"); 2587 isSigned = true; 2588 if (VT == MVT::i16) 2589 LC = RTLIB::SRA_I16; 2590 else if (VT == MVT::i32) 2591 LC = RTLIB::SRA_I32; 2592 else if (VT == MVT::i64) 2593 LC = RTLIB::SRA_I64; 2594 else if (VT == MVT::i128) 2595 LC = RTLIB::SRA_I128; 2596 } 2597 2598 if (LC != RTLIB::UNKNOWN_LIBCALL && TLI.getLibcallName(LC)) { 2599 SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) }; 2600 SplitInteger(TLI.makeLibCall(DAG, LC, VT, Ops, isSigned, dl).first, Lo, Hi); 2601 return; 2602 } 2603 2604 if (!ExpandShiftWithUnknownAmountBit(N, Lo, Hi)) 2605 llvm_unreachable("Unsupported shift!"); 2606 } 2607 2608 void DAGTypeLegalizer::ExpandIntRes_SIGN_EXTEND(SDNode *N, 2609 SDValue &Lo, SDValue &Hi) { 2610 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)); 2611 SDLoc dl(N); 2612 SDValue Op = N->getOperand(0); 2613 if (Op.getValueType().bitsLE(NVT)) { 2614 // The low part is sign extension of the input (degenerates to a copy). 2615 Lo = DAG.getNode(ISD::SIGN_EXTEND, dl, NVT, N->getOperand(0)); 2616 // The high part is obtained by SRA'ing all but one of the bits of low part. 2617 unsigned LoSize = NVT.getSizeInBits(); 2618 Hi = DAG.getNode( 2619 ISD::SRA, dl, NVT, Lo, 2620 DAG.getConstant(LoSize - 1, dl, TLI.getPointerTy(DAG.getDataLayout()))); 2621 } else { 2622 // For example, extension of an i48 to an i64. The operand type necessarily 2623 // promotes to the result type, so will end up being expanded too. 2624 assert(getTypeAction(Op.getValueType()) == 2625 TargetLowering::TypePromoteInteger && 2626 "Only know how to promote this result!"); 2627 SDValue Res = GetPromotedInteger(Op); 2628 assert(Res.getValueType() == N->getValueType(0) && 2629 "Operand over promoted?"); 2630 // Split the promoted operand. This will simplify when it is expanded. 2631 SplitInteger(Res, Lo, Hi); 2632 unsigned ExcessBits = Op.getValueSizeInBits() - NVT.getSizeInBits(); 2633 Hi = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, Hi.getValueType(), Hi, 2634 DAG.getValueType(EVT::getIntegerVT(*DAG.getContext(), 2635 ExcessBits))); 2636 } 2637 } 2638 2639 void DAGTypeLegalizer:: 2640 ExpandIntRes_SIGN_EXTEND_INREG(SDNode *N, SDValue &Lo, SDValue &Hi) { 2641 SDLoc dl(N); 2642 GetExpandedInteger(N->getOperand(0), Lo, Hi); 2643 EVT EVT = cast<VTSDNode>(N->getOperand(1))->getVT(); 2644 2645 if (EVT.bitsLE(Lo.getValueType())) { 2646 // sext_inreg the low part if needed. 2647 Lo = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, Lo.getValueType(), Lo, 2648 N->getOperand(1)); 2649 2650 // The high part gets the sign extension from the lo-part. This handles 2651 // things like sextinreg V:i64 from i8. 2652 Hi = DAG.getNode(ISD::SRA, dl, Hi.getValueType(), Lo, 2653 DAG.getConstant(Hi.getValueSizeInBits() - 1, dl, 2654 TLI.getPointerTy(DAG.getDataLayout()))); 2655 } else { 2656 // For example, extension of an i48 to an i64. Leave the low part alone, 2657 // sext_inreg the high part. 2658 unsigned ExcessBits = EVT.getSizeInBits() - Lo.getValueSizeInBits(); 2659 Hi = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, Hi.getValueType(), Hi, 2660 DAG.getValueType(EVT::getIntegerVT(*DAG.getContext(), 2661 ExcessBits))); 2662 } 2663 } 2664 2665 void DAGTypeLegalizer::ExpandIntRes_SREM(SDNode *N, 2666 SDValue &Lo, SDValue &Hi) { 2667 EVT VT = N->getValueType(0); 2668 SDLoc dl(N); 2669 SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) }; 2670 2671 if (TLI.getOperationAction(ISD::SDIVREM, VT) == TargetLowering::Custom) { 2672 SDValue Res = DAG.getNode(ISD::SDIVREM, dl, DAG.getVTList(VT, VT), Ops); 2673 SplitInteger(Res.getValue(1), Lo, Hi); 2674 return; 2675 } 2676 2677 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL; 2678 if (VT == MVT::i16) 2679 LC = RTLIB::SREM_I16; 2680 else if (VT == MVT::i32) 2681 LC = RTLIB::SREM_I32; 2682 else if (VT == MVT::i64) 2683 LC = RTLIB::SREM_I64; 2684 else if (VT == MVT::i128) 2685 LC = RTLIB::SREM_I128; 2686 assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported SREM!"); 2687 2688 SplitInteger(TLI.makeLibCall(DAG, LC, VT, Ops, true, dl).first, Lo, Hi); 2689 } 2690 2691 void DAGTypeLegalizer::ExpandIntRes_TRUNCATE(SDNode *N, 2692 SDValue &Lo, SDValue &Hi) { 2693 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)); 2694 SDLoc dl(N); 2695 Lo = DAG.getNode(ISD::TRUNCATE, dl, NVT, N->getOperand(0)); 2696 Hi = DAG.getNode(ISD::SRL, dl, N->getOperand(0).getValueType(), 2697 N->getOperand(0), 2698 DAG.getConstant(NVT.getSizeInBits(), dl, 2699 TLI.getPointerTy(DAG.getDataLayout()))); 2700 Hi = DAG.getNode(ISD::TRUNCATE, dl, NVT, Hi); 2701 } 2702 2703 void DAGTypeLegalizer::ExpandIntRes_XMULO(SDNode *N, 2704 SDValue &Lo, SDValue &Hi) { 2705 EVT VT = N->getValueType(0); 2706 SDLoc dl(N); 2707 2708 // A divide for UMULO should be faster than a function call. 2709 if (N->getOpcode() == ISD::UMULO) { 2710 SDValue LHS = N->getOperand(0), RHS = N->getOperand(1); 2711 2712 SDValue MUL = DAG.getNode(ISD::MUL, dl, LHS.getValueType(), LHS, RHS); 2713 SplitInteger(MUL, Lo, Hi); 2714 2715 // A divide for UMULO will be faster than a function call. Select to 2716 // make sure we aren't using 0. 2717 SDValue isZero = DAG.getSetCC(dl, getSetCCResultType(VT), 2718 RHS, DAG.getConstant(0, dl, VT), ISD::SETEQ); 2719 SDValue NotZero = DAG.getSelect(dl, VT, isZero, 2720 DAG.getConstant(1, dl, VT), RHS); 2721 SDValue DIV = DAG.getNode(ISD::UDIV, dl, VT, MUL, NotZero); 2722 SDValue Overflow = DAG.getSetCC(dl, N->getValueType(1), DIV, LHS, 2723 ISD::SETNE); 2724 Overflow = DAG.getSelect(dl, N->getValueType(1), isZero, 2725 DAG.getConstant(0, dl, N->getValueType(1)), 2726 Overflow); 2727 ReplaceValueWith(SDValue(N, 1), Overflow); 2728 return; 2729 } 2730 2731 Type *RetTy = VT.getTypeForEVT(*DAG.getContext()); 2732 EVT PtrVT = TLI.getPointerTy(DAG.getDataLayout()); 2733 Type *PtrTy = PtrVT.getTypeForEVT(*DAG.getContext()); 2734 2735 // Replace this with a libcall that will check overflow. 2736 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL; 2737 if (VT == MVT::i32) 2738 LC = RTLIB::MULO_I32; 2739 else if (VT == MVT::i64) 2740 LC = RTLIB::MULO_I64; 2741 else if (VT == MVT::i128) 2742 LC = RTLIB::MULO_I128; 2743 assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported XMULO!"); 2744 2745 SDValue Temp = DAG.CreateStackTemporary(PtrVT); 2746 // Temporary for the overflow value, default it to zero. 2747 SDValue Chain = 2748 DAG.getStore(DAG.getEntryNode(), dl, DAG.getConstant(0, dl, PtrVT), Temp, 2749 MachinePointerInfo()); 2750 2751 TargetLowering::ArgListTy Args; 2752 TargetLowering::ArgListEntry Entry; 2753 for (const SDValue &Op : N->op_values()) { 2754 EVT ArgVT = Op.getValueType(); 2755 Type *ArgTy = ArgVT.getTypeForEVT(*DAG.getContext()); 2756 Entry.Node = Op; 2757 Entry.Ty = ArgTy; 2758 Entry.IsSExt = true; 2759 Entry.IsZExt = false; 2760 Args.push_back(Entry); 2761 } 2762 2763 // Also pass the address of the overflow check. 2764 Entry.Node = Temp; 2765 Entry.Ty = PtrTy->getPointerTo(); 2766 Entry.IsSExt = true; 2767 Entry.IsZExt = false; 2768 Args.push_back(Entry); 2769 2770 SDValue Func = DAG.getExternalSymbol(TLI.getLibcallName(LC), PtrVT); 2771 2772 TargetLowering::CallLoweringInfo CLI(DAG); 2773 CLI.setDebugLoc(dl) 2774 .setChain(Chain) 2775 .setLibCallee(TLI.getLibcallCallingConv(LC), RetTy, Func, std::move(Args)) 2776 .setSExtResult(); 2777 2778 std::pair<SDValue, SDValue> CallInfo = TLI.LowerCallTo(CLI); 2779 2780 SplitInteger(CallInfo.first, Lo, Hi); 2781 SDValue Temp2 = 2782 DAG.getLoad(PtrVT, dl, CallInfo.second, Temp, MachinePointerInfo()); 2783 SDValue Ofl = DAG.getSetCC(dl, N->getValueType(1), Temp2, 2784 DAG.getConstant(0, dl, PtrVT), 2785 ISD::SETNE); 2786 // Use the overflow from the libcall everywhere. 2787 ReplaceValueWith(SDValue(N, 1), Ofl); 2788 } 2789 2790 void DAGTypeLegalizer::ExpandIntRes_UDIV(SDNode *N, 2791 SDValue &Lo, SDValue &Hi) { 2792 EVT VT = N->getValueType(0); 2793 SDLoc dl(N); 2794 SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) }; 2795 2796 if (TLI.getOperationAction(ISD::UDIVREM, VT) == TargetLowering::Custom) { 2797 SDValue Res = DAG.getNode(ISD::UDIVREM, dl, DAG.getVTList(VT, VT), Ops); 2798 SplitInteger(Res.getValue(0), Lo, Hi); 2799 return; 2800 } 2801 2802 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL; 2803 if (VT == MVT::i16) 2804 LC = RTLIB::UDIV_I16; 2805 else if (VT == MVT::i32) 2806 LC = RTLIB::UDIV_I32; 2807 else if (VT == MVT::i64) 2808 LC = RTLIB::UDIV_I64; 2809 else if (VT == MVT::i128) 2810 LC = RTLIB::UDIV_I128; 2811 assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported UDIV!"); 2812 2813 SplitInteger(TLI.makeLibCall(DAG, LC, VT, Ops, false, dl).first, Lo, Hi); 2814 } 2815 2816 void DAGTypeLegalizer::ExpandIntRes_UREM(SDNode *N, 2817 SDValue &Lo, SDValue &Hi) { 2818 EVT VT = N->getValueType(0); 2819 SDLoc dl(N); 2820 SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) }; 2821 2822 if (TLI.getOperationAction(ISD::UDIVREM, VT) == TargetLowering::Custom) { 2823 SDValue Res = DAG.getNode(ISD::UDIVREM, dl, DAG.getVTList(VT, VT), Ops); 2824 SplitInteger(Res.getValue(1), Lo, Hi); 2825 return; 2826 } 2827 2828 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL; 2829 if (VT == MVT::i16) 2830 LC = RTLIB::UREM_I16; 2831 else if (VT == MVT::i32) 2832 LC = RTLIB::UREM_I32; 2833 else if (VT == MVT::i64) 2834 LC = RTLIB::UREM_I64; 2835 else if (VT == MVT::i128) 2836 LC = RTLIB::UREM_I128; 2837 assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported UREM!"); 2838 2839 SplitInteger(TLI.makeLibCall(DAG, LC, VT, Ops, false, dl).first, Lo, Hi); 2840 } 2841 2842 void DAGTypeLegalizer::ExpandIntRes_ZERO_EXTEND(SDNode *N, 2843 SDValue &Lo, SDValue &Hi) { 2844 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)); 2845 SDLoc dl(N); 2846 SDValue Op = N->getOperand(0); 2847 if (Op.getValueType().bitsLE(NVT)) { 2848 // The low part is zero extension of the input (degenerates to a copy). 2849 Lo = DAG.getNode(ISD::ZERO_EXTEND, dl, NVT, N->getOperand(0)); 2850 Hi = DAG.getConstant(0, dl, NVT); // The high part is just a zero. 2851 } else { 2852 // For example, extension of an i48 to an i64. The operand type necessarily 2853 // promotes to the result type, so will end up being expanded too. 2854 assert(getTypeAction(Op.getValueType()) == 2855 TargetLowering::TypePromoteInteger && 2856 "Only know how to promote this result!"); 2857 SDValue Res = GetPromotedInteger(Op); 2858 assert(Res.getValueType() == N->getValueType(0) && 2859 "Operand over promoted?"); 2860 // Split the promoted operand. This will simplify when it is expanded. 2861 SplitInteger(Res, Lo, Hi); 2862 unsigned ExcessBits = Op.getValueSizeInBits() - NVT.getSizeInBits(); 2863 Hi = DAG.getZeroExtendInReg(Hi, dl, 2864 EVT::getIntegerVT(*DAG.getContext(), 2865 ExcessBits)); 2866 } 2867 } 2868 2869 void DAGTypeLegalizer::ExpandIntRes_ATOMIC_LOAD(SDNode *N, 2870 SDValue &Lo, SDValue &Hi) { 2871 SDLoc dl(N); 2872 EVT VT = cast<AtomicSDNode>(N)->getMemoryVT(); 2873 SDVTList VTs = DAG.getVTList(VT, MVT::i1, MVT::Other); 2874 SDValue Zero = DAG.getConstant(0, dl, VT); 2875 SDValue Swap = DAG.getAtomicCmpSwap( 2876 ISD::ATOMIC_CMP_SWAP_WITH_SUCCESS, dl, 2877 cast<AtomicSDNode>(N)->getMemoryVT(), VTs, N->getOperand(0), 2878 N->getOperand(1), Zero, Zero, cast<AtomicSDNode>(N)->getMemOperand()); 2879 2880 ReplaceValueWith(SDValue(N, 0), Swap.getValue(0)); 2881 ReplaceValueWith(SDValue(N, 1), Swap.getValue(2)); 2882 } 2883 2884 //===----------------------------------------------------------------------===// 2885 // Integer Operand Expansion 2886 //===----------------------------------------------------------------------===// 2887 2888 /// ExpandIntegerOperand - This method is called when the specified operand of 2889 /// the specified node is found to need expansion. At this point, all of the 2890 /// result types of the node are known to be legal, but other operands of the 2891 /// node may need promotion or expansion as well as the specified one. 2892 bool DAGTypeLegalizer::ExpandIntegerOperand(SDNode *N, unsigned OpNo) { 2893 LLVM_DEBUG(dbgs() << "Expand integer operand: "; N->dump(&DAG); 2894 dbgs() << "\n"); 2895 SDValue Res = SDValue(); 2896 2897 if (CustomLowerNode(N, N->getOperand(OpNo).getValueType(), false)) 2898 return false; 2899 2900 switch (N->getOpcode()) { 2901 default: 2902 #ifndef NDEBUG 2903 dbgs() << "ExpandIntegerOperand Op #" << OpNo << ": "; 2904 N->dump(&DAG); dbgs() << "\n"; 2905 #endif 2906 llvm_unreachable("Do not know how to expand this operator's operand!"); 2907 2908 case ISD::BITCAST: Res = ExpandOp_BITCAST(N); break; 2909 case ISD::BR_CC: Res = ExpandIntOp_BR_CC(N); break; 2910 case ISD::BUILD_VECTOR: Res = ExpandOp_BUILD_VECTOR(N); break; 2911 case ISD::EXTRACT_ELEMENT: Res = ExpandOp_EXTRACT_ELEMENT(N); break; 2912 case ISD::INSERT_VECTOR_ELT: Res = ExpandOp_INSERT_VECTOR_ELT(N); break; 2913 case ISD::SCALAR_TO_VECTOR: Res = ExpandOp_SCALAR_TO_VECTOR(N); break; 2914 case ISD::SELECT_CC: Res = ExpandIntOp_SELECT_CC(N); break; 2915 case ISD::SETCC: Res = ExpandIntOp_SETCC(N); break; 2916 case ISD::SETCCCARRY: Res = ExpandIntOp_SETCCCARRY(N); break; 2917 case ISD::SINT_TO_FP: Res = ExpandIntOp_SINT_TO_FP(N); break; 2918 case ISD::STORE: Res = ExpandIntOp_STORE(cast<StoreSDNode>(N), OpNo); break; 2919 case ISD::TRUNCATE: Res = ExpandIntOp_TRUNCATE(N); break; 2920 case ISD::UINT_TO_FP: Res = ExpandIntOp_UINT_TO_FP(N); break; 2921 2922 case ISD::SHL: 2923 case ISD::SRA: 2924 case ISD::SRL: 2925 case ISD::ROTL: 2926 case ISD::ROTR: Res = ExpandIntOp_Shift(N); break; 2927 case ISD::RETURNADDR: 2928 case ISD::FRAMEADDR: Res = ExpandIntOp_RETURNADDR(N); break; 2929 2930 case ISD::ATOMIC_STORE: Res = ExpandIntOp_ATOMIC_STORE(N); break; 2931 } 2932 2933 // If the result is null, the sub-method took care of registering results etc. 2934 if (!Res.getNode()) return false; 2935 2936 // If the result is N, the sub-method updated N in place. Tell the legalizer 2937 // core about this. 2938 if (Res.getNode() == N) 2939 return true; 2940 2941 assert(Res.getValueType() == N->getValueType(0) && N->getNumValues() == 1 && 2942 "Invalid operand expansion"); 2943 2944 ReplaceValueWith(SDValue(N, 0), Res); 2945 return false; 2946 } 2947 2948 /// IntegerExpandSetCCOperands - Expand the operands of a comparison. This code 2949 /// is shared among BR_CC, SELECT_CC, and SETCC handlers. 2950 void DAGTypeLegalizer::IntegerExpandSetCCOperands(SDValue &NewLHS, 2951 SDValue &NewRHS, 2952 ISD::CondCode &CCCode, 2953 const SDLoc &dl) { 2954 SDValue LHSLo, LHSHi, RHSLo, RHSHi; 2955 GetExpandedInteger(NewLHS, LHSLo, LHSHi); 2956 GetExpandedInteger(NewRHS, RHSLo, RHSHi); 2957 2958 if (CCCode == ISD::SETEQ || CCCode == ISD::SETNE) { 2959 if (RHSLo == RHSHi) { 2960 if (ConstantSDNode *RHSCST = dyn_cast<ConstantSDNode>(RHSLo)) { 2961 if (RHSCST->isAllOnesValue()) { 2962 // Equality comparison to -1. 2963 NewLHS = DAG.getNode(ISD::AND, dl, 2964 LHSLo.getValueType(), LHSLo, LHSHi); 2965 NewRHS = RHSLo; 2966 return; 2967 } 2968 } 2969 } 2970 2971 NewLHS = DAG.getNode(ISD::XOR, dl, LHSLo.getValueType(), LHSLo, RHSLo); 2972 NewRHS = DAG.getNode(ISD::XOR, dl, LHSLo.getValueType(), LHSHi, RHSHi); 2973 NewLHS = DAG.getNode(ISD::OR, dl, NewLHS.getValueType(), NewLHS, NewRHS); 2974 NewRHS = DAG.getConstant(0, dl, NewLHS.getValueType()); 2975 return; 2976 } 2977 2978 // If this is a comparison of the sign bit, just look at the top part. 2979 // X > -1, x < 0 2980 if (ConstantSDNode *CST = dyn_cast<ConstantSDNode>(NewRHS)) 2981 if ((CCCode == ISD::SETLT && CST->isNullValue()) || // X < 0 2982 (CCCode == ISD::SETGT && CST->isAllOnesValue())) { // X > -1 2983 NewLHS = LHSHi; 2984 NewRHS = RHSHi; 2985 return; 2986 } 2987 2988 // FIXME: This generated code sucks. 2989 ISD::CondCode LowCC; 2990 switch (CCCode) { 2991 default: llvm_unreachable("Unknown integer setcc!"); 2992 case ISD::SETLT: 2993 case ISD::SETULT: LowCC = ISD::SETULT; break; 2994 case ISD::SETGT: 2995 case ISD::SETUGT: LowCC = ISD::SETUGT; break; 2996 case ISD::SETLE: 2997 case ISD::SETULE: LowCC = ISD::SETULE; break; 2998 case ISD::SETGE: 2999 case ISD::SETUGE: LowCC = ISD::SETUGE; break; 3000 } 3001 3002 // LoCmp = lo(op1) < lo(op2) // Always unsigned comparison 3003 // HiCmp = hi(op1) < hi(op2) // Signedness depends on operands 3004 // dest = hi(op1) == hi(op2) ? LoCmp : HiCmp; 3005 3006 // NOTE: on targets without efficient SELECT of bools, we can always use 3007 // this identity: (B1 ? B2 : B3) --> (B1 & B2)|(!B1&B3) 3008 TargetLowering::DAGCombinerInfo DagCombineInfo(DAG, AfterLegalizeTypes, true, 3009 nullptr); 3010 SDValue LoCmp, HiCmp; 3011 if (TLI.isTypeLegal(LHSLo.getValueType()) && 3012 TLI.isTypeLegal(RHSLo.getValueType())) 3013 LoCmp = TLI.SimplifySetCC(getSetCCResultType(LHSLo.getValueType()), LHSLo, 3014 RHSLo, LowCC, false, DagCombineInfo, dl); 3015 if (!LoCmp.getNode()) 3016 LoCmp = DAG.getSetCC(dl, getSetCCResultType(LHSLo.getValueType()), LHSLo, 3017 RHSLo, LowCC); 3018 if (TLI.isTypeLegal(LHSHi.getValueType()) && 3019 TLI.isTypeLegal(RHSHi.getValueType())) 3020 HiCmp = TLI.SimplifySetCC(getSetCCResultType(LHSHi.getValueType()), LHSHi, 3021 RHSHi, CCCode, false, DagCombineInfo, dl); 3022 if (!HiCmp.getNode()) 3023 HiCmp = 3024 DAG.getNode(ISD::SETCC, dl, getSetCCResultType(LHSHi.getValueType()), 3025 LHSHi, RHSHi, DAG.getCondCode(CCCode)); 3026 3027 ConstantSDNode *LoCmpC = dyn_cast<ConstantSDNode>(LoCmp.getNode()); 3028 ConstantSDNode *HiCmpC = dyn_cast<ConstantSDNode>(HiCmp.getNode()); 3029 3030 bool EqAllowed = (CCCode == ISD::SETLE || CCCode == ISD::SETGE || 3031 CCCode == ISD::SETUGE || CCCode == ISD::SETULE); 3032 3033 if ((EqAllowed && (HiCmpC && HiCmpC->isNullValue())) || 3034 (!EqAllowed && ((HiCmpC && (HiCmpC->getAPIntValue() == 1)) || 3035 (LoCmpC && LoCmpC->isNullValue())))) { 3036 // For LE / GE, if high part is known false, ignore the low part. 3037 // For LT / GT: if low part is known false, return the high part. 3038 // if high part is known true, ignore the low part. 3039 NewLHS = HiCmp; 3040 NewRHS = SDValue(); 3041 return; 3042 } 3043 3044 if (LHSHi == RHSHi) { 3045 // Comparing the low bits is enough. 3046 NewLHS = LoCmp; 3047 NewRHS = SDValue(); 3048 return; 3049 } 3050 3051 // Lower with SETCCCARRY if the target supports it. 3052 EVT HiVT = LHSHi.getValueType(); 3053 EVT ExpandVT = TLI.getTypeToExpandTo(*DAG.getContext(), HiVT); 3054 bool HasSETCCCARRY = TLI.isOperationLegalOrCustom(ISD::SETCCCARRY, ExpandVT); 3055 3056 // FIXME: Make all targets support this, then remove the other lowering. 3057 if (HasSETCCCARRY) { 3058 // SETCCCARRY can detect < and >= directly. For > and <=, flip 3059 // operands and condition code. 3060 bool FlipOperands = false; 3061 switch (CCCode) { 3062 case ISD::SETGT: CCCode = ISD::SETLT; FlipOperands = true; break; 3063 case ISD::SETUGT: CCCode = ISD::SETULT; FlipOperands = true; break; 3064 case ISD::SETLE: CCCode = ISD::SETGE; FlipOperands = true; break; 3065 case ISD::SETULE: CCCode = ISD::SETUGE; FlipOperands = true; break; 3066 default: break; 3067 } 3068 if (FlipOperands) { 3069 std::swap(LHSLo, RHSLo); 3070 std::swap(LHSHi, RHSHi); 3071 } 3072 // Perform a wide subtraction, feeding the carry from the low part into 3073 // SETCCCARRY. The SETCCCARRY operation is essentially looking at the high 3074 // part of the result of LHS - RHS. It is negative iff LHS < RHS. It is 3075 // zero or positive iff LHS >= RHS. 3076 EVT LoVT = LHSLo.getValueType(); 3077 SDVTList VTList = DAG.getVTList(LoVT, getSetCCResultType(LoVT)); 3078 SDValue LowCmp = DAG.getNode(ISD::USUBO, dl, VTList, LHSLo, RHSLo); 3079 SDValue Res = DAG.getNode(ISD::SETCCCARRY, dl, getSetCCResultType(HiVT), 3080 LHSHi, RHSHi, LowCmp.getValue(1), 3081 DAG.getCondCode(CCCode)); 3082 NewLHS = Res; 3083 NewRHS = SDValue(); 3084 return; 3085 } 3086 3087 NewLHS = TLI.SimplifySetCC(getSetCCResultType(HiVT), LHSHi, RHSHi, ISD::SETEQ, 3088 false, DagCombineInfo, dl); 3089 if (!NewLHS.getNode()) 3090 NewLHS = 3091 DAG.getSetCC(dl, getSetCCResultType(HiVT), LHSHi, RHSHi, ISD::SETEQ); 3092 NewLHS = DAG.getSelect(dl, LoCmp.getValueType(), NewLHS, LoCmp, HiCmp); 3093 NewRHS = SDValue(); 3094 } 3095 3096 SDValue DAGTypeLegalizer::ExpandIntOp_BR_CC(SDNode *N) { 3097 SDValue NewLHS = N->getOperand(2), NewRHS = N->getOperand(3); 3098 ISD::CondCode CCCode = cast<CondCodeSDNode>(N->getOperand(1))->get(); 3099 IntegerExpandSetCCOperands(NewLHS, NewRHS, CCCode, SDLoc(N)); 3100 3101 // If ExpandSetCCOperands returned a scalar, we need to compare the result 3102 // against zero to select between true and false values. 3103 if (!NewRHS.getNode()) { 3104 NewRHS = DAG.getConstant(0, SDLoc(N), NewLHS.getValueType()); 3105 CCCode = ISD::SETNE; 3106 } 3107 3108 // Update N to have the operands specified. 3109 return SDValue(DAG.UpdateNodeOperands(N, N->getOperand(0), 3110 DAG.getCondCode(CCCode), NewLHS, NewRHS, 3111 N->getOperand(4)), 0); 3112 } 3113 3114 SDValue DAGTypeLegalizer::ExpandIntOp_SELECT_CC(SDNode *N) { 3115 SDValue NewLHS = N->getOperand(0), NewRHS = N->getOperand(1); 3116 ISD::CondCode CCCode = cast<CondCodeSDNode>(N->getOperand(4))->get(); 3117 IntegerExpandSetCCOperands(NewLHS, NewRHS, CCCode, SDLoc(N)); 3118 3119 // If ExpandSetCCOperands returned a scalar, we need to compare the result 3120 // against zero to select between true and false values. 3121 if (!NewRHS.getNode()) { 3122 NewRHS = DAG.getConstant(0, SDLoc(N), NewLHS.getValueType()); 3123 CCCode = ISD::SETNE; 3124 } 3125 3126 // Update N to have the operands specified. 3127 return SDValue(DAG.UpdateNodeOperands(N, NewLHS, NewRHS, 3128 N->getOperand(2), N->getOperand(3), 3129 DAG.getCondCode(CCCode)), 0); 3130 } 3131 3132 SDValue DAGTypeLegalizer::ExpandIntOp_SETCC(SDNode *N) { 3133 SDValue NewLHS = N->getOperand(0), NewRHS = N->getOperand(1); 3134 ISD::CondCode CCCode = cast<CondCodeSDNode>(N->getOperand(2))->get(); 3135 IntegerExpandSetCCOperands(NewLHS, NewRHS, CCCode, SDLoc(N)); 3136 3137 // If ExpandSetCCOperands returned a scalar, use it. 3138 if (!NewRHS.getNode()) { 3139 assert(NewLHS.getValueType() == N->getValueType(0) && 3140 "Unexpected setcc expansion!"); 3141 return NewLHS; 3142 } 3143 3144 // Otherwise, update N to have the operands specified. 3145 return SDValue( 3146 DAG.UpdateNodeOperands(N, NewLHS, NewRHS, DAG.getCondCode(CCCode)), 0); 3147 } 3148 3149 SDValue DAGTypeLegalizer::ExpandIntOp_SETCCCARRY(SDNode *N) { 3150 SDValue LHS = N->getOperand(0); 3151 SDValue RHS = N->getOperand(1); 3152 SDValue Carry = N->getOperand(2); 3153 SDValue Cond = N->getOperand(3); 3154 SDLoc dl = SDLoc(N); 3155 3156 SDValue LHSLo, LHSHi, RHSLo, RHSHi; 3157 GetExpandedInteger(LHS, LHSLo, LHSHi); 3158 GetExpandedInteger(RHS, RHSLo, RHSHi); 3159 3160 // Expand to a SUBE for the low part and a smaller SETCCCARRY for the high. 3161 SDVTList VTList = DAG.getVTList(LHSLo.getValueType(), Carry.getValueType()); 3162 SDValue LowCmp = DAG.getNode(ISD::SUBCARRY, dl, VTList, LHSLo, RHSLo, Carry); 3163 return DAG.getNode(ISD::SETCCCARRY, dl, N->getValueType(0), LHSHi, RHSHi, 3164 LowCmp.getValue(1), Cond); 3165 } 3166 3167 SDValue DAGTypeLegalizer::ExpandIntOp_Shift(SDNode *N) { 3168 // The value being shifted is legal, but the shift amount is too big. 3169 // It follows that either the result of the shift is undefined, or the 3170 // upper half of the shift amount is zero. Just use the lower half. 3171 SDValue Lo, Hi; 3172 GetExpandedInteger(N->getOperand(1), Lo, Hi); 3173 return SDValue(DAG.UpdateNodeOperands(N, N->getOperand(0), Lo), 0); 3174 } 3175 3176 SDValue DAGTypeLegalizer::ExpandIntOp_RETURNADDR(SDNode *N) { 3177 // The argument of RETURNADDR / FRAMEADDR builtin is 32 bit contant. This 3178 // surely makes pretty nice problems on 8/16 bit targets. Just truncate this 3179 // constant to valid type. 3180 SDValue Lo, Hi; 3181 GetExpandedInteger(N->getOperand(0), Lo, Hi); 3182 return SDValue(DAG.UpdateNodeOperands(N, Lo), 0); 3183 } 3184 3185 SDValue DAGTypeLegalizer::ExpandIntOp_SINT_TO_FP(SDNode *N) { 3186 SDValue Op = N->getOperand(0); 3187 EVT DstVT = N->getValueType(0); 3188 RTLIB::Libcall LC = RTLIB::getSINTTOFP(Op.getValueType(), DstVT); 3189 assert(LC != RTLIB::UNKNOWN_LIBCALL && 3190 "Don't know how to expand this SINT_TO_FP!"); 3191 return TLI.makeLibCall(DAG, LC, DstVT, Op, true, SDLoc(N)).first; 3192 } 3193 3194 SDValue DAGTypeLegalizer::ExpandIntOp_STORE(StoreSDNode *N, unsigned OpNo) { 3195 if (ISD::isNormalStore(N)) 3196 return ExpandOp_NormalStore(N, OpNo); 3197 3198 assert(ISD::isUNINDEXEDStore(N) && "Indexed store during type legalization!"); 3199 assert(OpNo == 1 && "Can only expand the stored value so far"); 3200 3201 EVT VT = N->getOperand(1).getValueType(); 3202 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT); 3203 SDValue Ch = N->getChain(); 3204 SDValue Ptr = N->getBasePtr(); 3205 unsigned Alignment = N->getAlignment(); 3206 MachineMemOperand::Flags MMOFlags = N->getMemOperand()->getFlags(); 3207 AAMDNodes AAInfo = N->getAAInfo(); 3208 SDLoc dl(N); 3209 SDValue Lo, Hi; 3210 3211 assert(NVT.isByteSized() && "Expanded type not byte sized!"); 3212 3213 if (N->getMemoryVT().bitsLE(NVT)) { 3214 GetExpandedInteger(N->getValue(), Lo, Hi); 3215 return DAG.getTruncStore(Ch, dl, Lo, Ptr, N->getPointerInfo(), 3216 N->getMemoryVT(), Alignment, MMOFlags, AAInfo); 3217 } 3218 3219 if (DAG.getDataLayout().isLittleEndian()) { 3220 // Little-endian - low bits are at low addresses. 3221 GetExpandedInteger(N->getValue(), Lo, Hi); 3222 3223 Lo = DAG.getStore(Ch, dl, Lo, Ptr, N->getPointerInfo(), Alignment, MMOFlags, 3224 AAInfo); 3225 3226 unsigned ExcessBits = 3227 N->getMemoryVT().getSizeInBits() - NVT.getSizeInBits(); 3228 EVT NEVT = EVT::getIntegerVT(*DAG.getContext(), ExcessBits); 3229 3230 // Increment the pointer to the other half. 3231 unsigned IncrementSize = NVT.getSizeInBits()/8; 3232 Ptr = DAG.getObjectPtrOffset(dl, Ptr, IncrementSize); 3233 Hi = DAG.getTruncStore( 3234 Ch, dl, Hi, Ptr, N->getPointerInfo().getWithOffset(IncrementSize), NEVT, 3235 MinAlign(Alignment, IncrementSize), MMOFlags, AAInfo); 3236 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo, Hi); 3237 } 3238 3239 // Big-endian - high bits are at low addresses. Favor aligned stores at 3240 // the cost of some bit-fiddling. 3241 GetExpandedInteger(N->getValue(), Lo, Hi); 3242 3243 EVT ExtVT = N->getMemoryVT(); 3244 unsigned EBytes = ExtVT.getStoreSize(); 3245 unsigned IncrementSize = NVT.getSizeInBits()/8; 3246 unsigned ExcessBits = (EBytes - IncrementSize)*8; 3247 EVT HiVT = EVT::getIntegerVT(*DAG.getContext(), 3248 ExtVT.getSizeInBits() - ExcessBits); 3249 3250 if (ExcessBits < NVT.getSizeInBits()) { 3251 // Transfer high bits from the top of Lo to the bottom of Hi. 3252 Hi = DAG.getNode(ISD::SHL, dl, NVT, Hi, 3253 DAG.getConstant(NVT.getSizeInBits() - ExcessBits, dl, 3254 TLI.getPointerTy(DAG.getDataLayout()))); 3255 Hi = DAG.getNode( 3256 ISD::OR, dl, NVT, Hi, 3257 DAG.getNode(ISD::SRL, dl, NVT, Lo, 3258 DAG.getConstant(ExcessBits, dl, 3259 TLI.getPointerTy(DAG.getDataLayout())))); 3260 } 3261 3262 // Store both the high bits and maybe some of the low bits. 3263 Hi = DAG.getTruncStore(Ch, dl, Hi, Ptr, N->getPointerInfo(), HiVT, Alignment, 3264 MMOFlags, AAInfo); 3265 3266 // Increment the pointer to the other half. 3267 Ptr = DAG.getObjectPtrOffset(dl, Ptr, IncrementSize); 3268 // Store the lowest ExcessBits bits in the second half. 3269 Lo = DAG.getTruncStore(Ch, dl, Lo, Ptr, 3270 N->getPointerInfo().getWithOffset(IncrementSize), 3271 EVT::getIntegerVT(*DAG.getContext(), ExcessBits), 3272 MinAlign(Alignment, IncrementSize), MMOFlags, AAInfo); 3273 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo, Hi); 3274 } 3275 3276 SDValue DAGTypeLegalizer::ExpandIntOp_TRUNCATE(SDNode *N) { 3277 SDValue InL, InH; 3278 GetExpandedInteger(N->getOperand(0), InL, InH); 3279 // Just truncate the low part of the source. 3280 return DAG.getNode(ISD::TRUNCATE, SDLoc(N), N->getValueType(0), InL); 3281 } 3282 3283 SDValue DAGTypeLegalizer::ExpandIntOp_UINT_TO_FP(SDNode *N) { 3284 SDValue Op = N->getOperand(0); 3285 EVT SrcVT = Op.getValueType(); 3286 EVT DstVT = N->getValueType(0); 3287 SDLoc dl(N); 3288 3289 // The following optimization is valid only if every value in SrcVT (when 3290 // treated as signed) is representable in DstVT. Check that the mantissa 3291 // size of DstVT is >= than the number of bits in SrcVT -1. 3292 const fltSemantics &sem = DAG.EVTToAPFloatSemantics(DstVT); 3293 if (APFloat::semanticsPrecision(sem) >= SrcVT.getSizeInBits()-1 && 3294 TLI.getOperationAction(ISD::SINT_TO_FP, SrcVT) == TargetLowering::Custom){ 3295 // Do a signed conversion then adjust the result. 3296 SDValue SignedConv = DAG.getNode(ISD::SINT_TO_FP, dl, DstVT, Op); 3297 SignedConv = TLI.LowerOperation(SignedConv, DAG); 3298 3299 // The result of the signed conversion needs adjusting if the 'sign bit' of 3300 // the incoming integer was set. To handle this, we dynamically test to see 3301 // if it is set, and, if so, add a fudge factor. 3302 3303 const uint64_t F32TwoE32 = 0x4F800000ULL; 3304 const uint64_t F32TwoE64 = 0x5F800000ULL; 3305 const uint64_t F32TwoE128 = 0x7F800000ULL; 3306 3307 APInt FF(32, 0); 3308 if (SrcVT == MVT::i32) 3309 FF = APInt(32, F32TwoE32); 3310 else if (SrcVT == MVT::i64) 3311 FF = APInt(32, F32TwoE64); 3312 else if (SrcVT == MVT::i128) 3313 FF = APInt(32, F32TwoE128); 3314 else 3315 llvm_unreachable("Unsupported UINT_TO_FP!"); 3316 3317 // Check whether the sign bit is set. 3318 SDValue Lo, Hi; 3319 GetExpandedInteger(Op, Lo, Hi); 3320 SDValue SignSet = DAG.getSetCC(dl, 3321 getSetCCResultType(Hi.getValueType()), 3322 Hi, 3323 DAG.getConstant(0, dl, Hi.getValueType()), 3324 ISD::SETLT); 3325 3326 // Build a 64 bit pair (0, FF) in the constant pool, with FF in the lo bits. 3327 SDValue FudgePtr = 3328 DAG.getConstantPool(ConstantInt::get(*DAG.getContext(), FF.zext(64)), 3329 TLI.getPointerTy(DAG.getDataLayout())); 3330 3331 // Get a pointer to FF if the sign bit was set, or to 0 otherwise. 3332 SDValue Zero = DAG.getIntPtrConstant(0, dl); 3333 SDValue Four = DAG.getIntPtrConstant(4, dl); 3334 if (DAG.getDataLayout().isBigEndian()) 3335 std::swap(Zero, Four); 3336 SDValue Offset = DAG.getSelect(dl, Zero.getValueType(), SignSet, 3337 Zero, Four); 3338 unsigned Alignment = cast<ConstantPoolSDNode>(FudgePtr)->getAlignment(); 3339 FudgePtr = DAG.getNode(ISD::ADD, dl, FudgePtr.getValueType(), 3340 FudgePtr, Offset); 3341 Alignment = std::min(Alignment, 4u); 3342 3343 // Load the value out, extending it from f32 to the destination float type. 3344 // FIXME: Avoid the extend by constructing the right constant pool? 3345 SDValue Fudge = DAG.getExtLoad( 3346 ISD::EXTLOAD, dl, DstVT, DAG.getEntryNode(), FudgePtr, 3347 MachinePointerInfo::getConstantPool(DAG.getMachineFunction()), MVT::f32, 3348 Alignment); 3349 return DAG.getNode(ISD::FADD, dl, DstVT, SignedConv, Fudge); 3350 } 3351 3352 // Otherwise, use a libcall. 3353 RTLIB::Libcall LC = RTLIB::getUINTTOFP(SrcVT, DstVT); 3354 assert(LC != RTLIB::UNKNOWN_LIBCALL && 3355 "Don't know how to expand this UINT_TO_FP!"); 3356 return TLI.makeLibCall(DAG, LC, DstVT, Op, true, dl).first; 3357 } 3358 3359 SDValue DAGTypeLegalizer::ExpandIntOp_ATOMIC_STORE(SDNode *N) { 3360 SDLoc dl(N); 3361 SDValue Swap = DAG.getAtomic(ISD::ATOMIC_SWAP, dl, 3362 cast<AtomicSDNode>(N)->getMemoryVT(), 3363 N->getOperand(0), 3364 N->getOperand(1), N->getOperand(2), 3365 cast<AtomicSDNode>(N)->getMemOperand()); 3366 return Swap.getValue(1); 3367 } 3368 3369 3370 SDValue DAGTypeLegalizer::PromoteIntRes_EXTRACT_SUBVECTOR(SDNode *N) { 3371 SDValue InOp0 = N->getOperand(0); 3372 EVT InVT = InOp0.getValueType(); 3373 3374 EVT OutVT = N->getValueType(0); 3375 EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT); 3376 assert(NOutVT.isVector() && "This type must be promoted to a vector type"); 3377 unsigned OutNumElems = OutVT.getVectorNumElements(); 3378 EVT NOutVTElem = NOutVT.getVectorElementType(); 3379 3380 SDLoc dl(N); 3381 SDValue BaseIdx = N->getOperand(1); 3382 3383 SmallVector<SDValue, 8> Ops; 3384 Ops.reserve(OutNumElems); 3385 for (unsigned i = 0; i != OutNumElems; ++i) { 3386 3387 // Extract the element from the original vector. 3388 SDValue Index = DAG.getNode(ISD::ADD, dl, BaseIdx.getValueType(), 3389 BaseIdx, DAG.getConstant(i, dl, BaseIdx.getValueType())); 3390 SDValue Ext = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, 3391 InVT.getVectorElementType(), N->getOperand(0), Index); 3392 3393 SDValue Op = DAG.getNode(ISD::ANY_EXTEND, dl, NOutVTElem, Ext); 3394 // Insert the converted element to the new vector. 3395 Ops.push_back(Op); 3396 } 3397 3398 return DAG.getBuildVector(NOutVT, dl, Ops); 3399 } 3400 3401 3402 SDValue DAGTypeLegalizer::PromoteIntRes_VECTOR_SHUFFLE(SDNode *N) { 3403 ShuffleVectorSDNode *SV = cast<ShuffleVectorSDNode>(N); 3404 EVT VT = N->getValueType(0); 3405 SDLoc dl(N); 3406 3407 ArrayRef<int> NewMask = SV->getMask().slice(0, VT.getVectorNumElements()); 3408 3409 SDValue V0 = GetPromotedInteger(N->getOperand(0)); 3410 SDValue V1 = GetPromotedInteger(N->getOperand(1)); 3411 EVT OutVT = V0.getValueType(); 3412 3413 return DAG.getVectorShuffle(OutVT, dl, V0, V1, NewMask); 3414 } 3415 3416 3417 SDValue DAGTypeLegalizer::PromoteIntRes_BUILD_VECTOR(SDNode *N) { 3418 EVT OutVT = N->getValueType(0); 3419 EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT); 3420 assert(NOutVT.isVector() && "This type must be promoted to a vector type"); 3421 unsigned NumElems = N->getNumOperands(); 3422 EVT NOutVTElem = NOutVT.getVectorElementType(); 3423 3424 SDLoc dl(N); 3425 3426 SmallVector<SDValue, 8> Ops; 3427 Ops.reserve(NumElems); 3428 for (unsigned i = 0; i != NumElems; ++i) { 3429 SDValue Op; 3430 // BUILD_VECTOR integer operand types are allowed to be larger than the 3431 // result's element type. This may still be true after the promotion. For 3432 // example, we might be promoting (<v?i1> = BV <i32>, <i32>, ...) to 3433 // (v?i16 = BV <i32>, <i32>, ...), and we can't any_extend <i32> to <i16>. 3434 if (N->getOperand(i).getValueType().bitsLT(NOutVTElem)) 3435 Op = DAG.getNode(ISD::ANY_EXTEND, dl, NOutVTElem, N->getOperand(i)); 3436 else 3437 Op = N->getOperand(i); 3438 Ops.push_back(Op); 3439 } 3440 3441 return DAG.getBuildVector(NOutVT, dl, Ops); 3442 } 3443 3444 SDValue DAGTypeLegalizer::PromoteIntRes_SCALAR_TO_VECTOR(SDNode *N) { 3445 3446 SDLoc dl(N); 3447 3448 assert(!N->getOperand(0).getValueType().isVector() && 3449 "Input must be a scalar"); 3450 3451 EVT OutVT = N->getValueType(0); 3452 EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT); 3453 assert(NOutVT.isVector() && "This type must be promoted to a vector type"); 3454 EVT NOutVTElem = NOutVT.getVectorElementType(); 3455 3456 SDValue Op = DAG.getNode(ISD::ANY_EXTEND, dl, NOutVTElem, N->getOperand(0)); 3457 3458 return DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, NOutVT, Op); 3459 } 3460 3461 SDValue DAGTypeLegalizer::PromoteIntRes_CONCAT_VECTORS(SDNode *N) { 3462 SDLoc dl(N); 3463 3464 EVT OutVT = N->getValueType(0); 3465 EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT); 3466 assert(NOutVT.isVector() && "This type must be promoted to a vector type"); 3467 3468 EVT OutElemTy = NOutVT.getVectorElementType(); 3469 3470 unsigned NumElem = N->getOperand(0).getValueType().getVectorNumElements(); 3471 unsigned NumOutElem = NOutVT.getVectorNumElements(); 3472 unsigned NumOperands = N->getNumOperands(); 3473 assert(NumElem * NumOperands == NumOutElem && 3474 "Unexpected number of elements"); 3475 3476 // Take the elements from the first vector. 3477 SmallVector<SDValue, 8> Ops(NumOutElem); 3478 for (unsigned i = 0; i < NumOperands; ++i) { 3479 SDValue Op = N->getOperand(i); 3480 if (getTypeAction(Op.getValueType()) == TargetLowering::TypePromoteInteger) 3481 Op = GetPromotedInteger(Op); 3482 EVT SclrTy = Op.getValueType().getVectorElementType(); 3483 assert(NumElem == Op.getValueType().getVectorNumElements() && 3484 "Unexpected number of elements"); 3485 3486 for (unsigned j = 0; j < NumElem; ++j) { 3487 SDValue Ext = DAG.getNode( 3488 ISD::EXTRACT_VECTOR_ELT, dl, SclrTy, Op, 3489 DAG.getConstant(j, dl, TLI.getVectorIdxTy(DAG.getDataLayout()))); 3490 Ops[i * NumElem + j] = DAG.getAnyExtOrTrunc(Ext, dl, OutElemTy); 3491 } 3492 } 3493 3494 return DAG.getBuildVector(NOutVT, dl, Ops); 3495 } 3496 3497 SDValue DAGTypeLegalizer::PromoteIntRes_EXTEND_VECTOR_INREG(SDNode *N) { 3498 EVT VT = N->getValueType(0); 3499 EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT); 3500 assert(NVT.isVector() && "This type must be promoted to a vector type"); 3501 3502 SDLoc dl(N); 3503 3504 // For operands whose TypeAction is to promote, extend the promoted node 3505 // appropriately (ZERO_EXTEND or SIGN_EXTEND) from the original pre-promotion 3506 // type, and then construct a new *_EXTEND_VECTOR_INREG node to the promote-to 3507 // type.. 3508 if (getTypeAction(N->getOperand(0).getValueType()) 3509 == TargetLowering::TypePromoteInteger) { 3510 SDValue Promoted; 3511 3512 switch(N->getOpcode()) { 3513 case ISD::SIGN_EXTEND_VECTOR_INREG: 3514 Promoted = SExtPromotedInteger(N->getOperand(0)); 3515 break; 3516 case ISD::ZERO_EXTEND_VECTOR_INREG: 3517 Promoted = ZExtPromotedInteger(N->getOperand(0)); 3518 break; 3519 case ISD::ANY_EXTEND_VECTOR_INREG: 3520 Promoted = GetPromotedInteger(N->getOperand(0)); 3521 break; 3522 default: 3523 llvm_unreachable("Node has unexpected Opcode"); 3524 } 3525 return DAG.getNode(N->getOpcode(), dl, NVT, Promoted); 3526 } 3527 3528 // Directly extend to the appropriate transform-to type. 3529 return DAG.getNode(N->getOpcode(), dl, NVT, N->getOperand(0)); 3530 } 3531 3532 SDValue DAGTypeLegalizer::PromoteIntRes_INSERT_VECTOR_ELT(SDNode *N) { 3533 EVT OutVT = N->getValueType(0); 3534 EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT); 3535 assert(NOutVT.isVector() && "This type must be promoted to a vector type"); 3536 3537 EVT NOutVTElem = NOutVT.getVectorElementType(); 3538 3539 SDLoc dl(N); 3540 SDValue V0 = GetPromotedInteger(N->getOperand(0)); 3541 3542 SDValue ConvElem = DAG.getNode(ISD::ANY_EXTEND, dl, 3543 NOutVTElem, N->getOperand(1)); 3544 return DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, NOutVT, 3545 V0, ConvElem, N->getOperand(2)); 3546 } 3547 3548 SDValue DAGTypeLegalizer::PromoteIntOp_EXTRACT_VECTOR_ELT(SDNode *N) { 3549 SDLoc dl(N); 3550 SDValue V0 = GetPromotedInteger(N->getOperand(0)); 3551 SDValue V1 = DAG.getZExtOrTrunc(N->getOperand(1), dl, 3552 TLI.getVectorIdxTy(DAG.getDataLayout())); 3553 SDValue Ext = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, 3554 V0->getValueType(0).getScalarType(), V0, V1); 3555 3556 // EXTRACT_VECTOR_ELT can return types which are wider than the incoming 3557 // element types. If this is the case then we need to expand the outgoing 3558 // value and not truncate it. 3559 return DAG.getAnyExtOrTrunc(Ext, dl, N->getValueType(0)); 3560 } 3561 3562 SDValue DAGTypeLegalizer::PromoteIntOp_EXTRACT_SUBVECTOR(SDNode *N) { 3563 SDLoc dl(N); 3564 SDValue V0 = GetPromotedInteger(N->getOperand(0)); 3565 MVT InVT = V0.getValueType().getSimpleVT(); 3566 MVT OutVT = MVT::getVectorVT(InVT.getVectorElementType(), 3567 N->getValueType(0).getVectorNumElements()); 3568 SDValue Ext = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, OutVT, V0, N->getOperand(1)); 3569 return DAG.getNode(ISD::TRUNCATE, dl, N->getValueType(0), Ext); 3570 } 3571 3572 SDValue DAGTypeLegalizer::PromoteIntOp_CONCAT_VECTORS(SDNode *N) { 3573 SDLoc dl(N); 3574 unsigned NumElems = N->getNumOperands(); 3575 3576 EVT RetSclrTy = N->getValueType(0).getVectorElementType(); 3577 3578 SmallVector<SDValue, 8> NewOps; 3579 NewOps.reserve(NumElems); 3580 3581 // For each incoming vector 3582 for (unsigned VecIdx = 0; VecIdx != NumElems; ++VecIdx) { 3583 SDValue Incoming = GetPromotedInteger(N->getOperand(VecIdx)); 3584 EVT SclrTy = Incoming->getValueType(0).getVectorElementType(); 3585 unsigned NumElem = Incoming->getValueType(0).getVectorNumElements(); 3586 3587 for (unsigned i=0; i<NumElem; ++i) { 3588 // Extract element from incoming vector 3589 SDValue Ex = DAG.getNode( 3590 ISD::EXTRACT_VECTOR_ELT, dl, SclrTy, Incoming, 3591 DAG.getConstant(i, dl, TLI.getVectorIdxTy(DAG.getDataLayout()))); 3592 SDValue Tr = DAG.getNode(ISD::TRUNCATE, dl, RetSclrTy, Ex); 3593 NewOps.push_back(Tr); 3594 } 3595 } 3596 3597 return DAG.getBuildVector(N->getValueType(0), dl, NewOps); 3598 } 3599