PPCISelDAGToDAG.cpp revision 17e82d2858f0c003b7fcfaf7c025ca3d0aaa7a88
1//===-- PPCISelDAGToDAG.cpp - PPC --pattern matching inst selector --------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file was developed by Chris Lattner and is distributed under 6// the University of Illinois Open Source License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file defines a pattern matching instruction selector for PowerPC, 11// converting from a legalized dag to a PPC dag. 12// 13//===----------------------------------------------------------------------===// 14 15#include "PPC.h" 16#include "PPCTargetMachine.h" 17#include "PPCISelLowering.h" 18#include "llvm/CodeGen/MachineInstrBuilder.h" 19#include "llvm/CodeGen/MachineFunction.h" 20#include "llvm/CodeGen/SSARegMap.h" 21#include "llvm/CodeGen/SelectionDAG.h" 22#include "llvm/CodeGen/SelectionDAGISel.h" 23#include "llvm/Target/TargetOptions.h" 24#include "llvm/ADT/Statistic.h" 25#include "llvm/Constants.h" 26#include "llvm/GlobalValue.h" 27#include "llvm/Support/Debug.h" 28#include "llvm/Support/MathExtras.h" 29using namespace llvm; 30 31namespace { 32 Statistic<> FrameOff("ppc-codegen", "Number of frame idx offsets collapsed"); 33 34 //===--------------------------------------------------------------------===// 35 /// PPCDAGToDAGISel - PPC specific code to select PPC machine 36 /// instructions for SelectionDAG operations. 37 /// 38 class PPCDAGToDAGISel : public SelectionDAGISel { 39 PPCTargetLowering PPCLowering; 40 unsigned GlobalBaseReg; 41 public: 42 PPCDAGToDAGISel(TargetMachine &TM) 43 : SelectionDAGISel(PPCLowering), PPCLowering(TM) {} 44 45 virtual bool runOnFunction(Function &Fn) { 46 // Make sure we re-emit a set of the global base reg if necessary 47 GlobalBaseReg = 0; 48 return SelectionDAGISel::runOnFunction(Fn); 49 } 50 51 /// getI32Imm - Return a target constant with the specified value, of type 52 /// i32. 53 inline SDOperand getI32Imm(unsigned Imm) { 54 return CurDAG->getTargetConstant(Imm, MVT::i32); 55 } 56 57 /// getGlobalBaseReg - insert code into the entry mbb to materialize the PIC 58 /// base register. Return the virtual register that holds this value. 59 SDOperand getGlobalBaseReg(); 60 61 // Select - Convert the specified operand from a target-independent to a 62 // target-specific node if it hasn't already been changed. 63 SDOperand Select(SDOperand Op); 64 65 SDNode *SelectBitfieldInsert(SDNode *N); 66 67 /// SelectCC - Select a comparison of the specified values with the 68 /// specified condition code, returning the CR# of the expression. 69 SDOperand SelectCC(SDOperand LHS, SDOperand RHS, ISD::CondCode CC); 70 71 /// SelectAddrImm - Returns true if the address N can be represented by 72 /// a base register plus a signed 16-bit displacement [r+imm]. 73 bool SelectAddrImm(SDOperand N, SDOperand &Disp, SDOperand &Base); 74 75 /// SelectAddrIdx - Given the specified addressed, check to see if it can be 76 /// represented as an indexed [r+r] operation. Returns false if it can 77 /// be represented by [r+imm], which are preferred. 78 bool SelectAddrIdx(SDOperand N, SDOperand &Base, SDOperand &Index); 79 80 /// SelectAddrIdxOnly - Given the specified addressed, force it to be 81 /// represented as an indexed [r+r] operation. 82 bool SelectAddrIdxOnly(SDOperand N, SDOperand &Base, SDOperand &Index); 83 84 SDOperand BuildSDIVSequence(SDNode *N); 85 SDOperand BuildUDIVSequence(SDNode *N); 86 87 /// InstructionSelectBasicBlock - This callback is invoked by 88 /// SelectionDAGISel when it has created a SelectionDAG for us to codegen. 89 virtual void InstructionSelectBasicBlock(SelectionDAG &DAG); 90 91 virtual const char *getPassName() const { 92 return "PowerPC DAG->DAG Pattern Instruction Selection"; 93 } 94 95// Include the pieces autogenerated from the target description. 96#include "PPCGenDAGISel.inc" 97 98private: 99 SDOperand SelectDYNAMIC_STACKALLOC(SDOperand Op); 100 SDOperand SelectADD_PARTS(SDOperand Op); 101 SDOperand SelectSUB_PARTS(SDOperand Op); 102 SDOperand SelectSETCC(SDOperand Op); 103 SDOperand SelectCALL(SDOperand Op); 104 }; 105} 106 107/// InstructionSelectBasicBlock - This callback is invoked by 108/// SelectionDAGISel when it has created a SelectionDAG for us to codegen. 109void PPCDAGToDAGISel::InstructionSelectBasicBlock(SelectionDAG &DAG) { 110 DEBUG(BB->dump()); 111 112 // The selection process is inherently a bottom-up recursive process (users 113 // select their uses before themselves). Given infinite stack space, we 114 // could just start selecting on the root and traverse the whole graph. In 115 // practice however, this causes us to run out of stack space on large basic 116 // blocks. To avoid this problem, select the entry node, then all its uses, 117 // iteratively instead of recursively. 118 std::vector<SDOperand> Worklist; 119 Worklist.push_back(DAG.getEntryNode()); 120 121 // Note that we can do this in the PPC target (scanning forward across token 122 // chain edges) because no nodes ever get folded across these edges. On a 123 // target like X86 which supports load/modify/store operations, this would 124 // have to be more careful. 125 while (!Worklist.empty()) { 126 SDOperand Node = Worklist.back(); 127 Worklist.pop_back(); 128 129 // Chose from the least deep of the top two nodes. 130 if (!Worklist.empty() && 131 Worklist.back().Val->getNodeDepth() < Node.Val->getNodeDepth()) 132 std::swap(Worklist.back(), Node); 133 134 if ((Node.Val->getOpcode() >= ISD::BUILTIN_OP_END && 135 Node.Val->getOpcode() < PPCISD::FIRST_NUMBER) || 136 CodeGenMap.count(Node)) continue; 137 138 for (SDNode::use_iterator UI = Node.Val->use_begin(), 139 E = Node.Val->use_end(); UI != E; ++UI) { 140 // Scan the values. If this use has a value that is a token chain, add it 141 // to the worklist. 142 SDNode *User = *UI; 143 for (unsigned i = 0, e = User->getNumValues(); i != e; ++i) 144 if (User->getValueType(i) == MVT::Other) { 145 Worklist.push_back(SDOperand(User, i)); 146 break; 147 } 148 } 149 150 // Finally, legalize this node. 151 Select(Node); 152 } 153 154 // Select target instructions for the DAG. 155 DAG.setRoot(Select(DAG.getRoot())); 156 CodeGenMap.clear(); 157 DAG.RemoveDeadNodes(); 158 159 // Emit machine code to BB. 160 ScheduleAndEmitDAG(DAG); 161} 162 163/// getGlobalBaseReg - Output the instructions required to put the 164/// base address to use for accessing globals into a register. 165/// 166SDOperand PPCDAGToDAGISel::getGlobalBaseReg() { 167 if (!GlobalBaseReg) { 168 // Insert the set of GlobalBaseReg into the first MBB of the function 169 MachineBasicBlock &FirstMBB = BB->getParent()->front(); 170 MachineBasicBlock::iterator MBBI = FirstMBB.begin(); 171 SSARegMap *RegMap = BB->getParent()->getSSARegMap(); 172 // FIXME: when we get to LP64, we will need to create the appropriate 173 // type of register here. 174 GlobalBaseReg = RegMap->createVirtualRegister(PPC::GPRCRegisterClass); 175 BuildMI(FirstMBB, MBBI, PPC::MovePCtoLR, 0, PPC::LR); 176 BuildMI(FirstMBB, MBBI, PPC::MFLR, 1, GlobalBaseReg); 177 } 178 return CurDAG->getRegister(GlobalBaseReg, MVT::i32); 179} 180 181 182// isIntImmediate - This method tests to see if a constant operand. 183// If so Imm will receive the 32 bit value. 184static bool isIntImmediate(SDNode *N, unsigned& Imm) { 185 if (N->getOpcode() == ISD::Constant) { 186 Imm = cast<ConstantSDNode>(N)->getValue(); 187 return true; 188 } 189 return false; 190} 191 192// isRunOfOnes - Returns true iff Val consists of one contiguous run of 1s with 193// any number of 0s on either side. The 1s are allowed to wrap from LSB to 194// MSB, so 0x000FFF0, 0x0000FFFF, and 0xFF0000FF are all runs. 0x0F0F0000 is 195// not, since all 1s are not contiguous. 196static bool isRunOfOnes(unsigned Val, unsigned &MB, unsigned &ME) { 197 if (isShiftedMask_32(Val)) { 198 // look for the first non-zero bit 199 MB = CountLeadingZeros_32(Val); 200 // look for the first zero bit after the run of ones 201 ME = CountLeadingZeros_32((Val - 1) ^ Val); 202 return true; 203 } else { 204 Val = ~Val; // invert mask 205 if (isShiftedMask_32(Val)) { 206 // effectively look for the first zero bit 207 ME = CountLeadingZeros_32(Val) - 1; 208 // effectively look for the first one bit after the run of zeros 209 MB = CountLeadingZeros_32((Val - 1) ^ Val) + 1; 210 return true; 211 } 212 } 213 // no run present 214 return false; 215} 216 217// isRotateAndMask - Returns true if Mask and Shift can be folded into a rotate 218// and mask opcode and mask operation. 219static bool isRotateAndMask(SDNode *N, unsigned Mask, bool IsShiftMask, 220 unsigned &SH, unsigned &MB, unsigned &ME) { 221 // Don't even go down this path for i64, since different logic will be 222 // necessary for rldicl/rldicr/rldimi. 223 if (N->getValueType(0) != MVT::i32) 224 return false; 225 226 unsigned Shift = 32; 227 unsigned Indeterminant = ~0; // bit mask marking indeterminant results 228 unsigned Opcode = N->getOpcode(); 229 if (N->getNumOperands() != 2 || 230 !isIntImmediate(N->getOperand(1).Val, Shift) || (Shift > 31)) 231 return false; 232 233 if (Opcode == ISD::SHL) { 234 // apply shift left to mask if it comes first 235 if (IsShiftMask) Mask = Mask << Shift; 236 // determine which bits are made indeterminant by shift 237 Indeterminant = ~(0xFFFFFFFFu << Shift); 238 } else if (Opcode == ISD::SRL) { 239 // apply shift right to mask if it comes first 240 if (IsShiftMask) Mask = Mask >> Shift; 241 // determine which bits are made indeterminant by shift 242 Indeterminant = ~(0xFFFFFFFFu >> Shift); 243 // adjust for the left rotate 244 Shift = 32 - Shift; 245 } else { 246 return false; 247 } 248 249 // if the mask doesn't intersect any Indeterminant bits 250 if (Mask && !(Mask & Indeterminant)) { 251 SH = Shift; 252 // make sure the mask is still a mask (wrap arounds may not be) 253 return isRunOfOnes(Mask, MB, ME); 254 } 255 return false; 256} 257 258// isOpcWithIntImmediate - This method tests to see if the node is a specific 259// opcode and that it has a immediate integer right operand. 260// If so Imm will receive the 32 bit value. 261static bool isOpcWithIntImmediate(SDNode *N, unsigned Opc, unsigned& Imm) { 262 return N->getOpcode() == Opc && isIntImmediate(N->getOperand(1).Val, Imm); 263} 264 265// isIntImmediate - This method tests to see if a constant operand. 266// If so Imm will receive the 32 bit value. 267static bool isIntImmediate(SDOperand N, unsigned& Imm) { 268 if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(N)) { 269 Imm = (unsigned)CN->getSignExtended(); 270 return true; 271 } 272 return false; 273} 274 275/// SelectBitfieldInsert - turn an or of two masked values into 276/// the rotate left word immediate then mask insert (rlwimi) instruction. 277/// Returns true on success, false if the caller still needs to select OR. 278/// 279/// Patterns matched: 280/// 1. or shl, and 5. or and, and 281/// 2. or and, shl 6. or shl, shr 282/// 3. or shr, and 7. or shr, shl 283/// 4. or and, shr 284SDNode *PPCDAGToDAGISel::SelectBitfieldInsert(SDNode *N) { 285 bool IsRotate = false; 286 unsigned TgtMask = 0xFFFFFFFF, InsMask = 0xFFFFFFFF, SH = 0; 287 unsigned Value; 288 289 SDOperand Op0 = N->getOperand(0); 290 SDOperand Op1 = N->getOperand(1); 291 292 unsigned Op0Opc = Op0.getOpcode(); 293 unsigned Op1Opc = Op1.getOpcode(); 294 295 // Verify that we have the correct opcodes 296 if (ISD::SHL != Op0Opc && ISD::SRL != Op0Opc && ISD::AND != Op0Opc) 297 return false; 298 if (ISD::SHL != Op1Opc && ISD::SRL != Op1Opc && ISD::AND != Op1Opc) 299 return false; 300 301 // Generate Mask value for Target 302 if (isIntImmediate(Op0.getOperand(1), Value)) { 303 switch(Op0Opc) { 304 case ISD::SHL: TgtMask <<= Value; break; 305 case ISD::SRL: TgtMask >>= Value; break; 306 case ISD::AND: TgtMask &= Value; break; 307 } 308 } else { 309 return 0; 310 } 311 312 // Generate Mask value for Insert 313 if (!isIntImmediate(Op1.getOperand(1), Value)) 314 return 0; 315 316 switch(Op1Opc) { 317 case ISD::SHL: 318 SH = Value; 319 InsMask <<= SH; 320 if (Op0Opc == ISD::SRL) IsRotate = true; 321 break; 322 case ISD::SRL: 323 SH = Value; 324 InsMask >>= SH; 325 SH = 32-SH; 326 if (Op0Opc == ISD::SHL) IsRotate = true; 327 break; 328 case ISD::AND: 329 InsMask &= Value; 330 break; 331 } 332 333 // If both of the inputs are ANDs and one of them has a logical shift by 334 // constant as its input, make that AND the inserted value so that we can 335 // combine the shift into the rotate part of the rlwimi instruction 336 bool IsAndWithShiftOp = false; 337 if (Op0Opc == ISD::AND && Op1Opc == ISD::AND) { 338 if (Op1.getOperand(0).getOpcode() == ISD::SHL || 339 Op1.getOperand(0).getOpcode() == ISD::SRL) { 340 if (isIntImmediate(Op1.getOperand(0).getOperand(1), Value)) { 341 SH = Op1.getOperand(0).getOpcode() == ISD::SHL ? Value : 32 - Value; 342 IsAndWithShiftOp = true; 343 } 344 } else if (Op0.getOperand(0).getOpcode() == ISD::SHL || 345 Op0.getOperand(0).getOpcode() == ISD::SRL) { 346 if (isIntImmediate(Op0.getOperand(0).getOperand(1), Value)) { 347 std::swap(Op0, Op1); 348 std::swap(TgtMask, InsMask); 349 SH = Op1.getOperand(0).getOpcode() == ISD::SHL ? Value : 32 - Value; 350 IsAndWithShiftOp = true; 351 } 352 } 353 } 354 355 // Verify that the Target mask and Insert mask together form a full word mask 356 // and that the Insert mask is a run of set bits (which implies both are runs 357 // of set bits). Given that, Select the arguments and generate the rlwimi 358 // instruction. 359 unsigned MB, ME; 360 if (((TgtMask & InsMask) == 0) && isRunOfOnes(InsMask, MB, ME)) { 361 bool fullMask = (TgtMask ^ InsMask) == 0xFFFFFFFF; 362 bool Op0IsAND = Op0Opc == ISD::AND; 363 // Check for rotlwi / rotrwi here, a special case of bitfield insert 364 // where both bitfield halves are sourced from the same value. 365 if (IsRotate && fullMask && 366 N->getOperand(0).getOperand(0) == N->getOperand(1).getOperand(0)) { 367 Op0 = CurDAG->getTargetNode(PPC::RLWINM, MVT::i32, 368 Select(N->getOperand(0).getOperand(0)), 369 getI32Imm(SH), getI32Imm(0), getI32Imm(31)); 370 return Op0.Val; 371 } 372 SDOperand Tmp1 = (Op0IsAND && fullMask) ? Select(Op0.getOperand(0)) 373 : Select(Op0); 374 SDOperand Tmp2 = IsAndWithShiftOp ? Select(Op1.getOperand(0).getOperand(0)) 375 : Select(Op1.getOperand(0)); 376 Op0 = CurDAG->getTargetNode(PPC::RLWIMI, MVT::i32, Tmp1, Tmp2, 377 getI32Imm(SH), getI32Imm(MB), getI32Imm(ME)); 378 return Op0.Val; 379 } 380 return 0; 381} 382 383/// SelectAddrImm - Returns true if the address N can be represented by 384/// a base register plus a signed 16-bit displacement [r+imm]. 385bool PPCDAGToDAGISel::SelectAddrImm(SDOperand N, SDOperand &Disp, 386 SDOperand &Base) { 387 if (N.getOpcode() == ISD::ADD) { 388 unsigned imm = 0; 389 if (isIntImmediate(N.getOperand(1), imm) && isInt16(imm)) { 390 Disp = getI32Imm(imm & 0xFFFF); 391 if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(N.getOperand(0))) { 392 Base = CurDAG->getTargetFrameIndex(FI->getIndex(), MVT::i32); 393 } else { 394 Base = Select(N.getOperand(0)); 395 } 396 return true; // [r+i] 397 } else if (N.getOperand(1).getOpcode() == PPCISD::Lo) { 398 // Match LOAD (ADD (X, Lo(G))). 399 assert(!cast<ConstantSDNode>(N.getOperand(1).getOperand(1))->getValue() 400 && "Cannot handle constant offsets yet!"); 401 Disp = N.getOperand(1).getOperand(0); // The global address. 402 assert(Disp.getOpcode() == ISD::TargetGlobalAddress || 403 Disp.getOpcode() == ISD::TargetConstantPool); 404 Base = Select(N.getOperand(0)); 405 return true; // [&g+r] 406 } 407 return false; // [r+r] 408 } 409 Disp = getI32Imm(0); 410 if (FrameIndexSDNode *FI = dyn_cast<FrameIndexSDNode>(N)) 411 Base = CurDAG->getTargetFrameIndex(FI->getIndex(), MVT::i32); 412 else 413 Base = Select(N); 414 return true; // [r+0] 415} 416 417/// SelectAddrIdx - Given the specified addressed, check to see if it can be 418/// represented as an indexed [r+r] operation. Returns false if it can 419/// be represented by [r+imm], which are preferred. 420bool PPCDAGToDAGISel::SelectAddrIdx(SDOperand N, SDOperand &Base, 421 SDOperand &Index) { 422 // Check to see if we can represent this as an [r+imm] address instead, 423 // which will fail if the address is more profitably represented as an 424 // [r+r] address. 425 if (SelectAddrImm(N, Base, Index)) 426 return false; 427 428 if (N.getOpcode() == ISD::ADD) { 429 Base = Select(N.getOperand(0)); 430 Index = Select(N.getOperand(1)); 431 return true; 432 } 433 434 Base = CurDAG->getRegister(PPC::R0, MVT::i32); 435 Index = Select(N); 436 return true; 437} 438 439/// SelectAddrIdxOnly - Given the specified addressed, force it to be 440/// represented as an indexed [r+r] operation. 441bool PPCDAGToDAGISel::SelectAddrIdxOnly(SDOperand N, SDOperand &Base, 442 SDOperand &Index) { 443 if (N.getOpcode() == ISD::ADD) { 444 Base = Select(N.getOperand(0)); 445 Index = Select(N.getOperand(1)); 446 return true; 447 } 448 449 Base = CurDAG->getRegister(PPC::R0, MVT::i32); 450 Index = Select(N); 451 return true; 452} 453 454/// SelectCC - Select a comparison of the specified values with the specified 455/// condition code, returning the CR# of the expression. 456SDOperand PPCDAGToDAGISel::SelectCC(SDOperand LHS, SDOperand RHS, 457 ISD::CondCode CC) { 458 // Always select the LHS. 459 LHS = Select(LHS); 460 461 // Use U to determine whether the SETCC immediate range is signed or not. 462 if (MVT::isInteger(LHS.getValueType())) { 463 bool U = ISD::isUnsignedIntSetCC(CC); 464 unsigned Imm; 465 if (isIntImmediate(RHS, Imm) && 466 ((U && isUInt16(Imm)) || (!U && isInt16(Imm)))) 467 return CurDAG->getTargetNode(U ? PPC::CMPLWI : PPC::CMPWI, MVT::i32, 468 LHS, getI32Imm(Imm & 0xFFFF)); 469 return CurDAG->getTargetNode(U ? PPC::CMPLW : PPC::CMPW, MVT::i32, 470 LHS, Select(RHS)); 471 } else if (LHS.getValueType() == MVT::f32) { 472 return CurDAG->getTargetNode(PPC::FCMPUS, MVT::i32, LHS, Select(RHS)); 473 } else { 474 return CurDAG->getTargetNode(PPC::FCMPUD, MVT::i32, LHS, Select(RHS)); 475 } 476} 477 478/// getBCCForSetCC - Returns the PowerPC condition branch mnemonic corresponding 479/// to Condition. 480static unsigned getBCCForSetCC(ISD::CondCode CC) { 481 switch (CC) { 482 default: assert(0 && "Unknown condition!"); abort(); 483 case ISD::SETOEQ: // FIXME: This is incorrect see PR642. 484 case ISD::SETEQ: return PPC::BEQ; 485 case ISD::SETONE: // FIXME: This is incorrect see PR642. 486 case ISD::SETNE: return PPC::BNE; 487 case ISD::SETOLT: // FIXME: This is incorrect see PR642. 488 case ISD::SETULT: 489 case ISD::SETLT: return PPC::BLT; 490 case ISD::SETOLE: // FIXME: This is incorrect see PR642. 491 case ISD::SETULE: 492 case ISD::SETLE: return PPC::BLE; 493 case ISD::SETOGT: // FIXME: This is incorrect see PR642. 494 case ISD::SETUGT: 495 case ISD::SETGT: return PPC::BGT; 496 case ISD::SETOGE: // FIXME: This is incorrect see PR642. 497 case ISD::SETUGE: 498 case ISD::SETGE: return PPC::BGE; 499 500 case ISD::SETO: return PPC::BUN; 501 case ISD::SETUO: return PPC::BNU; 502 } 503 return 0; 504} 505 506/// getCRIdxForSetCC - Return the index of the condition register field 507/// associated with the SetCC condition, and whether or not the field is 508/// treated as inverted. That is, lt = 0; ge = 0 inverted. 509static unsigned getCRIdxForSetCC(ISD::CondCode CC, bool& Inv) { 510 switch (CC) { 511 default: assert(0 && "Unknown condition!"); abort(); 512 case ISD::SETOLT: // FIXME: This is incorrect see PR642. 513 case ISD::SETULT: 514 case ISD::SETLT: Inv = false; return 0; 515 case ISD::SETOGE: // FIXME: This is incorrect see PR642. 516 case ISD::SETUGE: 517 case ISD::SETGE: Inv = true; return 0; 518 case ISD::SETOGT: // FIXME: This is incorrect see PR642. 519 case ISD::SETUGT: 520 case ISD::SETGT: Inv = false; return 1; 521 case ISD::SETOLE: // FIXME: This is incorrect see PR642. 522 case ISD::SETULE: 523 case ISD::SETLE: Inv = true; return 1; 524 case ISD::SETOEQ: // FIXME: This is incorrect see PR642. 525 case ISD::SETEQ: Inv = false; return 2; 526 case ISD::SETONE: // FIXME: This is incorrect see PR642. 527 case ISD::SETNE: Inv = true; return 2; 528 case ISD::SETO: Inv = true; return 3; 529 case ISD::SETUO: Inv = false; return 3; 530 } 531 return 0; 532} 533 534SDOperand PPCDAGToDAGISel::SelectDYNAMIC_STACKALLOC(SDOperand Op) { 535 SDNode *N = Op.Val; 536 537 // FIXME: We are currently ignoring the requested alignment for handling 538 // greater than the stack alignment. This will need to be revisited at some 539 // point. Align = N.getOperand(2); 540 if (!isa<ConstantSDNode>(N->getOperand(2)) || 541 cast<ConstantSDNode>(N->getOperand(2))->getValue() != 0) { 542 std::cerr << "Cannot allocate stack object with greater alignment than" 543 << " the stack alignment yet!"; 544 abort(); 545 } 546 SDOperand Chain = Select(N->getOperand(0)); 547 SDOperand Amt = Select(N->getOperand(1)); 548 549 SDOperand R1Reg = CurDAG->getRegister(PPC::R1, MVT::i32); 550 551 SDOperand R1Val = CurDAG->getCopyFromReg(Chain, PPC::R1, MVT::i32); 552 Chain = R1Val.getValue(1); 553 554 // Subtract the amount (guaranteed to be a multiple of the stack alignment) 555 // from the stack pointer, giving us the result pointer. 556 SDOperand Result = CurDAG->getTargetNode(PPC::SUBF, MVT::i32, Amt, R1Val); 557 558 // Copy this result back into R1. 559 Chain = CurDAG->getNode(ISD::CopyToReg, MVT::Other, Chain, R1Reg, Result); 560 561 // Copy this result back out of R1 to make sure we're not using the stack 562 // space without decrementing the stack pointer. 563 Result = CurDAG->getCopyFromReg(Chain, PPC::R1, MVT::i32); 564 565 // Finally, replace the DYNAMIC_STACKALLOC with the copyfromreg. 566 CodeGenMap[Op.getValue(0)] = Result; 567 CodeGenMap[Op.getValue(1)] = Result.getValue(1); 568 return SDOperand(Result.Val, Op.ResNo); 569} 570 571SDOperand PPCDAGToDAGISel::SelectADD_PARTS(SDOperand Op) { 572 SDNode *N = Op.Val; 573 SDOperand LHSL = Select(N->getOperand(0)); 574 SDOperand LHSH = Select(N->getOperand(1)); 575 576 unsigned Imm; 577 bool ME = false, ZE = false; 578 if (isIntImmediate(N->getOperand(3), Imm)) { 579 ME = (signed)Imm == -1; 580 ZE = Imm == 0; 581 } 582 583 std::vector<SDOperand> Result; 584 SDOperand CarryFromLo; 585 if (isIntImmediate(N->getOperand(2), Imm) && 586 ((signed)Imm >= -32768 || (signed)Imm < 32768)) { 587 // Codegen the low 32 bits of the add. Interestingly, there is no 588 // shifted form of add immediate carrying. 589 CarryFromLo = CurDAG->getTargetNode(PPC::ADDIC, MVT::i32, MVT::Flag, 590 LHSL, getI32Imm(Imm)); 591 } else { 592 CarryFromLo = CurDAG->getTargetNode(PPC::ADDC, MVT::i32, MVT::Flag, 593 LHSL, Select(N->getOperand(2))); 594 } 595 CarryFromLo = CarryFromLo.getValue(1); 596 597 // Codegen the high 32 bits, adding zero, minus one, or the full value 598 // along with the carry flag produced by addc/addic. 599 SDOperand ResultHi; 600 if (ZE) 601 ResultHi = CurDAG->getTargetNode(PPC::ADDZE, MVT::i32, LHSH, CarryFromLo); 602 else if (ME) 603 ResultHi = CurDAG->getTargetNode(PPC::ADDME, MVT::i32, LHSH, CarryFromLo); 604 else 605 ResultHi = CurDAG->getTargetNode(PPC::ADDE, MVT::i32, LHSH, 606 Select(N->getOperand(3)), CarryFromLo); 607 Result.push_back(CarryFromLo.getValue(0)); 608 Result.push_back(ResultHi); 609 610 CodeGenMap[Op.getValue(0)] = Result[0]; 611 CodeGenMap[Op.getValue(1)] = Result[1]; 612 return Result[Op.ResNo]; 613} 614SDOperand PPCDAGToDAGISel::SelectSUB_PARTS(SDOperand Op) { 615 SDNode *N = Op.Val; 616 SDOperand LHSL = Select(N->getOperand(0)); 617 SDOperand LHSH = Select(N->getOperand(1)); 618 SDOperand RHSL = Select(N->getOperand(2)); 619 SDOperand RHSH = Select(N->getOperand(3)); 620 621 std::vector<SDOperand> Result; 622 Result.push_back(CurDAG->getTargetNode(PPC::SUBFC, MVT::i32, MVT::Flag, 623 RHSL, LHSL)); 624 Result.push_back(CurDAG->getTargetNode(PPC::SUBFE, MVT::i32, RHSH, LHSH, 625 Result[0].getValue(1))); 626 CodeGenMap[Op.getValue(0)] = Result[0]; 627 CodeGenMap[Op.getValue(1)] = Result[1]; 628 return Result[Op.ResNo]; 629} 630 631SDOperand PPCDAGToDAGISel::SelectSETCC(SDOperand Op) { 632 SDNode *N = Op.Val; 633 unsigned Imm; 634 ISD::CondCode CC = cast<CondCodeSDNode>(N->getOperand(2))->get(); 635 if (isIntImmediate(N->getOperand(1), Imm)) { 636 // We can codegen setcc op, imm very efficiently compared to a brcond. 637 // Check for those cases here. 638 // setcc op, 0 639 if (Imm == 0) { 640 SDOperand Op = Select(N->getOperand(0)); 641 switch (CC) { 642 default: break; 643 case ISD::SETEQ: 644 Op = CurDAG->getTargetNode(PPC::CNTLZW, MVT::i32, Op); 645 return CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Op, getI32Imm(27), 646 getI32Imm(5), getI32Imm(31)); 647 case ISD::SETNE: { 648 SDOperand AD = CurDAG->getTargetNode(PPC::ADDIC, MVT::i32, MVT::Flag, 649 Op, getI32Imm(~0U)); 650 return CurDAG->SelectNodeTo(N, PPC::SUBFE, MVT::i32, AD, Op, 651 AD.getValue(1)); 652 } 653 case ISD::SETLT: 654 return CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Op, getI32Imm(1), 655 getI32Imm(31), getI32Imm(31)); 656 case ISD::SETGT: { 657 SDOperand T = CurDAG->getTargetNode(PPC::NEG, MVT::i32, Op); 658 T = CurDAG->getTargetNode(PPC::ANDC, MVT::i32, T, Op);; 659 return CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, T, getI32Imm(1), 660 getI32Imm(31), getI32Imm(31)); 661 } 662 } 663 } else if (Imm == ~0U) { // setcc op, -1 664 SDOperand Op = Select(N->getOperand(0)); 665 switch (CC) { 666 default: break; 667 case ISD::SETEQ: 668 Op = CurDAG->getTargetNode(PPC::ADDIC, MVT::i32, MVT::Flag, 669 Op, getI32Imm(1)); 670 return CurDAG->SelectNodeTo(N, PPC::ADDZE, MVT::i32, 671 CurDAG->getTargetNode(PPC::LI, MVT::i32, 672 getI32Imm(0)), 673 Op.getValue(1)); 674 case ISD::SETNE: { 675 Op = CurDAG->getTargetNode(PPC::NOR, MVT::i32, Op, Op); 676 SDOperand AD = CurDAG->getTargetNode(PPC::ADDIC, MVT::i32, MVT::Flag, 677 Op, getI32Imm(~0U)); 678 return CurDAG->SelectNodeTo(N, PPC::SUBFE, MVT::i32, AD, Op, 679 AD.getValue(1)); 680 } 681 case ISD::SETLT: { 682 SDOperand AD = CurDAG->getTargetNode(PPC::ADDI, MVT::i32, Op, 683 getI32Imm(1)); 684 SDOperand AN = CurDAG->getTargetNode(PPC::AND, MVT::i32, AD, Op); 685 return CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, AN, getI32Imm(1), 686 getI32Imm(31), getI32Imm(31)); 687 } 688 case ISD::SETGT: 689 Op = CurDAG->getTargetNode(PPC::RLWINM, MVT::i32, Op, getI32Imm(1), 690 getI32Imm(31), getI32Imm(31)); 691 return CurDAG->SelectNodeTo(N, PPC::XORI, MVT::i32, Op, getI32Imm(1)); 692 } 693 } 694 } 695 696 bool Inv; 697 unsigned Idx = getCRIdxForSetCC(CC, Inv); 698 SDOperand CCReg = SelectCC(N->getOperand(0), N->getOperand(1), CC); 699 SDOperand IntCR; 700 701 // Force the ccreg into CR7. 702 SDOperand CR7Reg = CurDAG->getRegister(PPC::CR7, MVT::i32); 703 704 SDOperand InFlag(0, 0); // Null incoming flag value. 705 CCReg = CurDAG->getCopyToReg(CurDAG->getEntryNode(), CR7Reg, CCReg, 706 InFlag).getValue(1); 707 708 if (TLI.getTargetMachine().getSubtarget<PPCSubtarget>().isGigaProcessor()) 709 IntCR = CurDAG->getTargetNode(PPC::MFOCRF, MVT::i32, CR7Reg, CCReg); 710 else 711 IntCR = CurDAG->getTargetNode(PPC::MFCR, MVT::i32, CCReg); 712 713 if (!Inv) { 714 return CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, IntCR, 715 getI32Imm((32-(3-Idx)) & 31), 716 getI32Imm(31), getI32Imm(31)); 717 } else { 718 SDOperand Tmp = 719 CurDAG->getTargetNode(PPC::RLWINM, MVT::i32, IntCR, 720 getI32Imm((32-(3-Idx)) & 31), 721 getI32Imm(31),getI32Imm(31)); 722 return CurDAG->SelectNodeTo(N, PPC::XORI, MVT::i32, Tmp, getI32Imm(1)); 723 } 724} 725 726/// isCallCompatibleAddress - Return true if the specified 32-bit value is 727/// representable in the immediate field of a Bx instruction. 728static bool isCallCompatibleAddress(ConstantSDNode *C) { 729 int Addr = C->getValue(); 730 if (Addr & 3) return false; // Low 2 bits are implicitly zero. 731 return (Addr << 6 >> 6) == Addr; // Top 6 bits have to be sext of immediate. 732} 733 734SDOperand PPCDAGToDAGISel::SelectCALL(SDOperand Op) { 735 SDNode *N = Op.Val; 736 SDOperand Chain = Select(N->getOperand(0)); 737 738 unsigned CallOpcode; 739 std::vector<SDOperand> CallOperands; 740 741 if (GlobalAddressSDNode *GASD = 742 dyn_cast<GlobalAddressSDNode>(N->getOperand(1))) { 743 CallOpcode = PPC::BL; 744 CallOperands.push_back(N->getOperand(1)); 745 } else if (ExternalSymbolSDNode *ESSDN = 746 dyn_cast<ExternalSymbolSDNode>(N->getOperand(1))) { 747 CallOpcode = PPC::BL; 748 CallOperands.push_back(N->getOperand(1)); 749 } else if (isa<ConstantSDNode>(N->getOperand(1)) && 750 isCallCompatibleAddress(cast<ConstantSDNode>(N->getOperand(1)))) { 751 ConstantSDNode *C = cast<ConstantSDNode>(N->getOperand(1)); 752 CallOpcode = PPC::BLA; 753 CallOperands.push_back(getI32Imm((int)C->getValue() >> 2)); 754 } else { 755 // Copy the callee address into the CTR register. 756 SDOperand Callee = Select(N->getOperand(1)); 757 Chain = CurDAG->getTargetNode(PPC::MTCTR, MVT::Other, Callee, Chain); 758 759 // Copy the callee address into R12 on darwin. 760 SDOperand R12 = CurDAG->getRegister(PPC::R12, MVT::i32); 761 Chain = CurDAG->getNode(ISD::CopyToReg, MVT::Other, Chain, R12, Callee); 762 763 CallOperands.push_back(R12); 764 CallOpcode = PPC::BCTRL; 765 } 766 767 unsigned GPR_idx = 0, FPR_idx = 0; 768 static const unsigned GPR[] = { 769 PPC::R3, PPC::R4, PPC::R5, PPC::R6, 770 PPC::R7, PPC::R8, PPC::R9, PPC::R10, 771 }; 772 static const unsigned FPR[] = { 773 PPC::F1, PPC::F2, PPC::F3, PPC::F4, PPC::F5, PPC::F6, PPC::F7, 774 PPC::F8, PPC::F9, PPC::F10, PPC::F11, PPC::F12, PPC::F13 775 }; 776 777 SDOperand InFlag; // Null incoming flag value. 778 779 for (unsigned i = 2, e = N->getNumOperands(); i != e; ++i) { 780 unsigned DestReg = 0; 781 MVT::ValueType RegTy = N->getOperand(i).getValueType(); 782 if (RegTy == MVT::i32) { 783 assert(GPR_idx < 8 && "Too many int args"); 784 DestReg = GPR[GPR_idx++]; 785 } else { 786 assert(MVT::isFloatingPoint(N->getOperand(i).getValueType()) && 787 "Unpromoted integer arg?"); 788 assert(FPR_idx < 13 && "Too many fp args"); 789 DestReg = FPR[FPR_idx++]; 790 } 791 792 if (N->getOperand(i).getOpcode() != ISD::UNDEF) { 793 SDOperand Val = Select(N->getOperand(i)); 794 Chain = CurDAG->getCopyToReg(Chain, DestReg, Val, InFlag); 795 InFlag = Chain.getValue(1); 796 CallOperands.push_back(CurDAG->getRegister(DestReg, RegTy)); 797 } 798 } 799 800 // Finally, once everything is in registers to pass to the call, emit the 801 // call itself. 802 if (InFlag.Val) 803 CallOperands.push_back(InFlag); // Strong dep on register copies. 804 else 805 CallOperands.push_back(Chain); // Weak dep on whatever occurs before 806 Chain = CurDAG->getTargetNode(CallOpcode, MVT::Other, MVT::Flag, 807 CallOperands); 808 809 std::vector<SDOperand> CallResults; 810 811 // If the call has results, copy the values out of the ret val registers. 812 switch (N->getValueType(0)) { 813 default: assert(0 && "Unexpected ret value!"); 814 case MVT::Other: break; 815 case MVT::i32: 816 if (N->getValueType(1) == MVT::i32) { 817 Chain = CurDAG->getCopyFromReg(Chain, PPC::R4, MVT::i32, 818 Chain.getValue(1)).getValue(1); 819 CallResults.push_back(Chain.getValue(0)); 820 Chain = CurDAG->getCopyFromReg(Chain, PPC::R3, MVT::i32, 821 Chain.getValue(2)).getValue(1); 822 CallResults.push_back(Chain.getValue(0)); 823 } else { 824 Chain = CurDAG->getCopyFromReg(Chain, PPC::R3, MVT::i32, 825 Chain.getValue(1)).getValue(1); 826 CallResults.push_back(Chain.getValue(0)); 827 } 828 break; 829 case MVT::f32: 830 case MVT::f64: 831 Chain = CurDAG->getCopyFromReg(Chain, PPC::F1, N->getValueType(0), 832 Chain.getValue(1)).getValue(1); 833 CallResults.push_back(Chain.getValue(0)); 834 break; 835 } 836 837 CallResults.push_back(Chain); 838 for (unsigned i = 0, e = CallResults.size(); i != e; ++i) 839 CodeGenMap[Op.getValue(i)] = CallResults[i]; 840 return CallResults[Op.ResNo]; 841} 842 843// Select - Convert the specified operand from a target-independent to a 844// target-specific node if it hasn't already been changed. 845SDOperand PPCDAGToDAGISel::Select(SDOperand Op) { 846 SDNode *N = Op.Val; 847 if (N->getOpcode() >= ISD::BUILTIN_OP_END && 848 N->getOpcode() < PPCISD::FIRST_NUMBER) 849 return Op; // Already selected. 850 851 // If this has already been converted, use it. 852 std::map<SDOperand, SDOperand>::iterator CGMI = CodeGenMap.find(Op); 853 if (CGMI != CodeGenMap.end()) return CGMI->second; 854 855 switch (N->getOpcode()) { 856 default: break; 857 case ISD::DYNAMIC_STACKALLOC: return SelectDYNAMIC_STACKALLOC(Op); 858 case ISD::ADD_PARTS: return SelectADD_PARTS(Op); 859 case ISD::SUB_PARTS: return SelectSUB_PARTS(Op); 860 case ISD::SETCC: return SelectSETCC(Op); 861 case ISD::CALL: return SelectCALL(Op); 862 case ISD::TAILCALL: return SelectCALL(Op); 863 case PPCISD::GlobalBaseReg: return getGlobalBaseReg(); 864 865 case ISD::FrameIndex: { 866 int FI = cast<FrameIndexSDNode>(N)->getIndex(); 867 if (N->hasOneUse()) 868 return CurDAG->SelectNodeTo(N, PPC::ADDI, MVT::i32, 869 CurDAG->getTargetFrameIndex(FI, MVT::i32), 870 getI32Imm(0)); 871 return CodeGenMap[Op] = 872 CurDAG->getTargetNode(PPC::ADDI, MVT::i32, 873 CurDAG->getTargetFrameIndex(FI, MVT::i32), 874 getI32Imm(0)); 875 } 876 case ISD::SDIV: { 877 // FIXME: since this depends on the setting of the carry flag from the srawi 878 // we should really be making notes about that for the scheduler. 879 // FIXME: It sure would be nice if we could cheaply recognize the 880 // srl/add/sra pattern the dag combiner will generate for this as 881 // sra/addze rather than having to handle sdiv ourselves. oh well. 882 unsigned Imm; 883 if (isIntImmediate(N->getOperand(1), Imm)) { 884 if ((signed)Imm > 0 && isPowerOf2_32(Imm)) { 885 SDOperand Op = 886 CurDAG->getTargetNode(PPC::SRAWI, MVT::i32, MVT::Flag, 887 Select(N->getOperand(0)), 888 getI32Imm(Log2_32(Imm))); 889 return CurDAG->SelectNodeTo(N, PPC::ADDZE, MVT::i32, 890 Op.getValue(0), Op.getValue(1)); 891 } else if ((signed)Imm < 0 && isPowerOf2_32(-Imm)) { 892 SDOperand Op = 893 CurDAG->getTargetNode(PPC::SRAWI, MVT::i32, MVT::Flag, 894 Select(N->getOperand(0)), 895 getI32Imm(Log2_32(-Imm))); 896 SDOperand PT = 897 CurDAG->getTargetNode(PPC::ADDZE, MVT::i32, Op.getValue(0), 898 Op.getValue(1)); 899 return CurDAG->SelectNodeTo(N, PPC::NEG, MVT::i32, PT); 900 } 901 } 902 903 // Other cases are autogenerated. 904 break; 905 } 906 case ISD::AND: { 907 unsigned Imm, Imm2; 908 // If this is an and of a value rotated between 0 and 31 bits and then and'd 909 // with a mask, emit rlwinm 910 if (isIntImmediate(N->getOperand(1), Imm) && (isShiftedMask_32(Imm) || 911 isShiftedMask_32(~Imm))) { 912 SDOperand Val; 913 unsigned SH, MB, ME; 914 if (isRotateAndMask(N->getOperand(0).Val, Imm, false, SH, MB, ME)) { 915 Val = Select(N->getOperand(0).getOperand(0)); 916 } else if (Imm == 0) { 917 // AND X, 0 -> 0, not "rlwinm 32". 918 return Select(N->getOperand(1)); 919 } else { 920 Val = Select(N->getOperand(0)); 921 isRunOfOnes(Imm, MB, ME); 922 SH = 0; 923 } 924 return CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Val, getI32Imm(SH), 925 getI32Imm(MB), getI32Imm(ME)); 926 } 927 // ISD::OR doesn't get all the bitfield insertion fun. 928 // (and (or x, c1), c2) where isRunOfOnes(~(c1^c2)) is a bitfield insert 929 if (isIntImmediate(N->getOperand(1), Imm) && 930 N->getOperand(0).getOpcode() == ISD::OR && 931 isIntImmediate(N->getOperand(0).getOperand(1), Imm2)) { 932 unsigned MB, ME; 933 Imm = ~(Imm^Imm2); 934 if (isRunOfOnes(Imm, MB, ME)) { 935 SDOperand Tmp1 = Select(N->getOperand(0).getOperand(0)); 936 SDOperand Tmp2 = Select(N->getOperand(0).getOperand(1)); 937 return CurDAG->getTargetNode(PPC::RLWIMI, MVT::i32, Tmp1, Tmp2, 938 getI32Imm(0), getI32Imm(MB), getI32Imm(ME)); 939 } 940 } 941 942 // Other cases are autogenerated. 943 break; 944 } 945 case ISD::OR: 946 if (SDNode *I = SelectBitfieldInsert(N)) 947 return CodeGenMap[Op] = SDOperand(I, 0); 948 949 // Other cases are autogenerated. 950 break; 951 case ISD::SHL: { 952 unsigned Imm, SH, MB, ME; 953 if (isOpcWithIntImmediate(N->getOperand(0).Val, ISD::AND, Imm) && 954 isRotateAndMask(N, Imm, true, SH, MB, ME)) { 955 return CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, 956 Select(N->getOperand(0).getOperand(0)), 957 getI32Imm(SH), getI32Imm(MB), getI32Imm(ME)); 958 } 959 960 // Other cases are autogenerated. 961 break; 962 } 963 case ISD::SRL: { 964 unsigned Imm, SH, MB, ME; 965 if (isOpcWithIntImmediate(N->getOperand(0).Val, ISD::AND, Imm) && 966 isRotateAndMask(N, Imm, true, SH, MB, ME)) { 967 return CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, 968 Select(N->getOperand(0).getOperand(0)), 969 getI32Imm(SH & 0x1F), getI32Imm(MB), 970 getI32Imm(ME)); 971 } 972 973 // Other cases are autogenerated. 974 break; 975 } 976 case ISD::FNEG: { 977 SDOperand Val = Select(N->getOperand(0)); 978 MVT::ValueType Ty = N->getValueType(0); 979 if (N->getOperand(0).Val->hasOneUse()) { 980 unsigned Opc; 981 switch (Val.isTargetOpcode() ? Val.getTargetOpcode() : 0) { 982 default: Opc = 0; break; 983 case PPC::FABSS: Opc = PPC::FNABSS; break; 984 case PPC::FABSD: Opc = PPC::FNABSD; break; 985 case PPC::FMADD: Opc = PPC::FNMADD; break; 986 case PPC::FMADDS: Opc = PPC::FNMADDS; break; 987 case PPC::FMSUB: Opc = PPC::FNMSUB; break; 988 case PPC::FMSUBS: Opc = PPC::FNMSUBS; break; 989 } 990 // If we inverted the opcode, then emit the new instruction with the 991 // inverted opcode and the original instruction's operands. Otherwise, 992 // fall through and generate a fneg instruction. 993 if (Opc) { 994 if (Opc == PPC::FNABSS || Opc == PPC::FNABSD) 995 return CurDAG->SelectNodeTo(N, Opc, Ty, Val.getOperand(0)); 996 else 997 return CurDAG->SelectNodeTo(N, Opc, Ty, Val.getOperand(0), 998 Val.getOperand(1), Val.getOperand(2)); 999 } 1000 } 1001 // Other cases are autogenerated. 1002 break; 1003 } 1004 case ISD::SELECT_CC: { 1005 ISD::CondCode CC = cast<CondCodeSDNode>(N->getOperand(4))->get(); 1006 1007 // handle the setcc cases here. select_cc lhs, 0, 1, 0, cc 1008 if (ConstantSDNode *N1C = dyn_cast<ConstantSDNode>(N->getOperand(1))) 1009 if (ConstantSDNode *N2C = dyn_cast<ConstantSDNode>(N->getOperand(2))) 1010 if (ConstantSDNode *N3C = dyn_cast<ConstantSDNode>(N->getOperand(3))) 1011 if (N1C->isNullValue() && N3C->isNullValue() && 1012 N2C->getValue() == 1ULL && CC == ISD::SETNE) { 1013 SDOperand LHS = Select(N->getOperand(0)); 1014 SDOperand Tmp = 1015 CurDAG->getTargetNode(PPC::ADDIC, MVT::i32, MVT::Flag, 1016 LHS, getI32Imm(~0U)); 1017 return CurDAG->SelectNodeTo(N, PPC::SUBFE, MVT::i32, Tmp, LHS, 1018 Tmp.getValue(1)); 1019 } 1020 1021 SDOperand CCReg = SelectCC(N->getOperand(0), N->getOperand(1), CC); 1022 unsigned BROpc = getBCCForSetCC(CC); 1023 1024 bool isFP = MVT::isFloatingPoint(N->getValueType(0)); 1025 unsigned SelectCCOp; 1026 if (MVT::isInteger(N->getValueType(0))) 1027 SelectCCOp = PPC::SELECT_CC_Int; 1028 else if (N->getValueType(0) == MVT::f32) 1029 SelectCCOp = PPC::SELECT_CC_F4; 1030 else 1031 SelectCCOp = PPC::SELECT_CC_F8; 1032 return CurDAG->SelectNodeTo(N, SelectCCOp, N->getValueType(0), CCReg, 1033 Select(N->getOperand(2)), 1034 Select(N->getOperand(3)), 1035 getI32Imm(BROpc)); 1036 } 1037 case ISD::BR_CC: 1038 case ISD::BRTWOWAY_CC: { 1039 SDOperand Chain = Select(N->getOperand(0)); 1040 MachineBasicBlock *Dest = 1041 cast<BasicBlockSDNode>(N->getOperand(4))->getBasicBlock(); 1042 ISD::CondCode CC = cast<CondCodeSDNode>(N->getOperand(1))->get(); 1043 SDOperand CondCode = SelectCC(N->getOperand(2), N->getOperand(3), CC); 1044 1045 // If this is a two way branch, then grab the fallthrough basic block 1046 // argument and build a PowerPC branch pseudo-op, suitable for long branch 1047 // conversion if necessary by the branch selection pass. Otherwise, emit a 1048 // standard conditional branch. 1049 if (N->getOpcode() == ISD::BRTWOWAY_CC) { 1050 SDOperand CondTrueBlock = N->getOperand(4); 1051 SDOperand CondFalseBlock = N->getOperand(5); 1052 1053 // If the false case is the current basic block, then this is a self loop. 1054 // We do not want to emit "Loop: ... brcond Out; br Loop", as it adds an 1055 // extra dispatch group to the loop. Instead, invert the condition and 1056 // emit "Loop: ... br!cond Loop; br Out 1057 if (cast<BasicBlockSDNode>(CondFalseBlock)->getBasicBlock() == BB) { 1058 std::swap(CondTrueBlock, CondFalseBlock); 1059 CC = getSetCCInverse(CC, 1060 MVT::isInteger(N->getOperand(2).getValueType())); 1061 } 1062 1063 unsigned Opc = getBCCForSetCC(CC); 1064 SDOperand CB = CurDAG->getTargetNode(PPC::COND_BRANCH, MVT::Other, 1065 CondCode, getI32Imm(Opc), 1066 CondTrueBlock, CondFalseBlock, 1067 Chain); 1068 return CurDAG->SelectNodeTo(N, PPC::B, MVT::Other, CondFalseBlock, CB); 1069 } else { 1070 // Iterate to the next basic block 1071 ilist<MachineBasicBlock>::iterator It = BB; 1072 ++It; 1073 1074 // If the fallthrough path is off the end of the function, which would be 1075 // undefined behavior, set it to be the same as the current block because 1076 // we have nothing better to set it to, and leaving it alone will cause 1077 // the PowerPC Branch Selection pass to crash. 1078 if (It == BB->getParent()->end()) It = Dest; 1079 return CurDAG->SelectNodeTo(N, PPC::COND_BRANCH, MVT::Other, CondCode, 1080 getI32Imm(getBCCForSetCC(CC)), 1081 N->getOperand(4), CurDAG->getBasicBlock(It), 1082 Chain); 1083 } 1084 } 1085 } 1086 1087 return SelectCode(Op); 1088} 1089 1090 1091/// createPPCISelDag - This pass converts a legalized DAG into a 1092/// PowerPC-specific DAG, ready for instruction scheduling. 1093/// 1094FunctionPass *llvm::createPPCISelDag(TargetMachine &TM) { 1095 return new PPCDAGToDAGISel(TM); 1096} 1097 1098