blob: 37e26726f76e1f23d0fb58ebe8f4201b19028137 [file] [log] [blame]
Misha Brukmancd4f51b2004-08-02 16:54:54 +00001//===- PowerPCInstrFormats.td - PowerPC Instruction Formats --*- tablegen -*-=//
Jia Liub22310f2012-02-18 12:03:15 +00002//
Misha Brukmancd4f51b2004-08-02 16:54:54 +00003// The LLVM Compiler Infrastructure
4//
Chris Lattnerf3ebc3f2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Jia Liub22310f2012-02-18 12:03:15 +00007//
Misha Brukmancd4f51b2004-08-02 16:54:54 +00008//===----------------------------------------------------------------------===//
Misha Brukmancd4f51b2004-08-02 16:54:54 +00009
Misha Brukman6b21bde2004-08-02 21:56:35 +000010//===----------------------------------------------------------------------===//
11//
12// PowerPC instruction formats
Misha Brukmancd4f51b2004-08-02 16:54:54 +000013
Evan Cheng94b5a802007-07-19 01:14:50 +000014class I<bits<6> opcode, dag OOL, dag IOL, string asmstr, InstrItinClass itin>
Jim Laskey74ab9962005-10-19 19:51:16 +000015 : Instruction {
Misha Brukman6b21bde2004-08-02 21:56:35 +000016 field bits<32> Inst;
Misha Brukmancd4f51b2004-08-02 16:54:54 +000017
Chris Lattner5b78da42005-04-19 05:05:22 +000018 bit PPC64 = 0; // Default value, override with isPPC64
Misha Brukmancd4f51b2004-08-02 16:54:54 +000019
Misha Brukmandad438b2004-08-10 22:47:03 +000020 let Namespace = "PPC";
Misha Brukman5295e1d2004-08-09 17:24:04 +000021 let Inst{0-5} = opcode;
Evan Cheng94b5a802007-07-19 01:14:50 +000022 let OutOperandList = OOL;
23 let InOperandList = IOL;
Nate Begeman4bfceb12004-09-04 05:00:00 +000024 let AsmString = asmstr;
Jim Laskey74ab9962005-10-19 19:51:16 +000025 let Itinerary = itin;
Jakob Stoklund Olesenb93331f2010-04-05 03:10:20 +000026
Chris Lattner51348c52006-03-12 09:13:49 +000027 bits<1> PPC970_First = 0;
28 bits<1> PPC970_Single = 0;
Chris Lattner7579cfb2006-03-13 05:15:10 +000029 bits<1> PPC970_Cracked = 0;
Chris Lattner51348c52006-03-12 09:13:49 +000030 bits<3> PPC970_Unit = 0;
Jakob Stoklund Olesenb93331f2010-04-05 03:10:20 +000031
32 /// These fields correspond to the fields in PPCInstrInfo.h. Any changes to
33 /// these must be reflected there! See comments there for what these are.
34 let TSFlags{0} = PPC970_First;
35 let TSFlags{1} = PPC970_Single;
36 let TSFlags{2} = PPC970_Cracked;
37 let TSFlags{5-3} = PPC970_Unit;
Hal Finkel654d43b2013-04-12 02:18:09 +000038
39 // Fields used for relation models.
40 string BaseName = "";
41 bit Interpretation64Bit = 0;
Misha Brukmancd4f51b2004-08-02 16:54:54 +000042}
43
Chris Lattner7579cfb2006-03-13 05:15:10 +000044class PPC970_DGroup_First { bits<1> PPC970_First = 1; }
45class PPC970_DGroup_Single { bits<1> PPC970_Single = 1; }
46class PPC970_DGroup_Cracked { bits<1> PPC970_Cracked = 1; }
Chris Lattner51348c52006-03-12 09:13:49 +000047class PPC970_MicroCode;
48
49class PPC970_Unit_Pseudo { bits<3> PPC970_Unit = 0; }
50class PPC970_Unit_FXU { bits<3> PPC970_Unit = 1; }
51class PPC970_Unit_LSU { bits<3> PPC970_Unit = 2; }
52class PPC970_Unit_FPU { bits<3> PPC970_Unit = 3; }
53class PPC970_Unit_CRU { bits<3> PPC970_Unit = 4; }
54class PPC970_Unit_VALU { bits<3> PPC970_Unit = 5; }
55class PPC970_Unit_VPERM { bits<3> PPC970_Unit = 6; }
56class PPC970_Unit_BRU { bits<3> PPC970_Unit = 7; }
57
Hal Finkel51861b42012-03-31 14:45:15 +000058// Two joined instructions; used to emit two adjacent instructions as one.
59// The itinerary from the first instruction is used for scheduling and
60// classification.
61class I2<bits<6> opcode1, bits<6> opcode2, dag OOL, dag IOL, string asmstr,
62 InstrItinClass itin>
63 : Instruction {
64 field bits<64> Inst;
65
66 bit PPC64 = 0; // Default value, override with isPPC64
67
68 let Namespace = "PPC";
69 let Inst{0-5} = opcode1;
70 let Inst{32-37} = opcode2;
71 let OutOperandList = OOL;
72 let InOperandList = IOL;
73 let AsmString = asmstr;
74 let Itinerary = itin;
75
76 bits<1> PPC970_First = 0;
77 bits<1> PPC970_Single = 0;
78 bits<1> PPC970_Cracked = 0;
79 bits<3> PPC970_Unit = 0;
80
81 /// These fields correspond to the fields in PPCInstrInfo.h. Any changes to
82 /// these must be reflected there! See comments there for what these are.
83 let TSFlags{0} = PPC970_First;
84 let TSFlags{1} = PPC970_Single;
85 let TSFlags{2} = PPC970_Cracked;
86 let TSFlags{5-3} = PPC970_Unit;
Hal Finkel654d43b2013-04-12 02:18:09 +000087
88 // Fields used for relation models.
89 string BaseName = "";
90 bit Interpretation64Bit = 0;
Hal Finkel51861b42012-03-31 14:45:15 +000091}
Chris Lattner51348c52006-03-12 09:13:49 +000092
Misha Brukman5295e1d2004-08-09 17:24:04 +000093// 1.7.1 I-Form
Evan Cheng94b5a802007-07-19 01:14:50 +000094class IForm<bits<6> opcode, bit aa, bit lk, dag OOL, dag IOL, string asmstr,
Chris Lattnerd9d18af2005-12-04 18:42:54 +000095 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +000096 : I<opcode, OOL, IOL, asmstr, itin> {
Chris Lattnerd9d18af2005-12-04 18:42:54 +000097 let Pattern = pattern;
Misha Brukman189f3dc2004-10-14 05:55:37 +000098 bits<24> LI;
Misha Brukman6b21bde2004-08-02 21:56:35 +000099
Misha Brukman5295e1d2004-08-09 17:24:04 +0000100 let Inst{6-29} = LI;
101 let Inst{30} = aa;
102 let Inst{31} = lk;
Misha Brukman6b21bde2004-08-02 21:56:35 +0000103}
104
Misha Brukman5295e1d2004-08-09 17:24:04 +0000105// 1.7.2 B-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000106class BForm<bits<6> opcode, bit aa, bit lk, dag OOL, dag IOL, string asmstr>
107 : I<opcode, OOL, IOL, asmstr, BrB> {
Chris Lattner33fc1d42006-11-17 23:53:28 +0000108 bits<7> BIBO; // 2 bits of BI and 5 bits of BO.
109 bits<3> CR;
110 bits<14> BD;
111
112 bits<5> BI;
113 let BI{0-1} = BIBO{5-6};
114 let BI{2-4} = CR{0-2};
115
116 let Inst{6-10} = BIBO{4-0};
117 let Inst{11-15} = BI;
118 let Inst{16-29} = BD;
119 let Inst{30} = aa;
120 let Inst{31} = lk;
121}
122
Ulrich Weigand01177182012-11-13 19:15:52 +0000123class BForm_1<bits<6> opcode, bits<5> bo, bit aa, bit lk, dag OOL, dag IOL,
124 string asmstr>
125 : BForm<opcode, aa, lk, OOL, IOL, asmstr> {
126 let BIBO{4-0} = bo;
127 let BIBO{6-5} = 0;
128 let CR = 0;
129}
Chris Lattner33fc1d42006-11-17 23:53:28 +0000130
Hal Finkel756810f2013-03-21 21:37:52 +0000131class BForm_2<bits<6> opcode, bits<5> bo, bits<5> bi, bit aa, bit lk,
132 dag OOL, dag IOL, string asmstr>
133 : I<opcode, OOL, IOL, asmstr, BrB> {
134 bits<14> BD;
135
136 let Inst{6-10} = bo;
137 let Inst{11-15} = bi;
138 let Inst{16-29} = BD;
139 let Inst{30} = aa;
140 let Inst{31} = lk;
141}
142
Misha Brukman5295e1d2004-08-09 17:24:04 +0000143// 1.7.4 D-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000144class DForm_base<bits<6> opcode, dag OOL, dag IOL, string asmstr,
145 InstrItinClass itin, list<dag> pattern>
146 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000147 bits<5> A;
148 bits<5> B;
149 bits<16> C;
Nate Begemanade6f9a2005-12-09 23:54:18 +0000150
151 let Pattern = pattern;
Misha Brukman6b21bde2004-08-02 21:56:35 +0000152
Misha Brukman6b21bde2004-08-02 21:56:35 +0000153 let Inst{6-10} = A;
154 let Inst{11-15} = B;
155 let Inst{16-31} = C;
156}
157
Evan Cheng94b5a802007-07-19 01:14:50 +0000158class DForm_1<bits<6> opcode, dag OOL, dag IOL, string asmstr,
159 InstrItinClass itin, list<dag> pattern>
160 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman15b0fb52004-10-23 06:08:38 +0000161 bits<5> A;
Chris Lattnerefacb9e2010-11-15 08:22:03 +0000162 bits<21> Addr;
163
164 let Pattern = pattern;
165
166 let Inst{6-10} = A;
167 let Inst{11-15} = Addr{20-16}; // Base Reg
168 let Inst{16-31} = Addr{15-0}; // Displacement
169}
170
171class DForm_1a<bits<6> opcode, dag OOL, dag IOL, string asmstr,
172 InstrItinClass itin, list<dag> pattern>
173 : I<opcode, OOL, IOL, asmstr, itin> {
174 bits<5> A;
Misha Brukman15b0fb52004-10-23 06:08:38 +0000175 bits<16> C;
176 bits<5> B;
Nate Begemanade6f9a2005-12-09 23:54:18 +0000177
178 let Pattern = pattern;
Misha Brukman15b0fb52004-10-23 06:08:38 +0000179
Misha Brukman15b0fb52004-10-23 06:08:38 +0000180 let Inst{6-10} = A;
181 let Inst{11-15} = B;
182 let Inst{16-31} = C;
Misha Brukman6b21bde2004-08-02 21:56:35 +0000183}
184
Chris Lattnerefacb9e2010-11-15 08:22:03 +0000185
Evan Cheng94b5a802007-07-19 01:14:50 +0000186class DForm_2<bits<6> opcode, dag OOL, dag IOL, string asmstr,
187 InstrItinClass itin, list<dag> pattern>
Hal Finkel654d43b2013-04-12 02:18:09 +0000188 : DForm_base<opcode, OOL, IOL, asmstr, itin, pattern> {
189
190 // Even though ADDICo does not really have an RC bit, provide
191 // the declaration of one here so that isDOT has something to set.
192 bit RC = 0;
193}
Misha Brukman6b21bde2004-08-02 21:56:35 +0000194
Evan Cheng94b5a802007-07-19 01:14:50 +0000195class DForm_2_r0<bits<6> opcode, dag OOL, dag IOL, string asmstr,
196 InstrItinClass itin, list<dag> pattern>
197 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000198 bits<5> A;
199 bits<16> B;
Nate Begeman4bfceb12004-09-04 05:00:00 +0000200
Chris Lattner2d8032b2005-09-08 17:33:10 +0000201 let Pattern = pattern;
202
Nate Begeman4bfceb12004-09-04 05:00:00 +0000203 let Inst{6-10} = A;
204 let Inst{11-15} = 0;
205 let Inst{16-31} = B;
Misha Brukman6b21bde2004-08-02 21:56:35 +0000206}
207
Evan Cheng94b5a802007-07-19 01:14:50 +0000208class DForm_4<bits<6> opcode, dag OOL, dag IOL, string asmstr,
209 InstrItinClass itin, list<dag> pattern>
210 : I<opcode, OOL, IOL, asmstr, itin> {
Chris Lattner022e2712004-11-24 02:15:41 +0000211 bits<5> B;
212 bits<5> A;
213 bits<16> C;
214
Chris Lattner76cb0062005-09-08 17:40:49 +0000215 let Pattern = pattern;
216
Chris Lattner022e2712004-11-24 02:15:41 +0000217 let Inst{6-10} = A;
218 let Inst{11-15} = B;
219 let Inst{16-31} = C;
220}
Nate Begeman4bfceb12004-09-04 05:00:00 +0000221
Evan Cheng94b5a802007-07-19 01:14:50 +0000222class DForm_4_zero<bits<6> opcode, dag OOL, dag IOL, string asmstr,
223 InstrItinClass itin, list<dag> pattern>
224 : DForm_1<opcode, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000225 let A = 0;
Chris Lattnerefacb9e2010-11-15 08:22:03 +0000226 let Addr = 0;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000227}
228
Hal Finkel51861b42012-03-31 14:45:15 +0000229class IForm_and_DForm_1<bits<6> opcode1, bit aa, bit lk, bits<6> opcode2,
230 dag OOL, dag IOL, string asmstr,
231 InstrItinClass itin, list<dag> pattern>
232 : I2<opcode1, opcode2, OOL, IOL, asmstr, itin> {
233 bits<5> A;
234 bits<21> Addr;
235
236 let Pattern = pattern;
237 bits<24> LI;
238
239 let Inst{6-29} = LI;
240 let Inst{30} = aa;
241 let Inst{31} = lk;
242
243 let Inst{38-42} = A;
244 let Inst{43-47} = Addr{20-16}; // Base Reg
245 let Inst{48-63} = Addr{15-0}; // Displacement
246}
247
248// This is used to emit BL8+NOP.
249class IForm_and_DForm_4_zero<bits<6> opcode1, bit aa, bit lk, bits<6> opcode2,
250 dag OOL, dag IOL, string asmstr,
251 InstrItinClass itin, list<dag> pattern>
252 : IForm_and_DForm_1<opcode1, aa, lk, opcode2,
253 OOL, IOL, asmstr, itin, pattern> {
254 let A = 0;
255 let Addr = 0;
256}
257
Evan Cheng94b5a802007-07-19 01:14:50 +0000258class DForm_5<bits<6> opcode, dag OOL, dag IOL, string asmstr,
259 InstrItinClass itin>
260 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000261 bits<3> BF;
262 bits<1> L;
263 bits<5> RA;
264 bits<16> I;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000265
Misha Brukman5295e1d2004-08-09 17:24:04 +0000266 let Inst{6-8} = BF;
267 let Inst{9} = 0;
268 let Inst{10} = L;
269 let Inst{11-15} = RA;
270 let Inst{16-31} = I;
271}
272
Evan Cheng94b5a802007-07-19 01:14:50 +0000273class DForm_5_ext<bits<6> opcode, dag OOL, dag IOL, string asmstr,
274 InstrItinClass itin>
275 : DForm_5<opcode, OOL, IOL, asmstr, itin> {
Chris Lattnerb2367e32005-04-19 04:59:28 +0000276 let L = PPC64;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000277}
278
Evan Cheng94b5a802007-07-19 01:14:50 +0000279class DForm_6<bits<6> opcode, dag OOL, dag IOL, string asmstr,
280 InstrItinClass itin>
281 : DForm_5<opcode, OOL, IOL, asmstr, itin>;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000282
Evan Cheng94b5a802007-07-19 01:14:50 +0000283class DForm_6_ext<bits<6> opcode, dag OOL, dag IOL, string asmstr,
284 InstrItinClass itin>
285 : DForm_6<opcode, OOL, IOL, asmstr, itin> {
Chris Lattnerb2367e32005-04-19 04:59:28 +0000286 let L = PPC64;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000287}
288
Misha Brukman5295e1d2004-08-09 17:24:04 +0000289
Misha Brukman28beda92004-08-11 15:54:36 +0000290// 1.7.5 DS-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000291class DSForm_1<bits<6> opcode, bits<2> xo, dag OOL, dag IOL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000292 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000293 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000294 bits<5> RST;
Chris Lattner8f4444d2010-11-15 08:02:41 +0000295 bits<19> DS_RA;
Misha Brukman28beda92004-08-11 15:54:36 +0000296
Nate Begemanade6f9a2005-12-09 23:54:18 +0000297 let Pattern = pattern;
298
Misha Brukman28beda92004-08-11 15:54:36 +0000299 let Inst{6-10} = RST;
Chris Lattner8f4444d2010-11-15 08:02:41 +0000300 let Inst{11-15} = DS_RA{18-14}; // Register #
301 let Inst{16-29} = DS_RA{13-0}; // Displacement.
Misha Brukman28beda92004-08-11 15:54:36 +0000302 let Inst{30-31} = xo;
303}
304
Chris Lattner8f4444d2010-11-15 08:02:41 +0000305class DSForm_1a<bits<6> opcode, bits<2> xo, dag OOL, dag IOL, string asmstr,
306 InstrItinClass itin, list<dag> pattern>
307 : I<opcode, OOL, IOL, asmstr, itin> {
308 bits<5> RST;
309 bits<14> DS;
310 bits<5> RA;
311
312 let Pattern = pattern;
313
314 let Inst{6-10} = RST;
315 let Inst{11-15} = RA;
316 let Inst{16-29} = DS;
317 let Inst{30-31} = xo;
318}
319
Misha Brukman5295e1d2004-08-09 17:24:04 +0000320// 1.7.6 X-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000321class XForm_base_r3xo<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000322 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000323 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000324 bits<5> RST;
325 bits<5> A;
326 bits<5> B;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000327
Nate Begemanade6f9a2005-12-09 23:54:18 +0000328 let Pattern = pattern;
329
Chris Lattnerf9172e12005-04-19 05:15:18 +0000330 bit RC = 0; // set by isDOT
331
Misha Brukman28beda92004-08-11 15:54:36 +0000332 let Inst{6-10} = RST;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000333 let Inst{11-15} = A;
334 let Inst{16-20} = B;
335 let Inst{21-30} = xo;
Chris Lattnerf9172e12005-04-19 05:15:18 +0000336 let Inst{31} = RC;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000337}
338
Chris Lattner130888ad2004-11-24 03:52:02 +0000339// This is the same as XForm_base_r3xo, but the first two operands are swapped
340// when code is emitted.
341class XForm_base_r3xo_swapped
Evan Cheng94b5a802007-07-19 01:14:50 +0000342 <bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000343 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000344 : I<opcode, OOL, IOL, asmstr, itin> {
Chris Lattner130888ad2004-11-24 03:52:02 +0000345 bits<5> A;
346 bits<5> RST;
347 bits<5> B;
348
Chris Lattnerf9172e12005-04-19 05:15:18 +0000349 bit RC = 0; // set by isDOT
350
Chris Lattner130888ad2004-11-24 03:52:02 +0000351 let Inst{6-10} = RST;
352 let Inst{11-15} = A;
353 let Inst{16-20} = B;
354 let Inst{21-30} = xo;
Chris Lattnerf9172e12005-04-19 05:15:18 +0000355 let Inst{31} = RC;
Chris Lattner130888ad2004-11-24 03:52:02 +0000356}
357
Nate Begeman765cb5f2004-08-13 02:19:26 +0000358
Evan Cheng94b5a802007-07-19 01:14:50 +0000359class XForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000360 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000361 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern>;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000362
Evan Cheng94b5a802007-07-19 01:14:50 +0000363class XForm_6<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000364 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000365 : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> {
Chris Lattnerdcbb5612005-09-02 22:35:53 +0000366 let Pattern = pattern;
367}
Misha Brukman5295e1d2004-08-09 17:24:04 +0000368
Evan Cheng94b5a802007-07-19 01:14:50 +0000369class XForm_8<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000370 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000371 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern>;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000372
Evan Cheng94b5a802007-07-19 01:14:50 +0000373class XForm_10<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000374 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000375 : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> {
Jim Laskey74ab9962005-10-19 19:51:16 +0000376 let Pattern = pattern;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000377}
378
Evan Cheng94b5a802007-07-19 01:14:50 +0000379class XForm_11<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000380 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000381 : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000382 let B = 0;
Chris Lattnerdcbb5612005-09-02 22:35:53 +0000383 let Pattern = pattern;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000384}
385
Evan Cheng94b5a802007-07-19 01:14:50 +0000386class XForm_16<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000387 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000388 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000389 bits<3> BF;
390 bits<1> L;
391 bits<5> RA;
392 bits<5> RB;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000393
Misha Brukman5295e1d2004-08-09 17:24:04 +0000394 let Inst{6-8} = BF;
395 let Inst{9} = 0;
396 let Inst{10} = L;
397 let Inst{11-15} = RA;
398 let Inst{16-20} = RB;
399 let Inst{21-30} = xo;
400 let Inst{31} = 0;
401}
402
Evan Cheng94b5a802007-07-19 01:14:50 +0000403class XForm_16_ext<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000404 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000405 : XForm_16<opcode, xo, OOL, IOL, asmstr, itin> {
Chris Lattner15709c22005-04-19 04:51:30 +0000406 let L = PPC64;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000407}
408
Evan Cheng94b5a802007-07-19 01:14:50 +0000409class XForm_17<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000410 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000411 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000412 bits<3> BF;
413 bits<5> FRA;
414 bits<5> FRB;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000415
Misha Brukman5295e1d2004-08-09 17:24:04 +0000416 let Inst{6-8} = BF;
417 let Inst{9-10} = 0;
418 let Inst{11-15} = FRA;
419 let Inst{16-20} = FRB;
420 let Inst{21-30} = xo;
421 let Inst{31} = 0;
422}
423
Nate Begemanf69d13b2008-08-11 17:36:31 +0000424class XForm_24<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
425 InstrItinClass itin, list<dag> pattern>
426 : I<opcode, OOL, IOL, asmstr, itin> {
427 let Pattern = pattern;
428 let Inst{6-10} = 31;
429 let Inst{11-15} = 0;
430 let Inst{16-20} = 0;
431 let Inst{21-30} = xo;
432 let Inst{31} = 0;
433}
434
Dale Johannesened86f682008-08-22 17:20:54 +0000435class XForm_24_sync<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
436 string asmstr, InstrItinClass itin, list<dag> pattern>
437 : I<opcode, OOL, IOL, asmstr, itin> {
438 let Pattern = pattern;
439 let Inst{6-10} = 0;
440 let Inst{11-15} = 0;
441 let Inst{16-20} = 0;
442 let Inst{21-30} = xo;
443 let Inst{31} = 0;
444}
445
Evan Cheng94b5a802007-07-19 01:14:50 +0000446class XForm_25<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000447 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000448 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000449}
450
Evan Cheng94b5a802007-07-19 01:14:50 +0000451class XForm_26<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000452 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000453 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000454 let A = 0;
455}
456
Evan Cheng94b5a802007-07-19 01:14:50 +0000457class XForm_28<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000458 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000459 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000460}
461
Dale Johannesen666323e2007-10-10 01:01:31 +0000462// This is used for MFFS, MTFSB0, MTFSB1. 42 is arbitrary; this series of
463// numbers presumably relates to some document, but I haven't found it.
464class XForm_42<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
465 InstrItinClass itin, list<dag> pattern>
466 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
467 let Pattern = pattern;
468
469 bit RC = 0; // set by isDOT
470
471 let Inst{6-10} = RST;
472 let Inst{11-20} = 0;
473 let Inst{21-30} = xo;
474 let Inst{31} = RC;
475}
476class XForm_43<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
477 InstrItinClass itin, list<dag> pattern>
478 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
479 let Pattern = pattern;
480 bits<5> FM;
481
482 bit RC = 0; // set by isDOT
483
484 let Inst{6-10} = FM;
485 let Inst{11-20} = 0;
486 let Inst{21-30} = xo;
487 let Inst{31} = RC;
488}
489
Chris Lattnerc8587d42006-06-06 21:29:23 +0000490// DCB_Form - Form X instruction, used for dcb* instructions.
Evan Cheng94b5a802007-07-19 01:14:50 +0000491class DCB_Form<bits<10> xo, bits<5> immfield, dag OOL, dag IOL, string asmstr,
Chris Lattnerc8587d42006-06-06 21:29:23 +0000492 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000493 : I<31, OOL, IOL, asmstr, itin> {
Chris Lattnerc8587d42006-06-06 21:29:23 +0000494 bits<5> A;
495 bits<5> B;
496
497 let Pattern = pattern;
498
499 let Inst{6-10} = immfield;
500 let Inst{11-15} = A;
501 let Inst{16-20} = B;
502 let Inst{21-30} = xo;
503 let Inst{31} = 0;
504}
505
506
Chris Lattnerc94d9322006-04-05 22:27:14 +0000507// DSS_Form - Form X instruction, used for altivec dss* instructions.
Evan Cheng94b5a802007-07-19 01:14:50 +0000508class DSS_Form<bits<10> xo, dag OOL, dag IOL, string asmstr,
Chris Lattnerc94d9322006-04-05 22:27:14 +0000509 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000510 : I<31, OOL, IOL, asmstr, itin> {
Chris Lattnerc94d9322006-04-05 22:27:14 +0000511 bits<1> T;
512 bits<2> STRM;
513 bits<5> A;
514 bits<5> B;
515
516 let Pattern = pattern;
517
518 let Inst{6} = T;
519 let Inst{7-8} = 0;
520 let Inst{9-10} = STRM;
521 let Inst{11-15} = A;
522 let Inst{16-20} = B;
523 let Inst{21-30} = xo;
524 let Inst{31} = 0;
525}
526
Misha Brukman5295e1d2004-08-09 17:24:04 +0000527// 1.7.7 XL-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000528class XLForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Chris Lattnerb9bd34f2007-02-25 05:07:49 +0000529 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000530 : I<opcode, OOL, IOL, asmstr, itin> {
Chris Lattnerb9bd34f2007-02-25 05:07:49 +0000531 bits<5> CRD;
532 bits<5> CRA;
533 bits<5> CRB;
Nate Begeman65a82c52005-04-14 03:20:38 +0000534
Chris Lattnerb9bd34f2007-02-25 05:07:49 +0000535 let Pattern = pattern;
536
537 let Inst{6-10} = CRD;
538 let Inst{11-15} = CRA;
539 let Inst{16-20} = CRB;
540 let Inst{21-30} = xo;
541 let Inst{31} = 0;
542}
543
Evan Cheng94b5a802007-07-19 01:14:50 +0000544class XLForm_1_ext<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Chris Lattnerb9bd34f2007-02-25 05:07:49 +0000545 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000546 : I<opcode, OOL, IOL, asmstr, itin> {
Chris Lattnerb9bd34f2007-02-25 05:07:49 +0000547 bits<5> CRD;
548
549 let Pattern = pattern;
550
551 let Inst{6-10} = CRD;
552 let Inst{11-15} = CRD;
553 let Inst{16-20} = CRD;
Nate Begeman65a82c52005-04-14 03:20:38 +0000554 let Inst{21-30} = xo;
555 let Inst{31} = 0;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000556}
557
Evan Cheng94b5a802007-07-19 01:14:50 +0000558class XLForm_2<bits<6> opcode, bits<10> xo, bit lk, dag OOL, dag IOL, string asmstr,
Nate Begemanb11b8e42005-12-20 00:26:01 +0000559 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000560 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000561 bits<5> BO;
562 bits<5> BI;
563 bits<2> BH;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000564
Nate Begemanb11b8e42005-12-20 00:26:01 +0000565 let Pattern = pattern;
566
Misha Brukman5295e1d2004-08-09 17:24:04 +0000567 let Inst{6-10} = BO;
568 let Inst{11-15} = BI;
569 let Inst{16-18} = 0;
570 let Inst{19-20} = BH;
571 let Inst{21-30} = xo;
572 let Inst{31} = lk;
573}
574
Chris Lattner29597892006-11-04 05:42:48 +0000575class XLForm_2_br<bits<6> opcode, bits<10> xo, bit lk,
Evan Cheng94b5a802007-07-19 01:14:50 +0000576 dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
577 : XLForm_2<opcode, xo, lk, OOL, IOL, asmstr, itin, pattern> {
Chris Lattner29597892006-11-04 05:42:48 +0000578 bits<7> BIBO; // 2 bits of BI and 5 bits of BO.
579 bits<3> CR;
580
Hal Finkelb5aa7e52013-04-08 16:24:03 +0000581 let BO = BIBO{4-0};
582 let BI{0-1} = BIBO{5-6};
583 let BI{2-4} = CR{0-2};
Chris Lattner29597892006-11-04 05:42:48 +0000584 let BH = 0;
585}
586
587
Jim Laskey74ab9962005-10-19 19:51:16 +0000588class XLForm_2_ext<bits<6> opcode, bits<10> xo, bits<5> bo, bits<5> bi, bit lk,
Evan Cheng94b5a802007-07-19 01:14:50 +0000589 dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
590 : XLForm_2<opcode, xo, lk, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000591 let BO = bo;
592 let BI = bi;
593 let BH = 0;
594}
595
Evan Cheng94b5a802007-07-19 01:14:50 +0000596class XLForm_3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000597 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000598 : I<opcode, OOL, IOL, asmstr, itin> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000599 bits<3> BF;
600 bits<3> BFA;
601
602 let Inst{6-8} = BF;
603 let Inst{9-10} = 0;
604 let Inst{11-13} = BFA;
605 let Inst{14-15} = 0;
606 let Inst{16-20} = 0;
607 let Inst{21-30} = xo;
608 let Inst{31} = 0;
609}
610
Misha Brukman5295e1d2004-08-09 17:24:04 +0000611// 1.7.8 XFX-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000612class XFXForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000613 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000614 : I<opcode, OOL, IOL, asmstr, itin> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000615 bits<5> RT;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000616 bits<10> SPR;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000617
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000618 let Inst{6-10} = RT;
Nate Begeman048b2632005-11-29 22:42:50 +0000619 let Inst{11} = SPR{4};
620 let Inst{12} = SPR{3};
621 let Inst{13} = SPR{2};
622 let Inst{14} = SPR{1};
623 let Inst{15} = SPR{0};
624 let Inst{16} = SPR{9};
625 let Inst{17} = SPR{8};
626 let Inst{18} = SPR{7};
627 let Inst{19} = SPR{6};
628 let Inst{20} = SPR{5};
Misha Brukman5295e1d2004-08-09 17:24:04 +0000629 let Inst{21-30} = xo;
630 let Inst{31} = 0;
631}
632
Chris Lattnerd790d222005-04-19 04:40:07 +0000633class XFXForm_1_ext<bits<6> opcode, bits<10> xo, bits<10> spr,
Evan Cheng94b5a802007-07-19 01:14:50 +0000634 dag OOL, dag IOL, string asmstr, InstrItinClass itin>
635 : XFXForm_1<opcode, xo, OOL, IOL, asmstr, itin> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000636 let SPR = spr;
637}
638
Evan Cheng94b5a802007-07-19 01:14:50 +0000639class XFXForm_3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000640 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000641 : I<opcode, OOL, IOL, asmstr, itin> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000642 bits<5> RT;
643
644 let Inst{6-10} = RT;
645 let Inst{11-20} = 0;
646 let Inst{21-30} = xo;
647 let Inst{31} = 0;
648}
649
Evan Cheng94b5a802007-07-19 01:14:50 +0000650class XFXForm_5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000651 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000652 : I<opcode, OOL, IOL, asmstr, itin> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000653 bits<8> FXM;
Ulrich Weiganda82389b2012-11-13 19:19:46 +0000654 bits<5> rS;
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000655
Ulrich Weiganda82389b2012-11-13 19:19:46 +0000656 let Inst{6-10} = rS;
Nate Begeman9a838672005-08-08 20:04:52 +0000657 let Inst{11} = 0;
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000658 let Inst{12-19} = FXM;
659 let Inst{20} = 0;
660 let Inst{21-30} = xo;
661 let Inst{31} = 0;
662}
663
Evan Cheng94b5a802007-07-19 01:14:50 +0000664class XFXForm_5a<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000665 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000666 : I<opcode, OOL, IOL, asmstr, itin> {
Nate Begeman9a838672005-08-08 20:04:52 +0000667 bits<5> ST;
668 bits<8> FXM;
669
670 let Inst{6-10} = ST;
671 let Inst{11} = 1;
672 let Inst{12-19} = FXM;
673 let Inst{20} = 0;
674 let Inst{21-30} = xo;
675 let Inst{31} = 0;
676}
677
Evan Cheng94b5a802007-07-19 01:14:50 +0000678class XFXForm_7<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000679 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000680 : XFXForm_1<opcode, xo, OOL, IOL, asmstr, itin>;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000681
Nate Begeman143cf942004-08-30 02:28:06 +0000682class XFXForm_7_ext<bits<6> opcode, bits<10> xo, bits<10> spr,
Evan Cheng94b5a802007-07-19 01:14:50 +0000683 dag OOL, dag IOL, string asmstr, InstrItinClass itin>
684 : XFXForm_7<opcode, xo, OOL, IOL, asmstr, itin> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000685 let SPR = spr;
686}
687
Dale Johannesen666323e2007-10-10 01:01:31 +0000688// XFL-Form - MTFSF
689// This is probably 1.7.9, but I don't have the reference that uses this
690// numbering scheme...
691class XFLForm<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Ulrich Weigand874fc622013-03-26 10:56:22 +0000692 InstrItinClass itin, list<dag>pattern>
Dale Johannesen666323e2007-10-10 01:01:31 +0000693 : I<opcode, OOL, IOL, asmstr, itin> {
694 bits<8> FM;
Ulrich Weiganda82389b2012-11-13 19:19:46 +0000695 bits<5> rT;
Dale Johannesen666323e2007-10-10 01:01:31 +0000696
697 bit RC = 0; // set by isDOT
698 let Pattern = pattern;
Dale Johannesen666323e2007-10-10 01:01:31 +0000699
700 let Inst{6} = 0;
701 let Inst{7-14} = FM;
702 let Inst{15} = 0;
Ulrich Weiganda82389b2012-11-13 19:19:46 +0000703 let Inst{16-20} = rT;
Dale Johannesen666323e2007-10-10 01:01:31 +0000704 let Inst{21-30} = xo;
705 let Inst{31} = RC;
706}
707
Chris Lattneraeadac82006-12-06 20:02:54 +0000708// 1.7.10 XS-Form - SRADI.
Evan Cheng94b5a802007-07-19 01:14:50 +0000709class XSForm_1<bits<6> opcode, bits<9> xo, dag OOL, dag IOL, string asmstr,
Chris Lattnera2af3f42006-06-27 20:07:26 +0000710 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000711 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000712 bits<5> A;
Chris Lattner9472eb82006-12-06 21:35:10 +0000713 bits<5> RS;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000714 bits<6> SH;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000715
Chris Lattnerf9172e12005-04-19 05:15:18 +0000716 bit RC = 0; // set by isDOT
Chris Lattnera2af3f42006-06-27 20:07:26 +0000717 let Pattern = pattern;
Chris Lattnerf9172e12005-04-19 05:15:18 +0000718
Nate Begeman765cb5f2004-08-13 02:19:26 +0000719 let Inst{6-10} = RS;
720 let Inst{11-15} = A;
Chris Lattneraeadac82006-12-06 20:02:54 +0000721 let Inst{16-20} = SH{4,3,2,1,0};
Nate Begeman765cb5f2004-08-13 02:19:26 +0000722 let Inst{21-29} = xo;
Chris Lattneraeadac82006-12-06 20:02:54 +0000723 let Inst{30} = SH{5};
Chris Lattnerf9172e12005-04-19 05:15:18 +0000724 let Inst{31} = RC;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000725}
726
Misha Brukman5295e1d2004-08-09 17:24:04 +0000727// 1.7.11 XO-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000728class XOForm_1<bits<6> opcode, bits<9> xo, bit oe, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000729 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000730 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000731 bits<5> RT;
732 bits<5> RA;
733 bits<5> RB;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000734
Chris Lattner3a1002d2005-09-02 21:18:00 +0000735 let Pattern = pattern;
736
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000737 bit RC = 0; // set by isDOT
738
Misha Brukman5295e1d2004-08-09 17:24:04 +0000739 let Inst{6-10} = RT;
740 let Inst{11-15} = RA;
741 let Inst{16-20} = RB;
742 let Inst{21} = oe;
743 let Inst{22-30} = xo;
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000744 let Inst{31} = RC;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000745}
746
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000747class XOForm_3<bits<6> opcode, bits<9> xo, bit oe,
Evan Cheng94b5a802007-07-19 01:14:50 +0000748 dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
749 : XOForm_1<opcode, xo, oe, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000750 let RB = 0;
751}
752
753// 1.7.12 A-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000754class AForm_1<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000755 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000756 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000757 bits<5> FRT;
758 bits<5> FRA;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000759 bits<5> FRC;
Chris Lattnerda76c162004-11-25 04:11:07 +0000760 bits<5> FRB;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000761
Chris Lattner027a2672005-09-29 23:34:24 +0000762 let Pattern = pattern;
763
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000764 bit RC = 0; // set by isDOT
765
Misha Brukman5295e1d2004-08-09 17:24:04 +0000766 let Inst{6-10} = FRT;
767 let Inst{11-15} = FRA;
768 let Inst{16-20} = FRB;
769 let Inst{21-25} = FRC;
770 let Inst{26-30} = xo;
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000771 let Inst{31} = RC;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000772}
773
Evan Cheng94b5a802007-07-19 01:14:50 +0000774class AForm_2<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000775 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000776 : AForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000777 let FRC = 0;
778}
779
Evan Cheng94b5a802007-07-19 01:14:50 +0000780class AForm_3<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000781 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000782 : AForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000783 let FRB = 0;
784}
785
Ulrich Weigand84ee76a2012-11-13 19:14:19 +0000786class AForm_4<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
787 InstrItinClass itin, list<dag> pattern>
788 : I<opcode, OOL, IOL, asmstr, itin> {
789 bits<5> RT;
790 bits<5> RA;
791 bits<5> RB;
Ulrich Weigand4749b1e2013-03-26 10:54:54 +0000792 bits<5> COND;
Ulrich Weigand84ee76a2012-11-13 19:14:19 +0000793
794 let Pattern = pattern;
795
796 let Inst{6-10} = RT;
797 let Inst{11-15} = RA;
798 let Inst{16-20} = RB;
Ulrich Weigand4749b1e2013-03-26 10:54:54 +0000799 let Inst{21-25} = COND;
Ulrich Weigand84ee76a2012-11-13 19:14:19 +0000800 let Inst{26-30} = xo;
801 let Inst{31} = 0;
802}
803
Misha Brukman5295e1d2004-08-09 17:24:04 +0000804// 1.7.13 M-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000805class MForm_1<bits<6> opcode, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000806 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000807 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000808 bits<5> RA;
Chris Lattner5f4b0e12004-11-23 19:23:32 +0000809 bits<5> RS;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000810 bits<5> RB;
811 bits<5> MB;
812 bits<5> ME;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000813
Nate Begeman9f3c26c2005-10-19 18:42:01 +0000814 let Pattern = pattern;
815
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000816 bit RC = 0; // set by isDOT
817
Misha Brukman5295e1d2004-08-09 17:24:04 +0000818 let Inst{6-10} = RS;
819 let Inst{11-15} = RA;
820 let Inst{16-20} = RB;
821 let Inst{21-25} = MB;
822 let Inst{26-30} = ME;
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000823 let Inst{31} = RC;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000824}
825
Evan Cheng94b5a802007-07-19 01:14:50 +0000826class MForm_2<bits<6> opcode, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000827 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000828 : MForm_1<opcode, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000829}
830
Nate Begeman765cb5f2004-08-13 02:19:26 +0000831// 1.7.14 MD-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000832class MDForm_1<bits<6> opcode, bits<3> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000833 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000834 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000835 bits<5> RA;
Chris Lattner077b86a2006-07-13 21:52:41 +0000836 bits<5> RS;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000837 bits<6> SH;
838 bits<6> MBE;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000839
Nate Begeman9f3c26c2005-10-19 18:42:01 +0000840 let Pattern = pattern;
841
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000842 bit RC = 0; // set by isDOT
843
Nate Begeman765cb5f2004-08-13 02:19:26 +0000844 let Inst{6-10} = RS;
845 let Inst{11-15} = RA;
Chris Lattneraeadac82006-12-06 20:02:54 +0000846 let Inst{16-20} = SH{4,3,2,1,0};
847 let Inst{21-26} = MBE{4,3,2,1,0,5};
Nate Begeman765cb5f2004-08-13 02:19:26 +0000848 let Inst{27-29} = xo;
Chris Lattnerdd57ac42006-07-12 22:08:13 +0000849 let Inst{30} = SH{5};
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000850 let Inst{31} = RC;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000851}
852
Chris Lattnerc94d9322006-04-05 22:27:14 +0000853
854
Nate Begeman8492fd32005-11-23 05:29:52 +0000855// E-1 VA-Form
Chris Lattner1738c292006-03-27 03:34:17 +0000856
857// VAForm_1 - DACB ordering.
Evan Cheng94b5a802007-07-19 01:14:50 +0000858class VAForm_1<bits<6> xo, dag OOL, dag IOL, string asmstr,
Nate Begeman8492fd32005-11-23 05:29:52 +0000859 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000860 : I<4, OOL, IOL, asmstr, itin> {
Nate Begeman8492fd32005-11-23 05:29:52 +0000861 bits<5> VD;
862 bits<5> VA;
Nate Begeman8492fd32005-11-23 05:29:52 +0000863 bits<5> VC;
Chris Lattner4e737172006-03-22 01:44:36 +0000864 bits<5> VB;
Nate Begeman11fd6b22005-11-26 22:39:34 +0000865
866 let Pattern = pattern;
Nate Begeman8492fd32005-11-23 05:29:52 +0000867
868 let Inst{6-10} = VD;
869 let Inst{11-15} = VA;
870 let Inst{16-20} = VB;
871 let Inst{21-25} = VC;
872 let Inst{26-31} = xo;
873}
874
Chris Lattner1738c292006-03-27 03:34:17 +0000875// VAForm_1a - DABC ordering.
Evan Cheng94b5a802007-07-19 01:14:50 +0000876class VAForm_1a<bits<6> xo, dag OOL, dag IOL, string asmstr,
Chris Lattner1738c292006-03-27 03:34:17 +0000877 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000878 : I<4, OOL, IOL, asmstr, itin> {
Chris Lattner1738c292006-03-27 03:34:17 +0000879 bits<5> VD;
880 bits<5> VA;
881 bits<5> VB;
882 bits<5> VC;
883
884 let Pattern = pattern;
885
886 let Inst{6-10} = VD;
887 let Inst{11-15} = VA;
888 let Inst{16-20} = VB;
889 let Inst{21-25} = VC;
890 let Inst{26-31} = xo;
891}
892
Evan Cheng94b5a802007-07-19 01:14:50 +0000893class VAForm_2<bits<6> xo, dag OOL, dag IOL, string asmstr,
Chris Lattner53e07de2006-03-26 00:41:48 +0000894 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000895 : I<4, OOL, IOL, asmstr, itin> {
Chris Lattner53e07de2006-03-26 00:41:48 +0000896 bits<5> VD;
897 bits<5> VA;
898 bits<5> VB;
899 bits<4> SH;
900
901 let Pattern = pattern;
902
903 let Inst{6-10} = VD;
904 let Inst{11-15} = VA;
905 let Inst{16-20} = VB;
906 let Inst{21} = 0;
907 let Inst{22-25} = SH;
908 let Inst{26-31} = xo;
909}
910
Nate Begeman8492fd32005-11-23 05:29:52 +0000911// E-2 VX-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000912class VXForm_1<bits<11> xo, dag OOL, dag IOL, string asmstr,
Nate Begeman8492fd32005-11-23 05:29:52 +0000913 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000914 : I<4, OOL, IOL, asmstr, itin> {
Nate Begeman8492fd32005-11-23 05:29:52 +0000915 bits<5> VD;
916 bits<5> VA;
917 bits<5> VB;
918
Nate Begeman11fd6b22005-11-26 22:39:34 +0000919 let Pattern = pattern;
920
Nate Begeman8492fd32005-11-23 05:29:52 +0000921 let Inst{6-10} = VD;
922 let Inst{11-15} = VA;
923 let Inst{16-20} = VB;
924 let Inst{21-31} = xo;
925}
926
Evan Cheng94b5a802007-07-19 01:14:50 +0000927class VXForm_setzero<bits<11> xo, dag OOL, dag IOL, string asmstr,
Nate Begeman40f081d2005-12-14 00:34:09 +0000928 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000929 : VXForm_1<xo, OOL, IOL, asmstr, itin, pattern> {
Nate Begeman40f081d2005-12-14 00:34:09 +0000930 let VA = VD;
931 let VB = VD;
932}
933
934
Evan Cheng94b5a802007-07-19 01:14:50 +0000935class VXForm_2<bits<11> xo, dag OOL, dag IOL, string asmstr,
Nate Begemanc1381182005-11-29 08:04:45 +0000936 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000937 : I<4, OOL, IOL, asmstr, itin> {
Nate Begemanc1381182005-11-29 08:04:45 +0000938 bits<5> VD;
939 bits<5> VB;
940
941 let Pattern = pattern;
942
943 let Inst{6-10} = VD;
944 let Inst{11-15} = 0;
945 let Inst{16-20} = VB;
946 let Inst{21-31} = xo;
947}
948
Evan Cheng94b5a802007-07-19 01:14:50 +0000949class VXForm_3<bits<11> xo, dag OOL, dag IOL, string asmstr,
Chris Lattnerdf59d532006-03-27 03:28:57 +0000950 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000951 : I<4, OOL, IOL, asmstr, itin> {
Chris Lattnerdf59d532006-03-27 03:28:57 +0000952 bits<5> VD;
953 bits<5> IMM;
954
955 let Pattern = pattern;
956
957 let Inst{6-10} = VD;
958 let Inst{11-15} = IMM;
959 let Inst{16-20} = 0;
960 let Inst{21-31} = xo;
961}
962
Chris Lattner5a528e52006-04-05 00:03:57 +0000963/// VXForm_4 - VX instructions with "VD,0,0" register fields, like mfvscr.
Evan Cheng94b5a802007-07-19 01:14:50 +0000964class VXForm_4<bits<11> xo, dag OOL, dag IOL, string asmstr,
Chris Lattner5a528e52006-04-05 00:03:57 +0000965 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000966 : I<4, OOL, IOL, asmstr, itin> {
Chris Lattner5a528e52006-04-05 00:03:57 +0000967 bits<5> VD;
968
969 let Pattern = pattern;
970
971 let Inst{6-10} = VD;
972 let Inst{11-15} = 0;
973 let Inst{16-20} = 0;
974 let Inst{21-31} = xo;
975}
976
977/// VXForm_5 - VX instructions with "0,0,VB" register fields, like mtvscr.
Evan Cheng94b5a802007-07-19 01:14:50 +0000978class VXForm_5<bits<11> xo, dag OOL, dag IOL, string asmstr,
Chris Lattner5a528e52006-04-05 00:03:57 +0000979 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000980 : I<4, OOL, IOL, asmstr, itin> {
Chris Lattner5a528e52006-04-05 00:03:57 +0000981 bits<5> VB;
982
983 let Pattern = pattern;
984
985 let Inst{6-10} = 0;
986 let Inst{11-15} = 0;
987 let Inst{16-20} = VB;
988 let Inst{21-31} = xo;
989}
Chris Lattnerdf59d532006-03-27 03:28:57 +0000990
Nate Begeman8492fd32005-11-23 05:29:52 +0000991// E-4 VXR-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000992class VXRForm_1<bits<10> xo, dag OOL, dag IOL, string asmstr,
Nate Begeman8492fd32005-11-23 05:29:52 +0000993 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000994 : I<4, OOL, IOL, asmstr, itin> {
Nate Begeman8492fd32005-11-23 05:29:52 +0000995 bits<5> VD;
996 bits<5> VA;
997 bits<5> VB;
Chris Lattner793cbcb2006-03-26 04:57:17 +0000998 bit RC = 0;
Nate Begeman8492fd32005-11-23 05:29:52 +0000999
Nate Begeman11fd6b22005-11-26 22:39:34 +00001000 let Pattern = pattern;
1001
Nate Begeman8492fd32005-11-23 05:29:52 +00001002 let Inst{6-10} = VD;
1003 let Inst{11-15} = VA;
1004 let Inst{16-20} = VB;
Chris Lattner793cbcb2006-03-26 04:57:17 +00001005 let Inst{21} = RC;
Nate Begeman8492fd32005-11-23 05:29:52 +00001006 let Inst{22-31} = xo;
1007}
1008
Misha Brukman6b21bde2004-08-02 21:56:35 +00001009//===----------------------------------------------------------------------===//
Evan Cheng94b5a802007-07-19 01:14:50 +00001010class Pseudo<dag OOL, dag IOL, string asmstr, list<dag> pattern>
1011 : I<0, OOL, IOL, asmstr, NoItinerary> {
Ulrich Weigandbbfb0c52013-03-26 10:57:16 +00001012 let isCodeGenOnly = 1;
Nate Begeman61738782004-09-02 08:13:00 +00001013 let PPC64 = 0;
Chris Lattnerb439dad2005-10-25 20:58:43 +00001014 let Pattern = pattern;
Nate Begeman61738782004-09-02 08:13:00 +00001015 let Inst{31-0} = 0;
Misha Brukmancd4f51b2004-08-02 16:54:54 +00001016}