X86ISelDAGToDAG.cpp revision 223547ab3101f32252cb704a67bd757e00fdbd16
1//===- X86ISelDAGToDAG.cpp - A DAG pattern matching inst selector for X86 -===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file was developed by the Evan Cheng 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 DAG pattern matching instruction selector for X86, 11// converting from a legalized dag to a X86 dag. 12// 13//===----------------------------------------------------------------------===// 14 15#include "X86.h" 16#include "X86InstrBuilder.h" 17#include "X86RegisterInfo.h" 18#include "X86Subtarget.h" 19#include "X86ISelLowering.h" 20#include "llvm/GlobalValue.h" 21#include "llvm/Instructions.h" 22#include "llvm/Support/CFG.h" 23#include "llvm/CodeGen/MachineConstantPool.h" 24#include "llvm/CodeGen/MachineFunction.h" 25#include "llvm/CodeGen/MachineFrameInfo.h" 26#include "llvm/CodeGen/MachineInstrBuilder.h" 27#include "llvm/CodeGen/SSARegMap.h" 28#include "llvm/CodeGen/SelectionDAGISel.h" 29#include "llvm/Target/TargetMachine.h" 30#include "llvm/Support/Debug.h" 31#include "llvm/ADT/Statistic.h" 32#include <iostream> 33using namespace llvm; 34 35//===----------------------------------------------------------------------===// 36// Pattern Matcher Implementation 37//===----------------------------------------------------------------------===// 38 39namespace { 40 /// X86ISelAddressMode - This corresponds to X86AddressMode, but uses 41 /// SDOperand's instead of register numbers for the leaves of the matched 42 /// tree. 43 struct X86ISelAddressMode { 44 enum { 45 RegBase, 46 FrameIndexBase, 47 ConstantPoolBase 48 } BaseType; 49 50 struct { // This is really a union, discriminated by BaseType! 51 SDOperand Reg; 52 int FrameIndex; 53 } Base; 54 55 unsigned Scale; 56 SDOperand IndexReg; 57 unsigned Disp; 58 GlobalValue *GV; 59 60 X86ISelAddressMode() 61 : BaseType(RegBase), Scale(1), IndexReg(), Disp(0), GV(0) { 62 } 63 }; 64} 65 66namespace { 67 Statistic<> 68 NumFPKill("x86-codegen", "Number of FP_REG_KILL instructions added"); 69 70 //===--------------------------------------------------------------------===// 71 /// ISel - X86 specific code to select X86 machine instructions for 72 /// SelectionDAG operations. 73 /// 74 class X86DAGToDAGISel : public SelectionDAGISel { 75 /// ContainsFPCode - Every instruction we select that uses or defines a FP 76 /// register should set this to true. 77 bool ContainsFPCode; 78 79 /// X86Lowering - This object fully describes how to lower LLVM code to an 80 /// X86-specific SelectionDAG. 81 X86TargetLowering X86Lowering; 82 83 /// Subtarget - Keep a pointer to the X86Subtarget around so that we can 84 /// make the right decision when generating code for different targets. 85 const X86Subtarget *Subtarget; 86 public: 87 X86DAGToDAGISel(TargetMachine &TM) 88 : SelectionDAGISel(X86Lowering), X86Lowering(TM) { 89 Subtarget = &TM.getSubtarget<X86Subtarget>(); 90 } 91 92 virtual const char *getPassName() const { 93 return "X86 DAG->DAG Instruction Selection"; 94 } 95 96 /// InstructionSelectBasicBlock - This callback is invoked by 97 /// SelectionDAGISel when it has created a SelectionDAG for us to codegen. 98 virtual void InstructionSelectBasicBlock(SelectionDAG &DAG); 99 100 virtual void EmitFunctionEntryCode(Function &Fn, MachineFunction &MF); 101 102// Include the pieces autogenerated from the target description. 103#include "X86GenDAGISel.inc" 104 105 private: 106 SDOperand Select(SDOperand N); 107 108 bool MatchAddress(SDOperand N, X86ISelAddressMode &AM); 109 bool SelectAddr(SDOperand N, SDOperand &Base, SDOperand &Scale, 110 SDOperand &Index, SDOperand &Disp); 111 bool SelectLEAAddr(SDOperand N, SDOperand &Base, SDOperand &Scale, 112 SDOperand &Index, SDOperand &Disp); 113 bool TryFoldLoad(SDOperand N, SDOperand &Base, SDOperand &Scale, 114 SDOperand &Index, SDOperand &Disp); 115 116 inline void getAddressOperands(X86ISelAddressMode &AM, SDOperand &Base, 117 SDOperand &Scale, SDOperand &Index, 118 SDOperand &Disp) { 119 Base = (AM.BaseType == X86ISelAddressMode::FrameIndexBase) ? 120 CurDAG->getTargetFrameIndex(AM.Base.FrameIndex, MVT::i32) : AM.Base.Reg; 121 Scale = getI8Imm(AM.Scale); 122 Index = AM.IndexReg; 123 Disp = AM.GV ? CurDAG->getTargetGlobalAddress(AM.GV, MVT::i32, AM.Disp) 124 : getI32Imm(AM.Disp); 125 } 126 127 /// getI8Imm - Return a target constant with the specified value, of type 128 /// i8. 129 inline SDOperand getI8Imm(unsigned Imm) { 130 return CurDAG->getTargetConstant(Imm, MVT::i8); 131 } 132 133 /// getI16Imm - Return a target constant with the specified value, of type 134 /// i16. 135 inline SDOperand getI16Imm(unsigned Imm) { 136 return CurDAG->getTargetConstant(Imm, MVT::i16); 137 } 138 139 /// getI32Imm - Return a target constant with the specified value, of type 140 /// i32. 141 inline SDOperand getI32Imm(unsigned Imm) { 142 return CurDAG->getTargetConstant(Imm, MVT::i32); 143 } 144 }; 145} 146 147/// InstructionSelectBasicBlock - This callback is invoked by SelectionDAGISel 148/// when it has created a SelectionDAG for us to codegen. 149void X86DAGToDAGISel::InstructionSelectBasicBlock(SelectionDAG &DAG) { 150 DEBUG(BB->dump()); 151 MachineFunction::iterator FirstMBB = BB; 152 153 // Codegen the basic block. 154 DAG.setRoot(Select(DAG.getRoot())); 155 CodeGenMap.clear(); 156 DAG.RemoveDeadNodes(); 157 158 // Emit machine code to BB. 159 ScheduleAndEmitDAG(DAG); 160 161 // If we are emitting FP stack code, scan the basic block to determine if this 162 // block defines any FP values. If so, put an FP_REG_KILL instruction before 163 // the terminator of the block. 164 if (!Subtarget->hasSSE2()) { 165 // Note that FP stack instructions *are* used in SSE code when returning 166 // values, but these are not live out of the basic block, so we don't need 167 // an FP_REG_KILL in this case either. 168 bool ContainsFPCode = false; 169 170 // Scan all of the machine instructions in these MBBs, checking for FP 171 // stores. 172 MachineFunction::iterator MBBI = FirstMBB; 173 do { 174 for (MachineBasicBlock::iterator I = MBBI->begin(), E = MBBI->end(); 175 !ContainsFPCode && I != E; ++I) { 176 for (unsigned op = 0, e = I->getNumOperands(); op != e; ++op) { 177 if (I->getOperand(op).isRegister() && I->getOperand(op).isDef() && 178 MRegisterInfo::isVirtualRegister(I->getOperand(op).getReg()) && 179 RegMap->getRegClass(I->getOperand(0).getReg()) == 180 X86::RFPRegisterClass) { 181 ContainsFPCode = true; 182 break; 183 } 184 } 185 } 186 } while (!ContainsFPCode && &*(MBBI++) != BB); 187 188 // Check PHI nodes in successor blocks. These PHI's will be lowered to have 189 // a copy of the input value in this block. 190 if (!ContainsFPCode) { 191 // Final check, check LLVM BB's that are successors to the LLVM BB 192 // corresponding to BB for FP PHI nodes. 193 const BasicBlock *LLVMBB = BB->getBasicBlock(); 194 const PHINode *PN; 195 for (succ_const_iterator SI = succ_begin(LLVMBB), E = succ_end(LLVMBB); 196 !ContainsFPCode && SI != E; ++SI) { 197 for (BasicBlock::const_iterator II = SI->begin(); 198 (PN = dyn_cast<PHINode>(II)); ++II) { 199 if (PN->getType()->isFloatingPoint()) { 200 ContainsFPCode = true; 201 break; 202 } 203 } 204 } 205 } 206 207 // Finally, if we found any FP code, emit the FP_REG_KILL instruction. 208 if (ContainsFPCode) { 209 BuildMI(*BB, BB->getFirstTerminator(), X86::FP_REG_KILL, 0); 210 ++NumFPKill; 211 } 212 } 213} 214 215/// EmitSpecialCodeForMain - Emit any code that needs to be executed only in 216/// the main function. 217static void EmitSpecialCodeForMain(MachineBasicBlock *BB, 218 MachineFrameInfo *MFI) { 219 // Switch the FPU to 64-bit precision mode for better compatibility and speed. 220 int CWFrameIdx = MFI->CreateStackObject(2, 2); 221 addFrameReference(BuildMI(BB, X86::FNSTCW16m, 4), CWFrameIdx); 222 223 // Set the high part to be 64-bit precision. 224 addFrameReference(BuildMI(BB, X86::MOV8mi, 5), 225 CWFrameIdx, 1).addImm(2); 226 227 // Reload the modified control word now. 228 addFrameReference(BuildMI(BB, X86::FLDCW16m, 4), CWFrameIdx); 229} 230 231void X86DAGToDAGISel::EmitFunctionEntryCode(Function &Fn, MachineFunction &MF) { 232 // If this is main, emit special code for main. 233 MachineBasicBlock *BB = MF.begin(); 234 if (Fn.hasExternalLinkage() && Fn.getName() == "main") 235 EmitSpecialCodeForMain(BB, MF.getFrameInfo()); 236} 237 238/// MatchAddress - Add the specified node to the specified addressing mode, 239/// returning true if it cannot be done. This just pattern matches for the 240/// addressing mode 241bool X86DAGToDAGISel::MatchAddress(SDOperand N, X86ISelAddressMode &AM) { 242 switch (N.getOpcode()) { 243 default: break; 244 case ISD::FrameIndex: 245 if (AM.BaseType == X86ISelAddressMode::RegBase && AM.Base.Reg.Val == 0) { 246 AM.BaseType = X86ISelAddressMode::FrameIndexBase; 247 AM.Base.FrameIndex = cast<FrameIndexSDNode>(N)->getIndex(); 248 return false; 249 } 250 break; 251 252 case ISD::ConstantPool: 253 if (AM.BaseType == X86ISelAddressMode::RegBase && AM.Base.Reg.Val == 0) { 254 if (ConstantPoolSDNode *CP = dyn_cast<ConstantPoolSDNode>(N)) { 255 AM.BaseType = X86ISelAddressMode::ConstantPoolBase; 256 AM.Base.Reg = CurDAG->getTargetConstantPool(CP->get(), MVT::i32, 257 CP->getAlignment()); 258 return false; 259 } 260 } 261 break; 262 263 case ISD::GlobalAddress: 264 case ISD::TargetGlobalAddress: 265 if (AM.GV == 0) { 266 AM.GV = cast<GlobalAddressSDNode>(N)->getGlobal(); 267 return false; 268 } 269 break; 270 271 case ISD::Constant: 272 AM.Disp += cast<ConstantSDNode>(N)->getValue(); 273 return false; 274 275 case ISD::SHL: 276 if (AM.IndexReg.Val == 0 && AM.Scale == 1) 277 if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(N.Val->getOperand(1))) { 278 unsigned Val = CN->getValue(); 279 if (Val == 1 || Val == 2 || Val == 3) { 280 AM.Scale = 1 << Val; 281 SDOperand ShVal = N.Val->getOperand(0); 282 283 // Okay, we know that we have a scale by now. However, if the scaled 284 // value is an add of something and a constant, we can fold the 285 // constant into the disp field here. 286 if (ShVal.Val->getOpcode() == ISD::ADD && ShVal.hasOneUse() && 287 isa<ConstantSDNode>(ShVal.Val->getOperand(1))) { 288 AM.IndexReg = ShVal.Val->getOperand(0); 289 ConstantSDNode *AddVal = 290 cast<ConstantSDNode>(ShVal.Val->getOperand(1)); 291 AM.Disp += AddVal->getValue() << Val; 292 } else { 293 AM.IndexReg = ShVal; 294 } 295 return false; 296 } 297 } 298 break; 299 300 case ISD::MUL: 301 // X*[3,5,9] -> X+X*[2,4,8] 302 if (AM.IndexReg.Val == 0 && AM.BaseType == X86ISelAddressMode::RegBase && 303 AM.Base.Reg.Val == 0) 304 if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(N.Val->getOperand(1))) 305 if (CN->getValue() == 3 || CN->getValue() == 5 || CN->getValue() == 9) { 306 AM.Scale = unsigned(CN->getValue())-1; 307 308 SDOperand MulVal = N.Val->getOperand(0); 309 SDOperand Reg; 310 311 // Okay, we know that we have a scale by now. However, if the scaled 312 // value is an add of something and a constant, we can fold the 313 // constant into the disp field here. 314 if (MulVal.Val->getOpcode() == ISD::ADD && MulVal.hasOneUse() && 315 isa<ConstantSDNode>(MulVal.Val->getOperand(1))) { 316 Reg = MulVal.Val->getOperand(0); 317 ConstantSDNode *AddVal = 318 cast<ConstantSDNode>(MulVal.Val->getOperand(1)); 319 AM.Disp += AddVal->getValue() * CN->getValue(); 320 } else { 321 Reg = N.Val->getOperand(0); 322 } 323 324 AM.IndexReg = AM.Base.Reg = Reg; 325 return false; 326 } 327 break; 328 329 case ISD::ADD: { 330 X86ISelAddressMode Backup = AM; 331 if (!MatchAddress(N.Val->getOperand(0), AM) && 332 !MatchAddress(N.Val->getOperand(1), AM)) 333 return false; 334 AM = Backup; 335 if (!MatchAddress(N.Val->getOperand(1), AM) && 336 !MatchAddress(N.Val->getOperand(0), AM)) 337 return false; 338 AM = Backup; 339 break; 340 } 341 } 342 343 // Is the base register already occupied? 344 if (AM.BaseType != X86ISelAddressMode::RegBase || AM.Base.Reg.Val) { 345 // If so, check to see if the scale index register is set. 346 if (AM.IndexReg.Val == 0) { 347 AM.IndexReg = N; 348 AM.Scale = 1; 349 return false; 350 } 351 352 // Otherwise, we cannot select it. 353 return true; 354 } 355 356 // Default, generate it as a register. 357 AM.BaseType = X86ISelAddressMode::RegBase; 358 AM.Base.Reg = N; 359 return false; 360} 361 362/// SelectAddr - returns true if it is able pattern match an addressing mode. 363/// It returns the operands which make up the maximal addressing mode it can 364/// match by reference. 365bool X86DAGToDAGISel::SelectAddr(SDOperand N, SDOperand &Base, SDOperand &Scale, 366 SDOperand &Index, SDOperand &Disp) { 367 X86ISelAddressMode AM; 368 if (MatchAddress(N, AM)) 369 return false; 370 371 if (AM.BaseType == X86ISelAddressMode::RegBase) { 372 if (AM.Base.Reg.Val) { 373 if (AM.Base.Reg.getOpcode() != ISD::Register) 374 AM.Base.Reg = Select(AM.Base.Reg); 375 } else { 376 AM.Base.Reg = CurDAG->getRegister(0, MVT::i32); 377 } 378 } 379 380 if (AM.IndexReg.Val) 381 AM.IndexReg = Select(AM.IndexReg); 382 else 383 AM.IndexReg = CurDAG->getRegister(0, MVT::i32); 384 385 getAddressOperands(AM, Base, Scale, Index, Disp); 386 return true; 387} 388 389bool X86DAGToDAGISel::TryFoldLoad(SDOperand N, SDOperand &Base, 390 SDOperand &Scale, SDOperand &Index, 391 SDOperand &Disp) { 392 if (N.getOpcode() == ISD::LOAD && N.hasOneUse() && 393 CodeGenMap.count(N.getValue(1)) == 0) 394 return SelectAddr(N.getOperand(1), Base, Scale, Index, Disp); 395 return false; 396} 397 398static bool isRegister0(SDOperand Op) { 399 if (RegisterSDNode *R = dyn_cast<RegisterSDNode>(Op)) 400 return (R->getReg() == 0); 401 return false; 402} 403 404/// SelectLEAAddr - it calls SelectAddr and determines if the maximal addressing 405/// mode it matches can be cost effectively emitted as an LEA instruction. 406/// For X86, it always is unless it's just a (Reg + const). 407bool X86DAGToDAGISel::SelectLEAAddr(SDOperand N, SDOperand &Base, 408 SDOperand &Scale, 409 SDOperand &Index, SDOperand &Disp) { 410 X86ISelAddressMode AM; 411 if (!MatchAddress(N, AM)) { 412 bool SelectBase = false; 413 bool SelectIndex = false; 414 bool Check = false; 415 if (AM.BaseType == X86ISelAddressMode::RegBase) { 416 if (AM.Base.Reg.Val) { 417 Check = true; 418 SelectBase = true; 419 } else { 420 AM.Base.Reg = CurDAG->getRegister(0, MVT::i32); 421 } 422 } 423 424 if (AM.IndexReg.Val) { 425 SelectIndex = true; 426 } else { 427 AM.IndexReg = CurDAG->getRegister(0, MVT::i32); 428 } 429 430 if (Check) { 431 unsigned Complexity = 0; 432 if (AM.Scale > 1) 433 Complexity++; 434 if (SelectIndex) 435 Complexity++; 436 if (AM.GV) 437 Complexity++; 438 else if (AM.Disp > 1) 439 Complexity++; 440 if (Complexity <= 1) 441 return false; 442 } 443 444 if (SelectBase) 445 AM.Base.Reg = Select(AM.Base.Reg); 446 if (SelectIndex) 447 AM.IndexReg = Select(AM.IndexReg); 448 449 getAddressOperands(AM, Base, Scale, Index, Disp); 450 return true; 451 } 452 return false; 453} 454 455SDOperand X86DAGToDAGISel::Select(SDOperand N) { 456 SDNode *Node = N.Val; 457 MVT::ValueType NVT = Node->getValueType(0); 458 unsigned Opc, MOpc; 459 unsigned Opcode = Node->getOpcode(); 460 461 if (Opcode >= ISD::BUILTIN_OP_END && Opcode < X86ISD::FIRST_NUMBER) 462 return N; // Already selected. 463 464 std::map<SDOperand, SDOperand>::iterator CGMI = CodeGenMap.find(N); 465 if (CGMI != CodeGenMap.end()) return CGMI->second; 466 467 switch (Opcode) { 468 default: break; 469 case ISD::MULHU: 470 case ISD::MULHS: { 471 if (Opcode == ISD::MULHU) 472 switch (NVT) { 473 default: assert(0 && "Unsupported VT!"); 474 case MVT::i8: Opc = X86::MUL8r; MOpc = X86::MUL8m; break; 475 case MVT::i16: Opc = X86::MUL16r; MOpc = X86::MUL16m; break; 476 case MVT::i32: Opc = X86::MUL32r; MOpc = X86::MUL32m; break; 477 } 478 else 479 switch (NVT) { 480 default: assert(0 && "Unsupported VT!"); 481 case MVT::i8: Opc = X86::IMUL8r; MOpc = X86::IMUL8m; break; 482 case MVT::i16: Opc = X86::IMUL16r; MOpc = X86::IMUL16m; break; 483 case MVT::i32: Opc = X86::IMUL32r; MOpc = X86::IMUL32m; break; 484 } 485 486 unsigned LoReg, HiReg; 487 switch (NVT) { 488 default: assert(0 && "Unsupported VT!"); 489 case MVT::i8: LoReg = X86::AL; HiReg = X86::AH; break; 490 case MVT::i16: LoReg = X86::AX; HiReg = X86::DX; break; 491 case MVT::i32: LoReg = X86::EAX; HiReg = X86::EDX; break; 492 } 493 494 SDOperand N0 = Node->getOperand(0); 495 SDOperand N1 = Node->getOperand(1); 496 497 bool foldedLoad = false; 498 SDOperand Tmp0, Tmp1, Tmp2, Tmp3; 499 foldedLoad = TryFoldLoad(N1, Tmp0, Tmp1, Tmp2, Tmp3); 500 // MULHU and MULHS are commmutative 501 if (!foldedLoad) { 502 foldedLoad = TryFoldLoad(N0, Tmp0, Tmp1, Tmp2, Tmp3); 503 if (foldedLoad) { 504 N0 = Node->getOperand(1); 505 N1 = Node->getOperand(0); 506 } 507 } 508 509 SDOperand Chain = foldedLoad ? Select(N1.getOperand(0)) 510 : CurDAG->getEntryNode(); 511 512 SDOperand InFlag; 513 Chain = CurDAG->getCopyToReg(Chain, CurDAG->getRegister(LoReg, NVT), 514 Select(N0), InFlag); 515 InFlag = Chain.getValue(1); 516 517 if (foldedLoad) { 518 Chain = CurDAG->getTargetNode(MOpc, MVT::Other, MVT::Flag, Tmp0, Tmp1, 519 Tmp2, Tmp3, Chain, InFlag); 520 InFlag = Chain.getValue(1); 521 } else { 522 InFlag = CurDAG->getTargetNode(Opc, MVT::Flag, Select(N1), InFlag); 523 } 524 525 SDOperand Result = CurDAG->getCopyFromReg(Chain, HiReg, NVT, InFlag); 526 CodeGenMap[N.getValue(0)] = Result; 527 if (foldedLoad) 528 CodeGenMap[N1.getValue(1)] = Result.getValue(1); 529 return Result; 530 } 531 532 case ISD::SDIV: 533 case ISD::UDIV: 534 case ISD::SREM: 535 case ISD::UREM: { 536 bool isSigned = Opcode == ISD::SDIV || Opcode == ISD::SREM; 537 bool isDiv = Opcode == ISD::SDIV || Opcode == ISD::UDIV; 538 if (!isSigned) 539 switch (NVT) { 540 default: assert(0 && "Unsupported VT!"); 541 case MVT::i8: Opc = X86::DIV8r; MOpc = X86::DIV8m; break; 542 case MVT::i16: Opc = X86::DIV16r; MOpc = X86::DIV16m; break; 543 case MVT::i32: Opc = X86::DIV32r; MOpc = X86::DIV32m; break; 544 } 545 else 546 switch (NVT) { 547 default: assert(0 && "Unsupported VT!"); 548 case MVT::i8: Opc = X86::IDIV8r; MOpc = X86::IDIV8m; break; 549 case MVT::i16: Opc = X86::IDIV16r; MOpc = X86::IDIV16m; break; 550 case MVT::i32: Opc = X86::IDIV32r; MOpc = X86::IDIV32m; break; 551 } 552 553 unsigned LoReg, HiReg; 554 unsigned ClrOpcode, SExtOpcode; 555 switch (NVT) { 556 default: assert(0 && "Unsupported VT!"); 557 case MVT::i8: 558 LoReg = X86::AL; HiReg = X86::AH; 559 ClrOpcode = X86::MOV8ri; 560 SExtOpcode = X86::CBW; 561 break; 562 case MVT::i16: 563 LoReg = X86::AX; HiReg = X86::DX; 564 ClrOpcode = X86::MOV16ri; 565 SExtOpcode = X86::CWD; 566 break; 567 case MVT::i32: 568 LoReg = X86::EAX; HiReg = X86::EDX; 569 ClrOpcode = X86::MOV32ri; 570 SExtOpcode = X86::CDQ; 571 break; 572 } 573 574 SDOperand N0 = Node->getOperand(0); 575 SDOperand N1 = Node->getOperand(1); 576 577 bool foldedLoad = false; 578 SDOperand Tmp0, Tmp1, Tmp2, Tmp3; 579 foldedLoad = TryFoldLoad(N1, Tmp0, Tmp1, Tmp2, Tmp3); 580 SDOperand Chain = foldedLoad ? Select(N1.getOperand(0)) 581 : CurDAG->getEntryNode(); 582 583 SDOperand InFlag; 584 Chain = CurDAG->getCopyToReg(Chain, CurDAG->getRegister(LoReg, NVT), 585 Select(N0), InFlag); 586 InFlag = Chain.getValue(1); 587 588 if (isSigned) { 589 // Sign extend the low part into the high part. 590 InFlag = CurDAG->getTargetNode(SExtOpcode, MVT::Flag, InFlag); 591 } else { 592 // Zero out the high part, effectively zero extending the input. 593 SDOperand ClrNode = 594 CurDAG->getTargetNode(ClrOpcode, NVT, 595 CurDAG->getTargetConstant(0, NVT)); 596 Chain = CurDAG->getCopyToReg(Chain, CurDAG->getRegister(HiReg, NVT), 597 ClrNode, InFlag); 598 InFlag = Chain.getValue(1); 599 } 600 601 if (foldedLoad) { 602 Chain = CurDAG->getTargetNode(MOpc, MVT::Other, MVT::Flag, Tmp0, Tmp1, 603 Tmp2, Tmp3, Chain, InFlag); 604 InFlag = Chain.getValue(1); 605 } else { 606 InFlag = CurDAG->getTargetNode(Opc, MVT::Flag, Select(N1), InFlag); 607 } 608 609 SDOperand Result = CurDAG->getCopyFromReg(Chain, isDiv ? LoReg : HiReg, 610 NVT, InFlag); 611 CodeGenMap[N.getValue(0)] = Result; 612 if (foldedLoad) 613 CodeGenMap[N1.getValue(1)] = Result.getValue(1); 614 return Result; 615 } 616 617 case ISD::TRUNCATE: { 618 unsigned Reg; 619 MVT::ValueType VT; 620 switch (Node->getOperand(0).getValueType()) { 621 default: assert(0 && "Unknown truncate!"); 622 case MVT::i16: Reg = X86::AX; Opc = X86::MOV16rr; VT = MVT::i16; break; 623 case MVT::i32: Reg = X86::EAX; Opc = X86::MOV32rr; VT = MVT::i32; break; 624 } 625 SDOperand Tmp0 = Select(Node->getOperand(0)); 626 SDOperand Tmp1 = CurDAG->getTargetNode(Opc, VT, Tmp0); 627 SDOperand InFlag = SDOperand(0,0); 628 SDOperand Result = CurDAG->getCopyToReg(CurDAG->getEntryNode(), 629 Reg, Tmp1, InFlag); 630 SDOperand Chain = Result.getValue(0); 631 InFlag = Result.getValue(1); 632 633 switch (NVT) { 634 default: assert(0 && "Unknown truncate!"); 635 case MVT::i8: Reg = X86::AL; Opc = X86::MOV8rr; VT = MVT::i8; break; 636 case MVT::i16: Reg = X86::AX; Opc = X86::MOV16rr; VT = MVT::i16; break; 637 } 638 639 Result = CurDAG->getCopyFromReg(Chain, 640 Reg, VT, InFlag); 641 if (N.Val->hasOneUse()) 642 return CurDAG->SelectNodeTo(N.Val, Opc, VT, Result); 643 else 644 return CodeGenMap[N] = CurDAG->getTargetNode(Opc, VT, Result); 645 break; 646 } 647 } 648 649 return SelectCode(N); 650} 651 652/// createX86ISelDag - This pass converts a legalized DAG into a 653/// X86-specific DAG, ready for instruction scheduling. 654/// 655FunctionPass *llvm::createX86ISelDag(TargetMachine &TM) { 656 return new X86DAGToDAGISel(TM); 657} 658