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