HexagonVLIWPacketizer.cpp revision 7a2e472d527156165273a6c105ca7a93ff9e48f8
1//===----- HexagonPacketizer.cpp - vliw packetizer ---------------------===// 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 implements a simple VLIW packetizer using DFA. The packetizer works on 11// machine basic blocks. For each instruction I in BB, the packetizer consults 12// the DFA to see if machine resources are available to execute I. If so, the 13// packetizer checks if I depends on any instruction J in the current packet. 14// If no dependency is found, I is added to current packet and machine resource 15// is marked as taken. If any dependency is found, a target API call is made to 16// prune the dependence. 17// 18//===----------------------------------------------------------------------===// 19#define DEBUG_TYPE "packets" 20#include "llvm/CodeGen/DFAPacketizer.h" 21#include "llvm/CodeGen/Passes.h" 22#include "llvm/CodeGen/MachineDominators.h" 23#include "llvm/CodeGen/MachineFunctionPass.h" 24#include "llvm/CodeGen/MachineLoopInfo.h" 25#include "llvm/CodeGen/ScheduleDAG.h" 26#include "llvm/CodeGen/ScheduleDAGInstrs.h" 27#include "llvm/CodeGen/LatencyPriorityQueue.h" 28#include "llvm/CodeGen/SchedulerRegistry.h" 29#include "llvm/CodeGen/MachineFrameInfo.h" 30#include "llvm/CodeGen/MachineInstrBuilder.h" 31#include "llvm/CodeGen/MachineRegisterInfo.h" 32#include "llvm/CodeGen/MachineFunctionAnalysis.h" 33#include "llvm/CodeGen/ScheduleHazardRecognizer.h" 34#include "llvm/Target/TargetMachine.h" 35#include "llvm/Target/TargetInstrInfo.h" 36#include "llvm/Target/TargetRegisterInfo.h" 37#include "llvm/ADT/DenseMap.h" 38#include "llvm/ADT/Statistic.h" 39#include "llvm/Support/MathExtras.h" 40#include "llvm/MC/MCInstrItineraries.h" 41#include "llvm/Support/Compiler.h" 42#include "llvm/Support/CommandLine.h" 43#include "llvm/Support/Debug.h" 44#include "Hexagon.h" 45#include "HexagonTargetMachine.h" 46#include "HexagonRegisterInfo.h" 47#include "HexagonSubtarget.h" 48#include "HexagonMachineFunctionInfo.h" 49 50#include <map> 51 52using namespace llvm; 53 54namespace { 55 class HexagonPacketizer : public MachineFunctionPass { 56 57 public: 58 static char ID; 59 HexagonPacketizer() : MachineFunctionPass(ID) {} 60 61 void getAnalysisUsage(AnalysisUsage &AU) const { 62 AU.setPreservesCFG(); 63 AU.addRequired<MachineDominatorTree>(); 64 AU.addPreserved<MachineDominatorTree>(); 65 AU.addRequired<MachineLoopInfo>(); 66 AU.addPreserved<MachineLoopInfo>(); 67 MachineFunctionPass::getAnalysisUsage(AU); 68 } 69 70 const char *getPassName() const { 71 return "Hexagon Packetizer"; 72 } 73 74 bool runOnMachineFunction(MachineFunction &Fn); 75 }; 76 char HexagonPacketizer::ID = 0; 77 78 class HexagonPacketizerList : public VLIWPacketizerList { 79 80 private: 81 82 // Has the instruction been promoted to a dot-new instruction. 83 bool PromotedToDotNew; 84 85 // Has the instruction been glued to allocframe. 86 bool GlueAllocframeStore; 87 88 // Has the feeder instruction been glued to new value jump. 89 bool GlueToNewValueJump; 90 91 // Check if there is a dependence between some instruction already in this 92 // packet and this instruction. 93 bool Dependence; 94 95 // Only check for dependence if there are resources available to 96 // schedule this instruction. 97 bool FoundSequentialDependence; 98 99 public: 100 // Ctor. 101 HexagonPacketizerList(MachineFunction &MF, MachineLoopInfo &MLI, 102 MachineDominatorTree &MDT); 103 104 // initPacketizerState - initialize some internal flags. 105 void initPacketizerState(); 106 107 // ignorePseudoInstruction - Ignore bundling of pseudo instructions. 108 bool ignorePseudoInstruction(MachineInstr *MI, MachineBasicBlock *MBB); 109 110 // isSoloInstruction - return true if instruction MI can not be packetized 111 // with any other instruction, which means that MI itself is a packet. 112 bool isSoloInstruction(MachineInstr *MI); 113 114 // isLegalToPacketizeTogether - Is it legal to packetize SUI and SUJ 115 // together. 116 bool isLegalToPacketizeTogether(SUnit *SUI, SUnit *SUJ); 117 118 // isLegalToPruneDependencies - Is it legal to prune dependece between SUI 119 // and SUJ. 120 bool isLegalToPruneDependencies(SUnit *SUI, SUnit *SUJ); 121 122 MachineBasicBlock::iterator addToPacket(MachineInstr *MI); 123 private: 124 bool IsCallDependent(MachineInstr* MI, SDep::Kind DepType, unsigned DepReg); 125 bool PromoteToDotNew(MachineInstr* MI, SDep::Kind DepType, 126 MachineBasicBlock::iterator &MII, 127 const TargetRegisterClass* RC); 128 bool CanPromoteToDotNew(MachineInstr* MI, SUnit* PacketSU, 129 unsigned DepReg, 130 std::map <MachineInstr*, SUnit*> MIToSUnit, 131 MachineBasicBlock::iterator &MII, 132 const TargetRegisterClass* RC); 133 bool CanPromoteToNewValue(MachineInstr* MI, SUnit* PacketSU, 134 unsigned DepReg, 135 std::map <MachineInstr*, SUnit*> MIToSUnit, 136 MachineBasicBlock::iterator &MII); 137 bool CanPromoteToNewValueStore(MachineInstr* MI, MachineInstr* PacketMI, 138 unsigned DepReg, 139 std::map <MachineInstr*, SUnit*> MIToSUnit); 140 bool DemoteToDotOld(MachineInstr* MI); 141 bool ArePredicatesComplements(MachineInstr* MI1, MachineInstr* MI2, 142 std::map <MachineInstr*, SUnit*> MIToSUnit); 143 bool RestrictingDepExistInPacket(MachineInstr*, 144 unsigned, std::map <MachineInstr*, SUnit*>); 145 bool isNewifiable(MachineInstr* MI); 146 bool isCondInst(MachineInstr* MI); 147 bool IsNewifyStore (MachineInstr* MI); 148 bool tryAllocateResourcesForConstExt(MachineInstr* MI); 149 bool canReserveResourcesForConstExt(MachineInstr *MI); 150 void reserveResourcesForConstExt(MachineInstr* MI); 151 bool isNewValueInst(MachineInstr* MI); 152 bool isDotNewInst(MachineInstr* MI); 153 }; 154} 155 156// HexagonPacketizerList Ctor. 157HexagonPacketizerList::HexagonPacketizerList( 158 MachineFunction &MF, MachineLoopInfo &MLI,MachineDominatorTree &MDT) 159 : VLIWPacketizerList(MF, MLI, MDT, true){ 160} 161 162bool HexagonPacketizer::runOnMachineFunction(MachineFunction &Fn) { 163 const TargetInstrInfo *TII = Fn.getTarget().getInstrInfo(); 164 MachineLoopInfo &MLI = getAnalysis<MachineLoopInfo>(); 165 MachineDominatorTree &MDT = getAnalysis<MachineDominatorTree>(); 166 167 // Instantiate the packetizer. 168 HexagonPacketizerList Packetizer(Fn, MLI, MDT); 169 170 // DFA state table should not be empty. 171 assert(Packetizer.getResourceTracker() && "Empty DFA table!"); 172 173 // 174 // Loop over all basic blocks and remove KILL pseudo-instructions 175 // These instructions confuse the dependence analysis. Consider: 176 // D0 = ... (Insn 0) 177 // R0 = KILL R0, D0 (Insn 1) 178 // R0 = ... (Insn 2) 179 // Here, Insn 1 will result in the dependence graph not emitting an output 180 // dependence between Insn 0 and Insn 2. This can lead to incorrect 181 // packetization 182 // 183 for (MachineFunction::iterator MBB = Fn.begin(), MBBe = Fn.end(); 184 MBB != MBBe; ++MBB) { 185 MachineBasicBlock::iterator End = MBB->end(); 186 MachineBasicBlock::iterator MI = MBB->begin(); 187 while (MI != End) { 188 if (MI->isKill()) { 189 MachineBasicBlock::iterator DeleteMI = MI; 190 ++MI; 191 MBB->erase(DeleteMI); 192 End = MBB->end(); 193 continue; 194 } 195 ++MI; 196 } 197 } 198 199 // Loop over all of the basic blocks. 200 for (MachineFunction::iterator MBB = Fn.begin(), MBBe = Fn.end(); 201 MBB != MBBe; ++MBB) { 202 // Find scheduling regions and schedule / packetize each region. 203 unsigned RemainingCount = MBB->size(); 204 for(MachineBasicBlock::iterator RegionEnd = MBB->end(); 205 RegionEnd != MBB->begin();) { 206 // The next region starts above the previous region. Look backward in the 207 // instruction stream until we find the nearest boundary. 208 MachineBasicBlock::iterator I = RegionEnd; 209 for(;I != MBB->begin(); --I, --RemainingCount) { 210 if (TII->isSchedulingBoundary(llvm::prior(I), MBB, Fn)) 211 break; 212 } 213 I = MBB->begin(); 214 215 // Skip empty scheduling regions. 216 if (I == RegionEnd) { 217 RegionEnd = llvm::prior(RegionEnd); 218 --RemainingCount; 219 continue; 220 } 221 // Skip regions with one instruction. 222 if (I == llvm::prior(RegionEnd)) { 223 RegionEnd = llvm::prior(RegionEnd); 224 continue; 225 } 226 227 Packetizer.PacketizeMIs(MBB, I, RegionEnd); 228 RegionEnd = I; 229 } 230 } 231 232 return true; 233} 234 235 236static bool IsIndirectCall(MachineInstr* MI) { 237 return ((MI->getOpcode() == Hexagon::CALLR) || 238 (MI->getOpcode() == Hexagon::CALLRv3)); 239} 240 241// Reserve resources for constant extender. Trigure an assertion if 242// reservation fail. 243void HexagonPacketizerList::reserveResourcesForConstExt(MachineInstr* MI) { 244 const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII; 245 MachineInstr *PseudoMI = MI->getParent()->getParent()->CreateMachineInstr( 246 QII->get(Hexagon::IMMEXT), MI->getDebugLoc()); 247 248 if (ResourceTracker->canReserveResources(PseudoMI)) { 249 ResourceTracker->reserveResources(PseudoMI); 250 MI->getParent()->getParent()->DeleteMachineInstr(PseudoMI); 251 } else { 252 MI->getParent()->getParent()->DeleteMachineInstr(PseudoMI); 253 llvm_unreachable("can not reserve resources for constant extender."); 254 } 255 return; 256} 257 258bool HexagonPacketizerList::canReserveResourcesForConstExt(MachineInstr *MI) { 259 const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII; 260 assert(QII->isExtended(MI) && 261 "Should only be called for constant extended instructions"); 262 MachineFunction *MF = MI->getParent()->getParent(); 263 MachineInstr *PseudoMI = MF->CreateMachineInstr(QII->get(Hexagon::IMMEXT), 264 MI->getDebugLoc()); 265 bool CanReserve = ResourceTracker->canReserveResources(PseudoMI); 266 MF->DeleteMachineInstr(PseudoMI); 267 return CanReserve; 268} 269 270// Allocate resources (i.e. 4 bytes) for constant extender. If succeed, return 271// true, otherwise, return false. 272bool HexagonPacketizerList::tryAllocateResourcesForConstExt(MachineInstr* MI) { 273 const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII; 274 MachineInstr *PseudoMI = MI->getParent()->getParent()->CreateMachineInstr( 275 QII->get(Hexagon::IMMEXT), MI->getDebugLoc()); 276 277 if (ResourceTracker->canReserveResources(PseudoMI)) { 278 ResourceTracker->reserveResources(PseudoMI); 279 MI->getParent()->getParent()->DeleteMachineInstr(PseudoMI); 280 return true; 281 } else { 282 MI->getParent()->getParent()->DeleteMachineInstr(PseudoMI); 283 return false; 284 } 285} 286 287 288bool HexagonPacketizerList::IsCallDependent(MachineInstr* MI, 289 SDep::Kind DepType, 290 unsigned DepReg) { 291 292 const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII; 293 const HexagonRegisterInfo* QRI = (const HexagonRegisterInfo *) TM.getRegisterInfo(); 294 295 // Check for lr dependence 296 if (DepReg == QRI->getRARegister()) { 297 return true; 298 } 299 300 if (QII->isDeallocRet(MI)) { 301 if (DepReg == QRI->getFrameRegister() || 302 DepReg == QRI->getStackRegister()) 303 return true; 304 } 305 306 // Check if this is a predicate dependence 307 const TargetRegisterClass* RC = QRI->getMinimalPhysRegClass(DepReg); 308 if (RC == Hexagon::PredRegsRegisterClass) { 309 return true; 310 } 311 312 // 313 // Lastly check for an operand used in an indirect call 314 // If we had an attribute for checking if an instruction is an indirect call, 315 // then we could have avoided this relatively brittle implementation of 316 // IsIndirectCall() 317 // 318 // Assumes that the first operand of the CALLr is the function address 319 // 320 if (IsIndirectCall(MI) && (DepType == SDep::Data)) { 321 MachineOperand MO = MI->getOperand(0); 322 if (MO.isReg() && MO.isUse() && (MO.getReg() == DepReg)) { 323 return true; 324 } 325 } 326 327 return false; 328} 329 330static bool IsRegDependence(const SDep::Kind DepType) { 331 return (DepType == SDep::Data || DepType == SDep::Anti || 332 DepType == SDep::Output); 333} 334 335static bool IsDirectJump(MachineInstr* MI) { 336 return (MI->getOpcode() == Hexagon::JMP); 337} 338 339static bool IsSchedBarrier(MachineInstr* MI) { 340 switch (MI->getOpcode()) { 341 case Hexagon::BARRIER: 342 return true; 343 } 344 return false; 345} 346 347static bool IsControlFlow(MachineInstr* MI) { 348 return (MI->getDesc().isTerminator() || MI->getDesc().isCall()); 349} 350 351bool HexagonPacketizerList::isNewValueInst(MachineInstr* MI) { 352 const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII; 353 if (QII->isNewValueJump(MI)) 354 return true; 355 356 if (QII->isNewValueStore(MI)) 357 return true; 358 359 return false; 360} 361 362// Function returns true if an instruction can be promoted to the new-value 363// store. It will always return false for v2 and v3. 364// It lists all the conditional and unconditional stores that can be promoted 365// to the new-value stores. 366 367bool HexagonPacketizerList::IsNewifyStore (MachineInstr* MI) { 368 const HexagonRegisterInfo* QRI = (const HexagonRegisterInfo *) TM.getRegisterInfo(); 369 switch (MI->getOpcode()) 370 { 371 // store byte 372 case Hexagon::STrib: 373 case Hexagon::STrib_indexed: 374 case Hexagon::STrib_indexed_shl_V4: 375 case Hexagon::STrib_shl_V4: 376 case Hexagon::STrib_GP_V4: 377 case Hexagon::STb_GP_V4: 378 case Hexagon::POST_STbri: 379 case Hexagon::STrib_cPt: 380 case Hexagon::STrib_cdnPt_V4: 381 case Hexagon::STrib_cNotPt: 382 case Hexagon::STrib_cdnNotPt_V4: 383 case Hexagon::STrib_indexed_cPt: 384 case Hexagon::STrib_indexed_cdnPt_V4: 385 case Hexagon::STrib_indexed_cNotPt: 386 case Hexagon::STrib_indexed_cdnNotPt_V4: 387 case Hexagon::STrib_indexed_shl_cPt_V4: 388 case Hexagon::STrib_indexed_shl_cdnPt_V4: 389 case Hexagon::STrib_indexed_shl_cNotPt_V4: 390 case Hexagon::STrib_indexed_shl_cdnNotPt_V4: 391 case Hexagon::POST_STbri_cPt: 392 case Hexagon::POST_STbri_cdnPt_V4: 393 case Hexagon::POST_STbri_cNotPt: 394 case Hexagon::POST_STbri_cdnNotPt_V4: 395 case Hexagon::STb_GP_cPt_V4: 396 case Hexagon::STb_GP_cNotPt_V4: 397 case Hexagon::STb_GP_cdnPt_V4: 398 case Hexagon::STb_GP_cdnNotPt_V4: 399 case Hexagon::STrib_GP_cPt_V4: 400 case Hexagon::STrib_GP_cNotPt_V4: 401 case Hexagon::STrib_GP_cdnPt_V4: 402 case Hexagon::STrib_GP_cdnNotPt_V4: 403 404 // store halfword 405 case Hexagon::STrih: 406 case Hexagon::STrih_indexed: 407 case Hexagon::STrih_indexed_shl_V4: 408 case Hexagon::STrih_shl_V4: 409 case Hexagon::STrih_GP_V4: 410 case Hexagon::STh_GP_V4: 411 case Hexagon::POST_SThri: 412 case Hexagon::STrih_cPt: 413 case Hexagon::STrih_cdnPt_V4: 414 case Hexagon::STrih_cNotPt: 415 case Hexagon::STrih_cdnNotPt_V4: 416 case Hexagon::STrih_indexed_cPt: 417 case Hexagon::STrih_indexed_cdnPt_V4: 418 case Hexagon::STrih_indexed_cNotPt: 419 case Hexagon::STrih_indexed_cdnNotPt_V4: 420 case Hexagon::STrih_indexed_shl_cPt_V4: 421 case Hexagon::STrih_indexed_shl_cdnPt_V4: 422 case Hexagon::STrih_indexed_shl_cNotPt_V4: 423 case Hexagon::STrih_indexed_shl_cdnNotPt_V4: 424 case Hexagon::POST_SThri_cPt: 425 case Hexagon::POST_SThri_cdnPt_V4: 426 case Hexagon::POST_SThri_cNotPt: 427 case Hexagon::POST_SThri_cdnNotPt_V4: 428 case Hexagon::STh_GP_cPt_V4: 429 case Hexagon::STh_GP_cNotPt_V4: 430 case Hexagon::STh_GP_cdnPt_V4: 431 case Hexagon::STh_GP_cdnNotPt_V4: 432 case Hexagon::STrih_GP_cPt_V4: 433 case Hexagon::STrih_GP_cNotPt_V4: 434 case Hexagon::STrih_GP_cdnPt_V4: 435 case Hexagon::STrih_GP_cdnNotPt_V4: 436 437 // store word 438 case Hexagon::STriw: 439 case Hexagon::STriw_indexed: 440 case Hexagon::STriw_indexed_shl_V4: 441 case Hexagon::STriw_shl_V4: 442 case Hexagon::STriw_GP_V4: 443 case Hexagon::STw_GP_V4: 444 case Hexagon::POST_STwri: 445 case Hexagon::STriw_cPt: 446 case Hexagon::STriw_cdnPt_V4: 447 case Hexagon::STriw_cNotPt: 448 case Hexagon::STriw_cdnNotPt_V4: 449 case Hexagon::STriw_indexed_cPt: 450 case Hexagon::STriw_indexed_cdnPt_V4: 451 case Hexagon::STriw_indexed_cNotPt: 452 case Hexagon::STriw_indexed_cdnNotPt_V4: 453 case Hexagon::STriw_indexed_shl_cPt_V4: 454 case Hexagon::STriw_indexed_shl_cdnPt_V4: 455 case Hexagon::STriw_indexed_shl_cNotPt_V4: 456 case Hexagon::STriw_indexed_shl_cdnNotPt_V4: 457 case Hexagon::POST_STwri_cPt: 458 case Hexagon::POST_STwri_cdnPt_V4: 459 case Hexagon::POST_STwri_cNotPt: 460 case Hexagon::POST_STwri_cdnNotPt_V4: 461 case Hexagon::STw_GP_cPt_V4: 462 case Hexagon::STw_GP_cNotPt_V4: 463 case Hexagon::STw_GP_cdnPt_V4: 464 case Hexagon::STw_GP_cdnNotPt_V4: 465 case Hexagon::STriw_GP_cPt_V4: 466 case Hexagon::STriw_GP_cNotPt_V4: 467 case Hexagon::STriw_GP_cdnPt_V4: 468 case Hexagon::STriw_GP_cdnNotPt_V4: 469 return QRI->Subtarget.hasV4TOps(); 470 } 471 return false; 472} 473 474static bool IsLoopN(MachineInstr *MI) { 475 return (MI->getOpcode() == Hexagon::LOOP0_i || 476 MI->getOpcode() == Hexagon::LOOP0_r); 477} 478 479/// DoesModifyCalleeSavedReg - Returns true if the instruction modifies a 480/// callee-saved register. 481static bool DoesModifyCalleeSavedReg(MachineInstr *MI, 482 const TargetRegisterInfo *TRI) { 483 for (const uint16_t *CSR = TRI->getCalleeSavedRegs(); *CSR; ++CSR) { 484 unsigned CalleeSavedReg = *CSR; 485 if (MI->modifiesRegister(CalleeSavedReg, TRI)) 486 return true; 487 } 488 return false; 489} 490 491// Return the new value instruction for a given store. 492static int GetDotNewOp(const int opc) { 493 switch (opc) { 494 default: llvm_unreachable("Unknown .new type"); 495 496 // store new value byte 497 case Hexagon::STrib: 498 return Hexagon::STrib_nv_V4; 499 500 case Hexagon::STrib_indexed: 501 return Hexagon::STrib_indexed_nv_V4; 502 503 case Hexagon::STrib_indexed_shl_V4: 504 return Hexagon::STrib_indexed_shl_nv_V4; 505 506 case Hexagon::STrib_shl_V4: 507 return Hexagon::STrib_shl_nv_V4; 508 509 case Hexagon::STrib_GP_V4: 510 return Hexagon::STrib_GP_nv_V4; 511 512 case Hexagon::STb_GP_V4: 513 return Hexagon::STb_GP_nv_V4; 514 515 case Hexagon::POST_STbri: 516 return Hexagon::POST_STbri_nv_V4; 517 518 case Hexagon::STrib_cPt: 519 return Hexagon::STrib_cPt_nv_V4; 520 521 case Hexagon::STrib_cdnPt_V4: 522 return Hexagon::STrib_cdnPt_nv_V4; 523 524 case Hexagon::STrib_cNotPt: 525 return Hexagon::STrib_cNotPt_nv_V4; 526 527 case Hexagon::STrib_cdnNotPt_V4: 528 return Hexagon::STrib_cdnNotPt_nv_V4; 529 530 case Hexagon::STrib_indexed_cPt: 531 return Hexagon::STrib_indexed_cPt_nv_V4; 532 533 case Hexagon::STrib_indexed_cdnPt_V4: 534 return Hexagon::STrib_indexed_cdnPt_nv_V4; 535 536 case Hexagon::STrib_indexed_cNotPt: 537 return Hexagon::STrib_indexed_cNotPt_nv_V4; 538 539 case Hexagon::STrib_indexed_cdnNotPt_V4: 540 return Hexagon::STrib_indexed_cdnNotPt_nv_V4; 541 542 case Hexagon::STrib_indexed_shl_cPt_V4: 543 return Hexagon::STrib_indexed_shl_cPt_nv_V4; 544 545 case Hexagon::STrib_indexed_shl_cdnPt_V4: 546 return Hexagon::STrib_indexed_shl_cdnPt_nv_V4; 547 548 case Hexagon::STrib_indexed_shl_cNotPt_V4: 549 return Hexagon::STrib_indexed_shl_cNotPt_nv_V4; 550 551 case Hexagon::STrib_indexed_shl_cdnNotPt_V4: 552 return Hexagon::STrib_indexed_shl_cdnNotPt_nv_V4; 553 554 case Hexagon::POST_STbri_cPt: 555 return Hexagon::POST_STbri_cPt_nv_V4; 556 557 case Hexagon::POST_STbri_cdnPt_V4: 558 return Hexagon::POST_STbri_cdnPt_nv_V4; 559 560 case Hexagon::POST_STbri_cNotPt: 561 return Hexagon::POST_STbri_cNotPt_nv_V4; 562 563 case Hexagon::POST_STbri_cdnNotPt_V4: 564 return Hexagon::POST_STbri_cdnNotPt_nv_V4; 565 566 case Hexagon::STb_GP_cPt_V4: 567 return Hexagon::STb_GP_cPt_nv_V4; 568 569 case Hexagon::STb_GP_cNotPt_V4: 570 return Hexagon::STb_GP_cNotPt_nv_V4; 571 572 case Hexagon::STb_GP_cdnPt_V4: 573 return Hexagon::STb_GP_cdnPt_nv_V4; 574 575 case Hexagon::STb_GP_cdnNotPt_V4: 576 return Hexagon::STb_GP_cdnNotPt_nv_V4; 577 578 case Hexagon::STrib_GP_cPt_V4: 579 return Hexagon::STrib_GP_cPt_nv_V4; 580 581 case Hexagon::STrib_GP_cNotPt_V4: 582 return Hexagon::STrib_GP_cNotPt_nv_V4; 583 584 case Hexagon::STrib_GP_cdnPt_V4: 585 return Hexagon::STrib_GP_cdnPt_nv_V4; 586 587 case Hexagon::STrib_GP_cdnNotPt_V4: 588 return Hexagon::STrib_GP_cdnNotPt_nv_V4; 589 590 // store new value halfword 591 case Hexagon::STrih: 592 return Hexagon::STrih_nv_V4; 593 594 case Hexagon::STrih_indexed: 595 return Hexagon::STrih_indexed_nv_V4; 596 597 case Hexagon::STrih_indexed_shl_V4: 598 return Hexagon::STrih_indexed_shl_nv_V4; 599 600 case Hexagon::STrih_shl_V4: 601 return Hexagon::STrih_shl_nv_V4; 602 603 case Hexagon::STrih_GP_V4: 604 return Hexagon::STrih_GP_nv_V4; 605 606 case Hexagon::STh_GP_V4: 607 return Hexagon::STh_GP_nv_V4; 608 609 case Hexagon::POST_SThri: 610 return Hexagon::POST_SThri_nv_V4; 611 612 case Hexagon::STrih_cPt: 613 return Hexagon::STrih_cPt_nv_V4; 614 615 case Hexagon::STrih_cdnPt_V4: 616 return Hexagon::STrih_cdnPt_nv_V4; 617 618 case Hexagon::STrih_cNotPt: 619 return Hexagon::STrih_cNotPt_nv_V4; 620 621 case Hexagon::STrih_cdnNotPt_V4: 622 return Hexagon::STrih_cdnNotPt_nv_V4; 623 624 case Hexagon::STrih_indexed_cPt: 625 return Hexagon::STrih_indexed_cPt_nv_V4; 626 627 case Hexagon::STrih_indexed_cdnPt_V4: 628 return Hexagon::STrih_indexed_cdnPt_nv_V4; 629 630 case Hexagon::STrih_indexed_cNotPt: 631 return Hexagon::STrih_indexed_cNotPt_nv_V4; 632 633 case Hexagon::STrih_indexed_cdnNotPt_V4: 634 return Hexagon::STrih_indexed_cdnNotPt_nv_V4; 635 636 case Hexagon::STrih_indexed_shl_cPt_V4: 637 return Hexagon::STrih_indexed_shl_cPt_nv_V4; 638 639 case Hexagon::STrih_indexed_shl_cdnPt_V4: 640 return Hexagon::STrih_indexed_shl_cdnPt_nv_V4; 641 642 case Hexagon::STrih_indexed_shl_cNotPt_V4: 643 return Hexagon::STrih_indexed_shl_cNotPt_nv_V4; 644 645 case Hexagon::STrih_indexed_shl_cdnNotPt_V4: 646 return Hexagon::STrih_indexed_shl_cdnNotPt_nv_V4; 647 648 case Hexagon::POST_SThri_cPt: 649 return Hexagon::POST_SThri_cPt_nv_V4; 650 651 case Hexagon::POST_SThri_cdnPt_V4: 652 return Hexagon::POST_SThri_cdnPt_nv_V4; 653 654 case Hexagon::POST_SThri_cNotPt: 655 return Hexagon::POST_SThri_cNotPt_nv_V4; 656 657 case Hexagon::POST_SThri_cdnNotPt_V4: 658 return Hexagon::POST_SThri_cdnNotPt_nv_V4; 659 660 case Hexagon::STh_GP_cPt_V4: 661 return Hexagon::STh_GP_cPt_nv_V4; 662 663 case Hexagon::STh_GP_cNotPt_V4: 664 return Hexagon::STh_GP_cNotPt_nv_V4; 665 666 case Hexagon::STh_GP_cdnPt_V4: 667 return Hexagon::STh_GP_cdnPt_nv_V4; 668 669 case Hexagon::STh_GP_cdnNotPt_V4: 670 return Hexagon::STh_GP_cdnNotPt_nv_V4; 671 672 case Hexagon::STrih_GP_cPt_V4: 673 return Hexagon::STrih_GP_cPt_nv_V4; 674 675 case Hexagon::STrih_GP_cNotPt_V4: 676 return Hexagon::STrih_GP_cNotPt_nv_V4; 677 678 case Hexagon::STrih_GP_cdnPt_V4: 679 return Hexagon::STrih_GP_cdnPt_nv_V4; 680 681 case Hexagon::STrih_GP_cdnNotPt_V4: 682 return Hexagon::STrih_GP_cdnNotPt_nv_V4; 683 684 // store new value word 685 case Hexagon::STriw: 686 return Hexagon::STriw_nv_V4; 687 688 case Hexagon::STriw_indexed: 689 return Hexagon::STriw_indexed_nv_V4; 690 691 case Hexagon::STriw_indexed_shl_V4: 692 return Hexagon::STriw_indexed_shl_nv_V4; 693 694 case Hexagon::STriw_shl_V4: 695 return Hexagon::STriw_shl_nv_V4; 696 697 case Hexagon::STriw_GP_V4: 698 return Hexagon::STriw_GP_nv_V4; 699 700 case Hexagon::STw_GP_V4: 701 return Hexagon::STw_GP_nv_V4; 702 703 case Hexagon::POST_STwri: 704 return Hexagon::POST_STwri_nv_V4; 705 706 case Hexagon::STriw_cPt: 707 return Hexagon::STriw_cPt_nv_V4; 708 709 case Hexagon::STriw_cdnPt_V4: 710 return Hexagon::STriw_cdnPt_nv_V4; 711 712 case Hexagon::STriw_cNotPt: 713 return Hexagon::STriw_cNotPt_nv_V4; 714 715 case Hexagon::STriw_cdnNotPt_V4: 716 return Hexagon::STriw_cdnNotPt_nv_V4; 717 718 case Hexagon::STriw_indexed_cPt: 719 return Hexagon::STriw_indexed_cPt_nv_V4; 720 721 case Hexagon::STriw_indexed_cdnPt_V4: 722 return Hexagon::STriw_indexed_cdnPt_nv_V4; 723 724 case Hexagon::STriw_indexed_cNotPt: 725 return Hexagon::STriw_indexed_cNotPt_nv_V4; 726 727 case Hexagon::STriw_indexed_cdnNotPt_V4: 728 return Hexagon::STriw_indexed_cdnNotPt_nv_V4; 729 730 case Hexagon::STriw_indexed_shl_cPt_V4: 731 return Hexagon::STriw_indexed_shl_cPt_nv_V4; 732 733 case Hexagon::STriw_indexed_shl_cdnPt_V4: 734 return Hexagon::STriw_indexed_shl_cdnPt_nv_V4; 735 736 case Hexagon::STriw_indexed_shl_cNotPt_V4: 737 return Hexagon::STriw_indexed_shl_cNotPt_nv_V4; 738 739 case Hexagon::STriw_indexed_shl_cdnNotPt_V4: 740 return Hexagon::STriw_indexed_shl_cdnNotPt_nv_V4; 741 742 case Hexagon::POST_STwri_cPt: 743 return Hexagon::POST_STwri_cPt_nv_V4; 744 745 case Hexagon::POST_STwri_cdnPt_V4: 746 return Hexagon::POST_STwri_cdnPt_nv_V4; 747 748 case Hexagon::POST_STwri_cNotPt: 749 return Hexagon::POST_STwri_cNotPt_nv_V4; 750 751 case Hexagon::POST_STwri_cdnNotPt_V4: 752 return Hexagon::POST_STwri_cdnNotPt_nv_V4; 753 754 case Hexagon::STw_GP_cPt_V4: 755 return Hexagon::STw_GP_cPt_nv_V4; 756 757 case Hexagon::STw_GP_cNotPt_V4: 758 return Hexagon::STw_GP_cNotPt_nv_V4; 759 760 case Hexagon::STw_GP_cdnPt_V4: 761 return Hexagon::STw_GP_cdnPt_nv_V4; 762 763 case Hexagon::STw_GP_cdnNotPt_V4: 764 return Hexagon::STw_GP_cdnNotPt_nv_V4; 765 766 case Hexagon::STriw_GP_cPt_V4: 767 return Hexagon::STriw_GP_cPt_nv_V4; 768 769 case Hexagon::STriw_GP_cNotPt_V4: 770 return Hexagon::STriw_GP_cNotPt_nv_V4; 771 772 case Hexagon::STriw_GP_cdnPt_V4: 773 return Hexagon::STriw_GP_cdnPt_nv_V4; 774 775 case Hexagon::STriw_GP_cdnNotPt_V4: 776 return Hexagon::STriw_GP_cdnNotPt_nv_V4; 777 } 778} 779 780// Return .new predicate version for an instruction 781static int GetDotNewPredOp(const int opc) { 782 switch (opc) { 783 default: llvm_unreachable("Unknown .new type"); 784 785 // Conditional stores 786 // Store byte conditionally 787 case Hexagon::STrib_cPt : 788 return Hexagon::STrib_cdnPt_V4; 789 790 case Hexagon::STrib_cNotPt : 791 return Hexagon::STrib_cdnNotPt_V4; 792 793 case Hexagon::STrib_indexed_cPt : 794 return Hexagon::STrib_indexed_cdnPt_V4; 795 796 case Hexagon::STrib_indexed_cNotPt : 797 return Hexagon::STrib_indexed_cdnNotPt_V4; 798 799 case Hexagon::STrib_imm_cPt_V4 : 800 return Hexagon::STrib_imm_cdnPt_V4; 801 802 case Hexagon::STrib_imm_cNotPt_V4 : 803 return Hexagon::STrib_imm_cdnNotPt_V4; 804 805 case Hexagon::POST_STbri_cPt : 806 return Hexagon::POST_STbri_cdnPt_V4; 807 808 case Hexagon::POST_STbri_cNotPt : 809 return Hexagon::POST_STbri_cdnNotPt_V4; 810 811 case Hexagon::STrib_indexed_shl_cPt_V4 : 812 return Hexagon::STrib_indexed_shl_cdnPt_V4; 813 814 case Hexagon::STrib_indexed_shl_cNotPt_V4 : 815 return Hexagon::STrib_indexed_shl_cdnNotPt_V4; 816 817 case Hexagon::STb_GP_cPt_V4 : 818 return Hexagon::STb_GP_cdnPt_V4; 819 820 case Hexagon::STb_GP_cNotPt_V4 : 821 return Hexagon::STb_GP_cdnNotPt_V4; 822 823 case Hexagon::STrib_GP_cPt_V4 : 824 return Hexagon::STrib_GP_cdnPt_V4; 825 826 case Hexagon::STrib_GP_cNotPt_V4 : 827 return Hexagon::STrib_GP_cdnNotPt_V4; 828 829 // Store doubleword conditionally 830 case Hexagon::STrid_cPt : 831 return Hexagon::STrid_cdnPt_V4; 832 833 case Hexagon::STrid_cNotPt : 834 return Hexagon::STrid_cdnNotPt_V4; 835 836 case Hexagon::STrid_indexed_cPt : 837 return Hexagon::STrid_indexed_cdnPt_V4; 838 839 case Hexagon::STrid_indexed_cNotPt : 840 return Hexagon::STrid_indexed_cdnNotPt_V4; 841 842 case Hexagon::STrid_indexed_shl_cPt_V4 : 843 return Hexagon::STrid_indexed_shl_cdnPt_V4; 844 845 case Hexagon::STrid_indexed_shl_cNotPt_V4 : 846 return Hexagon::STrid_indexed_shl_cdnNotPt_V4; 847 848 case Hexagon::POST_STdri_cPt : 849 return Hexagon::POST_STdri_cdnPt_V4; 850 851 case Hexagon::POST_STdri_cNotPt : 852 return Hexagon::POST_STdri_cdnNotPt_V4; 853 854 case Hexagon::STd_GP_cPt_V4 : 855 return Hexagon::STd_GP_cdnPt_V4; 856 857 case Hexagon::STd_GP_cNotPt_V4 : 858 return Hexagon::STd_GP_cdnNotPt_V4; 859 860 case Hexagon::STrid_GP_cPt_V4 : 861 return Hexagon::STrid_GP_cdnPt_V4; 862 863 case Hexagon::STrid_GP_cNotPt_V4 : 864 return Hexagon::STrid_GP_cdnNotPt_V4; 865 866 // Store halfword conditionally 867 case Hexagon::STrih_cPt : 868 return Hexagon::STrih_cdnPt_V4; 869 870 case Hexagon::STrih_cNotPt : 871 return Hexagon::STrih_cdnNotPt_V4; 872 873 case Hexagon::STrih_indexed_cPt : 874 return Hexagon::STrih_indexed_cdnPt_V4; 875 876 case Hexagon::STrih_indexed_cNotPt : 877 return Hexagon::STrih_indexed_cdnNotPt_V4; 878 879 case Hexagon::STrih_imm_cPt_V4 : 880 return Hexagon::STrih_imm_cdnPt_V4; 881 882 case Hexagon::STrih_imm_cNotPt_V4 : 883 return Hexagon::STrih_imm_cdnNotPt_V4; 884 885 case Hexagon::STrih_indexed_shl_cPt_V4 : 886 return Hexagon::STrih_indexed_shl_cdnPt_V4; 887 888 case Hexagon::STrih_indexed_shl_cNotPt_V4 : 889 return Hexagon::STrih_indexed_shl_cdnNotPt_V4; 890 891 case Hexagon::POST_SThri_cPt : 892 return Hexagon::POST_SThri_cdnPt_V4; 893 894 case Hexagon::POST_SThri_cNotPt : 895 return Hexagon::POST_SThri_cdnNotPt_V4; 896 897 case Hexagon::STh_GP_cPt_V4 : 898 return Hexagon::STh_GP_cdnPt_V4; 899 900 case Hexagon::STh_GP_cNotPt_V4 : 901 return Hexagon::STh_GP_cdnNotPt_V4; 902 903 case Hexagon::STrih_GP_cPt_V4 : 904 return Hexagon::STrih_GP_cdnPt_V4; 905 906 case Hexagon::STrih_GP_cNotPt_V4 : 907 return Hexagon::STrih_GP_cdnNotPt_V4; 908 909 // Store word conditionally 910 case Hexagon::STriw_cPt : 911 return Hexagon::STriw_cdnPt_V4; 912 913 case Hexagon::STriw_cNotPt : 914 return Hexagon::STriw_cdnNotPt_V4; 915 916 case Hexagon::STriw_indexed_cPt : 917 return Hexagon::STriw_indexed_cdnPt_V4; 918 919 case Hexagon::STriw_indexed_cNotPt : 920 return Hexagon::STriw_indexed_cdnNotPt_V4; 921 922 case Hexagon::STriw_imm_cPt_V4 : 923 return Hexagon::STriw_imm_cdnPt_V4; 924 925 case Hexagon::STriw_imm_cNotPt_V4 : 926 return Hexagon::STriw_imm_cdnNotPt_V4; 927 928 case Hexagon::STriw_indexed_shl_cPt_V4 : 929 return Hexagon::STriw_indexed_shl_cdnPt_V4; 930 931 case Hexagon::STriw_indexed_shl_cNotPt_V4 : 932 return Hexagon::STriw_indexed_shl_cdnNotPt_V4; 933 934 case Hexagon::POST_STwri_cPt : 935 return Hexagon::POST_STwri_cdnPt_V4; 936 937 case Hexagon::POST_STwri_cNotPt : 938 return Hexagon::POST_STwri_cdnNotPt_V4; 939 940 case Hexagon::STw_GP_cPt_V4 : 941 return Hexagon::STw_GP_cdnPt_V4; 942 943 case Hexagon::STw_GP_cNotPt_V4 : 944 return Hexagon::STw_GP_cdnNotPt_V4; 945 946 case Hexagon::STriw_GP_cPt_V4 : 947 return Hexagon::STriw_GP_cdnPt_V4; 948 949 case Hexagon::STriw_GP_cNotPt_V4 : 950 return Hexagon::STriw_GP_cdnNotPt_V4; 951 952 // Condtional Jumps 953 case Hexagon::JMP_c: 954 return Hexagon::JMP_cdnPt; 955 956 case Hexagon::JMP_cNot: 957 return Hexagon::JMP_cdnNotPt; 958 959 case Hexagon::JMPR_cPt: 960 return Hexagon::JMPR_cdnPt_V3; 961 962 case Hexagon::JMPR_cNotPt: 963 return Hexagon::JMPR_cdnNotPt_V3; 964 965 // Conditional Transfers 966 case Hexagon::TFR_cPt: 967 return Hexagon::TFR_cdnPt; 968 969 case Hexagon::TFR_cNotPt: 970 return Hexagon::TFR_cdnNotPt; 971 972 case Hexagon::TFRI_cPt: 973 return Hexagon::TFRI_cdnPt; 974 975 case Hexagon::TFRI_cNotPt: 976 return Hexagon::TFRI_cdnNotPt; 977 978 // Load double word 979 case Hexagon::LDrid_cPt : 980 return Hexagon::LDrid_cdnPt; 981 982 case Hexagon::LDrid_cNotPt : 983 return Hexagon::LDrid_cdnNotPt; 984 985 case Hexagon::LDrid_indexed_cPt : 986 return Hexagon::LDrid_indexed_cdnPt; 987 988 case Hexagon::LDrid_indexed_cNotPt : 989 return Hexagon::LDrid_indexed_cdnNotPt; 990 991 case Hexagon::POST_LDrid_cPt : 992 return Hexagon::POST_LDrid_cdnPt_V4; 993 994 case Hexagon::POST_LDrid_cNotPt : 995 return Hexagon::POST_LDrid_cdnNotPt_V4; 996 997 // Load word 998 case Hexagon::LDriw_cPt : 999 return Hexagon::LDriw_cdnPt; 1000 1001 case Hexagon::LDriw_cNotPt : 1002 return Hexagon::LDriw_cdnNotPt; 1003 1004 case Hexagon::LDriw_indexed_cPt : 1005 return Hexagon::LDriw_indexed_cdnPt; 1006 1007 case Hexagon::LDriw_indexed_cNotPt : 1008 return Hexagon::LDriw_indexed_cdnNotPt; 1009 1010 case Hexagon::POST_LDriw_cPt : 1011 return Hexagon::POST_LDriw_cdnPt_V4; 1012 1013 case Hexagon::POST_LDriw_cNotPt : 1014 return Hexagon::POST_LDriw_cdnNotPt_V4; 1015 1016 // Load halfword 1017 case Hexagon::LDrih_cPt : 1018 return Hexagon::LDrih_cdnPt; 1019 1020 case Hexagon::LDrih_cNotPt : 1021 return Hexagon::LDrih_cdnNotPt; 1022 1023 case Hexagon::LDrih_indexed_cPt : 1024 return Hexagon::LDrih_indexed_cdnPt; 1025 1026 case Hexagon::LDrih_indexed_cNotPt : 1027 return Hexagon::LDrih_indexed_cdnNotPt; 1028 1029 case Hexagon::POST_LDrih_cPt : 1030 return Hexagon::POST_LDrih_cdnPt_V4; 1031 1032 case Hexagon::POST_LDrih_cNotPt : 1033 return Hexagon::POST_LDrih_cdnNotPt_V4; 1034 1035 // Load byte 1036 case Hexagon::LDrib_cPt : 1037 return Hexagon::LDrib_cdnPt; 1038 1039 case Hexagon::LDrib_cNotPt : 1040 return Hexagon::LDrib_cdnNotPt; 1041 1042 case Hexagon::LDrib_indexed_cPt : 1043 return Hexagon::LDrib_indexed_cdnPt; 1044 1045 case Hexagon::LDrib_indexed_cNotPt : 1046 return Hexagon::LDrib_indexed_cdnNotPt; 1047 1048 case Hexagon::POST_LDrib_cPt : 1049 return Hexagon::POST_LDrib_cdnPt_V4; 1050 1051 case Hexagon::POST_LDrib_cNotPt : 1052 return Hexagon::POST_LDrib_cdnNotPt_V4; 1053 1054 // Load unsigned halfword 1055 case Hexagon::LDriuh_cPt : 1056 return Hexagon::LDriuh_cdnPt; 1057 1058 case Hexagon::LDriuh_cNotPt : 1059 return Hexagon::LDriuh_cdnNotPt; 1060 1061 case Hexagon::LDriuh_indexed_cPt : 1062 return Hexagon::LDriuh_indexed_cdnPt; 1063 1064 case Hexagon::LDriuh_indexed_cNotPt : 1065 return Hexagon::LDriuh_indexed_cdnNotPt; 1066 1067 case Hexagon::POST_LDriuh_cPt : 1068 return Hexagon::POST_LDriuh_cdnPt_V4; 1069 1070 case Hexagon::POST_LDriuh_cNotPt : 1071 return Hexagon::POST_LDriuh_cdnNotPt_V4; 1072 1073 // Load unsigned byte 1074 case Hexagon::LDriub_cPt : 1075 return Hexagon::LDriub_cdnPt; 1076 1077 case Hexagon::LDriub_cNotPt : 1078 return Hexagon::LDriub_cdnNotPt; 1079 1080 case Hexagon::LDriub_indexed_cPt : 1081 return Hexagon::LDriub_indexed_cdnPt; 1082 1083 case Hexagon::LDriub_indexed_cNotPt : 1084 return Hexagon::LDriub_indexed_cdnNotPt; 1085 1086 case Hexagon::POST_LDriub_cPt : 1087 return Hexagon::POST_LDriub_cdnPt_V4; 1088 1089 case Hexagon::POST_LDriub_cNotPt : 1090 return Hexagon::POST_LDriub_cdnNotPt_V4; 1091 1092 // V4 indexed+scaled load 1093 1094 case Hexagon::LDrid_indexed_cPt_V4 : 1095 return Hexagon::LDrid_indexed_cdnPt_V4; 1096 1097 case Hexagon::LDrid_indexed_cNotPt_V4 : 1098 return Hexagon::LDrid_indexed_cdnNotPt_V4; 1099 1100 case Hexagon::LDrid_indexed_shl_cPt_V4 : 1101 return Hexagon::LDrid_indexed_shl_cdnPt_V4; 1102 1103 case Hexagon::LDrid_indexed_shl_cNotPt_V4 : 1104 return Hexagon::LDrid_indexed_shl_cdnNotPt_V4; 1105 1106 case Hexagon::LDrib_indexed_cPt_V4 : 1107 return Hexagon::LDrib_indexed_cdnPt_V4; 1108 1109 case Hexagon::LDrib_indexed_cNotPt_V4 : 1110 return Hexagon::LDrib_indexed_cdnNotPt_V4; 1111 1112 case Hexagon::LDrib_indexed_shl_cPt_V4 : 1113 return Hexagon::LDrib_indexed_shl_cdnPt_V4; 1114 1115 case Hexagon::LDrib_indexed_shl_cNotPt_V4 : 1116 return Hexagon::LDrib_indexed_shl_cdnNotPt_V4; 1117 1118 case Hexagon::LDriub_indexed_cPt_V4 : 1119 return Hexagon::LDriub_indexed_cdnPt_V4; 1120 1121 case Hexagon::LDriub_indexed_cNotPt_V4 : 1122 return Hexagon::LDriub_indexed_cdnNotPt_V4; 1123 1124 case Hexagon::LDriub_indexed_shl_cPt_V4 : 1125 return Hexagon::LDriub_indexed_shl_cdnPt_V4; 1126 1127 case Hexagon::LDriub_indexed_shl_cNotPt_V4 : 1128 return Hexagon::LDriub_indexed_shl_cdnNotPt_V4; 1129 1130 case Hexagon::LDrih_indexed_cPt_V4 : 1131 return Hexagon::LDrih_indexed_cdnPt_V4; 1132 1133 case Hexagon::LDrih_indexed_cNotPt_V4 : 1134 return Hexagon::LDrih_indexed_cdnNotPt_V4; 1135 1136 case Hexagon::LDrih_indexed_shl_cPt_V4 : 1137 return Hexagon::LDrih_indexed_shl_cdnPt_V4; 1138 1139 case Hexagon::LDrih_indexed_shl_cNotPt_V4 : 1140 return Hexagon::LDrih_indexed_shl_cdnNotPt_V4; 1141 1142 case Hexagon::LDriuh_indexed_cPt_V4 : 1143 return Hexagon::LDriuh_indexed_cdnPt_V4; 1144 1145 case Hexagon::LDriuh_indexed_cNotPt_V4 : 1146 return Hexagon::LDriuh_indexed_cdnNotPt_V4; 1147 1148 case Hexagon::LDriuh_indexed_shl_cPt_V4 : 1149 return Hexagon::LDriuh_indexed_shl_cdnPt_V4; 1150 1151 case Hexagon::LDriuh_indexed_shl_cNotPt_V4 : 1152 return Hexagon::LDriuh_indexed_shl_cdnNotPt_V4; 1153 1154 case Hexagon::LDriw_indexed_cPt_V4 : 1155 return Hexagon::LDriw_indexed_cdnPt_V4; 1156 1157 case Hexagon::LDriw_indexed_cNotPt_V4 : 1158 return Hexagon::LDriw_indexed_cdnNotPt_V4; 1159 1160 case Hexagon::LDriw_indexed_shl_cPt_V4 : 1161 return Hexagon::LDriw_indexed_shl_cdnPt_V4; 1162 1163 case Hexagon::LDriw_indexed_shl_cNotPt_V4 : 1164 return Hexagon::LDriw_indexed_shl_cdnNotPt_V4; 1165 1166 // V4 global address load 1167 1168 case Hexagon::LDd_GP_cPt_V4: 1169 return Hexagon::LDd_GP_cdnPt_V4; 1170 1171 case Hexagon::LDd_GP_cNotPt_V4: 1172 return Hexagon::LDd_GP_cdnNotPt_V4; 1173 1174 case Hexagon::LDb_GP_cPt_V4: 1175 return Hexagon::LDb_GP_cdnPt_V4; 1176 1177 case Hexagon::LDb_GP_cNotPt_V4: 1178 return Hexagon::LDb_GP_cdnNotPt_V4; 1179 1180 case Hexagon::LDub_GP_cPt_V4: 1181 return Hexagon::LDub_GP_cdnPt_V4; 1182 1183 case Hexagon::LDub_GP_cNotPt_V4: 1184 return Hexagon::LDub_GP_cdnNotPt_V4; 1185 1186 case Hexagon::LDh_GP_cPt_V4: 1187 return Hexagon::LDh_GP_cdnPt_V4; 1188 1189 case Hexagon::LDh_GP_cNotPt_V4: 1190 return Hexagon::LDh_GP_cdnNotPt_V4; 1191 1192 case Hexagon::LDuh_GP_cPt_V4: 1193 return Hexagon::LDuh_GP_cdnPt_V4; 1194 1195 case Hexagon::LDuh_GP_cNotPt_V4: 1196 return Hexagon::LDuh_GP_cdnNotPt_V4; 1197 1198 case Hexagon::LDw_GP_cPt_V4: 1199 return Hexagon::LDw_GP_cdnPt_V4; 1200 1201 case Hexagon::LDw_GP_cNotPt_V4: 1202 return Hexagon::LDw_GP_cdnNotPt_V4; 1203 1204 case Hexagon::LDrid_GP_cPt_V4: 1205 return Hexagon::LDrid_GP_cdnPt_V4; 1206 1207 case Hexagon::LDrid_GP_cNotPt_V4: 1208 return Hexagon::LDrid_GP_cdnNotPt_V4; 1209 1210 case Hexagon::LDrib_GP_cPt_V4: 1211 return Hexagon::LDrib_GP_cdnPt_V4; 1212 1213 case Hexagon::LDrib_GP_cNotPt_V4: 1214 return Hexagon::LDrib_GP_cdnNotPt_V4; 1215 1216 case Hexagon::LDriub_GP_cPt_V4: 1217 return Hexagon::LDriub_GP_cdnPt_V4; 1218 1219 case Hexagon::LDriub_GP_cNotPt_V4: 1220 return Hexagon::LDriub_GP_cdnNotPt_V4; 1221 1222 case Hexagon::LDrih_GP_cPt_V4: 1223 return Hexagon::LDrih_GP_cdnPt_V4; 1224 1225 case Hexagon::LDrih_GP_cNotPt_V4: 1226 return Hexagon::LDrih_GP_cdnNotPt_V4; 1227 1228 case Hexagon::LDriuh_GP_cPt_V4: 1229 return Hexagon::LDriuh_GP_cdnPt_V4; 1230 1231 case Hexagon::LDriuh_GP_cNotPt_V4: 1232 return Hexagon::LDriuh_GP_cdnNotPt_V4; 1233 1234 case Hexagon::LDriw_GP_cPt_V4: 1235 return Hexagon::LDriw_GP_cdnPt_V4; 1236 1237 case Hexagon::LDriw_GP_cNotPt_V4: 1238 return Hexagon::LDriw_GP_cdnNotPt_V4; 1239 1240 // Conditional store new-value byte 1241 case Hexagon::STrib_cPt_nv_V4 : 1242 return Hexagon::STrib_cdnPt_nv_V4; 1243 case Hexagon::STrib_cNotPt_nv_V4 : 1244 return Hexagon::STrib_cdnNotPt_nv_V4; 1245 1246 case Hexagon::STrib_indexed_cPt_nv_V4 : 1247 return Hexagon::STrib_indexed_cdnPt_nv_V4; 1248 case Hexagon::STrib_indexed_cNotPt_nv_V4 : 1249 return Hexagon::STrib_indexed_cdnNotPt_nv_V4; 1250 1251 case Hexagon::STrib_indexed_shl_cPt_nv_V4 : 1252 return Hexagon::STrib_indexed_shl_cdnPt_nv_V4; 1253 case Hexagon::STrib_indexed_shl_cNotPt_nv_V4 : 1254 return Hexagon::STrib_indexed_shl_cdnNotPt_nv_V4; 1255 1256 case Hexagon::POST_STbri_cPt_nv_V4 : 1257 return Hexagon::POST_STbri_cdnPt_nv_V4; 1258 case Hexagon::POST_STbri_cNotPt_nv_V4 : 1259 return Hexagon::POST_STbri_cdnNotPt_nv_V4; 1260 1261 case Hexagon::STb_GP_cPt_nv_V4 : 1262 return Hexagon::STb_GP_cdnPt_nv_V4; 1263 1264 case Hexagon::STb_GP_cNotPt_nv_V4 : 1265 return Hexagon::STb_GP_cdnNotPt_nv_V4; 1266 1267 case Hexagon::STrib_GP_cPt_nv_V4 : 1268 return Hexagon::STrib_GP_cdnPt_nv_V4; 1269 1270 case Hexagon::STrib_GP_cNotPt_nv_V4 : 1271 return Hexagon::STrib_GP_cdnNotPt_nv_V4; 1272 1273 // Conditional store new-value halfword 1274 case Hexagon::STrih_cPt_nv_V4 : 1275 return Hexagon::STrih_cdnPt_nv_V4; 1276 case Hexagon::STrih_cNotPt_nv_V4 : 1277 return Hexagon::STrih_cdnNotPt_nv_V4; 1278 1279 case Hexagon::STrih_indexed_cPt_nv_V4 : 1280 return Hexagon::STrih_indexed_cdnPt_nv_V4; 1281 case Hexagon::STrih_indexed_cNotPt_nv_V4 : 1282 return Hexagon::STrih_indexed_cdnNotPt_nv_V4; 1283 1284 case Hexagon::STrih_indexed_shl_cPt_nv_V4 : 1285 return Hexagon::STrih_indexed_shl_cdnPt_nv_V4; 1286 case Hexagon::STrih_indexed_shl_cNotPt_nv_V4 : 1287 return Hexagon::STrih_indexed_shl_cdnNotPt_nv_V4; 1288 1289 case Hexagon::POST_SThri_cPt_nv_V4 : 1290 return Hexagon::POST_SThri_cdnPt_nv_V4; 1291 case Hexagon::POST_SThri_cNotPt_nv_V4 : 1292 return Hexagon::POST_SThri_cdnNotPt_nv_V4; 1293 1294 case Hexagon::STh_GP_cPt_nv_V4 : 1295 return Hexagon::STh_GP_cdnPt_nv_V4; 1296 1297 case Hexagon::STh_GP_cNotPt_nv_V4 : 1298 return Hexagon::STh_GP_cdnNotPt_nv_V4; 1299 1300 case Hexagon::STrih_GP_cPt_nv_V4 : 1301 return Hexagon::STrih_GP_cdnPt_nv_V4; 1302 1303 case Hexagon::STrih_GP_cNotPt_nv_V4 : 1304 return Hexagon::STrih_GP_cdnNotPt_nv_V4; 1305 1306 // Conditional store new-value word 1307 case Hexagon::STriw_cPt_nv_V4 : 1308 return Hexagon::STriw_cdnPt_nv_V4; 1309 case Hexagon::STriw_cNotPt_nv_V4 : 1310 return Hexagon::STriw_cdnNotPt_nv_V4; 1311 1312 case Hexagon::STriw_indexed_cPt_nv_V4 : 1313 return Hexagon::STriw_indexed_cdnPt_nv_V4; 1314 case Hexagon::STriw_indexed_cNotPt_nv_V4 : 1315 return Hexagon::STriw_indexed_cdnNotPt_nv_V4; 1316 1317 case Hexagon::STriw_indexed_shl_cPt_nv_V4 : 1318 return Hexagon::STriw_indexed_shl_cdnPt_nv_V4; 1319 case Hexagon::STriw_indexed_shl_cNotPt_nv_V4 : 1320 return Hexagon::STriw_indexed_shl_cdnNotPt_nv_V4; 1321 1322 case Hexagon::POST_STwri_cPt_nv_V4 : 1323 return Hexagon::POST_STwri_cdnPt_nv_V4; 1324 case Hexagon::POST_STwri_cNotPt_nv_V4: 1325 return Hexagon::POST_STwri_cdnNotPt_nv_V4; 1326 1327 case Hexagon::STw_GP_cPt_nv_V4 : 1328 return Hexagon::STw_GP_cdnPt_nv_V4; 1329 1330 case Hexagon::STw_GP_cNotPt_nv_V4 : 1331 return Hexagon::STw_GP_cdnNotPt_nv_V4; 1332 1333 case Hexagon::STriw_GP_cPt_nv_V4 : 1334 return Hexagon::STriw_GP_cdnPt_nv_V4; 1335 1336 case Hexagon::STriw_GP_cNotPt_nv_V4 : 1337 return Hexagon::STriw_GP_cdnNotPt_nv_V4; 1338 1339 // Conditional add 1340 case Hexagon::ADD_ri_cPt : 1341 return Hexagon::ADD_ri_cdnPt; 1342 case Hexagon::ADD_ri_cNotPt : 1343 return Hexagon::ADD_ri_cdnNotPt; 1344 1345 case Hexagon::ADD_rr_cPt : 1346 return Hexagon::ADD_rr_cdnPt; 1347 case Hexagon::ADD_rr_cNotPt : 1348 return Hexagon::ADD_rr_cdnNotPt; 1349 1350 // Conditional logical Operations 1351 case Hexagon::XOR_rr_cPt : 1352 return Hexagon::XOR_rr_cdnPt; 1353 case Hexagon::XOR_rr_cNotPt : 1354 return Hexagon::XOR_rr_cdnNotPt; 1355 1356 case Hexagon::AND_rr_cPt : 1357 return Hexagon::AND_rr_cdnPt; 1358 case Hexagon::AND_rr_cNotPt : 1359 return Hexagon::AND_rr_cdnNotPt; 1360 1361 case Hexagon::OR_rr_cPt : 1362 return Hexagon::OR_rr_cdnPt; 1363 case Hexagon::OR_rr_cNotPt : 1364 return Hexagon::OR_rr_cdnNotPt; 1365 1366 // Conditional Subtract 1367 case Hexagon::SUB_rr_cPt : 1368 return Hexagon::SUB_rr_cdnPt; 1369 case Hexagon::SUB_rr_cNotPt : 1370 return Hexagon::SUB_rr_cdnNotPt; 1371 1372 // Conditional combine 1373 case Hexagon::COMBINE_rr_cPt : 1374 return Hexagon::COMBINE_rr_cdnPt; 1375 case Hexagon::COMBINE_rr_cNotPt : 1376 return Hexagon::COMBINE_rr_cdnNotPt; 1377 1378 case Hexagon::ASLH_cPt_V4 : 1379 return Hexagon::ASLH_cdnPt_V4; 1380 case Hexagon::ASLH_cNotPt_V4 : 1381 return Hexagon::ASLH_cdnNotPt_V4; 1382 1383 case Hexagon::ASRH_cPt_V4 : 1384 return Hexagon::ASRH_cdnPt_V4; 1385 case Hexagon::ASRH_cNotPt_V4 : 1386 return Hexagon::ASRH_cdnNotPt_V4; 1387 1388 case Hexagon::SXTB_cPt_V4 : 1389 return Hexagon::SXTB_cdnPt_V4; 1390 case Hexagon::SXTB_cNotPt_V4 : 1391 return Hexagon::SXTB_cdnNotPt_V4; 1392 1393 case Hexagon::SXTH_cPt_V4 : 1394 return Hexagon::SXTH_cdnPt_V4; 1395 case Hexagon::SXTH_cNotPt_V4 : 1396 return Hexagon::SXTH_cdnNotPt_V4; 1397 1398 case Hexagon::ZXTB_cPt_V4 : 1399 return Hexagon::ZXTB_cdnPt_V4; 1400 case Hexagon::ZXTB_cNotPt_V4 : 1401 return Hexagon::ZXTB_cdnNotPt_V4; 1402 1403 case Hexagon::ZXTH_cPt_V4 : 1404 return Hexagon::ZXTH_cdnPt_V4; 1405 case Hexagon::ZXTH_cNotPt_V4 : 1406 return Hexagon::ZXTH_cdnNotPt_V4; 1407 } 1408} 1409 1410// Returns true if an instruction can be promoted to .new predicate 1411// or new-value store. 1412bool HexagonPacketizerList::isNewifiable(MachineInstr* MI) { 1413 if ( isCondInst(MI) || IsNewifyStore(MI)) 1414 return true; 1415 else 1416 return false; 1417} 1418 1419bool HexagonPacketizerList::isCondInst (MachineInstr* MI) { 1420 const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII; 1421 const MCInstrDesc& TID = MI->getDesc(); 1422 // bug 5670: until that is fixed, 1423 // this portion is disabled. 1424 if ( TID.isConditionalBranch() // && !IsRegisterJump(MI)) || 1425 || QII->isConditionalTransfer(MI) 1426 || QII->isConditionalALU32(MI) 1427 || QII->isConditionalLoad(MI) 1428 || QII->isConditionalStore(MI)) { 1429 return true; 1430 } 1431 return false; 1432} 1433 1434 1435// Promote an instructiont to its .new form. 1436// At this time, we have already made a call to CanPromoteToDotNew 1437// and made sure that it can *indeed* be promoted. 1438bool HexagonPacketizerList::PromoteToDotNew(MachineInstr* MI, 1439 SDep::Kind DepType, MachineBasicBlock::iterator &MII, 1440 const TargetRegisterClass* RC) { 1441 1442 assert (DepType == SDep::Data); 1443 const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII; 1444 1445 int NewOpcode; 1446 if (RC == Hexagon::PredRegsRegisterClass) 1447 NewOpcode = GetDotNewPredOp(MI->getOpcode()); 1448 else 1449 NewOpcode = GetDotNewOp(MI->getOpcode()); 1450 MI->setDesc(QII->get(NewOpcode)); 1451 1452 return true; 1453} 1454 1455// Returns the most basic instruction for the .new predicated instructions and 1456// new-value stores. 1457// For example, all of the following instructions will be converted back to the 1458// same instruction: 1459// 1) if (p0.new) memw(R0+#0) = R1.new ---> 1460// 2) if (p0) memw(R0+#0)= R1.new -------> if (p0) memw(R0+#0) = R1 1461// 3) if (p0.new) memw(R0+#0) = R1 ---> 1462// 1463// To understand the translation of instruction 1 to its original form, consider 1464// a packet with 3 instructions. 1465// { p0 = cmp.eq(R0,R1) 1466// if (p0.new) R2 = add(R3, R4) 1467// R5 = add (R3, R1) 1468// } 1469// if (p0) memw(R5+#0) = R2 <--- trying to include it in the previous packet 1470// 1471// This instruction can be part of the previous packet only if both p0 and R2 1472// are promoted to .new values. This promotion happens in steps, first 1473// predicate register is promoted to .new and in the next iteration R2 is 1474// promoted. Therefore, in case of dependence check failure (due to R5) during 1475// next iteration, it should be converted back to its most basic form. 1476 1477static int GetDotOldOp(const int opc) { 1478 switch (opc) { 1479 default: llvm_unreachable("Unknown .old type"); 1480 1481 case Hexagon::TFR_cdnPt: 1482 return Hexagon::TFR_cPt; 1483 1484 case Hexagon::TFR_cdnNotPt: 1485 return Hexagon::TFR_cNotPt; 1486 1487 case Hexagon::TFRI_cdnPt: 1488 return Hexagon::TFRI_cPt; 1489 1490 case Hexagon::TFRI_cdnNotPt: 1491 return Hexagon::TFRI_cNotPt; 1492 1493 case Hexagon::JMP_cdnPt: 1494 return Hexagon::JMP_c; 1495 1496 case Hexagon::JMP_cdnNotPt: 1497 return Hexagon::JMP_cNot; 1498 1499 case Hexagon::JMPR_cdnPt_V3: 1500 return Hexagon::JMPR_cPt; 1501 1502 case Hexagon::JMPR_cdnNotPt_V3: 1503 return Hexagon::JMPR_cNotPt; 1504 1505 // Load double word 1506 1507 case Hexagon::LDrid_cdnPt : 1508 return Hexagon::LDrid_cPt; 1509 1510 case Hexagon::LDrid_cdnNotPt : 1511 return Hexagon::LDrid_cNotPt; 1512 1513 case Hexagon::LDrid_indexed_cdnPt : 1514 return Hexagon::LDrid_indexed_cPt; 1515 1516 case Hexagon::LDrid_indexed_cdnNotPt : 1517 return Hexagon::LDrid_indexed_cNotPt; 1518 1519 case Hexagon::POST_LDrid_cdnPt_V4 : 1520 return Hexagon::POST_LDrid_cPt; 1521 1522 case Hexagon::POST_LDrid_cdnNotPt_V4 : 1523 return Hexagon::POST_LDrid_cNotPt; 1524 1525 // Load word 1526 1527 case Hexagon::LDriw_cdnPt : 1528 return Hexagon::LDriw_cPt; 1529 1530 case Hexagon::LDriw_cdnNotPt : 1531 return Hexagon::LDriw_cNotPt; 1532 1533 case Hexagon::LDriw_indexed_cdnPt : 1534 return Hexagon::LDriw_indexed_cPt; 1535 1536 case Hexagon::LDriw_indexed_cdnNotPt : 1537 return Hexagon::LDriw_indexed_cNotPt; 1538 1539 case Hexagon::POST_LDriw_cdnPt_V4 : 1540 return Hexagon::POST_LDriw_cPt; 1541 1542 case Hexagon::POST_LDriw_cdnNotPt_V4 : 1543 return Hexagon::POST_LDriw_cNotPt; 1544 1545 // Load half 1546 1547 case Hexagon::LDrih_cdnPt : 1548 return Hexagon::LDrih_cPt; 1549 1550 case Hexagon::LDrih_cdnNotPt : 1551 return Hexagon::LDrih_cNotPt; 1552 1553 case Hexagon::LDrih_indexed_cdnPt : 1554 return Hexagon::LDrih_indexed_cPt; 1555 1556 case Hexagon::LDrih_indexed_cdnNotPt : 1557 return Hexagon::LDrih_indexed_cNotPt; 1558 1559 case Hexagon::POST_LDrih_cdnPt_V4 : 1560 return Hexagon::POST_LDrih_cPt; 1561 1562 case Hexagon::POST_LDrih_cdnNotPt_V4 : 1563 return Hexagon::POST_LDrih_cNotPt; 1564 1565 // Load byte 1566 1567 case Hexagon::LDrib_cdnPt : 1568 return Hexagon::LDrib_cPt; 1569 1570 case Hexagon::LDrib_cdnNotPt : 1571 return Hexagon::LDrib_cNotPt; 1572 1573 case Hexagon::LDrib_indexed_cdnPt : 1574 return Hexagon::LDrib_indexed_cPt; 1575 1576 case Hexagon::LDrib_indexed_cdnNotPt : 1577 return Hexagon::LDrib_indexed_cNotPt; 1578 1579 case Hexagon::POST_LDrib_cdnPt_V4 : 1580 return Hexagon::POST_LDrib_cPt; 1581 1582 case Hexagon::POST_LDrib_cdnNotPt_V4 : 1583 return Hexagon::POST_LDrib_cNotPt; 1584 1585 // Load unsigned half 1586 1587 case Hexagon::LDriuh_cdnPt : 1588 return Hexagon::LDriuh_cPt; 1589 1590 case Hexagon::LDriuh_cdnNotPt : 1591 return Hexagon::LDriuh_cNotPt; 1592 1593 case Hexagon::LDriuh_indexed_cdnPt : 1594 return Hexagon::LDriuh_indexed_cPt; 1595 1596 case Hexagon::LDriuh_indexed_cdnNotPt : 1597 return Hexagon::LDriuh_indexed_cNotPt; 1598 1599 case Hexagon::POST_LDriuh_cdnPt_V4 : 1600 return Hexagon::POST_LDriuh_cPt; 1601 1602 case Hexagon::POST_LDriuh_cdnNotPt_V4 : 1603 return Hexagon::POST_LDriuh_cNotPt; 1604 1605 // Load unsigned byte 1606 case Hexagon::LDriub_cdnPt : 1607 return Hexagon::LDriub_cPt; 1608 1609 case Hexagon::LDriub_cdnNotPt : 1610 return Hexagon::LDriub_cNotPt; 1611 1612 case Hexagon::LDriub_indexed_cdnPt : 1613 return Hexagon::LDriub_indexed_cPt; 1614 1615 case Hexagon::LDriub_indexed_cdnNotPt : 1616 return Hexagon::LDriub_indexed_cNotPt; 1617 1618 case Hexagon::POST_LDriub_cdnPt_V4 : 1619 return Hexagon::POST_LDriub_cPt; 1620 1621 case Hexagon::POST_LDriub_cdnNotPt_V4 : 1622 return Hexagon::POST_LDriub_cNotPt; 1623 1624 // V4 indexed+scaled Load 1625 1626 case Hexagon::LDrid_indexed_cdnPt_V4 : 1627 return Hexagon::LDrid_indexed_cPt_V4; 1628 1629 case Hexagon::LDrid_indexed_cdnNotPt_V4 : 1630 return Hexagon::LDrid_indexed_cNotPt_V4; 1631 1632 case Hexagon::LDrid_indexed_shl_cdnPt_V4 : 1633 return Hexagon::LDrid_indexed_shl_cPt_V4; 1634 1635 case Hexagon::LDrid_indexed_shl_cdnNotPt_V4 : 1636 return Hexagon::LDrid_indexed_shl_cNotPt_V4; 1637 1638 case Hexagon::LDrib_indexed_cdnPt_V4 : 1639 return Hexagon::LDrib_indexed_cPt_V4; 1640 1641 case Hexagon::LDrib_indexed_cdnNotPt_V4 : 1642 return Hexagon::LDrib_indexed_cNotPt_V4; 1643 1644 case Hexagon::LDrib_indexed_shl_cdnPt_V4 : 1645 return Hexagon::LDrib_indexed_shl_cPt_V4; 1646 1647 case Hexagon::LDrib_indexed_shl_cdnNotPt_V4 : 1648 return Hexagon::LDrib_indexed_shl_cNotPt_V4; 1649 1650 case Hexagon::LDriub_indexed_cdnPt_V4 : 1651 return Hexagon::LDriub_indexed_cPt_V4; 1652 1653 case Hexagon::LDriub_indexed_cdnNotPt_V4 : 1654 return Hexagon::LDriub_indexed_cNotPt_V4; 1655 1656 case Hexagon::LDriub_indexed_shl_cdnPt_V4 : 1657 return Hexagon::LDriub_indexed_shl_cPt_V4; 1658 1659 case Hexagon::LDriub_indexed_shl_cdnNotPt_V4 : 1660 return Hexagon::LDriub_indexed_shl_cNotPt_V4; 1661 1662 case Hexagon::LDrih_indexed_cdnPt_V4 : 1663 return Hexagon::LDrih_indexed_cPt_V4; 1664 1665 case Hexagon::LDrih_indexed_cdnNotPt_V4 : 1666 return Hexagon::LDrih_indexed_cNotPt_V4; 1667 1668 case Hexagon::LDrih_indexed_shl_cdnPt_V4 : 1669 return Hexagon::LDrih_indexed_shl_cPt_V4; 1670 1671 case Hexagon::LDrih_indexed_shl_cdnNotPt_V4 : 1672 return Hexagon::LDrih_indexed_shl_cNotPt_V4; 1673 1674 case Hexagon::LDriuh_indexed_cdnPt_V4 : 1675 return Hexagon::LDriuh_indexed_cPt_V4; 1676 1677 case Hexagon::LDriuh_indexed_cdnNotPt_V4 : 1678 return Hexagon::LDriuh_indexed_cNotPt_V4; 1679 1680 case Hexagon::LDriuh_indexed_shl_cdnPt_V4 : 1681 return Hexagon::LDriuh_indexed_shl_cPt_V4; 1682 1683 case Hexagon::LDriuh_indexed_shl_cdnNotPt_V4 : 1684 return Hexagon::LDriuh_indexed_shl_cNotPt_V4; 1685 1686 case Hexagon::LDriw_indexed_cdnPt_V4 : 1687 return Hexagon::LDriw_indexed_cPt_V4; 1688 1689 case Hexagon::LDriw_indexed_cdnNotPt_V4 : 1690 return Hexagon::LDriw_indexed_cNotPt_V4; 1691 1692 case Hexagon::LDriw_indexed_shl_cdnPt_V4 : 1693 return Hexagon::LDriw_indexed_shl_cPt_V4; 1694 1695 case Hexagon::LDriw_indexed_shl_cdnNotPt_V4 : 1696 return Hexagon::LDriw_indexed_shl_cNotPt_V4; 1697 1698 // V4 global address load 1699 1700 case Hexagon::LDd_GP_cdnPt_V4: 1701 return Hexagon::LDd_GP_cPt_V4; 1702 1703 case Hexagon::LDd_GP_cdnNotPt_V4: 1704 return Hexagon::LDd_GP_cNotPt_V4; 1705 1706 case Hexagon::LDb_GP_cdnPt_V4: 1707 return Hexagon::LDb_GP_cPt_V4; 1708 1709 case Hexagon::LDb_GP_cdnNotPt_V4: 1710 return Hexagon::LDb_GP_cNotPt_V4; 1711 1712 case Hexagon::LDub_GP_cdnPt_V4: 1713 return Hexagon::LDub_GP_cPt_V4; 1714 1715 case Hexagon::LDub_GP_cdnNotPt_V4: 1716 return Hexagon::LDub_GP_cNotPt_V4; 1717 1718 case Hexagon::LDh_GP_cdnPt_V4: 1719 return Hexagon::LDh_GP_cPt_V4; 1720 1721 case Hexagon::LDh_GP_cdnNotPt_V4: 1722 return Hexagon::LDh_GP_cNotPt_V4; 1723 1724 case Hexagon::LDuh_GP_cdnPt_V4: 1725 return Hexagon::LDuh_GP_cPt_V4; 1726 1727 case Hexagon::LDuh_GP_cdnNotPt_V4: 1728 return Hexagon::LDuh_GP_cNotPt_V4; 1729 1730 case Hexagon::LDw_GP_cdnPt_V4: 1731 return Hexagon::LDw_GP_cPt_V4; 1732 1733 case Hexagon::LDw_GP_cdnNotPt_V4: 1734 return Hexagon::LDw_GP_cNotPt_V4; 1735 1736 case Hexagon::LDrid_GP_cdnPt_V4: 1737 return Hexagon::LDrid_GP_cPt_V4; 1738 1739 case Hexagon::LDrid_GP_cdnNotPt_V4: 1740 return Hexagon::LDrid_GP_cNotPt_V4; 1741 1742 case Hexagon::LDrib_GP_cdnPt_V4: 1743 return Hexagon::LDrib_GP_cPt_V4; 1744 1745 case Hexagon::LDrib_GP_cdnNotPt_V4: 1746 return Hexagon::LDrib_GP_cNotPt_V4; 1747 1748 case Hexagon::LDriub_GP_cdnPt_V4: 1749 return Hexagon::LDriub_GP_cPt_V4; 1750 1751 case Hexagon::LDriub_GP_cdnNotPt_V4: 1752 return Hexagon::LDriub_GP_cNotPt_V4; 1753 1754 case Hexagon::LDrih_GP_cdnPt_V4: 1755 return Hexagon::LDrih_GP_cPt_V4; 1756 1757 case Hexagon::LDrih_GP_cdnNotPt_V4: 1758 return Hexagon::LDrih_GP_cNotPt_V4; 1759 1760 case Hexagon::LDriuh_GP_cdnPt_V4: 1761 return Hexagon::LDriuh_GP_cPt_V4; 1762 1763 case Hexagon::LDriuh_GP_cdnNotPt_V4: 1764 return Hexagon::LDriuh_GP_cNotPt_V4; 1765 1766 case Hexagon::LDriw_GP_cdnPt_V4: 1767 return Hexagon::LDriw_GP_cPt_V4; 1768 1769 case Hexagon::LDriw_GP_cdnNotPt_V4: 1770 return Hexagon::LDriw_GP_cNotPt_V4; 1771 1772 // Conditional add 1773 1774 case Hexagon::ADD_ri_cdnPt : 1775 return Hexagon::ADD_ri_cPt; 1776 case Hexagon::ADD_ri_cdnNotPt : 1777 return Hexagon::ADD_ri_cNotPt; 1778 1779 case Hexagon::ADD_rr_cdnPt : 1780 return Hexagon::ADD_rr_cPt; 1781 case Hexagon::ADD_rr_cdnNotPt: 1782 return Hexagon::ADD_rr_cNotPt; 1783 1784 // Conditional logical Operations 1785 1786 case Hexagon::XOR_rr_cdnPt : 1787 return Hexagon::XOR_rr_cPt; 1788 case Hexagon::XOR_rr_cdnNotPt : 1789 return Hexagon::XOR_rr_cNotPt; 1790 1791 case Hexagon::AND_rr_cdnPt : 1792 return Hexagon::AND_rr_cPt; 1793 case Hexagon::AND_rr_cdnNotPt : 1794 return Hexagon::AND_rr_cNotPt; 1795 1796 case Hexagon::OR_rr_cdnPt : 1797 return Hexagon::OR_rr_cPt; 1798 case Hexagon::OR_rr_cdnNotPt : 1799 return Hexagon::OR_rr_cNotPt; 1800 1801 // Conditional Subtract 1802 1803 case Hexagon::SUB_rr_cdnPt : 1804 return Hexagon::SUB_rr_cPt; 1805 case Hexagon::SUB_rr_cdnNotPt : 1806 return Hexagon::SUB_rr_cNotPt; 1807 1808 // Conditional combine 1809 1810 case Hexagon::COMBINE_rr_cdnPt : 1811 return Hexagon::COMBINE_rr_cPt; 1812 case Hexagon::COMBINE_rr_cdnNotPt : 1813 return Hexagon::COMBINE_rr_cNotPt; 1814 1815// Conditional shift operations 1816 1817 case Hexagon::ASLH_cdnPt_V4 : 1818 return Hexagon::ASLH_cPt_V4; 1819 case Hexagon::ASLH_cdnNotPt_V4 : 1820 return Hexagon::ASLH_cNotPt_V4; 1821 1822 case Hexagon::ASRH_cdnPt_V4 : 1823 return Hexagon::ASRH_cPt_V4; 1824 case Hexagon::ASRH_cdnNotPt_V4 : 1825 return Hexagon::ASRH_cNotPt_V4; 1826 1827 case Hexagon::SXTB_cdnPt_V4 : 1828 return Hexagon::SXTB_cPt_V4; 1829 case Hexagon::SXTB_cdnNotPt_V4 : 1830 return Hexagon::SXTB_cNotPt_V4; 1831 1832 case Hexagon::SXTH_cdnPt_V4 : 1833 return Hexagon::SXTH_cPt_V4; 1834 case Hexagon::SXTH_cdnNotPt_V4 : 1835 return Hexagon::SXTH_cNotPt_V4; 1836 1837 case Hexagon::ZXTB_cdnPt_V4 : 1838 return Hexagon::ZXTB_cPt_V4; 1839 case Hexagon::ZXTB_cdnNotPt_V4 : 1840 return Hexagon::ZXTB_cNotPt_V4; 1841 1842 case Hexagon::ZXTH_cdnPt_V4 : 1843 return Hexagon::ZXTH_cPt_V4; 1844 case Hexagon::ZXTH_cdnNotPt_V4 : 1845 return Hexagon::ZXTH_cNotPt_V4; 1846 1847 // Store byte 1848 1849 case Hexagon::STrib_imm_cdnPt_V4 : 1850 return Hexagon::STrib_imm_cPt_V4; 1851 1852 case Hexagon::STrib_imm_cdnNotPt_V4 : 1853 return Hexagon::STrib_imm_cNotPt_V4; 1854 1855 case Hexagon::STrib_cdnPt_nv_V4 : 1856 case Hexagon::STrib_cPt_nv_V4 : 1857 case Hexagon::STrib_cdnPt_V4 : 1858 return Hexagon::STrib_cPt; 1859 1860 case Hexagon::STrib_cdnNotPt_nv_V4 : 1861 case Hexagon::STrib_cNotPt_nv_V4 : 1862 case Hexagon::STrib_cdnNotPt_V4 : 1863 return Hexagon::STrib_cNotPt; 1864 1865 case Hexagon::STrib_indexed_cdnPt_V4 : 1866 case Hexagon::STrib_indexed_cPt_nv_V4 : 1867 case Hexagon::STrib_indexed_cdnPt_nv_V4 : 1868 return Hexagon::STrib_indexed_cPt; 1869 1870 case Hexagon::STrib_indexed_cdnNotPt_V4 : 1871 case Hexagon::STrib_indexed_cNotPt_nv_V4 : 1872 case Hexagon::STrib_indexed_cdnNotPt_nv_V4 : 1873 return Hexagon::STrib_indexed_cNotPt; 1874 1875 case Hexagon::STrib_indexed_shl_cdnPt_nv_V4: 1876 case Hexagon::STrib_indexed_shl_cPt_nv_V4 : 1877 case Hexagon::STrib_indexed_shl_cdnPt_V4 : 1878 return Hexagon::STrib_indexed_shl_cPt_V4; 1879 1880 case Hexagon::STrib_indexed_shl_cdnNotPt_nv_V4: 1881 case Hexagon::STrib_indexed_shl_cNotPt_nv_V4 : 1882 case Hexagon::STrib_indexed_shl_cdnNotPt_V4 : 1883 return Hexagon::STrib_indexed_shl_cNotPt_V4; 1884 1885 case Hexagon::POST_STbri_cdnPt_nv_V4 : 1886 case Hexagon::POST_STbri_cPt_nv_V4 : 1887 case Hexagon::POST_STbri_cdnPt_V4 : 1888 return Hexagon::POST_STbri_cPt; 1889 1890 case Hexagon::POST_STbri_cdnNotPt_nv_V4 : 1891 case Hexagon::POST_STbri_cNotPt_nv_V4: 1892 case Hexagon::POST_STbri_cdnNotPt_V4 : 1893 return Hexagon::POST_STbri_cNotPt; 1894 1895 case Hexagon::STb_GP_cdnPt_nv_V4: 1896 case Hexagon::STb_GP_cdnPt_V4: 1897 case Hexagon::STb_GP_cPt_nv_V4: 1898 return Hexagon::STb_GP_cPt_V4; 1899 1900 case Hexagon::STb_GP_cdnNotPt_nv_V4: 1901 case Hexagon::STb_GP_cdnNotPt_V4: 1902 case Hexagon::STb_GP_cNotPt_nv_V4: 1903 return Hexagon::STb_GP_cNotPt_V4; 1904 1905 case Hexagon::STrib_GP_cdnPt_nv_V4: 1906 case Hexagon::STrib_GP_cdnPt_V4: 1907 case Hexagon::STrib_GP_cPt_nv_V4: 1908 return Hexagon::STrib_GP_cPt_V4; 1909 1910 case Hexagon::STrib_GP_cdnNotPt_nv_V4: 1911 case Hexagon::STrib_GP_cdnNotPt_V4: 1912 case Hexagon::STrib_GP_cNotPt_nv_V4: 1913 return Hexagon::STrib_GP_cNotPt_V4; 1914 1915 // Store new-value byte - unconditional 1916 case Hexagon::STrib_nv_V4: 1917 return Hexagon::STrib; 1918 1919 case Hexagon::STrib_indexed_nv_V4: 1920 return Hexagon::STrib_indexed; 1921 1922 case Hexagon::STrib_indexed_shl_nv_V4: 1923 return Hexagon::STrib_indexed_shl_V4; 1924 1925 case Hexagon::STrib_shl_nv_V4: 1926 return Hexagon::STrib_shl_V4; 1927 1928 case Hexagon::STrib_GP_nv_V4: 1929 return Hexagon::STrib_GP_V4; 1930 1931 case Hexagon::STb_GP_nv_V4: 1932 return Hexagon::STb_GP_V4; 1933 1934 case Hexagon::POST_STbri_nv_V4: 1935 return Hexagon::POST_STbri; 1936 1937 // Store halfword 1938 case Hexagon::STrih_imm_cdnPt_V4 : 1939 return Hexagon::STrih_imm_cPt_V4; 1940 1941 case Hexagon::STrih_imm_cdnNotPt_V4 : 1942 return Hexagon::STrih_imm_cNotPt_V4; 1943 1944 case Hexagon::STrih_cdnPt_nv_V4 : 1945 case Hexagon::STrih_cPt_nv_V4 : 1946 case Hexagon::STrih_cdnPt_V4 : 1947 return Hexagon::STrih_cPt; 1948 1949 case Hexagon::STrih_cdnNotPt_nv_V4 : 1950 case Hexagon::STrih_cNotPt_nv_V4 : 1951 case Hexagon::STrih_cdnNotPt_V4 : 1952 return Hexagon::STrih_cNotPt; 1953 1954 case Hexagon::STrih_indexed_cdnPt_nv_V4: 1955 case Hexagon::STrih_indexed_cPt_nv_V4 : 1956 case Hexagon::STrih_indexed_cdnPt_V4 : 1957 return Hexagon::STrih_indexed_cPt; 1958 1959 case Hexagon::STrih_indexed_cdnNotPt_nv_V4: 1960 case Hexagon::STrih_indexed_cNotPt_nv_V4 : 1961 case Hexagon::STrih_indexed_cdnNotPt_V4 : 1962 return Hexagon::STrih_indexed_cNotPt; 1963 1964 case Hexagon::STrih_indexed_shl_cdnPt_nv_V4 : 1965 case Hexagon::STrih_indexed_shl_cPt_nv_V4 : 1966 case Hexagon::STrih_indexed_shl_cdnPt_V4 : 1967 return Hexagon::STrih_indexed_shl_cPt_V4; 1968 1969 case Hexagon::STrih_indexed_shl_cdnNotPt_nv_V4 : 1970 case Hexagon::STrih_indexed_shl_cNotPt_nv_V4 : 1971 case Hexagon::STrih_indexed_shl_cdnNotPt_V4 : 1972 return Hexagon::STrih_indexed_shl_cNotPt_V4; 1973 1974 case Hexagon::POST_SThri_cdnPt_nv_V4 : 1975 case Hexagon::POST_SThri_cPt_nv_V4 : 1976 case Hexagon::POST_SThri_cdnPt_V4 : 1977 return Hexagon::POST_SThri_cPt; 1978 1979 case Hexagon::POST_SThri_cdnNotPt_nv_V4 : 1980 case Hexagon::POST_SThri_cNotPt_nv_V4 : 1981 case Hexagon::POST_SThri_cdnNotPt_V4 : 1982 return Hexagon::POST_SThri_cNotPt; 1983 1984 case Hexagon::STh_GP_cdnPt_nv_V4: 1985 case Hexagon::STh_GP_cdnPt_V4: 1986 case Hexagon::STh_GP_cPt_nv_V4: 1987 return Hexagon::STh_GP_cPt_V4; 1988 1989 case Hexagon::STh_GP_cdnNotPt_nv_V4: 1990 case Hexagon::STh_GP_cdnNotPt_V4: 1991 case Hexagon::STh_GP_cNotPt_nv_V4: 1992 return Hexagon::STh_GP_cNotPt_V4; 1993 1994 case Hexagon::STrih_GP_cdnPt_nv_V4: 1995 case Hexagon::STrih_GP_cdnPt_V4: 1996 case Hexagon::STrih_GP_cPt_nv_V4: 1997 return Hexagon::STrih_GP_cPt_V4; 1998 1999 case Hexagon::STrih_GP_cdnNotPt_nv_V4: 2000 case Hexagon::STrih_GP_cdnNotPt_V4: 2001 case Hexagon::STrih_GP_cNotPt_nv_V4: 2002 return Hexagon::STrih_GP_cNotPt_V4; 2003 2004 // Store new-value halfword - unconditional 2005 2006 case Hexagon::STrih_nv_V4: 2007 return Hexagon::STrih; 2008 2009 case Hexagon::STrih_indexed_nv_V4: 2010 return Hexagon::STrih_indexed; 2011 2012 case Hexagon::STrih_indexed_shl_nv_V4: 2013 return Hexagon::STrih_indexed_shl_V4; 2014 2015 case Hexagon::STrih_shl_nv_V4: 2016 return Hexagon::STrih_shl_V4; 2017 2018 case Hexagon::STrih_GP_nv_V4: 2019 return Hexagon::STrih_GP_V4; 2020 2021 case Hexagon::STh_GP_nv_V4: 2022 return Hexagon::STh_GP_V4; 2023 2024 case Hexagon::POST_SThri_nv_V4: 2025 return Hexagon::POST_SThri; 2026 2027 // Store word 2028 2029 case Hexagon::STriw_imm_cdnPt_V4 : 2030 return Hexagon::STriw_imm_cPt_V4; 2031 2032 case Hexagon::STriw_imm_cdnNotPt_V4 : 2033 return Hexagon::STriw_imm_cNotPt_V4; 2034 2035 case Hexagon::STriw_cdnPt_nv_V4 : 2036 case Hexagon::STriw_cPt_nv_V4 : 2037 case Hexagon::STriw_cdnPt_V4 : 2038 return Hexagon::STriw_cPt; 2039 2040 case Hexagon::STriw_cdnNotPt_nv_V4 : 2041 case Hexagon::STriw_cNotPt_nv_V4 : 2042 case Hexagon::STriw_cdnNotPt_V4 : 2043 return Hexagon::STriw_cNotPt; 2044 2045 case Hexagon::STriw_indexed_cdnPt_nv_V4 : 2046 case Hexagon::STriw_indexed_cPt_nv_V4 : 2047 case Hexagon::STriw_indexed_cdnPt_V4 : 2048 return Hexagon::STriw_indexed_cPt; 2049 2050 case Hexagon::STriw_indexed_cdnNotPt_nv_V4 : 2051 case Hexagon::STriw_indexed_cNotPt_nv_V4 : 2052 case Hexagon::STriw_indexed_cdnNotPt_V4 : 2053 return Hexagon::STriw_indexed_cNotPt; 2054 2055 case Hexagon::STriw_indexed_shl_cdnPt_nv_V4 : 2056 case Hexagon::STriw_indexed_shl_cPt_nv_V4 : 2057 case Hexagon::STriw_indexed_shl_cdnPt_V4 : 2058 return Hexagon::STriw_indexed_shl_cPt_V4; 2059 2060 case Hexagon::STriw_indexed_shl_cdnNotPt_nv_V4 : 2061 case Hexagon::STriw_indexed_shl_cNotPt_nv_V4 : 2062 case Hexagon::STriw_indexed_shl_cdnNotPt_V4 : 2063 return Hexagon::STriw_indexed_shl_cNotPt_V4; 2064 2065 case Hexagon::POST_STwri_cdnPt_nv_V4 : 2066 case Hexagon::POST_STwri_cPt_nv_V4 : 2067 case Hexagon::POST_STwri_cdnPt_V4 : 2068 return Hexagon::POST_STwri_cPt; 2069 2070 case Hexagon::POST_STwri_cdnNotPt_nv_V4 : 2071 case Hexagon::POST_STwri_cNotPt_nv_V4 : 2072 case Hexagon::POST_STwri_cdnNotPt_V4 : 2073 return Hexagon::POST_STwri_cNotPt; 2074 2075 case Hexagon::STw_GP_cdnPt_nv_V4: 2076 case Hexagon::STw_GP_cdnPt_V4: 2077 case Hexagon::STw_GP_cPt_nv_V4: 2078 return Hexagon::STw_GP_cPt_V4; 2079 2080 case Hexagon::STw_GP_cdnNotPt_nv_V4: 2081 case Hexagon::STw_GP_cdnNotPt_V4: 2082 case Hexagon::STw_GP_cNotPt_nv_V4: 2083 return Hexagon::STw_GP_cNotPt_V4; 2084 2085 case Hexagon::STriw_GP_cdnPt_nv_V4: 2086 case Hexagon::STriw_GP_cdnPt_V4: 2087 case Hexagon::STriw_GP_cPt_nv_V4: 2088 return Hexagon::STriw_GP_cPt_V4; 2089 2090 case Hexagon::STriw_GP_cdnNotPt_nv_V4: 2091 case Hexagon::STriw_GP_cdnNotPt_V4: 2092 case Hexagon::STriw_GP_cNotPt_nv_V4: 2093 return Hexagon::STriw_GP_cNotPt_V4; 2094 2095 // Store new-value word - unconditional 2096 2097 case Hexagon::STriw_nv_V4: 2098 return Hexagon::STriw; 2099 2100 case Hexagon::STriw_indexed_nv_V4: 2101 return Hexagon::STriw_indexed; 2102 2103 case Hexagon::STriw_indexed_shl_nv_V4: 2104 return Hexagon::STriw_indexed_shl_V4; 2105 2106 case Hexagon::STriw_shl_nv_V4: 2107 return Hexagon::STriw_shl_V4; 2108 2109 case Hexagon::STriw_GP_nv_V4: 2110 return Hexagon::STriw_GP_V4; 2111 2112 case Hexagon::STw_GP_nv_V4: 2113 return Hexagon::STw_GP_V4; 2114 2115 case Hexagon::POST_STwri_nv_V4: 2116 return Hexagon::POST_STwri; 2117 2118 // Store doubleword 2119 2120 case Hexagon::STrid_cdnPt_V4 : 2121 return Hexagon::STrid_cPt; 2122 2123 case Hexagon::STrid_cdnNotPt_V4 : 2124 return Hexagon::STrid_cNotPt; 2125 2126 case Hexagon::STrid_indexed_cdnPt_V4 : 2127 return Hexagon::STrid_indexed_cPt; 2128 2129 case Hexagon::STrid_indexed_cdnNotPt_V4 : 2130 return Hexagon::STrid_indexed_cNotPt; 2131 2132 case Hexagon::STrid_indexed_shl_cdnPt_V4 : 2133 return Hexagon::STrid_indexed_shl_cPt_V4; 2134 2135 case Hexagon::STrid_indexed_shl_cdnNotPt_V4 : 2136 return Hexagon::STrid_indexed_shl_cNotPt_V4; 2137 2138 case Hexagon::POST_STdri_cdnPt_V4 : 2139 return Hexagon::POST_STdri_cPt; 2140 2141 case Hexagon::POST_STdri_cdnNotPt_V4 : 2142 return Hexagon::POST_STdri_cNotPt; 2143 2144 case Hexagon::STd_GP_cdnPt_V4 : 2145 return Hexagon::STd_GP_cPt_V4; 2146 2147 case Hexagon::STd_GP_cdnNotPt_V4 : 2148 return Hexagon::STd_GP_cNotPt_V4; 2149 2150 case Hexagon::STrid_GP_cdnPt_V4 : 2151 return Hexagon::STrid_GP_cPt_V4; 2152 2153 case Hexagon::STrid_GP_cdnNotPt_V4 : 2154 return Hexagon::STrid_GP_cNotPt_V4; 2155 } 2156} 2157 2158bool HexagonPacketizerList::DemoteToDotOld(MachineInstr* MI) { 2159 const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII; 2160 int NewOpcode = GetDotOldOp(MI->getOpcode()); 2161 MI->setDesc(QII->get(NewOpcode)); 2162 return true; 2163} 2164 2165// Returns true if an instruction is predicated on p0 and false if it's 2166// predicated on !p0. 2167 2168static bool GetPredicateSense(MachineInstr* MI, 2169 const HexagonInstrInfo *QII) { 2170 2171 switch (MI->getOpcode()) { 2172 case Hexagon::TFR_cPt: 2173 case Hexagon::TFR_cdnPt: 2174 case Hexagon::TFRI_cPt: 2175 case Hexagon::TFRI_cdnPt: 2176 case Hexagon::STrib_cPt : 2177 case Hexagon::STrib_cdnPt_V4 : 2178 case Hexagon::STrib_indexed_cPt : 2179 case Hexagon::STrib_indexed_cdnPt_V4 : 2180 case Hexagon::STrib_indexed_shl_cPt_V4 : 2181 case Hexagon::STrib_indexed_shl_cdnPt_V4 : 2182 case Hexagon::POST_STbri_cPt : 2183 case Hexagon::POST_STbri_cdnPt_V4 : 2184 case Hexagon::STrih_cPt : 2185 case Hexagon::STrih_cdnPt_V4 : 2186 case Hexagon::STrih_indexed_cPt : 2187 case Hexagon::STrih_indexed_cdnPt_V4 : 2188 case Hexagon::STrih_indexed_shl_cPt_V4 : 2189 case Hexagon::STrih_indexed_shl_cdnPt_V4 : 2190 case Hexagon::POST_SThri_cPt : 2191 case Hexagon::POST_SThri_cdnPt_V4 : 2192 case Hexagon::STriw_cPt : 2193 case Hexagon::STriw_cdnPt_V4 : 2194 case Hexagon::STriw_indexed_cPt : 2195 case Hexagon::STriw_indexed_cdnPt_V4 : 2196 case Hexagon::STriw_indexed_shl_cPt_V4 : 2197 case Hexagon::STriw_indexed_shl_cdnPt_V4 : 2198 case Hexagon::POST_STwri_cPt : 2199 case Hexagon::POST_STwri_cdnPt_V4 : 2200 case Hexagon::STrib_imm_cPt_V4 : 2201 case Hexagon::STrib_imm_cdnPt_V4 : 2202 case Hexagon::STrid_cPt : 2203 case Hexagon::STrid_cdnPt_V4 : 2204 case Hexagon::STrid_indexed_cPt : 2205 case Hexagon::STrid_indexed_cdnPt_V4 : 2206 case Hexagon::STrid_indexed_shl_cPt_V4 : 2207 case Hexagon::STrid_indexed_shl_cdnPt_V4 : 2208 case Hexagon::POST_STdri_cPt : 2209 case Hexagon::POST_STdri_cdnPt_V4 : 2210 case Hexagon::STrih_imm_cPt_V4 : 2211 case Hexagon::STrih_imm_cdnPt_V4 : 2212 case Hexagon::STriw_imm_cPt_V4 : 2213 case Hexagon::STriw_imm_cdnPt_V4 : 2214 case Hexagon::JMP_cdnPt : 2215 case Hexagon::LDrid_cPt : 2216 case Hexagon::LDrid_cdnPt : 2217 case Hexagon::LDrid_indexed_cPt : 2218 case Hexagon::LDrid_indexed_cdnPt : 2219 case Hexagon::POST_LDrid_cPt : 2220 case Hexagon::POST_LDrid_cdnPt_V4 : 2221 case Hexagon::LDriw_cPt : 2222 case Hexagon::LDriw_cdnPt : 2223 case Hexagon::LDriw_indexed_cPt : 2224 case Hexagon::LDriw_indexed_cdnPt : 2225 case Hexagon::POST_LDriw_cPt : 2226 case Hexagon::POST_LDriw_cdnPt_V4 : 2227 case Hexagon::LDrih_cPt : 2228 case Hexagon::LDrih_cdnPt : 2229 case Hexagon::LDrih_indexed_cPt : 2230 case Hexagon::LDrih_indexed_cdnPt : 2231 case Hexagon::POST_LDrih_cPt : 2232 case Hexagon::POST_LDrih_cdnPt_V4 : 2233 case Hexagon::LDrib_cPt : 2234 case Hexagon::LDrib_cdnPt : 2235 case Hexagon::LDrib_indexed_cPt : 2236 case Hexagon::LDrib_indexed_cdnPt : 2237 case Hexagon::POST_LDrib_cPt : 2238 case Hexagon::POST_LDrib_cdnPt_V4 : 2239 case Hexagon::LDriuh_cPt : 2240 case Hexagon::LDriuh_cdnPt : 2241 case Hexagon::LDriuh_indexed_cPt : 2242 case Hexagon::LDriuh_indexed_cdnPt : 2243 case Hexagon::POST_LDriuh_cPt : 2244 case Hexagon::POST_LDriuh_cdnPt_V4 : 2245 case Hexagon::LDriub_cPt : 2246 case Hexagon::LDriub_cdnPt : 2247 case Hexagon::LDriub_indexed_cPt : 2248 case Hexagon::LDriub_indexed_cdnPt : 2249 case Hexagon::POST_LDriub_cPt : 2250 case Hexagon::POST_LDriub_cdnPt_V4 : 2251 case Hexagon::LDrid_indexed_cPt_V4 : 2252 case Hexagon::LDrid_indexed_cdnPt_V4 : 2253 case Hexagon::LDrid_indexed_shl_cPt_V4 : 2254 case Hexagon::LDrid_indexed_shl_cdnPt_V4 : 2255 case Hexagon::LDrib_indexed_cPt_V4 : 2256 case Hexagon::LDrib_indexed_cdnPt_V4 : 2257 case Hexagon::LDrib_indexed_shl_cPt_V4 : 2258 case Hexagon::LDrib_indexed_shl_cdnPt_V4 : 2259 case Hexagon::LDriub_indexed_cPt_V4 : 2260 case Hexagon::LDriub_indexed_cdnPt_V4 : 2261 case Hexagon::LDriub_indexed_shl_cPt_V4 : 2262 case Hexagon::LDriub_indexed_shl_cdnPt_V4 : 2263 case Hexagon::LDrih_indexed_cPt_V4 : 2264 case Hexagon::LDrih_indexed_cdnPt_V4 : 2265 case Hexagon::LDrih_indexed_shl_cPt_V4 : 2266 case Hexagon::LDrih_indexed_shl_cdnPt_V4 : 2267 case Hexagon::LDriuh_indexed_cPt_V4 : 2268 case Hexagon::LDriuh_indexed_cdnPt_V4 : 2269 case Hexagon::LDriuh_indexed_shl_cPt_V4 : 2270 case Hexagon::LDriuh_indexed_shl_cdnPt_V4 : 2271 case Hexagon::LDriw_indexed_cPt_V4 : 2272 case Hexagon::LDriw_indexed_cdnPt_V4 : 2273 case Hexagon::LDriw_indexed_shl_cPt_V4 : 2274 case Hexagon::LDriw_indexed_shl_cdnPt_V4 : 2275 case Hexagon::ADD_ri_cPt : 2276 case Hexagon::ADD_ri_cdnPt : 2277 case Hexagon::ADD_rr_cPt : 2278 case Hexagon::ADD_rr_cdnPt : 2279 case Hexagon::XOR_rr_cPt : 2280 case Hexagon::XOR_rr_cdnPt : 2281 case Hexagon::AND_rr_cPt : 2282 case Hexagon::AND_rr_cdnPt : 2283 case Hexagon::OR_rr_cPt : 2284 case Hexagon::OR_rr_cdnPt : 2285 case Hexagon::SUB_rr_cPt : 2286 case Hexagon::SUB_rr_cdnPt : 2287 case Hexagon::COMBINE_rr_cPt : 2288 case Hexagon::COMBINE_rr_cdnPt : 2289 case Hexagon::ASLH_cPt_V4 : 2290 case Hexagon::ASLH_cdnPt_V4 : 2291 case Hexagon::ASRH_cPt_V4 : 2292 case Hexagon::ASRH_cdnPt_V4 : 2293 case Hexagon::SXTB_cPt_V4 : 2294 case Hexagon::SXTB_cdnPt_V4 : 2295 case Hexagon::SXTH_cPt_V4 : 2296 case Hexagon::SXTH_cdnPt_V4 : 2297 case Hexagon::ZXTB_cPt_V4 : 2298 case Hexagon::ZXTB_cdnPt_V4 : 2299 case Hexagon::ZXTH_cPt_V4 : 2300 case Hexagon::ZXTH_cdnPt_V4 : 2301 case Hexagon::LDrid_GP_cPt_V4 : 2302 case Hexagon::LDrib_GP_cPt_V4 : 2303 case Hexagon::LDriub_GP_cPt_V4 : 2304 case Hexagon::LDrih_GP_cPt_V4 : 2305 case Hexagon::LDriuh_GP_cPt_V4 : 2306 case Hexagon::LDriw_GP_cPt_V4 : 2307 case Hexagon::LDd_GP_cPt_V4 : 2308 case Hexagon::LDb_GP_cPt_V4 : 2309 case Hexagon::LDub_GP_cPt_V4 : 2310 case Hexagon::LDh_GP_cPt_V4 : 2311 case Hexagon::LDuh_GP_cPt_V4 : 2312 case Hexagon::LDw_GP_cPt_V4 : 2313 case Hexagon::STrid_GP_cPt_V4 : 2314 case Hexagon::STrib_GP_cPt_V4 : 2315 case Hexagon::STrih_GP_cPt_V4 : 2316 case Hexagon::STriw_GP_cPt_V4 : 2317 case Hexagon::STd_GP_cPt_V4 : 2318 case Hexagon::STb_GP_cPt_V4 : 2319 case Hexagon::STh_GP_cPt_V4 : 2320 case Hexagon::STw_GP_cPt_V4 : 2321 case Hexagon::LDrid_GP_cdnPt_V4 : 2322 case Hexagon::LDrib_GP_cdnPt_V4 : 2323 case Hexagon::LDriub_GP_cdnPt_V4 : 2324 case Hexagon::LDrih_GP_cdnPt_V4 : 2325 case Hexagon::LDriuh_GP_cdnPt_V4 : 2326 case Hexagon::LDriw_GP_cdnPt_V4 : 2327 case Hexagon::LDd_GP_cdnPt_V4 : 2328 case Hexagon::LDb_GP_cdnPt_V4 : 2329 case Hexagon::LDub_GP_cdnPt_V4 : 2330 case Hexagon::LDh_GP_cdnPt_V4 : 2331 case Hexagon::LDuh_GP_cdnPt_V4 : 2332 case Hexagon::LDw_GP_cdnPt_V4 : 2333 case Hexagon::STrid_GP_cdnPt_V4 : 2334 case Hexagon::STrib_GP_cdnPt_V4 : 2335 case Hexagon::STrih_GP_cdnPt_V4 : 2336 case Hexagon::STriw_GP_cdnPt_V4 : 2337 case Hexagon::STd_GP_cdnPt_V4 : 2338 case Hexagon::STb_GP_cdnPt_V4 : 2339 case Hexagon::STh_GP_cdnPt_V4 : 2340 case Hexagon::STw_GP_cdnPt_V4 : 2341 return true; 2342 2343 case Hexagon::TFR_cNotPt: 2344 case Hexagon::TFR_cdnNotPt: 2345 case Hexagon::TFRI_cNotPt: 2346 case Hexagon::TFRI_cdnNotPt: 2347 case Hexagon::STrib_cNotPt : 2348 case Hexagon::STrib_cdnNotPt_V4 : 2349 case Hexagon::STrib_indexed_cNotPt : 2350 case Hexagon::STrib_indexed_cdnNotPt_V4 : 2351 case Hexagon::STrib_indexed_shl_cNotPt_V4 : 2352 case Hexagon::STrib_indexed_shl_cdnNotPt_V4 : 2353 case Hexagon::POST_STbri_cNotPt : 2354 case Hexagon::POST_STbri_cdnNotPt_V4 : 2355 case Hexagon::STrih_cNotPt : 2356 case Hexagon::STrih_cdnNotPt_V4 : 2357 case Hexagon::STrih_indexed_cNotPt : 2358 case Hexagon::STrih_indexed_cdnNotPt_V4 : 2359 case Hexagon::STrih_indexed_shl_cNotPt_V4 : 2360 case Hexagon::STrih_indexed_shl_cdnNotPt_V4 : 2361 case Hexagon::POST_SThri_cNotPt : 2362 case Hexagon::POST_SThri_cdnNotPt_V4 : 2363 case Hexagon::STriw_cNotPt : 2364 case Hexagon::STriw_cdnNotPt_V4 : 2365 case Hexagon::STriw_indexed_cNotPt : 2366 case Hexagon::STriw_indexed_cdnNotPt_V4 : 2367 case Hexagon::STriw_indexed_shl_cNotPt_V4 : 2368 case Hexagon::STriw_indexed_shl_cdnNotPt_V4 : 2369 case Hexagon::POST_STwri_cNotPt : 2370 case Hexagon::POST_STwri_cdnNotPt_V4 : 2371 case Hexagon::STrib_imm_cNotPt_V4 : 2372 case Hexagon::STrib_imm_cdnNotPt_V4 : 2373 case Hexagon::STrid_cNotPt : 2374 case Hexagon::STrid_cdnNotPt_V4 : 2375 case Hexagon::STrid_indexed_cdnNotPt_V4 : 2376 case Hexagon::STrid_indexed_cNotPt : 2377 case Hexagon::STrid_indexed_shl_cNotPt_V4 : 2378 case Hexagon::STrid_indexed_shl_cdnNotPt_V4 : 2379 case Hexagon::POST_STdri_cNotPt : 2380 case Hexagon::POST_STdri_cdnNotPt_V4 : 2381 case Hexagon::STrih_imm_cNotPt_V4 : 2382 case Hexagon::STrih_imm_cdnNotPt_V4 : 2383 case Hexagon::STriw_imm_cNotPt_V4 : 2384 case Hexagon::STriw_imm_cdnNotPt_V4 : 2385 case Hexagon::JMP_cdnNotPt : 2386 case Hexagon::LDrid_cNotPt : 2387 case Hexagon::LDrid_cdnNotPt : 2388 case Hexagon::LDrid_indexed_cNotPt : 2389 case Hexagon::LDrid_indexed_cdnNotPt : 2390 case Hexagon::POST_LDrid_cNotPt : 2391 case Hexagon::POST_LDrid_cdnNotPt_V4 : 2392 case Hexagon::LDriw_cNotPt : 2393 case Hexagon::LDriw_cdnNotPt : 2394 case Hexagon::LDriw_indexed_cNotPt : 2395 case Hexagon::LDriw_indexed_cdnNotPt : 2396 case Hexagon::POST_LDriw_cNotPt : 2397 case Hexagon::POST_LDriw_cdnNotPt_V4 : 2398 case Hexagon::LDrih_cNotPt : 2399 case Hexagon::LDrih_cdnNotPt : 2400 case Hexagon::LDrih_indexed_cNotPt : 2401 case Hexagon::LDrih_indexed_cdnNotPt : 2402 case Hexagon::POST_LDrih_cNotPt : 2403 case Hexagon::POST_LDrih_cdnNotPt_V4 : 2404 case Hexagon::LDrib_cNotPt : 2405 case Hexagon::LDrib_cdnNotPt : 2406 case Hexagon::LDrib_indexed_cNotPt : 2407 case Hexagon::LDrib_indexed_cdnNotPt : 2408 case Hexagon::POST_LDrib_cNotPt : 2409 case Hexagon::POST_LDrib_cdnNotPt_V4 : 2410 case Hexagon::LDriuh_cNotPt : 2411 case Hexagon::LDriuh_cdnNotPt : 2412 case Hexagon::LDriuh_indexed_cNotPt : 2413 case Hexagon::LDriuh_indexed_cdnNotPt : 2414 case Hexagon::POST_LDriuh_cNotPt : 2415 case Hexagon::POST_LDriuh_cdnNotPt_V4 : 2416 case Hexagon::LDriub_cNotPt : 2417 case Hexagon::LDriub_cdnNotPt : 2418 case Hexagon::LDriub_indexed_cNotPt : 2419 case Hexagon::LDriub_indexed_cdnNotPt : 2420 case Hexagon::POST_LDriub_cNotPt : 2421 case Hexagon::POST_LDriub_cdnNotPt_V4 : 2422 case Hexagon::LDrid_indexed_cNotPt_V4 : 2423 case Hexagon::LDrid_indexed_cdnNotPt_V4 : 2424 case Hexagon::LDrid_indexed_shl_cNotPt_V4 : 2425 case Hexagon::LDrid_indexed_shl_cdnNotPt_V4 : 2426 case Hexagon::LDrib_indexed_cNotPt_V4 : 2427 case Hexagon::LDrib_indexed_cdnNotPt_V4 : 2428 case Hexagon::LDrib_indexed_shl_cNotPt_V4 : 2429 case Hexagon::LDrib_indexed_shl_cdnNotPt_V4 : 2430 case Hexagon::LDriub_indexed_cNotPt_V4 : 2431 case Hexagon::LDriub_indexed_cdnNotPt_V4 : 2432 case Hexagon::LDriub_indexed_shl_cNotPt_V4 : 2433 case Hexagon::LDriub_indexed_shl_cdnNotPt_V4 : 2434 case Hexagon::LDrih_indexed_cNotPt_V4 : 2435 case Hexagon::LDrih_indexed_cdnNotPt_V4 : 2436 case Hexagon::LDrih_indexed_shl_cNotPt_V4 : 2437 case Hexagon::LDrih_indexed_shl_cdnNotPt_V4 : 2438 case Hexagon::LDriuh_indexed_cNotPt_V4 : 2439 case Hexagon::LDriuh_indexed_cdnNotPt_V4 : 2440 case Hexagon::LDriuh_indexed_shl_cNotPt_V4 : 2441 case Hexagon::LDriuh_indexed_shl_cdnNotPt_V4 : 2442 case Hexagon::LDriw_indexed_cNotPt_V4 : 2443 case Hexagon::LDriw_indexed_cdnNotPt_V4 : 2444 case Hexagon::LDriw_indexed_shl_cNotPt_V4 : 2445 case Hexagon::LDriw_indexed_shl_cdnNotPt_V4 : 2446 case Hexagon::ADD_ri_cNotPt : 2447 case Hexagon::ADD_ri_cdnNotPt : 2448 case Hexagon::ADD_rr_cNotPt : 2449 case Hexagon::ADD_rr_cdnNotPt : 2450 case Hexagon::XOR_rr_cNotPt : 2451 case Hexagon::XOR_rr_cdnNotPt : 2452 case Hexagon::AND_rr_cNotPt : 2453 case Hexagon::AND_rr_cdnNotPt : 2454 case Hexagon::OR_rr_cNotPt : 2455 case Hexagon::OR_rr_cdnNotPt : 2456 case Hexagon::SUB_rr_cNotPt : 2457 case Hexagon::SUB_rr_cdnNotPt : 2458 case Hexagon::COMBINE_rr_cNotPt : 2459 case Hexagon::COMBINE_rr_cdnNotPt : 2460 case Hexagon::ASLH_cNotPt_V4 : 2461 case Hexagon::ASLH_cdnNotPt_V4 : 2462 case Hexagon::ASRH_cNotPt_V4 : 2463 case Hexagon::ASRH_cdnNotPt_V4 : 2464 case Hexagon::SXTB_cNotPt_V4 : 2465 case Hexagon::SXTB_cdnNotPt_V4 : 2466 case Hexagon::SXTH_cNotPt_V4 : 2467 case Hexagon::SXTH_cdnNotPt_V4 : 2468 case Hexagon::ZXTB_cNotPt_V4 : 2469 case Hexagon::ZXTB_cdnNotPt_V4 : 2470 case Hexagon::ZXTH_cNotPt_V4 : 2471 case Hexagon::ZXTH_cdnNotPt_V4 : 2472 2473 case Hexagon::LDrid_GP_cNotPt_V4 : 2474 case Hexagon::LDrib_GP_cNotPt_V4 : 2475 case Hexagon::LDriub_GP_cNotPt_V4 : 2476 case Hexagon::LDrih_GP_cNotPt_V4 : 2477 case Hexagon::LDriuh_GP_cNotPt_V4 : 2478 case Hexagon::LDriw_GP_cNotPt_V4 : 2479 case Hexagon::LDd_GP_cNotPt_V4 : 2480 case Hexagon::LDb_GP_cNotPt_V4 : 2481 case Hexagon::LDub_GP_cNotPt_V4 : 2482 case Hexagon::LDh_GP_cNotPt_V4 : 2483 case Hexagon::LDuh_GP_cNotPt_V4 : 2484 case Hexagon::LDw_GP_cNotPt_V4 : 2485 case Hexagon::STrid_GP_cNotPt_V4 : 2486 case Hexagon::STrib_GP_cNotPt_V4 : 2487 case Hexagon::STrih_GP_cNotPt_V4 : 2488 case Hexagon::STriw_GP_cNotPt_V4 : 2489 case Hexagon::STd_GP_cNotPt_V4 : 2490 case Hexagon::STb_GP_cNotPt_V4 : 2491 case Hexagon::STh_GP_cNotPt_V4 : 2492 case Hexagon::STw_GP_cNotPt_V4 : 2493 case Hexagon::LDrid_GP_cdnNotPt_V4 : 2494 case Hexagon::LDrib_GP_cdnNotPt_V4 : 2495 case Hexagon::LDriub_GP_cdnNotPt_V4 : 2496 case Hexagon::LDrih_GP_cdnNotPt_V4 : 2497 case Hexagon::LDriuh_GP_cdnNotPt_V4 : 2498 case Hexagon::LDriw_GP_cdnNotPt_V4 : 2499 case Hexagon::LDd_GP_cdnNotPt_V4 : 2500 case Hexagon::LDb_GP_cdnNotPt_V4 : 2501 case Hexagon::LDub_GP_cdnNotPt_V4 : 2502 case Hexagon::LDh_GP_cdnNotPt_V4 : 2503 case Hexagon::LDuh_GP_cdnNotPt_V4 : 2504 case Hexagon::LDw_GP_cdnNotPt_V4 : 2505 case Hexagon::STrid_GP_cdnNotPt_V4 : 2506 case Hexagon::STrib_GP_cdnNotPt_V4 : 2507 case Hexagon::STrih_GP_cdnNotPt_V4 : 2508 case Hexagon::STriw_GP_cdnNotPt_V4 : 2509 case Hexagon::STd_GP_cdnNotPt_V4 : 2510 case Hexagon::STb_GP_cdnNotPt_V4 : 2511 case Hexagon::STh_GP_cdnNotPt_V4 : 2512 case Hexagon::STw_GP_cdnNotPt_V4 : 2513 return false; 2514 2515 default: 2516 assert (false && "Unknown predicate sense of the instruction"); 2517 } 2518 // return *some value* to avoid compiler warning 2519 return false; 2520} 2521 2522bool HexagonPacketizerList::isDotNewInst(MachineInstr* MI) { 2523 if (isNewValueInst(MI)) 2524 return true; 2525 2526 switch (MI->getOpcode()) { 2527 case Hexagon::TFR_cdnNotPt: 2528 case Hexagon::TFR_cdnPt: 2529 case Hexagon::TFRI_cdnNotPt: 2530 case Hexagon::TFRI_cdnPt: 2531 case Hexagon::LDrid_cdnPt : 2532 case Hexagon::LDrid_cdnNotPt : 2533 case Hexagon::LDrid_indexed_cdnPt : 2534 case Hexagon::LDrid_indexed_cdnNotPt : 2535 case Hexagon::POST_LDrid_cdnPt_V4 : 2536 case Hexagon::POST_LDrid_cdnNotPt_V4 : 2537 case Hexagon::LDriw_cdnPt : 2538 case Hexagon::LDriw_cdnNotPt : 2539 case Hexagon::LDriw_indexed_cdnPt : 2540 case Hexagon::LDriw_indexed_cdnNotPt : 2541 case Hexagon::POST_LDriw_cdnPt_V4 : 2542 case Hexagon::POST_LDriw_cdnNotPt_V4 : 2543 case Hexagon::LDrih_cdnPt : 2544 case Hexagon::LDrih_cdnNotPt : 2545 case Hexagon::LDrih_indexed_cdnPt : 2546 case Hexagon::LDrih_indexed_cdnNotPt : 2547 case Hexagon::POST_LDrih_cdnPt_V4 : 2548 case Hexagon::POST_LDrih_cdnNotPt_V4 : 2549 case Hexagon::LDrib_cdnPt : 2550 case Hexagon::LDrib_cdnNotPt : 2551 case Hexagon::LDrib_indexed_cdnPt : 2552 case Hexagon::LDrib_indexed_cdnNotPt : 2553 case Hexagon::POST_LDrib_cdnPt_V4 : 2554 case Hexagon::POST_LDrib_cdnNotPt_V4 : 2555 case Hexagon::LDriuh_cdnPt : 2556 case Hexagon::LDriuh_cdnNotPt : 2557 case Hexagon::LDriuh_indexed_cdnPt : 2558 case Hexagon::LDriuh_indexed_cdnNotPt : 2559 case Hexagon::POST_LDriuh_cdnPt_V4 : 2560 case Hexagon::POST_LDriuh_cdnNotPt_V4 : 2561 case Hexagon::LDriub_cdnPt : 2562 case Hexagon::LDriub_cdnNotPt : 2563 case Hexagon::LDriub_indexed_cdnPt : 2564 case Hexagon::LDriub_indexed_cdnNotPt : 2565 case Hexagon::POST_LDriub_cdnPt_V4 : 2566 case Hexagon::POST_LDriub_cdnNotPt_V4 : 2567 2568 case Hexagon::LDrid_indexed_cdnPt_V4 : 2569 case Hexagon::LDrid_indexed_cdnNotPt_V4 : 2570 case Hexagon::LDrid_indexed_shl_cdnPt_V4 : 2571 case Hexagon::LDrid_indexed_shl_cdnNotPt_V4 : 2572 case Hexagon::LDrib_indexed_cdnPt_V4 : 2573 case Hexagon::LDrib_indexed_cdnNotPt_V4 : 2574 case Hexagon::LDrib_indexed_shl_cdnPt_V4 : 2575 case Hexagon::LDrib_indexed_shl_cdnNotPt_V4 : 2576 case Hexagon::LDriub_indexed_cdnPt_V4 : 2577 case Hexagon::LDriub_indexed_cdnNotPt_V4 : 2578 case Hexagon::LDriub_indexed_shl_cdnPt_V4 : 2579 case Hexagon::LDriub_indexed_shl_cdnNotPt_V4 : 2580 case Hexagon::LDrih_indexed_cdnPt_V4 : 2581 case Hexagon::LDrih_indexed_cdnNotPt_V4 : 2582 case Hexagon::LDrih_indexed_shl_cdnPt_V4 : 2583 case Hexagon::LDrih_indexed_shl_cdnNotPt_V4 : 2584 case Hexagon::LDriuh_indexed_cdnPt_V4 : 2585 case Hexagon::LDriuh_indexed_cdnNotPt_V4 : 2586 case Hexagon::LDriuh_indexed_shl_cdnPt_V4 : 2587 case Hexagon::LDriuh_indexed_shl_cdnNotPt_V4 : 2588 case Hexagon::LDriw_indexed_cdnPt_V4 : 2589 case Hexagon::LDriw_indexed_cdnNotPt_V4 : 2590 case Hexagon::LDriw_indexed_shl_cdnPt_V4 : 2591 case Hexagon::LDriw_indexed_shl_cdnNotPt_V4 : 2592 2593// Coditional add 2594 case Hexagon::ADD_ri_cdnPt: 2595 case Hexagon::ADD_ri_cdnNotPt: 2596 case Hexagon::ADD_rr_cdnPt: 2597 case Hexagon::ADD_rr_cdnNotPt: 2598 2599 // Conditional logical operations 2600 case Hexagon::XOR_rr_cdnPt : 2601 case Hexagon::XOR_rr_cdnNotPt : 2602 case Hexagon::AND_rr_cdnPt : 2603 case Hexagon::AND_rr_cdnNotPt : 2604 case Hexagon::OR_rr_cdnPt : 2605 case Hexagon::OR_rr_cdnNotPt : 2606 2607 // Conditonal subtract 2608 case Hexagon::SUB_rr_cdnPt : 2609 case Hexagon::SUB_rr_cdnNotPt : 2610 2611 // Conditional combine 2612 case Hexagon::COMBINE_rr_cdnPt : 2613 case Hexagon::COMBINE_rr_cdnNotPt : 2614 2615 // Conditional shift operations 2616 case Hexagon::ASLH_cdnPt_V4: 2617 case Hexagon::ASLH_cdnNotPt_V4: 2618 case Hexagon::ASRH_cdnPt_V4: 2619 case Hexagon::ASRH_cdnNotPt_V4: 2620 case Hexagon::SXTB_cdnPt_V4: 2621 case Hexagon::SXTB_cdnNotPt_V4: 2622 case Hexagon::SXTH_cdnPt_V4: 2623 case Hexagon::SXTH_cdnNotPt_V4: 2624 case Hexagon::ZXTB_cdnPt_V4: 2625 case Hexagon::ZXTB_cdnNotPt_V4: 2626 case Hexagon::ZXTH_cdnPt_V4: 2627 case Hexagon::ZXTH_cdnNotPt_V4: 2628 2629 // Conditional stores 2630 case Hexagon::STrib_imm_cdnPt_V4 : 2631 case Hexagon::STrib_imm_cdnNotPt_V4 : 2632 case Hexagon::STrib_cdnPt_V4 : 2633 case Hexagon::STrib_cdnNotPt_V4 : 2634 case Hexagon::STrib_indexed_cdnPt_V4 : 2635 case Hexagon::STrib_indexed_cdnNotPt_V4 : 2636 case Hexagon::POST_STbri_cdnPt_V4 : 2637 case Hexagon::POST_STbri_cdnNotPt_V4 : 2638 case Hexagon::STrib_indexed_shl_cdnPt_V4 : 2639 case Hexagon::STrib_indexed_shl_cdnNotPt_V4 : 2640 2641 // Store doubleword conditionally 2642 case Hexagon::STrid_indexed_cdnPt_V4 : 2643 case Hexagon::STrid_indexed_cdnNotPt_V4 : 2644 case Hexagon::STrid_indexed_shl_cdnPt_V4 : 2645 case Hexagon::STrid_indexed_shl_cdnNotPt_V4 : 2646 case Hexagon::POST_STdri_cdnPt_V4 : 2647 case Hexagon::POST_STdri_cdnNotPt_V4 : 2648 2649 // Store halfword conditionally 2650 case Hexagon::STrih_cdnPt_V4 : 2651 case Hexagon::STrih_cdnNotPt_V4 : 2652 case Hexagon::STrih_indexed_cdnPt_V4 : 2653 case Hexagon::STrih_indexed_cdnNotPt_V4 : 2654 case Hexagon::STrih_imm_cdnPt_V4 : 2655 case Hexagon::STrih_imm_cdnNotPt_V4 : 2656 case Hexagon::STrih_indexed_shl_cdnPt_V4 : 2657 case Hexagon::STrih_indexed_shl_cdnNotPt_V4 : 2658 case Hexagon::POST_SThri_cdnPt_V4 : 2659 case Hexagon::POST_SThri_cdnNotPt_V4 : 2660 2661 // Store word conditionally 2662 case Hexagon::STriw_cdnPt_V4 : 2663 case Hexagon::STriw_cdnNotPt_V4 : 2664 case Hexagon::STriw_indexed_cdnPt_V4 : 2665 case Hexagon::STriw_indexed_cdnNotPt_V4 : 2666 case Hexagon::STriw_imm_cdnPt_V4 : 2667 case Hexagon::STriw_imm_cdnNotPt_V4 : 2668 case Hexagon::STriw_indexed_shl_cdnPt_V4 : 2669 case Hexagon::STriw_indexed_shl_cdnNotPt_V4 : 2670 case Hexagon::POST_STwri_cdnPt_V4 : 2671 case Hexagon::POST_STwri_cdnNotPt_V4 : 2672 2673 case Hexagon::LDd_GP_cdnPt_V4: 2674 case Hexagon::LDd_GP_cdnNotPt_V4: 2675 case Hexagon::LDb_GP_cdnPt_V4: 2676 case Hexagon::LDb_GP_cdnNotPt_V4: 2677 case Hexagon::LDub_GP_cdnPt_V4: 2678 case Hexagon::LDub_GP_cdnNotPt_V4: 2679 case Hexagon::LDh_GP_cdnPt_V4: 2680 case Hexagon::LDh_GP_cdnNotPt_V4: 2681 case Hexagon::LDuh_GP_cdnPt_V4: 2682 case Hexagon::LDuh_GP_cdnNotPt_V4: 2683 case Hexagon::LDw_GP_cdnPt_V4: 2684 case Hexagon::LDw_GP_cdnNotPt_V4: 2685 case Hexagon::LDrid_GP_cdnPt_V4: 2686 case Hexagon::LDrid_GP_cdnNotPt_V4: 2687 case Hexagon::LDrib_GP_cdnPt_V4: 2688 case Hexagon::LDrib_GP_cdnNotPt_V4: 2689 case Hexagon::LDriub_GP_cdnPt_V4: 2690 case Hexagon::LDriub_GP_cdnNotPt_V4: 2691 case Hexagon::LDrih_GP_cdnPt_V4: 2692 case Hexagon::LDrih_GP_cdnNotPt_V4: 2693 case Hexagon::LDriuh_GP_cdnPt_V4: 2694 case Hexagon::LDriuh_GP_cdnNotPt_V4: 2695 case Hexagon::LDriw_GP_cdnPt_V4: 2696 case Hexagon::LDriw_GP_cdnNotPt_V4: 2697 2698 case Hexagon::STrid_GP_cdnPt_V4: 2699 case Hexagon::STrid_GP_cdnNotPt_V4: 2700 case Hexagon::STrib_GP_cdnPt_V4: 2701 case Hexagon::STrib_GP_cdnNotPt_V4: 2702 case Hexagon::STrih_GP_cdnPt_V4: 2703 case Hexagon::STrih_GP_cdnNotPt_V4: 2704 case Hexagon::STriw_GP_cdnPt_V4: 2705 case Hexagon::STriw_GP_cdnNotPt_V4: 2706 case Hexagon::STd_GP_cdnPt_V4: 2707 case Hexagon::STd_GP_cdnNotPt_V4: 2708 case Hexagon::STb_GP_cdnPt_V4: 2709 case Hexagon::STb_GP_cdnNotPt_V4: 2710 case Hexagon::STh_GP_cdnPt_V4: 2711 case Hexagon::STh_GP_cdnNotPt_V4: 2712 case Hexagon::STw_GP_cdnPt_V4: 2713 case Hexagon::STw_GP_cdnNotPt_V4: 2714 2715 return true; 2716 } 2717 return false; 2718} 2719 2720static MachineOperand& GetPostIncrementOperand(MachineInstr *MI, 2721 const HexagonInstrInfo *QII) { 2722 assert(QII->isPostIncrement(MI) && "Not a post increment operation."); 2723#ifndef NDEBUG 2724 // Post Increment means duplicates. Use dense map to find duplicates in the 2725 // list. Caution: Densemap initializes with the minimum of 64 buckets, 2726 // whereas there are at most 5 operands in the post increment. 2727 DenseMap<unsigned, unsigned> DefRegsSet; 2728 for(unsigned opNum = 0; opNum < MI->getNumOperands(); opNum++) 2729 if (MI->getOperand(opNum).isReg() && 2730 MI->getOperand(opNum).isDef()) { 2731 DefRegsSet[MI->getOperand(opNum).getReg()] = 1; 2732 } 2733 2734 for(unsigned opNum = 0; opNum < MI->getNumOperands(); opNum++) 2735 if (MI->getOperand(opNum).isReg() && 2736 MI->getOperand(opNum).isUse()) { 2737 if (DefRegsSet[MI->getOperand(opNum).getReg()]) { 2738 return MI->getOperand(opNum); 2739 } 2740 } 2741#else 2742 if (MI->getDesc().mayLoad()) { 2743 // The 2nd operand is always the post increment operand in load. 2744 assert(MI->getOperand(1).isReg() && 2745 "Post increment operand has be to a register."); 2746 return (MI->getOperand(1)); 2747 } 2748 if (MI->getDesc().mayStore()) { 2749 // The 1st operand is always the post increment operand in store. 2750 assert(MI->getOperand(0).isReg() && 2751 "Post increment operand has be to a register."); 2752 return (MI->getOperand(0)); 2753 } 2754#endif 2755 // we should never come here. 2756 llvm_unreachable("mayLoad or mayStore not set for Post Increment operation"); 2757} 2758 2759// get the value being stored 2760static MachineOperand& GetStoreValueOperand(MachineInstr *MI) { 2761 // value being stored is always the last operand. 2762 return (MI->getOperand(MI->getNumOperands()-1)); 2763} 2764 2765// can be new value store? 2766// Following restrictions are to be respected in convert a store into 2767// a new value store. 2768// 1. If an instruction uses auto-increment, its address register cannot 2769// be a new-value register. Arch Spec 5.4.2.1 2770// 2. If an instruction uses absolute-set addressing mode, 2771// its address register cannot be a new-value register. 2772// Arch Spec 5.4.2.1.TODO: This is not enabled as 2773// as absolute-set address mode patters are not implemented. 2774// 3. If an instruction produces a 64-bit result, its registers cannot be used 2775// as new-value registers. Arch Spec 5.4.2.2. 2776// 4. If the instruction that sets a new-value register is conditional, then 2777// the instruction that uses the new-value register must also be conditional, 2778// and both must always have their predicates evaluate identically. 2779// Arch Spec 5.4.2.3. 2780// 5. There is an implied restriction of a packet can not have another store, 2781// if there is a new value store in the packet. Corollary, if there is 2782// already a store in a packet, there can not be a new value store. 2783// Arch Spec: 3.4.4.2 2784bool HexagonPacketizerList::CanPromoteToNewValueStore( MachineInstr *MI, 2785 MachineInstr *PacketMI, unsigned DepReg, 2786 std::map <MachineInstr*, SUnit*> MIToSUnit) 2787{ 2788 // Make sure we are looking at the store 2789 if (!IsNewifyStore(MI)) 2790 return false; 2791 2792 // Make sure there is dependency and can be new value'ed 2793 if (GetStoreValueOperand(MI).isReg() && 2794 GetStoreValueOperand(MI).getReg() != DepReg) 2795 return false; 2796 2797 const HexagonRegisterInfo* QRI = (const HexagonRegisterInfo *) TM.getRegisterInfo(); 2798 const MCInstrDesc& MCID = PacketMI->getDesc(); 2799 // first operand is always the result 2800 2801 const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII; 2802 const TargetRegisterClass* PacketRC = QII->getRegClass(MCID, 0, QRI); 2803 2804 // if there is already an store in the packet, no can do new value store 2805 // Arch Spec 3.4.4.2. 2806 for (std::vector<MachineInstr*>::iterator VI = CurrentPacketMIs.begin(), 2807 VE = CurrentPacketMIs.end(); 2808 (VI != VE); ++VI) { 2809 SUnit* PacketSU = MIToSUnit[*VI]; 2810 if (PacketSU->getInstr()->getDesc().mayStore() || 2811 // if we have mayStore = 1 set on ALLOCFRAME and DEALLOCFRAME, 2812 // then we don't need this 2813 PacketSU->getInstr()->getOpcode() == Hexagon::ALLOCFRAME || 2814 PacketSU->getInstr()->getOpcode() == Hexagon::DEALLOCFRAME) 2815 return false; 2816 } 2817 2818 if (PacketRC == Hexagon::DoubleRegsRegisterClass) { 2819 // new value store constraint: double regs can not feed into new value store 2820 // arch spec section: 5.4.2.2 2821 return false; 2822 } 2823 2824 // Make sure it's NOT the post increment register that we are going to 2825 // new value. 2826 if (QII->isPostIncrement(MI) && 2827 MI->getDesc().mayStore() && 2828 GetPostIncrementOperand(MI, QII).getReg() == DepReg) { 2829 return false; 2830 } 2831 2832 if (QII->isPostIncrement(PacketMI) && 2833 PacketMI->getDesc().mayLoad() && 2834 GetPostIncrementOperand(PacketMI, QII).getReg() == DepReg) { 2835 // if source is post_inc, or absolute-set addressing, 2836 // it can not feed into new value store 2837 // r3 = memw(r2++#4) 2838 // memw(r30 + #-1404) = r2.new -> can not be new value store 2839 // arch spec section: 5.4.2.1 2840 return false; 2841 } 2842 2843 // If the source that feeds the store is predicated, new value store must also be 2844 // also predicated. 2845 if (QII->isPredicated(PacketMI)) { 2846 if (!QII->isPredicated(MI)) 2847 return false; 2848 2849 // Check to make sure that they both will have their predicates 2850 // evaluate identically 2851 unsigned predRegNumSrc; 2852 unsigned predRegNumDst; 2853 const TargetRegisterClass* predRegClass; 2854 2855 // Get predicate register used in the source instruction 2856 for(unsigned opNum = 0; opNum < PacketMI->getNumOperands(); opNum++) { 2857 if ( PacketMI->getOperand(opNum).isReg()) 2858 predRegNumSrc = PacketMI->getOperand(opNum).getReg(); 2859 predRegClass = QRI->getMinimalPhysRegClass(predRegNumSrc); 2860 if (predRegClass == Hexagon::PredRegsRegisterClass) { 2861 break; 2862 } 2863 } 2864 assert ((predRegClass == Hexagon::PredRegsRegisterClass ) && 2865 ("predicate register not found in a predicated PacketMI instruction")); 2866 2867 // Get predicate register used in new-value store instruction 2868 for(unsigned opNum = 0; opNum < MI->getNumOperands(); opNum++) { 2869 if ( MI->getOperand(opNum).isReg()) 2870 predRegNumDst = MI->getOperand(opNum).getReg(); 2871 predRegClass = QRI->getMinimalPhysRegClass(predRegNumDst); 2872 if (predRegClass == Hexagon::PredRegsRegisterClass) { 2873 break; 2874 } 2875 } 2876 assert ((predRegClass == Hexagon::PredRegsRegisterClass ) && 2877 ("predicate register not found in a predicated MI instruction")); 2878 2879 // New-value register producer and user (store) need to satisfy these 2880 // constraints: 2881 // 1) Both instructions should be predicated on the same register. 2882 // 2) If producer of the new-value register is .new predicated then store 2883 // should also be .new predicated and if producer is not .new predicated 2884 // then store should not be .new predicated. 2885 // 3) Both new-value register producer and user should have same predicate 2886 // sense, i.e, either both should be negated or both should be none negated. 2887 2888 if (( predRegNumDst != predRegNumSrc) || 2889 isDotNewInst(PacketMI) != isDotNewInst(MI) || 2890 GetPredicateSense(MI, QII) != GetPredicateSense(PacketMI, QII)) { 2891 return false; 2892 } 2893 } 2894 2895 // Make sure that other than the new-value register no other store instruction 2896 // register has been modified in the same packet. Predicate registers can be 2897 // modified by they should not be modified between the producer and the store 2898 // instruction as it will make them both conditional on different values. 2899 // We already know this to be true for all the instructions before and 2900 // including PacketMI. Howerver, we need to perform the check for the 2901 // remaining instructions in the packet. 2902 2903 std::vector<MachineInstr*>::iterator VI; 2904 std::vector<MachineInstr*>::iterator VE; 2905 unsigned StartCheck = 0; 2906 2907 for (VI=CurrentPacketMIs.begin(), VE = CurrentPacketMIs.end(); 2908 (VI != VE); ++VI) { 2909 SUnit* TempSU = MIToSUnit[*VI]; 2910 MachineInstr* TempMI = TempSU->getInstr(); 2911 2912 // Following condition is true for all the instructions until PacketMI is 2913 // reached (StartCheck is set to 0 before the for loop). 2914 // StartCheck flag is 1 for all the instructions after PacketMI. 2915 if (TempMI != PacketMI && !StartCheck) // start processing only after 2916 continue; // encountering PacketMI 2917 2918 StartCheck = 1; 2919 if (TempMI == PacketMI) // We don't want to check PacketMI for dependence 2920 continue; 2921 2922 for(unsigned opNum = 0; opNum < MI->getNumOperands(); opNum++) { 2923 if (MI->getOperand(opNum).isReg() && 2924 TempSU->getInstr()->modifiesRegister(MI->getOperand(opNum).getReg(), QRI)) 2925 return false; 2926 } 2927 } 2928 2929 // Make sure that for non POST_INC stores: 2930 // 1. The only use of reg is DepReg and no other registers. 2931 // This handles V4 base+index registers. 2932 // The following store can not be dot new. 2933 // Eg. r0 = add(r0, #3)a 2934 // memw(r1+r0<<#2) = r0 2935 if (!QII->isPostIncrement(MI) && 2936 GetStoreValueOperand(MI).isReg() && 2937 GetStoreValueOperand(MI).getReg() == DepReg) { 2938 for(unsigned opNum = 0; opNum < MI->getNumOperands()-1; opNum++) { 2939 if (MI->getOperand(opNum).isReg() && 2940 MI->getOperand(opNum).getReg() == DepReg) { 2941 return false; 2942 } 2943 } 2944 // 2. If data definition is because of implicit definition of the register, 2945 // do not newify the store. Eg. 2946 // %R9<def> = ZXTH %R12, %D6<imp-use>, %R12<imp-def> 2947 // STrih_indexed %R8, 2, %R12<kill>; mem:ST2[%scevgep343] 2948 for(unsigned opNum = 0; opNum < PacketMI->getNumOperands(); opNum++) { 2949 if (PacketMI->getOperand(opNum).isReg() && 2950 PacketMI->getOperand(opNum).getReg() == DepReg && 2951 PacketMI->getOperand(opNum).isDef() && 2952 PacketMI->getOperand(opNum).isImplicit()) { 2953 return false; 2954 } 2955 } 2956 } 2957 2958 // Can be dot new store. 2959 return true; 2960} 2961 2962// can this MI to promoted to either 2963// new value store or new value jump 2964bool HexagonPacketizerList::CanPromoteToNewValue( MachineInstr *MI, 2965 SUnit *PacketSU, unsigned DepReg, 2966 std::map <MachineInstr*, SUnit*> MIToSUnit, 2967 MachineBasicBlock::iterator &MII) 2968{ 2969 2970 const HexagonRegisterInfo* QRI = (const HexagonRegisterInfo *) TM.getRegisterInfo(); 2971 if (!QRI->Subtarget.hasV4TOps() || 2972 !IsNewifyStore(MI)) 2973 return false; 2974 2975 MachineInstr *PacketMI = PacketSU->getInstr(); 2976 2977 // Check to see the store can be new value'ed. 2978 if (CanPromoteToNewValueStore(MI, PacketMI, DepReg, MIToSUnit)) 2979 return true; 2980 2981 // Check to see the compare/jump can be new value'ed. 2982 // This is done as a pass on its own. Don't need to check it here. 2983 return false; 2984} 2985 2986// Check to see if an instruction can be dot new 2987// There are three kinds. 2988// 1. dot new on predicate - V2/V3/V4 2989// 2. dot new on stores NV/ST - V4 2990// 3. dot new on jump NV/J - V4 -- This is generated in a pass. 2991bool HexagonPacketizerList::CanPromoteToDotNew( MachineInstr *MI, 2992 SUnit *PacketSU, unsigned DepReg, 2993 std::map <MachineInstr*, SUnit*> MIToSUnit, 2994 MachineBasicBlock::iterator &MII, 2995 const TargetRegisterClass* RC ) 2996{ 2997 // already a dot new instruction 2998 if (isDotNewInst(MI) && !IsNewifyStore(MI)) 2999 return false; 3000 3001 if (!isNewifiable(MI)) 3002 return false; 3003 3004 // predicate .new 3005 if (RC == Hexagon::PredRegsRegisterClass && isCondInst(MI)) 3006 return true; 3007 else if (RC != Hexagon::PredRegsRegisterClass && 3008 !IsNewifyStore(MI)) // MI is not a new-value store 3009 return false; 3010 else { 3011 // Create a dot new machine instruction to see if resources can be 3012 // allocated. If not, bail out now. 3013 const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII; 3014 int NewOpcode = GetDotNewOp(MI->getOpcode()); 3015 const MCInstrDesc &desc = QII->get(NewOpcode); 3016 DebugLoc dl; 3017 MachineInstr *NewMI = MI->getParent()->getParent()->CreateMachineInstr(desc, dl); 3018 bool ResourcesAvailable = ResourceTracker->canReserveResources(NewMI); 3019 MI->getParent()->getParent()->DeleteMachineInstr(NewMI); 3020 3021 if (!ResourcesAvailable) 3022 return false; 3023 3024 // new value store only 3025 // new new value jump generated as a passes 3026 if (!CanPromoteToNewValue(MI, PacketSU, DepReg, MIToSUnit, MII)) { 3027 return false; 3028 } 3029 } 3030 return true; 3031} 3032 3033// Go through the packet instructions and search for anti dependency 3034// between them and DepReg from MI 3035// Consider this case: 3036// Trying to add 3037// a) %R1<def> = TFRI_cdNotPt %P3, 2 3038// to this packet: 3039// { 3040// b) %P0<def> = OR_pp %P3<kill>, %P0<kill> 3041// c) %P3<def> = TFR_PdRs %R23 3042// d) %R1<def> = TFRI_cdnPt %P3, 4 3043// } 3044// The P3 from a) and d) will be complements after 3045// a)'s P3 is converted to .new form 3046// Anti Dep between c) and b) is irrelevant for this case 3047bool HexagonPacketizerList::RestrictingDepExistInPacket (MachineInstr* MI, 3048 unsigned DepReg, 3049 std::map <MachineInstr*, SUnit*> MIToSUnit) { 3050 3051 const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII; 3052 SUnit* PacketSUDep = MIToSUnit[MI]; 3053 3054 for (std::vector<MachineInstr*>::iterator VIN = CurrentPacketMIs.begin(), 3055 VEN = CurrentPacketMIs.end(); (VIN != VEN); ++VIN) { 3056 3057 // We only care for dependencies to predicated instructions 3058 if(!QII->isPredicated(*VIN)) continue; 3059 3060 // Scheduling Unit for current insn in the packet 3061 SUnit* PacketSU = MIToSUnit[*VIN]; 3062 3063 // Look at dependencies between current members of the packet 3064 // and predicate defining instruction MI. 3065 // Make sure that dependency is on the exact register 3066 // we care about. 3067 if (PacketSU->isSucc(PacketSUDep)) { 3068 for (unsigned i = 0; i < PacketSU->Succs.size(); ++i) { 3069 if ((PacketSU->Succs[i].getSUnit() == PacketSUDep) && 3070 (PacketSU->Succs[i].getKind() == SDep::Anti) && 3071 (PacketSU->Succs[i].getReg() == DepReg)) { 3072 return true; 3073 } 3074 } 3075 } 3076 } 3077 3078 return false; 3079} 3080 3081 3082// Given two predicated instructions, this function detects whether 3083// the predicates are complements 3084bool HexagonPacketizerList::ArePredicatesComplements (MachineInstr* MI1, 3085 MachineInstr* MI2, std::map <MachineInstr*, SUnit*> MIToSUnit) { 3086 3087 const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII; 3088 // Currently can only reason about conditional transfers 3089 if (!QII->isConditionalTransfer(MI1) || !QII->isConditionalTransfer(MI2)) { 3090 return false; 3091 } 3092 3093 // Scheduling unit for candidate 3094 SUnit* SU = MIToSUnit[MI1]; 3095 3096 // One corner case deals with the following scenario: 3097 // Trying to add 3098 // a) %R24<def> = TFR_cPt %P0, %R25 3099 // to this packet: 3100 // 3101 // { 3102 // b) %R25<def> = TFR_cNotPt %P0, %R24 3103 // c) %P0<def> = CMPEQri %R26, 1 3104 // } 3105 // 3106 // On general check a) and b) are complements, but 3107 // presence of c) will convert a) to .new form, and 3108 // then it is not a complement 3109 // We attempt to detect it by analyzing existing 3110 // dependencies in the packet 3111 3112 // Analyze relationships between all existing members of the packet. 3113 // Look for Anti dependecy on the same predicate reg 3114 // as used in the candidate 3115 for (std::vector<MachineInstr*>::iterator VIN = CurrentPacketMIs.begin(), 3116 VEN = CurrentPacketMIs.end(); (VIN != VEN); ++VIN) { 3117 3118 // Scheduling Unit for current insn in the packet 3119 SUnit* PacketSU = MIToSUnit[*VIN]; 3120 3121 // If this instruction in the packet is succeeded by the candidate... 3122 if (PacketSU->isSucc(SU)) { 3123 for (unsigned i = 0; i < PacketSU->Succs.size(); ++i) { 3124 // The corner case exist when there is true data 3125 // dependency between candidate and one of current 3126 // packet members, this dep is on predicate reg, and 3127 // there already exist anti dep on the same pred in 3128 // the packet. 3129 if (PacketSU->Succs[i].getSUnit() == SU && 3130 Hexagon::PredRegsRegisterClass->contains( 3131 PacketSU->Succs[i].getReg()) && 3132 PacketSU->Succs[i].getKind() == SDep::Data && 3133 // Here I know that *VIN is predicate setting instruction 3134 // with true data dep to candidate on the register 3135 // we care about - c) in the above example. 3136 // Now I need to see if there is an anti dependency 3137 // from c) to any other instruction in the 3138 // same packet on the pred reg of interest 3139 RestrictingDepExistInPacket(*VIN,PacketSU->Succs[i].getReg(), 3140 MIToSUnit)) { 3141 return false; 3142 } 3143 } 3144 } 3145 } 3146 3147 // If the above case does not apply, check regular 3148 // complement condition. 3149 // Check that the predicate register is the same and 3150 // that the predicate sense is different 3151 // We also need to differentiate .old vs. .new: 3152 // !p0 is not complimentary to p0.new 3153 return ((MI1->getOperand(1).getReg() == MI2->getOperand(1).getReg()) && 3154 (GetPredicateSense(MI1, QII) != GetPredicateSense(MI2, QII)) && 3155 (isDotNewInst(MI1) == isDotNewInst(MI2))); 3156} 3157 3158// initPacketizerState - Initialize packetizer flags 3159void HexagonPacketizerList::initPacketizerState() { 3160 3161 Dependence = false; 3162 PromotedToDotNew = false; 3163 GlueToNewValueJump = false; 3164 GlueAllocframeStore = false; 3165 FoundSequentialDependence = false; 3166 3167 return; 3168} 3169 3170// ignorePseudoInstruction - Ignore bundling of pseudo instructions. 3171bool HexagonPacketizerList::ignorePseudoInstruction(MachineInstr *MI, 3172 MachineBasicBlock *MBB) { 3173 if (MI->isDebugValue()) 3174 return true; 3175 3176 // We must print out inline assembly 3177 if (MI->isInlineAsm()) 3178 return false; 3179 3180 // We check if MI has any functional units mapped to it. 3181 // If it doesn't, we ignore the instruction. 3182 const MCInstrDesc& TID = MI->getDesc(); 3183 unsigned SchedClass = TID.getSchedClass(); 3184 const InstrStage* IS = ResourceTracker->getInstrItins()->beginStage(SchedClass); 3185 unsigned FuncUnits = IS->getUnits(); 3186 return !FuncUnits; 3187} 3188 3189// isSoloInstruction: - Returns true for instructions that must be 3190// scheduled in their own packet. 3191bool HexagonPacketizerList::isSoloInstruction(MachineInstr *MI) { 3192 3193 if (MI->isInlineAsm()) 3194 return true; 3195 3196 if (MI->isEHLabel()) 3197 return true; 3198 3199 // From Hexagon V4 Programmer's Reference Manual 3.4.4 Grouping constraints: 3200 // trap, pause, barrier, icinva, isync, and syncht are solo instructions. 3201 // They must not be grouped with other instructions in a packet. 3202 if (IsSchedBarrier(MI)) 3203 return true; 3204 3205 return false; 3206} 3207 3208// isLegalToPacketizeTogether: 3209// SUI is the current instruction that is out side of the current packet. 3210// SUJ is the current instruction inside the current packet against which that 3211// SUI will be packetized. 3212bool HexagonPacketizerList::isLegalToPacketizeTogether(SUnit *SUI, SUnit *SUJ) { 3213 MachineInstr *I = SUI->getInstr(); 3214 MachineInstr *J = SUJ->getInstr(); 3215 assert(I && J && "Unable to packetize null instruction!"); 3216 3217 const MCInstrDesc &MCIDI = I->getDesc(); 3218 const MCInstrDesc &MCIDJ = J->getDesc(); 3219 3220 MachineBasicBlock::iterator II = I; 3221 3222 const unsigned FrameSize = MF.getFrameInfo()->getStackSize(); 3223 const HexagonRegisterInfo* QRI = (const HexagonRegisterInfo *) TM.getRegisterInfo(); 3224 const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII; 3225 3226 // Inline asm cannot go in the packet. 3227 if (I->getOpcode() == Hexagon::INLINEASM) 3228 llvm_unreachable("Should not meet inline asm here!"); 3229 3230 if (isSoloInstruction(I)) 3231 llvm_unreachable("Should not meet solo instr here!"); 3232 3233 // A save callee-save register function call can only be in a packet 3234 // with instructions that don't write to the callee-save registers. 3235 if ((QII->isSaveCalleeSavedRegsCall(I) && 3236 DoesModifyCalleeSavedReg(J, QRI)) || 3237 (QII->isSaveCalleeSavedRegsCall(J) && 3238 DoesModifyCalleeSavedReg(I, QRI))) { 3239 Dependence = true; 3240 return false; 3241 } 3242 3243 // Two control flow instructions cannot go in the same packet. 3244 if (IsControlFlow(I) && IsControlFlow(J)) { 3245 Dependence = true; 3246 return false; 3247 } 3248 3249 // A LoopN instruction cannot appear in the same packet as a jump or call. 3250 if (IsLoopN(I) && ( IsDirectJump(J) 3251 || MCIDJ.isCall() 3252 || QII->isDeallocRet(J))) { 3253 Dependence = true; 3254 return false; 3255 } 3256 if (IsLoopN(J) && ( IsDirectJump(I) 3257 || MCIDI.isCall() 3258 || QII->isDeallocRet(I))) { 3259 Dependence = true; 3260 return false; 3261 } 3262 3263 // dealloc_return cannot appear in the same packet as a conditional or 3264 // unconditional jump. 3265 if (QII->isDeallocRet(I) && ( MCIDJ.isBranch() 3266 || MCIDJ.isCall() 3267 || MCIDJ.isBarrier())) { 3268 Dependence = true; 3269 return false; 3270 } 3271 3272 3273 // V4 allows dual store. But does not allow second store, if the 3274 // first store is not in SLOT0. New value store, new value jump, 3275 // dealloc_return and memop always take SLOT0. 3276 // Arch spec 3.4.4.2 3277 if (QRI->Subtarget.hasV4TOps()) { 3278 3279 if (MCIDI.mayStore() && MCIDJ.mayStore() && isNewValueInst(J)) { 3280 Dependence = true; 3281 return false; 3282 } 3283 3284 if ( (QII->isMemOp(J) && MCIDI.mayStore()) 3285 || (MCIDJ.mayStore() && QII->isMemOp(I)) 3286 || (QII->isMemOp(J) && QII->isMemOp(I))) { 3287 Dependence = true; 3288 return false; 3289 } 3290 3291 //if dealloc_return 3292 if (MCIDJ.mayStore() && QII->isDeallocRet(I)){ 3293 Dependence = true; 3294 return false; 3295 } 3296 3297 // If an instruction feeds new value jump, glue it. 3298 MachineBasicBlock::iterator NextMII = I; 3299 ++NextMII; 3300 MachineInstr *NextMI = NextMII; 3301 3302 if (QII->isNewValueJump(NextMI)) { 3303 3304 bool secondRegMatch = false; 3305 bool maintainNewValueJump = false; 3306 3307 if (NextMI->getOperand(1).isReg() && 3308 I->getOperand(0).getReg() == NextMI->getOperand(1).getReg()) { 3309 secondRegMatch = true; 3310 maintainNewValueJump = true; 3311 } 3312 3313 if (!secondRegMatch && 3314 I->getOperand(0).getReg() == NextMI->getOperand(0).getReg()) { 3315 maintainNewValueJump = true; 3316 } 3317 3318 for (std::vector<MachineInstr*>::iterator 3319 VI = CurrentPacketMIs.begin(), 3320 VE = CurrentPacketMIs.end(); 3321 (VI != VE && maintainNewValueJump); ++VI) { 3322 SUnit* PacketSU = MIToSUnit[*VI]; 3323 3324 // NVJ can not be part of the dual jump - Arch Spec: section 7.8 3325 if (PacketSU->getInstr()->getDesc().isCall()) { 3326 Dependence = true; 3327 break; 3328 } 3329 // Validate 3330 // 1. Packet does not have a store in it. 3331 // 2. If the first operand of the nvj is newified, and the second 3332 // operand is also a reg, it (second reg) is not defined in 3333 // the same packet. 3334 // 3. If the second operand of the nvj is newified, (which means 3335 // first operand is also a reg), first reg is not defined in 3336 // the same packet. 3337 if (PacketSU->getInstr()->getDesc().mayStore() || 3338 PacketSU->getInstr()->getOpcode() == Hexagon::ALLOCFRAME || 3339 // Check #2. 3340 (!secondRegMatch && NextMI->getOperand(1).isReg() && 3341 PacketSU->getInstr()->modifiesRegister( 3342 NextMI->getOperand(1).getReg(), QRI)) || 3343 // Check #3. 3344 (secondRegMatch && 3345 PacketSU->getInstr()->modifiesRegister( 3346 NextMI->getOperand(0).getReg(), QRI))) { 3347 Dependence = true; 3348 break; 3349 } 3350 } 3351 if (!Dependence) 3352 GlueToNewValueJump = true; 3353 else 3354 return false; 3355 } 3356 } 3357 3358 if (SUJ->isSucc(SUI)) { 3359 for (unsigned i = 0; 3360 (i < SUJ->Succs.size()) && !FoundSequentialDependence; 3361 ++i) { 3362 3363 if (SUJ->Succs[i].getSUnit() != SUI) { 3364 continue; 3365 } 3366 3367 SDep::Kind DepType = SUJ->Succs[i].getKind(); 3368 3369 // For direct calls: 3370 // Ignore register dependences for call instructions for 3371 // packetization purposes except for those due to r31 and 3372 // predicate registers. 3373 // 3374 // For indirect calls: 3375 // Same as direct calls + check for true dependences to the register 3376 // used in the indirect call. 3377 // 3378 // We completely ignore Order dependences for call instructions 3379 // 3380 // For returns: 3381 // Ignore register dependences for return instructions like jumpr, 3382 // dealloc return unless we have dependencies on the explicit uses 3383 // of the registers used by jumpr (like r31) or dealloc return 3384 // (like r29 or r30). 3385 // 3386 // TODO: Currently, jumpr is handling only return of r31. So, the 3387 // following logic (specificaly IsCallDependent) is working fine. 3388 // We need to enable jumpr for register other than r31 and then, 3389 // we need to rework the last part, where it handles indirect call 3390 // of that (IsCallDependent) function. Bug 6216 is opened for this. 3391 // 3392 unsigned DepReg; 3393 const TargetRegisterClass* RC; 3394 if (DepType == SDep::Data) { 3395 DepReg = SUJ->Succs[i].getReg(); 3396 RC = QRI->getMinimalPhysRegClass(DepReg); 3397 } 3398 if ((MCIDI.isCall() || MCIDI.isReturn()) && 3399 (!IsRegDependence(DepType) || 3400 !IsCallDependent(I, DepType, SUJ->Succs[i].getReg()))) { 3401 /* do nothing */ 3402 } 3403 3404 // For instructions that can be promoted to dot-new, try to promote. 3405 else if ((DepType == SDep::Data) && 3406 CanPromoteToDotNew(I, SUJ, DepReg, MIToSUnit, II, RC) && 3407 PromoteToDotNew(I, DepType, II, RC)) { 3408 PromotedToDotNew = true; 3409 /* do nothing */ 3410 } 3411 3412 else if ((DepType == SDep::Data) && 3413 (QII->isNewValueJump(I))) { 3414 /* do nothing */ 3415 } 3416 3417 // For predicated instructions, if the predicates are complements 3418 // then there can be no dependence. 3419 else if (QII->isPredicated(I) && 3420 QII->isPredicated(J) && 3421 ArePredicatesComplements(I, J, MIToSUnit)) { 3422 /* do nothing */ 3423 3424 } 3425 else if (IsDirectJump(I) && 3426 !MCIDJ.isBranch() && 3427 !MCIDJ.isCall() && 3428 (DepType == SDep::Order)) { 3429 // Ignore Order dependences between unconditional direct branches 3430 // and non-control-flow instructions 3431 /* do nothing */ 3432 } 3433 else if (MCIDI.isConditionalBranch() && (DepType != SDep::Data) && 3434 (DepType != SDep::Output)) { 3435 // Ignore all dependences for jumps except for true and output 3436 // dependences 3437 /* do nothing */ 3438 } 3439 3440 // Ignore output dependences due to superregs. We can 3441 // write to two different subregisters of R1:0 for instance 3442 // in the same cycle 3443 // 3444 3445 // 3446 // Let the 3447 // If neither I nor J defines DepReg, then this is a 3448 // superfluous output dependence. The dependence must be of the 3449 // form: 3450 // R0 = ... 3451 // R1 = ... 3452 // and there is an output dependence between the two instructions 3453 // with 3454 // DepReg = D0 3455 // We want to ignore these dependences. 3456 // Ideally, the dependence constructor should annotate such 3457 // dependences. We can then avoid this relatively expensive check. 3458 // 3459 else if (DepType == SDep::Output) { 3460 // DepReg is the register that's responsible for the dependence. 3461 unsigned DepReg = SUJ->Succs[i].getReg(); 3462 3463 // Check if I and J really defines DepReg. 3464 if (I->definesRegister(DepReg) || 3465 J->definesRegister(DepReg)) { 3466 FoundSequentialDependence = true; 3467 break; 3468 } 3469 } 3470 3471 // We ignore Order dependences for 3472 // 1. Two loads unless they are volatile. 3473 // 2. Two stores in V4 unless they are volatile. 3474 else if ((DepType == SDep::Order) && 3475 !I->hasVolatileMemoryRef() && 3476 !J->hasVolatileMemoryRef()) { 3477 if (QRI->Subtarget.hasV4TOps() && 3478 // hexagonv4 allows dual store. 3479 MCIDI.mayStore() && MCIDJ.mayStore()) { 3480 /* do nothing */ 3481 } 3482 // store followed by store-- not OK on V2 3483 // store followed by load -- not OK on all (OK if addresses 3484 // are not aliased) 3485 // load followed by store -- OK on all 3486 // load followed by load -- OK on all 3487 else if ( !MCIDJ.mayStore()) { 3488 /* do nothing */ 3489 } 3490 else { 3491 FoundSequentialDependence = true; 3492 break; 3493 } 3494 } 3495 3496 // For V4, special case ALLOCFRAME. Even though there is dependency 3497 // between ALLOCAFRAME and subsequent store, allow it to be 3498 // packetized in a same packet. This implies that the store is using 3499 // caller's SP. Hense, offset needs to be updated accordingly. 3500 else if (DepType == SDep::Data 3501 && QRI->Subtarget.hasV4TOps() 3502 && J->getOpcode() == Hexagon::ALLOCFRAME 3503 && (I->getOpcode() == Hexagon::STrid 3504 || I->getOpcode() == Hexagon::STriw 3505 || I->getOpcode() == Hexagon::STrib) 3506 && I->getOperand(0).getReg() == QRI->getStackRegister() 3507 && QII->isValidOffset(I->getOpcode(), 3508 I->getOperand(1).getImm() - 3509 (FrameSize + HEXAGON_LRFP_SIZE))) 3510 { 3511 GlueAllocframeStore = true; 3512 // Since this store is to be glued with allocframe in the same 3513 // packet, it will use SP of the previous stack frame, i.e 3514 // caller's SP. Therefore, we need to recalculate offset according 3515 // to this change. 3516 I->getOperand(1).setImm(I->getOperand(1).getImm() - 3517 (FrameSize + HEXAGON_LRFP_SIZE)); 3518 } 3519 3520 // 3521 // Skip over anti-dependences. Two instructions that are 3522 // anti-dependent can share a packet 3523 // 3524 else if (DepType != SDep::Anti) { 3525 FoundSequentialDependence = true; 3526 break; 3527 } 3528 } 3529 3530 if (FoundSequentialDependence) { 3531 Dependence = true; 3532 return false; 3533 } 3534 } 3535 3536 return true; 3537} 3538 3539// isLegalToPruneDependencies 3540bool HexagonPacketizerList::isLegalToPruneDependencies(SUnit *SUI, SUnit *SUJ) { 3541 MachineInstr *I = SUI->getInstr(); 3542 assert(I && SUJ->getInstr() && "Unable to packetize null instruction!"); 3543 3544 const unsigned FrameSize = MF.getFrameInfo()->getStackSize(); 3545 3546 if (Dependence) { 3547 3548 // Check if the instruction was promoted to a dot-new. If so, demote it 3549 // back into a dot-old. 3550 if (PromotedToDotNew) { 3551 DemoteToDotOld(I); 3552 } 3553 3554 // Check if the instruction (must be a store) was glued with an Allocframe 3555 // instruction. If so, restore its offset to its original value, i.e. use 3556 // curent SP instead of caller's SP. 3557 if (GlueAllocframeStore) { 3558 I->getOperand(1).setImm(I->getOperand(1).getImm() + 3559 FrameSize + HEXAGON_LRFP_SIZE); 3560 } 3561 3562 return false; 3563 } 3564 return true; 3565} 3566 3567MachineBasicBlock::iterator HexagonPacketizerList::addToPacket(MachineInstr *MI) { 3568 3569 MachineBasicBlock::iterator MII = MI; 3570 MachineBasicBlock *MBB = MI->getParent(); 3571 3572 const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII; 3573 3574 if (GlueToNewValueJump) { 3575 3576 ++MII; 3577 MachineInstr *nvjMI = MII; 3578 assert(ResourceTracker->canReserveResources(MI)); 3579 ResourceTracker->reserveResources(MI); 3580 if (QII->isExtended(MI) && 3581 !tryAllocateResourcesForConstExt(MI)) { 3582 endPacket(MBB, MI); 3583 ResourceTracker->reserveResources(MI); 3584 assert(canReserveResourcesForConstExt(MI) && 3585 "Ensure that there is a slot"); 3586 reserveResourcesForConstExt(MI); 3587 // Reserve resources for new value jump constant extender. 3588 assert(canReserveResourcesForConstExt(MI) && 3589 "Ensure that there is a slot"); 3590 reserveResourcesForConstExt(nvjMI); 3591 assert(ResourceTracker->canReserveResources(nvjMI) && 3592 "Ensure that there is a slot"); 3593 3594 } else if ( // Extended instruction takes two slots in the packet. 3595 // Try reserve and allocate 4-byte in the current packet first. 3596 (QII->isExtended(nvjMI) 3597 && (!tryAllocateResourcesForConstExt(nvjMI) 3598 || !ResourceTracker->canReserveResources(nvjMI))) 3599 || // For non-extended instruction, no need to allocate extra 4 bytes. 3600 (!QII->isExtended(nvjMI) && !ResourceTracker->canReserveResources(nvjMI))) 3601 { 3602 endPacket(MBB, MI); 3603 // A new and empty packet starts. 3604 // We are sure that the resources requirements can be satisfied. 3605 // Therefore, do not need to call "canReserveResources" anymore. 3606 ResourceTracker->reserveResources(MI); 3607 if (QII->isExtended(nvjMI)) 3608 reserveResourcesForConstExt(nvjMI); 3609 } 3610 // Here, we are sure that "reserveResources" would succeed. 3611 ResourceTracker->reserveResources(nvjMI); 3612 CurrentPacketMIs.push_back(MI); 3613 CurrentPacketMIs.push_back(nvjMI); 3614 } else { 3615 if ( QII->isExtended(MI) 3616 && ( !tryAllocateResourcesForConstExt(MI) 3617 || !ResourceTracker->canReserveResources(MI))) 3618 { 3619 endPacket(MBB, MI); 3620 // Check if the instruction was promoted to a dot-new. If so, demote it 3621 // back into a dot-old 3622 if (PromotedToDotNew) { 3623 DemoteToDotOld(MI); 3624 } 3625 reserveResourcesForConstExt(MI); 3626 } 3627 // In case that "MI" is not an extended insn, 3628 // the resource availability has already been checked. 3629 ResourceTracker->reserveResources(MI); 3630 CurrentPacketMIs.push_back(MI); 3631 } 3632 return MII; 3633} 3634 3635//===----------------------------------------------------------------------===// 3636// Public Constructor Functions 3637//===----------------------------------------------------------------------===// 3638 3639FunctionPass *llvm::createHexagonPacketizer() { 3640 return new HexagonPacketizer(); 3641} 3642 3643