blob: c4fd1929502d3b5ee4720e0335a09991c2692a1c [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;
Misha Brukmancd4f51b2004-08-02 16:54:54 +000038}
39
Chris Lattner7579cfb2006-03-13 05:15:10 +000040class PPC970_DGroup_First { bits<1> PPC970_First = 1; }
41class PPC970_DGroup_Single { bits<1> PPC970_Single = 1; }
42class PPC970_DGroup_Cracked { bits<1> PPC970_Cracked = 1; }
Chris Lattner51348c52006-03-12 09:13:49 +000043class PPC970_MicroCode;
44
45class PPC970_Unit_Pseudo { bits<3> PPC970_Unit = 0; }
46class PPC970_Unit_FXU { bits<3> PPC970_Unit = 1; }
47class PPC970_Unit_LSU { bits<3> PPC970_Unit = 2; }
48class PPC970_Unit_FPU { bits<3> PPC970_Unit = 3; }
49class PPC970_Unit_CRU { bits<3> PPC970_Unit = 4; }
50class PPC970_Unit_VALU { bits<3> PPC970_Unit = 5; }
51class PPC970_Unit_VPERM { bits<3> PPC970_Unit = 6; }
52class PPC970_Unit_BRU { bits<3> PPC970_Unit = 7; }
53
Hal Finkel51861b42012-03-31 14:45:15 +000054// Two joined instructions; used to emit two adjacent instructions as one.
55// The itinerary from the first instruction is used for scheduling and
56// classification.
57class I2<bits<6> opcode1, bits<6> opcode2, dag OOL, dag IOL, string asmstr,
58 InstrItinClass itin>
59 : Instruction {
60 field bits<64> Inst;
61
62 bit PPC64 = 0; // Default value, override with isPPC64
63
64 let Namespace = "PPC";
65 let Inst{0-5} = opcode1;
66 let Inst{32-37} = opcode2;
67 let OutOperandList = OOL;
68 let InOperandList = IOL;
69 let AsmString = asmstr;
70 let Itinerary = itin;
71
72 bits<1> PPC970_First = 0;
73 bits<1> PPC970_Single = 0;
74 bits<1> PPC970_Cracked = 0;
75 bits<3> PPC970_Unit = 0;
76
77 /// These fields correspond to the fields in PPCInstrInfo.h. Any changes to
78 /// these must be reflected there! See comments there for what these are.
79 let TSFlags{0} = PPC970_First;
80 let TSFlags{1} = PPC970_Single;
81 let TSFlags{2} = PPC970_Cracked;
82 let TSFlags{5-3} = PPC970_Unit;
83}
Chris Lattner51348c52006-03-12 09:13:49 +000084
Misha Brukman5295e1d2004-08-09 17:24:04 +000085// 1.7.1 I-Form
Evan Cheng94b5a802007-07-19 01:14:50 +000086class IForm<bits<6> opcode, bit aa, bit lk, dag OOL, dag IOL, string asmstr,
Chris Lattnerd9d18af2005-12-04 18:42:54 +000087 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +000088 : I<opcode, OOL, IOL, asmstr, itin> {
Chris Lattnerd9d18af2005-12-04 18:42:54 +000089 let Pattern = pattern;
Misha Brukman189f3dc2004-10-14 05:55:37 +000090 bits<24> LI;
Misha Brukman6b21bde2004-08-02 21:56:35 +000091
Misha Brukman5295e1d2004-08-09 17:24:04 +000092 let Inst{6-29} = LI;
93 let Inst{30} = aa;
94 let Inst{31} = lk;
Misha Brukman6b21bde2004-08-02 21:56:35 +000095}
96
Misha Brukman5295e1d2004-08-09 17:24:04 +000097// 1.7.2 B-Form
Evan Cheng94b5a802007-07-19 01:14:50 +000098class BForm<bits<6> opcode, bit aa, bit lk, dag OOL, dag IOL, string asmstr>
99 : I<opcode, OOL, IOL, asmstr, BrB> {
Chris Lattner33fc1d42006-11-17 23:53:28 +0000100 bits<7> BIBO; // 2 bits of BI and 5 bits of BO.
101 bits<3> CR;
102 bits<14> BD;
103
104 bits<5> BI;
105 let BI{0-1} = BIBO{5-6};
106 let BI{2-4} = CR{0-2};
107
108 let Inst{6-10} = BIBO{4-0};
109 let Inst{11-15} = BI;
110 let Inst{16-29} = BD;
111 let Inst{30} = aa;
112 let Inst{31} = lk;
113}
114
Ulrich Weigand01177182012-11-13 19:15:52 +0000115class BForm_1<bits<6> opcode, bits<5> bo, bit aa, bit lk, dag OOL, dag IOL,
116 string asmstr>
117 : BForm<opcode, aa, lk, OOL, IOL, asmstr> {
118 let BIBO{4-0} = bo;
119 let BIBO{6-5} = 0;
120 let CR = 0;
121}
Chris Lattner33fc1d42006-11-17 23:53:28 +0000122
Hal Finkel756810f2013-03-21 21:37:52 +0000123class BForm_2<bits<6> opcode, bits<5> bo, bits<5> bi, bit aa, bit lk,
124 dag OOL, dag IOL, string asmstr>
125 : I<opcode, OOL, IOL, asmstr, BrB> {
126 bits<14> BD;
127
128 let Inst{6-10} = bo;
129 let Inst{11-15} = bi;
130 let Inst{16-29} = BD;
131 let Inst{30} = aa;
132 let Inst{31} = lk;
133}
134
Misha Brukman5295e1d2004-08-09 17:24:04 +0000135// 1.7.4 D-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000136class DForm_base<bits<6> opcode, dag OOL, dag IOL, string asmstr,
137 InstrItinClass itin, list<dag> pattern>
138 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000139 bits<5> A;
140 bits<5> B;
141 bits<16> C;
Nate Begemanade6f9a2005-12-09 23:54:18 +0000142
143 let Pattern = pattern;
Misha Brukman6b21bde2004-08-02 21:56:35 +0000144
Misha Brukman6b21bde2004-08-02 21:56:35 +0000145 let Inst{6-10} = A;
146 let Inst{11-15} = B;
147 let Inst{16-31} = C;
148}
149
Evan Cheng94b5a802007-07-19 01:14:50 +0000150class DForm_1<bits<6> opcode, dag OOL, dag IOL, string asmstr,
151 InstrItinClass itin, list<dag> pattern>
152 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman15b0fb52004-10-23 06:08:38 +0000153 bits<5> A;
Chris Lattnerefacb9e2010-11-15 08:22:03 +0000154 bits<21> Addr;
155
156 let Pattern = pattern;
157
158 let Inst{6-10} = A;
159 let Inst{11-15} = Addr{20-16}; // Base Reg
160 let Inst{16-31} = Addr{15-0}; // Displacement
161}
162
163class DForm_1a<bits<6> opcode, dag OOL, dag IOL, string asmstr,
164 InstrItinClass itin, list<dag> pattern>
165 : I<opcode, OOL, IOL, asmstr, itin> {
166 bits<5> A;
Misha Brukman15b0fb52004-10-23 06:08:38 +0000167 bits<16> C;
168 bits<5> B;
Nate Begemanade6f9a2005-12-09 23:54:18 +0000169
170 let Pattern = pattern;
Misha Brukman15b0fb52004-10-23 06:08:38 +0000171
Misha Brukman15b0fb52004-10-23 06:08:38 +0000172 let Inst{6-10} = A;
173 let Inst{11-15} = B;
174 let Inst{16-31} = C;
Misha Brukman6b21bde2004-08-02 21:56:35 +0000175}
176
Chris Lattnerefacb9e2010-11-15 08:22:03 +0000177
Evan Cheng94b5a802007-07-19 01:14:50 +0000178class DForm_2<bits<6> opcode, dag OOL, dag IOL, string asmstr,
179 InstrItinClass itin, list<dag> pattern>
180 : DForm_base<opcode, OOL, IOL, asmstr, itin, pattern>;
Misha Brukman6b21bde2004-08-02 21:56:35 +0000181
Evan Cheng94b5a802007-07-19 01:14:50 +0000182class DForm_2_r0<bits<6> opcode, dag OOL, dag IOL, string asmstr,
183 InstrItinClass itin, list<dag> pattern>
184 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000185 bits<5> A;
186 bits<16> B;
Nate Begeman4bfceb12004-09-04 05:00:00 +0000187
Chris Lattner2d8032b2005-09-08 17:33:10 +0000188 let Pattern = pattern;
189
Nate Begeman4bfceb12004-09-04 05:00:00 +0000190 let Inst{6-10} = A;
191 let Inst{11-15} = 0;
192 let Inst{16-31} = B;
Misha Brukman6b21bde2004-08-02 21:56:35 +0000193}
194
Evan Cheng94b5a802007-07-19 01:14:50 +0000195class DForm_4<bits<6> opcode, dag OOL, dag IOL, string asmstr,
196 InstrItinClass itin, list<dag> pattern>
197 : I<opcode, OOL, IOL, asmstr, itin> {
Chris Lattner022e2712004-11-24 02:15:41 +0000198 bits<5> B;
199 bits<5> A;
200 bits<16> C;
201
Chris Lattner76cb0062005-09-08 17:40:49 +0000202 let Pattern = pattern;
203
Chris Lattner022e2712004-11-24 02:15:41 +0000204 let Inst{6-10} = A;
205 let Inst{11-15} = B;
206 let Inst{16-31} = C;
207}
Nate Begeman4bfceb12004-09-04 05:00:00 +0000208
Evan Cheng94b5a802007-07-19 01:14:50 +0000209class DForm_4_zero<bits<6> opcode, dag OOL, dag IOL, string asmstr,
210 InstrItinClass itin, list<dag> pattern>
211 : DForm_1<opcode, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000212 let A = 0;
Chris Lattnerefacb9e2010-11-15 08:22:03 +0000213 let Addr = 0;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000214}
215
Hal Finkel51861b42012-03-31 14:45:15 +0000216class IForm_and_DForm_1<bits<6> opcode1, bit aa, bit lk, bits<6> opcode2,
217 dag OOL, dag IOL, string asmstr,
218 InstrItinClass itin, list<dag> pattern>
219 : I2<opcode1, opcode2, OOL, IOL, asmstr, itin> {
220 bits<5> A;
221 bits<21> Addr;
222
223 let Pattern = pattern;
224 bits<24> LI;
225
226 let Inst{6-29} = LI;
227 let Inst{30} = aa;
228 let Inst{31} = lk;
229
230 let Inst{38-42} = A;
231 let Inst{43-47} = Addr{20-16}; // Base Reg
232 let Inst{48-63} = Addr{15-0}; // Displacement
233}
234
235// This is used to emit BL8+NOP.
236class IForm_and_DForm_4_zero<bits<6> opcode1, bit aa, bit lk, bits<6> opcode2,
237 dag OOL, dag IOL, string asmstr,
238 InstrItinClass itin, list<dag> pattern>
239 : IForm_and_DForm_1<opcode1, aa, lk, opcode2,
240 OOL, IOL, asmstr, itin, pattern> {
241 let A = 0;
242 let Addr = 0;
243}
244
Evan Cheng94b5a802007-07-19 01:14:50 +0000245class DForm_5<bits<6> opcode, dag OOL, dag IOL, string asmstr,
246 InstrItinClass itin>
247 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000248 bits<3> BF;
249 bits<1> L;
250 bits<5> RA;
251 bits<16> I;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000252
Misha Brukman5295e1d2004-08-09 17:24:04 +0000253 let Inst{6-8} = BF;
254 let Inst{9} = 0;
255 let Inst{10} = L;
256 let Inst{11-15} = RA;
257 let Inst{16-31} = I;
258}
259
Evan Cheng94b5a802007-07-19 01:14:50 +0000260class DForm_5_ext<bits<6> opcode, dag OOL, dag IOL, string asmstr,
261 InstrItinClass itin>
262 : DForm_5<opcode, OOL, IOL, asmstr, itin> {
Chris Lattnerb2367e32005-04-19 04:59:28 +0000263 let L = PPC64;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000264}
265
Evan Cheng94b5a802007-07-19 01:14:50 +0000266class DForm_6<bits<6> opcode, dag OOL, dag IOL, string asmstr,
267 InstrItinClass itin>
268 : DForm_5<opcode, OOL, IOL, asmstr, itin>;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000269
Evan Cheng94b5a802007-07-19 01:14:50 +0000270class DForm_6_ext<bits<6> opcode, dag OOL, dag IOL, string asmstr,
271 InstrItinClass itin>
272 : DForm_6<opcode, OOL, IOL, asmstr, itin> {
Chris Lattnerb2367e32005-04-19 04:59:28 +0000273 let L = PPC64;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000274}
275
Misha Brukman5295e1d2004-08-09 17:24:04 +0000276
Misha Brukman28beda92004-08-11 15:54:36 +0000277// 1.7.5 DS-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000278class DSForm_1<bits<6> opcode, bits<2> xo, dag OOL, dag IOL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000279 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000280 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000281 bits<5> RST;
Chris Lattner8f4444d2010-11-15 08:02:41 +0000282 bits<19> DS_RA;
Misha Brukman28beda92004-08-11 15:54:36 +0000283
Nate Begemanade6f9a2005-12-09 23:54:18 +0000284 let Pattern = pattern;
285
Misha Brukman28beda92004-08-11 15:54:36 +0000286 let Inst{6-10} = RST;
Chris Lattner8f4444d2010-11-15 08:02:41 +0000287 let Inst{11-15} = DS_RA{18-14}; // Register #
288 let Inst{16-29} = DS_RA{13-0}; // Displacement.
Misha Brukman28beda92004-08-11 15:54:36 +0000289 let Inst{30-31} = xo;
290}
291
Chris Lattner8f4444d2010-11-15 08:02:41 +0000292class DSForm_1a<bits<6> opcode, bits<2> xo, dag OOL, dag IOL, string asmstr,
293 InstrItinClass itin, list<dag> pattern>
294 : I<opcode, OOL, IOL, asmstr, itin> {
295 bits<5> RST;
296 bits<14> DS;
297 bits<5> RA;
298
299 let Pattern = pattern;
300
301 let Inst{6-10} = RST;
302 let Inst{11-15} = RA;
303 let Inst{16-29} = DS;
304 let Inst{30-31} = xo;
305}
306
Misha Brukman5295e1d2004-08-09 17:24:04 +0000307// 1.7.6 X-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000308class XForm_base_r3xo<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000309 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000310 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000311 bits<5> RST;
312 bits<5> A;
313 bits<5> B;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000314
Nate Begemanade6f9a2005-12-09 23:54:18 +0000315 let Pattern = pattern;
316
Chris Lattnerf9172e12005-04-19 05:15:18 +0000317 bit RC = 0; // set by isDOT
318
Misha Brukman28beda92004-08-11 15:54:36 +0000319 let Inst{6-10} = RST;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000320 let Inst{11-15} = A;
321 let Inst{16-20} = B;
322 let Inst{21-30} = xo;
Chris Lattnerf9172e12005-04-19 05:15:18 +0000323 let Inst{31} = RC;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000324}
325
Chris Lattner130888ad2004-11-24 03:52:02 +0000326// This is the same as XForm_base_r3xo, but the first two operands are swapped
327// when code is emitted.
328class XForm_base_r3xo_swapped
Evan Cheng94b5a802007-07-19 01:14:50 +0000329 <bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000330 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000331 : I<opcode, OOL, IOL, asmstr, itin> {
Chris Lattner130888ad2004-11-24 03:52:02 +0000332 bits<5> A;
333 bits<5> RST;
334 bits<5> B;
335
Chris Lattnerf9172e12005-04-19 05:15:18 +0000336 bit RC = 0; // set by isDOT
337
Chris Lattner130888ad2004-11-24 03:52:02 +0000338 let Inst{6-10} = RST;
339 let Inst{11-15} = A;
340 let Inst{16-20} = B;
341 let Inst{21-30} = xo;
Chris Lattnerf9172e12005-04-19 05:15:18 +0000342 let Inst{31} = RC;
Chris Lattner130888ad2004-11-24 03:52:02 +0000343}
344
Nate Begeman765cb5f2004-08-13 02:19:26 +0000345
Evan Cheng94b5a802007-07-19 01:14:50 +0000346class XForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000347 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000348 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern>;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000349
Evan Cheng94b5a802007-07-19 01:14:50 +0000350class XForm_6<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000351 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000352 : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> {
Chris Lattnerdcbb5612005-09-02 22:35:53 +0000353 let Pattern = pattern;
354}
Misha Brukman5295e1d2004-08-09 17:24:04 +0000355
Evan Cheng94b5a802007-07-19 01:14:50 +0000356class XForm_8<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000357 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000358 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern>;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000359
Evan Cheng94b5a802007-07-19 01:14:50 +0000360class XForm_10<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000361 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000362 : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> {
Jim Laskey74ab9962005-10-19 19:51:16 +0000363 let Pattern = pattern;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000364}
365
Evan Cheng94b5a802007-07-19 01:14:50 +0000366class XForm_11<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000367 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000368 : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000369 let B = 0;
Chris Lattnerdcbb5612005-09-02 22:35:53 +0000370 let Pattern = pattern;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000371}
372
Evan Cheng94b5a802007-07-19 01:14:50 +0000373class XForm_16<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000374 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000375 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000376 bits<3> BF;
377 bits<1> L;
378 bits<5> RA;
379 bits<5> RB;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000380
Misha Brukman5295e1d2004-08-09 17:24:04 +0000381 let Inst{6-8} = BF;
382 let Inst{9} = 0;
383 let Inst{10} = L;
384 let Inst{11-15} = RA;
385 let Inst{16-20} = RB;
386 let Inst{21-30} = xo;
387 let Inst{31} = 0;
388}
389
Evan Cheng94b5a802007-07-19 01:14:50 +0000390class XForm_16_ext<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000391 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000392 : XForm_16<opcode, xo, OOL, IOL, asmstr, itin> {
Chris Lattner15709c22005-04-19 04:51:30 +0000393 let L = PPC64;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000394}
395
Evan Cheng94b5a802007-07-19 01:14:50 +0000396class XForm_17<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000397 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000398 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000399 bits<3> BF;
400 bits<5> FRA;
401 bits<5> FRB;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000402
Misha Brukman5295e1d2004-08-09 17:24:04 +0000403 let Inst{6-8} = BF;
404 let Inst{9-10} = 0;
405 let Inst{11-15} = FRA;
406 let Inst{16-20} = FRB;
407 let Inst{21-30} = xo;
408 let Inst{31} = 0;
409}
410
Nate Begemanf69d13b2008-08-11 17:36:31 +0000411class XForm_24<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
412 InstrItinClass itin, list<dag> pattern>
413 : I<opcode, OOL, IOL, asmstr, itin> {
414 let Pattern = pattern;
415 let Inst{6-10} = 31;
416 let Inst{11-15} = 0;
417 let Inst{16-20} = 0;
418 let Inst{21-30} = xo;
419 let Inst{31} = 0;
420}
421
Dale Johannesened86f682008-08-22 17:20:54 +0000422class XForm_24_sync<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
423 string asmstr, InstrItinClass itin, list<dag> pattern>
424 : I<opcode, OOL, IOL, asmstr, itin> {
425 let Pattern = pattern;
426 let Inst{6-10} = 0;
427 let Inst{11-15} = 0;
428 let Inst{16-20} = 0;
429 let Inst{21-30} = xo;
430 let Inst{31} = 0;
431}
432
Evan Cheng94b5a802007-07-19 01:14:50 +0000433class XForm_25<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000434 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000435 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000436}
437
Evan Cheng94b5a802007-07-19 01:14:50 +0000438class XForm_26<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000439 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000440 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000441 let A = 0;
442}
443
Evan Cheng94b5a802007-07-19 01:14:50 +0000444class XForm_28<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000445 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000446 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000447}
448
Dale Johannesen666323e2007-10-10 01:01:31 +0000449// This is used for MFFS, MTFSB0, MTFSB1. 42 is arbitrary; this series of
450// numbers presumably relates to some document, but I haven't found it.
451class XForm_42<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
452 InstrItinClass itin, list<dag> pattern>
453 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
454 let Pattern = pattern;
455
456 bit RC = 0; // set by isDOT
457
458 let Inst{6-10} = RST;
459 let Inst{11-20} = 0;
460 let Inst{21-30} = xo;
461 let Inst{31} = RC;
462}
463class XForm_43<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
464 InstrItinClass itin, list<dag> pattern>
465 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
466 let Pattern = pattern;
467 bits<5> FM;
468
469 bit RC = 0; // set by isDOT
470
471 let Inst{6-10} = FM;
472 let Inst{11-20} = 0;
473 let Inst{21-30} = xo;
474 let Inst{31} = RC;
475}
476
Chris Lattnerc8587d42006-06-06 21:29:23 +0000477// DCB_Form - Form X instruction, used for dcb* instructions.
Evan Cheng94b5a802007-07-19 01:14:50 +0000478class DCB_Form<bits<10> xo, bits<5> immfield, dag OOL, dag IOL, string asmstr,
Chris Lattnerc8587d42006-06-06 21:29:23 +0000479 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000480 : I<31, OOL, IOL, asmstr, itin> {
Chris Lattnerc8587d42006-06-06 21:29:23 +0000481 bits<5> A;
482 bits<5> B;
483
484 let Pattern = pattern;
485
486 let Inst{6-10} = immfield;
487 let Inst{11-15} = A;
488 let Inst{16-20} = B;
489 let Inst{21-30} = xo;
490 let Inst{31} = 0;
491}
492
493
Chris Lattnerc94d9322006-04-05 22:27:14 +0000494// DSS_Form - Form X instruction, used for altivec dss* instructions.
Evan Cheng94b5a802007-07-19 01:14:50 +0000495class DSS_Form<bits<10> xo, dag OOL, dag IOL, string asmstr,
Chris Lattnerc94d9322006-04-05 22:27:14 +0000496 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000497 : I<31, OOL, IOL, asmstr, itin> {
Chris Lattnerc94d9322006-04-05 22:27:14 +0000498 bits<1> T;
499 bits<2> STRM;
500 bits<5> A;
501 bits<5> B;
502
503 let Pattern = pattern;
504
505 let Inst{6} = T;
506 let Inst{7-8} = 0;
507 let Inst{9-10} = STRM;
508 let Inst{11-15} = A;
509 let Inst{16-20} = B;
510 let Inst{21-30} = xo;
511 let Inst{31} = 0;
512}
513
Misha Brukman5295e1d2004-08-09 17:24:04 +0000514// 1.7.7 XL-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000515class XLForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Chris Lattnerb9bd34f2007-02-25 05:07:49 +0000516 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000517 : I<opcode, OOL, IOL, asmstr, itin> {
Chris Lattnerb9bd34f2007-02-25 05:07:49 +0000518 bits<5> CRD;
519 bits<5> CRA;
520 bits<5> CRB;
Nate Begeman65a82c52005-04-14 03:20:38 +0000521
Chris Lattnerb9bd34f2007-02-25 05:07:49 +0000522 let Pattern = pattern;
523
524 let Inst{6-10} = CRD;
525 let Inst{11-15} = CRA;
526 let Inst{16-20} = CRB;
527 let Inst{21-30} = xo;
528 let Inst{31} = 0;
529}
530
Evan Cheng94b5a802007-07-19 01:14:50 +0000531class XLForm_1_ext<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Chris Lattnerb9bd34f2007-02-25 05:07:49 +0000532 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000533 : I<opcode, OOL, IOL, asmstr, itin> {
Chris Lattnerb9bd34f2007-02-25 05:07:49 +0000534 bits<5> CRD;
535
536 let Pattern = pattern;
537
538 let Inst{6-10} = CRD;
539 let Inst{11-15} = CRD;
540 let Inst{16-20} = CRD;
Nate Begeman65a82c52005-04-14 03:20:38 +0000541 let Inst{21-30} = xo;
542 let Inst{31} = 0;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000543}
544
Evan Cheng94b5a802007-07-19 01:14:50 +0000545class XLForm_2<bits<6> opcode, bits<10> xo, bit lk, dag OOL, dag IOL, string asmstr,
Nate Begemanb11b8e42005-12-20 00:26:01 +0000546 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000547 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000548 bits<5> BO;
549 bits<5> BI;
550 bits<2> BH;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000551
Nate Begemanb11b8e42005-12-20 00:26:01 +0000552 let Pattern = pattern;
553
Misha Brukman5295e1d2004-08-09 17:24:04 +0000554 let Inst{6-10} = BO;
555 let Inst{11-15} = BI;
556 let Inst{16-18} = 0;
557 let Inst{19-20} = BH;
558 let Inst{21-30} = xo;
559 let Inst{31} = lk;
560}
561
Chris Lattner29597892006-11-04 05:42:48 +0000562class XLForm_2_br<bits<6> opcode, bits<10> xo, bit lk,
Evan Cheng94b5a802007-07-19 01:14:50 +0000563 dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
564 : XLForm_2<opcode, xo, lk, OOL, IOL, asmstr, itin, pattern> {
Chris Lattner29597892006-11-04 05:42:48 +0000565 bits<7> BIBO; // 2 bits of BI and 5 bits of BO.
566 bits<3> CR;
567
Chris Lattnerd94477f2006-11-07 01:51:50 +0000568 let BO = BIBO{2-6};
569 let BI{0-1} = BIBO{0-1};
Chris Lattner29597892006-11-04 05:42:48 +0000570 let BI{2-4} = CR;
571 let BH = 0;
572}
573
574
Jim Laskey74ab9962005-10-19 19:51:16 +0000575class XLForm_2_ext<bits<6> opcode, bits<10> xo, bits<5> bo, bits<5> bi, bit lk,
Evan Cheng94b5a802007-07-19 01:14:50 +0000576 dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
577 : XLForm_2<opcode, xo, lk, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000578 let BO = bo;
579 let BI = bi;
580 let BH = 0;
581}
582
Evan Cheng94b5a802007-07-19 01:14:50 +0000583class XLForm_3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000584 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000585 : I<opcode, OOL, IOL, asmstr, itin> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000586 bits<3> BF;
587 bits<3> BFA;
588
589 let Inst{6-8} = BF;
590 let Inst{9-10} = 0;
591 let Inst{11-13} = BFA;
592 let Inst{14-15} = 0;
593 let Inst{16-20} = 0;
594 let Inst{21-30} = xo;
595 let Inst{31} = 0;
596}
597
Misha Brukman5295e1d2004-08-09 17:24:04 +0000598// 1.7.8 XFX-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000599class XFXForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000600 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000601 : I<opcode, OOL, IOL, asmstr, itin> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000602 bits<5> RT;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000603 bits<10> SPR;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000604
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000605 let Inst{6-10} = RT;
Nate Begeman048b2632005-11-29 22:42:50 +0000606 let Inst{11} = SPR{4};
607 let Inst{12} = SPR{3};
608 let Inst{13} = SPR{2};
609 let Inst{14} = SPR{1};
610 let Inst{15} = SPR{0};
611 let Inst{16} = SPR{9};
612 let Inst{17} = SPR{8};
613 let Inst{18} = SPR{7};
614 let Inst{19} = SPR{6};
615 let Inst{20} = SPR{5};
Misha Brukman5295e1d2004-08-09 17:24:04 +0000616 let Inst{21-30} = xo;
617 let Inst{31} = 0;
618}
619
Chris Lattnerd790d222005-04-19 04:40:07 +0000620class XFXForm_1_ext<bits<6> opcode, bits<10> xo, bits<10> spr,
Evan Cheng94b5a802007-07-19 01:14:50 +0000621 dag OOL, dag IOL, string asmstr, InstrItinClass itin>
622 : XFXForm_1<opcode, xo, OOL, IOL, asmstr, itin> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000623 let SPR = spr;
624}
625
Evan Cheng94b5a802007-07-19 01:14:50 +0000626class XFXForm_3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000627 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000628 : I<opcode, OOL, IOL, asmstr, itin> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000629 bits<5> RT;
630
631 let Inst{6-10} = RT;
632 let Inst{11-20} = 0;
633 let Inst{21-30} = xo;
634 let Inst{31} = 0;
635}
636
Evan Cheng94b5a802007-07-19 01:14:50 +0000637class XFXForm_5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000638 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000639 : I<opcode, OOL, IOL, asmstr, itin> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000640 bits<8> FXM;
Ulrich Weiganda82389b2012-11-13 19:19:46 +0000641 bits<5> rS;
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000642
Ulrich Weiganda82389b2012-11-13 19:19:46 +0000643 let Inst{6-10} = rS;
Nate Begeman9a838672005-08-08 20:04:52 +0000644 let Inst{11} = 0;
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000645 let Inst{12-19} = FXM;
646 let Inst{20} = 0;
647 let Inst{21-30} = xo;
648 let Inst{31} = 0;
649}
650
Evan Cheng94b5a802007-07-19 01:14:50 +0000651class XFXForm_5a<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000652 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000653 : I<opcode, OOL, IOL, asmstr, itin> {
Nate Begeman9a838672005-08-08 20:04:52 +0000654 bits<5> ST;
655 bits<8> FXM;
656
657 let Inst{6-10} = ST;
658 let Inst{11} = 1;
659 let Inst{12-19} = FXM;
660 let Inst{20} = 0;
661 let Inst{21-30} = xo;
662 let Inst{31} = 0;
663}
664
Evan Cheng94b5a802007-07-19 01:14:50 +0000665class XFXForm_7<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000666 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000667 : XFXForm_1<opcode, xo, OOL, IOL, asmstr, itin>;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000668
Nate Begeman143cf942004-08-30 02:28:06 +0000669class XFXForm_7_ext<bits<6> opcode, bits<10> xo, bits<10> spr,
Evan Cheng94b5a802007-07-19 01:14:50 +0000670 dag OOL, dag IOL, string asmstr, InstrItinClass itin>
671 : XFXForm_7<opcode, xo, OOL, IOL, asmstr, itin> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000672 let SPR = spr;
673}
674
Dale Johannesen666323e2007-10-10 01:01:31 +0000675// XFL-Form - MTFSF
676// This is probably 1.7.9, but I don't have the reference that uses this
677// numbering scheme...
678class XFLForm<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
679 string cstr, InstrItinClass itin, list<dag>pattern>
680 : I<opcode, OOL, IOL, asmstr, itin> {
681 bits<8> FM;
Ulrich Weiganda82389b2012-11-13 19:19:46 +0000682 bits<5> rT;
Dale Johannesen666323e2007-10-10 01:01:31 +0000683
684 bit RC = 0; // set by isDOT
685 let Pattern = pattern;
686 let Constraints = cstr;
687
688 let Inst{6} = 0;
689 let Inst{7-14} = FM;
690 let Inst{15} = 0;
Ulrich Weiganda82389b2012-11-13 19:19:46 +0000691 let Inst{16-20} = rT;
Dale Johannesen666323e2007-10-10 01:01:31 +0000692 let Inst{21-30} = xo;
693 let Inst{31} = RC;
694}
695
Chris Lattneraeadac82006-12-06 20:02:54 +0000696// 1.7.10 XS-Form - SRADI.
Evan Cheng94b5a802007-07-19 01:14:50 +0000697class XSForm_1<bits<6> opcode, bits<9> xo, dag OOL, dag IOL, string asmstr,
Chris Lattnera2af3f42006-06-27 20:07:26 +0000698 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000699 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000700 bits<5> A;
Chris Lattner9472eb82006-12-06 21:35:10 +0000701 bits<5> RS;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000702 bits<6> SH;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000703
Chris Lattnerf9172e12005-04-19 05:15:18 +0000704 bit RC = 0; // set by isDOT
Chris Lattnera2af3f42006-06-27 20:07:26 +0000705 let Pattern = pattern;
Chris Lattnerf9172e12005-04-19 05:15:18 +0000706
Nate Begeman765cb5f2004-08-13 02:19:26 +0000707 let Inst{6-10} = RS;
708 let Inst{11-15} = A;
Chris Lattneraeadac82006-12-06 20:02:54 +0000709 let Inst{16-20} = SH{4,3,2,1,0};
Nate Begeman765cb5f2004-08-13 02:19:26 +0000710 let Inst{21-29} = xo;
Chris Lattneraeadac82006-12-06 20:02:54 +0000711 let Inst{30} = SH{5};
Chris Lattnerf9172e12005-04-19 05:15:18 +0000712 let Inst{31} = RC;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000713}
714
Misha Brukman5295e1d2004-08-09 17:24:04 +0000715// 1.7.11 XO-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000716class XOForm_1<bits<6> opcode, bits<9> xo, bit oe, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000717 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000718 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000719 bits<5> RT;
720 bits<5> RA;
721 bits<5> RB;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000722
Chris Lattner3a1002d2005-09-02 21:18:00 +0000723 let Pattern = pattern;
724
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000725 bit RC = 0; // set by isDOT
726
Misha Brukman5295e1d2004-08-09 17:24:04 +0000727 let Inst{6-10} = RT;
728 let Inst{11-15} = RA;
729 let Inst{16-20} = RB;
730 let Inst{21} = oe;
731 let Inst{22-30} = xo;
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000732 let Inst{31} = RC;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000733}
734
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000735class XOForm_3<bits<6> opcode, bits<9> xo, bit oe,
Evan Cheng94b5a802007-07-19 01:14:50 +0000736 dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
737 : XOForm_1<opcode, xo, oe, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000738 let RB = 0;
739}
740
741// 1.7.12 A-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000742class AForm_1<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000743 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000744 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000745 bits<5> FRT;
746 bits<5> FRA;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000747 bits<5> FRC;
Chris Lattnerda76c162004-11-25 04:11:07 +0000748 bits<5> FRB;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000749
Chris Lattner027a2672005-09-29 23:34:24 +0000750 let Pattern = pattern;
751
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000752 bit RC = 0; // set by isDOT
753
Misha Brukman5295e1d2004-08-09 17:24:04 +0000754 let Inst{6-10} = FRT;
755 let Inst{11-15} = FRA;
756 let Inst{16-20} = FRB;
757 let Inst{21-25} = FRC;
758 let Inst{26-30} = xo;
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000759 let Inst{31} = RC;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000760}
761
Evan Cheng94b5a802007-07-19 01:14:50 +0000762class AForm_2<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000763 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000764 : AForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000765 let FRC = 0;
766}
767
Evan Cheng94b5a802007-07-19 01:14:50 +0000768class AForm_3<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000769 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000770 : AForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000771 let FRB = 0;
772}
773
Ulrich Weigand84ee76a2012-11-13 19:14:19 +0000774class AForm_4<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
775 InstrItinClass itin, list<dag> pattern>
776 : I<opcode, OOL, IOL, asmstr, itin> {
777 bits<5> RT;
778 bits<5> RA;
779 bits<5> RB;
Ulrich Weigand4749b1e2013-03-26 10:54:54 +0000780 bits<5> COND;
Ulrich Weigand84ee76a2012-11-13 19:14:19 +0000781
782 let Pattern = pattern;
783
784 let Inst{6-10} = RT;
785 let Inst{11-15} = RA;
786 let Inst{16-20} = RB;
Ulrich Weigand4749b1e2013-03-26 10:54:54 +0000787 let Inst{21-25} = COND;
Ulrich Weigand84ee76a2012-11-13 19:14:19 +0000788 let Inst{26-30} = xo;
789 let Inst{31} = 0;
790}
791
Misha Brukman5295e1d2004-08-09 17:24:04 +0000792// 1.7.13 M-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000793class MForm_1<bits<6> opcode, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000794 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000795 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000796 bits<5> RA;
Chris Lattner5f4b0e12004-11-23 19:23:32 +0000797 bits<5> RS;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000798 bits<5> RB;
799 bits<5> MB;
800 bits<5> ME;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000801
Nate Begeman9f3c26c2005-10-19 18:42:01 +0000802 let Pattern = pattern;
803
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000804 bit RC = 0; // set by isDOT
805
Misha Brukman5295e1d2004-08-09 17:24:04 +0000806 let Inst{6-10} = RS;
807 let Inst{11-15} = RA;
808 let Inst{16-20} = RB;
809 let Inst{21-25} = MB;
810 let Inst{26-30} = ME;
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000811 let Inst{31} = RC;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000812}
813
Evan Cheng94b5a802007-07-19 01:14:50 +0000814class MForm_2<bits<6> opcode, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000815 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000816 : MForm_1<opcode, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000817}
818
Nate Begeman765cb5f2004-08-13 02:19:26 +0000819// 1.7.14 MD-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000820class MDForm_1<bits<6> opcode, bits<3> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000821 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000822 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000823 bits<5> RA;
Chris Lattner077b86a2006-07-13 21:52:41 +0000824 bits<5> RS;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000825 bits<6> SH;
826 bits<6> MBE;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000827
Nate Begeman9f3c26c2005-10-19 18:42:01 +0000828 let Pattern = pattern;
829
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000830 bit RC = 0; // set by isDOT
831
Nate Begeman765cb5f2004-08-13 02:19:26 +0000832 let Inst{6-10} = RS;
833 let Inst{11-15} = RA;
Chris Lattneraeadac82006-12-06 20:02:54 +0000834 let Inst{16-20} = SH{4,3,2,1,0};
835 let Inst{21-26} = MBE{4,3,2,1,0,5};
Nate Begeman765cb5f2004-08-13 02:19:26 +0000836 let Inst{27-29} = xo;
Chris Lattnerdd57ac42006-07-12 22:08:13 +0000837 let Inst{30} = SH{5};
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000838 let Inst{31} = RC;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000839}
840
Chris Lattnerc94d9322006-04-05 22:27:14 +0000841
842
Nate Begeman8492fd32005-11-23 05:29:52 +0000843// E-1 VA-Form
Chris Lattner1738c292006-03-27 03:34:17 +0000844
845// VAForm_1 - DACB ordering.
Evan Cheng94b5a802007-07-19 01:14:50 +0000846class VAForm_1<bits<6> xo, dag OOL, dag IOL, string asmstr,
Nate Begeman8492fd32005-11-23 05:29:52 +0000847 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000848 : I<4, OOL, IOL, asmstr, itin> {
Nate Begeman8492fd32005-11-23 05:29:52 +0000849 bits<5> VD;
850 bits<5> VA;
Nate Begeman8492fd32005-11-23 05:29:52 +0000851 bits<5> VC;
Chris Lattner4e737172006-03-22 01:44:36 +0000852 bits<5> VB;
Nate Begeman11fd6b22005-11-26 22:39:34 +0000853
854 let Pattern = pattern;
Nate Begeman8492fd32005-11-23 05:29:52 +0000855
856 let Inst{6-10} = VD;
857 let Inst{11-15} = VA;
858 let Inst{16-20} = VB;
859 let Inst{21-25} = VC;
860 let Inst{26-31} = xo;
861}
862
Chris Lattner1738c292006-03-27 03:34:17 +0000863// VAForm_1a - DABC ordering.
Evan Cheng94b5a802007-07-19 01:14:50 +0000864class VAForm_1a<bits<6> xo, dag OOL, dag IOL, string asmstr,
Chris Lattner1738c292006-03-27 03:34:17 +0000865 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000866 : I<4, OOL, IOL, asmstr, itin> {
Chris Lattner1738c292006-03-27 03:34:17 +0000867 bits<5> VD;
868 bits<5> VA;
869 bits<5> VB;
870 bits<5> VC;
871
872 let Pattern = pattern;
873
874 let Inst{6-10} = VD;
875 let Inst{11-15} = VA;
876 let Inst{16-20} = VB;
877 let Inst{21-25} = VC;
878 let Inst{26-31} = xo;
879}
880
Evan Cheng94b5a802007-07-19 01:14:50 +0000881class VAForm_2<bits<6> xo, dag OOL, dag IOL, string asmstr,
Chris Lattner53e07de2006-03-26 00:41:48 +0000882 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000883 : I<4, OOL, IOL, asmstr, itin> {
Chris Lattner53e07de2006-03-26 00:41:48 +0000884 bits<5> VD;
885 bits<5> VA;
886 bits<5> VB;
887 bits<4> SH;
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} = 0;
895 let Inst{22-25} = SH;
896 let Inst{26-31} = xo;
897}
898
Nate Begeman8492fd32005-11-23 05:29:52 +0000899// E-2 VX-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000900class VXForm_1<bits<11> xo, dag OOL, dag IOL, string asmstr,
Nate Begeman8492fd32005-11-23 05:29:52 +0000901 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000902 : I<4, OOL, IOL, asmstr, itin> {
Nate Begeman8492fd32005-11-23 05:29:52 +0000903 bits<5> VD;
904 bits<5> VA;
905 bits<5> VB;
906
Nate Begeman11fd6b22005-11-26 22:39:34 +0000907 let Pattern = pattern;
908
Nate Begeman8492fd32005-11-23 05:29:52 +0000909 let Inst{6-10} = VD;
910 let Inst{11-15} = VA;
911 let Inst{16-20} = VB;
912 let Inst{21-31} = xo;
913}
914
Evan Cheng94b5a802007-07-19 01:14:50 +0000915class VXForm_setzero<bits<11> xo, dag OOL, dag IOL, string asmstr,
Nate Begeman40f081d2005-12-14 00:34:09 +0000916 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000917 : VXForm_1<xo, OOL, IOL, asmstr, itin, pattern> {
Nate Begeman40f081d2005-12-14 00:34:09 +0000918 let VA = VD;
919 let VB = VD;
920}
921
922
Evan Cheng94b5a802007-07-19 01:14:50 +0000923class VXForm_2<bits<11> xo, dag OOL, dag IOL, string asmstr,
Nate Begemanc1381182005-11-29 08:04:45 +0000924 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000925 : I<4, OOL, IOL, asmstr, itin> {
Nate Begemanc1381182005-11-29 08:04:45 +0000926 bits<5> VD;
927 bits<5> VB;
928
929 let Pattern = pattern;
930
931 let Inst{6-10} = VD;
932 let Inst{11-15} = 0;
933 let Inst{16-20} = VB;
934 let Inst{21-31} = xo;
935}
936
Evan Cheng94b5a802007-07-19 01:14:50 +0000937class VXForm_3<bits<11> xo, dag OOL, dag IOL, string asmstr,
Chris Lattnerdf59d532006-03-27 03:28:57 +0000938 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000939 : I<4, OOL, IOL, asmstr, itin> {
Chris Lattnerdf59d532006-03-27 03:28:57 +0000940 bits<5> VD;
941 bits<5> IMM;
942
943 let Pattern = pattern;
944
945 let Inst{6-10} = VD;
946 let Inst{11-15} = IMM;
947 let Inst{16-20} = 0;
948 let Inst{21-31} = xo;
949}
950
Chris Lattner5a528e52006-04-05 00:03:57 +0000951/// VXForm_4 - VX instructions with "VD,0,0" register fields, like mfvscr.
Evan Cheng94b5a802007-07-19 01:14:50 +0000952class VXForm_4<bits<11> xo, dag OOL, dag IOL, string asmstr,
Chris Lattner5a528e52006-04-05 00:03:57 +0000953 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000954 : I<4, OOL, IOL, asmstr, itin> {
Chris Lattner5a528e52006-04-05 00:03:57 +0000955 bits<5> VD;
956
957 let Pattern = pattern;
958
959 let Inst{6-10} = VD;
960 let Inst{11-15} = 0;
961 let Inst{16-20} = 0;
962 let Inst{21-31} = xo;
963}
964
965/// VXForm_5 - VX instructions with "0,0,VB" register fields, like mtvscr.
Evan Cheng94b5a802007-07-19 01:14:50 +0000966class VXForm_5<bits<11> xo, dag OOL, dag IOL, string asmstr,
Chris Lattner5a528e52006-04-05 00:03:57 +0000967 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000968 : I<4, OOL, IOL, asmstr, itin> {
Chris Lattner5a528e52006-04-05 00:03:57 +0000969 bits<5> VB;
970
971 let Pattern = pattern;
972
973 let Inst{6-10} = 0;
974 let Inst{11-15} = 0;
975 let Inst{16-20} = VB;
976 let Inst{21-31} = xo;
977}
Chris Lattnerdf59d532006-03-27 03:28:57 +0000978
Nate Begeman8492fd32005-11-23 05:29:52 +0000979// E-4 VXR-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000980class VXRForm_1<bits<10> xo, dag OOL, dag IOL, string asmstr,
Nate Begeman8492fd32005-11-23 05:29:52 +0000981 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000982 : I<4, OOL, IOL, asmstr, itin> {
Nate Begeman8492fd32005-11-23 05:29:52 +0000983 bits<5> VD;
984 bits<5> VA;
985 bits<5> VB;
Chris Lattner793cbcb2006-03-26 04:57:17 +0000986 bit RC = 0;
Nate Begeman8492fd32005-11-23 05:29:52 +0000987
Nate Begeman11fd6b22005-11-26 22:39:34 +0000988 let Pattern = pattern;
989
Nate Begeman8492fd32005-11-23 05:29:52 +0000990 let Inst{6-10} = VD;
991 let Inst{11-15} = VA;
992 let Inst{16-20} = VB;
Chris Lattner793cbcb2006-03-26 04:57:17 +0000993 let Inst{21} = RC;
Nate Begeman8492fd32005-11-23 05:29:52 +0000994 let Inst{22-31} = xo;
995}
996
Misha Brukman6b21bde2004-08-02 21:56:35 +0000997//===----------------------------------------------------------------------===//
Evan Cheng94b5a802007-07-19 01:14:50 +0000998class Pseudo<dag OOL, dag IOL, string asmstr, list<dag> pattern>
999 : I<0, OOL, IOL, asmstr, NoItinerary> {
Nate Begeman61738782004-09-02 08:13:00 +00001000 let PPC64 = 0;
Chris Lattnerb439dad2005-10-25 20:58:43 +00001001 let Pattern = pattern;
Nate Begeman61738782004-09-02 08:13:00 +00001002 let Inst{31-0} = 0;
Misha Brukmancd4f51b2004-08-02 16:54:54 +00001003}