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