blob: 36f193be993698c03e4773aa78f158550939526e [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 = "";
Hal Finkel22771962013-04-12 18:17:38 +000041
42 // For cases where multiple instruction definitions really represent the
43 // same underlying instruction but with one definition for 64-bit arguments
44 // and one for 32-bit arguments, this bit breaks the degeneracy between
45 // the two forms and allows TableGen to generate mapping tables.
Hal Finkel654d43b2013-04-12 02:18:09 +000046 bit Interpretation64Bit = 0;
Misha Brukmancd4f51b2004-08-02 16:54:54 +000047}
48
Chris Lattner7579cfb2006-03-13 05:15:10 +000049class PPC970_DGroup_First { bits<1> PPC970_First = 1; }
50class PPC970_DGroup_Single { bits<1> PPC970_Single = 1; }
51class PPC970_DGroup_Cracked { bits<1> PPC970_Cracked = 1; }
Chris Lattner51348c52006-03-12 09:13:49 +000052class PPC970_MicroCode;
53
54class PPC970_Unit_Pseudo { bits<3> PPC970_Unit = 0; }
55class PPC970_Unit_FXU { bits<3> PPC970_Unit = 1; }
56class PPC970_Unit_LSU { bits<3> PPC970_Unit = 2; }
57class PPC970_Unit_FPU { bits<3> PPC970_Unit = 3; }
58class PPC970_Unit_CRU { bits<3> PPC970_Unit = 4; }
59class PPC970_Unit_VALU { bits<3> PPC970_Unit = 5; }
60class PPC970_Unit_VPERM { bits<3> PPC970_Unit = 6; }
61class PPC970_Unit_BRU { bits<3> PPC970_Unit = 7; }
62
Hal Finkel51861b42012-03-31 14:45:15 +000063// Two joined instructions; used to emit two adjacent instructions as one.
64// The itinerary from the first instruction is used for scheduling and
65// classification.
66class I2<bits<6> opcode1, bits<6> opcode2, dag OOL, dag IOL, string asmstr,
67 InstrItinClass itin>
68 : Instruction {
69 field bits<64> Inst;
70
71 bit PPC64 = 0; // Default value, override with isPPC64
72
73 let Namespace = "PPC";
74 let Inst{0-5} = opcode1;
75 let Inst{32-37} = opcode2;
76 let OutOperandList = OOL;
77 let InOperandList = IOL;
78 let AsmString = asmstr;
79 let Itinerary = itin;
80
81 bits<1> PPC970_First = 0;
82 bits<1> PPC970_Single = 0;
83 bits<1> PPC970_Cracked = 0;
84 bits<3> PPC970_Unit = 0;
85
86 /// These fields correspond to the fields in PPCInstrInfo.h. Any changes to
87 /// these must be reflected there! See comments there for what these are.
88 let TSFlags{0} = PPC970_First;
89 let TSFlags{1} = PPC970_Single;
90 let TSFlags{2} = PPC970_Cracked;
91 let TSFlags{5-3} = PPC970_Unit;
Hal Finkel654d43b2013-04-12 02:18:09 +000092
93 // Fields used for relation models.
94 string BaseName = "";
95 bit Interpretation64Bit = 0;
Hal Finkel51861b42012-03-31 14:45:15 +000096}
Chris Lattner51348c52006-03-12 09:13:49 +000097
Misha Brukman5295e1d2004-08-09 17:24:04 +000098// 1.7.1 I-Form
Evan Cheng94b5a802007-07-19 01:14:50 +000099class IForm<bits<6> opcode, bit aa, bit lk, dag OOL, dag IOL, string asmstr,
Chris Lattnerd9d18af2005-12-04 18:42:54 +0000100 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000101 : I<opcode, OOL, IOL, asmstr, itin> {
Chris Lattnerd9d18af2005-12-04 18:42:54 +0000102 let Pattern = pattern;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000103 bits<24> LI;
Misha Brukman6b21bde2004-08-02 21:56:35 +0000104
Misha Brukman5295e1d2004-08-09 17:24:04 +0000105 let Inst{6-29} = LI;
106 let Inst{30} = aa;
107 let Inst{31} = lk;
Misha Brukman6b21bde2004-08-02 21:56:35 +0000108}
109
Misha Brukman5295e1d2004-08-09 17:24:04 +0000110// 1.7.2 B-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000111class BForm<bits<6> opcode, bit aa, bit lk, dag OOL, dag IOL, string asmstr>
112 : I<opcode, OOL, IOL, asmstr, BrB> {
Chris Lattner33fc1d42006-11-17 23:53:28 +0000113 bits<7> BIBO; // 2 bits of BI and 5 bits of BO.
114 bits<3> CR;
115 bits<14> BD;
116
117 bits<5> BI;
118 let BI{0-1} = BIBO{5-6};
119 let BI{2-4} = CR{0-2};
120
121 let Inst{6-10} = BIBO{4-0};
122 let Inst{11-15} = BI;
123 let Inst{16-29} = BD;
124 let Inst{30} = aa;
125 let Inst{31} = lk;
126}
127
Ulrich Weigand01177182012-11-13 19:15:52 +0000128class BForm_1<bits<6> opcode, bits<5> bo, bit aa, bit lk, dag OOL, dag IOL,
129 string asmstr>
130 : BForm<opcode, aa, lk, OOL, IOL, asmstr> {
131 let BIBO{4-0} = bo;
132 let BIBO{6-5} = 0;
133 let CR = 0;
134}
Chris Lattner33fc1d42006-11-17 23:53:28 +0000135
Hal Finkel756810f2013-03-21 21:37:52 +0000136class BForm_2<bits<6> opcode, bits<5> bo, bits<5> bi, bit aa, bit lk,
137 dag OOL, dag IOL, string asmstr>
138 : I<opcode, OOL, IOL, asmstr, BrB> {
139 bits<14> BD;
140
141 let Inst{6-10} = bo;
142 let Inst{11-15} = bi;
143 let Inst{16-29} = BD;
144 let Inst{30} = aa;
145 let Inst{31} = lk;
146}
147
Misha Brukman5295e1d2004-08-09 17:24:04 +0000148// 1.7.4 D-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000149class DForm_base<bits<6> opcode, dag OOL, dag IOL, string asmstr,
150 InstrItinClass itin, list<dag> pattern>
151 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000152 bits<5> A;
153 bits<5> B;
154 bits<16> C;
Nate Begemanade6f9a2005-12-09 23:54:18 +0000155
156 let Pattern = pattern;
Misha Brukman6b21bde2004-08-02 21:56:35 +0000157
Misha Brukman6b21bde2004-08-02 21:56:35 +0000158 let Inst{6-10} = A;
159 let Inst{11-15} = B;
160 let Inst{16-31} = C;
161}
162
Evan Cheng94b5a802007-07-19 01:14:50 +0000163class DForm_1<bits<6> opcode, dag OOL, dag IOL, string asmstr,
164 InstrItinClass itin, list<dag> pattern>
165 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman15b0fb52004-10-23 06:08:38 +0000166 bits<5> A;
Chris Lattnerefacb9e2010-11-15 08:22:03 +0000167 bits<21> Addr;
168
169 let Pattern = pattern;
170
171 let Inst{6-10} = A;
172 let Inst{11-15} = Addr{20-16}; // Base Reg
173 let Inst{16-31} = Addr{15-0}; // Displacement
174}
175
176class DForm_1a<bits<6> opcode, dag OOL, dag IOL, string asmstr,
177 InstrItinClass itin, list<dag> pattern>
178 : I<opcode, OOL, IOL, asmstr, itin> {
179 bits<5> A;
Misha Brukman15b0fb52004-10-23 06:08:38 +0000180 bits<16> C;
181 bits<5> B;
Nate Begemanade6f9a2005-12-09 23:54:18 +0000182
183 let Pattern = pattern;
Misha Brukman15b0fb52004-10-23 06:08:38 +0000184
Misha Brukman15b0fb52004-10-23 06:08:38 +0000185 let Inst{6-10} = A;
186 let Inst{11-15} = B;
187 let Inst{16-31} = C;
Misha Brukman6b21bde2004-08-02 21:56:35 +0000188}
189
Chris Lattnerefacb9e2010-11-15 08:22:03 +0000190
Evan Cheng94b5a802007-07-19 01:14:50 +0000191class DForm_2<bits<6> opcode, dag OOL, dag IOL, string asmstr,
192 InstrItinClass itin, list<dag> pattern>
Hal Finkel654d43b2013-04-12 02:18:09 +0000193 : DForm_base<opcode, OOL, IOL, asmstr, itin, pattern> {
194
195 // Even though ADDICo does not really have an RC bit, provide
196 // the declaration of one here so that isDOT has something to set.
197 bit RC = 0;
198}
Misha Brukman6b21bde2004-08-02 21:56:35 +0000199
Evan Cheng94b5a802007-07-19 01:14:50 +0000200class DForm_2_r0<bits<6> opcode, dag OOL, dag IOL, string asmstr,
201 InstrItinClass itin, list<dag> pattern>
202 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000203 bits<5> A;
204 bits<16> B;
Nate Begeman4bfceb12004-09-04 05:00:00 +0000205
Chris Lattner2d8032b2005-09-08 17:33:10 +0000206 let Pattern = pattern;
207
Nate Begeman4bfceb12004-09-04 05:00:00 +0000208 let Inst{6-10} = A;
209 let Inst{11-15} = 0;
210 let Inst{16-31} = B;
Misha Brukman6b21bde2004-08-02 21:56:35 +0000211}
212
Evan Cheng94b5a802007-07-19 01:14:50 +0000213class DForm_4<bits<6> opcode, dag OOL, dag IOL, string asmstr,
214 InstrItinClass itin, list<dag> pattern>
215 : I<opcode, OOL, IOL, asmstr, itin> {
Chris Lattner022e2712004-11-24 02:15:41 +0000216 bits<5> B;
217 bits<5> A;
218 bits<16> C;
219
Chris Lattner76cb0062005-09-08 17:40:49 +0000220 let Pattern = pattern;
221
Chris Lattner022e2712004-11-24 02:15:41 +0000222 let Inst{6-10} = A;
223 let Inst{11-15} = B;
224 let Inst{16-31} = C;
225}
Nate Begeman4bfceb12004-09-04 05:00:00 +0000226
Evan Cheng94b5a802007-07-19 01:14:50 +0000227class DForm_4_zero<bits<6> opcode, dag OOL, dag IOL, string asmstr,
228 InstrItinClass itin, list<dag> pattern>
229 : DForm_1<opcode, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000230 let A = 0;
Chris Lattnerefacb9e2010-11-15 08:22:03 +0000231 let Addr = 0;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000232}
233
Hal Finkel51861b42012-03-31 14:45:15 +0000234class IForm_and_DForm_1<bits<6> opcode1, bit aa, bit lk, bits<6> opcode2,
235 dag OOL, dag IOL, string asmstr,
236 InstrItinClass itin, list<dag> pattern>
237 : I2<opcode1, opcode2, OOL, IOL, asmstr, itin> {
238 bits<5> A;
239 bits<21> Addr;
240
241 let Pattern = pattern;
242 bits<24> LI;
243
244 let Inst{6-29} = LI;
245 let Inst{30} = aa;
246 let Inst{31} = lk;
247
248 let Inst{38-42} = A;
249 let Inst{43-47} = Addr{20-16}; // Base Reg
250 let Inst{48-63} = Addr{15-0}; // Displacement
251}
252
253// This is used to emit BL8+NOP.
254class IForm_and_DForm_4_zero<bits<6> opcode1, bit aa, bit lk, bits<6> opcode2,
255 dag OOL, dag IOL, string asmstr,
256 InstrItinClass itin, list<dag> pattern>
257 : IForm_and_DForm_1<opcode1, aa, lk, opcode2,
258 OOL, IOL, asmstr, itin, pattern> {
259 let A = 0;
260 let Addr = 0;
261}
262
Evan Cheng94b5a802007-07-19 01:14:50 +0000263class DForm_5<bits<6> opcode, dag OOL, dag IOL, string asmstr,
264 InstrItinClass itin>
265 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000266 bits<3> BF;
267 bits<1> L;
268 bits<5> RA;
269 bits<16> I;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000270
Misha Brukman5295e1d2004-08-09 17:24:04 +0000271 let Inst{6-8} = BF;
272 let Inst{9} = 0;
273 let Inst{10} = L;
274 let Inst{11-15} = RA;
275 let Inst{16-31} = I;
276}
277
Evan Cheng94b5a802007-07-19 01:14:50 +0000278class DForm_5_ext<bits<6> opcode, dag OOL, dag IOL, string asmstr,
279 InstrItinClass itin>
280 : DForm_5<opcode, OOL, IOL, asmstr, itin> {
Chris Lattnerb2367e32005-04-19 04:59:28 +0000281 let L = PPC64;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000282}
283
Evan Cheng94b5a802007-07-19 01:14:50 +0000284class DForm_6<bits<6> opcode, dag OOL, dag IOL, string asmstr,
285 InstrItinClass itin>
286 : DForm_5<opcode, OOL, IOL, asmstr, itin>;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000287
Evan Cheng94b5a802007-07-19 01:14:50 +0000288class DForm_6_ext<bits<6> opcode, dag OOL, dag IOL, string asmstr,
289 InstrItinClass itin>
290 : DForm_6<opcode, OOL, IOL, asmstr, itin> {
Chris Lattnerb2367e32005-04-19 04:59:28 +0000291 let L = PPC64;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000292}
293
Misha Brukman5295e1d2004-08-09 17:24:04 +0000294
Misha Brukman28beda92004-08-11 15:54:36 +0000295// 1.7.5 DS-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000296class DSForm_1<bits<6> opcode, bits<2> xo, dag OOL, dag IOL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000297 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000298 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000299 bits<5> RST;
Chris Lattner8f4444d2010-11-15 08:02:41 +0000300 bits<19> DS_RA;
Misha Brukman28beda92004-08-11 15:54:36 +0000301
Nate Begemanade6f9a2005-12-09 23:54:18 +0000302 let Pattern = pattern;
303
Misha Brukman28beda92004-08-11 15:54:36 +0000304 let Inst{6-10} = RST;
Chris Lattner8f4444d2010-11-15 08:02:41 +0000305 let Inst{11-15} = DS_RA{18-14}; // Register #
306 let Inst{16-29} = DS_RA{13-0}; // Displacement.
Misha Brukman28beda92004-08-11 15:54:36 +0000307 let Inst{30-31} = xo;
308}
309
Chris Lattner8f4444d2010-11-15 08:02:41 +0000310class DSForm_1a<bits<6> opcode, bits<2> xo, dag OOL, dag IOL, string asmstr,
311 InstrItinClass itin, list<dag> pattern>
312 : I<opcode, OOL, IOL, asmstr, itin> {
313 bits<5> RST;
314 bits<14> DS;
315 bits<5> RA;
316
317 let Pattern = pattern;
318
319 let Inst{6-10} = RST;
320 let Inst{11-15} = RA;
321 let Inst{16-29} = DS;
322 let Inst{30-31} = xo;
323}
324
Misha Brukman5295e1d2004-08-09 17:24:04 +0000325// 1.7.6 X-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000326class XForm_base_r3xo<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000327 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000328 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000329 bits<5> RST;
330 bits<5> A;
331 bits<5> B;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000332
Nate Begemanade6f9a2005-12-09 23:54:18 +0000333 let Pattern = pattern;
334
Chris Lattnerf9172e12005-04-19 05:15:18 +0000335 bit RC = 0; // set by isDOT
336
Misha Brukman28beda92004-08-11 15:54:36 +0000337 let Inst{6-10} = RST;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000338 let Inst{11-15} = A;
339 let Inst{16-20} = B;
340 let Inst{21-30} = xo;
Chris Lattnerf9172e12005-04-19 05:15:18 +0000341 let Inst{31} = RC;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000342}
343
Chris Lattner130888ad2004-11-24 03:52:02 +0000344// This is the same as XForm_base_r3xo, but the first two operands are swapped
345// when code is emitted.
346class XForm_base_r3xo_swapped
Evan Cheng94b5a802007-07-19 01:14:50 +0000347 <bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000348 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000349 : I<opcode, OOL, IOL, asmstr, itin> {
Chris Lattner130888ad2004-11-24 03:52:02 +0000350 bits<5> A;
351 bits<5> RST;
352 bits<5> B;
353
Chris Lattnerf9172e12005-04-19 05:15:18 +0000354 bit RC = 0; // set by isDOT
355
Chris Lattner130888ad2004-11-24 03:52:02 +0000356 let Inst{6-10} = RST;
357 let Inst{11-15} = A;
358 let Inst{16-20} = B;
359 let Inst{21-30} = xo;
Chris Lattnerf9172e12005-04-19 05:15:18 +0000360 let Inst{31} = RC;
Chris Lattner130888ad2004-11-24 03:52:02 +0000361}
362
Nate Begeman765cb5f2004-08-13 02:19:26 +0000363
Evan Cheng94b5a802007-07-19 01:14:50 +0000364class XForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000365 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000366 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern>;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000367
Evan Cheng94b5a802007-07-19 01:14:50 +0000368class XForm_6<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000369 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000370 : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> {
Chris Lattnerdcbb5612005-09-02 22:35:53 +0000371 let Pattern = pattern;
372}
Misha Brukman5295e1d2004-08-09 17:24:04 +0000373
Evan Cheng94b5a802007-07-19 01:14:50 +0000374class XForm_8<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000375 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000376 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern>;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000377
Evan Cheng94b5a802007-07-19 01:14:50 +0000378class XForm_10<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000379 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000380 : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> {
Jim Laskey74ab9962005-10-19 19:51:16 +0000381 let Pattern = pattern;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000382}
383
Evan Cheng94b5a802007-07-19 01:14:50 +0000384class XForm_11<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000385 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000386 : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000387 let B = 0;
Chris Lattnerdcbb5612005-09-02 22:35:53 +0000388 let Pattern = pattern;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000389}
390
Evan Cheng94b5a802007-07-19 01:14:50 +0000391class XForm_16<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000392 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000393 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000394 bits<3> BF;
395 bits<1> L;
396 bits<5> RA;
397 bits<5> RB;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000398
Misha Brukman5295e1d2004-08-09 17:24:04 +0000399 let Inst{6-8} = BF;
400 let Inst{9} = 0;
401 let Inst{10} = L;
402 let Inst{11-15} = RA;
403 let Inst{16-20} = RB;
404 let Inst{21-30} = xo;
405 let Inst{31} = 0;
406}
407
Evan Cheng94b5a802007-07-19 01:14:50 +0000408class XForm_16_ext<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000409 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000410 : XForm_16<opcode, xo, OOL, IOL, asmstr, itin> {
Chris Lattner15709c22005-04-19 04:51:30 +0000411 let L = PPC64;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000412}
413
Evan Cheng94b5a802007-07-19 01:14:50 +0000414class XForm_17<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000415 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000416 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000417 bits<3> BF;
418 bits<5> FRA;
419 bits<5> FRB;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000420
Misha Brukman5295e1d2004-08-09 17:24:04 +0000421 let Inst{6-8} = BF;
422 let Inst{9-10} = 0;
423 let Inst{11-15} = FRA;
424 let Inst{16-20} = FRB;
425 let Inst{21-30} = xo;
426 let Inst{31} = 0;
427}
428
Nate Begemanf69d13b2008-08-11 17:36:31 +0000429class XForm_24<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
430 InstrItinClass itin, list<dag> pattern>
431 : I<opcode, OOL, IOL, asmstr, itin> {
432 let Pattern = pattern;
433 let Inst{6-10} = 31;
434 let Inst{11-15} = 0;
435 let Inst{16-20} = 0;
436 let Inst{21-30} = xo;
437 let Inst{31} = 0;
438}
439
Dale Johannesened86f682008-08-22 17:20:54 +0000440class XForm_24_sync<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
441 string asmstr, InstrItinClass itin, list<dag> pattern>
442 : I<opcode, OOL, IOL, asmstr, itin> {
443 let Pattern = pattern;
444 let Inst{6-10} = 0;
445 let Inst{11-15} = 0;
446 let Inst{16-20} = 0;
447 let Inst{21-30} = xo;
448 let Inst{31} = 0;
449}
450
Evan Cheng94b5a802007-07-19 01:14:50 +0000451class XForm_25<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +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}
455
Evan Cheng94b5a802007-07-19 01:14:50 +0000456class XForm_26<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000457 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000458 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000459 let A = 0;
460}
461
Evan Cheng94b5a802007-07-19 01:14:50 +0000462class XForm_28<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000463 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000464 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000465}
466
Dale Johannesen666323e2007-10-10 01:01:31 +0000467// This is used for MFFS, MTFSB0, MTFSB1. 42 is arbitrary; this series of
468// numbers presumably relates to some document, but I haven't found it.
469class XForm_42<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
470 InstrItinClass itin, list<dag> pattern>
471 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
472 let Pattern = pattern;
473
474 bit RC = 0; // set by isDOT
475
476 let Inst{6-10} = RST;
477 let Inst{11-20} = 0;
478 let Inst{21-30} = xo;
479 let Inst{31} = RC;
480}
481class XForm_43<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
482 InstrItinClass itin, list<dag> pattern>
483 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
484 let Pattern = pattern;
485 bits<5> FM;
486
487 bit RC = 0; // set by isDOT
488
489 let Inst{6-10} = FM;
490 let Inst{11-20} = 0;
491 let Inst{21-30} = xo;
492 let Inst{31} = RC;
493}
494
Chris Lattnerc8587d42006-06-06 21:29:23 +0000495// DCB_Form - Form X instruction, used for dcb* instructions.
Evan Cheng94b5a802007-07-19 01:14:50 +0000496class DCB_Form<bits<10> xo, bits<5> immfield, dag OOL, dag IOL, string asmstr,
Chris Lattnerc8587d42006-06-06 21:29:23 +0000497 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000498 : I<31, OOL, IOL, asmstr, itin> {
Chris Lattnerc8587d42006-06-06 21:29:23 +0000499 bits<5> A;
500 bits<5> B;
501
502 let Pattern = pattern;
503
504 let Inst{6-10} = immfield;
505 let Inst{11-15} = A;
506 let Inst{16-20} = B;
507 let Inst{21-30} = xo;
508 let Inst{31} = 0;
509}
510
511
Chris Lattnerc94d9322006-04-05 22:27:14 +0000512// DSS_Form - Form X instruction, used for altivec dss* instructions.
Evan Cheng94b5a802007-07-19 01:14:50 +0000513class DSS_Form<bits<10> xo, dag OOL, dag IOL, string asmstr,
Chris Lattnerc94d9322006-04-05 22:27:14 +0000514 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000515 : I<31, OOL, IOL, asmstr, itin> {
Chris Lattnerc94d9322006-04-05 22:27:14 +0000516 bits<1> T;
517 bits<2> STRM;
518 bits<5> A;
519 bits<5> B;
520
521 let Pattern = pattern;
522
523 let Inst{6} = T;
524 let Inst{7-8} = 0;
525 let Inst{9-10} = STRM;
526 let Inst{11-15} = A;
527 let Inst{16-20} = B;
528 let Inst{21-30} = xo;
529 let Inst{31} = 0;
530}
531
Misha Brukman5295e1d2004-08-09 17:24:04 +0000532// 1.7.7 XL-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000533class XLForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Chris Lattnerb9bd34f2007-02-25 05:07:49 +0000534 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000535 : I<opcode, OOL, IOL, asmstr, itin> {
Chris Lattnerb9bd34f2007-02-25 05:07:49 +0000536 bits<5> CRD;
537 bits<5> CRA;
538 bits<5> CRB;
Nate Begeman65a82c52005-04-14 03:20:38 +0000539
Chris Lattnerb9bd34f2007-02-25 05:07:49 +0000540 let Pattern = pattern;
541
542 let Inst{6-10} = CRD;
543 let Inst{11-15} = CRA;
544 let Inst{16-20} = CRB;
545 let Inst{21-30} = xo;
546 let Inst{31} = 0;
547}
548
Evan Cheng94b5a802007-07-19 01:14:50 +0000549class XLForm_1_ext<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Chris Lattnerb9bd34f2007-02-25 05:07:49 +0000550 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000551 : I<opcode, OOL, IOL, asmstr, itin> {
Chris Lattnerb9bd34f2007-02-25 05:07:49 +0000552 bits<5> CRD;
553
554 let Pattern = pattern;
555
556 let Inst{6-10} = CRD;
557 let Inst{11-15} = CRD;
558 let Inst{16-20} = CRD;
Nate Begeman65a82c52005-04-14 03:20:38 +0000559 let Inst{21-30} = xo;
560 let Inst{31} = 0;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000561}
562
Evan Cheng94b5a802007-07-19 01:14:50 +0000563class XLForm_2<bits<6> opcode, bits<10> xo, bit lk, dag OOL, dag IOL, string asmstr,
Nate Begemanb11b8e42005-12-20 00:26:01 +0000564 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000565 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000566 bits<5> BO;
567 bits<5> BI;
568 bits<2> BH;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000569
Nate Begemanb11b8e42005-12-20 00:26:01 +0000570 let Pattern = pattern;
571
Misha Brukman5295e1d2004-08-09 17:24:04 +0000572 let Inst{6-10} = BO;
573 let Inst{11-15} = BI;
574 let Inst{16-18} = 0;
575 let Inst{19-20} = BH;
576 let Inst{21-30} = xo;
577 let Inst{31} = lk;
578}
579
Chris Lattner29597892006-11-04 05:42:48 +0000580class XLForm_2_br<bits<6> opcode, bits<10> xo, bit lk,
Evan Cheng94b5a802007-07-19 01:14:50 +0000581 dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
582 : XLForm_2<opcode, xo, lk, OOL, IOL, asmstr, itin, pattern> {
Chris Lattner29597892006-11-04 05:42:48 +0000583 bits<7> BIBO; // 2 bits of BI and 5 bits of BO.
584 bits<3> CR;
585
Hal Finkelb5aa7e52013-04-08 16:24:03 +0000586 let BO = BIBO{4-0};
587 let BI{0-1} = BIBO{5-6};
588 let BI{2-4} = CR{0-2};
Chris Lattner29597892006-11-04 05:42:48 +0000589 let BH = 0;
590}
591
592
Jim Laskey74ab9962005-10-19 19:51:16 +0000593class XLForm_2_ext<bits<6> opcode, bits<10> xo, bits<5> bo, bits<5> bi, bit lk,
Evan Cheng94b5a802007-07-19 01:14:50 +0000594 dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
595 : XLForm_2<opcode, xo, lk, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000596 let BO = bo;
597 let BI = bi;
598 let BH = 0;
599}
600
Evan Cheng94b5a802007-07-19 01:14:50 +0000601class XLForm_3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000602 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000603 : I<opcode, OOL, IOL, asmstr, itin> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000604 bits<3> BF;
605 bits<3> BFA;
606
607 let Inst{6-8} = BF;
608 let Inst{9-10} = 0;
609 let Inst{11-13} = BFA;
610 let Inst{14-15} = 0;
611 let Inst{16-20} = 0;
612 let Inst{21-30} = xo;
613 let Inst{31} = 0;
614}
615
Misha Brukman5295e1d2004-08-09 17:24:04 +0000616// 1.7.8 XFX-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000617class XFXForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000618 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000619 : I<opcode, OOL, IOL, asmstr, itin> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000620 bits<5> RT;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000621 bits<10> SPR;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000622
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000623 let Inst{6-10} = RT;
Nate Begeman048b2632005-11-29 22:42:50 +0000624 let Inst{11} = SPR{4};
625 let Inst{12} = SPR{3};
626 let Inst{13} = SPR{2};
627 let Inst{14} = SPR{1};
628 let Inst{15} = SPR{0};
629 let Inst{16} = SPR{9};
630 let Inst{17} = SPR{8};
631 let Inst{18} = SPR{7};
632 let Inst{19} = SPR{6};
633 let Inst{20} = SPR{5};
Misha Brukman5295e1d2004-08-09 17:24:04 +0000634 let Inst{21-30} = xo;
635 let Inst{31} = 0;
636}
637
Chris Lattnerd790d222005-04-19 04:40:07 +0000638class XFXForm_1_ext<bits<6> opcode, bits<10> xo, bits<10> spr,
Evan Cheng94b5a802007-07-19 01:14:50 +0000639 dag OOL, dag IOL, string asmstr, InstrItinClass itin>
640 : XFXForm_1<opcode, xo, OOL, IOL, asmstr, itin> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000641 let SPR = spr;
642}
643
Evan Cheng94b5a802007-07-19 01:14:50 +0000644class XFXForm_3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000645 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000646 : I<opcode, OOL, IOL, asmstr, itin> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000647 bits<5> RT;
648
649 let Inst{6-10} = RT;
650 let Inst{11-20} = 0;
651 let Inst{21-30} = xo;
652 let Inst{31} = 0;
653}
654
Evan Cheng94b5a802007-07-19 01:14:50 +0000655class XFXForm_5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000656 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000657 : I<opcode, OOL, IOL, asmstr, itin> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000658 bits<8> FXM;
Ulrich Weiganda82389b2012-11-13 19:19:46 +0000659 bits<5> rS;
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000660
Ulrich Weiganda82389b2012-11-13 19:19:46 +0000661 let Inst{6-10} = rS;
Nate Begeman9a838672005-08-08 20:04:52 +0000662 let Inst{11} = 0;
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000663 let Inst{12-19} = FXM;
664 let Inst{20} = 0;
665 let Inst{21-30} = xo;
666 let Inst{31} = 0;
667}
668
Evan Cheng94b5a802007-07-19 01:14:50 +0000669class XFXForm_5a<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000670 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000671 : I<opcode, OOL, IOL, asmstr, itin> {
Nate Begeman9a838672005-08-08 20:04:52 +0000672 bits<5> ST;
673 bits<8> FXM;
674
675 let Inst{6-10} = ST;
676 let Inst{11} = 1;
677 let Inst{12-19} = FXM;
678 let Inst{20} = 0;
679 let Inst{21-30} = xo;
680 let Inst{31} = 0;
681}
682
Evan Cheng94b5a802007-07-19 01:14:50 +0000683class XFXForm_7<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000684 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000685 : XFXForm_1<opcode, xo, OOL, IOL, asmstr, itin>;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000686
Nate Begeman143cf942004-08-30 02:28:06 +0000687class XFXForm_7_ext<bits<6> opcode, bits<10> xo, bits<10> spr,
Evan Cheng94b5a802007-07-19 01:14:50 +0000688 dag OOL, dag IOL, string asmstr, InstrItinClass itin>
689 : XFXForm_7<opcode, xo, OOL, IOL, asmstr, itin> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000690 let SPR = spr;
691}
692
Dale Johannesen666323e2007-10-10 01:01:31 +0000693// XFL-Form - MTFSF
694// This is probably 1.7.9, but I don't have the reference that uses this
695// numbering scheme...
696class XFLForm<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Ulrich Weigand874fc622013-03-26 10:56:22 +0000697 InstrItinClass itin, list<dag>pattern>
Dale Johannesen666323e2007-10-10 01:01:31 +0000698 : I<opcode, OOL, IOL, asmstr, itin> {
699 bits<8> FM;
Ulrich Weiganda82389b2012-11-13 19:19:46 +0000700 bits<5> rT;
Dale Johannesen666323e2007-10-10 01:01:31 +0000701
702 bit RC = 0; // set by isDOT
703 let Pattern = pattern;
Dale Johannesen666323e2007-10-10 01:01:31 +0000704
705 let Inst{6} = 0;
706 let Inst{7-14} = FM;
707 let Inst{15} = 0;
Ulrich Weiganda82389b2012-11-13 19:19:46 +0000708 let Inst{16-20} = rT;
Dale Johannesen666323e2007-10-10 01:01:31 +0000709 let Inst{21-30} = xo;
710 let Inst{31} = RC;
711}
712
Chris Lattneraeadac82006-12-06 20:02:54 +0000713// 1.7.10 XS-Form - SRADI.
Evan Cheng94b5a802007-07-19 01:14:50 +0000714class XSForm_1<bits<6> opcode, bits<9> xo, dag OOL, dag IOL, string asmstr,
Chris Lattnera2af3f42006-06-27 20:07:26 +0000715 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000716 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000717 bits<5> A;
Chris Lattner9472eb82006-12-06 21:35:10 +0000718 bits<5> RS;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000719 bits<6> SH;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000720
Chris Lattnerf9172e12005-04-19 05:15:18 +0000721 bit RC = 0; // set by isDOT
Chris Lattnera2af3f42006-06-27 20:07:26 +0000722 let Pattern = pattern;
Chris Lattnerf9172e12005-04-19 05:15:18 +0000723
Nate Begeman765cb5f2004-08-13 02:19:26 +0000724 let Inst{6-10} = RS;
725 let Inst{11-15} = A;
Chris Lattneraeadac82006-12-06 20:02:54 +0000726 let Inst{16-20} = SH{4,3,2,1,0};
Nate Begeman765cb5f2004-08-13 02:19:26 +0000727 let Inst{21-29} = xo;
Chris Lattneraeadac82006-12-06 20:02:54 +0000728 let Inst{30} = SH{5};
Chris Lattnerf9172e12005-04-19 05:15:18 +0000729 let Inst{31} = RC;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000730}
731
Misha Brukman5295e1d2004-08-09 17:24:04 +0000732// 1.7.11 XO-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000733class XOForm_1<bits<6> opcode, bits<9> xo, bit oe, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000734 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000735 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000736 bits<5> RT;
737 bits<5> RA;
738 bits<5> RB;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000739
Chris Lattner3a1002d2005-09-02 21:18:00 +0000740 let Pattern = pattern;
741
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000742 bit RC = 0; // set by isDOT
743
Misha Brukman5295e1d2004-08-09 17:24:04 +0000744 let Inst{6-10} = RT;
745 let Inst{11-15} = RA;
746 let Inst{16-20} = RB;
747 let Inst{21} = oe;
748 let Inst{22-30} = xo;
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000749 let Inst{31} = RC;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000750}
751
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000752class XOForm_3<bits<6> opcode, bits<9> xo, bit oe,
Evan Cheng94b5a802007-07-19 01:14:50 +0000753 dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
754 : XOForm_1<opcode, xo, oe, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000755 let RB = 0;
756}
757
758// 1.7.12 A-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000759class AForm_1<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000760 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000761 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000762 bits<5> FRT;
763 bits<5> FRA;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000764 bits<5> FRC;
Chris Lattnerda76c162004-11-25 04:11:07 +0000765 bits<5> FRB;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000766
Chris Lattner027a2672005-09-29 23:34:24 +0000767 let Pattern = pattern;
768
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000769 bit RC = 0; // set by isDOT
770
Misha Brukman5295e1d2004-08-09 17:24:04 +0000771 let Inst{6-10} = FRT;
772 let Inst{11-15} = FRA;
773 let Inst{16-20} = FRB;
774 let Inst{21-25} = FRC;
775 let Inst{26-30} = xo;
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000776 let Inst{31} = RC;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000777}
778
Evan Cheng94b5a802007-07-19 01:14:50 +0000779class AForm_2<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000780 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000781 : AForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000782 let FRC = 0;
783}
784
Evan Cheng94b5a802007-07-19 01:14:50 +0000785class AForm_3<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000786 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000787 : AForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000788 let FRB = 0;
789}
790
Ulrich Weigand84ee76a2012-11-13 19:14:19 +0000791class AForm_4<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
792 InstrItinClass itin, list<dag> pattern>
793 : I<opcode, OOL, IOL, asmstr, itin> {
794 bits<5> RT;
795 bits<5> RA;
796 bits<5> RB;
Ulrich Weigand4749b1e2013-03-26 10:54:54 +0000797 bits<5> COND;
Ulrich Weigand84ee76a2012-11-13 19:14:19 +0000798
799 let Pattern = pattern;
800
801 let Inst{6-10} = RT;
802 let Inst{11-15} = RA;
803 let Inst{16-20} = RB;
Ulrich Weigand4749b1e2013-03-26 10:54:54 +0000804 let Inst{21-25} = COND;
Ulrich Weigand84ee76a2012-11-13 19:14:19 +0000805 let Inst{26-30} = xo;
806 let Inst{31} = 0;
807}
808
Misha Brukman5295e1d2004-08-09 17:24:04 +0000809// 1.7.13 M-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000810class MForm_1<bits<6> opcode, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000811 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000812 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000813 bits<5> RA;
Chris Lattner5f4b0e12004-11-23 19:23:32 +0000814 bits<5> RS;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000815 bits<5> RB;
816 bits<5> MB;
817 bits<5> ME;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000818
Nate Begeman9f3c26c2005-10-19 18:42:01 +0000819 let Pattern = pattern;
820
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000821 bit RC = 0; // set by isDOT
822
Misha Brukman5295e1d2004-08-09 17:24:04 +0000823 let Inst{6-10} = RS;
824 let Inst{11-15} = RA;
825 let Inst{16-20} = RB;
826 let Inst{21-25} = MB;
827 let Inst{26-30} = ME;
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000828 let Inst{31} = RC;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000829}
830
Evan Cheng94b5a802007-07-19 01:14:50 +0000831class MForm_2<bits<6> opcode, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000832 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000833 : MForm_1<opcode, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000834}
835
Nate Begeman765cb5f2004-08-13 02:19:26 +0000836// 1.7.14 MD-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000837class MDForm_1<bits<6> opcode, bits<3> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000838 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000839 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000840 bits<5> RA;
Chris Lattner077b86a2006-07-13 21:52:41 +0000841 bits<5> RS;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000842 bits<6> SH;
843 bits<6> MBE;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000844
Nate Begeman9f3c26c2005-10-19 18:42:01 +0000845 let Pattern = pattern;
846
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000847 bit RC = 0; // set by isDOT
848
Nate Begeman765cb5f2004-08-13 02:19:26 +0000849 let Inst{6-10} = RS;
850 let Inst{11-15} = RA;
Chris Lattneraeadac82006-12-06 20:02:54 +0000851 let Inst{16-20} = SH{4,3,2,1,0};
852 let Inst{21-26} = MBE{4,3,2,1,0,5};
Nate Begeman765cb5f2004-08-13 02:19:26 +0000853 let Inst{27-29} = xo;
Chris Lattnerdd57ac42006-07-12 22:08:13 +0000854 let Inst{30} = SH{5};
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000855 let Inst{31} = RC;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000856}
857
Chris Lattnerc94d9322006-04-05 22:27:14 +0000858
859
Nate Begeman8492fd32005-11-23 05:29:52 +0000860// E-1 VA-Form
Chris Lattner1738c292006-03-27 03:34:17 +0000861
862// VAForm_1 - DACB ordering.
Evan Cheng94b5a802007-07-19 01:14:50 +0000863class VAForm_1<bits<6> xo, dag OOL, dag IOL, string asmstr,
Nate Begeman8492fd32005-11-23 05:29:52 +0000864 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000865 : I<4, OOL, IOL, asmstr, itin> {
Nate Begeman8492fd32005-11-23 05:29:52 +0000866 bits<5> VD;
867 bits<5> VA;
Nate Begeman8492fd32005-11-23 05:29:52 +0000868 bits<5> VC;
Chris Lattner4e737172006-03-22 01:44:36 +0000869 bits<5> VB;
Nate Begeman11fd6b22005-11-26 22:39:34 +0000870
871 let Pattern = pattern;
Nate Begeman8492fd32005-11-23 05:29:52 +0000872
873 let Inst{6-10} = VD;
874 let Inst{11-15} = VA;
875 let Inst{16-20} = VB;
876 let Inst{21-25} = VC;
877 let Inst{26-31} = xo;
878}
879
Chris Lattner1738c292006-03-27 03:34:17 +0000880// VAForm_1a - DABC ordering.
Evan Cheng94b5a802007-07-19 01:14:50 +0000881class VAForm_1a<bits<6> xo, dag OOL, dag IOL, string asmstr,
Chris Lattner1738c292006-03-27 03:34:17 +0000882 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000883 : I<4, OOL, IOL, asmstr, itin> {
Chris Lattner1738c292006-03-27 03:34:17 +0000884 bits<5> VD;
885 bits<5> VA;
886 bits<5> VB;
887 bits<5> VC;
888
889 let Pattern = pattern;
890
891 let Inst{6-10} = VD;
892 let Inst{11-15} = VA;
893 let Inst{16-20} = VB;
894 let Inst{21-25} = VC;
895 let Inst{26-31} = xo;
896}
897
Evan Cheng94b5a802007-07-19 01:14:50 +0000898class VAForm_2<bits<6> xo, dag OOL, dag IOL, string asmstr,
Chris Lattner53e07de2006-03-26 00:41:48 +0000899 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000900 : I<4, OOL, IOL, asmstr, itin> {
Chris Lattner53e07de2006-03-26 00:41:48 +0000901 bits<5> VD;
902 bits<5> VA;
903 bits<5> VB;
904 bits<4> SH;
905
906 let Pattern = pattern;
907
908 let Inst{6-10} = VD;
909 let Inst{11-15} = VA;
910 let Inst{16-20} = VB;
911 let Inst{21} = 0;
912 let Inst{22-25} = SH;
913 let Inst{26-31} = xo;
914}
915
Nate Begeman8492fd32005-11-23 05:29:52 +0000916// E-2 VX-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000917class VXForm_1<bits<11> xo, dag OOL, dag IOL, string asmstr,
Nate Begeman8492fd32005-11-23 05:29:52 +0000918 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000919 : I<4, OOL, IOL, asmstr, itin> {
Nate Begeman8492fd32005-11-23 05:29:52 +0000920 bits<5> VD;
921 bits<5> VA;
922 bits<5> VB;
923
Nate Begeman11fd6b22005-11-26 22:39:34 +0000924 let Pattern = pattern;
925
Nate Begeman8492fd32005-11-23 05:29:52 +0000926 let Inst{6-10} = VD;
927 let Inst{11-15} = VA;
928 let Inst{16-20} = VB;
929 let Inst{21-31} = xo;
930}
931
Evan Cheng94b5a802007-07-19 01:14:50 +0000932class VXForm_setzero<bits<11> xo, dag OOL, dag IOL, string asmstr,
Nate Begeman40f081d2005-12-14 00:34:09 +0000933 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000934 : VXForm_1<xo, OOL, IOL, asmstr, itin, pattern> {
Nate Begeman40f081d2005-12-14 00:34:09 +0000935 let VA = VD;
936 let VB = VD;
937}
938
939
Evan Cheng94b5a802007-07-19 01:14:50 +0000940class VXForm_2<bits<11> xo, dag OOL, dag IOL, string asmstr,
Nate Begemanc1381182005-11-29 08:04:45 +0000941 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000942 : I<4, OOL, IOL, asmstr, itin> {
Nate Begemanc1381182005-11-29 08:04:45 +0000943 bits<5> VD;
944 bits<5> VB;
945
946 let Pattern = pattern;
947
948 let Inst{6-10} = VD;
949 let Inst{11-15} = 0;
950 let Inst{16-20} = VB;
951 let Inst{21-31} = xo;
952}
953
Evan Cheng94b5a802007-07-19 01:14:50 +0000954class VXForm_3<bits<11> xo, dag OOL, dag IOL, string asmstr,
Chris Lattnerdf59d532006-03-27 03:28:57 +0000955 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000956 : I<4, OOL, IOL, asmstr, itin> {
Chris Lattnerdf59d532006-03-27 03:28:57 +0000957 bits<5> VD;
958 bits<5> IMM;
959
960 let Pattern = pattern;
961
962 let Inst{6-10} = VD;
963 let Inst{11-15} = IMM;
964 let Inst{16-20} = 0;
965 let Inst{21-31} = xo;
966}
967
Chris Lattner5a528e52006-04-05 00:03:57 +0000968/// VXForm_4 - VX instructions with "VD,0,0" register fields, like mfvscr.
Evan Cheng94b5a802007-07-19 01:14:50 +0000969class VXForm_4<bits<11> xo, dag OOL, dag IOL, string asmstr,
Chris Lattner5a528e52006-04-05 00:03:57 +0000970 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000971 : I<4, OOL, IOL, asmstr, itin> {
Chris Lattner5a528e52006-04-05 00:03:57 +0000972 bits<5> VD;
973
974 let Pattern = pattern;
975
976 let Inst{6-10} = VD;
977 let Inst{11-15} = 0;
978 let Inst{16-20} = 0;
979 let Inst{21-31} = xo;
980}
981
982/// VXForm_5 - VX instructions with "0,0,VB" register fields, like mtvscr.
Evan Cheng94b5a802007-07-19 01:14:50 +0000983class VXForm_5<bits<11> xo, dag OOL, dag IOL, string asmstr,
Chris Lattner5a528e52006-04-05 00:03:57 +0000984 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000985 : I<4, OOL, IOL, asmstr, itin> {
Chris Lattner5a528e52006-04-05 00:03:57 +0000986 bits<5> VB;
987
988 let Pattern = pattern;
989
990 let Inst{6-10} = 0;
991 let Inst{11-15} = 0;
992 let Inst{16-20} = VB;
993 let Inst{21-31} = xo;
994}
Chris Lattnerdf59d532006-03-27 03:28:57 +0000995
Nate Begeman8492fd32005-11-23 05:29:52 +0000996// E-4 VXR-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000997class VXRForm_1<bits<10> xo, dag OOL, dag IOL, string asmstr,
Nate Begeman8492fd32005-11-23 05:29:52 +0000998 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000999 : I<4, OOL, IOL, asmstr, itin> {
Nate Begeman8492fd32005-11-23 05:29:52 +00001000 bits<5> VD;
1001 bits<5> VA;
1002 bits<5> VB;
Chris Lattner793cbcb2006-03-26 04:57:17 +00001003 bit RC = 0;
Nate Begeman8492fd32005-11-23 05:29:52 +00001004
Nate Begeman11fd6b22005-11-26 22:39:34 +00001005 let Pattern = pattern;
1006
Nate Begeman8492fd32005-11-23 05:29:52 +00001007 let Inst{6-10} = VD;
1008 let Inst{11-15} = VA;
1009 let Inst{16-20} = VB;
Chris Lattner793cbcb2006-03-26 04:57:17 +00001010 let Inst{21} = RC;
Nate Begeman8492fd32005-11-23 05:29:52 +00001011 let Inst{22-31} = xo;
1012}
1013
Misha Brukman6b21bde2004-08-02 21:56:35 +00001014//===----------------------------------------------------------------------===//
Evan Cheng94b5a802007-07-19 01:14:50 +00001015class Pseudo<dag OOL, dag IOL, string asmstr, list<dag> pattern>
1016 : I<0, OOL, IOL, asmstr, NoItinerary> {
Ulrich Weigandbbfb0c52013-03-26 10:57:16 +00001017 let isCodeGenOnly = 1;
Nate Begeman61738782004-09-02 08:13:00 +00001018 let PPC64 = 0;
Chris Lattnerb439dad2005-10-25 20:58:43 +00001019 let Pattern = pattern;
Nate Begeman61738782004-09-02 08:13:00 +00001020 let Inst{31-0} = 0;
Misha Brukmancd4f51b2004-08-02 16:54:54 +00001021}