blob: b6f4e852154f37738c09426ea16619e29533999c [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
Ulrich Weigand300b6872013-05-03 19:51:09 +0000368class XForm_1a<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
369 InstrItinClass itin, list<dag> pattern>
370 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
371 let RST = 0;
372}
373
Evan Cheng94b5a802007-07-19 01:14:50 +0000374class XForm_6<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000375 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000376 : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> {
Chris Lattnerdcbb5612005-09-02 22:35:53 +0000377 let Pattern = pattern;
378}
Misha Brukman5295e1d2004-08-09 17:24:04 +0000379
Evan Cheng94b5a802007-07-19 01:14:50 +0000380class XForm_8<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000381 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000382 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern>;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000383
Evan Cheng94b5a802007-07-19 01:14:50 +0000384class XForm_10<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> {
Jim Laskey74ab9962005-10-19 19:51:16 +0000387 let Pattern = pattern;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000388}
389
Evan Cheng94b5a802007-07-19 01:14:50 +0000390class XForm_11<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000391 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000392 : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000393 let B = 0;
Chris Lattnerdcbb5612005-09-02 22:35:53 +0000394 let Pattern = pattern;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000395}
396
Evan Cheng94b5a802007-07-19 01:14:50 +0000397class XForm_16<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000398 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000399 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000400 bits<3> BF;
401 bits<1> L;
402 bits<5> RA;
403 bits<5> RB;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000404
Misha Brukman5295e1d2004-08-09 17:24:04 +0000405 let Inst{6-8} = BF;
406 let Inst{9} = 0;
407 let Inst{10} = L;
408 let Inst{11-15} = RA;
409 let Inst{16-20} = RB;
410 let Inst{21-30} = xo;
411 let Inst{31} = 0;
412}
413
Evan Cheng94b5a802007-07-19 01:14:50 +0000414class XForm_16_ext<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 : XForm_16<opcode, xo, OOL, IOL, asmstr, itin> {
Chris Lattner15709c22005-04-19 04:51:30 +0000417 let L = PPC64;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000418}
419
Evan Cheng94b5a802007-07-19 01:14:50 +0000420class XForm_17<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000421 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000422 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000423 bits<3> BF;
424 bits<5> FRA;
425 bits<5> FRB;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000426
Misha Brukman5295e1d2004-08-09 17:24:04 +0000427 let Inst{6-8} = BF;
428 let Inst{9-10} = 0;
429 let Inst{11-15} = FRA;
430 let Inst{16-20} = FRB;
431 let Inst{21-30} = xo;
432 let Inst{31} = 0;
433}
434
Nate Begemanf69d13b2008-08-11 17:36:31 +0000435class XForm_24<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
436 InstrItinClass itin, list<dag> pattern>
437 : I<opcode, OOL, IOL, asmstr, itin> {
438 let Pattern = pattern;
439 let Inst{6-10} = 31;
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
Dale Johannesened86f682008-08-22 17:20:54 +0000446class XForm_24_sync<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
447 string asmstr, InstrItinClass itin, list<dag> pattern>
448 : I<opcode, OOL, IOL, asmstr, itin> {
449 let Pattern = pattern;
450 let Inst{6-10} = 0;
451 let Inst{11-15} = 0;
452 let Inst{16-20} = 0;
453 let Inst{21-30} = xo;
454 let Inst{31} = 0;
455}
456
Evan Cheng94b5a802007-07-19 01:14:50 +0000457class XForm_25<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
Evan Cheng94b5a802007-07-19 01:14:50 +0000462class XForm_26<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +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 let A = 0;
466}
467
Evan Cheng94b5a802007-07-19 01:14:50 +0000468class XForm_28<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000469 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000470 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000471}
472
Dale Johannesen666323e2007-10-10 01:01:31 +0000473// This is used for MFFS, MTFSB0, MTFSB1. 42 is arbitrary; this series of
474// numbers presumably relates to some document, but I haven't found it.
475class XForm_42<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
476 InstrItinClass itin, list<dag> pattern>
477 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
478 let Pattern = pattern;
479
480 bit RC = 0; // set by isDOT
481
482 let Inst{6-10} = RST;
483 let Inst{11-20} = 0;
484 let Inst{21-30} = xo;
485 let Inst{31} = RC;
486}
487class XForm_43<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
488 InstrItinClass itin, list<dag> pattern>
489 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
490 let Pattern = pattern;
491 bits<5> FM;
492
493 bit RC = 0; // set by isDOT
494
495 let Inst{6-10} = FM;
496 let Inst{11-20} = 0;
497 let Inst{21-30} = xo;
498 let Inst{31} = RC;
499}
500
Chris Lattnerc8587d42006-06-06 21:29:23 +0000501// DCB_Form - Form X instruction, used for dcb* instructions.
Evan Cheng94b5a802007-07-19 01:14:50 +0000502class DCB_Form<bits<10> xo, bits<5> immfield, dag OOL, dag IOL, string asmstr,
Chris Lattnerc8587d42006-06-06 21:29:23 +0000503 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000504 : I<31, OOL, IOL, asmstr, itin> {
Chris Lattnerc8587d42006-06-06 21:29:23 +0000505 bits<5> A;
506 bits<5> B;
507
508 let Pattern = pattern;
509
510 let Inst{6-10} = immfield;
511 let Inst{11-15} = A;
512 let Inst{16-20} = B;
513 let Inst{21-30} = xo;
514 let Inst{31} = 0;
515}
516
517
Chris Lattnerc94d9322006-04-05 22:27:14 +0000518// DSS_Form - Form X instruction, used for altivec dss* instructions.
Evan Cheng94b5a802007-07-19 01:14:50 +0000519class DSS_Form<bits<10> xo, dag OOL, dag IOL, string asmstr,
Chris Lattnerc94d9322006-04-05 22:27:14 +0000520 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000521 : I<31, OOL, IOL, asmstr, itin> {
Chris Lattnerc94d9322006-04-05 22:27:14 +0000522 bits<1> T;
523 bits<2> STRM;
524 bits<5> A;
525 bits<5> B;
526
527 let Pattern = pattern;
528
529 let Inst{6} = T;
530 let Inst{7-8} = 0;
531 let Inst{9-10} = STRM;
532 let Inst{11-15} = A;
533 let Inst{16-20} = B;
534 let Inst{21-30} = xo;
535 let Inst{31} = 0;
536}
537
Misha Brukman5295e1d2004-08-09 17:24:04 +0000538// 1.7.7 XL-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000539class XLForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Chris Lattnerb9bd34f2007-02-25 05:07:49 +0000540 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000541 : I<opcode, OOL, IOL, asmstr, itin> {
Chris Lattnerb9bd34f2007-02-25 05:07:49 +0000542 bits<5> CRD;
543 bits<5> CRA;
544 bits<5> CRB;
Nate Begeman65a82c52005-04-14 03:20:38 +0000545
Chris Lattnerb9bd34f2007-02-25 05:07:49 +0000546 let Pattern = pattern;
547
548 let Inst{6-10} = CRD;
549 let Inst{11-15} = CRA;
550 let Inst{16-20} = CRB;
551 let Inst{21-30} = xo;
552 let Inst{31} = 0;
553}
554
Evan Cheng94b5a802007-07-19 01:14:50 +0000555class XLForm_1_ext<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Chris Lattnerb9bd34f2007-02-25 05:07:49 +0000556 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000557 : I<opcode, OOL, IOL, asmstr, itin> {
Chris Lattnerb9bd34f2007-02-25 05:07:49 +0000558 bits<5> CRD;
559
560 let Pattern = pattern;
561
562 let Inst{6-10} = CRD;
563 let Inst{11-15} = CRD;
564 let Inst{16-20} = CRD;
Nate Begeman65a82c52005-04-14 03:20:38 +0000565 let Inst{21-30} = xo;
566 let Inst{31} = 0;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000567}
568
Evan Cheng94b5a802007-07-19 01:14:50 +0000569class XLForm_2<bits<6> opcode, bits<10> xo, bit lk, dag OOL, dag IOL, string asmstr,
Nate Begemanb11b8e42005-12-20 00:26:01 +0000570 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000571 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000572 bits<5> BO;
573 bits<5> BI;
574 bits<2> BH;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000575
Nate Begemanb11b8e42005-12-20 00:26:01 +0000576 let Pattern = pattern;
577
Misha Brukman5295e1d2004-08-09 17:24:04 +0000578 let Inst{6-10} = BO;
579 let Inst{11-15} = BI;
580 let Inst{16-18} = 0;
581 let Inst{19-20} = BH;
582 let Inst{21-30} = xo;
583 let Inst{31} = lk;
584}
585
Chris Lattner29597892006-11-04 05:42:48 +0000586class XLForm_2_br<bits<6> opcode, bits<10> xo, bit lk,
Evan Cheng94b5a802007-07-19 01:14:50 +0000587 dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
588 : XLForm_2<opcode, xo, lk, OOL, IOL, asmstr, itin, pattern> {
Chris Lattner29597892006-11-04 05:42:48 +0000589 bits<7> BIBO; // 2 bits of BI and 5 bits of BO.
590 bits<3> CR;
591
Hal Finkelb5aa7e52013-04-08 16:24:03 +0000592 let BO = BIBO{4-0};
593 let BI{0-1} = BIBO{5-6};
594 let BI{2-4} = CR{0-2};
Chris Lattner29597892006-11-04 05:42:48 +0000595 let BH = 0;
596}
597
598
Jim Laskey74ab9962005-10-19 19:51:16 +0000599class XLForm_2_ext<bits<6> opcode, bits<10> xo, bits<5> bo, bits<5> bi, bit lk,
Evan Cheng94b5a802007-07-19 01:14:50 +0000600 dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
601 : XLForm_2<opcode, xo, lk, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000602 let BO = bo;
603 let BI = bi;
604 let BH = 0;
605}
606
Evan Cheng94b5a802007-07-19 01:14:50 +0000607class XLForm_3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000608 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000609 : I<opcode, OOL, IOL, asmstr, itin> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000610 bits<3> BF;
611 bits<3> BFA;
612
613 let Inst{6-8} = BF;
614 let Inst{9-10} = 0;
615 let Inst{11-13} = BFA;
616 let Inst{14-15} = 0;
617 let Inst{16-20} = 0;
618 let Inst{21-30} = xo;
619 let Inst{31} = 0;
620}
621
Misha Brukman5295e1d2004-08-09 17:24:04 +0000622// 1.7.8 XFX-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000623class XFXForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000624 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000625 : I<opcode, OOL, IOL, asmstr, itin> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000626 bits<5> RT;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000627 bits<10> SPR;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000628
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000629 let Inst{6-10} = RT;
Nate Begeman048b2632005-11-29 22:42:50 +0000630 let Inst{11} = SPR{4};
631 let Inst{12} = SPR{3};
632 let Inst{13} = SPR{2};
633 let Inst{14} = SPR{1};
634 let Inst{15} = SPR{0};
635 let Inst{16} = SPR{9};
636 let Inst{17} = SPR{8};
637 let Inst{18} = SPR{7};
638 let Inst{19} = SPR{6};
639 let Inst{20} = SPR{5};
Misha Brukman5295e1d2004-08-09 17:24:04 +0000640 let Inst{21-30} = xo;
641 let Inst{31} = 0;
642}
643
Chris Lattnerd790d222005-04-19 04:40:07 +0000644class XFXForm_1_ext<bits<6> opcode, bits<10> xo, bits<10> spr,
Evan Cheng94b5a802007-07-19 01:14:50 +0000645 dag OOL, dag IOL, string asmstr, InstrItinClass itin>
646 : XFXForm_1<opcode, xo, OOL, IOL, asmstr, itin> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000647 let SPR = spr;
648}
649
Evan Cheng94b5a802007-07-19 01:14:50 +0000650class XFXForm_3<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<5> RT;
654
655 let Inst{6-10} = RT;
656 let Inst{11-20} = 0;
657 let Inst{21-30} = xo;
658 let Inst{31} = 0;
659}
660
Evan Cheng94b5a802007-07-19 01:14:50 +0000661class XFXForm_5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000662 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000663 : I<opcode, OOL, IOL, asmstr, itin> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000664 bits<8> FXM;
Ulrich Weiganda82389b2012-11-13 19:19:46 +0000665 bits<5> rS;
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000666
Ulrich Weiganda82389b2012-11-13 19:19:46 +0000667 let Inst{6-10} = rS;
Nate Begeman9a838672005-08-08 20:04:52 +0000668 let Inst{11} = 0;
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000669 let Inst{12-19} = FXM;
670 let Inst{20} = 0;
671 let Inst{21-30} = xo;
672 let Inst{31} = 0;
673}
674
Evan Cheng94b5a802007-07-19 01:14:50 +0000675class XFXForm_5a<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000676 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000677 : I<opcode, OOL, IOL, asmstr, itin> {
Nate Begeman9a838672005-08-08 20:04:52 +0000678 bits<5> ST;
679 bits<8> FXM;
680
681 let Inst{6-10} = ST;
682 let Inst{11} = 1;
683 let Inst{12-19} = FXM;
684 let Inst{20} = 0;
685 let Inst{21-30} = xo;
686 let Inst{31} = 0;
687}
688
Evan Cheng94b5a802007-07-19 01:14:50 +0000689class XFXForm_7<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000690 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000691 : XFXForm_1<opcode, xo, OOL, IOL, asmstr, itin>;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000692
Nate Begeman143cf942004-08-30 02:28:06 +0000693class XFXForm_7_ext<bits<6> opcode, bits<10> xo, bits<10> spr,
Evan Cheng94b5a802007-07-19 01:14:50 +0000694 dag OOL, dag IOL, string asmstr, InstrItinClass itin>
695 : XFXForm_7<opcode, xo, OOL, IOL, asmstr, itin> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000696 let SPR = spr;
697}
698
Dale Johannesen666323e2007-10-10 01:01:31 +0000699// XFL-Form - MTFSF
700// This is probably 1.7.9, but I don't have the reference that uses this
701// numbering scheme...
702class XFLForm<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Ulrich Weigand874fc622013-03-26 10:56:22 +0000703 InstrItinClass itin, list<dag>pattern>
Dale Johannesen666323e2007-10-10 01:01:31 +0000704 : I<opcode, OOL, IOL, asmstr, itin> {
705 bits<8> FM;
Ulrich Weiganda82389b2012-11-13 19:19:46 +0000706 bits<5> rT;
Dale Johannesen666323e2007-10-10 01:01:31 +0000707
708 bit RC = 0; // set by isDOT
709 let Pattern = pattern;
Dale Johannesen666323e2007-10-10 01:01:31 +0000710
711 let Inst{6} = 0;
712 let Inst{7-14} = FM;
713 let Inst{15} = 0;
Ulrich Weiganda82389b2012-11-13 19:19:46 +0000714 let Inst{16-20} = rT;
Dale Johannesen666323e2007-10-10 01:01:31 +0000715 let Inst{21-30} = xo;
716 let Inst{31} = RC;
717}
718
Chris Lattneraeadac82006-12-06 20:02:54 +0000719// 1.7.10 XS-Form - SRADI.
Evan Cheng94b5a802007-07-19 01:14:50 +0000720class XSForm_1<bits<6> opcode, bits<9> xo, dag OOL, dag IOL, string asmstr,
Chris Lattnera2af3f42006-06-27 20:07:26 +0000721 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000722 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000723 bits<5> A;
Chris Lattner9472eb82006-12-06 21:35:10 +0000724 bits<5> RS;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000725 bits<6> SH;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000726
Chris Lattnerf9172e12005-04-19 05:15:18 +0000727 bit RC = 0; // set by isDOT
Chris Lattnera2af3f42006-06-27 20:07:26 +0000728 let Pattern = pattern;
Chris Lattnerf9172e12005-04-19 05:15:18 +0000729
Nate Begeman765cb5f2004-08-13 02:19:26 +0000730 let Inst{6-10} = RS;
731 let Inst{11-15} = A;
Chris Lattneraeadac82006-12-06 20:02:54 +0000732 let Inst{16-20} = SH{4,3,2,1,0};
Nate Begeman765cb5f2004-08-13 02:19:26 +0000733 let Inst{21-29} = xo;
Chris Lattneraeadac82006-12-06 20:02:54 +0000734 let Inst{30} = SH{5};
Chris Lattnerf9172e12005-04-19 05:15:18 +0000735 let Inst{31} = RC;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000736}
737
Misha Brukman5295e1d2004-08-09 17:24:04 +0000738// 1.7.11 XO-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000739class XOForm_1<bits<6> opcode, bits<9> xo, bit oe, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000740 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000741 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000742 bits<5> RT;
743 bits<5> RA;
744 bits<5> RB;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000745
Chris Lattner3a1002d2005-09-02 21:18:00 +0000746 let Pattern = pattern;
747
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000748 bit RC = 0; // set by isDOT
749
Misha Brukman5295e1d2004-08-09 17:24:04 +0000750 let Inst{6-10} = RT;
751 let Inst{11-15} = RA;
752 let Inst{16-20} = RB;
753 let Inst{21} = oe;
754 let Inst{22-30} = xo;
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000755 let Inst{31} = RC;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000756}
757
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000758class XOForm_3<bits<6> opcode, bits<9> xo, bit oe,
Evan Cheng94b5a802007-07-19 01:14:50 +0000759 dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
760 : XOForm_1<opcode, xo, oe, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000761 let RB = 0;
762}
763
764// 1.7.12 A-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000765class AForm_1<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000766 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000767 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000768 bits<5> FRT;
769 bits<5> FRA;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000770 bits<5> FRC;
Chris Lattnerda76c162004-11-25 04:11:07 +0000771 bits<5> FRB;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000772
Chris Lattner027a2672005-09-29 23:34:24 +0000773 let Pattern = pattern;
774
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000775 bit RC = 0; // set by isDOT
776
Misha Brukman5295e1d2004-08-09 17:24:04 +0000777 let Inst{6-10} = FRT;
778 let Inst{11-15} = FRA;
779 let Inst{16-20} = FRB;
780 let Inst{21-25} = FRC;
781 let Inst{26-30} = xo;
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000782 let Inst{31} = RC;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000783}
784
Evan Cheng94b5a802007-07-19 01:14:50 +0000785class AForm_2<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 FRC = 0;
789}
790
Evan Cheng94b5a802007-07-19 01:14:50 +0000791class AForm_3<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000792 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000793 : AForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000794 let FRB = 0;
795}
796
Ulrich Weigand84ee76a2012-11-13 19:14:19 +0000797class AForm_4<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
798 InstrItinClass itin, list<dag> pattern>
799 : I<opcode, OOL, IOL, asmstr, itin> {
800 bits<5> RT;
801 bits<5> RA;
802 bits<5> RB;
Ulrich Weigand4749b1e2013-03-26 10:54:54 +0000803 bits<5> COND;
Ulrich Weigand84ee76a2012-11-13 19:14:19 +0000804
805 let Pattern = pattern;
806
807 let Inst{6-10} = RT;
808 let Inst{11-15} = RA;
809 let Inst{16-20} = RB;
Ulrich Weigand4749b1e2013-03-26 10:54:54 +0000810 let Inst{21-25} = COND;
Ulrich Weigand84ee76a2012-11-13 19:14:19 +0000811 let Inst{26-30} = xo;
812 let Inst{31} = 0;
813}
814
Misha Brukman5295e1d2004-08-09 17:24:04 +0000815// 1.7.13 M-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000816class MForm_1<bits<6> opcode, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000817 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000818 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000819 bits<5> RA;
Chris Lattner5f4b0e12004-11-23 19:23:32 +0000820 bits<5> RS;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000821 bits<5> RB;
822 bits<5> MB;
823 bits<5> ME;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000824
Nate Begeman9f3c26c2005-10-19 18:42:01 +0000825 let Pattern = pattern;
826
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000827 bit RC = 0; // set by isDOT
828
Misha Brukman5295e1d2004-08-09 17:24:04 +0000829 let Inst{6-10} = RS;
830 let Inst{11-15} = RA;
831 let Inst{16-20} = RB;
832 let Inst{21-25} = MB;
833 let Inst{26-30} = ME;
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000834 let Inst{31} = RC;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000835}
836
Evan Cheng94b5a802007-07-19 01:14:50 +0000837class MForm_2<bits<6> opcode, 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 : MForm_1<opcode, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000840}
841
Nate Begeman765cb5f2004-08-13 02:19:26 +0000842// 1.7.14 MD-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000843class MDForm_1<bits<6> opcode, bits<3> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000844 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000845 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000846 bits<5> RA;
Chris Lattner077b86a2006-07-13 21:52:41 +0000847 bits<5> RS;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000848 bits<6> SH;
849 bits<6> MBE;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000850
Nate Begeman9f3c26c2005-10-19 18:42:01 +0000851 let Pattern = pattern;
852
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000853 bit RC = 0; // set by isDOT
854
Nate Begeman765cb5f2004-08-13 02:19:26 +0000855 let Inst{6-10} = RS;
856 let Inst{11-15} = RA;
Chris Lattneraeadac82006-12-06 20:02:54 +0000857 let Inst{16-20} = SH{4,3,2,1,0};
858 let Inst{21-26} = MBE{4,3,2,1,0,5};
Nate Begeman765cb5f2004-08-13 02:19:26 +0000859 let Inst{27-29} = xo;
Chris Lattnerdd57ac42006-07-12 22:08:13 +0000860 let Inst{30} = SH{5};
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000861 let Inst{31} = RC;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000862}
863
Ulrich Weigandfa451ba2013-04-26 15:39:12 +0000864class MDSForm_1<bits<6> opcode, bits<4> xo, dag OOL, dag IOL, string asmstr,
865 InstrItinClass itin, list<dag> pattern>
866 : I<opcode, OOL, IOL, asmstr, itin> {
867 bits<5> RA;
868 bits<5> RS;
869 bits<5> RB;
870 bits<6> MBE;
871
872 let Pattern = pattern;
873
874 bit RC = 0; // set by isDOT
875
876 let Inst{6-10} = RS;
877 let Inst{11-15} = RA;
878 let Inst{16-20} = RB;
879 let Inst{21-26} = MBE{4,3,2,1,0,5};
880 let Inst{27-30} = xo;
881 let Inst{31} = RC;
882}
Chris Lattnerc94d9322006-04-05 22:27:14 +0000883
884
Nate Begeman8492fd32005-11-23 05:29:52 +0000885// E-1 VA-Form
Chris Lattner1738c292006-03-27 03:34:17 +0000886
887// VAForm_1 - DACB ordering.
Evan Cheng94b5a802007-07-19 01:14:50 +0000888class VAForm_1<bits<6> xo, dag OOL, dag IOL, string asmstr,
Nate Begeman8492fd32005-11-23 05:29:52 +0000889 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000890 : I<4, OOL, IOL, asmstr, itin> {
Nate Begeman8492fd32005-11-23 05:29:52 +0000891 bits<5> VD;
892 bits<5> VA;
Nate Begeman8492fd32005-11-23 05:29:52 +0000893 bits<5> VC;
Chris Lattner4e737172006-03-22 01:44:36 +0000894 bits<5> VB;
Nate Begeman11fd6b22005-11-26 22:39:34 +0000895
896 let Pattern = pattern;
Nate Begeman8492fd32005-11-23 05:29:52 +0000897
898 let Inst{6-10} = VD;
899 let Inst{11-15} = VA;
900 let Inst{16-20} = VB;
901 let Inst{21-25} = VC;
902 let Inst{26-31} = xo;
903}
904
Chris Lattner1738c292006-03-27 03:34:17 +0000905// VAForm_1a - DABC ordering.
Evan Cheng94b5a802007-07-19 01:14:50 +0000906class VAForm_1a<bits<6> xo, dag OOL, dag IOL, string asmstr,
Chris Lattner1738c292006-03-27 03:34:17 +0000907 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000908 : I<4, OOL, IOL, asmstr, itin> {
Chris Lattner1738c292006-03-27 03:34:17 +0000909 bits<5> VD;
910 bits<5> VA;
911 bits<5> VB;
912 bits<5> VC;
913
914 let Pattern = pattern;
915
916 let Inst{6-10} = VD;
917 let Inst{11-15} = VA;
918 let Inst{16-20} = VB;
919 let Inst{21-25} = VC;
920 let Inst{26-31} = xo;
921}
922
Evan Cheng94b5a802007-07-19 01:14:50 +0000923class VAForm_2<bits<6> xo, dag OOL, dag IOL, string asmstr,
Chris Lattner53e07de2006-03-26 00:41:48 +0000924 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000925 : I<4, OOL, IOL, asmstr, itin> {
Chris Lattner53e07de2006-03-26 00:41:48 +0000926 bits<5> VD;
927 bits<5> VA;
928 bits<5> VB;
929 bits<4> SH;
930
931 let Pattern = pattern;
932
933 let Inst{6-10} = VD;
934 let Inst{11-15} = VA;
935 let Inst{16-20} = VB;
936 let Inst{21} = 0;
937 let Inst{22-25} = SH;
938 let Inst{26-31} = xo;
939}
940
Nate Begeman8492fd32005-11-23 05:29:52 +0000941// E-2 VX-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000942class VXForm_1<bits<11> xo, dag OOL, dag IOL, string asmstr,
Nate Begeman8492fd32005-11-23 05:29:52 +0000943 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000944 : I<4, OOL, IOL, asmstr, itin> {
Nate Begeman8492fd32005-11-23 05:29:52 +0000945 bits<5> VD;
946 bits<5> VA;
947 bits<5> VB;
948
Nate Begeman11fd6b22005-11-26 22:39:34 +0000949 let Pattern = pattern;
950
Nate Begeman8492fd32005-11-23 05:29:52 +0000951 let Inst{6-10} = VD;
952 let Inst{11-15} = VA;
953 let Inst{16-20} = VB;
954 let Inst{21-31} = xo;
955}
956
Evan Cheng94b5a802007-07-19 01:14:50 +0000957class VXForm_setzero<bits<11> xo, dag OOL, dag IOL, string asmstr,
Nate Begeman40f081d2005-12-14 00:34:09 +0000958 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000959 : VXForm_1<xo, OOL, IOL, asmstr, itin, pattern> {
Nate Begeman40f081d2005-12-14 00:34:09 +0000960 let VA = VD;
961 let VB = VD;
962}
963
964
Evan Cheng94b5a802007-07-19 01:14:50 +0000965class VXForm_2<bits<11> xo, dag OOL, dag IOL, string asmstr,
Nate Begemanc1381182005-11-29 08:04:45 +0000966 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000967 : I<4, OOL, IOL, asmstr, itin> {
Nate Begemanc1381182005-11-29 08:04:45 +0000968 bits<5> VD;
969 bits<5> VB;
970
971 let Pattern = pattern;
972
973 let Inst{6-10} = VD;
974 let Inst{11-15} = 0;
975 let Inst{16-20} = VB;
976 let Inst{21-31} = xo;
977}
978
Evan Cheng94b5a802007-07-19 01:14:50 +0000979class VXForm_3<bits<11> xo, dag OOL, dag IOL, string asmstr,
Chris Lattnerdf59d532006-03-27 03:28:57 +0000980 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000981 : I<4, OOL, IOL, asmstr, itin> {
Chris Lattnerdf59d532006-03-27 03:28:57 +0000982 bits<5> VD;
983 bits<5> IMM;
984
985 let Pattern = pattern;
986
987 let Inst{6-10} = VD;
988 let Inst{11-15} = IMM;
989 let Inst{16-20} = 0;
990 let Inst{21-31} = xo;
991}
992
Chris Lattner5a528e52006-04-05 00:03:57 +0000993/// VXForm_4 - VX instructions with "VD,0,0" register fields, like mfvscr.
Evan Cheng94b5a802007-07-19 01:14:50 +0000994class VXForm_4<bits<11> xo, dag OOL, dag IOL, string asmstr,
Chris Lattner5a528e52006-04-05 00:03:57 +0000995 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000996 : I<4, OOL, IOL, asmstr, itin> {
Chris Lattner5a528e52006-04-05 00:03:57 +0000997 bits<5> VD;
998
999 let Pattern = pattern;
1000
1001 let Inst{6-10} = VD;
1002 let Inst{11-15} = 0;
1003 let Inst{16-20} = 0;
1004 let Inst{21-31} = xo;
1005}
1006
1007/// VXForm_5 - VX instructions with "0,0,VB" register fields, like mtvscr.
Evan Cheng94b5a802007-07-19 01:14:50 +00001008class VXForm_5<bits<11> xo, dag OOL, dag IOL, string asmstr,
Chris Lattner5a528e52006-04-05 00:03:57 +00001009 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +00001010 : I<4, OOL, IOL, asmstr, itin> {
Chris Lattner5a528e52006-04-05 00:03:57 +00001011 bits<5> VB;
1012
1013 let Pattern = pattern;
1014
1015 let Inst{6-10} = 0;
1016 let Inst{11-15} = 0;
1017 let Inst{16-20} = VB;
1018 let Inst{21-31} = xo;
1019}
Chris Lattnerdf59d532006-03-27 03:28:57 +00001020
Nate Begeman8492fd32005-11-23 05:29:52 +00001021// E-4 VXR-Form
Evan Cheng94b5a802007-07-19 01:14:50 +00001022class VXRForm_1<bits<10> xo, dag OOL, dag IOL, string asmstr,
Nate Begeman8492fd32005-11-23 05:29:52 +00001023 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +00001024 : I<4, OOL, IOL, asmstr, itin> {
Nate Begeman8492fd32005-11-23 05:29:52 +00001025 bits<5> VD;
1026 bits<5> VA;
1027 bits<5> VB;
Chris Lattner793cbcb2006-03-26 04:57:17 +00001028 bit RC = 0;
Nate Begeman8492fd32005-11-23 05:29:52 +00001029
Nate Begeman11fd6b22005-11-26 22:39:34 +00001030 let Pattern = pattern;
1031
Nate Begeman8492fd32005-11-23 05:29:52 +00001032 let Inst{6-10} = VD;
1033 let Inst{11-15} = VA;
1034 let Inst{16-20} = VB;
Chris Lattner793cbcb2006-03-26 04:57:17 +00001035 let Inst{21} = RC;
Nate Begeman8492fd32005-11-23 05:29:52 +00001036 let Inst{22-31} = xo;
1037}
1038
Misha Brukman6b21bde2004-08-02 21:56:35 +00001039//===----------------------------------------------------------------------===//
Evan Cheng94b5a802007-07-19 01:14:50 +00001040class Pseudo<dag OOL, dag IOL, string asmstr, list<dag> pattern>
1041 : I<0, OOL, IOL, asmstr, NoItinerary> {
Ulrich Weigandbbfb0c52013-03-26 10:57:16 +00001042 let isCodeGenOnly = 1;
Nate Begeman61738782004-09-02 08:13:00 +00001043 let PPC64 = 0;
Chris Lattnerb439dad2005-10-25 20:58:43 +00001044 let Pattern = pattern;
Nate Begeman61738782004-09-02 08:13:00 +00001045 let Inst{31-0} = 0;
Misha Brukmancd4f51b2004-08-02 16:54:54 +00001046}