1 //===- HexagonMCDuplexInfo.cpp - Instruction bundle checking --------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This implements duplexing of instructions to reduce code size 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "HexagonMCExpr.h" 14 #include "MCTargetDesc/HexagonBaseInfo.h" 15 #include "MCTargetDesc/HexagonMCInstrInfo.h" 16 #include "MCTargetDesc/HexagonMCTargetDesc.h" 17 #include "llvm/ADT/SmallVector.h" 18 #include "llvm/MC/MCSubtargetInfo.h" 19 #include "llvm/Support/Debug.h" 20 #include "llvm/Support/ErrorHandling.h" 21 #include "llvm/Support/MathExtras.h" 22 #include "llvm/Support/raw_ostream.h" 23 #include <cassert> 24 #include <cstdint> 25 #include <iterator> 26 #include <map> 27 #include <utility> 28 29 using namespace llvm; 30 using namespace Hexagon; 31 32 #define DEBUG_TYPE "hexagon-mcduplex-info" 33 34 // pair table of subInstructions with opcodes 35 static const std::pair<unsigned, unsigned> opcodeData[] = { 36 std::make_pair((unsigned)SA1_addi, 0), 37 std::make_pair((unsigned)SA1_addrx, 6144), 38 std::make_pair((unsigned)SA1_addsp, 3072), 39 std::make_pair((unsigned)SA1_and1, 4608), 40 std::make_pair((unsigned)SA1_clrf, 6768), 41 std::make_pair((unsigned)SA1_clrfnew, 6736), 42 std::make_pair((unsigned)SA1_clrt, 6752), 43 std::make_pair((unsigned)SA1_clrtnew, 6720), 44 std::make_pair((unsigned)SA1_cmpeqi, 6400), 45 std::make_pair((unsigned)SA1_combine0i, 7168), 46 std::make_pair((unsigned)SA1_combine1i, 7176), 47 std::make_pair((unsigned)SA1_combine2i, 7184), 48 std::make_pair((unsigned)SA1_combine3i, 7192), 49 std::make_pair((unsigned)SA1_combinerz, 7432), 50 std::make_pair((unsigned)SA1_combinezr, 7424), 51 std::make_pair((unsigned)SA1_dec, 4864), 52 std::make_pair((unsigned)SA1_inc, 4352), 53 std::make_pair((unsigned)SA1_seti, 2048), 54 std::make_pair((unsigned)SA1_setin1, 6656), 55 std::make_pair((unsigned)SA1_sxtb, 5376), 56 std::make_pair((unsigned)SA1_sxth, 5120), 57 std::make_pair((unsigned)SA1_tfr, 4096), 58 std::make_pair((unsigned)SA1_zxtb, 5888), 59 std::make_pair((unsigned)SA1_zxth, 5632), 60 std::make_pair((unsigned)SL1_loadri_io, 0), 61 std::make_pair((unsigned)SL1_loadrub_io, 4096), 62 std::make_pair((unsigned)SL2_deallocframe, 7936), 63 std::make_pair((unsigned)SL2_jumpr31, 8128), 64 std::make_pair((unsigned)SL2_jumpr31_f, 8133), 65 std::make_pair((unsigned)SL2_jumpr31_fnew, 8135), 66 std::make_pair((unsigned)SL2_jumpr31_t, 8132), 67 std::make_pair((unsigned)SL2_jumpr31_tnew, 8134), 68 std::make_pair((unsigned)SL2_loadrb_io, 4096), 69 std::make_pair((unsigned)SL2_loadrd_sp, 7680), 70 std::make_pair((unsigned)SL2_loadrh_io, 0), 71 std::make_pair((unsigned)SL2_loadri_sp, 7168), 72 std::make_pair((unsigned)SL2_loadruh_io, 2048), 73 std::make_pair((unsigned)SL2_return, 8000), 74 std::make_pair((unsigned)SL2_return_f, 8005), 75 std::make_pair((unsigned)SL2_return_fnew, 8007), 76 std::make_pair((unsigned)SL2_return_t, 8004), 77 std::make_pair((unsigned)SL2_return_tnew, 8006), 78 std::make_pair((unsigned)SS1_storeb_io, 4096), 79 std::make_pair((unsigned)SS1_storew_io, 0), 80 std::make_pair((unsigned)SS2_allocframe, 7168), 81 std::make_pair((unsigned)SS2_storebi0, 4608), 82 std::make_pair((unsigned)SS2_storebi1, 4864), 83 std::make_pair((unsigned)SS2_stored_sp, 2560), 84 std::make_pair((unsigned)SS2_storeh_io, 0), 85 std::make_pair((unsigned)SS2_storew_sp, 2048), 86 std::make_pair((unsigned)SS2_storewi0, 4096), 87 std::make_pair((unsigned)SS2_storewi1, 4352)}; 88 89 bool HexagonMCInstrInfo::isDuplexPairMatch(unsigned Ga, unsigned Gb) { 90 switch (Ga) { 91 case HexagonII::HSIG_None: 92 default: 93 return false; 94 case HexagonII::HSIG_L1: 95 return (Gb == HexagonII::HSIG_L1 || Gb == HexagonII::HSIG_A); 96 case HexagonII::HSIG_L2: 97 return (Gb == HexagonII::HSIG_L1 || Gb == HexagonII::HSIG_L2 || 98 Gb == HexagonII::HSIG_A); 99 case HexagonII::HSIG_S1: 100 return (Gb == HexagonII::HSIG_L1 || Gb == HexagonII::HSIG_L2 || 101 Gb == HexagonII::HSIG_S1 || Gb == HexagonII::HSIG_A); 102 case HexagonII::HSIG_S2: 103 return (Gb == HexagonII::HSIG_L1 || Gb == HexagonII::HSIG_L2 || 104 Gb == HexagonII::HSIG_S1 || Gb == HexagonII::HSIG_S2 || 105 Gb == HexagonII::HSIG_A); 106 case HexagonII::HSIG_A: 107 return (Gb == HexagonII::HSIG_A); 108 case HexagonII::HSIG_Compound: 109 return (Gb == HexagonII::HSIG_Compound); 110 } 111 return false; 112 } 113 114 unsigned HexagonMCInstrInfo::iClassOfDuplexPair(unsigned Ga, unsigned Gb) { 115 switch (Ga) { 116 case HexagonII::HSIG_None: 117 default: 118 break; 119 case HexagonII::HSIG_L1: 120 switch (Gb) { 121 default: 122 break; 123 case HexagonII::HSIG_L1: 124 return 0; 125 case HexagonII::HSIG_A: 126 return 0x4; 127 } 128 break; 129 case HexagonII::HSIG_L2: 130 switch (Gb) { 131 default: 132 break; 133 case HexagonII::HSIG_L1: 134 return 0x1; 135 case HexagonII::HSIG_L2: 136 return 0x2; 137 case HexagonII::HSIG_A: 138 return 0x5; 139 } 140 break; 141 case HexagonII::HSIG_S1: 142 switch (Gb) { 143 default: 144 break; 145 case HexagonII::HSIG_L1: 146 return 0x8; 147 case HexagonII::HSIG_L2: 148 return 0x9; 149 case HexagonII::HSIG_S1: 150 return 0xA; 151 case HexagonII::HSIG_A: 152 return 0x6; 153 } 154 break; 155 case HexagonII::HSIG_S2: 156 switch (Gb) { 157 default: 158 break; 159 case HexagonII::HSIG_L1: 160 return 0xC; 161 case HexagonII::HSIG_L2: 162 return 0xD; 163 case HexagonII::HSIG_S1: 164 return 0xB; 165 case HexagonII::HSIG_S2: 166 return 0xE; 167 case HexagonII::HSIG_A: 168 return 0x7; 169 } 170 break; 171 case HexagonII::HSIG_A: 172 switch (Gb) { 173 default: 174 break; 175 case HexagonII::HSIG_A: 176 return 0x3; 177 } 178 break; 179 case HexagonII::HSIG_Compound: 180 switch (Gb) { 181 case HexagonII::HSIG_Compound: 182 return 0xFFFFFFFF; 183 } 184 break; 185 } 186 return 0xFFFFFFFF; 187 } 188 189 unsigned HexagonMCInstrInfo::getDuplexCandidateGroup(MCInst const &MCI) { 190 unsigned DstReg, PredReg, SrcReg, Src1Reg, Src2Reg; 191 192 switch (MCI.getOpcode()) { 193 default: 194 return HexagonII::HSIG_None; 195 // 196 // Group L1: 197 // 198 // Rd = memw(Rs+#u4:2) 199 // Rd = memub(Rs+#u4:0) 200 case Hexagon::L2_loadri_io: 201 DstReg = MCI.getOperand(0).getReg(); 202 SrcReg = MCI.getOperand(1).getReg(); 203 // Special case this one from Group L2. 204 // Rd = memw(r29+#u5:2) 205 if (HexagonMCInstrInfo::isIntRegForSubInst(DstReg)) { 206 if (HexagonMCInstrInfo::isIntReg(SrcReg) && 207 Hexagon::R29 == SrcReg && inRange<5, 2>(MCI, 2)) { 208 return HexagonII::HSIG_L2; 209 } 210 // Rd = memw(Rs+#u4:2) 211 if (HexagonMCInstrInfo::isIntRegForSubInst(SrcReg) && 212 inRange<4, 2>(MCI, 2)) { 213 return HexagonII::HSIG_L1; 214 } 215 } 216 break; 217 case Hexagon::L2_loadrub_io: 218 // Rd = memub(Rs+#u4:0) 219 DstReg = MCI.getOperand(0).getReg(); 220 SrcReg = MCI.getOperand(1).getReg(); 221 if (HexagonMCInstrInfo::isIntRegForSubInst(DstReg) && 222 HexagonMCInstrInfo::isIntRegForSubInst(SrcReg) && 223 inRange<4>(MCI, 2)) { 224 return HexagonII::HSIG_L1; 225 } 226 break; 227 // 228 // Group L2: 229 // 230 // Rd = memh/memuh(Rs+#u3:1) 231 // Rd = memb(Rs+#u3:0) 232 // Rd = memw(r29+#u5:2) - Handled above. 233 // Rdd = memd(r29+#u5:3) 234 // deallocframe 235 // [if ([!]p0[.new])] dealloc_return 236 // [if ([!]p0[.new])] jumpr r31 237 case Hexagon::L2_loadrh_io: 238 case Hexagon::L2_loadruh_io: 239 // Rd = memh/memuh(Rs+#u3:1) 240 DstReg = MCI.getOperand(0).getReg(); 241 SrcReg = MCI.getOperand(1).getReg(); 242 if (HexagonMCInstrInfo::isIntRegForSubInst(DstReg) && 243 HexagonMCInstrInfo::isIntRegForSubInst(SrcReg) && 244 inRange<3, 1>(MCI, 2)) { 245 return HexagonII::HSIG_L2; 246 } 247 break; 248 case Hexagon::L2_loadrb_io: 249 // Rd = memb(Rs+#u3:0) 250 DstReg = MCI.getOperand(0).getReg(); 251 SrcReg = MCI.getOperand(1).getReg(); 252 if (HexagonMCInstrInfo::isIntRegForSubInst(DstReg) && 253 HexagonMCInstrInfo::isIntRegForSubInst(SrcReg) && 254 inRange<3>(MCI, 2)) { 255 return HexagonII::HSIG_L2; 256 } 257 break; 258 case Hexagon::L2_loadrd_io: 259 // Rdd = memd(r29+#u5:3) 260 DstReg = MCI.getOperand(0).getReg(); 261 SrcReg = MCI.getOperand(1).getReg(); 262 if (HexagonMCInstrInfo::isDblRegForSubInst(DstReg) && 263 HexagonMCInstrInfo::isIntReg(SrcReg) && Hexagon::R29 == SrcReg && 264 inRange<5, 3>(MCI, 2)) { 265 return HexagonII::HSIG_L2; 266 } 267 break; 268 269 case Hexagon::L4_return: 270 case Hexagon::L2_deallocframe: 271 return HexagonII::HSIG_L2; 272 273 case Hexagon::EH_RETURN_JMPR: 274 case Hexagon::J2_jumpr: 275 case Hexagon::PS_jmpret: 276 // jumpr r31 277 // Actual form JMPR implicit-def %pc, implicit %r31, implicit internal %r0. 278 DstReg = MCI.getOperand(0).getReg(); 279 if (Hexagon::R31 == DstReg) 280 return HexagonII::HSIG_L2; 281 break; 282 283 case Hexagon::J2_jumprt: 284 case Hexagon::J2_jumprf: 285 case Hexagon::J2_jumprtnew: 286 case Hexagon::J2_jumprfnew: 287 case Hexagon::J2_jumprtnewpt: 288 case Hexagon::J2_jumprfnewpt: 289 case Hexagon::PS_jmprett: 290 case Hexagon::PS_jmpretf: 291 case Hexagon::PS_jmprettnew: 292 case Hexagon::PS_jmpretfnew: 293 case Hexagon::PS_jmprettnewpt: 294 case Hexagon::PS_jmpretfnewpt: 295 DstReg = MCI.getOperand(1).getReg(); 296 SrcReg = MCI.getOperand(0).getReg(); 297 // [if ([!]p0[.new])] jumpr r31 298 if ((Hexagon::P0 == SrcReg) && (Hexagon::R31 == DstReg)) { 299 return HexagonII::HSIG_L2; 300 } 301 break; 302 case Hexagon::L4_return_t: 303 case Hexagon::L4_return_f: 304 case Hexagon::L4_return_tnew_pnt: 305 case Hexagon::L4_return_fnew_pnt: 306 case Hexagon::L4_return_tnew_pt: 307 case Hexagon::L4_return_fnew_pt: 308 // [if ([!]p0[.new])] dealloc_return 309 SrcReg = MCI.getOperand(1).getReg(); 310 if (Hexagon::P0 == SrcReg) { 311 return HexagonII::HSIG_L2; 312 } 313 break; 314 // 315 // Group S1: 316 // 317 // memw(Rs+#u4:2) = Rt 318 // memb(Rs+#u4:0) = Rt 319 case Hexagon::S2_storeri_io: 320 // Special case this one from Group S2. 321 // memw(r29+#u5:2) = Rt 322 Src1Reg = MCI.getOperand(0).getReg(); 323 Src2Reg = MCI.getOperand(2).getReg(); 324 if (HexagonMCInstrInfo::isIntReg(Src1Reg) && 325 HexagonMCInstrInfo::isIntRegForSubInst(Src2Reg) && 326 Hexagon::R29 == Src1Reg && inRange<5, 2>(MCI, 1)) { 327 return HexagonII::HSIG_S2; 328 } 329 // memw(Rs+#u4:2) = Rt 330 if (HexagonMCInstrInfo::isIntRegForSubInst(Src1Reg) && 331 HexagonMCInstrInfo::isIntRegForSubInst(Src2Reg) && 332 inRange<4, 2>(MCI, 1)) { 333 return HexagonII::HSIG_S1; 334 } 335 break; 336 case Hexagon::S2_storerb_io: 337 // memb(Rs+#u4:0) = Rt 338 Src1Reg = MCI.getOperand(0).getReg(); 339 Src2Reg = MCI.getOperand(2).getReg(); 340 if (HexagonMCInstrInfo::isIntRegForSubInst(Src1Reg) && 341 HexagonMCInstrInfo::isIntRegForSubInst(Src2Reg) && 342 inRange<4>(MCI, 1)) { 343 return HexagonII::HSIG_S1; 344 } 345 break; 346 // 347 // Group S2: 348 // 349 // memh(Rs+#u3:1) = Rt 350 // memw(r29+#u5:2) = Rt 351 // memd(r29+#s6:3) = Rtt 352 // memw(Rs+#u4:2) = #U1 353 // memb(Rs+#u4) = #U1 354 // allocframe(#u5:3) 355 case Hexagon::S2_storerh_io: 356 // memh(Rs+#u3:1) = Rt 357 Src1Reg = MCI.getOperand(0).getReg(); 358 Src2Reg = MCI.getOperand(2).getReg(); 359 if (HexagonMCInstrInfo::isIntRegForSubInst(Src1Reg) && 360 HexagonMCInstrInfo::isIntRegForSubInst(Src2Reg) && 361 inRange<3, 1>(MCI, 1)) { 362 return HexagonII::HSIG_S2; 363 } 364 break; 365 case Hexagon::S2_storerd_io: 366 // memd(r29+#s6:3) = Rtt 367 Src1Reg = MCI.getOperand(0).getReg(); 368 Src2Reg = MCI.getOperand(2).getReg(); 369 if (HexagonMCInstrInfo::isDblRegForSubInst(Src2Reg) && 370 HexagonMCInstrInfo::isIntReg(Src1Reg) && Hexagon::R29 == Src1Reg && 371 inSRange<6, 3>(MCI, 1)) { 372 return HexagonII::HSIG_S2; 373 } 374 break; 375 case Hexagon::S4_storeiri_io: 376 // memw(Rs+#u4:2) = #U1 377 Src1Reg = MCI.getOperand(0).getReg(); 378 if (HexagonMCInstrInfo::isIntRegForSubInst(Src1Reg) && 379 inRange<4, 2>(MCI, 1) && inRange<1>(MCI, 2)) { 380 return HexagonII::HSIG_S2; 381 } 382 break; 383 case Hexagon::S4_storeirb_io: 384 // memb(Rs+#u4) = #U1 385 Src1Reg = MCI.getOperand(0).getReg(); 386 if (HexagonMCInstrInfo::isIntRegForSubInst(Src1Reg) && 387 inRange<4>(MCI, 1) && inRange<1>(MCI, 2)) { 388 return HexagonII::HSIG_S2; 389 } 390 break; 391 case Hexagon::S2_allocframe: 392 if (inRange<5, 3>(MCI, 2)) 393 return HexagonII::HSIG_S2; 394 break; 395 // 396 // Group A: 397 // 398 // Rx = add(Rx,#s7) 399 // Rd = Rs 400 // Rd = #u6 401 // Rd = #-1 402 // if ([!]P0[.new]) Rd = #0 403 // Rd = add(r29,#u6:2) 404 // Rx = add(Rx,Rs) 405 // P0 = cmp.eq(Rs,#u2) 406 // Rdd = combine(#0,Rs) 407 // Rdd = combine(Rs,#0) 408 // Rdd = combine(#u2,#U2) 409 // Rd = add(Rs,#1) 410 // Rd = add(Rs,#-1) 411 // Rd = sxth/sxtb/zxtb/zxth(Rs) 412 // Rd = and(Rs,#1) 413 case Hexagon::A2_addi: 414 DstReg = MCI.getOperand(0).getReg(); 415 SrcReg = MCI.getOperand(1).getReg(); 416 if (HexagonMCInstrInfo::isIntRegForSubInst(DstReg)) { 417 // Rd = add(r29,#u6:2) 418 if (HexagonMCInstrInfo::isIntReg(SrcReg) && Hexagon::R29 == SrcReg && 419 inRange<6, 2>(MCI, 2)) { 420 return HexagonII::HSIG_A; 421 } 422 // Rx = add(Rx,#s7) 423 if (DstReg == SrcReg) { 424 return HexagonII::HSIG_A; 425 } 426 // Rd = add(Rs,#1) 427 // Rd = add(Rs,#-1) 428 if (HexagonMCInstrInfo::isIntRegForSubInst(SrcReg) && 429 (minConstant(MCI, 2) == 1 || minConstant(MCI, 2) == -1)) { 430 return HexagonII::HSIG_A; 431 } 432 } 433 break; 434 case Hexagon::A2_add: 435 // Rx = add(Rx,Rs) 436 DstReg = MCI.getOperand(0).getReg(); 437 Src1Reg = MCI.getOperand(1).getReg(); 438 Src2Reg = MCI.getOperand(2).getReg(); 439 if (HexagonMCInstrInfo::isIntRegForSubInst(DstReg) && (DstReg == Src1Reg) && 440 HexagonMCInstrInfo::isIntRegForSubInst(Src2Reg)) { 441 return HexagonII::HSIG_A; 442 } 443 break; 444 case Hexagon::A2_andir: 445 DstReg = MCI.getOperand(0).getReg(); 446 SrcReg = MCI.getOperand(1).getReg(); 447 if (HexagonMCInstrInfo::isIntRegForSubInst(DstReg) && 448 HexagonMCInstrInfo::isIntRegForSubInst(SrcReg) && 449 (minConstant(MCI, 2) == 1 || minConstant(MCI, 2) == 255)) { 450 return HexagonII::HSIG_A; 451 } 452 break; 453 case Hexagon::A2_tfr: 454 // Rd = Rs 455 DstReg = MCI.getOperand(0).getReg(); 456 SrcReg = MCI.getOperand(1).getReg(); 457 if (HexagonMCInstrInfo::isIntRegForSubInst(DstReg) && 458 HexagonMCInstrInfo::isIntRegForSubInst(SrcReg)) { 459 return HexagonII::HSIG_A; 460 } 461 break; 462 case Hexagon::A2_tfrsi: 463 DstReg = MCI.getOperand(0).getReg(); 464 465 if (HexagonMCInstrInfo::isIntRegForSubInst(DstReg)) { 466 return HexagonII::HSIG_A; 467 } 468 break; 469 case Hexagon::C2_cmoveit: 470 case Hexagon::C2_cmovenewit: 471 case Hexagon::C2_cmoveif: 472 case Hexagon::C2_cmovenewif: 473 // if ([!]P0[.new]) Rd = #0 474 // Actual form: 475 // %r16 = C2_cmovenewit internal %p0, 0, implicit undef %r16; 476 DstReg = MCI.getOperand(0).getReg(); // Rd 477 PredReg = MCI.getOperand(1).getReg(); // P0 478 if (HexagonMCInstrInfo::isIntRegForSubInst(DstReg) && 479 Hexagon::P0 == PredReg && minConstant(MCI, 2) == 0) { 480 return HexagonII::HSIG_A; 481 } 482 break; 483 case Hexagon::C2_cmpeqi: 484 // P0 = cmp.eq(Rs,#u2) 485 DstReg = MCI.getOperand(0).getReg(); 486 SrcReg = MCI.getOperand(1).getReg(); 487 if (Hexagon::P0 == DstReg && 488 HexagonMCInstrInfo::isIntRegForSubInst(SrcReg) && 489 inRange<2>(MCI, 2)) { 490 return HexagonII::HSIG_A; 491 } 492 break; 493 case Hexagon::A2_combineii: 494 case Hexagon::A4_combineii: 495 // Rdd = combine(#u2,#U2) 496 DstReg = MCI.getOperand(0).getReg(); 497 if (HexagonMCInstrInfo::isDblRegForSubInst(DstReg) && 498 inRange<2>(MCI, 1) && inRange<2>(MCI, 2)) { 499 return HexagonII::HSIG_A; 500 } 501 break; 502 case Hexagon::A4_combineri: 503 // Rdd = combine(Rs,#0) 504 DstReg = MCI.getOperand(0).getReg(); 505 SrcReg = MCI.getOperand(1).getReg(); 506 if (HexagonMCInstrInfo::isDblRegForSubInst(DstReg) && 507 HexagonMCInstrInfo::isIntRegForSubInst(SrcReg) && 508 minConstant(MCI, 2) == 0) { 509 return HexagonII::HSIG_A; 510 } 511 break; 512 case Hexagon::A4_combineir: 513 // Rdd = combine(#0,Rs) 514 DstReg = MCI.getOperand(0).getReg(); 515 SrcReg = MCI.getOperand(2).getReg(); 516 if (HexagonMCInstrInfo::isDblRegForSubInst(DstReg) && 517 HexagonMCInstrInfo::isIntRegForSubInst(SrcReg) && 518 minConstant(MCI, 1) == 0) { 519 return HexagonII::HSIG_A; 520 } 521 break; 522 case Hexagon::A2_sxtb: 523 case Hexagon::A2_sxth: 524 case Hexagon::A2_zxtb: 525 case Hexagon::A2_zxth: 526 // Rd = sxth/sxtb/zxtb/zxth(Rs) 527 DstReg = MCI.getOperand(0).getReg(); 528 SrcReg = MCI.getOperand(1).getReg(); 529 if (HexagonMCInstrInfo::isIntRegForSubInst(DstReg) && 530 HexagonMCInstrInfo::isIntRegForSubInst(SrcReg)) { 531 return HexagonII::HSIG_A; 532 } 533 break; 534 } 535 536 return HexagonII::HSIG_None; 537 } 538 539 bool HexagonMCInstrInfo::subInstWouldBeExtended(MCInst const &potentialDuplex) { 540 unsigned DstReg, SrcReg; 541 switch (potentialDuplex.getOpcode()) { 542 case Hexagon::A2_addi: 543 // testing for case of: Rx = add(Rx,#s7) 544 DstReg = potentialDuplex.getOperand(0).getReg(); 545 SrcReg = potentialDuplex.getOperand(1).getReg(); 546 if (DstReg == SrcReg && HexagonMCInstrInfo::isIntRegForSubInst(DstReg)) { 547 int64_t Value; 548 if (!potentialDuplex.getOperand(2).getExpr()->evaluateAsAbsolute(Value)) 549 return true; 550 if (!isShiftedInt<7, 0>(Value)) 551 return true; 552 } 553 break; 554 case Hexagon::A2_tfrsi: 555 DstReg = potentialDuplex.getOperand(0).getReg(); 556 557 if (HexagonMCInstrInfo::isIntRegForSubInst(DstReg)) { 558 int64_t Value; 559 if (!potentialDuplex.getOperand(1).getExpr()->evaluateAsAbsolute(Value)) 560 return true; 561 // Check for case of Rd = #-1. 562 if (Value == -1) 563 return false; 564 // Check for case of Rd = #u6. 565 if (!isShiftedUInt<6, 0>(Value)) 566 return true; 567 } 568 break; 569 default: 570 break; 571 } 572 return false; 573 } 574 575 /// non-Symmetrical. See if these two instructions are fit for duplex pair. 576 bool HexagonMCInstrInfo::isOrderedDuplexPair(MCInstrInfo const &MCII, 577 MCInst const &MIa, bool ExtendedA, 578 MCInst const &MIb, bool ExtendedB, 579 bool bisReversable, 580 MCSubtargetInfo const &STI) { 581 // Slot 1 cannot be extended in duplexes PRM 10.5 582 if (ExtendedA) 583 return false; 584 // Only A2_addi and A2_tfrsi can be extended in duplex form PRM 10.5 585 if (ExtendedB) { 586 unsigned Opcode = MIb.getOpcode(); 587 if ((Opcode != Hexagon::A2_addi) && (Opcode != Hexagon::A2_tfrsi)) 588 return false; 589 } 590 unsigned MIaG = HexagonMCInstrInfo::getDuplexCandidateGroup(MIa), 591 MIbG = HexagonMCInstrInfo::getDuplexCandidateGroup(MIb); 592 593 static std::map<unsigned, unsigned> subinstOpcodeMap(std::begin(opcodeData), 594 std::end(opcodeData)); 595 596 // If a duplex contains 2 insns in the same group, the insns must be 597 // ordered such that the numerically smaller opcode is in slot 1. 598 if ((MIaG != HexagonII::HSIG_None) && (MIaG == MIbG) && bisReversable) { 599 MCInst SubInst0 = HexagonMCInstrInfo::deriveSubInst(MIa); 600 MCInst SubInst1 = HexagonMCInstrInfo::deriveSubInst(MIb); 601 602 unsigned zeroedSubInstS0 = 603 subinstOpcodeMap.find(SubInst0.getOpcode())->second; 604 unsigned zeroedSubInstS1 = 605 subinstOpcodeMap.find(SubInst1.getOpcode())->second; 606 607 if (zeroedSubInstS0 < zeroedSubInstS1) 608 // subinstS0 (maps to slot 0) must be greater than 609 // subinstS1 (maps to slot 1) 610 return false; 611 } 612 613 // allocframe must always be in slot 0 614 if (MIb.getOpcode() == Hexagon::S2_allocframe) 615 return false; 616 617 if ((MIaG != HexagonII::HSIG_None) && (MIbG != HexagonII::HSIG_None)) { 618 // Prevent 2 instructions with extenders from duplexing 619 // Note that MIb (slot1) can be extended and MIa (slot0) 620 // can never be extended 621 if (subInstWouldBeExtended(MIa)) 622 return false; 623 624 // If duplexing produces an extender, but the original did not 625 // have an extender, do not duplex. 626 if (subInstWouldBeExtended(MIb) && !ExtendedB) 627 return false; 628 } 629 630 // If jumpr r31 appears, it must be in slot 0, and never slot 1 (MIb). 631 if (MIbG == HexagonII::HSIG_L2) { 632 if ((MIb.getNumOperands() > 1) && MIb.getOperand(1).isReg() && 633 (MIb.getOperand(1).getReg() == Hexagon::R31)) 634 return false; 635 if ((MIb.getNumOperands() > 0) && MIb.getOperand(0).isReg() && 636 (MIb.getOperand(0).getReg() == Hexagon::R31)) 637 return false; 638 } 639 640 if (STI.getCPU().equals_lower("hexagonv5") || 641 STI.getCPU().equals_lower("hexagonv55") || 642 STI.getCPU().equals_lower("hexagonv60")) { 643 // If a store appears, it must be in slot 0 (MIa) 1st, and then slot 1 (MIb); 644 // therefore, not duplexable if slot 1 is a store, and slot 0 is not. 645 if ((MIbG == HexagonII::HSIG_S1) || (MIbG == HexagonII::HSIG_S2)) { 646 if ((MIaG != HexagonII::HSIG_S1) && (MIaG != HexagonII::HSIG_S2)) 647 return false; 648 } 649 } 650 651 return (isDuplexPairMatch(MIaG, MIbG)); 652 } 653 654 /// Symmetrical. See if these two instructions are fit for duplex pair. 655 bool HexagonMCInstrInfo::isDuplexPair(MCInst const &MIa, MCInst const &MIb) { 656 unsigned MIaG = getDuplexCandidateGroup(MIa), 657 MIbG = getDuplexCandidateGroup(MIb); 658 return (isDuplexPairMatch(MIaG, MIbG) || isDuplexPairMatch(MIbG, MIaG)); 659 } 660 661 inline static void addOps(MCInst &subInstPtr, MCInst const &Inst, 662 unsigned opNum) { 663 if (Inst.getOperand(opNum).isReg()) { 664 switch (Inst.getOperand(opNum).getReg()) { 665 default: 666 llvm_unreachable("Not Duplexable Register"); 667 break; 668 case Hexagon::R0: 669 case Hexagon::R1: 670 case Hexagon::R2: 671 case Hexagon::R3: 672 case Hexagon::R4: 673 case Hexagon::R5: 674 case Hexagon::R6: 675 case Hexagon::R7: 676 case Hexagon::D0: 677 case Hexagon::D1: 678 case Hexagon::D2: 679 case Hexagon::D3: 680 case Hexagon::R16: 681 case Hexagon::R17: 682 case Hexagon::R18: 683 case Hexagon::R19: 684 case Hexagon::R20: 685 case Hexagon::R21: 686 case Hexagon::R22: 687 case Hexagon::R23: 688 case Hexagon::D8: 689 case Hexagon::D9: 690 case Hexagon::D10: 691 case Hexagon::D11: 692 case Hexagon::P0: 693 subInstPtr.addOperand(Inst.getOperand(opNum)); 694 break; 695 } 696 } else 697 subInstPtr.addOperand(Inst.getOperand(opNum)); 698 } 699 700 MCInst HexagonMCInstrInfo::deriveSubInst(MCInst const &Inst) { 701 MCInst Result; 702 bool Absolute; 703 int64_t Value; 704 switch (Inst.getOpcode()) { 705 default: 706 // dbgs() << "opcode: "<< Inst->getOpcode() << "\n"; 707 llvm_unreachable("Unimplemented subinstruction \n"); 708 break; 709 case Hexagon::A2_addi: 710 Absolute = Inst.getOperand(2).getExpr()->evaluateAsAbsolute(Value); 711 if (Absolute) { 712 if (Value == 1) { 713 Result.setOpcode(Hexagon::SA1_inc); 714 addOps(Result, Inst, 0); 715 addOps(Result, Inst, 1); 716 break; 717 } // 1,2 SUBInst $Rd = add($Rs, #1) 718 if (Value == -1) { 719 Result.setOpcode(Hexagon::SA1_dec); 720 addOps(Result, Inst, 0); 721 addOps(Result, Inst, 1); 722 addOps(Result, Inst, 2); 723 break; 724 } // 1,2 SUBInst $Rd = add($Rs,#-1) 725 if (Inst.getOperand(1).getReg() == Hexagon::R29) { 726 Result.setOpcode(Hexagon::SA1_addsp); 727 addOps(Result, Inst, 0); 728 addOps(Result, Inst, 2); 729 break; 730 } // 1,3 SUBInst $Rd = add(r29, #$u6_2) 731 } 732 Result.setOpcode(Hexagon::SA1_addi); 733 addOps(Result, Inst, 0); 734 addOps(Result, Inst, 1); 735 addOps(Result, Inst, 2); 736 break; // 1,2,3 SUBInst $Rx = add($Rx, #$s7) 737 case Hexagon::A2_add: 738 Result.setOpcode(Hexagon::SA1_addrx); 739 addOps(Result, Inst, 0); 740 addOps(Result, Inst, 1); 741 addOps(Result, Inst, 2); 742 break; // 1,2,3 SUBInst $Rx = add($_src_, $Rs) 743 case Hexagon::S2_allocframe: 744 Result.setOpcode(Hexagon::SS2_allocframe); 745 addOps(Result, Inst, 2); 746 break; // 1 SUBInst allocframe(#$u5_3) 747 case Hexagon::A2_andir: 748 if (minConstant(Inst, 2) == 255) { 749 Result.setOpcode(Hexagon::SA1_zxtb); 750 addOps(Result, Inst, 0); 751 addOps(Result, Inst, 1); 752 break; // 1,2 $Rd = and($Rs, #255) 753 } else { 754 Result.setOpcode(Hexagon::SA1_and1); 755 addOps(Result, Inst, 0); 756 addOps(Result, Inst, 1); 757 break; // 1,2 SUBInst $Rd = and($Rs, #1) 758 } 759 case Hexagon::C2_cmpeqi: 760 Result.setOpcode(Hexagon::SA1_cmpeqi); 761 addOps(Result, Inst, 1); 762 addOps(Result, Inst, 2); 763 break; // 2,3 SUBInst p0 = cmp.eq($Rs, #$u2) 764 case Hexagon::A4_combineii: 765 case Hexagon::A2_combineii: 766 Absolute = Inst.getOperand(1).getExpr()->evaluateAsAbsolute(Value); 767 assert(Absolute);(void)Absolute; 768 if (Value == 1) { 769 Result.setOpcode(Hexagon::SA1_combine1i); 770 addOps(Result, Inst, 0); 771 addOps(Result, Inst, 2); 772 break; // 1,3 SUBInst $Rdd = combine(#1, #$u2) 773 } 774 if (Value == 3) { 775 Result.setOpcode(Hexagon::SA1_combine3i); 776 addOps(Result, Inst, 0); 777 addOps(Result, Inst, 2); 778 break; // 1,3 SUBInst $Rdd = combine(#3, #$u2) 779 } 780 if (Value == 0) { 781 Result.setOpcode(Hexagon::SA1_combine0i); 782 addOps(Result, Inst, 0); 783 addOps(Result, Inst, 2); 784 break; // 1,3 SUBInst $Rdd = combine(#0, #$u2) 785 } 786 if (Value == 2) { 787 Result.setOpcode(Hexagon::SA1_combine2i); 788 addOps(Result, Inst, 0); 789 addOps(Result, Inst, 2); 790 break; // 1,3 SUBInst $Rdd = combine(#2, #$u2) 791 } 792 break; 793 case Hexagon::A4_combineir: 794 Result.setOpcode(Hexagon::SA1_combinezr); 795 addOps(Result, Inst, 0); 796 addOps(Result, Inst, 2); 797 break; // 1,3 SUBInst $Rdd = combine(#0, $Rs) 798 case Hexagon::A4_combineri: 799 Result.setOpcode(Hexagon::SA1_combinerz); 800 addOps(Result, Inst, 0); 801 addOps(Result, Inst, 1); 802 break; // 1,2 SUBInst $Rdd = combine($Rs, #0) 803 case Hexagon::L4_return_tnew_pnt: 804 case Hexagon::L4_return_tnew_pt: 805 Result.setOpcode(Hexagon::SL2_return_tnew); 806 break; // none SUBInst if (p0.new) dealloc_return:nt 807 case Hexagon::L4_return_fnew_pnt: 808 case Hexagon::L4_return_fnew_pt: 809 Result.setOpcode(Hexagon::SL2_return_fnew); 810 break; // none SUBInst if (!p0.new) dealloc_return:nt 811 case Hexagon::L4_return_f: 812 Result.setOpcode(Hexagon::SL2_return_f); 813 break; // none SUBInst if (!p0) dealloc_return 814 case Hexagon::L4_return_t: 815 Result.setOpcode(Hexagon::SL2_return_t); 816 break; // none SUBInst if (p0) dealloc_return 817 case Hexagon::L4_return: 818 Result.setOpcode(Hexagon::SL2_return); 819 break; // none SUBInst dealloc_return 820 case Hexagon::L2_deallocframe: 821 Result.setOpcode(Hexagon::SL2_deallocframe); 822 break; // none SUBInst deallocframe 823 case Hexagon::EH_RETURN_JMPR: 824 case Hexagon::J2_jumpr: 825 case Hexagon::PS_jmpret: 826 Result.setOpcode(Hexagon::SL2_jumpr31); 827 break; // none SUBInst jumpr r31 828 case Hexagon::J2_jumprf: 829 case Hexagon::PS_jmpretf: 830 Result.setOpcode(Hexagon::SL2_jumpr31_f); 831 break; // none SUBInst if (!p0) jumpr r31 832 case Hexagon::J2_jumprfnew: 833 case Hexagon::J2_jumprfnewpt: 834 case Hexagon::PS_jmpretfnewpt: 835 case Hexagon::PS_jmpretfnew: 836 Result.setOpcode(Hexagon::SL2_jumpr31_fnew); 837 break; // none SUBInst if (!p0.new) jumpr:nt r31 838 case Hexagon::J2_jumprt: 839 case Hexagon::PS_jmprett: 840 Result.setOpcode(Hexagon::SL2_jumpr31_t); 841 break; // none SUBInst if (p0) jumpr r31 842 case Hexagon::J2_jumprtnew: 843 case Hexagon::J2_jumprtnewpt: 844 case Hexagon::PS_jmprettnewpt: 845 case Hexagon::PS_jmprettnew: 846 Result.setOpcode(Hexagon::SL2_jumpr31_tnew); 847 break; // none SUBInst if (p0.new) jumpr:nt r31 848 case Hexagon::L2_loadrb_io: 849 Result.setOpcode(Hexagon::SL2_loadrb_io); 850 addOps(Result, Inst, 0); 851 addOps(Result, Inst, 1); 852 addOps(Result, Inst, 2); 853 break; // 1,2,3 SUBInst $Rd = memb($Rs + #$u3_0) 854 case Hexagon::L2_loadrd_io: 855 Result.setOpcode(Hexagon::SL2_loadrd_sp); 856 addOps(Result, Inst, 0); 857 addOps(Result, Inst, 2); 858 break; // 1,3 SUBInst $Rdd = memd(r29 + #$u5_3) 859 case Hexagon::L2_loadrh_io: 860 Result.setOpcode(Hexagon::SL2_loadrh_io); 861 addOps(Result, Inst, 0); 862 addOps(Result, Inst, 1); 863 addOps(Result, Inst, 2); 864 break; // 1,2,3 SUBInst $Rd = memh($Rs + #$u3_1) 865 case Hexagon::L2_loadrub_io: 866 Result.setOpcode(Hexagon::SL1_loadrub_io); 867 addOps(Result, Inst, 0); 868 addOps(Result, Inst, 1); 869 addOps(Result, Inst, 2); 870 break; // 1,2,3 SUBInst $Rd = memub($Rs + #$u4_0) 871 case Hexagon::L2_loadruh_io: 872 Result.setOpcode(Hexagon::SL2_loadruh_io); 873 addOps(Result, Inst, 0); 874 addOps(Result, Inst, 1); 875 addOps(Result, Inst, 2); 876 break; // 1,2,3 SUBInst $Rd = memuh($Rs + #$u3_1) 877 case Hexagon::L2_loadri_io: 878 if (Inst.getOperand(1).getReg() == Hexagon::R29) { 879 Result.setOpcode(Hexagon::SL2_loadri_sp); 880 addOps(Result, Inst, 0); 881 addOps(Result, Inst, 2); 882 break; // 2 1,3 SUBInst $Rd = memw(r29 + #$u5_2) 883 } else { 884 Result.setOpcode(Hexagon::SL1_loadri_io); 885 addOps(Result, Inst, 0); 886 addOps(Result, Inst, 1); 887 addOps(Result, Inst, 2); 888 break; // 1,2,3 SUBInst $Rd = memw($Rs + #$u4_2) 889 } 890 case Hexagon::S4_storeirb_io: 891 Absolute = Inst.getOperand(2).getExpr()->evaluateAsAbsolute(Value); 892 assert(Absolute);(void)Absolute; 893 if (Value == 0) { 894 Result.setOpcode(Hexagon::SS2_storebi0); 895 addOps(Result, Inst, 0); 896 addOps(Result, Inst, 1); 897 break; // 1,2 SUBInst memb($Rs + #$u4_0)=#0 898 } else if (Value == 1) { 899 Result.setOpcode(Hexagon::SS2_storebi1); 900 addOps(Result, Inst, 0); 901 addOps(Result, Inst, 1); 902 break; // 2 1,2 SUBInst memb($Rs + #$u4_0)=#1 903 } 904 break; 905 case Hexagon::S2_storerb_io: 906 Result.setOpcode(Hexagon::SS1_storeb_io); 907 addOps(Result, Inst, 0); 908 addOps(Result, Inst, 1); 909 addOps(Result, Inst, 2); 910 break; // 1,2,3 SUBInst memb($Rs + #$u4_0) = $Rt 911 case Hexagon::S2_storerd_io: 912 Result.setOpcode(Hexagon::SS2_stored_sp); 913 addOps(Result, Inst, 1); 914 addOps(Result, Inst, 2); 915 break; // 2,3 SUBInst memd(r29 + #$s6_3) = $Rtt 916 case Hexagon::S2_storerh_io: 917 Result.setOpcode(Hexagon::SS2_storeh_io); 918 addOps(Result, Inst, 0); 919 addOps(Result, Inst, 1); 920 addOps(Result, Inst, 2); 921 break; // 1,2,3 SUBInst memb($Rs + #$u4_0) = $Rt 922 case Hexagon::S4_storeiri_io: 923 Absolute = Inst.getOperand(2).getExpr()->evaluateAsAbsolute(Value); 924 assert(Absolute);(void)Absolute; 925 if (Value == 0) { 926 Result.setOpcode(Hexagon::SS2_storewi0); 927 addOps(Result, Inst, 0); 928 addOps(Result, Inst, 1); 929 break; // 3 1,2 SUBInst memw($Rs + #$u4_2)=#0 930 } else if (Value == 1) { 931 Result.setOpcode(Hexagon::SS2_storewi1); 932 addOps(Result, Inst, 0); 933 addOps(Result, Inst, 1); 934 break; // 3 1,2 SUBInst memw($Rs + #$u4_2)=#1 935 } else if (Inst.getOperand(0).getReg() == Hexagon::R29) { 936 Result.setOpcode(Hexagon::SS2_storew_sp); 937 addOps(Result, Inst, 1); 938 addOps(Result, Inst, 2); 939 break; // 1 2,3 SUBInst memw(r29 + #$u5_2) = $Rt 940 } 941 break; 942 case Hexagon::S2_storeri_io: 943 if (Inst.getOperand(0).getReg() == Hexagon::R29) { 944 Result.setOpcode(Hexagon::SS2_storew_sp); 945 addOps(Result, Inst, 1); 946 addOps(Result, Inst, 2); // 1,2,3 SUBInst memw(sp + #$u5_2) = $Rt 947 } else { 948 Result.setOpcode(Hexagon::SS1_storew_io); 949 addOps(Result, Inst, 0); 950 addOps(Result, Inst, 1); 951 addOps(Result, Inst, 2); // 1,2,3 SUBInst memw($Rs + #$u4_2) = $Rt 952 } 953 break; 954 case Hexagon::A2_sxtb: 955 Result.setOpcode(Hexagon::SA1_sxtb); 956 addOps(Result, Inst, 0); 957 addOps(Result, Inst, 1); 958 break; // 1,2 SUBInst $Rd = sxtb($Rs) 959 case Hexagon::A2_sxth: 960 Result.setOpcode(Hexagon::SA1_sxth); 961 addOps(Result, Inst, 0); 962 addOps(Result, Inst, 1); 963 break; // 1,2 SUBInst $Rd = sxth($Rs) 964 case Hexagon::A2_tfr: 965 Result.setOpcode(Hexagon::SA1_tfr); 966 addOps(Result, Inst, 0); 967 addOps(Result, Inst, 1); 968 break; // 1,2 SUBInst $Rd = $Rs 969 case Hexagon::C2_cmovenewif: 970 Result.setOpcode(Hexagon::SA1_clrfnew); 971 addOps(Result, Inst, 0); 972 addOps(Result, Inst, 1); 973 break; // 2 SUBInst if (!p0.new) $Rd = #0 974 case Hexagon::C2_cmovenewit: 975 Result.setOpcode(Hexagon::SA1_clrtnew); 976 addOps(Result, Inst, 0); 977 addOps(Result, Inst, 1); 978 break; // 2 SUBInst if (p0.new) $Rd = #0 979 case Hexagon::C2_cmoveif: 980 Result.setOpcode(Hexagon::SA1_clrf); 981 addOps(Result, Inst, 0); 982 addOps(Result, Inst, 1); 983 break; // 2 SUBInst if (!p0) $Rd = #0 984 case Hexagon::C2_cmoveit: 985 Result.setOpcode(Hexagon::SA1_clrt); 986 addOps(Result, Inst, 0); 987 addOps(Result, Inst, 1); 988 break; // 2 SUBInst if (p0) $Rd = #0 989 case Hexagon::A2_tfrsi: 990 Absolute = Inst.getOperand(1).getExpr()->evaluateAsAbsolute(Value); 991 if (Absolute && Value == -1) { 992 Result.setOpcode(Hexagon::SA1_setin1); 993 addOps(Result, Inst, 0); 994 addOps(Result, Inst, 1); 995 break; // 2 1 SUBInst $Rd = #-1 996 } else { 997 Result.setOpcode(Hexagon::SA1_seti); 998 addOps(Result, Inst, 0); 999 addOps(Result, Inst, 1); 1000 break; // 1,2 SUBInst $Rd = #$u6 1001 } 1002 case Hexagon::A2_zxtb: 1003 Result.setOpcode(Hexagon::SA1_zxtb); 1004 addOps(Result, Inst, 0); 1005 addOps(Result, Inst, 1); 1006 break; // 1,2 $Rd = and($Rs, #255) 1007 1008 case Hexagon::A2_zxth: 1009 Result.setOpcode(Hexagon::SA1_zxth); 1010 addOps(Result, Inst, 0); 1011 addOps(Result, Inst, 1); 1012 break; // 1,2 SUBInst $Rd = zxth($Rs) 1013 } 1014 return Result; 1015 } 1016 1017 static bool isStoreInst(unsigned opCode) { 1018 switch (opCode) { 1019 case Hexagon::S2_storeri_io: 1020 case Hexagon::S2_storerb_io: 1021 case Hexagon::S2_storerh_io: 1022 case Hexagon::S2_storerd_io: 1023 case Hexagon::S4_storeiri_io: 1024 case Hexagon::S4_storeirb_io: 1025 case Hexagon::S2_allocframe: 1026 return true; 1027 default: 1028 return false; 1029 } 1030 } 1031 1032 SmallVector<DuplexCandidate, 8> 1033 HexagonMCInstrInfo::getDuplexPossibilties(MCInstrInfo const &MCII, 1034 MCSubtargetInfo const &STI, 1035 MCInst const &MCB) { 1036 assert(isBundle(MCB)); 1037 SmallVector<DuplexCandidate, 8> duplexToTry; 1038 // Use an "order matters" version of isDuplexPair. 1039 unsigned numInstrInPacket = MCB.getNumOperands(); 1040 1041 for (unsigned distance = 1; distance < numInstrInPacket; ++distance) { 1042 for (unsigned j = HexagonMCInstrInfo::bundleInstructionsOffset, 1043 k = j + distance; 1044 (j < numInstrInPacket) && (k < numInstrInPacket); ++j, ++k) { 1045 1046 // Check if reversible. 1047 bool bisReversable = true; 1048 if (isStoreInst(MCB.getOperand(j).getInst()->getOpcode()) && 1049 isStoreInst(MCB.getOperand(k).getInst()->getOpcode())) { 1050 LLVM_DEBUG(dbgs() << "skip out of order write pair: " << k << "," << j 1051 << "\n"); 1052 bisReversable = false; 1053 } 1054 if (HexagonMCInstrInfo::isMemReorderDisabled(MCB)) // }:mem_noshuf 1055 bisReversable = false; 1056 1057 // Try in order. 1058 if (isOrderedDuplexPair( 1059 MCII, *MCB.getOperand(k).getInst(), 1060 HexagonMCInstrInfo::hasExtenderForIndex(MCB, k - 1), 1061 *MCB.getOperand(j).getInst(), 1062 HexagonMCInstrInfo::hasExtenderForIndex(MCB, j - 1), 1063 bisReversable, STI)) { 1064 // Get iClass. 1065 unsigned iClass = iClassOfDuplexPair( 1066 getDuplexCandidateGroup(*MCB.getOperand(k).getInst()), 1067 getDuplexCandidateGroup(*MCB.getOperand(j).getInst())); 1068 1069 // Save off pairs for duplex checking. 1070 duplexToTry.push_back(DuplexCandidate(j, k, iClass)); 1071 LLVM_DEBUG(dbgs() << "adding pair: " << j << "," << k << ":" 1072 << MCB.getOperand(j).getInst()->getOpcode() << "," 1073 << MCB.getOperand(k).getInst()->getOpcode() << "\n"); 1074 continue; 1075 } else { 1076 LLVM_DEBUG(dbgs() << "skipping pair: " << j << "," << k << ":" 1077 << MCB.getOperand(j).getInst()->getOpcode() << "," 1078 << MCB.getOperand(k).getInst()->getOpcode() << "\n"); 1079 } 1080 1081 // Try reverse. 1082 if (bisReversable) { 1083 if (isOrderedDuplexPair( 1084 MCII, *MCB.getOperand(j).getInst(), 1085 HexagonMCInstrInfo::hasExtenderForIndex(MCB, j - 1), 1086 *MCB.getOperand(k).getInst(), 1087 HexagonMCInstrInfo::hasExtenderForIndex(MCB, k - 1), 1088 bisReversable, STI)) { 1089 // Get iClass. 1090 unsigned iClass = iClassOfDuplexPair( 1091 getDuplexCandidateGroup(*MCB.getOperand(j).getInst()), 1092 getDuplexCandidateGroup(*MCB.getOperand(k).getInst())); 1093 1094 // Save off pairs for duplex checking. 1095 duplexToTry.push_back(DuplexCandidate(k, j, iClass)); 1096 LLVM_DEBUG(dbgs() 1097 << "adding pair:" << k << "," << j << ":" 1098 << MCB.getOperand(j).getInst()->getOpcode() << "," 1099 << MCB.getOperand(k).getInst()->getOpcode() << "\n"); 1100 } else { 1101 LLVM_DEBUG(dbgs() 1102 << "skipping pair: " << k << "," << j << ":" 1103 << MCB.getOperand(j).getInst()->getOpcode() << "," 1104 << MCB.getOperand(k).getInst()->getOpcode() << "\n"); 1105 } 1106 } 1107 } 1108 } 1109 return duplexToTry; 1110 } 1111