xref: /aosp_15_r20/external/llvm/lib/Target/Hexagon/HexagonInstrFormats.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker//==- HexagonInstrFormats.td - Hexagon Instruction Formats --*- tablegen -*-==//
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//===----------------------------------------------------------------------===//
11*9880d681SAndroid Build Coastguard Worker//                         Hexagon Instruction Flags +
12*9880d681SAndroid Build Coastguard Worker//
13*9880d681SAndroid Build Coastguard Worker//                    *** Must match HexagonBaseInfo.h ***
14*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Workerclass IType<bits<5> t> {
17*9880d681SAndroid Build Coastguard Worker  bits<5> Value = t;
18*9880d681SAndroid Build Coastguard Worker}
19*9880d681SAndroid Build Coastguard Workerdef TypePSEUDO : IType<0>;
20*9880d681SAndroid Build Coastguard Workerdef TypeALU32  : IType<1>;
21*9880d681SAndroid Build Coastguard Workerdef TypeCR     : IType<2>;
22*9880d681SAndroid Build Coastguard Workerdef TypeJR     : IType<3>;
23*9880d681SAndroid Build Coastguard Workerdef TypeJ      : IType<4>;
24*9880d681SAndroid Build Coastguard Workerdef TypeLD     : IType<5>;
25*9880d681SAndroid Build Coastguard Workerdef TypeST     : IType<6>;
26*9880d681SAndroid Build Coastguard Workerdef TypeSYSTEM : IType<7>;
27*9880d681SAndroid Build Coastguard Workerdef TypeXTYPE  : IType<8>;
28*9880d681SAndroid Build Coastguard Workerdef TypeENDLOOP: IType<31>;
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Worker// Maintain list of valid subtargets for each instruction.
31*9880d681SAndroid Build Coastguard Workerclass SubTarget<bits<6> value> {
32*9880d681SAndroid Build Coastguard Worker  bits<6> Value = value;
33*9880d681SAndroid Build Coastguard Worker}
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Workerdef HasAnySubT    : SubTarget<0x3f>;  // 111111
36*9880d681SAndroid Build Coastguard Workerdef HasV5SubT     : SubTarget<0x3e>;  // 111110
37*9880d681SAndroid Build Coastguard Workerdef HasV55SubT    : SubTarget<0x3c>;  // 111100
38*9880d681SAndroid Build Coastguard Workerdef HasV60SubT    : SubTarget<0x38>;  // 111000
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Worker// Addressing modes for load/store instructions
41*9880d681SAndroid Build Coastguard Workerclass AddrModeType<bits<3> value> {
42*9880d681SAndroid Build Coastguard Worker  bits<3> Value = value;
43*9880d681SAndroid Build Coastguard Worker}
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Workerdef NoAddrMode     : AddrModeType<0>;  // No addressing mode
46*9880d681SAndroid Build Coastguard Workerdef Absolute       : AddrModeType<1>;  // Absolute addressing mode
47*9880d681SAndroid Build Coastguard Workerdef AbsoluteSet    : AddrModeType<2>;  // Absolute set addressing mode
48*9880d681SAndroid Build Coastguard Workerdef BaseImmOffset  : AddrModeType<3>;  // Indirect with offset
49*9880d681SAndroid Build Coastguard Workerdef BaseLongOffset : AddrModeType<4>;  // Indirect with long offset
50*9880d681SAndroid Build Coastguard Workerdef BaseRegOffset  : AddrModeType<5>;  // Indirect with register offset
51*9880d681SAndroid Build Coastguard Workerdef PostInc        : AddrModeType<6>;  // Post increment addressing mode
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Workerclass MemAccessSize<bits<4> value> {
54*9880d681SAndroid Build Coastguard Worker  bits<4> Value = value;
55*9880d681SAndroid Build Coastguard Worker}
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Workerdef NoMemAccess      : MemAccessSize<0>;// Not a memory acces instruction.
58*9880d681SAndroid Build Coastguard Workerdef ByteAccess       : MemAccessSize<1>;// Byte access instruction (memb).
59*9880d681SAndroid Build Coastguard Workerdef HalfWordAccess   : MemAccessSize<2>;// Half word access instruction (memh).
60*9880d681SAndroid Build Coastguard Workerdef WordAccess       : MemAccessSize<3>;// Word access instruction (memw).
61*9880d681SAndroid Build Coastguard Workerdef DoubleWordAccess : MemAccessSize<4>;// Double word access instruction (memd)
62*9880d681SAndroid Build Coastguard Workerdef Vector64Access   : MemAccessSize<7>;// Vector access instruction (memv)
63*9880d681SAndroid Build Coastguard Workerdef Vector128Access  : MemAccessSize<8>;// Vector access instruction (memv)
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
67*9880d681SAndroid Build Coastguard Worker//                         Instruction Class Declaration +
68*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Workerclass OpcodeHexagon {
71*9880d681SAndroid Build Coastguard Worker  field bits<32> Inst = ?; // Default to an invalid insn.
72*9880d681SAndroid Build Coastguard Worker  bits<4> IClass = 0; // ICLASS
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Worker  let Inst{31-28} = IClass;
75*9880d681SAndroid Build Coastguard Worker
76*9880d681SAndroid Build Coastguard Worker  bits<1> zero = 0;
77*9880d681SAndroid Build Coastguard Worker}
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Workerclass InstHexagon<dag outs, dag ins, string asmstr, list<dag> pattern,
80*9880d681SAndroid Build Coastguard Worker                  string cstr, InstrItinClass itin, IType type>
81*9880d681SAndroid Build Coastguard Worker  : Instruction {
82*9880d681SAndroid Build Coastguard Worker  let Namespace = "Hexagon";
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = outs;
85*9880d681SAndroid Build Coastguard Worker  dag InOperandList = ins;
86*9880d681SAndroid Build Coastguard Worker  let AsmString = asmstr;
87*9880d681SAndroid Build Coastguard Worker  let Pattern = pattern;
88*9880d681SAndroid Build Coastguard Worker  let Constraints = cstr;
89*9880d681SAndroid Build Coastguard Worker  let Itinerary = itin;
90*9880d681SAndroid Build Coastguard Worker  let Size = 4;
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Worker  // SoftFail is a field the disassembler can use to provide a way for
93*9880d681SAndroid Build Coastguard Worker  // instructions to not match without killing the whole decode process. It is
94*9880d681SAndroid Build Coastguard Worker  // mainly used for ARM, but Tablegen expects this field to exist or it fails
95*9880d681SAndroid Build Coastguard Worker  // to build the decode table.
96*9880d681SAndroid Build Coastguard Worker  field bits<32> SoftFail = 0;
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Worker  // *** Must match MCTargetDesc/HexagonBaseInfo.h ***
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Worker  // Instruction type according to the ISA.
101*9880d681SAndroid Build Coastguard Worker  IType Type = type;
102*9880d681SAndroid Build Coastguard Worker  let TSFlags{4-0} = Type.Value;
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Worker  // Solo instructions, i.e., those that cannot be in a packet with others.
105*9880d681SAndroid Build Coastguard Worker  bits<1> isSolo = 0;
106*9880d681SAndroid Build Coastguard Worker  let TSFlags{5} = isSolo;
107*9880d681SAndroid Build Coastguard Worker  // Packed only with A or X-type instructions.
108*9880d681SAndroid Build Coastguard Worker  bits<1> isSoloAX = 0;
109*9880d681SAndroid Build Coastguard Worker  let TSFlags{6} = isSoloAX;
110*9880d681SAndroid Build Coastguard Worker  // Only A-type instruction in first slot or nothing.
111*9880d681SAndroid Build Coastguard Worker  bits<1> isSoloAin1 = 0;
112*9880d681SAndroid Build Coastguard Worker  let TSFlags{7} = isSoloAin1;
113*9880d681SAndroid Build Coastguard Worker
114*9880d681SAndroid Build Coastguard Worker  // Predicated instructions.
115*9880d681SAndroid Build Coastguard Worker  bits<1> isPredicated = 0;
116*9880d681SAndroid Build Coastguard Worker  let TSFlags{8} = isPredicated;
117*9880d681SAndroid Build Coastguard Worker  bits<1> isPredicatedFalse = 0;
118*9880d681SAndroid Build Coastguard Worker  let TSFlags{9} = isPredicatedFalse;
119*9880d681SAndroid Build Coastguard Worker  bits<1> isPredicatedNew = 0;
120*9880d681SAndroid Build Coastguard Worker  let TSFlags{10} = isPredicatedNew;
121*9880d681SAndroid Build Coastguard Worker  bits<1> isPredicateLate = 0;
122*9880d681SAndroid Build Coastguard Worker  let TSFlags{11} = isPredicateLate; // Late predicate producer insn.
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Worker  // New-value insn helper fields.
125*9880d681SAndroid Build Coastguard Worker  bits<1> isNewValue = 0;
126*9880d681SAndroid Build Coastguard Worker  let TSFlags{12} = isNewValue; // New-value consumer insn.
127*9880d681SAndroid Build Coastguard Worker  bits<1> hasNewValue = 0;
128*9880d681SAndroid Build Coastguard Worker  let TSFlags{13} = hasNewValue; // New-value producer insn.
129*9880d681SAndroid Build Coastguard Worker  bits<3> opNewValue = 0;
130*9880d681SAndroid Build Coastguard Worker  let TSFlags{16-14} = opNewValue; // New-value produced operand.
131*9880d681SAndroid Build Coastguard Worker  bits<1> isNVStorable = 0;
132*9880d681SAndroid Build Coastguard Worker  let TSFlags{17} = isNVStorable; // Store that can become new-value store.
133*9880d681SAndroid Build Coastguard Worker  bits<1> isNVStore = 0;
134*9880d681SAndroid Build Coastguard Worker  let TSFlags{18} = isNVStore; // New-value store insn.
135*9880d681SAndroid Build Coastguard Worker  bits<1> isCVLoadable = 0;
136*9880d681SAndroid Build Coastguard Worker  let TSFlags{19} = isCVLoadable; // Load that can become cur-value load.
137*9880d681SAndroid Build Coastguard Worker  bits<1> isCVLoad = 0;
138*9880d681SAndroid Build Coastguard Worker  let TSFlags{20} = isCVLoad; // Cur-value load insn.
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Worker  // Immediate extender helper fields.
141*9880d681SAndroid Build Coastguard Worker  bits<1> isExtendable = 0;
142*9880d681SAndroid Build Coastguard Worker  let TSFlags{21} = isExtendable; // Insn may be extended.
143*9880d681SAndroid Build Coastguard Worker  bits<1> isExtended = 0;
144*9880d681SAndroid Build Coastguard Worker  let TSFlags{22} = isExtended; // Insn must be extended.
145*9880d681SAndroid Build Coastguard Worker  bits<3> opExtendable = 0;
146*9880d681SAndroid Build Coastguard Worker  let TSFlags{25-23} = opExtendable; // Which operand may be extended.
147*9880d681SAndroid Build Coastguard Worker  bits<1> isExtentSigned = 0;
148*9880d681SAndroid Build Coastguard Worker  let TSFlags{26} = isExtentSigned; // Signed or unsigned range.
149*9880d681SAndroid Build Coastguard Worker  bits<5> opExtentBits = 0;
150*9880d681SAndroid Build Coastguard Worker  let TSFlags{31-27} = opExtentBits; //Number of bits of range before extending.
151*9880d681SAndroid Build Coastguard Worker  bits<2> opExtentAlign = 0;
152*9880d681SAndroid Build Coastguard Worker  let TSFlags{33-32} = opExtentAlign; // Alignment exponent before extending.
153*9880d681SAndroid Build Coastguard Worker
154*9880d681SAndroid Build Coastguard Worker  // If an instruction is valid on a subtarget, set the corresponding
155*9880d681SAndroid Build Coastguard Worker  // bit from validSubTargets.
156*9880d681SAndroid Build Coastguard Worker  // By default, instruction is valid on all subtargets.
157*9880d681SAndroid Build Coastguard Worker  SubTarget validSubTargets = HasAnySubT;
158*9880d681SAndroid Build Coastguard Worker  let TSFlags{39-34} = validSubTargets.Value;
159*9880d681SAndroid Build Coastguard Worker
160*9880d681SAndroid Build Coastguard Worker  // Addressing mode for load/store instructions.
161*9880d681SAndroid Build Coastguard Worker  AddrModeType addrMode = NoAddrMode;
162*9880d681SAndroid Build Coastguard Worker  let TSFlags{42-40} = addrMode.Value;
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Worker  // Memory access size for mem access instructions (load/store)
165*9880d681SAndroid Build Coastguard Worker  MemAccessSize accessSize = NoMemAccess;
166*9880d681SAndroid Build Coastguard Worker  let TSFlags{46-43} = accessSize.Value;
167*9880d681SAndroid Build Coastguard Worker
168*9880d681SAndroid Build Coastguard Worker  bits<1> isTaken = 0;
169*9880d681SAndroid Build Coastguard Worker  let TSFlags {47} = isTaken; // Branch prediction.
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Worker  bits<1> isFP = 0;
172*9880d681SAndroid Build Coastguard Worker  let TSFlags {48} = isFP; // Floating-point.
173*9880d681SAndroid Build Coastguard Worker
174*9880d681SAndroid Build Coastguard Worker  bits<1> hasNewValue2 = 0;
175*9880d681SAndroid Build Coastguard Worker  let TSFlags{50} = hasNewValue2; // Second New-value producer insn.
176*9880d681SAndroid Build Coastguard Worker  bits<3> opNewValue2 = 0;
177*9880d681SAndroid Build Coastguard Worker  let TSFlags{53-51} = opNewValue2; // Second New-value produced operand.
178*9880d681SAndroid Build Coastguard Worker
179*9880d681SAndroid Build Coastguard Worker  bits<1> isAccumulator = 0;
180*9880d681SAndroid Build Coastguard Worker  let TSFlags{54} = isAccumulator;
181*9880d681SAndroid Build Coastguard Worker
182*9880d681SAndroid Build Coastguard Worker  // Fields used for relation models.
183*9880d681SAndroid Build Coastguard Worker  bit isNonTemporal = 0;
184*9880d681SAndroid Build Coastguard Worker  string isNT = ""; // set to "true" for non-temporal vector stores.
185*9880d681SAndroid Build Coastguard Worker  string BaseOpcode = "";
186*9880d681SAndroid Build Coastguard Worker  string CextOpcode = "";
187*9880d681SAndroid Build Coastguard Worker  string PredSense = "";
188*9880d681SAndroid Build Coastguard Worker  string PNewValue = "";
189*9880d681SAndroid Build Coastguard Worker  string NValueST  = "";    // Set to "true" for new-value stores.
190*9880d681SAndroid Build Coastguard Worker  string InputType = "";    // Input is "imm" or "reg" type.
191*9880d681SAndroid Build Coastguard Worker  string isFloat = "false"; // Set to "true" for the floating-point load/store.
192*9880d681SAndroid Build Coastguard Worker  string isBrTaken = !if(isTaken, "true", "false"); // Set to "true"/"false" for jump instructions
193*9880d681SAndroid Build Coastguard Worker
194*9880d681SAndroid Build Coastguard Worker  let PredSense = !if(isPredicated, !if(isPredicatedFalse, "false", "true"),
195*9880d681SAndroid Build Coastguard Worker                                    "");
196*9880d681SAndroid Build Coastguard Worker  let PNewValue = !if(isPredicatedNew, "new", "");
197*9880d681SAndroid Build Coastguard Worker  let NValueST = !if(isNVStore, "true", "false");
198*9880d681SAndroid Build Coastguard Worker  let isNT = !if(isNonTemporal, "true", "false");
199*9880d681SAndroid Build Coastguard Worker
200*9880d681SAndroid Build Coastguard Worker  // *** Must match MCTargetDesc/HexagonBaseInfo.h ***
201*9880d681SAndroid Build Coastguard Worker}
202*9880d681SAndroid Build Coastguard Worker
203*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
204*9880d681SAndroid Build Coastguard Worker//                         Instruction Classes Definitions +
205*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
206*9880d681SAndroid Build Coastguard Worker
207*9880d681SAndroid Build Coastguard Worker// LD Instruction Class in V2/V3/V4.
208*9880d681SAndroid Build Coastguard Worker// Definition of the instruction class NOT CHANGED.
209*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1 in
210*9880d681SAndroid Build Coastguard Workerclass LDInst<dag outs, dag ins, string asmstr, list<dag> pattern = [],
211*9880d681SAndroid Build Coastguard Worker             string cstr = "", InstrItinClass itin = LD_tc_ld_SLOT01>
212*9880d681SAndroid Build Coastguard Worker  : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeLD>, OpcodeHexagon;
213*9880d681SAndroid Build Coastguard Worker
214*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1 in
215*9880d681SAndroid Build Coastguard Workerclass LDInst2<dag outs, dag ins, string asmstr, list<dag> pattern = [],
216*9880d681SAndroid Build Coastguard Worker              string cstr = "">
217*9880d681SAndroid Build Coastguard Worker  : LDInst<outs, ins, asmstr, pattern, cstr>;
218*9880d681SAndroid Build Coastguard Worker
219*9880d681SAndroid Build Coastguard Workerclass CONSTLDInst<dag outs, dag ins, string asmstr, list<dag> pattern = [],
220*9880d681SAndroid Build Coastguard Worker                  string cstr = "">
221*9880d681SAndroid Build Coastguard Worker  : LDInst<outs, ins, asmstr, pattern, cstr>;
222*9880d681SAndroid Build Coastguard Worker
223*9880d681SAndroid Build Coastguard Worker// LD Instruction Class in V2/V3/V4.
224*9880d681SAndroid Build Coastguard Worker// Definition of the instruction class NOT CHANGED.
225*9880d681SAndroid Build Coastguard Workerclass LDInstPost<dag outs, dag ins, string asmstr, list<dag> pattern = [],
226*9880d681SAndroid Build Coastguard Worker                 string cstr = "">
227*9880d681SAndroid Build Coastguard Worker  : LDInst<outs, ins, asmstr, pattern, cstr>;
228*9880d681SAndroid Build Coastguard Worker
229*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1 in
230*9880d681SAndroid Build Coastguard Workerclass LD0Inst<dag outs, dag ins, string asmstr, list<dag> pattern = [],
231*9880d681SAndroid Build Coastguard Worker              string cstr = "", InstrItinClass itin=LD_tc_ld_SLOT0>
232*9880d681SAndroid Build Coastguard Worker  : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeLD>, OpcodeHexagon;
233*9880d681SAndroid Build Coastguard Worker
234*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1 in
235*9880d681SAndroid Build Coastguard Workerclass LD1Inst<dag outs, dag ins, string asmstr, list<dag> pattern = [],
236*9880d681SAndroid Build Coastguard Worker              string cstr = "", InstrItinClass itin=LD_tc_ld_SLOT0>
237*9880d681SAndroid Build Coastguard Worker  : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeLD>;
238*9880d681SAndroid Build Coastguard Worker
239*9880d681SAndroid Build Coastguard Worker// ST Instruction Class in V2/V3 can take SLOT0 only.
240*9880d681SAndroid Build Coastguard Worker// ST Instruction Class in V4    can take SLOT0 & SLOT1.
241*9880d681SAndroid Build Coastguard Worker// Definition of the instruction class CHANGED from V2/V3 to V4.
242*9880d681SAndroid Build Coastguard Workerlet mayStore = 1 in
243*9880d681SAndroid Build Coastguard Workerclass STInst<dag outs, dag ins, string asmstr, list<dag> pattern = [],
244*9880d681SAndroid Build Coastguard Worker             string cstr = "", InstrItinClass itin = ST_tc_st_SLOT01>
245*9880d681SAndroid Build Coastguard Worker  : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeST>, OpcodeHexagon;
246*9880d681SAndroid Build Coastguard Worker
247*9880d681SAndroid Build Coastguard Workerclass STInst2<dag outs, dag ins, string asmstr, list<dag> pattern = [],
248*9880d681SAndroid Build Coastguard Worker              string cstr = "">
249*9880d681SAndroid Build Coastguard Worker  : STInst<outs, ins, asmstr, pattern, cstr>;
250*9880d681SAndroid Build Coastguard Worker
251*9880d681SAndroid Build Coastguard Workerlet mayStore = 1 in
252*9880d681SAndroid Build Coastguard Workerclass ST0Inst<dag outs, dag ins, string asmstr, list<dag> pattern = [],
253*9880d681SAndroid Build Coastguard Worker              string cstr = "", InstrItinClass itin = ST_tc_ld_SLOT0>
254*9880d681SAndroid Build Coastguard Worker  : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeST>, OpcodeHexagon;
255*9880d681SAndroid Build Coastguard Worker
256*9880d681SAndroid Build Coastguard Worker// Same as ST0Inst but doesn't derive from OpcodeHexagon.
257*9880d681SAndroid Build Coastguard Workerlet mayStore = 1 in
258*9880d681SAndroid Build Coastguard Workerclass ST1Inst<dag outs, dag ins, string asmstr, list<dag> pattern = [],
259*9880d681SAndroid Build Coastguard Worker              string cstr = "", InstrItinClass itin = ST_tc_st_SLOT0>
260*9880d681SAndroid Build Coastguard Worker  : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeST>;
261*9880d681SAndroid Build Coastguard Worker
262*9880d681SAndroid Build Coastguard Worker// ST Instruction Class in V2/V3 can take SLOT0 only.
263*9880d681SAndroid Build Coastguard Worker// ST Instruction Class in V4    can take SLOT0 & SLOT1.
264*9880d681SAndroid Build Coastguard Worker// Definition of the instruction class CHANGED from V2/V3 to V4.
265*9880d681SAndroid Build Coastguard Workerclass STInstPost<dag outs, dag ins, string asmstr, list<dag> pattern = [],
266*9880d681SAndroid Build Coastguard Worker                 string cstr = "", InstrItinClass itin = ST_tc_st_SLOT01>
267*9880d681SAndroid Build Coastguard Worker  : STInst<outs, ins, asmstr, pattern, cstr, itin>;
268*9880d681SAndroid Build Coastguard Worker
269*9880d681SAndroid Build Coastguard Worker// SYSTEM Instruction Class in V4 can take SLOT0 only
270*9880d681SAndroid Build Coastguard Worker// In V2/V3 we used ST for this but in v4 ST can take SLOT0 or SLOT1.
271*9880d681SAndroid Build Coastguard Workerclass SYSInst<dag outs, dag ins, string asmstr, list<dag> pattern = [],
272*9880d681SAndroid Build Coastguard Worker              string cstr = "",  InstrItinClass itin = ST_tc_3stall_SLOT0>
273*9880d681SAndroid Build Coastguard Worker  : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeSYSTEM>,
274*9880d681SAndroid Build Coastguard Worker    OpcodeHexagon;
275*9880d681SAndroid Build Coastguard Worker
276*9880d681SAndroid Build Coastguard Worker// ALU32 Instruction Class in V2/V3/V4.
277*9880d681SAndroid Build Coastguard Worker// Definition of the instruction class NOT CHANGED.
278*9880d681SAndroid Build Coastguard Workerclass ALU32Inst<dag outs, dag ins, string asmstr, list<dag> pattern = [],
279*9880d681SAndroid Build Coastguard Worker                string cstr = "", InstrItinClass itin = ALU32_2op_tc_1_SLOT0123>
280*9880d681SAndroid Build Coastguard Worker : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeALU32>, OpcodeHexagon;
281*9880d681SAndroid Build Coastguard Worker
282*9880d681SAndroid Build Coastguard Worker// ALU64 Instruction Class in V2/V3.
283*9880d681SAndroid Build Coastguard Worker// XTYPE Instruction Class in V4.
284*9880d681SAndroid Build Coastguard Worker// Definition of the instruction class NOT CHANGED.
285*9880d681SAndroid Build Coastguard Worker// Name of the Instruction Class changed from ALU64 to XTYPE from V2/V3 to V4.
286*9880d681SAndroid Build Coastguard Workerclass ALU64Inst<dag outs, dag ins, string asmstr, list<dag> pattern = [],
287*9880d681SAndroid Build Coastguard Worker                string cstr = "", InstrItinClass itin = ALU64_tc_2_SLOT23>
288*9880d681SAndroid Build Coastguard Worker   : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeXTYPE>,
289*9880d681SAndroid Build Coastguard Worker     OpcodeHexagon;
290*9880d681SAndroid Build Coastguard Worker
291*9880d681SAndroid Build Coastguard Workerclass ALU64_acc<dag outs, dag ins, string asmstr, list<dag> pattern = [],
292*9880d681SAndroid Build Coastguard Worker                string cstr = "", InstrItinClass itin = ALU64_tc_2_SLOT23>
293*9880d681SAndroid Build Coastguard Worker  : ALU64Inst<outs, ins, asmstr, pattern, cstr, itin>;
294*9880d681SAndroid Build Coastguard Worker
295*9880d681SAndroid Build Coastguard Worker
296*9880d681SAndroid Build Coastguard Worker// M Instruction Class in V2/V3.
297*9880d681SAndroid Build Coastguard Worker// XTYPE Instruction Class in V4.
298*9880d681SAndroid Build Coastguard Worker// Definition of the instruction class NOT CHANGED.
299*9880d681SAndroid Build Coastguard Worker// Name of the Instruction Class changed from M to XTYPE from V2/V3 to V4.
300*9880d681SAndroid Build Coastguard Workerclass MInst<dag outs, dag ins, string asmstr, list<dag> pattern = [],
301*9880d681SAndroid Build Coastguard Worker            string cstr = "", InstrItinClass itin = M_tc_3x_SLOT23>
302*9880d681SAndroid Build Coastguard Worker  : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeXTYPE>,
303*9880d681SAndroid Build Coastguard Worker    OpcodeHexagon;
304*9880d681SAndroid Build Coastguard Worker
305*9880d681SAndroid Build Coastguard Worker// Same as above but doesn't derive from OpcodeHexagon
306*9880d681SAndroid Build Coastguard Workerclass MInst2<dag outs, dag ins, string asmstr, list<dag> pattern = [],
307*9880d681SAndroid Build Coastguard Worker            string cstr = "", InstrItinClass itin = M_tc_3x_SLOT23>
308*9880d681SAndroid Build Coastguard Worker  : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeXTYPE>;
309*9880d681SAndroid Build Coastguard Worker
310*9880d681SAndroid Build Coastguard Worker// M Instruction Class in V2/V3.
311*9880d681SAndroid Build Coastguard Worker// XTYPE Instruction Class in V4.
312*9880d681SAndroid Build Coastguard Worker// Definition of the instruction class NOT CHANGED.
313*9880d681SAndroid Build Coastguard Worker// Name of the Instruction Class changed from M to XTYPE from V2/V3 to V4.
314*9880d681SAndroid Build Coastguard Workerclass MInst_acc<dag outs, dag ins, string asmstr, list<dag> pattern = [],
315*9880d681SAndroid Build Coastguard Worker                string cstr = "", InstrItinClass itin = M_tc_2_SLOT23>
316*9880d681SAndroid Build Coastguard Worker    : MInst<outs, ins, asmstr, pattern, cstr, itin>;
317*9880d681SAndroid Build Coastguard Worker
318*9880d681SAndroid Build Coastguard Worker// S Instruction Class in V2/V3.
319*9880d681SAndroid Build Coastguard Worker// XTYPE Instruction Class in V4.
320*9880d681SAndroid Build Coastguard Worker// Definition of the instruction class NOT CHANGED.
321*9880d681SAndroid Build Coastguard Worker// Name of the Instruction Class changed from S to XTYPE from V2/V3 to V4.
322*9880d681SAndroid Build Coastguard Workerclass SInst<dag outs, dag ins, string asmstr, list<dag> pattern = [],
323*9880d681SAndroid Build Coastguard Worker            string cstr = "", InstrItinClass itin = S_2op_tc_1_SLOT23>
324*9880d681SAndroid Build Coastguard Worker  : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeXTYPE>,
325*9880d681SAndroid Build Coastguard Worker    OpcodeHexagon;
326*9880d681SAndroid Build Coastguard Worker
327*9880d681SAndroid Build Coastguard Workerclass SInst2<dag outs, dag ins, string asmstr, list<dag> pattern = [],
328*9880d681SAndroid Build Coastguard Worker            string cstr = "", InstrItinClass itin = S_2op_tc_1_SLOT23>
329*9880d681SAndroid Build Coastguard Worker  : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeXTYPE>;
330*9880d681SAndroid Build Coastguard Worker
331*9880d681SAndroid Build Coastguard Worker// S Instruction Class in V2/V3.
332*9880d681SAndroid Build Coastguard Worker// XTYPE Instruction Class in V4.
333*9880d681SAndroid Build Coastguard Worker// Definition of the instruction class NOT CHANGED.
334*9880d681SAndroid Build Coastguard Worker// Name of the Instruction Class changed from S to XTYPE from V2/V3 to V4.
335*9880d681SAndroid Build Coastguard Workerclass SInst_acc<dag outs, dag ins, string asmstr, list<dag> pattern = [],
336*9880d681SAndroid Build Coastguard Worker                string cstr = "", InstrItinClass itin = S_3op_tc_1_SLOT23>
337*9880d681SAndroid Build Coastguard Worker  : SInst<outs, ins, asmstr, pattern, cstr, itin>;
338*9880d681SAndroid Build Coastguard Worker
339*9880d681SAndroid Build Coastguard Worker// J Instruction Class in V2/V3/V4.
340*9880d681SAndroid Build Coastguard Worker// Definition of the instruction class NOT CHANGED.
341*9880d681SAndroid Build Coastguard Workerclass JInst<dag outs, dag ins, string asmstr, list<dag> pattern = [],
342*9880d681SAndroid Build Coastguard Worker            string cstr = "", InstrItinClass itin = J_tc_2early_SLOT23>
343*9880d681SAndroid Build Coastguard Worker  : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeJ>, OpcodeHexagon;
344*9880d681SAndroid Build Coastguard Worker
345*9880d681SAndroid Build Coastguard Worker// JR Instruction Class in V2/V3/V4.
346*9880d681SAndroid Build Coastguard Worker// Definition of the instruction class NOT CHANGED.
347*9880d681SAndroid Build Coastguard Workerclass JRInst<dag outs, dag ins, string asmstr, list<dag> pattern = [],
348*9880d681SAndroid Build Coastguard Worker             string cstr = "", InstrItinClass itin = J_tc_2early_SLOT2>
349*9880d681SAndroid Build Coastguard Worker  : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeJR>, OpcodeHexagon;
350*9880d681SAndroid Build Coastguard Worker
351*9880d681SAndroid Build Coastguard Worker// CR Instruction Class in V2/V3/V4.
352*9880d681SAndroid Build Coastguard Worker// Definition of the instruction class NOT CHANGED.
353*9880d681SAndroid Build Coastguard Workerclass CRInst<dag outs, dag ins, string asmstr, list<dag> pattern = [],
354*9880d681SAndroid Build Coastguard Worker             string cstr = "", InstrItinClass itin = CR_tc_2early_SLOT3>
355*9880d681SAndroid Build Coastguard Worker  : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeCR>, OpcodeHexagon;
356*9880d681SAndroid Build Coastguard Worker
357*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, isPseudo = 1 in
358*9880d681SAndroid Build Coastguard Workerclass Endloop<dag outs, dag ins, string asmstr, list<dag> pattern = [],
359*9880d681SAndroid Build Coastguard Worker              string cstr = "", InstrItinClass itin = J_tc_2early_SLOT0123>
360*9880d681SAndroid Build Coastguard Worker  : InstHexagon<outs, ins, asmstr, pattern, cstr, itin, TypeENDLOOP>,
361*9880d681SAndroid Build Coastguard Worker    OpcodeHexagon;
362*9880d681SAndroid Build Coastguard Worker
363*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, isPseudo = 1 in
364*9880d681SAndroid Build Coastguard Workerclass Pseudo<dag outs, dag ins, string asmstr, list<dag> pattern = [],
365*9880d681SAndroid Build Coastguard Worker             string cstr = "">
366*9880d681SAndroid Build Coastguard Worker  : InstHexagon<outs, ins, asmstr, pattern, cstr, PSEUDO, TypePSEUDO>,
367*9880d681SAndroid Build Coastguard Worker    OpcodeHexagon;
368*9880d681SAndroid Build Coastguard Worker
369*9880d681SAndroid Build Coastguard Workerlet isCodeGenOnly = 1, isPseudo = 1 in
370*9880d681SAndroid Build Coastguard Workerclass PseudoM<dag outs, dag ins, string asmstr, list<dag> pattern = [],
371*9880d681SAndroid Build Coastguard Worker              string cstr="">
372*9880d681SAndroid Build Coastguard Worker  : InstHexagon<outs, ins, asmstr, pattern, cstr, PSEUDOM, TypePSEUDO>,
373*9880d681SAndroid Build Coastguard Worker    OpcodeHexagon;
374*9880d681SAndroid Build Coastguard Worker
375*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
376*9880d681SAndroid Build Coastguard Worker//                         Instruction Classes Definitions -
377*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
378*9880d681SAndroid Build Coastguard Worker
379*9880d681SAndroid Build Coastguard Worker
380*9880d681SAndroid Build Coastguard Worker//
381*9880d681SAndroid Build Coastguard Worker// ALU32 patterns
382*9880d681SAndroid Build Coastguard Worker//.
383*9880d681SAndroid Build Coastguard Workerclass ALU32_rr<dag outs, dag ins, string asmstr, list<dag> pattern = [],
384*9880d681SAndroid Build Coastguard Worker               string cstr = "", InstrItinClass itin = ALU32_2op_tc_1_SLOT0123>
385*9880d681SAndroid Build Coastguard Worker   : ALU32Inst<outs, ins, asmstr, pattern, cstr, itin>;
386*9880d681SAndroid Build Coastguard Worker
387*9880d681SAndroid Build Coastguard Workerclass ALU32_ir<dag outs, dag ins, string asmstr, list<dag> pattern = [],
388*9880d681SAndroid Build Coastguard Worker               string cstr = "", InstrItinClass itin = ALU32_2op_tc_1_SLOT0123>
389*9880d681SAndroid Build Coastguard Worker   : ALU32Inst<outs, ins, asmstr, pattern, cstr, itin>;
390*9880d681SAndroid Build Coastguard Worker
391*9880d681SAndroid Build Coastguard Workerclass ALU32_ri<dag outs, dag ins, string asmstr, list<dag> pattern = [],
392*9880d681SAndroid Build Coastguard Worker               string cstr = "", InstrItinClass itin = ALU32_2op_tc_1_SLOT0123>
393*9880d681SAndroid Build Coastguard Worker   : ALU32Inst<outs, ins, asmstr, pattern, cstr, itin>;
394*9880d681SAndroid Build Coastguard Worker
395*9880d681SAndroid Build Coastguard Workerclass ALU32_ii<dag outs, dag ins, string asmstr, list<dag> pattern = [],
396*9880d681SAndroid Build Coastguard Worker               string cstr = "", InstrItinClass itin = ALU32_2op_tc_1_SLOT0123>
397*9880d681SAndroid Build Coastguard Worker   : ALU32Inst<outs, ins, asmstr, pattern, cstr, itin>;
398*9880d681SAndroid Build Coastguard Worker
399*9880d681SAndroid Build Coastguard Worker//
400*9880d681SAndroid Build Coastguard Worker// ALU64 patterns.
401*9880d681SAndroid Build Coastguard Worker//
402*9880d681SAndroid Build Coastguard Workerclass ALU64_rr<dag outs, dag ins, string asmstr, list<dag> pattern = [],
403*9880d681SAndroid Build Coastguard Worker               string cstr = "", InstrItinClass itin = ALU64_tc_1_SLOT23>
404*9880d681SAndroid Build Coastguard Worker   : ALU64Inst<outs, ins, asmstr, pattern, cstr, itin>;
405*9880d681SAndroid Build Coastguard Worker
406*9880d681SAndroid Build Coastguard Workerclass ALU64_ri<dag outs, dag ins, string asmstr, list<dag> pattern = [],
407*9880d681SAndroid Build Coastguard Worker               string cstr = "", InstrItinClass itin = ALU64_tc_1_SLOT23>
408*9880d681SAndroid Build Coastguard Worker   : ALU64Inst<outs, ins, asmstr, pattern, cstr, itin>;
409*9880d681SAndroid Build Coastguard Worker
410*9880d681SAndroid Build Coastguard Worker// Post increment ST Instruction.
411*9880d681SAndroid Build Coastguard Workerclass STInstPI<dag outs, dag ins, string asmstr, list<dag> pattern = [],
412*9880d681SAndroid Build Coastguard Worker               string cstr = "">
413*9880d681SAndroid Build Coastguard Worker  : STInst<outs, ins, asmstr, pattern, cstr>;
414*9880d681SAndroid Build Coastguard Worker
415*9880d681SAndroid Build Coastguard Workerlet mayStore = 1 in
416*9880d681SAndroid Build Coastguard Workerclass STInst2PI<dag outs, dag ins, string asmstr, list<dag> pattern = [],
417*9880d681SAndroid Build Coastguard Worker                string cstr = "">
418*9880d681SAndroid Build Coastguard Worker  : STInst<outs, ins, asmstr, pattern, cstr>;
419*9880d681SAndroid Build Coastguard Worker
420*9880d681SAndroid Build Coastguard Worker// Post increment LD Instruction.
421*9880d681SAndroid Build Coastguard Workerclass LDInstPI<dag outs, dag ins, string asmstr, list<dag> pattern = [],
422*9880d681SAndroid Build Coastguard Worker               string cstr = "">
423*9880d681SAndroid Build Coastguard Worker  : LDInst<outs, ins, asmstr, pattern, cstr>;
424*9880d681SAndroid Build Coastguard Worker
425*9880d681SAndroid Build Coastguard Workerlet mayLoad = 1 in
426*9880d681SAndroid Build Coastguard Workerclass LDInst2PI<dag outs, dag ins, string asmstr, list<dag> pattern = [],
427*9880d681SAndroid Build Coastguard Worker                string cstr = "">
428*9880d681SAndroid Build Coastguard Worker  : LDInst<outs, ins, asmstr, pattern, cstr>;
429*9880d681SAndroid Build Coastguard Worker
430*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
431*9880d681SAndroid Build Coastguard Worker// V4 Instruction Format Definitions +
432*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
433*9880d681SAndroid Build Coastguard Worker
434*9880d681SAndroid Build Coastguard Workerinclude "HexagonInstrFormatsV4.td"
435*9880d681SAndroid Build Coastguard Worker
436*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
437*9880d681SAndroid Build Coastguard Worker// V4 Instruction Format Definitions +
438*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
439*9880d681SAndroid Build Coastguard Worker
440*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
441*9880d681SAndroid Build Coastguard Worker// V60 Instruction Format Definitions +
442*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
443*9880d681SAndroid Build Coastguard Worker
444*9880d681SAndroid Build Coastguard Workerinclude "HexagonInstrFormatsV60.td"
445*9880d681SAndroid Build Coastguard Worker
446*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
447*9880d681SAndroid Build Coastguard Worker// V60 Instruction Format Definitions +
448*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
449