FastISel.cpp revision 33134c4a75558288d663267c8991f6bd37a530af
1///===-- FastISel.cpp - Implementation of the FastISel class --------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file contains the implementation of the FastISel class. 11// 12//===----------------------------------------------------------------------===// 13 14#include "llvm/Function.h" 15#include "llvm/GlobalVariable.h" 16#include "llvm/Instructions.h" 17#include "llvm/IntrinsicInst.h" 18#include "llvm/CodeGen/FastISel.h" 19#include "llvm/CodeGen/MachineInstrBuilder.h" 20#include "llvm/CodeGen/MachineModuleInfo.h" 21#include "llvm/CodeGen/MachineRegisterInfo.h" 22#include "llvm/Target/TargetData.h" 23#include "llvm/Target/TargetInstrInfo.h" 24#include "llvm/Target/TargetLowering.h" 25#include "llvm/Target/TargetMachine.h" 26using namespace llvm; 27 28unsigned FastISel::getRegForValue(Value *V) { 29 // Look up the value to see if we already have a register for it. We 30 // cache values defined by Instructions across blocks, and other values 31 // only locally. This is because Instructions already have the SSA 32 // def-dominatess-use requirement enforced. 33 if (ValueMap.count(V)) 34 return ValueMap[V]; 35 unsigned Reg = LocalValueMap[V]; 36 if (Reg != 0) 37 return Reg; 38 39 MVT::SimpleValueType VT = TLI.getValueType(V->getType()).getSimpleVT(); 40 41 // Ignore illegal types. 42 if (!TLI.isTypeLegal(VT)) { 43 // Promote MVT::i1 to a legal type though, because it's common and easy. 44 if (VT == MVT::i1) 45 VT = TLI.getTypeToTransformTo(VT).getSimpleVT(); 46 else 47 return 0; 48 } 49 50 if (ConstantInt *CI = dyn_cast<ConstantInt>(V)) { 51 if (CI->getValue().getActiveBits() <= 64) 52 Reg = FastEmit_i(VT, VT, ISD::Constant, CI->getZExtValue()); 53 } else if (isa<AllocaInst>(V)) { 54 Reg = TargetMaterializeAlloca(cast<AllocaInst>(V)); 55 } else if (isa<ConstantPointerNull>(V)) { 56 Reg = FastEmit_i(VT, VT, ISD::Constant, 0); 57 } else if (ConstantFP *CF = dyn_cast<ConstantFP>(V)) { 58 Reg = FastEmit_f(VT, VT, ISD::ConstantFP, CF); 59 60 if (!Reg) { 61 const APFloat &Flt = CF->getValueAPF(); 62 MVT IntVT = TLI.getPointerTy(); 63 64 uint64_t x[2]; 65 uint32_t IntBitWidth = IntVT.getSizeInBits(); 66 if (!Flt.convertToInteger(x, IntBitWidth, /*isSigned=*/true, 67 APFloat::rmTowardZero) != APFloat::opOK) { 68 APInt IntVal(IntBitWidth, 2, x); 69 70 unsigned IntegerReg = FastEmit_i(IntVT.getSimpleVT(), IntVT.getSimpleVT(), 71 ISD::Constant, IntVal.getZExtValue()); 72 if (IntegerReg != 0) 73 Reg = FastEmit_r(IntVT.getSimpleVT(), VT, ISD::SINT_TO_FP, IntegerReg); 74 } 75 } 76 } else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V)) { 77 if (!SelectOperator(CE, CE->getOpcode())) return 0; 78 Reg = LocalValueMap[CE]; 79 } else if (isa<UndefValue>(V)) { 80 Reg = createResultReg(TLI.getRegClassFor(VT)); 81 BuildMI(MBB, TII.get(TargetInstrInfo::IMPLICIT_DEF), Reg); 82 } 83 84 // If target-independent code couldn't handle the value, give target-specific 85 // code a try. 86 if (!Reg && isa<Constant>(V)) 87 Reg = TargetMaterializeConstant(cast<Constant>(V)); 88 89 // Don't cache constant materializations in the general ValueMap. 90 // To do so would require tracking what uses they dominate. 91 if (Reg != 0) 92 LocalValueMap[V] = Reg; 93 return Reg; 94} 95 96unsigned FastISel::lookUpRegForValue(Value *V) { 97 // Look up the value to see if we already have a register for it. We 98 // cache values defined by Instructions across blocks, and other values 99 // only locally. This is because Instructions already have the SSA 100 // def-dominatess-use requirement enforced. 101 if (ValueMap.count(V)) 102 return ValueMap[V]; 103 return LocalValueMap[V]; 104} 105 106/// UpdateValueMap - Update the value map to include the new mapping for this 107/// instruction, or insert an extra copy to get the result in a previous 108/// determined register. 109/// NOTE: This is only necessary because we might select a block that uses 110/// a value before we select the block that defines the value. It might be 111/// possible to fix this by selecting blocks in reverse postorder. 112void FastISel::UpdateValueMap(Value* I, unsigned Reg) { 113 if (!isa<Instruction>(I)) { 114 LocalValueMap[I] = Reg; 115 return; 116 } 117 if (!ValueMap.count(I)) 118 ValueMap[I] = Reg; 119 else 120 TII.copyRegToReg(*MBB, MBB->end(), ValueMap[I], 121 Reg, MRI.getRegClass(Reg), MRI.getRegClass(Reg)); 122} 123 124/// SelectBinaryOp - Select and emit code for a binary operator instruction, 125/// which has an opcode which directly corresponds to the given ISD opcode. 126/// 127bool FastISel::SelectBinaryOp(User *I, ISD::NodeType ISDOpcode) { 128 MVT VT = MVT::getMVT(I->getType(), /*HandleUnknown=*/true); 129 if (VT == MVT::Other || !VT.isSimple()) 130 // Unhandled type. Halt "fast" selection and bail. 131 return false; 132 133 // We only handle legal types. For example, on x86-32 the instruction 134 // selector contains all of the 64-bit instructions from x86-64, 135 // under the assumption that i64 won't be used if the target doesn't 136 // support it. 137 if (!TLI.isTypeLegal(VT)) { 138 // MVT::i1 is special. Allow AND and OR (but not XOR) because they 139 // don't require additional zeroing, which makes them easy. 140 if (VT == MVT::i1 && 141 (ISDOpcode == ISD::AND || ISDOpcode == ISD::OR)) 142 VT = TLI.getTypeToTransformTo(VT); 143 else 144 return false; 145 } 146 147 unsigned Op0 = getRegForValue(I->getOperand(0)); 148 if (Op0 == 0) 149 // Unhandled operand. Halt "fast" selection and bail. 150 return false; 151 152 // Check if the second operand is a constant and handle it appropriately. 153 if (ConstantInt *CI = dyn_cast<ConstantInt>(I->getOperand(1))) { 154 unsigned ResultReg = FastEmit_ri(VT.getSimpleVT(), VT.getSimpleVT(), 155 ISDOpcode, Op0, CI->getZExtValue()); 156 if (ResultReg != 0) { 157 // We successfully emitted code for the given LLVM Instruction. 158 UpdateValueMap(I, ResultReg); 159 return true; 160 } 161 } 162 163 // Check if the second operand is a constant float. 164 if (ConstantFP *CF = dyn_cast<ConstantFP>(I->getOperand(1))) { 165 unsigned ResultReg = FastEmit_rf(VT.getSimpleVT(), VT.getSimpleVT(), 166 ISDOpcode, Op0, CF); 167 if (ResultReg != 0) { 168 // We successfully emitted code for the given LLVM Instruction. 169 UpdateValueMap(I, ResultReg); 170 return true; 171 } 172 } 173 174 unsigned Op1 = getRegForValue(I->getOperand(1)); 175 if (Op1 == 0) 176 // Unhandled operand. Halt "fast" selection and bail. 177 return false; 178 179 // Now we have both operands in registers. Emit the instruction. 180 unsigned ResultReg = FastEmit_rr(VT.getSimpleVT(), VT.getSimpleVT(), 181 ISDOpcode, Op0, Op1); 182 if (ResultReg == 0) 183 // Target-specific code wasn't able to find a machine opcode for 184 // the given ISD opcode and type. Halt "fast" selection and bail. 185 return false; 186 187 // We successfully emitted code for the given LLVM Instruction. 188 UpdateValueMap(I, ResultReg); 189 return true; 190} 191 192bool FastISel::SelectGetElementPtr(User *I) { 193 unsigned N = getRegForValue(I->getOperand(0)); 194 if (N == 0) 195 // Unhandled operand. Halt "fast" selection and bail. 196 return false; 197 198 const Type *Ty = I->getOperand(0)->getType(); 199 MVT::SimpleValueType VT = TLI.getPointerTy().getSimpleVT(); 200 for (GetElementPtrInst::op_iterator OI = I->op_begin()+1, E = I->op_end(); 201 OI != E; ++OI) { 202 Value *Idx = *OI; 203 if (const StructType *StTy = dyn_cast<StructType>(Ty)) { 204 unsigned Field = cast<ConstantInt>(Idx)->getZExtValue(); 205 if (Field) { 206 // N = N + Offset 207 uint64_t Offs = TD.getStructLayout(StTy)->getElementOffset(Field); 208 // FIXME: This can be optimized by combining the add with a 209 // subsequent one. 210 N = FastEmit_ri_(VT, ISD::ADD, N, Offs, VT); 211 if (N == 0) 212 // Unhandled operand. Halt "fast" selection and bail. 213 return false; 214 } 215 Ty = StTy->getElementType(Field); 216 } else { 217 Ty = cast<SequentialType>(Ty)->getElementType(); 218 219 // If this is a constant subscript, handle it quickly. 220 if (ConstantInt *CI = dyn_cast<ConstantInt>(Idx)) { 221 if (CI->getZExtValue() == 0) continue; 222 uint64_t Offs = 223 TD.getABITypeSize(Ty)*cast<ConstantInt>(CI)->getSExtValue(); 224 N = FastEmit_ri_(VT, ISD::ADD, N, Offs, VT); 225 if (N == 0) 226 // Unhandled operand. Halt "fast" selection and bail. 227 return false; 228 continue; 229 } 230 231 // N = N + Idx * ElementSize; 232 uint64_t ElementSize = TD.getABITypeSize(Ty); 233 unsigned IdxN = getRegForValue(Idx); 234 if (IdxN == 0) 235 // Unhandled operand. Halt "fast" selection and bail. 236 return false; 237 238 // If the index is smaller or larger than intptr_t, truncate or extend 239 // it. 240 MVT IdxVT = MVT::getMVT(Idx->getType(), /*HandleUnknown=*/false); 241 if (IdxVT.bitsLT(VT)) 242 IdxN = FastEmit_r(IdxVT.getSimpleVT(), VT, ISD::SIGN_EXTEND, IdxN); 243 else if (IdxVT.bitsGT(VT)) 244 IdxN = FastEmit_r(IdxVT.getSimpleVT(), VT, ISD::TRUNCATE, IdxN); 245 if (IdxN == 0) 246 // Unhandled operand. Halt "fast" selection and bail. 247 return false; 248 249 if (ElementSize != 1) { 250 IdxN = FastEmit_ri_(VT, ISD::MUL, IdxN, ElementSize, VT); 251 if (IdxN == 0) 252 // Unhandled operand. Halt "fast" selection and bail. 253 return false; 254 } 255 N = FastEmit_rr(VT, VT, ISD::ADD, N, IdxN); 256 if (N == 0) 257 // Unhandled operand. Halt "fast" selection and bail. 258 return false; 259 } 260 } 261 262 // We successfully emitted code for the given LLVM Instruction. 263 UpdateValueMap(I, N); 264 return true; 265} 266 267bool FastISel::SelectCall(User *I) { 268 Function *F = cast<CallInst>(I)->getCalledFunction(); 269 if (!F) return false; 270 271 unsigned IID = F->getIntrinsicID(); 272 switch (IID) { 273 default: break; 274 case Intrinsic::dbg_stoppoint: { 275 DbgStopPointInst *SPI = cast<DbgStopPointInst>(I); 276 if (MMI && SPI->getContext() && MMI->Verify(SPI->getContext())) { 277 DebugInfoDesc *DD = MMI->getDescFor(SPI->getContext()); 278 assert(DD && "Not a debug information descriptor"); 279 const CompileUnitDesc *CompileUnit = cast<CompileUnitDesc>(DD); 280 unsigned SrcFile = MMI->RecordSource(CompileUnit); 281 unsigned Line = SPI->getLine(); 282 unsigned Col = SPI->getColumn(); 283 unsigned ID = MMI->RecordSourceLine(Line, Col, SrcFile); 284 const TargetInstrDesc &II = TII.get(TargetInstrInfo::DBG_LABEL); 285 BuildMI(MBB, II).addImm(ID); 286 } 287 return true; 288 } 289 case Intrinsic::dbg_region_start: { 290 DbgRegionStartInst *RSI = cast<DbgRegionStartInst>(I); 291 if (MMI && RSI->getContext() && MMI->Verify(RSI->getContext())) { 292 unsigned ID = MMI->RecordRegionStart(RSI->getContext()); 293 const TargetInstrDesc &II = TII.get(TargetInstrInfo::DBG_LABEL); 294 BuildMI(MBB, II).addImm(ID); 295 } 296 return true; 297 } 298 case Intrinsic::dbg_region_end: { 299 DbgRegionEndInst *REI = cast<DbgRegionEndInst>(I); 300 if (MMI && REI->getContext() && MMI->Verify(REI->getContext())) { 301 unsigned ID = MMI->RecordRegionEnd(REI->getContext()); 302 const TargetInstrDesc &II = TII.get(TargetInstrInfo::DBG_LABEL); 303 BuildMI(MBB, II).addImm(ID); 304 } 305 return true; 306 } 307 case Intrinsic::dbg_func_start: { 308 if (!MMI) return true; 309 DbgFuncStartInst *FSI = cast<DbgFuncStartInst>(I); 310 Value *SP = FSI->getSubprogram(); 311 if (SP && MMI->Verify(SP)) { 312 // llvm.dbg.func.start implicitly defines a dbg_stoppoint which is 313 // what (most?) gdb expects. 314 DebugInfoDesc *DD = MMI->getDescFor(SP); 315 assert(DD && "Not a debug information descriptor"); 316 SubprogramDesc *Subprogram = cast<SubprogramDesc>(DD); 317 const CompileUnitDesc *CompileUnit = Subprogram->getFile(); 318 unsigned SrcFile = MMI->RecordSource(CompileUnit); 319 // Record the source line but does create a label. It will be emitted 320 // at asm emission time. 321 MMI->RecordSourceLine(Subprogram->getLine(), 0, SrcFile); 322 } 323 return true; 324 } 325 case Intrinsic::dbg_declare: { 326 DbgDeclareInst *DI = cast<DbgDeclareInst>(I); 327 Value *Variable = DI->getVariable(); 328 if (MMI && Variable && MMI->Verify(Variable)) { 329 // Determine the address of the declared object. 330 Value *Address = DI->getAddress(); 331 if (BitCastInst *BCI = dyn_cast<BitCastInst>(Address)) 332 Address = BCI->getOperand(0); 333 AllocaInst *AI = dyn_cast<AllocaInst>(Address); 334 // Don't handle byval struct arguments, for example. 335 if (!AI) break; 336 DenseMap<const AllocaInst*, int>::iterator SI = 337 StaticAllocaMap.find(AI); 338 assert(SI != StaticAllocaMap.end() && "Invalid dbg.declare!"); 339 int FI = SI->second; 340 341 // Determine the debug globalvariable. 342 GlobalValue *GV = cast<GlobalVariable>(Variable); 343 344 // Build the DECLARE instruction. 345 const TargetInstrDesc &II = TII.get(TargetInstrInfo::DECLARE); 346 BuildMI(MBB, II).addFrameIndex(FI).addGlobalAddress(GV); 347 } 348 return true; 349 } 350 } 351 return false; 352} 353 354bool FastISel::SelectCast(User *I, ISD::NodeType Opcode) { 355 MVT SrcVT = TLI.getValueType(I->getOperand(0)->getType()); 356 MVT DstVT = TLI.getValueType(I->getType()); 357 358 if (SrcVT == MVT::Other || !SrcVT.isSimple() || 359 DstVT == MVT::Other || !DstVT.isSimple() || 360 !TLI.isTypeLegal(SrcVT) || !TLI.isTypeLegal(DstVT)) 361 // Unhandled type. Halt "fast" selection and bail. 362 return false; 363 364 unsigned InputReg = getRegForValue(I->getOperand(0)); 365 if (!InputReg) 366 // Unhandled operand. Halt "fast" selection and bail. 367 return false; 368 369 unsigned ResultReg = FastEmit_r(SrcVT.getSimpleVT(), 370 DstVT.getSimpleVT(), 371 Opcode, 372 InputReg); 373 if (!ResultReg) 374 return false; 375 376 UpdateValueMap(I, ResultReg); 377 return true; 378} 379 380bool FastISel::SelectBitCast(User *I) { 381 // If the bitcast doesn't change the type, just use the operand value. 382 if (I->getType() == I->getOperand(0)->getType()) { 383 unsigned Reg = getRegForValue(I->getOperand(0)); 384 if (Reg == 0) 385 return false; 386 UpdateValueMap(I, Reg); 387 return true; 388 } 389 390 // Bitcasts of other values become reg-reg copies or BIT_CONVERT operators. 391 MVT SrcVT = TLI.getValueType(I->getOperand(0)->getType()); 392 MVT DstVT = TLI.getValueType(I->getType()); 393 394 if (SrcVT == MVT::Other || !SrcVT.isSimple() || 395 DstVT == MVT::Other || !DstVT.isSimple() || 396 !TLI.isTypeLegal(SrcVT) || !TLI.isTypeLegal(DstVT)) 397 // Unhandled type. Halt "fast" selection and bail. 398 return false; 399 400 unsigned Op0 = getRegForValue(I->getOperand(0)); 401 if (Op0 == 0) 402 // Unhandled operand. Halt "fast" selection and bail. 403 return false; 404 405 // First, try to perform the bitcast by inserting a reg-reg copy. 406 unsigned ResultReg = 0; 407 if (SrcVT.getSimpleVT() == DstVT.getSimpleVT()) { 408 TargetRegisterClass* SrcClass = TLI.getRegClassFor(SrcVT); 409 TargetRegisterClass* DstClass = TLI.getRegClassFor(DstVT); 410 ResultReg = createResultReg(DstClass); 411 412 bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg, 413 Op0, DstClass, SrcClass); 414 if (!InsertedCopy) 415 ResultReg = 0; 416 } 417 418 // If the reg-reg copy failed, select a BIT_CONVERT opcode. 419 if (!ResultReg) 420 ResultReg = FastEmit_r(SrcVT.getSimpleVT(), DstVT.getSimpleVT(), 421 ISD::BIT_CONVERT, Op0); 422 423 if (!ResultReg) 424 return false; 425 426 UpdateValueMap(I, ResultReg); 427 return true; 428} 429 430bool 431FastISel::SelectInstruction(Instruction *I) { 432 return SelectOperator(I, I->getOpcode()); 433} 434 435bool 436FastISel::SelectOperator(User *I, unsigned Opcode) { 437 switch (Opcode) { 438 case Instruction::Add: { 439 ISD::NodeType Opc = I->getType()->isFPOrFPVector() ? ISD::FADD : ISD::ADD; 440 return SelectBinaryOp(I, Opc); 441 } 442 case Instruction::Sub: { 443 ISD::NodeType Opc = I->getType()->isFPOrFPVector() ? ISD::FSUB : ISD::SUB; 444 return SelectBinaryOp(I, Opc); 445 } 446 case Instruction::Mul: { 447 ISD::NodeType Opc = I->getType()->isFPOrFPVector() ? ISD::FMUL : ISD::MUL; 448 return SelectBinaryOp(I, Opc); 449 } 450 case Instruction::SDiv: 451 return SelectBinaryOp(I, ISD::SDIV); 452 case Instruction::UDiv: 453 return SelectBinaryOp(I, ISD::UDIV); 454 case Instruction::FDiv: 455 return SelectBinaryOp(I, ISD::FDIV); 456 case Instruction::SRem: 457 return SelectBinaryOp(I, ISD::SREM); 458 case Instruction::URem: 459 return SelectBinaryOp(I, ISD::UREM); 460 case Instruction::FRem: 461 return SelectBinaryOp(I, ISD::FREM); 462 case Instruction::Shl: 463 return SelectBinaryOp(I, ISD::SHL); 464 case Instruction::LShr: 465 return SelectBinaryOp(I, ISD::SRL); 466 case Instruction::AShr: 467 return SelectBinaryOp(I, ISD::SRA); 468 case Instruction::And: 469 return SelectBinaryOp(I, ISD::AND); 470 case Instruction::Or: 471 return SelectBinaryOp(I, ISD::OR); 472 case Instruction::Xor: 473 return SelectBinaryOp(I, ISD::XOR); 474 475 case Instruction::GetElementPtr: 476 return SelectGetElementPtr(I); 477 478 case Instruction::Br: { 479 BranchInst *BI = cast<BranchInst>(I); 480 481 if (BI->isUnconditional()) { 482 MachineFunction::iterator NextMBB = 483 next(MachineFunction::iterator(MBB)); 484 BasicBlock *LLVMSucc = BI->getSuccessor(0); 485 MachineBasicBlock *MSucc = MBBMap[LLVMSucc]; 486 487 if (NextMBB != MF.end() && MSucc == NextMBB) { 488 // The unconditional fall-through case, which needs no instructions. 489 } else { 490 // The unconditional branch case. 491 TII.InsertBranch(*MBB, MSucc, NULL, SmallVector<MachineOperand, 0>()); 492 } 493 MBB->addSuccessor(MSucc); 494 return true; 495 } 496 497 // Conditional branches are not handed yet. 498 // Halt "fast" selection and bail. 499 return false; 500 } 501 502 case Instruction::Unreachable: 503 // Nothing to emit. 504 return true; 505 506 case Instruction::PHI: 507 // PHI nodes are already emitted. 508 return true; 509 510 case Instruction::Alloca: 511 // FunctionLowering has the static-sized case covered. 512 if (StaticAllocaMap.count(cast<AllocaInst>(I))) 513 return true; 514 515 // Dynamic-sized alloca is not handled yet. 516 return false; 517 518 case Instruction::Call: 519 return SelectCall(I); 520 521 case Instruction::BitCast: 522 return SelectBitCast(I); 523 524 case Instruction::FPToSI: 525 return SelectCast(I, ISD::FP_TO_SINT); 526 case Instruction::ZExt: 527 return SelectCast(I, ISD::ZERO_EXTEND); 528 case Instruction::SExt: 529 return SelectCast(I, ISD::SIGN_EXTEND); 530 case Instruction::Trunc: 531 return SelectCast(I, ISD::TRUNCATE); 532 case Instruction::SIToFP: 533 return SelectCast(I, ISD::SINT_TO_FP); 534 535 case Instruction::IntToPtr: // Deliberate fall-through. 536 case Instruction::PtrToInt: { 537 MVT SrcVT = TLI.getValueType(I->getOperand(0)->getType()); 538 MVT DstVT = TLI.getValueType(I->getType()); 539 if (DstVT.bitsGT(SrcVT)) 540 return SelectCast(I, ISD::ZERO_EXTEND); 541 if (DstVT.bitsLT(SrcVT)) 542 return SelectCast(I, ISD::TRUNCATE); 543 unsigned Reg = getRegForValue(I->getOperand(0)); 544 if (Reg == 0) return false; 545 UpdateValueMap(I, Reg); 546 return true; 547 } 548 549 default: 550 // Unhandled instruction. Halt "fast" selection and bail. 551 return false; 552 } 553} 554 555FastISel::FastISel(MachineFunction &mf, 556 MachineModuleInfo *mmi, 557 DenseMap<const Value *, unsigned> &vm, 558 DenseMap<const BasicBlock *, MachineBasicBlock *> &bm, 559 DenseMap<const AllocaInst *, int> &am) 560 : MBB(0), 561 ValueMap(vm), 562 MBBMap(bm), 563 StaticAllocaMap(am), 564 MF(mf), 565 MMI(mmi), 566 MRI(MF.getRegInfo()), 567 MFI(*MF.getFrameInfo()), 568 MCP(*MF.getConstantPool()), 569 TM(MF.getTarget()), 570 TD(*TM.getTargetData()), 571 TII(*TM.getInstrInfo()), 572 TLI(*TM.getTargetLowering()) { 573} 574 575FastISel::~FastISel() {} 576 577unsigned FastISel::FastEmit_(MVT::SimpleValueType, MVT::SimpleValueType, 578 ISD::NodeType) { 579 return 0; 580} 581 582unsigned FastISel::FastEmit_r(MVT::SimpleValueType, MVT::SimpleValueType, 583 ISD::NodeType, unsigned /*Op0*/) { 584 return 0; 585} 586 587unsigned FastISel::FastEmit_rr(MVT::SimpleValueType, MVT::SimpleValueType, 588 ISD::NodeType, unsigned /*Op0*/, 589 unsigned /*Op0*/) { 590 return 0; 591} 592 593unsigned FastISel::FastEmit_i(MVT::SimpleValueType, MVT::SimpleValueType, 594 ISD::NodeType, uint64_t /*Imm*/) { 595 return 0; 596} 597 598unsigned FastISel::FastEmit_f(MVT::SimpleValueType, MVT::SimpleValueType, 599 ISD::NodeType, ConstantFP * /*FPImm*/) { 600 return 0; 601} 602 603unsigned FastISel::FastEmit_ri(MVT::SimpleValueType, MVT::SimpleValueType, 604 ISD::NodeType, unsigned /*Op0*/, 605 uint64_t /*Imm*/) { 606 return 0; 607} 608 609unsigned FastISel::FastEmit_rf(MVT::SimpleValueType, MVT::SimpleValueType, 610 ISD::NodeType, unsigned /*Op0*/, 611 ConstantFP * /*FPImm*/) { 612 return 0; 613} 614 615unsigned FastISel::FastEmit_rri(MVT::SimpleValueType, MVT::SimpleValueType, 616 ISD::NodeType, 617 unsigned /*Op0*/, unsigned /*Op1*/, 618 uint64_t /*Imm*/) { 619 return 0; 620} 621 622/// FastEmit_ri_ - This method is a wrapper of FastEmit_ri. It first tries 623/// to emit an instruction with an immediate operand using FastEmit_ri. 624/// If that fails, it materializes the immediate into a register and try 625/// FastEmit_rr instead. 626unsigned FastISel::FastEmit_ri_(MVT::SimpleValueType VT, ISD::NodeType Opcode, 627 unsigned Op0, uint64_t Imm, 628 MVT::SimpleValueType ImmType) { 629 // First check if immediate type is legal. If not, we can't use the ri form. 630 unsigned ResultReg = FastEmit_ri(VT, VT, Opcode, Op0, Imm); 631 if (ResultReg != 0) 632 return ResultReg; 633 unsigned MaterialReg = FastEmit_i(ImmType, ImmType, ISD::Constant, Imm); 634 if (MaterialReg == 0) 635 return 0; 636 return FastEmit_rr(VT, VT, Opcode, Op0, MaterialReg); 637} 638 639/// FastEmit_rf_ - This method is a wrapper of FastEmit_ri. It first tries 640/// to emit an instruction with a floating-point immediate operand using 641/// FastEmit_rf. If that fails, it materializes the immediate into a register 642/// and try FastEmit_rr instead. 643unsigned FastISel::FastEmit_rf_(MVT::SimpleValueType VT, ISD::NodeType Opcode, 644 unsigned Op0, ConstantFP *FPImm, 645 MVT::SimpleValueType ImmType) { 646 // First check if immediate type is legal. If not, we can't use the rf form. 647 unsigned ResultReg = FastEmit_rf(VT, VT, Opcode, Op0, FPImm); 648 if (ResultReg != 0) 649 return ResultReg; 650 651 // Materialize the constant in a register. 652 unsigned MaterialReg = FastEmit_f(ImmType, ImmType, ISD::ConstantFP, FPImm); 653 if (MaterialReg == 0) { 654 // If the target doesn't have a way to directly enter a floating-point 655 // value into a register, use an alternate approach. 656 // TODO: The current approach only supports floating-point constants 657 // that can be constructed by conversion from integer values. This should 658 // be replaced by code that creates a load from a constant-pool entry, 659 // which will require some target-specific work. 660 const APFloat &Flt = FPImm->getValueAPF(); 661 MVT IntVT = TLI.getPointerTy(); 662 663 uint64_t x[2]; 664 uint32_t IntBitWidth = IntVT.getSizeInBits(); 665 if (Flt.convertToInteger(x, IntBitWidth, /*isSigned=*/true, 666 APFloat::rmTowardZero) != APFloat::opOK) 667 return 0; 668 APInt IntVal(IntBitWidth, 2, x); 669 670 unsigned IntegerReg = FastEmit_i(IntVT.getSimpleVT(), IntVT.getSimpleVT(), 671 ISD::Constant, IntVal.getZExtValue()); 672 if (IntegerReg == 0) 673 return 0; 674 MaterialReg = FastEmit_r(IntVT.getSimpleVT(), VT, 675 ISD::SINT_TO_FP, IntegerReg); 676 if (MaterialReg == 0) 677 return 0; 678 } 679 return FastEmit_rr(VT, VT, Opcode, Op0, MaterialReg); 680} 681 682unsigned FastISel::createResultReg(const TargetRegisterClass* RC) { 683 return MRI.createVirtualRegister(RC); 684} 685 686unsigned FastISel::FastEmitInst_(unsigned MachineInstOpcode, 687 const TargetRegisterClass* RC) { 688 unsigned ResultReg = createResultReg(RC); 689 const TargetInstrDesc &II = TII.get(MachineInstOpcode); 690 691 BuildMI(MBB, II, ResultReg); 692 return ResultReg; 693} 694 695unsigned FastISel::FastEmitInst_r(unsigned MachineInstOpcode, 696 const TargetRegisterClass *RC, 697 unsigned Op0) { 698 unsigned ResultReg = createResultReg(RC); 699 const TargetInstrDesc &II = TII.get(MachineInstOpcode); 700 701 if (II.getNumDefs() >= 1) 702 BuildMI(MBB, II, ResultReg).addReg(Op0); 703 else { 704 BuildMI(MBB, II).addReg(Op0); 705 bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg, 706 II.ImplicitDefs[0], RC, RC); 707 if (!InsertedCopy) 708 ResultReg = 0; 709 } 710 711 return ResultReg; 712} 713 714unsigned FastISel::FastEmitInst_rr(unsigned MachineInstOpcode, 715 const TargetRegisterClass *RC, 716 unsigned Op0, unsigned Op1) { 717 unsigned ResultReg = createResultReg(RC); 718 const TargetInstrDesc &II = TII.get(MachineInstOpcode); 719 720 if (II.getNumDefs() >= 1) 721 BuildMI(MBB, II, ResultReg).addReg(Op0).addReg(Op1); 722 else { 723 BuildMI(MBB, II).addReg(Op0).addReg(Op1); 724 bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg, 725 II.ImplicitDefs[0], RC, RC); 726 if (!InsertedCopy) 727 ResultReg = 0; 728 } 729 return ResultReg; 730} 731 732unsigned FastISel::FastEmitInst_ri(unsigned MachineInstOpcode, 733 const TargetRegisterClass *RC, 734 unsigned Op0, uint64_t Imm) { 735 unsigned ResultReg = createResultReg(RC); 736 const TargetInstrDesc &II = TII.get(MachineInstOpcode); 737 738 if (II.getNumDefs() >= 1) 739 BuildMI(MBB, II, ResultReg).addReg(Op0).addImm(Imm); 740 else { 741 BuildMI(MBB, II).addReg(Op0).addImm(Imm); 742 bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg, 743 II.ImplicitDefs[0], RC, RC); 744 if (!InsertedCopy) 745 ResultReg = 0; 746 } 747 return ResultReg; 748} 749 750unsigned FastISel::FastEmitInst_rf(unsigned MachineInstOpcode, 751 const TargetRegisterClass *RC, 752 unsigned Op0, ConstantFP *FPImm) { 753 unsigned ResultReg = createResultReg(RC); 754 const TargetInstrDesc &II = TII.get(MachineInstOpcode); 755 756 if (II.getNumDefs() >= 1) 757 BuildMI(MBB, II, ResultReg).addReg(Op0).addFPImm(FPImm); 758 else { 759 BuildMI(MBB, II).addReg(Op0).addFPImm(FPImm); 760 bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg, 761 II.ImplicitDefs[0], RC, RC); 762 if (!InsertedCopy) 763 ResultReg = 0; 764 } 765 return ResultReg; 766} 767 768unsigned FastISel::FastEmitInst_rri(unsigned MachineInstOpcode, 769 const TargetRegisterClass *RC, 770 unsigned Op0, unsigned Op1, uint64_t Imm) { 771 unsigned ResultReg = createResultReg(RC); 772 const TargetInstrDesc &II = TII.get(MachineInstOpcode); 773 774 if (II.getNumDefs() >= 1) 775 BuildMI(MBB, II, ResultReg).addReg(Op0).addReg(Op1).addImm(Imm); 776 else { 777 BuildMI(MBB, II).addReg(Op0).addReg(Op1).addImm(Imm); 778 bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg, 779 II.ImplicitDefs[0], RC, RC); 780 if (!InsertedCopy) 781 ResultReg = 0; 782 } 783 return ResultReg; 784} 785 786unsigned FastISel::FastEmitInst_i(unsigned MachineInstOpcode, 787 const TargetRegisterClass *RC, 788 uint64_t Imm) { 789 unsigned ResultReg = createResultReg(RC); 790 const TargetInstrDesc &II = TII.get(MachineInstOpcode); 791 792 if (II.getNumDefs() >= 1) 793 BuildMI(MBB, II, ResultReg).addImm(Imm); 794 else { 795 BuildMI(MBB, II).addImm(Imm); 796 bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg, 797 II.ImplicitDefs[0], RC, RC); 798 if (!InsertedCopy) 799 ResultReg = 0; 800 } 801 return ResultReg; 802} 803 804unsigned FastISel::FastEmitInst_extractsubreg(unsigned Op0, uint32_t Idx) { 805 const TargetRegisterClass* RC = MRI.getRegClass(Op0); 806 const TargetRegisterClass* SRC = *(RC->subregclasses_begin()+Idx-1); 807 808 unsigned ResultReg = createResultReg(SRC); 809 const TargetInstrDesc &II = TII.get(TargetInstrInfo::EXTRACT_SUBREG); 810 811 if (II.getNumDefs() >= 1) 812 BuildMI(MBB, II, ResultReg).addReg(Op0).addImm(Idx); 813 else { 814 BuildMI(MBB, II).addReg(Op0).addImm(Idx); 815 bool InsertedCopy = TII.copyRegToReg(*MBB, MBB->end(), ResultReg, 816 II.ImplicitDefs[0], RC, RC); 817 if (!InsertedCopy) 818 ResultReg = 0; 819 } 820 return ResultReg; 821} 822