1 //==-- SystemZISelDAGToDAG.cpp - A dag to dag inst selector for SystemZ ---===// 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 defines an instruction selector for the SystemZ target. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "SystemZ.h" 15 #include "SystemZTargetMachine.h" 16 #include "llvm/DerivedTypes.h" 17 #include "llvm/Function.h" 18 #include "llvm/Intrinsics.h" 19 #include "llvm/CallingConv.h" 20 #include "llvm/Constants.h" 21 #include "llvm/CodeGen/MachineFrameInfo.h" 22 #include "llvm/CodeGen/MachineFunction.h" 23 #include "llvm/CodeGen/MachineInstrBuilder.h" 24 #include "llvm/CodeGen/MachineRegisterInfo.h" 25 #include "llvm/CodeGen/SelectionDAG.h" 26 #include "llvm/CodeGen/SelectionDAGISel.h" 27 #include "llvm/Target/TargetLowering.h" 28 #include "llvm/Support/Compiler.h" 29 #include "llvm/Support/Debug.h" 30 #include "llvm/Support/raw_ostream.h" 31 using namespace llvm; 32 33 namespace { 34 /// SystemZRRIAddressMode - This corresponds to rriaddr, but uses SDValue's 35 /// instead of register numbers for the leaves of the matched tree. 36 struct SystemZRRIAddressMode { 37 enum { 38 RegBase, 39 FrameIndexBase 40 } BaseType; 41 42 struct { // This is really a union, discriminated by BaseType! 43 SDValue Reg; 44 int FrameIndex; 45 } Base; 46 47 SDValue IndexReg; 48 int64_t Disp; 49 bool isRI; 50 51 SystemZRRIAddressMode(bool RI = false) 52 : BaseType(RegBase), IndexReg(), Disp(0), isRI(RI) { 53 } 54 55 void dump() { 56 errs() << "SystemZRRIAddressMode " << this << '\n'; 57 if (BaseType == RegBase) { 58 errs() << "Base.Reg "; 59 if (Base.Reg.getNode() != 0) 60 Base.Reg.getNode()->dump(); 61 else 62 errs() << "nul"; 63 errs() << '\n'; 64 } else { 65 errs() << " Base.FrameIndex " << Base.FrameIndex << '\n'; 66 } 67 if (!isRI) { 68 errs() << "IndexReg "; 69 if (IndexReg.getNode() != 0) IndexReg.getNode()->dump(); 70 else errs() << "nul"; 71 } 72 errs() << " Disp " << Disp << '\n'; 73 } 74 }; 75 } 76 77 /// SystemZDAGToDAGISel - SystemZ specific code to select SystemZ machine 78 /// instructions for SelectionDAG operations. 79 /// 80 namespace { 81 class SystemZDAGToDAGISel : public SelectionDAGISel { 82 const SystemZTargetLowering &Lowering; 83 const SystemZSubtarget &Subtarget; 84 85 void getAddressOperandsRI(const SystemZRRIAddressMode &AM, 86 SDValue &Base, SDValue &Disp); 87 void getAddressOperands(const SystemZRRIAddressMode &AM, 88 SDValue &Base, SDValue &Disp, 89 SDValue &Index); 90 91 public: 92 SystemZDAGToDAGISel(SystemZTargetMachine &TM, CodeGenOpt::Level OptLevel) 93 : SelectionDAGISel(TM, OptLevel), 94 Lowering(*TM.getTargetLowering()), 95 Subtarget(*TM.getSubtargetImpl()) { } 96 97 virtual const char *getPassName() const { 98 return "SystemZ DAG->DAG Pattern Instruction Selection"; 99 } 100 101 /// getI8Imm - Return a target constant with the specified value, of type 102 /// i8. 103 inline SDValue getI8Imm(uint64_t Imm) { 104 return CurDAG->getTargetConstant(Imm, MVT::i8); 105 } 106 107 /// getI16Imm - Return a target constant with the specified value, of type 108 /// i16. 109 inline SDValue getI16Imm(uint64_t Imm) { 110 return CurDAG->getTargetConstant(Imm, MVT::i16); 111 } 112 113 /// getI32Imm - Return a target constant with the specified value, of type 114 /// i32. 115 inline SDValue getI32Imm(uint64_t Imm) { 116 return CurDAG->getTargetConstant(Imm, MVT::i32); 117 } 118 119 // Include the pieces autogenerated from the target description. 120 #include "SystemZGenDAGISel.inc" 121 122 private: 123 bool SelectAddrRI12Only(SDValue& Addr, 124 SDValue &Base, SDValue &Disp); 125 bool SelectAddrRI12(SDValue& Addr, 126 SDValue &Base, SDValue &Disp, 127 bool is12BitOnly = false); 128 bool SelectAddrRI(SDValue& Addr, SDValue &Base, SDValue &Disp); 129 bool SelectAddrRRI12(SDValue Addr, 130 SDValue &Base, SDValue &Disp, SDValue &Index); 131 bool SelectAddrRRI20(SDValue Addr, 132 SDValue &Base, SDValue &Disp, SDValue &Index); 133 bool SelectLAAddr(SDValue Addr, 134 SDValue &Base, SDValue &Disp, SDValue &Index); 135 136 SDNode *Select(SDNode *Node); 137 138 bool TryFoldLoad(SDNode *P, SDValue N, 139 SDValue &Base, SDValue &Disp, SDValue &Index); 140 141 bool MatchAddress(SDValue N, SystemZRRIAddressMode &AM, 142 bool is12Bit, unsigned Depth = 0); 143 bool MatchAddressBase(SDValue N, SystemZRRIAddressMode &AM); 144 }; 145 } // end anonymous namespace 146 147 /// createSystemZISelDag - This pass converts a legalized DAG into a 148 /// SystemZ-specific DAG, ready for instruction scheduling. 149 /// 150 FunctionPass *llvm::createSystemZISelDag(SystemZTargetMachine &TM, 151 CodeGenOpt::Level OptLevel) { 152 return new SystemZDAGToDAGISel(TM, OptLevel); 153 } 154 155 /// isImmSExt20 - This method tests to see if the node is either a 32-bit 156 /// or 64-bit immediate, and if the value can be accurately represented as a 157 /// sign extension from a 20-bit value. If so, this returns true and the 158 /// immediate. 159 static bool isImmSExt20(int64_t Val, int64_t &Imm) { 160 if (Val >= -524288 && Val <= 524287) { 161 Imm = Val; 162 return true; 163 } 164 return false; 165 } 166 167 /// isImmZExt12 - This method tests to see if the node is either a 32-bit 168 /// or 64-bit immediate, and if the value can be accurately represented as a 169 /// zero extension from a 12-bit value. If so, this returns true and the 170 /// immediate. 171 static bool isImmZExt12(int64_t Val, int64_t &Imm) { 172 if (Val >= 0 && Val <= 0xFFF) { 173 Imm = Val; 174 return true; 175 } 176 return false; 177 } 178 179 /// MatchAddress - Add the specified node to the specified addressing mode, 180 /// returning true if it cannot be done. This just pattern matches for the 181 /// addressing mode. 182 bool SystemZDAGToDAGISel::MatchAddress(SDValue N, SystemZRRIAddressMode &AM, 183 bool is12Bit, unsigned Depth) { 184 DebugLoc dl = N.getDebugLoc(); 185 DEBUG(errs() << "MatchAddress: "; AM.dump()); 186 // Limit recursion. 187 if (Depth > 5) 188 return MatchAddressBase(N, AM); 189 190 // FIXME: We can perform better here. If we have something like 191 // (shift (add A, imm), N), we can try to reassociate stuff and fold shift of 192 // imm into addressing mode. 193 switch (N.getOpcode()) { 194 default: break; 195 case ISD::Constant: { 196 int64_t Val = cast<ConstantSDNode>(N)->getSExtValue(); 197 int64_t Imm = 0; 198 bool Match = (is12Bit ? 199 isImmZExt12(AM.Disp + Val, Imm) : 200 isImmSExt20(AM.Disp + Val, Imm)); 201 if (Match) { 202 AM.Disp = Imm; 203 return false; 204 } 205 break; 206 } 207 208 case ISD::FrameIndex: 209 if (AM.BaseType == SystemZRRIAddressMode::RegBase && 210 AM.Base.Reg.getNode() == 0) { 211 AM.BaseType = SystemZRRIAddressMode::FrameIndexBase; 212 AM.Base.FrameIndex = cast<FrameIndexSDNode>(N)->getIndex(); 213 return false; 214 } 215 break; 216 217 case ISD::SUB: { 218 // Given A-B, if A can be completely folded into the address and 219 // the index field with the index field unused, use -B as the index. 220 // This is a win if a has multiple parts that can be folded into 221 // the address. Also, this saves a mov if the base register has 222 // other uses, since it avoids a two-address sub instruction, however 223 // it costs an additional mov if the index register has other uses. 224 225 // Test if the LHS of the sub can be folded. 226 SystemZRRIAddressMode Backup = AM; 227 if (MatchAddress(N.getNode()->getOperand(0), AM, is12Bit, Depth+1)) { 228 AM = Backup; 229 break; 230 } 231 // Test if the index field is free for use. 232 if (AM.IndexReg.getNode() || AM.isRI) { 233 AM = Backup; 234 break; 235 } 236 237 // If the base is a register with multiple uses, this transformation may 238 // save a mov. Otherwise it's probably better not to do it. 239 if (AM.BaseType == SystemZRRIAddressMode::RegBase && 240 (!AM.Base.Reg.getNode() || AM.Base.Reg.getNode()->hasOneUse())) { 241 AM = Backup; 242 break; 243 } 244 245 // Ok, the transformation is legal and appears profitable. Go for it. 246 SDValue RHS = N.getNode()->getOperand(1); 247 SDValue Zero = CurDAG->getConstant(0, N.getValueType()); 248 SDValue Neg = CurDAG->getNode(ISD::SUB, dl, N.getValueType(), Zero, RHS); 249 AM.IndexReg = Neg; 250 251 // Insert the new nodes into the topological ordering. 252 if (Zero.getNode()->getNodeId() == -1 || 253 Zero.getNode()->getNodeId() > N.getNode()->getNodeId()) { 254 CurDAG->RepositionNode(N.getNode(), Zero.getNode()); 255 Zero.getNode()->setNodeId(N.getNode()->getNodeId()); 256 } 257 if (Neg.getNode()->getNodeId() == -1 || 258 Neg.getNode()->getNodeId() > N.getNode()->getNodeId()) { 259 CurDAG->RepositionNode(N.getNode(), Neg.getNode()); 260 Neg.getNode()->setNodeId(N.getNode()->getNodeId()); 261 } 262 return false; 263 } 264 265 case ISD::ADD: { 266 SystemZRRIAddressMode Backup = AM; 267 if (!MatchAddress(N.getNode()->getOperand(0), AM, is12Bit, Depth+1) && 268 !MatchAddress(N.getNode()->getOperand(1), AM, is12Bit, Depth+1)) 269 return false; 270 AM = Backup; 271 if (!MatchAddress(N.getNode()->getOperand(1), AM, is12Bit, Depth+1) && 272 !MatchAddress(N.getNode()->getOperand(0), AM, is12Bit, Depth+1)) 273 return false; 274 AM = Backup; 275 276 // If we couldn't fold both operands into the address at the same time, 277 // see if we can just put each operand into a register and fold at least 278 // the add. 279 if (!AM.isRI && 280 AM.BaseType == SystemZRRIAddressMode::RegBase && 281 !AM.Base.Reg.getNode() && !AM.IndexReg.getNode()) { 282 AM.Base.Reg = N.getNode()->getOperand(0); 283 AM.IndexReg = N.getNode()->getOperand(1); 284 return false; 285 } 286 break; 287 } 288 289 case ISD::OR: 290 // Handle "X | C" as "X + C" iff X is known to have C bits clear. 291 if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(N.getOperand(1))) { 292 SystemZRRIAddressMode Backup = AM; 293 int64_t Offset = CN->getSExtValue(); 294 int64_t Imm = 0; 295 bool MatchOffset = (is12Bit ? 296 isImmZExt12(AM.Disp + Offset, Imm) : 297 isImmSExt20(AM.Disp + Offset, Imm)); 298 // The resultant disp must fit in 12 or 20-bits. 299 if (MatchOffset && 300 // LHS should be an addr mode. 301 !MatchAddress(N.getOperand(0), AM, is12Bit, Depth+1) && 302 // Check to see if the LHS & C is zero. 303 CurDAG->MaskedValueIsZero(N.getOperand(0), CN->getAPIntValue())) { 304 AM.Disp = Imm; 305 return false; 306 } 307 AM = Backup; 308 } 309 break; 310 } 311 312 return MatchAddressBase(N, AM); 313 } 314 315 /// MatchAddressBase - Helper for MatchAddress. Add the specified node to the 316 /// specified addressing mode without any further recursion. 317 bool SystemZDAGToDAGISel::MatchAddressBase(SDValue N, 318 SystemZRRIAddressMode &AM) { 319 // Is the base register already occupied? 320 if (AM.BaseType != SystemZRRIAddressMode::RegBase || AM.Base.Reg.getNode()) { 321 // If so, check to see if the index register is set. 322 if (AM.IndexReg.getNode() == 0 && !AM.isRI) { 323 AM.IndexReg = N; 324 return false; 325 } 326 327 // Otherwise, we cannot select it. 328 return true; 329 } 330 331 // Default, generate it as a register. 332 AM.BaseType = SystemZRRIAddressMode::RegBase; 333 AM.Base.Reg = N; 334 return false; 335 } 336 337 void SystemZDAGToDAGISel::getAddressOperandsRI(const SystemZRRIAddressMode &AM, 338 SDValue &Base, SDValue &Disp) { 339 if (AM.BaseType == SystemZRRIAddressMode::RegBase) 340 Base = AM.Base.Reg; 341 else 342 Base = CurDAG->getTargetFrameIndex(AM.Base.FrameIndex, TLI.getPointerTy()); 343 Disp = CurDAG->getTargetConstant(AM.Disp, MVT::i64); 344 } 345 346 void SystemZDAGToDAGISel::getAddressOperands(const SystemZRRIAddressMode &AM, 347 SDValue &Base, SDValue &Disp, 348 SDValue &Index) { 349 getAddressOperandsRI(AM, Base, Disp); 350 Index = AM.IndexReg; 351 } 352 353 /// Returns true if the address can be represented by a base register plus 354 /// an unsigned 12-bit displacement [r+imm]. 355 bool SystemZDAGToDAGISel::SelectAddrRI12Only(SDValue &Addr, 356 SDValue &Base, SDValue &Disp) { 357 return SelectAddrRI12(Addr, Base, Disp, /*is12BitOnly*/true); 358 } 359 360 bool SystemZDAGToDAGISel::SelectAddrRI12(SDValue &Addr, 361 SDValue &Base, SDValue &Disp, 362 bool is12BitOnly) { 363 SystemZRRIAddressMode AM20(/*isRI*/true), AM12(/*isRI*/true); 364 bool Done = false; 365 366 if (!Addr.hasOneUse()) { 367 unsigned Opcode = Addr.getOpcode(); 368 if (Opcode != ISD::Constant && Opcode != ISD::FrameIndex) { 369 // If we are able to fold N into addressing mode, then we'll allow it even 370 // if N has multiple uses. In general, addressing computation is used as 371 // addresses by all of its uses. But watch out for CopyToReg uses, that 372 // means the address computation is liveout. It will be computed by a LA 373 // so we want to avoid computing the address twice. 374 for (SDNode::use_iterator UI = Addr.getNode()->use_begin(), 375 UE = Addr.getNode()->use_end(); UI != UE; ++UI) { 376 if (UI->getOpcode() == ISD::CopyToReg) { 377 MatchAddressBase(Addr, AM12); 378 Done = true; 379 break; 380 } 381 } 382 } 383 } 384 if (!Done && MatchAddress(Addr, AM12, /* is12Bit */ true)) 385 return false; 386 387 // Check, whether we can match stuff using 20-bit displacements 388 if (!Done && !is12BitOnly && 389 !MatchAddress(Addr, AM20, /* is12Bit */ false)) 390 if (AM12.Disp == 0 && AM20.Disp != 0) 391 return false; 392 393 DEBUG(errs() << "MatchAddress (final): "; AM12.dump()); 394 395 EVT VT = Addr.getValueType(); 396 if (AM12.BaseType == SystemZRRIAddressMode::RegBase) { 397 if (!AM12.Base.Reg.getNode()) 398 AM12.Base.Reg = CurDAG->getRegister(0, VT); 399 } 400 401 assert(AM12.IndexReg.getNode() == 0 && "Invalid reg-imm address mode!"); 402 403 getAddressOperandsRI(AM12, Base, Disp); 404 405 return true; 406 } 407 408 /// Returns true if the address can be represented by a base register plus 409 /// a signed 20-bit displacement [r+imm]. 410 bool SystemZDAGToDAGISel::SelectAddrRI(SDValue& Addr, 411 SDValue &Base, SDValue &Disp) { 412 SystemZRRIAddressMode AM(/*isRI*/true); 413 bool Done = false; 414 415 if (!Addr.hasOneUse()) { 416 unsigned Opcode = Addr.getOpcode(); 417 if (Opcode != ISD::Constant && Opcode != ISD::FrameIndex) { 418 // If we are able to fold N into addressing mode, then we'll allow it even 419 // if N has multiple uses. In general, addressing computation is used as 420 // addresses by all of its uses. But watch out for CopyToReg uses, that 421 // means the address computation is liveout. It will be computed by a LA 422 // so we want to avoid computing the address twice. 423 for (SDNode::use_iterator UI = Addr.getNode()->use_begin(), 424 UE = Addr.getNode()->use_end(); UI != UE; ++UI) { 425 if (UI->getOpcode() == ISD::CopyToReg) { 426 MatchAddressBase(Addr, AM); 427 Done = true; 428 break; 429 } 430 } 431 } 432 } 433 if (!Done && MatchAddress(Addr, AM, /* is12Bit */ false)) 434 return false; 435 436 DEBUG(errs() << "MatchAddress (final): "; AM.dump()); 437 438 EVT VT = Addr.getValueType(); 439 if (AM.BaseType == SystemZRRIAddressMode::RegBase) { 440 if (!AM.Base.Reg.getNode()) 441 AM.Base.Reg = CurDAG->getRegister(0, VT); 442 } 443 444 assert(AM.IndexReg.getNode() == 0 && "Invalid reg-imm address mode!"); 445 446 getAddressOperandsRI(AM, Base, Disp); 447 448 return true; 449 } 450 451 /// Returns true if the address can be represented by a base register plus 452 /// index register plus an unsigned 12-bit displacement [base + idx + imm]. 453 bool SystemZDAGToDAGISel::SelectAddrRRI12(SDValue Addr, 454 SDValue &Base, SDValue &Disp, SDValue &Index) { 455 SystemZRRIAddressMode AM20, AM12; 456 bool Done = false; 457 458 if (!Addr.hasOneUse()) { 459 unsigned Opcode = Addr.getOpcode(); 460 if (Opcode != ISD::Constant && Opcode != ISD::FrameIndex) { 461 // If we are able to fold N into addressing mode, then we'll allow it even 462 // if N has multiple uses. In general, addressing computation is used as 463 // addresses by all of its uses. But watch out for CopyToReg uses, that 464 // means the address computation is liveout. It will be computed by a LA 465 // so we want to avoid computing the address twice. 466 for (SDNode::use_iterator UI = Addr.getNode()->use_begin(), 467 UE = Addr.getNode()->use_end(); UI != UE; ++UI) { 468 if (UI->getOpcode() == ISD::CopyToReg) { 469 MatchAddressBase(Addr, AM12); 470 Done = true; 471 break; 472 } 473 } 474 } 475 } 476 if (!Done && MatchAddress(Addr, AM12, /* is12Bit */ true)) 477 return false; 478 479 // Check, whether we can match stuff using 20-bit displacements 480 if (!Done && !MatchAddress(Addr, AM20, /* is12Bit */ false)) 481 if (AM12.Disp == 0 && AM20.Disp != 0) 482 return false; 483 484 DEBUG(errs() << "MatchAddress (final): "; AM12.dump()); 485 486 EVT VT = Addr.getValueType(); 487 if (AM12.BaseType == SystemZRRIAddressMode::RegBase) { 488 if (!AM12.Base.Reg.getNode()) 489 AM12.Base.Reg = CurDAG->getRegister(0, VT); 490 } 491 492 if (!AM12.IndexReg.getNode()) 493 AM12.IndexReg = CurDAG->getRegister(0, VT); 494 495 getAddressOperands(AM12, Base, Disp, Index); 496 497 return true; 498 } 499 500 /// Returns true if the address can be represented by a base register plus 501 /// index register plus a signed 20-bit displacement [base + idx + imm]. 502 bool SystemZDAGToDAGISel::SelectAddrRRI20(SDValue Addr, 503 SDValue &Base, SDValue &Disp, SDValue &Index) { 504 SystemZRRIAddressMode AM; 505 bool Done = false; 506 507 if (!Addr.hasOneUse()) { 508 unsigned Opcode = Addr.getOpcode(); 509 if (Opcode != ISD::Constant && Opcode != ISD::FrameIndex) { 510 // If we are able to fold N into addressing mode, then we'll allow it even 511 // if N has multiple uses. In general, addressing computation is used as 512 // addresses by all of its uses. But watch out for CopyToReg uses, that 513 // means the address computation is liveout. It will be computed by a LA 514 // so we want to avoid computing the address twice. 515 for (SDNode::use_iterator UI = Addr.getNode()->use_begin(), 516 UE = Addr.getNode()->use_end(); UI != UE; ++UI) { 517 if (UI->getOpcode() == ISD::CopyToReg) { 518 MatchAddressBase(Addr, AM); 519 Done = true; 520 break; 521 } 522 } 523 } 524 } 525 if (!Done && MatchAddress(Addr, AM, /* is12Bit */ false)) 526 return false; 527 528 DEBUG(errs() << "MatchAddress (final): "; AM.dump()); 529 530 EVT VT = Addr.getValueType(); 531 if (AM.BaseType == SystemZRRIAddressMode::RegBase) { 532 if (!AM.Base.Reg.getNode()) 533 AM.Base.Reg = CurDAG->getRegister(0, VT); 534 } 535 536 if (!AM.IndexReg.getNode()) 537 AM.IndexReg = CurDAG->getRegister(0, VT); 538 539 getAddressOperands(AM, Base, Disp, Index); 540 541 return true; 542 } 543 544 /// SelectLAAddr - it calls SelectAddr and determines if the maximal addressing 545 /// mode it matches can be cost effectively emitted as an LA/LAY instruction. 546 bool SystemZDAGToDAGISel::SelectLAAddr(SDValue Addr, 547 SDValue &Base, SDValue &Disp, SDValue &Index) { 548 SystemZRRIAddressMode AM; 549 550 if (MatchAddress(Addr, AM, false)) 551 return false; 552 553 EVT VT = Addr.getValueType(); 554 unsigned Complexity = 0; 555 if (AM.BaseType == SystemZRRIAddressMode::RegBase) 556 if (AM.Base.Reg.getNode()) 557 Complexity = 1; 558 else 559 AM.Base.Reg = CurDAG->getRegister(0, VT); 560 else if (AM.BaseType == SystemZRRIAddressMode::FrameIndexBase) 561 Complexity = 4; 562 563 if (AM.IndexReg.getNode()) 564 Complexity += 1; 565 else 566 AM.IndexReg = CurDAG->getRegister(0, VT); 567 568 if (AM.Disp && (AM.Base.Reg.getNode() || AM.IndexReg.getNode())) 569 Complexity += 1; 570 571 if (Complexity > 2) { 572 getAddressOperands(AM, Base, Disp, Index); 573 return true; 574 } 575 576 return false; 577 } 578 579 bool SystemZDAGToDAGISel::TryFoldLoad(SDNode *P, SDValue N, 580 SDValue &Base, SDValue &Disp, SDValue &Index) { 581 if (ISD::isNON_EXTLoad(N.getNode()) && 582 IsLegalToFold(N, P, P, OptLevel)) 583 return SelectAddrRRI20(N.getOperand(1), Base, Disp, Index); 584 return false; 585 } 586 587 SDNode *SystemZDAGToDAGISel::Select(SDNode *Node) { 588 EVT NVT = Node->getValueType(0); 589 DebugLoc dl = Node->getDebugLoc(); 590 unsigned Opcode = Node->getOpcode(); 591 592 // Dump information about the Node being selected 593 DEBUG(errs() << "Selecting: "; Node->dump(CurDAG); errs() << "\n"); 594 595 // If we have a custom node, we already have selected! 596 if (Node->isMachineOpcode()) { 597 DEBUG(errs() << "== "; Node->dump(CurDAG); errs() << "\n"); 598 return NULL; // Already selected. 599 } 600 601 switch (Opcode) { 602 default: break; 603 case ISD::SDIVREM: { 604 unsigned Opc, MOpc; 605 SDValue N0 = Node->getOperand(0); 606 SDValue N1 = Node->getOperand(1); 607 608 EVT ResVT; 609 bool is32Bit = false; 610 switch (NVT.getSimpleVT().SimpleTy) { 611 default: assert(0 && "Unsupported VT!"); 612 case MVT::i32: 613 Opc = SystemZ::SDIVREM32r; MOpc = SystemZ::SDIVREM32m; 614 ResVT = MVT::v2i64; 615 is32Bit = true; 616 break; 617 case MVT::i64: 618 Opc = SystemZ::SDIVREM64r; MOpc = SystemZ::SDIVREM64m; 619 ResVT = MVT::v2i64; 620 break; 621 } 622 623 SDValue Tmp0, Tmp1, Tmp2; 624 bool foldedLoad = TryFoldLoad(Node, N1, Tmp0, Tmp1, Tmp2); 625 626 // Prepare the dividend 627 SDNode *Dividend; 628 if (is32Bit) 629 Dividend = CurDAG->getMachineNode(SystemZ::MOVSX64rr32, dl, MVT::i64, N0); 630 else 631 Dividend = N0.getNode(); 632 633 // Insert prepared dividend into suitable 'subreg' 634 SDNode *Tmp = CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF, 635 dl, ResVT); 636 Dividend = 637 CurDAG->getMachineNode(TargetOpcode::INSERT_SUBREG, dl, ResVT, 638 SDValue(Tmp, 0), SDValue(Dividend, 0), 639 CurDAG->getTargetConstant(SystemZ::subreg_odd, MVT::i32)); 640 641 SDNode *Result; 642 SDValue DivVal = SDValue(Dividend, 0); 643 if (foldedLoad) { 644 SDValue Ops[] = { DivVal, Tmp0, Tmp1, Tmp2, N1.getOperand(0) }; 645 Result = CurDAG->getMachineNode(MOpc, dl, ResVT, MVT::Other, 646 Ops, array_lengthof(Ops)); 647 // Update the chain. 648 ReplaceUses(N1.getValue(1), SDValue(Result, 1)); 649 } else { 650 Result = CurDAG->getMachineNode(Opc, dl, ResVT, SDValue(Dividend, 0), N1); 651 } 652 653 // Copy the division (odd subreg) result, if it is needed. 654 if (!SDValue(Node, 0).use_empty()) { 655 unsigned SubRegIdx = (is32Bit ? 656 SystemZ::subreg_odd32 : SystemZ::subreg_odd); 657 SDNode *Div = CurDAG->getMachineNode(TargetOpcode::EXTRACT_SUBREG, 658 dl, NVT, 659 SDValue(Result, 0), 660 CurDAG->getTargetConstant(SubRegIdx, 661 MVT::i32)); 662 663 ReplaceUses(SDValue(Node, 0), SDValue(Div, 0)); 664 DEBUG(errs() << "=> "; Result->dump(CurDAG); errs() << "\n"); 665 } 666 667 // Copy the remainder (even subreg) result, if it is needed. 668 if (!SDValue(Node, 1).use_empty()) { 669 unsigned SubRegIdx = (is32Bit ? 670 SystemZ::subreg_32bit : SystemZ::subreg_even); 671 SDNode *Rem = CurDAG->getMachineNode(TargetOpcode::EXTRACT_SUBREG, 672 dl, NVT, 673 SDValue(Result, 0), 674 CurDAG->getTargetConstant(SubRegIdx, 675 MVT::i32)); 676 677 ReplaceUses(SDValue(Node, 1), SDValue(Rem, 0)); 678 DEBUG(errs() << "=> "; Result->dump(CurDAG); errs() << "\n"); 679 } 680 681 return NULL; 682 } 683 case ISD::UDIVREM: { 684 unsigned Opc, MOpc, ClrOpc; 685 SDValue N0 = Node->getOperand(0); 686 SDValue N1 = Node->getOperand(1); 687 EVT ResVT; 688 689 bool is32Bit = false; 690 switch (NVT.getSimpleVT().SimpleTy) { 691 default: assert(0 && "Unsupported VT!"); 692 case MVT::i32: 693 Opc = SystemZ::UDIVREM32r; MOpc = SystemZ::UDIVREM32m; 694 ClrOpc = SystemZ::MOV64Pr0_even; 695 ResVT = MVT::v2i32; 696 is32Bit = true; 697 break; 698 case MVT::i64: 699 Opc = SystemZ::UDIVREM64r; MOpc = SystemZ::UDIVREM64m; 700 ClrOpc = SystemZ::MOV128r0_even; 701 ResVT = MVT::v2i64; 702 break; 703 } 704 705 SDValue Tmp0, Tmp1, Tmp2; 706 bool foldedLoad = TryFoldLoad(Node, N1, Tmp0, Tmp1, Tmp2); 707 708 // Prepare the dividend 709 SDNode *Dividend = N0.getNode(); 710 711 // Insert prepared dividend into suitable 'subreg' 712 SDNode *Tmp = CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF, 713 dl, ResVT); 714 { 715 unsigned SubRegIdx = (is32Bit ? 716 SystemZ::subreg_odd32 : SystemZ::subreg_odd); 717 Dividend = 718 CurDAG->getMachineNode(TargetOpcode::INSERT_SUBREG, dl, ResVT, 719 SDValue(Tmp, 0), SDValue(Dividend, 0), 720 CurDAG->getTargetConstant(SubRegIdx, MVT::i32)); 721 } 722 723 // Zero out even subreg 724 Dividend = CurDAG->getMachineNode(ClrOpc, dl, ResVT, SDValue(Dividend, 0)); 725 726 SDValue DivVal = SDValue(Dividend, 0); 727 SDNode *Result; 728 if (foldedLoad) { 729 SDValue Ops[] = { DivVal, Tmp0, Tmp1, Tmp2, N1.getOperand(0) }; 730 Result = CurDAG->getMachineNode(MOpc, dl, ResVT, MVT::Other, 731 Ops, array_lengthof(Ops)); 732 // Update the chain. 733 ReplaceUses(N1.getValue(1), SDValue(Result, 1)); 734 } else { 735 Result = CurDAG->getMachineNode(Opc, dl, ResVT, DivVal, N1); 736 } 737 738 // Copy the division (odd subreg) result, if it is needed. 739 if (!SDValue(Node, 0).use_empty()) { 740 unsigned SubRegIdx = (is32Bit ? 741 SystemZ::subreg_odd32 : SystemZ::subreg_odd); 742 SDNode *Div = CurDAG->getMachineNode(TargetOpcode::EXTRACT_SUBREG, 743 dl, NVT, 744 SDValue(Result, 0), 745 CurDAG->getTargetConstant(SubRegIdx, 746 MVT::i32)); 747 ReplaceUses(SDValue(Node, 0), SDValue(Div, 0)); 748 DEBUG(errs() << "=> "; Result->dump(CurDAG); errs() << "\n"); 749 } 750 751 // Copy the remainder (even subreg) result, if it is needed. 752 if (!SDValue(Node, 1).use_empty()) { 753 unsigned SubRegIdx = (is32Bit ? 754 SystemZ::subreg_32bit : SystemZ::subreg_even); 755 SDNode *Rem = CurDAG->getMachineNode(TargetOpcode::EXTRACT_SUBREG, 756 dl, NVT, 757 SDValue(Result, 0), 758 CurDAG->getTargetConstant(SubRegIdx, 759 MVT::i32)); 760 ReplaceUses(SDValue(Node, 1), SDValue(Rem, 0)); 761 DEBUG(errs() << "=> "; Result->dump(CurDAG); errs() << "\n"); 762 } 763 764 return NULL; 765 } 766 } 767 768 // Select the default instruction 769 SDNode *ResNode = SelectCode(Node); 770 771 DEBUG(errs() << "=> "; 772 if (ResNode == NULL || ResNode == Node) 773 Node->dump(CurDAG); 774 else 775 ResNode->dump(CurDAG); 776 errs() << "\n"; 777 ); 778 return ResNode; 779 } 780