| File: | lib/Target/Hexagon/MCTargetDesc/HexagonMCCompound.cpp |
| Warning: | line 302, column 5 Called C++ object pointer is null |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
| 1 | //=== HexagonMCCompound.cpp - Hexagon Compound checker -------------------===// | |||
| 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 file is looks at a packet and tries to form compound insns | |||
| 10 | // | |||
| 11 | //===----------------------------------------------------------------------===// | |||
| 12 | ||||
| 13 | #include "MCTargetDesc/HexagonBaseInfo.h" | |||
| 14 | #include "MCTargetDesc/HexagonMCInstrInfo.h" | |||
| 15 | #include "MCTargetDesc/HexagonMCShuffler.h" | |||
| 16 | #include "llvm/MC/MCContext.h" | |||
| 17 | #include "llvm/MC/MCInst.h" | |||
| 18 | #include "llvm/Support/Debug.h" | |||
| 19 | #include "llvm/Support/ErrorHandling.h" | |||
| 20 | #include "llvm/Support/raw_ostream.h" | |||
| 21 | #include <cassert> | |||
| 22 | #include <cstdint> | |||
| 23 | ||||
| 24 | using namespace llvm; | |||
| 25 | using namespace Hexagon; | |||
| 26 | ||||
| 27 | #define DEBUG_TYPE"hexagon-mccompound" "hexagon-mccompound" | |||
| 28 | ||||
| 29 | enum OpcodeIndex { | |||
| 30 | fp0_jump_nt = 0, | |||
| 31 | fp0_jump_t, | |||
| 32 | fp1_jump_nt, | |||
| 33 | fp1_jump_t, | |||
| 34 | tp0_jump_nt, | |||
| 35 | tp0_jump_t, | |||
| 36 | tp1_jump_nt, | |||
| 37 | tp1_jump_t | |||
| 38 | }; | |||
| 39 | ||||
| 40 | static const unsigned tstBitOpcode[8] = { | |||
| 41 | J4_tstbit0_fp0_jump_nt, J4_tstbit0_fp0_jump_t, J4_tstbit0_fp1_jump_nt, | |||
| 42 | J4_tstbit0_fp1_jump_t, J4_tstbit0_tp0_jump_nt, J4_tstbit0_tp0_jump_t, | |||
| 43 | J4_tstbit0_tp1_jump_nt, J4_tstbit0_tp1_jump_t}; | |||
| 44 | static const unsigned cmpeqBitOpcode[8] = { | |||
| 45 | J4_cmpeq_fp0_jump_nt, J4_cmpeq_fp0_jump_t, J4_cmpeq_fp1_jump_nt, | |||
| 46 | J4_cmpeq_fp1_jump_t, J4_cmpeq_tp0_jump_nt, J4_cmpeq_tp0_jump_t, | |||
| 47 | J4_cmpeq_tp1_jump_nt, J4_cmpeq_tp1_jump_t}; | |||
| 48 | static const unsigned cmpgtBitOpcode[8] = { | |||
| 49 | J4_cmpgt_fp0_jump_nt, J4_cmpgt_fp0_jump_t, J4_cmpgt_fp1_jump_nt, | |||
| 50 | J4_cmpgt_fp1_jump_t, J4_cmpgt_tp0_jump_nt, J4_cmpgt_tp0_jump_t, | |||
| 51 | J4_cmpgt_tp1_jump_nt, J4_cmpgt_tp1_jump_t}; | |||
| 52 | static const unsigned cmpgtuBitOpcode[8] = { | |||
| 53 | J4_cmpgtu_fp0_jump_nt, J4_cmpgtu_fp0_jump_t, J4_cmpgtu_fp1_jump_nt, | |||
| 54 | J4_cmpgtu_fp1_jump_t, J4_cmpgtu_tp0_jump_nt, J4_cmpgtu_tp0_jump_t, | |||
| 55 | J4_cmpgtu_tp1_jump_nt, J4_cmpgtu_tp1_jump_t}; | |||
| 56 | static const unsigned cmpeqiBitOpcode[8] = { | |||
| 57 | J4_cmpeqi_fp0_jump_nt, J4_cmpeqi_fp0_jump_t, J4_cmpeqi_fp1_jump_nt, | |||
| 58 | J4_cmpeqi_fp1_jump_t, J4_cmpeqi_tp0_jump_nt, J4_cmpeqi_tp0_jump_t, | |||
| 59 | J4_cmpeqi_tp1_jump_nt, J4_cmpeqi_tp1_jump_t}; | |||
| 60 | static const unsigned cmpgtiBitOpcode[8] = { | |||
| 61 | J4_cmpgti_fp0_jump_nt, J4_cmpgti_fp0_jump_t, J4_cmpgti_fp1_jump_nt, | |||
| 62 | J4_cmpgti_fp1_jump_t, J4_cmpgti_tp0_jump_nt, J4_cmpgti_tp0_jump_t, | |||
| 63 | J4_cmpgti_tp1_jump_nt, J4_cmpgti_tp1_jump_t}; | |||
| 64 | static const unsigned cmpgtuiBitOpcode[8] = { | |||
| 65 | J4_cmpgtui_fp0_jump_nt, J4_cmpgtui_fp0_jump_t, J4_cmpgtui_fp1_jump_nt, | |||
| 66 | J4_cmpgtui_fp1_jump_t, J4_cmpgtui_tp0_jump_nt, J4_cmpgtui_tp0_jump_t, | |||
| 67 | J4_cmpgtui_tp1_jump_nt, J4_cmpgtui_tp1_jump_t}; | |||
| 68 | static const unsigned cmpeqn1BitOpcode[8] = { | |||
| 69 | J4_cmpeqn1_fp0_jump_nt, J4_cmpeqn1_fp0_jump_t, J4_cmpeqn1_fp1_jump_nt, | |||
| 70 | J4_cmpeqn1_fp1_jump_t, J4_cmpeqn1_tp0_jump_nt, J4_cmpeqn1_tp0_jump_t, | |||
| 71 | J4_cmpeqn1_tp1_jump_nt, J4_cmpeqn1_tp1_jump_t}; | |||
| 72 | static const unsigned cmpgtn1BitOpcode[8] = { | |||
| 73 | J4_cmpgtn1_fp0_jump_nt, J4_cmpgtn1_fp0_jump_t, J4_cmpgtn1_fp1_jump_nt, | |||
| 74 | J4_cmpgtn1_fp1_jump_t, J4_cmpgtn1_tp0_jump_nt, J4_cmpgtn1_tp0_jump_t, | |||
| 75 | J4_cmpgtn1_tp1_jump_nt, J4_cmpgtn1_tp1_jump_t, | |||
| 76 | }; | |||
| 77 | ||||
| 78 | // enum HexagonII::CompoundGroup | |||
| 79 | static unsigned getCompoundCandidateGroup(MCInst const &MI, bool IsExtended) { | |||
| 80 | unsigned DstReg, SrcReg, Src1Reg, Src2Reg; | |||
| 81 | ||||
| 82 | switch (MI.getOpcode()) { | |||
| 83 | default: | |||
| 84 | return HexagonII::HCG_None; | |||
| 85 | // | |||
| 86 | // Compound pairs. | |||
| 87 | // "p0=cmp.eq(Rs16,Rt16); if (p0.new) jump:nt #r9:2" | |||
| 88 | // "Rd16=#U6 ; jump #r9:2" | |||
| 89 | // "Rd16=Rs16 ; jump #r9:2" | |||
| 90 | // | |||
| 91 | case Hexagon::C2_cmpeq: | |||
| 92 | case Hexagon::C2_cmpgt: | |||
| 93 | case Hexagon::C2_cmpgtu: | |||
| 94 | if (IsExtended) | |||
| 95 | return false; | |||
| 96 | DstReg = MI.getOperand(0).getReg(); | |||
| 97 | Src1Reg = MI.getOperand(1).getReg(); | |||
| 98 | Src2Reg = MI.getOperand(2).getReg(); | |||
| 99 | if ((Hexagon::P0 == DstReg || Hexagon::P1 == DstReg) && | |||
| 100 | HexagonMCInstrInfo::isIntRegForSubInst(Src1Reg) && | |||
| 101 | HexagonMCInstrInfo::isIntRegForSubInst(Src2Reg)) | |||
| 102 | return HexagonII::HCG_A; | |||
| 103 | break; | |||
| 104 | case Hexagon::C2_cmpeqi: | |||
| 105 | case Hexagon::C2_cmpgti: | |||
| 106 | case Hexagon::C2_cmpgtui: | |||
| 107 | if (IsExtended) | |||
| 108 | return false; | |||
| 109 | // P0 = cmp.eq(Rs,#u2) | |||
| 110 | DstReg = MI.getOperand(0).getReg(); | |||
| 111 | SrcReg = MI.getOperand(1).getReg(); | |||
| 112 | if ((Hexagon::P0 == DstReg || Hexagon::P1 == DstReg) && | |||
| 113 | HexagonMCInstrInfo::isIntRegForSubInst(SrcReg) && | |||
| 114 | (HexagonMCInstrInfo::inRange<5>(MI, 2) || | |||
| 115 | HexagonMCInstrInfo::minConstant(MI, 2) == -1)) | |||
| 116 | return HexagonII::HCG_A; | |||
| 117 | break; | |||
| 118 | case Hexagon::A2_tfr: | |||
| 119 | if (IsExtended) | |||
| 120 | return false; | |||
| 121 | // Rd = Rs | |||
| 122 | DstReg = MI.getOperand(0).getReg(); | |||
| 123 | SrcReg = MI.getOperand(1).getReg(); | |||
| 124 | if (HexagonMCInstrInfo::isIntRegForSubInst(DstReg) && | |||
| 125 | HexagonMCInstrInfo::isIntRegForSubInst(SrcReg)) | |||
| 126 | return HexagonII::HCG_A; | |||
| 127 | break; | |||
| 128 | case Hexagon::A2_tfrsi: | |||
| 129 | if (IsExtended) | |||
| 130 | return false; | |||
| 131 | // Rd = #u6 | |||
| 132 | DstReg = MI.getOperand(0).getReg(); | |||
| 133 | if (HexagonMCInstrInfo::minConstant(MI, 1) <= 63 && | |||
| 134 | HexagonMCInstrInfo::minConstant(MI, 1) >= 0 && | |||
| 135 | HexagonMCInstrInfo::isIntRegForSubInst(DstReg)) | |||
| 136 | return HexagonII::HCG_A; | |||
| 137 | break; | |||
| 138 | case Hexagon::S2_tstbit_i: | |||
| 139 | if (IsExtended) | |||
| 140 | return false; | |||
| 141 | DstReg = MI.getOperand(0).getReg(); | |||
| 142 | Src1Reg = MI.getOperand(1).getReg(); | |||
| 143 | if ((Hexagon::P0 == DstReg || Hexagon::P1 == DstReg) && | |||
| 144 | HexagonMCInstrInfo::isIntRegForSubInst(Src1Reg) && | |||
| 145 | HexagonMCInstrInfo::minConstant(MI, 2) == 0) | |||
| 146 | return HexagonII::HCG_A; | |||
| 147 | break; | |||
| 148 | // The fact that .new form is used pretty much guarantees | |||
| 149 | // that predicate register will match. Nevertheless, | |||
| 150 | // there could be some false positives without additional | |||
| 151 | // checking. | |||
| 152 | case Hexagon::J2_jumptnew: | |||
| 153 | case Hexagon::J2_jumpfnew: | |||
| 154 | case Hexagon::J2_jumptnewpt: | |||
| 155 | case Hexagon::J2_jumpfnewpt: | |||
| 156 | Src1Reg = MI.getOperand(0).getReg(); | |||
| 157 | if (Hexagon::P0 == Src1Reg || Hexagon::P1 == Src1Reg) | |||
| 158 | return HexagonII::HCG_B; | |||
| 159 | break; | |||
| 160 | // Transfer and jump: | |||
| 161 | // Rd=#U6 ; jump #r9:2 | |||
| 162 | // Rd=Rs ; jump #r9:2 | |||
| 163 | // Do not test for jump range here. | |||
| 164 | case Hexagon::J2_jump: | |||
| 165 | case Hexagon::RESTORE_DEALLOC_RET_JMP_V4: | |||
| 166 | return HexagonII::HCG_C; | |||
| 167 | break; | |||
| 168 | } | |||
| 169 | ||||
| 170 | return HexagonII::HCG_None; | |||
| 171 | } | |||
| 172 | ||||
| 173 | /// getCompoundOp - Return the index from 0-7 into the above opcode lists. | |||
| 174 | static unsigned getCompoundOp(MCInst const &HMCI) { | |||
| 175 | const MCOperand &Predicate = HMCI.getOperand(0); | |||
| 176 | unsigned PredReg = Predicate.getReg(); | |||
| 177 | ||||
| 178 | assert((PredReg == Hexagon::P0) || (PredReg == Hexagon::P1) ||(((PredReg == Hexagon::P0) || (PredReg == Hexagon::P1) || (PredReg == Hexagon::P2) || (PredReg == Hexagon::P3)) ? static_cast< void> (0) : __assert_fail ("(PredReg == Hexagon::P0) || (PredReg == Hexagon::P1) || (PredReg == Hexagon::P2) || (PredReg == Hexagon::P3)" , "/build/llvm-toolchain-snapshot-9~svn362543/lib/Target/Hexagon/MCTargetDesc/HexagonMCCompound.cpp" , 179, __PRETTY_FUNCTION__)) | |||
| 179 | (PredReg == Hexagon::P2) || (PredReg == Hexagon::P3))(((PredReg == Hexagon::P0) || (PredReg == Hexagon::P1) || (PredReg == Hexagon::P2) || (PredReg == Hexagon::P3)) ? static_cast< void> (0) : __assert_fail ("(PredReg == Hexagon::P0) || (PredReg == Hexagon::P1) || (PredReg == Hexagon::P2) || (PredReg == Hexagon::P3)" , "/build/llvm-toolchain-snapshot-9~svn362543/lib/Target/Hexagon/MCTargetDesc/HexagonMCCompound.cpp" , 179, __PRETTY_FUNCTION__)); | |||
| 180 | ||||
| 181 | switch (HMCI.getOpcode()) { | |||
| 182 | default: | |||
| 183 | llvm_unreachable("Expected match not found.\n")::llvm::llvm_unreachable_internal("Expected match not found.\n" , "/build/llvm-toolchain-snapshot-9~svn362543/lib/Target/Hexagon/MCTargetDesc/HexagonMCCompound.cpp" , 183); | |||
| 184 | break; | |||
| 185 | case Hexagon::J2_jumpfnew: | |||
| 186 | return (PredReg == Hexagon::P0) ? fp0_jump_nt : fp1_jump_nt; | |||
| 187 | case Hexagon::J2_jumpfnewpt: | |||
| 188 | return (PredReg == Hexagon::P0) ? fp0_jump_t : fp1_jump_t; | |||
| 189 | case Hexagon::J2_jumptnew: | |||
| 190 | return (PredReg == Hexagon::P0) ? tp0_jump_nt : tp1_jump_nt; | |||
| 191 | case Hexagon::J2_jumptnewpt: | |||
| 192 | return (PredReg == Hexagon::P0) ? tp0_jump_t : tp1_jump_t; | |||
| 193 | } | |||
| 194 | } | |||
| 195 | ||||
| 196 | static MCInst *getCompoundInsn(MCContext &Context, MCInst const &L, | |||
| 197 | MCInst const &R) { | |||
| 198 | MCInst *CompoundInsn = nullptr; | |||
| 199 | unsigned compoundOpcode; | |||
| 200 | MCOperand Rs, Rt; | |||
| 201 | int64_t Value; | |||
| 202 | bool Success; | |||
| 203 | ||||
| 204 | switch (L.getOpcode()) { | |||
| 205 | default: | |||
| 206 | LLVM_DEBUG(dbgs() << "Possible compound ignored\n")do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("hexagon-mccompound")) { dbgs() << "Possible compound ignored\n" ; } } while (false); | |||
| 207 | return CompoundInsn; | |||
| 208 | ||||
| 209 | case Hexagon::A2_tfrsi: | |||
| 210 | Rt = L.getOperand(0); | |||
| 211 | compoundOpcode = J4_jumpseti; | |||
| 212 | CompoundInsn = new (Context) MCInst; | |||
| 213 | CompoundInsn->setOpcode(compoundOpcode); | |||
| 214 | ||||
| 215 | CompoundInsn->addOperand(Rt); | |||
| 216 | CompoundInsn->addOperand(L.getOperand(1)); // Immediate | |||
| 217 | CompoundInsn->addOperand(R.getOperand(0)); // Jump target | |||
| 218 | break; | |||
| 219 | ||||
| 220 | case Hexagon::A2_tfr: | |||
| 221 | Rt = L.getOperand(0); | |||
| 222 | Rs = L.getOperand(1); | |||
| 223 | ||||
| 224 | compoundOpcode = J4_jumpsetr; | |||
| 225 | CompoundInsn = new (Context) MCInst; | |||
| 226 | CompoundInsn->setOpcode(compoundOpcode); | |||
| 227 | CompoundInsn->addOperand(Rt); | |||
| 228 | CompoundInsn->addOperand(Rs); | |||
| 229 | CompoundInsn->addOperand(R.getOperand(0)); // Jump target. | |||
| 230 | ||||
| 231 | break; | |||
| 232 | ||||
| 233 | case Hexagon::C2_cmpeq: | |||
| 234 | LLVM_DEBUG(dbgs() << "CX: C2_cmpeq\n")do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("hexagon-mccompound")) { dbgs() << "CX: C2_cmpeq\n"; } } while (false); | |||
| 235 | Rs = L.getOperand(1); | |||
| 236 | Rt = L.getOperand(2); | |||
| 237 | ||||
| 238 | compoundOpcode = cmpeqBitOpcode[getCompoundOp(R)]; | |||
| 239 | CompoundInsn = new (Context) MCInst; | |||
| 240 | CompoundInsn->setOpcode(compoundOpcode); | |||
| 241 | CompoundInsn->addOperand(Rs); | |||
| 242 | CompoundInsn->addOperand(Rt); | |||
| 243 | CompoundInsn->addOperand(R.getOperand(1)); | |||
| 244 | break; | |||
| 245 | ||||
| 246 | case Hexagon::C2_cmpgt: | |||
| 247 | LLVM_DEBUG(dbgs() << "CX: C2_cmpgt\n")do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("hexagon-mccompound")) { dbgs() << "CX: C2_cmpgt\n"; } } while (false); | |||
| 248 | Rs = L.getOperand(1); | |||
| 249 | Rt = L.getOperand(2); | |||
| 250 | ||||
| 251 | compoundOpcode = cmpgtBitOpcode[getCompoundOp(R)]; | |||
| 252 | CompoundInsn = new (Context) MCInst; | |||
| 253 | CompoundInsn->setOpcode(compoundOpcode); | |||
| 254 | CompoundInsn->addOperand(Rs); | |||
| 255 | CompoundInsn->addOperand(Rt); | |||
| 256 | CompoundInsn->addOperand(R.getOperand(1)); | |||
| 257 | break; | |||
| 258 | ||||
| 259 | case Hexagon::C2_cmpgtu: | |||
| 260 | LLVM_DEBUG(dbgs() << "CX: C2_cmpgtu\n")do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("hexagon-mccompound")) { dbgs() << "CX: C2_cmpgtu\n"; } } while (false); | |||
| 261 | Rs = L.getOperand(1); | |||
| 262 | Rt = L.getOperand(2); | |||
| 263 | ||||
| 264 | compoundOpcode = cmpgtuBitOpcode[getCompoundOp(R)]; | |||
| 265 | CompoundInsn = new (Context) MCInst; | |||
| 266 | CompoundInsn->setOpcode(compoundOpcode); | |||
| 267 | CompoundInsn->addOperand(Rs); | |||
| 268 | CompoundInsn->addOperand(Rt); | |||
| 269 | CompoundInsn->addOperand(R.getOperand(1)); | |||
| 270 | break; | |||
| 271 | ||||
| 272 | case Hexagon::C2_cmpeqi: | |||
| 273 | LLVM_DEBUG(dbgs() << "CX: C2_cmpeqi\n")do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("hexagon-mccompound")) { dbgs() << "CX: C2_cmpeqi\n"; } } while (false); | |||
| 274 | Success = L.getOperand(2).getExpr()->evaluateAsAbsolute(Value); | |||
| 275 | (void)Success; | |||
| 276 | assert(Success)((Success) ? static_cast<void> (0) : __assert_fail ("Success" , "/build/llvm-toolchain-snapshot-9~svn362543/lib/Target/Hexagon/MCTargetDesc/HexagonMCCompound.cpp" , 276, __PRETTY_FUNCTION__)); | |||
| 277 | if (Value == -1) | |||
| 278 | compoundOpcode = cmpeqn1BitOpcode[getCompoundOp(R)]; | |||
| 279 | else | |||
| 280 | compoundOpcode = cmpeqiBitOpcode[getCompoundOp(R)]; | |||
| 281 | ||||
| 282 | Rs = L.getOperand(1); | |||
| 283 | CompoundInsn = new (Context) MCInst; | |||
| 284 | CompoundInsn->setOpcode(compoundOpcode); | |||
| 285 | CompoundInsn->addOperand(Rs); | |||
| 286 | CompoundInsn->addOperand(L.getOperand(2)); | |||
| 287 | CompoundInsn->addOperand(R.getOperand(1)); | |||
| 288 | break; | |||
| 289 | ||||
| 290 | case Hexagon::C2_cmpgti: | |||
| 291 | LLVM_DEBUG(dbgs() << "CX: C2_cmpgti\n")do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("hexagon-mccompound")) { dbgs() << "CX: C2_cmpgti\n"; } } while (false); | |||
| 292 | Success = L.getOperand(2).getExpr()->evaluateAsAbsolute(Value); | |||
| 293 | (void)Success; | |||
| 294 | assert(Success)((Success) ? static_cast<void> (0) : __assert_fail ("Success" , "/build/llvm-toolchain-snapshot-9~svn362543/lib/Target/Hexagon/MCTargetDesc/HexagonMCCompound.cpp" , 294, __PRETTY_FUNCTION__)); | |||
| 295 | if (Value == -1) | |||
| 296 | compoundOpcode = cmpgtn1BitOpcode[getCompoundOp(R)]; | |||
| 297 | else | |||
| 298 | compoundOpcode = cmpgtiBitOpcode[getCompoundOp(R)]; | |||
| 299 | ||||
| 300 | Rs = L.getOperand(1); | |||
| 301 | CompoundInsn = new (Context) MCInst; | |||
| 302 | CompoundInsn->setOpcode(compoundOpcode); | |||
| ||||
| 303 | CompoundInsn->addOperand(Rs); | |||
| 304 | CompoundInsn->addOperand(L.getOperand(2)); | |||
| 305 | CompoundInsn->addOperand(R.getOperand(1)); | |||
| 306 | break; | |||
| 307 | ||||
| 308 | case Hexagon::C2_cmpgtui: | |||
| 309 | LLVM_DEBUG(dbgs() << "CX: C2_cmpgtui\n")do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("hexagon-mccompound")) { dbgs() << "CX: C2_cmpgtui\n"; } } while (false); | |||
| 310 | Rs = L.getOperand(1); | |||
| 311 | compoundOpcode = cmpgtuiBitOpcode[getCompoundOp(R)]; | |||
| 312 | CompoundInsn = new (Context) MCInst; | |||
| 313 | CompoundInsn->setOpcode(compoundOpcode); | |||
| 314 | CompoundInsn->addOperand(Rs); | |||
| 315 | CompoundInsn->addOperand(L.getOperand(2)); | |||
| 316 | CompoundInsn->addOperand(R.getOperand(1)); | |||
| 317 | break; | |||
| 318 | ||||
| 319 | case Hexagon::S2_tstbit_i: | |||
| 320 | LLVM_DEBUG(dbgs() << "CX: S2_tstbit_i\n")do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("hexagon-mccompound")) { dbgs() << "CX: S2_tstbit_i\n" ; } } while (false); | |||
| 321 | Rs = L.getOperand(1); | |||
| 322 | compoundOpcode = tstBitOpcode[getCompoundOp(R)]; | |||
| 323 | CompoundInsn = new (Context) MCInst; | |||
| 324 | CompoundInsn->setOpcode(compoundOpcode); | |||
| 325 | CompoundInsn->addOperand(Rs); | |||
| 326 | CompoundInsn->addOperand(R.getOperand(1)); | |||
| 327 | break; | |||
| 328 | } | |||
| 329 | ||||
| 330 | return CompoundInsn; | |||
| 331 | } | |||
| 332 | ||||
| 333 | /// Non-Symmetrical. See if these two instructions are fit for compound pair. | |||
| 334 | static bool isOrderedCompoundPair(MCInst const &MIa, bool IsExtendedA, | |||
| 335 | MCInst const &MIb, bool IsExtendedB) { | |||
| 336 | unsigned MIaG = getCompoundCandidateGroup(MIa, IsExtendedA); | |||
| 337 | unsigned MIbG = getCompoundCandidateGroup(MIb, IsExtendedB); | |||
| 338 | // We have two candidates - check that this is the same register | |||
| 339 | // we are talking about. | |||
| 340 | unsigned Opca = MIa.getOpcode(); | |||
| 341 | if (MIaG == HexagonII::HCG_A && MIbG == HexagonII::HCG_C && | |||
| 342 | (Opca == Hexagon::A2_tfr || Opca == Hexagon::A2_tfrsi)) | |||
| 343 | return true; | |||
| 344 | return ((MIaG == HexagonII::HCG_A && MIbG == HexagonII::HCG_B) && | |||
| 345 | (MIa.getOperand(0).getReg() == MIb.getOperand(0).getReg())); | |||
| 346 | } | |||
| 347 | ||||
| 348 | static bool lookForCompound(MCInstrInfo const &MCII, MCContext &Context, | |||
| 349 | MCInst &MCI) { | |||
| 350 | assert(HexagonMCInstrInfo::isBundle(MCI))((HexagonMCInstrInfo::isBundle(MCI)) ? static_cast<void> (0) : __assert_fail ("HexagonMCInstrInfo::isBundle(MCI)", "/build/llvm-toolchain-snapshot-9~svn362543/lib/Target/Hexagon/MCTargetDesc/HexagonMCCompound.cpp" , 350, __PRETTY_FUNCTION__)); | |||
| 351 | bool JExtended = false; | |||
| 352 | for (MCInst::iterator J = | |||
| 353 | MCI.begin() + HexagonMCInstrInfo::bundleInstructionsOffset; | |||
| 354 | J != MCI.end(); ++J) { | |||
| 355 | MCInst const *JumpInst = J->getInst(); | |||
| 356 | if (HexagonMCInstrInfo::isImmext(*JumpInst)) { | |||
| 357 | JExtended = true; | |||
| 358 | continue; | |||
| 359 | } | |||
| 360 | if (HexagonMCInstrInfo::getType(MCII, *JumpInst) == HexagonII::TypeJ) { | |||
| 361 | // Try to pair with another insn (B)undled with jump. | |||
| 362 | bool BExtended = false; | |||
| 363 | for (MCInst::iterator B = | |||
| 364 | MCI.begin() + HexagonMCInstrInfo::bundleInstructionsOffset; | |||
| 365 | B != MCI.end(); ++B) { | |||
| 366 | MCInst const *Inst = B->getInst(); | |||
| 367 | if (JumpInst == Inst) | |||
| 368 | continue; | |||
| 369 | if (HexagonMCInstrInfo::isImmext(*Inst)) { | |||
| 370 | BExtended = true; | |||
| 371 | continue; | |||
| 372 | } | |||
| 373 | LLVM_DEBUG(dbgs() << "J,B: " << JumpInst->getOpcode() << ","do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("hexagon-mccompound")) { dbgs() << "J,B: " << JumpInst ->getOpcode() << "," << Inst->getOpcode() << "\n"; } } while (false) | |||
| 374 | << Inst->getOpcode() << "\n")do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("hexagon-mccompound")) { dbgs() << "J,B: " << JumpInst ->getOpcode() << "," << Inst->getOpcode() << "\n"; } } while (false); | |||
| 375 | if (isOrderedCompoundPair(*Inst, BExtended, *JumpInst, JExtended)) { | |||
| 376 | MCInst *CompoundInsn = getCompoundInsn(Context, *Inst, *JumpInst); | |||
| 377 | if (CompoundInsn) { | |||
| 378 | LLVM_DEBUG(dbgs() << "B: " << Inst->getOpcode() << ","do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("hexagon-mccompound")) { dbgs() << "B: " << Inst ->getOpcode() << "," << JumpInst->getOpcode () << " Compounds to " << CompoundInsn->getOpcode () << "\n"; } } while (false) | |||
| 379 | << JumpInst->getOpcode() << " Compounds to "do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("hexagon-mccompound")) { dbgs() << "B: " << Inst ->getOpcode() << "," << JumpInst->getOpcode () << " Compounds to " << CompoundInsn->getOpcode () << "\n"; } } while (false) | |||
| 380 | << CompoundInsn->getOpcode() << "\n")do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("hexagon-mccompound")) { dbgs() << "B: " << Inst ->getOpcode() << "," << JumpInst->getOpcode () << " Compounds to " << CompoundInsn->getOpcode () << "\n"; } } while (false); | |||
| 381 | J->setInst(CompoundInsn); | |||
| 382 | MCI.erase(B); | |||
| 383 | return true; | |||
| 384 | } | |||
| 385 | } | |||
| 386 | BExtended = false; | |||
| 387 | } | |||
| 388 | } | |||
| 389 | JExtended = false; | |||
| 390 | } | |||
| 391 | return false; | |||
| 392 | } | |||
| 393 | ||||
| 394 | /// tryCompound - Given a bundle check for compound insns when one | |||
| 395 | /// is found update the contents fo the bundle with the compound insn. | |||
| 396 | /// If a compound instruction is found then the bundle will have one | |||
| 397 | /// additional slot. | |||
| 398 | void HexagonMCInstrInfo::tryCompound(MCInstrInfo const &MCII, MCSubtargetInfo const &STI, | |||
| 399 | MCContext &Context, MCInst &MCI) { | |||
| 400 | assert(HexagonMCInstrInfo::isBundle(MCI) &&((HexagonMCInstrInfo::isBundle(MCI) && "Non-Bundle where Bundle expected" ) ? static_cast<void> (0) : __assert_fail ("HexagonMCInstrInfo::isBundle(MCI) && \"Non-Bundle where Bundle expected\"" , "/build/llvm-toolchain-snapshot-9~svn362543/lib/Target/Hexagon/MCTargetDesc/HexagonMCCompound.cpp" , 401, __PRETTY_FUNCTION__)) | |||
| ||||
| 401 | "Non-Bundle where Bundle expected")((HexagonMCInstrInfo::isBundle(MCI) && "Non-Bundle where Bundle expected" ) ? static_cast<void> (0) : __assert_fail ("HexagonMCInstrInfo::isBundle(MCI) && \"Non-Bundle where Bundle expected\"" , "/build/llvm-toolchain-snapshot-9~svn362543/lib/Target/Hexagon/MCTargetDesc/HexagonMCCompound.cpp" , 401, __PRETTY_FUNCTION__)); | |||
| 402 | ||||
| 403 | // By definition a compound must have 2 insn. | |||
| 404 | if (MCI.size() < 2) | |||
| 405 | return; | |||
| 406 | ||||
| 407 | bool StartedValid = llvm::HexagonMCShuffle(Context, false, MCII, STI, MCI); | |||
| 408 | ||||
| 409 | // Create a vector, needed to keep the order of jump instructions. | |||
| 410 | MCInst CheckList(MCI); | |||
| 411 | ||||
| 412 | // Look for compounds until none are found, only update the bundle when | |||
| 413 | // a compound is found. | |||
| 414 | while (lookForCompound(MCII, Context, CheckList)) { | |||
| 415 | // Keep the original bundle around in case the shuffle fails. | |||
| 416 | MCInst OriginalBundle(MCI); | |||
| 417 | ||||
| 418 | // Need to update the bundle. | |||
| 419 | MCI = CheckList; | |||
| 420 | ||||
| 421 | if (StartedValid && | |||
| 422 | !llvm::HexagonMCShuffle(Context, false, MCII, STI, MCI)) { | |||
| 423 | LLVM_DEBUG(dbgs() << "Found ERROR\n")do { if (::llvm::DebugFlag && ::llvm::isCurrentDebugType ("hexagon-mccompound")) { dbgs() << "Found ERROR\n"; } } while (false); | |||
| 424 | MCI = OriginalBundle; | |||
| 425 | } | |||
| 426 | } | |||
| 427 | } |