PPCISelDAGToDAG.cpp revision 18258c640466274c26e89016e361ec411ff78520
1b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper//===-- PPCISelDAGToDAG.cpp - PPC --pattern matching inst selector --------===// 270c442caa8296a698b395b8969b9a04d5491d47bUlrich Drepper// 3de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard// The LLVM Compiler Infrastructure 4b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper// 5b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper// This file was developed by Chris Lattner and is distributed under 6de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard// the University of Illinois Open Source License. See LICENSE.TXT for details. 7de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard// 8b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper//===----------------------------------------------------------------------===// 9de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard// 10de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard// This file defines a pattern matching instruction selector for PowerPC, 11de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard// converting from a legalized dag to a PPC dag. 12de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard// 13de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard//===----------------------------------------------------------------------===// 14de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard 15de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard#include "PPC.h" 16de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard#include "PPCPredicates.h" 17de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard#include "PPCTargetMachine.h" 18de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard#include "PPCISelLowering.h" 19de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard#include "PPCHazardRecognizers.h" 20de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard#include "llvm/CodeGen/MachineInstrBuilder.h" 21de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard#include "llvm/CodeGen/MachineFunction.h" 22361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper#include "llvm/CodeGen/SSARegMap.h" 23361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper#include "llvm/CodeGen/SelectionDAG.h" 24361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper#include "llvm/CodeGen/SelectionDAGISel.h" 25361df7da6dfecd817b27e62b91752ac316d7cdd4Ulrich Drepper#include "llvm/Target/TargetOptions.h" 26de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard#include "llvm/ADT/Statistic.h" 27de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard#include "llvm/Constants.h" 28de2ed97f33139af5c7a0811e4ec66fc896a13cf2Mark Wielaard#include "llvm/GlobalValue.h" 29b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include "llvm/Intrinsics.h" 30b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include "llvm/Support/Debug.h" 31b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include "llvm/Support/MathExtras.h" 32b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include "llvm/Support/Compiler.h" 33b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <iostream> 34b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <queue> 35b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper#include <set> 36b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepperusing namespace llvm; 37b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 38b08d5a8fb42f4586d756068065186b5af7e48daUlrich Dreppernamespace { 391ccdfb683ad6c7e59793136c3a657ddf131cafd1Mark Wielaard Statistic<> FrameOff("ppc-codegen", "Number of frame idx offsets collapsed"); 40b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 41b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper //===--------------------------------------------------------------------===// 42b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper /// PPCDAGToDAGISel - PPC specific code to select PPC machine 43b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper /// instructions for SelectionDAG operations. 44b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper /// 45b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper class VISIBILITY_HIDDEN PPCDAGToDAGISel : public SelectionDAGISel { 46b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper PPCTargetMachine &TM; 47b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper PPCTargetLowering PPCLowering; 48b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper unsigned GlobalBaseReg; 49b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper public: 50b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper PPCDAGToDAGISel(PPCTargetMachine &tm) 51b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper : SelectionDAGISel(PPCLowering), TM(tm), 52b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper PPCLowering(*TM.getTargetLowering()) {} 53b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 54b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper virtual bool runOnFunction(Function &Fn) { 55b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper // Make sure we re-emit a set of the global base reg if necessary 5670c442caa8296a698b395b8969b9a04d5491d47bUlrich Drepper GlobalBaseReg = 0; 5770c442caa8296a698b395b8969b9a04d5491d47bUlrich Drepper SelectionDAGISel::runOnFunction(Fn); 58b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 59b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper InsertVRSaveCode(Fn); 6070c442caa8296a698b395b8969b9a04d5491d47bUlrich Drepper return true; 6170c442caa8296a698b395b8969b9a04d5491d47bUlrich Drepper } 6270c442caa8296a698b395b8969b9a04d5491d47bUlrich Drepper 6370c442caa8296a698b395b8969b9a04d5491d47bUlrich Drepper /// getI32Imm - Return a target constant with the specified value, of type 64b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper /// i32. 65b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper inline SDOperand getI32Imm(unsigned Imm) { 66b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper return CurDAG->getTargetConstant(Imm, MVT::i32); 67b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper } 68b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 69b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper /// getI64Imm - Return a target constant with the specified value, of type 70b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper /// i64. 71b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper inline SDOperand getI64Imm(uint64_t Imm) { 72b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper return CurDAG->getTargetConstant(Imm, MVT::i64); 73b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper } 74b08d5a8fb42f4586d756068065186b5af7e48daUlrich Drepper 75 /// getSmallIPtrImm - Return a target constant of pointer type. 76 inline SDOperand getSmallIPtrImm(unsigned Imm) { 77 return CurDAG->getTargetConstant(Imm, PPCLowering.getPointerTy()); 78 } 79 80 /// isRunOfOnes - Returns true iff Val consists of one contiguous run of 1s 81 /// with any number of 0s on either side. The 1s are allowed to wrap from 82 /// LSB to MSB, so 0x000FFF0, 0x0000FFFF, and 0xFF0000FF are all runs. 83 /// 0x0F0F0000 is not, since all 1s are not contiguous. 84 static bool isRunOfOnes(unsigned Val, unsigned &MB, unsigned &ME); 85 86 87 /// isRotateAndMask - Returns true if Mask and Shift can be folded into a 88 /// rotate and mask opcode and mask operation. 89 static bool isRotateAndMask(SDNode *N, unsigned Mask, bool IsShiftMask, 90 unsigned &SH, unsigned &MB, unsigned &ME); 91 92 /// getGlobalBaseReg - insert code into the entry mbb to materialize the PIC 93 /// base register. Return the virtual register that holds this value. 94 SDNode *getGlobalBaseReg(); 95 96 // Select - Convert the specified operand from a target-independent to a 97 // target-specific node if it hasn't already been changed. 98 SDNode *Select(SDOperand Op); 99 100 SDNode *SelectBitfieldInsert(SDNode *N); 101 102 /// SelectCC - Select a comparison of the specified values with the 103 /// specified condition code, returning the CR# of the expression. 104 SDOperand SelectCC(SDOperand LHS, SDOperand RHS, ISD::CondCode CC); 105 106 /// SelectAddrImm - Returns true if the address N can be represented by 107 /// a base register plus a signed 16-bit displacement [r+imm]. 108 bool SelectAddrImm(SDOperand Op, SDOperand N, SDOperand &Disp, 109 SDOperand &Base) { 110 return PPCLowering.SelectAddressRegImm(N, Disp, Base, *CurDAG); 111 } 112 113 /// SelectAddrImmOffs - Return true if the operand is valid for a preinc 114 /// immediate field. Because preinc imms have already been validated, just 115 /// accept it. 116 bool SelectAddrImmOffs(SDOperand Op, SDOperand N, SDOperand &Out) const { 117 Out = N; 118 return true; 119 } 120 121 /// SelectAddrIdx - Given the specified addressed, check to see if it can be 122 /// represented as an indexed [r+r] operation. Returns false if it can 123 /// be represented by [r+imm], which are preferred. 124 bool SelectAddrIdx(SDOperand Op, SDOperand N, SDOperand &Base, 125 SDOperand &Index) { 126 return PPCLowering.SelectAddressRegReg(N, Base, Index, *CurDAG); 127 } 128 129 /// SelectAddrIdxOnly - Given the specified addressed, force it to be 130 /// represented as an indexed [r+r] operation. 131 bool SelectAddrIdxOnly(SDOperand Op, SDOperand N, SDOperand &Base, 132 SDOperand &Index) { 133 return PPCLowering.SelectAddressRegRegOnly(N, Base, Index, *CurDAG); 134 } 135 136 /// SelectAddrImmShift - Returns true if the address N can be represented by 137 /// a base register plus a signed 14-bit displacement [r+imm*4]. Suitable 138 /// for use by STD and friends. 139 bool SelectAddrImmShift(SDOperand Op, SDOperand N, SDOperand &Disp, 140 SDOperand &Base) { 141 return PPCLowering.SelectAddressRegImmShift(N, Disp, Base, *CurDAG); 142 } 143 144 /// SelectInlineAsmMemoryOperand - Implement addressing mode selection for 145 /// inline asm expressions. 146 virtual bool SelectInlineAsmMemoryOperand(const SDOperand &Op, 147 char ConstraintCode, 148 std::vector<SDOperand> &OutOps, 149 SelectionDAG &DAG) { 150 SDOperand Op0, Op1; 151 switch (ConstraintCode) { 152 default: return true; 153 case 'm': // memory 154 if (!SelectAddrIdx(Op, Op, Op0, Op1)) 155 SelectAddrImm(Op, Op, Op0, Op1); 156 break; 157 case 'o': // offsetable 158 if (!SelectAddrImm(Op, Op, Op0, Op1)) { 159 Op0 = Op; 160 AddToISelQueue(Op0); // r+0. 161 Op1 = getSmallIPtrImm(0); 162 } 163 break; 164 case 'v': // not offsetable 165 SelectAddrIdxOnly(Op, Op, Op0, Op1); 166 break; 167 } 168 169 OutOps.push_back(Op0); 170 OutOps.push_back(Op1); 171 return false; 172 } 173 174 SDOperand BuildSDIVSequence(SDNode *N); 175 SDOperand BuildUDIVSequence(SDNode *N); 176 177 /// InstructionSelectBasicBlock - This callback is invoked by 178 /// SelectionDAGISel when it has created a SelectionDAG for us to codegen. 179 virtual void InstructionSelectBasicBlock(SelectionDAG &DAG); 180 181 void InsertVRSaveCode(Function &Fn); 182 183 virtual const char *getPassName() const { 184 return "PowerPC DAG->DAG Pattern Instruction Selection"; 185 } 186 187 /// CreateTargetHazardRecognizer - Return the hazard recognizer to use for 188 /// this target when scheduling the DAG. 189 virtual HazardRecognizer *CreateTargetHazardRecognizer() { 190 // Should use subtarget info to pick the right hazard recognizer. For 191 // now, always return a PPC970 recognizer. 192 const TargetInstrInfo *II = PPCLowering.getTargetMachine().getInstrInfo(); 193 assert(II && "No InstrInfo?"); 194 return new PPCHazardRecognizer970(*II); 195 } 196 197// Include the pieces autogenerated from the target description. 198#include "PPCGenDAGISel.inc" 199 200private: 201 SDNode *SelectSETCC(SDOperand Op); 202 }; 203} 204 205/// InstructionSelectBasicBlock - This callback is invoked by 206/// SelectionDAGISel when it has created a SelectionDAG for us to codegen. 207void PPCDAGToDAGISel::InstructionSelectBasicBlock(SelectionDAG &DAG) { 208 DEBUG(BB->dump()); 209 210 // Select target instructions for the DAG. 211 DAG.setRoot(SelectRoot(DAG.getRoot())); 212 DAG.RemoveDeadNodes(); 213 214 // Emit machine code to BB. 215 ScheduleAndEmitDAG(DAG); 216} 217 218/// InsertVRSaveCode - Once the entire function has been instruction selected, 219/// all virtual registers are created and all machine instructions are built, 220/// check to see if we need to save/restore VRSAVE. If so, do it. 221void PPCDAGToDAGISel::InsertVRSaveCode(Function &F) { 222 // Check to see if this function uses vector registers, which means we have to 223 // save and restore the VRSAVE register and update it with the regs we use. 224 // 225 // In this case, there will be virtual registers of vector type type created 226 // by the scheduler. Detect them now. 227 MachineFunction &Fn = MachineFunction::get(&F); 228 SSARegMap *RegMap = Fn.getSSARegMap(); 229 bool HasVectorVReg = false; 230 for (unsigned i = MRegisterInfo::FirstVirtualRegister, 231 e = RegMap->getLastVirtReg()+1; i != e; ++i) 232 if (RegMap->getRegClass(i) == &PPC::VRRCRegClass) { 233 HasVectorVReg = true; 234 break; 235 } 236 if (!HasVectorVReg) return; // nothing to do. 237 238 // If we have a vector register, we want to emit code into the entry and exit 239 // blocks to save and restore the VRSAVE register. We do this here (instead 240 // of marking all vector instructions as clobbering VRSAVE) for two reasons: 241 // 242 // 1. This (trivially) reduces the load on the register allocator, by not 243 // having to represent the live range of the VRSAVE register. 244 // 2. This (more significantly) allows us to create a temporary virtual 245 // register to hold the saved VRSAVE value, allowing this temporary to be 246 // register allocated, instead of forcing it to be spilled to the stack. 247 248 // Create two vregs - one to hold the VRSAVE register that is live-in to the 249 // function and one for the value after having bits or'd into it. 250 unsigned InVRSAVE = RegMap->createVirtualRegister(&PPC::GPRCRegClass); 251 unsigned UpdatedVRSAVE = RegMap->createVirtualRegister(&PPC::GPRCRegClass); 252 253 MachineBasicBlock &EntryBB = *Fn.begin(); 254 // Emit the following code into the entry block: 255 // InVRSAVE = MFVRSAVE 256 // UpdatedVRSAVE = UPDATE_VRSAVE InVRSAVE 257 // MTVRSAVE UpdatedVRSAVE 258 MachineBasicBlock::iterator IP = EntryBB.begin(); // Insert Point 259 BuildMI(EntryBB, IP, PPC::MFVRSAVE, 0, InVRSAVE); 260 BuildMI(EntryBB, IP, PPC::UPDATE_VRSAVE, 1, UpdatedVRSAVE).addReg(InVRSAVE); 261 BuildMI(EntryBB, IP, PPC::MTVRSAVE, 1).addReg(UpdatedVRSAVE); 262 263 // Find all return blocks, outputting a restore in each epilog. 264 const TargetInstrInfo &TII = *TM.getInstrInfo(); 265 for (MachineFunction::iterator BB = Fn.begin(), E = Fn.end(); BB != E; ++BB) { 266 if (!BB->empty() && TII.isReturn(BB->back().getOpcode())) { 267 IP = BB->end(); --IP; 268 269 // Skip over all terminator instructions, which are part of the return 270 // sequence. 271 MachineBasicBlock::iterator I2 = IP; 272 while (I2 != BB->begin() && TII.isTerminatorInstr((--I2)->getOpcode())) 273 IP = I2; 274 275 // Emit: MTVRSAVE InVRSave 276 BuildMI(*BB, IP, PPC::MTVRSAVE, 1).addReg(InVRSAVE); 277 } 278 } 279} 280 281 282/// getGlobalBaseReg - Output the instructions required to put the 283/// base address to use for accessing globals into a register. 284/// 285SDNode *PPCDAGToDAGISel::getGlobalBaseReg() { 286 if (!GlobalBaseReg) { 287 // Insert the set of GlobalBaseReg into the first MBB of the function 288 MachineBasicBlock &FirstMBB = BB->getParent()->front(); 289 MachineBasicBlock::iterator MBBI = FirstMBB.begin(); 290 SSARegMap *RegMap = BB->getParent()->getSSARegMap(); 291 292 if (PPCLowering.getPointerTy() == MVT::i32) { 293 GlobalBaseReg = RegMap->createVirtualRegister(PPC::GPRCRegisterClass); 294 BuildMI(FirstMBB, MBBI, PPC::MovePCtoLR, 0, PPC::LR); 295 BuildMI(FirstMBB, MBBI, PPC::MFLR, 1, GlobalBaseReg); 296 } else { 297 GlobalBaseReg = RegMap->createVirtualRegister(PPC::G8RCRegisterClass); 298 BuildMI(FirstMBB, MBBI, PPC::MovePCtoLR8, 0, PPC::LR8); 299 BuildMI(FirstMBB, MBBI, PPC::MFLR8, 1, GlobalBaseReg); 300 } 301 } 302 return CurDAG->getRegister(GlobalBaseReg, PPCLowering.getPointerTy()).Val; 303} 304 305/// isIntS16Immediate - This method tests to see if the node is either a 32-bit 306/// or 64-bit immediate, and if the value can be accurately represented as a 307/// sign extension from a 16-bit value. If so, this returns true and the 308/// immediate. 309static bool isIntS16Immediate(SDNode *N, short &Imm) { 310 if (N->getOpcode() != ISD::Constant) 311 return false; 312 313 Imm = (short)cast<ConstantSDNode>(N)->getValue(); 314 if (N->getValueType(0) == MVT::i32) 315 return Imm == (int32_t)cast<ConstantSDNode>(N)->getValue(); 316 else 317 return Imm == (int64_t)cast<ConstantSDNode>(N)->getValue(); 318} 319 320static bool isIntS16Immediate(SDOperand Op, short &Imm) { 321 return isIntS16Immediate(Op.Val, Imm); 322} 323 324 325/// isInt32Immediate - This method tests to see if the node is a 32-bit constant 326/// operand. If so Imm will receive the 32-bit value. 327static bool isInt32Immediate(SDNode *N, unsigned &Imm) { 328 if (N->getOpcode() == ISD::Constant && N->getValueType(0) == MVT::i32) { 329 Imm = cast<ConstantSDNode>(N)->getValue(); 330 return true; 331 } 332 return false; 333} 334 335/// isInt64Immediate - This method tests to see if the node is a 64-bit constant 336/// operand. If so Imm will receive the 64-bit value. 337static bool isInt64Immediate(SDNode *N, uint64_t &Imm) { 338 if (N->getOpcode() == ISD::Constant && N->getValueType(0) == MVT::i64) { 339 Imm = cast<ConstantSDNode>(N)->getValue(); 340 return true; 341 } 342 return false; 343} 344 345// isInt32Immediate - This method tests to see if a constant operand. 346// If so Imm will receive the 32 bit value. 347static bool isInt32Immediate(SDOperand N, unsigned &Imm) { 348 return isInt32Immediate(N.Val, Imm); 349} 350 351 352// isOpcWithIntImmediate - This method tests to see if the node is a specific 353// opcode and that it has a immediate integer right operand. 354// If so Imm will receive the 32 bit value. 355static bool isOpcWithIntImmediate(SDNode *N, unsigned Opc, unsigned& Imm) { 356 return N->getOpcode() == Opc && isInt32Immediate(N->getOperand(1).Val, Imm); 357} 358 359bool PPCDAGToDAGISel::isRunOfOnes(unsigned Val, unsigned &MB, unsigned &ME) { 360 if (isShiftedMask_32(Val)) { 361 // look for the first non-zero bit 362 MB = CountLeadingZeros_32(Val); 363 // look for the first zero bit after the run of ones 364 ME = CountLeadingZeros_32((Val - 1) ^ Val); 365 return true; 366 } else { 367 Val = ~Val; // invert mask 368 if (isShiftedMask_32(Val)) { 369 // effectively look for the first zero bit 370 ME = CountLeadingZeros_32(Val) - 1; 371 // effectively look for the first one bit after the run of zeros 372 MB = CountLeadingZeros_32((Val - 1) ^ Val) + 1; 373 return true; 374 } 375 } 376 // no run present 377 return false; 378} 379 380bool PPCDAGToDAGISel::isRotateAndMask(SDNode *N, unsigned Mask, 381 bool IsShiftMask, unsigned &SH, 382 unsigned &MB, unsigned &ME) { 383 // Don't even go down this path for i64, since different logic will be 384 // necessary for rldicl/rldicr/rldimi. 385 if (N->getValueType(0) != MVT::i32) 386 return false; 387 388 unsigned Shift = 32; 389 unsigned Indeterminant = ~0; // bit mask marking indeterminant results 390 unsigned Opcode = N->getOpcode(); 391 if (N->getNumOperands() != 2 || 392 !isInt32Immediate(N->getOperand(1).Val, Shift) || (Shift > 31)) 393 return false; 394 395 if (Opcode == ISD::SHL) { 396 // apply shift left to mask if it comes first 397 if (IsShiftMask) Mask = Mask << Shift; 398 // determine which bits are made indeterminant by shift 399 Indeterminant = ~(0xFFFFFFFFu << Shift); 400 } else if (Opcode == ISD::SRL) { 401 // apply shift right to mask if it comes first 402 if (IsShiftMask) Mask = Mask >> Shift; 403 // determine which bits are made indeterminant by shift 404 Indeterminant = ~(0xFFFFFFFFu >> Shift); 405 // adjust for the left rotate 406 Shift = 32 - Shift; 407 } else if (Opcode == ISD::ROTL) { 408 Indeterminant = 0; 409 } else { 410 return false; 411 } 412 413 // if the mask doesn't intersect any Indeterminant bits 414 if (Mask && !(Mask & Indeterminant)) { 415 SH = Shift & 31; 416 // make sure the mask is still a mask (wrap arounds may not be) 417 return isRunOfOnes(Mask, MB, ME); 418 } 419 return false; 420} 421 422/// SelectBitfieldInsert - turn an or of two masked values into 423/// the rotate left word immediate then mask insert (rlwimi) instruction. 424SDNode *PPCDAGToDAGISel::SelectBitfieldInsert(SDNode *N) { 425 SDOperand Op0 = N->getOperand(0); 426 SDOperand Op1 = N->getOperand(1); 427 428 uint64_t LKZ, LKO, RKZ, RKO; 429 TLI.ComputeMaskedBits(Op0, 0xFFFFFFFFULL, LKZ, LKO); 430 TLI.ComputeMaskedBits(Op1, 0xFFFFFFFFULL, RKZ, RKO); 431 432 unsigned TargetMask = LKZ; 433 unsigned InsertMask = RKZ; 434 435 if ((TargetMask | InsertMask) == 0xFFFFFFFF) { 436 unsigned Op0Opc = Op0.getOpcode(); 437 unsigned Op1Opc = Op1.getOpcode(); 438 unsigned Value, SH = 0; 439 TargetMask = ~TargetMask; 440 InsertMask = ~InsertMask; 441 442 // If the LHS has a foldable shift and the RHS does not, then swap it to the 443 // RHS so that we can fold the shift into the insert. 444 if (Op0Opc == ISD::AND && Op1Opc == ISD::AND) { 445 if (Op0.getOperand(0).getOpcode() == ISD::SHL || 446 Op0.getOperand(0).getOpcode() == ISD::SRL) { 447 if (Op1.getOperand(0).getOpcode() != ISD::SHL && 448 Op1.getOperand(0).getOpcode() != ISD::SRL) { 449 std::swap(Op0, Op1); 450 std::swap(Op0Opc, Op1Opc); 451 std::swap(TargetMask, InsertMask); 452 } 453 } 454 } else if (Op0Opc == ISD::SHL || Op0Opc == ISD::SRL) { 455 if (Op1Opc == ISD::AND && Op1.getOperand(0).getOpcode() != ISD::SHL && 456 Op1.getOperand(0).getOpcode() != ISD::SRL) { 457 std::swap(Op0, Op1); 458 std::swap(Op0Opc, Op1Opc); 459 std::swap(TargetMask, InsertMask); 460 } 461 } 462 463 unsigned MB, ME; 464 if (InsertMask && isRunOfOnes(InsertMask, MB, ME)) { 465 SDOperand Tmp1, Tmp2, Tmp3; 466 bool DisjointMask = (TargetMask ^ InsertMask) == 0xFFFFFFFF; 467 468 if ((Op1Opc == ISD::SHL || Op1Opc == ISD::SRL) && 469 isInt32Immediate(Op1.getOperand(1), Value)) { 470 Op1 = Op1.getOperand(0); 471 SH = (Op1Opc == ISD::SHL) ? Value : 32 - Value; 472 } 473 if (Op1Opc == ISD::AND) { 474 unsigned SHOpc = Op1.getOperand(0).getOpcode(); 475 if ((SHOpc == ISD::SHL || SHOpc == ISD::SRL) && 476 isInt32Immediate(Op1.getOperand(0).getOperand(1), Value)) { 477 Op1 = Op1.getOperand(0).getOperand(0); 478 SH = (SHOpc == ISD::SHL) ? Value : 32 - Value; 479 } else { 480 Op1 = Op1.getOperand(0); 481 } 482 } 483 484 Tmp3 = (Op0Opc == ISD::AND && DisjointMask) ? Op0.getOperand(0) : Op0; 485 AddToISelQueue(Tmp3); 486 AddToISelQueue(Op1); 487 SH &= 31; 488 SDOperand Ops[] = { Tmp3, Op1, getI32Imm(SH), getI32Imm(MB), 489 getI32Imm(ME) }; 490 return CurDAG->getTargetNode(PPC::RLWIMI, MVT::i32, Ops, 5); 491 } 492 } 493 return 0; 494} 495 496/// SelectCC - Select a comparison of the specified values with the specified 497/// condition code, returning the CR# of the expression. 498SDOperand PPCDAGToDAGISel::SelectCC(SDOperand LHS, SDOperand RHS, 499 ISD::CondCode CC) { 500 // Always select the LHS. 501 AddToISelQueue(LHS); 502 unsigned Opc; 503 504 if (LHS.getValueType() == MVT::i32) { 505 unsigned Imm; 506 if (CC == ISD::SETEQ || CC == ISD::SETNE) { 507 if (isInt32Immediate(RHS, Imm)) { 508 // SETEQ/SETNE comparison with 16-bit immediate, fold it. 509 if (isUInt16(Imm)) 510 return SDOperand(CurDAG->getTargetNode(PPC::CMPLWI, MVT::i32, LHS, 511 getI32Imm(Imm & 0xFFFF)), 0); 512 // If this is a 16-bit signed immediate, fold it. 513 if (isInt16(Imm)) 514 return SDOperand(CurDAG->getTargetNode(PPC::CMPWI, MVT::i32, LHS, 515 getI32Imm(Imm & 0xFFFF)), 0); 516 517 // For non-equality comparisons, the default code would materialize the 518 // constant, then compare against it, like this: 519 // lis r2, 4660 520 // ori r2, r2, 22136 521 // cmpw cr0, r3, r2 522 // Since we are just comparing for equality, we can emit this instead: 523 // xoris r0,r3,0x1234 524 // cmplwi cr0,r0,0x5678 525 // beq cr0,L6 526 SDOperand Xor(CurDAG->getTargetNode(PPC::XORIS, MVT::i32, LHS, 527 getI32Imm(Imm >> 16)), 0); 528 return SDOperand(CurDAG->getTargetNode(PPC::CMPLWI, MVT::i32, Xor, 529 getI32Imm(Imm & 0xFFFF)), 0); 530 } 531 Opc = PPC::CMPLW; 532 } else if (ISD::isUnsignedIntSetCC(CC)) { 533 if (isInt32Immediate(RHS, Imm) && isUInt16(Imm)) 534 return SDOperand(CurDAG->getTargetNode(PPC::CMPLWI, MVT::i32, LHS, 535 getI32Imm(Imm & 0xFFFF)), 0); 536 Opc = PPC::CMPLW; 537 } else { 538 short SImm; 539 if (isIntS16Immediate(RHS, SImm)) 540 return SDOperand(CurDAG->getTargetNode(PPC::CMPWI, MVT::i32, LHS, 541 getI32Imm((int)SImm & 0xFFFF)), 542 0); 543 Opc = PPC::CMPW; 544 } 545 } else if (LHS.getValueType() == MVT::i64) { 546 uint64_t Imm; 547 if (CC == ISD::SETEQ || CC == ISD::SETNE) { 548 if (isInt64Immediate(RHS.Val, Imm)) { 549 // SETEQ/SETNE comparison with 16-bit immediate, fold it. 550 if (isUInt16(Imm)) 551 return SDOperand(CurDAG->getTargetNode(PPC::CMPLDI, MVT::i64, LHS, 552 getI32Imm(Imm & 0xFFFF)), 0); 553 // If this is a 16-bit signed immediate, fold it. 554 if (isInt16(Imm)) 555 return SDOperand(CurDAG->getTargetNode(PPC::CMPDI, MVT::i64, LHS, 556 getI32Imm(Imm & 0xFFFF)), 0); 557 558 // For non-equality comparisons, the default code would materialize the 559 // constant, then compare against it, like this: 560 // lis r2, 4660 561 // ori r2, r2, 22136 562 // cmpd cr0, r3, r2 563 // Since we are just comparing for equality, we can emit this instead: 564 // xoris r0,r3,0x1234 565 // cmpldi cr0,r0,0x5678 566 // beq cr0,L6 567 if (isUInt32(Imm)) { 568 SDOperand Xor(CurDAG->getTargetNode(PPC::XORIS8, MVT::i64, LHS, 569 getI64Imm(Imm >> 16)), 0); 570 return SDOperand(CurDAG->getTargetNode(PPC::CMPLDI, MVT::i64, Xor, 571 getI64Imm(Imm & 0xFFFF)), 0); 572 } 573 } 574 Opc = PPC::CMPLD; 575 } else if (ISD::isUnsignedIntSetCC(CC)) { 576 if (isInt64Immediate(RHS.Val, Imm) && isUInt16(Imm)) 577 return SDOperand(CurDAG->getTargetNode(PPC::CMPLDI, MVT::i64, LHS, 578 getI64Imm(Imm & 0xFFFF)), 0); 579 Opc = PPC::CMPLD; 580 } else { 581 short SImm; 582 if (isIntS16Immediate(RHS, SImm)) 583 return SDOperand(CurDAG->getTargetNode(PPC::CMPDI, MVT::i64, LHS, 584 getI64Imm(SImm & 0xFFFF)), 585 0); 586 Opc = PPC::CMPD; 587 } 588 } else if (LHS.getValueType() == MVT::f32) { 589 Opc = PPC::FCMPUS; 590 } else { 591 assert(LHS.getValueType() == MVT::f64 && "Unknown vt!"); 592 Opc = PPC::FCMPUD; 593 } 594 AddToISelQueue(RHS); 595 return SDOperand(CurDAG->getTargetNode(Opc, MVT::i32, LHS, RHS), 0); 596} 597 598static PPC::Predicate getPredicateForSetCC(ISD::CondCode CC) { 599 switch (CC) { 600 default: assert(0 && "Unknown condition!"); abort(); 601 case ISD::SETOEQ: // FIXME: This is incorrect see PR642. 602 case ISD::SETUEQ: 603 case ISD::SETEQ: return PPC::PRED_EQ; 604 case ISD::SETONE: // FIXME: This is incorrect see PR642. 605 case ISD::SETUNE: 606 case ISD::SETNE: return PPC::PRED_NE; 607 case ISD::SETOLT: // FIXME: This is incorrect see PR642. 608 case ISD::SETULT: 609 case ISD::SETLT: return PPC::PRED_LT; 610 case ISD::SETOLE: // FIXME: This is incorrect see PR642. 611 case ISD::SETULE: 612 case ISD::SETLE: return PPC::PRED_LE; 613 case ISD::SETOGT: // FIXME: This is incorrect see PR642. 614 case ISD::SETUGT: 615 case ISD::SETGT: return PPC::PRED_GT; 616 case ISD::SETOGE: // FIXME: This is incorrect see PR642. 617 case ISD::SETUGE: 618 case ISD::SETGE: return PPC::PRED_GE; 619 620 case ISD::SETO: return PPC::PRED_NU; 621 case ISD::SETUO: return PPC::PRED_UN; 622 } 623} 624 625/// getCRIdxForSetCC - Return the index of the condition register field 626/// associated with the SetCC condition, and whether or not the field is 627/// treated as inverted. That is, lt = 0; ge = 0 inverted. 628static unsigned getCRIdxForSetCC(ISD::CondCode CC, bool& Inv) { 629 switch (CC) { 630 default: assert(0 && "Unknown condition!"); abort(); 631 case ISD::SETOLT: // FIXME: This is incorrect see PR642. 632 case ISD::SETULT: 633 case ISD::SETLT: Inv = false; return 0; 634 case ISD::SETOGE: // FIXME: This is incorrect see PR642. 635 case ISD::SETUGE: 636 case ISD::SETGE: Inv = true; return 0; 637 case ISD::SETOGT: // FIXME: This is incorrect see PR642. 638 case ISD::SETUGT: 639 case ISD::SETGT: Inv = false; return 1; 640 case ISD::SETOLE: // FIXME: This is incorrect see PR642. 641 case ISD::SETULE: 642 case ISD::SETLE: Inv = true; return 1; 643 case ISD::SETOEQ: // FIXME: This is incorrect see PR642. 644 case ISD::SETUEQ: 645 case ISD::SETEQ: Inv = false; return 2; 646 case ISD::SETONE: // FIXME: This is incorrect see PR642. 647 case ISD::SETUNE: 648 case ISD::SETNE: Inv = true; return 2; 649 case ISD::SETO: Inv = true; return 3; 650 case ISD::SETUO: Inv = false; return 3; 651 } 652 return 0; 653} 654 655SDNode *PPCDAGToDAGISel::SelectSETCC(SDOperand Op) { 656 SDNode *N = Op.Val; 657 unsigned Imm; 658 ISD::CondCode CC = cast<CondCodeSDNode>(N->getOperand(2))->get(); 659 if (isInt32Immediate(N->getOperand(1), Imm)) { 660 // We can codegen setcc op, imm very efficiently compared to a brcond. 661 // Check for those cases here. 662 // setcc op, 0 663 if (Imm == 0) { 664 SDOperand Op = N->getOperand(0); 665 AddToISelQueue(Op); 666 switch (CC) { 667 default: break; 668 case ISD::SETEQ: { 669 Op = SDOperand(CurDAG->getTargetNode(PPC::CNTLZW, MVT::i32, Op), 0); 670 SDOperand Ops[] = { Op, getI32Imm(27), getI32Imm(5), getI32Imm(31) }; 671 return CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Ops, 4); 672 } 673 case ISD::SETNE: { 674 SDOperand AD = 675 SDOperand(CurDAG->getTargetNode(PPC::ADDIC, MVT::i32, MVT::Flag, 676 Op, getI32Imm(~0U)), 0); 677 return CurDAG->SelectNodeTo(N, PPC::SUBFE, MVT::i32, AD, Op, 678 AD.getValue(1)); 679 } 680 case ISD::SETLT: { 681 SDOperand Ops[] = { Op, getI32Imm(1), getI32Imm(31), getI32Imm(31) }; 682 return CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Ops, 4); 683 } 684 case ISD::SETGT: { 685 SDOperand T = 686 SDOperand(CurDAG->getTargetNode(PPC::NEG, MVT::i32, Op), 0); 687 T = SDOperand(CurDAG->getTargetNode(PPC::ANDC, MVT::i32, T, Op), 0); 688 SDOperand Ops[] = { T, getI32Imm(1), getI32Imm(31), getI32Imm(31) }; 689 return CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Ops, 4); 690 } 691 } 692 } else if (Imm == ~0U) { // setcc op, -1 693 SDOperand Op = N->getOperand(0); 694 AddToISelQueue(Op); 695 switch (CC) { 696 default: break; 697 case ISD::SETEQ: 698 Op = SDOperand(CurDAG->getTargetNode(PPC::ADDIC, MVT::i32, MVT::Flag, 699 Op, getI32Imm(1)), 0); 700 return CurDAG->SelectNodeTo(N, PPC::ADDZE, MVT::i32, 701 SDOperand(CurDAG->getTargetNode(PPC::LI, MVT::i32, 702 getI32Imm(0)), 0), 703 Op.getValue(1)); 704 case ISD::SETNE: { 705 Op = SDOperand(CurDAG->getTargetNode(PPC::NOR, MVT::i32, Op, Op), 0); 706 SDNode *AD = CurDAG->getTargetNode(PPC::ADDIC, MVT::i32, MVT::Flag, 707 Op, getI32Imm(~0U)); 708 return CurDAG->SelectNodeTo(N, PPC::SUBFE, MVT::i32, SDOperand(AD, 0), 709 Op, SDOperand(AD, 1)); 710 } 711 case ISD::SETLT: { 712 SDOperand AD = SDOperand(CurDAG->getTargetNode(PPC::ADDI, MVT::i32, Op, 713 getI32Imm(1)), 0); 714 SDOperand AN = SDOperand(CurDAG->getTargetNode(PPC::AND, MVT::i32, AD, 715 Op), 0); 716 SDOperand Ops[] = { AN, getI32Imm(1), getI32Imm(31), getI32Imm(31) }; 717 return CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Ops, 4); 718 } 719 case ISD::SETGT: { 720 SDOperand Ops[] = { Op, getI32Imm(1), getI32Imm(31), getI32Imm(31) }; 721 Op = SDOperand(CurDAG->getTargetNode(PPC::RLWINM, MVT::i32, Ops, 4), 0); 722 return CurDAG->SelectNodeTo(N, PPC::XORI, MVT::i32, Op, 723 getI32Imm(1)); 724 } 725 } 726 } 727 } 728 729 bool Inv; 730 unsigned Idx = getCRIdxForSetCC(CC, Inv); 731 SDOperand CCReg = SelectCC(N->getOperand(0), N->getOperand(1), CC); 732 SDOperand IntCR; 733 734 // Force the ccreg into CR7. 735 SDOperand CR7Reg = CurDAG->getRegister(PPC::CR7, MVT::i32); 736 737 SDOperand InFlag(0, 0); // Null incoming flag value. 738 CCReg = CurDAG->getCopyToReg(CurDAG->getEntryNode(), CR7Reg, CCReg, 739 InFlag).getValue(1); 740 741 if (TLI.getTargetMachine().getSubtarget<PPCSubtarget>().isGigaProcessor()) 742 IntCR = SDOperand(CurDAG->getTargetNode(PPC::MFOCRF, MVT::i32, CR7Reg, 743 CCReg), 0); 744 else 745 IntCR = SDOperand(CurDAG->getTargetNode(PPC::MFCR, MVT::i32, CCReg), 0); 746 747 SDOperand Ops[] = { IntCR, getI32Imm((32-(3-Idx)) & 31), 748 getI32Imm(31), getI32Imm(31) }; 749 if (!Inv) { 750 return CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Ops, 4); 751 } else { 752 SDOperand Tmp = 753 SDOperand(CurDAG->getTargetNode(PPC::RLWINM, MVT::i32, Ops, 4), 0); 754 return CurDAG->SelectNodeTo(N, PPC::XORI, MVT::i32, Tmp, getI32Imm(1)); 755 } 756} 757 758 759// Select - Convert the specified operand from a target-independent to a 760// target-specific node if it hasn't already been changed. 761SDNode *PPCDAGToDAGISel::Select(SDOperand Op) { 762 SDNode *N = Op.Val; 763 if (N->getOpcode() >= ISD::BUILTIN_OP_END && 764 N->getOpcode() < PPCISD::FIRST_NUMBER) 765 return NULL; // Already selected. 766 767 switch (N->getOpcode()) { 768 default: break; 769 case ISD::SETCC: 770 return SelectSETCC(Op); 771 case PPCISD::GlobalBaseReg: 772 return getGlobalBaseReg(); 773 774 case ISD::FrameIndex: { 775 int FI = cast<FrameIndexSDNode>(N)->getIndex(); 776 SDOperand TFI = CurDAG->getTargetFrameIndex(FI, Op.getValueType()); 777 unsigned Opc = Op.getValueType() == MVT::i32 ? PPC::ADDI : PPC::ADDI8; 778 if (N->hasOneUse()) 779 return CurDAG->SelectNodeTo(N, Opc, Op.getValueType(), TFI, 780 getSmallIPtrImm(0)); 781 return CurDAG->getTargetNode(Opc, Op.getValueType(), TFI, 782 getSmallIPtrImm(0)); 783 } 784 785 case PPCISD::MFCR: { 786 SDOperand InFlag = N->getOperand(1); 787 AddToISelQueue(InFlag); 788 // Use MFOCRF if supported. 789 if (TLI.getTargetMachine().getSubtarget<PPCSubtarget>().isGigaProcessor()) 790 return CurDAG->getTargetNode(PPC::MFOCRF, MVT::i32, 791 N->getOperand(0), InFlag); 792 else 793 return CurDAG->getTargetNode(PPC::MFCR, MVT::i32, InFlag); 794 } 795 796 case ISD::SDIV: { 797 // FIXME: since this depends on the setting of the carry flag from the srawi 798 // we should really be making notes about that for the scheduler. 799 // FIXME: It sure would be nice if we could cheaply recognize the 800 // srl/add/sra pattern the dag combiner will generate for this as 801 // sra/addze rather than having to handle sdiv ourselves. oh well. 802 unsigned Imm; 803 if (isInt32Immediate(N->getOperand(1), Imm)) { 804 SDOperand N0 = N->getOperand(0); 805 AddToISelQueue(N0); 806 if ((signed)Imm > 0 && isPowerOf2_32(Imm)) { 807 SDNode *Op = 808 CurDAG->getTargetNode(PPC::SRAWI, MVT::i32, MVT::Flag, 809 N0, getI32Imm(Log2_32(Imm))); 810 return CurDAG->SelectNodeTo(N, PPC::ADDZE, MVT::i32, 811 SDOperand(Op, 0), SDOperand(Op, 1)); 812 } else if ((signed)Imm < 0 && isPowerOf2_32(-Imm)) { 813 SDNode *Op = 814 CurDAG->getTargetNode(PPC::SRAWI, MVT::i32, MVT::Flag, 815 N0, getI32Imm(Log2_32(-Imm))); 816 SDOperand PT = 817 SDOperand(CurDAG->getTargetNode(PPC::ADDZE, MVT::i32, 818 SDOperand(Op, 0), SDOperand(Op, 1)), 819 0); 820 return CurDAG->SelectNodeTo(N, PPC::NEG, MVT::i32, PT); 821 } 822 } 823 824 // Other cases are autogenerated. 825 break; 826 } 827 828 case ISD::LOAD: { 829 // Handle preincrement loads. 830 LoadSDNode *LD = cast<LoadSDNode>(Op); 831 MVT::ValueType LoadedVT = LD->getLoadedVT(); 832 833 // Normal loads are handled by code generated from the .td file. 834 if (LD->getAddressingMode() != ISD::PRE_INC) 835 break; 836 837 SDOperand Offset = LD->getOffset(); 838 if (isa<ConstantSDNode>(Offset) || 839 Offset.getOpcode() == ISD::TargetGlobalAddress) { 840 841 unsigned Opcode; 842 bool isSExt = LD->getExtensionType() == ISD::SEXTLOAD; 843 if (LD->getValueType(0) != MVT::i64) { 844 // Handle PPC32 integer and normal FP loads. 845 assert(!isSExt || LoadedVT == MVT::i16 && "Invalid sext update load"); 846 switch (LoadedVT) { 847 default: assert(0 && "Invalid PPC load type!"); 848 case MVT::f64: Opcode = PPC::LFDU; break; 849 case MVT::f32: Opcode = PPC::LFSU; break; 850 case MVT::i32: Opcode = PPC::LWZU; break; 851 case MVT::i16: Opcode = isSExt ? PPC::LHAU : PPC::LHZU; break; 852 case MVT::i1: 853 case MVT::i8: Opcode = PPC::LBZU; break; 854 } 855 } else { 856 assert(LD->getValueType(0) == MVT::i64 && "Unknown load result type!"); 857 assert(!isSExt || LoadedVT == MVT::i16 && "Invalid sext update load"); 858 switch (LoadedVT) { 859 default: assert(0 && "Invalid PPC load type!"); 860 case MVT::i64: Opcode = PPC::LDU; break; 861 case MVT::i32: Opcode = PPC::LWZU8; break; 862 case MVT::i16: Opcode = isSExt ? PPC::LHAU8 : PPC::LHZU8; break; 863 case MVT::i1: 864 case MVT::i8: Opcode = PPC::LBZU8; break; 865 } 866 } 867 868 SDOperand Chain = LD->getChain(); 869 SDOperand Base = LD->getBasePtr(); 870 AddToISelQueue(Chain); 871 AddToISelQueue(Base); 872 AddToISelQueue(Offset); 873 SDOperand Ops[] = { Offset, Base, Chain }; 874 // FIXME: PPC64 875 return CurDAG->getTargetNode(Opcode, MVT::i32, MVT::i32, 876 MVT::Other, Ops, 3); 877 } else { 878 assert(0 && "R+R preindex loads not supported yet!"); 879 } 880 } 881 882 case ISD::AND: { 883 unsigned Imm, Imm2, SH, MB, ME; 884 885 // If this is an and of a value rotated between 0 and 31 bits and then and'd 886 // with a mask, emit rlwinm 887 if (isInt32Immediate(N->getOperand(1), Imm) && 888 isRotateAndMask(N->getOperand(0).Val, Imm, false, SH, MB, ME)) { 889 SDOperand Val = N->getOperand(0).getOperand(0); 890 AddToISelQueue(Val); 891 SDOperand Ops[] = { Val, getI32Imm(SH), getI32Imm(MB), getI32Imm(ME) }; 892 return CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Ops, 4); 893 } 894 // If this is just a masked value where the input is not handled above, and 895 // is not a rotate-left (handled by a pattern in the .td file), emit rlwinm 896 if (isInt32Immediate(N->getOperand(1), Imm) && 897 isRunOfOnes(Imm, MB, ME) && 898 N->getOperand(0).getOpcode() != ISD::ROTL) { 899 SDOperand Val = N->getOperand(0); 900 AddToISelQueue(Val); 901 SDOperand Ops[] = { Val, getI32Imm(0), getI32Imm(MB), getI32Imm(ME) }; 902 return CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Ops, 4); 903 } 904 // AND X, 0 -> 0, not "rlwinm 32". 905 if (isInt32Immediate(N->getOperand(1), Imm) && (Imm == 0)) { 906 AddToISelQueue(N->getOperand(1)); 907 ReplaceUses(SDOperand(N, 0), N->getOperand(1)); 908 return NULL; 909 } 910 // ISD::OR doesn't get all the bitfield insertion fun. 911 // (and (or x, c1), c2) where isRunOfOnes(~(c1^c2)) is a bitfield insert 912 if (isInt32Immediate(N->getOperand(1), Imm) && 913 N->getOperand(0).getOpcode() == ISD::OR && 914 isInt32Immediate(N->getOperand(0).getOperand(1), Imm2)) { 915 unsigned MB, ME; 916 Imm = ~(Imm^Imm2); 917 if (isRunOfOnes(Imm, MB, ME)) { 918 AddToISelQueue(N->getOperand(0).getOperand(0)); 919 AddToISelQueue(N->getOperand(0).getOperand(1)); 920 SDOperand Ops[] = { N->getOperand(0).getOperand(0), 921 N->getOperand(0).getOperand(1), 922 getI32Imm(0), getI32Imm(MB),getI32Imm(ME) }; 923 return CurDAG->getTargetNode(PPC::RLWIMI, MVT::i32, Ops, 5); 924 } 925 } 926 927 // Other cases are autogenerated. 928 break; 929 } 930 case ISD::OR: 931 if (N->getValueType(0) == MVT::i32) 932 if (SDNode *I = SelectBitfieldInsert(N)) 933 return I; 934 935 // Other cases are autogenerated. 936 break; 937 case ISD::SHL: { 938 unsigned Imm, SH, MB, ME; 939 if (isOpcWithIntImmediate(N->getOperand(0).Val, ISD::AND, Imm) && 940 isRotateAndMask(N, Imm, true, SH, MB, ME)) { 941 AddToISelQueue(N->getOperand(0).getOperand(0)); 942 SDOperand Ops[] = { N->getOperand(0).getOperand(0), 943 getI32Imm(SH), getI32Imm(MB), getI32Imm(ME) }; 944 return CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Ops, 4); 945 } 946 947 // Other cases are autogenerated. 948 break; 949 } 950 case ISD::SRL: { 951 unsigned Imm, SH, MB, ME; 952 if (isOpcWithIntImmediate(N->getOperand(0).Val, ISD::AND, Imm) && 953 isRotateAndMask(N, Imm, true, SH, MB, ME)) { 954 AddToISelQueue(N->getOperand(0).getOperand(0)); 955 SDOperand Ops[] = { N->getOperand(0).getOperand(0), 956 getI32Imm(SH), getI32Imm(MB), getI32Imm(ME) }; 957 return CurDAG->SelectNodeTo(N, PPC::RLWINM, MVT::i32, Ops, 4); 958 } 959 960 // Other cases are autogenerated. 961 break; 962 } 963 case ISD::SELECT_CC: { 964 ISD::CondCode CC = cast<CondCodeSDNode>(N->getOperand(4))->get(); 965 966 // Handle the setcc cases here. select_cc lhs, 0, 1, 0, cc 967 if (ConstantSDNode *N1C = dyn_cast<ConstantSDNode>(N->getOperand(1))) 968 if (ConstantSDNode *N2C = dyn_cast<ConstantSDNode>(N->getOperand(2))) 969 if (ConstantSDNode *N3C = dyn_cast<ConstantSDNode>(N->getOperand(3))) 970 if (N1C->isNullValue() && N3C->isNullValue() && 971 N2C->getValue() == 1ULL && CC == ISD::SETNE && 972 // FIXME: Implement this optzn for PPC64. 973 N->getValueType(0) == MVT::i32) { 974 AddToISelQueue(N->getOperand(0)); 975 SDNode *Tmp = 976 CurDAG->getTargetNode(PPC::ADDIC, MVT::i32, MVT::Flag, 977 N->getOperand(0), getI32Imm(~0U)); 978 return CurDAG->SelectNodeTo(N, PPC::SUBFE, MVT::i32, 979 SDOperand(Tmp, 0), N->getOperand(0), 980 SDOperand(Tmp, 1)); 981 } 982 983 SDOperand CCReg = SelectCC(N->getOperand(0), N->getOperand(1), CC); 984 unsigned BROpc = getPredicateForSetCC(CC); 985 986 unsigned SelectCCOp; 987 if (N->getValueType(0) == MVT::i32) 988 SelectCCOp = PPC::SELECT_CC_I4; 989 else if (N->getValueType(0) == MVT::i64) 990 SelectCCOp = PPC::SELECT_CC_I8; 991 else if (N->getValueType(0) == MVT::f32) 992 SelectCCOp = PPC::SELECT_CC_F4; 993 else if (N->getValueType(0) == MVT::f64) 994 SelectCCOp = PPC::SELECT_CC_F8; 995 else 996 SelectCCOp = PPC::SELECT_CC_VRRC; 997 998 AddToISelQueue(N->getOperand(2)); 999 AddToISelQueue(N->getOperand(3)); 1000 SDOperand Ops[] = { CCReg, N->getOperand(2), N->getOperand(3), 1001 getI32Imm(BROpc) }; 1002 return CurDAG->SelectNodeTo(N, SelectCCOp, N->getValueType(0), Ops, 4); 1003 } 1004 case PPCISD::COND_BRANCH: { 1005 AddToISelQueue(N->getOperand(0)); // Op #0 is the Chain. 1006 // Op #1 is the PPC::PRED_* number. 1007 // Op #2 is the CR# 1008 // Op #3 is the Dest MBB 1009 AddToISelQueue(N->getOperand(4)); // Op #4 is the Flag. 1010 SDOperand Ops[] = { N->getOperand(1), N->getOperand(2), N->getOperand(3), 1011 N->getOperand(0), N->getOperand(4) }; 1012 return CurDAG->SelectNodeTo(N, PPC::BCC, MVT::Other, Ops, 5); 1013 } 1014 case ISD::BR_CC: { 1015 AddToISelQueue(N->getOperand(0)); 1016 ISD::CondCode CC = cast<CondCodeSDNode>(N->getOperand(1))->get(); 1017 SDOperand CondCode = SelectCC(N->getOperand(2), N->getOperand(3), CC); 1018 SDOperand Ops[] = { getI32Imm(getPredicateForSetCC(CC)), CondCode, 1019 N->getOperand(4), N->getOperand(0) }; 1020 return CurDAG->SelectNodeTo(N, PPC::BCC, MVT::Other, Ops, 4); 1021 } 1022 case ISD::BRIND: { 1023 // FIXME: Should custom lower this. 1024 SDOperand Chain = N->getOperand(0); 1025 SDOperand Target = N->getOperand(1); 1026 AddToISelQueue(Chain); 1027 AddToISelQueue(Target); 1028 unsigned Opc = Target.getValueType() == MVT::i32 ? PPC::MTCTR : PPC::MTCTR8; 1029 Chain = SDOperand(CurDAG->getTargetNode(Opc, MVT::Other, Target, 1030 Chain), 0); 1031 return CurDAG->SelectNodeTo(N, PPC::BCTR, MVT::Other, Chain); 1032 } 1033 } 1034 1035 return SelectCode(Op); 1036} 1037 1038 1039 1040/// createPPCISelDag - This pass converts a legalized DAG into a 1041/// PowerPC-specific DAG, ready for instruction scheduling. 1042/// 1043FunctionPass *llvm::createPPCISelDag(PPCTargetMachine &TM) { 1044 return new PPCDAGToDAGISel(TM); 1045} 1046 1047