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