blob: 2b19bc6d1d95847651a4210e82665f0968c53825 [file] [log] [blame]
Misha Brukmancd4f51b2004-08-02 16:54:54 +00001//===- PowerPCInstrFormats.td - PowerPC Instruction Formats --*- tablegen -*-=//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
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
Jim Laskey74ab9962005-10-19 19:51:16 +000014class I<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin>
15 : 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
Nate Begeman4bfceb12004-09-04 05:00:00 +000020 let Name = "";
Misha Brukmandad438b2004-08-10 22:47:03 +000021 let Namespace = "PPC";
Misha Brukman5295e1d2004-08-09 17:24:04 +000022 let Inst{0-5} = opcode;
Nate Begeman4bfceb12004-09-04 05:00:00 +000023 let OperandList = OL;
24 let AsmString = asmstr;
Jim Laskey74ab9962005-10-19 19:51:16 +000025 let Itinerary = itin;
Chris Lattner51348c52006-03-12 09:13:49 +000026
27 /// These fields correspond to the fields in PPCInstrInfo.h. Any changes to
28 /// these must be reflected there! See comments there for what these are.
29 bits<1> PPC970_First = 0;
30 bits<1> PPC970_Single = 0;
Chris Lattner7579cfb2006-03-13 05:15:10 +000031 bits<1> PPC970_Cracked = 0;
Chris Lattner51348c52006-03-12 09:13:49 +000032 bits<3> PPC970_Unit = 0;
Misha Brukmancd4f51b2004-08-02 16:54:54 +000033}
34
Chris Lattner7579cfb2006-03-13 05:15:10 +000035class PPC970_DGroup_First { bits<1> PPC970_First = 1; }
36class PPC970_DGroup_Single { bits<1> PPC970_Single = 1; }
37class PPC970_DGroup_Cracked { bits<1> PPC970_Cracked = 1; }
Chris Lattner51348c52006-03-12 09:13:49 +000038class PPC970_MicroCode;
39
40class PPC970_Unit_Pseudo { bits<3> PPC970_Unit = 0; }
41class PPC970_Unit_FXU { bits<3> PPC970_Unit = 1; }
42class PPC970_Unit_LSU { bits<3> PPC970_Unit = 2; }
43class PPC970_Unit_FPU { bits<3> PPC970_Unit = 3; }
44class PPC970_Unit_CRU { bits<3> PPC970_Unit = 4; }
45class PPC970_Unit_VALU { bits<3> PPC970_Unit = 5; }
46class PPC970_Unit_VPERM { bits<3> PPC970_Unit = 6; }
47class PPC970_Unit_BRU { bits<3> PPC970_Unit = 7; }
48
49
Misha Brukman5295e1d2004-08-09 17:24:04 +000050// 1.7.1 I-Form
Jim Laskey74ab9962005-10-19 19:51:16 +000051class IForm<bits<6> opcode, bit aa, bit lk, dag OL, string asmstr,
Chris Lattnerd9d18af2005-12-04 18:42:54 +000052 InstrItinClass itin, list<dag> pattern>
Jim Laskey74ab9962005-10-19 19:51:16 +000053 : I<opcode, OL, asmstr, itin> {
Chris Lattnerd9d18af2005-12-04 18:42:54 +000054 let Pattern = pattern;
Misha Brukman189f3dc2004-10-14 05:55:37 +000055 bits<24> LI;
Misha Brukman6b21bde2004-08-02 21:56:35 +000056
Misha Brukman5295e1d2004-08-09 17:24:04 +000057 let Inst{6-29} = LI;
58 let Inst{30} = aa;
59 let Inst{31} = lk;
Misha Brukman6b21bde2004-08-02 21:56:35 +000060}
61
Misha Brukman5295e1d2004-08-09 17:24:04 +000062// 1.7.2 B-Form
Chris Lattner542dfd52006-11-18 00:32:03 +000063class BForm<bits<6> opcode, bit aa, bit lk, dag OL, string asmstr>
64 : I<opcode, OL, asmstr, BrB> {
Chris Lattner33fc1d42006-11-17 23:53:28 +000065 bits<7> BIBO; // 2 bits of BI and 5 bits of BO.
66 bits<3> CR;
67 bits<14> BD;
68
69 bits<5> BI;
70 let BI{0-1} = BIBO{5-6};
71 let BI{2-4} = CR{0-2};
72
73 let Inst{6-10} = BIBO{4-0};
74 let Inst{11-15} = BI;
75 let Inst{16-29} = BD;
76 let Inst{30} = aa;
77 let Inst{31} = lk;
78}
79
80
Misha Brukman5295e1d2004-08-09 17:24:04 +000081// 1.7.4 D-Form
Jim Laskey74ab9962005-10-19 19:51:16 +000082class DForm_base<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
Nate Begemanade6f9a2005-12-09 23:54:18 +000083 list<dag> pattern>
84 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +000085 bits<5> A;
86 bits<5> B;
87 bits<16> C;
Nate Begemanade6f9a2005-12-09 23:54:18 +000088
89 let Pattern = pattern;
Misha Brukman6b21bde2004-08-02 21:56:35 +000090
Misha Brukman6b21bde2004-08-02 21:56:35 +000091 let Inst{6-10} = A;
92 let Inst{11-15} = B;
93 let Inst{16-31} = C;
94}
95
Nate Begemanade6f9a2005-12-09 23:54:18 +000096class DForm_1<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
97 list<dag> pattern>
98 : I<opcode, OL, asmstr, itin> {
Misha Brukman15b0fb52004-10-23 06:08:38 +000099 bits<5> A;
100 bits<16> C;
101 bits<5> B;
Nate Begemanade6f9a2005-12-09 23:54:18 +0000102
103 let Pattern = pattern;
Misha Brukman15b0fb52004-10-23 06:08:38 +0000104
Misha Brukman15b0fb52004-10-23 06:08:38 +0000105 let Inst{6-10} = A;
106 let Inst{11-15} = B;
107 let Inst{16-31} = C;
Misha Brukman6b21bde2004-08-02 21:56:35 +0000108}
109
Jim Laskey74ab9962005-10-19 19:51:16 +0000110class DForm_2<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
111 list<dag> pattern>
112 : DForm_base<opcode, OL, asmstr, itin, pattern>;
Misha Brukman6b21bde2004-08-02 21:56:35 +0000113
Jim Laskey74ab9962005-10-19 19:51:16 +0000114class DForm_2_r0<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
115 list<dag> pattern>
116 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000117 bits<5> A;
118 bits<16> B;
Nate Begeman4bfceb12004-09-04 05:00:00 +0000119
Chris Lattner2d8032b2005-09-08 17:33:10 +0000120 let Pattern = pattern;
121
Nate Begeman4bfceb12004-09-04 05:00:00 +0000122 let Inst{6-10} = A;
123 let Inst{11-15} = 0;
124 let Inst{16-31} = B;
Misha Brukman6b21bde2004-08-02 21:56:35 +0000125}
126
Jim Laskey74ab9962005-10-19 19:51:16 +0000127class DForm_4<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
128 list<dag> pattern>
Nate Begemanade6f9a2005-12-09 23:54:18 +0000129 : I<opcode, OL, asmstr, itin> {
Chris Lattner022e2712004-11-24 02:15:41 +0000130 bits<5> B;
131 bits<5> A;
132 bits<16> C;
133
Chris Lattner76cb0062005-09-08 17:40:49 +0000134 let Pattern = pattern;
135
Chris Lattner022e2712004-11-24 02:15:41 +0000136 let Inst{6-10} = A;
137 let Inst{11-15} = B;
138 let Inst{16-31} = C;
139}
Nate Begeman4bfceb12004-09-04 05:00:00 +0000140
Nate Begemanade6f9a2005-12-09 23:54:18 +0000141class DForm_4_zero<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
142 list<dag> pattern>
143 : DForm_1<opcode, OL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000144 let A = 0;
145 let B = 0;
146 let C = 0;
147}
148
Jim Laskey74ab9962005-10-19 19:51:16 +0000149class DForm_5<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin>
150 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000151 bits<3> BF;
152 bits<1> L;
153 bits<5> RA;
154 bits<16> I;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000155
Misha Brukman5295e1d2004-08-09 17:24:04 +0000156 let Inst{6-8} = BF;
157 let Inst{9} = 0;
158 let Inst{10} = L;
159 let Inst{11-15} = RA;
160 let Inst{16-31} = I;
161}
162
Jim Laskey74ab9962005-10-19 19:51:16 +0000163class DForm_5_ext<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin>
164 : DForm_5<opcode, OL, asmstr, itin> {
Chris Lattnerb2367e32005-04-19 04:59:28 +0000165 let L = PPC64;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000166}
167
Jim Laskey74ab9962005-10-19 19:51:16 +0000168class DForm_6<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin>
169 : DForm_5<opcode, OL, asmstr, itin>;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000170
Jim Laskey74ab9962005-10-19 19:51:16 +0000171class DForm_6_ext<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin>
172 : DForm_6<opcode, OL, asmstr, itin> {
Chris Lattnerb2367e32005-04-19 04:59:28 +0000173 let L = PPC64;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000174}
175
Misha Brukman5295e1d2004-08-09 17:24:04 +0000176
Misha Brukman28beda92004-08-11 15:54:36 +0000177// 1.7.5 DS-Form
Jim Laskey74ab9962005-10-19 19:51:16 +0000178class DSForm_1<bits<6> opcode, bits<2> xo, dag OL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000179 InstrItinClass itin, list<dag> pattern>
Jim Laskey74ab9962005-10-19 19:51:16 +0000180 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000181 bits<5> RST;
182 bits<14> DS;
183 bits<5> RA;
Misha Brukman28beda92004-08-11 15:54:36 +0000184
Nate Begemanade6f9a2005-12-09 23:54:18 +0000185 let Pattern = pattern;
186
Misha Brukman28beda92004-08-11 15:54:36 +0000187 let Inst{6-10} = RST;
188 let Inst{11-15} = RA;
189 let Inst{16-29} = DS;
190 let Inst{30-31} = xo;
191}
192
Misha Brukman5295e1d2004-08-09 17:24:04 +0000193// 1.7.6 X-Form
Nate Begemanade6f9a2005-12-09 23:54:18 +0000194class XForm_base_r3xo<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
195 InstrItinClass itin, list<dag> pattern>
Jim Laskey74ab9962005-10-19 19:51:16 +0000196 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000197 bits<5> RST;
198 bits<5> A;
199 bits<5> B;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000200
Nate Begemanade6f9a2005-12-09 23:54:18 +0000201 let Pattern = pattern;
202
Chris Lattnerf9172e12005-04-19 05:15:18 +0000203 bit RC = 0; // set by isDOT
204
Misha Brukman28beda92004-08-11 15:54:36 +0000205 let Inst{6-10} = RST;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000206 let Inst{11-15} = A;
207 let Inst{16-20} = B;
208 let Inst{21-30} = xo;
Chris Lattnerf9172e12005-04-19 05:15:18 +0000209 let Inst{31} = RC;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000210}
211
Chris Lattner130888ad2004-11-24 03:52:02 +0000212// This is the same as XForm_base_r3xo, but the first two operands are swapped
213// when code is emitted.
214class XForm_base_r3xo_swapped
Jim Laskey74ab9962005-10-19 19:51:16 +0000215 <bits<6> opcode, bits<10> xo, dag OL, string asmstr,
216 InstrItinClass itin>
217 : I<opcode, OL, asmstr, itin> {
Chris Lattner130888ad2004-11-24 03:52:02 +0000218 bits<5> A;
219 bits<5> RST;
220 bits<5> B;
221
Chris Lattnerf9172e12005-04-19 05:15:18 +0000222 bit RC = 0; // set by isDOT
223
Chris Lattner130888ad2004-11-24 03:52:02 +0000224 let Inst{6-10} = RST;
225 let Inst{11-15} = A;
226 let Inst{16-20} = B;
227 let Inst{21-30} = xo;
Chris Lattnerf9172e12005-04-19 05:15:18 +0000228 let Inst{31} = RC;
Chris Lattner130888ad2004-11-24 03:52:02 +0000229}
230
Nate Begeman765cb5f2004-08-13 02:19:26 +0000231
Jim Laskey74ab9962005-10-19 19:51:16 +0000232class XForm_1<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000233 InstrItinClass itin, list<dag> pattern>
234 : XForm_base_r3xo<opcode, xo, OL, asmstr, itin, pattern>;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000235
Jim Laskey74ab9962005-10-19 19:51:16 +0000236class XForm_6<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
237 InstrItinClass itin, list<dag> pattern>
238 : XForm_base_r3xo_swapped<opcode, xo, OL, asmstr, itin> {
Chris Lattnerdcbb5612005-09-02 22:35:53 +0000239 let Pattern = pattern;
240}
Misha Brukman5295e1d2004-08-09 17:24:04 +0000241
Jim Laskey74ab9962005-10-19 19:51:16 +0000242class XForm_8<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000243 InstrItinClass itin, list<dag> pattern>
244 : XForm_base_r3xo<opcode, xo, OL, asmstr, itin, pattern>;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000245
Jim Laskey74ab9962005-10-19 19:51:16 +0000246class XForm_10<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
247 InstrItinClass itin, list<dag> pattern>
248 : XForm_base_r3xo_swapped<opcode, xo, OL, asmstr, itin> {
249 let Pattern = pattern;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000250}
251
Chris Lattnerdcbb5612005-09-02 22:35:53 +0000252class XForm_11<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000253 InstrItinClass itin, list<dag> pattern>
254 : XForm_base_r3xo_swapped<opcode, xo, OL, asmstr, itin> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000255 let B = 0;
Chris Lattnerdcbb5612005-09-02 22:35:53 +0000256 let Pattern = pattern;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000257}
258
Jim Laskey74ab9962005-10-19 19:51:16 +0000259class XForm_16<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
260 InstrItinClass itin>
261 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000262 bits<3> BF;
263 bits<1> L;
264 bits<5> RA;
265 bits<5> RB;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000266
Misha Brukman5295e1d2004-08-09 17:24:04 +0000267 let Inst{6-8} = BF;
268 let Inst{9} = 0;
269 let Inst{10} = L;
270 let Inst{11-15} = RA;
271 let Inst{16-20} = RB;
272 let Inst{21-30} = xo;
273 let Inst{31} = 0;
274}
275
Jim Laskey74ab9962005-10-19 19:51:16 +0000276class XForm_16_ext<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
277 InstrItinClass itin>
278 : XForm_16<opcode, xo, OL, asmstr, itin> {
Chris Lattner15709c22005-04-19 04:51:30 +0000279 let L = PPC64;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000280}
281
Jim Laskey74ab9962005-10-19 19:51:16 +0000282class XForm_17<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
283 InstrItinClass itin>
284 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000285 bits<3> BF;
286 bits<5> FRA;
287 bits<5> FRB;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000288
Misha Brukman5295e1d2004-08-09 17:24:04 +0000289 let Inst{6-8} = BF;
290 let Inst{9-10} = 0;
291 let Inst{11-15} = FRA;
292 let Inst{16-20} = FRB;
293 let Inst{21-30} = xo;
294 let Inst{31} = 0;
295}
296
Jim Laskey74ab9962005-10-19 19:51:16 +0000297class XForm_25<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000298 InstrItinClass itin, list<dag> pattern>
299 : XForm_base_r3xo<opcode, xo, OL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000300}
301
Jim Laskey74ab9962005-10-19 19:51:16 +0000302class XForm_26<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
303 InstrItinClass itin, list<dag> pattern>
Nate Begemanade6f9a2005-12-09 23:54:18 +0000304 : XForm_base_r3xo<opcode, xo, OL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000305 let A = 0;
306}
307
Jim Laskey74ab9962005-10-19 19:51:16 +0000308class XForm_28<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000309 InstrItinClass itin, list<dag> pattern>
310 : XForm_base_r3xo<opcode, xo, OL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000311}
312
Chris Lattnerc8587d42006-06-06 21:29:23 +0000313// DCB_Form - Form X instruction, used for dcb* instructions.
314class DCB_Form<bits<10> xo, bits<5> immfield, dag OL, string asmstr,
315 InstrItinClass itin, list<dag> pattern>
316 : I<31, OL, asmstr, itin> {
317 bits<5> A;
318 bits<5> B;
319
320 let Pattern = pattern;
321
322 let Inst{6-10} = immfield;
323 let Inst{11-15} = A;
324 let Inst{16-20} = B;
325 let Inst{21-30} = xo;
326 let Inst{31} = 0;
327}
328
329
Chris Lattnerc94d9322006-04-05 22:27:14 +0000330// DSS_Form - Form X instruction, used for altivec dss* instructions.
331class DSS_Form<bits<10> xo, dag OL, string asmstr,
332 InstrItinClass itin, list<dag> pattern>
333 : I<31, OL, asmstr, itin> {
334 bits<1> T;
335 bits<2> STRM;
336 bits<5> A;
337 bits<5> B;
338
339 let Pattern = pattern;
340
341 let Inst{6} = T;
342 let Inst{7-8} = 0;
343 let Inst{9-10} = STRM;
344 let Inst{11-15} = A;
345 let Inst{16-20} = B;
346 let Inst{21-30} = xo;
347 let Inst{31} = 0;
348}
349
Misha Brukman5295e1d2004-08-09 17:24:04 +0000350// 1.7.7 XL-Form
Jim Laskey74ab9962005-10-19 19:51:16 +0000351class XLForm_1<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
352 InstrItinClass itin>
353 : I<opcode, OL, asmstr, itin> {
Nate Begeman65a82c52005-04-14 03:20:38 +0000354 bits<3> CRD;
355 bits<2> CRDb;
356 bits<3> CRA;
357 bits<2> CRAb;
358 bits<3> CRB;
359 bits<2> CRBb;
360
361 let Inst{6-8} = CRD;
362 let Inst{9-10} = CRDb;
363 let Inst{11-13} = CRA;
364 let Inst{14-15} = CRAb;
365 let Inst{16-18} = CRB;
366 let Inst{19-20} = CRBb;
367 let Inst{21-30} = xo;
368 let Inst{31} = 0;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000369}
370
Jim Laskey74ab9962005-10-19 19:51:16 +0000371class XLForm_2<bits<6> opcode, bits<10> xo, bit lk, dag OL, string asmstr,
Nate Begemanb11b8e42005-12-20 00:26:01 +0000372 InstrItinClass itin, list<dag> pattern>
Jim Laskey74ab9962005-10-19 19:51:16 +0000373 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000374 bits<5> BO;
375 bits<5> BI;
376 bits<2> BH;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000377
Nate Begemanb11b8e42005-12-20 00:26:01 +0000378 let Pattern = pattern;
379
Misha Brukman5295e1d2004-08-09 17:24:04 +0000380 let Inst{6-10} = BO;
381 let Inst{11-15} = BI;
382 let Inst{16-18} = 0;
383 let Inst{19-20} = BH;
384 let Inst{21-30} = xo;
385 let Inst{31} = lk;
386}
387
Chris Lattner29597892006-11-04 05:42:48 +0000388class XLForm_2_br<bits<6> opcode, bits<10> xo, bit lk,
389 dag OL, string asmstr, InstrItinClass itin, list<dag> pattern>
390 : XLForm_2<opcode, xo, lk, OL, asmstr, itin, pattern> {
391 bits<7> BIBO; // 2 bits of BI and 5 bits of BO.
392 bits<3> CR;
393
Chris Lattnerd94477f2006-11-07 01:51:50 +0000394 let BO = BIBO{2-6};
395 let BI{0-1} = BIBO{0-1};
Chris Lattner29597892006-11-04 05:42:48 +0000396 let BI{2-4} = CR;
397 let BH = 0;
398}
399
400
Jim Laskey74ab9962005-10-19 19:51:16 +0000401class XLForm_2_ext<bits<6> opcode, bits<10> xo, bits<5> bo, bits<5> bi, bit lk,
Nate Begemanb11b8e42005-12-20 00:26:01 +0000402 dag OL, string asmstr, InstrItinClass itin, list<dag> pattern>
403 : XLForm_2<opcode, xo, lk, OL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000404 let BO = bo;
405 let BI = bi;
406 let BH = 0;
407}
408
Jim Laskey74ab9962005-10-19 19:51:16 +0000409class XLForm_3<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
410 InstrItinClass itin>
411 : I<opcode, OL, asmstr, itin> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000412 bits<3> BF;
413 bits<3> BFA;
414
415 let Inst{6-8} = BF;
416 let Inst{9-10} = 0;
417 let Inst{11-13} = BFA;
418 let Inst{14-15} = 0;
419 let Inst{16-20} = 0;
420 let Inst{21-30} = xo;
421 let Inst{31} = 0;
422}
423
Misha Brukman5295e1d2004-08-09 17:24:04 +0000424// 1.7.8 XFX-Form
Jim Laskey74ab9962005-10-19 19:51:16 +0000425class XFXForm_1<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
426 InstrItinClass itin>
427 : I<opcode, OL, asmstr, itin> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000428 bits<5> RT;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000429 bits<10> SPR;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000430
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000431 let Inst{6-10} = RT;
Nate Begeman048b2632005-11-29 22:42:50 +0000432 let Inst{11} = SPR{4};
433 let Inst{12} = SPR{3};
434 let Inst{13} = SPR{2};
435 let Inst{14} = SPR{1};
436 let Inst{15} = SPR{0};
437 let Inst{16} = SPR{9};
438 let Inst{17} = SPR{8};
439 let Inst{18} = SPR{7};
440 let Inst{19} = SPR{6};
441 let Inst{20} = SPR{5};
Misha Brukman5295e1d2004-08-09 17:24:04 +0000442 let Inst{21-30} = xo;
443 let Inst{31} = 0;
444}
445
Chris Lattnerd790d222005-04-19 04:40:07 +0000446class XFXForm_1_ext<bits<6> opcode, bits<10> xo, bits<10> spr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000447 dag OL, string asmstr, InstrItinClass itin>
448 : XFXForm_1<opcode, xo, OL, asmstr, itin> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000449 let SPR = spr;
450}
451
Jim Laskey74ab9962005-10-19 19:51:16 +0000452class XFXForm_3<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
453 InstrItinClass itin>
454 : I<opcode, OL, asmstr, itin> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000455 bits<5> RT;
456
457 let Inst{6-10} = RT;
458 let Inst{11-20} = 0;
459 let Inst{21-30} = xo;
460 let Inst{31} = 0;
461}
462
Jim Laskey74ab9962005-10-19 19:51:16 +0000463class XFXForm_5<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
464 InstrItinClass itin>
465 : I<opcode, OL, asmstr, itin> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000466 bits<8> FXM;
467 bits<5> ST;
468
469 let Inst{6-10} = ST;
Nate Begeman9a838672005-08-08 20:04:52 +0000470 let Inst{11} = 0;
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000471 let Inst{12-19} = FXM;
472 let Inst{20} = 0;
473 let Inst{21-30} = xo;
474 let Inst{31} = 0;
475}
476
Jim Laskey74ab9962005-10-19 19:51:16 +0000477class XFXForm_5a<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
478 InstrItinClass itin>
479 : I<opcode, OL, asmstr, itin> {
Nate Begeman9a838672005-08-08 20:04:52 +0000480 bits<5> ST;
481 bits<8> FXM;
482
483 let Inst{6-10} = ST;
484 let Inst{11} = 1;
485 let Inst{12-19} = FXM;
486 let Inst{20} = 0;
487 let Inst{21-30} = xo;
488 let Inst{31} = 0;
489}
490
Jim Laskey74ab9962005-10-19 19:51:16 +0000491class XFXForm_7<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
492 InstrItinClass itin>
493 : XFXForm_1<opcode, xo, OL, asmstr, itin>;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000494
Nate Begeman143cf942004-08-30 02:28:06 +0000495class XFXForm_7_ext<bits<6> opcode, bits<10> xo, bits<10> spr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000496 dag OL, string asmstr, InstrItinClass itin>
497 : XFXForm_7<opcode, xo, OL, asmstr, itin> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000498 let SPR = spr;
499}
500
Nate Begeman765cb5f2004-08-13 02:19:26 +0000501// 1.7.10 XS-Form
Jim Laskey74ab9962005-10-19 19:51:16 +0000502class XSForm_1<bits<6> opcode, bits<9> xo, dag OL, string asmstr,
Chris Lattnera2af3f42006-06-27 20:07:26 +0000503 InstrItinClass itin, list<dag> pattern>
Jim Laskey74ab9962005-10-19 19:51:16 +0000504 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000505 bits<5> RS;
506 bits<5> A;
507 bits<6> SH;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000508
Chris Lattnerf9172e12005-04-19 05:15:18 +0000509 bit RC = 0; // set by isDOT
Chris Lattnera2af3f42006-06-27 20:07:26 +0000510 let Pattern = pattern;
Chris Lattnerf9172e12005-04-19 05:15:18 +0000511
Nate Begeman765cb5f2004-08-13 02:19:26 +0000512 let Inst{6-10} = RS;
513 let Inst{11-15} = A;
514 let Inst{16-20} = SH{1-5};
515 let Inst{21-29} = xo;
516 let Inst{30} = SH{0};
Chris Lattnerf9172e12005-04-19 05:15:18 +0000517 let Inst{31} = RC;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000518}
519
Misha Brukman5295e1d2004-08-09 17:24:04 +0000520// 1.7.11 XO-Form
Chris Lattner3a1002d2005-09-02 21:18:00 +0000521class XOForm_1<bits<6> opcode, bits<9> xo, bit oe, dag OL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000522 InstrItinClass itin, list<dag> pattern>
523 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000524 bits<5> RT;
525 bits<5> RA;
526 bits<5> RB;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000527
Chris Lattner3a1002d2005-09-02 21:18:00 +0000528 let Pattern = pattern;
529
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000530 bit RC = 0; // set by isDOT
531
Misha Brukman5295e1d2004-08-09 17:24:04 +0000532 let Inst{6-10} = RT;
533 let Inst{11-15} = RA;
534 let Inst{16-20} = RB;
535 let Inst{21} = oe;
536 let Inst{22-30} = xo;
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000537 let Inst{31} = RC;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000538}
539
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000540class XOForm_3<bits<6> opcode, bits<9> xo, bit oe,
Jim Laskey74ab9962005-10-19 19:51:16 +0000541 dag OL, string asmstr, InstrItinClass itin, list<dag> pattern>
542 : XOForm_1<opcode, xo, oe, OL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000543 let RB = 0;
544}
545
546// 1.7.12 A-Form
Chris Lattner027a2672005-09-29 23:34:24 +0000547class AForm_1<bits<6> opcode, bits<5> xo, dag OL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000548 InstrItinClass itin, list<dag> pattern>
549 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000550 bits<5> FRT;
551 bits<5> FRA;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000552 bits<5> FRC;
Chris Lattnerda76c162004-11-25 04:11:07 +0000553 bits<5> FRB;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000554
Chris Lattner027a2672005-09-29 23:34:24 +0000555 let Pattern = pattern;
556
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000557 bit RC = 0; // set by isDOT
558
Misha Brukman5295e1d2004-08-09 17:24:04 +0000559 let Inst{6-10} = FRT;
560 let Inst{11-15} = FRA;
561 let Inst{16-20} = FRB;
562 let Inst{21-25} = FRC;
563 let Inst{26-30} = xo;
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000564 let Inst{31} = RC;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000565}
566
Jim Laskey74ab9962005-10-19 19:51:16 +0000567class AForm_2<bits<6> opcode, bits<5> xo, dag OL, string asmstr,
568 InstrItinClass itin, list<dag> pattern>
569 : AForm_1<opcode, xo, OL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000570 let FRC = 0;
571}
572
Jim Laskey74ab9962005-10-19 19:51:16 +0000573class AForm_3<bits<6> opcode, bits<5> xo, dag OL, string asmstr,
574 InstrItinClass itin, list<dag> pattern>
575 : AForm_1<opcode, xo, OL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000576 let FRB = 0;
577}
578
Misha Brukman5295e1d2004-08-09 17:24:04 +0000579// 1.7.13 M-Form
Jim Laskey74ab9962005-10-19 19:51:16 +0000580class MForm_1<bits<6> opcode, dag OL, string asmstr,
581 InstrItinClass itin, list<dag> pattern>
582 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000583 bits<5> RA;
Chris Lattner5f4b0e12004-11-23 19:23:32 +0000584 bits<5> RS;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000585 bits<5> RB;
586 bits<5> MB;
587 bits<5> ME;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000588
Nate Begeman9f3c26c2005-10-19 18:42:01 +0000589 let Pattern = pattern;
590
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000591 bit RC = 0; // set by isDOT
592
Misha Brukman5295e1d2004-08-09 17:24:04 +0000593 let Inst{6-10} = RS;
594 let Inst{11-15} = RA;
595 let Inst{16-20} = RB;
596 let Inst{21-25} = MB;
597 let Inst{26-30} = ME;
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000598 let Inst{31} = RC;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000599}
600
Jim Laskey74ab9962005-10-19 19:51:16 +0000601class MForm_2<bits<6> opcode, dag OL, string asmstr,
602 InstrItinClass itin, list<dag> pattern>
603 : MForm_1<opcode, OL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000604}
605
Nate Begeman765cb5f2004-08-13 02:19:26 +0000606// 1.7.14 MD-Form
Jim Laskey74ab9962005-10-19 19:51:16 +0000607class MDForm_1<bits<6> opcode, bits<3> xo, dag OL, string asmstr,
608 InstrItinClass itin, list<dag> pattern>
609 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000610 bits<5> RA;
Chris Lattner077b86a2006-07-13 21:52:41 +0000611 bits<5> RS;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000612 bits<6> SH;
613 bits<6> MBE;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000614
Nate Begeman9f3c26c2005-10-19 18:42:01 +0000615 let Pattern = pattern;
616
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000617 bit RC = 0; // set by isDOT
618
Nate Begeman765cb5f2004-08-13 02:19:26 +0000619 let Inst{6-10} = RS;
620 let Inst{11-15} = RA;
Chris Lattnerdd57ac42006-07-12 22:08:13 +0000621 let Inst{16-20} = { SH{4}, SH{3}, SH{2}, SH{1}, SH{0} };
622 let Inst{21-26} = { MBE{4}, MBE{3}, MBE{2}, MBE{1}, MBE{0}, MBE{5} };
Nate Begeman765cb5f2004-08-13 02:19:26 +0000623 let Inst{27-29} = xo;
Chris Lattnerdd57ac42006-07-12 22:08:13 +0000624 let Inst{30} = SH{5};
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000625 let Inst{31} = RC;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000626}
627
Chris Lattnerc94d9322006-04-05 22:27:14 +0000628
629
Nate Begeman8492fd32005-11-23 05:29:52 +0000630// E-1 VA-Form
Chris Lattner1738c292006-03-27 03:34:17 +0000631
632// VAForm_1 - DACB ordering.
Nate Begeman8492fd32005-11-23 05:29:52 +0000633class VAForm_1<bits<6> xo, dag OL, string asmstr,
634 InstrItinClass itin, list<dag> pattern>
635 : I<4, OL, asmstr, itin> {
636 bits<5> VD;
637 bits<5> VA;
Nate Begeman8492fd32005-11-23 05:29:52 +0000638 bits<5> VC;
Chris Lattner4e737172006-03-22 01:44:36 +0000639 bits<5> VB;
Nate Begeman11fd6b22005-11-26 22:39:34 +0000640
641 let Pattern = pattern;
Nate Begeman8492fd32005-11-23 05:29:52 +0000642
643 let Inst{6-10} = VD;
644 let Inst{11-15} = VA;
645 let Inst{16-20} = VB;
646 let Inst{21-25} = VC;
647 let Inst{26-31} = xo;
648}
649
Chris Lattner1738c292006-03-27 03:34:17 +0000650// VAForm_1a - DABC ordering.
651class VAForm_1a<bits<6> xo, dag OL, string asmstr,
652 InstrItinClass itin, list<dag> pattern>
653 : I<4, OL, asmstr, itin> {
654 bits<5> VD;
655 bits<5> VA;
656 bits<5> VB;
657 bits<5> VC;
658
659 let Pattern = pattern;
660
661 let Inst{6-10} = VD;
662 let Inst{11-15} = VA;
663 let Inst{16-20} = VB;
664 let Inst{21-25} = VC;
665 let Inst{26-31} = xo;
666}
667
Chris Lattner53e07de2006-03-26 00:41:48 +0000668class VAForm_2<bits<6> xo, dag OL, string asmstr,
669 InstrItinClass itin, list<dag> pattern>
670 : I<4, OL, asmstr, itin> {
671 bits<5> VD;
672 bits<5> VA;
673 bits<5> VB;
674 bits<4> SH;
675
676 let Pattern = pattern;
677
678 let Inst{6-10} = VD;
679 let Inst{11-15} = VA;
680 let Inst{16-20} = VB;
681 let Inst{21} = 0;
682 let Inst{22-25} = SH;
683 let Inst{26-31} = xo;
684}
685
Nate Begeman8492fd32005-11-23 05:29:52 +0000686// E-2 VX-Form
687class VXForm_1<bits<11> xo, dag OL, string asmstr,
688 InstrItinClass itin, list<dag> pattern>
689 : I<4, OL, asmstr, itin> {
690 bits<5> VD;
691 bits<5> VA;
692 bits<5> VB;
693
Nate Begeman11fd6b22005-11-26 22:39:34 +0000694 let Pattern = pattern;
695
Nate Begeman8492fd32005-11-23 05:29:52 +0000696 let Inst{6-10} = VD;
697 let Inst{11-15} = VA;
698 let Inst{16-20} = VB;
699 let Inst{21-31} = xo;
700}
701
Nate Begeman40f081d2005-12-14 00:34:09 +0000702class VXForm_setzero<bits<11> xo, dag OL, string asmstr,
703 InstrItinClass itin, list<dag> pattern>
704 : VXForm_1<xo, OL, asmstr, itin, pattern> {
705 let VA = VD;
706 let VB = VD;
707}
708
709
Nate Begemanc1381182005-11-29 08:04:45 +0000710class VXForm_2<bits<11> xo, dag OL, string asmstr,
711 InstrItinClass itin, list<dag> pattern>
712 : I<4, OL, asmstr, itin> {
713 bits<5> VD;
714 bits<5> VB;
715
716 let Pattern = pattern;
717
718 let Inst{6-10} = VD;
719 let Inst{11-15} = 0;
720 let Inst{16-20} = VB;
721 let Inst{21-31} = xo;
722}
723
Chris Lattnerdf59d532006-03-27 03:28:57 +0000724class VXForm_3<bits<11> xo, dag OL, string asmstr,
725 InstrItinClass itin, list<dag> pattern>
726 : I<4, OL, asmstr, itin> {
727 bits<5> VD;
728 bits<5> IMM;
729
730 let Pattern = pattern;
731
732 let Inst{6-10} = VD;
733 let Inst{11-15} = IMM;
734 let Inst{16-20} = 0;
735 let Inst{21-31} = xo;
736}
737
Chris Lattner5a528e52006-04-05 00:03:57 +0000738/// VXForm_4 - VX instructions with "VD,0,0" register fields, like mfvscr.
739class VXForm_4<bits<11> xo, dag OL, string asmstr,
740 InstrItinClass itin, list<dag> pattern>
741 : I<4, OL, asmstr, itin> {
742 bits<5> VD;
743
744 let Pattern = pattern;
745
746 let Inst{6-10} = VD;
747 let Inst{11-15} = 0;
748 let Inst{16-20} = 0;
749 let Inst{21-31} = xo;
750}
751
752/// VXForm_5 - VX instructions with "0,0,VB" register fields, like mtvscr.
753class VXForm_5<bits<11> xo, dag OL, string asmstr,
754 InstrItinClass itin, list<dag> pattern>
755 : I<4, OL, asmstr, itin> {
756 bits<5> VB;
757
758 let Pattern = pattern;
759
760 let Inst{6-10} = 0;
761 let Inst{11-15} = 0;
762 let Inst{16-20} = VB;
763 let Inst{21-31} = xo;
764}
Chris Lattnerdf59d532006-03-27 03:28:57 +0000765
Nate Begeman8492fd32005-11-23 05:29:52 +0000766// E-4 VXR-Form
Chris Lattner793cbcb2006-03-26 04:57:17 +0000767class VXRForm_1<bits<10> xo, dag OL, string asmstr,
Nate Begeman8492fd32005-11-23 05:29:52 +0000768 InstrItinClass itin, list<dag> pattern>
769 : I<4, OL, asmstr, itin> {
770 bits<5> VD;
771 bits<5> VA;
772 bits<5> VB;
Chris Lattner793cbcb2006-03-26 04:57:17 +0000773 bit RC = 0;
Nate Begeman8492fd32005-11-23 05:29:52 +0000774
Nate Begeman11fd6b22005-11-26 22:39:34 +0000775 let Pattern = pattern;
776
Nate Begeman8492fd32005-11-23 05:29:52 +0000777 let Inst{6-10} = VD;
778 let Inst{11-15} = VA;
779 let Inst{16-20} = VB;
Chris Lattner793cbcb2006-03-26 04:57:17 +0000780 let Inst{21} = RC;
Nate Begeman8492fd32005-11-23 05:29:52 +0000781 let Inst{22-31} = xo;
782}
783
Misha Brukman6b21bde2004-08-02 21:56:35 +0000784//===----------------------------------------------------------------------===//
Chris Lattnerb439dad2005-10-25 20:58:43 +0000785class Pseudo<dag OL, string asmstr, list<dag> pattern>
Chris Lattner12405742006-01-27 01:46:15 +0000786 : I<0, OL, asmstr, NoItinerary> {
Nate Begeman61738782004-09-02 08:13:00 +0000787 let PPC64 = 0;
Chris Lattnerb439dad2005-10-25 20:58:43 +0000788 let Pattern = pattern;
Nate Begeman61738782004-09-02 08:13:00 +0000789 let Inst{31-0} = 0;
Misha Brukmancd4f51b2004-08-02 16:54:54 +0000790}