xref: /aosp_15_r20/external/llvm/lib/Target/Sparc/SparcInstrFormats.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker//===-- SparcInstrFormats.td - Sparc 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 Workerclass InstSP<dag outs, dag ins, string asmstr, list<dag> pattern,
11*9880d681SAndroid Build Coastguard Worker             InstrItinClass itin = NoItinerary>
12*9880d681SAndroid Build Coastguard Worker   : Instruction {
13*9880d681SAndroid Build Coastguard Worker  field bits<32> Inst;
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Worker  let Namespace = "SP";
16*9880d681SAndroid Build Coastguard Worker  let Size = 4;
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Worker  bits<2> op;
19*9880d681SAndroid Build Coastguard Worker  let Inst{31-30} = op;               // Top two bits are the 'op' field
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = outs;
22*9880d681SAndroid Build Coastguard Worker  dag InOperandList = ins;
23*9880d681SAndroid Build Coastguard Worker  let AsmString   = asmstr;
24*9880d681SAndroid Build Coastguard Worker  let Pattern = pattern;
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Worker  let DecoderNamespace = "Sparc";
27*9880d681SAndroid Build Coastguard Worker  field bits<32> SoftFail = 0;
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Worker  let Itinerary = itin;
30*9880d681SAndroid Build Coastguard Worker}
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
33*9880d681SAndroid Build Coastguard Worker// Format #2 instruction classes in the Sparc
34*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Worker// Format 2 instructions
37*9880d681SAndroid Build Coastguard Workerclass F2<dag outs, dag ins, string asmstr, list<dag> pattern,
38*9880d681SAndroid Build Coastguard Worker         InstrItinClass itin = NoItinerary>
39*9880d681SAndroid Build Coastguard Worker   : InstSP<outs, ins, asmstr, pattern, itin> {
40*9880d681SAndroid Build Coastguard Worker  bits<3>  op2;
41*9880d681SAndroid Build Coastguard Worker  bits<22> imm22;
42*9880d681SAndroid Build Coastguard Worker  let op          = 0;    // op = 0
43*9880d681SAndroid Build Coastguard Worker  let Inst{24-22} = op2;
44*9880d681SAndroid Build Coastguard Worker  let Inst{21-0}  = imm22;
45*9880d681SAndroid Build Coastguard Worker}
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Worker// Specific F2 classes: SparcV8 manual, page 44
48*9880d681SAndroid Build Coastguard Worker//
49*9880d681SAndroid Build Coastguard Workerclass F2_1<bits<3> op2Val, dag outs, dag ins, string asmstr, list<dag> pattern,
50*9880d681SAndroid Build Coastguard Worker           InstrItinClass itin = NoItinerary>
51*9880d681SAndroid Build Coastguard Worker   : F2<outs, ins, asmstr, pattern, itin> {
52*9880d681SAndroid Build Coastguard Worker  bits<5>  rd;
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Worker  let op2         = op2Val;
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Worker  let Inst{29-25} = rd;
57*9880d681SAndroid Build Coastguard Worker}
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Workerclass F2_2<bits<3> op2Val, bit annul, dag outs, dag ins, string asmstr,
60*9880d681SAndroid Build Coastguard Worker           list<dag> pattern, InstrItinClass itin = NoItinerary>
61*9880d681SAndroid Build Coastguard Worker   : F2<outs, ins, asmstr, pattern, itin> {
62*9880d681SAndroid Build Coastguard Worker  bits<4>   cond;
63*9880d681SAndroid Build Coastguard Worker  let op2         = op2Val;
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Worker  let Inst{29}    = annul;
66*9880d681SAndroid Build Coastguard Worker  let Inst{28-25} = cond;
67*9880d681SAndroid Build Coastguard Worker}
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Workerclass F2_3<bits<3> op2Val, bit annul, bit pred,
70*9880d681SAndroid Build Coastguard Worker           dag outs, dag ins, string asmstr, list<dag> pattern,
71*9880d681SAndroid Build Coastguard Worker           InstrItinClass itin = NoItinerary>
72*9880d681SAndroid Build Coastguard Worker   : InstSP<outs, ins, asmstr, pattern, itin> {
73*9880d681SAndroid Build Coastguard Worker  bits<2>  cc;
74*9880d681SAndroid Build Coastguard Worker  bits<4>  cond;
75*9880d681SAndroid Build Coastguard Worker  bits<19> imm19;
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Worker  let op          = 0;    // op = 0
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Worker  let Inst{29}    = annul;
80*9880d681SAndroid Build Coastguard Worker  let Inst{28-25} = cond;
81*9880d681SAndroid Build Coastguard Worker  let Inst{24-22} = op2Val;
82*9880d681SAndroid Build Coastguard Worker  let Inst{21-20} = cc;
83*9880d681SAndroid Build Coastguard Worker  let Inst{19}    = pred;
84*9880d681SAndroid Build Coastguard Worker  let Inst{18-0}  = imm19;
85*9880d681SAndroid Build Coastguard Worker}
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Workerclass F2_4<bits<3> cond, bit annul, bit pred, dag outs, dag ins,
88*9880d681SAndroid Build Coastguard Worker           string asmstr, list<dag> pattern, InstrItinClass itin = NoItinerary>
89*9880d681SAndroid Build Coastguard Worker   : InstSP<outs, ins, asmstr, pattern, itin> {
90*9880d681SAndroid Build Coastguard Worker  bits<16> imm16;
91*9880d681SAndroid Build Coastguard Worker  bits<5>  rs1;
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Worker  let op          = 0;    // op = 0
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Worker  let Inst{29}    = annul;
96*9880d681SAndroid Build Coastguard Worker  let Inst{28}    = 0;
97*9880d681SAndroid Build Coastguard Worker  let Inst{27-25} = cond;
98*9880d681SAndroid Build Coastguard Worker  let Inst{24-22} = 0b011;
99*9880d681SAndroid Build Coastguard Worker  let Inst{21-20} = imm16{15-14};
100*9880d681SAndroid Build Coastguard Worker  let Inst{19}    = pred;
101*9880d681SAndroid Build Coastguard Worker  let Inst{18-14} = rs1;
102*9880d681SAndroid Build Coastguard Worker  let Inst{13-0}  = imm16{13-0};
103*9880d681SAndroid Build Coastguard Worker}
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
107*9880d681SAndroid Build Coastguard Worker// Format #3 instruction classes in the Sparc
108*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Workerclass F3<dag outs, dag ins, string asmstr, list<dag> pattern,
111*9880d681SAndroid Build Coastguard Worker         InstrItinClass itin = NoItinerary>
112*9880d681SAndroid Build Coastguard Worker   : InstSP<outs, ins, asmstr, pattern, itin> {
113*9880d681SAndroid Build Coastguard Worker  bits<5> rd;
114*9880d681SAndroid Build Coastguard Worker  bits<6> op3;
115*9880d681SAndroid Build Coastguard Worker  bits<5> rs1;
116*9880d681SAndroid Build Coastguard Worker  let op{1} = 1;   // Op = 2 or 3
117*9880d681SAndroid Build Coastguard Worker  let Inst{29-25} = rd;
118*9880d681SAndroid Build Coastguard Worker  let Inst{24-19} = op3;
119*9880d681SAndroid Build Coastguard Worker  let Inst{18-14} = rs1;
120*9880d681SAndroid Build Coastguard Worker}
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Worker// Specific F3 classes: SparcV8 manual, page 44
123*9880d681SAndroid Build Coastguard Worker//
124*9880d681SAndroid Build Coastguard Workerclass F3_1_asi<bits<2> opVal, bits<6> op3val, dag outs, dag ins,
125*9880d681SAndroid Build Coastguard Worker           string asmstr, list<dag> pattern, InstrItinClass itin = NoItinerary>
126*9880d681SAndroid Build Coastguard Worker   : F3<outs, ins, asmstr, pattern, itin> {
127*9880d681SAndroid Build Coastguard Worker  bits<8> asi;
128*9880d681SAndroid Build Coastguard Worker  bits<5> rs2;
129*9880d681SAndroid Build Coastguard Worker
130*9880d681SAndroid Build Coastguard Worker  let op         = opVal;
131*9880d681SAndroid Build Coastguard Worker  let op3        = op3val;
132*9880d681SAndroid Build Coastguard Worker
133*9880d681SAndroid Build Coastguard Worker  let Inst{13}   = 0;     // i field = 0
134*9880d681SAndroid Build Coastguard Worker  let Inst{12-5} = asi;   // address space identifier
135*9880d681SAndroid Build Coastguard Worker  let Inst{4-0}  = rs2;
136*9880d681SAndroid Build Coastguard Worker}
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Workerclass F3_1<bits<2> opVal, bits<6> op3val, dag outs, dag ins, string asmstr,
139*9880d681SAndroid Build Coastguard Worker       list<dag> pattern, InstrItinClass itin = IIC_iu_instr>
140*9880d681SAndroid Build Coastguard Worker  : F3_1_asi<opVal, op3val, outs, ins, asmstr, pattern, itin> {
141*9880d681SAndroid Build Coastguard Worker  let asi = 0;
142*9880d681SAndroid Build Coastguard Worker}
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Workerclass F3_2<bits<2> opVal, bits<6> op3val, dag outs, dag ins,
145*9880d681SAndroid Build Coastguard Worker           string asmstr, list<dag> pattern, InstrItinClass itin = IIC_iu_instr>
146*9880d681SAndroid Build Coastguard Worker   : F3<outs, ins, asmstr, pattern, itin> {
147*9880d681SAndroid Build Coastguard Worker  bits<13> simm13;
148*9880d681SAndroid Build Coastguard Worker
149*9880d681SAndroid Build Coastguard Worker  let op         = opVal;
150*9880d681SAndroid Build Coastguard Worker  let op3        = op3val;
151*9880d681SAndroid Build Coastguard Worker
152*9880d681SAndroid Build Coastguard Worker  let Inst{13}   = 1;     // i field = 1
153*9880d681SAndroid Build Coastguard Worker  let Inst{12-0} = simm13;
154*9880d681SAndroid Build Coastguard Worker}
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Worker// floating-point
157*9880d681SAndroid Build Coastguard Workerclass F3_3<bits<2> opVal, bits<6> op3val, bits<9> opfval, dag outs, dag ins,
158*9880d681SAndroid Build Coastguard Worker           string asmstr, list<dag> pattern, InstrItinClass itin = NoItinerary>
159*9880d681SAndroid Build Coastguard Worker   : F3<outs, ins, asmstr, pattern, itin> {
160*9880d681SAndroid Build Coastguard Worker  bits<5> rs2;
161*9880d681SAndroid Build Coastguard Worker
162*9880d681SAndroid Build Coastguard Worker  let op         = opVal;
163*9880d681SAndroid Build Coastguard Worker  let op3        = op3val;
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Worker  let Inst{13-5} = opfval;   // fp opcode
166*9880d681SAndroid Build Coastguard Worker  let Inst{4-0}  = rs2;
167*9880d681SAndroid Build Coastguard Worker}
168*9880d681SAndroid Build Coastguard Worker
169*9880d681SAndroid Build Coastguard Worker// floating-point unary operations.
170*9880d681SAndroid Build Coastguard Workerclass F3_3u<bits<2> opVal, bits<6> op3val, bits<9> opfval, dag outs, dag ins,
171*9880d681SAndroid Build Coastguard Worker           string asmstr, list<dag> pattern, InstrItinClass itin = NoItinerary>
172*9880d681SAndroid Build Coastguard Worker   : F3<outs, ins, asmstr, pattern, itin> {
173*9880d681SAndroid Build Coastguard Worker  bits<5> rs2;
174*9880d681SAndroid Build Coastguard Worker
175*9880d681SAndroid Build Coastguard Worker  let op         = opVal;
176*9880d681SAndroid Build Coastguard Worker  let op3        = op3val;
177*9880d681SAndroid Build Coastguard Worker  let rs1        = 0;
178*9880d681SAndroid Build Coastguard Worker
179*9880d681SAndroid Build Coastguard Worker  let Inst{13-5} = opfval;   // fp opcode
180*9880d681SAndroid Build Coastguard Worker  let Inst{4-0}  = rs2;
181*9880d681SAndroid Build Coastguard Worker}
182*9880d681SAndroid Build Coastguard Worker
183*9880d681SAndroid Build Coastguard Worker// floating-point compares.
184*9880d681SAndroid Build Coastguard Workerclass F3_3c<bits<2> opVal, bits<6> op3val, bits<9> opfval, dag outs, dag ins,
185*9880d681SAndroid Build Coastguard Worker           string asmstr, list<dag> pattern, InstrItinClass itin = NoItinerary>
186*9880d681SAndroid Build Coastguard Worker   : F3<outs, ins, asmstr, pattern, itin> {
187*9880d681SAndroid Build Coastguard Worker  bits<5> rs2;
188*9880d681SAndroid Build Coastguard Worker
189*9880d681SAndroid Build Coastguard Worker  let op         = opVal;
190*9880d681SAndroid Build Coastguard Worker  let op3        = op3val;
191*9880d681SAndroid Build Coastguard Worker
192*9880d681SAndroid Build Coastguard Worker  let Inst{13-5} = opfval;   // fp opcode
193*9880d681SAndroid Build Coastguard Worker  let Inst{4-0}  = rs2;
194*9880d681SAndroid Build Coastguard Worker}
195*9880d681SAndroid Build Coastguard Worker
196*9880d681SAndroid Build Coastguard Worker// Shift by register rs2.
197*9880d681SAndroid Build Coastguard Workerclass F3_Sr<bits<2> opVal, bits<6> op3val, bit xVal, dag outs, dag ins,
198*9880d681SAndroid Build Coastguard Worker            string asmstr, list<dag> pattern, InstrItinClass itin = IIC_iu_instr>
199*9880d681SAndroid Build Coastguard Worker   : F3<outs, ins, asmstr, pattern, itin> {
200*9880d681SAndroid Build Coastguard Worker  bit x = xVal;           // 1 for 64-bit shifts.
201*9880d681SAndroid Build Coastguard Worker  bits<5> rs2;
202*9880d681SAndroid Build Coastguard Worker
203*9880d681SAndroid Build Coastguard Worker  let op         = opVal;
204*9880d681SAndroid Build Coastguard Worker  let op3        = op3val;
205*9880d681SAndroid Build Coastguard Worker
206*9880d681SAndroid Build Coastguard Worker  let Inst{13}   = 0;     // i field = 0
207*9880d681SAndroid Build Coastguard Worker  let Inst{12}   = x;     // extended registers.
208*9880d681SAndroid Build Coastguard Worker  let Inst{4-0}  = rs2;
209*9880d681SAndroid Build Coastguard Worker}
210*9880d681SAndroid Build Coastguard Worker
211*9880d681SAndroid Build Coastguard Worker// Shift by immediate.
212*9880d681SAndroid Build Coastguard Workerclass F3_Si<bits<2> opVal, bits<6> op3val, bit xVal, dag outs, dag ins,
213*9880d681SAndroid Build Coastguard Worker            string asmstr, list<dag> pattern, InstrItinClass itin = IIC_iu_instr>
214*9880d681SAndroid Build Coastguard Worker   : F3<outs, ins, asmstr, pattern, itin> {
215*9880d681SAndroid Build Coastguard Worker  bit x = xVal;           // 1 for 64-bit shifts.
216*9880d681SAndroid Build Coastguard Worker  bits<6> shcnt;          // shcnt32 / shcnt64.
217*9880d681SAndroid Build Coastguard Worker
218*9880d681SAndroid Build Coastguard Worker  let op         = opVal;
219*9880d681SAndroid Build Coastguard Worker  let op3        = op3val;
220*9880d681SAndroid Build Coastguard Worker
221*9880d681SAndroid Build Coastguard Worker  let Inst{13}   = 1;     // i field = 1
222*9880d681SAndroid Build Coastguard Worker  let Inst{12}   = x;     // extended registers.
223*9880d681SAndroid Build Coastguard Worker  let Inst{5-0}  = shcnt;
224*9880d681SAndroid Build Coastguard Worker}
225*9880d681SAndroid Build Coastguard Worker
226*9880d681SAndroid Build Coastguard Worker// Define rr and ri shift instructions with patterns.
227*9880d681SAndroid Build Coastguard Workermulticlass F3_S<string OpcStr, bits<6> Op3Val, bit XVal, SDNode OpNode,
228*9880d681SAndroid Build Coastguard Worker                ValueType VT, RegisterClass RC,
229*9880d681SAndroid Build Coastguard Worker                InstrItinClass itin = IIC_iu_instr> {
230*9880d681SAndroid Build Coastguard Worker  def rr : F3_Sr<2, Op3Val, XVal, (outs RC:$rd), (ins RC:$rs1, IntRegs:$rs2),
231*9880d681SAndroid Build Coastguard Worker                 !strconcat(OpcStr, " $rs1, $rs2, $rd"),
232*9880d681SAndroid Build Coastguard Worker                 [(set VT:$rd, (OpNode VT:$rs1, i32:$rs2))],
233*9880d681SAndroid Build Coastguard Worker                 itin>;
234*9880d681SAndroid Build Coastguard Worker  def ri : F3_Si<2, Op3Val, XVal, (outs RC:$rd), (ins RC:$rs1, i32imm:$shcnt),
235*9880d681SAndroid Build Coastguard Worker                 !strconcat(OpcStr, " $rs1, $shcnt, $rd"),
236*9880d681SAndroid Build Coastguard Worker                 [(set VT:$rd, (OpNode VT:$rs1, (i32 imm:$shcnt)))],
237*9880d681SAndroid Build Coastguard Worker                 itin>;
238*9880d681SAndroid Build Coastguard Worker}
239*9880d681SAndroid Build Coastguard Worker
240*9880d681SAndroid Build Coastguard Workerclass F4<bits<6> op3, dag outs, dag ins, string asmstr, list<dag> pattern,
241*9880d681SAndroid Build Coastguard Worker           InstrItinClass itin = NoItinerary>
242*9880d681SAndroid Build Coastguard Worker   : InstSP<outs, ins, asmstr, pattern, itin> {
243*9880d681SAndroid Build Coastguard Worker  bits<5> rd;
244*9880d681SAndroid Build Coastguard Worker
245*9880d681SAndroid Build Coastguard Worker  let op          = 2;
246*9880d681SAndroid Build Coastguard Worker  let Inst{29-25} = rd;
247*9880d681SAndroid Build Coastguard Worker  let Inst{24-19} = op3;
248*9880d681SAndroid Build Coastguard Worker}
249*9880d681SAndroid Build Coastguard Worker
250*9880d681SAndroid Build Coastguard Worker
251*9880d681SAndroid Build Coastguard Workerclass F4_1<bits<6> op3, dag outs, dag ins,
252*9880d681SAndroid Build Coastguard Worker           string asmstr, list<dag> pattern,
253*9880d681SAndroid Build Coastguard Worker           InstrItinClass itin = NoItinerary>
254*9880d681SAndroid Build Coastguard Worker   : F4<op3, outs, ins, asmstr, pattern, itin> {
255*9880d681SAndroid Build Coastguard Worker  bit    intcc;
256*9880d681SAndroid Build Coastguard Worker  bits<2> cc;
257*9880d681SAndroid Build Coastguard Worker  bits<4> cond;
258*9880d681SAndroid Build Coastguard Worker  bits<5> rs2;
259*9880d681SAndroid Build Coastguard Worker
260*9880d681SAndroid Build Coastguard Worker  let Inst{4-0}   = rs2;
261*9880d681SAndroid Build Coastguard Worker  let Inst{12-11} = cc;
262*9880d681SAndroid Build Coastguard Worker  let Inst{13}    = 0;
263*9880d681SAndroid Build Coastguard Worker  let Inst{17-14} = cond;
264*9880d681SAndroid Build Coastguard Worker  let Inst{18}    = intcc;
265*9880d681SAndroid Build Coastguard Worker}
266*9880d681SAndroid Build Coastguard Worker
267*9880d681SAndroid Build Coastguard Workerclass F4_2<bits<6> op3, dag outs, dag ins,
268*9880d681SAndroid Build Coastguard Worker            string asmstr, list<dag> pattern,
269*9880d681SAndroid Build Coastguard Worker            InstrItinClass itin = NoItinerary>
270*9880d681SAndroid Build Coastguard Worker   : F4<op3, outs, ins, asmstr, pattern, itin> {
271*9880d681SAndroid Build Coastguard Worker  bit      intcc;
272*9880d681SAndroid Build Coastguard Worker  bits<2>  cc;
273*9880d681SAndroid Build Coastguard Worker  bits<4>  cond;
274*9880d681SAndroid Build Coastguard Worker  bits<11> simm11;
275*9880d681SAndroid Build Coastguard Worker
276*9880d681SAndroid Build Coastguard Worker  let Inst{10-0}  = simm11;
277*9880d681SAndroid Build Coastguard Worker  let Inst{12-11} = cc;
278*9880d681SAndroid Build Coastguard Worker  let Inst{13}    = 1;
279*9880d681SAndroid Build Coastguard Worker  let Inst{17-14} = cond;
280*9880d681SAndroid Build Coastguard Worker  let Inst{18}    = intcc;
281*9880d681SAndroid Build Coastguard Worker}
282*9880d681SAndroid Build Coastguard Worker
283*9880d681SAndroid Build Coastguard Workerclass F4_3<bits<6> op3, bits<6> opf_low, dag outs, dag ins,
284*9880d681SAndroid Build Coastguard Worker           string asmstr, list<dag> pattern,
285*9880d681SAndroid Build Coastguard Worker           InstrItinClass itin = NoItinerary>
286*9880d681SAndroid Build Coastguard Worker   : F4<op3, outs, ins, asmstr, pattern, itin> {
287*9880d681SAndroid Build Coastguard Worker  bits<4> cond;
288*9880d681SAndroid Build Coastguard Worker  bit     intcc;
289*9880d681SAndroid Build Coastguard Worker  bits<2> opf_cc;
290*9880d681SAndroid Build Coastguard Worker  bits<5> rs2;
291*9880d681SAndroid Build Coastguard Worker
292*9880d681SAndroid Build Coastguard Worker  let Inst{18}     = 0;
293*9880d681SAndroid Build Coastguard Worker  let Inst{17-14}  = cond;
294*9880d681SAndroid Build Coastguard Worker  let Inst{13}     = intcc;
295*9880d681SAndroid Build Coastguard Worker  let Inst{12-11}  = opf_cc;
296*9880d681SAndroid Build Coastguard Worker  let Inst{10-5}   = opf_low;
297*9880d681SAndroid Build Coastguard Worker  let Inst{4-0}    = rs2;
298*9880d681SAndroid Build Coastguard Worker}
299*9880d681SAndroid Build Coastguard Worker
300*9880d681SAndroid Build Coastguard Workerclass F4_4r<bits<6> op3, bits<5> opf_low, bits<3> rcond, dag outs, dag ins,
301*9880d681SAndroid Build Coastguard Worker            string asmstr, list<dag> pattern,
302*9880d681SAndroid Build Coastguard Worker            InstrItinClass itin = NoItinerary>
303*9880d681SAndroid Build Coastguard Worker   : F4<op3, outs, ins, asmstr, pattern, itin> {
304*9880d681SAndroid Build Coastguard Worker  bits <5> rs1;
305*9880d681SAndroid Build Coastguard Worker  bits <5> rs2;
306*9880d681SAndroid Build Coastguard Worker  let Inst{18-14} = rs1;
307*9880d681SAndroid Build Coastguard Worker  let Inst{13}    = 0;  // IsImm
308*9880d681SAndroid Build Coastguard Worker  let Inst{12-10} = rcond;
309*9880d681SAndroid Build Coastguard Worker  let Inst{9-5}   = opf_low;
310*9880d681SAndroid Build Coastguard Worker  let Inst{4-0}   = rs2;
311*9880d681SAndroid Build Coastguard Worker}
312*9880d681SAndroid Build Coastguard Worker
313*9880d681SAndroid Build Coastguard Worker
314*9880d681SAndroid Build Coastguard Workerclass F4_4i<bits<6> op3, bits<3> rcond, dag outs, dag ins,
315*9880d681SAndroid Build Coastguard Worker            string asmstr, list<dag> pattern,
316*9880d681SAndroid Build Coastguard Worker           InstrItinClass itin = NoItinerary>
317*9880d681SAndroid Build Coastguard Worker   : F4<op3, outs, ins, asmstr, pattern, itin> {
318*9880d681SAndroid Build Coastguard Worker  bits<5> rs1;
319*9880d681SAndroid Build Coastguard Worker  bits<10> simm10;
320*9880d681SAndroid Build Coastguard Worker  let Inst{18-14} = rs1;
321*9880d681SAndroid Build Coastguard Worker  let Inst{13}    = 1;  // IsImm
322*9880d681SAndroid Build Coastguard Worker  let Inst{12-10} = rcond;
323*9880d681SAndroid Build Coastguard Worker  let Inst{9-0}   = simm10;
324*9880d681SAndroid Build Coastguard Worker}
325*9880d681SAndroid Build Coastguard Worker
326*9880d681SAndroid Build Coastguard Worker
327*9880d681SAndroid Build Coastguard Workerclass TRAPSP<bits<6> op3Val, bit isimm, dag outs, dag ins,
328*9880d681SAndroid Build Coastguard Worker             string asmstr, list<dag> pattern,
329*9880d681SAndroid Build Coastguard Worker             InstrItinClass itin = NoItinerary>
330*9880d681SAndroid Build Coastguard Worker   : F3<outs, ins, asmstr, pattern, itin> {
331*9880d681SAndroid Build Coastguard Worker   bits<4> cond;
332*9880d681SAndroid Build Coastguard Worker   bits<2> cc;
333*9880d681SAndroid Build Coastguard Worker
334*9880d681SAndroid Build Coastguard Worker   let op = 0b10;
335*9880d681SAndroid Build Coastguard Worker   let rd{4} = 0;
336*9880d681SAndroid Build Coastguard Worker   let rd{3-0} = cond;
337*9880d681SAndroid Build Coastguard Worker   let op3 = op3Val;
338*9880d681SAndroid Build Coastguard Worker   let Inst{13} = isimm;
339*9880d681SAndroid Build Coastguard Worker   let Inst{12-11} = cc;
340*9880d681SAndroid Build Coastguard Worker
341*9880d681SAndroid Build Coastguard Worker}
342*9880d681SAndroid Build Coastguard Worker
343*9880d681SAndroid Build Coastguard Workerclass TRAPSPrr<bits<6> op3Val, dag outs, dag ins,
344*9880d681SAndroid Build Coastguard Worker               string asmstr, list<dag> pattern,
345*9880d681SAndroid Build Coastguard Worker               InstrItinClass itin = NoItinerary>
346*9880d681SAndroid Build Coastguard Worker   : TRAPSP<op3Val, 0, outs, ins, asmstr, pattern, itin> {
347*9880d681SAndroid Build Coastguard Worker   bits<5> rs2;
348*9880d681SAndroid Build Coastguard Worker
349*9880d681SAndroid Build Coastguard Worker   let Inst{10-5} = 0;
350*9880d681SAndroid Build Coastguard Worker   let Inst{4-0}  = rs2;
351*9880d681SAndroid Build Coastguard Worker}
352*9880d681SAndroid Build Coastguard Worker
353*9880d681SAndroid Build Coastguard Workerclass TRAPSPri<bits<6> op3Val, dag outs, dag ins,
354*9880d681SAndroid Build Coastguard Worker               string asmstr, list<dag> pattern,
355*9880d681SAndroid Build Coastguard Worker               InstrItinClass itin = NoItinerary>
356*9880d681SAndroid Build Coastguard Worker   : TRAPSP<op3Val, 1, outs, ins, asmstr, pattern, itin> {
357*9880d681SAndroid Build Coastguard Worker   bits<8> imm;
358*9880d681SAndroid Build Coastguard Worker
359*9880d681SAndroid Build Coastguard Worker   let Inst{10-8} = 0;
360*9880d681SAndroid Build Coastguard Worker   let Inst{7-0}  = imm;
361*9880d681SAndroid Build Coastguard Worker}
362*9880d681SAndroid Build Coastguard Worker
363*9880d681SAndroid Build Coastguard Worker// Pseudo-instructions for alternate assembly syntax (never used by codegen).
364*9880d681SAndroid Build Coastguard Worker// These are aliases that require C++ handling to convert to the target
365*9880d681SAndroid Build Coastguard Worker// instruction, while InstAliases can be handled directly by tblgen.
366*9880d681SAndroid Build Coastguard Workerclass AsmPseudoInst<dag outs, dag ins, string asm>
367*9880d681SAndroid Build Coastguard Worker  : InstSP<outs, ins, asm, []> {
368*9880d681SAndroid Build Coastguard Worker  let isPseudo = 1;
369*9880d681SAndroid Build Coastguard Worker}
370