1 //===- HexagonMCInstrInfo.cpp - Hexagon sub-class of MCInst ---------------===// 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 class extends MCInstrInfo to allow Hexagon specific MCInstr queries 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "HexagonMCInstrInfo.h" 15 16 #include "Hexagon.h" 17 #include "HexagonBaseInfo.h" 18 #include "HexagonMCChecker.h" 19 20 #include "llvm/MC/MCContext.h" 21 #include "llvm/MC/MCExpr.h" 22 #include "llvm/MC/MCInstrInfo.h" 23 #include "llvm/MC/MCSubtargetInfo.h" 24 25 namespace llvm { 26 void HexagonMCInstrInfo::addConstant(MCInst &MI, uint64_t Value, 27 MCContext &Context) { 28 MI.addOperand(MCOperand::createExpr(MCConstantExpr::create(Value, Context))); 29 } 30 31 void HexagonMCInstrInfo::addConstExtender(MCContext &Context, 32 MCInstrInfo const &MCII, MCInst &MCB, 33 MCInst const &MCI) { 34 assert(HexagonMCInstrInfo::isBundle(MCB)); 35 MCOperand const &exOp = 36 MCI.getOperand(HexagonMCInstrInfo::getExtendableOp(MCII, MCI)); 37 38 // Create the extender. 39 MCInst *XMCI = 40 new (Context) MCInst(HexagonMCInstrInfo::deriveExtender(MCII, MCI, exOp)); 41 42 MCB.addOperand(MCOperand::createInst(XMCI)); 43 } 44 45 iterator_range<MCInst::const_iterator> 46 HexagonMCInstrInfo::bundleInstructions(MCInst const &MCI) { 47 assert(isBundle(MCI)); 48 return make_range(MCI.begin() + bundleInstructionsOffset, MCI.end()); 49 } 50 51 size_t HexagonMCInstrInfo::bundleSize(MCInst const &MCI) { 52 if (HexagonMCInstrInfo::isBundle(MCI)) 53 return (MCI.size() - bundleInstructionsOffset); 54 else 55 return (1); 56 } 57 58 bool HexagonMCInstrInfo::canonicalizePacket(MCInstrInfo const &MCII, 59 MCSubtargetInfo const &STI, 60 MCContext &Context, MCInst &MCB, 61 HexagonMCChecker *Check) { 62 // Examine the packet and convert pairs of instructions to compound 63 // instructions when possible. 64 if (!HexagonDisableCompound) 65 HexagonMCInstrInfo::tryCompound(MCII, Context, MCB); 66 // Check the bundle for errors. 67 bool CheckOk = Check ? Check->check() : true; 68 if (!CheckOk) 69 return false; 70 HexagonMCShuffle(MCII, STI, MCB); 71 // Examine the packet and convert pairs of instructions to duplex 72 // instructions when possible. 73 MCInst InstBundlePreDuplex = MCInst(MCB); 74 if (!HexagonDisableDuplex) { 75 SmallVector<DuplexCandidate, 8> possibleDuplexes; 76 possibleDuplexes = HexagonMCInstrInfo::getDuplexPossibilties(MCII, MCB); 77 HexagonMCShuffle(MCII, STI, Context, MCB, possibleDuplexes); 78 } 79 // Examines packet and pad the packet, if needed, when an 80 // end-loop is in the bundle. 81 HexagonMCInstrInfo::padEndloop(Context, MCB); 82 // If compounding and duplexing didn't reduce the size below 83 // 4 or less we have a packet that is too big. 84 if (HexagonMCInstrInfo::bundleSize(MCB) > HEXAGON_PACKET_SIZE) 85 return false; 86 HexagonMCShuffle(MCII, STI, MCB); 87 return true; 88 } 89 90 void HexagonMCInstrInfo::clampExtended(MCInstrInfo const &MCII, 91 MCContext &Context, MCInst &MCI) { 92 assert(HexagonMCInstrInfo::isExtendable(MCII, MCI) || 93 HexagonMCInstrInfo::isExtended(MCII, MCI)); 94 MCOperand &exOp = 95 MCI.getOperand(HexagonMCInstrInfo::getExtendableOp(MCII, MCI)); 96 // If the extended value is a constant, then use it for the extended and 97 // for the extender instructions, masking off the lower 6 bits and 98 // including the assumed bits. 99 int64_t Value; 100 if (exOp.getExpr()->evaluateAsAbsolute(Value)) { 101 unsigned Shift = HexagonMCInstrInfo::getExtentAlignment(MCII, MCI); 102 exOp.setExpr(HexagonMCExpr::create( 103 MCConstantExpr::create((Value & 0x3f) << Shift, Context), Context)); 104 } 105 } 106 107 MCInst HexagonMCInstrInfo::createBundle() { 108 MCInst Result; 109 Result.setOpcode(Hexagon::BUNDLE); 110 Result.addOperand(MCOperand::createImm(0)); 111 return Result; 112 } 113 114 MCInst *HexagonMCInstrInfo::deriveDuplex(MCContext &Context, unsigned iClass, 115 MCInst const &inst0, 116 MCInst const &inst1) { 117 assert((iClass <= 0xf) && "iClass must have range of 0 to 0xf"); 118 MCInst *duplexInst = new (Context) MCInst; 119 duplexInst->setOpcode(Hexagon::DuplexIClass0 + iClass); 120 121 MCInst *SubInst0 = new (Context) MCInst(deriveSubInst(inst0)); 122 MCInst *SubInst1 = new (Context) MCInst(deriveSubInst(inst1)); 123 duplexInst->addOperand(MCOperand::createInst(SubInst0)); 124 duplexInst->addOperand(MCOperand::createInst(SubInst1)); 125 return duplexInst; 126 } 127 128 MCInst HexagonMCInstrInfo::deriveExtender(MCInstrInfo const &MCII, 129 MCInst const &Inst, 130 MCOperand const &MO) { 131 assert(HexagonMCInstrInfo::isExtendable(MCII, Inst) || 132 HexagonMCInstrInfo::isExtended(MCII, Inst)); 133 134 MCInstrDesc const &Desc = HexagonMCInstrInfo::getDesc(MCII, Inst); 135 MCInst XMI; 136 XMI.setOpcode((Desc.isBranch() || Desc.isCall() || 137 HexagonMCInstrInfo::getType(MCII, Inst) == HexagonII::TypeCR) 138 ? Hexagon::A4_ext_b 139 : Hexagon::A4_ext); 140 if (MO.isImm()) 141 XMI.addOperand(MCOperand::createImm(MO.getImm() & (~0x3f))); 142 else if (MO.isExpr()) 143 XMI.addOperand(MCOperand::createExpr(MO.getExpr())); 144 else 145 llvm_unreachable("invalid extendable operand"); 146 return XMI; 147 } 148 149 MCInst const *HexagonMCInstrInfo::extenderForIndex(MCInst const &MCB, 150 size_t Index) { 151 assert(Index <= bundleSize(MCB)); 152 if (Index == 0) 153 return nullptr; 154 MCInst const *Inst = 155 MCB.getOperand(Index + bundleInstructionsOffset - 1).getInst(); 156 if (isImmext(*Inst)) 157 return Inst; 158 return nullptr; 159 } 160 161 void HexagonMCInstrInfo::extendIfNeeded(MCContext &Context, 162 MCInstrInfo const &MCII, MCInst &MCB, 163 MCInst const &MCI) { 164 if (isConstExtended(MCII, MCI)) 165 addConstExtender(Context, MCII, MCB, MCI); 166 } 167 168 HexagonII::MemAccessSize 169 HexagonMCInstrInfo::getAccessSize(MCInstrInfo const &MCII, MCInst const &MCI) { 170 const uint64_t F = HexagonMCInstrInfo::getDesc(MCII, MCI).TSFlags; 171 172 return (HexagonII::MemAccessSize((F >> HexagonII::MemAccessSizePos) & 173 HexagonII::MemAccesSizeMask)); 174 } 175 176 unsigned HexagonMCInstrInfo::getBitCount(MCInstrInfo const &MCII, 177 MCInst const &MCI) { 178 uint64_t const F = HexagonMCInstrInfo::getDesc(MCII, MCI).TSFlags; 179 return ((F >> HexagonII::ExtentBitsPos) & HexagonII::ExtentBitsMask); 180 } 181 182 // Return constant extended operand number. 183 unsigned short HexagonMCInstrInfo::getCExtOpNum(MCInstrInfo const &MCII, 184 MCInst const &MCI) { 185 const uint64_t F = HexagonMCInstrInfo::getDesc(MCII, MCI).TSFlags; 186 return ((F >> HexagonII::ExtendableOpPos) & HexagonII::ExtendableOpMask); 187 } 188 189 MCInstrDesc const &HexagonMCInstrInfo::getDesc(MCInstrInfo const &MCII, 190 MCInst const &MCI) { 191 return (MCII.get(MCI.getOpcode())); 192 } 193 194 unsigned HexagonMCInstrInfo::getDuplexRegisterNumbering(unsigned Reg) { 195 using namespace Hexagon; 196 switch (Reg) { 197 default: 198 llvm_unreachable("unknown duplex register"); 199 // Rs Rss 200 case R0: 201 case D0: 202 return 0; 203 case R1: 204 case D1: 205 return 1; 206 case R2: 207 case D2: 208 return 2; 209 case R3: 210 case D3: 211 return 3; 212 case R4: 213 case D8: 214 return 4; 215 case R5: 216 case D9: 217 return 5; 218 case R6: 219 case D10: 220 return 6; 221 case R7: 222 case D11: 223 return 7; 224 case R16: 225 return 8; 226 case R17: 227 return 9; 228 case R18: 229 return 10; 230 case R19: 231 return 11; 232 case R20: 233 return 12; 234 case R21: 235 return 13; 236 case R22: 237 return 14; 238 case R23: 239 return 15; 240 } 241 } 242 243 MCExpr const &HexagonMCInstrInfo::getExpr(MCExpr const &Expr) { 244 const auto &HExpr = cast<HexagonMCExpr>(Expr); 245 assert(HExpr.getExpr()); 246 return *HExpr.getExpr(); 247 } 248 249 unsigned short HexagonMCInstrInfo::getExtendableOp(MCInstrInfo const &MCII, 250 MCInst const &MCI) { 251 const uint64_t F = HexagonMCInstrInfo::getDesc(MCII, MCI).TSFlags; 252 return ((F >> HexagonII::ExtendableOpPos) & HexagonII::ExtendableOpMask); 253 } 254 255 MCOperand const & 256 HexagonMCInstrInfo::getExtendableOperand(MCInstrInfo const &MCII, 257 MCInst const &MCI) { 258 unsigned O = HexagonMCInstrInfo::getExtendableOp(MCII, MCI); 259 MCOperand const &MO = MCI.getOperand(O); 260 261 assert((HexagonMCInstrInfo::isExtendable(MCII, MCI) || 262 HexagonMCInstrInfo::isExtended(MCII, MCI)) && 263 (MO.isImm() || MO.isExpr())); 264 return (MO); 265 } 266 267 unsigned HexagonMCInstrInfo::getExtentAlignment(MCInstrInfo const &MCII, 268 MCInst const &MCI) { 269 const uint64_t F = HexagonMCInstrInfo::getDesc(MCII, MCI).TSFlags; 270 return ((F >> HexagonII::ExtentAlignPos) & HexagonII::ExtentAlignMask); 271 } 272 273 unsigned HexagonMCInstrInfo::getExtentBits(MCInstrInfo const &MCII, 274 MCInst const &MCI) { 275 const uint64_t F = HexagonMCInstrInfo::getDesc(MCII, MCI).TSFlags; 276 return ((F >> HexagonII::ExtentBitsPos) & HexagonII::ExtentBitsMask); 277 } 278 279 // Return the max value that a constant extendable operand can have 280 // without being extended. 281 int HexagonMCInstrInfo::getMaxValue(MCInstrInfo const &MCII, 282 MCInst const &MCI) { 283 uint64_t const F = HexagonMCInstrInfo::getDesc(MCII, MCI).TSFlags; 284 unsigned isSigned = 285 (F >> HexagonII::ExtentSignedPos) & HexagonII::ExtentSignedMask; 286 unsigned bits = (F >> HexagonII::ExtentBitsPos) & HexagonII::ExtentBitsMask; 287 288 if (isSigned) // if value is signed 289 return ~(-1U << (bits - 1)); 290 else 291 return ~(-1U << bits); 292 } 293 294 // Return the min value that a constant extendable operand can have 295 // without being extended. 296 int HexagonMCInstrInfo::getMinValue(MCInstrInfo const &MCII, 297 MCInst const &MCI) { 298 uint64_t const F = HexagonMCInstrInfo::getDesc(MCII, MCI).TSFlags; 299 unsigned isSigned = 300 (F >> HexagonII::ExtentSignedPos) & HexagonII::ExtentSignedMask; 301 unsigned bits = (F >> HexagonII::ExtentBitsPos) & HexagonII::ExtentBitsMask; 302 303 if (isSigned) // if value is signed 304 return -1U << (bits - 1); 305 else 306 return 0; 307 } 308 309 char const *HexagonMCInstrInfo::getName(MCInstrInfo const &MCII, 310 MCInst const &MCI) { 311 return MCII.getName(MCI.getOpcode()); 312 } 313 314 unsigned short HexagonMCInstrInfo::getNewValueOp(MCInstrInfo const &MCII, 315 MCInst const &MCI) { 316 const uint64_t F = HexagonMCInstrInfo::getDesc(MCII, MCI).TSFlags; 317 return ((F >> HexagonII::NewValueOpPos) & HexagonII::NewValueOpMask); 318 } 319 320 MCOperand const &HexagonMCInstrInfo::getNewValueOperand(MCInstrInfo const &MCII, 321 MCInst const &MCI) { 322 uint64_t const F = HexagonMCInstrInfo::getDesc(MCII, MCI).TSFlags; 323 unsigned const O = 324 (F >> HexagonII::NewValueOpPos) & HexagonII::NewValueOpMask; 325 MCOperand const &MCO = MCI.getOperand(O); 326 327 assert((HexagonMCInstrInfo::isNewValue(MCII, MCI) || 328 HexagonMCInstrInfo::hasNewValue(MCII, MCI)) && 329 MCO.isReg()); 330 return (MCO); 331 } 332 333 /// Return the new value or the newly produced value. 334 unsigned short HexagonMCInstrInfo::getNewValueOp2(MCInstrInfo const &MCII, 335 MCInst const &MCI) { 336 const uint64_t F = HexagonMCInstrInfo::getDesc(MCII, MCI).TSFlags; 337 return ((F >> HexagonII::NewValueOpPos2) & HexagonII::NewValueOpMask2); 338 } 339 340 MCOperand const & 341 HexagonMCInstrInfo::getNewValueOperand2(MCInstrInfo const &MCII, 342 MCInst const &MCI) { 343 unsigned O = HexagonMCInstrInfo::getNewValueOp2(MCII, MCI); 344 MCOperand const &MCO = MCI.getOperand(O); 345 346 assert((HexagonMCInstrInfo::isNewValue(MCII, MCI) || 347 HexagonMCInstrInfo::hasNewValue2(MCII, MCI)) && 348 MCO.isReg()); 349 return (MCO); 350 } 351 352 int HexagonMCInstrInfo::getSubTarget(MCInstrInfo const &MCII, 353 MCInst const &MCI) { 354 const uint64_t F = HexagonMCInstrInfo::getDesc(MCII, MCI).TSFlags; 355 356 HexagonII::SubTarget Target = static_cast<HexagonII::SubTarget>( 357 (F >> HexagonII::validSubTargetPos) & HexagonII::validSubTargetMask); 358 359 switch (Target) { 360 default: 361 return Hexagon::ArchV4; 362 case HexagonII::HasV5SubT: 363 return Hexagon::ArchV5; 364 } 365 } 366 367 // Return the Hexagon ISA class for the insn. 368 unsigned HexagonMCInstrInfo::getType(MCInstrInfo const &MCII, 369 MCInst const &MCI) { 370 const uint64_t F = HexagonMCInstrInfo::getDesc(MCII, MCI).TSFlags; 371 372 return ((F >> HexagonII::TypePos) & HexagonII::TypeMask); 373 } 374 375 unsigned HexagonMCInstrInfo::getUnits(MCInstrInfo const &MCII, 376 MCSubtargetInfo const &STI, 377 MCInst const &MCI) { 378 379 const InstrItinerary *II = STI.getSchedModel().InstrItineraries; 380 int SchedClass = HexagonMCInstrInfo::getDesc(MCII, MCI).getSchedClass(); 381 return ((II[SchedClass].FirstStage + HexagonStages)->getUnits()); 382 } 383 384 bool HexagonMCInstrInfo::hasImmExt(MCInst const &MCI) { 385 if (!HexagonMCInstrInfo::isBundle(MCI)) 386 return false; 387 388 for (const auto &I : HexagonMCInstrInfo::bundleInstructions(MCI)) { 389 auto MI = I.getInst(); 390 if (isImmext(*MI)) 391 return true; 392 } 393 394 return false; 395 } 396 397 bool HexagonMCInstrInfo::hasExtenderForIndex(MCInst const &MCB, size_t Index) { 398 return extenderForIndex(MCB, Index) != nullptr; 399 } 400 401 // Return whether the instruction is a legal new-value producer. 402 bool HexagonMCInstrInfo::hasNewValue(MCInstrInfo const &MCII, 403 MCInst const &MCI) { 404 const uint64_t F = HexagonMCInstrInfo::getDesc(MCII, MCI).TSFlags; 405 return ((F >> HexagonII::hasNewValuePos) & HexagonII::hasNewValueMask); 406 } 407 408 /// Return whether the insn produces a second value. 409 bool HexagonMCInstrInfo::hasNewValue2(MCInstrInfo const &MCII, 410 MCInst const &MCI) { 411 const uint64_t F = HexagonMCInstrInfo::getDesc(MCII, MCI).TSFlags; 412 return ((F >> HexagonII::hasNewValuePos2) & HexagonII::hasNewValueMask2); 413 } 414 415 MCInst const &HexagonMCInstrInfo::instruction(MCInst const &MCB, size_t Index) { 416 assert(isBundle(MCB)); 417 assert(Index < HEXAGON_PACKET_SIZE); 418 return *MCB.getOperand(bundleInstructionsOffset + Index).getInst(); 419 } 420 421 bool HexagonMCInstrInfo::isBundle(MCInst const &MCI) { 422 auto Result = Hexagon::BUNDLE == MCI.getOpcode(); 423 assert(!Result || (MCI.size() > 0 && MCI.getOperand(0).isImm())); 424 return Result; 425 } 426 427 // Return whether the insn is an actual insn. 428 bool HexagonMCInstrInfo::isCanon(MCInstrInfo const &MCII, MCInst const &MCI) { 429 return (!HexagonMCInstrInfo::getDesc(MCII, MCI).isPseudo() && 430 !HexagonMCInstrInfo::isPrefix(MCII, MCI) && 431 HexagonMCInstrInfo::getType(MCII, MCI) != HexagonII::TypeENDLOOP); 432 } 433 434 bool HexagonMCInstrInfo::isCompound(MCInstrInfo const &MCII, 435 MCInst const &MCI) { 436 return (getType(MCII, MCI) == HexagonII::TypeCOMPOUND); 437 } 438 439 bool HexagonMCInstrInfo::isDblRegForSubInst(unsigned Reg) { 440 return ((Reg >= Hexagon::D0 && Reg <= Hexagon::D3) || 441 (Reg >= Hexagon::D8 && Reg <= Hexagon::D11)); 442 } 443 444 bool HexagonMCInstrInfo::isDuplex(MCInstrInfo const &MCII, MCInst const &MCI) { 445 return HexagonII::TypeDUPLEX == HexagonMCInstrInfo::getType(MCII, MCI); 446 } 447 448 // Return whether the instruction needs to be constant extended. 449 // 1) Always return true if the instruction has 'isExtended' flag set. 450 // 451 // isExtendable: 452 // 2) For immediate extended operands, return true only if the value is 453 // out-of-range. 454 // 3) For global address, always return true. 455 456 bool HexagonMCInstrInfo::isConstExtended(MCInstrInfo const &MCII, 457 MCInst const &MCI) { 458 if (HexagonMCInstrInfo::isExtended(MCII, MCI)) 459 return true; 460 if (!HexagonMCInstrInfo::isExtendable(MCII, MCI)) 461 return false; 462 MCOperand const &MO = HexagonMCInstrInfo::getExtendableOperand(MCII, MCI); 463 if (isa<HexagonMCExpr>(MO.getExpr()) && 464 HexagonMCInstrInfo::mustExtend(*MO.getExpr())) 465 return true; 466 // Branch insns are handled as necessary by relaxation. 467 if ((HexagonMCInstrInfo::getType(MCII, MCI) == HexagonII::TypeJ) || 468 (HexagonMCInstrInfo::getType(MCII, MCI) == HexagonII::TypeCOMPOUND && 469 HexagonMCInstrInfo::getDesc(MCII, MCI).isBranch()) || 470 (HexagonMCInstrInfo::getType(MCII, MCI) == HexagonII::TypeNV && 471 HexagonMCInstrInfo::getDesc(MCII, MCI).isBranch())) 472 return false; 473 // Otherwise loop instructions and other CR insts are handled by relaxation 474 else if ((HexagonMCInstrInfo::getType(MCII, MCI) == HexagonII::TypeCR) && 475 (MCI.getOpcode() != Hexagon::C4_addipc)) 476 return false; 477 478 assert(!MO.isImm()); 479 if (isa<HexagonMCExpr>(MO.getExpr()) && 480 HexagonMCInstrInfo::mustNotExtend(*MO.getExpr())) 481 return false; 482 int64_t Value; 483 if (!MO.getExpr()->evaluateAsAbsolute(Value)) 484 return true; 485 int MinValue = HexagonMCInstrInfo::getMinValue(MCII, MCI); 486 int MaxValue = HexagonMCInstrInfo::getMaxValue(MCII, MCI); 487 return (MinValue > Value || Value > MaxValue); 488 } 489 490 bool HexagonMCInstrInfo::isExtendable(MCInstrInfo const &MCII, 491 MCInst const &MCI) { 492 uint64_t const F = HexagonMCInstrInfo::getDesc(MCII, MCI).TSFlags; 493 return (F >> HexagonII::ExtendablePos) & HexagonII::ExtendableMask; 494 } 495 496 bool HexagonMCInstrInfo::isExtended(MCInstrInfo const &MCII, 497 MCInst const &MCI) { 498 uint64_t const F = HexagonMCInstrInfo::getDesc(MCII, MCI).TSFlags; 499 return (F >> HexagonII::ExtendedPos) & HexagonII::ExtendedMask; 500 } 501 502 bool HexagonMCInstrInfo::isFloat(MCInstrInfo const &MCII, MCInst const &MCI) { 503 const uint64_t F = HexagonMCInstrInfo::getDesc(MCII, MCI).TSFlags; 504 return ((F >> HexagonII::FPPos) & HexagonII::FPMask); 505 } 506 507 bool HexagonMCInstrInfo::isImmext(MCInst const &MCI) { 508 auto Op = MCI.getOpcode(); 509 return (Op == Hexagon::A4_ext_b || Op == Hexagon::A4_ext_c || 510 Op == Hexagon::A4_ext_g || Op == Hexagon::A4_ext); 511 } 512 513 bool HexagonMCInstrInfo::isInnerLoop(MCInst const &MCI) { 514 assert(isBundle(MCI)); 515 int64_t Flags = MCI.getOperand(0).getImm(); 516 return (Flags & innerLoopMask) != 0; 517 } 518 519 bool HexagonMCInstrInfo::isIntReg(unsigned Reg) { 520 return (Reg >= Hexagon::R0 && Reg <= Hexagon::R31); 521 } 522 523 bool HexagonMCInstrInfo::isIntRegForSubInst(unsigned Reg) { 524 return ((Reg >= Hexagon::R0 && Reg <= Hexagon::R7) || 525 (Reg >= Hexagon::R16 && Reg <= Hexagon::R23)); 526 } 527 528 // Return whether the insn is a new-value consumer. 529 bool HexagonMCInstrInfo::isNewValue(MCInstrInfo const &MCII, 530 MCInst const &MCI) { 531 const uint64_t F = HexagonMCInstrInfo::getDesc(MCII, MCI).TSFlags; 532 return ((F >> HexagonII::NewValuePos) & HexagonII::NewValueMask); 533 } 534 535 // Return whether the operand can be constant extended. 536 bool HexagonMCInstrInfo::isOperandExtended(MCInstrInfo const &MCII, 537 MCInst const &MCI, 538 unsigned short OperandNum) { 539 uint64_t const F = HexagonMCInstrInfo::getDesc(MCII, MCI).TSFlags; 540 return ((F >> HexagonII::ExtendableOpPos) & HexagonII::ExtendableOpMask) == 541 OperandNum; 542 } 543 544 bool HexagonMCInstrInfo::isOuterLoop(MCInst const &MCI) { 545 assert(isBundle(MCI)); 546 int64_t Flags = MCI.getOperand(0).getImm(); 547 return (Flags & outerLoopMask) != 0; 548 } 549 550 bool HexagonMCInstrInfo::isPredicated(MCInstrInfo const &MCII, 551 MCInst const &MCI) { 552 const uint64_t F = HexagonMCInstrInfo::getDesc(MCII, MCI).TSFlags; 553 return ((F >> HexagonII::PredicatedPos) & HexagonII::PredicatedMask); 554 } 555 556 bool HexagonMCInstrInfo::isPredicateLate(MCInstrInfo const &MCII, 557 MCInst const &MCI) { 558 const uint64_t F = HexagonMCInstrInfo::getDesc(MCII, MCI).TSFlags; 559 return (F >> HexagonII::PredicateLatePos & HexagonII::PredicateLateMask); 560 } 561 562 /// Return whether the insn is newly predicated. 563 bool HexagonMCInstrInfo::isPredicatedNew(MCInstrInfo const &MCII, 564 MCInst const &MCI) { 565 const uint64_t F = HexagonMCInstrInfo::getDesc(MCII, MCI).TSFlags; 566 return ((F >> HexagonII::PredicatedNewPos) & HexagonII::PredicatedNewMask); 567 } 568 569 bool HexagonMCInstrInfo::isPredicatedTrue(MCInstrInfo const &MCII, 570 MCInst const &MCI) { 571 const uint64_t F = HexagonMCInstrInfo::getDesc(MCII, MCI).TSFlags; 572 return ( 573 !((F >> HexagonII::PredicatedFalsePos) & HexagonII::PredicatedFalseMask)); 574 } 575 576 bool HexagonMCInstrInfo::isPredReg(unsigned Reg) { 577 return (Reg >= Hexagon::P0 && Reg <= Hexagon::P3_0); 578 } 579 580 bool HexagonMCInstrInfo::isPrefix(MCInstrInfo const &MCII, MCInst const &MCI) { 581 return (HexagonMCInstrInfo::getType(MCII, MCI) == HexagonII::TypePREFIX); 582 } 583 584 bool HexagonMCInstrInfo::isSolo(MCInstrInfo const &MCII, MCInst const &MCI) { 585 const uint64_t F = HexagonMCInstrInfo::getDesc(MCII, MCI).TSFlags; 586 return ((F >> HexagonII::SoloPos) & HexagonII::SoloMask); 587 } 588 589 bool HexagonMCInstrInfo::isMemReorderDisabled(MCInst const &MCI) { 590 assert(isBundle(MCI)); 591 auto Flags = MCI.getOperand(0).getImm(); 592 return (Flags & memReorderDisabledMask) != 0; 593 } 594 595 bool HexagonMCInstrInfo::isMemStoreReorderEnabled(MCInst const &MCI) { 596 assert(isBundle(MCI)); 597 auto Flags = MCI.getOperand(0).getImm(); 598 return (Flags & memStoreReorderEnabledMask) != 0; 599 } 600 601 bool HexagonMCInstrInfo::isSubInstruction(MCInst const &MCI) { 602 switch (MCI.getOpcode()) { 603 default: 604 return false; 605 case Hexagon::V4_SA1_addi: 606 case Hexagon::V4_SA1_addrx: 607 case Hexagon::V4_SA1_addsp: 608 case Hexagon::V4_SA1_and1: 609 case Hexagon::V4_SA1_clrf: 610 case Hexagon::V4_SA1_clrfnew: 611 case Hexagon::V4_SA1_clrt: 612 case Hexagon::V4_SA1_clrtnew: 613 case Hexagon::V4_SA1_cmpeqi: 614 case Hexagon::V4_SA1_combine0i: 615 case Hexagon::V4_SA1_combine1i: 616 case Hexagon::V4_SA1_combine2i: 617 case Hexagon::V4_SA1_combine3i: 618 case Hexagon::V4_SA1_combinerz: 619 case Hexagon::V4_SA1_combinezr: 620 case Hexagon::V4_SA1_dec: 621 case Hexagon::V4_SA1_inc: 622 case Hexagon::V4_SA1_seti: 623 case Hexagon::V4_SA1_setin1: 624 case Hexagon::V4_SA1_sxtb: 625 case Hexagon::V4_SA1_sxth: 626 case Hexagon::V4_SA1_tfr: 627 case Hexagon::V4_SA1_zxtb: 628 case Hexagon::V4_SA1_zxth: 629 case Hexagon::V4_SL1_loadri_io: 630 case Hexagon::V4_SL1_loadrub_io: 631 case Hexagon::V4_SL2_deallocframe: 632 case Hexagon::V4_SL2_jumpr31: 633 case Hexagon::V4_SL2_jumpr31_f: 634 case Hexagon::V4_SL2_jumpr31_fnew: 635 case Hexagon::V4_SL2_jumpr31_t: 636 case Hexagon::V4_SL2_jumpr31_tnew: 637 case Hexagon::V4_SL2_loadrb_io: 638 case Hexagon::V4_SL2_loadrd_sp: 639 case Hexagon::V4_SL2_loadrh_io: 640 case Hexagon::V4_SL2_loadri_sp: 641 case Hexagon::V4_SL2_loadruh_io: 642 case Hexagon::V4_SL2_return: 643 case Hexagon::V4_SL2_return_f: 644 case Hexagon::V4_SL2_return_fnew: 645 case Hexagon::V4_SL2_return_t: 646 case Hexagon::V4_SL2_return_tnew: 647 case Hexagon::V4_SS1_storeb_io: 648 case Hexagon::V4_SS1_storew_io: 649 case Hexagon::V4_SS2_allocframe: 650 case Hexagon::V4_SS2_storebi0: 651 case Hexagon::V4_SS2_storebi1: 652 case Hexagon::V4_SS2_stored_sp: 653 case Hexagon::V4_SS2_storeh_io: 654 case Hexagon::V4_SS2_storew_sp: 655 case Hexagon::V4_SS2_storewi0: 656 case Hexagon::V4_SS2_storewi1: 657 return true; 658 } 659 } 660 661 bool HexagonMCInstrInfo::isSoloAX(MCInstrInfo const &MCII, MCInst const &MCI) { 662 const uint64_t F = HexagonMCInstrInfo::getDesc(MCII, MCI).TSFlags; 663 return ((F >> HexagonII::SoloAXPos) & HexagonII::SoloAXMask); 664 } 665 666 bool HexagonMCInstrInfo::isSoloAin1(MCInstrInfo const &MCII, 667 MCInst const &MCI) { 668 const uint64_t F = HexagonMCInstrInfo::getDesc(MCII, MCI).TSFlags; 669 return ((F >> HexagonII::SoloAin1Pos) & HexagonII::SoloAin1Mask); 670 } 671 672 bool HexagonMCInstrInfo::isVector(MCInstrInfo const &MCII, MCInst const &MCI) { 673 if ((getType(MCII, MCI) <= HexagonII::TypeCVI_LAST) && 674 (getType(MCII, MCI) >= HexagonII::TypeCVI_FIRST)) 675 return true; 676 return false; 677 } 678 679 int64_t HexagonMCInstrInfo::minConstant(MCInst const &MCI, size_t Index) { 680 auto Sentinal = static_cast<int64_t>(std::numeric_limits<uint32_t>::max()) 681 << 8; 682 if (MCI.size() <= Index) 683 return Sentinal; 684 MCOperand const &MCO = MCI.getOperand(Index); 685 if (!MCO.isExpr()) 686 return Sentinal; 687 int64_t Value; 688 if (!MCO.getExpr()->evaluateAsAbsolute(Value)) 689 return Sentinal; 690 return Value; 691 } 692 693 void HexagonMCInstrInfo::setMustExtend(MCExpr const &Expr, bool Val) { 694 HexagonMCExpr &HExpr = const_cast<HexagonMCExpr &>(cast<HexagonMCExpr>(Expr)); 695 HExpr.setMustExtend(Val); 696 } 697 698 bool HexagonMCInstrInfo::mustExtend(MCExpr const &Expr) { 699 HexagonMCExpr const &HExpr = cast<HexagonMCExpr>(Expr); 700 return HExpr.mustExtend(); 701 } 702 void HexagonMCInstrInfo::setMustNotExtend(MCExpr const &Expr, bool Val) { 703 HexagonMCExpr &HExpr = 704 const_cast<HexagonMCExpr &>(cast<HexagonMCExpr>(Expr)); 705 HExpr.setMustNotExtend(Val); 706 } 707 bool HexagonMCInstrInfo::mustNotExtend(MCExpr const &Expr) { 708 HexagonMCExpr const &HExpr = cast<HexagonMCExpr>(Expr); 709 return HExpr.mustNotExtend(); 710 } 711 712 void HexagonMCInstrInfo::padEndloop(MCContext &Context, MCInst &MCB) { 713 MCInst Nop; 714 Nop.setOpcode(Hexagon::A2_nop); 715 assert(isBundle(MCB)); 716 while ((HexagonMCInstrInfo::isInnerLoop(MCB) && 717 (HexagonMCInstrInfo::bundleSize(MCB) < HEXAGON_PACKET_INNER_SIZE)) || 718 ((HexagonMCInstrInfo::isOuterLoop(MCB) && 719 (HexagonMCInstrInfo::bundleSize(MCB) < HEXAGON_PACKET_OUTER_SIZE)))) 720 MCB.addOperand(MCOperand::createInst(new (Context) MCInst(Nop))); 721 } 722 723 bool HexagonMCInstrInfo::prefersSlot3(MCInstrInfo const &MCII, 724 MCInst const &MCI) { 725 if (HexagonMCInstrInfo::getType(MCII, MCI) == HexagonII::TypeCR) 726 return false; 727 728 unsigned SchedClass = HexagonMCInstrInfo::getDesc(MCII, MCI).getSchedClass(); 729 switch (SchedClass) { 730 case Hexagon::Sched::ALU32_3op_tc_2_SLOT0123: 731 case Hexagon::Sched::ALU64_tc_2_SLOT23: 732 case Hexagon::Sched::ALU64_tc_3x_SLOT23: 733 case Hexagon::Sched::M_tc_2_SLOT23: 734 case Hexagon::Sched::M_tc_3x_SLOT23: 735 case Hexagon::Sched::S_2op_tc_2_SLOT23: 736 case Hexagon::Sched::S_3op_tc_2_SLOT23: 737 case Hexagon::Sched::S_3op_tc_3x_SLOT23: 738 return true; 739 } 740 return false; 741 } 742 743 void HexagonMCInstrInfo::replaceDuplex(MCContext &Context, MCInst &MCB, 744 DuplexCandidate Candidate) { 745 assert(Candidate.packetIndexI < MCB.size()); 746 assert(Candidate.packetIndexJ < MCB.size()); 747 assert(isBundle(MCB)); 748 MCInst *Duplex = 749 deriveDuplex(Context, Candidate.iClass, 750 *MCB.getOperand(Candidate.packetIndexJ).getInst(), 751 *MCB.getOperand(Candidate.packetIndexI).getInst()); 752 assert(Duplex != nullptr); 753 MCB.getOperand(Candidate.packetIndexI).setInst(Duplex); 754 MCB.erase(MCB.begin() + Candidate.packetIndexJ); 755 } 756 757 void HexagonMCInstrInfo::setInnerLoop(MCInst &MCI) { 758 assert(isBundle(MCI)); 759 MCOperand &Operand = MCI.getOperand(0); 760 Operand.setImm(Operand.getImm() | innerLoopMask); 761 } 762 763 void HexagonMCInstrInfo::setMemReorderDisabled(MCInst &MCI) { 764 assert(isBundle(MCI)); 765 MCOperand &Operand = MCI.getOperand(0); 766 Operand.setImm(Operand.getImm() | memReorderDisabledMask); 767 assert(isMemReorderDisabled(MCI)); 768 } 769 770 void HexagonMCInstrInfo::setMemStoreReorderEnabled(MCInst &MCI) { 771 assert(isBundle(MCI)); 772 MCOperand &Operand = MCI.getOperand(0); 773 Operand.setImm(Operand.getImm() | memStoreReorderEnabledMask); 774 assert(isMemStoreReorderEnabled(MCI)); 775 } 776 void HexagonMCInstrInfo::setS23_2_reloc(MCExpr const &Expr, bool Val) { 777 HexagonMCExpr &HExpr = 778 const_cast<HexagonMCExpr &>(*llvm::cast<HexagonMCExpr>(&Expr)); 779 HExpr.setS23_2_reloc(Val); 780 } 781 bool HexagonMCInstrInfo::s23_2_reloc(MCExpr const &Expr) { 782 HexagonMCExpr const &HExpr = *llvm::cast<HexagonMCExpr>(&Expr); 783 return HExpr.s23_2_reloc(); 784 } 785 786 void HexagonMCInstrInfo::setOuterLoop(MCInst &MCI) { 787 assert(isBundle(MCI)); 788 MCOperand &Operand = MCI.getOperand(0); 789 Operand.setImm(Operand.getImm() | outerLoopMask); 790 } 791 792 unsigned HexagonMCInstrInfo::SubregisterBit(unsigned Consumer, 793 unsigned Producer, 794 unsigned Producer2) { 795 // If we're a single vector consumer of a double producer, set subreg bit 796 // based on if we're accessing the lower or upper register component 797 if (Producer >= Hexagon::W0 && Producer <= Hexagon::W15) 798 if (Consumer >= Hexagon::V0 && Consumer <= Hexagon::V31) 799 return (Consumer - Hexagon::V0) & 0x1; 800 if (Consumer == Producer2) 801 return 0x1; 802 return 0; 803 } 804 } 805