1 //===-- LegalizeDAG.cpp - Implement SelectionDAG::Legalize ----------------===// 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 the SelectionDAG::Legalize method. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "llvm/CodeGen/SelectionDAG.h" 15 #include "llvm/ADT/SetVector.h" 16 #include "llvm/ADT/SmallPtrSet.h" 17 #include "llvm/ADT/SmallSet.h" 18 #include "llvm/ADT/SmallVector.h" 19 #include "llvm/ADT/Triple.h" 20 #include "llvm/CodeGen/Analysis.h" 21 #include "llvm/CodeGen/MachineFunction.h" 22 #include "llvm/CodeGen/MachineJumpTableInfo.h" 23 #include "llvm/IR/CallingConv.h" 24 #include "llvm/IR/Constants.h" 25 #include "llvm/IR/DataLayout.h" 26 #include "llvm/IR/DebugInfo.h" 27 #include "llvm/IR/DerivedTypes.h" 28 #include "llvm/IR/Function.h" 29 #include "llvm/IR/LLVMContext.h" 30 #include "llvm/Support/Debug.h" 31 #include "llvm/Support/ErrorHandling.h" 32 #include "llvm/Support/MathExtras.h" 33 #include "llvm/Support/raw_ostream.h" 34 #include "llvm/Target/TargetFrameLowering.h" 35 #include "llvm/Target/TargetLowering.h" 36 #include "llvm/Target/TargetMachine.h" 37 #include "llvm/Target/TargetSubtargetInfo.h" 38 using namespace llvm; 39 40 #define DEBUG_TYPE "legalizedag" 41 42 //===----------------------------------------------------------------------===// 43 /// This takes an arbitrary SelectionDAG as input and 44 /// hacks on it until the target machine can handle it. This involves 45 /// eliminating value sizes the machine cannot handle (promoting small sizes to 46 /// large sizes or splitting up large values into small values) as well as 47 /// eliminating operations the machine cannot handle. 48 /// 49 /// This code also does a small amount of optimization and recognition of idioms 50 /// as part of its processing. For example, if a target does not support a 51 /// 'setcc' instruction efficiently, but does support 'brcc' instruction, this 52 /// will attempt merge setcc and brc instructions into brcc's. 53 /// 54 namespace { 55 class SelectionDAGLegalize { 56 const TargetMachine &TM; 57 const TargetLowering &TLI; 58 SelectionDAG &DAG; 59 60 /// \brief The set of nodes which have already been legalized. We hold a 61 /// reference to it in order to update as necessary on node deletion. 62 SmallPtrSetImpl<SDNode *> &LegalizedNodes; 63 64 /// \brief A set of all the nodes updated during legalization. 65 SmallSetVector<SDNode *, 16> *UpdatedNodes; 66 67 EVT getSetCCResultType(EVT VT) const { 68 return TLI.getSetCCResultType(*DAG.getContext(), VT); 69 } 70 71 // Libcall insertion helpers. 72 73 public: 74 SelectionDAGLegalize(SelectionDAG &DAG, 75 SmallPtrSetImpl<SDNode *> &LegalizedNodes, 76 SmallSetVector<SDNode *, 16> *UpdatedNodes = nullptr) 77 : TM(DAG.getTarget()), TLI(DAG.getTargetLoweringInfo()), DAG(DAG), 78 LegalizedNodes(LegalizedNodes), UpdatedNodes(UpdatedNodes) {} 79 80 /// \brief Legalizes the given operation. 81 void LegalizeOp(SDNode *Node); 82 83 private: 84 SDValue OptimizeFloatStore(StoreSDNode *ST); 85 86 void LegalizeLoadOps(SDNode *Node); 87 void LegalizeStoreOps(SDNode *Node); 88 89 /// Some targets cannot handle a variable 90 /// insertion index for the INSERT_VECTOR_ELT instruction. In this case, it 91 /// is necessary to spill the vector being inserted into to memory, perform 92 /// the insert there, and then read the result back. 93 SDValue PerformInsertVectorEltInMemory(SDValue Vec, SDValue Val, 94 SDValue Idx, SDLoc dl); 95 SDValue ExpandINSERT_VECTOR_ELT(SDValue Vec, SDValue Val, 96 SDValue Idx, SDLoc dl); 97 98 /// Return a vector shuffle operation which 99 /// performs the same shuffe in terms of order or result bytes, but on a type 100 /// whose vector element type is narrower than the original shuffle type. 101 /// e.g. <v4i32> <0, 1, 0, 1> -> v8i16 <0, 1, 2, 3, 0, 1, 2, 3> 102 SDValue ShuffleWithNarrowerEltType(EVT NVT, EVT VT, SDLoc dl, 103 SDValue N1, SDValue N2, 104 ArrayRef<int> Mask) const; 105 106 bool LegalizeSetCCCondCode(EVT VT, SDValue &LHS, SDValue &RHS, SDValue &CC, 107 bool &NeedInvert, SDLoc dl); 108 109 SDValue ExpandLibCall(RTLIB::Libcall LC, SDNode *Node, bool isSigned); 110 SDValue ExpandLibCall(RTLIB::Libcall LC, EVT RetVT, const SDValue *Ops, 111 unsigned NumOps, bool isSigned, SDLoc dl); 112 113 std::pair<SDValue, SDValue> ExpandChainLibCall(RTLIB::Libcall LC, 114 SDNode *Node, bool isSigned); 115 SDValue ExpandFPLibCall(SDNode *Node, RTLIB::Libcall Call_F32, 116 RTLIB::Libcall Call_F64, RTLIB::Libcall Call_F80, 117 RTLIB::Libcall Call_F128, 118 RTLIB::Libcall Call_PPCF128); 119 SDValue ExpandIntLibCall(SDNode *Node, bool isSigned, 120 RTLIB::Libcall Call_I8, 121 RTLIB::Libcall Call_I16, 122 RTLIB::Libcall Call_I32, 123 RTLIB::Libcall Call_I64, 124 RTLIB::Libcall Call_I128); 125 void ExpandDivRemLibCall(SDNode *Node, SmallVectorImpl<SDValue> &Results); 126 void ExpandSinCosLibCall(SDNode *Node, SmallVectorImpl<SDValue> &Results); 127 128 SDValue EmitStackConvert(SDValue SrcOp, EVT SlotVT, EVT DestVT, SDLoc dl); 129 SDValue ExpandBUILD_VECTOR(SDNode *Node); 130 SDValue ExpandSCALAR_TO_VECTOR(SDNode *Node); 131 void ExpandDYNAMIC_STACKALLOC(SDNode *Node, 132 SmallVectorImpl<SDValue> &Results); 133 SDValue ExpandFCOPYSIGN(SDNode *Node); 134 SDValue ExpandLegalINT_TO_FP(bool isSigned, SDValue LegalOp, EVT DestVT, 135 SDLoc dl); 136 SDValue PromoteLegalINT_TO_FP(SDValue LegalOp, EVT DestVT, bool isSigned, 137 SDLoc dl); 138 SDValue PromoteLegalFP_TO_INT(SDValue LegalOp, EVT DestVT, bool isSigned, 139 SDLoc dl); 140 141 SDValue ExpandBSWAP(SDValue Op, SDLoc dl); 142 SDValue ExpandBitCount(unsigned Opc, SDValue Op, SDLoc dl); 143 144 SDValue ExpandExtractFromVectorThroughStack(SDValue Op); 145 SDValue ExpandInsertToVectorThroughStack(SDValue Op); 146 SDValue ExpandVectorBuildThroughStack(SDNode* Node); 147 148 SDValue ExpandConstantFP(ConstantFPSDNode *CFP, bool UseCP); 149 150 std::pair<SDValue, SDValue> ExpandAtomic(SDNode *Node); 151 152 void ExpandNode(SDNode *Node); 153 void PromoteNode(SDNode *Node); 154 155 public: 156 // Node replacement helpers 157 void ReplacedNode(SDNode *N) { 158 LegalizedNodes.erase(N); 159 if (UpdatedNodes) 160 UpdatedNodes->insert(N); 161 } 162 void ReplaceNode(SDNode *Old, SDNode *New) { 163 DEBUG(dbgs() << " ... replacing: "; Old->dump(&DAG); 164 dbgs() << " with: "; New->dump(&DAG)); 165 166 assert(Old->getNumValues() == New->getNumValues() && 167 "Replacing one node with another that produces a different number " 168 "of values!"); 169 DAG.ReplaceAllUsesWith(Old, New); 170 for (unsigned i = 0, e = Old->getNumValues(); i != e; ++i) 171 DAG.TransferDbgValues(SDValue(Old, i), SDValue(New, i)); 172 if (UpdatedNodes) 173 UpdatedNodes->insert(New); 174 ReplacedNode(Old); 175 } 176 void ReplaceNode(SDValue Old, SDValue New) { 177 DEBUG(dbgs() << " ... replacing: "; Old->dump(&DAG); 178 dbgs() << " with: "; New->dump(&DAG)); 179 180 DAG.ReplaceAllUsesWith(Old, New); 181 DAG.TransferDbgValues(Old, New); 182 if (UpdatedNodes) 183 UpdatedNodes->insert(New.getNode()); 184 ReplacedNode(Old.getNode()); 185 } 186 void ReplaceNode(SDNode *Old, const SDValue *New) { 187 DEBUG(dbgs() << " ... replacing: "; Old->dump(&DAG)); 188 189 DAG.ReplaceAllUsesWith(Old, New); 190 for (unsigned i = 0, e = Old->getNumValues(); i != e; ++i) { 191 DEBUG(dbgs() << (i == 0 ? " with: " 192 : " and: "); 193 New[i]->dump(&DAG)); 194 DAG.TransferDbgValues(SDValue(Old, i), New[i]); 195 if (UpdatedNodes) 196 UpdatedNodes->insert(New[i].getNode()); 197 } 198 ReplacedNode(Old); 199 } 200 }; 201 } 202 203 /// Return a vector shuffle operation which 204 /// performs the same shuffe in terms of order or result bytes, but on a type 205 /// whose vector element type is narrower than the original shuffle type. 206 /// e.g. <v4i32> <0, 1, 0, 1> -> v8i16 <0, 1, 2, 3, 0, 1, 2, 3> 207 SDValue 208 SelectionDAGLegalize::ShuffleWithNarrowerEltType(EVT NVT, EVT VT, SDLoc dl, 209 SDValue N1, SDValue N2, 210 ArrayRef<int> Mask) const { 211 unsigned NumMaskElts = VT.getVectorNumElements(); 212 unsigned NumDestElts = NVT.getVectorNumElements(); 213 unsigned NumEltsGrowth = NumDestElts / NumMaskElts; 214 215 assert(NumEltsGrowth && "Cannot promote to vector type with fewer elts!"); 216 217 if (NumEltsGrowth == 1) 218 return DAG.getVectorShuffle(NVT, dl, N1, N2, &Mask[0]); 219 220 SmallVector<int, 8> NewMask; 221 for (unsigned i = 0; i != NumMaskElts; ++i) { 222 int Idx = Mask[i]; 223 for (unsigned j = 0; j != NumEltsGrowth; ++j) { 224 if (Idx < 0) 225 NewMask.push_back(-1); 226 else 227 NewMask.push_back(Idx * NumEltsGrowth + j); 228 } 229 } 230 assert(NewMask.size() == NumDestElts && "Non-integer NumEltsGrowth?"); 231 assert(TLI.isShuffleMaskLegal(NewMask, NVT) && "Shuffle not legal?"); 232 return DAG.getVectorShuffle(NVT, dl, N1, N2, &NewMask[0]); 233 } 234 235 /// Expands the ConstantFP node to an integer constant or 236 /// a load from the constant pool. 237 SDValue 238 SelectionDAGLegalize::ExpandConstantFP(ConstantFPSDNode *CFP, bool UseCP) { 239 bool Extend = false; 240 SDLoc dl(CFP); 241 242 // If a FP immediate is precise when represented as a float and if the 243 // target can do an extending load from float to double, we put it into 244 // the constant pool as a float, even if it's is statically typed as a 245 // double. This shrinks FP constants and canonicalizes them for targets where 246 // an FP extending load is the same cost as a normal load (such as on the x87 247 // fp stack or PPC FP unit). 248 EVT VT = CFP->getValueType(0); 249 ConstantFP *LLVMC = const_cast<ConstantFP*>(CFP->getConstantFPValue()); 250 if (!UseCP) { 251 assert((VT == MVT::f64 || VT == MVT::f32) && "Invalid type expansion"); 252 return DAG.getConstant(LLVMC->getValueAPF().bitcastToAPInt(), dl, 253 (VT == MVT::f64) ? MVT::i64 : MVT::i32); 254 } 255 256 EVT OrigVT = VT; 257 EVT SVT = VT; 258 while (SVT != MVT::f32 && SVT != MVT::f16) { 259 SVT = (MVT::SimpleValueType)(SVT.getSimpleVT().SimpleTy - 1); 260 if (ConstantFPSDNode::isValueValidForType(SVT, CFP->getValueAPF()) && 261 // Only do this if the target has a native EXTLOAD instruction from 262 // smaller type. 263 TLI.isLoadExtLegal(ISD::EXTLOAD, OrigVT, SVT) && 264 TLI.ShouldShrinkFPConstant(OrigVT)) { 265 Type *SType = SVT.getTypeForEVT(*DAG.getContext()); 266 LLVMC = cast<ConstantFP>(ConstantExpr::getFPTrunc(LLVMC, SType)); 267 VT = SVT; 268 Extend = true; 269 } 270 } 271 272 SDValue CPIdx = DAG.getConstantPool(LLVMC, TLI.getPointerTy()); 273 unsigned Alignment = cast<ConstantPoolSDNode>(CPIdx)->getAlignment(); 274 if (Extend) { 275 SDValue Result = 276 DAG.getExtLoad(ISD::EXTLOAD, dl, OrigVT, 277 DAG.getEntryNode(), 278 CPIdx, MachinePointerInfo::getConstantPool(), 279 VT, false, false, false, Alignment); 280 return Result; 281 } 282 SDValue Result = 283 DAG.getLoad(OrigVT, dl, DAG.getEntryNode(), CPIdx, 284 MachinePointerInfo::getConstantPool(), false, false, false, 285 Alignment); 286 return Result; 287 } 288 289 /// Expands an unaligned store to 2 half-size stores. 290 static void ExpandUnalignedStore(StoreSDNode *ST, SelectionDAG &DAG, 291 const TargetLowering &TLI, 292 SelectionDAGLegalize *DAGLegalize) { 293 assert(ST->getAddressingMode() == ISD::UNINDEXED && 294 "unaligned indexed stores not implemented!"); 295 SDValue Chain = ST->getChain(); 296 SDValue Ptr = ST->getBasePtr(); 297 SDValue Val = ST->getValue(); 298 EVT VT = Val.getValueType(); 299 int Alignment = ST->getAlignment(); 300 unsigned AS = ST->getAddressSpace(); 301 302 SDLoc dl(ST); 303 if (ST->getMemoryVT().isFloatingPoint() || 304 ST->getMemoryVT().isVector()) { 305 EVT intVT = EVT::getIntegerVT(*DAG.getContext(), VT.getSizeInBits()); 306 if (TLI.isTypeLegal(intVT)) { 307 // Expand to a bitconvert of the value to the integer type of the 308 // same size, then a (misaligned) int store. 309 // FIXME: Does not handle truncating floating point stores! 310 SDValue Result = DAG.getNode(ISD::BITCAST, dl, intVT, Val); 311 Result = DAG.getStore(Chain, dl, Result, Ptr, ST->getPointerInfo(), 312 ST->isVolatile(), ST->isNonTemporal(), Alignment); 313 DAGLegalize->ReplaceNode(SDValue(ST, 0), Result); 314 return; 315 } 316 // Do a (aligned) store to a stack slot, then copy from the stack slot 317 // to the final destination using (unaligned) integer loads and stores. 318 EVT StoredVT = ST->getMemoryVT(); 319 MVT RegVT = 320 TLI.getRegisterType(*DAG.getContext(), 321 EVT::getIntegerVT(*DAG.getContext(), 322 StoredVT.getSizeInBits())); 323 unsigned StoredBytes = StoredVT.getSizeInBits() / 8; 324 unsigned RegBytes = RegVT.getSizeInBits() / 8; 325 unsigned NumRegs = (StoredBytes + RegBytes - 1) / RegBytes; 326 327 // Make sure the stack slot is also aligned for the register type. 328 SDValue StackPtr = DAG.CreateStackTemporary(StoredVT, RegVT); 329 330 // Perform the original store, only redirected to the stack slot. 331 SDValue Store = DAG.getTruncStore(Chain, dl, 332 Val, StackPtr, MachinePointerInfo(), 333 StoredVT, false, false, 0); 334 SDValue Increment = DAG.getConstant(RegBytes, dl, TLI.getPointerTy(AS)); 335 SmallVector<SDValue, 8> Stores; 336 unsigned Offset = 0; 337 338 // Do all but one copies using the full register width. 339 for (unsigned i = 1; i < NumRegs; i++) { 340 // Load one integer register's worth from the stack slot. 341 SDValue Load = DAG.getLoad(RegVT, dl, Store, StackPtr, 342 MachinePointerInfo(), 343 false, false, false, 0); 344 // Store it to the final location. Remember the store. 345 Stores.push_back(DAG.getStore(Load.getValue(1), dl, Load, Ptr, 346 ST->getPointerInfo().getWithOffset(Offset), 347 ST->isVolatile(), ST->isNonTemporal(), 348 MinAlign(ST->getAlignment(), Offset))); 349 // Increment the pointers. 350 Offset += RegBytes; 351 StackPtr = DAG.getNode(ISD::ADD, dl, StackPtr.getValueType(), StackPtr, 352 Increment); 353 Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr, Increment); 354 } 355 356 // The last store may be partial. Do a truncating store. On big-endian 357 // machines this requires an extending load from the stack slot to ensure 358 // that the bits are in the right place. 359 EVT MemVT = EVT::getIntegerVT(*DAG.getContext(), 360 8 * (StoredBytes - Offset)); 361 362 // Load from the stack slot. 363 SDValue Load = DAG.getExtLoad(ISD::EXTLOAD, dl, RegVT, Store, StackPtr, 364 MachinePointerInfo(), 365 MemVT, false, false, false, 0); 366 367 Stores.push_back(DAG.getTruncStore(Load.getValue(1), dl, Load, Ptr, 368 ST->getPointerInfo() 369 .getWithOffset(Offset), 370 MemVT, ST->isVolatile(), 371 ST->isNonTemporal(), 372 MinAlign(ST->getAlignment(), Offset), 373 ST->getAAInfo())); 374 // The order of the stores doesn't matter - say it with a TokenFactor. 375 SDValue Result = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Stores); 376 DAGLegalize->ReplaceNode(SDValue(ST, 0), Result); 377 return; 378 } 379 assert(ST->getMemoryVT().isInteger() && 380 !ST->getMemoryVT().isVector() && 381 "Unaligned store of unknown type."); 382 // Get the half-size VT 383 EVT NewStoredVT = ST->getMemoryVT().getHalfSizedIntegerVT(*DAG.getContext()); 384 int NumBits = NewStoredVT.getSizeInBits(); 385 int IncrementSize = NumBits / 8; 386 387 // Divide the stored value in two parts. 388 SDValue ShiftAmount = DAG.getConstant(NumBits, dl, 389 TLI.getShiftAmountTy(Val.getValueType())); 390 SDValue Lo = Val; 391 SDValue Hi = DAG.getNode(ISD::SRL, dl, VT, Val, ShiftAmount); 392 393 // Store the two parts 394 SDValue Store1, Store2; 395 Store1 = DAG.getTruncStore(Chain, dl, TLI.isLittleEndian()?Lo:Hi, Ptr, 396 ST->getPointerInfo(), NewStoredVT, 397 ST->isVolatile(), ST->isNonTemporal(), Alignment); 398 399 Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr, 400 DAG.getConstant(IncrementSize, dl, TLI.getPointerTy(AS))); 401 Alignment = MinAlign(Alignment, IncrementSize); 402 Store2 = DAG.getTruncStore(Chain, dl, TLI.isLittleEndian()?Hi:Lo, Ptr, 403 ST->getPointerInfo().getWithOffset(IncrementSize), 404 NewStoredVT, ST->isVolatile(), ST->isNonTemporal(), 405 Alignment, ST->getAAInfo()); 406 407 SDValue Result = 408 DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Store1, Store2); 409 DAGLegalize->ReplaceNode(SDValue(ST, 0), Result); 410 } 411 412 /// Expands an unaligned load to 2 half-size loads. 413 static void 414 ExpandUnalignedLoad(LoadSDNode *LD, SelectionDAG &DAG, 415 const TargetLowering &TLI, 416 SDValue &ValResult, SDValue &ChainResult) { 417 assert(LD->getAddressingMode() == ISD::UNINDEXED && 418 "unaligned indexed loads not implemented!"); 419 SDValue Chain = LD->getChain(); 420 SDValue Ptr = LD->getBasePtr(); 421 EVT VT = LD->getValueType(0); 422 EVT LoadedVT = LD->getMemoryVT(); 423 SDLoc dl(LD); 424 if (VT.isFloatingPoint() || VT.isVector()) { 425 EVT intVT = EVT::getIntegerVT(*DAG.getContext(), LoadedVT.getSizeInBits()); 426 if (TLI.isTypeLegal(intVT) && TLI.isTypeLegal(LoadedVT)) { 427 // Expand to a (misaligned) integer load of the same size, 428 // then bitconvert to floating point or vector. 429 SDValue newLoad = DAG.getLoad(intVT, dl, Chain, Ptr, 430 LD->getMemOperand()); 431 SDValue Result = DAG.getNode(ISD::BITCAST, dl, LoadedVT, newLoad); 432 if (LoadedVT != VT) 433 Result = DAG.getNode(VT.isFloatingPoint() ? ISD::FP_EXTEND : 434 ISD::ANY_EXTEND, dl, VT, Result); 435 436 ValResult = Result; 437 ChainResult = Chain; 438 return; 439 } 440 441 // Copy the value to a (aligned) stack slot using (unaligned) integer 442 // loads and stores, then do a (aligned) load from the stack slot. 443 MVT RegVT = TLI.getRegisterType(*DAG.getContext(), intVT); 444 unsigned LoadedBytes = LoadedVT.getSizeInBits() / 8; 445 unsigned RegBytes = RegVT.getSizeInBits() / 8; 446 unsigned NumRegs = (LoadedBytes + RegBytes - 1) / RegBytes; 447 448 // Make sure the stack slot is also aligned for the register type. 449 SDValue StackBase = DAG.CreateStackTemporary(LoadedVT, RegVT); 450 451 SDValue Increment = DAG.getConstant(RegBytes, dl, TLI.getPointerTy()); 452 SmallVector<SDValue, 8> Stores; 453 SDValue StackPtr = StackBase; 454 unsigned Offset = 0; 455 456 // Do all but one copies using the full register width. 457 for (unsigned i = 1; i < NumRegs; i++) { 458 // Load one integer register's worth from the original location. 459 SDValue Load = DAG.getLoad(RegVT, dl, Chain, Ptr, 460 LD->getPointerInfo().getWithOffset(Offset), 461 LD->isVolatile(), LD->isNonTemporal(), 462 LD->isInvariant(), 463 MinAlign(LD->getAlignment(), Offset), 464 LD->getAAInfo()); 465 // Follow the load with a store to the stack slot. Remember the store. 466 Stores.push_back(DAG.getStore(Load.getValue(1), dl, Load, StackPtr, 467 MachinePointerInfo(), false, false, 0)); 468 // Increment the pointers. 469 Offset += RegBytes; 470 Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr, Increment); 471 StackPtr = DAG.getNode(ISD::ADD, dl, StackPtr.getValueType(), StackPtr, 472 Increment); 473 } 474 475 // The last copy may be partial. Do an extending load. 476 EVT MemVT = EVT::getIntegerVT(*DAG.getContext(), 477 8 * (LoadedBytes - Offset)); 478 SDValue Load = DAG.getExtLoad(ISD::EXTLOAD, dl, RegVT, Chain, Ptr, 479 LD->getPointerInfo().getWithOffset(Offset), 480 MemVT, LD->isVolatile(), 481 LD->isNonTemporal(), 482 LD->isInvariant(), 483 MinAlign(LD->getAlignment(), Offset), 484 LD->getAAInfo()); 485 // Follow the load with a store to the stack slot. Remember the store. 486 // On big-endian machines this requires a truncating store to ensure 487 // that the bits end up in the right place. 488 Stores.push_back(DAG.getTruncStore(Load.getValue(1), dl, Load, StackPtr, 489 MachinePointerInfo(), MemVT, 490 false, false, 0)); 491 492 // The order of the stores doesn't matter - say it with a TokenFactor. 493 SDValue TF = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Stores); 494 495 // Finally, perform the original load only redirected to the stack slot. 496 Load = DAG.getExtLoad(LD->getExtensionType(), dl, VT, TF, StackBase, 497 MachinePointerInfo(), LoadedVT, false,false, false, 498 0); 499 500 // Callers expect a MERGE_VALUES node. 501 ValResult = Load; 502 ChainResult = TF; 503 return; 504 } 505 assert(LoadedVT.isInteger() && !LoadedVT.isVector() && 506 "Unaligned load of unsupported type."); 507 508 // Compute the new VT that is half the size of the old one. This is an 509 // integer MVT. 510 unsigned NumBits = LoadedVT.getSizeInBits(); 511 EVT NewLoadedVT; 512 NewLoadedVT = EVT::getIntegerVT(*DAG.getContext(), NumBits/2); 513 NumBits >>= 1; 514 515 unsigned Alignment = LD->getAlignment(); 516 unsigned IncrementSize = NumBits / 8; 517 ISD::LoadExtType HiExtType = LD->getExtensionType(); 518 519 // If the original load is NON_EXTLOAD, the hi part load must be ZEXTLOAD. 520 if (HiExtType == ISD::NON_EXTLOAD) 521 HiExtType = ISD::ZEXTLOAD; 522 523 // Load the value in two parts 524 SDValue Lo, Hi; 525 if (TLI.isLittleEndian()) { 526 Lo = DAG.getExtLoad(ISD::ZEXTLOAD, dl, VT, Chain, Ptr, LD->getPointerInfo(), 527 NewLoadedVT, LD->isVolatile(), 528 LD->isNonTemporal(), LD->isInvariant(), Alignment, 529 LD->getAAInfo()); 530 Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr, 531 DAG.getConstant(IncrementSize, dl, Ptr.getValueType())); 532 Hi = DAG.getExtLoad(HiExtType, dl, VT, Chain, Ptr, 533 LD->getPointerInfo().getWithOffset(IncrementSize), 534 NewLoadedVT, LD->isVolatile(), 535 LD->isNonTemporal(),LD->isInvariant(), 536 MinAlign(Alignment, IncrementSize), LD->getAAInfo()); 537 } else { 538 Hi = DAG.getExtLoad(HiExtType, dl, VT, Chain, Ptr, LD->getPointerInfo(), 539 NewLoadedVT, LD->isVolatile(), 540 LD->isNonTemporal(), LD->isInvariant(), Alignment, 541 LD->getAAInfo()); 542 Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr, 543 DAG.getConstant(IncrementSize, dl, Ptr.getValueType())); 544 Lo = DAG.getExtLoad(ISD::ZEXTLOAD, dl, VT, Chain, Ptr, 545 LD->getPointerInfo().getWithOffset(IncrementSize), 546 NewLoadedVT, LD->isVolatile(), 547 LD->isNonTemporal(), LD->isInvariant(), 548 MinAlign(Alignment, IncrementSize), LD->getAAInfo()); 549 } 550 551 // aggregate the two parts 552 SDValue ShiftAmount = DAG.getConstant(NumBits, dl, 553 TLI.getShiftAmountTy(Hi.getValueType())); 554 SDValue Result = DAG.getNode(ISD::SHL, dl, VT, Hi, ShiftAmount); 555 Result = DAG.getNode(ISD::OR, dl, VT, Result, Lo); 556 557 SDValue TF = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo.getValue(1), 558 Hi.getValue(1)); 559 560 ValResult = Result; 561 ChainResult = TF; 562 } 563 564 /// Some target cannot handle a variable insertion index for the 565 /// INSERT_VECTOR_ELT instruction. In this case, it 566 /// is necessary to spill the vector being inserted into to memory, perform 567 /// the insert there, and then read the result back. 568 SDValue SelectionDAGLegalize:: 569 PerformInsertVectorEltInMemory(SDValue Vec, SDValue Val, SDValue Idx, 570 SDLoc dl) { 571 SDValue Tmp1 = Vec; 572 SDValue Tmp2 = Val; 573 SDValue Tmp3 = Idx; 574 575 // If the target doesn't support this, we have to spill the input vector 576 // to a temporary stack slot, update the element, then reload it. This is 577 // badness. We could also load the value into a vector register (either 578 // with a "move to register" or "extload into register" instruction, then 579 // permute it into place, if the idx is a constant and if the idx is 580 // supported by the target. 581 EVT VT = Tmp1.getValueType(); 582 EVT EltVT = VT.getVectorElementType(); 583 EVT IdxVT = Tmp3.getValueType(); 584 EVT PtrVT = TLI.getPointerTy(); 585 SDValue StackPtr = DAG.CreateStackTemporary(VT); 586 587 int SPFI = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex(); 588 589 // Store the vector. 590 SDValue Ch = DAG.getStore(DAG.getEntryNode(), dl, Tmp1, StackPtr, 591 MachinePointerInfo::getFixedStack(SPFI), 592 false, false, 0); 593 594 // Truncate or zero extend offset to target pointer type. 595 unsigned CastOpc = IdxVT.bitsGT(PtrVT) ? ISD::TRUNCATE : ISD::ZERO_EXTEND; 596 Tmp3 = DAG.getNode(CastOpc, dl, PtrVT, Tmp3); 597 // Add the offset to the index. 598 unsigned EltSize = EltVT.getSizeInBits()/8; 599 Tmp3 = DAG.getNode(ISD::MUL, dl, IdxVT, Tmp3, 600 DAG.getConstant(EltSize, dl, IdxVT)); 601 SDValue StackPtr2 = DAG.getNode(ISD::ADD, dl, IdxVT, Tmp3, StackPtr); 602 // Store the scalar value. 603 Ch = DAG.getTruncStore(Ch, dl, Tmp2, StackPtr2, MachinePointerInfo(), EltVT, 604 false, false, 0); 605 // Load the updated vector. 606 return DAG.getLoad(VT, dl, Ch, StackPtr, 607 MachinePointerInfo::getFixedStack(SPFI), false, false, 608 false, 0); 609 } 610 611 612 SDValue SelectionDAGLegalize:: 613 ExpandINSERT_VECTOR_ELT(SDValue Vec, SDValue Val, SDValue Idx, SDLoc dl) { 614 if (ConstantSDNode *InsertPos = dyn_cast<ConstantSDNode>(Idx)) { 615 // SCALAR_TO_VECTOR requires that the type of the value being inserted 616 // match the element type of the vector being created, except for 617 // integers in which case the inserted value can be over width. 618 EVT EltVT = Vec.getValueType().getVectorElementType(); 619 if (Val.getValueType() == EltVT || 620 (EltVT.isInteger() && Val.getValueType().bitsGE(EltVT))) { 621 SDValue ScVec = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, 622 Vec.getValueType(), Val); 623 624 unsigned NumElts = Vec.getValueType().getVectorNumElements(); 625 // We generate a shuffle of InVec and ScVec, so the shuffle mask 626 // should be 0,1,2,3,4,5... with the appropriate element replaced with 627 // elt 0 of the RHS. 628 SmallVector<int, 8> ShufOps; 629 for (unsigned i = 0; i != NumElts; ++i) 630 ShufOps.push_back(i != InsertPos->getZExtValue() ? i : NumElts); 631 632 return DAG.getVectorShuffle(Vec.getValueType(), dl, Vec, ScVec, 633 &ShufOps[0]); 634 } 635 } 636 return PerformInsertVectorEltInMemory(Vec, Val, Idx, dl); 637 } 638 639 SDValue SelectionDAGLegalize::OptimizeFloatStore(StoreSDNode* ST) { 640 // Turn 'store float 1.0, Ptr' -> 'store int 0x12345678, Ptr' 641 // FIXME: We shouldn't do this for TargetConstantFP's. 642 // FIXME: move this to the DAG Combiner! Note that we can't regress due 643 // to phase ordering between legalized code and the dag combiner. This 644 // probably means that we need to integrate dag combiner and legalizer 645 // together. 646 // We generally can't do this one for long doubles. 647 SDValue Chain = ST->getChain(); 648 SDValue Ptr = ST->getBasePtr(); 649 unsigned Alignment = ST->getAlignment(); 650 bool isVolatile = ST->isVolatile(); 651 bool isNonTemporal = ST->isNonTemporal(); 652 AAMDNodes AAInfo = ST->getAAInfo(); 653 SDLoc dl(ST); 654 if (ConstantFPSDNode *CFP = dyn_cast<ConstantFPSDNode>(ST->getValue())) { 655 if (CFP->getValueType(0) == MVT::f32 && 656 TLI.isTypeLegal(MVT::i32)) { 657 SDValue Con = DAG.getConstant(CFP->getValueAPF(). 658 bitcastToAPInt().zextOrTrunc(32), 659 SDLoc(CFP), MVT::i32); 660 return DAG.getStore(Chain, dl, Con, Ptr, ST->getPointerInfo(), 661 isVolatile, isNonTemporal, Alignment, AAInfo); 662 } 663 664 if (CFP->getValueType(0) == MVT::f64) { 665 // If this target supports 64-bit registers, do a single 64-bit store. 666 if (TLI.isTypeLegal(MVT::i64)) { 667 SDValue Con = DAG.getConstant(CFP->getValueAPF().bitcastToAPInt(). 668 zextOrTrunc(64), SDLoc(CFP), MVT::i64); 669 return DAG.getStore(Chain, dl, Con, Ptr, ST->getPointerInfo(), 670 isVolatile, isNonTemporal, Alignment, AAInfo); 671 } 672 673 if (TLI.isTypeLegal(MVT::i32) && !ST->isVolatile()) { 674 // Otherwise, if the target supports 32-bit registers, use 2 32-bit 675 // stores. If the target supports neither 32- nor 64-bits, this 676 // xform is certainly not worth it. 677 const APInt &IntVal = CFP->getValueAPF().bitcastToAPInt(); 678 SDValue Lo = DAG.getConstant(IntVal.trunc(32), dl, MVT::i32); 679 SDValue Hi = DAG.getConstant(IntVal.lshr(32).trunc(32), dl, MVT::i32); 680 if (TLI.isBigEndian()) std::swap(Lo, Hi); 681 682 Lo = DAG.getStore(Chain, dl, Lo, Ptr, ST->getPointerInfo(), isVolatile, 683 isNonTemporal, Alignment, AAInfo); 684 Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr, 685 DAG.getConstant(4, dl, Ptr.getValueType())); 686 Hi = DAG.getStore(Chain, dl, Hi, Ptr, 687 ST->getPointerInfo().getWithOffset(4), 688 isVolatile, isNonTemporal, MinAlign(Alignment, 4U), 689 AAInfo); 690 691 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo, Hi); 692 } 693 } 694 } 695 return SDValue(nullptr, 0); 696 } 697 698 void SelectionDAGLegalize::LegalizeStoreOps(SDNode *Node) { 699 StoreSDNode *ST = cast<StoreSDNode>(Node); 700 SDValue Chain = ST->getChain(); 701 SDValue Ptr = ST->getBasePtr(); 702 SDLoc dl(Node); 703 704 unsigned Alignment = ST->getAlignment(); 705 bool isVolatile = ST->isVolatile(); 706 bool isNonTemporal = ST->isNonTemporal(); 707 AAMDNodes AAInfo = ST->getAAInfo(); 708 709 if (!ST->isTruncatingStore()) { 710 if (SDNode *OptStore = OptimizeFloatStore(ST).getNode()) { 711 ReplaceNode(ST, OptStore); 712 return; 713 } 714 715 { 716 SDValue Value = ST->getValue(); 717 MVT VT = Value.getSimpleValueType(); 718 switch (TLI.getOperationAction(ISD::STORE, VT)) { 719 default: llvm_unreachable("This action is not supported yet!"); 720 case TargetLowering::Legal: { 721 // If this is an unaligned store and the target doesn't support it, 722 // expand it. 723 unsigned AS = ST->getAddressSpace(); 724 unsigned Align = ST->getAlignment(); 725 if (!TLI.allowsMisalignedMemoryAccesses(ST->getMemoryVT(), AS, Align)) { 726 Type *Ty = ST->getMemoryVT().getTypeForEVT(*DAG.getContext()); 727 unsigned ABIAlignment= TLI.getDataLayout()->getABITypeAlignment(Ty); 728 if (Align < ABIAlignment) 729 ExpandUnalignedStore(cast<StoreSDNode>(Node), DAG, TLI, this); 730 } 731 break; 732 } 733 case TargetLowering::Custom: { 734 SDValue Res = TLI.LowerOperation(SDValue(Node, 0), DAG); 735 if (Res && Res != SDValue(Node, 0)) 736 ReplaceNode(SDValue(Node, 0), Res); 737 return; 738 } 739 case TargetLowering::Promote: { 740 MVT NVT = TLI.getTypeToPromoteTo(ISD::STORE, VT); 741 assert(NVT.getSizeInBits() == VT.getSizeInBits() && 742 "Can only promote stores to same size type"); 743 Value = DAG.getNode(ISD::BITCAST, dl, NVT, Value); 744 SDValue Result = 745 DAG.getStore(Chain, dl, Value, Ptr, 746 ST->getPointerInfo(), isVolatile, 747 isNonTemporal, Alignment, AAInfo); 748 ReplaceNode(SDValue(Node, 0), Result); 749 break; 750 } 751 } 752 return; 753 } 754 } else { 755 SDValue Value = ST->getValue(); 756 757 EVT StVT = ST->getMemoryVT(); 758 unsigned StWidth = StVT.getSizeInBits(); 759 760 if (StWidth != StVT.getStoreSizeInBits()) { 761 // Promote to a byte-sized store with upper bits zero if not 762 // storing an integral number of bytes. For example, promote 763 // TRUNCSTORE:i1 X -> TRUNCSTORE:i8 (and X, 1) 764 EVT NVT = EVT::getIntegerVT(*DAG.getContext(), 765 StVT.getStoreSizeInBits()); 766 Value = DAG.getZeroExtendInReg(Value, dl, StVT); 767 SDValue Result = 768 DAG.getTruncStore(Chain, dl, Value, Ptr, ST->getPointerInfo(), 769 NVT, isVolatile, isNonTemporal, Alignment, AAInfo); 770 ReplaceNode(SDValue(Node, 0), Result); 771 } else if (StWidth & (StWidth - 1)) { 772 // If not storing a power-of-2 number of bits, expand as two stores. 773 assert(!StVT.isVector() && "Unsupported truncstore!"); 774 unsigned RoundWidth = 1 << Log2_32(StWidth); 775 assert(RoundWidth < StWidth); 776 unsigned ExtraWidth = StWidth - RoundWidth; 777 assert(ExtraWidth < RoundWidth); 778 assert(!(RoundWidth % 8) && !(ExtraWidth % 8) && 779 "Store size not an integral number of bytes!"); 780 EVT RoundVT = EVT::getIntegerVT(*DAG.getContext(), RoundWidth); 781 EVT ExtraVT = EVT::getIntegerVT(*DAG.getContext(), ExtraWidth); 782 SDValue Lo, Hi; 783 unsigned IncrementSize; 784 785 if (TLI.isLittleEndian()) { 786 // TRUNCSTORE:i24 X -> TRUNCSTORE:i16 X, TRUNCSTORE@+2:i8 (srl X, 16) 787 // Store the bottom RoundWidth bits. 788 Lo = DAG.getTruncStore(Chain, dl, Value, Ptr, ST->getPointerInfo(), 789 RoundVT, 790 isVolatile, isNonTemporal, Alignment, 791 AAInfo); 792 793 // Store the remaining ExtraWidth bits. 794 IncrementSize = RoundWidth / 8; 795 Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr, 796 DAG.getConstant(IncrementSize, dl, 797 Ptr.getValueType())); 798 Hi = DAG.getNode(ISD::SRL, dl, Value.getValueType(), Value, 799 DAG.getConstant(RoundWidth, dl, 800 TLI.getShiftAmountTy(Value.getValueType()))); 801 Hi = DAG.getTruncStore(Chain, dl, Hi, Ptr, 802 ST->getPointerInfo().getWithOffset(IncrementSize), 803 ExtraVT, isVolatile, isNonTemporal, 804 MinAlign(Alignment, IncrementSize), AAInfo); 805 } else { 806 // Big endian - avoid unaligned stores. 807 // TRUNCSTORE:i24 X -> TRUNCSTORE:i16 (srl X, 8), TRUNCSTORE@+2:i8 X 808 // Store the top RoundWidth bits. 809 Hi = DAG.getNode(ISD::SRL, dl, Value.getValueType(), Value, 810 DAG.getConstant(ExtraWidth, dl, 811 TLI.getShiftAmountTy(Value.getValueType()))); 812 Hi = DAG.getTruncStore(Chain, dl, Hi, Ptr, ST->getPointerInfo(), 813 RoundVT, isVolatile, isNonTemporal, Alignment, 814 AAInfo); 815 816 // Store the remaining ExtraWidth bits. 817 IncrementSize = RoundWidth / 8; 818 Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr, 819 DAG.getConstant(IncrementSize, dl, 820 Ptr.getValueType())); 821 Lo = DAG.getTruncStore(Chain, dl, Value, Ptr, 822 ST->getPointerInfo().getWithOffset(IncrementSize), 823 ExtraVT, isVolatile, isNonTemporal, 824 MinAlign(Alignment, IncrementSize), AAInfo); 825 } 826 827 // The order of the stores doesn't matter. 828 SDValue Result = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo, Hi); 829 ReplaceNode(SDValue(Node, 0), Result); 830 } else { 831 switch (TLI.getTruncStoreAction(ST->getValue().getSimpleValueType(), 832 StVT.getSimpleVT())) { 833 default: llvm_unreachable("This action is not supported yet!"); 834 case TargetLowering::Legal: { 835 unsigned AS = ST->getAddressSpace(); 836 unsigned Align = ST->getAlignment(); 837 // If this is an unaligned store and the target doesn't support it, 838 // expand it. 839 if (!TLI.allowsMisalignedMemoryAccesses(ST->getMemoryVT(), AS, Align)) { 840 Type *Ty = ST->getMemoryVT().getTypeForEVT(*DAG.getContext()); 841 unsigned ABIAlignment= TLI.getDataLayout()->getABITypeAlignment(Ty); 842 if (Align < ABIAlignment) 843 ExpandUnalignedStore(cast<StoreSDNode>(Node), DAG, TLI, this); 844 } 845 break; 846 } 847 case TargetLowering::Custom: { 848 SDValue Res = TLI.LowerOperation(SDValue(Node, 0), DAG); 849 if (Res && Res != SDValue(Node, 0)) 850 ReplaceNode(SDValue(Node, 0), Res); 851 return; 852 } 853 case TargetLowering::Expand: 854 assert(!StVT.isVector() && 855 "Vector Stores are handled in LegalizeVectorOps"); 856 857 // TRUNCSTORE:i16 i32 -> STORE i16 858 assert(TLI.isTypeLegal(StVT) && 859 "Do not know how to expand this store!"); 860 Value = DAG.getNode(ISD::TRUNCATE, dl, StVT, Value); 861 SDValue Result = 862 DAG.getStore(Chain, dl, Value, Ptr, ST->getPointerInfo(), 863 isVolatile, isNonTemporal, Alignment, AAInfo); 864 ReplaceNode(SDValue(Node, 0), Result); 865 break; 866 } 867 } 868 } 869 } 870 871 void SelectionDAGLegalize::LegalizeLoadOps(SDNode *Node) { 872 LoadSDNode *LD = cast<LoadSDNode>(Node); 873 SDValue Chain = LD->getChain(); // The chain. 874 SDValue Ptr = LD->getBasePtr(); // The base pointer. 875 SDValue Value; // The value returned by the load op. 876 SDLoc dl(Node); 877 878 ISD::LoadExtType ExtType = LD->getExtensionType(); 879 if (ExtType == ISD::NON_EXTLOAD) { 880 MVT VT = Node->getSimpleValueType(0); 881 SDValue RVal = SDValue(Node, 0); 882 SDValue RChain = SDValue(Node, 1); 883 884 switch (TLI.getOperationAction(Node->getOpcode(), VT)) { 885 default: llvm_unreachable("This action is not supported yet!"); 886 case TargetLowering::Legal: { 887 unsigned AS = LD->getAddressSpace(); 888 unsigned Align = LD->getAlignment(); 889 // If this is an unaligned load and the target doesn't support it, 890 // expand it. 891 if (!TLI.allowsMisalignedMemoryAccesses(LD->getMemoryVT(), AS, Align)) { 892 Type *Ty = LD->getMemoryVT().getTypeForEVT(*DAG.getContext()); 893 unsigned ABIAlignment = 894 TLI.getDataLayout()->getABITypeAlignment(Ty); 895 if (Align < ABIAlignment){ 896 ExpandUnalignedLoad(cast<LoadSDNode>(Node), DAG, TLI, RVal, RChain); 897 } 898 } 899 break; 900 } 901 case TargetLowering::Custom: { 902 SDValue Res = TLI.LowerOperation(RVal, DAG); 903 if (Res.getNode()) { 904 RVal = Res; 905 RChain = Res.getValue(1); 906 } 907 break; 908 } 909 case TargetLowering::Promote: { 910 MVT NVT = TLI.getTypeToPromoteTo(Node->getOpcode(), VT); 911 assert(NVT.getSizeInBits() == VT.getSizeInBits() && 912 "Can only promote loads to same size type"); 913 914 SDValue Res = DAG.getLoad(NVT, dl, Chain, Ptr, LD->getMemOperand()); 915 RVal = DAG.getNode(ISD::BITCAST, dl, VT, Res); 916 RChain = Res.getValue(1); 917 break; 918 } 919 } 920 if (RChain.getNode() != Node) { 921 assert(RVal.getNode() != Node && "Load must be completely replaced"); 922 DAG.ReplaceAllUsesOfValueWith(SDValue(Node, 0), RVal); 923 DAG.ReplaceAllUsesOfValueWith(SDValue(Node, 1), RChain); 924 if (UpdatedNodes) { 925 UpdatedNodes->insert(RVal.getNode()); 926 UpdatedNodes->insert(RChain.getNode()); 927 } 928 ReplacedNode(Node); 929 } 930 return; 931 } 932 933 EVT SrcVT = LD->getMemoryVT(); 934 unsigned SrcWidth = SrcVT.getSizeInBits(); 935 unsigned Alignment = LD->getAlignment(); 936 bool isVolatile = LD->isVolatile(); 937 bool isNonTemporal = LD->isNonTemporal(); 938 bool isInvariant = LD->isInvariant(); 939 AAMDNodes AAInfo = LD->getAAInfo(); 940 941 if (SrcWidth != SrcVT.getStoreSizeInBits() && 942 // Some targets pretend to have an i1 loading operation, and actually 943 // load an i8. This trick is correct for ZEXTLOAD because the top 7 944 // bits are guaranteed to be zero; it helps the optimizers understand 945 // that these bits are zero. It is also useful for EXTLOAD, since it 946 // tells the optimizers that those bits are undefined. It would be 947 // nice to have an effective generic way of getting these benefits... 948 // Until such a way is found, don't insist on promoting i1 here. 949 (SrcVT != MVT::i1 || 950 TLI.getLoadExtAction(ExtType, Node->getValueType(0), MVT::i1) == 951 TargetLowering::Promote)) { 952 // Promote to a byte-sized load if not loading an integral number of 953 // bytes. For example, promote EXTLOAD:i20 -> EXTLOAD:i24. 954 unsigned NewWidth = SrcVT.getStoreSizeInBits(); 955 EVT NVT = EVT::getIntegerVT(*DAG.getContext(), NewWidth); 956 SDValue Ch; 957 958 // The extra bits are guaranteed to be zero, since we stored them that 959 // way. A zext load from NVT thus automatically gives zext from SrcVT. 960 961 ISD::LoadExtType NewExtType = 962 ExtType == ISD::ZEXTLOAD ? ISD::ZEXTLOAD : ISD::EXTLOAD; 963 964 SDValue Result = 965 DAG.getExtLoad(NewExtType, dl, Node->getValueType(0), 966 Chain, Ptr, LD->getPointerInfo(), 967 NVT, isVolatile, isNonTemporal, isInvariant, Alignment, 968 AAInfo); 969 970 Ch = Result.getValue(1); // The chain. 971 972 if (ExtType == ISD::SEXTLOAD) 973 // Having the top bits zero doesn't help when sign extending. 974 Result = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, 975 Result.getValueType(), 976 Result, DAG.getValueType(SrcVT)); 977 else if (ExtType == ISD::ZEXTLOAD || NVT == Result.getValueType()) 978 // All the top bits are guaranteed to be zero - inform the optimizers. 979 Result = DAG.getNode(ISD::AssertZext, dl, 980 Result.getValueType(), Result, 981 DAG.getValueType(SrcVT)); 982 983 Value = Result; 984 Chain = Ch; 985 } else if (SrcWidth & (SrcWidth - 1)) { 986 // If not loading a power-of-2 number of bits, expand as two loads. 987 assert(!SrcVT.isVector() && "Unsupported extload!"); 988 unsigned RoundWidth = 1 << Log2_32(SrcWidth); 989 assert(RoundWidth < SrcWidth); 990 unsigned ExtraWidth = SrcWidth - RoundWidth; 991 assert(ExtraWidth < RoundWidth); 992 assert(!(RoundWidth % 8) && !(ExtraWidth % 8) && 993 "Load size not an integral number of bytes!"); 994 EVT RoundVT = EVT::getIntegerVT(*DAG.getContext(), RoundWidth); 995 EVT ExtraVT = EVT::getIntegerVT(*DAG.getContext(), ExtraWidth); 996 SDValue Lo, Hi, Ch; 997 unsigned IncrementSize; 998 999 if (TLI.isLittleEndian()) { 1000 // EXTLOAD:i24 -> ZEXTLOAD:i16 | (shl EXTLOAD@+2:i8, 16) 1001 // Load the bottom RoundWidth bits. 1002 Lo = DAG.getExtLoad(ISD::ZEXTLOAD, dl, Node->getValueType(0), 1003 Chain, Ptr, 1004 LD->getPointerInfo(), RoundVT, isVolatile, 1005 isNonTemporal, isInvariant, Alignment, AAInfo); 1006 1007 // Load the remaining ExtraWidth bits. 1008 IncrementSize = RoundWidth / 8; 1009 Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr, 1010 DAG.getConstant(IncrementSize, dl, 1011 Ptr.getValueType())); 1012 Hi = DAG.getExtLoad(ExtType, dl, Node->getValueType(0), Chain, Ptr, 1013 LD->getPointerInfo().getWithOffset(IncrementSize), 1014 ExtraVT, isVolatile, isNonTemporal, isInvariant, 1015 MinAlign(Alignment, IncrementSize), AAInfo); 1016 1017 // Build a factor node to remember that this load is independent of 1018 // the other one. 1019 Ch = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo.getValue(1), 1020 Hi.getValue(1)); 1021 1022 // Move the top bits to the right place. 1023 Hi = DAG.getNode(ISD::SHL, dl, Hi.getValueType(), Hi, 1024 DAG.getConstant(RoundWidth, dl, 1025 TLI.getShiftAmountTy(Hi.getValueType()))); 1026 1027 // Join the hi and lo parts. 1028 Value = DAG.getNode(ISD::OR, dl, Node->getValueType(0), Lo, Hi); 1029 } else { 1030 // Big endian - avoid unaligned loads. 1031 // EXTLOAD:i24 -> (shl EXTLOAD:i16, 8) | ZEXTLOAD@+2:i8 1032 // Load the top RoundWidth bits. 1033 Hi = DAG.getExtLoad(ExtType, dl, Node->getValueType(0), Chain, Ptr, 1034 LD->getPointerInfo(), RoundVT, isVolatile, 1035 isNonTemporal, isInvariant, Alignment, AAInfo); 1036 1037 // Load the remaining ExtraWidth bits. 1038 IncrementSize = RoundWidth / 8; 1039 Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr, 1040 DAG.getConstant(IncrementSize, dl, 1041 Ptr.getValueType())); 1042 Lo = DAG.getExtLoad(ISD::ZEXTLOAD, 1043 dl, Node->getValueType(0), Chain, Ptr, 1044 LD->getPointerInfo().getWithOffset(IncrementSize), 1045 ExtraVT, isVolatile, isNonTemporal, isInvariant, 1046 MinAlign(Alignment, IncrementSize), AAInfo); 1047 1048 // Build a factor node to remember that this load is independent of 1049 // the other one. 1050 Ch = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo.getValue(1), 1051 Hi.getValue(1)); 1052 1053 // Move the top bits to the right place. 1054 Hi = DAG.getNode(ISD::SHL, dl, Hi.getValueType(), Hi, 1055 DAG.getConstant(ExtraWidth, dl, 1056 TLI.getShiftAmountTy(Hi.getValueType()))); 1057 1058 // Join the hi and lo parts. 1059 Value = DAG.getNode(ISD::OR, dl, Node->getValueType(0), Lo, Hi); 1060 } 1061 1062 Chain = Ch; 1063 } else { 1064 bool isCustom = false; 1065 switch (TLI.getLoadExtAction(ExtType, Node->getValueType(0), 1066 SrcVT.getSimpleVT())) { 1067 default: llvm_unreachable("This action is not supported yet!"); 1068 case TargetLowering::Custom: 1069 isCustom = true; 1070 // FALLTHROUGH 1071 case TargetLowering::Legal: { 1072 Value = SDValue(Node, 0); 1073 Chain = SDValue(Node, 1); 1074 1075 if (isCustom) { 1076 SDValue Res = TLI.LowerOperation(SDValue(Node, 0), DAG); 1077 if (Res.getNode()) { 1078 Value = Res; 1079 Chain = Res.getValue(1); 1080 } 1081 } else { 1082 // If this is an unaligned load and the target doesn't support 1083 // it, expand it. 1084 EVT MemVT = LD->getMemoryVT(); 1085 unsigned AS = LD->getAddressSpace(); 1086 unsigned Align = LD->getAlignment(); 1087 if (!TLI.allowsMisalignedMemoryAccesses(MemVT, AS, Align)) { 1088 Type *Ty = LD->getMemoryVT().getTypeForEVT(*DAG.getContext()); 1089 unsigned ABIAlignment = TLI.getDataLayout()->getABITypeAlignment(Ty); 1090 if (Align < ABIAlignment){ 1091 ExpandUnalignedLoad(cast<LoadSDNode>(Node), DAG, TLI, Value, Chain); 1092 } 1093 } 1094 } 1095 break; 1096 } 1097 case TargetLowering::Expand: 1098 if (!TLI.isLoadExtLegal(ISD::EXTLOAD, Node->getValueType(0), SrcVT)) { 1099 // If the source type is not legal, see if there is a legal extload to 1100 // an intermediate type that we can then extend further. 1101 EVT LoadVT = TLI.getRegisterType(SrcVT.getSimpleVT()); 1102 if (TLI.isTypeLegal(SrcVT) || // Same as SrcVT == LoadVT? 1103 TLI.isLoadExtLegal(ExtType, LoadVT, SrcVT)) { 1104 // If we are loading a legal type, this is a non-extload followed by a 1105 // full extend. 1106 ISD::LoadExtType MidExtType = 1107 (LoadVT == SrcVT) ? ISD::NON_EXTLOAD : ExtType; 1108 1109 SDValue Load = DAG.getExtLoad(MidExtType, dl, LoadVT, Chain, Ptr, 1110 SrcVT, LD->getMemOperand()); 1111 unsigned ExtendOp = 1112 ISD::getExtForLoadExtType(SrcVT.isFloatingPoint(), ExtType); 1113 Value = DAG.getNode(ExtendOp, dl, Node->getValueType(0), Load); 1114 Chain = Load.getValue(1); 1115 break; 1116 } 1117 } 1118 1119 assert(!SrcVT.isVector() && 1120 "Vector Loads are handled in LegalizeVectorOps"); 1121 1122 // FIXME: This does not work for vectors on most targets. Sign- 1123 // and zero-extend operations are currently folded into extending 1124 // loads, whether they are legal or not, and then we end up here 1125 // without any support for legalizing them. 1126 assert(ExtType != ISD::EXTLOAD && 1127 "EXTLOAD should always be supported!"); 1128 // Turn the unsupported load into an EXTLOAD followed by an 1129 // explicit zero/sign extend inreg. 1130 SDValue Result = DAG.getExtLoad(ISD::EXTLOAD, dl, 1131 Node->getValueType(0), 1132 Chain, Ptr, SrcVT, 1133 LD->getMemOperand()); 1134 SDValue ValRes; 1135 if (ExtType == ISD::SEXTLOAD) 1136 ValRes = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, 1137 Result.getValueType(), 1138 Result, DAG.getValueType(SrcVT)); 1139 else 1140 ValRes = DAG.getZeroExtendInReg(Result, dl, SrcVT.getScalarType()); 1141 Value = ValRes; 1142 Chain = Result.getValue(1); 1143 break; 1144 } 1145 } 1146 1147 // Since loads produce two values, make sure to remember that we legalized 1148 // both of them. 1149 if (Chain.getNode() != Node) { 1150 assert(Value.getNode() != Node && "Load must be completely replaced"); 1151 DAG.ReplaceAllUsesOfValueWith(SDValue(Node, 0), Value); 1152 DAG.ReplaceAllUsesOfValueWith(SDValue(Node, 1), Chain); 1153 if (UpdatedNodes) { 1154 UpdatedNodes->insert(Value.getNode()); 1155 UpdatedNodes->insert(Chain.getNode()); 1156 } 1157 ReplacedNode(Node); 1158 } 1159 } 1160 1161 /// Return a legal replacement for the given operation, with all legal operands. 1162 void SelectionDAGLegalize::LegalizeOp(SDNode *Node) { 1163 DEBUG(dbgs() << "\nLegalizing: "; Node->dump(&DAG)); 1164 1165 if (Node->getOpcode() == ISD::TargetConstant) // Allow illegal target nodes. 1166 return; 1167 1168 for (unsigned i = 0, e = Node->getNumValues(); i != e; ++i) 1169 assert(TLI.getTypeAction(*DAG.getContext(), Node->getValueType(i)) == 1170 TargetLowering::TypeLegal && 1171 "Unexpected illegal type!"); 1172 1173 for (unsigned i = 0, e = Node->getNumOperands(); i != e; ++i) 1174 assert((TLI.getTypeAction(*DAG.getContext(), 1175 Node->getOperand(i).getValueType()) == 1176 TargetLowering::TypeLegal || 1177 Node->getOperand(i).getOpcode() == ISD::TargetConstant) && 1178 "Unexpected illegal type!"); 1179 1180 // Figure out the correct action; the way to query this varies by opcode 1181 TargetLowering::LegalizeAction Action = TargetLowering::Legal; 1182 bool SimpleFinishLegalizing = true; 1183 switch (Node->getOpcode()) { 1184 case ISD::INTRINSIC_W_CHAIN: 1185 case ISD::INTRINSIC_WO_CHAIN: 1186 case ISD::INTRINSIC_VOID: 1187 case ISD::STACKSAVE: 1188 Action = TLI.getOperationAction(Node->getOpcode(), MVT::Other); 1189 break; 1190 case ISD::VAARG: 1191 Action = TLI.getOperationAction(Node->getOpcode(), 1192 Node->getValueType(0)); 1193 if (Action != TargetLowering::Promote) 1194 Action = TLI.getOperationAction(Node->getOpcode(), MVT::Other); 1195 break; 1196 case ISD::FP_TO_FP16: 1197 case ISD::SINT_TO_FP: 1198 case ISD::UINT_TO_FP: 1199 case ISD::EXTRACT_VECTOR_ELT: 1200 Action = TLI.getOperationAction(Node->getOpcode(), 1201 Node->getOperand(0).getValueType()); 1202 break; 1203 case ISD::FP_ROUND_INREG: 1204 case ISD::SIGN_EXTEND_INREG: { 1205 EVT InnerType = cast<VTSDNode>(Node->getOperand(1))->getVT(); 1206 Action = TLI.getOperationAction(Node->getOpcode(), InnerType); 1207 break; 1208 } 1209 case ISD::ATOMIC_STORE: { 1210 Action = TLI.getOperationAction(Node->getOpcode(), 1211 Node->getOperand(2).getValueType()); 1212 break; 1213 } 1214 case ISD::SELECT_CC: 1215 case ISD::SETCC: 1216 case ISD::BR_CC: { 1217 unsigned CCOperand = Node->getOpcode() == ISD::SELECT_CC ? 4 : 1218 Node->getOpcode() == ISD::SETCC ? 2 : 1; 1219 unsigned CompareOperand = Node->getOpcode() == ISD::BR_CC ? 2 : 0; 1220 MVT OpVT = Node->getOperand(CompareOperand).getSimpleValueType(); 1221 ISD::CondCode CCCode = 1222 cast<CondCodeSDNode>(Node->getOperand(CCOperand))->get(); 1223 Action = TLI.getCondCodeAction(CCCode, OpVT); 1224 if (Action == TargetLowering::Legal) { 1225 if (Node->getOpcode() == ISD::SELECT_CC) 1226 Action = TLI.getOperationAction(Node->getOpcode(), 1227 Node->getValueType(0)); 1228 else 1229 Action = TLI.getOperationAction(Node->getOpcode(), OpVT); 1230 } 1231 break; 1232 } 1233 case ISD::LOAD: 1234 case ISD::STORE: 1235 // FIXME: Model these properly. LOAD and STORE are complicated, and 1236 // STORE expects the unlegalized operand in some cases. 1237 SimpleFinishLegalizing = false; 1238 break; 1239 case ISD::CALLSEQ_START: 1240 case ISD::CALLSEQ_END: 1241 // FIXME: This shouldn't be necessary. These nodes have special properties 1242 // dealing with the recursive nature of legalization. Removing this 1243 // special case should be done as part of making LegalizeDAG non-recursive. 1244 SimpleFinishLegalizing = false; 1245 break; 1246 case ISD::EXTRACT_ELEMENT: 1247 case ISD::FLT_ROUNDS_: 1248 case ISD::FPOWI: 1249 case ISD::MERGE_VALUES: 1250 case ISD::EH_RETURN: 1251 case ISD::FRAME_TO_ARGS_OFFSET: 1252 case ISD::EH_SJLJ_SETJMP: 1253 case ISD::EH_SJLJ_LONGJMP: 1254 // These operations lie about being legal: when they claim to be legal, 1255 // they should actually be expanded. 1256 Action = TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0)); 1257 if (Action == TargetLowering::Legal) 1258 Action = TargetLowering::Expand; 1259 break; 1260 case ISD::INIT_TRAMPOLINE: 1261 case ISD::ADJUST_TRAMPOLINE: 1262 case ISD::FRAMEADDR: 1263 case ISD::RETURNADDR: 1264 // These operations lie about being legal: when they claim to be legal, 1265 // they should actually be custom-lowered. 1266 Action = TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0)); 1267 if (Action == TargetLowering::Legal) 1268 Action = TargetLowering::Custom; 1269 break; 1270 case ISD::READ_REGISTER: 1271 case ISD::WRITE_REGISTER: 1272 // Named register is legal in the DAG, but blocked by register name 1273 // selection if not implemented by target (to chose the correct register) 1274 // They'll be converted to Copy(To/From)Reg. 1275 Action = TargetLowering::Legal; 1276 break; 1277 case ISD::DEBUGTRAP: 1278 Action = TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0)); 1279 if (Action == TargetLowering::Expand) { 1280 // replace ISD::DEBUGTRAP with ISD::TRAP 1281 SDValue NewVal; 1282 NewVal = DAG.getNode(ISD::TRAP, SDLoc(Node), Node->getVTList(), 1283 Node->getOperand(0)); 1284 ReplaceNode(Node, NewVal.getNode()); 1285 LegalizeOp(NewVal.getNode()); 1286 return; 1287 } 1288 break; 1289 1290 default: 1291 if (Node->getOpcode() >= ISD::BUILTIN_OP_END) { 1292 Action = TargetLowering::Legal; 1293 } else { 1294 Action = TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0)); 1295 } 1296 break; 1297 } 1298 1299 if (SimpleFinishLegalizing) { 1300 SDNode *NewNode = Node; 1301 switch (Node->getOpcode()) { 1302 default: break; 1303 case ISD::SHL: 1304 case ISD::SRL: 1305 case ISD::SRA: 1306 case ISD::ROTL: 1307 case ISD::ROTR: 1308 // Legalizing shifts/rotates requires adjusting the shift amount 1309 // to the appropriate width. 1310 if (!Node->getOperand(1).getValueType().isVector()) { 1311 SDValue SAO = 1312 DAG.getShiftAmountOperand(Node->getOperand(0).getValueType(), 1313 Node->getOperand(1)); 1314 HandleSDNode Handle(SAO); 1315 LegalizeOp(SAO.getNode()); 1316 NewNode = DAG.UpdateNodeOperands(Node, Node->getOperand(0), 1317 Handle.getValue()); 1318 } 1319 break; 1320 case ISD::SRL_PARTS: 1321 case ISD::SRA_PARTS: 1322 case ISD::SHL_PARTS: 1323 // Legalizing shifts/rotates requires adjusting the shift amount 1324 // to the appropriate width. 1325 if (!Node->getOperand(2).getValueType().isVector()) { 1326 SDValue SAO = 1327 DAG.getShiftAmountOperand(Node->getOperand(0).getValueType(), 1328 Node->getOperand(2)); 1329 HandleSDNode Handle(SAO); 1330 LegalizeOp(SAO.getNode()); 1331 NewNode = DAG.UpdateNodeOperands(Node, Node->getOperand(0), 1332 Node->getOperand(1), 1333 Handle.getValue()); 1334 } 1335 break; 1336 } 1337 1338 if (NewNode != Node) { 1339 ReplaceNode(Node, NewNode); 1340 Node = NewNode; 1341 } 1342 switch (Action) { 1343 case TargetLowering::Legal: 1344 return; 1345 case TargetLowering::Custom: { 1346 // FIXME: The handling for custom lowering with multiple results is 1347 // a complete mess. 1348 SDValue Res = TLI.LowerOperation(SDValue(Node, 0), DAG); 1349 if (Res.getNode()) { 1350 if (!(Res.getNode() != Node || Res.getResNo() != 0)) 1351 return; 1352 1353 if (Node->getNumValues() == 1) { 1354 // We can just directly replace this node with the lowered value. 1355 ReplaceNode(SDValue(Node, 0), Res); 1356 return; 1357 } 1358 1359 SmallVector<SDValue, 8> ResultVals; 1360 for (unsigned i = 0, e = Node->getNumValues(); i != e; ++i) 1361 ResultVals.push_back(Res.getValue(i)); 1362 ReplaceNode(Node, ResultVals.data()); 1363 return; 1364 } 1365 } 1366 // FALL THROUGH 1367 case TargetLowering::Expand: 1368 ExpandNode(Node); 1369 return; 1370 case TargetLowering::Promote: 1371 PromoteNode(Node); 1372 return; 1373 } 1374 } 1375 1376 switch (Node->getOpcode()) { 1377 default: 1378 #ifndef NDEBUG 1379 dbgs() << "NODE: "; 1380 Node->dump( &DAG); 1381 dbgs() << "\n"; 1382 #endif 1383 llvm_unreachable("Do not know how to legalize this operator!"); 1384 1385 case ISD::CALLSEQ_START: 1386 case ISD::CALLSEQ_END: 1387 break; 1388 case ISD::LOAD: { 1389 return LegalizeLoadOps(Node); 1390 } 1391 case ISD::STORE: { 1392 return LegalizeStoreOps(Node); 1393 } 1394 } 1395 } 1396 1397 SDValue SelectionDAGLegalize::ExpandExtractFromVectorThroughStack(SDValue Op) { 1398 SDValue Vec = Op.getOperand(0); 1399 SDValue Idx = Op.getOperand(1); 1400 SDLoc dl(Op); 1401 1402 // Before we generate a new store to a temporary stack slot, see if there is 1403 // already one that we can use. There often is because when we scalarize 1404 // vector operations (using SelectionDAG::UnrollVectorOp for example) a whole 1405 // series of EXTRACT_VECTOR_ELT nodes are generated, one for each element in 1406 // the vector. If all are expanded here, we don't want one store per vector 1407 // element. 1408 SDValue StackPtr, Ch; 1409 for (SDNode::use_iterator UI = Vec.getNode()->use_begin(), 1410 UE = Vec.getNode()->use_end(); UI != UE; ++UI) { 1411 SDNode *User = *UI; 1412 if (StoreSDNode *ST = dyn_cast<StoreSDNode>(User)) { 1413 if (ST->isIndexed() || ST->isTruncatingStore() || 1414 ST->getValue() != Vec) 1415 continue; 1416 1417 // Make sure that nothing else could have stored into the destination of 1418 // this store. 1419 if (!ST->getChain().reachesChainWithoutSideEffects(DAG.getEntryNode())) 1420 continue; 1421 1422 StackPtr = ST->getBasePtr(); 1423 Ch = SDValue(ST, 0); 1424 break; 1425 } 1426 } 1427 1428 if (!Ch.getNode()) { 1429 // Store the value to a temporary stack slot, then LOAD the returned part. 1430 StackPtr = DAG.CreateStackTemporary(Vec.getValueType()); 1431 Ch = DAG.getStore(DAG.getEntryNode(), dl, Vec, StackPtr, 1432 MachinePointerInfo(), false, false, 0); 1433 } 1434 1435 // Add the offset to the index. 1436 unsigned EltSize = 1437 Vec.getValueType().getVectorElementType().getSizeInBits()/8; 1438 Idx = DAG.getNode(ISD::MUL, dl, Idx.getValueType(), Idx, 1439 DAG.getConstant(EltSize, SDLoc(Vec), Idx.getValueType())); 1440 1441 Idx = DAG.getZExtOrTrunc(Idx, dl, TLI.getPointerTy()); 1442 StackPtr = DAG.getNode(ISD::ADD, dl, Idx.getValueType(), Idx, StackPtr); 1443 1444 SDValue NewLoad; 1445 1446 if (Op.getValueType().isVector()) 1447 NewLoad = DAG.getLoad(Op.getValueType(), dl, Ch, StackPtr, 1448 MachinePointerInfo(), false, false, false, 0); 1449 else 1450 NewLoad = DAG.getExtLoad( 1451 ISD::EXTLOAD, dl, Op.getValueType(), Ch, StackPtr, MachinePointerInfo(), 1452 Vec.getValueType().getVectorElementType(), false, false, false, 0); 1453 1454 // Replace the chain going out of the store, by the one out of the load. 1455 DAG.ReplaceAllUsesOfValueWith(Ch, SDValue(NewLoad.getNode(), 1)); 1456 1457 // We introduced a cycle though, so update the loads operands, making sure 1458 // to use the original store's chain as an incoming chain. 1459 SmallVector<SDValue, 6> NewLoadOperands(NewLoad->op_begin(), 1460 NewLoad->op_end()); 1461 NewLoadOperands[0] = Ch; 1462 NewLoad = 1463 SDValue(DAG.UpdateNodeOperands(NewLoad.getNode(), NewLoadOperands), 0); 1464 return NewLoad; 1465 } 1466 1467 SDValue SelectionDAGLegalize::ExpandInsertToVectorThroughStack(SDValue Op) { 1468 assert(Op.getValueType().isVector() && "Non-vector insert subvector!"); 1469 1470 SDValue Vec = Op.getOperand(0); 1471 SDValue Part = Op.getOperand(1); 1472 SDValue Idx = Op.getOperand(2); 1473 SDLoc dl(Op); 1474 1475 // Store the value to a temporary stack slot, then LOAD the returned part. 1476 1477 SDValue StackPtr = DAG.CreateStackTemporary(Vec.getValueType()); 1478 int FI = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex(); 1479 MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(FI); 1480 1481 // First store the whole vector. 1482 SDValue Ch = DAG.getStore(DAG.getEntryNode(), dl, Vec, StackPtr, PtrInfo, 1483 false, false, 0); 1484 1485 // Then store the inserted part. 1486 1487 // Add the offset to the index. 1488 unsigned EltSize = 1489 Vec.getValueType().getVectorElementType().getSizeInBits()/8; 1490 1491 Idx = DAG.getNode(ISD::MUL, dl, Idx.getValueType(), Idx, 1492 DAG.getConstant(EltSize, SDLoc(Vec), Idx.getValueType())); 1493 Idx = DAG.getZExtOrTrunc(Idx, dl, TLI.getPointerTy()); 1494 1495 SDValue SubStackPtr = DAG.getNode(ISD::ADD, dl, Idx.getValueType(), Idx, 1496 StackPtr); 1497 1498 // Store the subvector. 1499 Ch = DAG.getStore(Ch, dl, Part, SubStackPtr, 1500 MachinePointerInfo(), false, false, 0); 1501 1502 // Finally, load the updated vector. 1503 return DAG.getLoad(Op.getValueType(), dl, Ch, StackPtr, PtrInfo, 1504 false, false, false, 0); 1505 } 1506 1507 SDValue SelectionDAGLegalize::ExpandVectorBuildThroughStack(SDNode* Node) { 1508 // We can't handle this case efficiently. Allocate a sufficiently 1509 // aligned object on the stack, store each element into it, then load 1510 // the result as a vector. 1511 // Create the stack frame object. 1512 EVT VT = Node->getValueType(0); 1513 EVT EltVT = VT.getVectorElementType(); 1514 SDLoc dl(Node); 1515 SDValue FIPtr = DAG.CreateStackTemporary(VT); 1516 int FI = cast<FrameIndexSDNode>(FIPtr.getNode())->getIndex(); 1517 MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(FI); 1518 1519 // Emit a store of each element to the stack slot. 1520 SmallVector<SDValue, 8> Stores; 1521 unsigned TypeByteSize = EltVT.getSizeInBits() / 8; 1522 // Store (in the right endianness) the elements to memory. 1523 for (unsigned i = 0, e = Node->getNumOperands(); i != e; ++i) { 1524 // Ignore undef elements. 1525 if (Node->getOperand(i).getOpcode() == ISD::UNDEF) continue; 1526 1527 unsigned Offset = TypeByteSize*i; 1528 1529 SDValue Idx = DAG.getConstant(Offset, dl, FIPtr.getValueType()); 1530 Idx = DAG.getNode(ISD::ADD, dl, FIPtr.getValueType(), FIPtr, Idx); 1531 1532 // If the destination vector element type is narrower than the source 1533 // element type, only store the bits necessary. 1534 if (EltVT.bitsLT(Node->getOperand(i).getValueType().getScalarType())) { 1535 Stores.push_back(DAG.getTruncStore(DAG.getEntryNode(), dl, 1536 Node->getOperand(i), Idx, 1537 PtrInfo.getWithOffset(Offset), 1538 EltVT, false, false, 0)); 1539 } else 1540 Stores.push_back(DAG.getStore(DAG.getEntryNode(), dl, 1541 Node->getOperand(i), Idx, 1542 PtrInfo.getWithOffset(Offset), 1543 false, false, 0)); 1544 } 1545 1546 SDValue StoreChain; 1547 if (!Stores.empty()) // Not all undef elements? 1548 StoreChain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Stores); 1549 else 1550 StoreChain = DAG.getEntryNode(); 1551 1552 // Result is a load from the stack slot. 1553 return DAG.getLoad(VT, dl, StoreChain, FIPtr, PtrInfo, 1554 false, false, false, 0); 1555 } 1556 1557 SDValue SelectionDAGLegalize::ExpandFCOPYSIGN(SDNode* Node) { 1558 SDLoc dl(Node); 1559 SDValue Tmp1 = Node->getOperand(0); 1560 SDValue Tmp2 = Node->getOperand(1); 1561 1562 // Get the sign bit of the RHS. First obtain a value that has the same 1563 // sign as the sign bit, i.e. negative if and only if the sign bit is 1. 1564 SDValue SignBit; 1565 EVT FloatVT = Tmp2.getValueType(); 1566 EVT IVT = EVT::getIntegerVT(*DAG.getContext(), FloatVT.getSizeInBits()); 1567 if (TLI.isTypeLegal(IVT)) { 1568 // Convert to an integer with the same sign bit. 1569 SignBit = DAG.getNode(ISD::BITCAST, dl, IVT, Tmp2); 1570 } else { 1571 // Store the float to memory, then load the sign part out as an integer. 1572 MVT LoadTy = TLI.getPointerTy(); 1573 // First create a temporary that is aligned for both the load and store. 1574 SDValue StackPtr = DAG.CreateStackTemporary(FloatVT, LoadTy); 1575 // Then store the float to it. 1576 SDValue Ch = 1577 DAG.getStore(DAG.getEntryNode(), dl, Tmp2, StackPtr, MachinePointerInfo(), 1578 false, false, 0); 1579 if (TLI.isBigEndian()) { 1580 assert(FloatVT.isByteSized() && "Unsupported floating point type!"); 1581 // Load out a legal integer with the same sign bit as the float. 1582 SignBit = DAG.getLoad(LoadTy, dl, Ch, StackPtr, MachinePointerInfo(), 1583 false, false, false, 0); 1584 } else { // Little endian 1585 SDValue LoadPtr = StackPtr; 1586 // The float may be wider than the integer we are going to load. Advance 1587 // the pointer so that the loaded integer will contain the sign bit. 1588 unsigned Strides = (FloatVT.getSizeInBits()-1)/LoadTy.getSizeInBits(); 1589 unsigned ByteOffset = (Strides * LoadTy.getSizeInBits()) / 8; 1590 LoadPtr = DAG.getNode(ISD::ADD, dl, LoadPtr.getValueType(), LoadPtr, 1591 DAG.getConstant(ByteOffset, dl, 1592 LoadPtr.getValueType())); 1593 // Load a legal integer containing the sign bit. 1594 SignBit = DAG.getLoad(LoadTy, dl, Ch, LoadPtr, MachinePointerInfo(), 1595 false, false, false, 0); 1596 // Move the sign bit to the top bit of the loaded integer. 1597 unsigned BitShift = LoadTy.getSizeInBits() - 1598 (FloatVT.getSizeInBits() - 8 * ByteOffset); 1599 assert(BitShift < LoadTy.getSizeInBits() && "Pointer advanced wrong?"); 1600 if (BitShift) 1601 SignBit = DAG.getNode(ISD::SHL, dl, LoadTy, SignBit, 1602 DAG.getConstant(BitShift, dl, 1603 TLI.getShiftAmountTy(SignBit.getValueType()))); 1604 } 1605 } 1606 // Now get the sign bit proper, by seeing whether the value is negative. 1607 SignBit = DAG.getSetCC(dl, getSetCCResultType(SignBit.getValueType()), 1608 SignBit, 1609 DAG.getConstant(0, dl, SignBit.getValueType()), 1610 ISD::SETLT); 1611 // Get the absolute value of the result. 1612 SDValue AbsVal = DAG.getNode(ISD::FABS, dl, Tmp1.getValueType(), Tmp1); 1613 // Select between the nabs and abs value based on the sign bit of 1614 // the input. 1615 return DAG.getSelect(dl, AbsVal.getValueType(), SignBit, 1616 DAG.getNode(ISD::FNEG, dl, AbsVal.getValueType(), AbsVal), 1617 AbsVal); 1618 } 1619 1620 void SelectionDAGLegalize::ExpandDYNAMIC_STACKALLOC(SDNode* Node, 1621 SmallVectorImpl<SDValue> &Results) { 1622 unsigned SPReg = TLI.getStackPointerRegisterToSaveRestore(); 1623 assert(SPReg && "Target cannot require DYNAMIC_STACKALLOC expansion and" 1624 " not tell us which reg is the stack pointer!"); 1625 SDLoc dl(Node); 1626 EVT VT = Node->getValueType(0); 1627 SDValue Tmp1 = SDValue(Node, 0); 1628 SDValue Tmp2 = SDValue(Node, 1); 1629 SDValue Tmp3 = Node->getOperand(2); 1630 SDValue Chain = Tmp1.getOperand(0); 1631 1632 // Chain the dynamic stack allocation so that it doesn't modify the stack 1633 // pointer when other instructions are using the stack. 1634 Chain = DAG.getCALLSEQ_START(Chain, DAG.getIntPtrConstant(0, dl, true), dl); 1635 1636 SDValue Size = Tmp2.getOperand(1); 1637 SDValue SP = DAG.getCopyFromReg(Chain, dl, SPReg, VT); 1638 Chain = SP.getValue(1); 1639 unsigned Align = cast<ConstantSDNode>(Tmp3)->getZExtValue(); 1640 unsigned StackAlign = 1641 DAG.getSubtarget().getFrameLowering()->getStackAlignment(); 1642 Tmp1 = DAG.getNode(ISD::SUB, dl, VT, SP, Size); // Value 1643 if (Align > StackAlign) 1644 Tmp1 = DAG.getNode(ISD::AND, dl, VT, Tmp1, 1645 DAG.getConstant(-(uint64_t)Align, dl, VT)); 1646 Chain = DAG.getCopyToReg(Chain, dl, SPReg, Tmp1); // Output chain 1647 1648 Tmp2 = DAG.getCALLSEQ_END(Chain, DAG.getIntPtrConstant(0, dl, true), 1649 DAG.getIntPtrConstant(0, dl, true), SDValue(), dl); 1650 1651 Results.push_back(Tmp1); 1652 Results.push_back(Tmp2); 1653 } 1654 1655 /// Legalize a SETCC with given LHS and RHS and condition code CC on the current 1656 /// target. 1657 /// 1658 /// If the SETCC has been legalized using AND / OR, then the legalized node 1659 /// will be stored in LHS. RHS and CC will be set to SDValue(). NeedInvert 1660 /// will be set to false. 1661 /// 1662 /// If the SETCC has been legalized by using getSetCCSwappedOperands(), 1663 /// then the values of LHS and RHS will be swapped, CC will be set to the 1664 /// new condition, and NeedInvert will be set to false. 1665 /// 1666 /// If the SETCC has been legalized using the inverse condcode, then LHS and 1667 /// RHS will be unchanged, CC will set to the inverted condcode, and NeedInvert 1668 /// will be set to true. The caller must invert the result of the SETCC with 1669 /// SelectionDAG::getLogicalNOT() or take equivalent action to swap the effect 1670 /// of a true/false result. 1671 /// 1672 /// \returns true if the SetCC has been legalized, false if it hasn't. 1673 bool SelectionDAGLegalize::LegalizeSetCCCondCode(EVT VT, 1674 SDValue &LHS, SDValue &RHS, 1675 SDValue &CC, 1676 bool &NeedInvert, 1677 SDLoc dl) { 1678 MVT OpVT = LHS.getSimpleValueType(); 1679 ISD::CondCode CCCode = cast<CondCodeSDNode>(CC)->get(); 1680 NeedInvert = false; 1681 switch (TLI.getCondCodeAction(CCCode, OpVT)) { 1682 default: llvm_unreachable("Unknown condition code action!"); 1683 case TargetLowering::Legal: 1684 // Nothing to do. 1685 break; 1686 case TargetLowering::Expand: { 1687 ISD::CondCode InvCC = ISD::getSetCCSwappedOperands(CCCode); 1688 if (TLI.isCondCodeLegal(InvCC, OpVT)) { 1689 std::swap(LHS, RHS); 1690 CC = DAG.getCondCode(InvCC); 1691 return true; 1692 } 1693 ISD::CondCode CC1 = ISD::SETCC_INVALID, CC2 = ISD::SETCC_INVALID; 1694 unsigned Opc = 0; 1695 switch (CCCode) { 1696 default: llvm_unreachable("Don't know how to expand this condition!"); 1697 case ISD::SETO: 1698 assert(TLI.getCondCodeAction(ISD::SETOEQ, OpVT) 1699 == TargetLowering::Legal 1700 && "If SETO is expanded, SETOEQ must be legal!"); 1701 CC1 = ISD::SETOEQ; CC2 = ISD::SETOEQ; Opc = ISD::AND; break; 1702 case ISD::SETUO: 1703 assert(TLI.getCondCodeAction(ISD::SETUNE, OpVT) 1704 == TargetLowering::Legal 1705 && "If SETUO is expanded, SETUNE must be legal!"); 1706 CC1 = ISD::SETUNE; CC2 = ISD::SETUNE; Opc = ISD::OR; break; 1707 case ISD::SETOEQ: 1708 case ISD::SETOGT: 1709 case ISD::SETOGE: 1710 case ISD::SETOLT: 1711 case ISD::SETOLE: 1712 case ISD::SETONE: 1713 case ISD::SETUEQ: 1714 case ISD::SETUNE: 1715 case ISD::SETUGT: 1716 case ISD::SETUGE: 1717 case ISD::SETULT: 1718 case ISD::SETULE: 1719 // If we are floating point, assign and break, otherwise fall through. 1720 if (!OpVT.isInteger()) { 1721 // We can use the 4th bit to tell if we are the unordered 1722 // or ordered version of the opcode. 1723 CC2 = ((unsigned)CCCode & 0x8U) ? ISD::SETUO : ISD::SETO; 1724 Opc = ((unsigned)CCCode & 0x8U) ? ISD::OR : ISD::AND; 1725 CC1 = (ISD::CondCode)(((int)CCCode & 0x7) | 0x10); 1726 break; 1727 } 1728 // Fallthrough if we are unsigned integer. 1729 case ISD::SETLE: 1730 case ISD::SETGT: 1731 case ISD::SETGE: 1732 case ISD::SETLT: 1733 // We only support using the inverted operation, which is computed above 1734 // and not a different manner of supporting expanding these cases. 1735 llvm_unreachable("Don't know how to expand this condition!"); 1736 case ISD::SETNE: 1737 case ISD::SETEQ: 1738 // Try inverting the result of the inverse condition. 1739 InvCC = CCCode == ISD::SETEQ ? ISD::SETNE : ISD::SETEQ; 1740 if (TLI.isCondCodeLegal(InvCC, OpVT)) { 1741 CC = DAG.getCondCode(InvCC); 1742 NeedInvert = true; 1743 return true; 1744 } 1745 // If inverting the condition didn't work then we have no means to expand 1746 // the condition. 1747 llvm_unreachable("Don't know how to expand this condition!"); 1748 } 1749 1750 SDValue SetCC1, SetCC2; 1751 if (CCCode != ISD::SETO && CCCode != ISD::SETUO) { 1752 // If we aren't the ordered or unorder operation, 1753 // then the pattern is (LHS CC1 RHS) Opc (LHS CC2 RHS). 1754 SetCC1 = DAG.getSetCC(dl, VT, LHS, RHS, CC1); 1755 SetCC2 = DAG.getSetCC(dl, VT, LHS, RHS, CC2); 1756 } else { 1757 // Otherwise, the pattern is (LHS CC1 LHS) Opc (RHS CC2 RHS) 1758 SetCC1 = DAG.getSetCC(dl, VT, LHS, LHS, CC1); 1759 SetCC2 = DAG.getSetCC(dl, VT, RHS, RHS, CC2); 1760 } 1761 LHS = DAG.getNode(Opc, dl, VT, SetCC1, SetCC2); 1762 RHS = SDValue(); 1763 CC = SDValue(); 1764 return true; 1765 } 1766 } 1767 return false; 1768 } 1769 1770 /// Emit a store/load combination to the stack. This stores 1771 /// SrcOp to a stack slot of type SlotVT, truncating it if needed. It then does 1772 /// a load from the stack slot to DestVT, extending it if needed. 1773 /// The resultant code need not be legal. 1774 SDValue SelectionDAGLegalize::EmitStackConvert(SDValue SrcOp, 1775 EVT SlotVT, 1776 EVT DestVT, 1777 SDLoc dl) { 1778 // Create the stack frame object. 1779 unsigned SrcAlign = 1780 TLI.getDataLayout()->getPrefTypeAlignment(SrcOp.getValueType(). 1781 getTypeForEVT(*DAG.getContext())); 1782 SDValue FIPtr = DAG.CreateStackTemporary(SlotVT, SrcAlign); 1783 1784 FrameIndexSDNode *StackPtrFI = cast<FrameIndexSDNode>(FIPtr); 1785 int SPFI = StackPtrFI->getIndex(); 1786 MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(SPFI); 1787 1788 unsigned SrcSize = SrcOp.getValueType().getSizeInBits(); 1789 unsigned SlotSize = SlotVT.getSizeInBits(); 1790 unsigned DestSize = DestVT.getSizeInBits(); 1791 Type *DestType = DestVT.getTypeForEVT(*DAG.getContext()); 1792 unsigned DestAlign = TLI.getDataLayout()->getPrefTypeAlignment(DestType); 1793 1794 // Emit a store to the stack slot. Use a truncstore if the input value is 1795 // later than DestVT. 1796 SDValue Store; 1797 1798 if (SrcSize > SlotSize) 1799 Store = DAG.getTruncStore(DAG.getEntryNode(), dl, SrcOp, FIPtr, 1800 PtrInfo, SlotVT, false, false, SrcAlign); 1801 else { 1802 assert(SrcSize == SlotSize && "Invalid store"); 1803 Store = DAG.getStore(DAG.getEntryNode(), dl, SrcOp, FIPtr, 1804 PtrInfo, false, false, SrcAlign); 1805 } 1806 1807 // Result is a load from the stack slot. 1808 if (SlotSize == DestSize) 1809 return DAG.getLoad(DestVT, dl, Store, FIPtr, PtrInfo, 1810 false, false, false, DestAlign); 1811 1812 assert(SlotSize < DestSize && "Unknown extension!"); 1813 return DAG.getExtLoad(ISD::EXTLOAD, dl, DestVT, Store, FIPtr, 1814 PtrInfo, SlotVT, false, false, false, DestAlign); 1815 } 1816 1817 SDValue SelectionDAGLegalize::ExpandSCALAR_TO_VECTOR(SDNode *Node) { 1818 SDLoc dl(Node); 1819 // Create a vector sized/aligned stack slot, store the value to element #0, 1820 // then load the whole vector back out. 1821 SDValue StackPtr = DAG.CreateStackTemporary(Node->getValueType(0)); 1822 1823 FrameIndexSDNode *StackPtrFI = cast<FrameIndexSDNode>(StackPtr); 1824 int SPFI = StackPtrFI->getIndex(); 1825 1826 SDValue Ch = DAG.getTruncStore(DAG.getEntryNode(), dl, Node->getOperand(0), 1827 StackPtr, 1828 MachinePointerInfo::getFixedStack(SPFI), 1829 Node->getValueType(0).getVectorElementType(), 1830 false, false, 0); 1831 return DAG.getLoad(Node->getValueType(0), dl, Ch, StackPtr, 1832 MachinePointerInfo::getFixedStack(SPFI), 1833 false, false, false, 0); 1834 } 1835 1836 static bool 1837 ExpandBVWithShuffles(SDNode *Node, SelectionDAG &DAG, 1838 const TargetLowering &TLI, SDValue &Res) { 1839 unsigned NumElems = Node->getNumOperands(); 1840 SDLoc dl(Node); 1841 EVT VT = Node->getValueType(0); 1842 1843 // Try to group the scalars into pairs, shuffle the pairs together, then 1844 // shuffle the pairs of pairs together, etc. until the vector has 1845 // been built. This will work only if all of the necessary shuffle masks 1846 // are legal. 1847 1848 // We do this in two phases; first to check the legality of the shuffles, 1849 // and next, assuming that all shuffles are legal, to create the new nodes. 1850 for (int Phase = 0; Phase < 2; ++Phase) { 1851 SmallVector<std::pair<SDValue, SmallVector<int, 16> >, 16> IntermedVals, 1852 NewIntermedVals; 1853 for (unsigned i = 0; i < NumElems; ++i) { 1854 SDValue V = Node->getOperand(i); 1855 if (V.getOpcode() == ISD::UNDEF) 1856 continue; 1857 1858 SDValue Vec; 1859 if (Phase) 1860 Vec = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, VT, V); 1861 IntermedVals.push_back(std::make_pair(Vec, SmallVector<int, 16>(1, i))); 1862 } 1863 1864 while (IntermedVals.size() > 2) { 1865 NewIntermedVals.clear(); 1866 for (unsigned i = 0, e = (IntermedVals.size() & ~1u); i < e; i += 2) { 1867 // This vector and the next vector are shuffled together (simply to 1868 // append the one to the other). 1869 SmallVector<int, 16> ShuffleVec(NumElems, -1); 1870 1871 SmallVector<int, 16> FinalIndices; 1872 FinalIndices.reserve(IntermedVals[i].second.size() + 1873 IntermedVals[i+1].second.size()); 1874 1875 int k = 0; 1876 for (unsigned j = 0, f = IntermedVals[i].second.size(); j != f; 1877 ++j, ++k) { 1878 ShuffleVec[k] = j; 1879 FinalIndices.push_back(IntermedVals[i].second[j]); 1880 } 1881 for (unsigned j = 0, f = IntermedVals[i+1].second.size(); j != f; 1882 ++j, ++k) { 1883 ShuffleVec[k] = NumElems + j; 1884 FinalIndices.push_back(IntermedVals[i+1].second[j]); 1885 } 1886 1887 SDValue Shuffle; 1888 if (Phase) 1889 Shuffle = DAG.getVectorShuffle(VT, dl, IntermedVals[i].first, 1890 IntermedVals[i+1].first, 1891 ShuffleVec.data()); 1892 else if (!TLI.isShuffleMaskLegal(ShuffleVec, VT)) 1893 return false; 1894 NewIntermedVals.push_back( 1895 std::make_pair(Shuffle, std::move(FinalIndices))); 1896 } 1897 1898 // If we had an odd number of defined values, then append the last 1899 // element to the array of new vectors. 1900 if ((IntermedVals.size() & 1) != 0) 1901 NewIntermedVals.push_back(IntermedVals.back()); 1902 1903 IntermedVals.swap(NewIntermedVals); 1904 } 1905 1906 assert(IntermedVals.size() <= 2 && IntermedVals.size() > 0 && 1907 "Invalid number of intermediate vectors"); 1908 SDValue Vec1 = IntermedVals[0].first; 1909 SDValue Vec2; 1910 if (IntermedVals.size() > 1) 1911 Vec2 = IntermedVals[1].first; 1912 else if (Phase) 1913 Vec2 = DAG.getUNDEF(VT); 1914 1915 SmallVector<int, 16> ShuffleVec(NumElems, -1); 1916 for (unsigned i = 0, e = IntermedVals[0].second.size(); i != e; ++i) 1917 ShuffleVec[IntermedVals[0].second[i]] = i; 1918 for (unsigned i = 0, e = IntermedVals[1].second.size(); i != e; ++i) 1919 ShuffleVec[IntermedVals[1].second[i]] = NumElems + i; 1920 1921 if (Phase) 1922 Res = DAG.getVectorShuffle(VT, dl, Vec1, Vec2, ShuffleVec.data()); 1923 else if (!TLI.isShuffleMaskLegal(ShuffleVec, VT)) 1924 return false; 1925 } 1926 1927 return true; 1928 } 1929 1930 /// Expand a BUILD_VECTOR node on targets that don't 1931 /// support the operation, but do support the resultant vector type. 1932 SDValue SelectionDAGLegalize::ExpandBUILD_VECTOR(SDNode *Node) { 1933 unsigned NumElems = Node->getNumOperands(); 1934 SDValue Value1, Value2; 1935 SDLoc dl(Node); 1936 EVT VT = Node->getValueType(0); 1937 EVT OpVT = Node->getOperand(0).getValueType(); 1938 EVT EltVT = VT.getVectorElementType(); 1939 1940 // If the only non-undef value is the low element, turn this into a 1941 // SCALAR_TO_VECTOR node. If this is { X, X, X, X }, determine X. 1942 bool isOnlyLowElement = true; 1943 bool MoreThanTwoValues = false; 1944 bool isConstant = true; 1945 for (unsigned i = 0; i < NumElems; ++i) { 1946 SDValue V = Node->getOperand(i); 1947 if (V.getOpcode() == ISD::UNDEF) 1948 continue; 1949 if (i > 0) 1950 isOnlyLowElement = false; 1951 if (!isa<ConstantFPSDNode>(V) && !isa<ConstantSDNode>(V)) 1952 isConstant = false; 1953 1954 if (!Value1.getNode()) { 1955 Value1 = V; 1956 } else if (!Value2.getNode()) { 1957 if (V != Value1) 1958 Value2 = V; 1959 } else if (V != Value1 && V != Value2) { 1960 MoreThanTwoValues = true; 1961 } 1962 } 1963 1964 if (!Value1.getNode()) 1965 return DAG.getUNDEF(VT); 1966 1967 if (isOnlyLowElement) 1968 return DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, VT, Node->getOperand(0)); 1969 1970 // If all elements are constants, create a load from the constant pool. 1971 if (isConstant) { 1972 SmallVector<Constant*, 16> CV; 1973 for (unsigned i = 0, e = NumElems; i != e; ++i) { 1974 if (ConstantFPSDNode *V = 1975 dyn_cast<ConstantFPSDNode>(Node->getOperand(i))) { 1976 CV.push_back(const_cast<ConstantFP *>(V->getConstantFPValue())); 1977 } else if (ConstantSDNode *V = 1978 dyn_cast<ConstantSDNode>(Node->getOperand(i))) { 1979 if (OpVT==EltVT) 1980 CV.push_back(const_cast<ConstantInt *>(V->getConstantIntValue())); 1981 else { 1982 // If OpVT and EltVT don't match, EltVT is not legal and the 1983 // element values have been promoted/truncated earlier. Undo this; 1984 // we don't want a v16i8 to become a v16i32 for example. 1985 const ConstantInt *CI = V->getConstantIntValue(); 1986 CV.push_back(ConstantInt::get(EltVT.getTypeForEVT(*DAG.getContext()), 1987 CI->getZExtValue())); 1988 } 1989 } else { 1990 assert(Node->getOperand(i).getOpcode() == ISD::UNDEF); 1991 Type *OpNTy = EltVT.getTypeForEVT(*DAG.getContext()); 1992 CV.push_back(UndefValue::get(OpNTy)); 1993 } 1994 } 1995 Constant *CP = ConstantVector::get(CV); 1996 SDValue CPIdx = DAG.getConstantPool(CP, TLI.getPointerTy()); 1997 unsigned Alignment = cast<ConstantPoolSDNode>(CPIdx)->getAlignment(); 1998 return DAG.getLoad(VT, dl, DAG.getEntryNode(), CPIdx, 1999 MachinePointerInfo::getConstantPool(), 2000 false, false, false, Alignment); 2001 } 2002 2003 SmallSet<SDValue, 16> DefinedValues; 2004 for (unsigned i = 0; i < NumElems; ++i) { 2005 if (Node->getOperand(i).getOpcode() == ISD::UNDEF) 2006 continue; 2007 DefinedValues.insert(Node->getOperand(i)); 2008 } 2009 2010 if (TLI.shouldExpandBuildVectorWithShuffles(VT, DefinedValues.size())) { 2011 if (!MoreThanTwoValues) { 2012 SmallVector<int, 8> ShuffleVec(NumElems, -1); 2013 for (unsigned i = 0; i < NumElems; ++i) { 2014 SDValue V = Node->getOperand(i); 2015 if (V.getOpcode() == ISD::UNDEF) 2016 continue; 2017 ShuffleVec[i] = V == Value1 ? 0 : NumElems; 2018 } 2019 if (TLI.isShuffleMaskLegal(ShuffleVec, Node->getValueType(0))) { 2020 // Get the splatted value into the low element of a vector register. 2021 SDValue Vec1 = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, VT, Value1); 2022 SDValue Vec2; 2023 if (Value2.getNode()) 2024 Vec2 = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, VT, Value2); 2025 else 2026 Vec2 = DAG.getUNDEF(VT); 2027 2028 // Return shuffle(LowValVec, undef, <0,0,0,0>) 2029 return DAG.getVectorShuffle(VT, dl, Vec1, Vec2, ShuffleVec.data()); 2030 } 2031 } else { 2032 SDValue Res; 2033 if (ExpandBVWithShuffles(Node, DAG, TLI, Res)) 2034 return Res; 2035 } 2036 } 2037 2038 // Otherwise, we can't handle this case efficiently. 2039 return ExpandVectorBuildThroughStack(Node); 2040 } 2041 2042 // Expand a node into a call to a libcall. If the result value 2043 // does not fit into a register, return the lo part and set the hi part to the 2044 // by-reg argument. If it does fit into a single register, return the result 2045 // and leave the Hi part unset. 2046 SDValue SelectionDAGLegalize::ExpandLibCall(RTLIB::Libcall LC, SDNode *Node, 2047 bool isSigned) { 2048 TargetLowering::ArgListTy Args; 2049 TargetLowering::ArgListEntry Entry; 2050 for (unsigned i = 0, e = Node->getNumOperands(); i != e; ++i) { 2051 EVT ArgVT = Node->getOperand(i).getValueType(); 2052 Type *ArgTy = ArgVT.getTypeForEVT(*DAG.getContext()); 2053 Entry.Node = Node->getOperand(i); Entry.Ty = ArgTy; 2054 Entry.isSExt = isSigned; 2055 Entry.isZExt = !isSigned; 2056 Args.push_back(Entry); 2057 } 2058 SDValue Callee = DAG.getExternalSymbol(TLI.getLibcallName(LC), 2059 TLI.getPointerTy()); 2060 2061 Type *RetTy = Node->getValueType(0).getTypeForEVT(*DAG.getContext()); 2062 2063 // By default, the input chain to this libcall is the entry node of the 2064 // function. If the libcall is going to be emitted as a tail call then 2065 // TLI.isUsedByReturnOnly will change it to the right chain if the return 2066 // node which is being folded has a non-entry input chain. 2067 SDValue InChain = DAG.getEntryNode(); 2068 2069 // isTailCall may be true since the callee does not reference caller stack 2070 // frame. Check if it's in the right position. 2071 SDValue TCChain = InChain; 2072 bool isTailCall = TLI.isInTailCallPosition(DAG, Node, TCChain); 2073 if (isTailCall) 2074 InChain = TCChain; 2075 2076 TargetLowering::CallLoweringInfo CLI(DAG); 2077 CLI.setDebugLoc(SDLoc(Node)).setChain(InChain) 2078 .setCallee(TLI.getLibcallCallingConv(LC), RetTy, Callee, std::move(Args), 0) 2079 .setTailCall(isTailCall).setSExtResult(isSigned).setZExtResult(!isSigned); 2080 2081 std::pair<SDValue, SDValue> CallInfo = TLI.LowerCallTo(CLI); 2082 2083 if (!CallInfo.second.getNode()) 2084 // It's a tailcall, return the chain (which is the DAG root). 2085 return DAG.getRoot(); 2086 2087 return CallInfo.first; 2088 } 2089 2090 /// Generate a libcall taking the given operands as arguments 2091 /// and returning a result of type RetVT. 2092 SDValue SelectionDAGLegalize::ExpandLibCall(RTLIB::Libcall LC, EVT RetVT, 2093 const SDValue *Ops, unsigned NumOps, 2094 bool isSigned, SDLoc dl) { 2095 TargetLowering::ArgListTy Args; 2096 Args.reserve(NumOps); 2097 2098 TargetLowering::ArgListEntry Entry; 2099 for (unsigned i = 0; i != NumOps; ++i) { 2100 Entry.Node = Ops[i]; 2101 Entry.Ty = Entry.Node.getValueType().getTypeForEVT(*DAG.getContext()); 2102 Entry.isSExt = isSigned; 2103 Entry.isZExt = !isSigned; 2104 Args.push_back(Entry); 2105 } 2106 SDValue Callee = DAG.getExternalSymbol(TLI.getLibcallName(LC), 2107 TLI.getPointerTy()); 2108 2109 Type *RetTy = RetVT.getTypeForEVT(*DAG.getContext()); 2110 2111 TargetLowering::CallLoweringInfo CLI(DAG); 2112 CLI.setDebugLoc(dl).setChain(DAG.getEntryNode()) 2113 .setCallee(TLI.getLibcallCallingConv(LC), RetTy, Callee, std::move(Args), 0) 2114 .setSExtResult(isSigned).setZExtResult(!isSigned); 2115 2116 std::pair<SDValue,SDValue> CallInfo = TLI.LowerCallTo(CLI); 2117 2118 return CallInfo.first; 2119 } 2120 2121 // Expand a node into a call to a libcall. Similar to 2122 // ExpandLibCall except that the first operand is the in-chain. 2123 std::pair<SDValue, SDValue> 2124 SelectionDAGLegalize::ExpandChainLibCall(RTLIB::Libcall LC, 2125 SDNode *Node, 2126 bool isSigned) { 2127 SDValue InChain = Node->getOperand(0); 2128 2129 TargetLowering::ArgListTy Args; 2130 TargetLowering::ArgListEntry Entry; 2131 for (unsigned i = 1, e = Node->getNumOperands(); i != e; ++i) { 2132 EVT ArgVT = Node->getOperand(i).getValueType(); 2133 Type *ArgTy = ArgVT.getTypeForEVT(*DAG.getContext()); 2134 Entry.Node = Node->getOperand(i); 2135 Entry.Ty = ArgTy; 2136 Entry.isSExt = isSigned; 2137 Entry.isZExt = !isSigned; 2138 Args.push_back(Entry); 2139 } 2140 SDValue Callee = DAG.getExternalSymbol(TLI.getLibcallName(LC), 2141 TLI.getPointerTy()); 2142 2143 Type *RetTy = Node->getValueType(0).getTypeForEVT(*DAG.getContext()); 2144 2145 TargetLowering::CallLoweringInfo CLI(DAG); 2146 CLI.setDebugLoc(SDLoc(Node)).setChain(InChain) 2147 .setCallee(TLI.getLibcallCallingConv(LC), RetTy, Callee, std::move(Args), 0) 2148 .setSExtResult(isSigned).setZExtResult(!isSigned); 2149 2150 std::pair<SDValue, SDValue> CallInfo = TLI.LowerCallTo(CLI); 2151 2152 return CallInfo; 2153 } 2154 2155 SDValue SelectionDAGLegalize::ExpandFPLibCall(SDNode* Node, 2156 RTLIB::Libcall Call_F32, 2157 RTLIB::Libcall Call_F64, 2158 RTLIB::Libcall Call_F80, 2159 RTLIB::Libcall Call_F128, 2160 RTLIB::Libcall Call_PPCF128) { 2161 RTLIB::Libcall LC; 2162 switch (Node->getSimpleValueType(0).SimpleTy) { 2163 default: llvm_unreachable("Unexpected request for libcall!"); 2164 case MVT::f32: LC = Call_F32; break; 2165 case MVT::f64: LC = Call_F64; break; 2166 case MVT::f80: LC = Call_F80; break; 2167 case MVT::f128: LC = Call_F128; break; 2168 case MVT::ppcf128: LC = Call_PPCF128; break; 2169 } 2170 return ExpandLibCall(LC, Node, false); 2171 } 2172 2173 SDValue SelectionDAGLegalize::ExpandIntLibCall(SDNode* Node, bool isSigned, 2174 RTLIB::Libcall Call_I8, 2175 RTLIB::Libcall Call_I16, 2176 RTLIB::Libcall Call_I32, 2177 RTLIB::Libcall Call_I64, 2178 RTLIB::Libcall Call_I128) { 2179 RTLIB::Libcall LC; 2180 switch (Node->getSimpleValueType(0).SimpleTy) { 2181 default: llvm_unreachable("Unexpected request for libcall!"); 2182 case MVT::i8: LC = Call_I8; break; 2183 case MVT::i16: LC = Call_I16; break; 2184 case MVT::i32: LC = Call_I32; break; 2185 case MVT::i64: LC = Call_I64; break; 2186 case MVT::i128: LC = Call_I128; break; 2187 } 2188 return ExpandLibCall(LC, Node, isSigned); 2189 } 2190 2191 /// Return true if divmod libcall is available. 2192 static bool isDivRemLibcallAvailable(SDNode *Node, bool isSigned, 2193 const TargetLowering &TLI) { 2194 RTLIB::Libcall LC; 2195 switch (Node->getSimpleValueType(0).SimpleTy) { 2196 default: llvm_unreachable("Unexpected request for libcall!"); 2197 case MVT::i8: LC= isSigned ? RTLIB::SDIVREM_I8 : RTLIB::UDIVREM_I8; break; 2198 case MVT::i16: LC= isSigned ? RTLIB::SDIVREM_I16 : RTLIB::UDIVREM_I16; break; 2199 case MVT::i32: LC= isSigned ? RTLIB::SDIVREM_I32 : RTLIB::UDIVREM_I32; break; 2200 case MVT::i64: LC= isSigned ? RTLIB::SDIVREM_I64 : RTLIB::UDIVREM_I64; break; 2201 case MVT::i128: LC= isSigned ? RTLIB::SDIVREM_I128:RTLIB::UDIVREM_I128; break; 2202 } 2203 2204 return TLI.getLibcallName(LC) != nullptr; 2205 } 2206 2207 /// Only issue divrem libcall if both quotient and remainder are needed. 2208 static bool useDivRem(SDNode *Node, bool isSigned, bool isDIV) { 2209 // The other use might have been replaced with a divrem already. 2210 unsigned DivRemOpc = isSigned ? ISD::SDIVREM : ISD::UDIVREM; 2211 unsigned OtherOpcode = 0; 2212 if (isSigned) 2213 OtherOpcode = isDIV ? ISD::SREM : ISD::SDIV; 2214 else 2215 OtherOpcode = isDIV ? ISD::UREM : ISD::UDIV; 2216 2217 SDValue Op0 = Node->getOperand(0); 2218 SDValue Op1 = Node->getOperand(1); 2219 for (SDNode::use_iterator UI = Op0.getNode()->use_begin(), 2220 UE = Op0.getNode()->use_end(); UI != UE; ++UI) { 2221 SDNode *User = *UI; 2222 if (User == Node) 2223 continue; 2224 if ((User->getOpcode() == OtherOpcode || User->getOpcode() == DivRemOpc) && 2225 User->getOperand(0) == Op0 && 2226 User->getOperand(1) == Op1) 2227 return true; 2228 } 2229 return false; 2230 } 2231 2232 /// Issue libcalls to __{u}divmod to compute div / rem pairs. 2233 void 2234 SelectionDAGLegalize::ExpandDivRemLibCall(SDNode *Node, 2235 SmallVectorImpl<SDValue> &Results) { 2236 unsigned Opcode = Node->getOpcode(); 2237 bool isSigned = Opcode == ISD::SDIVREM; 2238 2239 RTLIB::Libcall LC; 2240 switch (Node->getSimpleValueType(0).SimpleTy) { 2241 default: llvm_unreachable("Unexpected request for libcall!"); 2242 case MVT::i8: LC= isSigned ? RTLIB::SDIVREM_I8 : RTLIB::UDIVREM_I8; break; 2243 case MVT::i16: LC= isSigned ? RTLIB::SDIVREM_I16 : RTLIB::UDIVREM_I16; break; 2244 case MVT::i32: LC= isSigned ? RTLIB::SDIVREM_I32 : RTLIB::UDIVREM_I32; break; 2245 case MVT::i64: LC= isSigned ? RTLIB::SDIVREM_I64 : RTLIB::UDIVREM_I64; break; 2246 case MVT::i128: LC= isSigned ? RTLIB::SDIVREM_I128:RTLIB::UDIVREM_I128; break; 2247 } 2248 2249 // The input chain to this libcall is the entry node of the function. 2250 // Legalizing the call will automatically add the previous call to the 2251 // dependence. 2252 SDValue InChain = DAG.getEntryNode(); 2253 2254 EVT RetVT = Node->getValueType(0); 2255 Type *RetTy = RetVT.getTypeForEVT(*DAG.getContext()); 2256 2257 TargetLowering::ArgListTy Args; 2258 TargetLowering::ArgListEntry Entry; 2259 for (unsigned i = 0, e = Node->getNumOperands(); i != e; ++i) { 2260 EVT ArgVT = Node->getOperand(i).getValueType(); 2261 Type *ArgTy = ArgVT.getTypeForEVT(*DAG.getContext()); 2262 Entry.Node = Node->getOperand(i); Entry.Ty = ArgTy; 2263 Entry.isSExt = isSigned; 2264 Entry.isZExt = !isSigned; 2265 Args.push_back(Entry); 2266 } 2267 2268 // Also pass the return address of the remainder. 2269 SDValue FIPtr = DAG.CreateStackTemporary(RetVT); 2270 Entry.Node = FIPtr; 2271 Entry.Ty = RetTy->getPointerTo(); 2272 Entry.isSExt = isSigned; 2273 Entry.isZExt = !isSigned; 2274 Args.push_back(Entry); 2275 2276 SDValue Callee = DAG.getExternalSymbol(TLI.getLibcallName(LC), 2277 TLI.getPointerTy()); 2278 2279 SDLoc dl(Node); 2280 TargetLowering::CallLoweringInfo CLI(DAG); 2281 CLI.setDebugLoc(dl).setChain(InChain) 2282 .setCallee(TLI.getLibcallCallingConv(LC), RetTy, Callee, std::move(Args), 0) 2283 .setSExtResult(isSigned).setZExtResult(!isSigned); 2284 2285 std::pair<SDValue, SDValue> CallInfo = TLI.LowerCallTo(CLI); 2286 2287 // Remainder is loaded back from the stack frame. 2288 SDValue Rem = DAG.getLoad(RetVT, dl, CallInfo.second, FIPtr, 2289 MachinePointerInfo(), false, false, false, 0); 2290 Results.push_back(CallInfo.first); 2291 Results.push_back(Rem); 2292 } 2293 2294 /// Return true if sincos libcall is available. 2295 static bool isSinCosLibcallAvailable(SDNode *Node, const TargetLowering &TLI) { 2296 RTLIB::Libcall LC; 2297 switch (Node->getSimpleValueType(0).SimpleTy) { 2298 default: llvm_unreachable("Unexpected request for libcall!"); 2299 case MVT::f32: LC = RTLIB::SINCOS_F32; break; 2300 case MVT::f64: LC = RTLIB::SINCOS_F64; break; 2301 case MVT::f80: LC = RTLIB::SINCOS_F80; break; 2302 case MVT::f128: LC = RTLIB::SINCOS_F128; break; 2303 case MVT::ppcf128: LC = RTLIB::SINCOS_PPCF128; break; 2304 } 2305 return TLI.getLibcallName(LC) != nullptr; 2306 } 2307 2308 /// Return true if sincos libcall is available and can be used to combine sin 2309 /// and cos. 2310 static bool canCombineSinCosLibcall(SDNode *Node, const TargetLowering &TLI, 2311 const TargetMachine &TM) { 2312 if (!isSinCosLibcallAvailable(Node, TLI)) 2313 return false; 2314 // GNU sin/cos functions set errno while sincos does not. Therefore 2315 // combining sin and cos is only safe if unsafe-fpmath is enabled. 2316 bool isGNU = Triple(TM.getTargetTriple()).getEnvironment() == Triple::GNU; 2317 if (isGNU && !TM.Options.UnsafeFPMath) 2318 return false; 2319 return true; 2320 } 2321 2322 /// Only issue sincos libcall if both sin and cos are needed. 2323 static bool useSinCos(SDNode *Node) { 2324 unsigned OtherOpcode = Node->getOpcode() == ISD::FSIN 2325 ? ISD::FCOS : ISD::FSIN; 2326 2327 SDValue Op0 = Node->getOperand(0); 2328 for (SDNode::use_iterator UI = Op0.getNode()->use_begin(), 2329 UE = Op0.getNode()->use_end(); UI != UE; ++UI) { 2330 SDNode *User = *UI; 2331 if (User == Node) 2332 continue; 2333 // The other user might have been turned into sincos already. 2334 if (User->getOpcode() == OtherOpcode || User->getOpcode() == ISD::FSINCOS) 2335 return true; 2336 } 2337 return false; 2338 } 2339 2340 /// Issue libcalls to sincos to compute sin / cos pairs. 2341 void 2342 SelectionDAGLegalize::ExpandSinCosLibCall(SDNode *Node, 2343 SmallVectorImpl<SDValue> &Results) { 2344 RTLIB::Libcall LC; 2345 switch (Node->getSimpleValueType(0).SimpleTy) { 2346 default: llvm_unreachable("Unexpected request for libcall!"); 2347 case MVT::f32: LC = RTLIB::SINCOS_F32; break; 2348 case MVT::f64: LC = RTLIB::SINCOS_F64; break; 2349 case MVT::f80: LC = RTLIB::SINCOS_F80; break; 2350 case MVT::f128: LC = RTLIB::SINCOS_F128; break; 2351 case MVT::ppcf128: LC = RTLIB::SINCOS_PPCF128; break; 2352 } 2353 2354 // The input chain to this libcall is the entry node of the function. 2355 // Legalizing the call will automatically add the previous call to the 2356 // dependence. 2357 SDValue InChain = DAG.getEntryNode(); 2358 2359 EVT RetVT = Node->getValueType(0); 2360 Type *RetTy = RetVT.getTypeForEVT(*DAG.getContext()); 2361 2362 TargetLowering::ArgListTy Args; 2363 TargetLowering::ArgListEntry Entry; 2364 2365 // Pass the argument. 2366 Entry.Node = Node->getOperand(0); 2367 Entry.Ty = RetTy; 2368 Entry.isSExt = false; 2369 Entry.isZExt = false; 2370 Args.push_back(Entry); 2371 2372 // Pass the return address of sin. 2373 SDValue SinPtr = DAG.CreateStackTemporary(RetVT); 2374 Entry.Node = SinPtr; 2375 Entry.Ty = RetTy->getPointerTo(); 2376 Entry.isSExt = false; 2377 Entry.isZExt = false; 2378 Args.push_back(Entry); 2379 2380 // Also pass the return address of the cos. 2381 SDValue CosPtr = DAG.CreateStackTemporary(RetVT); 2382 Entry.Node = CosPtr; 2383 Entry.Ty = RetTy->getPointerTo(); 2384 Entry.isSExt = false; 2385 Entry.isZExt = false; 2386 Args.push_back(Entry); 2387 2388 SDValue Callee = DAG.getExternalSymbol(TLI.getLibcallName(LC), 2389 TLI.getPointerTy()); 2390 2391 SDLoc dl(Node); 2392 TargetLowering::CallLoweringInfo CLI(DAG); 2393 CLI.setDebugLoc(dl).setChain(InChain) 2394 .setCallee(TLI.getLibcallCallingConv(LC), 2395 Type::getVoidTy(*DAG.getContext()), Callee, std::move(Args), 0); 2396 2397 std::pair<SDValue, SDValue> CallInfo = TLI.LowerCallTo(CLI); 2398 2399 Results.push_back(DAG.getLoad(RetVT, dl, CallInfo.second, SinPtr, 2400 MachinePointerInfo(), false, false, false, 0)); 2401 Results.push_back(DAG.getLoad(RetVT, dl, CallInfo.second, CosPtr, 2402 MachinePointerInfo(), false, false, false, 0)); 2403 } 2404 2405 /// This function is responsible for legalizing a 2406 /// INT_TO_FP operation of the specified operand when the target requests that 2407 /// we expand it. At this point, we know that the result and operand types are 2408 /// legal for the target. 2409 SDValue SelectionDAGLegalize::ExpandLegalINT_TO_FP(bool isSigned, 2410 SDValue Op0, 2411 EVT DestVT, 2412 SDLoc dl) { 2413 if (Op0.getValueType() == MVT::i32 && TLI.isTypeLegal(MVT::f64)) { 2414 // simple 32-bit [signed|unsigned] integer to float/double expansion 2415 2416 // Get the stack frame index of a 8 byte buffer. 2417 SDValue StackSlot = DAG.CreateStackTemporary(MVT::f64); 2418 2419 // word offset constant for Hi/Lo address computation 2420 SDValue WordOff = DAG.getConstant(sizeof(int), dl, 2421 StackSlot.getValueType()); 2422 // set up Hi and Lo (into buffer) address based on endian 2423 SDValue Hi = StackSlot; 2424 SDValue Lo = DAG.getNode(ISD::ADD, dl, StackSlot.getValueType(), 2425 StackSlot, WordOff); 2426 if (TLI.isLittleEndian()) 2427 std::swap(Hi, Lo); 2428 2429 // if signed map to unsigned space 2430 SDValue Op0Mapped; 2431 if (isSigned) { 2432 // constant used to invert sign bit (signed to unsigned mapping) 2433 SDValue SignBit = DAG.getConstant(0x80000000u, dl, MVT::i32); 2434 Op0Mapped = DAG.getNode(ISD::XOR, dl, MVT::i32, Op0, SignBit); 2435 } else { 2436 Op0Mapped = Op0; 2437 } 2438 // store the lo of the constructed double - based on integer input 2439 SDValue Store1 = DAG.getStore(DAG.getEntryNode(), dl, 2440 Op0Mapped, Lo, MachinePointerInfo(), 2441 false, false, 0); 2442 // initial hi portion of constructed double 2443 SDValue InitialHi = DAG.getConstant(0x43300000u, dl, MVT::i32); 2444 // store the hi of the constructed double - biased exponent 2445 SDValue Store2 = DAG.getStore(Store1, dl, InitialHi, Hi, 2446 MachinePointerInfo(), 2447 false, false, 0); 2448 // load the constructed double 2449 SDValue Load = DAG.getLoad(MVT::f64, dl, Store2, StackSlot, 2450 MachinePointerInfo(), false, false, false, 0); 2451 // FP constant to bias correct the final result 2452 SDValue Bias = DAG.getConstantFP(isSigned ? 2453 BitsToDouble(0x4330000080000000ULL) : 2454 BitsToDouble(0x4330000000000000ULL), 2455 dl, MVT::f64); 2456 // subtract the bias 2457 SDValue Sub = DAG.getNode(ISD::FSUB, dl, MVT::f64, Load, Bias); 2458 // final result 2459 SDValue Result; 2460 // handle final rounding 2461 if (DestVT == MVT::f64) { 2462 // do nothing 2463 Result = Sub; 2464 } else if (DestVT.bitsLT(MVT::f64)) { 2465 Result = DAG.getNode(ISD::FP_ROUND, dl, DestVT, Sub, 2466 DAG.getIntPtrConstant(0, dl)); 2467 } else if (DestVT.bitsGT(MVT::f64)) { 2468 Result = DAG.getNode(ISD::FP_EXTEND, dl, DestVT, Sub); 2469 } 2470 return Result; 2471 } 2472 assert(!isSigned && "Legalize cannot Expand SINT_TO_FP for i64 yet"); 2473 // Code below here assumes !isSigned without checking again. 2474 2475 // Implementation of unsigned i64 to f64 following the algorithm in 2476 // __floatundidf in compiler_rt. This implementation has the advantage 2477 // of performing rounding correctly, both in the default rounding mode 2478 // and in all alternate rounding modes. 2479 // TODO: Generalize this for use with other types. 2480 if (Op0.getValueType() == MVT::i64 && DestVT == MVT::f64) { 2481 SDValue TwoP52 = 2482 DAG.getConstant(UINT64_C(0x4330000000000000), dl, MVT::i64); 2483 SDValue TwoP84PlusTwoP52 = 2484 DAG.getConstantFP(BitsToDouble(UINT64_C(0x4530000000100000)), dl, 2485 MVT::f64); 2486 SDValue TwoP84 = 2487 DAG.getConstant(UINT64_C(0x4530000000000000), dl, MVT::i64); 2488 2489 SDValue Lo = DAG.getZeroExtendInReg(Op0, dl, MVT::i32); 2490 SDValue Hi = DAG.getNode(ISD::SRL, dl, MVT::i64, Op0, 2491 DAG.getConstant(32, dl, MVT::i64)); 2492 SDValue LoOr = DAG.getNode(ISD::OR, dl, MVT::i64, Lo, TwoP52); 2493 SDValue HiOr = DAG.getNode(ISD::OR, dl, MVT::i64, Hi, TwoP84); 2494 SDValue LoFlt = DAG.getNode(ISD::BITCAST, dl, MVT::f64, LoOr); 2495 SDValue HiFlt = DAG.getNode(ISD::BITCAST, dl, MVT::f64, HiOr); 2496 SDValue HiSub = DAG.getNode(ISD::FSUB, dl, MVT::f64, HiFlt, 2497 TwoP84PlusTwoP52); 2498 return DAG.getNode(ISD::FADD, dl, MVT::f64, LoFlt, HiSub); 2499 } 2500 2501 // Implementation of unsigned i64 to f32. 2502 // TODO: Generalize this for use with other types. 2503 if (Op0.getValueType() == MVT::i64 && DestVT == MVT::f32) { 2504 // For unsigned conversions, convert them to signed conversions using the 2505 // algorithm from the x86_64 __floatundidf in compiler_rt. 2506 if (!isSigned) { 2507 SDValue Fast = DAG.getNode(ISD::SINT_TO_FP, dl, MVT::f32, Op0); 2508 2509 SDValue ShiftConst = 2510 DAG.getConstant(1, dl, TLI.getShiftAmountTy(Op0.getValueType())); 2511 SDValue Shr = DAG.getNode(ISD::SRL, dl, MVT::i64, Op0, ShiftConst); 2512 SDValue AndConst = DAG.getConstant(1, dl, MVT::i64); 2513 SDValue And = DAG.getNode(ISD::AND, dl, MVT::i64, Op0, AndConst); 2514 SDValue Or = DAG.getNode(ISD::OR, dl, MVT::i64, And, Shr); 2515 2516 SDValue SignCvt = DAG.getNode(ISD::SINT_TO_FP, dl, MVT::f32, Or); 2517 SDValue Slow = DAG.getNode(ISD::FADD, dl, MVT::f32, SignCvt, SignCvt); 2518 2519 // TODO: This really should be implemented using a branch rather than a 2520 // select. We happen to get lucky and machinesink does the right 2521 // thing most of the time. This would be a good candidate for a 2522 //pseudo-op, or, even better, for whole-function isel. 2523 SDValue SignBitTest = DAG.getSetCC(dl, getSetCCResultType(MVT::i64), 2524 Op0, DAG.getConstant(0, dl, MVT::i64), ISD::SETLT); 2525 return DAG.getSelect(dl, MVT::f32, SignBitTest, Slow, Fast); 2526 } 2527 2528 // Otherwise, implement the fully general conversion. 2529 2530 SDValue And = DAG.getNode(ISD::AND, dl, MVT::i64, Op0, 2531 DAG.getConstant(UINT64_C(0xfffffffffffff800), dl, MVT::i64)); 2532 SDValue Or = DAG.getNode(ISD::OR, dl, MVT::i64, And, 2533 DAG.getConstant(UINT64_C(0x800), dl, MVT::i64)); 2534 SDValue And2 = DAG.getNode(ISD::AND, dl, MVT::i64, Op0, 2535 DAG.getConstant(UINT64_C(0x7ff), dl, MVT::i64)); 2536 SDValue Ne = DAG.getSetCC(dl, getSetCCResultType(MVT::i64), And2, 2537 DAG.getConstant(UINT64_C(0), dl, MVT::i64), 2538 ISD::SETNE); 2539 SDValue Sel = DAG.getSelect(dl, MVT::i64, Ne, Or, Op0); 2540 SDValue Ge = DAG.getSetCC(dl, getSetCCResultType(MVT::i64), Op0, 2541 DAG.getConstant(UINT64_C(0x0020000000000000), dl, 2542 MVT::i64), 2543 ISD::SETUGE); 2544 SDValue Sel2 = DAG.getSelect(dl, MVT::i64, Ge, Sel, Op0); 2545 EVT SHVT = TLI.getShiftAmountTy(Sel2.getValueType()); 2546 2547 SDValue Sh = DAG.getNode(ISD::SRL, dl, MVT::i64, Sel2, 2548 DAG.getConstant(32, dl, SHVT)); 2549 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, dl, MVT::i32, Sh); 2550 SDValue Fcvt = DAG.getNode(ISD::UINT_TO_FP, dl, MVT::f64, Trunc); 2551 SDValue TwoP32 = 2552 DAG.getConstantFP(BitsToDouble(UINT64_C(0x41f0000000000000)), dl, 2553 MVT::f64); 2554 SDValue Fmul = DAG.getNode(ISD::FMUL, dl, MVT::f64, TwoP32, Fcvt); 2555 SDValue Lo = DAG.getNode(ISD::TRUNCATE, dl, MVT::i32, Sel2); 2556 SDValue Fcvt2 = DAG.getNode(ISD::UINT_TO_FP, dl, MVT::f64, Lo); 2557 SDValue Fadd = DAG.getNode(ISD::FADD, dl, MVT::f64, Fmul, Fcvt2); 2558 return DAG.getNode(ISD::FP_ROUND, dl, MVT::f32, Fadd, 2559 DAG.getIntPtrConstant(0, dl)); 2560 } 2561 2562 SDValue Tmp1 = DAG.getNode(ISD::SINT_TO_FP, dl, DestVT, Op0); 2563 2564 SDValue SignSet = DAG.getSetCC(dl, getSetCCResultType(Op0.getValueType()), 2565 Op0, 2566 DAG.getConstant(0, dl, Op0.getValueType()), 2567 ISD::SETLT); 2568 SDValue Zero = DAG.getIntPtrConstant(0, dl), 2569 Four = DAG.getIntPtrConstant(4, dl); 2570 SDValue CstOffset = DAG.getSelect(dl, Zero.getValueType(), 2571 SignSet, Four, Zero); 2572 2573 // If the sign bit of the integer is set, the large number will be treated 2574 // as a negative number. To counteract this, the dynamic code adds an 2575 // offset depending on the data type. 2576 uint64_t FF; 2577 switch (Op0.getSimpleValueType().SimpleTy) { 2578 default: llvm_unreachable("Unsupported integer type!"); 2579 case MVT::i8 : FF = 0x43800000ULL; break; // 2^8 (as a float) 2580 case MVT::i16: FF = 0x47800000ULL; break; // 2^16 (as a float) 2581 case MVT::i32: FF = 0x4F800000ULL; break; // 2^32 (as a float) 2582 case MVT::i64: FF = 0x5F800000ULL; break; // 2^64 (as a float) 2583 } 2584 if (TLI.isLittleEndian()) FF <<= 32; 2585 Constant *FudgeFactor = ConstantInt::get( 2586 Type::getInt64Ty(*DAG.getContext()), FF); 2587 2588 SDValue CPIdx = DAG.getConstantPool(FudgeFactor, TLI.getPointerTy()); 2589 unsigned Alignment = cast<ConstantPoolSDNode>(CPIdx)->getAlignment(); 2590 CPIdx = DAG.getNode(ISD::ADD, dl, CPIdx.getValueType(), CPIdx, CstOffset); 2591 Alignment = std::min(Alignment, 4u); 2592 SDValue FudgeInReg; 2593 if (DestVT == MVT::f32) 2594 FudgeInReg = DAG.getLoad(MVT::f32, dl, DAG.getEntryNode(), CPIdx, 2595 MachinePointerInfo::getConstantPool(), 2596 false, false, false, Alignment); 2597 else { 2598 SDValue Load = DAG.getExtLoad(ISD::EXTLOAD, dl, DestVT, 2599 DAG.getEntryNode(), CPIdx, 2600 MachinePointerInfo::getConstantPool(), 2601 MVT::f32, false, false, false, Alignment); 2602 HandleSDNode Handle(Load); 2603 LegalizeOp(Load.getNode()); 2604 FudgeInReg = Handle.getValue(); 2605 } 2606 2607 return DAG.getNode(ISD::FADD, dl, DestVT, Tmp1, FudgeInReg); 2608 } 2609 2610 /// This function is responsible for legalizing a 2611 /// *INT_TO_FP operation of the specified operand when the target requests that 2612 /// we promote it. At this point, we know that the result and operand types are 2613 /// legal for the target, and that there is a legal UINT_TO_FP or SINT_TO_FP 2614 /// operation that takes a larger input. 2615 SDValue SelectionDAGLegalize::PromoteLegalINT_TO_FP(SDValue LegalOp, 2616 EVT DestVT, 2617 bool isSigned, 2618 SDLoc dl) { 2619 // First step, figure out the appropriate *INT_TO_FP operation to use. 2620 EVT NewInTy = LegalOp.getValueType(); 2621 2622 unsigned OpToUse = 0; 2623 2624 // Scan for the appropriate larger type to use. 2625 while (1) { 2626 NewInTy = (MVT::SimpleValueType)(NewInTy.getSimpleVT().SimpleTy+1); 2627 assert(NewInTy.isInteger() && "Ran out of possibilities!"); 2628 2629 // If the target supports SINT_TO_FP of this type, use it. 2630 if (TLI.isOperationLegalOrCustom(ISD::SINT_TO_FP, NewInTy)) { 2631 OpToUse = ISD::SINT_TO_FP; 2632 break; 2633 } 2634 if (isSigned) continue; 2635 2636 // If the target supports UINT_TO_FP of this type, use it. 2637 if (TLI.isOperationLegalOrCustom(ISD::UINT_TO_FP, NewInTy)) { 2638 OpToUse = ISD::UINT_TO_FP; 2639 break; 2640 } 2641 2642 // Otherwise, try a larger type. 2643 } 2644 2645 // Okay, we found the operation and type to use. Zero extend our input to the 2646 // desired type then run the operation on it. 2647 return DAG.getNode(OpToUse, dl, DestVT, 2648 DAG.getNode(isSigned ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND, 2649 dl, NewInTy, LegalOp)); 2650 } 2651 2652 /// This function is responsible for legalizing a 2653 /// FP_TO_*INT operation of the specified operand when the target requests that 2654 /// we promote it. At this point, we know that the result and operand types are 2655 /// legal for the target, and that there is a legal FP_TO_UINT or FP_TO_SINT 2656 /// operation that returns a larger result. 2657 SDValue SelectionDAGLegalize::PromoteLegalFP_TO_INT(SDValue LegalOp, 2658 EVT DestVT, 2659 bool isSigned, 2660 SDLoc dl) { 2661 // First step, figure out the appropriate FP_TO*INT operation to use. 2662 EVT NewOutTy = DestVT; 2663 2664 unsigned OpToUse = 0; 2665 2666 // Scan for the appropriate larger type to use. 2667 while (1) { 2668 NewOutTy = (MVT::SimpleValueType)(NewOutTy.getSimpleVT().SimpleTy+1); 2669 assert(NewOutTy.isInteger() && "Ran out of possibilities!"); 2670 2671 // A larger signed type can hold all unsigned values of the requested type, 2672 // so using FP_TO_SINT is valid 2673 if (TLI.isOperationLegalOrCustom(ISD::FP_TO_SINT, NewOutTy)) { 2674 OpToUse = ISD::FP_TO_SINT; 2675 break; 2676 } 2677 2678 // However, if the value may be < 0.0, we *must* use some FP_TO_SINT. 2679 if (!isSigned && TLI.isOperationLegalOrCustom(ISD::FP_TO_UINT, NewOutTy)) { 2680 OpToUse = ISD::FP_TO_UINT; 2681 break; 2682 } 2683 2684 // Otherwise, try a larger type. 2685 } 2686 2687 2688 // Okay, we found the operation and type to use. 2689 SDValue Operation = DAG.getNode(OpToUse, dl, NewOutTy, LegalOp); 2690 2691 // Truncate the result of the extended FP_TO_*INT operation to the desired 2692 // size. 2693 return DAG.getNode(ISD::TRUNCATE, dl, DestVT, Operation); 2694 } 2695 2696 /// Open code the operations for BSWAP of the specified operation. 2697 SDValue SelectionDAGLegalize::ExpandBSWAP(SDValue Op, SDLoc dl) { 2698 EVT VT = Op.getValueType(); 2699 EVT SHVT = TLI.getShiftAmountTy(VT); 2700 SDValue Tmp1, Tmp2, Tmp3, Tmp4, Tmp5, Tmp6, Tmp7, Tmp8; 2701 switch (VT.getSimpleVT().SimpleTy) { 2702 default: llvm_unreachable("Unhandled Expand type in BSWAP!"); 2703 case MVT::i16: 2704 Tmp2 = DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(8, dl, SHVT)); 2705 Tmp1 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(8, dl, SHVT)); 2706 return DAG.getNode(ISD::OR, dl, VT, Tmp1, Tmp2); 2707 case MVT::i32: 2708 Tmp4 = DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(24, dl, SHVT)); 2709 Tmp3 = DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(8, dl, SHVT)); 2710 Tmp2 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(8, dl, SHVT)); 2711 Tmp1 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(24, dl, SHVT)); 2712 Tmp3 = DAG.getNode(ISD::AND, dl, VT, Tmp3, 2713 DAG.getConstant(0xFF0000, dl, VT)); 2714 Tmp2 = DAG.getNode(ISD::AND, dl, VT, Tmp2, DAG.getConstant(0xFF00, dl, VT)); 2715 Tmp4 = DAG.getNode(ISD::OR, dl, VT, Tmp4, Tmp3); 2716 Tmp2 = DAG.getNode(ISD::OR, dl, VT, Tmp2, Tmp1); 2717 return DAG.getNode(ISD::OR, dl, VT, Tmp4, Tmp2); 2718 case MVT::i64: 2719 Tmp8 = DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(56, dl, SHVT)); 2720 Tmp7 = DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(40, dl, SHVT)); 2721 Tmp6 = DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(24, dl, SHVT)); 2722 Tmp5 = DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(8, dl, SHVT)); 2723 Tmp4 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(8, dl, SHVT)); 2724 Tmp3 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(24, dl, SHVT)); 2725 Tmp2 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(40, dl, SHVT)); 2726 Tmp1 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(56, dl, SHVT)); 2727 Tmp7 = DAG.getNode(ISD::AND, dl, VT, Tmp7, 2728 DAG.getConstant(255ULL<<48, dl, VT)); 2729 Tmp6 = DAG.getNode(ISD::AND, dl, VT, Tmp6, 2730 DAG.getConstant(255ULL<<40, dl, VT)); 2731 Tmp5 = DAG.getNode(ISD::AND, dl, VT, Tmp5, 2732 DAG.getConstant(255ULL<<32, dl, VT)); 2733 Tmp4 = DAG.getNode(ISD::AND, dl, VT, Tmp4, 2734 DAG.getConstant(255ULL<<24, dl, VT)); 2735 Tmp3 = DAG.getNode(ISD::AND, dl, VT, Tmp3, 2736 DAG.getConstant(255ULL<<16, dl, VT)); 2737 Tmp2 = DAG.getNode(ISD::AND, dl, VT, Tmp2, 2738 DAG.getConstant(255ULL<<8 , dl, VT)); 2739 Tmp8 = DAG.getNode(ISD::OR, dl, VT, Tmp8, Tmp7); 2740 Tmp6 = DAG.getNode(ISD::OR, dl, VT, Tmp6, Tmp5); 2741 Tmp4 = DAG.getNode(ISD::OR, dl, VT, Tmp4, Tmp3); 2742 Tmp2 = DAG.getNode(ISD::OR, dl, VT, Tmp2, Tmp1); 2743 Tmp8 = DAG.getNode(ISD::OR, dl, VT, Tmp8, Tmp6); 2744 Tmp4 = DAG.getNode(ISD::OR, dl, VT, Tmp4, Tmp2); 2745 return DAG.getNode(ISD::OR, dl, VT, Tmp8, Tmp4); 2746 } 2747 } 2748 2749 /// Expand the specified bitcount instruction into operations. 2750 SDValue SelectionDAGLegalize::ExpandBitCount(unsigned Opc, SDValue Op, 2751 SDLoc dl) { 2752 switch (Opc) { 2753 default: llvm_unreachable("Cannot expand this yet!"); 2754 case ISD::CTPOP: { 2755 EVT VT = Op.getValueType(); 2756 EVT ShVT = TLI.getShiftAmountTy(VT); 2757 unsigned Len = VT.getSizeInBits(); 2758 2759 assert(VT.isInteger() && Len <= 128 && Len % 8 == 0 && 2760 "CTPOP not implemented for this type."); 2761 2762 // This is the "best" algorithm from 2763 // http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel 2764 2765 SDValue Mask55 = DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x55)), 2766 dl, VT); 2767 SDValue Mask33 = DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x33)), 2768 dl, VT); 2769 SDValue Mask0F = DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x0F)), 2770 dl, VT); 2771 SDValue Mask01 = DAG.getConstant(APInt::getSplat(Len, APInt(8, 0x01)), 2772 dl, VT); 2773 2774 // v = v - ((v >> 1) & 0x55555555...) 2775 Op = DAG.getNode(ISD::SUB, dl, VT, Op, 2776 DAG.getNode(ISD::AND, dl, VT, 2777 DAG.getNode(ISD::SRL, dl, VT, Op, 2778 DAG.getConstant(1, dl, ShVT)), 2779 Mask55)); 2780 // v = (v & 0x33333333...) + ((v >> 2) & 0x33333333...) 2781 Op = DAG.getNode(ISD::ADD, dl, VT, 2782 DAG.getNode(ISD::AND, dl, VT, Op, Mask33), 2783 DAG.getNode(ISD::AND, dl, VT, 2784 DAG.getNode(ISD::SRL, dl, VT, Op, 2785 DAG.getConstant(2, dl, ShVT)), 2786 Mask33)); 2787 // v = (v + (v >> 4)) & 0x0F0F0F0F... 2788 Op = DAG.getNode(ISD::AND, dl, VT, 2789 DAG.getNode(ISD::ADD, dl, VT, Op, 2790 DAG.getNode(ISD::SRL, dl, VT, Op, 2791 DAG.getConstant(4, dl, ShVT))), 2792 Mask0F); 2793 // v = (v * 0x01010101...) >> (Len - 8) 2794 Op = DAG.getNode(ISD::SRL, dl, VT, 2795 DAG.getNode(ISD::MUL, dl, VT, Op, Mask01), 2796 DAG.getConstant(Len - 8, dl, ShVT)); 2797 2798 return Op; 2799 } 2800 case ISD::CTLZ_ZERO_UNDEF: 2801 // This trivially expands to CTLZ. 2802 return DAG.getNode(ISD::CTLZ, dl, Op.getValueType(), Op); 2803 case ISD::CTLZ: { 2804 // for now, we do this: 2805 // x = x | (x >> 1); 2806 // x = x | (x >> 2); 2807 // ... 2808 // x = x | (x >>16); 2809 // x = x | (x >>32); // for 64-bit input 2810 // return popcount(~x); 2811 // 2812 // Ref: "Hacker's Delight" by Henry Warren 2813 EVT VT = Op.getValueType(); 2814 EVT ShVT = TLI.getShiftAmountTy(VT); 2815 unsigned len = VT.getSizeInBits(); 2816 for (unsigned i = 0; (1U << i) <= (len / 2); ++i) { 2817 SDValue Tmp3 = DAG.getConstant(1ULL << i, dl, ShVT); 2818 Op = DAG.getNode(ISD::OR, dl, VT, Op, 2819 DAG.getNode(ISD::SRL, dl, VT, Op, Tmp3)); 2820 } 2821 Op = DAG.getNOT(dl, Op, VT); 2822 return DAG.getNode(ISD::CTPOP, dl, VT, Op); 2823 } 2824 case ISD::CTTZ_ZERO_UNDEF: 2825 // This trivially expands to CTTZ. 2826 return DAG.getNode(ISD::CTTZ, dl, Op.getValueType(), Op); 2827 case ISD::CTTZ: { 2828 // for now, we use: { return popcount(~x & (x - 1)); } 2829 // unless the target has ctlz but not ctpop, in which case we use: 2830 // { return 32 - nlz(~x & (x-1)); } 2831 // Ref: "Hacker's Delight" by Henry Warren 2832 EVT VT = Op.getValueType(); 2833 SDValue Tmp3 = DAG.getNode(ISD::AND, dl, VT, 2834 DAG.getNOT(dl, Op, VT), 2835 DAG.getNode(ISD::SUB, dl, VT, Op, 2836 DAG.getConstant(1, dl, VT))); 2837 // If ISD::CTLZ is legal and CTPOP isn't, then do that instead. 2838 if (!TLI.isOperationLegalOrCustom(ISD::CTPOP, VT) && 2839 TLI.isOperationLegalOrCustom(ISD::CTLZ, VT)) 2840 return DAG.getNode(ISD::SUB, dl, VT, 2841 DAG.getConstant(VT.getSizeInBits(), dl, VT), 2842 DAG.getNode(ISD::CTLZ, dl, VT, Tmp3)); 2843 return DAG.getNode(ISD::CTPOP, dl, VT, Tmp3); 2844 } 2845 } 2846 } 2847 2848 std::pair <SDValue, SDValue> SelectionDAGLegalize::ExpandAtomic(SDNode *Node) { 2849 unsigned Opc = Node->getOpcode(); 2850 MVT VT = cast<AtomicSDNode>(Node)->getMemoryVT().getSimpleVT(); 2851 RTLIB::Libcall LC = RTLIB::getATOMIC(Opc, VT); 2852 assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unexpected atomic op or value type!"); 2853 2854 return ExpandChainLibCall(LC, Node, false); 2855 } 2856 2857 void SelectionDAGLegalize::ExpandNode(SDNode *Node) { 2858 SmallVector<SDValue, 8> Results; 2859 SDLoc dl(Node); 2860 SDValue Tmp1, Tmp2, Tmp3, Tmp4; 2861 bool NeedInvert; 2862 switch (Node->getOpcode()) { 2863 case ISD::CTPOP: 2864 case ISD::CTLZ: 2865 case ISD::CTLZ_ZERO_UNDEF: 2866 case ISD::CTTZ: 2867 case ISD::CTTZ_ZERO_UNDEF: 2868 Tmp1 = ExpandBitCount(Node->getOpcode(), Node->getOperand(0), dl); 2869 Results.push_back(Tmp1); 2870 break; 2871 case ISD::BSWAP: 2872 Results.push_back(ExpandBSWAP(Node->getOperand(0), dl)); 2873 break; 2874 case ISD::FRAMEADDR: 2875 case ISD::RETURNADDR: 2876 case ISD::FRAME_TO_ARGS_OFFSET: 2877 Results.push_back(DAG.getConstant(0, dl, Node->getValueType(0))); 2878 break; 2879 case ISD::FLT_ROUNDS_: 2880 Results.push_back(DAG.getConstant(1, dl, Node->getValueType(0))); 2881 break; 2882 case ISD::EH_RETURN: 2883 case ISD::EH_LABEL: 2884 case ISD::PREFETCH: 2885 case ISD::VAEND: 2886 case ISD::EH_SJLJ_LONGJMP: 2887 // If the target didn't expand these, there's nothing to do, so just 2888 // preserve the chain and be done. 2889 Results.push_back(Node->getOperand(0)); 2890 break; 2891 case ISD::EH_SJLJ_SETJMP: 2892 // If the target didn't expand this, just return 'zero' and preserve the 2893 // chain. 2894 Results.push_back(DAG.getConstant(0, dl, MVT::i32)); 2895 Results.push_back(Node->getOperand(0)); 2896 break; 2897 case ISD::ATOMIC_FENCE: { 2898 // If the target didn't lower this, lower it to '__sync_synchronize()' call 2899 // FIXME: handle "fence singlethread" more efficiently. 2900 TargetLowering::ArgListTy Args; 2901 2902 TargetLowering::CallLoweringInfo CLI(DAG); 2903 CLI.setDebugLoc(dl).setChain(Node->getOperand(0)) 2904 .setCallee(CallingConv::C, Type::getVoidTy(*DAG.getContext()), 2905 DAG.getExternalSymbol("__sync_synchronize", 2906 TLI.getPointerTy()), std::move(Args), 0); 2907 2908 std::pair<SDValue, SDValue> CallResult = TLI.LowerCallTo(CLI); 2909 2910 Results.push_back(CallResult.second); 2911 break; 2912 } 2913 case ISD::ATOMIC_LOAD: { 2914 // There is no libcall for atomic load; fake it with ATOMIC_CMP_SWAP. 2915 SDValue Zero = DAG.getConstant(0, dl, Node->getValueType(0)); 2916 SDVTList VTs = DAG.getVTList(Node->getValueType(0), MVT::Other); 2917 SDValue Swap = DAG.getAtomicCmpSwap( 2918 ISD::ATOMIC_CMP_SWAP, dl, cast<AtomicSDNode>(Node)->getMemoryVT(), VTs, 2919 Node->getOperand(0), Node->getOperand(1), Zero, Zero, 2920 cast<AtomicSDNode>(Node)->getMemOperand(), 2921 cast<AtomicSDNode>(Node)->getOrdering(), 2922 cast<AtomicSDNode>(Node)->getOrdering(), 2923 cast<AtomicSDNode>(Node)->getSynchScope()); 2924 Results.push_back(Swap.getValue(0)); 2925 Results.push_back(Swap.getValue(1)); 2926 break; 2927 } 2928 case ISD::ATOMIC_STORE: { 2929 // There is no libcall for atomic store; fake it with ATOMIC_SWAP. 2930 SDValue Swap = DAG.getAtomic(ISD::ATOMIC_SWAP, dl, 2931 cast<AtomicSDNode>(Node)->getMemoryVT(), 2932 Node->getOperand(0), 2933 Node->getOperand(1), Node->getOperand(2), 2934 cast<AtomicSDNode>(Node)->getMemOperand(), 2935 cast<AtomicSDNode>(Node)->getOrdering(), 2936 cast<AtomicSDNode>(Node)->getSynchScope()); 2937 Results.push_back(Swap.getValue(1)); 2938 break; 2939 } 2940 // By default, atomic intrinsics are marked Legal and lowered. Targets 2941 // which don't support them directly, however, may want libcalls, in which 2942 // case they mark them Expand, and we get here. 2943 case ISD::ATOMIC_SWAP: 2944 case ISD::ATOMIC_LOAD_ADD: 2945 case ISD::ATOMIC_LOAD_SUB: 2946 case ISD::ATOMIC_LOAD_AND: 2947 case ISD::ATOMIC_LOAD_OR: 2948 case ISD::ATOMIC_LOAD_XOR: 2949 case ISD::ATOMIC_LOAD_NAND: 2950 case ISD::ATOMIC_LOAD_MIN: 2951 case ISD::ATOMIC_LOAD_MAX: 2952 case ISD::ATOMIC_LOAD_UMIN: 2953 case ISD::ATOMIC_LOAD_UMAX: 2954 case ISD::ATOMIC_CMP_SWAP: { 2955 std::pair<SDValue, SDValue> Tmp = ExpandAtomic(Node); 2956 Results.push_back(Tmp.first); 2957 Results.push_back(Tmp.second); 2958 break; 2959 } 2960 case ISD::ATOMIC_CMP_SWAP_WITH_SUCCESS: { 2961 // Expanding an ATOMIC_CMP_SWAP_WITH_SUCCESS produces an ATOMIC_CMP_SWAP and 2962 // splits out the success value as a comparison. Expanding the resulting 2963 // ATOMIC_CMP_SWAP will produce a libcall. 2964 SDVTList VTs = DAG.getVTList(Node->getValueType(0), MVT::Other); 2965 SDValue Res = DAG.getAtomicCmpSwap( 2966 ISD::ATOMIC_CMP_SWAP, dl, cast<AtomicSDNode>(Node)->getMemoryVT(), VTs, 2967 Node->getOperand(0), Node->getOperand(1), Node->getOperand(2), 2968 Node->getOperand(3), cast<MemSDNode>(Node)->getMemOperand(), 2969 cast<AtomicSDNode>(Node)->getSuccessOrdering(), 2970 cast<AtomicSDNode>(Node)->getFailureOrdering(), 2971 cast<AtomicSDNode>(Node)->getSynchScope()); 2972 2973 SDValue Success = DAG.getSetCC(SDLoc(Node), Node->getValueType(1), 2974 Res, Node->getOperand(2), ISD::SETEQ); 2975 2976 Results.push_back(Res.getValue(0)); 2977 Results.push_back(Success); 2978 Results.push_back(Res.getValue(1)); 2979 break; 2980 } 2981 case ISD::DYNAMIC_STACKALLOC: 2982 ExpandDYNAMIC_STACKALLOC(Node, Results); 2983 break; 2984 case ISD::MERGE_VALUES: 2985 for (unsigned i = 0; i < Node->getNumValues(); i++) 2986 Results.push_back(Node->getOperand(i)); 2987 break; 2988 case ISD::UNDEF: { 2989 EVT VT = Node->getValueType(0); 2990 if (VT.isInteger()) 2991 Results.push_back(DAG.getConstant(0, dl, VT)); 2992 else { 2993 assert(VT.isFloatingPoint() && "Unknown value type!"); 2994 Results.push_back(DAG.getConstantFP(0, dl, VT)); 2995 } 2996 break; 2997 } 2998 case ISD::TRAP: { 2999 // If this operation is not supported, lower it to 'abort()' call 3000 TargetLowering::ArgListTy Args; 3001 TargetLowering::CallLoweringInfo CLI(DAG); 3002 CLI.setDebugLoc(dl).setChain(Node->getOperand(0)) 3003 .setCallee(CallingConv::C, Type::getVoidTy(*DAG.getContext()), 3004 DAG.getExternalSymbol("abort", TLI.getPointerTy()), 3005 std::move(Args), 0); 3006 std::pair<SDValue, SDValue> CallResult = TLI.LowerCallTo(CLI); 3007 3008 Results.push_back(CallResult.second); 3009 break; 3010 } 3011 case ISD::FP_ROUND: 3012 case ISD::BITCAST: 3013 Tmp1 = EmitStackConvert(Node->getOperand(0), Node->getValueType(0), 3014 Node->getValueType(0), dl); 3015 Results.push_back(Tmp1); 3016 break; 3017 case ISD::FP_EXTEND: 3018 Tmp1 = EmitStackConvert(Node->getOperand(0), 3019 Node->getOperand(0).getValueType(), 3020 Node->getValueType(0), dl); 3021 Results.push_back(Tmp1); 3022 break; 3023 case ISD::SIGN_EXTEND_INREG: { 3024 // NOTE: we could fall back on load/store here too for targets without 3025 // SAR. However, it is doubtful that any exist. 3026 EVT ExtraVT = cast<VTSDNode>(Node->getOperand(1))->getVT(); 3027 EVT VT = Node->getValueType(0); 3028 EVT ShiftAmountTy = TLI.getShiftAmountTy(VT); 3029 if (VT.isVector()) 3030 ShiftAmountTy = VT; 3031 unsigned BitsDiff = VT.getScalarType().getSizeInBits() - 3032 ExtraVT.getScalarType().getSizeInBits(); 3033 SDValue ShiftCst = DAG.getConstant(BitsDiff, dl, ShiftAmountTy); 3034 Tmp1 = DAG.getNode(ISD::SHL, dl, Node->getValueType(0), 3035 Node->getOperand(0), ShiftCst); 3036 Tmp1 = DAG.getNode(ISD::SRA, dl, Node->getValueType(0), Tmp1, ShiftCst); 3037 Results.push_back(Tmp1); 3038 break; 3039 } 3040 case ISD::FP_ROUND_INREG: { 3041 // The only way we can lower this is to turn it into a TRUNCSTORE, 3042 // EXTLOAD pair, targeting a temporary location (a stack slot). 3043 3044 // NOTE: there is a choice here between constantly creating new stack 3045 // slots and always reusing the same one. We currently always create 3046 // new ones, as reuse may inhibit scheduling. 3047 EVT ExtraVT = cast<VTSDNode>(Node->getOperand(1))->getVT(); 3048 Tmp1 = EmitStackConvert(Node->getOperand(0), ExtraVT, 3049 Node->getValueType(0), dl); 3050 Results.push_back(Tmp1); 3051 break; 3052 } 3053 case ISD::SINT_TO_FP: 3054 case ISD::UINT_TO_FP: 3055 Tmp1 = ExpandLegalINT_TO_FP(Node->getOpcode() == ISD::SINT_TO_FP, 3056 Node->getOperand(0), Node->getValueType(0), dl); 3057 Results.push_back(Tmp1); 3058 break; 3059 case ISD::FP_TO_SINT: 3060 if (TLI.expandFP_TO_SINT(Node, Tmp1, DAG)) 3061 Results.push_back(Tmp1); 3062 break; 3063 case ISD::FP_TO_UINT: { 3064 SDValue True, False; 3065 EVT VT = Node->getOperand(0).getValueType(); 3066 EVT NVT = Node->getValueType(0); 3067 APFloat apf(DAG.EVTToAPFloatSemantics(VT), 3068 APInt::getNullValue(VT.getSizeInBits())); 3069 APInt x = APInt::getSignBit(NVT.getSizeInBits()); 3070 (void)apf.convertFromAPInt(x, false, APFloat::rmNearestTiesToEven); 3071 Tmp1 = DAG.getConstantFP(apf, dl, VT); 3072 Tmp2 = DAG.getSetCC(dl, getSetCCResultType(VT), 3073 Node->getOperand(0), 3074 Tmp1, ISD::SETLT); 3075 True = DAG.getNode(ISD::FP_TO_SINT, dl, NVT, Node->getOperand(0)); 3076 False = DAG.getNode(ISD::FP_TO_SINT, dl, NVT, 3077 DAG.getNode(ISD::FSUB, dl, VT, 3078 Node->getOperand(0), Tmp1)); 3079 False = DAG.getNode(ISD::XOR, dl, NVT, False, 3080 DAG.getConstant(x, dl, NVT)); 3081 Tmp1 = DAG.getSelect(dl, NVT, Tmp2, True, False); 3082 Results.push_back(Tmp1); 3083 break; 3084 } 3085 case ISD::VAARG: { 3086 const Value *V = cast<SrcValueSDNode>(Node->getOperand(2))->getValue(); 3087 EVT VT = Node->getValueType(0); 3088 Tmp1 = Node->getOperand(0); 3089 Tmp2 = Node->getOperand(1); 3090 unsigned Align = Node->getConstantOperandVal(3); 3091 3092 SDValue VAListLoad = DAG.getLoad(TLI.getPointerTy(), dl, Tmp1, Tmp2, 3093 MachinePointerInfo(V), 3094 false, false, false, 0); 3095 SDValue VAList = VAListLoad; 3096 3097 if (Align > TLI.getMinStackArgumentAlignment()) { 3098 assert(((Align & (Align-1)) == 0) && "Expected Align to be a power of 2"); 3099 3100 VAList = DAG.getNode(ISD::ADD, dl, VAList.getValueType(), VAList, 3101 DAG.getConstant(Align - 1, dl, 3102 VAList.getValueType())); 3103 3104 VAList = DAG.getNode(ISD::AND, dl, VAList.getValueType(), VAList, 3105 DAG.getConstant(-(int64_t)Align, dl, 3106 VAList.getValueType())); 3107 } 3108 3109 // Increment the pointer, VAList, to the next vaarg 3110 Tmp3 = DAG.getNode(ISD::ADD, dl, VAList.getValueType(), VAList, 3111 DAG.getConstant(TLI.getDataLayout()-> 3112 getTypeAllocSize(VT.getTypeForEVT(*DAG.getContext())), 3113 dl, 3114 VAList.getValueType())); 3115 // Store the incremented VAList to the legalized pointer 3116 Tmp3 = DAG.getStore(VAListLoad.getValue(1), dl, Tmp3, Tmp2, 3117 MachinePointerInfo(V), false, false, 0); 3118 // Load the actual argument out of the pointer VAList 3119 Results.push_back(DAG.getLoad(VT, dl, Tmp3, VAList, MachinePointerInfo(), 3120 false, false, false, 0)); 3121 Results.push_back(Results[0].getValue(1)); 3122 break; 3123 } 3124 case ISD::VACOPY: { 3125 // This defaults to loading a pointer from the input and storing it to the 3126 // output, returning the chain. 3127 const Value *VD = cast<SrcValueSDNode>(Node->getOperand(3))->getValue(); 3128 const Value *VS = cast<SrcValueSDNode>(Node->getOperand(4))->getValue(); 3129 Tmp1 = DAG.getLoad(TLI.getPointerTy(), dl, Node->getOperand(0), 3130 Node->getOperand(2), MachinePointerInfo(VS), 3131 false, false, false, 0); 3132 Tmp1 = DAG.getStore(Tmp1.getValue(1), dl, Tmp1, Node->getOperand(1), 3133 MachinePointerInfo(VD), false, false, 0); 3134 Results.push_back(Tmp1); 3135 break; 3136 } 3137 case ISD::EXTRACT_VECTOR_ELT: 3138 if (Node->getOperand(0).getValueType().getVectorNumElements() == 1) 3139 // This must be an access of the only element. Return it. 3140 Tmp1 = DAG.getNode(ISD::BITCAST, dl, Node->getValueType(0), 3141 Node->getOperand(0)); 3142 else 3143 Tmp1 = ExpandExtractFromVectorThroughStack(SDValue(Node, 0)); 3144 Results.push_back(Tmp1); 3145 break; 3146 case ISD::EXTRACT_SUBVECTOR: 3147 Results.push_back(ExpandExtractFromVectorThroughStack(SDValue(Node, 0))); 3148 break; 3149 case ISD::INSERT_SUBVECTOR: 3150 Results.push_back(ExpandInsertToVectorThroughStack(SDValue(Node, 0))); 3151 break; 3152 case ISD::CONCAT_VECTORS: { 3153 Results.push_back(ExpandVectorBuildThroughStack(Node)); 3154 break; 3155 } 3156 case ISD::SCALAR_TO_VECTOR: 3157 Results.push_back(ExpandSCALAR_TO_VECTOR(Node)); 3158 break; 3159 case ISD::INSERT_VECTOR_ELT: 3160 Results.push_back(ExpandINSERT_VECTOR_ELT(Node->getOperand(0), 3161 Node->getOperand(1), 3162 Node->getOperand(2), dl)); 3163 break; 3164 case ISD::VECTOR_SHUFFLE: { 3165 SmallVector<int, 32> NewMask; 3166 ArrayRef<int> Mask = cast<ShuffleVectorSDNode>(Node)->getMask(); 3167 3168 EVT VT = Node->getValueType(0); 3169 EVT EltVT = VT.getVectorElementType(); 3170 SDValue Op0 = Node->getOperand(0); 3171 SDValue Op1 = Node->getOperand(1); 3172 if (!TLI.isTypeLegal(EltVT)) { 3173 3174 EVT NewEltVT = TLI.getTypeToTransformTo(*DAG.getContext(), EltVT); 3175 3176 // BUILD_VECTOR operands are allowed to be wider than the element type. 3177 // But if NewEltVT is smaller that EltVT the BUILD_VECTOR does not accept 3178 // it. 3179 if (NewEltVT.bitsLT(EltVT)) { 3180 3181 // Convert shuffle node. 3182 // If original node was v4i64 and the new EltVT is i32, 3183 // cast operands to v8i32 and re-build the mask. 3184 3185 // Calculate new VT, the size of the new VT should be equal to original. 3186 EVT NewVT = 3187 EVT::getVectorVT(*DAG.getContext(), NewEltVT, 3188 VT.getSizeInBits() / NewEltVT.getSizeInBits()); 3189 assert(NewVT.bitsEq(VT)); 3190 3191 // cast operands to new VT 3192 Op0 = DAG.getNode(ISD::BITCAST, dl, NewVT, Op0); 3193 Op1 = DAG.getNode(ISD::BITCAST, dl, NewVT, Op1); 3194 3195 // Convert the shuffle mask 3196 unsigned int factor = 3197 NewVT.getVectorNumElements()/VT.getVectorNumElements(); 3198 3199 // EltVT gets smaller 3200 assert(factor > 0); 3201 3202 for (unsigned i = 0; i < VT.getVectorNumElements(); ++i) { 3203 if (Mask[i] < 0) { 3204 for (unsigned fi = 0; fi < factor; ++fi) 3205 NewMask.push_back(Mask[i]); 3206 } 3207 else { 3208 for (unsigned fi = 0; fi < factor; ++fi) 3209 NewMask.push_back(Mask[i]*factor+fi); 3210 } 3211 } 3212 Mask = NewMask; 3213 VT = NewVT; 3214 } 3215 EltVT = NewEltVT; 3216 } 3217 unsigned NumElems = VT.getVectorNumElements(); 3218 SmallVector<SDValue, 16> Ops; 3219 for (unsigned i = 0; i != NumElems; ++i) { 3220 if (Mask[i] < 0) { 3221 Ops.push_back(DAG.getUNDEF(EltVT)); 3222 continue; 3223 } 3224 unsigned Idx = Mask[i]; 3225 if (Idx < NumElems) 3226 Ops.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, EltVT, 3227 Op0, 3228 DAG.getConstant(Idx, dl, TLI.getVectorIdxTy()))); 3229 else 3230 Ops.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, EltVT, 3231 Op1, 3232 DAG.getConstant(Idx - NumElems, dl, 3233 TLI.getVectorIdxTy()))); 3234 } 3235 3236 Tmp1 = DAG.getNode(ISD::BUILD_VECTOR, dl, VT, Ops); 3237 // We may have changed the BUILD_VECTOR type. Cast it back to the Node type. 3238 Tmp1 = DAG.getNode(ISD::BITCAST, dl, Node->getValueType(0), Tmp1); 3239 Results.push_back(Tmp1); 3240 break; 3241 } 3242 case ISD::EXTRACT_ELEMENT: { 3243 EVT OpTy = Node->getOperand(0).getValueType(); 3244 if (cast<ConstantSDNode>(Node->getOperand(1))->getZExtValue()) { 3245 // 1 -> Hi 3246 Tmp1 = DAG.getNode(ISD::SRL, dl, OpTy, Node->getOperand(0), 3247 DAG.getConstant(OpTy.getSizeInBits()/2, dl, 3248 TLI.getShiftAmountTy(Node->getOperand(0).getValueType()))); 3249 Tmp1 = DAG.getNode(ISD::TRUNCATE, dl, Node->getValueType(0), Tmp1); 3250 } else { 3251 // 0 -> Lo 3252 Tmp1 = DAG.getNode(ISD::TRUNCATE, dl, Node->getValueType(0), 3253 Node->getOperand(0)); 3254 } 3255 Results.push_back(Tmp1); 3256 break; 3257 } 3258 case ISD::STACKSAVE: 3259 // Expand to CopyFromReg if the target set 3260 // StackPointerRegisterToSaveRestore. 3261 if (unsigned SP = TLI.getStackPointerRegisterToSaveRestore()) { 3262 Results.push_back(DAG.getCopyFromReg(Node->getOperand(0), dl, SP, 3263 Node->getValueType(0))); 3264 Results.push_back(Results[0].getValue(1)); 3265 } else { 3266 Results.push_back(DAG.getUNDEF(Node->getValueType(0))); 3267 Results.push_back(Node->getOperand(0)); 3268 } 3269 break; 3270 case ISD::STACKRESTORE: 3271 // Expand to CopyToReg if the target set 3272 // StackPointerRegisterToSaveRestore. 3273 if (unsigned SP = TLI.getStackPointerRegisterToSaveRestore()) { 3274 Results.push_back(DAG.getCopyToReg(Node->getOperand(0), dl, SP, 3275 Node->getOperand(1))); 3276 } else { 3277 Results.push_back(Node->getOperand(0)); 3278 } 3279 break; 3280 case ISD::FCOPYSIGN: 3281 Results.push_back(ExpandFCOPYSIGN(Node)); 3282 break; 3283 case ISD::FNEG: 3284 // Expand Y = FNEG(X) -> Y = SUB -0.0, X 3285 Tmp1 = DAG.getConstantFP(-0.0, dl, Node->getValueType(0)); 3286 Tmp1 = DAG.getNode(ISD::FSUB, dl, Node->getValueType(0), Tmp1, 3287 Node->getOperand(0)); 3288 Results.push_back(Tmp1); 3289 break; 3290 case ISD::FABS: { 3291 // Expand Y = FABS(X) -> Y = (X >u 0.0) ? X : fneg(X). 3292 EVT VT = Node->getValueType(0); 3293 Tmp1 = Node->getOperand(0); 3294 Tmp2 = DAG.getConstantFP(0.0, dl, VT); 3295 Tmp2 = DAG.getSetCC(dl, getSetCCResultType(Tmp1.getValueType()), 3296 Tmp1, Tmp2, ISD::SETUGT); 3297 Tmp3 = DAG.getNode(ISD::FNEG, dl, VT, Tmp1); 3298 Tmp1 = DAG.getSelect(dl, VT, Tmp2, Tmp1, Tmp3); 3299 Results.push_back(Tmp1); 3300 break; 3301 } 3302 case ISD::FMINNUM: 3303 Results.push_back(ExpandFPLibCall(Node, RTLIB::FMIN_F32, RTLIB::FMIN_F64, 3304 RTLIB::FMIN_F80, RTLIB::FMIN_F128, 3305 RTLIB::FMIN_PPCF128)); 3306 break; 3307 case ISD::FMAXNUM: 3308 Results.push_back(ExpandFPLibCall(Node, RTLIB::FMAX_F32, RTLIB::FMAX_F64, 3309 RTLIB::FMAX_F80, RTLIB::FMAX_F128, 3310 RTLIB::FMAX_PPCF128)); 3311 break; 3312 case ISD::FSQRT: 3313 Results.push_back(ExpandFPLibCall(Node, RTLIB::SQRT_F32, RTLIB::SQRT_F64, 3314 RTLIB::SQRT_F80, RTLIB::SQRT_F128, 3315 RTLIB::SQRT_PPCF128)); 3316 break; 3317 case ISD::FSIN: 3318 case ISD::FCOS: { 3319 EVT VT = Node->getValueType(0); 3320 bool isSIN = Node->getOpcode() == ISD::FSIN; 3321 // Turn fsin / fcos into ISD::FSINCOS node if there are a pair of fsin / 3322 // fcos which share the same operand and both are used. 3323 if ((TLI.isOperationLegalOrCustom(ISD::FSINCOS, VT) || 3324 canCombineSinCosLibcall(Node, TLI, TM)) 3325 && useSinCos(Node)) { 3326 SDVTList VTs = DAG.getVTList(VT, VT); 3327 Tmp1 = DAG.getNode(ISD::FSINCOS, dl, VTs, Node->getOperand(0)); 3328 if (!isSIN) 3329 Tmp1 = Tmp1.getValue(1); 3330 Results.push_back(Tmp1); 3331 } else if (isSIN) { 3332 Results.push_back(ExpandFPLibCall(Node, RTLIB::SIN_F32, RTLIB::SIN_F64, 3333 RTLIB::SIN_F80, RTLIB::SIN_F128, 3334 RTLIB::SIN_PPCF128)); 3335 } else { 3336 Results.push_back(ExpandFPLibCall(Node, RTLIB::COS_F32, RTLIB::COS_F64, 3337 RTLIB::COS_F80, RTLIB::COS_F128, 3338 RTLIB::COS_PPCF128)); 3339 } 3340 break; 3341 } 3342 case ISD::FSINCOS: 3343 // Expand into sincos libcall. 3344 ExpandSinCosLibCall(Node, Results); 3345 break; 3346 case ISD::FLOG: 3347 Results.push_back(ExpandFPLibCall(Node, RTLIB::LOG_F32, RTLIB::LOG_F64, 3348 RTLIB::LOG_F80, RTLIB::LOG_F128, 3349 RTLIB::LOG_PPCF128)); 3350 break; 3351 case ISD::FLOG2: 3352 Results.push_back(ExpandFPLibCall(Node, RTLIB::LOG2_F32, RTLIB::LOG2_F64, 3353 RTLIB::LOG2_F80, RTLIB::LOG2_F128, 3354 RTLIB::LOG2_PPCF128)); 3355 break; 3356 case ISD::FLOG10: 3357 Results.push_back(ExpandFPLibCall(Node, RTLIB::LOG10_F32, RTLIB::LOG10_F64, 3358 RTLIB::LOG10_F80, RTLIB::LOG10_F128, 3359 RTLIB::LOG10_PPCF128)); 3360 break; 3361 case ISD::FEXP: 3362 Results.push_back(ExpandFPLibCall(Node, RTLIB::EXP_F32, RTLIB::EXP_F64, 3363 RTLIB::EXP_F80, RTLIB::EXP_F128, 3364 RTLIB::EXP_PPCF128)); 3365 break; 3366 case ISD::FEXP2: 3367 Results.push_back(ExpandFPLibCall(Node, RTLIB::EXP2_F32, RTLIB::EXP2_F64, 3368 RTLIB::EXP2_F80, RTLIB::EXP2_F128, 3369 RTLIB::EXP2_PPCF128)); 3370 break; 3371 case ISD::FTRUNC: 3372 Results.push_back(ExpandFPLibCall(Node, RTLIB::TRUNC_F32, RTLIB::TRUNC_F64, 3373 RTLIB::TRUNC_F80, RTLIB::TRUNC_F128, 3374 RTLIB::TRUNC_PPCF128)); 3375 break; 3376 case ISD::FFLOOR: 3377 Results.push_back(ExpandFPLibCall(Node, RTLIB::FLOOR_F32, RTLIB::FLOOR_F64, 3378 RTLIB::FLOOR_F80, RTLIB::FLOOR_F128, 3379 RTLIB::FLOOR_PPCF128)); 3380 break; 3381 case ISD::FCEIL: 3382 Results.push_back(ExpandFPLibCall(Node, RTLIB::CEIL_F32, RTLIB::CEIL_F64, 3383 RTLIB::CEIL_F80, RTLIB::CEIL_F128, 3384 RTLIB::CEIL_PPCF128)); 3385 break; 3386 case ISD::FRINT: 3387 Results.push_back(ExpandFPLibCall(Node, RTLIB::RINT_F32, RTLIB::RINT_F64, 3388 RTLIB::RINT_F80, RTLIB::RINT_F128, 3389 RTLIB::RINT_PPCF128)); 3390 break; 3391 case ISD::FNEARBYINT: 3392 Results.push_back(ExpandFPLibCall(Node, RTLIB::NEARBYINT_F32, 3393 RTLIB::NEARBYINT_F64, 3394 RTLIB::NEARBYINT_F80, 3395 RTLIB::NEARBYINT_F128, 3396 RTLIB::NEARBYINT_PPCF128)); 3397 break; 3398 case ISD::FROUND: 3399 Results.push_back(ExpandFPLibCall(Node, RTLIB::ROUND_F32, 3400 RTLIB::ROUND_F64, 3401 RTLIB::ROUND_F80, 3402 RTLIB::ROUND_F128, 3403 RTLIB::ROUND_PPCF128)); 3404 break; 3405 case ISD::FPOWI: 3406 Results.push_back(ExpandFPLibCall(Node, RTLIB::POWI_F32, RTLIB::POWI_F64, 3407 RTLIB::POWI_F80, RTLIB::POWI_F128, 3408 RTLIB::POWI_PPCF128)); 3409 break; 3410 case ISD::FPOW: 3411 Results.push_back(ExpandFPLibCall(Node, RTLIB::POW_F32, RTLIB::POW_F64, 3412 RTLIB::POW_F80, RTLIB::POW_F128, 3413 RTLIB::POW_PPCF128)); 3414 break; 3415 case ISD::FDIV: 3416 Results.push_back(ExpandFPLibCall(Node, RTLIB::DIV_F32, RTLIB::DIV_F64, 3417 RTLIB::DIV_F80, RTLIB::DIV_F128, 3418 RTLIB::DIV_PPCF128)); 3419 break; 3420 case ISD::FREM: 3421 Results.push_back(ExpandFPLibCall(Node, RTLIB::REM_F32, RTLIB::REM_F64, 3422 RTLIB::REM_F80, RTLIB::REM_F128, 3423 RTLIB::REM_PPCF128)); 3424 break; 3425 case ISD::FMA: 3426 Results.push_back(ExpandFPLibCall(Node, RTLIB::FMA_F32, RTLIB::FMA_F64, 3427 RTLIB::FMA_F80, RTLIB::FMA_F128, 3428 RTLIB::FMA_PPCF128)); 3429 break; 3430 case ISD::FMAD: 3431 llvm_unreachable("Illegal fmad should never be formed"); 3432 3433 case ISD::FADD: 3434 Results.push_back(ExpandFPLibCall(Node, RTLIB::ADD_F32, RTLIB::ADD_F64, 3435 RTLIB::ADD_F80, RTLIB::ADD_F128, 3436 RTLIB::ADD_PPCF128)); 3437 break; 3438 case ISD::FMUL: 3439 Results.push_back(ExpandFPLibCall(Node, RTLIB::MUL_F32, RTLIB::MUL_F64, 3440 RTLIB::MUL_F80, RTLIB::MUL_F128, 3441 RTLIB::MUL_PPCF128)); 3442 break; 3443 case ISD::FP16_TO_FP: { 3444 if (Node->getValueType(0) == MVT::f32) { 3445 Results.push_back(ExpandLibCall(RTLIB::FPEXT_F16_F32, Node, false)); 3446 break; 3447 } 3448 3449 // We can extend to types bigger than f32 in two steps without changing the 3450 // result. Since "f16 -> f32" is much more commonly available, give CodeGen 3451 // the option of emitting that before resorting to a libcall. 3452 SDValue Res = 3453 DAG.getNode(ISD::FP16_TO_FP, dl, MVT::f32, Node->getOperand(0)); 3454 Results.push_back( 3455 DAG.getNode(ISD::FP_EXTEND, dl, Node->getValueType(0), Res)); 3456 break; 3457 } 3458 case ISD::FP_TO_FP16: { 3459 if (!TM.Options.UseSoftFloat && TM.Options.UnsafeFPMath) { 3460 SDValue Op = Node->getOperand(0); 3461 MVT SVT = Op.getSimpleValueType(); 3462 if ((SVT == MVT::f64 || SVT == MVT::f80) && 3463 TLI.isOperationLegalOrCustom(ISD::FP_TO_FP16, MVT::f32)) { 3464 // Under fastmath, we can expand this node into a fround followed by 3465 // a float-half conversion. 3466 SDValue FloatVal = DAG.getNode(ISD::FP_ROUND, dl, MVT::f32, Op, 3467 DAG.getIntPtrConstant(0, dl)); 3468 Results.push_back( 3469 DAG.getNode(ISD::FP_TO_FP16, dl, MVT::i16, FloatVal)); 3470 break; 3471 } 3472 } 3473 3474 RTLIB::Libcall LC = 3475 RTLIB::getFPROUND(Node->getOperand(0).getValueType(), MVT::f16); 3476 assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unable to expand fp_to_fp16"); 3477 Results.push_back(ExpandLibCall(LC, Node, false)); 3478 break; 3479 } 3480 case ISD::ConstantFP: { 3481 ConstantFPSDNode *CFP = cast<ConstantFPSDNode>(Node); 3482 // Check to see if this FP immediate is already legal. 3483 // If this is a legal constant, turn it into a TargetConstantFP node. 3484 if (!TLI.isFPImmLegal(CFP->getValueAPF(), Node->getValueType(0))) 3485 Results.push_back(ExpandConstantFP(CFP, true)); 3486 break; 3487 } 3488 case ISD::FSUB: { 3489 EVT VT = Node->getValueType(0); 3490 if (TLI.isOperationLegalOrCustom(ISD::FADD, VT) && 3491 TLI.isOperationLegalOrCustom(ISD::FNEG, VT)) { 3492 Tmp1 = DAG.getNode(ISD::FNEG, dl, VT, Node->getOperand(1)); 3493 Tmp1 = DAG.getNode(ISD::FADD, dl, VT, Node->getOperand(0), Tmp1); 3494 Results.push_back(Tmp1); 3495 } else { 3496 Results.push_back(ExpandFPLibCall(Node, RTLIB::SUB_F32, RTLIB::SUB_F64, 3497 RTLIB::SUB_F80, RTLIB::SUB_F128, 3498 RTLIB::SUB_PPCF128)); 3499 } 3500 break; 3501 } 3502 case ISD::SUB: { 3503 EVT VT = Node->getValueType(0); 3504 assert(TLI.isOperationLegalOrCustom(ISD::ADD, VT) && 3505 TLI.isOperationLegalOrCustom(ISD::XOR, VT) && 3506 "Don't know how to expand this subtraction!"); 3507 Tmp1 = DAG.getNode(ISD::XOR, dl, VT, Node->getOperand(1), 3508 DAG.getConstant(APInt::getAllOnesValue(VT.getSizeInBits()), dl, 3509 VT)); 3510 Tmp1 = DAG.getNode(ISD::ADD, dl, VT, Tmp1, DAG.getConstant(1, dl, VT)); 3511 Results.push_back(DAG.getNode(ISD::ADD, dl, VT, Node->getOperand(0), Tmp1)); 3512 break; 3513 } 3514 case ISD::UREM: 3515 case ISD::SREM: { 3516 EVT VT = Node->getValueType(0); 3517 bool isSigned = Node->getOpcode() == ISD::SREM; 3518 unsigned DivOpc = isSigned ? ISD::SDIV : ISD::UDIV; 3519 unsigned DivRemOpc = isSigned ? ISD::SDIVREM : ISD::UDIVREM; 3520 Tmp2 = Node->getOperand(0); 3521 Tmp3 = Node->getOperand(1); 3522 if (TLI.isOperationLegalOrCustom(DivRemOpc, VT) || 3523 (isDivRemLibcallAvailable(Node, isSigned, TLI) && 3524 // If div is legal, it's better to do the normal expansion 3525 !TLI.isOperationLegalOrCustom(DivOpc, Node->getValueType(0)) && 3526 useDivRem(Node, isSigned, false))) { 3527 SDVTList VTs = DAG.getVTList(VT, VT); 3528 Tmp1 = DAG.getNode(DivRemOpc, dl, VTs, Tmp2, Tmp3).getValue(1); 3529 } else if (TLI.isOperationLegalOrCustom(DivOpc, VT)) { 3530 // X % Y -> X-X/Y*Y 3531 Tmp1 = DAG.getNode(DivOpc, dl, VT, Tmp2, Tmp3); 3532 Tmp1 = DAG.getNode(ISD::MUL, dl, VT, Tmp1, Tmp3); 3533 Tmp1 = DAG.getNode(ISD::SUB, dl, VT, Tmp2, Tmp1); 3534 } else if (isSigned) 3535 Tmp1 = ExpandIntLibCall(Node, true, 3536 RTLIB::SREM_I8, 3537 RTLIB::SREM_I16, RTLIB::SREM_I32, 3538 RTLIB::SREM_I64, RTLIB::SREM_I128); 3539 else 3540 Tmp1 = ExpandIntLibCall(Node, false, 3541 RTLIB::UREM_I8, 3542 RTLIB::UREM_I16, RTLIB::UREM_I32, 3543 RTLIB::UREM_I64, RTLIB::UREM_I128); 3544 Results.push_back(Tmp1); 3545 break; 3546 } 3547 case ISD::UDIV: 3548 case ISD::SDIV: { 3549 bool isSigned = Node->getOpcode() == ISD::SDIV; 3550 unsigned DivRemOpc = isSigned ? ISD::SDIVREM : ISD::UDIVREM; 3551 EVT VT = Node->getValueType(0); 3552 SDVTList VTs = DAG.getVTList(VT, VT); 3553 if (TLI.isOperationLegalOrCustom(DivRemOpc, VT) || 3554 (isDivRemLibcallAvailable(Node, isSigned, TLI) && 3555 useDivRem(Node, isSigned, true))) 3556 Tmp1 = DAG.getNode(DivRemOpc, dl, VTs, Node->getOperand(0), 3557 Node->getOperand(1)); 3558 else if (isSigned) 3559 Tmp1 = ExpandIntLibCall(Node, true, 3560 RTLIB::SDIV_I8, 3561 RTLIB::SDIV_I16, RTLIB::SDIV_I32, 3562 RTLIB::SDIV_I64, RTLIB::SDIV_I128); 3563 else 3564 Tmp1 = ExpandIntLibCall(Node, false, 3565 RTLIB::UDIV_I8, 3566 RTLIB::UDIV_I16, RTLIB::UDIV_I32, 3567 RTLIB::UDIV_I64, RTLIB::UDIV_I128); 3568 Results.push_back(Tmp1); 3569 break; 3570 } 3571 case ISD::MULHU: 3572 case ISD::MULHS: { 3573 unsigned ExpandOpcode = Node->getOpcode() == ISD::MULHU ? ISD::UMUL_LOHI : 3574 ISD::SMUL_LOHI; 3575 EVT VT = Node->getValueType(0); 3576 SDVTList VTs = DAG.getVTList(VT, VT); 3577 assert(TLI.isOperationLegalOrCustom(ExpandOpcode, VT) && 3578 "If this wasn't legal, it shouldn't have been created!"); 3579 Tmp1 = DAG.getNode(ExpandOpcode, dl, VTs, Node->getOperand(0), 3580 Node->getOperand(1)); 3581 Results.push_back(Tmp1.getValue(1)); 3582 break; 3583 } 3584 case ISD::SDIVREM: 3585 case ISD::UDIVREM: 3586 // Expand into divrem libcall 3587 ExpandDivRemLibCall(Node, Results); 3588 break; 3589 case ISD::MUL: { 3590 EVT VT = Node->getValueType(0); 3591 SDVTList VTs = DAG.getVTList(VT, VT); 3592 // See if multiply or divide can be lowered using two-result operations. 3593 // We just need the low half of the multiply; try both the signed 3594 // and unsigned forms. If the target supports both SMUL_LOHI and 3595 // UMUL_LOHI, form a preference by checking which forms of plain 3596 // MULH it supports. 3597 bool HasSMUL_LOHI = TLI.isOperationLegalOrCustom(ISD::SMUL_LOHI, VT); 3598 bool HasUMUL_LOHI = TLI.isOperationLegalOrCustom(ISD::UMUL_LOHI, VT); 3599 bool HasMULHS = TLI.isOperationLegalOrCustom(ISD::MULHS, VT); 3600 bool HasMULHU = TLI.isOperationLegalOrCustom(ISD::MULHU, VT); 3601 unsigned OpToUse = 0; 3602 if (HasSMUL_LOHI && !HasMULHS) { 3603 OpToUse = ISD::SMUL_LOHI; 3604 } else if (HasUMUL_LOHI && !HasMULHU) { 3605 OpToUse = ISD::UMUL_LOHI; 3606 } else if (HasSMUL_LOHI) { 3607 OpToUse = ISD::SMUL_LOHI; 3608 } else if (HasUMUL_LOHI) { 3609 OpToUse = ISD::UMUL_LOHI; 3610 } 3611 if (OpToUse) { 3612 Results.push_back(DAG.getNode(OpToUse, dl, VTs, Node->getOperand(0), 3613 Node->getOperand(1))); 3614 break; 3615 } 3616 3617 SDValue Lo, Hi; 3618 EVT HalfType = VT.getHalfSizedIntegerVT(*DAG.getContext()); 3619 if (TLI.isOperationLegalOrCustom(ISD::ZERO_EXTEND, VT) && 3620 TLI.isOperationLegalOrCustom(ISD::ANY_EXTEND, VT) && 3621 TLI.isOperationLegalOrCustom(ISD::SHL, VT) && 3622 TLI.isOperationLegalOrCustom(ISD::OR, VT) && 3623 TLI.expandMUL(Node, Lo, Hi, HalfType, DAG)) { 3624 Lo = DAG.getNode(ISD::ZERO_EXTEND, dl, VT, Lo); 3625 Hi = DAG.getNode(ISD::ANY_EXTEND, dl, VT, Hi); 3626 SDValue Shift = DAG.getConstant(HalfType.getSizeInBits(), dl, 3627 TLI.getShiftAmountTy(HalfType)); 3628 Hi = DAG.getNode(ISD::SHL, dl, VT, Hi, Shift); 3629 Results.push_back(DAG.getNode(ISD::OR, dl, VT, Lo, Hi)); 3630 break; 3631 } 3632 3633 Tmp1 = ExpandIntLibCall(Node, false, 3634 RTLIB::MUL_I8, 3635 RTLIB::MUL_I16, RTLIB::MUL_I32, 3636 RTLIB::MUL_I64, RTLIB::MUL_I128); 3637 Results.push_back(Tmp1); 3638 break; 3639 } 3640 case ISD::SADDO: 3641 case ISD::SSUBO: { 3642 SDValue LHS = Node->getOperand(0); 3643 SDValue RHS = Node->getOperand(1); 3644 SDValue Sum = DAG.getNode(Node->getOpcode() == ISD::SADDO ? 3645 ISD::ADD : ISD::SUB, dl, LHS.getValueType(), 3646 LHS, RHS); 3647 Results.push_back(Sum); 3648 EVT ResultType = Node->getValueType(1); 3649 EVT OType = getSetCCResultType(Node->getValueType(0)); 3650 3651 SDValue Zero = DAG.getConstant(0, dl, LHS.getValueType()); 3652 3653 // LHSSign -> LHS >= 0 3654 // RHSSign -> RHS >= 0 3655 // SumSign -> Sum >= 0 3656 // 3657 // Add: 3658 // Overflow -> (LHSSign == RHSSign) && (LHSSign != SumSign) 3659 // Sub: 3660 // Overflow -> (LHSSign != RHSSign) && (LHSSign != SumSign) 3661 // 3662 SDValue LHSSign = DAG.getSetCC(dl, OType, LHS, Zero, ISD::SETGE); 3663 SDValue RHSSign = DAG.getSetCC(dl, OType, RHS, Zero, ISD::SETGE); 3664 SDValue SignsMatch = DAG.getSetCC(dl, OType, LHSSign, RHSSign, 3665 Node->getOpcode() == ISD::SADDO ? 3666 ISD::SETEQ : ISD::SETNE); 3667 3668 SDValue SumSign = DAG.getSetCC(dl, OType, Sum, Zero, ISD::SETGE); 3669 SDValue SumSignNE = DAG.getSetCC(dl, OType, LHSSign, SumSign, ISD::SETNE); 3670 3671 SDValue Cmp = DAG.getNode(ISD::AND, dl, OType, SignsMatch, SumSignNE); 3672 Results.push_back(DAG.getBoolExtOrTrunc(Cmp, dl, ResultType, ResultType)); 3673 break; 3674 } 3675 case ISD::UADDO: 3676 case ISD::USUBO: { 3677 SDValue LHS = Node->getOperand(0); 3678 SDValue RHS = Node->getOperand(1); 3679 SDValue Sum = DAG.getNode(Node->getOpcode() == ISD::UADDO ? 3680 ISD::ADD : ISD::SUB, dl, LHS.getValueType(), 3681 LHS, RHS); 3682 Results.push_back(Sum); 3683 3684 EVT ResultType = Node->getValueType(1); 3685 EVT SetCCType = getSetCCResultType(Node->getValueType(0)); 3686 ISD::CondCode CC 3687 = Node->getOpcode() == ISD::UADDO ? ISD::SETULT : ISD::SETUGT; 3688 SDValue SetCC = DAG.getSetCC(dl, SetCCType, Sum, LHS, CC); 3689 3690 Results.push_back(DAG.getBoolExtOrTrunc(SetCC, dl, ResultType, ResultType)); 3691 break; 3692 } 3693 case ISD::UMULO: 3694 case ISD::SMULO: { 3695 EVT VT = Node->getValueType(0); 3696 EVT WideVT = EVT::getIntegerVT(*DAG.getContext(), VT.getSizeInBits() * 2); 3697 SDValue LHS = Node->getOperand(0); 3698 SDValue RHS = Node->getOperand(1); 3699 SDValue BottomHalf; 3700 SDValue TopHalf; 3701 static const unsigned Ops[2][3] = 3702 { { ISD::MULHU, ISD::UMUL_LOHI, ISD::ZERO_EXTEND }, 3703 { ISD::MULHS, ISD::SMUL_LOHI, ISD::SIGN_EXTEND }}; 3704 bool isSigned = Node->getOpcode() == ISD::SMULO; 3705 if (TLI.isOperationLegalOrCustom(Ops[isSigned][0], VT)) { 3706 BottomHalf = DAG.getNode(ISD::MUL, dl, VT, LHS, RHS); 3707 TopHalf = DAG.getNode(Ops[isSigned][0], dl, VT, LHS, RHS); 3708 } else if (TLI.isOperationLegalOrCustom(Ops[isSigned][1], VT)) { 3709 BottomHalf = DAG.getNode(Ops[isSigned][1], dl, DAG.getVTList(VT, VT), LHS, 3710 RHS); 3711 TopHalf = BottomHalf.getValue(1); 3712 } else if (TLI.isTypeLegal(WideVT)) { 3713 LHS = DAG.getNode(Ops[isSigned][2], dl, WideVT, LHS); 3714 RHS = DAG.getNode(Ops[isSigned][2], dl, WideVT, RHS); 3715 Tmp1 = DAG.getNode(ISD::MUL, dl, WideVT, LHS, RHS); 3716 BottomHalf = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, VT, Tmp1, 3717 DAG.getIntPtrConstant(0, dl)); 3718 TopHalf = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, VT, Tmp1, 3719 DAG.getIntPtrConstant(1, dl)); 3720 } else { 3721 // We can fall back to a libcall with an illegal type for the MUL if we 3722 // have a libcall big enough. 3723 // Also, we can fall back to a division in some cases, but that's a big 3724 // performance hit in the general case. 3725 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL; 3726 if (WideVT == MVT::i16) 3727 LC = RTLIB::MUL_I16; 3728 else if (WideVT == MVT::i32) 3729 LC = RTLIB::MUL_I32; 3730 else if (WideVT == MVT::i64) 3731 LC = RTLIB::MUL_I64; 3732 else if (WideVT == MVT::i128) 3733 LC = RTLIB::MUL_I128; 3734 assert(LC != RTLIB::UNKNOWN_LIBCALL && "Cannot expand this operation!"); 3735 3736 // The high part is obtained by SRA'ing all but one of the bits of low 3737 // part. 3738 unsigned LoSize = VT.getSizeInBits(); 3739 SDValue HiLHS = DAG.getNode(ISD::SRA, dl, VT, RHS, 3740 DAG.getConstant(LoSize - 1, dl, 3741 TLI.getPointerTy())); 3742 SDValue HiRHS = DAG.getNode(ISD::SRA, dl, VT, LHS, 3743 DAG.getConstant(LoSize - 1, dl, 3744 TLI.getPointerTy())); 3745 3746 // Here we're passing the 2 arguments explicitly as 4 arguments that are 3747 // pre-lowered to the correct types. This all depends upon WideVT not 3748 // being a legal type for the architecture and thus has to be split to 3749 // two arguments. 3750 SDValue Args[] = { LHS, HiLHS, RHS, HiRHS }; 3751 SDValue Ret = ExpandLibCall(LC, WideVT, Args, 4, isSigned, dl); 3752 BottomHalf = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, VT, Ret, 3753 DAG.getIntPtrConstant(0, dl)); 3754 TopHalf = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, VT, Ret, 3755 DAG.getIntPtrConstant(1, dl)); 3756 // Ret is a node with an illegal type. Because such things are not 3757 // generally permitted during this phase of legalization, make sure the 3758 // node has no more uses. The above EXTRACT_ELEMENT nodes should have been 3759 // folded. 3760 assert(Ret->use_empty() && 3761 "Unexpected uses of illegally type from expanded lib call."); 3762 } 3763 3764 if (isSigned) { 3765 Tmp1 = DAG.getConstant(VT.getSizeInBits() - 1, dl, 3766 TLI.getShiftAmountTy(BottomHalf.getValueType())); 3767 Tmp1 = DAG.getNode(ISD::SRA, dl, VT, BottomHalf, Tmp1); 3768 TopHalf = DAG.getSetCC(dl, getSetCCResultType(VT), TopHalf, Tmp1, 3769 ISD::SETNE); 3770 } else { 3771 TopHalf = DAG.getSetCC(dl, getSetCCResultType(VT), TopHalf, 3772 DAG.getConstant(0, dl, VT), ISD::SETNE); 3773 } 3774 Results.push_back(BottomHalf); 3775 Results.push_back(TopHalf); 3776 break; 3777 } 3778 case ISD::BUILD_PAIR: { 3779 EVT PairTy = Node->getValueType(0); 3780 Tmp1 = DAG.getNode(ISD::ZERO_EXTEND, dl, PairTy, Node->getOperand(0)); 3781 Tmp2 = DAG.getNode(ISD::ANY_EXTEND, dl, PairTy, Node->getOperand(1)); 3782 Tmp2 = DAG.getNode(ISD::SHL, dl, PairTy, Tmp2, 3783 DAG.getConstant(PairTy.getSizeInBits()/2, dl, 3784 TLI.getShiftAmountTy(PairTy))); 3785 Results.push_back(DAG.getNode(ISD::OR, dl, PairTy, Tmp1, Tmp2)); 3786 break; 3787 } 3788 case ISD::SELECT: 3789 Tmp1 = Node->getOperand(0); 3790 Tmp2 = Node->getOperand(1); 3791 Tmp3 = Node->getOperand(2); 3792 if (Tmp1.getOpcode() == ISD::SETCC) { 3793 Tmp1 = DAG.getSelectCC(dl, Tmp1.getOperand(0), Tmp1.getOperand(1), 3794 Tmp2, Tmp3, 3795 cast<CondCodeSDNode>(Tmp1.getOperand(2))->get()); 3796 } else { 3797 Tmp1 = DAG.getSelectCC(dl, Tmp1, 3798 DAG.getConstant(0, dl, Tmp1.getValueType()), 3799 Tmp2, Tmp3, ISD::SETNE); 3800 } 3801 Results.push_back(Tmp1); 3802 break; 3803 case ISD::BR_JT: { 3804 SDValue Chain = Node->getOperand(0); 3805 SDValue Table = Node->getOperand(1); 3806 SDValue Index = Node->getOperand(2); 3807 3808 EVT PTy = TLI.getPointerTy(); 3809 3810 const DataLayout &TD = *TLI.getDataLayout(); 3811 unsigned EntrySize = 3812 DAG.getMachineFunction().getJumpTableInfo()->getEntrySize(TD); 3813 3814 Index = DAG.getNode(ISD::MUL, dl, Index.getValueType(), Index, 3815 DAG.getConstant(EntrySize, dl, Index.getValueType())); 3816 SDValue Addr = DAG.getNode(ISD::ADD, dl, Index.getValueType(), 3817 Index, Table); 3818 3819 EVT MemVT = EVT::getIntegerVT(*DAG.getContext(), EntrySize * 8); 3820 SDValue LD = DAG.getExtLoad(ISD::SEXTLOAD, dl, PTy, Chain, Addr, 3821 MachinePointerInfo::getJumpTable(), MemVT, 3822 false, false, false, 0); 3823 Addr = LD; 3824 if (TM.getRelocationModel() == Reloc::PIC_) { 3825 // For PIC, the sequence is: 3826 // BRIND(load(Jumptable + index) + RelocBase) 3827 // RelocBase can be JumpTable, GOT or some sort of global base. 3828 Addr = DAG.getNode(ISD::ADD, dl, PTy, Addr, 3829 TLI.getPICJumpTableRelocBase(Table, DAG)); 3830 } 3831 Tmp1 = DAG.getNode(ISD::BRIND, dl, MVT::Other, LD.getValue(1), Addr); 3832 Results.push_back(Tmp1); 3833 break; 3834 } 3835 case ISD::BRCOND: 3836 // Expand brcond's setcc into its constituent parts and create a BR_CC 3837 // Node. 3838 Tmp1 = Node->getOperand(0); 3839 Tmp2 = Node->getOperand(1); 3840 if (Tmp2.getOpcode() == ISD::SETCC) { 3841 Tmp1 = DAG.getNode(ISD::BR_CC, dl, MVT::Other, 3842 Tmp1, Tmp2.getOperand(2), 3843 Tmp2.getOperand(0), Tmp2.getOperand(1), 3844 Node->getOperand(2)); 3845 } else { 3846 // We test only the i1 bit. Skip the AND if UNDEF. 3847 Tmp3 = (Tmp2.getOpcode() == ISD::UNDEF) ? Tmp2 : 3848 DAG.getNode(ISD::AND, dl, Tmp2.getValueType(), Tmp2, 3849 DAG.getConstant(1, dl, Tmp2.getValueType())); 3850 Tmp1 = DAG.getNode(ISD::BR_CC, dl, MVT::Other, Tmp1, 3851 DAG.getCondCode(ISD::SETNE), Tmp3, 3852 DAG.getConstant(0, dl, Tmp3.getValueType()), 3853 Node->getOperand(2)); 3854 } 3855 Results.push_back(Tmp1); 3856 break; 3857 case ISD::SETCC: { 3858 Tmp1 = Node->getOperand(0); 3859 Tmp2 = Node->getOperand(1); 3860 Tmp3 = Node->getOperand(2); 3861 bool Legalized = LegalizeSetCCCondCode(Node->getValueType(0), Tmp1, Tmp2, 3862 Tmp3, NeedInvert, dl); 3863 3864 if (Legalized) { 3865 // If we expanded the SETCC by swapping LHS and RHS, or by inverting the 3866 // condition code, create a new SETCC node. 3867 if (Tmp3.getNode()) 3868 Tmp1 = DAG.getNode(ISD::SETCC, dl, Node->getValueType(0), 3869 Tmp1, Tmp2, Tmp3); 3870 3871 // If we expanded the SETCC by inverting the condition code, then wrap 3872 // the existing SETCC in a NOT to restore the intended condition. 3873 if (NeedInvert) 3874 Tmp1 = DAG.getLogicalNOT(dl, Tmp1, Tmp1->getValueType(0)); 3875 3876 Results.push_back(Tmp1); 3877 break; 3878 } 3879 3880 // Otherwise, SETCC for the given comparison type must be completely 3881 // illegal; expand it into a SELECT_CC. 3882 EVT VT = Node->getValueType(0); 3883 int TrueValue; 3884 switch (TLI.getBooleanContents(Tmp1->getValueType(0))) { 3885 case TargetLowering::ZeroOrOneBooleanContent: 3886 case TargetLowering::UndefinedBooleanContent: 3887 TrueValue = 1; 3888 break; 3889 case TargetLowering::ZeroOrNegativeOneBooleanContent: 3890 TrueValue = -1; 3891 break; 3892 } 3893 Tmp1 = DAG.getNode(ISD::SELECT_CC, dl, VT, Tmp1, Tmp2, 3894 DAG.getConstant(TrueValue, dl, VT), 3895 DAG.getConstant(0, dl, VT), 3896 Tmp3); 3897 Results.push_back(Tmp1); 3898 break; 3899 } 3900 case ISD::SELECT_CC: { 3901 Tmp1 = Node->getOperand(0); // LHS 3902 Tmp2 = Node->getOperand(1); // RHS 3903 Tmp3 = Node->getOperand(2); // True 3904 Tmp4 = Node->getOperand(3); // False 3905 EVT VT = Node->getValueType(0); 3906 SDValue CC = Node->getOperand(4); 3907 ISD::CondCode CCOp = cast<CondCodeSDNode>(CC)->get(); 3908 3909 if (TLI.isCondCodeLegal(CCOp, Tmp1.getSimpleValueType())) { 3910 // If the condition code is legal, then we need to expand this 3911 // node using SETCC and SELECT. 3912 EVT CmpVT = Tmp1.getValueType(); 3913 assert(!TLI.isOperationExpand(ISD::SELECT, VT) && 3914 "Cannot expand ISD::SELECT_CC when ISD::SELECT also needs to be " 3915 "expanded."); 3916 EVT CCVT = TLI.getSetCCResultType(*DAG.getContext(), CmpVT); 3917 SDValue Cond = DAG.getNode(ISD::SETCC, dl, CCVT, Tmp1, Tmp2, CC); 3918 Results.push_back(DAG.getSelect(dl, VT, Cond, Tmp3, Tmp4)); 3919 break; 3920 } 3921 3922 // SELECT_CC is legal, so the condition code must not be. 3923 bool Legalized = false; 3924 // Try to legalize by inverting the condition. This is for targets that 3925 // might support an ordered version of a condition, but not the unordered 3926 // version (or vice versa). 3927 ISD::CondCode InvCC = ISD::getSetCCInverse(CCOp, 3928 Tmp1.getValueType().isInteger()); 3929 if (TLI.isCondCodeLegal(InvCC, Tmp1.getSimpleValueType())) { 3930 // Use the new condition code and swap true and false 3931 Legalized = true; 3932 Tmp1 = DAG.getSelectCC(dl, Tmp1, Tmp2, Tmp4, Tmp3, InvCC); 3933 } else { 3934 // If The inverse is not legal, then try to swap the arguments using 3935 // the inverse condition code. 3936 ISD::CondCode SwapInvCC = ISD::getSetCCSwappedOperands(InvCC); 3937 if (TLI.isCondCodeLegal(SwapInvCC, Tmp1.getSimpleValueType())) { 3938 // The swapped inverse condition is legal, so swap true and false, 3939 // lhs and rhs. 3940 Legalized = true; 3941 Tmp1 = DAG.getSelectCC(dl, Tmp2, Tmp1, Tmp4, Tmp3, SwapInvCC); 3942 } 3943 } 3944 3945 if (!Legalized) { 3946 Legalized = LegalizeSetCCCondCode( 3947 getSetCCResultType(Tmp1.getValueType()), Tmp1, Tmp2, CC, NeedInvert, 3948 dl); 3949 3950 assert(Legalized && "Can't legalize SELECT_CC with legal condition!"); 3951 3952 // If we expanded the SETCC by inverting the condition code, then swap 3953 // the True/False operands to match. 3954 if (NeedInvert) 3955 std::swap(Tmp3, Tmp4); 3956 3957 // If we expanded the SETCC by swapping LHS and RHS, or by inverting the 3958 // condition code, create a new SELECT_CC node. 3959 if (CC.getNode()) { 3960 Tmp1 = DAG.getNode(ISD::SELECT_CC, dl, Node->getValueType(0), 3961 Tmp1, Tmp2, Tmp3, Tmp4, CC); 3962 } else { 3963 Tmp2 = DAG.getConstant(0, dl, Tmp1.getValueType()); 3964 CC = DAG.getCondCode(ISD::SETNE); 3965 Tmp1 = DAG.getNode(ISD::SELECT_CC, dl, Node->getValueType(0), Tmp1, 3966 Tmp2, Tmp3, Tmp4, CC); 3967 } 3968 } 3969 Results.push_back(Tmp1); 3970 break; 3971 } 3972 case ISD::BR_CC: { 3973 Tmp1 = Node->getOperand(0); // Chain 3974 Tmp2 = Node->getOperand(2); // LHS 3975 Tmp3 = Node->getOperand(3); // RHS 3976 Tmp4 = Node->getOperand(1); // CC 3977 3978 bool Legalized = LegalizeSetCCCondCode(getSetCCResultType( 3979 Tmp2.getValueType()), Tmp2, Tmp3, Tmp4, NeedInvert, dl); 3980 (void)Legalized; 3981 assert(Legalized && "Can't legalize BR_CC with legal condition!"); 3982 3983 // If we expanded the SETCC by inverting the condition code, then wrap 3984 // the existing SETCC in a NOT to restore the intended condition. 3985 if (NeedInvert) 3986 Tmp4 = DAG.getNOT(dl, Tmp4, Tmp4->getValueType(0)); 3987 3988 // If we expanded the SETCC by swapping LHS and RHS, create a new BR_CC 3989 // node. 3990 if (Tmp4.getNode()) { 3991 Tmp1 = DAG.getNode(ISD::BR_CC, dl, Node->getValueType(0), Tmp1, 3992 Tmp4, Tmp2, Tmp3, Node->getOperand(4)); 3993 } else { 3994 Tmp3 = DAG.getConstant(0, dl, Tmp2.getValueType()); 3995 Tmp4 = DAG.getCondCode(ISD::SETNE); 3996 Tmp1 = DAG.getNode(ISD::BR_CC, dl, Node->getValueType(0), Tmp1, Tmp4, 3997 Tmp2, Tmp3, Node->getOperand(4)); 3998 } 3999 Results.push_back(Tmp1); 4000 break; 4001 } 4002 case ISD::BUILD_VECTOR: 4003 Results.push_back(ExpandBUILD_VECTOR(Node)); 4004 break; 4005 case ISD::SRA: 4006 case ISD::SRL: 4007 case ISD::SHL: { 4008 // Scalarize vector SRA/SRL/SHL. 4009 EVT VT = Node->getValueType(0); 4010 assert(VT.isVector() && "Unable to legalize non-vector shift"); 4011 assert(TLI.isTypeLegal(VT.getScalarType())&& "Element type must be legal"); 4012 unsigned NumElem = VT.getVectorNumElements(); 4013 4014 SmallVector<SDValue, 8> Scalars; 4015 for (unsigned Idx = 0; Idx < NumElem; Idx++) { 4016 SDValue Ex = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, 4017 VT.getScalarType(), 4018 Node->getOperand(0), 4019 DAG.getConstant(Idx, dl, TLI.getVectorIdxTy())); 4020 SDValue Sh = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, 4021 VT.getScalarType(), 4022 Node->getOperand(1), 4023 DAG.getConstant(Idx, dl, TLI.getVectorIdxTy())); 4024 Scalars.push_back(DAG.getNode(Node->getOpcode(), dl, 4025 VT.getScalarType(), Ex, Sh)); 4026 } 4027 SDValue Result = 4028 DAG.getNode(ISD::BUILD_VECTOR, dl, Node->getValueType(0), Scalars); 4029 ReplaceNode(SDValue(Node, 0), Result); 4030 break; 4031 } 4032 case ISD::GLOBAL_OFFSET_TABLE: 4033 case ISD::GlobalAddress: 4034 case ISD::GlobalTLSAddress: 4035 case ISD::ExternalSymbol: 4036 case ISD::ConstantPool: 4037 case ISD::JumpTable: 4038 case ISD::INTRINSIC_W_CHAIN: 4039 case ISD::INTRINSIC_WO_CHAIN: 4040 case ISD::INTRINSIC_VOID: 4041 // FIXME: Custom lowering for these operations shouldn't return null! 4042 break; 4043 } 4044 4045 // Replace the original node with the legalized result. 4046 if (!Results.empty()) 4047 ReplaceNode(Node, Results.data()); 4048 } 4049 4050 void SelectionDAGLegalize::PromoteNode(SDNode *Node) { 4051 SmallVector<SDValue, 8> Results; 4052 MVT OVT = Node->getSimpleValueType(0); 4053 if (Node->getOpcode() == ISD::UINT_TO_FP || 4054 Node->getOpcode() == ISD::SINT_TO_FP || 4055 Node->getOpcode() == ISD::SETCC) { 4056 OVT = Node->getOperand(0).getSimpleValueType(); 4057 } 4058 if (Node->getOpcode() == ISD::BR_CC) 4059 OVT = Node->getOperand(2).getSimpleValueType(); 4060 MVT NVT = TLI.getTypeToPromoteTo(Node->getOpcode(), OVT); 4061 SDLoc dl(Node); 4062 SDValue Tmp1, Tmp2, Tmp3; 4063 switch (Node->getOpcode()) { 4064 case ISD::CTTZ: 4065 case ISD::CTTZ_ZERO_UNDEF: 4066 case ISD::CTLZ: 4067 case ISD::CTLZ_ZERO_UNDEF: 4068 case ISD::CTPOP: 4069 // Zero extend the argument. 4070 Tmp1 = DAG.getNode(ISD::ZERO_EXTEND, dl, NVT, Node->getOperand(0)); 4071 // Perform the larger operation. For CTPOP and CTTZ_ZERO_UNDEF, this is 4072 // already the correct result. 4073 Tmp1 = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1); 4074 if (Node->getOpcode() == ISD::CTTZ) { 4075 // FIXME: This should set a bit in the zero extended value instead. 4076 Tmp2 = DAG.getSetCC(dl, getSetCCResultType(NVT), 4077 Tmp1, DAG.getConstant(NVT.getSizeInBits(), dl, NVT), 4078 ISD::SETEQ); 4079 Tmp1 = DAG.getSelect(dl, NVT, Tmp2, 4080 DAG.getConstant(OVT.getSizeInBits(), dl, NVT), Tmp1); 4081 } else if (Node->getOpcode() == ISD::CTLZ || 4082 Node->getOpcode() == ISD::CTLZ_ZERO_UNDEF) { 4083 // Tmp1 = Tmp1 - (sizeinbits(NVT) - sizeinbits(Old VT)) 4084 Tmp1 = DAG.getNode(ISD::SUB, dl, NVT, Tmp1, 4085 DAG.getConstant(NVT.getSizeInBits() - 4086 OVT.getSizeInBits(), dl, NVT)); 4087 } 4088 Results.push_back(DAG.getNode(ISD::TRUNCATE, dl, OVT, Tmp1)); 4089 break; 4090 case ISD::BSWAP: { 4091 unsigned DiffBits = NVT.getSizeInBits() - OVT.getSizeInBits(); 4092 Tmp1 = DAG.getNode(ISD::ZERO_EXTEND, dl, NVT, Node->getOperand(0)); 4093 Tmp1 = DAG.getNode(ISD::BSWAP, dl, NVT, Tmp1); 4094 Tmp1 = DAG.getNode(ISD::SRL, dl, NVT, Tmp1, 4095 DAG.getConstant(DiffBits, dl, 4096 TLI.getShiftAmountTy(NVT))); 4097 Results.push_back(Tmp1); 4098 break; 4099 } 4100 case ISD::FP_TO_UINT: 4101 case ISD::FP_TO_SINT: 4102 Tmp1 = PromoteLegalFP_TO_INT(Node->getOperand(0), Node->getValueType(0), 4103 Node->getOpcode() == ISD::FP_TO_SINT, dl); 4104 Results.push_back(Tmp1); 4105 break; 4106 case ISD::UINT_TO_FP: 4107 case ISD::SINT_TO_FP: 4108 Tmp1 = PromoteLegalINT_TO_FP(Node->getOperand(0), Node->getValueType(0), 4109 Node->getOpcode() == ISD::SINT_TO_FP, dl); 4110 Results.push_back(Tmp1); 4111 break; 4112 case ISD::VAARG: { 4113 SDValue Chain = Node->getOperand(0); // Get the chain. 4114 SDValue Ptr = Node->getOperand(1); // Get the pointer. 4115 4116 unsigned TruncOp; 4117 if (OVT.isVector()) { 4118 TruncOp = ISD::BITCAST; 4119 } else { 4120 assert(OVT.isInteger() 4121 && "VAARG promotion is supported only for vectors or integer types"); 4122 TruncOp = ISD::TRUNCATE; 4123 } 4124 4125 // Perform the larger operation, then convert back 4126 Tmp1 = DAG.getVAArg(NVT, dl, Chain, Ptr, Node->getOperand(2), 4127 Node->getConstantOperandVal(3)); 4128 Chain = Tmp1.getValue(1); 4129 4130 Tmp2 = DAG.getNode(TruncOp, dl, OVT, Tmp1); 4131 4132 // Modified the chain result - switch anything that used the old chain to 4133 // use the new one. 4134 DAG.ReplaceAllUsesOfValueWith(SDValue(Node, 0), Tmp2); 4135 DAG.ReplaceAllUsesOfValueWith(SDValue(Node, 1), Chain); 4136 if (UpdatedNodes) { 4137 UpdatedNodes->insert(Tmp2.getNode()); 4138 UpdatedNodes->insert(Chain.getNode()); 4139 } 4140 ReplacedNode(Node); 4141 break; 4142 } 4143 case ISD::AND: 4144 case ISD::OR: 4145 case ISD::XOR: { 4146 unsigned ExtOp, TruncOp; 4147 if (OVT.isVector()) { 4148 ExtOp = ISD::BITCAST; 4149 TruncOp = ISD::BITCAST; 4150 } else { 4151 assert(OVT.isInteger() && "Cannot promote logic operation"); 4152 ExtOp = ISD::ANY_EXTEND; 4153 TruncOp = ISD::TRUNCATE; 4154 } 4155 // Promote each of the values to the new type. 4156 Tmp1 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(0)); 4157 Tmp2 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(1)); 4158 // Perform the larger operation, then convert back 4159 Tmp1 = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1, Tmp2); 4160 Results.push_back(DAG.getNode(TruncOp, dl, OVT, Tmp1)); 4161 break; 4162 } 4163 case ISD::SELECT: { 4164 unsigned ExtOp, TruncOp; 4165 if (Node->getValueType(0).isVector() || 4166 Node->getValueType(0).getSizeInBits() == NVT.getSizeInBits()) { 4167 ExtOp = ISD::BITCAST; 4168 TruncOp = ISD::BITCAST; 4169 } else if (Node->getValueType(0).isInteger()) { 4170 ExtOp = ISD::ANY_EXTEND; 4171 TruncOp = ISD::TRUNCATE; 4172 } else { 4173 ExtOp = ISD::FP_EXTEND; 4174 TruncOp = ISD::FP_ROUND; 4175 } 4176 Tmp1 = Node->getOperand(0); 4177 // Promote each of the values to the new type. 4178 Tmp2 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(1)); 4179 Tmp3 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(2)); 4180 // Perform the larger operation, then round down. 4181 Tmp1 = DAG.getSelect(dl, NVT, Tmp1, Tmp2, Tmp3); 4182 if (TruncOp != ISD::FP_ROUND) 4183 Tmp1 = DAG.getNode(TruncOp, dl, Node->getValueType(0), Tmp1); 4184 else 4185 Tmp1 = DAG.getNode(TruncOp, dl, Node->getValueType(0), Tmp1, 4186 DAG.getIntPtrConstant(0, dl)); 4187 Results.push_back(Tmp1); 4188 break; 4189 } 4190 case ISD::VECTOR_SHUFFLE: { 4191 ArrayRef<int> Mask = cast<ShuffleVectorSDNode>(Node)->getMask(); 4192 4193 // Cast the two input vectors. 4194 Tmp1 = DAG.getNode(ISD::BITCAST, dl, NVT, Node->getOperand(0)); 4195 Tmp2 = DAG.getNode(ISD::BITCAST, dl, NVT, Node->getOperand(1)); 4196 4197 // Convert the shuffle mask to the right # elements. 4198 Tmp1 = ShuffleWithNarrowerEltType(NVT, OVT, dl, Tmp1, Tmp2, Mask); 4199 Tmp1 = DAG.getNode(ISD::BITCAST, dl, OVT, Tmp1); 4200 Results.push_back(Tmp1); 4201 break; 4202 } 4203 case ISD::SETCC: { 4204 unsigned ExtOp = ISD::FP_EXTEND; 4205 if (NVT.isInteger()) { 4206 ISD::CondCode CCCode = 4207 cast<CondCodeSDNode>(Node->getOperand(2))->get(); 4208 ExtOp = isSignedIntSetCC(CCCode) ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND; 4209 } 4210 Tmp1 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(0)); 4211 Tmp2 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(1)); 4212 Results.push_back(DAG.getNode(ISD::SETCC, dl, Node->getValueType(0), 4213 Tmp1, Tmp2, Node->getOperand(2))); 4214 break; 4215 } 4216 case ISD::BR_CC: { 4217 unsigned ExtOp = ISD::FP_EXTEND; 4218 if (NVT.isInteger()) { 4219 ISD::CondCode CCCode = 4220 cast<CondCodeSDNode>(Node->getOperand(1))->get(); 4221 ExtOp = isSignedIntSetCC(CCCode) ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND; 4222 } 4223 Tmp1 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(2)); 4224 Tmp2 = DAG.getNode(ExtOp, dl, NVT, Node->getOperand(3)); 4225 Results.push_back(DAG.getNode(ISD::BR_CC, dl, Node->getValueType(0), 4226 Node->getOperand(0), Node->getOperand(1), 4227 Tmp1, Tmp2, Node->getOperand(4))); 4228 break; 4229 } 4230 case ISD::FADD: 4231 case ISD::FSUB: 4232 case ISD::FMUL: 4233 case ISD::FDIV: 4234 case ISD::FREM: 4235 case ISD::FMINNUM: 4236 case ISD::FMAXNUM: 4237 case ISD::FCOPYSIGN: 4238 case ISD::FPOW: { 4239 Tmp1 = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Node->getOperand(0)); 4240 Tmp2 = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Node->getOperand(1)); 4241 Tmp3 = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1, Tmp2); 4242 Results.push_back(DAG.getNode(ISD::FP_ROUND, dl, OVT, 4243 Tmp3, DAG.getIntPtrConstant(0, dl))); 4244 break; 4245 } 4246 case ISD::FMA: { 4247 Tmp1 = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Node->getOperand(0)); 4248 Tmp2 = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Node->getOperand(1)); 4249 Tmp3 = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Node->getOperand(2)); 4250 Results.push_back( 4251 DAG.getNode(ISD::FP_ROUND, dl, OVT, 4252 DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1, Tmp2, Tmp3), 4253 DAG.getIntPtrConstant(0, dl))); 4254 break; 4255 } 4256 case ISD::FPOWI: { 4257 Tmp1 = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Node->getOperand(0)); 4258 Tmp2 = Node->getOperand(1); 4259 Tmp3 = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1, Tmp2); 4260 Results.push_back(DAG.getNode(ISD::FP_ROUND, dl, OVT, 4261 Tmp3, DAG.getIntPtrConstant(0, dl))); 4262 break; 4263 } 4264 case ISD::FFLOOR: 4265 case ISD::FCEIL: 4266 case ISD::FRINT: 4267 case ISD::FNEARBYINT: 4268 case ISD::FROUND: 4269 case ISD::FTRUNC: 4270 case ISD::FNEG: 4271 case ISD::FSQRT: 4272 case ISD::FSIN: 4273 case ISD::FCOS: 4274 case ISD::FLOG: 4275 case ISD::FLOG2: 4276 case ISD::FLOG10: 4277 case ISD::FABS: 4278 case ISD::FEXP: 4279 case ISD::FEXP2: { 4280 Tmp1 = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Node->getOperand(0)); 4281 Tmp2 = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1); 4282 Results.push_back(DAG.getNode(ISD::FP_ROUND, dl, OVT, 4283 Tmp2, DAG.getIntPtrConstant(0, dl))); 4284 break; 4285 } 4286 } 4287 4288 // Replace the original node with the legalized result. 4289 if (!Results.empty()) 4290 ReplaceNode(Node, Results.data()); 4291 } 4292 4293 /// This is the entry point for the file. 4294 void SelectionDAG::Legalize() { 4295 AssignTopologicalOrder(); 4296 4297 SmallPtrSet<SDNode *, 16> LegalizedNodes; 4298 SelectionDAGLegalize Legalizer(*this, LegalizedNodes); 4299 4300 // Visit all the nodes. We start in topological order, so that we see 4301 // nodes with their original operands intact. Legalization can produce 4302 // new nodes which may themselves need to be legalized. Iterate until all 4303 // nodes have been legalized. 4304 for (;;) { 4305 bool AnyLegalized = false; 4306 for (auto NI = allnodes_end(); NI != allnodes_begin();) { 4307 --NI; 4308 4309 SDNode *N = NI; 4310 if (N->use_empty() && N != getRoot().getNode()) { 4311 ++NI; 4312 DeleteNode(N); 4313 continue; 4314 } 4315 4316 if (LegalizedNodes.insert(N).second) { 4317 AnyLegalized = true; 4318 Legalizer.LegalizeOp(N); 4319 4320 if (N->use_empty() && N != getRoot().getNode()) { 4321 ++NI; 4322 DeleteNode(N); 4323 } 4324 } 4325 } 4326 if (!AnyLegalized) 4327 break; 4328 4329 } 4330 4331 // Remove dead nodes now. 4332 RemoveDeadNodes(); 4333 } 4334 4335 bool SelectionDAG::LegalizeOp(SDNode *N, 4336 SmallSetVector<SDNode *, 16> &UpdatedNodes) { 4337 SmallPtrSet<SDNode *, 16> LegalizedNodes; 4338 SelectionDAGLegalize Legalizer(*this, LegalizedNodes, &UpdatedNodes); 4339 4340 // Directly insert the node in question, and legalize it. This will recurse 4341 // as needed through operands. 4342 LegalizedNodes.insert(N); 4343 Legalizer.LegalizeOp(N); 4344 4345 return LegalizedNodes.count(N); 4346 } 4347