LegalizeDAG.cpp revision 1606e8e4cd937e6de6681f686c266cf61722d972
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/CodeGen/MachineFunction.h" 16#include "llvm/CodeGen/MachineFrameInfo.h" 17#include "llvm/CodeGen/MachineJumpTableInfo.h" 18#include "llvm/CodeGen/MachineModuleInfo.h" 19#include "llvm/CodeGen/DwarfWriter.h" 20#include "llvm/Analysis/DebugInfo.h" 21#include "llvm/CodeGen/PseudoSourceValue.h" 22#include "llvm/Target/TargetFrameInfo.h" 23#include "llvm/Target/TargetLowering.h" 24#include "llvm/Target/TargetData.h" 25#include "llvm/Target/TargetMachine.h" 26#include "llvm/Target/TargetOptions.h" 27#include "llvm/Target/TargetSubtarget.h" 28#include "llvm/CallingConv.h" 29#include "llvm/Constants.h" 30#include "llvm/DerivedTypes.h" 31#include "llvm/Function.h" 32#include "llvm/GlobalVariable.h" 33#include "llvm/Support/CommandLine.h" 34#include "llvm/Support/Compiler.h" 35#include "llvm/Support/MathExtras.h" 36#include "llvm/ADT/DenseMap.h" 37#include "llvm/ADT/SmallVector.h" 38#include "llvm/ADT/SmallPtrSet.h" 39#include <map> 40using namespace llvm; 41 42//===----------------------------------------------------------------------===// 43/// SelectionDAGLegalize - This takes an arbitrary SelectionDAG as input and 44/// hacks on it until the target machine can handle it. This involves 45/// eliminating value sizes the machine cannot handle (promoting small sizes to 46/// large sizes or splitting up large values into small values) as well as 47/// eliminating operations the machine cannot handle. 48/// 49/// This code also does a small amount of optimization and recognition of idioms 50/// as part of its processing. For example, if a target does not support a 51/// 'setcc' instruction efficiently, but does support 'brcc' instruction, this 52/// will attempt merge setcc and brc instructions into brcc's. 53/// 54namespace { 55class VISIBILITY_HIDDEN SelectionDAGLegalize { 56 TargetLowering &TLI; 57 SelectionDAG &DAG; 58 bool TypesNeedLegalizing; 59 bool Fast; 60 61 // Libcall insertion helpers. 62 63 /// LastCALLSEQ_END - This keeps track of the CALLSEQ_END node that has been 64 /// legalized. We use this to ensure that calls are properly serialized 65 /// against each other, including inserted libcalls. 66 SDValue LastCALLSEQ_END; 67 68 /// IsLegalizingCall - This member is used *only* for purposes of providing 69 /// helpful assertions that a libcall isn't created while another call is 70 /// being legalized (which could lead to non-serialized call sequences). 71 bool IsLegalizingCall; 72 73 /// IsLegalizingCallArguments - This member is used only for the purpose 74 /// of providing assert to check for LegalizeTypes because legalizing an 75 /// operation might introduce call nodes that might need type legalization. 76 bool IsLegalizingCallArgs; 77 78 enum LegalizeAction { 79 Legal, // The target natively supports this operation. 80 Promote, // This operation should be executed in a larger type. 81 Expand // Try to expand this to other ops, otherwise use a libcall. 82 }; 83 84 /// ValueTypeActions - This is a bitvector that contains two bits for each 85 /// value type, where the two bits correspond to the LegalizeAction enum. 86 /// This can be queried with "getTypeAction(VT)". 87 TargetLowering::ValueTypeActionImpl ValueTypeActions; 88 89 /// LegalizedNodes - For nodes that are of legal width, and that have more 90 /// than one use, this map indicates what regularized operand to use. This 91 /// allows us to avoid legalizing the same thing more than once. 92 DenseMap<SDValue, SDValue> LegalizedNodes; 93 94 /// PromotedNodes - For nodes that are below legal width, and that have more 95 /// than one use, this map indicates what promoted value to use. This allows 96 /// us to avoid promoting the same thing more than once. 97 DenseMap<SDValue, SDValue> PromotedNodes; 98 99 /// ExpandedNodes - For nodes that need to be expanded this map indicates 100 /// which operands are the expanded version of the input. This allows 101 /// us to avoid expanding the same node more than once. 102 DenseMap<SDValue, std::pair<SDValue, SDValue> > ExpandedNodes; 103 104 /// SplitNodes - For vector nodes that need to be split, this map indicates 105 /// which operands are the split version of the input. This allows us 106 /// to avoid splitting the same node more than once. 107 std::map<SDValue, std::pair<SDValue, SDValue> > SplitNodes; 108 109 /// ScalarizedNodes - For nodes that need to be converted from vector types to 110 /// scalar types, this contains the mapping of ones we have already 111 /// processed to the result. 112 std::map<SDValue, SDValue> ScalarizedNodes; 113 114 /// WidenNodes - For nodes that need to be widened from one vector type to 115 /// another, this contains the mapping of those that we have already widen. 116 /// This allows us to avoid widening more than once. 117 std::map<SDValue, SDValue> WidenNodes; 118 119 void AddLegalizedOperand(SDValue From, SDValue To) { 120 LegalizedNodes.insert(std::make_pair(From, To)); 121 // If someone requests legalization of the new node, return itself. 122 if (From != To) 123 LegalizedNodes.insert(std::make_pair(To, To)); 124 } 125 void AddPromotedOperand(SDValue From, SDValue To) { 126 bool isNew = PromotedNodes.insert(std::make_pair(From, To)).second; 127 assert(isNew && "Got into the map somehow?"); 128 isNew = isNew; 129 // If someone requests legalization of the new node, return itself. 130 LegalizedNodes.insert(std::make_pair(To, To)); 131 } 132 void AddWidenedOperand(SDValue From, SDValue To) { 133 bool isNew = WidenNodes.insert(std::make_pair(From, To)).second; 134 assert(isNew && "Got into the map somehow?"); 135 isNew = isNew; 136 // If someone requests legalization of the new node, return itself. 137 LegalizedNodes.insert(std::make_pair(To, To)); 138 } 139 140public: 141 explicit SelectionDAGLegalize(SelectionDAG &DAG, bool TypesNeedLegalizing, 142 bool fast); 143 144 /// getTypeAction - Return how we should legalize values of this type, either 145 /// it is already legal or we need to expand it into multiple registers of 146 /// smaller integer type, or we need to promote it to a larger type. 147 LegalizeAction getTypeAction(MVT VT) const { 148 return (LegalizeAction)ValueTypeActions.getTypeAction(VT); 149 } 150 151 /// isTypeLegal - Return true if this type is legal on this target. 152 /// 153 bool isTypeLegal(MVT VT) const { 154 return getTypeAction(VT) == Legal; 155 } 156 157 void LegalizeDAG(); 158 159private: 160 /// HandleOp - Legalize, Promote, or Expand the specified operand as 161 /// appropriate for its type. 162 void HandleOp(SDValue Op); 163 164 /// LegalizeOp - We know that the specified value has a legal type. 165 /// Recursively ensure that the operands have legal types, then return the 166 /// result. 167 SDValue LegalizeOp(SDValue O); 168 169 /// UnrollVectorOp - We know that the given vector has a legal type, however 170 /// the operation it performs is not legal and is an operation that we have 171 /// no way of lowering. "Unroll" the vector, splitting out the scalars and 172 /// operating on each element individually. 173 SDValue UnrollVectorOp(SDValue O); 174 175 /// PerformInsertVectorEltInMemory - Some target cannot handle a variable 176 /// insertion index for the INSERT_VECTOR_ELT instruction. In this case, it 177 /// is necessary to spill the vector being inserted into to memory, perform 178 /// the insert there, and then read the result back. 179 SDValue PerformInsertVectorEltInMemory(SDValue Vec, SDValue Val, 180 SDValue Idx, DebugLoc dl); 181 182 /// PromoteOp - Given an operation that produces a value in an invalid type, 183 /// promote it to compute the value into a larger type. The produced value 184 /// will have the correct bits for the low portion of the register, but no 185 /// guarantee is made about the top bits: it may be zero, sign-extended, or 186 /// garbage. 187 SDValue PromoteOp(SDValue O); 188 189 /// ExpandOp - Expand the specified SDValue into its two component pieces 190 /// Lo&Hi. Note that the Op MUST be an expanded type. As a result of this, 191 /// the LegalizedNodes map is filled in for any results that are not expanded, 192 /// the ExpandedNodes map is filled in for any results that are expanded, and 193 /// the Lo/Hi values are returned. This applies to integer types and Vector 194 /// types. 195 void ExpandOp(SDValue O, SDValue &Lo, SDValue &Hi); 196 197 /// WidenVectorOp - Widen a vector operation to a wider type given by WidenVT 198 /// (e.g., v3i32 to v4i32). The produced value will have the correct value 199 /// for the existing elements but no guarantee is made about the new elements 200 /// at the end of the vector: it may be zero, ones, or garbage. This is useful 201 /// when we have an instruction operating on an illegal vector type and we 202 /// want to widen it to do the computation on a legal wider vector type. 203 SDValue WidenVectorOp(SDValue Op, MVT WidenVT); 204 205 /// SplitVectorOp - Given an operand of vector type, break it down into 206 /// two smaller values. 207 void SplitVectorOp(SDValue O, SDValue &Lo, SDValue &Hi); 208 209 /// ScalarizeVectorOp - Given an operand of single-element vector type 210 /// (e.g. v1f32), convert it into the equivalent operation that returns a 211 /// scalar (e.g. f32) value. 212 SDValue ScalarizeVectorOp(SDValue O); 213 214 /// Useful 16 element vector type that is used to pass operands for widening. 215 typedef SmallVector<SDValue, 16> SDValueVector; 216 217 /// LoadWidenVectorOp - Load a vector for a wider type. Returns true if 218 /// the LdChain contains a single load and false if it contains a token 219 /// factor for multiple loads. It takes 220 /// Result: location to return the result 221 /// LdChain: location to return the load chain 222 /// Op: load operation to widen 223 /// NVT: widen vector result type we want for the load 224 bool LoadWidenVectorOp(SDValue& Result, SDValue& LdChain, 225 SDValue Op, MVT NVT); 226 227 /// Helper genWidenVectorLoads - Helper function to generate a set of 228 /// loads to load a vector with a resulting wider type. It takes 229 /// LdChain: list of chains for the load we have generated 230 /// Chain: incoming chain for the ld vector 231 /// BasePtr: base pointer to load from 232 /// SV: memory disambiguation source value 233 /// SVOffset: memory disambiugation offset 234 /// Alignment: alignment of the memory 235 /// isVolatile: volatile load 236 /// LdWidth: width of memory that we want to load 237 /// ResType: the wider result result type for the resulting loaded vector 238 SDValue genWidenVectorLoads(SDValueVector& LdChain, SDValue Chain, 239 SDValue BasePtr, const Value *SV, 240 int SVOffset, unsigned Alignment, 241 bool isVolatile, unsigned LdWidth, 242 MVT ResType, DebugLoc dl); 243 244 /// StoreWidenVectorOp - Stores a widen vector into non widen memory 245 /// location. It takes 246 /// ST: store node that we want to replace 247 /// Chain: incoming store chain 248 /// BasePtr: base address of where we want to store into 249 SDValue StoreWidenVectorOp(StoreSDNode *ST, SDValue Chain, 250 SDValue BasePtr); 251 252 /// Helper genWidenVectorStores - Helper function to generate a set of 253 /// stores to store a widen vector into non widen memory 254 // It takes 255 // StChain: list of chains for the stores we have generated 256 // Chain: incoming chain for the ld vector 257 // BasePtr: base pointer to load from 258 // SV: memory disambiguation source value 259 // SVOffset: memory disambiugation offset 260 // Alignment: alignment of the memory 261 // isVolatile: volatile lod 262 // ValOp: value to store 263 // StWidth: width of memory that we want to store 264 void genWidenVectorStores(SDValueVector& StChain, SDValue Chain, 265 SDValue BasePtr, const Value *SV, 266 int SVOffset, unsigned Alignment, 267 bool isVolatile, SDValue ValOp, 268 unsigned StWidth, DebugLoc dl); 269 270 /// isShuffleLegal - Return non-null if a vector shuffle is legal with the 271 /// specified mask and type. Targets can specify exactly which masks they 272 /// support and the code generator is tasked with not creating illegal masks. 273 /// 274 /// Note that this will also return true for shuffles that are promoted to a 275 /// different type. 276 /// 277 /// If this is a legal shuffle, this method returns the (possibly promoted) 278 /// build_vector Mask. If it's not a legal shuffle, it returns null. 279 SDNode *isShuffleLegal(MVT VT, SDValue Mask) const; 280 281 bool LegalizeAllNodesNotLeadingTo(SDNode *N, SDNode *Dest, 282 SmallPtrSet<SDNode*, 32> &NodesLeadingTo); 283 284 void LegalizeSetCCOperands(SDValue &LHS, SDValue &RHS, SDValue &CC, 285 DebugLoc dl); 286 void LegalizeSetCCCondCode(MVT VT, SDValue &LHS, SDValue &RHS, SDValue &CC, 287 DebugLoc dl); 288 void LegalizeSetCC(MVT VT, SDValue &LHS, SDValue &RHS, SDValue &CC, 289 DebugLoc dl) { 290 LegalizeSetCCOperands(LHS, RHS, CC, dl); 291 LegalizeSetCCCondCode(VT, LHS, RHS, CC, dl); 292 } 293 294 SDValue ExpandLibCall(RTLIB::Libcall LC, SDNode *Node, bool isSigned, 295 SDValue &Hi); 296 SDValue ExpandIntToFP(bool isSigned, MVT DestTy, SDValue Source, DebugLoc dl); 297 298 SDValue EmitStackConvert(SDValue SrcOp, MVT SlotVT, MVT DestVT, DebugLoc dl); 299 SDValue ExpandBUILD_VECTOR(SDNode *Node); 300 SDValue ExpandSCALAR_TO_VECTOR(SDNode *Node); 301 SDValue LegalizeINT_TO_FP(SDValue Result, bool isSigned, MVT DestTy, 302 SDValue Op, DebugLoc dl); 303 SDValue ExpandLegalINT_TO_FP(bool isSigned, SDValue LegalOp, MVT DestVT, 304 DebugLoc dl); 305 SDValue PromoteLegalINT_TO_FP(SDValue LegalOp, MVT DestVT, bool isSigned, 306 DebugLoc dl); 307 SDValue PromoteLegalFP_TO_INT(SDValue LegalOp, MVT DestVT, bool isSigned, 308 DebugLoc dl); 309 310 SDValue ExpandBSWAP(SDValue Op, DebugLoc dl); 311 SDValue ExpandBitCount(unsigned Opc, SDValue Op, DebugLoc dl); 312 bool ExpandShift(unsigned Opc, SDValue Op, SDValue Amt, 313 SDValue &Lo, SDValue &Hi, DebugLoc dl); 314 void ExpandShiftParts(unsigned NodeOp, SDValue Op, SDValue Amt, 315 SDValue &Lo, SDValue &Hi, DebugLoc dl); 316 317 SDValue ExpandEXTRACT_SUBVECTOR(SDValue Op); 318 SDValue ExpandEXTRACT_VECTOR_ELT(SDValue Op); 319}; 320} 321 322/// isVectorShuffleLegal - Return true if a vector shuffle is legal with the 323/// specified mask and type. Targets can specify exactly which masks they 324/// support and the code generator is tasked with not creating illegal masks. 325/// 326/// Note that this will also return true for shuffles that are promoted to a 327/// different type. 328SDNode *SelectionDAGLegalize::isShuffleLegal(MVT VT, SDValue Mask) const { 329 switch (TLI.getOperationAction(ISD::VECTOR_SHUFFLE, VT)) { 330 default: return 0; 331 case TargetLowering::Legal: 332 case TargetLowering::Custom: 333 break; 334 case TargetLowering::Promote: { 335 // If this is promoted to a different type, convert the shuffle mask and 336 // ask if it is legal in the promoted type! 337 MVT NVT = TLI.getTypeToPromoteTo(ISD::VECTOR_SHUFFLE, VT); 338 MVT EltVT = NVT.getVectorElementType(); 339 340 // If we changed # elements, change the shuffle mask. 341 unsigned NumEltsGrowth = 342 NVT.getVectorNumElements() / VT.getVectorNumElements(); 343 assert(NumEltsGrowth && "Cannot promote to vector type with fewer elts!"); 344 if (NumEltsGrowth > 1) { 345 // Renumber the elements. 346 SmallVector<SDValue, 8> Ops; 347 for (unsigned i = 0, e = Mask.getNumOperands(); i != e; ++i) { 348 SDValue InOp = Mask.getOperand(i); 349 for (unsigned j = 0; j != NumEltsGrowth; ++j) { 350 if (InOp.getOpcode() == ISD::UNDEF) 351 Ops.push_back(DAG.getUNDEF(EltVT)); 352 else { 353 unsigned InEltNo = cast<ConstantSDNode>(InOp)->getZExtValue(); 354 Ops.push_back(DAG.getConstant(InEltNo*NumEltsGrowth+j, EltVT)); 355 } 356 } 357 } 358 Mask = DAG.getNode(ISD::BUILD_VECTOR, Mask.getDebugLoc(), 359 NVT, &Ops[0], Ops.size()); 360 } 361 VT = NVT; 362 break; 363 } 364 } 365 return TLI.isShuffleMaskLegal(Mask, VT) ? Mask.getNode() : 0; 366} 367 368SelectionDAGLegalize::SelectionDAGLegalize(SelectionDAG &dag, 369 bool types, bool fast) 370 : TLI(dag.getTargetLoweringInfo()), DAG(dag), TypesNeedLegalizing(types), 371 Fast(fast), ValueTypeActions(TLI.getValueTypeActions()) { 372 assert(MVT::LAST_VALUETYPE <= 32 && 373 "Too many value types for ValueTypeActions to hold!"); 374} 375 376void SelectionDAGLegalize::LegalizeDAG() { 377 LastCALLSEQ_END = DAG.getEntryNode(); 378 IsLegalizingCall = false; 379 IsLegalizingCallArgs = false; 380 381 // The legalize process is inherently a bottom-up recursive process (users 382 // legalize their uses before themselves). Given infinite stack space, we 383 // could just start legalizing on the root and traverse the whole graph. In 384 // practice however, this causes us to run out of stack space on large basic 385 // blocks. To avoid this problem, compute an ordering of the nodes where each 386 // node is only legalized after all of its operands are legalized. 387 DAG.AssignTopologicalOrder(); 388 for (SelectionDAG::allnodes_iterator I = DAG.allnodes_begin(), 389 E = prior(DAG.allnodes_end()); I != next(E); ++I) 390 HandleOp(SDValue(I, 0)); 391 392 // Finally, it's possible the root changed. Get the new root. 393 SDValue OldRoot = DAG.getRoot(); 394 assert(LegalizedNodes.count(OldRoot) && "Root didn't get legalized?"); 395 DAG.setRoot(LegalizedNodes[OldRoot]); 396 397 ExpandedNodes.clear(); 398 LegalizedNodes.clear(); 399 PromotedNodes.clear(); 400 SplitNodes.clear(); 401 ScalarizedNodes.clear(); 402 WidenNodes.clear(); 403 404 // Remove dead nodes now. 405 DAG.RemoveDeadNodes(); 406} 407 408 409/// FindCallEndFromCallStart - Given a chained node that is part of a call 410/// sequence, find the CALLSEQ_END node that terminates the call sequence. 411static SDNode *FindCallEndFromCallStart(SDNode *Node) { 412 if (Node->getOpcode() == ISD::CALLSEQ_END) 413 return Node; 414 if (Node->use_empty()) 415 return 0; // No CallSeqEnd 416 417 // The chain is usually at the end. 418 SDValue TheChain(Node, Node->getNumValues()-1); 419 if (TheChain.getValueType() != MVT::Other) { 420 // Sometimes it's at the beginning. 421 TheChain = SDValue(Node, 0); 422 if (TheChain.getValueType() != MVT::Other) { 423 // Otherwise, hunt for it. 424 for (unsigned i = 1, e = Node->getNumValues(); i != e; ++i) 425 if (Node->getValueType(i) == MVT::Other) { 426 TheChain = SDValue(Node, i); 427 break; 428 } 429 430 // Otherwise, we walked into a node without a chain. 431 if (TheChain.getValueType() != MVT::Other) 432 return 0; 433 } 434 } 435 436 for (SDNode::use_iterator UI = Node->use_begin(), 437 E = Node->use_end(); UI != E; ++UI) { 438 439 // Make sure to only follow users of our token chain. 440 SDNode *User = *UI; 441 for (unsigned i = 0, e = User->getNumOperands(); i != e; ++i) 442 if (User->getOperand(i) == TheChain) 443 if (SDNode *Result = FindCallEndFromCallStart(User)) 444 return Result; 445 } 446 return 0; 447} 448 449/// FindCallStartFromCallEnd - Given a chained node that is part of a call 450/// sequence, find the CALLSEQ_START node that initiates the call sequence. 451static SDNode *FindCallStartFromCallEnd(SDNode *Node) { 452 assert(Node && "Didn't find callseq_start for a call??"); 453 if (Node->getOpcode() == ISD::CALLSEQ_START) return Node; 454 455 assert(Node->getOperand(0).getValueType() == MVT::Other && 456 "Node doesn't have a token chain argument!"); 457 return FindCallStartFromCallEnd(Node->getOperand(0).getNode()); 458} 459 460/// LegalizeAllNodesNotLeadingTo - Recursively walk the uses of N, looking to 461/// see if any uses can reach Dest. If no dest operands can get to dest, 462/// legalize them, legalize ourself, and return false, otherwise, return true. 463/// 464/// Keep track of the nodes we fine that actually do lead to Dest in 465/// NodesLeadingTo. This avoids retraversing them exponential number of times. 466/// 467bool SelectionDAGLegalize::LegalizeAllNodesNotLeadingTo(SDNode *N, SDNode *Dest, 468 SmallPtrSet<SDNode*, 32> &NodesLeadingTo) { 469 if (N == Dest) return true; // N certainly leads to Dest :) 470 471 // If we've already processed this node and it does lead to Dest, there is no 472 // need to reprocess it. 473 if (NodesLeadingTo.count(N)) return true; 474 475 // If the first result of this node has been already legalized, then it cannot 476 // reach N. 477 switch (getTypeAction(N->getValueType(0))) { 478 case Legal: 479 if (LegalizedNodes.count(SDValue(N, 0))) return false; 480 break; 481 case Promote: 482 if (PromotedNodes.count(SDValue(N, 0))) return false; 483 break; 484 case Expand: 485 if (ExpandedNodes.count(SDValue(N, 0))) return false; 486 break; 487 } 488 489 // Okay, this node has not already been legalized. Check and legalize all 490 // operands. If none lead to Dest, then we can legalize this node. 491 bool OperandsLeadToDest = false; 492 for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) 493 OperandsLeadToDest |= // If an operand leads to Dest, so do we. 494 LegalizeAllNodesNotLeadingTo(N->getOperand(i).getNode(), Dest, NodesLeadingTo); 495 496 if (OperandsLeadToDest) { 497 NodesLeadingTo.insert(N); 498 return true; 499 } 500 501 // Okay, this node looks safe, legalize it and return false. 502 HandleOp(SDValue(N, 0)); 503 return false; 504} 505 506/// HandleOp - Legalize, Promote, Widen, or Expand the specified operand as 507/// appropriate for its type. 508void SelectionDAGLegalize::HandleOp(SDValue Op) { 509 MVT VT = Op.getValueType(); 510 // If the type legalizer was run then we should never see any illegal result 511 // types here except for target constants (the type legalizer does not touch 512 // those) or for build vector used as a mask for a vector shuffle. 513 // FIXME: We can removed the BUILD_VECTOR case when we fix PR2957. 514 assert((TypesNeedLegalizing || getTypeAction(VT) == Legal || 515 IsLegalizingCallArgs || Op.getOpcode() == ISD::TargetConstant || 516 Op.getOpcode() == ISD::BUILD_VECTOR) && 517 "Illegal type introduced after type legalization?"); 518 switch (getTypeAction(VT)) { 519 default: assert(0 && "Bad type action!"); 520 case Legal: (void)LegalizeOp(Op); break; 521 case Promote: 522 if (!VT.isVector()) { 523 (void)PromoteOp(Op); 524 break; 525 } 526 else { 527 // See if we can widen otherwise use Expand to either scalarize or split 528 MVT WidenVT = TLI.getWidenVectorType(VT); 529 if (WidenVT != MVT::Other) { 530 (void) WidenVectorOp(Op, WidenVT); 531 break; 532 } 533 // else fall thru to expand since we can't widen the vector 534 } 535 case Expand: 536 if (!VT.isVector()) { 537 // If this is an illegal scalar, expand it into its two component 538 // pieces. 539 SDValue X, Y; 540 if (Op.getOpcode() == ISD::TargetConstant) 541 break; // Allow illegal target nodes. 542 ExpandOp(Op, X, Y); 543 } else if (VT.getVectorNumElements() == 1) { 544 // If this is an illegal single element vector, convert it to a 545 // scalar operation. 546 (void)ScalarizeVectorOp(Op); 547 } else { 548 // This is an illegal multiple element vector. 549 // Split it in half and legalize both parts. 550 SDValue X, Y; 551 SplitVectorOp(Op, X, Y); 552 } 553 break; 554 } 555} 556 557/// ExpandConstantFP - Expands the ConstantFP node to an integer constant or 558/// a load from the constant pool. 559static SDValue ExpandConstantFP(ConstantFPSDNode *CFP, bool UseCP, 560 SelectionDAG &DAG, const TargetLowering &TLI) { 561 bool Extend = false; 562 DebugLoc dl = CFP->getDebugLoc(); 563 564 // If a FP immediate is precise when represented as a float and if the 565 // target can do an extending load from float to double, we put it into 566 // the constant pool as a float, even if it's is statically typed as a 567 // double. This shrinks FP constants and canonicalizes them for targets where 568 // an FP extending load is the same cost as a normal load (such as on the x87 569 // fp stack or PPC FP unit). 570 MVT VT = CFP->getValueType(0); 571 ConstantFP *LLVMC = const_cast<ConstantFP*>(CFP->getConstantFPValue()); 572 if (!UseCP) { 573 assert((VT == MVT::f64 || VT == MVT::f32) && "Invalid type expansion"); 574 return DAG.getConstant(LLVMC->getValueAPF().bitcastToAPInt(), 575 (VT == MVT::f64) ? MVT::i64 : MVT::i32); 576 } 577 578 MVT OrigVT = VT; 579 MVT SVT = VT; 580 while (SVT != MVT::f32) { 581 SVT = (MVT::SimpleValueType)(SVT.getSimpleVT() - 1); 582 if (CFP->isValueValidForType(SVT, CFP->getValueAPF()) && 583 // Only do this if the target has a native EXTLOAD instruction from 584 // smaller type. 585 TLI.isLoadExtLegal(ISD::EXTLOAD, SVT) && 586 TLI.ShouldShrinkFPConstant(OrigVT)) { 587 const Type *SType = SVT.getTypeForMVT(); 588 LLVMC = cast<ConstantFP>(ConstantExpr::getFPTrunc(LLVMC, SType)); 589 VT = SVT; 590 Extend = true; 591 } 592 } 593 594 SDValue CPIdx = DAG.getConstantPool(LLVMC, TLI.getPointerTy()); 595 unsigned Alignment = cast<ConstantPoolSDNode>(CPIdx)->getAlignment(); 596 if (Extend) 597 return DAG.getExtLoad(ISD::EXTLOAD, dl, 598 OrigVT, DAG.getEntryNode(), 599 CPIdx, PseudoSourceValue::getConstantPool(), 600 0, VT, false, Alignment); 601 return DAG.getLoad(OrigVT, dl, DAG.getEntryNode(), CPIdx, 602 PseudoSourceValue::getConstantPool(), 0, false, Alignment); 603} 604 605 606/// ExpandFCOPYSIGNToBitwiseOps - Expands fcopysign to a series of bitwise 607/// operations. 608static 609SDValue ExpandFCOPYSIGNToBitwiseOps(SDNode *Node, MVT NVT, 610 SelectionDAG &DAG, 611 const TargetLowering &TLI) { 612 DebugLoc dl = Node->getDebugLoc(); 613 MVT VT = Node->getValueType(0); 614 MVT SrcVT = Node->getOperand(1).getValueType(); 615 assert((SrcVT == MVT::f32 || SrcVT == MVT::f64) && 616 "fcopysign expansion only supported for f32 and f64"); 617 MVT SrcNVT = (SrcVT == MVT::f64) ? MVT::i64 : MVT::i32; 618 619 // First get the sign bit of second operand. 620 SDValue Mask1 = (SrcVT == MVT::f64) 621 ? DAG.getConstantFP(BitsToDouble(1ULL << 63), SrcVT) 622 : DAG.getConstantFP(BitsToFloat(1U << 31), SrcVT); 623 Mask1 = DAG.getNode(ISD::BIT_CONVERT, dl, SrcNVT, Mask1); 624 SDValue SignBit= DAG.getNode(ISD::BIT_CONVERT, dl, SrcNVT, 625 Node->getOperand(1)); 626 SignBit = DAG.getNode(ISD::AND, dl, SrcNVT, SignBit, Mask1); 627 // Shift right or sign-extend it if the two operands have different types. 628 int SizeDiff = SrcNVT.getSizeInBits() - NVT.getSizeInBits(); 629 if (SizeDiff > 0) { 630 SignBit = DAG.getNode(ISD::SRL, dl, SrcNVT, SignBit, 631 DAG.getConstant(SizeDiff, TLI.getShiftAmountTy())); 632 SignBit = DAG.getNode(ISD::TRUNCATE, dl, NVT, SignBit); 633 } else if (SizeDiff < 0) { 634 SignBit = DAG.getNode(ISD::ZERO_EXTEND, dl, NVT, SignBit); 635 SignBit = DAG.getNode(ISD::SHL, dl, NVT, SignBit, 636 DAG.getConstant(-SizeDiff, TLI.getShiftAmountTy())); 637 } 638 639 // Clear the sign bit of first operand. 640 SDValue Mask2 = (VT == MVT::f64) 641 ? DAG.getConstantFP(BitsToDouble(~(1ULL << 63)), VT) 642 : DAG.getConstantFP(BitsToFloat(~(1U << 31)), VT); 643 Mask2 = DAG.getNode(ISD::BIT_CONVERT, dl, NVT, Mask2); 644 SDValue Result = DAG.getNode(ISD::BIT_CONVERT, dl, NVT, Node->getOperand(0)); 645 Result = DAG.getNode(ISD::AND, dl, NVT, Result, Mask2); 646 647 // Or the value with the sign bit. 648 Result = DAG.getNode(ISD::OR, dl, NVT, Result, SignBit); 649 return Result; 650} 651 652/// ExpandUnalignedStore - Expands an unaligned store to 2 half-size stores. 653static 654SDValue ExpandUnalignedStore(StoreSDNode *ST, SelectionDAG &DAG, 655 const TargetLowering &TLI) { 656 SDValue Chain = ST->getChain(); 657 SDValue Ptr = ST->getBasePtr(); 658 SDValue Val = ST->getValue(); 659 MVT VT = Val.getValueType(); 660 int Alignment = ST->getAlignment(); 661 int SVOffset = ST->getSrcValueOffset(); 662 DebugLoc dl = ST->getDebugLoc(); 663 if (ST->getMemoryVT().isFloatingPoint() || 664 ST->getMemoryVT().isVector()) { 665 MVT intVT = MVT::getIntegerVT(VT.getSizeInBits()); 666 if (TLI.isTypeLegal(intVT)) { 667 // Expand to a bitconvert of the value to the integer type of the 668 // same size, then a (misaligned) int store. 669 // FIXME: Does not handle truncating floating point stores! 670 SDValue Result = DAG.getNode(ISD::BIT_CONVERT, dl, intVT, Val); 671 return DAG.getStore(Chain, dl, Result, Ptr, ST->getSrcValue(), 672 SVOffset, ST->isVolatile(), Alignment); 673 } else { 674 // Do a (aligned) store to a stack slot, then copy from the stack slot 675 // to the final destination using (unaligned) integer loads and stores. 676 MVT StoredVT = ST->getMemoryVT(); 677 MVT RegVT = 678 TLI.getRegisterType(MVT::getIntegerVT(StoredVT.getSizeInBits())); 679 unsigned StoredBytes = StoredVT.getSizeInBits() / 8; 680 unsigned RegBytes = RegVT.getSizeInBits() / 8; 681 unsigned NumRegs = (StoredBytes + RegBytes - 1) / RegBytes; 682 683 // Make sure the stack slot is also aligned for the register type. 684 SDValue StackPtr = DAG.CreateStackTemporary(StoredVT, RegVT); 685 686 // Perform the original store, only redirected to the stack slot. 687 SDValue Store = DAG.getTruncStore(Chain, dl, 688 Val, StackPtr, NULL, 0,StoredVT); 689 SDValue Increment = DAG.getConstant(RegBytes, TLI.getPointerTy()); 690 SmallVector<SDValue, 8> Stores; 691 unsigned Offset = 0; 692 693 // Do all but one copies using the full register width. 694 for (unsigned i = 1; i < NumRegs; i++) { 695 // Load one integer register's worth from the stack slot. 696 SDValue Load = DAG.getLoad(RegVT, dl, Store, StackPtr, NULL, 0); 697 // Store it to the final location. Remember the store. 698 Stores.push_back(DAG.getStore(Load.getValue(1), dl, Load, Ptr, 699 ST->getSrcValue(), SVOffset + Offset, 700 ST->isVolatile(), 701 MinAlign(ST->getAlignment(), Offset))); 702 // Increment the pointers. 703 Offset += RegBytes; 704 StackPtr = DAG.getNode(ISD::ADD, dl, StackPtr.getValueType(), StackPtr, 705 Increment); 706 Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr, Increment); 707 } 708 709 // The last store may be partial. Do a truncating store. On big-endian 710 // machines this requires an extending load from the stack slot to ensure 711 // that the bits are in the right place. 712 MVT MemVT = MVT::getIntegerVT(8 * (StoredBytes - Offset)); 713 714 // Load from the stack slot. 715 SDValue Load = DAG.getExtLoad(ISD::EXTLOAD, dl, RegVT, Store, StackPtr, 716 NULL, 0, MemVT); 717 718 Stores.push_back(DAG.getTruncStore(Load.getValue(1), dl, Load, Ptr, 719 ST->getSrcValue(), SVOffset + Offset, 720 MemVT, ST->isVolatile(), 721 MinAlign(ST->getAlignment(), Offset))); 722 // The order of the stores doesn't matter - say it with a TokenFactor. 723 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, &Stores[0], 724 Stores.size()); 725 } 726 } 727 assert(ST->getMemoryVT().isInteger() && 728 !ST->getMemoryVT().isVector() && 729 "Unaligned store of unknown type."); 730 // Get the half-size VT 731 MVT NewStoredVT = 732 (MVT::SimpleValueType)(ST->getMemoryVT().getSimpleVT() - 1); 733 int NumBits = NewStoredVT.getSizeInBits(); 734 int IncrementSize = NumBits / 8; 735 736 // Divide the stored value in two parts. 737 SDValue ShiftAmount = DAG.getConstant(NumBits, TLI.getShiftAmountTy()); 738 SDValue Lo = Val; 739 SDValue Hi = DAG.getNode(ISD::SRL, dl, VT, Val, ShiftAmount); 740 741 // Store the two parts 742 SDValue Store1, Store2; 743 Store1 = DAG.getTruncStore(Chain, dl, TLI.isLittleEndian()?Lo:Hi, Ptr, 744 ST->getSrcValue(), SVOffset, NewStoredVT, 745 ST->isVolatile(), Alignment); 746 Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr, 747 DAG.getConstant(IncrementSize, TLI.getPointerTy())); 748 Alignment = MinAlign(Alignment, IncrementSize); 749 Store2 = DAG.getTruncStore(Chain, dl, TLI.isLittleEndian()?Hi:Lo, Ptr, 750 ST->getSrcValue(), SVOffset + IncrementSize, 751 NewStoredVT, ST->isVolatile(), Alignment); 752 753 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Store1, Store2); 754} 755 756/// ExpandUnalignedLoad - Expands an unaligned load to 2 half-size loads. 757static 758SDValue ExpandUnalignedLoad(LoadSDNode *LD, SelectionDAG &DAG, 759 const TargetLowering &TLI) { 760 int SVOffset = LD->getSrcValueOffset(); 761 SDValue Chain = LD->getChain(); 762 SDValue Ptr = LD->getBasePtr(); 763 MVT VT = LD->getValueType(0); 764 MVT LoadedVT = LD->getMemoryVT(); 765 DebugLoc dl = LD->getDebugLoc(); 766 if (VT.isFloatingPoint() || VT.isVector()) { 767 MVT intVT = MVT::getIntegerVT(LoadedVT.getSizeInBits()); 768 if (TLI.isTypeLegal(intVT)) { 769 // Expand to a (misaligned) integer load of the same size, 770 // then bitconvert to floating point or vector. 771 SDValue newLoad = DAG.getLoad(intVT, dl, Chain, Ptr, LD->getSrcValue(), 772 SVOffset, LD->isVolatile(), 773 LD->getAlignment()); 774 SDValue Result = DAG.getNode(ISD::BIT_CONVERT, dl, LoadedVT, newLoad); 775 if (VT.isFloatingPoint() && LoadedVT != VT) 776 Result = DAG.getNode(ISD::FP_EXTEND, dl, VT, Result); 777 778 SDValue Ops[] = { Result, Chain }; 779 return DAG.getMergeValues(Ops, 2, dl); 780 } else { 781 // Copy the value to a (aligned) stack slot using (unaligned) integer 782 // loads and stores, then do a (aligned) load from the stack slot. 783 MVT RegVT = TLI.getRegisterType(intVT); 784 unsigned LoadedBytes = LoadedVT.getSizeInBits() / 8; 785 unsigned RegBytes = RegVT.getSizeInBits() / 8; 786 unsigned NumRegs = (LoadedBytes + RegBytes - 1) / RegBytes; 787 788 // Make sure the stack slot is also aligned for the register type. 789 SDValue StackBase = DAG.CreateStackTemporary(LoadedVT, RegVT); 790 791 SDValue Increment = DAG.getConstant(RegBytes, TLI.getPointerTy()); 792 SmallVector<SDValue, 8> Stores; 793 SDValue StackPtr = StackBase; 794 unsigned Offset = 0; 795 796 // Do all but one copies using the full register width. 797 for (unsigned i = 1; i < NumRegs; i++) { 798 // Load one integer register's worth from the original location. 799 SDValue Load = DAG.getLoad(RegVT, dl, Chain, Ptr, LD->getSrcValue(), 800 SVOffset + Offset, LD->isVolatile(), 801 MinAlign(LD->getAlignment(), Offset)); 802 // Follow the load with a store to the stack slot. Remember the store. 803 Stores.push_back(DAG.getStore(Load.getValue(1), dl, Load, StackPtr, 804 NULL, 0)); 805 // Increment the pointers. 806 Offset += RegBytes; 807 Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr, Increment); 808 StackPtr = DAG.getNode(ISD::ADD, dl, StackPtr.getValueType(), StackPtr, 809 Increment); 810 } 811 812 // The last copy may be partial. Do an extending load. 813 MVT MemVT = MVT::getIntegerVT(8 * (LoadedBytes - Offset)); 814 SDValue Load = DAG.getExtLoad(ISD::EXTLOAD, dl, RegVT, Chain, Ptr, 815 LD->getSrcValue(), SVOffset + Offset, 816 MemVT, LD->isVolatile(), 817 MinAlign(LD->getAlignment(), Offset)); 818 // Follow the load with a store to the stack slot. Remember the store. 819 // On big-endian machines this requires a truncating store to ensure 820 // that the bits end up in the right place. 821 Stores.push_back(DAG.getTruncStore(Load.getValue(1), dl, Load, StackPtr, 822 NULL, 0, MemVT)); 823 824 // The order of the stores doesn't matter - say it with a TokenFactor. 825 SDValue TF = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, &Stores[0], 826 Stores.size()); 827 828 // Finally, perform the original load only redirected to the stack slot. 829 Load = DAG.getExtLoad(LD->getExtensionType(), dl, VT, TF, StackBase, 830 NULL, 0, LoadedVT); 831 832 // Callers expect a MERGE_VALUES node. 833 SDValue Ops[] = { Load, TF }; 834 return DAG.getMergeValues(Ops, 2, dl); 835 } 836 } 837 assert(LoadedVT.isInteger() && !LoadedVT.isVector() && 838 "Unaligned load of unsupported type."); 839 840 // Compute the new VT that is half the size of the old one. This is an 841 // integer MVT. 842 unsigned NumBits = LoadedVT.getSizeInBits(); 843 MVT NewLoadedVT; 844 NewLoadedVT = MVT::getIntegerVT(NumBits/2); 845 NumBits >>= 1; 846 847 unsigned Alignment = LD->getAlignment(); 848 unsigned IncrementSize = NumBits / 8; 849 ISD::LoadExtType HiExtType = LD->getExtensionType(); 850 851 // If the original load is NON_EXTLOAD, the hi part load must be ZEXTLOAD. 852 if (HiExtType == ISD::NON_EXTLOAD) 853 HiExtType = ISD::ZEXTLOAD; 854 855 // Load the value in two parts 856 SDValue Lo, Hi; 857 if (TLI.isLittleEndian()) { 858 Lo = DAG.getExtLoad(ISD::ZEXTLOAD, dl, VT, Chain, Ptr, LD->getSrcValue(), 859 SVOffset, NewLoadedVT, LD->isVolatile(), Alignment); 860 Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr, 861 DAG.getConstant(IncrementSize, TLI.getPointerTy())); 862 Hi = DAG.getExtLoad(HiExtType, dl, VT, Chain, Ptr, LD->getSrcValue(), 863 SVOffset + IncrementSize, NewLoadedVT, LD->isVolatile(), 864 MinAlign(Alignment, IncrementSize)); 865 } else { 866 Hi = DAG.getExtLoad(HiExtType, dl, VT, Chain, Ptr, LD->getSrcValue(), 867 SVOffset, NewLoadedVT,LD->isVolatile(), Alignment); 868 Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr, 869 DAG.getConstant(IncrementSize, TLI.getPointerTy())); 870 Lo = DAG.getExtLoad(ISD::ZEXTLOAD, dl, VT, Chain, Ptr, LD->getSrcValue(), 871 SVOffset + IncrementSize, NewLoadedVT, LD->isVolatile(), 872 MinAlign(Alignment, IncrementSize)); 873 } 874 875 // aggregate the two parts 876 SDValue ShiftAmount = DAG.getConstant(NumBits, TLI.getShiftAmountTy()); 877 SDValue Result = DAG.getNode(ISD::SHL, dl, VT, Hi, ShiftAmount); 878 Result = DAG.getNode(ISD::OR, dl, VT, Result, Lo); 879 880 SDValue TF = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo.getValue(1), 881 Hi.getValue(1)); 882 883 SDValue Ops[] = { Result, TF }; 884 return DAG.getMergeValues(Ops, 2, dl); 885} 886 887/// UnrollVectorOp - We know that the given vector has a legal type, however 888/// the operation it performs is not legal and is an operation that we have 889/// no way of lowering. "Unroll" the vector, splitting out the scalars and 890/// operating on each element individually. 891SDValue SelectionDAGLegalize::UnrollVectorOp(SDValue Op) { 892 MVT VT = Op.getValueType(); 893 assert(isTypeLegal(VT) && 894 "Caller should expand or promote operands that are not legal!"); 895 assert(Op.getNode()->getNumValues() == 1 && 896 "Can't unroll a vector with multiple results!"); 897 unsigned NE = VT.getVectorNumElements(); 898 MVT EltVT = VT.getVectorElementType(); 899 DebugLoc dl = Op.getDebugLoc(); 900 901 SmallVector<SDValue, 8> Scalars; 902 SmallVector<SDValue, 4> Operands(Op.getNumOperands()); 903 for (unsigned i = 0; i != NE; ++i) { 904 for (unsigned j = 0; j != Op.getNumOperands(); ++j) { 905 SDValue Operand = Op.getOperand(j); 906 MVT OperandVT = Operand.getValueType(); 907 if (OperandVT.isVector()) { 908 // A vector operand; extract a single element. 909 MVT OperandEltVT = OperandVT.getVectorElementType(); 910 Operands[j] = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, 911 OperandEltVT, 912 Operand, 913 DAG.getConstant(i, MVT::i32)); 914 } else { 915 // A scalar operand; just use it as is. 916 Operands[j] = Operand; 917 } 918 } 919 920 switch (Op.getOpcode()) { 921 default: 922 Scalars.push_back(DAG.getNode(Op.getOpcode(), dl, EltVT, 923 &Operands[0], Operands.size())); 924 break; 925 case ISD::SHL: 926 case ISD::SRA: 927 case ISD::SRL: 928 case ISD::ROTL: 929 case ISD::ROTR: 930 Scalars.push_back(DAG.getNode(Op.getOpcode(), dl, EltVT, Operands[0], 931 DAG.getShiftAmountOperand(Operands[1]))); 932 break; 933 } 934 } 935 936 return DAG.getNode(ISD::BUILD_VECTOR, dl, VT, &Scalars[0], Scalars.size()); 937} 938 939/// GetFPLibCall - Return the right libcall for the given floating point type. 940static RTLIB::Libcall GetFPLibCall(MVT VT, 941 RTLIB::Libcall Call_F32, 942 RTLIB::Libcall Call_F64, 943 RTLIB::Libcall Call_F80, 944 RTLIB::Libcall Call_PPCF128) { 945 return 946 VT == MVT::f32 ? Call_F32 : 947 VT == MVT::f64 ? Call_F64 : 948 VT == MVT::f80 ? Call_F80 : 949 VT == MVT::ppcf128 ? Call_PPCF128 : 950 RTLIB::UNKNOWN_LIBCALL; 951} 952 953/// PerformInsertVectorEltInMemory - Some target cannot handle a variable 954/// insertion index for the INSERT_VECTOR_ELT instruction. In this case, it 955/// is necessary to spill the vector being inserted into to memory, perform 956/// the insert there, and then read the result back. 957SDValue SelectionDAGLegalize:: 958PerformInsertVectorEltInMemory(SDValue Vec, SDValue Val, SDValue Idx, 959 DebugLoc dl) { 960 SDValue Tmp1 = Vec; 961 SDValue Tmp2 = Val; 962 SDValue Tmp3 = Idx; 963 964 // If the target doesn't support this, we have to spill the input vector 965 // to a temporary stack slot, update the element, then reload it. This is 966 // badness. We could also load the value into a vector register (either 967 // with a "move to register" or "extload into register" instruction, then 968 // permute it into place, if the idx is a constant and if the idx is 969 // supported by the target. 970 MVT VT = Tmp1.getValueType(); 971 MVT EltVT = VT.getVectorElementType(); 972 MVT IdxVT = Tmp3.getValueType(); 973 MVT PtrVT = TLI.getPointerTy(); 974 SDValue StackPtr = DAG.CreateStackTemporary(VT); 975 976 int SPFI = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex(); 977 978 // Store the vector. 979 SDValue Ch = DAG.getStore(DAG.getEntryNode(), dl, Tmp1, StackPtr, 980 PseudoSourceValue::getFixedStack(SPFI), 0); 981 982 // Truncate or zero extend offset to target pointer type. 983 unsigned CastOpc = IdxVT.bitsGT(PtrVT) ? ISD::TRUNCATE : ISD::ZERO_EXTEND; 984 Tmp3 = DAG.getNode(CastOpc, dl, PtrVT, Tmp3); 985 // Add the offset to the index. 986 unsigned EltSize = EltVT.getSizeInBits()/8; 987 Tmp3 = DAG.getNode(ISD::MUL, dl, IdxVT, Tmp3,DAG.getConstant(EltSize, IdxVT)); 988 SDValue StackPtr2 = DAG.getNode(ISD::ADD, dl, IdxVT, Tmp3, StackPtr); 989 // Store the scalar value. 990 Ch = DAG.getTruncStore(Ch, dl, Tmp2, StackPtr2, 991 PseudoSourceValue::getFixedStack(SPFI), 0, EltVT); 992 // Load the updated vector. 993 return DAG.getLoad(VT, dl, Ch, StackPtr, 994 PseudoSourceValue::getFixedStack(SPFI), 0); 995} 996 997 998/// LegalizeOp - We know that the specified value has a legal type, and 999/// that its operands are legal. Now ensure that the operation itself 1000/// is legal, recursively ensuring that the operands' operations remain 1001/// legal. 1002SDValue SelectionDAGLegalize::LegalizeOp(SDValue Op) { 1003 if (Op.getOpcode() == ISD::TargetConstant) // Allow illegal target nodes. 1004 return Op; 1005 1006 assert(isTypeLegal(Op.getValueType()) && 1007 "Caller should expand or promote operands that are not legal!"); 1008 SDNode *Node = Op.getNode(); 1009 DebugLoc dl = Node->getDebugLoc(); 1010 1011 // If this operation defines any values that cannot be represented in a 1012 // register on this target, make sure to expand or promote them. 1013 if (Node->getNumValues() > 1) { 1014 for (unsigned i = 0, e = Node->getNumValues(); i != e; ++i) 1015 if (getTypeAction(Node->getValueType(i)) != Legal) { 1016 HandleOp(Op.getValue(i)); 1017 assert(LegalizedNodes.count(Op) && 1018 "Handling didn't add legal operands!"); 1019 return LegalizedNodes[Op]; 1020 } 1021 } 1022 1023 // Note that LegalizeOp may be reentered even from single-use nodes, which 1024 // means that we always must cache transformed nodes. 1025 DenseMap<SDValue, SDValue>::iterator I = LegalizedNodes.find(Op); 1026 if (I != LegalizedNodes.end()) return I->second; 1027 1028 SDValue Tmp1, Tmp2, Tmp3, Tmp4; 1029 SDValue Result = Op; 1030 bool isCustom = false; 1031 1032 switch (Node->getOpcode()) { 1033 case ISD::FrameIndex: 1034 case ISD::EntryToken: 1035 case ISD::Register: 1036 case ISD::BasicBlock: 1037 case ISD::TargetFrameIndex: 1038 case ISD::TargetJumpTable: 1039 case ISD::TargetConstant: 1040 case ISD::TargetConstantFP: 1041 case ISD::TargetConstantPool: 1042 case ISD::TargetGlobalAddress: 1043 case ISD::TargetGlobalTLSAddress: 1044 case ISD::TargetExternalSymbol: 1045 case ISD::VALUETYPE: 1046 case ISD::SRCVALUE: 1047 case ISD::MEMOPERAND: 1048 case ISD::CONDCODE: 1049 case ISD::ARG_FLAGS: 1050 // Primitives must all be legal. 1051 assert(TLI.isOperationLegal(Node->getOpcode(), Node->getValueType(0)) && 1052 "This must be legal!"); 1053 break; 1054 default: 1055 if (Node->getOpcode() >= ISD::BUILTIN_OP_END) { 1056 // If this is a target node, legalize it by legalizing the operands then 1057 // passing it through. 1058 SmallVector<SDValue, 8> Ops; 1059 for (unsigned i = 0, e = Node->getNumOperands(); i != e; ++i) 1060 Ops.push_back(LegalizeOp(Node->getOperand(i))); 1061 1062 Result = DAG.UpdateNodeOperands(Result.getValue(0), &Ops[0], Ops.size()); 1063 1064 for (unsigned i = 0, e = Node->getNumValues(); i != e; ++i) 1065 AddLegalizedOperand(Op.getValue(i), Result.getValue(i)); 1066 return Result.getValue(Op.getResNo()); 1067 } 1068 // Otherwise this is an unhandled builtin node. splat. 1069#ifndef NDEBUG 1070 cerr << "NODE: "; Node->dump(&DAG); cerr << "\n"; 1071#endif 1072 assert(0 && "Do not know how to legalize this operator!"); 1073 abort(); 1074 case ISD::GLOBAL_OFFSET_TABLE: 1075 case ISD::GlobalAddress: 1076 case ISD::GlobalTLSAddress: 1077 case ISD::ExternalSymbol: 1078 case ISD::ConstantPool: 1079 case ISD::JumpTable: // Nothing to do. 1080 switch (TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0))) { 1081 default: assert(0 && "This action is not supported yet!"); 1082 case TargetLowering::Custom: 1083 Tmp1 = TLI.LowerOperation(Op, DAG); 1084 if (Tmp1.getNode()) Result = Tmp1; 1085 // FALLTHROUGH if the target doesn't want to lower this op after all. 1086 case TargetLowering::Legal: 1087 break; 1088 } 1089 break; 1090 case ISD::FRAMEADDR: 1091 case ISD::RETURNADDR: 1092 // The only option for these nodes is to custom lower them. If the target 1093 // does not custom lower them, then return zero. 1094 Tmp1 = TLI.LowerOperation(Op, DAG); 1095 if (Tmp1.getNode()) 1096 Result = Tmp1; 1097 else 1098 Result = DAG.getConstant(0, TLI.getPointerTy()); 1099 break; 1100 case ISD::FRAME_TO_ARGS_OFFSET: { 1101 MVT VT = Node->getValueType(0); 1102 switch (TLI.getOperationAction(Node->getOpcode(), VT)) { 1103 default: assert(0 && "This action is not supported yet!"); 1104 case TargetLowering::Custom: 1105 Result = TLI.LowerOperation(Op, DAG); 1106 if (Result.getNode()) break; 1107 // Fall Thru 1108 case TargetLowering::Legal: 1109 Result = DAG.getConstant(0, VT); 1110 break; 1111 } 1112 } 1113 break; 1114 case ISD::EXCEPTIONADDR: { 1115 Tmp1 = LegalizeOp(Node->getOperand(0)); 1116 MVT VT = Node->getValueType(0); 1117 switch (TLI.getOperationAction(Node->getOpcode(), VT)) { 1118 default: assert(0 && "This action is not supported yet!"); 1119 case TargetLowering::Expand: { 1120 unsigned Reg = TLI.getExceptionAddressRegister(); 1121 Result = DAG.getCopyFromReg(Tmp1, dl, Reg, VT); 1122 } 1123 break; 1124 case TargetLowering::Custom: 1125 Result = TLI.LowerOperation(Op, DAG); 1126 if (Result.getNode()) break; 1127 // Fall Thru 1128 case TargetLowering::Legal: { 1129 SDValue Ops[] = { DAG.getConstant(0, VT), Tmp1 }; 1130 Result = DAG.getMergeValues(Ops, 2, dl); 1131 break; 1132 } 1133 } 1134 } 1135 if (Result.getNode()->getNumValues() == 1) break; 1136 1137 assert(Result.getNode()->getNumValues() == 2 && 1138 "Cannot return more than two values!"); 1139 1140 // Since we produced two values, make sure to remember that we 1141 // legalized both of them. 1142 Tmp1 = LegalizeOp(Result); 1143 Tmp2 = LegalizeOp(Result.getValue(1)); 1144 AddLegalizedOperand(Op.getValue(0), Tmp1); 1145 AddLegalizedOperand(Op.getValue(1), Tmp2); 1146 return Op.getResNo() ? Tmp2 : Tmp1; 1147 case ISD::EHSELECTION: { 1148 Tmp1 = LegalizeOp(Node->getOperand(0)); 1149 Tmp2 = LegalizeOp(Node->getOperand(1)); 1150 MVT VT = Node->getValueType(0); 1151 switch (TLI.getOperationAction(Node->getOpcode(), VT)) { 1152 default: assert(0 && "This action is not supported yet!"); 1153 case TargetLowering::Expand: { 1154 unsigned Reg = TLI.getExceptionSelectorRegister(); 1155 Result = DAG.getCopyFromReg(Tmp2, dl, Reg, VT); 1156 } 1157 break; 1158 case TargetLowering::Custom: 1159 Result = TLI.LowerOperation(Op, DAG); 1160 if (Result.getNode()) break; 1161 // Fall Thru 1162 case TargetLowering::Legal: { 1163 SDValue Ops[] = { DAG.getConstant(0, VT), Tmp2 }; 1164 Result = DAG.getMergeValues(Ops, 2, dl); 1165 break; 1166 } 1167 } 1168 } 1169 if (Result.getNode()->getNumValues() == 1) break; 1170 1171 assert(Result.getNode()->getNumValues() == 2 && 1172 "Cannot return more than two values!"); 1173 1174 // Since we produced two values, make sure to remember that we 1175 // legalized both of them. 1176 Tmp1 = LegalizeOp(Result); 1177 Tmp2 = LegalizeOp(Result.getValue(1)); 1178 AddLegalizedOperand(Op.getValue(0), Tmp1); 1179 AddLegalizedOperand(Op.getValue(1), Tmp2); 1180 return Op.getResNo() ? Tmp2 : Tmp1; 1181 case ISD::EH_RETURN: { 1182 MVT VT = Node->getValueType(0); 1183 // The only "good" option for this node is to custom lower it. 1184 switch (TLI.getOperationAction(Node->getOpcode(), VT)) { 1185 default: assert(0 && "This action is not supported at all!"); 1186 case TargetLowering::Custom: 1187 Result = TLI.LowerOperation(Op, DAG); 1188 if (Result.getNode()) break; 1189 // Fall Thru 1190 case TargetLowering::Legal: 1191 // Target does not know, how to lower this, lower to noop 1192 Result = LegalizeOp(Node->getOperand(0)); 1193 break; 1194 } 1195 } 1196 break; 1197 case ISD::AssertSext: 1198 case ISD::AssertZext: 1199 Tmp1 = LegalizeOp(Node->getOperand(0)); 1200 Result = DAG.UpdateNodeOperands(Result, Tmp1, Node->getOperand(1)); 1201 break; 1202 case ISD::MERGE_VALUES: 1203 // Legalize eliminates MERGE_VALUES nodes. 1204 Result = Node->getOperand(Op.getResNo()); 1205 break; 1206 case ISD::CopyFromReg: 1207 Tmp1 = LegalizeOp(Node->getOperand(0)); 1208 Result = Op.getValue(0); 1209 if (Node->getNumValues() == 2) { 1210 Result = DAG.UpdateNodeOperands(Result, Tmp1, Node->getOperand(1)); 1211 } else { 1212 assert(Node->getNumValues() == 3 && "Invalid copyfromreg!"); 1213 if (Node->getNumOperands() == 3) { 1214 Tmp2 = LegalizeOp(Node->getOperand(2)); 1215 Result = DAG.UpdateNodeOperands(Result, Tmp1, Node->getOperand(1),Tmp2); 1216 } else { 1217 Result = DAG.UpdateNodeOperands(Result, Tmp1, Node->getOperand(1)); 1218 } 1219 AddLegalizedOperand(Op.getValue(2), Result.getValue(2)); 1220 } 1221 // Since CopyFromReg produces two values, make sure to remember that we 1222 // legalized both of them. 1223 AddLegalizedOperand(Op.getValue(0), Result); 1224 AddLegalizedOperand(Op.getValue(1), Result.getValue(1)); 1225 return Result.getValue(Op.getResNo()); 1226 case ISD::UNDEF: { 1227 MVT VT = Op.getValueType(); 1228 switch (TLI.getOperationAction(ISD::UNDEF, VT)) { 1229 default: assert(0 && "This action is not supported yet!"); 1230 case TargetLowering::Expand: 1231 if (VT.isInteger()) 1232 Result = DAG.getConstant(0, VT); 1233 else if (VT.isFloatingPoint()) 1234 Result = DAG.getConstantFP(APFloat(APInt(VT.getSizeInBits(), 0)), 1235 VT); 1236 else 1237 assert(0 && "Unknown value type!"); 1238 break; 1239 case TargetLowering::Legal: 1240 break; 1241 } 1242 break; 1243 } 1244 1245 case ISD::INTRINSIC_W_CHAIN: 1246 case ISD::INTRINSIC_WO_CHAIN: 1247 case ISD::INTRINSIC_VOID: { 1248 SmallVector<SDValue, 8> Ops; 1249 for (unsigned i = 0, e = Node->getNumOperands(); i != e; ++i) 1250 Ops.push_back(LegalizeOp(Node->getOperand(i))); 1251 Result = DAG.UpdateNodeOperands(Result, &Ops[0], Ops.size()); 1252 1253 // Allow the target to custom lower its intrinsics if it wants to. 1254 if (TLI.getOperationAction(Node->getOpcode(), MVT::Other) == 1255 TargetLowering::Custom) { 1256 Tmp3 = TLI.LowerOperation(Result, DAG); 1257 if (Tmp3.getNode()) Result = Tmp3; 1258 } 1259 1260 if (Result.getNode()->getNumValues() == 1) break; 1261 1262 // Must have return value and chain result. 1263 assert(Result.getNode()->getNumValues() == 2 && 1264 "Cannot return more than two values!"); 1265 1266 // Since loads produce two values, make sure to remember that we 1267 // legalized both of them. 1268 AddLegalizedOperand(SDValue(Node, 0), Result.getValue(0)); 1269 AddLegalizedOperand(SDValue(Node, 1), Result.getValue(1)); 1270 return Result.getValue(Op.getResNo()); 1271 } 1272 1273 case ISD::DBG_STOPPOINT: 1274 assert(Node->getNumOperands() == 1 && "Invalid DBG_STOPPOINT node!"); 1275 Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the input chain. 1276 1277 switch (TLI.getOperationAction(ISD::DBG_STOPPOINT, MVT::Other)) { 1278 case TargetLowering::Promote: 1279 default: assert(0 && "This action is not supported yet!"); 1280 case TargetLowering::Expand: { 1281 DwarfWriter *DW = DAG.getDwarfWriter(); 1282 bool useDEBUG_LOC = TLI.isOperationLegalOrCustom(ISD::DEBUG_LOC, 1283 MVT::Other); 1284 bool useLABEL = TLI.isOperationLegalOrCustom(ISD::DBG_LABEL, MVT::Other); 1285 1286 const DbgStopPointSDNode *DSP = cast<DbgStopPointSDNode>(Node); 1287 GlobalVariable *CU_GV = cast<GlobalVariable>(DSP->getCompileUnit()); 1288 if (DW && (useDEBUG_LOC || useLABEL) && !CU_GV->isDeclaration()) { 1289 DICompileUnit CU(cast<GlobalVariable>(DSP->getCompileUnit())); 1290 std::string Dir, FN; 1291 unsigned SrcFile = DW->getOrCreateSourceID(CU.getDirectory(Dir), 1292 CU.getFilename(FN)); 1293 1294 unsigned Line = DSP->getLine(); 1295 unsigned Col = DSP->getColumn(); 1296 1297 if (Fast) { 1298 // A bit self-referential to have DebugLoc on Debug_Loc nodes, but it 1299 // won't hurt anything. 1300 if (useDEBUG_LOC) { 1301 SDValue Ops[] = { Tmp1, DAG.getConstant(Line, MVT::i32), 1302 DAG.getConstant(Col, MVT::i32), 1303 DAG.getConstant(SrcFile, MVT::i32) }; 1304 Result = DAG.getNode(ISD::DEBUG_LOC, dl, MVT::Other, Ops, 4); 1305 } else { 1306 unsigned ID = DW->RecordSourceLine(Line, Col, SrcFile); 1307 Result = DAG.getLabel(ISD::DBG_LABEL, dl, Tmp1, ID); 1308 } 1309 } else { 1310 Result = Tmp1; // chain 1311 } 1312 } else { 1313 Result = Tmp1; // chain 1314 } 1315 break; 1316 } 1317 case TargetLowering::Legal: { 1318 LegalizeAction Action = getTypeAction(Node->getOperand(1).getValueType()); 1319 if (Action == Legal && Tmp1 == Node->getOperand(0)) 1320 break; 1321 1322 SmallVector<SDValue, 8> Ops; 1323 Ops.push_back(Tmp1); 1324 if (Action == Legal) { 1325 Ops.push_back(Node->getOperand(1)); // line # must be legal. 1326 Ops.push_back(Node->getOperand(2)); // col # must be legal. 1327 } else { 1328 // Otherwise promote them. 1329 Ops.push_back(PromoteOp(Node->getOperand(1))); 1330 Ops.push_back(PromoteOp(Node->getOperand(2))); 1331 } 1332 Ops.push_back(Node->getOperand(3)); // filename must be legal. 1333 Ops.push_back(Node->getOperand(4)); // working dir # must be legal. 1334 Result = DAG.UpdateNodeOperands(Result, &Ops[0], Ops.size()); 1335 break; 1336 } 1337 } 1338 break; 1339 1340 case ISD::DECLARE: 1341 assert(Node->getNumOperands() == 3 && "Invalid DECLARE node!"); 1342 switch (TLI.getOperationAction(ISD::DECLARE, MVT::Other)) { 1343 default: assert(0 && "This action is not supported yet!"); 1344 case TargetLowering::Legal: 1345 Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain. 1346 Tmp2 = LegalizeOp(Node->getOperand(1)); // Legalize the address. 1347 Tmp3 = LegalizeOp(Node->getOperand(2)); // Legalize the variable. 1348 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2, Tmp3); 1349 break; 1350 case TargetLowering::Expand: 1351 Result = LegalizeOp(Node->getOperand(0)); 1352 break; 1353 } 1354 break; 1355 1356 case ISD::DEBUG_LOC: 1357 assert(Node->getNumOperands() == 4 && "Invalid DEBUG_LOC node!"); 1358 switch (TLI.getOperationAction(ISD::DEBUG_LOC, MVT::Other)) { 1359 default: assert(0 && "This action is not supported yet!"); 1360 case TargetLowering::Legal: { 1361 LegalizeAction Action = getTypeAction(Node->getOperand(1).getValueType()); 1362 Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain. 1363 if (Action == Legal && Tmp1 == Node->getOperand(0)) 1364 break; 1365 if (Action == Legal) { 1366 Tmp2 = Node->getOperand(1); 1367 Tmp3 = Node->getOperand(2); 1368 Tmp4 = Node->getOperand(3); 1369 } else { 1370 Tmp2 = LegalizeOp(Node->getOperand(1)); // Legalize the line #. 1371 Tmp3 = LegalizeOp(Node->getOperand(2)); // Legalize the col #. 1372 Tmp4 = LegalizeOp(Node->getOperand(3)); // Legalize the source file id. 1373 } 1374 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2, Tmp3, Tmp4); 1375 break; 1376 } 1377 } 1378 break; 1379 1380 case ISD::DBG_LABEL: 1381 case ISD::EH_LABEL: 1382 assert(Node->getNumOperands() == 1 && "Invalid LABEL node!"); 1383 switch (TLI.getOperationAction(Node->getOpcode(), MVT::Other)) { 1384 default: assert(0 && "This action is not supported yet!"); 1385 case TargetLowering::Legal: 1386 Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain. 1387 Result = DAG.UpdateNodeOperands(Result, Tmp1); 1388 break; 1389 case TargetLowering::Expand: 1390 Result = LegalizeOp(Node->getOperand(0)); 1391 break; 1392 } 1393 break; 1394 1395 case ISD::PREFETCH: 1396 assert(Node->getNumOperands() == 4 && "Invalid Prefetch node!"); 1397 switch (TLI.getOperationAction(ISD::PREFETCH, MVT::Other)) { 1398 default: assert(0 && "This action is not supported yet!"); 1399 case TargetLowering::Legal: 1400 Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain. 1401 Tmp2 = LegalizeOp(Node->getOperand(1)); // Legalize the address. 1402 Tmp3 = LegalizeOp(Node->getOperand(2)); // Legalize the rw specifier. 1403 Tmp4 = LegalizeOp(Node->getOperand(3)); // Legalize locality specifier. 1404 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2, Tmp3, Tmp4); 1405 break; 1406 case TargetLowering::Expand: 1407 // It's a noop. 1408 Result = LegalizeOp(Node->getOperand(0)); 1409 break; 1410 } 1411 break; 1412 1413 case ISD::MEMBARRIER: { 1414 assert(Node->getNumOperands() == 6 && "Invalid MemBarrier node!"); 1415 switch (TLI.getOperationAction(ISD::MEMBARRIER, MVT::Other)) { 1416 default: assert(0 && "This action is not supported yet!"); 1417 case TargetLowering::Legal: { 1418 SDValue Ops[6]; 1419 Ops[0] = LegalizeOp(Node->getOperand(0)); // Legalize the chain. 1420 for (int x = 1; x < 6; ++x) { 1421 Ops[x] = Node->getOperand(x); 1422 if (!isTypeLegal(Ops[x].getValueType())) 1423 Ops[x] = PromoteOp(Ops[x]); 1424 } 1425 Result = DAG.UpdateNodeOperands(Result, &Ops[0], 6); 1426 break; 1427 } 1428 case TargetLowering::Expand: 1429 //There is no libgcc call for this op 1430 Result = Node->getOperand(0); // Noop 1431 break; 1432 } 1433 break; 1434 } 1435 1436 case ISD::ATOMIC_CMP_SWAP: { 1437 unsigned int num_operands = 4; 1438 assert(Node->getNumOperands() == num_operands && "Invalid Atomic node!"); 1439 SDValue Ops[4]; 1440 for (unsigned int x = 0; x < num_operands; ++x) 1441 Ops[x] = LegalizeOp(Node->getOperand(x)); 1442 Result = DAG.UpdateNodeOperands(Result, &Ops[0], num_operands); 1443 1444 switch (TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0))) { 1445 default: assert(0 && "This action is not supported yet!"); 1446 case TargetLowering::Custom: 1447 Result = TLI.LowerOperation(Result, DAG); 1448 break; 1449 case TargetLowering::Legal: 1450 break; 1451 } 1452 AddLegalizedOperand(SDValue(Node, 0), Result.getValue(0)); 1453 AddLegalizedOperand(SDValue(Node, 1), Result.getValue(1)); 1454 return Result.getValue(Op.getResNo()); 1455 } 1456 case ISD::ATOMIC_LOAD_ADD: 1457 case ISD::ATOMIC_LOAD_SUB: 1458 case ISD::ATOMIC_LOAD_AND: 1459 case ISD::ATOMIC_LOAD_OR: 1460 case ISD::ATOMIC_LOAD_XOR: 1461 case ISD::ATOMIC_LOAD_NAND: 1462 case ISD::ATOMIC_LOAD_MIN: 1463 case ISD::ATOMIC_LOAD_MAX: 1464 case ISD::ATOMIC_LOAD_UMIN: 1465 case ISD::ATOMIC_LOAD_UMAX: 1466 case ISD::ATOMIC_SWAP: { 1467 unsigned int num_operands = 3; 1468 assert(Node->getNumOperands() == num_operands && "Invalid Atomic node!"); 1469 SDValue Ops[3]; 1470 for (unsigned int x = 0; x < num_operands; ++x) 1471 Ops[x] = LegalizeOp(Node->getOperand(x)); 1472 Result = DAG.UpdateNodeOperands(Result, &Ops[0], num_operands); 1473 1474 switch (TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0))) { 1475 default: assert(0 && "This action is not supported yet!"); 1476 case TargetLowering::Custom: 1477 Result = TLI.LowerOperation(Result, DAG); 1478 break; 1479 case TargetLowering::Legal: 1480 break; 1481 } 1482 AddLegalizedOperand(SDValue(Node, 0), Result.getValue(0)); 1483 AddLegalizedOperand(SDValue(Node, 1), Result.getValue(1)); 1484 return Result.getValue(Op.getResNo()); 1485 } 1486 case ISD::Constant: { 1487 ConstantSDNode *CN = cast<ConstantSDNode>(Node); 1488 unsigned opAction = 1489 TLI.getOperationAction(ISD::Constant, CN->getValueType(0)); 1490 1491 // We know we don't need to expand constants here, constants only have one 1492 // value and we check that it is fine above. 1493 1494 if (opAction == TargetLowering::Custom) { 1495 Tmp1 = TLI.LowerOperation(Result, DAG); 1496 if (Tmp1.getNode()) 1497 Result = Tmp1; 1498 } 1499 break; 1500 } 1501 case ISD::ConstantFP: { 1502 // Spill FP immediates to the constant pool if the target cannot directly 1503 // codegen them. Targets often have some immediate values that can be 1504 // efficiently generated into an FP register without a load. We explicitly 1505 // leave these constants as ConstantFP nodes for the target to deal with. 1506 ConstantFPSDNode *CFP = cast<ConstantFPSDNode>(Node); 1507 1508 switch (TLI.getOperationAction(ISD::ConstantFP, CFP->getValueType(0))) { 1509 default: assert(0 && "This action is not supported yet!"); 1510 case TargetLowering::Legal: 1511 break; 1512 case TargetLowering::Custom: 1513 Tmp3 = TLI.LowerOperation(Result, DAG); 1514 if (Tmp3.getNode()) { 1515 Result = Tmp3; 1516 break; 1517 } 1518 // FALLTHROUGH 1519 case TargetLowering::Expand: { 1520 // Check to see if this FP immediate is already legal. 1521 bool isLegal = false; 1522 for (TargetLowering::legal_fpimm_iterator I = TLI.legal_fpimm_begin(), 1523 E = TLI.legal_fpimm_end(); I != E; ++I) { 1524 if (CFP->isExactlyValue(*I)) { 1525 isLegal = true; 1526 break; 1527 } 1528 } 1529 // If this is a legal constant, turn it into a TargetConstantFP node. 1530 if (isLegal) 1531 break; 1532 Result = ExpandConstantFP(CFP, true, DAG, TLI); 1533 } 1534 } 1535 break; 1536 } 1537 case ISD::TokenFactor: 1538 if (Node->getNumOperands() == 2) { 1539 Tmp1 = LegalizeOp(Node->getOperand(0)); 1540 Tmp2 = LegalizeOp(Node->getOperand(1)); 1541 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2); 1542 } else if (Node->getNumOperands() == 3) { 1543 Tmp1 = LegalizeOp(Node->getOperand(0)); 1544 Tmp2 = LegalizeOp(Node->getOperand(1)); 1545 Tmp3 = LegalizeOp(Node->getOperand(2)); 1546 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2, Tmp3); 1547 } else { 1548 SmallVector<SDValue, 8> Ops; 1549 // Legalize the operands. 1550 for (unsigned i = 0, e = Node->getNumOperands(); i != e; ++i) 1551 Ops.push_back(LegalizeOp(Node->getOperand(i))); 1552 Result = DAG.UpdateNodeOperands(Result, &Ops[0], Ops.size()); 1553 } 1554 break; 1555 1556 case ISD::FORMAL_ARGUMENTS: 1557 case ISD::CALL: 1558 // The only option for this is to custom lower it. 1559 Tmp3 = TLI.LowerOperation(Result.getValue(0), DAG); 1560 assert(Tmp3.getNode() && "Target didn't custom lower this node!"); 1561 // A call within a calling sequence must be legalized to something 1562 // other than the normal CALLSEQ_END. Violating this gets Legalize 1563 // into an infinite loop. 1564 assert ((!IsLegalizingCall || 1565 Node->getOpcode() != ISD::CALL || 1566 Tmp3.getNode()->getOpcode() != ISD::CALLSEQ_END) && 1567 "Nested CALLSEQ_START..CALLSEQ_END not supported."); 1568 1569 // The number of incoming and outgoing values should match; unless the final 1570 // outgoing value is a flag. 1571 assert((Tmp3.getNode()->getNumValues() == Result.getNode()->getNumValues() || 1572 (Tmp3.getNode()->getNumValues() == Result.getNode()->getNumValues() + 1 && 1573 Tmp3.getNode()->getValueType(Tmp3.getNode()->getNumValues() - 1) == 1574 MVT::Flag)) && 1575 "Lowering call/formal_arguments produced unexpected # results!"); 1576 1577 // Since CALL/FORMAL_ARGUMENTS nodes produce multiple values, make sure to 1578 // remember that we legalized all of them, so it doesn't get relegalized. 1579 for (unsigned i = 0, e = Tmp3.getNode()->getNumValues(); i != e; ++i) { 1580 if (Tmp3.getNode()->getValueType(i) == MVT::Flag) 1581 continue; 1582 Tmp1 = LegalizeOp(Tmp3.getValue(i)); 1583 if (Op.getResNo() == i) 1584 Tmp2 = Tmp1; 1585 AddLegalizedOperand(SDValue(Node, i), Tmp1); 1586 } 1587 return Tmp2; 1588 case ISD::EXTRACT_SUBREG: { 1589 Tmp1 = LegalizeOp(Node->getOperand(0)); 1590 ConstantSDNode *idx = dyn_cast<ConstantSDNode>(Node->getOperand(1)); 1591 assert(idx && "Operand must be a constant"); 1592 Tmp2 = DAG.getTargetConstant(idx->getAPIntValue(), idx->getValueType(0)); 1593 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2); 1594 } 1595 break; 1596 case ISD::INSERT_SUBREG: { 1597 Tmp1 = LegalizeOp(Node->getOperand(0)); 1598 Tmp2 = LegalizeOp(Node->getOperand(1)); 1599 ConstantSDNode *idx = dyn_cast<ConstantSDNode>(Node->getOperand(2)); 1600 assert(idx && "Operand must be a constant"); 1601 Tmp3 = DAG.getTargetConstant(idx->getAPIntValue(), idx->getValueType(0)); 1602 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2, Tmp3); 1603 } 1604 break; 1605 case ISD::BUILD_VECTOR: 1606 switch (TLI.getOperationAction(ISD::BUILD_VECTOR, Node->getValueType(0))) { 1607 default: assert(0 && "This action is not supported yet!"); 1608 case TargetLowering::Custom: 1609 Tmp3 = TLI.LowerOperation(Result, DAG); 1610 if (Tmp3.getNode()) { 1611 Result = Tmp3; 1612 break; 1613 } 1614 // FALLTHROUGH 1615 case TargetLowering::Expand: 1616 Result = ExpandBUILD_VECTOR(Result.getNode()); 1617 break; 1618 } 1619 break; 1620 case ISD::INSERT_VECTOR_ELT: 1621 Tmp1 = LegalizeOp(Node->getOperand(0)); // InVec 1622 Tmp3 = LegalizeOp(Node->getOperand(2)); // InEltNo 1623 1624 // The type of the value to insert may not be legal, even though the vector 1625 // type is legal. Legalize/Promote accordingly. We do not handle Expand 1626 // here. 1627 switch (getTypeAction(Node->getOperand(1).getValueType())) { 1628 default: assert(0 && "Cannot expand insert element operand"); 1629 case Legal: Tmp2 = LegalizeOp(Node->getOperand(1)); break; 1630 case Promote: Tmp2 = PromoteOp(Node->getOperand(1)); break; 1631 case Expand: 1632 // FIXME: An alternative would be to check to see if the target is not 1633 // going to custom lower this operation, we could bitcast to half elt 1634 // width and perform two inserts at that width, if that is legal. 1635 Tmp2 = Node->getOperand(1); 1636 break; 1637 } 1638 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2, Tmp3); 1639 1640 switch (TLI.getOperationAction(ISD::INSERT_VECTOR_ELT, 1641 Node->getValueType(0))) { 1642 default: assert(0 && "This action is not supported yet!"); 1643 case TargetLowering::Legal: 1644 break; 1645 case TargetLowering::Custom: 1646 Tmp4 = TLI.LowerOperation(Result, DAG); 1647 if (Tmp4.getNode()) { 1648 Result = Tmp4; 1649 break; 1650 } 1651 // FALLTHROUGH 1652 case TargetLowering::Promote: 1653 // Fall thru for vector case 1654 case TargetLowering::Expand: { 1655 // If the insert index is a constant, codegen this as a scalar_to_vector, 1656 // then a shuffle that inserts it into the right position in the vector. 1657 if (ConstantSDNode *InsertPos = dyn_cast<ConstantSDNode>(Tmp3)) { 1658 // SCALAR_TO_VECTOR requires that the type of the value being inserted 1659 // match the element type of the vector being created. 1660 if (Tmp2.getValueType() == 1661 Op.getValueType().getVectorElementType()) { 1662 SDValue ScVec = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, 1663 Tmp1.getValueType(), Tmp2); 1664 1665 unsigned NumElts = Tmp1.getValueType().getVectorNumElements(); 1666 MVT ShufMaskVT = 1667 MVT::getIntVectorWithNumElements(NumElts); 1668 MVT ShufMaskEltVT = ShufMaskVT.getVectorElementType(); 1669 1670 // We generate a shuffle of InVec and ScVec, so the shuffle mask 1671 // should be 0,1,2,3,4,5... with the appropriate element replaced with 1672 // elt 0 of the RHS. 1673 SmallVector<SDValue, 8> ShufOps; 1674 for (unsigned i = 0; i != NumElts; ++i) { 1675 if (i != InsertPos->getZExtValue()) 1676 ShufOps.push_back(DAG.getConstant(i, ShufMaskEltVT)); 1677 else 1678 ShufOps.push_back(DAG.getConstant(NumElts, ShufMaskEltVT)); 1679 } 1680 SDValue ShufMask = DAG.getNode(ISD::BUILD_VECTOR, dl, ShufMaskVT, 1681 &ShufOps[0], ShufOps.size()); 1682 1683 Result = DAG.getNode(ISD::VECTOR_SHUFFLE, dl, Tmp1.getValueType(), 1684 Tmp1, ScVec, ShufMask); 1685 Result = LegalizeOp(Result); 1686 break; 1687 } 1688 } 1689 Result = PerformInsertVectorEltInMemory(Tmp1, Tmp2, Tmp3, dl); 1690 break; 1691 } 1692 } 1693 break; 1694 case ISD::SCALAR_TO_VECTOR: 1695 if (!TLI.isTypeLegal(Node->getOperand(0).getValueType())) { 1696 Result = LegalizeOp(ExpandSCALAR_TO_VECTOR(Node)); 1697 break; 1698 } 1699 1700 Tmp1 = LegalizeOp(Node->getOperand(0)); // InVal 1701 Result = DAG.UpdateNodeOperands(Result, Tmp1); 1702 switch (TLI.getOperationAction(ISD::SCALAR_TO_VECTOR, 1703 Node->getValueType(0))) { 1704 default: assert(0 && "This action is not supported yet!"); 1705 case TargetLowering::Legal: 1706 break; 1707 case TargetLowering::Custom: 1708 Tmp3 = TLI.LowerOperation(Result, DAG); 1709 if (Tmp3.getNode()) { 1710 Result = Tmp3; 1711 break; 1712 } 1713 // FALLTHROUGH 1714 case TargetLowering::Expand: 1715 Result = LegalizeOp(ExpandSCALAR_TO_VECTOR(Node)); 1716 break; 1717 } 1718 break; 1719 case ISD::VECTOR_SHUFFLE: 1720 Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the input vectors, 1721 Tmp2 = LegalizeOp(Node->getOperand(1)); // but not the shuffle mask. 1722 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2, Node->getOperand(2)); 1723 1724 // Allow targets to custom lower the SHUFFLEs they support. 1725 switch (TLI.getOperationAction(ISD::VECTOR_SHUFFLE,Result.getValueType())) { 1726 default: assert(0 && "Unknown operation action!"); 1727 case TargetLowering::Legal: 1728 assert(isShuffleLegal(Result.getValueType(), Node->getOperand(2)) && 1729 "vector shuffle should not be created if not legal!"); 1730 break; 1731 case TargetLowering::Custom: 1732 Tmp3 = TLI.LowerOperation(Result, DAG); 1733 if (Tmp3.getNode()) { 1734 Result = Tmp3; 1735 break; 1736 } 1737 // FALLTHROUGH 1738 case TargetLowering::Expand: { 1739 MVT VT = Node->getValueType(0); 1740 MVT EltVT = VT.getVectorElementType(); 1741 MVT PtrVT = TLI.getPointerTy(); 1742 SDValue Mask = Node->getOperand(2); 1743 unsigned NumElems = Mask.getNumOperands(); 1744 SmallVector<SDValue,8> Ops; 1745 for (unsigned i = 0; i != NumElems; ++i) { 1746 SDValue Arg = Mask.getOperand(i); 1747 if (Arg.getOpcode() == ISD::UNDEF) { 1748 Ops.push_back(DAG.getUNDEF(EltVT)); 1749 } else { 1750 assert(isa<ConstantSDNode>(Arg) && "Invalid VECTOR_SHUFFLE mask!"); 1751 unsigned Idx = cast<ConstantSDNode>(Arg)->getZExtValue(); 1752 if (Idx < NumElems) 1753 Ops.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, EltVT, Tmp1, 1754 DAG.getConstant(Idx, PtrVT))); 1755 else 1756 Ops.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, EltVT, Tmp2, 1757 DAG.getConstant(Idx - NumElems, PtrVT))); 1758 } 1759 } 1760 Result = DAG.getNode(ISD::BUILD_VECTOR, dl, VT, &Ops[0], Ops.size()); 1761 break; 1762 } 1763 case TargetLowering::Promote: { 1764 // Change base type to a different vector type. 1765 MVT OVT = Node->getValueType(0); 1766 MVT NVT = TLI.getTypeToPromoteTo(Node->getOpcode(), OVT); 1767 1768 // Cast the two input vectors. 1769 Tmp1 = DAG.getNode(ISD::BIT_CONVERT, dl, NVT, Tmp1); 1770 Tmp2 = DAG.getNode(ISD::BIT_CONVERT, dl, NVT, Tmp2); 1771 1772 // Convert the shuffle mask to the right # elements. 1773 Tmp3 = SDValue(isShuffleLegal(OVT, Node->getOperand(2)), 0); 1774 assert(Tmp3.getNode() && "Shuffle not legal?"); 1775 Result = DAG.getNode(ISD::VECTOR_SHUFFLE, dl, NVT, Tmp1, Tmp2, Tmp3); 1776 Result = DAG.getNode(ISD::BIT_CONVERT, dl, OVT, Result); 1777 break; 1778 } 1779 } 1780 break; 1781 1782 case ISD::EXTRACT_VECTOR_ELT: 1783 Tmp1 = Node->getOperand(0); 1784 Tmp2 = LegalizeOp(Node->getOperand(1)); 1785 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2); 1786 Result = ExpandEXTRACT_VECTOR_ELT(Result); 1787 break; 1788 1789 case ISD::EXTRACT_SUBVECTOR: 1790 Tmp1 = Node->getOperand(0); 1791 Tmp2 = LegalizeOp(Node->getOperand(1)); 1792 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2); 1793 Result = ExpandEXTRACT_SUBVECTOR(Result); 1794 break; 1795 1796 case ISD::CONCAT_VECTORS: { 1797 // Use extract/insert/build vector for now. We might try to be 1798 // more clever later. 1799 MVT PtrVT = TLI.getPointerTy(); 1800 SmallVector<SDValue, 8> Ops; 1801 unsigned NumOperands = Node->getNumOperands(); 1802 for (unsigned i=0; i < NumOperands; ++i) { 1803 SDValue SubOp = Node->getOperand(i); 1804 MVT VVT = SubOp.getNode()->getValueType(0); 1805 MVT EltVT = VVT.getVectorElementType(); 1806 unsigned NumSubElem = VVT.getVectorNumElements(); 1807 for (unsigned j=0; j < NumSubElem; ++j) { 1808 Ops.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, EltVT, SubOp, 1809 DAG.getConstant(j, PtrVT))); 1810 } 1811 } 1812 return LegalizeOp(DAG.getNode(ISD::BUILD_VECTOR, dl, Node->getValueType(0), 1813 &Ops[0], Ops.size())); 1814 } 1815 1816 case ISD::CALLSEQ_START: { 1817 SDNode *CallEnd = FindCallEndFromCallStart(Node); 1818 1819 // Recursively Legalize all of the inputs of the call end that do not lead 1820 // to this call start. This ensures that any libcalls that need be inserted 1821 // are inserted *before* the CALLSEQ_START. 1822 IsLegalizingCallArgs = true; 1823 {SmallPtrSet<SDNode*, 32> NodesLeadingTo; 1824 for (unsigned i = 0, e = CallEnd->getNumOperands(); i != e; ++i) 1825 LegalizeAllNodesNotLeadingTo(CallEnd->getOperand(i).getNode(), Node, 1826 NodesLeadingTo); 1827 } 1828 IsLegalizingCallArgs = false; 1829 1830 // Now that we legalized all of the inputs (which may have inserted 1831 // libcalls) create the new CALLSEQ_START node. 1832 Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain. 1833 1834 // Merge in the last call, to ensure that this call start after the last 1835 // call ended. 1836 if (LastCALLSEQ_END.getOpcode() != ISD::EntryToken) { 1837 Tmp1 = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, 1838 Tmp1, LastCALLSEQ_END); 1839 Tmp1 = LegalizeOp(Tmp1); 1840 } 1841 1842 // Do not try to legalize the target-specific arguments (#1+). 1843 if (Tmp1 != Node->getOperand(0)) { 1844 SmallVector<SDValue, 8> Ops(Node->op_begin(), Node->op_end()); 1845 Ops[0] = Tmp1; 1846 Result = DAG.UpdateNodeOperands(Result, &Ops[0], Ops.size()); 1847 } 1848 1849 // Remember that the CALLSEQ_START is legalized. 1850 AddLegalizedOperand(Op.getValue(0), Result); 1851 if (Node->getNumValues() == 2) // If this has a flag result, remember it. 1852 AddLegalizedOperand(Op.getValue(1), Result.getValue(1)); 1853 1854 // Now that the callseq_start and all of the non-call nodes above this call 1855 // sequence have been legalized, legalize the call itself. During this 1856 // process, no libcalls can/will be inserted, guaranteeing that no calls 1857 // can overlap. 1858 assert(!IsLegalizingCall && "Inconsistent sequentialization of calls!"); 1859 // Note that we are selecting this call! 1860 LastCALLSEQ_END = SDValue(CallEnd, 0); 1861 IsLegalizingCall = true; 1862 1863 // Legalize the call, starting from the CALLSEQ_END. 1864 LegalizeOp(LastCALLSEQ_END); 1865 assert(!IsLegalizingCall && "CALLSEQ_END should have cleared this!"); 1866 return Result; 1867 } 1868 case ISD::CALLSEQ_END: 1869 // If the CALLSEQ_START node hasn't been legalized first, legalize it. This 1870 // will cause this node to be legalized as well as handling libcalls right. 1871 if (LastCALLSEQ_END.getNode() != Node) { 1872 LegalizeOp(SDValue(FindCallStartFromCallEnd(Node), 0)); 1873 DenseMap<SDValue, SDValue>::iterator I = LegalizedNodes.find(Op); 1874 assert(I != LegalizedNodes.end() && 1875 "Legalizing the call start should have legalized this node!"); 1876 return I->second; 1877 } 1878 1879 // Otherwise, the call start has been legalized and everything is going 1880 // according to plan. Just legalize ourselves normally here. 1881 Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain. 1882 // Do not try to legalize the target-specific arguments (#1+), except for 1883 // an optional flag input. 1884 if (Node->getOperand(Node->getNumOperands()-1).getValueType() != MVT::Flag){ 1885 if (Tmp1 != Node->getOperand(0)) { 1886 SmallVector<SDValue, 8> Ops(Node->op_begin(), Node->op_end()); 1887 Ops[0] = Tmp1; 1888 Result = DAG.UpdateNodeOperands(Result, &Ops[0], Ops.size()); 1889 } 1890 } else { 1891 Tmp2 = LegalizeOp(Node->getOperand(Node->getNumOperands()-1)); 1892 if (Tmp1 != Node->getOperand(0) || 1893 Tmp2 != Node->getOperand(Node->getNumOperands()-1)) { 1894 SmallVector<SDValue, 8> Ops(Node->op_begin(), Node->op_end()); 1895 Ops[0] = Tmp1; 1896 Ops.back() = Tmp2; 1897 Result = DAG.UpdateNodeOperands(Result, &Ops[0], Ops.size()); 1898 } 1899 } 1900 assert(IsLegalizingCall && "Call sequence imbalance between start/end?"); 1901 // This finishes up call legalization. 1902 IsLegalizingCall = false; 1903 1904 // If the CALLSEQ_END node has a flag, remember that we legalized it. 1905 AddLegalizedOperand(SDValue(Node, 0), Result.getValue(0)); 1906 if (Node->getNumValues() == 2) 1907 AddLegalizedOperand(SDValue(Node, 1), Result.getValue(1)); 1908 return Result.getValue(Op.getResNo()); 1909 case ISD::DYNAMIC_STACKALLOC: { 1910 MVT VT = Node->getValueType(0); 1911 Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain. 1912 Tmp2 = LegalizeOp(Node->getOperand(1)); // Legalize the size. 1913 Tmp3 = LegalizeOp(Node->getOperand(2)); // Legalize the alignment. 1914 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2, Tmp3); 1915 1916 Tmp1 = Result.getValue(0); 1917 Tmp2 = Result.getValue(1); 1918 switch (TLI.getOperationAction(Node->getOpcode(), VT)) { 1919 default: assert(0 && "This action is not supported yet!"); 1920 case TargetLowering::Expand: { 1921 unsigned SPReg = TLI.getStackPointerRegisterToSaveRestore(); 1922 assert(SPReg && "Target cannot require DYNAMIC_STACKALLOC expansion and" 1923 " not tell us which reg is the stack pointer!"); 1924 SDValue Chain = Tmp1.getOperand(0); 1925 1926 // Chain the dynamic stack allocation so that it doesn't modify the stack 1927 // pointer when other instructions are using the stack. 1928 Chain = DAG.getCALLSEQ_START(Chain, DAG.getIntPtrConstant(0, true)); 1929 1930 SDValue Size = Tmp2.getOperand(1); 1931 SDValue SP = DAG.getCopyFromReg(Chain, dl, SPReg, VT); 1932 Chain = SP.getValue(1); 1933 unsigned Align = cast<ConstantSDNode>(Tmp3)->getZExtValue(); 1934 unsigned StackAlign = 1935 TLI.getTargetMachine().getFrameInfo()->getStackAlignment(); 1936 if (Align > StackAlign) 1937 SP = DAG.getNode(ISD::AND, dl, VT, SP, 1938 DAG.getConstant(-(uint64_t)Align, VT)); 1939 Tmp1 = DAG.getNode(ISD::SUB, dl, VT, SP, Size); // Value 1940 Chain = DAG.getCopyToReg(Chain, dl, SPReg, Tmp1); // Output chain 1941 1942 Tmp2 = DAG.getCALLSEQ_END(Chain, DAG.getIntPtrConstant(0, true), 1943 DAG.getIntPtrConstant(0, true), SDValue()); 1944 1945 Tmp1 = LegalizeOp(Tmp1); 1946 Tmp2 = LegalizeOp(Tmp2); 1947 break; 1948 } 1949 case TargetLowering::Custom: 1950 Tmp3 = TLI.LowerOperation(Tmp1, DAG); 1951 if (Tmp3.getNode()) { 1952 Tmp1 = LegalizeOp(Tmp3); 1953 Tmp2 = LegalizeOp(Tmp3.getValue(1)); 1954 } 1955 break; 1956 case TargetLowering::Legal: 1957 break; 1958 } 1959 // Since this op produce two values, make sure to remember that we 1960 // legalized both of them. 1961 AddLegalizedOperand(SDValue(Node, 0), Tmp1); 1962 AddLegalizedOperand(SDValue(Node, 1), Tmp2); 1963 return Op.getResNo() ? Tmp2 : Tmp1; 1964 } 1965 case ISD::INLINEASM: { 1966 SmallVector<SDValue, 8> Ops(Node->op_begin(), Node->op_end()); 1967 bool Changed = false; 1968 // Legalize all of the operands of the inline asm, in case they are nodes 1969 // that need to be expanded or something. Note we skip the asm string and 1970 // all of the TargetConstant flags. 1971 SDValue Op = LegalizeOp(Ops[0]); 1972 Changed = Op != Ops[0]; 1973 Ops[0] = Op; 1974 1975 bool HasInFlag = Ops.back().getValueType() == MVT::Flag; 1976 for (unsigned i = 2, e = Ops.size()-HasInFlag; i < e; ) { 1977 unsigned NumVals = cast<ConstantSDNode>(Ops[i])->getZExtValue() >> 3; 1978 for (++i; NumVals; ++i, --NumVals) { 1979 SDValue Op = LegalizeOp(Ops[i]); 1980 if (Op != Ops[i]) { 1981 Changed = true; 1982 Ops[i] = Op; 1983 } 1984 } 1985 } 1986 1987 if (HasInFlag) { 1988 Op = LegalizeOp(Ops.back()); 1989 Changed |= Op != Ops.back(); 1990 Ops.back() = Op; 1991 } 1992 1993 if (Changed) 1994 Result = DAG.UpdateNodeOperands(Result, &Ops[0], Ops.size()); 1995 1996 // INLINE asm returns a chain and flag, make sure to add both to the map. 1997 AddLegalizedOperand(SDValue(Node, 0), Result.getValue(0)); 1998 AddLegalizedOperand(SDValue(Node, 1), Result.getValue(1)); 1999 return Result.getValue(Op.getResNo()); 2000 } 2001 case ISD::BR: 2002 Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain. 2003 // Ensure that libcalls are emitted before a branch. 2004 Tmp1 = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Tmp1, LastCALLSEQ_END); 2005 Tmp1 = LegalizeOp(Tmp1); 2006 LastCALLSEQ_END = DAG.getEntryNode(); 2007 2008 Result = DAG.UpdateNodeOperands(Result, Tmp1, Node->getOperand(1)); 2009 break; 2010 case ISD::BRIND: 2011 Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain. 2012 // Ensure that libcalls are emitted before a branch. 2013 Tmp1 = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Tmp1, LastCALLSEQ_END); 2014 Tmp1 = LegalizeOp(Tmp1); 2015 LastCALLSEQ_END = DAG.getEntryNode(); 2016 2017 switch (getTypeAction(Node->getOperand(1).getValueType())) { 2018 default: assert(0 && "Indirect target must be legal type (pointer)!"); 2019 case Legal: 2020 Tmp2 = LegalizeOp(Node->getOperand(1)); // Legalize the condition. 2021 break; 2022 } 2023 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2); 2024 break; 2025 case ISD::BR_JT: 2026 Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain. 2027 // Ensure that libcalls are emitted before a branch. 2028 Tmp1 = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Tmp1, LastCALLSEQ_END); 2029 Tmp1 = LegalizeOp(Tmp1); 2030 LastCALLSEQ_END = DAG.getEntryNode(); 2031 2032 Tmp2 = LegalizeOp(Node->getOperand(1)); // Legalize the jumptable node. 2033 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2, Node->getOperand(2)); 2034 2035 switch (TLI.getOperationAction(ISD::BR_JT, MVT::Other)) { 2036 default: assert(0 && "This action is not supported yet!"); 2037 case TargetLowering::Legal: break; 2038 case TargetLowering::Custom: 2039 Tmp1 = TLI.LowerOperation(Result, DAG); 2040 if (Tmp1.getNode()) Result = Tmp1; 2041 break; 2042 case TargetLowering::Expand: { 2043 SDValue Chain = Result.getOperand(0); 2044 SDValue Table = Result.getOperand(1); 2045 SDValue Index = Result.getOperand(2); 2046 2047 MVT PTy = TLI.getPointerTy(); 2048 MachineFunction &MF = DAG.getMachineFunction(); 2049 unsigned EntrySize = MF.getJumpTableInfo()->getEntrySize(); 2050 Index= DAG.getNode(ISD::MUL, dl, PTy, 2051 Index, DAG.getConstant(EntrySize, PTy)); 2052 SDValue Addr = DAG.getNode(ISD::ADD, dl, PTy, Index, Table); 2053 2054 MVT MemVT = MVT::getIntegerVT(EntrySize * 8); 2055 SDValue LD = DAG.getExtLoad(ISD::SEXTLOAD, dl, PTy, Chain, Addr, 2056 PseudoSourceValue::getJumpTable(), 0, MemVT); 2057 Addr = LD; 2058 if (TLI.getTargetMachine().getRelocationModel() == Reloc::PIC_) { 2059 // For PIC, the sequence is: 2060 // BRIND(load(Jumptable + index) + RelocBase) 2061 // RelocBase can be JumpTable, GOT or some sort of global base. 2062 Addr = DAG.getNode(ISD::ADD, dl, PTy, Addr, 2063 TLI.getPICJumpTableRelocBase(Table, DAG)); 2064 } 2065 Result = DAG.getNode(ISD::BRIND, dl, MVT::Other, LD.getValue(1), Addr); 2066 } 2067 } 2068 break; 2069 case ISD::BRCOND: 2070 Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain. 2071 // Ensure that libcalls are emitted before a return. 2072 Tmp1 = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Tmp1, LastCALLSEQ_END); 2073 Tmp1 = LegalizeOp(Tmp1); 2074 LastCALLSEQ_END = DAG.getEntryNode(); 2075 2076 switch (getTypeAction(Node->getOperand(1).getValueType())) { 2077 case Expand: assert(0 && "It's impossible to expand bools"); 2078 case Legal: 2079 Tmp2 = LegalizeOp(Node->getOperand(1)); // Legalize the condition. 2080 break; 2081 case Promote: { 2082 Tmp2 = PromoteOp(Node->getOperand(1)); // Promote the condition. 2083 2084 // The top bits of the promoted condition are not necessarily zero, ensure 2085 // that the value is properly zero extended. 2086 unsigned BitWidth = Tmp2.getValueSizeInBits(); 2087 if (!DAG.MaskedValueIsZero(Tmp2, 2088 APInt::getHighBitsSet(BitWidth, BitWidth-1))) 2089 Tmp2 = DAG.getZeroExtendInReg(Tmp2, dl, MVT::i1); 2090 break; 2091 } 2092 } 2093 2094 // Basic block destination (Op#2) is always legal. 2095 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2, Node->getOperand(2)); 2096 2097 switch (TLI.getOperationAction(ISD::BRCOND, MVT::Other)) { 2098 default: assert(0 && "This action is not supported yet!"); 2099 case TargetLowering::Legal: break; 2100 case TargetLowering::Custom: 2101 Tmp1 = TLI.LowerOperation(Result, DAG); 2102 if (Tmp1.getNode()) Result = Tmp1; 2103 break; 2104 case TargetLowering::Expand: 2105 // Expand brcond's setcc into its constituent parts and create a BR_CC 2106 // Node. 2107 if (Tmp2.getOpcode() == ISD::SETCC) { 2108 Result = DAG.getNode(ISD::BR_CC, dl, MVT::Other, 2109 Tmp1, Tmp2.getOperand(2), 2110 Tmp2.getOperand(0), Tmp2.getOperand(1), 2111 Node->getOperand(2)); 2112 } else { 2113 Result = DAG.getNode(ISD::BR_CC, dl, MVT::Other, Tmp1, 2114 DAG.getCondCode(ISD::SETNE), Tmp2, 2115 DAG.getConstant(0, Tmp2.getValueType()), 2116 Node->getOperand(2)); 2117 } 2118 break; 2119 } 2120 break; 2121 case ISD::BR_CC: 2122 Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain. 2123 // Ensure that libcalls are emitted before a branch. 2124 Tmp1 = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Tmp1, LastCALLSEQ_END); 2125 Tmp1 = LegalizeOp(Tmp1); 2126 Tmp2 = Node->getOperand(2); // LHS 2127 Tmp3 = Node->getOperand(3); // RHS 2128 Tmp4 = Node->getOperand(1); // CC 2129 2130 LegalizeSetCC(TLI.getSetCCResultType(Tmp2.getValueType()), 2131 Tmp2, Tmp3, Tmp4, dl); 2132 LastCALLSEQ_END = DAG.getEntryNode(); 2133 2134 // If we didn't get both a LHS and RHS back from LegalizeSetCC, 2135 // the LHS is a legal SETCC itself. In this case, we need to compare 2136 // the result against zero to select between true and false values. 2137 if (Tmp3.getNode() == 0) { 2138 Tmp3 = DAG.getConstant(0, Tmp2.getValueType()); 2139 Tmp4 = DAG.getCondCode(ISD::SETNE); 2140 } 2141 2142 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp4, Tmp2, Tmp3, 2143 Node->getOperand(4)); 2144 2145 switch (TLI.getOperationAction(ISD::BR_CC, Tmp3.getValueType())) { 2146 default: assert(0 && "Unexpected action for BR_CC!"); 2147 case TargetLowering::Legal: break; 2148 case TargetLowering::Custom: 2149 Tmp4 = TLI.LowerOperation(Result, DAG); 2150 if (Tmp4.getNode()) Result = Tmp4; 2151 break; 2152 } 2153 break; 2154 case ISD::LOAD: { 2155 LoadSDNode *LD = cast<LoadSDNode>(Node); 2156 Tmp1 = LegalizeOp(LD->getChain()); // Legalize the chain. 2157 Tmp2 = LegalizeOp(LD->getBasePtr()); // Legalize the base pointer. 2158 2159 ISD::LoadExtType ExtType = LD->getExtensionType(); 2160 if (ExtType == ISD::NON_EXTLOAD) { 2161 MVT VT = Node->getValueType(0); 2162 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2, LD->getOffset()); 2163 Tmp3 = Result.getValue(0); 2164 Tmp4 = Result.getValue(1); 2165 2166 switch (TLI.getOperationAction(Node->getOpcode(), VT)) { 2167 default: assert(0 && "This action is not supported yet!"); 2168 case TargetLowering::Legal: 2169 // If this is an unaligned load and the target doesn't support it, 2170 // expand it. 2171 if (!TLI.allowsUnalignedMemoryAccesses()) { 2172 unsigned ABIAlignment = TLI.getTargetData()-> 2173 getABITypeAlignment(LD->getMemoryVT().getTypeForMVT()); 2174 if (LD->getAlignment() < ABIAlignment){ 2175 Result = ExpandUnalignedLoad(cast<LoadSDNode>(Result.getNode()), DAG, 2176 TLI); 2177 Tmp3 = Result.getOperand(0); 2178 Tmp4 = Result.getOperand(1); 2179 Tmp3 = LegalizeOp(Tmp3); 2180 Tmp4 = LegalizeOp(Tmp4); 2181 } 2182 } 2183 break; 2184 case TargetLowering::Custom: 2185 Tmp1 = TLI.LowerOperation(Tmp3, DAG); 2186 if (Tmp1.getNode()) { 2187 Tmp3 = LegalizeOp(Tmp1); 2188 Tmp4 = LegalizeOp(Tmp1.getValue(1)); 2189 } 2190 break; 2191 case TargetLowering::Promote: { 2192 // Only promote a load of vector type to another. 2193 assert(VT.isVector() && "Cannot promote this load!"); 2194 // Change base type to a different vector type. 2195 MVT NVT = TLI.getTypeToPromoteTo(Node->getOpcode(), VT); 2196 2197 Tmp1 = DAG.getLoad(NVT, dl, Tmp1, Tmp2, LD->getSrcValue(), 2198 LD->getSrcValueOffset(), 2199 LD->isVolatile(), LD->getAlignment()); 2200 Tmp3 = LegalizeOp(DAG.getNode(ISD::BIT_CONVERT, dl, VT, Tmp1)); 2201 Tmp4 = LegalizeOp(Tmp1.getValue(1)); 2202 break; 2203 } 2204 } 2205 // Since loads produce two values, make sure to remember that we 2206 // legalized both of them. 2207 AddLegalizedOperand(SDValue(Node, 0), Tmp3); 2208 AddLegalizedOperand(SDValue(Node, 1), Tmp4); 2209 return Op.getResNo() ? Tmp4 : Tmp3; 2210 } else { 2211 MVT SrcVT = LD->getMemoryVT(); 2212 unsigned SrcWidth = SrcVT.getSizeInBits(); 2213 int SVOffset = LD->getSrcValueOffset(); 2214 unsigned Alignment = LD->getAlignment(); 2215 bool isVolatile = LD->isVolatile(); 2216 2217 if (SrcWidth != SrcVT.getStoreSizeInBits() && 2218 // Some targets pretend to have an i1 loading operation, and actually 2219 // load an i8. This trick is correct for ZEXTLOAD because the top 7 2220 // bits are guaranteed to be zero; it helps the optimizers understand 2221 // that these bits are zero. It is also useful for EXTLOAD, since it 2222 // tells the optimizers that those bits are undefined. It would be 2223 // nice to have an effective generic way of getting these benefits... 2224 // Until such a way is found, don't insist on promoting i1 here. 2225 (SrcVT != MVT::i1 || 2226 TLI.getLoadExtAction(ExtType, MVT::i1) == TargetLowering::Promote)) { 2227 // Promote to a byte-sized load if not loading an integral number of 2228 // bytes. For example, promote EXTLOAD:i20 -> EXTLOAD:i24. 2229 unsigned NewWidth = SrcVT.getStoreSizeInBits(); 2230 MVT NVT = MVT::getIntegerVT(NewWidth); 2231 SDValue Ch; 2232 2233 // The extra bits are guaranteed to be zero, since we stored them that 2234 // way. A zext load from NVT thus automatically gives zext from SrcVT. 2235 2236 ISD::LoadExtType NewExtType = 2237 ExtType == ISD::ZEXTLOAD ? ISD::ZEXTLOAD : ISD::EXTLOAD; 2238 2239 Result = DAG.getExtLoad(NewExtType, dl, Node->getValueType(0), 2240 Tmp1, Tmp2, LD->getSrcValue(), SVOffset, 2241 NVT, isVolatile, Alignment); 2242 2243 Ch = Result.getValue(1); // The chain. 2244 2245 if (ExtType == ISD::SEXTLOAD) 2246 // Having the top bits zero doesn't help when sign extending. 2247 Result = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, 2248 Result.getValueType(), 2249 Result, DAG.getValueType(SrcVT)); 2250 else if (ExtType == ISD::ZEXTLOAD || NVT == Result.getValueType()) 2251 // All the top bits are guaranteed to be zero - inform the optimizers. 2252 Result = DAG.getNode(ISD::AssertZext, dl, 2253 Result.getValueType(), Result, 2254 DAG.getValueType(SrcVT)); 2255 2256 Tmp1 = LegalizeOp(Result); 2257 Tmp2 = LegalizeOp(Ch); 2258 } else if (SrcWidth & (SrcWidth - 1)) { 2259 // If not loading a power-of-2 number of bits, expand as two loads. 2260 assert(SrcVT.isExtended() && !SrcVT.isVector() && 2261 "Unsupported extload!"); 2262 unsigned RoundWidth = 1 << Log2_32(SrcWidth); 2263 assert(RoundWidth < SrcWidth); 2264 unsigned ExtraWidth = SrcWidth - RoundWidth; 2265 assert(ExtraWidth < RoundWidth); 2266 assert(!(RoundWidth % 8) && !(ExtraWidth % 8) && 2267 "Load size not an integral number of bytes!"); 2268 MVT RoundVT = MVT::getIntegerVT(RoundWidth); 2269 MVT ExtraVT = MVT::getIntegerVT(ExtraWidth); 2270 SDValue Lo, Hi, Ch; 2271 unsigned IncrementSize; 2272 2273 if (TLI.isLittleEndian()) { 2274 // EXTLOAD:i24 -> ZEXTLOAD:i16 | (shl EXTLOAD@+2:i8, 16) 2275 // Load the bottom RoundWidth bits. 2276 Lo = DAG.getExtLoad(ISD::ZEXTLOAD, dl, 2277 Node->getValueType(0), Tmp1, Tmp2, 2278 LD->getSrcValue(), SVOffset, RoundVT, isVolatile, 2279 Alignment); 2280 2281 // Load the remaining ExtraWidth bits. 2282 IncrementSize = RoundWidth / 8; 2283 Tmp2 = DAG.getNode(ISD::ADD, dl, Tmp2.getValueType(), Tmp2, 2284 DAG.getIntPtrConstant(IncrementSize)); 2285 Hi = DAG.getExtLoad(ExtType, dl, Node->getValueType(0), Tmp1, Tmp2, 2286 LD->getSrcValue(), SVOffset + IncrementSize, 2287 ExtraVT, isVolatile, 2288 MinAlign(Alignment, IncrementSize)); 2289 2290 // Build a factor node to remember that this load is independent of the 2291 // other one. 2292 Ch = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo.getValue(1), 2293 Hi.getValue(1)); 2294 2295 // Move the top bits to the right place. 2296 Hi = DAG.getNode(ISD::SHL, dl, Hi.getValueType(), Hi, 2297 DAG.getConstant(RoundWidth, TLI.getShiftAmountTy())); 2298 2299 // Join the hi and lo parts. 2300 Result = DAG.getNode(ISD::OR, dl, Node->getValueType(0), Lo, Hi); 2301 } else { 2302 // Big endian - avoid unaligned loads. 2303 // EXTLOAD:i24 -> (shl EXTLOAD:i16, 8) | ZEXTLOAD@+2:i8 2304 // Load the top RoundWidth bits. 2305 Hi = DAG.getExtLoad(ExtType, dl, Node->getValueType(0), Tmp1, Tmp2, 2306 LD->getSrcValue(), SVOffset, RoundVT, isVolatile, 2307 Alignment); 2308 2309 // Load the remaining ExtraWidth bits. 2310 IncrementSize = RoundWidth / 8; 2311 Tmp2 = DAG.getNode(ISD::ADD, dl, Tmp2.getValueType(), Tmp2, 2312 DAG.getIntPtrConstant(IncrementSize)); 2313 Lo = DAG.getExtLoad(ISD::ZEXTLOAD, dl, 2314 Node->getValueType(0), Tmp1, Tmp2, 2315 LD->getSrcValue(), SVOffset + IncrementSize, 2316 ExtraVT, isVolatile, 2317 MinAlign(Alignment, IncrementSize)); 2318 2319 // Build a factor node to remember that this load is independent of the 2320 // other one. 2321 Ch = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo.getValue(1), 2322 Hi.getValue(1)); 2323 2324 // Move the top bits to the right place. 2325 Hi = DAG.getNode(ISD::SHL, dl, Hi.getValueType(), Hi, 2326 DAG.getConstant(ExtraWidth, TLI.getShiftAmountTy())); 2327 2328 // Join the hi and lo parts. 2329 Result = DAG.getNode(ISD::OR, dl, Node->getValueType(0), Lo, Hi); 2330 } 2331 2332 Tmp1 = LegalizeOp(Result); 2333 Tmp2 = LegalizeOp(Ch); 2334 } else { 2335 switch (TLI.getLoadExtAction(ExtType, SrcVT)) { 2336 default: assert(0 && "This action is not supported yet!"); 2337 case TargetLowering::Custom: 2338 isCustom = true; 2339 // FALLTHROUGH 2340 case TargetLowering::Legal: 2341 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2, LD->getOffset()); 2342 Tmp1 = Result.getValue(0); 2343 Tmp2 = Result.getValue(1); 2344 2345 if (isCustom) { 2346 Tmp3 = TLI.LowerOperation(Result, DAG); 2347 if (Tmp3.getNode()) { 2348 Tmp1 = LegalizeOp(Tmp3); 2349 Tmp2 = LegalizeOp(Tmp3.getValue(1)); 2350 } 2351 } else { 2352 // If this is an unaligned load and the target doesn't support it, 2353 // expand it. 2354 if (!TLI.allowsUnalignedMemoryAccesses()) { 2355 unsigned ABIAlignment = TLI.getTargetData()-> 2356 getABITypeAlignment(LD->getMemoryVT().getTypeForMVT()); 2357 if (LD->getAlignment() < ABIAlignment){ 2358 Result = ExpandUnalignedLoad(cast<LoadSDNode>(Result.getNode()), DAG, 2359 TLI); 2360 Tmp1 = Result.getOperand(0); 2361 Tmp2 = Result.getOperand(1); 2362 Tmp1 = LegalizeOp(Tmp1); 2363 Tmp2 = LegalizeOp(Tmp2); 2364 } 2365 } 2366 } 2367 break; 2368 case TargetLowering::Expand: 2369 // f64 = EXTLOAD f32 should expand to LOAD, FP_EXTEND 2370 if (SrcVT == MVT::f32 && Node->getValueType(0) == MVT::f64) { 2371 SDValue Load = DAG.getLoad(SrcVT, dl, Tmp1, Tmp2, LD->getSrcValue(), 2372 LD->getSrcValueOffset(), 2373 LD->isVolatile(), LD->getAlignment()); 2374 Result = DAG.getNode(ISD::FP_EXTEND, dl, 2375 Node->getValueType(0), Load); 2376 Tmp1 = LegalizeOp(Result); // Relegalize new nodes. 2377 Tmp2 = LegalizeOp(Load.getValue(1)); 2378 break; 2379 } 2380 assert(ExtType != ISD::EXTLOAD &&"EXTLOAD should always be supported!"); 2381 // Turn the unsupported load into an EXTLOAD followed by an explicit 2382 // zero/sign extend inreg. 2383 Result = DAG.getExtLoad(ISD::EXTLOAD, dl, Node->getValueType(0), 2384 Tmp1, Tmp2, LD->getSrcValue(), 2385 LD->getSrcValueOffset(), SrcVT, 2386 LD->isVolatile(), LD->getAlignment()); 2387 SDValue ValRes; 2388 if (ExtType == ISD::SEXTLOAD) 2389 ValRes = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, 2390 Result.getValueType(), 2391 Result, DAG.getValueType(SrcVT)); 2392 else 2393 ValRes = DAG.getZeroExtendInReg(Result, dl, SrcVT); 2394 Tmp1 = LegalizeOp(ValRes); // Relegalize new nodes. 2395 Tmp2 = LegalizeOp(Result.getValue(1)); // Relegalize new nodes. 2396 break; 2397 } 2398 } 2399 2400 // Since loads produce two values, make sure to remember that we legalized 2401 // both of them. 2402 AddLegalizedOperand(SDValue(Node, 0), Tmp1); 2403 AddLegalizedOperand(SDValue(Node, 1), Tmp2); 2404 return Op.getResNo() ? Tmp2 : Tmp1; 2405 } 2406 } 2407 case ISD::EXTRACT_ELEMENT: { 2408 MVT OpTy = Node->getOperand(0).getValueType(); 2409 switch (getTypeAction(OpTy)) { 2410 default: assert(0 && "EXTRACT_ELEMENT action for type unimplemented!"); 2411 case Legal: 2412 if (cast<ConstantSDNode>(Node->getOperand(1))->getZExtValue()) { 2413 // 1 -> Hi 2414 Result = DAG.getNode(ISD::SRL, dl, OpTy, Node->getOperand(0), 2415 DAG.getConstant(OpTy.getSizeInBits()/2, 2416 TLI.getShiftAmountTy())); 2417 Result = DAG.getNode(ISD::TRUNCATE, dl, Node->getValueType(0), Result); 2418 } else { 2419 // 0 -> Lo 2420 Result = DAG.getNode(ISD::TRUNCATE, dl, Node->getValueType(0), 2421 Node->getOperand(0)); 2422 } 2423 break; 2424 case Expand: 2425 // Get both the low and high parts. 2426 ExpandOp(Node->getOperand(0), Tmp1, Tmp2); 2427 if (cast<ConstantSDNode>(Node->getOperand(1))->getZExtValue()) 2428 Result = Tmp2; // 1 -> Hi 2429 else 2430 Result = Tmp1; // 0 -> Lo 2431 break; 2432 } 2433 break; 2434 } 2435 2436 case ISD::CopyToReg: 2437 Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain. 2438 2439 assert(isTypeLegal(Node->getOperand(2).getValueType()) && 2440 "Register type must be legal!"); 2441 // Legalize the incoming value (must be a legal type). 2442 Tmp2 = LegalizeOp(Node->getOperand(2)); 2443 if (Node->getNumValues() == 1) { 2444 Result = DAG.UpdateNodeOperands(Result, Tmp1, Node->getOperand(1), Tmp2); 2445 } else { 2446 assert(Node->getNumValues() == 2 && "Unknown CopyToReg"); 2447 if (Node->getNumOperands() == 4) { 2448 Tmp3 = LegalizeOp(Node->getOperand(3)); 2449 Result = DAG.UpdateNodeOperands(Result, Tmp1, Node->getOperand(1), Tmp2, 2450 Tmp3); 2451 } else { 2452 Result = DAG.UpdateNodeOperands(Result, Tmp1, Node->getOperand(1),Tmp2); 2453 } 2454 2455 // Since this produces two values, make sure to remember that we legalized 2456 // both of them. 2457 AddLegalizedOperand(SDValue(Node, 0), Result.getValue(0)); 2458 AddLegalizedOperand(SDValue(Node, 1), Result.getValue(1)); 2459 return Result; 2460 } 2461 break; 2462 2463 case ISD::RET: 2464 Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain. 2465 2466 // Ensure that libcalls are emitted before a return. 2467 Tmp1 = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Tmp1, LastCALLSEQ_END); 2468 Tmp1 = LegalizeOp(Tmp1); 2469 LastCALLSEQ_END = DAG.getEntryNode(); 2470 2471 switch (Node->getNumOperands()) { 2472 case 3: // ret val 2473 Tmp2 = Node->getOperand(1); 2474 Tmp3 = Node->getOperand(2); // Signness 2475 switch (getTypeAction(Tmp2.getValueType())) { 2476 case Legal: 2477 Result = DAG.UpdateNodeOperands(Result, Tmp1, LegalizeOp(Tmp2), Tmp3); 2478 break; 2479 case Expand: 2480 if (!Tmp2.getValueType().isVector()) { 2481 SDValue Lo, Hi; 2482 ExpandOp(Tmp2, Lo, Hi); 2483 2484 // Big endian systems want the hi reg first. 2485 if (TLI.isBigEndian()) 2486 std::swap(Lo, Hi); 2487 2488 if (Hi.getNode()) 2489 Result = DAG.getNode(ISD::RET, dl, MVT::Other, 2490 Tmp1, Lo, Tmp3, Hi,Tmp3); 2491 else 2492 Result = DAG.getNode(ISD::RET, dl, MVT::Other, Tmp1, Lo, Tmp3); 2493 Result = LegalizeOp(Result); 2494 } else { 2495 SDNode *InVal = Tmp2.getNode(); 2496 int InIx = Tmp2.getResNo(); 2497 unsigned NumElems = InVal->getValueType(InIx).getVectorNumElements(); 2498 MVT EVT = InVal->getValueType(InIx).getVectorElementType(); 2499 2500 // Figure out if there is a simple type corresponding to this Vector 2501 // type. If so, convert to the vector type. 2502 MVT TVT = MVT::getVectorVT(EVT, NumElems); 2503 if (TLI.isTypeLegal(TVT)) { 2504 // Turn this into a return of the vector type. 2505 Tmp2 = LegalizeOp(Tmp2); 2506 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2, Tmp3); 2507 } else if (NumElems == 1) { 2508 // Turn this into a return of the scalar type. 2509 Tmp2 = ScalarizeVectorOp(Tmp2); 2510 Tmp2 = LegalizeOp(Tmp2); 2511 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2, Tmp3); 2512 2513 // FIXME: Returns of gcc generic vectors smaller than a legal type 2514 // should be returned in integer registers! 2515 2516 // The scalarized value type may not be legal, e.g. it might require 2517 // promotion or expansion. Relegalize the return. 2518 Result = LegalizeOp(Result); 2519 } else { 2520 // FIXME: Returns of gcc generic vectors larger than a legal vector 2521 // type should be returned by reference! 2522 SDValue Lo, Hi; 2523 SplitVectorOp(Tmp2, Lo, Hi); 2524 Result = DAG.getNode(ISD::RET, dl, MVT::Other, 2525 Tmp1, Lo, Tmp3, Hi,Tmp3); 2526 Result = LegalizeOp(Result); 2527 } 2528 } 2529 break; 2530 case Promote: 2531 Tmp2 = PromoteOp(Node->getOperand(1)); 2532 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2, Tmp3); 2533 Result = LegalizeOp(Result); 2534 break; 2535 } 2536 break; 2537 case 1: // ret void 2538 Result = DAG.UpdateNodeOperands(Result, Tmp1); 2539 break; 2540 default: { // ret <values> 2541 SmallVector<SDValue, 8> NewValues; 2542 NewValues.push_back(Tmp1); 2543 for (unsigned i = 1, e = Node->getNumOperands(); i < e; i += 2) 2544 switch (getTypeAction(Node->getOperand(i).getValueType())) { 2545 case Legal: 2546 NewValues.push_back(LegalizeOp(Node->getOperand(i))); 2547 NewValues.push_back(Node->getOperand(i+1)); 2548 break; 2549 case Expand: { 2550 SDValue Lo, Hi; 2551 assert(!Node->getOperand(i).getValueType().isExtended() && 2552 "FIXME: TODO: implement returning non-legal vector types!"); 2553 ExpandOp(Node->getOperand(i), Lo, Hi); 2554 NewValues.push_back(Lo); 2555 NewValues.push_back(Node->getOperand(i+1)); 2556 if (Hi.getNode()) { 2557 NewValues.push_back(Hi); 2558 NewValues.push_back(Node->getOperand(i+1)); 2559 } 2560 break; 2561 } 2562 case Promote: 2563 assert(0 && "Can't promote multiple return value yet!"); 2564 } 2565 2566 if (NewValues.size() == Node->getNumOperands()) 2567 Result = DAG.UpdateNodeOperands(Result, &NewValues[0],NewValues.size()); 2568 else 2569 Result = DAG.getNode(ISD::RET, dl, MVT::Other, 2570 &NewValues[0], NewValues.size()); 2571 break; 2572 } 2573 } 2574 2575 if (Result.getOpcode() == ISD::RET) { 2576 switch (TLI.getOperationAction(Result.getOpcode(), MVT::Other)) { 2577 default: assert(0 && "This action is not supported yet!"); 2578 case TargetLowering::Legal: break; 2579 case TargetLowering::Custom: 2580 Tmp1 = TLI.LowerOperation(Result, DAG); 2581 if (Tmp1.getNode()) Result = Tmp1; 2582 break; 2583 } 2584 } 2585 break; 2586 case ISD::STORE: { 2587 StoreSDNode *ST = cast<StoreSDNode>(Node); 2588 Tmp1 = LegalizeOp(ST->getChain()); // Legalize the chain. 2589 Tmp2 = LegalizeOp(ST->getBasePtr()); // Legalize the pointer. 2590 int SVOffset = ST->getSrcValueOffset(); 2591 unsigned Alignment = ST->getAlignment(); 2592 bool isVolatile = ST->isVolatile(); 2593 2594 if (!ST->isTruncatingStore()) { 2595 // Turn 'store float 1.0, Ptr' -> 'store int 0x12345678, Ptr' 2596 // FIXME: We shouldn't do this for TargetConstantFP's. 2597 // FIXME: move this to the DAG Combiner! Note that we can't regress due 2598 // to phase ordering between legalized code and the dag combiner. This 2599 // probably means that we need to integrate dag combiner and legalizer 2600 // together. 2601 // We generally can't do this one for long doubles. 2602 if (ConstantFPSDNode *CFP = dyn_cast<ConstantFPSDNode>(ST->getValue())) { 2603 if (CFP->getValueType(0) == MVT::f32 && 2604 getTypeAction(MVT::i32) == Legal) { 2605 Tmp3 = DAG.getConstant(CFP->getValueAPF(). 2606 bitcastToAPInt().zextOrTrunc(32), 2607 MVT::i32); 2608 Result = DAG.getStore(Tmp1, dl, Tmp3, Tmp2, ST->getSrcValue(), 2609 SVOffset, isVolatile, Alignment); 2610 break; 2611 } else if (CFP->getValueType(0) == MVT::f64) { 2612 // If this target supports 64-bit registers, do a single 64-bit store. 2613 if (getTypeAction(MVT::i64) == Legal) { 2614 Tmp3 = DAG.getConstant(CFP->getValueAPF().bitcastToAPInt(). 2615 zextOrTrunc(64), MVT::i64); 2616 Result = DAG.getStore(Tmp1, dl, Tmp3, Tmp2, ST->getSrcValue(), 2617 SVOffset, isVolatile, Alignment); 2618 break; 2619 } else if (getTypeAction(MVT::i32) == Legal && !ST->isVolatile()) { 2620 // Otherwise, if the target supports 32-bit registers, use 2 32-bit 2621 // stores. If the target supports neither 32- nor 64-bits, this 2622 // xform is certainly not worth it. 2623 const APInt &IntVal =CFP->getValueAPF().bitcastToAPInt(); 2624 SDValue Lo = DAG.getConstant(APInt(IntVal).trunc(32), MVT::i32); 2625 SDValue Hi = DAG.getConstant(IntVal.lshr(32).trunc(32), MVT::i32); 2626 if (TLI.isBigEndian()) std::swap(Lo, Hi); 2627 2628 Lo = DAG.getStore(Tmp1, dl, Lo, Tmp2, ST->getSrcValue(), 2629 SVOffset, isVolatile, Alignment); 2630 Tmp2 = DAG.getNode(ISD::ADD, dl, Tmp2.getValueType(), Tmp2, 2631 DAG.getIntPtrConstant(4)); 2632 Hi = DAG.getStore(Tmp1, dl, Hi, Tmp2, ST->getSrcValue(), SVOffset+4, 2633 isVolatile, MinAlign(Alignment, 4U)); 2634 2635 Result = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo, Hi); 2636 break; 2637 } 2638 } 2639 } 2640 2641 switch (getTypeAction(ST->getMemoryVT())) { 2642 case Legal: { 2643 Tmp3 = LegalizeOp(ST->getValue()); 2644 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp3, Tmp2, 2645 ST->getOffset()); 2646 2647 MVT VT = Tmp3.getValueType(); 2648 switch (TLI.getOperationAction(ISD::STORE, VT)) { 2649 default: assert(0 && "This action is not supported yet!"); 2650 case TargetLowering::Legal: 2651 // If this is an unaligned store and the target doesn't support it, 2652 // expand it. 2653 if (!TLI.allowsUnalignedMemoryAccesses()) { 2654 unsigned ABIAlignment = TLI.getTargetData()-> 2655 getABITypeAlignment(ST->getMemoryVT().getTypeForMVT()); 2656 if (ST->getAlignment() < ABIAlignment) 2657 Result = ExpandUnalignedStore(cast<StoreSDNode>(Result.getNode()), DAG, 2658 TLI); 2659 } 2660 break; 2661 case TargetLowering::Custom: 2662 Tmp1 = TLI.LowerOperation(Result, DAG); 2663 if (Tmp1.getNode()) Result = Tmp1; 2664 break; 2665 case TargetLowering::Promote: 2666 assert(VT.isVector() && "Unknown legal promote case!"); 2667 Tmp3 = DAG.getNode(ISD::BIT_CONVERT, dl, 2668 TLI.getTypeToPromoteTo(ISD::STORE, VT), Tmp3); 2669 Result = DAG.getStore(Tmp1, dl, Tmp3, Tmp2, 2670 ST->getSrcValue(), SVOffset, isVolatile, 2671 Alignment); 2672 break; 2673 } 2674 break; 2675 } 2676 case Promote: 2677 if (!ST->getMemoryVT().isVector()) { 2678 // Truncate the value and store the result. 2679 Tmp3 = PromoteOp(ST->getValue()); 2680 Result = DAG.getTruncStore(Tmp1, dl, Tmp3, Tmp2, ST->getSrcValue(), 2681 SVOffset, ST->getMemoryVT(), 2682 isVolatile, Alignment); 2683 break; 2684 } 2685 // Fall thru to expand for vector 2686 case Expand: { 2687 unsigned IncrementSize = 0; 2688 SDValue Lo, Hi; 2689 2690 // If this is a vector type, then we have to calculate the increment as 2691 // the product of the element size in bytes, and the number of elements 2692 // in the high half of the vector. 2693 if (ST->getValue().getValueType().isVector()) { 2694 SDNode *InVal = ST->getValue().getNode(); 2695 int InIx = ST->getValue().getResNo(); 2696 MVT InVT = InVal->getValueType(InIx); 2697 unsigned NumElems = InVT.getVectorNumElements(); 2698 MVT EVT = InVT.getVectorElementType(); 2699 2700 // Figure out if there is a simple type corresponding to this Vector 2701 // type. If so, convert to the vector type. 2702 MVT TVT = MVT::getVectorVT(EVT, NumElems); 2703 if (TLI.isTypeLegal(TVT)) { 2704 // Turn this into a normal store of the vector type. 2705 Tmp3 = LegalizeOp(ST->getValue()); 2706 Result = DAG.getStore(Tmp1, dl, Tmp3, Tmp2, ST->getSrcValue(), 2707 SVOffset, isVolatile, Alignment); 2708 Result = LegalizeOp(Result); 2709 break; 2710 } else if (NumElems == 1) { 2711 // Turn this into a normal store of the scalar type. 2712 Tmp3 = ScalarizeVectorOp(ST->getValue()); 2713 Result = DAG.getStore(Tmp1, dl, Tmp3, Tmp2, ST->getSrcValue(), 2714 SVOffset, isVolatile, Alignment); 2715 // The scalarized value type may not be legal, e.g. it might require 2716 // promotion or expansion. Relegalize the scalar store. 2717 Result = LegalizeOp(Result); 2718 break; 2719 } else { 2720 // Check if we have widen this node with another value 2721 std::map<SDValue, SDValue>::iterator I = 2722 WidenNodes.find(ST->getValue()); 2723 if (I != WidenNodes.end()) { 2724 Result = StoreWidenVectorOp(ST, Tmp1, Tmp2); 2725 break; 2726 } 2727 else { 2728 SplitVectorOp(ST->getValue(), Lo, Hi); 2729 IncrementSize = Lo.getNode()->getValueType(0).getVectorNumElements() * 2730 EVT.getSizeInBits()/8; 2731 } 2732 } 2733 } else { 2734 ExpandOp(ST->getValue(), Lo, Hi); 2735 IncrementSize = Hi.getNode() ? Hi.getValueType().getSizeInBits()/8 : 0; 2736 2737 if (Hi.getNode() && TLI.isBigEndian()) 2738 std::swap(Lo, Hi); 2739 } 2740 2741 Lo = DAG.getStore(Tmp1, dl, Lo, Tmp2, ST->getSrcValue(), 2742 SVOffset, isVolatile, Alignment); 2743 2744 if (Hi.getNode() == NULL) { 2745 // Must be int <-> float one-to-one expansion. 2746 Result = Lo; 2747 break; 2748 } 2749 2750 Tmp2 = DAG.getNode(ISD::ADD, dl, Tmp2.getValueType(), Tmp2, 2751 DAG.getIntPtrConstant(IncrementSize)); 2752 assert(isTypeLegal(Tmp2.getValueType()) && 2753 "Pointers must be legal!"); 2754 SVOffset += IncrementSize; 2755 Alignment = MinAlign(Alignment, IncrementSize); 2756 Hi = DAG.getStore(Tmp1, dl, Hi, Tmp2, ST->getSrcValue(), 2757 SVOffset, isVolatile, Alignment); 2758 Result = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo, Hi); 2759 break; 2760 } // case Expand 2761 } 2762 } else { 2763 switch (getTypeAction(ST->getValue().getValueType())) { 2764 case Legal: 2765 Tmp3 = LegalizeOp(ST->getValue()); 2766 break; 2767 case Promote: 2768 if (!ST->getValue().getValueType().isVector()) { 2769 // We can promote the value, the truncstore will still take care of it. 2770 Tmp3 = PromoteOp(ST->getValue()); 2771 break; 2772 } 2773 // Vector case falls through to expand 2774 case Expand: 2775 // Just store the low part. This may become a non-trunc store, so make 2776 // sure to use getTruncStore, not UpdateNodeOperands below. 2777 ExpandOp(ST->getValue(), Tmp3, Tmp4); 2778 return DAG.getTruncStore(Tmp1, dl, Tmp3, Tmp2, ST->getSrcValue(), 2779 SVOffset, MVT::i8, isVolatile, Alignment); 2780 } 2781 2782 MVT StVT = ST->getMemoryVT(); 2783 unsigned StWidth = StVT.getSizeInBits(); 2784 2785 if (StWidth != StVT.getStoreSizeInBits()) { 2786 // Promote to a byte-sized store with upper bits zero if not 2787 // storing an integral number of bytes. For example, promote 2788 // TRUNCSTORE:i1 X -> TRUNCSTORE:i8 (and X, 1) 2789 MVT NVT = MVT::getIntegerVT(StVT.getStoreSizeInBits()); 2790 Tmp3 = DAG.getZeroExtendInReg(Tmp3, dl, StVT); 2791 Result = DAG.getTruncStore(Tmp1, dl, Tmp3, Tmp2, ST->getSrcValue(), 2792 SVOffset, NVT, isVolatile, Alignment); 2793 } else if (StWidth & (StWidth - 1)) { 2794 // If not storing a power-of-2 number of bits, expand as two stores. 2795 assert(StVT.isExtended() && !StVT.isVector() && 2796 "Unsupported truncstore!"); 2797 unsigned RoundWidth = 1 << Log2_32(StWidth); 2798 assert(RoundWidth < StWidth); 2799 unsigned ExtraWidth = StWidth - RoundWidth; 2800 assert(ExtraWidth < RoundWidth); 2801 assert(!(RoundWidth % 8) && !(ExtraWidth % 8) && 2802 "Store size not an integral number of bytes!"); 2803 MVT RoundVT = MVT::getIntegerVT(RoundWidth); 2804 MVT ExtraVT = MVT::getIntegerVT(ExtraWidth); 2805 SDValue Lo, Hi; 2806 unsigned IncrementSize; 2807 2808 if (TLI.isLittleEndian()) { 2809 // TRUNCSTORE:i24 X -> TRUNCSTORE:i16 X, TRUNCSTORE@+2:i8 (srl X, 16) 2810 // Store the bottom RoundWidth bits. 2811 Lo = DAG.getTruncStore(Tmp1, dl, Tmp3, Tmp2, ST->getSrcValue(), 2812 SVOffset, RoundVT, 2813 isVolatile, Alignment); 2814 2815 // Store the remaining ExtraWidth bits. 2816 IncrementSize = RoundWidth / 8; 2817 Tmp2 = DAG.getNode(ISD::ADD, dl, Tmp2.getValueType(), Tmp2, 2818 DAG.getIntPtrConstant(IncrementSize)); 2819 Hi = DAG.getNode(ISD::SRL, dl, Tmp3.getValueType(), Tmp3, 2820 DAG.getConstant(RoundWidth, TLI.getShiftAmountTy())); 2821 Hi = DAG.getTruncStore(Tmp1, dl, Hi, Tmp2, ST->getSrcValue(), 2822 SVOffset + IncrementSize, ExtraVT, isVolatile, 2823 MinAlign(Alignment, IncrementSize)); 2824 } else { 2825 // Big endian - avoid unaligned stores. 2826 // TRUNCSTORE:i24 X -> TRUNCSTORE:i16 (srl X, 8), TRUNCSTORE@+2:i8 X 2827 // Store the top RoundWidth bits. 2828 Hi = DAG.getNode(ISD::SRL, dl, Tmp3.getValueType(), Tmp3, 2829 DAG.getConstant(ExtraWidth, TLI.getShiftAmountTy())); 2830 Hi = DAG.getTruncStore(Tmp1, dl, Hi, Tmp2, ST->getSrcValue(), 2831 SVOffset, RoundVT, isVolatile, Alignment); 2832 2833 // Store the remaining ExtraWidth bits. 2834 IncrementSize = RoundWidth / 8; 2835 Tmp2 = DAG.getNode(ISD::ADD, dl, Tmp2.getValueType(), Tmp2, 2836 DAG.getIntPtrConstant(IncrementSize)); 2837 Lo = DAG.getTruncStore(Tmp1, dl, Tmp3, Tmp2, ST->getSrcValue(), 2838 SVOffset + IncrementSize, ExtraVT, isVolatile, 2839 MinAlign(Alignment, IncrementSize)); 2840 } 2841 2842 // The order of the stores doesn't matter. 2843 Result = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo, Hi); 2844 } else { 2845 if (Tmp1 != ST->getChain() || Tmp3 != ST->getValue() || 2846 Tmp2 != ST->getBasePtr()) 2847 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp3, Tmp2, 2848 ST->getOffset()); 2849 2850 switch (TLI.getTruncStoreAction(ST->getValue().getValueType(), StVT)) { 2851 default: assert(0 && "This action is not supported yet!"); 2852 case TargetLowering::Legal: 2853 // If this is an unaligned store and the target doesn't support it, 2854 // expand it. 2855 if (!TLI.allowsUnalignedMemoryAccesses()) { 2856 unsigned ABIAlignment = TLI.getTargetData()-> 2857 getABITypeAlignment(ST->getMemoryVT().getTypeForMVT()); 2858 if (ST->getAlignment() < ABIAlignment) 2859 Result = ExpandUnalignedStore(cast<StoreSDNode>(Result.getNode()), DAG, 2860 TLI); 2861 } 2862 break; 2863 case TargetLowering::Custom: 2864 Result = TLI.LowerOperation(Result, DAG); 2865 break; 2866 case Expand: 2867 // TRUNCSTORE:i16 i32 -> STORE i16 2868 assert(isTypeLegal(StVT) && "Do not know how to expand this store!"); 2869 Tmp3 = DAG.getNode(ISD::TRUNCATE, dl, StVT, Tmp3); 2870 Result = DAG.getStore(Tmp1, dl, Tmp3, Tmp2, ST->getSrcValue(), 2871 SVOffset, isVolatile, Alignment); 2872 break; 2873 } 2874 } 2875 } 2876 break; 2877 } 2878 case ISD::PCMARKER: 2879 Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain. 2880 Result = DAG.UpdateNodeOperands(Result, Tmp1, Node->getOperand(1)); 2881 break; 2882 case ISD::STACKSAVE: 2883 Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain. 2884 Result = DAG.UpdateNodeOperands(Result, Tmp1); 2885 Tmp1 = Result.getValue(0); 2886 Tmp2 = Result.getValue(1); 2887 2888 switch (TLI.getOperationAction(ISD::STACKSAVE, MVT::Other)) { 2889 default: assert(0 && "This action is not supported yet!"); 2890 case TargetLowering::Legal: break; 2891 case TargetLowering::Custom: 2892 Tmp3 = TLI.LowerOperation(Result, DAG); 2893 if (Tmp3.getNode()) { 2894 Tmp1 = LegalizeOp(Tmp3); 2895 Tmp2 = LegalizeOp(Tmp3.getValue(1)); 2896 } 2897 break; 2898 case TargetLowering::Expand: 2899 // Expand to CopyFromReg if the target set 2900 // StackPointerRegisterToSaveRestore. 2901 if (unsigned SP = TLI.getStackPointerRegisterToSaveRestore()) { 2902 Tmp1 = DAG.getCopyFromReg(Result.getOperand(0), dl, SP, 2903 Node->getValueType(0)); 2904 Tmp2 = Tmp1.getValue(1); 2905 } else { 2906 Tmp1 = DAG.getUNDEF(Node->getValueType(0)); 2907 Tmp2 = Node->getOperand(0); 2908 } 2909 break; 2910 } 2911 2912 // Since stacksave produce two values, make sure to remember that we 2913 // legalized both of them. 2914 AddLegalizedOperand(SDValue(Node, 0), Tmp1); 2915 AddLegalizedOperand(SDValue(Node, 1), Tmp2); 2916 return Op.getResNo() ? Tmp2 : Tmp1; 2917 2918 case ISD::STACKRESTORE: 2919 Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain. 2920 Tmp2 = LegalizeOp(Node->getOperand(1)); // Legalize the pointer. 2921 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2); 2922 2923 switch (TLI.getOperationAction(ISD::STACKRESTORE, MVT::Other)) { 2924 default: assert(0 && "This action is not supported yet!"); 2925 case TargetLowering::Legal: break; 2926 case TargetLowering::Custom: 2927 Tmp1 = TLI.LowerOperation(Result, DAG); 2928 if (Tmp1.getNode()) Result = Tmp1; 2929 break; 2930 case TargetLowering::Expand: 2931 // Expand to CopyToReg if the target set 2932 // StackPointerRegisterToSaveRestore. 2933 if (unsigned SP = TLI.getStackPointerRegisterToSaveRestore()) { 2934 Result = DAG.getCopyToReg(Tmp1, dl, SP, Tmp2); 2935 } else { 2936 Result = Tmp1; 2937 } 2938 break; 2939 } 2940 break; 2941 2942 case ISD::READCYCLECOUNTER: 2943 Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain 2944 Result = DAG.UpdateNodeOperands(Result, Tmp1); 2945 switch (TLI.getOperationAction(ISD::READCYCLECOUNTER, 2946 Node->getValueType(0))) { 2947 default: assert(0 && "This action is not supported yet!"); 2948 case TargetLowering::Legal: 2949 Tmp1 = Result.getValue(0); 2950 Tmp2 = Result.getValue(1); 2951 break; 2952 case TargetLowering::Custom: 2953 Result = TLI.LowerOperation(Result, DAG); 2954 Tmp1 = LegalizeOp(Result.getValue(0)); 2955 Tmp2 = LegalizeOp(Result.getValue(1)); 2956 break; 2957 } 2958 2959 // Since rdcc produce two values, make sure to remember that we legalized 2960 // both of them. 2961 AddLegalizedOperand(SDValue(Node, 0), Tmp1); 2962 AddLegalizedOperand(SDValue(Node, 1), Tmp2); 2963 return Result; 2964 2965 case ISD::SELECT: 2966 switch (getTypeAction(Node->getOperand(0).getValueType())) { 2967 case Expand: assert(0 && "It's impossible to expand bools"); 2968 case Legal: 2969 Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the condition. 2970 break; 2971 case Promote: { 2972 assert(!Node->getOperand(0).getValueType().isVector() && "not possible"); 2973 Tmp1 = PromoteOp(Node->getOperand(0)); // Promote the condition. 2974 // Make sure the condition is either zero or one. 2975 unsigned BitWidth = Tmp1.getValueSizeInBits(); 2976 if (!DAG.MaskedValueIsZero(Tmp1, 2977 APInt::getHighBitsSet(BitWidth, BitWidth-1))) 2978 Tmp1 = DAG.getZeroExtendInReg(Tmp1, dl, MVT::i1); 2979 break; 2980 } 2981 } 2982 Tmp2 = LegalizeOp(Node->getOperand(1)); // TrueVal 2983 Tmp3 = LegalizeOp(Node->getOperand(2)); // FalseVal 2984 2985 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2, Tmp3); 2986 2987 switch (TLI.getOperationAction(ISD::SELECT, Tmp2.getValueType())) { 2988 default: assert(0 && "This action is not supported yet!"); 2989 case TargetLowering::Legal: break; 2990 case TargetLowering::Custom: { 2991 Tmp1 = TLI.LowerOperation(Result, DAG); 2992 if (Tmp1.getNode()) Result = Tmp1; 2993 break; 2994 } 2995 case TargetLowering::Expand: 2996 if (Tmp1.getOpcode() == ISD::SETCC) { 2997 Result = DAG.getSelectCC(dl, Tmp1.getOperand(0), Tmp1.getOperand(1), 2998 Tmp2, Tmp3, 2999 cast<CondCodeSDNode>(Tmp1.getOperand(2))->get()); 3000 } else { 3001 Result = DAG.getSelectCC(dl, Tmp1, 3002 DAG.getConstant(0, Tmp1.getValueType()), 3003 Tmp2, Tmp3, ISD::SETNE); 3004 } 3005 break; 3006 case TargetLowering::Promote: { 3007 MVT NVT = 3008 TLI.getTypeToPromoteTo(ISD::SELECT, Tmp2.getValueType()); 3009 unsigned ExtOp, TruncOp; 3010 if (Tmp2.getValueType().isVector()) { 3011 ExtOp = ISD::BIT_CONVERT; 3012 TruncOp = ISD::BIT_CONVERT; 3013 } else if (Tmp2.getValueType().isInteger()) { 3014 ExtOp = ISD::ANY_EXTEND; 3015 TruncOp = ISD::TRUNCATE; 3016 } else { 3017 ExtOp = ISD::FP_EXTEND; 3018 TruncOp = ISD::FP_ROUND; 3019 } 3020 // Promote each of the values to the new type. 3021 Tmp2 = DAG.getNode(ExtOp, dl, NVT, Tmp2); 3022 Tmp3 = DAG.getNode(ExtOp, dl, NVT, Tmp3); 3023 // Perform the larger operation, then round down. 3024 Result = DAG.getNode(ISD::SELECT, dl, NVT, Tmp1, Tmp2,Tmp3); 3025 if (TruncOp != ISD::FP_ROUND) 3026 Result = DAG.getNode(TruncOp, dl, Node->getValueType(0), Result); 3027 else 3028 Result = DAG.getNode(TruncOp, dl, Node->getValueType(0), Result, 3029 DAG.getIntPtrConstant(0)); 3030 break; 3031 } 3032 } 3033 break; 3034 case ISD::SELECT_CC: { 3035 Tmp1 = Node->getOperand(0); // LHS 3036 Tmp2 = Node->getOperand(1); // RHS 3037 Tmp3 = LegalizeOp(Node->getOperand(2)); // True 3038 Tmp4 = LegalizeOp(Node->getOperand(3)); // False 3039 SDValue CC = Node->getOperand(4); 3040 3041 LegalizeSetCC(TLI.getSetCCResultType(Tmp1.getValueType()), 3042 Tmp1, Tmp2, CC, dl); 3043 3044 // If we didn't get both a LHS and RHS back from LegalizeSetCC, 3045 // the LHS is a legal SETCC itself. In this case, we need to compare 3046 // the result against zero to select between true and false values. 3047 if (Tmp2.getNode() == 0) { 3048 Tmp2 = DAG.getConstant(0, Tmp1.getValueType()); 3049 CC = DAG.getCondCode(ISD::SETNE); 3050 } 3051 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2, Tmp3, Tmp4, CC); 3052 3053 // Everything is legal, see if we should expand this op or something. 3054 switch (TLI.getOperationAction(ISD::SELECT_CC, Tmp3.getValueType())) { 3055 default: assert(0 && "This action is not supported yet!"); 3056 case TargetLowering::Legal: break; 3057 case TargetLowering::Custom: 3058 Tmp1 = TLI.LowerOperation(Result, DAG); 3059 if (Tmp1.getNode()) Result = Tmp1; 3060 break; 3061 } 3062 break; 3063 } 3064 case ISD::SETCC: 3065 Tmp1 = Node->getOperand(0); 3066 Tmp2 = Node->getOperand(1); 3067 Tmp3 = Node->getOperand(2); 3068 LegalizeSetCC(Node->getValueType(0), Tmp1, Tmp2, Tmp3, dl); 3069 3070 // If we had to Expand the SetCC operands into a SELECT node, then it may 3071 // not always be possible to return a true LHS & RHS. In this case, just 3072 // return the value we legalized, returned in the LHS 3073 if (Tmp2.getNode() == 0) { 3074 Result = Tmp1; 3075 break; 3076 } 3077 3078 switch (TLI.getOperationAction(ISD::SETCC, Tmp1.getValueType())) { 3079 default: assert(0 && "Cannot handle this action for SETCC yet!"); 3080 case TargetLowering::Custom: 3081 isCustom = true; 3082 // FALLTHROUGH. 3083 case TargetLowering::Legal: 3084 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2, Tmp3); 3085 if (isCustom) { 3086 Tmp4 = TLI.LowerOperation(Result, DAG); 3087 if (Tmp4.getNode()) Result = Tmp4; 3088 } 3089 break; 3090 case TargetLowering::Promote: { 3091 // First step, figure out the appropriate operation to use. 3092 // Allow SETCC to not be supported for all legal data types 3093 // Mostly this targets FP 3094 MVT NewInTy = Node->getOperand(0).getValueType(); 3095 MVT OldVT = NewInTy; OldVT = OldVT; 3096 3097 // Scan for the appropriate larger type to use. 3098 while (1) { 3099 NewInTy = (MVT::SimpleValueType)(NewInTy.getSimpleVT()+1); 3100 3101 assert(NewInTy.isInteger() == OldVT.isInteger() && 3102 "Fell off of the edge of the integer world"); 3103 assert(NewInTy.isFloatingPoint() == OldVT.isFloatingPoint() && 3104 "Fell off of the edge of the floating point world"); 3105 3106 // If the target supports SETCC of this type, use it. 3107 if (TLI.isOperationLegalOrCustom(ISD::SETCC, NewInTy)) 3108 break; 3109 } 3110 if (NewInTy.isInteger()) 3111 assert(0 && "Cannot promote Legal Integer SETCC yet"); 3112 else { 3113 Tmp1 = DAG.getNode(ISD::FP_EXTEND, dl, NewInTy, Tmp1); 3114 Tmp2 = DAG.getNode(ISD::FP_EXTEND, dl, NewInTy, Tmp2); 3115 } 3116 Tmp1 = LegalizeOp(Tmp1); 3117 Tmp2 = LegalizeOp(Tmp2); 3118 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2, Tmp3); 3119 Result = LegalizeOp(Result); 3120 break; 3121 } 3122 case TargetLowering::Expand: 3123 // Expand a setcc node into a select_cc of the same condition, lhs, and 3124 // rhs that selects between const 1 (true) and const 0 (false). 3125 MVT VT = Node->getValueType(0); 3126 Result = DAG.getNode(ISD::SELECT_CC, dl, VT, Tmp1, Tmp2, 3127 DAG.getConstant(1, VT), DAG.getConstant(0, VT), 3128 Tmp3); 3129 break; 3130 } 3131 break; 3132 case ISD::VSETCC: { 3133 Tmp1 = LegalizeOp(Node->getOperand(0)); // LHS 3134 Tmp2 = LegalizeOp(Node->getOperand(1)); // RHS 3135 SDValue CC = Node->getOperand(2); 3136 3137 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2, CC); 3138 3139 // Everything is legal, see if we should expand this op or something. 3140 switch (TLI.getOperationAction(ISD::VSETCC, Tmp1.getValueType())) { 3141 default: assert(0 && "This action is not supported yet!"); 3142 case TargetLowering::Legal: break; 3143 case TargetLowering::Custom: 3144 Tmp1 = TLI.LowerOperation(Result, DAG); 3145 if (Tmp1.getNode()) Result = Tmp1; 3146 break; 3147 case TargetLowering::Expand: { 3148 // Unroll into a nasty set of scalar code for now. 3149 MVT VT = Node->getValueType(0); 3150 unsigned NumElems = VT.getVectorNumElements(); 3151 MVT EltVT = VT.getVectorElementType(); 3152 MVT TmpEltVT = Tmp1.getValueType().getVectorElementType(); 3153 SmallVector<SDValue, 8> Ops(NumElems); 3154 for (unsigned i = 0; i < NumElems; ++i) { 3155 SDValue In1 = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, TmpEltVT, 3156 Tmp1, DAG.getIntPtrConstant(i)); 3157 Ops[i] = DAG.getNode(ISD::SETCC, dl, TLI.getSetCCResultType(TmpEltVT), 3158 In1, DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, 3159 TmpEltVT, Tmp2, 3160 DAG.getIntPtrConstant(i)), 3161 CC); 3162 Ops[i] = DAG.getNode(ISD::SELECT, dl, EltVT, Ops[i], DAG.getConstant( 3163 APInt::getAllOnesValue(EltVT.getSizeInBits()), 3164 EltVT), DAG.getConstant(0, EltVT)); 3165 } 3166 Result = DAG.getNode(ISD::BUILD_VECTOR, dl, VT, &Ops[0], NumElems); 3167 break; 3168 } 3169 } 3170 break; 3171 } 3172 3173 case ISD::SHL_PARTS: 3174 case ISD::SRA_PARTS: 3175 case ISD::SRL_PARTS: { 3176 SmallVector<SDValue, 8> Ops; 3177 bool Changed = false; 3178 unsigned N = Node->getNumOperands(); 3179 for (unsigned i = 0; i + 1 < N; ++i) { 3180 Ops.push_back(LegalizeOp(Node->getOperand(i))); 3181 Changed |= Ops.back() != Node->getOperand(i); 3182 } 3183 Ops.push_back(LegalizeOp(DAG.getShiftAmountOperand(Node->getOperand(N-1)))); 3184 Changed |= Ops.back() != Node->getOperand(N-1); 3185 if (Changed) 3186 Result = DAG.UpdateNodeOperands(Result, &Ops[0], Ops.size()); 3187 3188 switch (TLI.getOperationAction(Node->getOpcode(), 3189 Node->getValueType(0))) { 3190 default: assert(0 && "This action is not supported yet!"); 3191 case TargetLowering::Legal: break; 3192 case TargetLowering::Custom: 3193 Tmp1 = TLI.LowerOperation(Result, DAG); 3194 if (Tmp1.getNode()) { 3195 SDValue Tmp2, RetVal(0, 0); 3196 for (unsigned i = 0, e = Node->getNumValues(); i != e; ++i) { 3197 Tmp2 = LegalizeOp(Tmp1.getValue(i)); 3198 AddLegalizedOperand(SDValue(Node, i), Tmp2); 3199 if (i == Op.getResNo()) 3200 RetVal = Tmp2; 3201 } 3202 assert(RetVal.getNode() && "Illegal result number"); 3203 return RetVal; 3204 } 3205 break; 3206 } 3207 3208 // Since these produce multiple values, make sure to remember that we 3209 // legalized all of them. 3210 for (unsigned i = 0, e = Node->getNumValues(); i != e; ++i) 3211 AddLegalizedOperand(SDValue(Node, i), Result.getValue(i)); 3212 return Result.getValue(Op.getResNo()); 3213 } 3214 3215 // Binary operators 3216 case ISD::ADD: 3217 case ISD::SUB: 3218 case ISD::MUL: 3219 case ISD::MULHS: 3220 case ISD::MULHU: 3221 case ISD::UDIV: 3222 case ISD::SDIV: 3223 case ISD::AND: 3224 case ISD::OR: 3225 case ISD::XOR: 3226 case ISD::SHL: 3227 case ISD::SRL: 3228 case ISD::SRA: 3229 case ISD::FADD: 3230 case ISD::FSUB: 3231 case ISD::FMUL: 3232 case ISD::FDIV: 3233 case ISD::FPOW: 3234 Tmp1 = LegalizeOp(Node->getOperand(0)); // LHS 3235 Tmp2 = LegalizeOp(Node->getOperand(1)); // RHS 3236 3237 if ((Node->getOpcode() == ISD::SHL || 3238 Node->getOpcode() == ISD::SRL || 3239 Node->getOpcode() == ISD::SRA) && 3240 !Node->getValueType(0).isVector()) 3241 Tmp2 = DAG.getShiftAmountOperand(Tmp2); 3242 3243 switch (getTypeAction(Tmp2.getValueType())) { 3244 case Expand: assert(0 && "Not possible"); 3245 case Legal: 3246 Tmp2 = LegalizeOp(Tmp2); // Legalize the RHS. 3247 break; 3248 case Promote: 3249 Tmp2 = PromoteOp(Tmp2); // Promote the RHS. 3250 break; 3251 } 3252 3253 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2); 3254 3255 switch (TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0))) { 3256 default: assert(0 && "BinOp legalize operation not supported"); 3257 case TargetLowering::Legal: break; 3258 case TargetLowering::Custom: 3259 Tmp1 = TLI.LowerOperation(Result, DAG); 3260 if (Tmp1.getNode()) { 3261 Result = Tmp1; 3262 break; 3263 } 3264 // Fall through if the custom lower can't deal with the operation 3265 case TargetLowering::Expand: { 3266 MVT VT = Op.getValueType(); 3267 3268 // See if multiply or divide can be lowered using two-result operations. 3269 SDVTList VTs = DAG.getVTList(VT, VT); 3270 if (Node->getOpcode() == ISD::MUL) { 3271 // We just need the low half of the multiply; try both the signed 3272 // and unsigned forms. If the target supports both SMUL_LOHI and 3273 // UMUL_LOHI, form a preference by checking which forms of plain 3274 // MULH it supports. 3275 bool HasSMUL_LOHI = TLI.isOperationLegalOrCustom(ISD::SMUL_LOHI, VT); 3276 bool HasUMUL_LOHI = TLI.isOperationLegalOrCustom(ISD::UMUL_LOHI, VT); 3277 bool HasMULHS = TLI.isOperationLegalOrCustom(ISD::MULHS, VT); 3278 bool HasMULHU = TLI.isOperationLegalOrCustom(ISD::MULHU, VT); 3279 unsigned OpToUse = 0; 3280 if (HasSMUL_LOHI && !HasMULHS) { 3281 OpToUse = ISD::SMUL_LOHI; 3282 } else if (HasUMUL_LOHI && !HasMULHU) { 3283 OpToUse = ISD::UMUL_LOHI; 3284 } else if (HasSMUL_LOHI) { 3285 OpToUse = ISD::SMUL_LOHI; 3286 } else if (HasUMUL_LOHI) { 3287 OpToUse = ISD::UMUL_LOHI; 3288 } 3289 if (OpToUse) { 3290 Result = SDValue(DAG.getNode(OpToUse, dl, VTs, Tmp1, Tmp2).getNode(), 3291 0); 3292 break; 3293 } 3294 } 3295 if (Node->getOpcode() == ISD::MULHS && 3296 TLI.isOperationLegalOrCustom(ISD::SMUL_LOHI, VT)) { 3297 Result = SDValue(DAG.getNode(ISD::SMUL_LOHI, dl, 3298 VTs, Tmp1, Tmp2).getNode(), 3299 1); 3300 break; 3301 } 3302 if (Node->getOpcode() == ISD::MULHU && 3303 TLI.isOperationLegalOrCustom(ISD::UMUL_LOHI, VT)) { 3304 Result = SDValue(DAG.getNode(ISD::UMUL_LOHI, dl, 3305 VTs, Tmp1, Tmp2).getNode(), 3306 1); 3307 break; 3308 } 3309 if (Node->getOpcode() == ISD::SDIV && 3310 TLI.isOperationLegalOrCustom(ISD::SDIVREM, VT)) { 3311 Result = SDValue(DAG.getNode(ISD::SDIVREM, dl, 3312 VTs, Tmp1, Tmp2).getNode(), 3313 0); 3314 break; 3315 } 3316 if (Node->getOpcode() == ISD::UDIV && 3317 TLI.isOperationLegalOrCustom(ISD::UDIVREM, VT)) { 3318 Result = SDValue(DAG.getNode(ISD::UDIVREM, dl, 3319 VTs, Tmp1, Tmp2).getNode(), 3320 0); 3321 break; 3322 } 3323 3324 // Check to see if we have a libcall for this operator. 3325 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL; 3326 bool isSigned = false; 3327 switch (Node->getOpcode()) { 3328 case ISD::UDIV: 3329 case ISD::SDIV: 3330 if (VT == MVT::i32) { 3331 LC = Node->getOpcode() == ISD::UDIV 3332 ? RTLIB::UDIV_I32 : RTLIB::SDIV_I32; 3333 isSigned = Node->getOpcode() == ISD::SDIV; 3334 } 3335 break; 3336 case ISD::MUL: 3337 if (VT == MVT::i32) 3338 LC = RTLIB::MUL_I32; 3339 else if (VT == MVT::i64) 3340 LC = RTLIB::MUL_I64; 3341 break; 3342 case ISD::FPOW: 3343 LC = GetFPLibCall(VT, RTLIB::POW_F32, RTLIB::POW_F64, RTLIB::POW_F80, 3344 RTLIB::POW_PPCF128); 3345 break; 3346 case ISD::FDIV: 3347 LC = GetFPLibCall(VT, RTLIB::DIV_F32, RTLIB::DIV_F64, RTLIB::DIV_F80, 3348 RTLIB::DIV_PPCF128); 3349 break; 3350 default: break; 3351 } 3352 if (LC != RTLIB::UNKNOWN_LIBCALL) { 3353 SDValue Dummy; 3354 Result = ExpandLibCall(LC, Node, isSigned, Dummy); 3355 break; 3356 } 3357 3358 assert(Node->getValueType(0).isVector() && 3359 "Cannot expand this binary operator!"); 3360 // Expand the operation into a bunch of nasty scalar code. 3361 Result = LegalizeOp(UnrollVectorOp(Op)); 3362 break; 3363 } 3364 case TargetLowering::Promote: { 3365 switch (Node->getOpcode()) { 3366 default: assert(0 && "Do not know how to promote this BinOp!"); 3367 case ISD::AND: 3368 case ISD::OR: 3369 case ISD::XOR: { 3370 MVT OVT = Node->getValueType(0); 3371 MVT NVT = TLI.getTypeToPromoteTo(Node->getOpcode(), OVT); 3372 assert(OVT.isVector() && "Cannot promote this BinOp!"); 3373 // Bit convert each of the values to the new type. 3374 Tmp1 = DAG.getNode(ISD::BIT_CONVERT, dl, NVT, Tmp1); 3375 Tmp2 = DAG.getNode(ISD::BIT_CONVERT, dl, NVT, Tmp2); 3376 Result = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1, Tmp2); 3377 // Bit convert the result back the original type. 3378 Result = DAG.getNode(ISD::BIT_CONVERT, dl, OVT, Result); 3379 break; 3380 } 3381 } 3382 } 3383 } 3384 break; 3385 3386 case ISD::SMUL_LOHI: 3387 case ISD::UMUL_LOHI: 3388 case ISD::SDIVREM: 3389 case ISD::UDIVREM: 3390 // These nodes will only be produced by target-specific lowering, so 3391 // they shouldn't be here if they aren't legal. 3392 assert(TLI.isOperationLegal(Node->getOpcode(), Node->getValueType(0)) && 3393 "This must be legal!"); 3394 3395 Tmp1 = LegalizeOp(Node->getOperand(0)); // LHS 3396 Tmp2 = LegalizeOp(Node->getOperand(1)); // RHS 3397 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2); 3398 break; 3399 3400 case ISD::FCOPYSIGN: // FCOPYSIGN does not require LHS/RHS to match type! 3401 Tmp1 = LegalizeOp(Node->getOperand(0)); // LHS 3402 switch (getTypeAction(Node->getOperand(1).getValueType())) { 3403 case Expand: assert(0 && "Not possible"); 3404 case Legal: 3405 Tmp2 = LegalizeOp(Node->getOperand(1)); // Legalize the RHS. 3406 break; 3407 case Promote: 3408 Tmp2 = PromoteOp(Node->getOperand(1)); // Promote the RHS. 3409 break; 3410 } 3411 3412 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2); 3413 3414 switch (TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0))) { 3415 default: assert(0 && "Operation not supported"); 3416 case TargetLowering::Custom: 3417 Tmp1 = TLI.LowerOperation(Result, DAG); 3418 if (Tmp1.getNode()) Result = Tmp1; 3419 break; 3420 case TargetLowering::Legal: break; 3421 case TargetLowering::Expand: { 3422 // If this target supports fabs/fneg natively and select is cheap, 3423 // do this efficiently. 3424 if (!TLI.isSelectExpensive() && 3425 TLI.getOperationAction(ISD::FABS, Tmp1.getValueType()) == 3426 TargetLowering::Legal && 3427 TLI.getOperationAction(ISD::FNEG, Tmp1.getValueType()) == 3428 TargetLowering::Legal) { 3429 // Get the sign bit of the RHS. 3430 MVT IVT = 3431 Tmp2.getValueType() == MVT::f32 ? MVT::i32 : MVT::i64; 3432 SDValue SignBit = DAG.getNode(ISD::BIT_CONVERT, dl, IVT, Tmp2); 3433 SignBit = DAG.getSetCC(dl, TLI.getSetCCResultType(IVT), 3434 SignBit, DAG.getConstant(0, IVT), ISD::SETLT); 3435 // Get the absolute value of the result. 3436 SDValue AbsVal = DAG.getNode(ISD::FABS, dl, Tmp1.getValueType(), Tmp1); 3437 // Select between the nabs and abs value based on the sign bit of 3438 // the input. 3439 Result = DAG.getNode(ISD::SELECT, dl, AbsVal.getValueType(), SignBit, 3440 DAG.getNode(ISD::FNEG, dl, AbsVal.getValueType(), 3441 AbsVal), 3442 AbsVal); 3443 Result = LegalizeOp(Result); 3444 break; 3445 } 3446 3447 // Otherwise, do bitwise ops! 3448 MVT NVT = 3449 Node->getValueType(0) == MVT::f32 ? MVT::i32 : MVT::i64; 3450 Result = ExpandFCOPYSIGNToBitwiseOps(Node, NVT, DAG, TLI); 3451 Result = DAG.getNode(ISD::BIT_CONVERT, dl, Node->getValueType(0), Result); 3452 Result = LegalizeOp(Result); 3453 break; 3454 } 3455 } 3456 break; 3457 3458 case ISD::ADDC: 3459 case ISD::SUBC: 3460 Tmp1 = LegalizeOp(Node->getOperand(0)); 3461 Tmp2 = LegalizeOp(Node->getOperand(1)); 3462 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2); 3463 Tmp3 = Result.getValue(0); 3464 Tmp4 = Result.getValue(1); 3465 3466 switch (TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0))) { 3467 default: assert(0 && "This action is not supported yet!"); 3468 case TargetLowering::Legal: 3469 break; 3470 case TargetLowering::Custom: 3471 Tmp1 = TLI.LowerOperation(Tmp3, DAG); 3472 if (Tmp1.getNode() != NULL) { 3473 Tmp3 = LegalizeOp(Tmp1); 3474 Tmp4 = LegalizeOp(Tmp1.getValue(1)); 3475 } 3476 break; 3477 } 3478 // Since this produces two values, make sure to remember that we legalized 3479 // both of them. 3480 AddLegalizedOperand(SDValue(Node, 0), Tmp3); 3481 AddLegalizedOperand(SDValue(Node, 1), Tmp4); 3482 return Op.getResNo() ? Tmp4 : Tmp3; 3483 3484 case ISD::ADDE: 3485 case ISD::SUBE: 3486 Tmp1 = LegalizeOp(Node->getOperand(0)); 3487 Tmp2 = LegalizeOp(Node->getOperand(1)); 3488 Tmp3 = LegalizeOp(Node->getOperand(2)); 3489 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2, Tmp3); 3490 Tmp3 = Result.getValue(0); 3491 Tmp4 = Result.getValue(1); 3492 3493 switch (TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0))) { 3494 default: assert(0 && "This action is not supported yet!"); 3495 case TargetLowering::Legal: 3496 break; 3497 case TargetLowering::Custom: 3498 Tmp1 = TLI.LowerOperation(Tmp3, DAG); 3499 if (Tmp1.getNode() != NULL) { 3500 Tmp3 = LegalizeOp(Tmp1); 3501 Tmp4 = LegalizeOp(Tmp1.getValue(1)); 3502 } 3503 break; 3504 } 3505 // Since this produces two values, make sure to remember that we legalized 3506 // both of them. 3507 AddLegalizedOperand(SDValue(Node, 0), Tmp3); 3508 AddLegalizedOperand(SDValue(Node, 1), Tmp4); 3509 return Op.getResNo() ? Tmp4 : Tmp3; 3510 3511 case ISD::BUILD_PAIR: { 3512 MVT PairTy = Node->getValueType(0); 3513 // TODO: handle the case where the Lo and Hi operands are not of legal type 3514 Tmp1 = LegalizeOp(Node->getOperand(0)); // Lo 3515 Tmp2 = LegalizeOp(Node->getOperand(1)); // Hi 3516 switch (TLI.getOperationAction(ISD::BUILD_PAIR, PairTy)) { 3517 case TargetLowering::Promote: 3518 case TargetLowering::Custom: 3519 assert(0 && "Cannot promote/custom this yet!"); 3520 case TargetLowering::Legal: 3521 if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1)) 3522 Result = DAG.getNode(ISD::BUILD_PAIR, dl, PairTy, Tmp1, Tmp2); 3523 break; 3524 case TargetLowering::Expand: 3525 Tmp1 = DAG.getNode(ISD::ZERO_EXTEND, dl, PairTy, Tmp1); 3526 Tmp2 = DAG.getNode(ISD::ANY_EXTEND, dl, PairTy, Tmp2); 3527 Tmp2 = DAG.getNode(ISD::SHL, dl, PairTy, Tmp2, 3528 DAG.getConstant(PairTy.getSizeInBits()/2, 3529 TLI.getShiftAmountTy())); 3530 Result = DAG.getNode(ISD::OR, dl, PairTy, Tmp1, Tmp2); 3531 break; 3532 } 3533 break; 3534 } 3535 3536 case ISD::UREM: 3537 case ISD::SREM: 3538 case ISD::FREM: 3539 Tmp1 = LegalizeOp(Node->getOperand(0)); // LHS 3540 Tmp2 = LegalizeOp(Node->getOperand(1)); // RHS 3541 3542 switch (TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0))) { 3543 case TargetLowering::Promote: assert(0 && "Cannot promote this yet!"); 3544 case TargetLowering::Custom: 3545 isCustom = true; 3546 // FALLTHROUGH 3547 case TargetLowering::Legal: 3548 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2); 3549 if (isCustom) { 3550 Tmp1 = TLI.LowerOperation(Result, DAG); 3551 if (Tmp1.getNode()) Result = Tmp1; 3552 } 3553 break; 3554 case TargetLowering::Expand: { 3555 unsigned DivOpc= (Node->getOpcode() == ISD::UREM) ? ISD::UDIV : ISD::SDIV; 3556 bool isSigned = DivOpc == ISD::SDIV; 3557 MVT VT = Node->getValueType(0); 3558 3559 // See if remainder can be lowered using two-result operations. 3560 SDVTList VTs = DAG.getVTList(VT, VT); 3561 if (Node->getOpcode() == ISD::SREM && 3562 TLI.isOperationLegalOrCustom(ISD::SDIVREM, VT)) { 3563 Result = SDValue(DAG.getNode(ISD::SDIVREM, dl, 3564 VTs, Tmp1, Tmp2).getNode(), 1); 3565 break; 3566 } 3567 if (Node->getOpcode() == ISD::UREM && 3568 TLI.isOperationLegalOrCustom(ISD::UDIVREM, VT)) { 3569 Result = SDValue(DAG.getNode(ISD::UDIVREM, dl, 3570 VTs, Tmp1, Tmp2).getNode(), 1); 3571 break; 3572 } 3573 3574 if (VT.isInteger()) { 3575 if (TLI.getOperationAction(DivOpc, VT) == 3576 TargetLowering::Legal) { 3577 // X % Y -> X-X/Y*Y 3578 Result = DAG.getNode(DivOpc, dl, VT, Tmp1, Tmp2); 3579 Result = DAG.getNode(ISD::MUL, dl, VT, Result, Tmp2); 3580 Result = DAG.getNode(ISD::SUB, dl, VT, Tmp1, Result); 3581 } else if (VT.isVector()) { 3582 Result = LegalizeOp(UnrollVectorOp(Op)); 3583 } else { 3584 assert(VT == MVT::i32 && 3585 "Cannot expand this binary operator!"); 3586 RTLIB::Libcall LC = Node->getOpcode() == ISD::UREM 3587 ? RTLIB::UREM_I32 : RTLIB::SREM_I32; 3588 SDValue Dummy; 3589 Result = ExpandLibCall(LC, Node, isSigned, Dummy); 3590 } 3591 } else { 3592 assert(VT.isFloatingPoint() && 3593 "remainder op must have integer or floating-point type"); 3594 if (VT.isVector()) { 3595 Result = LegalizeOp(UnrollVectorOp(Op)); 3596 } else { 3597 // Floating point mod -> fmod libcall. 3598 RTLIB::Libcall LC = GetFPLibCall(VT, RTLIB::REM_F32, RTLIB::REM_F64, 3599 RTLIB::REM_F80, RTLIB::REM_PPCF128); 3600 SDValue Dummy; 3601 Result = ExpandLibCall(LC, Node, false/*sign irrelevant*/, Dummy); 3602 } 3603 } 3604 break; 3605 } 3606 } 3607 break; 3608 case ISD::VAARG: { 3609 Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain. 3610 Tmp2 = LegalizeOp(Node->getOperand(1)); // Legalize the pointer. 3611 3612 MVT VT = Node->getValueType(0); 3613 switch (TLI.getOperationAction(Node->getOpcode(), MVT::Other)) { 3614 default: assert(0 && "This action is not supported yet!"); 3615 case TargetLowering::Custom: 3616 isCustom = true; 3617 // FALLTHROUGH 3618 case TargetLowering::Legal: 3619 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2, Node->getOperand(2)); 3620 Result = Result.getValue(0); 3621 Tmp1 = Result.getValue(1); 3622 3623 if (isCustom) { 3624 Tmp2 = TLI.LowerOperation(Result, DAG); 3625 if (Tmp2.getNode()) { 3626 Result = LegalizeOp(Tmp2); 3627 Tmp1 = LegalizeOp(Tmp2.getValue(1)); 3628 } 3629 } 3630 break; 3631 case TargetLowering::Expand: { 3632 const Value *V = cast<SrcValueSDNode>(Node->getOperand(2))->getValue(); 3633 SDValue VAList = DAG.getLoad(TLI.getPointerTy(), dl, Tmp1, Tmp2, V, 0); 3634 // Increment the pointer, VAList, to the next vaarg 3635 Tmp3 = DAG.getNode(ISD::ADD, dl, TLI.getPointerTy(), VAList, 3636 DAG.getConstant(TLI.getTargetData()-> 3637 getTypePaddedSize(VT.getTypeForMVT()), 3638 TLI.getPointerTy())); 3639 // Store the incremented VAList to the legalized pointer 3640 Tmp3 = DAG.getStore(VAList.getValue(1), dl, Tmp3, Tmp2, V, 0); 3641 // Load the actual argument out of the pointer VAList 3642 Result = DAG.getLoad(VT, dl, Tmp3, VAList, NULL, 0); 3643 Tmp1 = LegalizeOp(Result.getValue(1)); 3644 Result = LegalizeOp(Result); 3645 break; 3646 } 3647 } 3648 // Since VAARG produces two values, make sure to remember that we 3649 // legalized both of them. 3650 AddLegalizedOperand(SDValue(Node, 0), Result); 3651 AddLegalizedOperand(SDValue(Node, 1), Tmp1); 3652 return Op.getResNo() ? Tmp1 : Result; 3653 } 3654 3655 case ISD::VACOPY: 3656 Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain. 3657 Tmp2 = LegalizeOp(Node->getOperand(1)); // Legalize the dest pointer. 3658 Tmp3 = LegalizeOp(Node->getOperand(2)); // Legalize the source pointer. 3659 3660 switch (TLI.getOperationAction(ISD::VACOPY, MVT::Other)) { 3661 default: assert(0 && "This action is not supported yet!"); 3662 case TargetLowering::Custom: 3663 isCustom = true; 3664 // FALLTHROUGH 3665 case TargetLowering::Legal: 3666 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2, Tmp3, 3667 Node->getOperand(3), Node->getOperand(4)); 3668 if (isCustom) { 3669 Tmp1 = TLI.LowerOperation(Result, DAG); 3670 if (Tmp1.getNode()) Result = Tmp1; 3671 } 3672 break; 3673 case TargetLowering::Expand: 3674 // This defaults to loading a pointer from the input and storing it to the 3675 // output, returning the chain. 3676 const Value *VD = cast<SrcValueSDNode>(Node->getOperand(3))->getValue(); 3677 const Value *VS = cast<SrcValueSDNode>(Node->getOperand(4))->getValue(); 3678 Tmp4 = DAG.getLoad(TLI.getPointerTy(), dl, Tmp1, Tmp3, VS, 0); 3679 Result = DAG.getStore(Tmp4.getValue(1), dl, Tmp4, Tmp2, VD, 0); 3680 break; 3681 } 3682 break; 3683 3684 case ISD::VAEND: 3685 Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain. 3686 Tmp2 = LegalizeOp(Node->getOperand(1)); // Legalize the pointer. 3687 3688 switch (TLI.getOperationAction(ISD::VAEND, MVT::Other)) { 3689 default: assert(0 && "This action is not supported yet!"); 3690 case TargetLowering::Custom: 3691 isCustom = true; 3692 // FALLTHROUGH 3693 case TargetLowering::Legal: 3694 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2, Node->getOperand(2)); 3695 if (isCustom) { 3696 Tmp1 = TLI.LowerOperation(Tmp1, DAG); 3697 if (Tmp1.getNode()) Result = Tmp1; 3698 } 3699 break; 3700 case TargetLowering::Expand: 3701 Result = Tmp1; // Default to a no-op, return the chain 3702 break; 3703 } 3704 break; 3705 3706 case ISD::VASTART: 3707 Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the chain. 3708 Tmp2 = LegalizeOp(Node->getOperand(1)); // Legalize the pointer. 3709 3710 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2, Node->getOperand(2)); 3711 3712 switch (TLI.getOperationAction(ISD::VASTART, MVT::Other)) { 3713 default: assert(0 && "This action is not supported yet!"); 3714 case TargetLowering::Legal: break; 3715 case TargetLowering::Custom: 3716 Tmp1 = TLI.LowerOperation(Result, DAG); 3717 if (Tmp1.getNode()) Result = Tmp1; 3718 break; 3719 } 3720 break; 3721 3722 case ISD::ROTL: 3723 case ISD::ROTR: 3724 Tmp1 = LegalizeOp(Node->getOperand(0)); // LHS 3725 Tmp2 = LegalizeOp(DAG.getShiftAmountOperand(Node->getOperand(1))); // RHS 3726 Result = DAG.UpdateNodeOperands(Result, Tmp1, Tmp2); 3727 switch (TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0))) { 3728 default: 3729 assert(0 && "ROTL/ROTR legalize operation not supported"); 3730 break; 3731 case TargetLowering::Legal: 3732 break; 3733 case TargetLowering::Custom: 3734 Tmp1 = TLI.LowerOperation(Result, DAG); 3735 if (Tmp1.getNode()) Result = Tmp1; 3736 break; 3737 case TargetLowering::Promote: 3738 assert(0 && "Do not know how to promote ROTL/ROTR"); 3739 break; 3740 case TargetLowering::Expand: 3741 assert(0 && "Do not know how to expand ROTL/ROTR"); 3742 break; 3743 } 3744 break; 3745 3746 case ISD::BSWAP: 3747 Tmp1 = LegalizeOp(Node->getOperand(0)); // Op 3748 switch (TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0))) { 3749 case TargetLowering::Custom: 3750 assert(0 && "Cannot custom legalize this yet!"); 3751 case TargetLowering::Legal: 3752 Result = DAG.UpdateNodeOperands(Result, Tmp1); 3753 break; 3754 case TargetLowering::Promote: { 3755 MVT OVT = Tmp1.getValueType(); 3756 MVT NVT = TLI.getTypeToPromoteTo(Node->getOpcode(), OVT); 3757 unsigned DiffBits = NVT.getSizeInBits() - OVT.getSizeInBits(); 3758 3759 Tmp1 = DAG.getNode(ISD::ZERO_EXTEND, dl, NVT, Tmp1); 3760 Tmp1 = DAG.getNode(ISD::BSWAP, dl, NVT, Tmp1); 3761 Result = DAG.getNode(ISD::SRL, dl, NVT, Tmp1, 3762 DAG.getConstant(DiffBits, TLI.getShiftAmountTy())); 3763 break; 3764 } 3765 case TargetLowering::Expand: 3766 Result = ExpandBSWAP(Tmp1, dl); 3767 break; 3768 } 3769 break; 3770 3771 case ISD::CTPOP: 3772 case ISD::CTTZ: 3773 case ISD::CTLZ: 3774 Tmp1 = LegalizeOp(Node->getOperand(0)); // Op 3775 switch (TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0))) { 3776 case TargetLowering::Custom: 3777 case TargetLowering::Legal: 3778 Result = DAG.UpdateNodeOperands(Result, Tmp1); 3779 if (TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0)) == 3780 TargetLowering::Custom) { 3781 Tmp1 = TLI.LowerOperation(Result, DAG); 3782 if (Tmp1.getNode()) { 3783 Result = Tmp1; 3784 } 3785 } 3786 break; 3787 case TargetLowering::Promote: { 3788 MVT OVT = Tmp1.getValueType(); 3789 MVT NVT = TLI.getTypeToPromoteTo(Node->getOpcode(), OVT); 3790 3791 // Zero extend the argument. 3792 Tmp1 = DAG.getNode(ISD::ZERO_EXTEND, dl, NVT, Tmp1); 3793 // Perform the larger operation, then subtract if needed. 3794 Tmp1 = DAG.getNode(Node->getOpcode(), dl, Node->getValueType(0), Tmp1); 3795 switch (Node->getOpcode()) { 3796 case ISD::CTPOP: 3797 Result = Tmp1; 3798 break; 3799 case ISD::CTTZ: 3800 //if Tmp1 == sizeinbits(NVT) then Tmp1 = sizeinbits(Old VT) 3801 Tmp2 = DAG.getSetCC(dl, TLI.getSetCCResultType(Tmp1.getValueType()), 3802 Tmp1, DAG.getConstant(NVT.getSizeInBits(), NVT), 3803 ISD::SETEQ); 3804 Result = DAG.getNode(ISD::SELECT, dl, NVT, Tmp2, 3805 DAG.getConstant(OVT.getSizeInBits(), NVT), Tmp1); 3806 break; 3807 case ISD::CTLZ: 3808 // Tmp1 = Tmp1 - (sizeinbits(NVT) - sizeinbits(Old VT)) 3809 Result = DAG.getNode(ISD::SUB, dl, NVT, Tmp1, 3810 DAG.getConstant(NVT.getSizeInBits() - 3811 OVT.getSizeInBits(), NVT)); 3812 break; 3813 } 3814 break; 3815 } 3816 case TargetLowering::Expand: 3817 Result = ExpandBitCount(Node->getOpcode(), Tmp1, dl); 3818 break; 3819 } 3820 break; 3821 3822 // Unary operators 3823 case ISD::FABS: 3824 case ISD::FNEG: 3825 case ISD::FSQRT: 3826 case ISD::FSIN: 3827 case ISD::FCOS: 3828 case ISD::FLOG: 3829 case ISD::FLOG2: 3830 case ISD::FLOG10: 3831 case ISD::FEXP: 3832 case ISD::FEXP2: 3833 case ISD::FTRUNC: 3834 case ISD::FFLOOR: 3835 case ISD::FCEIL: 3836 case ISD::FRINT: 3837 case ISD::FNEARBYINT: 3838 Tmp1 = LegalizeOp(Node->getOperand(0)); 3839 switch (TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0))) { 3840 case TargetLowering::Promote: 3841 case TargetLowering::Custom: 3842 isCustom = true; 3843 // FALLTHROUGH 3844 case TargetLowering::Legal: 3845 Result = DAG.UpdateNodeOperands(Result, Tmp1); 3846 if (isCustom) { 3847 Tmp1 = TLI.LowerOperation(Result, DAG); 3848 if (Tmp1.getNode()) Result = Tmp1; 3849 } 3850 break; 3851 case TargetLowering::Expand: 3852 switch (Node->getOpcode()) { 3853 default: assert(0 && "Unreachable!"); 3854 case ISD::FNEG: 3855 // Expand Y = FNEG(X) -> Y = SUB -0.0, X 3856 Tmp2 = DAG.getConstantFP(-0.0, Node->getValueType(0)); 3857 Result = DAG.getNode(ISD::FSUB, dl, Node->getValueType(0), Tmp2, Tmp1); 3858 break; 3859 case ISD::FABS: { 3860 // Expand Y = FABS(X) -> Y = (X >u 0.0) ? X : fneg(X). 3861 MVT VT = Node->getValueType(0); 3862 Tmp2 = DAG.getConstantFP(0.0, VT); 3863 Tmp2 = DAG.getSetCC(dl, TLI.getSetCCResultType(Tmp1.getValueType()), 3864 Tmp1, Tmp2, ISD::SETUGT); 3865 Tmp3 = DAG.getNode(ISD::FNEG, dl, VT, Tmp1); 3866 Result = DAG.getNode(ISD::SELECT, dl, VT, Tmp2, Tmp1, Tmp3); 3867 break; 3868 } 3869 case ISD::FSQRT: 3870 case ISD::FSIN: 3871 case ISD::FCOS: 3872 case ISD::FLOG: 3873 case ISD::FLOG2: 3874 case ISD::FLOG10: 3875 case ISD::FEXP: 3876 case ISD::FEXP2: 3877 case ISD::FTRUNC: 3878 case ISD::FFLOOR: 3879 case ISD::FCEIL: 3880 case ISD::FRINT: 3881 case ISD::FNEARBYINT: { 3882 MVT VT = Node->getValueType(0); 3883 3884 // Expand unsupported unary vector operators by unrolling them. 3885 if (VT.isVector()) { 3886 Result = LegalizeOp(UnrollVectorOp(Op)); 3887 break; 3888 } 3889 3890 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL; 3891 switch(Node->getOpcode()) { 3892 case ISD::FSQRT: 3893 LC = GetFPLibCall(VT, RTLIB::SQRT_F32, RTLIB::SQRT_F64, 3894 RTLIB::SQRT_F80, RTLIB::SQRT_PPCF128); 3895 break; 3896 case ISD::FSIN: 3897 LC = GetFPLibCall(VT, RTLIB::SIN_F32, RTLIB::SIN_F64, 3898 RTLIB::SIN_F80, RTLIB::SIN_PPCF128); 3899 break; 3900 case ISD::FCOS: 3901 LC = GetFPLibCall(VT, RTLIB::COS_F32, RTLIB::COS_F64, 3902 RTLIB::COS_F80, RTLIB::COS_PPCF128); 3903 break; 3904 case ISD::FLOG: 3905 LC = GetFPLibCall(VT, RTLIB::LOG_F32, RTLIB::LOG_F64, 3906 RTLIB::LOG_F80, RTLIB::LOG_PPCF128); 3907 break; 3908 case ISD::FLOG2: 3909 LC = GetFPLibCall(VT, RTLIB::LOG2_F32, RTLIB::LOG2_F64, 3910 RTLIB::LOG2_F80, RTLIB::LOG2_PPCF128); 3911 break; 3912 case ISD::FLOG10: 3913 LC = GetFPLibCall(VT, RTLIB::LOG10_F32, RTLIB::LOG10_F64, 3914 RTLIB::LOG10_F80, RTLIB::LOG10_PPCF128); 3915 break; 3916 case ISD::FEXP: 3917 LC = GetFPLibCall(VT, RTLIB::EXP_F32, RTLIB::EXP_F64, 3918 RTLIB::EXP_F80, RTLIB::EXP_PPCF128); 3919 break; 3920 case ISD::FEXP2: 3921 LC = GetFPLibCall(VT, RTLIB::EXP2_F32, RTLIB::EXP2_F64, 3922 RTLIB::EXP2_F80, RTLIB::EXP2_PPCF128); 3923 break; 3924 case ISD::FTRUNC: 3925 LC = GetFPLibCall(VT, RTLIB::TRUNC_F32, RTLIB::TRUNC_F64, 3926 RTLIB::TRUNC_F80, RTLIB::TRUNC_PPCF128); 3927 break; 3928 case ISD::FFLOOR: 3929 LC = GetFPLibCall(VT, RTLIB::FLOOR_F32, RTLIB::FLOOR_F64, 3930 RTLIB::FLOOR_F80, RTLIB::FLOOR_PPCF128); 3931 break; 3932 case ISD::FCEIL: 3933 LC = GetFPLibCall(VT, RTLIB::CEIL_F32, RTLIB::CEIL_F64, 3934 RTLIB::CEIL_F80, RTLIB::CEIL_PPCF128); 3935 break; 3936 case ISD::FRINT: 3937 LC = GetFPLibCall(VT, RTLIB::RINT_F32, RTLIB::RINT_F64, 3938 RTLIB::RINT_F80, RTLIB::RINT_PPCF128); 3939 break; 3940 case ISD::FNEARBYINT: 3941 LC = GetFPLibCall(VT, RTLIB::NEARBYINT_F32, RTLIB::NEARBYINT_F64, 3942 RTLIB::NEARBYINT_F80, RTLIB::NEARBYINT_PPCF128); 3943 break; 3944 break; 3945 default: assert(0 && "Unreachable!"); 3946 } 3947 SDValue Dummy; 3948 Result = ExpandLibCall(LC, Node, false/*sign irrelevant*/, Dummy); 3949 break; 3950 } 3951 } 3952 break; 3953 } 3954 break; 3955 case ISD::FPOWI: { 3956 MVT VT = Node->getValueType(0); 3957 3958 // Expand unsupported unary vector operators by unrolling them. 3959 if (VT.isVector()) { 3960 Result = LegalizeOp(UnrollVectorOp(Op)); 3961 break; 3962 } 3963 3964 // We always lower FPOWI into a libcall. No target support for it yet. 3965 RTLIB::Libcall LC = GetFPLibCall(VT, RTLIB::POWI_F32, RTLIB::POWI_F64, 3966 RTLIB::POWI_F80, RTLIB::POWI_PPCF128); 3967 SDValue Dummy; 3968 Result = ExpandLibCall(LC, Node, false/*sign irrelevant*/, Dummy); 3969 break; 3970 } 3971 case ISD::BIT_CONVERT: 3972 if (!isTypeLegal(Node->getOperand(0).getValueType())) { 3973 Result = EmitStackConvert(Node->getOperand(0), Node->getValueType(0), 3974 Node->getValueType(0), dl); 3975 } else if (Op.getOperand(0).getValueType().isVector()) { 3976 // The input has to be a vector type, we have to either scalarize it, pack 3977 // it, or convert it based on whether the input vector type is legal. 3978 SDNode *InVal = Node->getOperand(0).getNode(); 3979 int InIx = Node->getOperand(0).getResNo(); 3980 unsigned NumElems = InVal->getValueType(InIx).getVectorNumElements(); 3981 MVT EVT = InVal->getValueType(InIx).getVectorElementType(); 3982 3983 // Figure out if there is a simple type corresponding to this Vector 3984 // type. If so, convert to the vector type. 3985 MVT TVT = MVT::getVectorVT(EVT, NumElems); 3986 if (TLI.isTypeLegal(TVT)) { 3987 // Turn this into a bit convert of the vector input. 3988 Result = DAG.getNode(ISD::BIT_CONVERT, dl, Node->getValueType(0), 3989 LegalizeOp(Node->getOperand(0))); 3990 break; 3991 } else if (NumElems == 1) { 3992 // Turn this into a bit convert of the scalar input. 3993 Result = DAG.getNode(ISD::BIT_CONVERT, dl, Node->getValueType(0), 3994 ScalarizeVectorOp(Node->getOperand(0))); 3995 break; 3996 } else { 3997 // FIXME: UNIMP! Store then reload 3998 assert(0 && "Cast from unsupported vector type not implemented yet!"); 3999 } 4000 } else { 4001 switch (TLI.getOperationAction(ISD::BIT_CONVERT, 4002 Node->getOperand(0).getValueType())) { 4003 default: assert(0 && "Unknown operation action!"); 4004 case TargetLowering::Expand: 4005 Result = EmitStackConvert(Node->getOperand(0), Node->getValueType(0), 4006 Node->getValueType(0), dl); 4007 break; 4008 case TargetLowering::Legal: 4009 Tmp1 = LegalizeOp(Node->getOperand(0)); 4010 Result = DAG.UpdateNodeOperands(Result, Tmp1); 4011 break; 4012 } 4013 } 4014 break; 4015 case ISD::CONVERT_RNDSAT: { 4016 ISD::CvtCode CvtCode = cast<CvtRndSatSDNode>(Node)->getCvtCode(); 4017 switch (CvtCode) { 4018 default: assert(0 && "Unknown cvt code!"); 4019 case ISD::CVT_SF: 4020 case ISD::CVT_UF: 4021 case ISD::CVT_FF: 4022 break; 4023 case ISD::CVT_FS: 4024 case ISD::CVT_FU: 4025 case ISD::CVT_SS: 4026 case ISD::CVT_SU: 4027 case ISD::CVT_US: 4028 case ISD::CVT_UU: { 4029 SDValue DTyOp = Node->getOperand(1); 4030 SDValue STyOp = Node->getOperand(2); 4031 SDValue RndOp = Node->getOperand(3); 4032 SDValue SatOp = Node->getOperand(4); 4033 switch (getTypeAction(Node->getOperand(0).getValueType())) { 4034 case Expand: assert(0 && "Shouldn't need to expand other operators here!"); 4035 case Legal: 4036 Tmp1 = LegalizeOp(Node->getOperand(0)); 4037 Result = DAG.UpdateNodeOperands(Result, Tmp1, DTyOp, STyOp, 4038 RndOp, SatOp); 4039 if (TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0)) == 4040 TargetLowering::Custom) { 4041 Tmp1 = TLI.LowerOperation(Result, DAG); 4042 if (Tmp1.getNode()) Result = Tmp1; 4043 } 4044 break; 4045 case Promote: 4046 Result = PromoteOp(Node->getOperand(0)); 4047 // For FP, make Op1 a i32 4048 4049 Result = DAG.getConvertRndSat(Op.getValueType(), dl, Result, 4050 DTyOp, STyOp, RndOp, SatOp, CvtCode); 4051 break; 4052 } 4053 break; 4054 } 4055 } // end switch CvtCode 4056 break; 4057 } 4058 // Conversion operators. The source and destination have different types. 4059 case ISD::SINT_TO_FP: 4060 case ISD::UINT_TO_FP: { 4061 bool isSigned = Node->getOpcode() == ISD::SINT_TO_FP; 4062 Result = LegalizeINT_TO_FP(Result, isSigned, 4063 Node->getValueType(0), Node->getOperand(0), dl); 4064 break; 4065 } 4066 case ISD::TRUNCATE: 4067 switch (getTypeAction(Node->getOperand(0).getValueType())) { 4068 case Legal: 4069 Tmp1 = LegalizeOp(Node->getOperand(0)); 4070 switch (TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0))) { 4071 default: assert(0 && "Unknown TRUNCATE legalization operation action!"); 4072 case TargetLowering::Custom: 4073 isCustom = true; 4074 // FALLTHROUGH 4075 case TargetLowering::Legal: 4076 Result = DAG.UpdateNodeOperands(Result, Tmp1); 4077 if (isCustom) { 4078 Tmp1 = TLI.LowerOperation(Result, DAG); 4079 if (Tmp1.getNode()) Result = Tmp1; 4080 } 4081 break; 4082 case TargetLowering::Expand: 4083 assert(Result.getValueType().isVector() && "must be vector type"); 4084 // Unroll the truncate. We should do better. 4085 Result = LegalizeOp(UnrollVectorOp(Result)); 4086 } 4087 break; 4088 case Expand: 4089 ExpandOp(Node->getOperand(0), Tmp1, Tmp2); 4090 4091 // Since the result is legal, we should just be able to truncate the low 4092 // part of the source. 4093 Result = DAG.getNode(ISD::TRUNCATE, dl, Node->getValueType(0), Tmp1); 4094 break; 4095 case Promote: 4096 Result = PromoteOp(Node->getOperand(0)); 4097 Result = DAG.getNode(ISD::TRUNCATE, dl, Op.getValueType(), Result); 4098 break; 4099 } 4100 break; 4101 4102 case ISD::FP_TO_SINT: 4103 case ISD::FP_TO_UINT: 4104 switch (getTypeAction(Node->getOperand(0).getValueType())) { 4105 case Legal: 4106 Tmp1 = LegalizeOp(Node->getOperand(0)); 4107 4108 switch (TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0))){ 4109 default: assert(0 && "Unknown operation action!"); 4110 case TargetLowering::Custom: 4111 isCustom = true; 4112 // FALLTHROUGH 4113 case TargetLowering::Legal: 4114 Result = DAG.UpdateNodeOperands(Result, Tmp1); 4115 if (isCustom) { 4116 Tmp1 = TLI.LowerOperation(Result, DAG); 4117 if (Tmp1.getNode()) Result = Tmp1; 4118 } 4119 break; 4120 case TargetLowering::Promote: 4121 Result = PromoteLegalFP_TO_INT(Tmp1, Node->getValueType(0), 4122 Node->getOpcode() == ISD::FP_TO_SINT, 4123 dl); 4124 break; 4125 case TargetLowering::Expand: 4126 if (Node->getOpcode() == ISD::FP_TO_UINT) { 4127 SDValue True, False; 4128 MVT VT = Node->getOperand(0).getValueType(); 4129 MVT NVT = Node->getValueType(0); 4130 const uint64_t zero[] = {0, 0}; 4131 APFloat apf = APFloat(APInt(VT.getSizeInBits(), 2, zero)); 4132 APInt x = APInt::getSignBit(NVT.getSizeInBits()); 4133 (void)apf.convertFromAPInt(x, false, APFloat::rmNearestTiesToEven); 4134 Tmp2 = DAG.getConstantFP(apf, VT); 4135 Tmp3 = DAG.getSetCC(dl, TLI.getSetCCResultType(VT), 4136 Node->getOperand(0), 4137 Tmp2, ISD::SETLT); 4138 True = DAG.getNode(ISD::FP_TO_SINT, dl, NVT, Node->getOperand(0)); 4139 False = DAG.getNode(ISD::FP_TO_SINT, dl, NVT, 4140 DAG.getNode(ISD::FSUB, dl, VT, 4141 Node->getOperand(0), Tmp2)); 4142 False = DAG.getNode(ISD::XOR, dl, NVT, False, 4143 DAG.getConstant(x, NVT)); 4144 Result = DAG.getNode(ISD::SELECT, dl, NVT, Tmp3, True, False); 4145 break; 4146 } else { 4147 assert(0 && "Do not know how to expand FP_TO_SINT yet!"); 4148 } 4149 break; 4150 } 4151 break; 4152 case Expand: { 4153 MVT VT = Op.getValueType(); 4154 MVT OVT = Node->getOperand(0).getValueType(); 4155 // Convert ppcf128 to i32 4156 if (OVT == MVT::ppcf128 && VT == MVT::i32) { 4157 if (Node->getOpcode() == ISD::FP_TO_SINT) { 4158 Result = DAG.getNode(ISD::FP_ROUND_INREG, dl, MVT::ppcf128, 4159 Node->getOperand(0), DAG.getValueType(MVT::f64)); 4160 Result = DAG.getNode(ISD::FP_ROUND, dl, MVT::f64, Result, 4161 DAG.getIntPtrConstant(1)); 4162 Result = DAG.getNode(ISD::FP_TO_SINT, dl, VT, Result); 4163 } else { 4164 const uint64_t TwoE31[] = {0x41e0000000000000LL, 0}; 4165 APFloat apf = APFloat(APInt(128, 2, TwoE31)); 4166 Tmp2 = DAG.getConstantFP(apf, OVT); 4167 // X>=2^31 ? (int)(X-2^31)+0x80000000 : (int)X 4168 // FIXME: generated code sucks. 4169 Result = DAG.getNode(ISD::SELECT_CC, dl, VT, Node->getOperand(0), 4170 Tmp2, 4171 DAG.getNode(ISD::ADD, dl, MVT::i32, 4172 DAG.getNode(ISD::FP_TO_SINT, dl, VT, 4173 DAG.getNode(ISD::FSUB, dl, OVT, 4174 Node->getOperand(0), Tmp2)), 4175 DAG.getConstant(0x80000000, MVT::i32)), 4176 DAG.getNode(ISD::FP_TO_SINT, dl, VT, 4177 Node->getOperand(0)), 4178 DAG.getCondCode(ISD::SETGE)); 4179 } 4180 break; 4181 } 4182 // Convert f32 / f64 to i32 / i64 / i128. 4183 RTLIB::Libcall LC = (Node->getOpcode() == ISD::FP_TO_SINT) ? 4184 RTLIB::getFPTOSINT(OVT, VT) : RTLIB::getFPTOUINT(OVT, VT); 4185 assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unexpectd fp-to-int conversion!"); 4186 SDValue Dummy; 4187 Result = ExpandLibCall(LC, Node, false/*sign irrelevant*/, Dummy); 4188 break; 4189 } 4190 case Promote: 4191 Tmp1 = PromoteOp(Node->getOperand(0)); 4192 Result = DAG.UpdateNodeOperands(Result, LegalizeOp(Tmp1)); 4193 Result = LegalizeOp(Result); 4194 break; 4195 } 4196 break; 4197 4198 case ISD::FP_EXTEND: { 4199 MVT DstVT = Op.getValueType(); 4200 MVT SrcVT = Op.getOperand(0).getValueType(); 4201 if (TLI.getConvertAction(SrcVT, DstVT) == TargetLowering::Expand) { 4202 // The only other way we can lower this is to turn it into a STORE, 4203 // LOAD pair, targetting a temporary location (a stack slot). 4204 Result = EmitStackConvert(Node->getOperand(0), SrcVT, DstVT, dl); 4205 break; 4206 } 4207 switch (getTypeAction(Node->getOperand(0).getValueType())) { 4208 case Expand: assert(0 && "Shouldn't need to expand other operators here!"); 4209 case Legal: 4210 Tmp1 = LegalizeOp(Node->getOperand(0)); 4211 Result = DAG.UpdateNodeOperands(Result, Tmp1); 4212 break; 4213 case Promote: 4214 Tmp1 = PromoteOp(Node->getOperand(0)); 4215 Result = DAG.getNode(ISD::FP_EXTEND, dl, Op.getValueType(), Tmp1); 4216 break; 4217 } 4218 break; 4219 } 4220 case ISD::FP_ROUND: { 4221 MVT DstVT = Op.getValueType(); 4222 MVT SrcVT = Op.getOperand(0).getValueType(); 4223 if (TLI.getConvertAction(SrcVT, DstVT) == TargetLowering::Expand) { 4224 if (SrcVT == MVT::ppcf128) { 4225 SDValue Lo; 4226 ExpandOp(Node->getOperand(0), Lo, Result); 4227 // Round it the rest of the way (e.g. to f32) if needed. 4228 if (DstVT!=MVT::f64) 4229 Result = DAG.getNode(ISD::FP_ROUND, dl, 4230 DstVT, Result, Op.getOperand(1)); 4231 break; 4232 } 4233 // The only other way we can lower this is to turn it into a STORE, 4234 // LOAD pair, targetting a temporary location (a stack slot). 4235 Result = EmitStackConvert(Node->getOperand(0), DstVT, DstVT, dl); 4236 break; 4237 } 4238 switch (getTypeAction(Node->getOperand(0).getValueType())) { 4239 case Expand: assert(0 && "Shouldn't need to expand other operators here!"); 4240 case Legal: 4241 Tmp1 = LegalizeOp(Node->getOperand(0)); 4242 Result = DAG.UpdateNodeOperands(Result, Tmp1, Node->getOperand(1)); 4243 break; 4244 case Promote: 4245 Tmp1 = PromoteOp(Node->getOperand(0)); 4246 Result = DAG.getNode(ISD::FP_ROUND, dl, Op.getValueType(), Tmp1, 4247 Node->getOperand(1)); 4248 break; 4249 } 4250 break; 4251 } 4252 case ISD::ANY_EXTEND: 4253 case ISD::ZERO_EXTEND: 4254 case ISD::SIGN_EXTEND: 4255 switch (getTypeAction(Node->getOperand(0).getValueType())) { 4256 case Expand: assert(0 && "Shouldn't need to expand other operators here!"); 4257 case Legal: 4258 Tmp1 = LegalizeOp(Node->getOperand(0)); 4259 Result = DAG.UpdateNodeOperands(Result, Tmp1); 4260 if (TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0)) == 4261 TargetLowering::Custom) { 4262 Tmp1 = TLI.LowerOperation(Result, DAG); 4263 if (Tmp1.getNode()) Result = Tmp1; 4264 } 4265 break; 4266 case Promote: 4267 switch (Node->getOpcode()) { 4268 case ISD::ANY_EXTEND: 4269 Tmp1 = PromoteOp(Node->getOperand(0)); 4270 Result = DAG.getNode(ISD::ANY_EXTEND, dl, Op.getValueType(), Tmp1); 4271 break; 4272 case ISD::ZERO_EXTEND: 4273 Result = PromoteOp(Node->getOperand(0)); 4274 Result = DAG.getNode(ISD::ANY_EXTEND, dl, Op.getValueType(), Result); 4275 Result = DAG.getZeroExtendInReg(Result, dl, 4276 Node->getOperand(0).getValueType()); 4277 break; 4278 case ISD::SIGN_EXTEND: 4279 Result = PromoteOp(Node->getOperand(0)); 4280 Result = DAG.getNode(ISD::ANY_EXTEND, dl, Op.getValueType(), Result); 4281 Result = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, Result.getValueType(), 4282 Result, 4283 DAG.getValueType(Node->getOperand(0).getValueType())); 4284 break; 4285 } 4286 } 4287 break; 4288 case ISD::FP_ROUND_INREG: 4289 case ISD::SIGN_EXTEND_INREG: { 4290 Tmp1 = LegalizeOp(Node->getOperand(0)); 4291 MVT ExtraVT = cast<VTSDNode>(Node->getOperand(1))->getVT(); 4292 4293 // If this operation is not supported, convert it to a shl/shr or load/store 4294 // pair. 4295 switch (TLI.getOperationAction(Node->getOpcode(), ExtraVT)) { 4296 default: assert(0 && "This action not supported for this op yet!"); 4297 case TargetLowering::Legal: 4298 Result = DAG.UpdateNodeOperands(Result, Tmp1, Node->getOperand(1)); 4299 break; 4300 case TargetLowering::Expand: 4301 // If this is an integer extend and shifts are supported, do that. 4302 if (Node->getOpcode() == ISD::SIGN_EXTEND_INREG) { 4303 // NOTE: we could fall back on load/store here too for targets without 4304 // SAR. However, it is doubtful that any exist. 4305 unsigned BitsDiff = Node->getValueType(0).getSizeInBits() - 4306 ExtraVT.getSizeInBits(); 4307 SDValue ShiftCst = DAG.getConstant(BitsDiff, TLI.getShiftAmountTy()); 4308 Result = DAG.getNode(ISD::SHL, dl, Node->getValueType(0), 4309 Node->getOperand(0), ShiftCst); 4310 Result = DAG.getNode(ISD::SRA, dl, Node->getValueType(0), 4311 Result, ShiftCst); 4312 } else if (Node->getOpcode() == ISD::FP_ROUND_INREG) { 4313 // The only way we can lower this is to turn it into a TRUNCSTORE, 4314 // EXTLOAD pair, targetting a temporary location (a stack slot). 4315 4316 // NOTE: there is a choice here between constantly creating new stack 4317 // slots and always reusing the same one. We currently always create 4318 // new ones, as reuse may inhibit scheduling. 4319 Result = EmitStackConvert(Node->getOperand(0), ExtraVT, 4320 Node->getValueType(0), dl); 4321 } else { 4322 assert(0 && "Unknown op"); 4323 } 4324 break; 4325 } 4326 break; 4327 } 4328 case ISD::TRAMPOLINE: { 4329 SDValue Ops[6]; 4330 for (unsigned i = 0; i != 6; ++i) 4331 Ops[i] = LegalizeOp(Node->getOperand(i)); 4332 Result = DAG.UpdateNodeOperands(Result, Ops, 6); 4333 // The only option for this node is to custom lower it. 4334 Result = TLI.LowerOperation(Result, DAG); 4335 assert(Result.getNode() && "Should always custom lower!"); 4336 4337 // Since trampoline produces two values, make sure to remember that we 4338 // legalized both of them. 4339 Tmp1 = LegalizeOp(Result.getValue(1)); 4340 Result = LegalizeOp(Result); 4341 AddLegalizedOperand(SDValue(Node, 0), Result); 4342 AddLegalizedOperand(SDValue(Node, 1), Tmp1); 4343 return Op.getResNo() ? Tmp1 : Result; 4344 } 4345 case ISD::FLT_ROUNDS_: { 4346 MVT VT = Node->getValueType(0); 4347 switch (TLI.getOperationAction(Node->getOpcode(), VT)) { 4348 default: assert(0 && "This action not supported for this op yet!"); 4349 case TargetLowering::Custom: 4350 Result = TLI.LowerOperation(Op, DAG); 4351 if (Result.getNode()) break; 4352 // Fall Thru 4353 case TargetLowering::Legal: 4354 // If this operation is not supported, lower it to constant 1 4355 Result = DAG.getConstant(1, VT); 4356 break; 4357 } 4358 break; 4359 } 4360 case ISD::TRAP: { 4361 MVT VT = Node->getValueType(0); 4362 switch (TLI.getOperationAction(Node->getOpcode(), VT)) { 4363 default: assert(0 && "This action not supported for this op yet!"); 4364 case TargetLowering::Legal: 4365 Tmp1 = LegalizeOp(Node->getOperand(0)); 4366 Result = DAG.UpdateNodeOperands(Result, Tmp1); 4367 break; 4368 case TargetLowering::Custom: 4369 Result = TLI.LowerOperation(Op, DAG); 4370 if (Result.getNode()) break; 4371 // Fall Thru 4372 case TargetLowering::Expand: 4373 // If this operation is not supported, lower it to 'abort()' call 4374 Tmp1 = LegalizeOp(Node->getOperand(0)); 4375 TargetLowering::ArgListTy Args; 4376 std::pair<SDValue,SDValue> CallResult = 4377 TLI.LowerCallTo(Tmp1, Type::VoidTy, 4378 false, false, false, false, CallingConv::C, false, 4379 DAG.getExternalSymbol("abort", TLI.getPointerTy()), 4380 Args, DAG, dl); 4381 Result = CallResult.second; 4382 break; 4383 } 4384 break; 4385 } 4386 4387 case ISD::SADDO: 4388 case ISD::SSUBO: { 4389 MVT VT = Node->getValueType(0); 4390 switch (TLI.getOperationAction(Node->getOpcode(), VT)) { 4391 default: assert(0 && "This action not supported for this op yet!"); 4392 case TargetLowering::Custom: 4393 Result = TLI.LowerOperation(Op, DAG); 4394 if (Result.getNode()) break; 4395 // FALLTHROUGH 4396 case TargetLowering::Legal: { 4397 SDValue LHS = LegalizeOp(Node->getOperand(0)); 4398 SDValue RHS = LegalizeOp(Node->getOperand(1)); 4399 4400 SDValue Sum = DAG.getNode(Node->getOpcode() == ISD::SADDO ? 4401 ISD::ADD : ISD::SUB, dl, LHS.getValueType(), 4402 LHS, RHS); 4403 MVT OType = Node->getValueType(1); 4404 4405 SDValue Zero = DAG.getConstant(0, LHS.getValueType()); 4406 4407 // LHSSign -> LHS >= 0 4408 // RHSSign -> RHS >= 0 4409 // SumSign -> Sum >= 0 4410 // 4411 // Add: 4412 // Overflow -> (LHSSign == RHSSign) && (LHSSign != SumSign) 4413 // Sub: 4414 // Overflow -> (LHSSign != RHSSign) && (LHSSign != SumSign) 4415 // 4416 SDValue LHSSign = DAG.getSetCC(dl, OType, LHS, Zero, ISD::SETGE); 4417 SDValue RHSSign = DAG.getSetCC(dl, OType, RHS, Zero, ISD::SETGE); 4418 SDValue SignsMatch = DAG.getSetCC(dl, OType, LHSSign, RHSSign, 4419 Node->getOpcode() == ISD::SADDO ? 4420 ISD::SETEQ : ISD::SETNE); 4421 4422 SDValue SumSign = DAG.getSetCC(dl, OType, Sum, Zero, ISD::SETGE); 4423 SDValue SumSignNE = DAG.getSetCC(dl, OType, LHSSign, SumSign, ISD::SETNE); 4424 4425 SDValue Cmp = DAG.getNode(ISD::AND, dl, OType, SignsMatch, SumSignNE); 4426 4427 MVT ValueVTs[] = { LHS.getValueType(), OType }; 4428 SDValue Ops[] = { Sum, Cmp }; 4429 4430 Result = DAG.getNode(ISD::MERGE_VALUES, dl, 4431 DAG.getVTList(&ValueVTs[0], 2), 4432 &Ops[0], 2); 4433 SDNode *RNode = Result.getNode(); 4434 DAG.ReplaceAllUsesOfValueWith(SDValue(Node, 0), SDValue(RNode, 0)); 4435 DAG.ReplaceAllUsesOfValueWith(SDValue(Node, 1), SDValue(RNode, 1)); 4436 break; 4437 } 4438 } 4439 4440 break; 4441 } 4442 case ISD::UADDO: 4443 case ISD::USUBO: { 4444 MVT VT = Node->getValueType(0); 4445 switch (TLI.getOperationAction(Node->getOpcode(), VT)) { 4446 default: assert(0 && "This action not supported for this op yet!"); 4447 case TargetLowering::Custom: 4448 Result = TLI.LowerOperation(Op, DAG); 4449 if (Result.getNode()) break; 4450 // FALLTHROUGH 4451 case TargetLowering::Legal: { 4452 SDValue LHS = LegalizeOp(Node->getOperand(0)); 4453 SDValue RHS = LegalizeOp(Node->getOperand(1)); 4454 4455 SDValue Sum = DAG.getNode(Node->getOpcode() == ISD::UADDO ? 4456 ISD::ADD : ISD::SUB, dl, LHS.getValueType(), 4457 LHS, RHS); 4458 MVT OType = Node->getValueType(1); 4459 SDValue Cmp = DAG.getSetCC(dl, OType, Sum, LHS, 4460 Node->getOpcode () == ISD::UADDO ? 4461 ISD::SETULT : ISD::SETUGT); 4462 4463 MVT ValueVTs[] = { LHS.getValueType(), OType }; 4464 SDValue Ops[] = { Sum, Cmp }; 4465 4466 Result = DAG.getNode(ISD::MERGE_VALUES, dl, 4467 DAG.getVTList(&ValueVTs[0], 2), 4468 &Ops[0], 2); 4469 SDNode *RNode = Result.getNode(); 4470 DAG.ReplaceAllUsesOfValueWith(SDValue(Node, 0), SDValue(RNode, 0)); 4471 DAG.ReplaceAllUsesOfValueWith(SDValue(Node, 1), SDValue(RNode, 1)); 4472 break; 4473 } 4474 } 4475 4476 break; 4477 } 4478 case ISD::SMULO: 4479 case ISD::UMULO: { 4480 MVT VT = Node->getValueType(0); 4481 switch (TLI.getOperationAction(Node->getOpcode(), VT)) { 4482 default: assert(0 && "This action is not supported at all!"); 4483 case TargetLowering::Custom: 4484 Result = TLI.LowerOperation(Op, DAG); 4485 if (Result.getNode()) break; 4486 // Fall Thru 4487 case TargetLowering::Legal: 4488 // FIXME: According to Hacker's Delight, this can be implemented in 4489 // target independent lowering, but it would be inefficient, since it 4490 // requires a division + a branch. 4491 assert(0 && "Target independent lowering is not supported for SMULO/UMULO!"); 4492 break; 4493 } 4494 break; 4495 } 4496 4497 } 4498 4499 assert(Result.getValueType() == Op.getValueType() && 4500 "Bad legalization!"); 4501 4502 // Make sure that the generated code is itself legal. 4503 if (Result != Op) 4504 Result = LegalizeOp(Result); 4505 4506 // Note that LegalizeOp may be reentered even from single-use nodes, which 4507 // means that we always must cache transformed nodes. 4508 AddLegalizedOperand(Op, Result); 4509 return Result; 4510} 4511 4512/// PromoteOp - Given an operation that produces a value in an invalid type, 4513/// promote it to compute the value into a larger type. The produced value will 4514/// have the correct bits for the low portion of the register, but no guarantee 4515/// is made about the top bits: it may be zero, sign-extended, or garbage. 4516SDValue SelectionDAGLegalize::PromoteOp(SDValue Op) { 4517 MVT VT = Op.getValueType(); 4518 MVT NVT = TLI.getTypeToTransformTo(VT); 4519 assert(getTypeAction(VT) == Promote && 4520 "Caller should expand or legalize operands that are not promotable!"); 4521 assert(NVT.bitsGT(VT) && NVT.isInteger() == VT.isInteger() && 4522 "Cannot promote to smaller type!"); 4523 4524 SDValue Tmp1, Tmp2, Tmp3; 4525 SDValue Result; 4526 SDNode *Node = Op.getNode(); 4527 DebugLoc dl = Node->getDebugLoc(); 4528 4529 DenseMap<SDValue, SDValue>::iterator I = PromotedNodes.find(Op); 4530 if (I != PromotedNodes.end()) return I->second; 4531 4532 switch (Node->getOpcode()) { 4533 case ISD::CopyFromReg: 4534 assert(0 && "CopyFromReg must be legal!"); 4535 default: 4536#ifndef NDEBUG 4537 cerr << "NODE: "; Node->dump(&DAG); cerr << "\n"; 4538#endif 4539 assert(0 && "Do not know how to promote this operator!"); 4540 abort(); 4541 case ISD::UNDEF: 4542 Result = DAG.getUNDEF(NVT); 4543 break; 4544 case ISD::Constant: 4545 if (VT != MVT::i1) 4546 Result = DAG.getNode(ISD::SIGN_EXTEND, dl, NVT, Op); 4547 else 4548 Result = DAG.getNode(ISD::ZERO_EXTEND, dl, NVT, Op); 4549 assert(isa<ConstantSDNode>(Result) && "Didn't constant fold zext?"); 4550 break; 4551 case ISD::ConstantFP: 4552 Result = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Op); 4553 assert(isa<ConstantFPSDNode>(Result) && "Didn't constant fold fp_extend?"); 4554 break; 4555 4556 case ISD::SETCC: { 4557 MVT VT0 = Node->getOperand(0).getValueType(); 4558 assert(isTypeLegal(TLI.getSetCCResultType(VT0)) 4559 && "SetCC type is not legal??"); 4560 Result = DAG.getNode(ISD::SETCC, dl, TLI.getSetCCResultType(VT0), 4561 Node->getOperand(0), Node->getOperand(1), 4562 Node->getOperand(2)); 4563 break; 4564 } 4565 case ISD::TRUNCATE: 4566 switch (getTypeAction(Node->getOperand(0).getValueType())) { 4567 case Legal: 4568 Result = LegalizeOp(Node->getOperand(0)); 4569 assert(Result.getValueType().bitsGE(NVT) && 4570 "This truncation doesn't make sense!"); 4571 if (Result.getValueType().bitsGT(NVT)) // Truncate to NVT instead of VT 4572 Result = DAG.getNode(ISD::TRUNCATE, dl, NVT, Result); 4573 break; 4574 case Promote: 4575 // The truncation is not required, because we don't guarantee anything 4576 // about high bits anyway. 4577 Result = PromoteOp(Node->getOperand(0)); 4578 break; 4579 case Expand: 4580 ExpandOp(Node->getOperand(0), Tmp1, Tmp2); 4581 // Truncate the low part of the expanded value to the result type 4582 Result = DAG.getNode(ISD::TRUNCATE, dl, NVT, Tmp1); 4583 } 4584 break; 4585 case ISD::SIGN_EXTEND: 4586 case ISD::ZERO_EXTEND: 4587 case ISD::ANY_EXTEND: 4588 switch (getTypeAction(Node->getOperand(0).getValueType())) { 4589 case Expand: assert(0 && "BUG: Smaller reg should have been promoted!"); 4590 case Legal: 4591 // Input is legal? Just do extend all the way to the larger type. 4592 Result = DAG.getNode(Node->getOpcode(), dl, NVT, Node->getOperand(0)); 4593 break; 4594 case Promote: 4595 // Promote the reg if it's smaller. 4596 Result = PromoteOp(Node->getOperand(0)); 4597 // The high bits are not guaranteed to be anything. Insert an extend. 4598 if (Node->getOpcode() == ISD::SIGN_EXTEND) 4599 Result = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, NVT, Result, 4600 DAG.getValueType(Node->getOperand(0).getValueType())); 4601 else if (Node->getOpcode() == ISD::ZERO_EXTEND) 4602 Result = DAG.getZeroExtendInReg(Result, dl, 4603 Node->getOperand(0).getValueType()); 4604 break; 4605 } 4606 break; 4607 case ISD::CONVERT_RNDSAT: { 4608 ISD::CvtCode CvtCode = cast<CvtRndSatSDNode>(Node)->getCvtCode(); 4609 assert ((CvtCode == ISD::CVT_SS || CvtCode == ISD::CVT_SU || 4610 CvtCode == ISD::CVT_US || CvtCode == ISD::CVT_UU || 4611 CvtCode == ISD::CVT_SF || CvtCode == ISD::CVT_UF) && 4612 "can only promote integers"); 4613 Result = DAG.getConvertRndSat(NVT, dl, Node->getOperand(0), 4614 Node->getOperand(1), Node->getOperand(2), 4615 Node->getOperand(3), Node->getOperand(4), 4616 CvtCode); 4617 break; 4618 4619 } 4620 case ISD::BIT_CONVERT: 4621 Result = EmitStackConvert(Node->getOperand(0), Node->getValueType(0), 4622 Node->getValueType(0), dl); 4623 Result = PromoteOp(Result); 4624 break; 4625 4626 case ISD::FP_EXTEND: 4627 assert(0 && "Case not implemented. Dynamically dead with 2 FP types!"); 4628 case ISD::FP_ROUND: 4629 switch (getTypeAction(Node->getOperand(0).getValueType())) { 4630 case Expand: assert(0 && "BUG: Cannot expand FP regs!"); 4631 case Promote: assert(0 && "Unreachable with 2 FP types!"); 4632 case Legal: 4633 if (Node->getConstantOperandVal(1) == 0) { 4634 // Input is legal? Do an FP_ROUND_INREG. 4635 Result = DAG.getNode(ISD::FP_ROUND_INREG, dl, NVT, Node->getOperand(0), 4636 DAG.getValueType(VT)); 4637 } else { 4638 // Just remove the truncate, it isn't affecting the value. 4639 Result = DAG.getNode(ISD::FP_ROUND, dl, NVT, Node->getOperand(0), 4640 Node->getOperand(1)); 4641 } 4642 break; 4643 } 4644 break; 4645 case ISD::SINT_TO_FP: 4646 case ISD::UINT_TO_FP: 4647 switch (getTypeAction(Node->getOperand(0).getValueType())) { 4648 case Legal: 4649 // No extra round required here. 4650 Result = DAG.getNode(Node->getOpcode(), dl, NVT, Node->getOperand(0)); 4651 break; 4652 4653 case Promote: 4654 Result = PromoteOp(Node->getOperand(0)); 4655 if (Node->getOpcode() == ISD::SINT_TO_FP) 4656 Result = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, Result.getValueType(), 4657 Result, 4658 DAG.getValueType(Node->getOperand(0).getValueType())); 4659 else 4660 Result = DAG.getZeroExtendInReg(Result, dl, 4661 Node->getOperand(0).getValueType()); 4662 // No extra round required here. 4663 Result = DAG.getNode(Node->getOpcode(), dl, NVT, Result); 4664 break; 4665 case Expand: 4666 Result = ExpandIntToFP(Node->getOpcode() == ISD::SINT_TO_FP, NVT, 4667 Node->getOperand(0), dl); 4668 // Round if we cannot tolerate excess precision. 4669 if (NoExcessFPPrecision) 4670 Result = DAG.getNode(ISD::FP_ROUND_INREG, dl, NVT, Result, 4671 DAG.getValueType(VT)); 4672 break; 4673 } 4674 break; 4675 4676 case ISD::SIGN_EXTEND_INREG: 4677 Result = PromoteOp(Node->getOperand(0)); 4678 Result = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, NVT, Result, 4679 Node->getOperand(1)); 4680 break; 4681 case ISD::FP_TO_SINT: 4682 case ISD::FP_TO_UINT: 4683 switch (getTypeAction(Node->getOperand(0).getValueType())) { 4684 case Legal: 4685 case Expand: 4686 Tmp1 = Node->getOperand(0); 4687 break; 4688 case Promote: 4689 // The input result is prerounded, so we don't have to do anything 4690 // special. 4691 Tmp1 = PromoteOp(Node->getOperand(0)); 4692 break; 4693 } 4694 // If we're promoting a UINT to a larger size, check to see if the new node 4695 // will be legal. If it isn't, check to see if FP_TO_SINT is legal, since 4696 // we can use that instead. This allows us to generate better code for 4697 // FP_TO_UINT for small destination sizes on targets where FP_TO_UINT is not 4698 // legal, such as PowerPC. 4699 if (Node->getOpcode() == ISD::FP_TO_UINT && 4700 !TLI.isOperationLegalOrCustom(ISD::FP_TO_UINT, NVT) && 4701 (TLI.isOperationLegalOrCustom(ISD::FP_TO_SINT, NVT) || 4702 TLI.getOperationAction(ISD::FP_TO_SINT, NVT)==TargetLowering::Custom)){ 4703 Result = DAG.getNode(ISD::FP_TO_SINT, dl, NVT, Tmp1); 4704 } else { 4705 Result = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1); 4706 } 4707 break; 4708 4709 case ISD::FABS: 4710 case ISD::FNEG: 4711 Tmp1 = PromoteOp(Node->getOperand(0)); 4712 assert(Tmp1.getValueType() == NVT); 4713 Result = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1); 4714 // NOTE: we do not have to do any extra rounding here for 4715 // NoExcessFPPrecision, because we know the input will have the appropriate 4716 // precision, and these operations don't modify precision at all. 4717 break; 4718 4719 case ISD::FLOG: 4720 case ISD::FLOG2: 4721 case ISD::FLOG10: 4722 case ISD::FEXP: 4723 case ISD::FEXP2: 4724 case ISD::FSQRT: 4725 case ISD::FSIN: 4726 case ISD::FCOS: 4727 case ISD::FTRUNC: 4728 case ISD::FFLOOR: 4729 case ISD::FCEIL: 4730 case ISD::FRINT: 4731 case ISD::FNEARBYINT: 4732 Tmp1 = PromoteOp(Node->getOperand(0)); 4733 assert(Tmp1.getValueType() == NVT); 4734 Result = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1); 4735 if (NoExcessFPPrecision) 4736 Result = DAG.getNode(ISD::FP_ROUND_INREG, dl, NVT, Result, 4737 DAG.getValueType(VT)); 4738 break; 4739 4740 case ISD::FPOW: 4741 case ISD::FPOWI: { 4742 // Promote f32 pow(i) to f64 pow(i). Note that this could insert a libcall 4743 // directly as well, which may be better. 4744 Tmp1 = PromoteOp(Node->getOperand(0)); 4745 Tmp2 = Node->getOperand(1); 4746 if (Node->getOpcode() == ISD::FPOW) 4747 Tmp2 = PromoteOp(Tmp2); 4748 assert(Tmp1.getValueType() == NVT); 4749 Result = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1, Tmp2); 4750 if (NoExcessFPPrecision) 4751 Result = DAG.getNode(ISD::FP_ROUND_INREG, dl, NVT, Result, 4752 DAG.getValueType(VT)); 4753 break; 4754 } 4755 4756 case ISD::ATOMIC_CMP_SWAP: { 4757 AtomicSDNode* AtomNode = cast<AtomicSDNode>(Node); 4758 Tmp2 = PromoteOp(Node->getOperand(2)); 4759 Tmp3 = PromoteOp(Node->getOperand(3)); 4760 Result = DAG.getAtomic(Node->getOpcode(), dl, AtomNode->getMemoryVT(), 4761 AtomNode->getChain(), 4762 AtomNode->getBasePtr(), Tmp2, Tmp3, 4763 AtomNode->getSrcValue(), 4764 AtomNode->getAlignment()); 4765 // Remember that we legalized the chain. 4766 AddLegalizedOperand(Op.getValue(1), LegalizeOp(Result.getValue(1))); 4767 break; 4768 } 4769 case ISD::ATOMIC_LOAD_ADD: 4770 case ISD::ATOMIC_LOAD_SUB: 4771 case ISD::ATOMIC_LOAD_AND: 4772 case ISD::ATOMIC_LOAD_OR: 4773 case ISD::ATOMIC_LOAD_XOR: 4774 case ISD::ATOMIC_LOAD_NAND: 4775 case ISD::ATOMIC_LOAD_MIN: 4776 case ISD::ATOMIC_LOAD_MAX: 4777 case ISD::ATOMIC_LOAD_UMIN: 4778 case ISD::ATOMIC_LOAD_UMAX: 4779 case ISD::ATOMIC_SWAP: { 4780 AtomicSDNode* AtomNode = cast<AtomicSDNode>(Node); 4781 Tmp2 = PromoteOp(Node->getOperand(2)); 4782 Result = DAG.getAtomic(Node->getOpcode(), dl, AtomNode->getMemoryVT(), 4783 AtomNode->getChain(), 4784 AtomNode->getBasePtr(), Tmp2, 4785 AtomNode->getSrcValue(), 4786 AtomNode->getAlignment()); 4787 // Remember that we legalized the chain. 4788 AddLegalizedOperand(Op.getValue(1), LegalizeOp(Result.getValue(1))); 4789 break; 4790 } 4791 4792 case ISD::AND: 4793 case ISD::OR: 4794 case ISD::XOR: 4795 case ISD::ADD: 4796 case ISD::SUB: 4797 case ISD::MUL: 4798 // The input may have strange things in the top bits of the registers, but 4799 // these operations don't care. They may have weird bits going out, but 4800 // that too is okay if they are integer operations. 4801 Tmp1 = PromoteOp(Node->getOperand(0)); 4802 Tmp2 = PromoteOp(Node->getOperand(1)); 4803 assert(Tmp1.getValueType() == NVT && Tmp2.getValueType() == NVT); 4804 Result = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1, Tmp2); 4805 break; 4806 case ISD::FADD: 4807 case ISD::FSUB: 4808 case ISD::FMUL: 4809 Tmp1 = PromoteOp(Node->getOperand(0)); 4810 Tmp2 = PromoteOp(Node->getOperand(1)); 4811 assert(Tmp1.getValueType() == NVT && Tmp2.getValueType() == NVT); 4812 Result = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1, Tmp2); 4813 4814 // Floating point operations will give excess precision that we may not be 4815 // able to tolerate. If we DO allow excess precision, just leave it, 4816 // otherwise excise it. 4817 // FIXME: Why would we need to round FP ops more than integer ones? 4818 // Is Round(Add(Add(A,B),C)) != Round(Add(Round(Add(A,B)), C)) 4819 if (NoExcessFPPrecision) 4820 Result = DAG.getNode(ISD::FP_ROUND_INREG, dl, NVT, Result, 4821 DAG.getValueType(VT)); 4822 break; 4823 4824 case ISD::SDIV: 4825 case ISD::SREM: 4826 // These operators require that their input be sign extended. 4827 Tmp1 = PromoteOp(Node->getOperand(0)); 4828 Tmp2 = PromoteOp(Node->getOperand(1)); 4829 if (NVT.isInteger()) { 4830 Tmp1 = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, NVT, Tmp1, 4831 DAG.getValueType(VT)); 4832 Tmp2 = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, NVT, Tmp2, 4833 DAG.getValueType(VT)); 4834 } 4835 Result = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1, Tmp2); 4836 4837 // Perform FP_ROUND: this is probably overly pessimistic. 4838 if (NVT.isFloatingPoint() && NoExcessFPPrecision) 4839 Result = DAG.getNode(ISD::FP_ROUND_INREG, dl, NVT, Result, 4840 DAG.getValueType(VT)); 4841 break; 4842 case ISD::FDIV: 4843 case ISD::FREM: 4844 case ISD::FCOPYSIGN: 4845 // These operators require that their input be fp extended. 4846 switch (getTypeAction(Node->getOperand(0).getValueType())) { 4847 case Expand: assert(0 && "not implemented"); 4848 case Legal: Tmp1 = LegalizeOp(Node->getOperand(0)); break; 4849 case Promote: Tmp1 = PromoteOp(Node->getOperand(0)); break; 4850 } 4851 switch (getTypeAction(Node->getOperand(1).getValueType())) { 4852 case Expand: assert(0 && "not implemented"); 4853 case Legal: Tmp2 = LegalizeOp(Node->getOperand(1)); break; 4854 case Promote: Tmp2 = PromoteOp(Node->getOperand(1)); break; 4855 } 4856 Result = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1, Tmp2); 4857 4858 // Perform FP_ROUND: this is probably overly pessimistic. 4859 if (NoExcessFPPrecision && Node->getOpcode() != ISD::FCOPYSIGN) 4860 Result = DAG.getNode(ISD::FP_ROUND_INREG, dl, NVT, Result, 4861 DAG.getValueType(VT)); 4862 break; 4863 4864 case ISD::UDIV: 4865 case ISD::UREM: 4866 // These operators require that their input be zero extended. 4867 Tmp1 = PromoteOp(Node->getOperand(0)); 4868 Tmp2 = PromoteOp(Node->getOperand(1)); 4869 assert(NVT.isInteger() && "Operators don't apply to FP!"); 4870 Tmp1 = DAG.getZeroExtendInReg(Tmp1, dl, VT); 4871 Tmp2 = DAG.getZeroExtendInReg(Tmp2, dl, VT); 4872 Result = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1, Tmp2); 4873 break; 4874 4875 case ISD::SHL: 4876 Tmp1 = PromoteOp(Node->getOperand(0)); 4877 Result = DAG.getNode(ISD::SHL, dl, NVT, Tmp1, Node->getOperand(1)); 4878 break; 4879 case ISD::SRA: 4880 // The input value must be properly sign extended. 4881 Tmp1 = PromoteOp(Node->getOperand(0)); 4882 Tmp1 = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, NVT, Tmp1, 4883 DAG.getValueType(VT)); 4884 Result = DAG.getNode(ISD::SRA, dl, NVT, Tmp1, Node->getOperand(1)); 4885 break; 4886 case ISD::SRL: 4887 // The input value must be properly zero extended. 4888 Tmp1 = PromoteOp(Node->getOperand(0)); 4889 Tmp1 = DAG.getZeroExtendInReg(Tmp1, dl, VT); 4890 Result = DAG.getNode(ISD::SRL, dl, NVT, Tmp1, Node->getOperand(1)); 4891 break; 4892 4893 case ISD::VAARG: 4894 Tmp1 = Node->getOperand(0); // Get the chain. 4895 Tmp2 = Node->getOperand(1); // Get the pointer. 4896 if (TLI.getOperationAction(ISD::VAARG, VT) == TargetLowering::Custom) { 4897 Tmp3 = DAG.getVAArg(VT, dl, Tmp1, Tmp2, Node->getOperand(2)); 4898 Result = TLI.LowerOperation(Tmp3, DAG); 4899 } else { 4900 const Value *V = cast<SrcValueSDNode>(Node->getOperand(2))->getValue(); 4901 SDValue VAList = DAG.getLoad(TLI.getPointerTy(), dl, Tmp1, Tmp2, V, 0); 4902 // Increment the pointer, VAList, to the next vaarg 4903 Tmp3 = DAG.getNode(ISD::ADD, dl, TLI.getPointerTy(), VAList, 4904 DAG.getConstant(VT.getSizeInBits()/8, 4905 TLI.getPointerTy())); 4906 // Store the incremented VAList to the legalized pointer 4907 Tmp3 = DAG.getStore(VAList.getValue(1), dl, Tmp3, Tmp2, V, 0); 4908 // Load the actual argument out of the pointer VAList 4909 Result = DAG.getExtLoad(ISD::EXTLOAD, dl, NVT, Tmp3, VAList, NULL, 0, VT); 4910 } 4911 // Remember that we legalized the chain. 4912 AddLegalizedOperand(Op.getValue(1), LegalizeOp(Result.getValue(1))); 4913 break; 4914 4915 case ISD::LOAD: { 4916 LoadSDNode *LD = cast<LoadSDNode>(Node); 4917 ISD::LoadExtType ExtType = ISD::isNON_EXTLoad(Node) 4918 ? ISD::EXTLOAD : LD->getExtensionType(); 4919 Result = DAG.getExtLoad(ExtType, dl, NVT, 4920 LD->getChain(), LD->getBasePtr(), 4921 LD->getSrcValue(), LD->getSrcValueOffset(), 4922 LD->getMemoryVT(), 4923 LD->isVolatile(), 4924 LD->getAlignment()); 4925 // Remember that we legalized the chain. 4926 AddLegalizedOperand(Op.getValue(1), LegalizeOp(Result.getValue(1))); 4927 break; 4928 } 4929 case ISD::SELECT: { 4930 Tmp2 = PromoteOp(Node->getOperand(1)); // Legalize the op0 4931 Tmp3 = PromoteOp(Node->getOperand(2)); // Legalize the op1 4932 4933 MVT VT2 = Tmp2.getValueType(); 4934 assert(VT2 == Tmp3.getValueType() 4935 && "PromoteOp SELECT: Operands 2 and 3 ValueTypes don't match"); 4936 // Ensure that the resulting node is at least the same size as the operands' 4937 // value types, because we cannot assume that TLI.getSetCCValueType() is 4938 // constant. 4939 Result = DAG.getNode(ISD::SELECT, dl, VT2, Node->getOperand(0), Tmp2, Tmp3); 4940 break; 4941 } 4942 case ISD::SELECT_CC: 4943 Tmp2 = PromoteOp(Node->getOperand(2)); // True 4944 Tmp3 = PromoteOp(Node->getOperand(3)); // False 4945 Result = DAG.getNode(ISD::SELECT_CC, dl, NVT, Node->getOperand(0), 4946 Node->getOperand(1), Tmp2, Tmp3, Node->getOperand(4)); 4947 break; 4948 case ISD::BSWAP: 4949 Tmp1 = Node->getOperand(0); 4950 Tmp1 = DAG.getNode(ISD::ZERO_EXTEND, dl, NVT, Tmp1); 4951 Tmp1 = DAG.getNode(ISD::BSWAP, dl, NVT, Tmp1); 4952 Result = DAG.getNode(ISD::SRL, dl, NVT, Tmp1, 4953 DAG.getConstant(NVT.getSizeInBits() - 4954 VT.getSizeInBits(), 4955 TLI.getShiftAmountTy())); 4956 break; 4957 case ISD::CTPOP: 4958 case ISD::CTTZ: 4959 case ISD::CTLZ: 4960 // Zero extend the argument 4961 Tmp1 = DAG.getNode(ISD::ZERO_EXTEND, dl, NVT, Node->getOperand(0)); 4962 // Perform the larger operation, then subtract if needed. 4963 Tmp1 = DAG.getNode(Node->getOpcode(), dl, NVT, Tmp1); 4964 switch(Node->getOpcode()) { 4965 case ISD::CTPOP: 4966 Result = Tmp1; 4967 break; 4968 case ISD::CTTZ: 4969 // if Tmp1 == sizeinbits(NVT) then Tmp1 = sizeinbits(Old VT) 4970 Tmp2 = DAG.getSetCC(dl, TLI.getSetCCResultType(Tmp1.getValueType()), Tmp1, 4971 DAG.getConstant(NVT.getSizeInBits(), NVT), 4972 ISD::SETEQ); 4973 Result = DAG.getNode(ISD::SELECT, dl, NVT, Tmp2, 4974 DAG.getConstant(VT.getSizeInBits(), NVT), Tmp1); 4975 break; 4976 case ISD::CTLZ: 4977 //Tmp1 = Tmp1 - (sizeinbits(NVT) - sizeinbits(Old VT)) 4978 Result = DAG.getNode(ISD::SUB, dl, NVT, Tmp1, 4979 DAG.getConstant(NVT.getSizeInBits() - 4980 VT.getSizeInBits(), NVT)); 4981 break; 4982 } 4983 break; 4984 case ISD::EXTRACT_SUBVECTOR: 4985 Result = PromoteOp(ExpandEXTRACT_SUBVECTOR(Op)); 4986 break; 4987 case ISD::EXTRACT_VECTOR_ELT: 4988 Result = PromoteOp(ExpandEXTRACT_VECTOR_ELT(Op)); 4989 break; 4990 } 4991 4992 assert(Result.getNode() && "Didn't set a result!"); 4993 4994 // Make sure the result is itself legal. 4995 Result = LegalizeOp(Result); 4996 4997 // Remember that we promoted this! 4998 AddPromotedOperand(Op, Result); 4999 return Result; 5000} 5001 5002/// ExpandEXTRACT_VECTOR_ELT - Expand an EXTRACT_VECTOR_ELT operation into 5003/// a legal EXTRACT_VECTOR_ELT operation, scalar code, or memory traffic, 5004/// based on the vector type. The return type of this matches the element type 5005/// of the vector, which may not be legal for the target. 5006SDValue SelectionDAGLegalize::ExpandEXTRACT_VECTOR_ELT(SDValue Op) { 5007 // We know that operand #0 is the Vec vector. If the index is a constant 5008 // or if the invec is a supported hardware type, we can use it. Otherwise, 5009 // lower to a store then an indexed load. 5010 SDValue Vec = Op.getOperand(0); 5011 SDValue Idx = Op.getOperand(1); 5012 DebugLoc dl = Op.getDebugLoc(); 5013 5014 MVT TVT = Vec.getValueType(); 5015 unsigned NumElems = TVT.getVectorNumElements(); 5016 5017 switch (TLI.getOperationAction(ISD::EXTRACT_VECTOR_ELT, TVT)) { 5018 default: assert(0 && "This action is not supported yet!"); 5019 case TargetLowering::Custom: { 5020 Vec = LegalizeOp(Vec); 5021 Op = DAG.UpdateNodeOperands(Op, Vec, Idx); 5022 SDValue Tmp3 = TLI.LowerOperation(Op, DAG); 5023 if (Tmp3.getNode()) 5024 return Tmp3; 5025 break; 5026 } 5027 case TargetLowering::Legal: 5028 if (isTypeLegal(TVT)) { 5029 Vec = LegalizeOp(Vec); 5030 Op = DAG.UpdateNodeOperands(Op, Vec, Idx); 5031 return Op; 5032 } 5033 break; 5034 case TargetLowering::Promote: 5035 assert(TVT.isVector() && "not vector type"); 5036 // fall thru to expand since vectors are by default are promote 5037 case TargetLowering::Expand: 5038 break; 5039 } 5040 5041 if (NumElems == 1) { 5042 // This must be an access of the only element. Return it. 5043 Op = ScalarizeVectorOp(Vec); 5044 } else if (!TLI.isTypeLegal(TVT) && isa<ConstantSDNode>(Idx)) { 5045 unsigned NumLoElts = 1 << Log2_32(NumElems-1); 5046 ConstantSDNode *CIdx = cast<ConstantSDNode>(Idx); 5047 SDValue Lo, Hi; 5048 SplitVectorOp(Vec, Lo, Hi); 5049 if (CIdx->getZExtValue() < NumLoElts) { 5050 Vec = Lo; 5051 } else { 5052 Vec = Hi; 5053 Idx = DAG.getConstant(CIdx->getZExtValue() - NumLoElts, 5054 Idx.getValueType()); 5055 } 5056 5057 // It's now an extract from the appropriate high or low part. Recurse. 5058 Op = DAG.UpdateNodeOperands(Op, Vec, Idx); 5059 Op = ExpandEXTRACT_VECTOR_ELT(Op); 5060 } else { 5061 // Store the value to a temporary stack slot, then LOAD the scalar 5062 // element back out. 5063 SDValue StackPtr = DAG.CreateStackTemporary(Vec.getValueType()); 5064 SDValue Ch = DAG.getStore(DAG.getEntryNode(), dl, Vec, StackPtr, NULL, 0); 5065 5066 // Add the offset to the index. 5067 unsigned EltSize = Op.getValueType().getSizeInBits()/8; 5068 Idx = DAG.getNode(ISD::MUL, dl, Idx.getValueType(), Idx, 5069 DAG.getConstant(EltSize, Idx.getValueType())); 5070 5071 if (Idx.getValueType().bitsGT(TLI.getPointerTy())) 5072 Idx = DAG.getNode(ISD::TRUNCATE, dl, TLI.getPointerTy(), Idx); 5073 else 5074 Idx = DAG.getNode(ISD::ZERO_EXTEND, dl, TLI.getPointerTy(), Idx); 5075 5076 StackPtr = DAG.getNode(ISD::ADD, dl, Idx.getValueType(), Idx, StackPtr); 5077 5078 Op = DAG.getLoad(Op.getValueType(), dl, Ch, StackPtr, NULL, 0); 5079 } 5080 return Op; 5081} 5082 5083/// ExpandEXTRACT_SUBVECTOR - Expand a EXTRACT_SUBVECTOR operation. For now 5084/// we assume the operation can be split if it is not already legal. 5085SDValue SelectionDAGLegalize::ExpandEXTRACT_SUBVECTOR(SDValue Op) { 5086 // We know that operand #0 is the Vec vector. For now we assume the index 5087 // is a constant and that the extracted result is a supported hardware type. 5088 SDValue Vec = Op.getOperand(0); 5089 SDValue Idx = LegalizeOp(Op.getOperand(1)); 5090 5091 unsigned NumElems = Vec.getValueType().getVectorNumElements(); 5092 5093 if (NumElems == Op.getValueType().getVectorNumElements()) { 5094 // This must be an access of the desired vector length. Return it. 5095 return Vec; 5096 } 5097 5098 ConstantSDNode *CIdx = cast<ConstantSDNode>(Idx); 5099 SDValue Lo, Hi; 5100 SplitVectorOp(Vec, Lo, Hi); 5101 if (CIdx->getZExtValue() < NumElems/2) { 5102 Vec = Lo; 5103 } else { 5104 Vec = Hi; 5105 Idx = DAG.getConstant(CIdx->getZExtValue() - NumElems/2, 5106 Idx.getValueType()); 5107 } 5108 5109 // It's now an extract from the appropriate high or low part. Recurse. 5110 Op = DAG.UpdateNodeOperands(Op, Vec, Idx); 5111 return ExpandEXTRACT_SUBVECTOR(Op); 5112} 5113 5114/// LegalizeSetCCOperands - Attempts to create a legal LHS and RHS for a SETCC 5115/// with condition CC on the current target. This usually involves legalizing 5116/// or promoting the arguments. In the case where LHS and RHS must be expanded, 5117/// there may be no choice but to create a new SetCC node to represent the 5118/// legalized value of setcc lhs, rhs. In this case, the value is returned in 5119/// LHS, and the SDValue returned in RHS has a nil SDNode value. 5120void SelectionDAGLegalize::LegalizeSetCCOperands(SDValue &LHS, 5121 SDValue &RHS, 5122 SDValue &CC, 5123 DebugLoc dl) { 5124 SDValue Tmp1, Tmp2, Tmp3, Result; 5125 5126 switch (getTypeAction(LHS.getValueType())) { 5127 case Legal: 5128 Tmp1 = LegalizeOp(LHS); // LHS 5129 Tmp2 = LegalizeOp(RHS); // RHS 5130 break; 5131 case Promote: 5132 Tmp1 = PromoteOp(LHS); // LHS 5133 Tmp2 = PromoteOp(RHS); // RHS 5134 5135 // If this is an FP compare, the operands have already been extended. 5136 if (LHS.getValueType().isInteger()) { 5137 MVT VT = LHS.getValueType(); 5138 MVT NVT = TLI.getTypeToTransformTo(VT); 5139 5140 // Otherwise, we have to insert explicit sign or zero extends. Note 5141 // that we could insert sign extends for ALL conditions, but zero extend 5142 // is cheaper on many machines (an AND instead of two shifts), so prefer 5143 // it. 5144 switch (cast<CondCodeSDNode>(CC)->get()) { 5145 default: assert(0 && "Unknown integer comparison!"); 5146 case ISD::SETEQ: 5147 case ISD::SETNE: 5148 case ISD::SETUGE: 5149 case ISD::SETUGT: 5150 case ISD::SETULE: 5151 case ISD::SETULT: 5152 // ALL of these operations will work if we either sign or zero extend 5153 // the operands (including the unsigned comparisons!). Zero extend is 5154 // usually a simpler/cheaper operation, so prefer it. 5155 Tmp1 = DAG.getZeroExtendInReg(Tmp1, dl, VT); 5156 Tmp2 = DAG.getZeroExtendInReg(Tmp2, dl, VT); 5157 break; 5158 case ISD::SETGE: 5159 case ISD::SETGT: 5160 case ISD::SETLT: 5161 case ISD::SETLE: 5162 Tmp1 = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, NVT, Tmp1, 5163 DAG.getValueType(VT)); 5164 Tmp2 = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, NVT, Tmp2, 5165 DAG.getValueType(VT)); 5166 Tmp1 = LegalizeOp(Tmp1); // Relegalize new nodes. 5167 Tmp2 = LegalizeOp(Tmp2); // Relegalize new nodes. 5168 break; 5169 } 5170 } 5171 break; 5172 case Expand: { 5173 MVT VT = LHS.getValueType(); 5174 if (VT == MVT::f32 || VT == MVT::f64) { 5175 // Expand into one or more soft-fp libcall(s). 5176 RTLIB::Libcall LC1 = RTLIB::UNKNOWN_LIBCALL, LC2 = RTLIB::UNKNOWN_LIBCALL; 5177 switch (cast<CondCodeSDNode>(CC)->get()) { 5178 case ISD::SETEQ: 5179 case ISD::SETOEQ: 5180 LC1 = (VT == MVT::f32) ? RTLIB::OEQ_F32 : RTLIB::OEQ_F64; 5181 break; 5182 case ISD::SETNE: 5183 case ISD::SETUNE: 5184 LC1 = (VT == MVT::f32) ? RTLIB::UNE_F32 : RTLIB::UNE_F64; 5185 break; 5186 case ISD::SETGE: 5187 case ISD::SETOGE: 5188 LC1 = (VT == MVT::f32) ? RTLIB::OGE_F32 : RTLIB::OGE_F64; 5189 break; 5190 case ISD::SETLT: 5191 case ISD::SETOLT: 5192 LC1 = (VT == MVT::f32) ? RTLIB::OLT_F32 : RTLIB::OLT_F64; 5193 break; 5194 case ISD::SETLE: 5195 case ISD::SETOLE: 5196 LC1 = (VT == MVT::f32) ? RTLIB::OLE_F32 : RTLIB::OLE_F64; 5197 break; 5198 case ISD::SETGT: 5199 case ISD::SETOGT: 5200 LC1 = (VT == MVT::f32) ? RTLIB::OGT_F32 : RTLIB::OGT_F64; 5201 break; 5202 case ISD::SETUO: 5203 LC1 = (VT == MVT::f32) ? RTLIB::UO_F32 : RTLIB::UO_F64; 5204 break; 5205 case ISD::SETO: 5206 LC1 = (VT == MVT::f32) ? RTLIB::O_F32 : RTLIB::O_F64; 5207 break; 5208 default: 5209 LC1 = (VT == MVT::f32) ? RTLIB::UO_F32 : RTLIB::UO_F64; 5210 switch (cast<CondCodeSDNode>(CC)->get()) { 5211 case ISD::SETONE: 5212 // SETONE = SETOLT | SETOGT 5213 LC1 = (VT == MVT::f32) ? RTLIB::OLT_F32 : RTLIB::OLT_F64; 5214 // Fallthrough 5215 case ISD::SETUGT: 5216 LC2 = (VT == MVT::f32) ? RTLIB::OGT_F32 : RTLIB::OGT_F64; 5217 break; 5218 case ISD::SETUGE: 5219 LC2 = (VT == MVT::f32) ? RTLIB::OGE_F32 : RTLIB::OGE_F64; 5220 break; 5221 case ISD::SETULT: 5222 LC2 = (VT == MVT::f32) ? RTLIB::OLT_F32 : RTLIB::OLT_F64; 5223 break; 5224 case ISD::SETULE: 5225 LC2 = (VT == MVT::f32) ? RTLIB::OLE_F32 : RTLIB::OLE_F64; 5226 break; 5227 case ISD::SETUEQ: 5228 LC2 = (VT == MVT::f32) ? RTLIB::OEQ_F32 : RTLIB::OEQ_F64; 5229 break; 5230 default: assert(0 && "Unsupported FP setcc!"); 5231 } 5232 } 5233 5234 SDValue Dummy; 5235 SDValue Ops[2] = { LHS, RHS }; 5236 Tmp1 = ExpandLibCall(LC1, DAG.getMergeValues(Ops, 2, dl).getNode(), 5237 false /*sign irrelevant*/, Dummy); 5238 Tmp2 = DAG.getConstant(0, MVT::i32); 5239 CC = DAG.getCondCode(TLI.getCmpLibcallCC(LC1)); 5240 if (LC2 != RTLIB::UNKNOWN_LIBCALL) { 5241 Tmp1 = DAG.getNode(ISD::SETCC, dl, 5242 TLI.getSetCCResultType(Tmp1.getValueType()), 5243 Tmp1, Tmp2, CC); 5244 LHS = ExpandLibCall(LC2, DAG.getMergeValues(Ops, 2, dl).getNode(), 5245 false /*sign irrelevant*/, Dummy); 5246 Tmp2 = DAG.getNode(ISD::SETCC, dl, 5247 TLI.getSetCCResultType(LHS.getValueType()), LHS, 5248 Tmp2, DAG.getCondCode(TLI.getCmpLibcallCC(LC2))); 5249 Tmp1 = DAG.getNode(ISD::OR, dl, Tmp1.getValueType(), Tmp1, Tmp2); 5250 Tmp2 = SDValue(); 5251 } 5252 LHS = LegalizeOp(Tmp1); 5253 RHS = Tmp2; 5254 return; 5255 } 5256 5257 SDValue LHSLo, LHSHi, RHSLo, RHSHi; 5258 ExpandOp(LHS, LHSLo, LHSHi); 5259 ExpandOp(RHS, RHSLo, RHSHi); 5260 ISD::CondCode CCCode = cast<CondCodeSDNode>(CC)->get(); 5261 5262 if (VT==MVT::ppcf128) { 5263 // FIXME: This generated code sucks. We want to generate 5264 // FCMPU crN, hi1, hi2 5265 // BNE crN, L: 5266 // FCMPU crN, lo1, lo2 5267 // The following can be improved, but not that much. 5268 Tmp1 = DAG.getSetCC(dl, TLI.getSetCCResultType(LHSHi.getValueType()), 5269 LHSHi, RHSHi, ISD::SETOEQ); 5270 Tmp2 = DAG.getSetCC(dl, TLI.getSetCCResultType(LHSLo.getValueType()), 5271 LHSLo, RHSLo, CCCode); 5272 Tmp3 = DAG.getNode(ISD::AND, dl, Tmp1.getValueType(), Tmp1, Tmp2); 5273 Tmp1 = DAG.getSetCC(dl, TLI.getSetCCResultType(LHSHi.getValueType()), 5274 LHSHi, RHSHi, ISD::SETUNE); 5275 Tmp2 = DAG.getSetCC(dl, TLI.getSetCCResultType(LHSHi.getValueType()), 5276 LHSHi, RHSHi, CCCode); 5277 Tmp1 = DAG.getNode(ISD::AND, dl, Tmp1.getValueType(), Tmp1, Tmp2); 5278 Tmp1 = DAG.getNode(ISD::OR, dl, Tmp1.getValueType(), Tmp1, Tmp3); 5279 Tmp2 = SDValue(); 5280 break; 5281 } 5282 5283 switch (CCCode) { 5284 case ISD::SETEQ: 5285 case ISD::SETNE: 5286 if (RHSLo == RHSHi) 5287 if (ConstantSDNode *RHSCST = dyn_cast<ConstantSDNode>(RHSLo)) 5288 if (RHSCST->isAllOnesValue()) { 5289 // Comparison to -1. 5290 Tmp1 = DAG.getNode(ISD::AND, dl,LHSLo.getValueType(), LHSLo, LHSHi); 5291 Tmp2 = RHSLo; 5292 break; 5293 } 5294 5295 Tmp1 = DAG.getNode(ISD::XOR, dl, LHSLo.getValueType(), LHSLo, RHSLo); 5296 Tmp2 = DAG.getNode(ISD::XOR, dl, LHSLo.getValueType(), LHSHi, RHSHi); 5297 Tmp1 = DAG.getNode(ISD::OR, dl, Tmp1.getValueType(), Tmp1, Tmp2); 5298 Tmp2 = DAG.getConstant(0, Tmp1.getValueType()); 5299 break; 5300 default: 5301 // If this is a comparison of the sign bit, just look at the top part. 5302 // X > -1, x < 0 5303 if (ConstantSDNode *CST = dyn_cast<ConstantSDNode>(RHS)) 5304 if ((cast<CondCodeSDNode>(CC)->get() == ISD::SETLT && 5305 CST->isNullValue()) || // X < 0 5306 (cast<CondCodeSDNode>(CC)->get() == ISD::SETGT && 5307 CST->isAllOnesValue())) { // X > -1 5308 Tmp1 = LHSHi; 5309 Tmp2 = RHSHi; 5310 break; 5311 } 5312 5313 // FIXME: This generated code sucks. 5314 ISD::CondCode LowCC; 5315 switch (CCCode) { 5316 default: assert(0 && "Unknown integer setcc!"); 5317 case ISD::SETLT: 5318 case ISD::SETULT: LowCC = ISD::SETULT; break; 5319 case ISD::SETGT: 5320 case ISD::SETUGT: LowCC = ISD::SETUGT; break; 5321 case ISD::SETLE: 5322 case ISD::SETULE: LowCC = ISD::SETULE; break; 5323 case ISD::SETGE: 5324 case ISD::SETUGE: LowCC = ISD::SETUGE; break; 5325 } 5326 5327 // Tmp1 = lo(op1) < lo(op2) // Always unsigned comparison 5328 // Tmp2 = hi(op1) < hi(op2) // Signedness depends on operands 5329 // dest = hi(op1) == hi(op2) ? Tmp1 : Tmp2; 5330 5331 // NOTE: on targets without efficient SELECT of bools, we can always use 5332 // this identity: (B1 ? B2 : B3) --> (B1 & B2)|(!B1&B3) 5333 TargetLowering::DAGCombinerInfo DagCombineInfo(DAG, false, true, NULL); 5334 Tmp1 = TLI.SimplifySetCC(TLI.getSetCCResultType(LHSLo.getValueType()), 5335 LHSLo, RHSLo, LowCC, false, DagCombineInfo, dl); 5336 if (!Tmp1.getNode()) 5337 Tmp1 = DAG.getSetCC(dl, TLI.getSetCCResultType(LHSLo.getValueType()), 5338 LHSLo, RHSLo, LowCC); 5339 Tmp2 = TLI.SimplifySetCC(TLI.getSetCCResultType(LHSHi.getValueType()), 5340 LHSHi, RHSHi, CCCode, false, DagCombineInfo, dl); 5341 if (!Tmp2.getNode()) 5342 Tmp2 = DAG.getNode(ISD::SETCC, dl, 5343 TLI.getSetCCResultType(LHSHi.getValueType()), 5344 LHSHi, RHSHi,CC); 5345 5346 ConstantSDNode *Tmp1C = dyn_cast<ConstantSDNode>(Tmp1.getNode()); 5347 ConstantSDNode *Tmp2C = dyn_cast<ConstantSDNode>(Tmp2.getNode()); 5348 if ((Tmp1C && Tmp1C->isNullValue()) || 5349 (Tmp2C && Tmp2C->isNullValue() && 5350 (CCCode == ISD::SETLE || CCCode == ISD::SETGE || 5351 CCCode == ISD::SETUGE || CCCode == ISD::SETULE)) || 5352 (Tmp2C && Tmp2C->getAPIntValue() == 1 && 5353 (CCCode == ISD::SETLT || CCCode == ISD::SETGT || 5354 CCCode == ISD::SETUGT || CCCode == ISD::SETULT))) { 5355 // low part is known false, returns high part. 5356 // For LE / GE, if high part is known false, ignore the low part. 5357 // For LT / GT, if high part is known true, ignore the low part. 5358 Tmp1 = Tmp2; 5359 Tmp2 = SDValue(); 5360 } else { 5361 Result = TLI.SimplifySetCC(TLI.getSetCCResultType(LHSHi.getValueType()), 5362 LHSHi, RHSHi, ISD::SETEQ, false, 5363 DagCombineInfo, dl); 5364 if (!Result.getNode()) 5365 Result=DAG.getSetCC(dl, TLI.getSetCCResultType(LHSHi.getValueType()), 5366 LHSHi, RHSHi, ISD::SETEQ); 5367 Result = LegalizeOp(DAG.getNode(ISD::SELECT, dl, Tmp1.getValueType(), 5368 Result, Tmp1, Tmp2)); 5369 Tmp1 = Result; 5370 Tmp2 = SDValue(); 5371 } 5372 } 5373 } 5374 } 5375 LHS = Tmp1; 5376 RHS = Tmp2; 5377} 5378 5379/// LegalizeSetCCCondCode - Legalize a SETCC with given LHS and RHS and 5380/// condition code CC on the current target. This routine assumes LHS and rHS 5381/// have already been legalized by LegalizeSetCCOperands. It expands SETCC with 5382/// illegal condition code into AND / OR of multiple SETCC values. 5383void SelectionDAGLegalize::LegalizeSetCCCondCode(MVT VT, 5384 SDValue &LHS, SDValue &RHS, 5385 SDValue &CC, 5386 DebugLoc dl) { 5387 MVT OpVT = LHS.getValueType(); 5388 ISD::CondCode CCCode = cast<CondCodeSDNode>(CC)->get(); 5389 switch (TLI.getCondCodeAction(CCCode, OpVT)) { 5390 default: assert(0 && "Unknown condition code action!"); 5391 case TargetLowering::Legal: 5392 // Nothing to do. 5393 break; 5394 case TargetLowering::Expand: { 5395 ISD::CondCode CC1 = ISD::SETCC_INVALID, CC2 = ISD::SETCC_INVALID; 5396 unsigned Opc = 0; 5397 switch (CCCode) { 5398 default: assert(0 && "Don't know how to expand this condition!"); abort(); 5399 case ISD::SETOEQ: CC1 = ISD::SETEQ; CC2 = ISD::SETO; Opc = ISD::AND; break; 5400 case ISD::SETOGT: CC1 = ISD::SETGT; CC2 = ISD::SETO; Opc = ISD::AND; break; 5401 case ISD::SETOGE: CC1 = ISD::SETGE; CC2 = ISD::SETO; Opc = ISD::AND; break; 5402 case ISD::SETOLT: CC1 = ISD::SETLT; CC2 = ISD::SETO; Opc = ISD::AND; break; 5403 case ISD::SETOLE: CC1 = ISD::SETLE; CC2 = ISD::SETO; Opc = ISD::AND; break; 5404 case ISD::SETONE: CC1 = ISD::SETNE; CC2 = ISD::SETO; Opc = ISD::AND; break; 5405 case ISD::SETUEQ: CC1 = ISD::SETEQ; CC2 = ISD::SETUO; Opc = ISD::OR; break; 5406 case ISD::SETUGT: CC1 = ISD::SETGT; CC2 = ISD::SETUO; Opc = ISD::OR; break; 5407 case ISD::SETUGE: CC1 = ISD::SETGE; CC2 = ISD::SETUO; Opc = ISD::OR; break; 5408 case ISD::SETULT: CC1 = ISD::SETLT; CC2 = ISD::SETUO; Opc = ISD::OR; break; 5409 case ISD::SETULE: CC1 = ISD::SETLE; CC2 = ISD::SETUO; Opc = ISD::OR; break; 5410 case ISD::SETUNE: CC1 = ISD::SETNE; CC2 = ISD::SETUO; Opc = ISD::OR; break; 5411 // FIXME: Implement more expansions. 5412 } 5413 5414 SDValue SetCC1 = DAG.getSetCC(dl, VT, LHS, RHS, CC1); 5415 SDValue SetCC2 = DAG.getSetCC(dl, VT, LHS, RHS, CC2); 5416 LHS = DAG.getNode(Opc, dl, VT, SetCC1, SetCC2); 5417 RHS = SDValue(); 5418 CC = SDValue(); 5419 break; 5420 } 5421 } 5422} 5423 5424/// EmitStackConvert - Emit a store/load combination to the stack. This stores 5425/// SrcOp to a stack slot of type SlotVT, truncating it if needed. It then does 5426/// a load from the stack slot to DestVT, extending it if needed. 5427/// The resultant code need not be legal. 5428SDValue SelectionDAGLegalize::EmitStackConvert(SDValue SrcOp, 5429 MVT SlotVT, 5430 MVT DestVT, 5431 DebugLoc dl) { 5432 // Create the stack frame object. 5433 unsigned SrcAlign = TLI.getTargetData()->getPrefTypeAlignment( 5434 SrcOp.getValueType().getTypeForMVT()); 5435 SDValue FIPtr = DAG.CreateStackTemporary(SlotVT, SrcAlign); 5436 5437 FrameIndexSDNode *StackPtrFI = cast<FrameIndexSDNode>(FIPtr); 5438 int SPFI = StackPtrFI->getIndex(); 5439 const Value *SV = PseudoSourceValue::getFixedStack(SPFI); 5440 5441 unsigned SrcSize = SrcOp.getValueType().getSizeInBits(); 5442 unsigned SlotSize = SlotVT.getSizeInBits(); 5443 unsigned DestSize = DestVT.getSizeInBits(); 5444 unsigned DestAlign = TLI.getTargetData()->getPrefTypeAlignment( 5445 DestVT.getTypeForMVT()); 5446 5447 // Emit a store to the stack slot. Use a truncstore if the input value is 5448 // later than DestVT. 5449 SDValue Store; 5450 5451 if (SrcSize > SlotSize) 5452 Store = DAG.getTruncStore(DAG.getEntryNode(), dl, SrcOp, FIPtr, 5453 SV, 0, SlotVT, false, SrcAlign); 5454 else { 5455 assert(SrcSize == SlotSize && "Invalid store"); 5456 Store = DAG.getStore(DAG.getEntryNode(), dl, SrcOp, FIPtr, 5457 SV, 0, false, SrcAlign); 5458 } 5459 5460 // Result is a load from the stack slot. 5461 if (SlotSize == DestSize) 5462 return DAG.getLoad(DestVT, dl, Store, FIPtr, SV, 0, false, DestAlign); 5463 5464 assert(SlotSize < DestSize && "Unknown extension!"); 5465 return DAG.getExtLoad(ISD::EXTLOAD, dl, DestVT, Store, FIPtr, SV, 0, SlotVT, 5466 false, DestAlign); 5467} 5468 5469SDValue SelectionDAGLegalize::ExpandSCALAR_TO_VECTOR(SDNode *Node) { 5470 DebugLoc dl = Node->getDebugLoc(); 5471 // Create a vector sized/aligned stack slot, store the value to element #0, 5472 // then load the whole vector back out. 5473 SDValue StackPtr = DAG.CreateStackTemporary(Node->getValueType(0)); 5474 5475 FrameIndexSDNode *StackPtrFI = cast<FrameIndexSDNode>(StackPtr); 5476 int SPFI = StackPtrFI->getIndex(); 5477 5478 SDValue Ch = DAG.getStore(DAG.getEntryNode(), dl, Node->getOperand(0), 5479 StackPtr, 5480 PseudoSourceValue::getFixedStack(SPFI), 0); 5481 return DAG.getLoad(Node->getValueType(0), dl, Ch, StackPtr, 5482 PseudoSourceValue::getFixedStack(SPFI), 0); 5483} 5484 5485 5486/// ExpandBUILD_VECTOR - Expand a BUILD_VECTOR node on targets that don't 5487/// support the operation, but do support the resultant vector type. 5488SDValue SelectionDAGLegalize::ExpandBUILD_VECTOR(SDNode *Node) { 5489 5490 // If the only non-undef value is the low element, turn this into a 5491 // SCALAR_TO_VECTOR node. If this is { X, X, X, X }, determine X. 5492 unsigned NumElems = Node->getNumOperands(); 5493 bool isOnlyLowElement = true; 5494 SDValue SplatValue = Node->getOperand(0); 5495 DebugLoc dl = Node->getDebugLoc(); 5496 5497 // FIXME: it would be far nicer to change this into map<SDValue,uint64_t> 5498 // and use a bitmask instead of a list of elements. 5499 std::map<SDValue, std::vector<unsigned> > Values; 5500 Values[SplatValue].push_back(0); 5501 bool isConstant = true; 5502 if (!isa<ConstantFPSDNode>(SplatValue) && !isa<ConstantSDNode>(SplatValue) && 5503 SplatValue.getOpcode() != ISD::UNDEF) 5504 isConstant = false; 5505 5506 for (unsigned i = 1; i < NumElems; ++i) { 5507 SDValue V = Node->getOperand(i); 5508 Values[V].push_back(i); 5509 if (V.getOpcode() != ISD::UNDEF) 5510 isOnlyLowElement = false; 5511 if (SplatValue != V) 5512 SplatValue = SDValue(0,0); 5513 5514 // If this isn't a constant element or an undef, we can't use a constant 5515 // pool load. 5516 if (!isa<ConstantFPSDNode>(V) && !isa<ConstantSDNode>(V) && 5517 V.getOpcode() != ISD::UNDEF) 5518 isConstant = false; 5519 } 5520 5521 if (isOnlyLowElement) { 5522 // If the low element is an undef too, then this whole things is an undef. 5523 if (Node->getOperand(0).getOpcode() == ISD::UNDEF) 5524 return DAG.getUNDEF(Node->getValueType(0)); 5525 // Otherwise, turn this into a scalar_to_vector node. 5526 return DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, Node->getValueType(0), 5527 Node->getOperand(0)); 5528 } 5529 5530 // If all elements are constants, create a load from the constant pool. 5531 if (isConstant) { 5532 MVT VT = Node->getValueType(0); 5533 std::vector<Constant*> CV; 5534 for (unsigned i = 0, e = NumElems; i != e; ++i) { 5535 if (ConstantFPSDNode *V = 5536 dyn_cast<ConstantFPSDNode>(Node->getOperand(i))) { 5537 CV.push_back(const_cast<ConstantFP *>(V->getConstantFPValue())); 5538 } else if (ConstantSDNode *V = 5539 dyn_cast<ConstantSDNode>(Node->getOperand(i))) { 5540 CV.push_back(const_cast<ConstantInt *>(V->getConstantIntValue())); 5541 } else { 5542 assert(Node->getOperand(i).getOpcode() == ISD::UNDEF); 5543 const Type *OpNTy = 5544 Node->getOperand(0).getValueType().getTypeForMVT(); 5545 CV.push_back(UndefValue::get(OpNTy)); 5546 } 5547 } 5548 Constant *CP = ConstantVector::get(CV); 5549 SDValue CPIdx = DAG.getConstantPool(CP, TLI.getPointerTy()); 5550 unsigned Alignment = cast<ConstantPoolSDNode>(CPIdx)->getAlignment(); 5551 return DAG.getLoad(VT, dl, DAG.getEntryNode(), CPIdx, 5552 PseudoSourceValue::getConstantPool(), 0, 5553 false, Alignment); 5554 } 5555 5556 if (SplatValue.getNode()) { // Splat of one value? 5557 // Build the shuffle constant vector: <0, 0, 0, 0> 5558 MVT MaskVT = MVT::getIntVectorWithNumElements(NumElems); 5559 SDValue Zero = DAG.getConstant(0, MaskVT.getVectorElementType()); 5560 std::vector<SDValue> ZeroVec(NumElems, Zero); 5561 SDValue SplatMask = DAG.getNode(ISD::BUILD_VECTOR, dl, MaskVT, 5562 &ZeroVec[0], ZeroVec.size()); 5563 5564 // If the target supports VECTOR_SHUFFLE and this shuffle mask, use it. 5565 if (isShuffleLegal(Node->getValueType(0), SplatMask)) { 5566 // Get the splatted value into the low element of a vector register. 5567 SDValue LowValVec = 5568 DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, 5569 Node->getValueType(0), SplatValue); 5570 5571 // Return shuffle(LowValVec, undef, <0,0,0,0>) 5572 return DAG.getNode(ISD::VECTOR_SHUFFLE, dl, 5573 Node->getValueType(0), LowValVec, 5574 DAG.getUNDEF(Node->getValueType(0)), 5575 SplatMask); 5576 } 5577 } 5578 5579 // If there are only two unique elements, we may be able to turn this into a 5580 // vector shuffle. 5581 if (Values.size() == 2) { 5582 // Get the two values in deterministic order. 5583 SDValue Val1 = Node->getOperand(1); 5584 SDValue Val2; 5585 std::map<SDValue, std::vector<unsigned> >::iterator MI = Values.begin(); 5586 if (MI->first != Val1) 5587 Val2 = MI->first; 5588 else 5589 Val2 = (++MI)->first; 5590 5591 // If Val1 is an undef, make sure end ends up as Val2, to ensure that our 5592 // vector shuffle has the undef vector on the RHS. 5593 if (Val1.getOpcode() == ISD::UNDEF) 5594 std::swap(Val1, Val2); 5595 5596 // Build the shuffle constant vector: e.g. <0, 4, 0, 4> 5597 MVT MaskVT = MVT::getIntVectorWithNumElements(NumElems); 5598 MVT MaskEltVT = MaskVT.getVectorElementType(); 5599 std::vector<SDValue> MaskVec(NumElems); 5600 5601 // Set elements of the shuffle mask for Val1. 5602 std::vector<unsigned> &Val1Elts = Values[Val1]; 5603 for (unsigned i = 0, e = Val1Elts.size(); i != e; ++i) 5604 MaskVec[Val1Elts[i]] = DAG.getConstant(0, MaskEltVT); 5605 5606 // Set elements of the shuffle mask for Val2. 5607 std::vector<unsigned> &Val2Elts = Values[Val2]; 5608 for (unsigned i = 0, e = Val2Elts.size(); i != e; ++i) 5609 if (Val2.getOpcode() != ISD::UNDEF) 5610 MaskVec[Val2Elts[i]] = DAG.getConstant(NumElems, MaskEltVT); 5611 else 5612 MaskVec[Val2Elts[i]] = DAG.getUNDEF(MaskEltVT); 5613 5614 SDValue ShuffleMask = DAG.getNode(ISD::BUILD_VECTOR, dl, MaskVT, 5615 &MaskVec[0], MaskVec.size()); 5616 5617 // If the target supports SCALAR_TO_VECTOR and this shuffle mask, use it. 5618 if (TLI.isOperationLegalOrCustom(ISD::SCALAR_TO_VECTOR, 5619 Node->getValueType(0)) && 5620 isShuffleLegal(Node->getValueType(0), ShuffleMask)) { 5621 Val1 = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl,Node->getValueType(0), Val1); 5622 Val2 = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl,Node->getValueType(0), Val2); 5623 SDValue Ops[] = { Val1, Val2, ShuffleMask }; 5624 5625 // Return shuffle(LoValVec, HiValVec, <0,1,0,1>) 5626 return DAG.getNode(ISD::VECTOR_SHUFFLE, dl,Node->getValueType(0), Ops, 3); 5627 } 5628 } 5629 5630 // Otherwise, we can't handle this case efficiently. Allocate a sufficiently 5631 // aligned object on the stack, store each element into it, then load 5632 // the result as a vector. 5633 MVT VT = Node->getValueType(0); 5634 // Create the stack frame object. 5635 SDValue FIPtr = DAG.CreateStackTemporary(VT); 5636 int FI = cast<FrameIndexSDNode>(FIPtr.getNode())->getIndex(); 5637 const Value *SV = PseudoSourceValue::getFixedStack(FI); 5638 5639 // Emit a store of each element to the stack slot. 5640 SmallVector<SDValue, 8> Stores; 5641 unsigned TypeByteSize = Node->getOperand(0).getValueType().getSizeInBits()/8; 5642 // Store (in the right endianness) the elements to memory. 5643 for (unsigned i = 0, e = Node->getNumOperands(); i != e; ++i) { 5644 // Ignore undef elements. 5645 if (Node->getOperand(i).getOpcode() == ISD::UNDEF) continue; 5646 5647 unsigned Offset = TypeByteSize*i; 5648 5649 SDValue Idx = DAG.getConstant(Offset, FIPtr.getValueType()); 5650 Idx = DAG.getNode(ISD::ADD, dl, FIPtr.getValueType(), FIPtr, Idx); 5651 5652 Stores.push_back(DAG.getStore(DAG.getEntryNode(), dl, Node->getOperand(i), 5653 Idx, SV, Offset)); 5654 } 5655 5656 SDValue StoreChain; 5657 if (!Stores.empty()) // Not all undef elements? 5658 StoreChain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, 5659 &Stores[0], Stores.size()); 5660 else 5661 StoreChain = DAG.getEntryNode(); 5662 5663 // Result is a load from the stack slot. 5664 return DAG.getLoad(VT, dl, StoreChain, FIPtr, SV, 0); 5665} 5666 5667void SelectionDAGLegalize::ExpandShiftParts(unsigned NodeOp, 5668 SDValue Op, SDValue Amt, 5669 SDValue &Lo, SDValue &Hi, 5670 DebugLoc dl) { 5671 // Expand the subcomponents. 5672 SDValue LHSL, LHSH; 5673 ExpandOp(Op, LHSL, LHSH); 5674 5675 SDValue Ops[] = { LHSL, LHSH, Amt }; 5676 MVT VT = LHSL.getValueType(); 5677 Lo = DAG.getNode(NodeOp, dl, DAG.getNodeValueTypes(VT, VT), 2, Ops, 3); 5678 Hi = Lo.getValue(1); 5679} 5680 5681 5682/// ExpandShift - Try to find a clever way to expand this shift operation out to 5683/// smaller elements. If we can't find a way that is more efficient than a 5684/// libcall on this target, return false. Otherwise, return true with the 5685/// low-parts expanded into Lo and Hi. 5686bool SelectionDAGLegalize::ExpandShift(unsigned Opc, SDValue Op,SDValue Amt, 5687 SDValue &Lo, SDValue &Hi, 5688 DebugLoc dl) { 5689 assert((Opc == ISD::SHL || Opc == ISD::SRA || Opc == ISD::SRL) && 5690 "This is not a shift!"); 5691 5692 MVT NVT = TLI.getTypeToTransformTo(Op.getValueType()); 5693 SDValue ShAmt = LegalizeOp(Amt); 5694 MVT ShTy = ShAmt.getValueType(); 5695 unsigned ShBits = ShTy.getSizeInBits(); 5696 unsigned VTBits = Op.getValueType().getSizeInBits(); 5697 unsigned NVTBits = NVT.getSizeInBits(); 5698 5699 // Handle the case when Amt is an immediate. 5700 if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Amt.getNode())) { 5701 unsigned Cst = CN->getZExtValue(); 5702 // Expand the incoming operand to be shifted, so that we have its parts 5703 SDValue InL, InH; 5704 ExpandOp(Op, InL, InH); 5705 switch(Opc) { 5706 case ISD::SHL: 5707 if (Cst > VTBits) { 5708 Lo = DAG.getConstant(0, NVT); 5709 Hi = DAG.getConstant(0, NVT); 5710 } else if (Cst > NVTBits) { 5711 Lo = DAG.getConstant(0, NVT); 5712 Hi = DAG.getNode(ISD::SHL, dl, 5713 NVT, InL, DAG.getConstant(Cst-NVTBits,ShTy)); 5714 } else if (Cst == NVTBits) { 5715 Lo = DAG.getConstant(0, NVT); 5716 Hi = InL; 5717 } else { 5718 Lo = DAG.getNode(ISD::SHL, dl, NVT, InL, DAG.getConstant(Cst, ShTy)); 5719 Hi = DAG.getNode(ISD::OR, dl, NVT, 5720 DAG.getNode(ISD::SHL, dl, NVT, InH, DAG.getConstant(Cst, ShTy)), 5721 DAG.getNode(ISD::SRL, dl, NVT, InL, 5722 DAG.getConstant(NVTBits-Cst, ShTy))); 5723 } 5724 return true; 5725 case ISD::SRL: 5726 if (Cst > VTBits) { 5727 Lo = DAG.getConstant(0, NVT); 5728 Hi = DAG.getConstant(0, NVT); 5729 } else if (Cst > NVTBits) { 5730 Lo = DAG.getNode(ISD::SRL, dl, NVT, 5731 InH, DAG.getConstant(Cst-NVTBits,ShTy)); 5732 Hi = DAG.getConstant(0, NVT); 5733 } else if (Cst == NVTBits) { 5734 Lo = InH; 5735 Hi = DAG.getConstant(0, NVT); 5736 } else { 5737 Lo = DAG.getNode(ISD::OR, dl, NVT, 5738 DAG.getNode(ISD::SRL, dl, NVT, InL, DAG.getConstant(Cst, ShTy)), 5739 DAG.getNode(ISD::SHL, dl, NVT, InH, 5740 DAG.getConstant(NVTBits-Cst, ShTy))); 5741 Hi = DAG.getNode(ISD::SRL, dl, NVT, InH, DAG.getConstant(Cst, ShTy)); 5742 } 5743 return true; 5744 case ISD::SRA: 5745 if (Cst > VTBits) { 5746 Hi = Lo = DAG.getNode(ISD::SRA, dl, NVT, InH, 5747 DAG.getConstant(NVTBits-1, ShTy)); 5748 } else if (Cst > NVTBits) { 5749 Lo = DAG.getNode(ISD::SRA, dl, NVT, InH, 5750 DAG.getConstant(Cst-NVTBits, ShTy)); 5751 Hi = DAG.getNode(ISD::SRA, dl, NVT, InH, 5752 DAG.getConstant(NVTBits-1, ShTy)); 5753 } else if (Cst == NVTBits) { 5754 Lo = InH; 5755 Hi = DAG.getNode(ISD::SRA, dl, NVT, InH, 5756 DAG.getConstant(NVTBits-1, ShTy)); 5757 } else { 5758 Lo = DAG.getNode(ISD::OR, dl, NVT, 5759 DAG.getNode(ISD::SRL, dl, NVT, InL, DAG.getConstant(Cst, ShTy)), 5760 DAG.getNode(ISD::SHL, dl, 5761 NVT, InH, DAG.getConstant(NVTBits-Cst, ShTy))); 5762 Hi = DAG.getNode(ISD::SRA, dl, NVT, InH, DAG.getConstant(Cst, ShTy)); 5763 } 5764 return true; 5765 } 5766 } 5767 5768 // Okay, the shift amount isn't constant. However, if we can tell that it is 5769 // >= 32 or < 32, we can still simplify it, without knowing the actual value. 5770 APInt Mask = APInt::getHighBitsSet(ShBits, ShBits - Log2_32(NVTBits)); 5771 APInt KnownZero, KnownOne; 5772 DAG.ComputeMaskedBits(Amt, Mask, KnownZero, KnownOne); 5773 5774 // If we know that if any of the high bits of the shift amount are one, then 5775 // we can do this as a couple of simple shifts. 5776 if (KnownOne.intersects(Mask)) { 5777 // Mask out the high bit, which we know is set. 5778 Amt = DAG.getNode(ISD::AND, dl, Amt.getValueType(), Amt, 5779 DAG.getConstant(~Mask, Amt.getValueType())); 5780 5781 // Expand the incoming operand to be shifted, so that we have its parts 5782 SDValue InL, InH; 5783 ExpandOp(Op, InL, InH); 5784 switch(Opc) { 5785 case ISD::SHL: 5786 Lo = DAG.getConstant(0, NVT); // Low part is zero. 5787 Hi = DAG.getNode(ISD::SHL, dl, NVT, InL, Amt); // High part from Lo part. 5788 return true; 5789 case ISD::SRL: 5790 Hi = DAG.getConstant(0, NVT); // Hi part is zero. 5791 Lo = DAG.getNode(ISD::SRL, dl, NVT, InH, Amt); // Lo part from Hi part. 5792 return true; 5793 case ISD::SRA: 5794 Hi = DAG.getNode(ISD::SRA, dl, NVT, InH, // Sign extend high part. 5795 DAG.getConstant(NVTBits-1, Amt.getValueType())); 5796 Lo = DAG.getNode(ISD::SRA, dl, NVT, InH, Amt); // Lo part from Hi part. 5797 return true; 5798 } 5799 } 5800 5801 // If we know that the high bits of the shift amount are all zero, then we can 5802 // do this as a couple of simple shifts. 5803 if ((KnownZero & Mask) == Mask) { 5804 // Compute 32-amt. 5805 SDValue Amt2 = DAG.getNode(ISD::SUB, dl, Amt.getValueType(), 5806 DAG.getConstant(NVTBits, Amt.getValueType()), 5807 Amt); 5808 5809 // Expand the incoming operand to be shifted, so that we have its parts 5810 SDValue InL, InH; 5811 ExpandOp(Op, InL, InH); 5812 switch(Opc) { 5813 case ISD::SHL: 5814 Lo = DAG.getNode(ISD::SHL, dl, NVT, InL, Amt); 5815 Hi = DAG.getNode(ISD::OR, dl, NVT, 5816 DAG.getNode(ISD::SHL, dl, NVT, InH, Amt), 5817 DAG.getNode(ISD::SRL, dl, NVT, InL, Amt2)); 5818 return true; 5819 case ISD::SRL: 5820 Hi = DAG.getNode(ISD::SRL, dl, NVT, InH, Amt); 5821 Lo = DAG.getNode(ISD::OR, dl, NVT, 5822 DAG.getNode(ISD::SRL, dl, NVT, InL, Amt), 5823 DAG.getNode(ISD::SHL, dl, NVT, InH, Amt2)); 5824 return true; 5825 case ISD::SRA: 5826 Hi = DAG.getNode(ISD::SRA, dl, NVT, InH, Amt); 5827 Lo = DAG.getNode(ISD::OR, dl, NVT, 5828 DAG.getNode(ISD::SRL, dl, NVT, InL, Amt), 5829 DAG.getNode(ISD::SHL, dl, NVT, InH, Amt2)); 5830 return true; 5831 } 5832 } 5833 5834 return false; 5835} 5836 5837 5838// ExpandLibCall - Expand a node into a call to a libcall. If the result value 5839// does not fit into a register, return the lo part and set the hi part to the 5840// by-reg argument. If it does fit into a single register, return the result 5841// and leave the Hi part unset. 5842SDValue SelectionDAGLegalize::ExpandLibCall(RTLIB::Libcall LC, SDNode *Node, 5843 bool isSigned, SDValue &Hi) { 5844 assert(!IsLegalizingCall && "Cannot overlap legalization of calls!"); 5845 // The input chain to this libcall is the entry node of the function. 5846 // Legalizing the call will automatically add the previous call to the 5847 // dependence. 5848 SDValue InChain = DAG.getEntryNode(); 5849 5850 TargetLowering::ArgListTy Args; 5851 TargetLowering::ArgListEntry Entry; 5852 for (unsigned i = 0, e = Node->getNumOperands(); i != e; ++i) { 5853 MVT ArgVT = Node->getOperand(i).getValueType(); 5854 const Type *ArgTy = ArgVT.getTypeForMVT(); 5855 Entry.Node = Node->getOperand(i); Entry.Ty = ArgTy; 5856 Entry.isSExt = isSigned; 5857 Entry.isZExt = !isSigned; 5858 Args.push_back(Entry); 5859 } 5860 SDValue Callee = DAG.getExternalSymbol(TLI.getLibcallName(LC), 5861 TLI.getPointerTy()); 5862 5863 // Splice the libcall in wherever FindInputOutputChains tells us to. 5864 const Type *RetTy = Node->getValueType(0).getTypeForMVT(); 5865 std::pair<SDValue,SDValue> CallInfo = 5866 TLI.LowerCallTo(InChain, RetTy, isSigned, !isSigned, false, false, 5867 CallingConv::C, false, Callee, Args, DAG, 5868 Node->getDebugLoc()); 5869 5870 // Legalize the call sequence, starting with the chain. This will advance 5871 // the LastCALLSEQ_END to the legalized version of the CALLSEQ_END node that 5872 // was added by LowerCallTo (guaranteeing proper serialization of calls). 5873 LegalizeOp(CallInfo.second); 5874 SDValue Result; 5875 switch (getTypeAction(CallInfo.first.getValueType())) { 5876 default: assert(0 && "Unknown thing"); 5877 case Legal: 5878 Result = CallInfo.first; 5879 break; 5880 case Expand: 5881 ExpandOp(CallInfo.first, Result, Hi); 5882 break; 5883 } 5884 return Result; 5885} 5886 5887/// LegalizeINT_TO_FP - Legalize a [US]INT_TO_FP operation. 5888/// 5889SDValue SelectionDAGLegalize:: 5890LegalizeINT_TO_FP(SDValue Result, bool isSigned, MVT DestTy, SDValue Op, 5891 DebugLoc dl) { 5892 bool isCustom = false; 5893 SDValue Tmp1; 5894 switch (getTypeAction(Op.getValueType())) { 5895 case Legal: 5896 switch (TLI.getOperationAction(isSigned ? ISD::SINT_TO_FP : ISD::UINT_TO_FP, 5897 Op.getValueType())) { 5898 default: assert(0 && "Unknown operation action!"); 5899 case TargetLowering::Custom: 5900 isCustom = true; 5901 // FALLTHROUGH 5902 case TargetLowering::Legal: 5903 Tmp1 = LegalizeOp(Op); 5904 if (Result.getNode()) 5905 Result = DAG.UpdateNodeOperands(Result, Tmp1); 5906 else 5907 Result = DAG.getNode(isSigned ? ISD::SINT_TO_FP : ISD::UINT_TO_FP, dl, 5908 DestTy, Tmp1); 5909 if (isCustom) { 5910 Tmp1 = TLI.LowerOperation(Result, DAG); 5911 if (Tmp1.getNode()) Result = Tmp1; 5912 } 5913 break; 5914 case TargetLowering::Expand: 5915 Result = ExpandLegalINT_TO_FP(isSigned, LegalizeOp(Op), DestTy, dl); 5916 break; 5917 case TargetLowering::Promote: 5918 Result = PromoteLegalINT_TO_FP(LegalizeOp(Op), DestTy, isSigned, dl); 5919 break; 5920 } 5921 break; 5922 case Expand: 5923 Result = ExpandIntToFP(isSigned, DestTy, Op, dl) ; 5924 break; 5925 case Promote: 5926 Tmp1 = PromoteOp(Op); 5927 if (isSigned) { 5928 Tmp1 = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, Tmp1.getValueType(), 5929 Tmp1, DAG.getValueType(Op.getValueType())); 5930 } else { 5931 Tmp1 = DAG.getZeroExtendInReg(Tmp1, dl, 5932 Op.getValueType()); 5933 } 5934 if (Result.getNode()) 5935 Result = DAG.UpdateNodeOperands(Result, Tmp1); 5936 else 5937 Result = DAG.getNode(isSigned ? ISD::SINT_TO_FP : ISD::UINT_TO_FP, dl, 5938 DestTy, Tmp1); 5939 Result = LegalizeOp(Result); // The 'op' is not necessarily legal! 5940 break; 5941 } 5942 return Result; 5943} 5944 5945/// ExpandIntToFP - Expand a [US]INT_TO_FP operation. 5946/// 5947SDValue SelectionDAGLegalize:: 5948ExpandIntToFP(bool isSigned, MVT DestTy, SDValue Source, DebugLoc dl) { 5949 MVT SourceVT = Source.getValueType(); 5950 bool ExpandSource = getTypeAction(SourceVT) == Expand; 5951 5952 // Expand unsupported int-to-fp vector casts by unrolling them. 5953 if (DestTy.isVector()) { 5954 if (!ExpandSource) 5955 return LegalizeOp(UnrollVectorOp(Source)); 5956 MVT DestEltTy = DestTy.getVectorElementType(); 5957 if (DestTy.getVectorNumElements() == 1) { 5958 SDValue Scalar = ScalarizeVectorOp(Source); 5959 SDValue Result = LegalizeINT_TO_FP(SDValue(), isSigned, 5960 DestEltTy, Scalar, dl); 5961 return DAG.getNode(ISD::BUILD_VECTOR, dl, DestTy, Result); 5962 } 5963 SDValue Lo, Hi; 5964 SplitVectorOp(Source, Lo, Hi); 5965 MVT SplitDestTy = MVT::getVectorVT(DestEltTy, 5966 DestTy.getVectorNumElements() / 2); 5967 SDValue LoResult = LegalizeINT_TO_FP(SDValue(), isSigned, SplitDestTy, 5968 Lo, dl); 5969 SDValue HiResult = LegalizeINT_TO_FP(SDValue(), isSigned, SplitDestTy, 5970 Hi, dl); 5971 return LegalizeOp(DAG.getNode(ISD::CONCAT_VECTORS, dl, DestTy, LoResult, 5972 HiResult)); 5973 } 5974 5975 // Special case for i32 source to take advantage of UINTTOFP_I32_F32, etc. 5976 if (!isSigned && SourceVT != MVT::i32) { 5977 // The integer value loaded will be incorrectly if the 'sign bit' of the 5978 // incoming integer is set. To handle this, we dynamically test to see if 5979 // it is set, and, if so, add a fudge factor. 5980 SDValue Hi; 5981 if (ExpandSource) { 5982 SDValue Lo; 5983 ExpandOp(Source, Lo, Hi); 5984 Source = DAG.getNode(ISD::BUILD_PAIR, dl, SourceVT, Lo, Hi); 5985 } else { 5986 // The comparison for the sign bit will use the entire operand. 5987 Hi = Source; 5988 } 5989 5990 // Check to see if the target has a custom way to lower this. If so, use 5991 // it. (Note we've already expanded the operand in this case.) 5992 switch (TLI.getOperationAction(ISD::UINT_TO_FP, SourceVT)) { 5993 default: assert(0 && "This action not implemented for this operation!"); 5994 case TargetLowering::Legal: 5995 case TargetLowering::Expand: 5996 break; // This case is handled below. 5997 case TargetLowering::Custom: { 5998 SDValue NV = TLI.LowerOperation(DAG.getNode(ISD::UINT_TO_FP, dl, DestTy, 5999 Source), DAG); 6000 if (NV.getNode()) 6001 return LegalizeOp(NV); 6002 break; // The target decided this was legal after all 6003 } 6004 } 6005 6006 // If this is unsigned, and not supported, first perform the conversion to 6007 // signed, then adjust the result if the sign bit is set. 6008 SDValue SignedConv = ExpandIntToFP(true, DestTy, Source, dl); 6009 6010 SDValue SignSet = DAG.getSetCC(dl, 6011 TLI.getSetCCResultType(Hi.getValueType()), 6012 Hi, DAG.getConstant(0, Hi.getValueType()), 6013 ISD::SETLT); 6014 SDValue Zero = DAG.getIntPtrConstant(0), Four = DAG.getIntPtrConstant(4); 6015 SDValue CstOffset = DAG.getNode(ISD::SELECT, dl, Zero.getValueType(), 6016 SignSet, Four, Zero); 6017 uint64_t FF = 0x5f800000ULL; 6018 if (TLI.isLittleEndian()) FF <<= 32; 6019 Constant *FudgeFactor = ConstantInt::get(Type::Int64Ty, FF); 6020 6021 SDValue CPIdx = DAG.getConstantPool(FudgeFactor, TLI.getPointerTy()); 6022 unsigned Alignment = cast<ConstantPoolSDNode>(CPIdx)->getAlignment(); 6023 CPIdx = DAG.getNode(ISD::ADD, dl, TLI.getPointerTy(), CPIdx, CstOffset); 6024 Alignment = std::min(Alignment, 4u); 6025 SDValue FudgeInReg; 6026 if (DestTy == MVT::f32) 6027 FudgeInReg = DAG.getLoad(MVT::f32, dl, DAG.getEntryNode(), CPIdx, 6028 PseudoSourceValue::getConstantPool(), 0, 6029 false, Alignment); 6030 else if (DestTy.bitsGT(MVT::f32)) 6031 // FIXME: Avoid the extend by construction the right constantpool? 6032 FudgeInReg = DAG.getExtLoad(ISD::EXTLOAD, dl, DestTy, DAG.getEntryNode(), 6033 CPIdx, 6034 PseudoSourceValue::getConstantPool(), 0, 6035 MVT::f32, false, Alignment); 6036 else 6037 assert(0 && "Unexpected conversion"); 6038 6039 MVT SCVT = SignedConv.getValueType(); 6040 if (SCVT != DestTy) { 6041 // Destination type needs to be expanded as well. The FADD now we are 6042 // constructing will be expanded into a libcall. 6043 if (SCVT.getSizeInBits() != DestTy.getSizeInBits()) { 6044 assert(SCVT.getSizeInBits() * 2 == DestTy.getSizeInBits()); 6045 SignedConv = DAG.getNode(ISD::BUILD_PAIR, dl, DestTy, 6046 SignedConv, SignedConv.getValue(1)); 6047 } 6048 SignedConv = DAG.getNode(ISD::BIT_CONVERT, dl, DestTy, SignedConv); 6049 } 6050 return DAG.getNode(ISD::FADD, dl, DestTy, SignedConv, FudgeInReg); 6051 } 6052 6053 // Check to see if the target has a custom way to lower this. If so, use it. 6054 switch (TLI.getOperationAction(ISD::SINT_TO_FP, SourceVT)) { 6055 default: assert(0 && "This action not implemented for this operation!"); 6056 case TargetLowering::Legal: 6057 case TargetLowering::Expand: 6058 break; // This case is handled below. 6059 case TargetLowering::Custom: { 6060 SDValue NV = TLI.LowerOperation(DAG.getNode(ISD::SINT_TO_FP, dl, DestTy, 6061 Source), DAG); 6062 if (NV.getNode()) 6063 return LegalizeOp(NV); 6064 break; // The target decided this was legal after all 6065 } 6066 } 6067 6068 // Expand the source, then glue it back together for the call. We must expand 6069 // the source in case it is shared (this pass of legalize must traverse it). 6070 if (ExpandSource) { 6071 SDValue SrcLo, SrcHi; 6072 ExpandOp(Source, SrcLo, SrcHi); 6073 Source = DAG.getNode(ISD::BUILD_PAIR, dl, SourceVT, SrcLo, SrcHi); 6074 } 6075 6076 RTLIB::Libcall LC = isSigned ? 6077 RTLIB::getSINTTOFP(SourceVT, DestTy) : 6078 RTLIB::getUINTTOFP(SourceVT, DestTy); 6079 assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unknown int value type"); 6080 6081 Source = DAG.getNode(ISD::SINT_TO_FP, dl, DestTy, Source); 6082 SDValue HiPart; 6083 SDValue Result = ExpandLibCall(LC, Source.getNode(), isSigned, HiPart); 6084 if (Result.getValueType() != DestTy && HiPart.getNode()) 6085 Result = DAG.getNode(ISD::BUILD_PAIR, dl, DestTy, Result, HiPart); 6086 return Result; 6087} 6088 6089/// ExpandLegalINT_TO_FP - This function is responsible for legalizing a 6090/// INT_TO_FP operation of the specified operand when the target requests that 6091/// we expand it. At this point, we know that the result and operand types are 6092/// legal for the target. 6093SDValue SelectionDAGLegalize::ExpandLegalINT_TO_FP(bool isSigned, 6094 SDValue Op0, 6095 MVT DestVT, 6096 DebugLoc dl) { 6097 if (Op0.getValueType() == MVT::i32) { 6098 // simple 32-bit [signed|unsigned] integer to float/double expansion 6099 6100 // Get the stack frame index of a 8 byte buffer. 6101 SDValue StackSlot = DAG.CreateStackTemporary(MVT::f64); 6102 6103 // word offset constant for Hi/Lo address computation 6104 SDValue WordOff = DAG.getConstant(sizeof(int), TLI.getPointerTy()); 6105 // set up Hi and Lo (into buffer) address based on endian 6106 SDValue Hi = StackSlot; 6107 SDValue Lo = DAG.getNode(ISD::ADD, dl, 6108 TLI.getPointerTy(), StackSlot,WordOff); 6109 if (TLI.isLittleEndian()) 6110 std::swap(Hi, Lo); 6111 6112 // if signed map to unsigned space 6113 SDValue Op0Mapped; 6114 if (isSigned) { 6115 // constant used to invert sign bit (signed to unsigned mapping) 6116 SDValue SignBit = DAG.getConstant(0x80000000u, MVT::i32); 6117 Op0Mapped = DAG.getNode(ISD::XOR, dl, MVT::i32, Op0, SignBit); 6118 } else { 6119 Op0Mapped = Op0; 6120 } 6121 // store the lo of the constructed double - based on integer input 6122 SDValue Store1 = DAG.getStore(DAG.getEntryNode(), dl, 6123 Op0Mapped, Lo, NULL, 0); 6124 // initial hi portion of constructed double 6125 SDValue InitialHi = DAG.getConstant(0x43300000u, MVT::i32); 6126 // store the hi of the constructed double - biased exponent 6127 SDValue Store2=DAG.getStore(Store1, dl, InitialHi, Hi, NULL, 0); 6128 // load the constructed double 6129 SDValue Load = DAG.getLoad(MVT::f64, dl, Store2, StackSlot, NULL, 0); 6130 // FP constant to bias correct the final result 6131 SDValue Bias = DAG.getConstantFP(isSigned ? 6132 BitsToDouble(0x4330000080000000ULL) 6133 : BitsToDouble(0x4330000000000000ULL), 6134 MVT::f64); 6135 // subtract the bias 6136 SDValue Sub = DAG.getNode(ISD::FSUB, dl, MVT::f64, Load, Bias); 6137 // final result 6138 SDValue Result; 6139 // handle final rounding 6140 if (DestVT == MVT::f64) { 6141 // do nothing 6142 Result = Sub; 6143 } else if (DestVT.bitsLT(MVT::f64)) { 6144 Result = DAG.getNode(ISD::FP_ROUND, dl, DestVT, Sub, 6145 DAG.getIntPtrConstant(0)); 6146 } else if (DestVT.bitsGT(MVT::f64)) { 6147 Result = DAG.getNode(ISD::FP_EXTEND, dl, DestVT, Sub); 6148 } 6149 return Result; 6150 } 6151 assert(!isSigned && "Legalize cannot Expand SINT_TO_FP for i64 yet"); 6152 SDValue Tmp1 = DAG.getNode(ISD::SINT_TO_FP, dl, DestVT, Op0); 6153 6154 SDValue SignSet = DAG.getSetCC(dl, TLI.getSetCCResultType(Op0.getValueType()), 6155 Op0, DAG.getConstant(0, Op0.getValueType()), 6156 ISD::SETLT); 6157 SDValue Zero = DAG.getIntPtrConstant(0), Four = DAG.getIntPtrConstant(4); 6158 SDValue CstOffset = DAG.getNode(ISD::SELECT, dl, Zero.getValueType(), 6159 SignSet, Four, Zero); 6160 6161 // If the sign bit of the integer is set, the large number will be treated 6162 // as a negative number. To counteract this, the dynamic code adds an 6163 // offset depending on the data type. 6164 uint64_t FF; 6165 switch (Op0.getValueType().getSimpleVT()) { 6166 default: assert(0 && "Unsupported integer type!"); 6167 case MVT::i8 : FF = 0x43800000ULL; break; // 2^8 (as a float) 6168 case MVT::i16: FF = 0x47800000ULL; break; // 2^16 (as a float) 6169 case MVT::i32: FF = 0x4F800000ULL; break; // 2^32 (as a float) 6170 case MVT::i64: FF = 0x5F800000ULL; break; // 2^64 (as a float) 6171 } 6172 if (TLI.isLittleEndian()) FF <<= 32; 6173 Constant *FudgeFactor = ConstantInt::get(Type::Int64Ty, FF); 6174 6175 SDValue CPIdx = DAG.getConstantPool(FudgeFactor, TLI.getPointerTy()); 6176 unsigned Alignment = cast<ConstantPoolSDNode>(CPIdx)->getAlignment(); 6177 CPIdx = DAG.getNode(ISD::ADD, dl, TLI.getPointerTy(), CPIdx, CstOffset); 6178 Alignment = std::min(Alignment, 4u); 6179 SDValue FudgeInReg; 6180 if (DestVT == MVT::f32) 6181 FudgeInReg = DAG.getLoad(MVT::f32, dl, DAG.getEntryNode(), CPIdx, 6182 PseudoSourceValue::getConstantPool(), 0, 6183 false, Alignment); 6184 else { 6185 FudgeInReg = 6186 LegalizeOp(DAG.getExtLoad(ISD::EXTLOAD, dl, DestVT, 6187 DAG.getEntryNode(), CPIdx, 6188 PseudoSourceValue::getConstantPool(), 0, 6189 MVT::f32, false, Alignment)); 6190 } 6191 6192 return DAG.getNode(ISD::FADD, dl, DestVT, Tmp1, FudgeInReg); 6193} 6194 6195/// PromoteLegalINT_TO_FP - This function is responsible for legalizing a 6196/// *INT_TO_FP operation of the specified operand when the target requests that 6197/// we promote it. At this point, we know that the result and operand types are 6198/// legal for the target, and that there is a legal UINT_TO_FP or SINT_TO_FP 6199/// operation that takes a larger input. 6200SDValue SelectionDAGLegalize::PromoteLegalINT_TO_FP(SDValue LegalOp, 6201 MVT DestVT, 6202 bool isSigned, 6203 DebugLoc dl) { 6204 // First step, figure out the appropriate *INT_TO_FP operation to use. 6205 MVT NewInTy = LegalOp.getValueType(); 6206 6207 unsigned OpToUse = 0; 6208 6209 // Scan for the appropriate larger type to use. 6210 while (1) { 6211 NewInTy = (MVT::SimpleValueType)(NewInTy.getSimpleVT()+1); 6212 assert(NewInTy.isInteger() && "Ran out of possibilities!"); 6213 6214 // If the target supports SINT_TO_FP of this type, use it. 6215 switch (TLI.getOperationAction(ISD::SINT_TO_FP, NewInTy)) { 6216 default: break; 6217 case TargetLowering::Legal: 6218 if (!TLI.isTypeLegal(NewInTy)) 6219 break; // Can't use this datatype. 6220 // FALL THROUGH. 6221 case TargetLowering::Custom: 6222 OpToUse = ISD::SINT_TO_FP; 6223 break; 6224 } 6225 if (OpToUse) break; 6226 if (isSigned) continue; 6227 6228 // If the target supports UINT_TO_FP of this type, use it. 6229 switch (TLI.getOperationAction(ISD::UINT_TO_FP, NewInTy)) { 6230 default: break; 6231 case TargetLowering::Legal: 6232 if (!TLI.isTypeLegal(NewInTy)) 6233 break; // Can't use this datatype. 6234 // FALL THROUGH. 6235 case TargetLowering::Custom: 6236 OpToUse = ISD::UINT_TO_FP; 6237 break; 6238 } 6239 if (OpToUse) break; 6240 6241 // Otherwise, try a larger type. 6242 } 6243 6244 // Okay, we found the operation and type to use. Zero extend our input to the 6245 // desired type then run the operation on it. 6246 return DAG.getNode(OpToUse, dl, DestVT, 6247 DAG.getNode(isSigned ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND, 6248 dl, NewInTy, LegalOp)); 6249} 6250 6251/// PromoteLegalFP_TO_INT - This function is responsible for legalizing a 6252/// FP_TO_*INT operation of the specified operand when the target requests that 6253/// we promote it. At this point, we know that the result and operand types are 6254/// legal for the target, and that there is a legal FP_TO_UINT or FP_TO_SINT 6255/// operation that returns a larger result. 6256SDValue SelectionDAGLegalize::PromoteLegalFP_TO_INT(SDValue LegalOp, 6257 MVT DestVT, 6258 bool isSigned, 6259 DebugLoc dl) { 6260 // First step, figure out the appropriate FP_TO*INT operation to use. 6261 MVT NewOutTy = DestVT; 6262 6263 unsigned OpToUse = 0; 6264 6265 // Scan for the appropriate larger type to use. 6266 while (1) { 6267 NewOutTy = (MVT::SimpleValueType)(NewOutTy.getSimpleVT()+1); 6268 assert(NewOutTy.isInteger() && "Ran out of possibilities!"); 6269 6270 // If the target supports FP_TO_SINT returning this type, use it. 6271 switch (TLI.getOperationAction(ISD::FP_TO_SINT, NewOutTy)) { 6272 default: break; 6273 case TargetLowering::Legal: 6274 if (!TLI.isTypeLegal(NewOutTy)) 6275 break; // Can't use this datatype. 6276 // FALL THROUGH. 6277 case TargetLowering::Custom: 6278 OpToUse = ISD::FP_TO_SINT; 6279 break; 6280 } 6281 if (OpToUse) break; 6282 6283 // If the target supports FP_TO_UINT of this type, use it. 6284 switch (TLI.getOperationAction(ISD::FP_TO_UINT, NewOutTy)) { 6285 default: break; 6286 case TargetLowering::Legal: 6287 if (!TLI.isTypeLegal(NewOutTy)) 6288 break; // Can't use this datatype. 6289 // FALL THROUGH. 6290 case TargetLowering::Custom: 6291 OpToUse = ISD::FP_TO_UINT; 6292 break; 6293 } 6294 if (OpToUse) break; 6295 6296 // Otherwise, try a larger type. 6297 } 6298 6299 6300 // Okay, we found the operation and type to use. 6301 SDValue Operation = DAG.getNode(OpToUse, dl, NewOutTy, LegalOp); 6302 6303 // If the operation produces an invalid type, it must be custom lowered. Use 6304 // the target lowering hooks to expand it. Just keep the low part of the 6305 // expanded operation, we know that we're truncating anyway. 6306 if (getTypeAction(NewOutTy) == Expand) { 6307 SmallVector<SDValue, 2> Results; 6308 TLI.ReplaceNodeResults(Operation.getNode(), Results, DAG); 6309 assert(Results.size() == 1 && "Incorrect FP_TO_XINT lowering!"); 6310 Operation = Results[0]; 6311 } 6312 6313 // Truncate the result of the extended FP_TO_*INT operation to the desired 6314 // size. 6315 return DAG.getNode(ISD::TRUNCATE, dl, DestVT, Operation); 6316} 6317 6318/// ExpandBSWAP - Open code the operations for BSWAP of the specified operation. 6319/// 6320SDValue SelectionDAGLegalize::ExpandBSWAP(SDValue Op, DebugLoc dl) { 6321 MVT VT = Op.getValueType(); 6322 MVT SHVT = TLI.getShiftAmountTy(); 6323 SDValue Tmp1, Tmp2, Tmp3, Tmp4, Tmp5, Tmp6, Tmp7, Tmp8; 6324 switch (VT.getSimpleVT()) { 6325 default: assert(0 && "Unhandled Expand type in BSWAP!"); abort(); 6326 case MVT::i16: 6327 Tmp2 = DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(8, SHVT)); 6328 Tmp1 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(8, SHVT)); 6329 return DAG.getNode(ISD::OR, dl, VT, Tmp1, Tmp2); 6330 case MVT::i32: 6331 Tmp4 = DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(24, SHVT)); 6332 Tmp3 = DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(8, SHVT)); 6333 Tmp2 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(8, SHVT)); 6334 Tmp1 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(24, SHVT)); 6335 Tmp3 = DAG.getNode(ISD::AND, dl, VT, Tmp3, DAG.getConstant(0xFF0000, VT)); 6336 Tmp2 = DAG.getNode(ISD::AND, dl, VT, Tmp2, DAG.getConstant(0xFF00, VT)); 6337 Tmp4 = DAG.getNode(ISD::OR, dl, VT, Tmp4, Tmp3); 6338 Tmp2 = DAG.getNode(ISD::OR, dl, VT, Tmp2, Tmp1); 6339 return DAG.getNode(ISD::OR, dl, VT, Tmp4, Tmp2); 6340 case MVT::i64: 6341 Tmp8 = DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(56, SHVT)); 6342 Tmp7 = DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(40, SHVT)); 6343 Tmp6 = DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(24, SHVT)); 6344 Tmp5 = DAG.getNode(ISD::SHL, dl, VT, Op, DAG.getConstant(8, SHVT)); 6345 Tmp4 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(8, SHVT)); 6346 Tmp3 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(24, SHVT)); 6347 Tmp2 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(40, SHVT)); 6348 Tmp1 = DAG.getNode(ISD::SRL, dl, VT, Op, DAG.getConstant(56, SHVT)); 6349 Tmp7 = DAG.getNode(ISD::AND, dl, VT, Tmp7, DAG.getConstant(255ULL<<48, VT)); 6350 Tmp6 = DAG.getNode(ISD::AND, dl, VT, Tmp6, DAG.getConstant(255ULL<<40, VT)); 6351 Tmp5 = DAG.getNode(ISD::AND, dl, VT, Tmp5, DAG.getConstant(255ULL<<32, VT)); 6352 Tmp4 = DAG.getNode(ISD::AND, dl, VT, Tmp4, DAG.getConstant(255ULL<<24, VT)); 6353 Tmp3 = DAG.getNode(ISD::AND, dl, VT, Tmp3, DAG.getConstant(255ULL<<16, VT)); 6354 Tmp2 = DAG.getNode(ISD::AND, dl, VT, Tmp2, DAG.getConstant(255ULL<<8 , VT)); 6355 Tmp8 = DAG.getNode(ISD::OR, dl, VT, Tmp8, Tmp7); 6356 Tmp6 = DAG.getNode(ISD::OR, dl, VT, Tmp6, Tmp5); 6357 Tmp4 = DAG.getNode(ISD::OR, dl, VT, Tmp4, Tmp3); 6358 Tmp2 = DAG.getNode(ISD::OR, dl, VT, Tmp2, Tmp1); 6359 Tmp8 = DAG.getNode(ISD::OR, dl, VT, Tmp8, Tmp6); 6360 Tmp4 = DAG.getNode(ISD::OR, dl, VT, Tmp4, Tmp2); 6361 return DAG.getNode(ISD::OR, dl, VT, Tmp8, Tmp4); 6362 } 6363} 6364 6365/// ExpandBitCount - Expand the specified bitcount instruction into operations. 6366/// 6367SDValue SelectionDAGLegalize::ExpandBitCount(unsigned Opc, SDValue Op, 6368 DebugLoc dl) { 6369 switch (Opc) { 6370 default: assert(0 && "Cannot expand this yet!"); 6371 case ISD::CTPOP: { 6372 static const uint64_t mask[6] = { 6373 0x5555555555555555ULL, 0x3333333333333333ULL, 6374 0x0F0F0F0F0F0F0F0FULL, 0x00FF00FF00FF00FFULL, 6375 0x0000FFFF0000FFFFULL, 0x00000000FFFFFFFFULL 6376 }; 6377 MVT VT = Op.getValueType(); 6378 MVT ShVT = TLI.getShiftAmountTy(); 6379 unsigned len = VT.getSizeInBits(); 6380 for (unsigned i = 0; (1U << i) <= (len / 2); ++i) { 6381 //x = (x & mask[i][len/8]) + (x >> (1 << i) & mask[i][len/8]) 6382 unsigned EltSize = VT.isVector() ? 6383 VT.getVectorElementType().getSizeInBits() : len; 6384 SDValue Tmp2 = DAG.getConstant(APInt(EltSize, mask[i]), VT); 6385 SDValue Tmp3 = DAG.getConstant(1ULL << i, ShVT); 6386 Op = DAG.getNode(ISD::ADD, dl, VT, 6387 DAG.getNode(ISD::AND, dl, VT, Op, Tmp2), 6388 DAG.getNode(ISD::AND, dl, VT, 6389 DAG.getNode(ISD::SRL, dl, VT, Op, Tmp3), 6390 Tmp2)); 6391 } 6392 return Op; 6393 } 6394 case ISD::CTLZ: { 6395 // for now, we do this: 6396 // x = x | (x >> 1); 6397 // x = x | (x >> 2); 6398 // ... 6399 // x = x | (x >>16); 6400 // x = x | (x >>32); // for 64-bit input 6401 // return popcount(~x); 6402 // 6403 // but see also: http://www.hackersdelight.org/HDcode/nlz.cc 6404 MVT VT = Op.getValueType(); 6405 MVT ShVT = TLI.getShiftAmountTy(); 6406 unsigned len = VT.getSizeInBits(); 6407 for (unsigned i = 0; (1U << i) <= (len / 2); ++i) { 6408 SDValue Tmp3 = DAG.getConstant(1ULL << i, ShVT); 6409 Op = DAG.getNode(ISD::OR, dl, VT, Op, 6410 DAG.getNode(ISD::SRL, dl, VT, Op, Tmp3)); 6411 } 6412 Op = DAG.getNOT(dl, Op, VT); 6413 return DAG.getNode(ISD::CTPOP, dl, VT, Op); 6414 } 6415 case ISD::CTTZ: { 6416 // for now, we use: { return popcount(~x & (x - 1)); } 6417 // unless the target has ctlz but not ctpop, in which case we use: 6418 // { return 32 - nlz(~x & (x-1)); } 6419 // see also http://www.hackersdelight.org/HDcode/ntz.cc 6420 MVT VT = Op.getValueType(); 6421 SDValue Tmp3 = DAG.getNode(ISD::AND, dl, VT, 6422 DAG.getNOT(dl, Op, VT), 6423 DAG.getNode(ISD::SUB, dl, VT, Op, 6424 DAG.getConstant(1, VT))); 6425 // If ISD::CTLZ is legal and CTPOP isn't, then do that instead. 6426 if (!TLI.isOperationLegalOrCustom(ISD::CTPOP, VT) && 6427 TLI.isOperationLegalOrCustom(ISD::CTLZ, VT)) 6428 return DAG.getNode(ISD::SUB, dl, VT, 6429 DAG.getConstant(VT.getSizeInBits(), VT), 6430 DAG.getNode(ISD::CTLZ, dl, VT, Tmp3)); 6431 return DAG.getNode(ISD::CTPOP, dl, VT, Tmp3); 6432 } 6433 } 6434} 6435 6436/// ExpandOp - Expand the specified SDValue into its two component pieces 6437/// Lo&Hi. Note that the Op MUST be an expanded type. As a result of this, the 6438/// LegalizedNodes map is filled in for any results that are not expanded, the 6439/// ExpandedNodes map is filled in for any results that are expanded, and the 6440/// Lo/Hi values are returned. 6441void SelectionDAGLegalize::ExpandOp(SDValue Op, SDValue &Lo, SDValue &Hi){ 6442 MVT VT = Op.getValueType(); 6443 MVT NVT = TLI.getTypeToTransformTo(VT); 6444 SDNode *Node = Op.getNode(); 6445 DebugLoc dl = Node->getDebugLoc(); 6446 assert(getTypeAction(VT) == Expand && "Not an expanded type!"); 6447 assert(((NVT.isInteger() && NVT.bitsLT(VT)) || VT.isFloatingPoint() || 6448 VT.isVector()) && "Cannot expand to FP value or to larger int value!"); 6449 6450 // See if we already expanded it. 6451 DenseMap<SDValue, std::pair<SDValue, SDValue> >::iterator I 6452 = ExpandedNodes.find(Op); 6453 if (I != ExpandedNodes.end()) { 6454 Lo = I->second.first; 6455 Hi = I->second.second; 6456 return; 6457 } 6458 6459 switch (Node->getOpcode()) { 6460 case ISD::CopyFromReg: 6461 assert(0 && "CopyFromReg must be legal!"); 6462 case ISD::FP_ROUND_INREG: 6463 if (VT == MVT::ppcf128 && 6464 TLI.getOperationAction(ISD::FP_ROUND_INREG, VT) == 6465 TargetLowering::Custom) { 6466 SDValue SrcLo, SrcHi, Src; 6467 ExpandOp(Op.getOperand(0), SrcLo, SrcHi); 6468 Src = DAG.getNode(ISD::BUILD_PAIR, dl, VT, SrcLo, SrcHi); 6469 SDValue Result = TLI.LowerOperation( 6470 DAG.getNode(ISD::FP_ROUND_INREG, dl, VT, Src, Op.getOperand(1)), DAG); 6471 assert(Result.getNode()->getOpcode() == ISD::BUILD_PAIR); 6472 Lo = Result.getNode()->getOperand(0); 6473 Hi = Result.getNode()->getOperand(1); 6474 break; 6475 } 6476 // fall through 6477 default: 6478#ifndef NDEBUG 6479 cerr << "NODE: "; Node->dump(&DAG); cerr << "\n"; 6480#endif 6481 assert(0 && "Do not know how to expand this operator!"); 6482 abort(); 6483 case ISD::EXTRACT_ELEMENT: 6484 ExpandOp(Node->getOperand(0), Lo, Hi); 6485 if (cast<ConstantSDNode>(Node->getOperand(1))->getZExtValue()) 6486 return ExpandOp(Hi, Lo, Hi); 6487 return ExpandOp(Lo, Lo, Hi); 6488 case ISD::EXTRACT_VECTOR_ELT: 6489 // ExpandEXTRACT_VECTOR_ELT tolerates invalid result types. 6490 Lo = ExpandEXTRACT_VECTOR_ELT(Op); 6491 return ExpandOp(Lo, Lo, Hi); 6492 case ISD::UNDEF: 6493 Lo = DAG.getUNDEF(NVT); 6494 Hi = DAG.getUNDEF(NVT); 6495 break; 6496 case ISD::Constant: { 6497 unsigned NVTBits = NVT.getSizeInBits(); 6498 const APInt &Cst = cast<ConstantSDNode>(Node)->getAPIntValue(); 6499 Lo = DAG.getConstant(APInt(Cst).trunc(NVTBits), NVT); 6500 Hi = DAG.getConstant(Cst.lshr(NVTBits).trunc(NVTBits), NVT); 6501 break; 6502 } 6503 case ISD::ConstantFP: { 6504 ConstantFPSDNode *CFP = cast<ConstantFPSDNode>(Node); 6505 if (CFP->getValueType(0) == MVT::ppcf128) { 6506 APInt api = CFP->getValueAPF().bitcastToAPInt(); 6507 Lo = DAG.getConstantFP(APFloat(APInt(64, 1, &api.getRawData()[1])), 6508 MVT::f64); 6509 Hi = DAG.getConstantFP(APFloat(APInt(64, 1, &api.getRawData()[0])), 6510 MVT::f64); 6511 break; 6512 } 6513 Lo = ExpandConstantFP(CFP, false, DAG, TLI); 6514 if (getTypeAction(Lo.getValueType()) == Expand) 6515 ExpandOp(Lo, Lo, Hi); 6516 break; 6517 } 6518 case ISD::BUILD_PAIR: 6519 // Return the operands. 6520 Lo = Node->getOperand(0); 6521 Hi = Node->getOperand(1); 6522 break; 6523 6524 case ISD::MERGE_VALUES: 6525 if (Node->getNumValues() == 1) { 6526 ExpandOp(Op.getOperand(0), Lo, Hi); 6527 break; 6528 } 6529 // FIXME: For now only expand i64,chain = MERGE_VALUES (x, y) 6530 assert(Op.getResNo() == 0 && Node->getNumValues() == 2 && 6531 Op.getValue(1).getValueType() == MVT::Other && 6532 "unhandled MERGE_VALUES"); 6533 ExpandOp(Op.getOperand(0), Lo, Hi); 6534 // Remember that we legalized the chain. 6535 AddLegalizedOperand(Op.getValue(1), LegalizeOp(Op.getOperand(1))); 6536 break; 6537 6538 case ISD::SIGN_EXTEND_INREG: 6539 ExpandOp(Node->getOperand(0), Lo, Hi); 6540 // sext_inreg the low part if needed. 6541 Lo = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, NVT, Lo, Node->getOperand(1)); 6542 6543 // The high part gets the sign extension from the lo-part. This handles 6544 // things like sextinreg V:i64 from i8. 6545 Hi = DAG.getNode(ISD::SRA, dl, NVT, Lo, 6546 DAG.getConstant(NVT.getSizeInBits()-1, 6547 TLI.getShiftAmountTy())); 6548 break; 6549 6550 case ISD::BSWAP: { 6551 ExpandOp(Node->getOperand(0), Lo, Hi); 6552 SDValue TempLo = DAG.getNode(ISD::BSWAP, dl, NVT, Hi); 6553 Hi = DAG.getNode(ISD::BSWAP, dl, NVT, Lo); 6554 Lo = TempLo; 6555 break; 6556 } 6557 6558 case ISD::CTPOP: 6559 ExpandOp(Node->getOperand(0), Lo, Hi); 6560 Lo = DAG.getNode(ISD::ADD, dl, NVT, // ctpop(HL) -> ctpop(H)+ctpop(L) 6561 DAG.getNode(ISD::CTPOP, dl, NVT, Lo), 6562 DAG.getNode(ISD::CTPOP, dl, NVT, Hi)); 6563 Hi = DAG.getConstant(0, NVT); 6564 break; 6565 6566 case ISD::CTLZ: { 6567 // ctlz (HL) -> ctlz(H) != 32 ? ctlz(H) : (ctlz(L)+32) 6568 ExpandOp(Node->getOperand(0), Lo, Hi); 6569 SDValue BitsC = DAG.getConstant(NVT.getSizeInBits(), NVT); 6570 SDValue HLZ = DAG.getNode(ISD::CTLZ, dl, NVT, Hi); 6571 SDValue TopNotZero = DAG.getSetCC(dl, TLI.getSetCCResultType(NVT), HLZ, 6572 BitsC, ISD::SETNE); 6573 SDValue LowPart = DAG.getNode(ISD::CTLZ, dl, NVT, Lo); 6574 LowPart = DAG.getNode(ISD::ADD, dl, NVT, LowPart, BitsC); 6575 6576 Lo = DAG.getNode(ISD::SELECT, dl, NVT, TopNotZero, HLZ, LowPart); 6577 Hi = DAG.getConstant(0, NVT); 6578 break; 6579 } 6580 6581 case ISD::CTTZ: { 6582 // cttz (HL) -> cttz(L) != 32 ? cttz(L) : (cttz(H)+32) 6583 ExpandOp(Node->getOperand(0), Lo, Hi); 6584 SDValue BitsC = DAG.getConstant(NVT.getSizeInBits(), NVT); 6585 SDValue LTZ = DAG.getNode(ISD::CTTZ, dl, NVT, Lo); 6586 SDValue BotNotZero = DAG.getSetCC(dl, TLI.getSetCCResultType(NVT), LTZ, 6587 BitsC, ISD::SETNE); 6588 SDValue HiPart = DAG.getNode(ISD::CTTZ, dl, NVT, Hi); 6589 HiPart = DAG.getNode(ISD::ADD, dl, NVT, HiPart, BitsC); 6590 6591 Lo = DAG.getNode(ISD::SELECT, dl, NVT, BotNotZero, LTZ, HiPart); 6592 Hi = DAG.getConstant(0, NVT); 6593 break; 6594 } 6595 6596 case ISD::VAARG: { 6597 SDValue Ch = Node->getOperand(0); // Legalize the chain. 6598 SDValue Ptr = Node->getOperand(1); // Legalize the pointer. 6599 Lo = DAG.getVAArg(NVT, dl, Ch, Ptr, Node->getOperand(2)); 6600 Hi = DAG.getVAArg(NVT, dl, Lo.getValue(1), Ptr, Node->getOperand(2)); 6601 6602 // Remember that we legalized the chain. 6603 Hi = LegalizeOp(Hi); 6604 AddLegalizedOperand(Op.getValue(1), Hi.getValue(1)); 6605 if (TLI.isBigEndian()) 6606 std::swap(Lo, Hi); 6607 break; 6608 } 6609 6610 case ISD::LOAD: { 6611 LoadSDNode *LD = cast<LoadSDNode>(Node); 6612 SDValue Ch = LD->getChain(); // Legalize the chain. 6613 SDValue Ptr = LD->getBasePtr(); // Legalize the pointer. 6614 ISD::LoadExtType ExtType = LD->getExtensionType(); 6615 const Value *SV = LD->getSrcValue(); 6616 int SVOffset = LD->getSrcValueOffset(); 6617 unsigned Alignment = LD->getAlignment(); 6618 bool isVolatile = LD->isVolatile(); 6619 6620 if (ExtType == ISD::NON_EXTLOAD) { 6621 Lo = DAG.getLoad(NVT, dl, Ch, Ptr, SV, SVOffset, 6622 isVolatile, Alignment); 6623 if (VT == MVT::f32 || VT == MVT::f64) { 6624 // f32->i32 or f64->i64 one to one expansion. 6625 // Remember that we legalized the chain. 6626 AddLegalizedOperand(SDValue(Node, 1), LegalizeOp(Lo.getValue(1))); 6627 // Recursively expand the new load. 6628 if (getTypeAction(NVT) == Expand) 6629 ExpandOp(Lo, Lo, Hi); 6630 break; 6631 } 6632 6633 // Increment the pointer to the other half. 6634 unsigned IncrementSize = Lo.getValueType().getSizeInBits()/8; 6635 Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr, 6636 DAG.getIntPtrConstant(IncrementSize)); 6637 SVOffset += IncrementSize; 6638 Alignment = MinAlign(Alignment, IncrementSize); 6639 Hi = DAG.getLoad(NVT, dl, Ch, Ptr, SV, SVOffset, 6640 isVolatile, Alignment); 6641 6642 // Build a factor node to remember that this load is independent of the 6643 // other one. 6644 SDValue TF = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo.getValue(1), 6645 Hi.getValue(1)); 6646 6647 // Remember that we legalized the chain. 6648 AddLegalizedOperand(Op.getValue(1), LegalizeOp(TF)); 6649 if (TLI.isBigEndian()) 6650 std::swap(Lo, Hi); 6651 } else { 6652 MVT EVT = LD->getMemoryVT(); 6653 6654 if ((VT == MVT::f64 && EVT == MVT::f32) || 6655 (VT == MVT::ppcf128 && (EVT==MVT::f64 || EVT==MVT::f32))) { 6656 // f64 = EXTLOAD f32 should expand to LOAD, FP_EXTEND 6657 SDValue Load = DAG.getLoad(EVT, dl, Ch, Ptr, SV, 6658 SVOffset, isVolatile, Alignment); 6659 // Remember that we legalized the chain. 6660 AddLegalizedOperand(SDValue(Node, 1), LegalizeOp(Load.getValue(1))); 6661 ExpandOp(DAG.getNode(ISD::FP_EXTEND, dl, VT, Load), Lo, Hi); 6662 break; 6663 } 6664 6665 if (EVT == NVT) 6666 Lo = DAG.getLoad(NVT, dl, Ch, Ptr, SV, 6667 SVOffset, isVolatile, Alignment); 6668 else 6669 Lo = DAG.getExtLoad(ExtType, dl, NVT, Ch, Ptr, SV, 6670 SVOffset, EVT, isVolatile, 6671 Alignment); 6672 6673 // Remember that we legalized the chain. 6674 AddLegalizedOperand(SDValue(Node, 1), LegalizeOp(Lo.getValue(1))); 6675 6676 if (ExtType == ISD::SEXTLOAD) { 6677 // The high part is obtained by SRA'ing all but one of the bits of the 6678 // lo part. 6679 unsigned LoSize = Lo.getValueType().getSizeInBits(); 6680 Hi = DAG.getNode(ISD::SRA, dl, NVT, Lo, 6681 DAG.getConstant(LoSize-1, TLI.getShiftAmountTy())); 6682 } else if (ExtType == ISD::ZEXTLOAD) { 6683 // The high part is just a zero. 6684 Hi = DAG.getConstant(0, NVT); 6685 } else /* if (ExtType == ISD::EXTLOAD) */ { 6686 // The high part is undefined. 6687 Hi = DAG.getUNDEF(NVT); 6688 } 6689 } 6690 break; 6691 } 6692 case ISD::AND: 6693 case ISD::OR: 6694 case ISD::XOR: { // Simple logical operators -> two trivial pieces. 6695 SDValue LL, LH, RL, RH; 6696 ExpandOp(Node->getOperand(0), LL, LH); 6697 ExpandOp(Node->getOperand(1), RL, RH); 6698 Lo = DAG.getNode(Node->getOpcode(), dl, NVT, LL, RL); 6699 Hi = DAG.getNode(Node->getOpcode(), dl, NVT, LH, RH); 6700 break; 6701 } 6702 case ISD::SELECT: { 6703 SDValue LL, LH, RL, RH; 6704 ExpandOp(Node->getOperand(1), LL, LH); 6705 ExpandOp(Node->getOperand(2), RL, RH); 6706 if (getTypeAction(NVT) == Expand) 6707 NVT = TLI.getTypeToExpandTo(NVT); 6708 Lo = DAG.getNode(ISD::SELECT, dl, NVT, Node->getOperand(0), LL, RL); 6709 if (VT != MVT::f32) 6710 Hi = DAG.getNode(ISD::SELECT, dl, NVT, Node->getOperand(0), LH, RH); 6711 break; 6712 } 6713 case ISD::SELECT_CC: { 6714 SDValue TL, TH, FL, FH; 6715 ExpandOp(Node->getOperand(2), TL, TH); 6716 ExpandOp(Node->getOperand(3), FL, FH); 6717 if (getTypeAction(NVT) == Expand) 6718 NVT = TLI.getTypeToExpandTo(NVT); 6719 Lo = DAG.getNode(ISD::SELECT_CC, dl, NVT, Node->getOperand(0), 6720 Node->getOperand(1), TL, FL, Node->getOperand(4)); 6721 if (VT != MVT::f32) 6722 Hi = DAG.getNode(ISD::SELECT_CC, dl, NVT, Node->getOperand(0), 6723 Node->getOperand(1), TH, FH, Node->getOperand(4)); 6724 break; 6725 } 6726 case ISD::ANY_EXTEND: 6727 // The low part is any extension of the input (which degenerates to a copy). 6728 Lo = DAG.getNode(ISD::ANY_EXTEND, dl, NVT, Node->getOperand(0)); 6729 // The high part is undefined. 6730 Hi = DAG.getUNDEF(NVT); 6731 break; 6732 case ISD::SIGN_EXTEND: { 6733 // The low part is just a sign extension of the input (which degenerates to 6734 // a copy). 6735 Lo = DAG.getNode(ISD::SIGN_EXTEND, dl, NVT, Node->getOperand(0)); 6736 6737 // The high part is obtained by SRA'ing all but one of the bits of the lo 6738 // part. 6739 unsigned LoSize = Lo.getValueType().getSizeInBits(); 6740 Hi = DAG.getNode(ISD::SRA, dl, NVT, Lo, 6741 DAG.getConstant(LoSize-1, TLI.getShiftAmountTy())); 6742 break; 6743 } 6744 case ISD::ZERO_EXTEND: 6745 // The low part is just a zero extension of the input (which degenerates to 6746 // a copy). 6747 Lo = DAG.getNode(ISD::ZERO_EXTEND, dl, NVT, Node->getOperand(0)); 6748 6749 // The high part is just a zero. 6750 Hi = DAG.getConstant(0, NVT); 6751 break; 6752 6753 case ISD::TRUNCATE: { 6754 // The input value must be larger than this value. Expand *it*. 6755 SDValue NewLo; 6756 ExpandOp(Node->getOperand(0), NewLo, Hi); 6757 6758 // The low part is now either the right size, or it is closer. If not the 6759 // right size, make an illegal truncate so we recursively expand it. 6760 if (NewLo.getValueType() != Node->getValueType(0)) 6761 NewLo = DAG.getNode(ISD::TRUNCATE, dl, Node->getValueType(0), NewLo); 6762 ExpandOp(NewLo, Lo, Hi); 6763 break; 6764 } 6765 6766 case ISD::BIT_CONVERT: { 6767 SDValue Tmp; 6768 if (TLI.getOperationAction(ISD::BIT_CONVERT, VT) == TargetLowering::Custom){ 6769 // If the target wants to, allow it to lower this itself. 6770 switch (getTypeAction(Node->getOperand(0).getValueType())) { 6771 case Expand: assert(0 && "cannot expand FP!"); 6772 case Legal: Tmp = LegalizeOp(Node->getOperand(0)); break; 6773 case Promote: Tmp = PromoteOp (Node->getOperand(0)); break; 6774 } 6775 Tmp = TLI.LowerOperation(DAG.getNode(ISD::BIT_CONVERT, dl, VT, Tmp), DAG); 6776 } 6777 6778 // f32 / f64 must be expanded to i32 / i64. 6779 if (VT == MVT::f32 || VT == MVT::f64) { 6780 Lo = DAG.getNode(ISD::BIT_CONVERT, dl, NVT, Node->getOperand(0)); 6781 if (getTypeAction(NVT) == Expand) 6782 ExpandOp(Lo, Lo, Hi); 6783 break; 6784 } 6785 6786 // If source operand will be expanded to the same type as VT, i.e. 6787 // i64 <- f64, i32 <- f32, expand the source operand instead. 6788 MVT VT0 = Node->getOperand(0).getValueType(); 6789 if (getTypeAction(VT0) == Expand && TLI.getTypeToTransformTo(VT0) == VT) { 6790 ExpandOp(Node->getOperand(0), Lo, Hi); 6791 break; 6792 } 6793 6794 // Turn this into a load/store pair by default. 6795 if (Tmp.getNode() == 0) 6796 Tmp = EmitStackConvert(Node->getOperand(0), VT, VT, dl); 6797 6798 ExpandOp(Tmp, Lo, Hi); 6799 break; 6800 } 6801 6802 case ISD::READCYCLECOUNTER: { 6803 assert(TLI.getOperationAction(ISD::READCYCLECOUNTER, VT) == 6804 TargetLowering::Custom && 6805 "Must custom expand ReadCycleCounter"); 6806 SDValue Tmp = TLI.LowerOperation(Op, DAG); 6807 assert(Tmp.getNode() && "Node must be custom expanded!"); 6808 ExpandOp(Tmp.getValue(0), Lo, Hi); 6809 AddLegalizedOperand(SDValue(Node, 1), // Remember we legalized the chain. 6810 LegalizeOp(Tmp.getValue(1))); 6811 break; 6812 } 6813 6814 case ISD::ATOMIC_CMP_SWAP: { 6815 // This operation does not need a loop. 6816 SDValue Tmp = TLI.LowerOperation(Op, DAG); 6817 assert(Tmp.getNode() && "Node must be custom expanded!"); 6818 ExpandOp(Tmp.getValue(0), Lo, Hi); 6819 AddLegalizedOperand(SDValue(Node, 1), // Remember we legalized the chain. 6820 LegalizeOp(Tmp.getValue(1))); 6821 break; 6822 } 6823 6824 case ISD::ATOMIC_LOAD_ADD: 6825 case ISD::ATOMIC_LOAD_SUB: 6826 case ISD::ATOMIC_LOAD_AND: 6827 case ISD::ATOMIC_LOAD_OR: 6828 case ISD::ATOMIC_LOAD_XOR: 6829 case ISD::ATOMIC_LOAD_NAND: 6830 case ISD::ATOMIC_SWAP: { 6831 // These operations require a loop to be generated. We can't do that yet, 6832 // so substitute a target-dependent pseudo and expand that later. 6833 SDValue In2Lo, In2Hi, In2; 6834 ExpandOp(Op.getOperand(2), In2Lo, In2Hi); 6835 In2 = DAG.getNode(ISD::BUILD_PAIR, dl, VT, In2Lo, In2Hi); 6836 AtomicSDNode* Anode = cast<AtomicSDNode>(Node); 6837 SDValue Replace = 6838 DAG.getAtomic(Op.getOpcode(), dl, Anode->getMemoryVT(), 6839 Op.getOperand(0), Op.getOperand(1), In2, 6840 Anode->getSrcValue(), Anode->getAlignment()); 6841 SDValue Result = TLI.LowerOperation(Replace, DAG); 6842 ExpandOp(Result.getValue(0), Lo, Hi); 6843 // Remember that we legalized the chain. 6844 AddLegalizedOperand(SDValue(Node,1), LegalizeOp(Result.getValue(1))); 6845 break; 6846 } 6847 6848 // These operators cannot be expanded directly, emit them as calls to 6849 // library functions. 6850 case ISD::FP_TO_SINT: { 6851 if (TLI.getOperationAction(ISD::FP_TO_SINT, VT) == TargetLowering::Custom) { 6852 SDValue Op; 6853 switch (getTypeAction(Node->getOperand(0).getValueType())) { 6854 case Expand: assert(0 && "cannot expand FP!"); 6855 case Legal: Op = LegalizeOp(Node->getOperand(0)); break; 6856 case Promote: Op = PromoteOp (Node->getOperand(0)); break; 6857 } 6858 6859 Op = TLI.LowerOperation(DAG.getNode(ISD::FP_TO_SINT, dl, VT, Op), DAG); 6860 6861 // Now that the custom expander is done, expand the result, which is still 6862 // VT. 6863 if (Op.getNode()) { 6864 ExpandOp(Op, Lo, Hi); 6865 break; 6866 } 6867 } 6868 6869 RTLIB::Libcall LC = RTLIB::getFPTOSINT(Node->getOperand(0).getValueType(), 6870 VT); 6871 assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unexpected uint-to-fp conversion!"); 6872 Lo = ExpandLibCall(LC, Node, false/*sign irrelevant*/, Hi); 6873 break; 6874 } 6875 6876 case ISD::FP_TO_UINT: { 6877 if (TLI.getOperationAction(ISD::FP_TO_UINT, VT) == TargetLowering::Custom) { 6878 SDValue Op; 6879 switch (getTypeAction(Node->getOperand(0).getValueType())) { 6880 case Expand: assert(0 && "cannot expand FP!"); 6881 case Legal: Op = LegalizeOp(Node->getOperand(0)); break; 6882 case Promote: Op = PromoteOp (Node->getOperand(0)); break; 6883 } 6884 6885 Op = TLI.LowerOperation(DAG.getNode(ISD::FP_TO_UINT, dl, VT, Op), DAG); 6886 6887 // Now that the custom expander is done, expand the result. 6888 if (Op.getNode()) { 6889 ExpandOp(Op, Lo, Hi); 6890 break; 6891 } 6892 } 6893 6894 RTLIB::Libcall LC = RTLIB::getFPTOUINT(Node->getOperand(0).getValueType(), 6895 VT); 6896 assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unexpected fp-to-uint conversion!"); 6897 Lo = ExpandLibCall(LC, Node, false/*sign irrelevant*/, Hi); 6898 break; 6899 } 6900 6901 case ISD::SHL: { 6902 // If the target wants custom lowering, do so. 6903 SDValue ShiftAmt = LegalizeOp(Node->getOperand(1)); 6904 if (TLI.getOperationAction(ISD::SHL, VT) == TargetLowering::Custom) { 6905 SDValue Op = DAG.getNode(ISD::SHL, dl, VT, Node->getOperand(0), ShiftAmt); 6906 Op = TLI.LowerOperation(Op, DAG); 6907 if (Op.getNode()) { 6908 // Now that the custom expander is done, expand the result, which is 6909 // still VT. 6910 ExpandOp(Op, Lo, Hi); 6911 break; 6912 } 6913 } 6914 6915 // If ADDC/ADDE are supported and if the shift amount is a constant 1, emit 6916 // this X << 1 as X+X. 6917 if (ConstantSDNode *ShAmt = dyn_cast<ConstantSDNode>(ShiftAmt)) { 6918 if (ShAmt->getAPIntValue() == 1 && 6919 TLI.isOperationLegalOrCustom(ISD::ADDC, NVT) && 6920 TLI.isOperationLegalOrCustom(ISD::ADDE, NVT)) { 6921 SDValue LoOps[2], HiOps[3]; 6922 ExpandOp(Node->getOperand(0), LoOps[0], HiOps[0]); 6923 SDVTList VTList = DAG.getVTList(LoOps[0].getValueType(), MVT::Flag); 6924 LoOps[1] = LoOps[0]; 6925 Lo = DAG.getNode(ISD::ADDC, dl, VTList, LoOps, 2); 6926 6927 HiOps[1] = HiOps[0]; 6928 HiOps[2] = Lo.getValue(1); 6929 Hi = DAG.getNode(ISD::ADDE, dl, VTList, HiOps, 3); 6930 break; 6931 } 6932 } 6933 6934 // If we can emit an efficient shift operation, do so now. 6935 if (ExpandShift(ISD::SHL, Node->getOperand(0), ShiftAmt, Lo, Hi, dl)) 6936 break; 6937 6938 // If this target supports SHL_PARTS, use it. 6939 TargetLowering::LegalizeAction Action = 6940 TLI.getOperationAction(ISD::SHL_PARTS, NVT); 6941 if ((Action == TargetLowering::Legal && TLI.isTypeLegal(NVT)) || 6942 Action == TargetLowering::Custom) { 6943 ExpandShiftParts(ISD::SHL_PARTS, Node->getOperand(0), 6944 ShiftAmt, Lo, Hi, dl); 6945 break; 6946 } 6947 6948 // Otherwise, emit a libcall. 6949 Lo = ExpandLibCall(RTLIB::SHL_I64, Node, false/*left shift=unsigned*/, Hi); 6950 break; 6951 } 6952 6953 case ISD::SRA: { 6954 // If the target wants custom lowering, do so. 6955 SDValue ShiftAmt = LegalizeOp(Node->getOperand(1)); 6956 if (TLI.getOperationAction(ISD::SRA, VT) == TargetLowering::Custom) { 6957 SDValue Op = DAG.getNode(ISD::SRA, dl, VT, Node->getOperand(0), ShiftAmt); 6958 Op = TLI.LowerOperation(Op, DAG); 6959 if (Op.getNode()) { 6960 // Now that the custom expander is done, expand the result, which is 6961 // still VT. 6962 ExpandOp(Op, Lo, Hi); 6963 break; 6964 } 6965 } 6966 6967 // If we can emit an efficient shift operation, do so now. 6968 if (ExpandShift(ISD::SRA, Node->getOperand(0), ShiftAmt, Lo, Hi, dl)) 6969 break; 6970 6971 // If this target supports SRA_PARTS, use it. 6972 TargetLowering::LegalizeAction Action = 6973 TLI.getOperationAction(ISD::SRA_PARTS, NVT); 6974 if ((Action == TargetLowering::Legal && TLI.isTypeLegal(NVT)) || 6975 Action == TargetLowering::Custom) { 6976 ExpandShiftParts(ISD::SRA_PARTS, Node->getOperand(0), 6977 ShiftAmt, Lo, Hi, dl); 6978 break; 6979 } 6980 6981 // Otherwise, emit a libcall. 6982 Lo = ExpandLibCall(RTLIB::SRA_I64, Node, true/*ashr is signed*/, Hi); 6983 break; 6984 } 6985 6986 case ISD::SRL: { 6987 // If the target wants custom lowering, do so. 6988 SDValue ShiftAmt = LegalizeOp(Node->getOperand(1)); 6989 if (TLI.getOperationAction(ISD::SRL, VT) == TargetLowering::Custom) { 6990 SDValue Op = DAG.getNode(ISD::SRL, dl, VT, Node->getOperand(0), ShiftAmt); 6991 Op = TLI.LowerOperation(Op, DAG); 6992 if (Op.getNode()) { 6993 // Now that the custom expander is done, expand the result, which is 6994 // still VT. 6995 ExpandOp(Op, Lo, Hi); 6996 break; 6997 } 6998 } 6999 7000 // If we can emit an efficient shift operation, do so now. 7001 if (ExpandShift(ISD::SRL, Node->getOperand(0), ShiftAmt, Lo, Hi, dl)) 7002 break; 7003 7004 // If this target supports SRL_PARTS, use it. 7005 TargetLowering::LegalizeAction Action = 7006 TLI.getOperationAction(ISD::SRL_PARTS, NVT); 7007 if ((Action == TargetLowering::Legal && TLI.isTypeLegal(NVT)) || 7008 Action == TargetLowering::Custom) { 7009 ExpandShiftParts(ISD::SRL_PARTS, 7010 Node->getOperand(0), ShiftAmt, Lo, Hi, dl); 7011 break; 7012 } 7013 7014 // Otherwise, emit a libcall. 7015 Lo = ExpandLibCall(RTLIB::SRL_I64, Node, false/*lshr is unsigned*/, Hi); 7016 break; 7017 } 7018 7019 case ISD::ADD: 7020 case ISD::SUB: { 7021 // If the target wants to custom expand this, let them. 7022 if (TLI.getOperationAction(Node->getOpcode(), VT) == 7023 TargetLowering::Custom) { 7024 SDValue Result = TLI.LowerOperation(Op, DAG); 7025 if (Result.getNode()) { 7026 ExpandOp(Result, Lo, Hi); 7027 break; 7028 } 7029 } 7030 // Expand the subcomponents. 7031 SDValue LHSL, LHSH, RHSL, RHSH; 7032 ExpandOp(Node->getOperand(0), LHSL, LHSH); 7033 ExpandOp(Node->getOperand(1), RHSL, RHSH); 7034 SDValue LoOps[2], HiOps[3]; 7035 LoOps[0] = LHSL; 7036 LoOps[1] = RHSL; 7037 HiOps[0] = LHSH; 7038 HiOps[1] = RHSH; 7039 7040 //cascaded check to see if any smaller size has a a carry flag. 7041 unsigned OpV = Node->getOpcode() == ISD::ADD ? ISD::ADDC : ISD::SUBC; 7042 bool hasCarry = false; 7043 for (unsigned BitSize = NVT.getSizeInBits(); BitSize != 0; BitSize /= 2) { 7044 MVT AVT = MVT::getIntegerVT(BitSize); 7045 if (TLI.isOperationLegalOrCustom(OpV, AVT)) { 7046 hasCarry = true; 7047 break; 7048 } 7049 } 7050 7051 if(hasCarry) { 7052 SDVTList VTList = DAG.getVTList(LHSL.getValueType(), MVT::Flag); 7053 if (Node->getOpcode() == ISD::ADD) { 7054 Lo = DAG.getNode(ISD::ADDC, dl, VTList, LoOps, 2); 7055 HiOps[2] = Lo.getValue(1); 7056 Hi = DAG.getNode(ISD::ADDE, dl, VTList, HiOps, 3); 7057 } else { 7058 Lo = DAG.getNode(ISD::SUBC, dl, VTList, LoOps, 2); 7059 HiOps[2] = Lo.getValue(1); 7060 Hi = DAG.getNode(ISD::SUBE, dl, VTList, HiOps, 3); 7061 } 7062 break; 7063 } else { 7064 if (Node->getOpcode() == ISD::ADD) { 7065 Lo = DAG.getNode(ISD::ADD, dl, NVT, LoOps, 2); 7066 Hi = DAG.getNode(ISD::ADD, dl, NVT, HiOps, 2); 7067 SDValue Cmp1 = DAG.getSetCC(dl, TLI.getSetCCResultType(NVT), 7068 Lo, LoOps[0], ISD::SETULT); 7069 SDValue Carry1 = DAG.getNode(ISD::SELECT, dl, NVT, Cmp1, 7070 DAG.getConstant(1, NVT), 7071 DAG.getConstant(0, NVT)); 7072 SDValue Cmp2 = DAG.getSetCC(dl, TLI.getSetCCResultType(NVT), 7073 Lo, LoOps[1], ISD::SETULT); 7074 SDValue Carry2 = DAG.getNode(ISD::SELECT, dl, NVT, Cmp2, 7075 DAG.getConstant(1, NVT), 7076 Carry1); 7077 Hi = DAG.getNode(ISD::ADD, dl, NVT, Hi, Carry2); 7078 } else { 7079 Lo = DAG.getNode(ISD::SUB, dl, NVT, LoOps, 2); 7080 Hi = DAG.getNode(ISD::SUB, dl, NVT, HiOps, 2); 7081 SDValue Cmp = DAG.getSetCC(dl, NVT, LoOps[0], LoOps[1], ISD::SETULT); 7082 SDValue Borrow = DAG.getNode(ISD::SELECT, dl, NVT, Cmp, 7083 DAG.getConstant(1, NVT), 7084 DAG.getConstant(0, NVT)); 7085 Hi = DAG.getNode(ISD::SUB, dl, NVT, Hi, Borrow); 7086 } 7087 break; 7088 } 7089 } 7090 7091 case ISD::ADDC: 7092 case ISD::SUBC: { 7093 // Expand the subcomponents. 7094 SDValue LHSL, LHSH, RHSL, RHSH; 7095 ExpandOp(Node->getOperand(0), LHSL, LHSH); 7096 ExpandOp(Node->getOperand(1), RHSL, RHSH); 7097 SDVTList VTList = DAG.getVTList(LHSL.getValueType(), MVT::Flag); 7098 SDValue LoOps[2] = { LHSL, RHSL }; 7099 SDValue HiOps[3] = { LHSH, RHSH }; 7100 7101 if (Node->getOpcode() == ISD::ADDC) { 7102 Lo = DAG.getNode(ISD::ADDC, dl, VTList, LoOps, 2); 7103 HiOps[2] = Lo.getValue(1); 7104 Hi = DAG.getNode(ISD::ADDE, dl, VTList, HiOps, 3); 7105 } else { 7106 Lo = DAG.getNode(ISD::SUBC, dl, VTList, LoOps, 2); 7107 HiOps[2] = Lo.getValue(1); 7108 Hi = DAG.getNode(ISD::SUBE, dl, VTList, HiOps, 3); 7109 } 7110 // Remember that we legalized the flag. 7111 AddLegalizedOperand(Op.getValue(1), LegalizeOp(Hi.getValue(1))); 7112 break; 7113 } 7114 case ISD::ADDE: 7115 case ISD::SUBE: { 7116 // Expand the subcomponents. 7117 SDValue LHSL, LHSH, RHSL, RHSH; 7118 ExpandOp(Node->getOperand(0), LHSL, LHSH); 7119 ExpandOp(Node->getOperand(1), RHSL, RHSH); 7120 SDVTList VTList = DAG.getVTList(LHSL.getValueType(), MVT::Flag); 7121 SDValue LoOps[3] = { LHSL, RHSL, Node->getOperand(2) }; 7122 SDValue HiOps[3] = { LHSH, RHSH }; 7123 7124 Lo = DAG.getNode(Node->getOpcode(), dl, VTList, LoOps, 3); 7125 HiOps[2] = Lo.getValue(1); 7126 Hi = DAG.getNode(Node->getOpcode(), dl, VTList, HiOps, 3); 7127 7128 // Remember that we legalized the flag. 7129 AddLegalizedOperand(Op.getValue(1), LegalizeOp(Hi.getValue(1))); 7130 break; 7131 } 7132 case ISD::MUL: { 7133 // If the target wants to custom expand this, let them. 7134 if (TLI.getOperationAction(ISD::MUL, VT) == TargetLowering::Custom) { 7135 SDValue New = TLI.LowerOperation(Op, DAG); 7136 if (New.getNode()) { 7137 ExpandOp(New, Lo, Hi); 7138 break; 7139 } 7140 } 7141 7142 bool HasMULHS = TLI.isOperationLegalOrCustom(ISD::MULHS, NVT); 7143 bool HasMULHU = TLI.isOperationLegalOrCustom(ISD::MULHU, NVT); 7144 bool HasSMUL_LOHI = TLI.isOperationLegalOrCustom(ISD::SMUL_LOHI, NVT); 7145 bool HasUMUL_LOHI = TLI.isOperationLegalOrCustom(ISD::UMUL_LOHI, NVT); 7146 if (HasMULHU || HasMULHS || HasUMUL_LOHI || HasSMUL_LOHI) { 7147 SDValue LL, LH, RL, RH; 7148 ExpandOp(Node->getOperand(0), LL, LH); 7149 ExpandOp(Node->getOperand(1), RL, RH); 7150 unsigned OuterBitSize = Op.getValueSizeInBits(); 7151 unsigned InnerBitSize = RH.getValueSizeInBits(); 7152 unsigned LHSSB = DAG.ComputeNumSignBits(Op.getOperand(0)); 7153 unsigned RHSSB = DAG.ComputeNumSignBits(Op.getOperand(1)); 7154 APInt HighMask = APInt::getHighBitsSet(OuterBitSize, InnerBitSize); 7155 if (DAG.MaskedValueIsZero(Node->getOperand(0), HighMask) && 7156 DAG.MaskedValueIsZero(Node->getOperand(1), HighMask)) { 7157 // The inputs are both zero-extended. 7158 if (HasUMUL_LOHI) { 7159 // We can emit a umul_lohi. 7160 Lo = DAG.getNode(ISD::UMUL_LOHI, dl, DAG.getVTList(NVT, NVT), LL, RL); 7161 Hi = SDValue(Lo.getNode(), 1); 7162 break; 7163 } 7164 if (HasMULHU) { 7165 // We can emit a mulhu+mul. 7166 Lo = DAG.getNode(ISD::MUL, dl, NVT, LL, RL); 7167 Hi = DAG.getNode(ISD::MULHU, dl, NVT, LL, RL); 7168 break; 7169 } 7170 } 7171 if (LHSSB > InnerBitSize && RHSSB > InnerBitSize) { 7172 // The input values are both sign-extended. 7173 if (HasSMUL_LOHI) { 7174 // We can emit a smul_lohi. 7175 Lo = DAG.getNode(ISD::SMUL_LOHI, dl, DAG.getVTList(NVT, NVT), LL, RL); 7176 Hi = SDValue(Lo.getNode(), 1); 7177 break; 7178 } 7179 if (HasMULHS) { 7180 // We can emit a mulhs+mul. 7181 Lo = DAG.getNode(ISD::MUL, dl, NVT, LL, RL); 7182 Hi = DAG.getNode(ISD::MULHS, dl, NVT, LL, RL); 7183 break; 7184 } 7185 } 7186 if (HasUMUL_LOHI) { 7187 // Lo,Hi = umul LHS, RHS. 7188 SDValue UMulLOHI = DAG.getNode(ISD::UMUL_LOHI, dl, 7189 DAG.getVTList(NVT, NVT), LL, RL); 7190 Lo = UMulLOHI; 7191 Hi = UMulLOHI.getValue(1); 7192 RH = DAG.getNode(ISD::MUL, dl, NVT, LL, RH); 7193 LH = DAG.getNode(ISD::MUL, dl, NVT, LH, RL); 7194 Hi = DAG.getNode(ISD::ADD, dl, NVT, Hi, RH); 7195 Hi = DAG.getNode(ISD::ADD, dl, NVT, Hi, LH); 7196 break; 7197 } 7198 if (HasMULHU) { 7199 Lo = DAG.getNode(ISD::MUL, dl, NVT, LL, RL); 7200 Hi = DAG.getNode(ISD::MULHU, dl, NVT, LL, RL); 7201 RH = DAG.getNode(ISD::MUL, dl, NVT, LL, RH); 7202 LH = DAG.getNode(ISD::MUL, dl, NVT, LH, RL); 7203 Hi = DAG.getNode(ISD::ADD, dl, NVT, Hi, RH); 7204 Hi = DAG.getNode(ISD::ADD, dl, NVT, Hi, LH); 7205 break; 7206 } 7207 } 7208 7209 // If nothing else, we can make a libcall. 7210 Lo = ExpandLibCall(RTLIB::MUL_I64, Node, false/*sign irrelevant*/, Hi); 7211 break; 7212 } 7213 case ISD::SDIV: 7214 Lo = ExpandLibCall(RTLIB::SDIV_I64, Node, true, Hi); 7215 break; 7216 case ISD::UDIV: 7217 Lo = ExpandLibCall(RTLIB::UDIV_I64, Node, true, Hi); 7218 break; 7219 case ISD::SREM: 7220 Lo = ExpandLibCall(RTLIB::SREM_I64, Node, true, Hi); 7221 break; 7222 case ISD::UREM: 7223 Lo = ExpandLibCall(RTLIB::UREM_I64, Node, true, Hi); 7224 break; 7225 7226 case ISD::FADD: 7227 Lo = ExpandLibCall(GetFPLibCall(VT, RTLIB::ADD_F32, 7228 RTLIB::ADD_F64, 7229 RTLIB::ADD_F80, 7230 RTLIB::ADD_PPCF128), 7231 Node, false, Hi); 7232 break; 7233 case ISD::FSUB: 7234 Lo = ExpandLibCall(GetFPLibCall(VT, RTLIB::SUB_F32, 7235 RTLIB::SUB_F64, 7236 RTLIB::SUB_F80, 7237 RTLIB::SUB_PPCF128), 7238 Node, false, Hi); 7239 break; 7240 case ISD::FMUL: 7241 Lo = ExpandLibCall(GetFPLibCall(VT, RTLIB::MUL_F32, 7242 RTLIB::MUL_F64, 7243 RTLIB::MUL_F80, 7244 RTLIB::MUL_PPCF128), 7245 Node, false, Hi); 7246 break; 7247 case ISD::FDIV: 7248 Lo = ExpandLibCall(GetFPLibCall(VT, RTLIB::DIV_F32, 7249 RTLIB::DIV_F64, 7250 RTLIB::DIV_F80, 7251 RTLIB::DIV_PPCF128), 7252 Node, false, Hi); 7253 break; 7254 case ISD::FP_EXTEND: { 7255 if (VT == MVT::ppcf128) { 7256 assert(Node->getOperand(0).getValueType()==MVT::f32 || 7257 Node->getOperand(0).getValueType()==MVT::f64); 7258 const uint64_t zero = 0; 7259 if (Node->getOperand(0).getValueType()==MVT::f32) 7260 Hi = DAG.getNode(ISD::FP_EXTEND, dl, MVT::f64, Node->getOperand(0)); 7261 else 7262 Hi = Node->getOperand(0); 7263 Lo = DAG.getConstantFP(APFloat(APInt(64, 1, &zero)), MVT::f64); 7264 break; 7265 } 7266 RTLIB::Libcall LC = RTLIB::getFPEXT(Node->getOperand(0).getValueType(), VT); 7267 assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported FP_EXTEND!"); 7268 Lo = ExpandLibCall(LC, Node, true, Hi); 7269 break; 7270 } 7271 case ISD::FP_ROUND: { 7272 RTLIB::Libcall LC = RTLIB::getFPROUND(Node->getOperand(0).getValueType(), 7273 VT); 7274 assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported FP_ROUND!"); 7275 Lo = ExpandLibCall(LC, Node, true, Hi); 7276 break; 7277 } 7278 case ISD::FSQRT: 7279 case ISD::FSIN: 7280 case ISD::FCOS: 7281 case ISD::FLOG: 7282 case ISD::FLOG2: 7283 case ISD::FLOG10: 7284 case ISD::FEXP: 7285 case ISD::FEXP2: 7286 case ISD::FTRUNC: 7287 case ISD::FFLOOR: 7288 case ISD::FCEIL: 7289 case ISD::FRINT: 7290 case ISD::FNEARBYINT: 7291 case ISD::FPOW: 7292 case ISD::FPOWI: { 7293 RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL; 7294 switch(Node->getOpcode()) { 7295 case ISD::FSQRT: 7296 LC = GetFPLibCall(VT, RTLIB::SQRT_F32, RTLIB::SQRT_F64, 7297 RTLIB::SQRT_F80, RTLIB::SQRT_PPCF128); 7298 break; 7299 case ISD::FSIN: 7300 LC = GetFPLibCall(VT, RTLIB::SIN_F32, RTLIB::SIN_F64, 7301 RTLIB::SIN_F80, RTLIB::SIN_PPCF128); 7302 break; 7303 case ISD::FCOS: 7304 LC = GetFPLibCall(VT, RTLIB::COS_F32, RTLIB::COS_F64, 7305 RTLIB::COS_F80, RTLIB::COS_PPCF128); 7306 break; 7307 case ISD::FLOG: 7308 LC = GetFPLibCall(VT, RTLIB::LOG_F32, RTLIB::LOG_F64, 7309 RTLIB::LOG_F80, RTLIB::LOG_PPCF128); 7310 break; 7311 case ISD::FLOG2: 7312 LC = GetFPLibCall(VT, RTLIB::LOG2_F32, RTLIB::LOG2_F64, 7313 RTLIB::LOG2_F80, RTLIB::LOG2_PPCF128); 7314 break; 7315 case ISD::FLOG10: 7316 LC = GetFPLibCall(VT, RTLIB::LOG10_F32, RTLIB::LOG10_F64, 7317 RTLIB::LOG10_F80, RTLIB::LOG10_PPCF128); 7318 break; 7319 case ISD::FEXP: 7320 LC = GetFPLibCall(VT, RTLIB::EXP_F32, RTLIB::EXP_F64, 7321 RTLIB::EXP_F80, RTLIB::EXP_PPCF128); 7322 break; 7323 case ISD::FEXP2: 7324 LC = GetFPLibCall(VT, RTLIB::EXP2_F32, RTLIB::EXP2_F64, 7325 RTLIB::EXP2_F80, RTLIB::EXP2_PPCF128); 7326 break; 7327 case ISD::FTRUNC: 7328 LC = GetFPLibCall(VT, RTLIB::TRUNC_F32, RTLIB::TRUNC_F64, 7329 RTLIB::TRUNC_F80, RTLIB::TRUNC_PPCF128); 7330 break; 7331 case ISD::FFLOOR: 7332 LC = GetFPLibCall(VT, RTLIB::FLOOR_F32, RTLIB::FLOOR_F64, 7333 RTLIB::FLOOR_F80, RTLIB::FLOOR_PPCF128); 7334 break; 7335 case ISD::FCEIL: 7336 LC = GetFPLibCall(VT, RTLIB::CEIL_F32, RTLIB::CEIL_F64, 7337 RTLIB::CEIL_F80, RTLIB::CEIL_PPCF128); 7338 break; 7339 case ISD::FRINT: 7340 LC = GetFPLibCall(VT, RTLIB::RINT_F32, RTLIB::RINT_F64, 7341 RTLIB::RINT_F80, RTLIB::RINT_PPCF128); 7342 break; 7343 case ISD::FNEARBYINT: 7344 LC = GetFPLibCall(VT, RTLIB::NEARBYINT_F32, RTLIB::NEARBYINT_F64, 7345 RTLIB::NEARBYINT_F80, RTLIB::NEARBYINT_PPCF128); 7346 break; 7347 case ISD::FPOW: 7348 LC = GetFPLibCall(VT, RTLIB::POW_F32, RTLIB::POW_F64, RTLIB::POW_F80, 7349 RTLIB::POW_PPCF128); 7350 break; 7351 case ISD::FPOWI: 7352 LC = GetFPLibCall(VT, RTLIB::POWI_F32, RTLIB::POWI_F64, RTLIB::POWI_F80, 7353 RTLIB::POWI_PPCF128); 7354 break; 7355 default: assert(0 && "Unreachable!"); 7356 } 7357 Lo = ExpandLibCall(LC, Node, false, Hi); 7358 break; 7359 } 7360 case ISD::FABS: { 7361 if (VT == MVT::ppcf128) { 7362 SDValue Tmp; 7363 ExpandOp(Node->getOperand(0), Lo, Tmp); 7364 Hi = DAG.getNode(ISD::FABS, dl, NVT, Tmp); 7365 // lo = hi==fabs(hi) ? lo : -lo; 7366 Lo = DAG.getNode(ISD::SELECT_CC, dl, NVT, Hi, Tmp, 7367 Lo, DAG.getNode(ISD::FNEG, dl, NVT, Lo), 7368 DAG.getCondCode(ISD::SETEQ)); 7369 break; 7370 } 7371 SDValue Mask = (VT == MVT::f64) 7372 ? DAG.getConstantFP(BitsToDouble(~(1ULL << 63)), VT) 7373 : DAG.getConstantFP(BitsToFloat(~(1U << 31)), VT); 7374 Mask = DAG.getNode(ISD::BIT_CONVERT, dl, NVT, Mask); 7375 Lo = DAG.getNode(ISD::BIT_CONVERT, dl, NVT, Node->getOperand(0)); 7376 Lo = DAG.getNode(ISD::AND, dl, NVT, Lo, Mask); 7377 if (getTypeAction(NVT) == Expand) 7378 ExpandOp(Lo, Lo, Hi); 7379 break; 7380 } 7381 case ISD::FNEG: { 7382 if (VT == MVT::ppcf128) { 7383 ExpandOp(Node->getOperand(0), Lo, Hi); 7384 Lo = DAG.getNode(ISD::FNEG, dl, MVT::f64, Lo); 7385 Hi = DAG.getNode(ISD::FNEG, dl, MVT::f64, Hi); 7386 break; 7387 } 7388 SDValue Mask = (VT == MVT::f64) 7389 ? DAG.getConstantFP(BitsToDouble(1ULL << 63), VT) 7390 : DAG.getConstantFP(BitsToFloat(1U << 31), VT); 7391 Mask = DAG.getNode(ISD::BIT_CONVERT, dl, NVT, Mask); 7392 Lo = DAG.getNode(ISD::BIT_CONVERT, dl, NVT, Node->getOperand(0)); 7393 Lo = DAG.getNode(ISD::XOR, dl, NVT, Lo, Mask); 7394 if (getTypeAction(NVT) == Expand) 7395 ExpandOp(Lo, Lo, Hi); 7396 break; 7397 } 7398 case ISD::FCOPYSIGN: { 7399 Lo = ExpandFCOPYSIGNToBitwiseOps(Node, NVT, DAG, TLI); 7400 if (getTypeAction(NVT) == Expand) 7401 ExpandOp(Lo, Lo, Hi); 7402 break; 7403 } 7404 case ISD::SINT_TO_FP: 7405 case ISD::UINT_TO_FP: { 7406 bool isSigned = Node->getOpcode() == ISD::SINT_TO_FP; 7407 MVT SrcVT = Node->getOperand(0).getValueType(); 7408 7409 // Promote the operand if needed. Do this before checking for 7410 // ppcf128 so conversions of i16 and i8 work. 7411 if (getTypeAction(SrcVT) == Promote) { 7412 SDValue Tmp = PromoteOp(Node->getOperand(0)); 7413 Tmp = isSigned 7414 ? DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, Tmp.getValueType(), Tmp, 7415 DAG.getValueType(SrcVT)) 7416 : DAG.getZeroExtendInReg(Tmp, dl, SrcVT); 7417 Node = DAG.UpdateNodeOperands(Op, Tmp).getNode(); 7418 SrcVT = Node->getOperand(0).getValueType(); 7419 } 7420 7421 if (VT == MVT::ppcf128 && SrcVT == MVT::i32) { 7422 static const uint64_t zero = 0; 7423 if (isSigned) { 7424 Hi = LegalizeOp(DAG.getNode(ISD::SINT_TO_FP, dl, MVT::f64, 7425 Node->getOperand(0))); 7426 Lo = DAG.getConstantFP(APFloat(APInt(64, 1, &zero)), MVT::f64); 7427 } else { 7428 static const uint64_t TwoE32[] = { 0x41f0000000000000LL, 0 }; 7429 Hi = LegalizeOp(DAG.getNode(ISD::SINT_TO_FP, dl, MVT::f64, 7430 Node->getOperand(0))); 7431 Lo = DAG.getConstantFP(APFloat(APInt(64, 1, &zero)), MVT::f64); 7432 Hi = DAG.getNode(ISD::BUILD_PAIR, dl, VT, Lo, Hi); 7433 // X>=0 ? {(f64)x, 0} : {(f64)x, 0} + 2^32 7434 ExpandOp(DAG.getNode(ISD::SELECT_CC, dl, 7435 MVT::ppcf128, Node->getOperand(0), 7436 DAG.getConstant(0, MVT::i32), 7437 DAG.getNode(ISD::FADD, dl, MVT::ppcf128, Hi, 7438 DAG.getConstantFP( 7439 APFloat(APInt(128, 2, TwoE32)), 7440 MVT::ppcf128)), 7441 Hi, 7442 DAG.getCondCode(ISD::SETLT)), 7443 Lo, Hi); 7444 } 7445 break; 7446 } 7447 if (VT == MVT::ppcf128 && SrcVT == MVT::i64 && !isSigned) { 7448 // si64->ppcf128 done by libcall, below 7449 static const uint64_t TwoE64[] = { 0x43f0000000000000LL, 0 }; 7450 ExpandOp(DAG.getNode(ISD::SINT_TO_FP, dl, MVT::ppcf128, 7451 Node->getOperand(0)), Lo, Hi); 7452 Hi = DAG.getNode(ISD::BUILD_PAIR, dl, VT, Lo, Hi); 7453 // x>=0 ? (ppcf128)(i64)x : (ppcf128)(i64)x + 2^64 7454 ExpandOp(DAG.getNode(ISD::SELECT_CC, dl, MVT::ppcf128, 7455 Node->getOperand(0), 7456 DAG.getConstant(0, MVT::i64), 7457 DAG.getNode(ISD::FADD, dl, MVT::ppcf128, Hi, 7458 DAG.getConstantFP( 7459 APFloat(APInt(128, 2, TwoE64)), 7460 MVT::ppcf128)), 7461 Hi, 7462 DAG.getCondCode(ISD::SETLT)), 7463 Lo, Hi); 7464 break; 7465 } 7466 7467 Lo = ExpandIntToFP(Node->getOpcode() == ISD::SINT_TO_FP, VT, 7468 Node->getOperand(0), dl); 7469 if (getTypeAction(Lo.getValueType()) == Expand) 7470 // float to i32 etc. can be 'expanded' to a single node. 7471 ExpandOp(Lo, Lo, Hi); 7472 break; 7473 } 7474 } 7475 7476 // Make sure the resultant values have been legalized themselves, unless this 7477 // is a type that requires multi-step expansion. 7478 if (getTypeAction(NVT) != Expand && NVT != MVT::isVoid) { 7479 Lo = LegalizeOp(Lo); 7480 if (Hi.getNode()) 7481 // Don't legalize the high part if it is expanded to a single node. 7482 Hi = LegalizeOp(Hi); 7483 } 7484 7485 // Remember in a map if the values will be reused later. 7486 bool isNew = 7487 ExpandedNodes.insert(std::make_pair(Op, std::make_pair(Lo, Hi))).second; 7488 assert(isNew && "Value already expanded?!?"); 7489 isNew = isNew; 7490} 7491 7492/// SplitVectorOp - Given an operand of vector type, break it down into 7493/// two smaller values, still of vector type. 7494void SelectionDAGLegalize::SplitVectorOp(SDValue Op, SDValue &Lo, 7495 SDValue &Hi) { 7496 assert(Op.getValueType().isVector() && "Cannot split non-vector type!"); 7497 SDNode *Node = Op.getNode(); 7498 DebugLoc dl = Node->getDebugLoc(); 7499 unsigned NumElements = Op.getValueType().getVectorNumElements(); 7500 assert(NumElements > 1 && "Cannot split a single element vector!"); 7501 7502 MVT NewEltVT = Op.getValueType().getVectorElementType(); 7503 7504 unsigned NewNumElts_Lo = 1 << Log2_32(NumElements-1); 7505 unsigned NewNumElts_Hi = NumElements - NewNumElts_Lo; 7506 7507 MVT NewVT_Lo = MVT::getVectorVT(NewEltVT, NewNumElts_Lo); 7508 MVT NewVT_Hi = MVT::getVectorVT(NewEltVT, NewNumElts_Hi); 7509 7510 // See if we already split it. 7511 std::map<SDValue, std::pair<SDValue, SDValue> >::iterator I 7512 = SplitNodes.find(Op); 7513 if (I != SplitNodes.end()) { 7514 Lo = I->second.first; 7515 Hi = I->second.second; 7516 return; 7517 } 7518 7519 switch (Node->getOpcode()) { 7520 default: 7521#ifndef NDEBUG 7522 Node->dump(&DAG); 7523#endif 7524 assert(0 && "Unhandled operation in SplitVectorOp!"); 7525 case ISD::UNDEF: 7526 Lo = DAG.getUNDEF(NewVT_Lo); 7527 Hi = DAG.getUNDEF(NewVT_Hi); 7528 break; 7529 case ISD::BUILD_PAIR: 7530 Lo = Node->getOperand(0); 7531 Hi = Node->getOperand(1); 7532 break; 7533 case ISD::INSERT_VECTOR_ELT: { 7534 if (ConstantSDNode *Idx = dyn_cast<ConstantSDNode>(Node->getOperand(2))) { 7535 SplitVectorOp(Node->getOperand(0), Lo, Hi); 7536 unsigned Index = Idx->getZExtValue(); 7537 SDValue ScalarOp = Node->getOperand(1); 7538 if (Index < NewNumElts_Lo) 7539 Lo = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, NewVT_Lo, Lo, ScalarOp, 7540 DAG.getIntPtrConstant(Index)); 7541 else 7542 Hi = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, NewVT_Hi, Hi, ScalarOp, 7543 DAG.getIntPtrConstant(Index - NewNumElts_Lo)); 7544 break; 7545 } 7546 SDValue Tmp = PerformInsertVectorEltInMemory(Node->getOperand(0), 7547 Node->getOperand(1), 7548 Node->getOperand(2), dl); 7549 SplitVectorOp(Tmp, Lo, Hi); 7550 break; 7551 } 7552 case ISD::VECTOR_SHUFFLE: { 7553 // Build the low part. 7554 SDValue Mask = Node->getOperand(2); 7555 SmallVector<SDValue, 8> Ops; 7556 MVT PtrVT = TLI.getPointerTy(); 7557 7558 // Insert all of the elements from the input that are needed. We use 7559 // buildvector of extractelement here because the input vectors will have 7560 // to be legalized, so this makes the code simpler. 7561 for (unsigned i = 0; i != NewNumElts_Lo; ++i) { 7562 SDValue IdxNode = Mask.getOperand(i); 7563 if (IdxNode.getOpcode() == ISD::UNDEF) { 7564 Ops.push_back(DAG.getUNDEF(NewEltVT)); 7565 continue; 7566 } 7567 unsigned Idx = cast<ConstantSDNode>(IdxNode)->getZExtValue(); 7568 SDValue InVec = Node->getOperand(0); 7569 if (Idx >= NumElements) { 7570 InVec = Node->getOperand(1); 7571 Idx -= NumElements; 7572 } 7573 Ops.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, NewEltVT, InVec, 7574 DAG.getConstant(Idx, PtrVT))); 7575 } 7576 Lo = DAG.getNode(ISD::BUILD_VECTOR, dl, NewVT_Lo, &Ops[0], Ops.size()); 7577 Ops.clear(); 7578 7579 for (unsigned i = NewNumElts_Lo; i != NumElements; ++i) { 7580 SDValue IdxNode = Mask.getOperand(i); 7581 if (IdxNode.getOpcode() == ISD::UNDEF) { 7582 Ops.push_back(DAG.getUNDEF(NewEltVT)); 7583 continue; 7584 } 7585 unsigned Idx = cast<ConstantSDNode>(IdxNode)->getZExtValue(); 7586 SDValue InVec = Node->getOperand(0); 7587 if (Idx >= NumElements) { 7588 InVec = Node->getOperand(1); 7589 Idx -= NumElements; 7590 } 7591 Ops.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, NewEltVT, InVec, 7592 DAG.getConstant(Idx, PtrVT))); 7593 } 7594 Hi = DAG.getNode(ISD::BUILD_VECTOR, dl, NewVT_Hi, &Ops[0], Ops.size()); 7595 break; 7596 } 7597 case ISD::BUILD_VECTOR: { 7598 SmallVector<SDValue, 8> LoOps(Node->op_begin(), 7599 Node->op_begin()+NewNumElts_Lo); 7600 Lo = DAG.getNode(ISD::BUILD_VECTOR, dl, NewVT_Lo, &LoOps[0], LoOps.size()); 7601 7602 SmallVector<SDValue, 8> HiOps(Node->op_begin()+NewNumElts_Lo, 7603 Node->op_end()); 7604 Hi = DAG.getNode(ISD::BUILD_VECTOR, dl, NewVT_Hi, &HiOps[0], HiOps.size()); 7605 break; 7606 } 7607 case ISD::CONCAT_VECTORS: { 7608 // FIXME: Handle non-power-of-two vectors? 7609 unsigned NewNumSubvectors = Node->getNumOperands() / 2; 7610 if (NewNumSubvectors == 1) { 7611 Lo = Node->getOperand(0); 7612 Hi = Node->getOperand(1); 7613 } else { 7614 SmallVector<SDValue, 8> LoOps(Node->op_begin(), 7615 Node->op_begin()+NewNumSubvectors); 7616 Lo = DAG.getNode(ISD::CONCAT_VECTORS, dl, NewVT_Lo, 7617 &LoOps[0], LoOps.size()); 7618 7619 SmallVector<SDValue, 8> HiOps(Node->op_begin()+NewNumSubvectors, 7620 Node->op_end()); 7621 Hi = DAG.getNode(ISD::CONCAT_VECTORS, dl, NewVT_Hi, 7622 &HiOps[0], HiOps.size()); 7623 } 7624 break; 7625 } 7626 case ISD::EXTRACT_SUBVECTOR: { 7627 SDValue Vec = Op.getOperand(0); 7628 SDValue Idx = Op.getOperand(1); 7629 MVT IdxVT = Idx.getValueType(); 7630 7631 Lo = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, NewVT_Lo, Vec, Idx); 7632 ConstantSDNode *CIdx = dyn_cast<ConstantSDNode>(Idx); 7633 if (CIdx) { 7634 Hi = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, NewVT_Hi, Vec, 7635 DAG.getConstant(CIdx->getZExtValue() + NewNumElts_Lo, 7636 IdxVT)); 7637 } else { 7638 Idx = DAG.getNode(ISD::ADD, dl, IdxVT, Idx, 7639 DAG.getConstant(NewNumElts_Lo, IdxVT)); 7640 Hi = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, NewVT_Hi, Vec, Idx); 7641 } 7642 break; 7643 } 7644 case ISD::SELECT: { 7645 SDValue Cond = Node->getOperand(0); 7646 7647 SDValue LL, LH, RL, RH; 7648 SplitVectorOp(Node->getOperand(1), LL, LH); 7649 SplitVectorOp(Node->getOperand(2), RL, RH); 7650 7651 if (Cond.getValueType().isVector()) { 7652 // Handle a vector merge. 7653 SDValue CL, CH; 7654 SplitVectorOp(Cond, CL, CH); 7655 Lo = DAG.getNode(Node->getOpcode(), dl, NewVT_Lo, CL, LL, RL); 7656 Hi = DAG.getNode(Node->getOpcode(), dl, NewVT_Hi, CH, LH, RH); 7657 } else { 7658 // Handle a simple select with vector operands. 7659 Lo = DAG.getNode(Node->getOpcode(), dl, NewVT_Lo, Cond, LL, RL); 7660 Hi = DAG.getNode(Node->getOpcode(), dl, NewVT_Hi, Cond, LH, RH); 7661 } 7662 break; 7663 } 7664 case ISD::SELECT_CC: { 7665 SDValue CondLHS = Node->getOperand(0); 7666 SDValue CondRHS = Node->getOperand(1); 7667 SDValue CondCode = Node->getOperand(4); 7668 7669 SDValue LL, LH, RL, RH; 7670 SplitVectorOp(Node->getOperand(2), LL, LH); 7671 SplitVectorOp(Node->getOperand(3), RL, RH); 7672 7673 // Handle a simple select with vector operands. 7674 Lo = DAG.getNode(ISD::SELECT_CC, dl, NewVT_Lo, CondLHS, CondRHS, 7675 LL, RL, CondCode); 7676 Hi = DAG.getNode(ISD::SELECT_CC, dl, NewVT_Hi, CondLHS, CondRHS, 7677 LH, RH, CondCode); 7678 break; 7679 } 7680 case ISD::VSETCC: { 7681 SDValue LL, LH, RL, RH; 7682 SplitVectorOp(Node->getOperand(0), LL, LH); 7683 SplitVectorOp(Node->getOperand(1), RL, RH); 7684 Lo = DAG.getNode(ISD::VSETCC, dl, NewVT_Lo, LL, RL, Node->getOperand(2)); 7685 Hi = DAG.getNode(ISD::VSETCC, dl, NewVT_Hi, LH, RH, Node->getOperand(2)); 7686 break; 7687 } 7688 case ISD::ADD: 7689 case ISD::SUB: 7690 case ISD::MUL: 7691 case ISD::FADD: 7692 case ISD::FSUB: 7693 case ISD::FMUL: 7694 case ISD::SDIV: 7695 case ISD::UDIV: 7696 case ISD::FDIV: 7697 case ISD::FPOW: 7698 case ISD::AND: 7699 case ISD::OR: 7700 case ISD::XOR: 7701 case ISD::UREM: 7702 case ISD::SREM: 7703 case ISD::FREM: 7704 case ISD::SHL: 7705 case ISD::SRA: 7706 case ISD::SRL: { 7707 SDValue LL, LH, RL, RH; 7708 SplitVectorOp(Node->getOperand(0), LL, LH); 7709 SplitVectorOp(Node->getOperand(1), RL, RH); 7710 7711 Lo = DAG.getNode(Node->getOpcode(), dl, NewVT_Lo, LL, RL); 7712 Hi = DAG.getNode(Node->getOpcode(), dl, NewVT_Hi, LH, RH); 7713 break; 7714 } 7715 case ISD::FP_ROUND: 7716 case ISD::FPOWI: { 7717 SDValue L, H; 7718 SplitVectorOp(Node->getOperand(0), L, H); 7719 7720 Lo = DAG.getNode(Node->getOpcode(), dl, NewVT_Lo, L, Node->getOperand(1)); 7721 Hi = DAG.getNode(Node->getOpcode(), dl, NewVT_Hi, H, Node->getOperand(1)); 7722 break; 7723 } 7724 case ISD::CTTZ: 7725 case ISD::CTLZ: 7726 case ISD::CTPOP: 7727 case ISD::FNEG: 7728 case ISD::FABS: 7729 case ISD::FSQRT: 7730 case ISD::FSIN: 7731 case ISD::FCOS: 7732 case ISD::FLOG: 7733 case ISD::FLOG2: 7734 case ISD::FLOG10: 7735 case ISD::FEXP: 7736 case ISD::FEXP2: 7737 case ISD::FP_TO_SINT: 7738 case ISD::FP_TO_UINT: 7739 case ISD::SINT_TO_FP: 7740 case ISD::UINT_TO_FP: 7741 case ISD::TRUNCATE: 7742 case ISD::ANY_EXTEND: 7743 case ISD::SIGN_EXTEND: 7744 case ISD::ZERO_EXTEND: 7745 case ISD::FP_EXTEND: { 7746 SDValue L, H; 7747 SplitVectorOp(Node->getOperand(0), L, H); 7748 7749 Lo = DAG.getNode(Node->getOpcode(), dl, NewVT_Lo, L); 7750 Hi = DAG.getNode(Node->getOpcode(), dl, NewVT_Hi, H); 7751 break; 7752 } 7753 case ISD::CONVERT_RNDSAT: { 7754 ISD::CvtCode CvtCode = cast<CvtRndSatSDNode>(Node)->getCvtCode(); 7755 SDValue L, H; 7756 SplitVectorOp(Node->getOperand(0), L, H); 7757 SDValue DTyOpL = DAG.getValueType(NewVT_Lo); 7758 SDValue DTyOpH = DAG.getValueType(NewVT_Hi); 7759 SDValue STyOpL = DAG.getValueType(L.getValueType()); 7760 SDValue STyOpH = DAG.getValueType(H.getValueType()); 7761 7762 SDValue RndOp = Node->getOperand(3); 7763 SDValue SatOp = Node->getOperand(4); 7764 7765 Lo = DAG.getConvertRndSat(NewVT_Lo, dl, L, DTyOpL, STyOpL, 7766 RndOp, SatOp, CvtCode); 7767 Hi = DAG.getConvertRndSat(NewVT_Hi, dl, H, DTyOpH, STyOpH, 7768 RndOp, SatOp, CvtCode); 7769 break; 7770 } 7771 case ISD::LOAD: { 7772 LoadSDNode *LD = cast<LoadSDNode>(Node); 7773 SDValue Ch = LD->getChain(); 7774 SDValue Ptr = LD->getBasePtr(); 7775 ISD::LoadExtType ExtType = LD->getExtensionType(); 7776 const Value *SV = LD->getSrcValue(); 7777 int SVOffset = LD->getSrcValueOffset(); 7778 MVT MemoryVT = LD->getMemoryVT(); 7779 unsigned Alignment = LD->getAlignment(); 7780 bool isVolatile = LD->isVolatile(); 7781 7782 assert(LD->isUnindexed() && "Indexed vector loads are not supported yet!"); 7783 SDValue Offset = DAG.getUNDEF(Ptr.getValueType()); 7784 7785 MVT MemNewEltVT = MemoryVT.getVectorElementType(); 7786 MVT MemNewVT_Lo = MVT::getVectorVT(MemNewEltVT, NewNumElts_Lo); 7787 MVT MemNewVT_Hi = MVT::getVectorVT(MemNewEltVT, NewNumElts_Hi); 7788 7789 Lo = DAG.getLoad(ISD::UNINDEXED, dl, ExtType, 7790 NewVT_Lo, Ch, Ptr, Offset, 7791 SV, SVOffset, MemNewVT_Lo, isVolatile, Alignment); 7792 unsigned IncrementSize = NewNumElts_Lo * MemNewEltVT.getSizeInBits()/8; 7793 Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr, 7794 DAG.getIntPtrConstant(IncrementSize)); 7795 SVOffset += IncrementSize; 7796 Alignment = MinAlign(Alignment, IncrementSize); 7797 Hi = DAG.getLoad(ISD::UNINDEXED, dl, ExtType, 7798 NewVT_Hi, Ch, Ptr, Offset, 7799 SV, SVOffset, MemNewVT_Hi, isVolatile, Alignment); 7800 7801 // Build a factor node to remember that this load is independent of the 7802 // other one. 7803 SDValue TF = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo.getValue(1), 7804 Hi.getValue(1)); 7805 7806 // Remember that we legalized the chain. 7807 AddLegalizedOperand(Op.getValue(1), LegalizeOp(TF)); 7808 break; 7809 } 7810 case ISD::BIT_CONVERT: { 7811 // We know the result is a vector. The input may be either a vector or a 7812 // scalar value. 7813 SDValue InOp = Node->getOperand(0); 7814 if (!InOp.getValueType().isVector() || 7815 InOp.getValueType().getVectorNumElements() == 1) { 7816 // The input is a scalar or single-element vector. 7817 // Lower to a store/load so that it can be split. 7818 // FIXME: this could be improved probably. 7819 unsigned LdAlign = TLI.getTargetData()->getPrefTypeAlignment( 7820 Op.getValueType().getTypeForMVT()); 7821 SDValue Ptr = DAG.CreateStackTemporary(InOp.getValueType(), LdAlign); 7822 int FI = cast<FrameIndexSDNode>(Ptr.getNode())->getIndex(); 7823 7824 SDValue St = DAG.getStore(DAG.getEntryNode(), dl, 7825 InOp, Ptr, 7826 PseudoSourceValue::getFixedStack(FI), 0); 7827 InOp = DAG.getLoad(Op.getValueType(), dl, St, Ptr, 7828 PseudoSourceValue::getFixedStack(FI), 0); 7829 } 7830 // Split the vector and convert each of the pieces now. 7831 SplitVectorOp(InOp, Lo, Hi); 7832 Lo = DAG.getNode(ISD::BIT_CONVERT, dl, NewVT_Lo, Lo); 7833 Hi = DAG.getNode(ISD::BIT_CONVERT, dl, NewVT_Hi, Hi); 7834 break; 7835 } 7836 } 7837 7838 // Remember in a map if the values will be reused later. 7839 bool isNew = 7840 SplitNodes.insert(std::make_pair(Op, std::make_pair(Lo, Hi))).second; 7841 assert(isNew && "Value already split?!?"); 7842 isNew = isNew; 7843} 7844 7845 7846/// ScalarizeVectorOp - Given an operand of single-element vector type 7847/// (e.g. v1f32), convert it into the equivalent operation that returns a 7848/// scalar (e.g. f32) value. 7849SDValue SelectionDAGLegalize::ScalarizeVectorOp(SDValue Op) { 7850 assert(Op.getValueType().isVector() && "Bad ScalarizeVectorOp invocation!"); 7851 SDNode *Node = Op.getNode(); 7852 DebugLoc dl = Node->getDebugLoc(); 7853 MVT NewVT = Op.getValueType().getVectorElementType(); 7854 assert(Op.getValueType().getVectorNumElements() == 1); 7855 7856 // See if we already scalarized it. 7857 std::map<SDValue, SDValue>::iterator I = ScalarizedNodes.find(Op); 7858 if (I != ScalarizedNodes.end()) return I->second; 7859 7860 SDValue Result; 7861 switch (Node->getOpcode()) { 7862 default: 7863#ifndef NDEBUG 7864 Node->dump(&DAG); cerr << "\n"; 7865#endif 7866 assert(0 && "Unknown vector operation in ScalarizeVectorOp!"); 7867 case ISD::ADD: 7868 case ISD::FADD: 7869 case ISD::SUB: 7870 case ISD::FSUB: 7871 case ISD::MUL: 7872 case ISD::FMUL: 7873 case ISD::SDIV: 7874 case ISD::UDIV: 7875 case ISD::FDIV: 7876 case ISD::SREM: 7877 case ISD::UREM: 7878 case ISD::FREM: 7879 case ISD::FPOW: 7880 case ISD::AND: 7881 case ISD::OR: 7882 case ISD::XOR: 7883 Result = DAG.getNode(Node->getOpcode(), dl, 7884 NewVT, 7885 ScalarizeVectorOp(Node->getOperand(0)), 7886 ScalarizeVectorOp(Node->getOperand(1))); 7887 break; 7888 case ISD::FNEG: 7889 case ISD::FABS: 7890 case ISD::FSQRT: 7891 case ISD::FSIN: 7892 case ISD::FCOS: 7893 case ISD::FLOG: 7894 case ISD::FLOG2: 7895 case ISD::FLOG10: 7896 case ISD::FEXP: 7897 case ISD::FEXP2: 7898 case ISD::FP_TO_SINT: 7899 case ISD::FP_TO_UINT: 7900 case ISD::SINT_TO_FP: 7901 case ISD::UINT_TO_FP: 7902 case ISD::SIGN_EXTEND: 7903 case ISD::ZERO_EXTEND: 7904 case ISD::ANY_EXTEND: 7905 case ISD::TRUNCATE: 7906 case ISD::FP_EXTEND: 7907 Result = DAG.getNode(Node->getOpcode(), dl, 7908 NewVT, 7909 ScalarizeVectorOp(Node->getOperand(0))); 7910 break; 7911 case ISD::CONVERT_RNDSAT: { 7912 SDValue Op0 = ScalarizeVectorOp(Node->getOperand(0)); 7913 Result = DAG.getConvertRndSat(NewVT, dl, Op0, 7914 DAG.getValueType(NewVT), 7915 DAG.getValueType(Op0.getValueType()), 7916 Node->getOperand(3), 7917 Node->getOperand(4), 7918 cast<CvtRndSatSDNode>(Node)->getCvtCode()); 7919 break; 7920 } 7921 case ISD::FPOWI: 7922 case ISD::FP_ROUND: 7923 Result = DAG.getNode(Node->getOpcode(), dl, 7924 NewVT, 7925 ScalarizeVectorOp(Node->getOperand(0)), 7926 Node->getOperand(1)); 7927 break; 7928 case ISD::LOAD: { 7929 LoadSDNode *LD = cast<LoadSDNode>(Node); 7930 SDValue Ch = LegalizeOp(LD->getChain()); // Legalize the chain. 7931 SDValue Ptr = LegalizeOp(LD->getBasePtr()); // Legalize the pointer. 7932 ISD::LoadExtType ExtType = LD->getExtensionType(); 7933 const Value *SV = LD->getSrcValue(); 7934 int SVOffset = LD->getSrcValueOffset(); 7935 MVT MemoryVT = LD->getMemoryVT(); 7936 unsigned Alignment = LD->getAlignment(); 7937 bool isVolatile = LD->isVolatile(); 7938 7939 assert(LD->isUnindexed() && "Indexed vector loads are not supported yet!"); 7940 SDValue Offset = DAG.getUNDEF(Ptr.getValueType()); 7941 7942 Result = DAG.getLoad(ISD::UNINDEXED, dl, ExtType, 7943 NewVT, Ch, Ptr, Offset, SV, SVOffset, 7944 MemoryVT.getVectorElementType(), 7945 isVolatile, Alignment); 7946 7947 // Remember that we legalized the chain. 7948 AddLegalizedOperand(Op.getValue(1), LegalizeOp(Result.getValue(1))); 7949 break; 7950 } 7951 case ISD::BUILD_VECTOR: 7952 Result = Node->getOperand(0); 7953 break; 7954 case ISD::INSERT_VECTOR_ELT: 7955 // Returning the inserted scalar element. 7956 Result = Node->getOperand(1); 7957 break; 7958 case ISD::CONCAT_VECTORS: 7959 assert(Node->getOperand(0).getValueType() == NewVT && 7960 "Concat of non-legal vectors not yet supported!"); 7961 Result = Node->getOperand(0); 7962 break; 7963 case ISD::VECTOR_SHUFFLE: { 7964 // Figure out if the scalar is the LHS or RHS and return it. 7965 SDValue EltNum = Node->getOperand(2).getOperand(0); 7966 if (cast<ConstantSDNode>(EltNum)->getZExtValue()) 7967 Result = ScalarizeVectorOp(Node->getOperand(1)); 7968 else 7969 Result = ScalarizeVectorOp(Node->getOperand(0)); 7970 break; 7971 } 7972 case ISD::EXTRACT_SUBVECTOR: 7973 Result = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, NewVT, 7974 Node->getOperand(0), Node->getOperand(1)); 7975 break; 7976 case ISD::BIT_CONVERT: { 7977 SDValue Op0 = Op.getOperand(0); 7978 if (Op0.getValueType().getVectorNumElements() == 1) 7979 Op0 = ScalarizeVectorOp(Op0); 7980 Result = DAG.getNode(ISD::BIT_CONVERT, dl, NewVT, Op0); 7981 break; 7982 } 7983 case ISD::SELECT: 7984 Result = DAG.getNode(ISD::SELECT, dl, NewVT, Op.getOperand(0), 7985 ScalarizeVectorOp(Op.getOperand(1)), 7986 ScalarizeVectorOp(Op.getOperand(2))); 7987 break; 7988 case ISD::SELECT_CC: 7989 Result = DAG.getNode(ISD::SELECT_CC, dl, NewVT, Node->getOperand(0), 7990 Node->getOperand(1), 7991 ScalarizeVectorOp(Op.getOperand(2)), 7992 ScalarizeVectorOp(Op.getOperand(3)), 7993 Node->getOperand(4)); 7994 break; 7995 case ISD::VSETCC: { 7996 SDValue Op0 = ScalarizeVectorOp(Op.getOperand(0)); 7997 SDValue Op1 = ScalarizeVectorOp(Op.getOperand(1)); 7998 Result = DAG.getNode(ISD::SETCC, dl, 7999 TLI.getSetCCResultType(Op0.getValueType()), 8000 Op0, Op1, Op.getOperand(2)); 8001 Result = DAG.getNode(ISD::SELECT, dl, NewVT, Result, 8002 DAG.getConstant(-1ULL, NewVT), 8003 DAG.getConstant(0ULL, NewVT)); 8004 break; 8005 } 8006 } 8007 8008 if (TLI.isTypeLegal(NewVT)) 8009 Result = LegalizeOp(Result); 8010 bool isNew = ScalarizedNodes.insert(std::make_pair(Op, Result)).second; 8011 assert(isNew && "Value already scalarized?"); 8012 isNew = isNew; 8013 return Result; 8014} 8015 8016 8017SDValue SelectionDAGLegalize::WidenVectorOp(SDValue Op, MVT WidenVT) { 8018 std::map<SDValue, SDValue>::iterator I = WidenNodes.find(Op); 8019 if (I != WidenNodes.end()) return I->second; 8020 8021 MVT VT = Op.getValueType(); 8022 assert(VT.isVector() && "Cannot widen non-vector type!"); 8023 8024 SDValue Result; 8025 SDNode *Node = Op.getNode(); 8026 DebugLoc dl = Node->getDebugLoc(); 8027 MVT EVT = VT.getVectorElementType(); 8028 8029 unsigned NumElts = VT.getVectorNumElements(); 8030 unsigned NewNumElts = WidenVT.getVectorNumElements(); 8031 assert(NewNumElts > NumElts && "Cannot widen to smaller type!"); 8032 assert(NewNumElts < 17); 8033 8034 // When widen is called, it is assumed that it is more efficient to use a 8035 // wide type. The default action is to widen to operation to a wider legal 8036 // vector type and then do the operation if it is legal by calling LegalizeOp 8037 // again. If there is no vector equivalent, we will unroll the operation, do 8038 // it, and rebuild the vector. If most of the operations are vectorizible to 8039 // the legal type, the resulting code will be more efficient. If this is not 8040 // the case, the resulting code will preform badly as we end up generating 8041 // code to pack/unpack the results. It is the function that calls widen 8042 // that is responsible for seeing this doesn't happen. 8043 switch (Node->getOpcode()) { 8044 default: 8045#ifndef NDEBUG 8046 Node->dump(&DAG); 8047#endif 8048 assert(0 && "Unexpected operation in WidenVectorOp!"); 8049 break; 8050 case ISD::CopyFromReg: 8051 assert(0 && "CopyFromReg doesn't need widening!"); 8052 case ISD::Constant: 8053 case ISD::ConstantFP: 8054 // To build a vector of these elements, clients should call BuildVector 8055 // and with each element instead of creating a node with a vector type 8056 assert(0 && "Unexpected operation in WidenVectorOp!"); 8057 case ISD::VAARG: 8058 // Variable Arguments with vector types doesn't make any sense to me 8059 assert(0 && "Unexpected operation in WidenVectorOp!"); 8060 break; 8061 case ISD::UNDEF: 8062 Result = DAG.getUNDEF(WidenVT); 8063 break; 8064 case ISD::BUILD_VECTOR: { 8065 // Build a vector with undefined for the new nodes 8066 SDValueVector NewOps(Node->op_begin(), Node->op_end()); 8067 for (unsigned i = NumElts; i < NewNumElts; ++i) { 8068 NewOps.push_back(DAG.getUNDEF(EVT)); 8069 } 8070 Result = DAG.getNode(ISD::BUILD_VECTOR, dl, WidenVT, 8071 &NewOps[0], NewOps.size()); 8072 break; 8073 } 8074 case ISD::INSERT_VECTOR_ELT: { 8075 SDValue Tmp1 = WidenVectorOp(Node->getOperand(0), WidenVT); 8076 Result = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, WidenVT, Tmp1, 8077 Node->getOperand(1), Node->getOperand(2)); 8078 break; 8079 } 8080 case ISD::VECTOR_SHUFFLE: { 8081 SDValue Tmp1 = WidenVectorOp(Node->getOperand(0), WidenVT); 8082 SDValue Tmp2 = WidenVectorOp(Node->getOperand(1), WidenVT); 8083 // VECTOR_SHUFFLE 3rd operand must be a constant build vector that is 8084 // used as permutation array. We build the vector here instead of widening 8085 // because we don't want to legalize and have it turned to something else. 8086 SDValue PermOp = Node->getOperand(2); 8087 SDValueVector NewOps; 8088 MVT PVT = PermOp.getValueType().getVectorElementType(); 8089 for (unsigned i = 0; i < NumElts; ++i) { 8090 if (PermOp.getOperand(i).getOpcode() == ISD::UNDEF) { 8091 NewOps.push_back(PermOp.getOperand(i)); 8092 } else { 8093 unsigned Idx = 8094 cast<ConstantSDNode>(PermOp.getOperand(i))->getZExtValue(); 8095 if (Idx < NumElts) { 8096 NewOps.push_back(PermOp.getOperand(i)); 8097 } 8098 else { 8099 NewOps.push_back(DAG.getConstant(Idx + NewNumElts - NumElts, 8100 PermOp.getOperand(i).getValueType())); 8101 } 8102 } 8103 } 8104 for (unsigned i = NumElts; i < NewNumElts; ++i) { 8105 NewOps.push_back(DAG.getUNDEF(PVT)); 8106 } 8107 8108 SDValue Tmp3 = DAG.getNode(ISD::BUILD_VECTOR, dl, 8109 MVT::getVectorVT(PVT, NewOps.size()), 8110 &NewOps[0], NewOps.size()); 8111 8112 Result = DAG.getNode(ISD::VECTOR_SHUFFLE, dl, WidenVT, Tmp1, Tmp2, Tmp3); 8113 break; 8114 } 8115 case ISD::LOAD: { 8116 // If the load widen returns true, we can use a single load for the 8117 // vector. Otherwise, it is returning a token factor for multiple 8118 // loads. 8119 SDValue TFOp; 8120 if (LoadWidenVectorOp(Result, TFOp, Op, WidenVT)) 8121 AddLegalizedOperand(Op.getValue(1), LegalizeOp(TFOp.getValue(1))); 8122 else 8123 AddLegalizedOperand(Op.getValue(1), LegalizeOp(TFOp.getValue(0))); 8124 break; 8125 } 8126 8127 case ISD::BIT_CONVERT: { 8128 SDValue Tmp1 = Node->getOperand(0); 8129 // Converts between two different types so we need to determine 8130 // the correct widen type for the input operand. 8131 MVT InVT = Tmp1.getValueType(); 8132 unsigned WidenSize = WidenVT.getSizeInBits(); 8133 if (InVT.isVector()) { 8134 MVT InEltVT = InVT.getVectorElementType(); 8135 unsigned InEltSize = InEltVT.getSizeInBits(); 8136 assert(WidenSize % InEltSize == 0 && 8137 "can not widen bit convert that are not multiple of element type"); 8138 MVT NewInWidenVT = MVT::getVectorVT(InEltVT, WidenSize / InEltSize); 8139 Tmp1 = WidenVectorOp(Tmp1, NewInWidenVT); 8140 assert(Tmp1.getValueType().getSizeInBits() == WidenVT.getSizeInBits()); 8141 Result = DAG.getNode(ISD::BIT_CONVERT, dl, WidenVT, Tmp1); 8142 } else { 8143 // If the result size is a multiple of the input size, widen the input 8144 // and then convert. 8145 unsigned InSize = InVT.getSizeInBits(); 8146 assert(WidenSize % InSize == 0 && 8147 "can not widen bit convert that are not multiple of element type"); 8148 unsigned NewNumElts = WidenSize / InSize; 8149 SmallVector<SDValue, 16> Ops(NewNumElts); 8150 SDValue UndefVal = DAG.getUNDEF(InVT); 8151 Ops[0] = Tmp1; 8152 for (unsigned i = 1; i < NewNumElts; ++i) 8153 Ops[i] = UndefVal; 8154 8155 MVT NewInVT = MVT::getVectorVT(InVT, NewNumElts); 8156 Result = DAG.getNode(ISD::BUILD_VECTOR, dl, NewInVT, &Ops[0], NewNumElts); 8157 Result = DAG.getNode(ISD::BIT_CONVERT, dl, WidenVT, Result); 8158 } 8159 break; 8160 } 8161 8162 case ISD::SINT_TO_FP: 8163 case ISD::UINT_TO_FP: 8164 case ISD::FP_TO_SINT: 8165 case ISD::FP_TO_UINT: 8166 case ISD::FP_ROUND: { 8167 SDValue Tmp1 = Node->getOperand(0); 8168 // Converts between two different types so we need to determine 8169 // the correct widen type for the input operand. 8170 MVT TVT = Tmp1.getValueType(); 8171 assert(TVT.isVector() && "can not widen non vector type"); 8172 MVT TEVT = TVT.getVectorElementType(); 8173 MVT TWidenVT = MVT::getVectorVT(TEVT, NewNumElts); 8174 Tmp1 = WidenVectorOp(Tmp1, TWidenVT); 8175 assert(Tmp1.getValueType().getVectorNumElements() == NewNumElts); 8176 Result = DAG.getNode(Node->getOpcode(), dl, WidenVT, Tmp1); 8177 break; 8178 } 8179 8180 case ISD::FP_EXTEND: 8181 assert(0 && "Case not implemented. Dynamically dead with 2 FP types!"); 8182 case ISD::TRUNCATE: 8183 case ISD::SIGN_EXTEND: 8184 case ISD::ZERO_EXTEND: 8185 case ISD::ANY_EXTEND: 8186 case ISD::SIGN_EXTEND_INREG: 8187 case ISD::FABS: 8188 case ISD::FNEG: 8189 case ISD::FSQRT: 8190 case ISD::FSIN: 8191 case ISD::FCOS: 8192 case ISD::CTPOP: 8193 case ISD::CTTZ: 8194 case ISD::CTLZ: { 8195 // Unary op widening 8196 SDValue Tmp1; 8197 Tmp1 = WidenVectorOp(Node->getOperand(0), WidenVT); 8198 assert(Tmp1.getValueType() == WidenVT); 8199 Result = DAG.getNode(Node->getOpcode(), dl, WidenVT, Tmp1); 8200 break; 8201 } 8202 case ISD::CONVERT_RNDSAT: { 8203 SDValue RndOp = Node->getOperand(3); 8204 SDValue SatOp = Node->getOperand(4); 8205 SDValue SrcOp = Node->getOperand(0); 8206 8207 // Converts between two different types so we need to determine 8208 // the correct widen type for the input operand. 8209 MVT SVT = SrcOp.getValueType(); 8210 assert(SVT.isVector() && "can not widen non vector type"); 8211 MVT SEVT = SVT.getVectorElementType(); 8212 MVT SWidenVT = MVT::getVectorVT(SEVT, NewNumElts); 8213 8214 SrcOp = WidenVectorOp(SrcOp, SWidenVT); 8215 assert(SrcOp.getValueType() == WidenVT); 8216 SDValue DTyOp = DAG.getValueType(WidenVT); 8217 SDValue STyOp = DAG.getValueType(SrcOp.getValueType()); 8218 ISD::CvtCode CvtCode = cast<CvtRndSatSDNode>(Node)->getCvtCode(); 8219 8220 Result = DAG.getConvertRndSat(WidenVT, dl, SrcOp, DTyOp, STyOp, 8221 RndOp, SatOp, CvtCode); 8222 break; 8223 } 8224 case ISD::FPOW: 8225 case ISD::FPOWI: 8226 case ISD::ADD: 8227 case ISD::SUB: 8228 case ISD::MUL: 8229 case ISD::MULHS: 8230 case ISD::MULHU: 8231 case ISD::AND: 8232 case ISD::OR: 8233 case ISD::XOR: 8234 case ISD::FADD: 8235 case ISD::FSUB: 8236 case ISD::FMUL: 8237 case ISD::SDIV: 8238 case ISD::SREM: 8239 case ISD::FDIV: 8240 case ISD::FREM: 8241 case ISD::FCOPYSIGN: 8242 case ISD::UDIV: 8243 case ISD::UREM: 8244 case ISD::BSWAP: { 8245 // Binary op widening 8246 SDValue Tmp1 = WidenVectorOp(Node->getOperand(0), WidenVT); 8247 SDValue Tmp2 = WidenVectorOp(Node->getOperand(1), WidenVT); 8248 assert(Tmp1.getValueType() == WidenVT && Tmp2.getValueType() == WidenVT); 8249 Result = DAG.getNode(Node->getOpcode(), dl, WidenVT, Tmp1, Tmp2); 8250 break; 8251 } 8252 8253 case ISD::SHL: 8254 case ISD::SRA: 8255 case ISD::SRL: { 8256 SDValue Tmp1 = WidenVectorOp(Node->getOperand(0), WidenVT); 8257 assert(Tmp1.getValueType() == WidenVT); 8258 SDValue ShOp = Node->getOperand(1); 8259 MVT ShVT = ShOp.getValueType(); 8260 MVT NewShVT = MVT::getVectorVT(ShVT.getVectorElementType(), 8261 WidenVT.getVectorNumElements()); 8262 ShOp = WidenVectorOp(ShOp, NewShVT); 8263 assert(ShOp.getValueType() == NewShVT); 8264 Result = DAG.getNode(Node->getOpcode(), dl, WidenVT, Tmp1, ShOp); 8265 break; 8266 } 8267 8268 case ISD::EXTRACT_VECTOR_ELT: { 8269 SDValue Tmp1 = WidenVectorOp(Node->getOperand(0), WidenVT); 8270 assert(Tmp1.getValueType() == WidenVT); 8271 Result = DAG.getNode(Node->getOpcode(), dl, EVT, Tmp1, Node->getOperand(1)); 8272 break; 8273 } 8274 case ISD::CONCAT_VECTORS: { 8275 // We concurrently support only widen on a multiple of the incoming vector. 8276 // We could widen on a multiple of the incoming operand if necessary. 8277 unsigned NumConcat = NewNumElts / NumElts; 8278 assert(NewNumElts % NumElts == 0 && "Can widen only a multiple of vector"); 8279 SDValue UndefVal = DAG.getUNDEF(VT); 8280 SmallVector<SDValue, 8> MOps; 8281 MOps.push_back(Op); 8282 for (unsigned i = 1; i != NumConcat; ++i) { 8283 MOps.push_back(UndefVal); 8284 } 8285 Result = LegalizeOp(DAG.getNode(ISD::CONCAT_VECTORS, dl, WidenVT, 8286 &MOps[0], MOps.size())); 8287 break; 8288 } 8289 case ISD::EXTRACT_SUBVECTOR: { 8290 SDValue Tmp1 = Node->getOperand(0); 8291 SDValue Idx = Node->getOperand(1); 8292 ConstantSDNode *CIdx = dyn_cast<ConstantSDNode>(Idx); 8293 if (CIdx && CIdx->getZExtValue() == 0) { 8294 // Since we are access the start of the vector, the incoming 8295 // vector type might be the proper. 8296 MVT Tmp1VT = Tmp1.getValueType(); 8297 if (Tmp1VT == WidenVT) 8298 return Tmp1; 8299 else { 8300 unsigned Tmp1VTNumElts = Tmp1VT.getVectorNumElements(); 8301 if (Tmp1VTNumElts < NewNumElts) 8302 Result = WidenVectorOp(Tmp1, WidenVT); 8303 else 8304 Result = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, WidenVT, Tmp1, Idx); 8305 } 8306 } else if (NewNumElts % NumElts == 0) { 8307 // Widen the extracted subvector. 8308 unsigned NumConcat = NewNumElts / NumElts; 8309 SDValue UndefVal = DAG.getUNDEF(VT); 8310 SmallVector<SDValue, 8> MOps; 8311 MOps.push_back(Op); 8312 for (unsigned i = 1; i != NumConcat; ++i) { 8313 MOps.push_back(UndefVal); 8314 } 8315 Result = LegalizeOp(DAG.getNode(ISD::CONCAT_VECTORS, dl, WidenVT, 8316 &MOps[0], MOps.size())); 8317 } else { 8318 assert(0 && "can not widen extract subvector"); 8319 // This could be implemented using insert and build vector but I would 8320 // like to see when this happens. 8321 } 8322 break; 8323 } 8324 8325 case ISD::SELECT: { 8326 // Determine new condition widen type and widen 8327 SDValue Cond1 = Node->getOperand(0); 8328 MVT CondVT = Cond1.getValueType(); 8329 assert(CondVT.isVector() && "can not widen non vector type"); 8330 MVT CondEVT = CondVT.getVectorElementType(); 8331 MVT CondWidenVT = MVT::getVectorVT(CondEVT, NewNumElts); 8332 Cond1 = WidenVectorOp(Cond1, CondWidenVT); 8333 assert(Cond1.getValueType() == CondWidenVT && "Condition not widen"); 8334 8335 SDValue Tmp1 = WidenVectorOp(Node->getOperand(1), WidenVT); 8336 SDValue Tmp2 = WidenVectorOp(Node->getOperand(2), WidenVT); 8337 assert(Tmp1.getValueType() == WidenVT && Tmp2.getValueType() == WidenVT); 8338 Result = DAG.getNode(Node->getOpcode(), dl, WidenVT, Cond1, Tmp1, Tmp2); 8339 break; 8340 } 8341 8342 case ISD::SELECT_CC: { 8343 // Determine new condition widen type and widen 8344 SDValue Cond1 = Node->getOperand(0); 8345 SDValue Cond2 = Node->getOperand(1); 8346 MVT CondVT = Cond1.getValueType(); 8347 assert(CondVT.isVector() && "can not widen non vector type"); 8348 assert(CondVT == Cond2.getValueType() && "mismatch lhs/rhs"); 8349 MVT CondEVT = CondVT.getVectorElementType(); 8350 MVT CondWidenVT = MVT::getVectorVT(CondEVT, NewNumElts); 8351 Cond1 = WidenVectorOp(Cond1, CondWidenVT); 8352 Cond2 = WidenVectorOp(Cond2, CondWidenVT); 8353 assert(Cond1.getValueType() == CondWidenVT && 8354 Cond2.getValueType() == CondWidenVT && "condition not widen"); 8355 8356 SDValue Tmp1 = WidenVectorOp(Node->getOperand(2), WidenVT); 8357 SDValue Tmp2 = WidenVectorOp(Node->getOperand(3), WidenVT); 8358 assert(Tmp1.getValueType() == WidenVT && Tmp2.getValueType() == WidenVT && 8359 "operands not widen"); 8360 Result = DAG.getNode(Node->getOpcode(), dl, WidenVT, Cond1, Cond2, Tmp1, 8361 Tmp2, Node->getOperand(4)); 8362 break; 8363 } 8364 case ISD::VSETCC: { 8365 // Determine widen for the operand 8366 SDValue Tmp1 = Node->getOperand(0); 8367 MVT TmpVT = Tmp1.getValueType(); 8368 assert(TmpVT.isVector() && "can not widen non vector type"); 8369 MVT TmpEVT = TmpVT.getVectorElementType(); 8370 MVT TmpWidenVT = MVT::getVectorVT(TmpEVT, NewNumElts); 8371 Tmp1 = WidenVectorOp(Tmp1, TmpWidenVT); 8372 SDValue Tmp2 = WidenVectorOp(Node->getOperand(1), TmpWidenVT); 8373 Result = DAG.getNode(Node->getOpcode(), dl, WidenVT, Tmp1, Tmp2, 8374 Node->getOperand(2)); 8375 break; 8376 } 8377 case ISD::ATOMIC_CMP_SWAP: 8378 case ISD::ATOMIC_LOAD_ADD: 8379 case ISD::ATOMIC_LOAD_SUB: 8380 case ISD::ATOMIC_LOAD_AND: 8381 case ISD::ATOMIC_LOAD_OR: 8382 case ISD::ATOMIC_LOAD_XOR: 8383 case ISD::ATOMIC_LOAD_NAND: 8384 case ISD::ATOMIC_LOAD_MIN: 8385 case ISD::ATOMIC_LOAD_MAX: 8386 case ISD::ATOMIC_LOAD_UMIN: 8387 case ISD::ATOMIC_LOAD_UMAX: 8388 case ISD::ATOMIC_SWAP: { 8389 // For now, we assume that using vectors for these operations don't make 8390 // much sense so we just split it. We return an empty result 8391 SDValue X, Y; 8392 SplitVectorOp(Op, X, Y); 8393 return Result; 8394 break; 8395 } 8396 8397 } // end switch (Node->getOpcode()) 8398 8399 assert(Result.getNode() && "Didn't set a result!"); 8400 if (Result != Op) 8401 Result = LegalizeOp(Result); 8402 8403 AddWidenedOperand(Op, Result); 8404 return Result; 8405} 8406 8407// Utility function to find a legal vector type and its associated element 8408// type from a preferred width and whose vector type must be the same size 8409// as the VVT. 8410// TLI: Target lowering used to determine legal types 8411// Width: Preferred width of element type 8412// VVT: Vector value type whose size we must match. 8413// Returns VecEVT and EVT - the vector type and its associated element type 8414static void FindWidenVecType(const TargetLowering &TLI, unsigned Width, MVT VVT, 8415 MVT& EVT, MVT& VecEVT) { 8416 // We start with the preferred width, make it a power of 2 and see if 8417 // we can find a vector type of that width. If not, we reduce it by 8418 // another power of 2. If we have widen the type, a vector of bytes should 8419 // always be legal. 8420 assert(TLI.isTypeLegal(VVT)); 8421 unsigned EWidth = Width + 1; 8422 do { 8423 assert(EWidth > 0); 8424 EWidth = (1 << Log2_32(EWidth-1)); 8425 EVT = MVT::getIntegerVT(EWidth); 8426 unsigned NumEVT = VVT.getSizeInBits()/EWidth; 8427 VecEVT = MVT::getVectorVT(EVT, NumEVT); 8428 } while (!TLI.isTypeLegal(VecEVT) || 8429 VVT.getSizeInBits() != VecEVT.getSizeInBits()); 8430} 8431 8432SDValue SelectionDAGLegalize::genWidenVectorLoads(SDValueVector& LdChain, 8433 SDValue Chain, 8434 SDValue BasePtr, 8435 const Value *SV, 8436 int SVOffset, 8437 unsigned Alignment, 8438 bool isVolatile, 8439 unsigned LdWidth, 8440 MVT ResType, 8441 DebugLoc dl) { 8442 // We assume that we have good rules to handle loading power of two loads so 8443 // we break down the operations to power of 2 loads. The strategy is to 8444 // load the largest power of 2 that we can easily transform to a legal vector 8445 // and then insert into that vector, and the cast the result into the legal 8446 // vector that we want. This avoids unnecessary stack converts. 8447 // TODO: If the Ldwidth is legal, alignment is the same as the LdWidth, and 8448 // the load is nonvolatile, we an use a wider load for the value. 8449 // Find a vector length we can load a large chunk 8450 MVT EVT, VecEVT; 8451 unsigned EVTWidth; 8452 FindWidenVecType(TLI, LdWidth, ResType, EVT, VecEVT); 8453 EVTWidth = EVT.getSizeInBits(); 8454 8455 SDValue LdOp = DAG.getLoad(EVT, dl, Chain, BasePtr, SV, SVOffset, 8456 isVolatile, Alignment); 8457 SDValue VecOp = DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, VecEVT, LdOp); 8458 LdChain.push_back(LdOp.getValue(1)); 8459 8460 // Check if we can load the element with one instruction 8461 if (LdWidth == EVTWidth) { 8462 return DAG.getNode(ISD::BIT_CONVERT, dl, ResType, VecOp); 8463 } 8464 8465 // The vector element order is endianness dependent. 8466 unsigned Idx = 1; 8467 LdWidth -= EVTWidth; 8468 unsigned Offset = 0; 8469 8470 while (LdWidth > 0) { 8471 unsigned Increment = EVTWidth / 8; 8472 Offset += Increment; 8473 BasePtr = DAG.getNode(ISD::ADD, dl, BasePtr.getValueType(), BasePtr, 8474 DAG.getIntPtrConstant(Increment)); 8475 8476 if (LdWidth < EVTWidth) { 8477 // Our current type we are using is too large, use a smaller size by 8478 // using a smaller power of 2 8479 unsigned oEVTWidth = EVTWidth; 8480 FindWidenVecType(TLI, LdWidth, ResType, EVT, VecEVT); 8481 EVTWidth = EVT.getSizeInBits(); 8482 // Readjust position and vector position based on new load type 8483 Idx = Idx * (oEVTWidth/EVTWidth); 8484 VecOp = DAG.getNode(ISD::BIT_CONVERT, dl, VecEVT, VecOp); 8485 } 8486 8487 SDValue LdOp = DAG.getLoad(EVT, dl, Chain, BasePtr, SV, 8488 SVOffset+Offset, isVolatile, 8489 MinAlign(Alignment, Offset)); 8490 LdChain.push_back(LdOp.getValue(1)); 8491 VecOp = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, VecEVT, VecOp, LdOp, 8492 DAG.getIntPtrConstant(Idx++)); 8493 8494 LdWidth -= EVTWidth; 8495 } 8496 8497 return DAG.getNode(ISD::BIT_CONVERT, dl, ResType, VecOp); 8498} 8499 8500bool SelectionDAGLegalize::LoadWidenVectorOp(SDValue& Result, 8501 SDValue& TFOp, 8502 SDValue Op, 8503 MVT NVT) { 8504 // TODO: Add support for ConcatVec and the ability to load many vector 8505 // types (e.g., v4i8). This will not work when a vector register 8506 // to memory mapping is strange (e.g., vector elements are not 8507 // stored in some sequential order). 8508 8509 // It must be true that the widen vector type is bigger than where 8510 // we need to load from. 8511 LoadSDNode *LD = cast<LoadSDNode>(Op.getNode()); 8512 MVT LdVT = LD->getMemoryVT(); 8513 DebugLoc dl = LD->getDebugLoc(); 8514 assert(LdVT.isVector() && NVT.isVector()); 8515 assert(LdVT.getVectorElementType() == NVT.getVectorElementType()); 8516 8517 // Load information 8518 SDValue Chain = LD->getChain(); 8519 SDValue BasePtr = LD->getBasePtr(); 8520 int SVOffset = LD->getSrcValueOffset(); 8521 unsigned Alignment = LD->getAlignment(); 8522 bool isVolatile = LD->isVolatile(); 8523 const Value *SV = LD->getSrcValue(); 8524 unsigned int LdWidth = LdVT.getSizeInBits(); 8525 8526 // Load value as a large register 8527 SDValueVector LdChain; 8528 Result = genWidenVectorLoads(LdChain, Chain, BasePtr, SV, SVOffset, 8529 Alignment, isVolatile, LdWidth, NVT, dl); 8530 8531 if (LdChain.size() == 1) { 8532 TFOp = LdChain[0]; 8533 return true; 8534 } 8535 else { 8536 TFOp=DAG.getNode(ISD::TokenFactor, dl, MVT::Other, 8537 &LdChain[0], LdChain.size()); 8538 return false; 8539 } 8540} 8541 8542 8543void SelectionDAGLegalize::genWidenVectorStores(SDValueVector& StChain, 8544 SDValue Chain, 8545 SDValue BasePtr, 8546 const Value *SV, 8547 int SVOffset, 8548 unsigned Alignment, 8549 bool isVolatile, 8550 SDValue ValOp, 8551 unsigned StWidth, 8552 DebugLoc dl) { 8553 // Breaks the stores into a series of power of 2 width stores. For any 8554 // width, we convert the vector to the vector of element size that we 8555 // want to store. This avoids requiring a stack convert. 8556 8557 // Find a width of the element type we can store with 8558 MVT VVT = ValOp.getValueType(); 8559 MVT EVT, VecEVT; 8560 unsigned EVTWidth; 8561 FindWidenVecType(TLI, StWidth, VVT, EVT, VecEVT); 8562 EVTWidth = EVT.getSizeInBits(); 8563 8564 SDValue VecOp = DAG.getNode(ISD::BIT_CONVERT, dl, VecEVT, ValOp); 8565 SDValue EOp = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, EVT, VecOp, 8566 DAG.getIntPtrConstant(0)); 8567 SDValue StOp = DAG.getStore(Chain, dl, EOp, BasePtr, SV, SVOffset, 8568 isVolatile, Alignment); 8569 StChain.push_back(StOp); 8570 8571 // Check if we are done 8572 if (StWidth == EVTWidth) { 8573 return; 8574 } 8575 8576 unsigned Idx = 1; 8577 StWidth -= EVTWidth; 8578 unsigned Offset = 0; 8579 8580 while (StWidth > 0) { 8581 unsigned Increment = EVTWidth / 8; 8582 Offset += Increment; 8583 BasePtr = DAG.getNode(ISD::ADD, dl, BasePtr.getValueType(), BasePtr, 8584 DAG.getIntPtrConstant(Increment)); 8585 8586 if (StWidth < EVTWidth) { 8587 // Our current type we are using is too large, use a smaller size by 8588 // using a smaller power of 2 8589 unsigned oEVTWidth = EVTWidth; 8590 FindWidenVecType(TLI, StWidth, VVT, EVT, VecEVT); 8591 EVTWidth = EVT.getSizeInBits(); 8592 // Readjust position and vector position based on new load type 8593 Idx = Idx * (oEVTWidth/EVTWidth); 8594 VecOp = DAG.getNode(ISD::BIT_CONVERT, dl, VecEVT, VecOp); 8595 } 8596 8597 EOp = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, EVT, VecOp, 8598 DAG.getIntPtrConstant(Idx++)); 8599 StChain.push_back(DAG.getStore(Chain, dl, EOp, BasePtr, SV, 8600 SVOffset + Offset, isVolatile, 8601 MinAlign(Alignment, Offset))); 8602 StWidth -= EVTWidth; 8603 } 8604} 8605 8606 8607SDValue SelectionDAGLegalize::StoreWidenVectorOp(StoreSDNode *ST, 8608 SDValue Chain, 8609 SDValue BasePtr) { 8610 // TODO: It might be cleaner if we can use SplitVector and have more legal 8611 // vector types that can be stored into memory (e.g., v4xi8 can 8612 // be stored as a word). This will not work when a vector register 8613 // to memory mapping is strange (e.g., vector elements are not 8614 // stored in some sequential order). 8615 8616 MVT StVT = ST->getMemoryVT(); 8617 SDValue ValOp = ST->getValue(); 8618 DebugLoc dl = ST->getDebugLoc(); 8619 8620 // Check if we have widen this node with another value 8621 std::map<SDValue, SDValue>::iterator I = WidenNodes.find(ValOp); 8622 if (I != WidenNodes.end()) 8623 ValOp = I->second; 8624 8625 MVT VVT = ValOp.getValueType(); 8626 8627 // It must be true that we the widen vector type is bigger than where 8628 // we need to store. 8629 assert(StVT.isVector() && VVT.isVector()); 8630 assert(StVT.bitsLT(VVT)); 8631 assert(StVT.getVectorElementType() == VVT.getVectorElementType()); 8632 8633 // Store value 8634 SDValueVector StChain; 8635 genWidenVectorStores(StChain, Chain, BasePtr, ST->getSrcValue(), 8636 ST->getSrcValueOffset(), ST->getAlignment(), 8637 ST->isVolatile(), ValOp, StVT.getSizeInBits(), dl); 8638 if (StChain.size() == 1) 8639 return StChain[0]; 8640 else 8641 return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, 8642 &StChain[0], StChain.size()); 8643} 8644 8645 8646// SelectionDAG::Legalize - This is the entry point for the file. 8647// 8648void SelectionDAG::Legalize(bool TypesNeedLegalizing, bool Fast) { 8649 /// run - This is the main entry point to this class. 8650 /// 8651 SelectionDAGLegalize(*this, TypesNeedLegalizing, Fast).LegalizeDAG(); 8652} 8653 8654