blob: c3c171cd21fc8e14d04028e90cb412f2769bbbc6 [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
Misha Brukman5295e1d2004-08-09 17:24:04 +0000123// 1.7.4 D-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000124class DForm_base<bits<6> opcode, dag OOL, dag IOL, string asmstr,
125 InstrItinClass itin, list<dag> pattern>
126 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000127 bits<5> A;
128 bits<5> B;
129 bits<16> C;
Nate Begemanade6f9a2005-12-09 23:54:18 +0000130
131 let Pattern = pattern;
Misha Brukman6b21bde2004-08-02 21:56:35 +0000132
Misha Brukman6b21bde2004-08-02 21:56:35 +0000133 let Inst{6-10} = A;
134 let Inst{11-15} = B;
135 let Inst{16-31} = C;
136}
137
Evan Cheng94b5a802007-07-19 01:14:50 +0000138class DForm_1<bits<6> opcode, dag OOL, dag IOL, string asmstr,
139 InstrItinClass itin, list<dag> pattern>
140 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman15b0fb52004-10-23 06:08:38 +0000141 bits<5> A;
Chris Lattnerefacb9e2010-11-15 08:22:03 +0000142 bits<21> Addr;
143
144 let Pattern = pattern;
145
146 let Inst{6-10} = A;
147 let Inst{11-15} = Addr{20-16}; // Base Reg
148 let Inst{16-31} = Addr{15-0}; // Displacement
149}
150
151class DForm_1a<bits<6> opcode, dag OOL, dag IOL, string asmstr,
152 InstrItinClass itin, list<dag> pattern>
153 : I<opcode, OOL, IOL, asmstr, itin> {
154 bits<5> A;
Misha Brukman15b0fb52004-10-23 06:08:38 +0000155 bits<16> C;
156 bits<5> B;
Nate Begemanade6f9a2005-12-09 23:54:18 +0000157
158 let Pattern = pattern;
Misha Brukman15b0fb52004-10-23 06:08:38 +0000159
Misha Brukman15b0fb52004-10-23 06:08:38 +0000160 let Inst{6-10} = A;
161 let Inst{11-15} = B;
162 let Inst{16-31} = C;
Misha Brukman6b21bde2004-08-02 21:56:35 +0000163}
164
Chris Lattnerefacb9e2010-11-15 08:22:03 +0000165
Evan Cheng94b5a802007-07-19 01:14:50 +0000166class DForm_2<bits<6> opcode, dag OOL, dag IOL, string asmstr,
167 InstrItinClass itin, list<dag> pattern>
168 : DForm_base<opcode, OOL, IOL, asmstr, itin, pattern>;
Misha Brukman6b21bde2004-08-02 21:56:35 +0000169
Evan Cheng94b5a802007-07-19 01:14:50 +0000170class DForm_2_r0<bits<6> opcode, dag OOL, dag IOL, string asmstr,
171 InstrItinClass itin, list<dag> pattern>
172 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000173 bits<5> A;
174 bits<16> B;
Nate Begeman4bfceb12004-09-04 05:00:00 +0000175
Chris Lattner2d8032b2005-09-08 17:33:10 +0000176 let Pattern = pattern;
177
Nate Begeman4bfceb12004-09-04 05:00:00 +0000178 let Inst{6-10} = A;
179 let Inst{11-15} = 0;
180 let Inst{16-31} = B;
Misha Brukman6b21bde2004-08-02 21:56:35 +0000181}
182
Evan Cheng94b5a802007-07-19 01:14:50 +0000183class DForm_4<bits<6> opcode, dag OOL, dag IOL, string asmstr,
184 InstrItinClass itin, list<dag> pattern>
185 : I<opcode, OOL, IOL, asmstr, itin> {
Chris Lattner022e2712004-11-24 02:15:41 +0000186 bits<5> B;
187 bits<5> A;
188 bits<16> C;
189
Chris Lattner76cb0062005-09-08 17:40:49 +0000190 let Pattern = pattern;
191
Chris Lattner022e2712004-11-24 02:15:41 +0000192 let Inst{6-10} = A;
193 let Inst{11-15} = B;
194 let Inst{16-31} = C;
195}
Nate Begeman4bfceb12004-09-04 05:00:00 +0000196
Evan Cheng94b5a802007-07-19 01:14:50 +0000197class DForm_4_zero<bits<6> opcode, dag OOL, dag IOL, string asmstr,
198 InstrItinClass itin, list<dag> pattern>
199 : DForm_1<opcode, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000200 let A = 0;
Chris Lattnerefacb9e2010-11-15 08:22:03 +0000201 let Addr = 0;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000202}
203
Hal Finkel51861b42012-03-31 14:45:15 +0000204class IForm_and_DForm_1<bits<6> opcode1, bit aa, bit lk, bits<6> opcode2,
205 dag OOL, dag IOL, string asmstr,
206 InstrItinClass itin, list<dag> pattern>
207 : I2<opcode1, opcode2, OOL, IOL, asmstr, itin> {
208 bits<5> A;
209 bits<21> Addr;
210
211 let Pattern = pattern;
212 bits<24> LI;
213
214 let Inst{6-29} = LI;
215 let Inst{30} = aa;
216 let Inst{31} = lk;
217
218 let Inst{38-42} = A;
219 let Inst{43-47} = Addr{20-16}; // Base Reg
220 let Inst{48-63} = Addr{15-0}; // Displacement
221}
222
223// This is used to emit BL8+NOP.
224class IForm_and_DForm_4_zero<bits<6> opcode1, bit aa, bit lk, bits<6> opcode2,
225 dag OOL, dag IOL, string asmstr,
226 InstrItinClass itin, list<dag> pattern>
227 : IForm_and_DForm_1<opcode1, aa, lk, opcode2,
228 OOL, IOL, asmstr, itin, pattern> {
229 let A = 0;
230 let Addr = 0;
231}
232
Evan Cheng94b5a802007-07-19 01:14:50 +0000233class DForm_5<bits<6> opcode, dag OOL, dag IOL, string asmstr,
234 InstrItinClass itin>
235 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000236 bits<3> BF;
237 bits<1> L;
238 bits<5> RA;
239 bits<16> I;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000240
Misha Brukman5295e1d2004-08-09 17:24:04 +0000241 let Inst{6-8} = BF;
242 let Inst{9} = 0;
243 let Inst{10} = L;
244 let Inst{11-15} = RA;
245 let Inst{16-31} = I;
246}
247
Evan Cheng94b5a802007-07-19 01:14:50 +0000248class DForm_5_ext<bits<6> opcode, dag OOL, dag IOL, string asmstr,
249 InstrItinClass itin>
250 : DForm_5<opcode, OOL, IOL, asmstr, itin> {
Chris Lattnerb2367e32005-04-19 04:59:28 +0000251 let L = PPC64;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000252}
253
Evan Cheng94b5a802007-07-19 01:14:50 +0000254class DForm_6<bits<6> opcode, dag OOL, dag IOL, string asmstr,
255 InstrItinClass itin>
256 : DForm_5<opcode, OOL, IOL, asmstr, itin>;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000257
Evan Cheng94b5a802007-07-19 01:14:50 +0000258class DForm_6_ext<bits<6> opcode, dag OOL, dag IOL, string asmstr,
259 InstrItinClass itin>
260 : DForm_6<opcode, OOL, IOL, asmstr, itin> {
Chris Lattnerb2367e32005-04-19 04:59:28 +0000261 let L = PPC64;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000262}
263
Misha Brukman5295e1d2004-08-09 17:24:04 +0000264
Misha Brukman28beda92004-08-11 15:54:36 +0000265// 1.7.5 DS-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000266class DSForm_1<bits<6> opcode, bits<2> xo, dag OOL, dag IOL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000267 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000268 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000269 bits<5> RST;
Chris Lattner8f4444d2010-11-15 08:02:41 +0000270 bits<19> DS_RA;
Misha Brukman28beda92004-08-11 15:54:36 +0000271
Nate Begemanade6f9a2005-12-09 23:54:18 +0000272 let Pattern = pattern;
273
Misha Brukman28beda92004-08-11 15:54:36 +0000274 let Inst{6-10} = RST;
Chris Lattner8f4444d2010-11-15 08:02:41 +0000275 let Inst{11-15} = DS_RA{18-14}; // Register #
276 let Inst{16-29} = DS_RA{13-0}; // Displacement.
Misha Brukman28beda92004-08-11 15:54:36 +0000277 let Inst{30-31} = xo;
278}
279
Chris Lattner8f4444d2010-11-15 08:02:41 +0000280class DSForm_1a<bits<6> opcode, bits<2> xo, dag OOL, dag IOL, string asmstr,
281 InstrItinClass itin, list<dag> pattern>
282 : I<opcode, OOL, IOL, asmstr, itin> {
283 bits<5> RST;
284 bits<14> DS;
285 bits<5> RA;
286
287 let Pattern = pattern;
288
289 let Inst{6-10} = RST;
290 let Inst{11-15} = RA;
291 let Inst{16-29} = DS;
292 let Inst{30-31} = xo;
293}
294
Misha Brukman5295e1d2004-08-09 17:24:04 +0000295// 1.7.6 X-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000296class XForm_base_r3xo<bits<6> opcode, bits<10> 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;
300 bits<5> A;
301 bits<5> B;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000302
Nate Begemanade6f9a2005-12-09 23:54:18 +0000303 let Pattern = pattern;
304
Chris Lattnerf9172e12005-04-19 05:15:18 +0000305 bit RC = 0; // set by isDOT
306
Misha Brukman28beda92004-08-11 15:54:36 +0000307 let Inst{6-10} = RST;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000308 let Inst{11-15} = A;
309 let Inst{16-20} = B;
310 let Inst{21-30} = xo;
Chris Lattnerf9172e12005-04-19 05:15:18 +0000311 let Inst{31} = RC;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000312}
313
Chris Lattner130888ad2004-11-24 03:52:02 +0000314// This is the same as XForm_base_r3xo, but the first two operands are swapped
315// when code is emitted.
316class XForm_base_r3xo_swapped
Evan Cheng94b5a802007-07-19 01:14:50 +0000317 <bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000318 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000319 : I<opcode, OOL, IOL, asmstr, itin> {
Chris Lattner130888ad2004-11-24 03:52:02 +0000320 bits<5> A;
321 bits<5> RST;
322 bits<5> B;
323
Chris Lattnerf9172e12005-04-19 05:15:18 +0000324 bit RC = 0; // set by isDOT
325
Chris Lattner130888ad2004-11-24 03:52:02 +0000326 let Inst{6-10} = RST;
327 let Inst{11-15} = A;
328 let Inst{16-20} = B;
329 let Inst{21-30} = xo;
Chris Lattnerf9172e12005-04-19 05:15:18 +0000330 let Inst{31} = RC;
Chris Lattner130888ad2004-11-24 03:52:02 +0000331}
332
Nate Begeman765cb5f2004-08-13 02:19:26 +0000333
Evan Cheng94b5a802007-07-19 01:14:50 +0000334class XForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000335 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000336 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern>;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000337
Evan Cheng94b5a802007-07-19 01:14:50 +0000338class XForm_6<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000339 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000340 : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> {
Chris Lattnerdcbb5612005-09-02 22:35:53 +0000341 let Pattern = pattern;
342}
Misha Brukman5295e1d2004-08-09 17:24:04 +0000343
Evan Cheng94b5a802007-07-19 01:14:50 +0000344class XForm_8<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000345 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000346 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern>;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000347
Evan Cheng94b5a802007-07-19 01:14:50 +0000348class XForm_10<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000349 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000350 : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> {
Jim Laskey74ab9962005-10-19 19:51:16 +0000351 let Pattern = pattern;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000352}
353
Evan Cheng94b5a802007-07-19 01:14:50 +0000354class XForm_11<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000355 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000356 : XForm_base_r3xo_swapped<opcode, xo, OOL, IOL, asmstr, itin> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000357 let B = 0;
Chris Lattnerdcbb5612005-09-02 22:35:53 +0000358 let Pattern = pattern;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000359}
360
Evan Cheng94b5a802007-07-19 01:14:50 +0000361class XForm_16<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000362 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000363 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000364 bits<3> BF;
365 bits<1> L;
366 bits<5> RA;
367 bits<5> RB;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000368
Misha Brukman5295e1d2004-08-09 17:24:04 +0000369 let Inst{6-8} = BF;
370 let Inst{9} = 0;
371 let Inst{10} = L;
372 let Inst{11-15} = RA;
373 let Inst{16-20} = RB;
374 let Inst{21-30} = xo;
375 let Inst{31} = 0;
376}
377
Evan Cheng94b5a802007-07-19 01:14:50 +0000378class XForm_16_ext<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000379 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000380 : XForm_16<opcode, xo, OOL, IOL, asmstr, itin> {
Chris Lattner15709c22005-04-19 04:51:30 +0000381 let L = PPC64;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000382}
383
Evan Cheng94b5a802007-07-19 01:14:50 +0000384class XForm_17<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000385 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000386 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000387 bits<3> BF;
388 bits<5> FRA;
389 bits<5> FRB;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000390
Misha Brukman5295e1d2004-08-09 17:24:04 +0000391 let Inst{6-8} = BF;
392 let Inst{9-10} = 0;
393 let Inst{11-15} = FRA;
394 let Inst{16-20} = FRB;
395 let Inst{21-30} = xo;
396 let Inst{31} = 0;
397}
398
Nate Begemanf69d13b2008-08-11 17:36:31 +0000399class XForm_24<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
400 InstrItinClass itin, list<dag> pattern>
401 : I<opcode, OOL, IOL, asmstr, itin> {
402 let Pattern = pattern;
403 let Inst{6-10} = 31;
404 let Inst{11-15} = 0;
405 let Inst{16-20} = 0;
406 let Inst{21-30} = xo;
407 let Inst{31} = 0;
408}
409
Dale Johannesened86f682008-08-22 17:20:54 +0000410class XForm_24_sync<bits<6> opcode, bits<10> xo, dag OOL, dag IOL,
411 string asmstr, InstrItinClass itin, list<dag> pattern>
412 : I<opcode, OOL, IOL, asmstr, itin> {
413 let Pattern = pattern;
414 let Inst{6-10} = 0;
415 let Inst{11-15} = 0;
416 let Inst{16-20} = 0;
417 let Inst{21-30} = xo;
418 let Inst{31} = 0;
419}
420
Evan Cheng94b5a802007-07-19 01:14:50 +0000421class XForm_25<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000422 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000423 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000424}
425
Evan Cheng94b5a802007-07-19 01:14:50 +0000426class XForm_26<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000427 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000428 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000429 let A = 0;
430}
431
Evan Cheng94b5a802007-07-19 01:14:50 +0000432class XForm_28<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000433 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000434 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000435}
436
Dale Johannesen666323e2007-10-10 01:01:31 +0000437// This is used for MFFS, MTFSB0, MTFSB1. 42 is arbitrary; this series of
438// numbers presumably relates to some document, but I haven't found it.
439class XForm_42<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
440 InstrItinClass itin, list<dag> pattern>
441 : XForm_base_r3xo<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
442 let Pattern = pattern;
443
444 bit RC = 0; // set by isDOT
445
446 let Inst{6-10} = RST;
447 let Inst{11-20} = 0;
448 let Inst{21-30} = xo;
449 let Inst{31} = RC;
450}
451class XForm_43<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 bits<5> FM;
456
457 bit RC = 0; // set by isDOT
458
459 let Inst{6-10} = FM;
460 let Inst{11-20} = 0;
461 let Inst{21-30} = xo;
462 let Inst{31} = RC;
463}
464
Chris Lattnerc8587d42006-06-06 21:29:23 +0000465// DCB_Form - Form X instruction, used for dcb* instructions.
Evan Cheng94b5a802007-07-19 01:14:50 +0000466class DCB_Form<bits<10> xo, bits<5> immfield, dag OOL, dag IOL, string asmstr,
Chris Lattnerc8587d42006-06-06 21:29:23 +0000467 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000468 : I<31, OOL, IOL, asmstr, itin> {
Chris Lattnerc8587d42006-06-06 21:29:23 +0000469 bits<5> A;
470 bits<5> B;
471
472 let Pattern = pattern;
473
474 let Inst{6-10} = immfield;
475 let Inst{11-15} = A;
476 let Inst{16-20} = B;
477 let Inst{21-30} = xo;
478 let Inst{31} = 0;
479}
480
481
Chris Lattnerc94d9322006-04-05 22:27:14 +0000482// DSS_Form - Form X instruction, used for altivec dss* instructions.
Evan Cheng94b5a802007-07-19 01:14:50 +0000483class DSS_Form<bits<10> xo, dag OOL, dag IOL, string asmstr,
Chris Lattnerc94d9322006-04-05 22:27:14 +0000484 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000485 : I<31, OOL, IOL, asmstr, itin> {
Chris Lattnerc94d9322006-04-05 22:27:14 +0000486 bits<1> T;
487 bits<2> STRM;
488 bits<5> A;
489 bits<5> B;
490
491 let Pattern = pattern;
492
493 let Inst{6} = T;
494 let Inst{7-8} = 0;
495 let Inst{9-10} = STRM;
496 let Inst{11-15} = A;
497 let Inst{16-20} = B;
498 let Inst{21-30} = xo;
499 let Inst{31} = 0;
500}
501
Misha Brukman5295e1d2004-08-09 17:24:04 +0000502// 1.7.7 XL-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000503class XLForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Chris Lattnerb9bd34f2007-02-25 05:07:49 +0000504 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000505 : I<opcode, OOL, IOL, asmstr, itin> {
Chris Lattnerb9bd34f2007-02-25 05:07:49 +0000506 bits<5> CRD;
507 bits<5> CRA;
508 bits<5> CRB;
Nate Begeman65a82c52005-04-14 03:20:38 +0000509
Chris Lattnerb9bd34f2007-02-25 05:07:49 +0000510 let Pattern = pattern;
511
512 let Inst{6-10} = CRD;
513 let Inst{11-15} = CRA;
514 let Inst{16-20} = CRB;
515 let Inst{21-30} = xo;
516 let Inst{31} = 0;
517}
518
Evan Cheng94b5a802007-07-19 01:14:50 +0000519class XLForm_1_ext<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Chris Lattnerb9bd34f2007-02-25 05:07:49 +0000520 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000521 : I<opcode, OOL, IOL, asmstr, itin> {
Chris Lattnerb9bd34f2007-02-25 05:07:49 +0000522 bits<5> CRD;
523
524 let Pattern = pattern;
525
526 let Inst{6-10} = CRD;
527 let Inst{11-15} = CRD;
528 let Inst{16-20} = CRD;
Nate Begeman65a82c52005-04-14 03:20:38 +0000529 let Inst{21-30} = xo;
530 let Inst{31} = 0;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000531}
532
Evan Cheng94b5a802007-07-19 01:14:50 +0000533class XLForm_2<bits<6> opcode, bits<10> xo, bit lk, dag OOL, dag IOL, string asmstr,
Nate Begemanb11b8e42005-12-20 00:26:01 +0000534 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000535 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000536 bits<5> BO;
537 bits<5> BI;
538 bits<2> BH;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000539
Nate Begemanb11b8e42005-12-20 00:26:01 +0000540 let Pattern = pattern;
541
Misha Brukman5295e1d2004-08-09 17:24:04 +0000542 let Inst{6-10} = BO;
543 let Inst{11-15} = BI;
544 let Inst{16-18} = 0;
545 let Inst{19-20} = BH;
546 let Inst{21-30} = xo;
547 let Inst{31} = lk;
548}
549
Chris Lattner29597892006-11-04 05:42:48 +0000550class XLForm_2_br<bits<6> opcode, bits<10> xo, bit lk,
Evan Cheng94b5a802007-07-19 01:14:50 +0000551 dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
552 : XLForm_2<opcode, xo, lk, OOL, IOL, asmstr, itin, pattern> {
Chris Lattner29597892006-11-04 05:42:48 +0000553 bits<7> BIBO; // 2 bits of BI and 5 bits of BO.
554 bits<3> CR;
555
Chris Lattnerd94477f2006-11-07 01:51:50 +0000556 let BO = BIBO{2-6};
557 let BI{0-1} = BIBO{0-1};
Chris Lattner29597892006-11-04 05:42:48 +0000558 let BI{2-4} = CR;
559 let BH = 0;
560}
561
562
Jim Laskey74ab9962005-10-19 19:51:16 +0000563class XLForm_2_ext<bits<6> opcode, bits<10> xo, bits<5> bo, bits<5> bi, bit lk,
Evan Cheng94b5a802007-07-19 01:14:50 +0000564 dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
565 : XLForm_2<opcode, xo, lk, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000566 let BO = bo;
567 let BI = bi;
568 let BH = 0;
569}
570
Evan Cheng94b5a802007-07-19 01:14:50 +0000571class XLForm_3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000572 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000573 : I<opcode, OOL, IOL, asmstr, itin> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000574 bits<3> BF;
575 bits<3> BFA;
576
577 let Inst{6-8} = BF;
578 let Inst{9-10} = 0;
579 let Inst{11-13} = BFA;
580 let Inst{14-15} = 0;
581 let Inst{16-20} = 0;
582 let Inst{21-30} = xo;
583 let Inst{31} = 0;
584}
585
Misha Brukman5295e1d2004-08-09 17:24:04 +0000586// 1.7.8 XFX-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000587class XFXForm_1<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000588 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000589 : I<opcode, OOL, IOL, asmstr, itin> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000590 bits<5> RT;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000591 bits<10> SPR;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000592
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000593 let Inst{6-10} = RT;
Nate Begeman048b2632005-11-29 22:42:50 +0000594 let Inst{11} = SPR{4};
595 let Inst{12} = SPR{3};
596 let Inst{13} = SPR{2};
597 let Inst{14} = SPR{1};
598 let Inst{15} = SPR{0};
599 let Inst{16} = SPR{9};
600 let Inst{17} = SPR{8};
601 let Inst{18} = SPR{7};
602 let Inst{19} = SPR{6};
603 let Inst{20} = SPR{5};
Misha Brukman5295e1d2004-08-09 17:24:04 +0000604 let Inst{21-30} = xo;
605 let Inst{31} = 0;
606}
607
Chris Lattnerd790d222005-04-19 04:40:07 +0000608class XFXForm_1_ext<bits<6> opcode, bits<10> xo, bits<10> spr,
Evan Cheng94b5a802007-07-19 01:14:50 +0000609 dag OOL, dag IOL, string asmstr, InstrItinClass itin>
610 : XFXForm_1<opcode, xo, OOL, IOL, asmstr, itin> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000611 let SPR = spr;
612}
613
Evan Cheng94b5a802007-07-19 01:14:50 +0000614class XFXForm_3<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000615 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000616 : I<opcode, OOL, IOL, asmstr, itin> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000617 bits<5> RT;
618
619 let Inst{6-10} = RT;
620 let Inst{11-20} = 0;
621 let Inst{21-30} = xo;
622 let Inst{31} = 0;
623}
624
Evan Cheng94b5a802007-07-19 01:14:50 +0000625class XFXForm_5<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000626 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000627 : I<opcode, OOL, IOL, asmstr, itin> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000628 bits<8> FXM;
Ulrich Weiganda82389b2012-11-13 19:19:46 +0000629 bits<5> rS;
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000630
Ulrich Weiganda82389b2012-11-13 19:19:46 +0000631 let Inst{6-10} = rS;
Nate Begeman9a838672005-08-08 20:04:52 +0000632 let Inst{11} = 0;
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000633 let Inst{12-19} = FXM;
634 let Inst{20} = 0;
635 let Inst{21-30} = xo;
636 let Inst{31} = 0;
637}
638
Evan Cheng94b5a802007-07-19 01:14:50 +0000639class XFXForm_5a<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000640 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000641 : I<opcode, OOL, IOL, asmstr, itin> {
Nate Begeman9a838672005-08-08 20:04:52 +0000642 bits<5> ST;
643 bits<8> FXM;
644
645 let Inst{6-10} = ST;
646 let Inst{11} = 1;
647 let Inst{12-19} = FXM;
648 let Inst{20} = 0;
649 let Inst{21-30} = xo;
650 let Inst{31} = 0;
651}
652
Evan Cheng94b5a802007-07-19 01:14:50 +0000653class XFXForm_7<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000654 InstrItinClass itin>
Evan Cheng94b5a802007-07-19 01:14:50 +0000655 : XFXForm_1<opcode, xo, OOL, IOL, asmstr, itin>;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000656
Nate Begeman143cf942004-08-30 02:28:06 +0000657class XFXForm_7_ext<bits<6> opcode, bits<10> xo, bits<10> spr,
Evan Cheng94b5a802007-07-19 01:14:50 +0000658 dag OOL, dag IOL, string asmstr, InstrItinClass itin>
659 : XFXForm_7<opcode, xo, OOL, IOL, asmstr, itin> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000660 let SPR = spr;
661}
662
Dale Johannesen666323e2007-10-10 01:01:31 +0000663// XFL-Form - MTFSF
664// This is probably 1.7.9, but I don't have the reference that uses this
665// numbering scheme...
666class XFLForm<bits<6> opcode, bits<10> xo, dag OOL, dag IOL, string asmstr,
667 string cstr, InstrItinClass itin, list<dag>pattern>
668 : I<opcode, OOL, IOL, asmstr, itin> {
669 bits<8> FM;
Ulrich Weiganda82389b2012-11-13 19:19:46 +0000670 bits<5> rT;
Dale Johannesen666323e2007-10-10 01:01:31 +0000671
672 bit RC = 0; // set by isDOT
673 let Pattern = pattern;
674 let Constraints = cstr;
675
676 let Inst{6} = 0;
677 let Inst{7-14} = FM;
678 let Inst{15} = 0;
Ulrich Weiganda82389b2012-11-13 19:19:46 +0000679 let Inst{16-20} = rT;
Dale Johannesen666323e2007-10-10 01:01:31 +0000680 let Inst{21-30} = xo;
681 let Inst{31} = RC;
682}
683
Chris Lattneraeadac82006-12-06 20:02:54 +0000684// 1.7.10 XS-Form - SRADI.
Evan Cheng94b5a802007-07-19 01:14:50 +0000685class XSForm_1<bits<6> opcode, bits<9> xo, dag OOL, dag IOL, string asmstr,
Chris Lattnera2af3f42006-06-27 20:07:26 +0000686 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000687 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000688 bits<5> A;
Chris Lattner9472eb82006-12-06 21:35:10 +0000689 bits<5> RS;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000690 bits<6> SH;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000691
Chris Lattnerf9172e12005-04-19 05:15:18 +0000692 bit RC = 0; // set by isDOT
Chris Lattnera2af3f42006-06-27 20:07:26 +0000693 let Pattern = pattern;
Chris Lattnerf9172e12005-04-19 05:15:18 +0000694
Nate Begeman765cb5f2004-08-13 02:19:26 +0000695 let Inst{6-10} = RS;
696 let Inst{11-15} = A;
Chris Lattneraeadac82006-12-06 20:02:54 +0000697 let Inst{16-20} = SH{4,3,2,1,0};
Nate Begeman765cb5f2004-08-13 02:19:26 +0000698 let Inst{21-29} = xo;
Chris Lattneraeadac82006-12-06 20:02:54 +0000699 let Inst{30} = SH{5};
Chris Lattnerf9172e12005-04-19 05:15:18 +0000700 let Inst{31} = RC;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000701}
702
Misha Brukman5295e1d2004-08-09 17:24:04 +0000703// 1.7.11 XO-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000704class XOForm_1<bits<6> opcode, bits<9> xo, bit oe, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000705 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000706 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000707 bits<5> RT;
708 bits<5> RA;
709 bits<5> RB;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000710
Chris Lattner3a1002d2005-09-02 21:18:00 +0000711 let Pattern = pattern;
712
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000713 bit RC = 0; // set by isDOT
714
Misha Brukman5295e1d2004-08-09 17:24:04 +0000715 let Inst{6-10} = RT;
716 let Inst{11-15} = RA;
717 let Inst{16-20} = RB;
718 let Inst{21} = oe;
719 let Inst{22-30} = xo;
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000720 let Inst{31} = RC;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000721}
722
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000723class XOForm_3<bits<6> opcode, bits<9> xo, bit oe,
Evan Cheng94b5a802007-07-19 01:14:50 +0000724 dag OOL, dag IOL, string asmstr, InstrItinClass itin, list<dag> pattern>
725 : XOForm_1<opcode, xo, oe, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000726 let RB = 0;
727}
728
729// 1.7.12 A-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000730class AForm_1<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000731 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000732 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000733 bits<5> FRT;
734 bits<5> FRA;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000735 bits<5> FRC;
Chris Lattnerda76c162004-11-25 04:11:07 +0000736 bits<5> FRB;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000737
Chris Lattner027a2672005-09-29 23:34:24 +0000738 let Pattern = pattern;
739
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000740 bit RC = 0; // set by isDOT
741
Misha Brukman5295e1d2004-08-09 17:24:04 +0000742 let Inst{6-10} = FRT;
743 let Inst{11-15} = FRA;
744 let Inst{16-20} = FRB;
745 let Inst{21-25} = FRC;
746 let Inst{26-30} = xo;
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000747 let Inst{31} = RC;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000748}
749
Evan Cheng94b5a802007-07-19 01:14:50 +0000750class AForm_2<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000751 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000752 : AForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000753 let FRC = 0;
754}
755
Evan Cheng94b5a802007-07-19 01:14:50 +0000756class AForm_3<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000757 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000758 : AForm_1<opcode, xo, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000759 let FRB = 0;
760}
761
Ulrich Weigand84ee76a2012-11-13 19:14:19 +0000762class AForm_4<bits<6> opcode, bits<5> xo, dag OOL, dag IOL, string asmstr,
763 InstrItinClass itin, list<dag> pattern>
764 : I<opcode, OOL, IOL, asmstr, itin> {
765 bits<5> RT;
766 bits<5> RA;
767 bits<5> RB;
768 bits<7> BIBO; // 2 bits of BI and 5 bits of BO (must be 12).
769 bits<3> CR;
770
771 let Pattern = pattern;
772
773 let Inst{6-10} = RT;
774 let Inst{11-15} = RA;
775 let Inst{16-20} = RB;
776 let Inst{21-23} = CR;
777 let Inst{24-25} = BIBO{6-5};
778 let Inst{26-30} = xo;
779 let Inst{31} = 0;
780}
781
Misha Brukman5295e1d2004-08-09 17:24:04 +0000782// 1.7.13 M-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000783class MForm_1<bits<6> opcode, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000784 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000785 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000786 bits<5> RA;
Chris Lattner5f4b0e12004-11-23 19:23:32 +0000787 bits<5> RS;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000788 bits<5> RB;
789 bits<5> MB;
790 bits<5> ME;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000791
Nate Begeman9f3c26c2005-10-19 18:42:01 +0000792 let Pattern = pattern;
793
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000794 bit RC = 0; // set by isDOT
795
Misha Brukman5295e1d2004-08-09 17:24:04 +0000796 let Inst{6-10} = RS;
797 let Inst{11-15} = RA;
798 let Inst{16-20} = RB;
799 let Inst{21-25} = MB;
800 let Inst{26-30} = ME;
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000801 let Inst{31} = RC;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000802}
803
Evan Cheng94b5a802007-07-19 01:14:50 +0000804class MForm_2<bits<6> opcode, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000805 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000806 : MForm_1<opcode, OOL, IOL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000807}
808
Nate Begeman765cb5f2004-08-13 02:19:26 +0000809// 1.7.14 MD-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000810class MDForm_1<bits<6> opcode, bits<3> xo, dag OOL, dag IOL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000811 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000812 : I<opcode, OOL, IOL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000813 bits<5> RA;
Chris Lattner077b86a2006-07-13 21:52:41 +0000814 bits<5> RS;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000815 bits<6> SH;
816 bits<6> MBE;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000817
Nate Begeman9f3c26c2005-10-19 18:42:01 +0000818 let Pattern = pattern;
819
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000820 bit RC = 0; // set by isDOT
821
Nate Begeman765cb5f2004-08-13 02:19:26 +0000822 let Inst{6-10} = RS;
823 let Inst{11-15} = RA;
Chris Lattneraeadac82006-12-06 20:02:54 +0000824 let Inst{16-20} = SH{4,3,2,1,0};
825 let Inst{21-26} = MBE{4,3,2,1,0,5};
Nate Begeman765cb5f2004-08-13 02:19:26 +0000826 let Inst{27-29} = xo;
Chris Lattnerdd57ac42006-07-12 22:08:13 +0000827 let Inst{30} = SH{5};
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000828 let Inst{31} = RC;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000829}
830
Chris Lattnerc94d9322006-04-05 22:27:14 +0000831
832
Nate Begeman8492fd32005-11-23 05:29:52 +0000833// E-1 VA-Form
Chris Lattner1738c292006-03-27 03:34:17 +0000834
835// VAForm_1 - DACB ordering.
Evan Cheng94b5a802007-07-19 01:14:50 +0000836class VAForm_1<bits<6> xo, dag OOL, dag IOL, string asmstr,
Nate Begeman8492fd32005-11-23 05:29:52 +0000837 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000838 : I<4, OOL, IOL, asmstr, itin> {
Nate Begeman8492fd32005-11-23 05:29:52 +0000839 bits<5> VD;
840 bits<5> VA;
Nate Begeman8492fd32005-11-23 05:29:52 +0000841 bits<5> VC;
Chris Lattner4e737172006-03-22 01:44:36 +0000842 bits<5> VB;
Nate Begeman11fd6b22005-11-26 22:39:34 +0000843
844 let Pattern = pattern;
Nate Begeman8492fd32005-11-23 05:29:52 +0000845
846 let Inst{6-10} = VD;
847 let Inst{11-15} = VA;
848 let Inst{16-20} = VB;
849 let Inst{21-25} = VC;
850 let Inst{26-31} = xo;
851}
852
Chris Lattner1738c292006-03-27 03:34:17 +0000853// VAForm_1a - DABC ordering.
Evan Cheng94b5a802007-07-19 01:14:50 +0000854class VAForm_1a<bits<6> xo, dag OOL, dag IOL, string asmstr,
Chris Lattner1738c292006-03-27 03:34:17 +0000855 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000856 : I<4, OOL, IOL, asmstr, itin> {
Chris Lattner1738c292006-03-27 03:34:17 +0000857 bits<5> VD;
858 bits<5> VA;
859 bits<5> VB;
860 bits<5> VC;
861
862 let Pattern = pattern;
863
864 let Inst{6-10} = VD;
865 let Inst{11-15} = VA;
866 let Inst{16-20} = VB;
867 let Inst{21-25} = VC;
868 let Inst{26-31} = xo;
869}
870
Evan Cheng94b5a802007-07-19 01:14:50 +0000871class VAForm_2<bits<6> xo, dag OOL, dag IOL, string asmstr,
Chris Lattner53e07de2006-03-26 00:41:48 +0000872 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000873 : I<4, OOL, IOL, asmstr, itin> {
Chris Lattner53e07de2006-03-26 00:41:48 +0000874 bits<5> VD;
875 bits<5> VA;
876 bits<5> VB;
877 bits<4> SH;
878
879 let Pattern = pattern;
880
881 let Inst{6-10} = VD;
882 let Inst{11-15} = VA;
883 let Inst{16-20} = VB;
884 let Inst{21} = 0;
885 let Inst{22-25} = SH;
886 let Inst{26-31} = xo;
887}
888
Nate Begeman8492fd32005-11-23 05:29:52 +0000889// E-2 VX-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000890class VXForm_1<bits<11> xo, dag OOL, dag IOL, string asmstr,
Nate Begeman8492fd32005-11-23 05:29:52 +0000891 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000892 : I<4, OOL, IOL, asmstr, itin> {
Nate Begeman8492fd32005-11-23 05:29:52 +0000893 bits<5> VD;
894 bits<5> VA;
895 bits<5> VB;
896
Nate Begeman11fd6b22005-11-26 22:39:34 +0000897 let Pattern = pattern;
898
Nate Begeman8492fd32005-11-23 05:29:52 +0000899 let Inst{6-10} = VD;
900 let Inst{11-15} = VA;
901 let Inst{16-20} = VB;
902 let Inst{21-31} = xo;
903}
904
Evan Cheng94b5a802007-07-19 01:14:50 +0000905class VXForm_setzero<bits<11> xo, dag OOL, dag IOL, string asmstr,
Nate Begeman40f081d2005-12-14 00:34:09 +0000906 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000907 : VXForm_1<xo, OOL, IOL, asmstr, itin, pattern> {
Nate Begeman40f081d2005-12-14 00:34:09 +0000908 let VA = VD;
909 let VB = VD;
910}
911
912
Evan Cheng94b5a802007-07-19 01:14:50 +0000913class VXForm_2<bits<11> xo, dag OOL, dag IOL, string asmstr,
Nate Begemanc1381182005-11-29 08:04:45 +0000914 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000915 : I<4, OOL, IOL, asmstr, itin> {
Nate Begemanc1381182005-11-29 08:04:45 +0000916 bits<5> VD;
917 bits<5> VB;
918
919 let Pattern = pattern;
920
921 let Inst{6-10} = VD;
922 let Inst{11-15} = 0;
923 let Inst{16-20} = VB;
924 let Inst{21-31} = xo;
925}
926
Evan Cheng94b5a802007-07-19 01:14:50 +0000927class VXForm_3<bits<11> xo, dag OOL, dag IOL, string asmstr,
Chris Lattnerdf59d532006-03-27 03:28:57 +0000928 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000929 : I<4, OOL, IOL, asmstr, itin> {
Chris Lattnerdf59d532006-03-27 03:28:57 +0000930 bits<5> VD;
931 bits<5> IMM;
932
933 let Pattern = pattern;
934
935 let Inst{6-10} = VD;
936 let Inst{11-15} = IMM;
937 let Inst{16-20} = 0;
938 let Inst{21-31} = xo;
939}
940
Chris Lattner5a528e52006-04-05 00:03:57 +0000941/// VXForm_4 - VX instructions with "VD,0,0" register fields, like mfvscr.
Evan Cheng94b5a802007-07-19 01:14:50 +0000942class VXForm_4<bits<11> xo, dag OOL, dag IOL, string asmstr,
Chris Lattner5a528e52006-04-05 00:03:57 +0000943 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000944 : I<4, OOL, IOL, asmstr, itin> {
Chris Lattner5a528e52006-04-05 00:03:57 +0000945 bits<5> VD;
946
947 let Pattern = pattern;
948
949 let Inst{6-10} = VD;
950 let Inst{11-15} = 0;
951 let Inst{16-20} = 0;
952 let Inst{21-31} = xo;
953}
954
955/// VXForm_5 - VX instructions with "0,0,VB" register fields, like mtvscr.
Evan Cheng94b5a802007-07-19 01:14:50 +0000956class VXForm_5<bits<11> xo, dag OOL, dag IOL, string asmstr,
Chris Lattner5a528e52006-04-05 00:03:57 +0000957 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000958 : I<4, OOL, IOL, asmstr, itin> {
Chris Lattner5a528e52006-04-05 00:03:57 +0000959 bits<5> VB;
960
961 let Pattern = pattern;
962
963 let Inst{6-10} = 0;
964 let Inst{11-15} = 0;
965 let Inst{16-20} = VB;
966 let Inst{21-31} = xo;
967}
Chris Lattnerdf59d532006-03-27 03:28:57 +0000968
Nate Begeman8492fd32005-11-23 05:29:52 +0000969// E-4 VXR-Form
Evan Cheng94b5a802007-07-19 01:14:50 +0000970class VXRForm_1<bits<10> xo, dag OOL, dag IOL, string asmstr,
Nate Begeman8492fd32005-11-23 05:29:52 +0000971 InstrItinClass itin, list<dag> pattern>
Evan Cheng94b5a802007-07-19 01:14:50 +0000972 : I<4, OOL, IOL, asmstr, itin> {
Nate Begeman8492fd32005-11-23 05:29:52 +0000973 bits<5> VD;
974 bits<5> VA;
975 bits<5> VB;
Chris Lattner793cbcb2006-03-26 04:57:17 +0000976 bit RC = 0;
Nate Begeman8492fd32005-11-23 05:29:52 +0000977
Nate Begeman11fd6b22005-11-26 22:39:34 +0000978 let Pattern = pattern;
979
Nate Begeman8492fd32005-11-23 05:29:52 +0000980 let Inst{6-10} = VD;
981 let Inst{11-15} = VA;
982 let Inst{16-20} = VB;
Chris Lattner793cbcb2006-03-26 04:57:17 +0000983 let Inst{21} = RC;
Nate Begeman8492fd32005-11-23 05:29:52 +0000984 let Inst{22-31} = xo;
985}
986
Misha Brukman6b21bde2004-08-02 21:56:35 +0000987//===----------------------------------------------------------------------===//
Evan Cheng94b5a802007-07-19 01:14:50 +0000988class Pseudo<dag OOL, dag IOL, string asmstr, list<dag> pattern>
989 : I<0, OOL, IOL, asmstr, NoItinerary> {
Nate Begeman61738782004-09-02 08:13:00 +0000990 let PPC64 = 0;
Chris Lattnerb439dad2005-10-25 20:58:43 +0000991 let Pattern = pattern;
Nate Begeman61738782004-09-02 08:13:00 +0000992 let Inst{31-0} = 0;
Misha Brukmancd4f51b2004-08-02 16:54:54 +0000993}