blob: c3a78e65bf90aefa3e0c3ddbc953ea8375c9b9ce [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
19 bit VMX = 0; // Default value, override with isVMX
Misha Brukmancd4f51b2004-08-02 16:54:54 +000020
Nate Begeman4bfceb12004-09-04 05:00:00 +000021 let Name = "";
Misha Brukmandad438b2004-08-10 22:47:03 +000022 let Namespace = "PPC";
Misha Brukman5295e1d2004-08-09 17:24:04 +000023 let Inst{0-5} = opcode;
Nate Begeman4bfceb12004-09-04 05:00:00 +000024 let OperandList = OL;
25 let AsmString = asmstr;
Jim Laskey74ab9962005-10-19 19:51:16 +000026 let Itinerary = itin;
Chris Lattner51348c52006-03-12 09:13:49 +000027
28 /// These fields correspond to the fields in PPCInstrInfo.h. Any changes to
29 /// these must be reflected there! See comments there for what these are.
30 bits<1> PPC970_First = 0;
31 bits<1> PPC970_Single = 0;
Chris Lattner7579cfb2006-03-13 05:15:10 +000032 bits<1> PPC970_Cracked = 0;
Chris Lattner51348c52006-03-12 09:13:49 +000033 bits<3> PPC970_Unit = 0;
Misha Brukmancd4f51b2004-08-02 16:54:54 +000034}
35
Chris Lattner7579cfb2006-03-13 05:15:10 +000036class PPC970_DGroup_First { bits<1> PPC970_First = 1; }
37class PPC970_DGroup_Single { bits<1> PPC970_Single = 1; }
38class PPC970_DGroup_Cracked { bits<1> PPC970_Cracked = 1; }
Chris Lattner51348c52006-03-12 09:13:49 +000039class PPC970_MicroCode;
40
41class PPC970_Unit_Pseudo { bits<3> PPC970_Unit = 0; }
42class PPC970_Unit_FXU { bits<3> PPC970_Unit = 1; }
43class PPC970_Unit_LSU { bits<3> PPC970_Unit = 2; }
44class PPC970_Unit_FPU { bits<3> PPC970_Unit = 3; }
45class PPC970_Unit_CRU { bits<3> PPC970_Unit = 4; }
46class PPC970_Unit_VALU { bits<3> PPC970_Unit = 5; }
47class PPC970_Unit_VPERM { bits<3> PPC970_Unit = 6; }
48class PPC970_Unit_BRU { bits<3> PPC970_Unit = 7; }
49
50
Misha Brukman5295e1d2004-08-09 17:24:04 +000051// 1.7.1 I-Form
Jim Laskey74ab9962005-10-19 19:51:16 +000052class IForm<bits<6> opcode, bit aa, bit lk, dag OL, string asmstr,
Chris Lattnerd9d18af2005-12-04 18:42:54 +000053 InstrItinClass itin, list<dag> pattern>
Jim Laskey74ab9962005-10-19 19:51:16 +000054 : I<opcode, OL, asmstr, itin> {
Chris Lattnerd9d18af2005-12-04 18:42:54 +000055 let Pattern = pattern;
Misha Brukman189f3dc2004-10-14 05:55:37 +000056 bits<24> LI;
Misha Brukman6b21bde2004-08-02 21:56:35 +000057
Misha Brukman5295e1d2004-08-09 17:24:04 +000058 let Inst{6-29} = LI;
59 let Inst{30} = aa;
60 let Inst{31} = lk;
Misha Brukman6b21bde2004-08-02 21:56:35 +000061}
62
Misha Brukman5295e1d2004-08-09 17:24:04 +000063// 1.7.2 B-Form
Nate Begeman7b809f52005-08-26 04:11:42 +000064class BForm<bits<6> opcode, bit aa, bit lk, bits<5> bo, bits<2> bicode, dag OL,
Jim Laskey74ab9962005-10-19 19:51:16 +000065 string asmstr, InstrItinClass itin>
66 : I<opcode, OL, asmstr, itin> {
Nate Begeman7b809f52005-08-26 04:11:42 +000067 bits<3> CR;
Misha Brukman189f3dc2004-10-14 05:55:37 +000068 bits<14> BD;
Misha Brukman5295e1d2004-08-09 17:24:04 +000069
Nate Begeman7b809f52005-08-26 04:11:42 +000070 let Inst{6-10} = bo;
71 let Inst{11-13} = CR;
72 let Inst{14-15} = bicode;
Misha Brukman5295e1d2004-08-09 17:24:04 +000073 let Inst{16-29} = BD;
74 let Inst{30} = aa;
75 let Inst{31} = lk;
Misha Brukman6b21bde2004-08-02 21:56:35 +000076}
77
Misha Brukman5295e1d2004-08-09 17:24:04 +000078// 1.7.4 D-Form
Jim Laskey74ab9962005-10-19 19:51:16 +000079class DForm_base<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
Nate Begemanade6f9a2005-12-09 23:54:18 +000080 list<dag> pattern>
81 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +000082 bits<5> A;
83 bits<5> B;
84 bits<16> C;
Nate Begemanade6f9a2005-12-09 23:54:18 +000085
86 let Pattern = pattern;
Misha Brukman6b21bde2004-08-02 21:56:35 +000087
Misha Brukman6b21bde2004-08-02 21:56:35 +000088 let Inst{6-10} = A;
89 let Inst{11-15} = B;
90 let Inst{16-31} = C;
91}
92
Nate Begemanade6f9a2005-12-09 23:54:18 +000093class DForm_1<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
94 list<dag> pattern>
95 : I<opcode, OL, asmstr, itin> {
Misha Brukman15b0fb52004-10-23 06:08:38 +000096 bits<5> A;
97 bits<16> C;
98 bits<5> B;
Nate Begemanade6f9a2005-12-09 23:54:18 +000099
100 let Pattern = pattern;
Misha Brukman15b0fb52004-10-23 06:08:38 +0000101
Misha Brukman15b0fb52004-10-23 06:08:38 +0000102 let Inst{6-10} = A;
103 let Inst{11-15} = B;
104 let Inst{16-31} = C;
Misha Brukman6b21bde2004-08-02 21:56:35 +0000105}
106
Jim Laskey74ab9962005-10-19 19:51:16 +0000107class DForm_2<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
108 list<dag> pattern>
109 : DForm_base<opcode, OL, asmstr, itin, pattern>;
Misha Brukman6b21bde2004-08-02 21:56:35 +0000110
Jim Laskey74ab9962005-10-19 19:51:16 +0000111class DForm_2_r0<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
112 list<dag> pattern>
113 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000114 bits<5> A;
115 bits<16> B;
Nate Begeman4bfceb12004-09-04 05:00:00 +0000116
Chris Lattner2d8032b2005-09-08 17:33:10 +0000117 let Pattern = pattern;
118
Nate Begeman4bfceb12004-09-04 05:00:00 +0000119 let Inst{6-10} = A;
120 let Inst{11-15} = 0;
121 let Inst{16-31} = B;
Misha Brukman6b21bde2004-08-02 21:56:35 +0000122}
123
124// Currently we make the use/def reg distinction in ISel, not tablegen
Nate Begemanade6f9a2005-12-09 23:54:18 +0000125class DForm_3<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
126 list<dag> pattern>
127 : DForm_1<opcode, OL, asmstr, itin, pattern>;
Misha Brukman6b21bde2004-08-02 21:56:35 +0000128
Jim Laskey74ab9962005-10-19 19:51:16 +0000129class DForm_4<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
130 list<dag> pattern>
Nate Begemanade6f9a2005-12-09 23:54:18 +0000131 : I<opcode, OL, asmstr, itin> {
Chris Lattner022e2712004-11-24 02:15:41 +0000132 bits<5> B;
133 bits<5> A;
134 bits<16> C;
135
Chris Lattner76cb0062005-09-08 17:40:49 +0000136 let Pattern = pattern;
137
Chris Lattner022e2712004-11-24 02:15:41 +0000138 let Inst{6-10} = A;
139 let Inst{11-15} = B;
140 let Inst{16-31} = C;
141}
Nate Begeman4bfceb12004-09-04 05:00:00 +0000142
Nate Begemanade6f9a2005-12-09 23:54:18 +0000143class DForm_4_zero<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
144 list<dag> pattern>
145 : DForm_1<opcode, OL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000146 let A = 0;
147 let B = 0;
148 let C = 0;
149}
150
Jim Laskey74ab9962005-10-19 19:51:16 +0000151class DForm_5<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin>
152 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000153 bits<3> BF;
154 bits<1> L;
155 bits<5> RA;
156 bits<16> I;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000157
Misha Brukman5295e1d2004-08-09 17:24:04 +0000158 let Inst{6-8} = BF;
159 let Inst{9} = 0;
160 let Inst{10} = L;
161 let Inst{11-15} = RA;
162 let Inst{16-31} = I;
163}
164
Jim Laskey74ab9962005-10-19 19:51:16 +0000165class DForm_5_ext<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin>
166 : DForm_5<opcode, OL, asmstr, itin> {
Chris Lattnerb2367e32005-04-19 04:59:28 +0000167 let L = PPC64;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000168}
169
Jim Laskey74ab9962005-10-19 19:51:16 +0000170class DForm_6<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin>
171 : DForm_5<opcode, OL, asmstr, itin>;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000172
Jim Laskey74ab9962005-10-19 19:51:16 +0000173class DForm_6_ext<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin>
174 : DForm_6<opcode, OL, asmstr, itin> {
Chris Lattnerb2367e32005-04-19 04:59:28 +0000175 let L = PPC64;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000176}
177
Nate Begemanade6f9a2005-12-09 23:54:18 +0000178class DForm_8<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
179 list<dag> pattern>
180 : DForm_1<opcode, OL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000181}
182
Nate Begemanade6f9a2005-12-09 23:54:18 +0000183class DForm_9<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
184 list<dag> pattern>
185 : DForm_1<opcode, OL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000186}
187
Misha Brukman28beda92004-08-11 15:54:36 +0000188// 1.7.5 DS-Form
Jim Laskey74ab9962005-10-19 19:51:16 +0000189class DSForm_1<bits<6> opcode, bits<2> xo, dag OL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000190 InstrItinClass itin, list<dag> pattern>
Jim Laskey74ab9962005-10-19 19:51:16 +0000191 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000192 bits<5> RST;
193 bits<14> DS;
194 bits<5> RA;
Misha Brukman28beda92004-08-11 15:54:36 +0000195
Nate Begemanade6f9a2005-12-09 23:54:18 +0000196 let Pattern = pattern;
197
Misha Brukman28beda92004-08-11 15:54:36 +0000198 let Inst{6-10} = RST;
199 let Inst{11-15} = RA;
200 let Inst{16-29} = DS;
201 let Inst{30-31} = xo;
202}
203
Jim Laskey74ab9962005-10-19 19:51:16 +0000204class DSForm_2<bits<6> opcode, bits<2> xo, dag OL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000205 InstrItinClass itin, list<dag> pattern>
206 : DSForm_1<opcode, xo, OL, asmstr, itin, pattern>;
Misha Brukman28beda92004-08-11 15:54:36 +0000207
Misha Brukman5295e1d2004-08-09 17:24:04 +0000208// 1.7.6 X-Form
Nate Begemanade6f9a2005-12-09 23:54:18 +0000209class XForm_base_r3xo<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
210 InstrItinClass itin, list<dag> pattern>
Jim Laskey74ab9962005-10-19 19:51:16 +0000211 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000212 bits<5> RST;
213 bits<5> A;
214 bits<5> B;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000215
Nate Begemanade6f9a2005-12-09 23:54:18 +0000216 let Pattern = pattern;
217
Chris Lattnerf9172e12005-04-19 05:15:18 +0000218 bit RC = 0; // set by isDOT
219
Misha Brukman28beda92004-08-11 15:54:36 +0000220 let Inst{6-10} = RST;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000221 let Inst{11-15} = A;
222 let Inst{16-20} = B;
223 let Inst{21-30} = xo;
Chris Lattnerf9172e12005-04-19 05:15:18 +0000224 let Inst{31} = RC;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000225}
226
Chris Lattner130888ad2004-11-24 03:52:02 +0000227// This is the same as XForm_base_r3xo, but the first two operands are swapped
228// when code is emitted.
229class XForm_base_r3xo_swapped
Jim Laskey74ab9962005-10-19 19:51:16 +0000230 <bits<6> opcode, bits<10> xo, dag OL, string asmstr,
231 InstrItinClass itin>
232 : I<opcode, OL, asmstr, itin> {
Chris Lattner130888ad2004-11-24 03:52:02 +0000233 bits<5> A;
234 bits<5> RST;
235 bits<5> B;
236
Chris Lattnerf9172e12005-04-19 05:15:18 +0000237 bit RC = 0; // set by isDOT
238
Chris Lattner130888ad2004-11-24 03:52:02 +0000239 let Inst{6-10} = RST;
240 let Inst{11-15} = A;
241 let Inst{16-20} = B;
242 let Inst{21-30} = xo;
Chris Lattnerf9172e12005-04-19 05:15:18 +0000243 let Inst{31} = RC;
Chris Lattner130888ad2004-11-24 03:52:02 +0000244}
245
Nate Begeman765cb5f2004-08-13 02:19:26 +0000246
Jim Laskey74ab9962005-10-19 19:51:16 +0000247class XForm_1<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000248 InstrItinClass itin, list<dag> pattern>
249 : XForm_base_r3xo<opcode, xo, OL, asmstr, itin, pattern>;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000250
Jim Laskey74ab9962005-10-19 19:51:16 +0000251class XForm_6<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
252 InstrItinClass itin, list<dag> pattern>
253 : XForm_base_r3xo_swapped<opcode, xo, OL, asmstr, itin> {
Chris Lattnerdcbb5612005-09-02 22:35:53 +0000254 let Pattern = pattern;
255}
Misha Brukman5295e1d2004-08-09 17:24:04 +0000256
Jim Laskey74ab9962005-10-19 19:51:16 +0000257class XForm_8<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000258 InstrItinClass itin, list<dag> pattern>
259 : XForm_base_r3xo<opcode, xo, OL, asmstr, itin, pattern>;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000260
Jim Laskey74ab9962005-10-19 19:51:16 +0000261class XForm_10<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
262 InstrItinClass itin, list<dag> pattern>
263 : XForm_base_r3xo_swapped<opcode, xo, OL, asmstr, itin> {
264 let Pattern = pattern;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000265}
266
Chris Lattnerdcbb5612005-09-02 22:35:53 +0000267class XForm_11<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000268 InstrItinClass itin, list<dag> pattern>
269 : XForm_base_r3xo_swapped<opcode, xo, OL, asmstr, itin> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000270 let B = 0;
Chris Lattnerdcbb5612005-09-02 22:35:53 +0000271 let Pattern = pattern;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000272}
273
Jim Laskey74ab9962005-10-19 19:51:16 +0000274class XForm_16<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
275 InstrItinClass itin>
276 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000277 bits<3> BF;
278 bits<1> L;
279 bits<5> RA;
280 bits<5> RB;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000281
Misha Brukman5295e1d2004-08-09 17:24:04 +0000282 let Inst{6-8} = BF;
283 let Inst{9} = 0;
284 let Inst{10} = L;
285 let Inst{11-15} = RA;
286 let Inst{16-20} = RB;
287 let Inst{21-30} = xo;
288 let Inst{31} = 0;
289}
290
Jim Laskey74ab9962005-10-19 19:51:16 +0000291class XForm_16_ext<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
292 InstrItinClass itin>
293 : XForm_16<opcode, xo, OL, asmstr, itin> {
Chris Lattner15709c22005-04-19 04:51:30 +0000294 let L = PPC64;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000295}
296
Jim Laskey74ab9962005-10-19 19:51:16 +0000297class XForm_17<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
298 InstrItinClass itin>
299 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000300 bits<3> BF;
301 bits<5> FRA;
302 bits<5> FRB;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000303
Misha Brukman5295e1d2004-08-09 17:24:04 +0000304 let Inst{6-8} = BF;
305 let Inst{9-10} = 0;
306 let Inst{11-15} = FRA;
307 let Inst{16-20} = FRB;
308 let Inst{21-30} = xo;
309 let Inst{31} = 0;
310}
311
Jim Laskey74ab9962005-10-19 19:51:16 +0000312class XForm_25<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000313 InstrItinClass itin, list<dag> pattern>
314 : XForm_base_r3xo<opcode, xo, OL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000315}
316
Jim Laskey74ab9962005-10-19 19:51:16 +0000317class XForm_26<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
318 InstrItinClass itin, list<dag> pattern>
Nate Begemanade6f9a2005-12-09 23:54:18 +0000319 : XForm_base_r3xo<opcode, xo, OL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000320 let A = 0;
321}
322
Jim Laskey74ab9962005-10-19 19:51:16 +0000323class XForm_28<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000324 InstrItinClass itin, list<dag> pattern>
325 : XForm_base_r3xo<opcode, xo, OL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000326}
327
328// 1.7.7 XL-Form
Jim Laskey74ab9962005-10-19 19:51:16 +0000329class XLForm_1<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
330 InstrItinClass itin>
331 : I<opcode, OL, asmstr, itin> {
Nate Begeman65a82c52005-04-14 03:20:38 +0000332 bits<3> CRD;
333 bits<2> CRDb;
334 bits<3> CRA;
335 bits<2> CRAb;
336 bits<3> CRB;
337 bits<2> CRBb;
338
339 let Inst{6-8} = CRD;
340 let Inst{9-10} = CRDb;
341 let Inst{11-13} = CRA;
342 let Inst{14-15} = CRAb;
343 let Inst{16-18} = CRB;
344 let Inst{19-20} = CRBb;
345 let Inst{21-30} = xo;
346 let Inst{31} = 0;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000347}
348
Jim Laskey74ab9962005-10-19 19:51:16 +0000349class XLForm_2<bits<6> opcode, bits<10> xo, bit lk, dag OL, string asmstr,
Nate Begemanb11b8e42005-12-20 00:26:01 +0000350 InstrItinClass itin, list<dag> pattern>
Jim Laskey74ab9962005-10-19 19:51:16 +0000351 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000352 bits<5> BO;
353 bits<5> BI;
354 bits<2> BH;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000355
Nate Begemanb11b8e42005-12-20 00:26:01 +0000356 let Pattern = pattern;
357
Misha Brukman5295e1d2004-08-09 17:24:04 +0000358 let Inst{6-10} = BO;
359 let Inst{11-15} = BI;
360 let Inst{16-18} = 0;
361 let Inst{19-20} = BH;
362 let Inst{21-30} = xo;
363 let Inst{31} = lk;
364}
365
Jim Laskey74ab9962005-10-19 19:51:16 +0000366class XLForm_2_ext<bits<6> opcode, bits<10> xo, bits<5> bo, bits<5> bi, bit lk,
Nate Begemanb11b8e42005-12-20 00:26:01 +0000367 dag OL, string asmstr, InstrItinClass itin, list<dag> pattern>
368 : XLForm_2<opcode, xo, lk, OL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000369 let BO = bo;
370 let BI = bi;
371 let BH = 0;
372}
373
Jim Laskey74ab9962005-10-19 19:51:16 +0000374class XLForm_3<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
375 InstrItinClass itin>
376 : I<opcode, OL, asmstr, itin> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000377 bits<3> BF;
378 bits<3> BFA;
379
380 let Inst{6-8} = BF;
381 let Inst{9-10} = 0;
382 let Inst{11-13} = BFA;
383 let Inst{14-15} = 0;
384 let Inst{16-20} = 0;
385 let Inst{21-30} = xo;
386 let Inst{31} = 0;
387}
388
Misha Brukman5295e1d2004-08-09 17:24:04 +0000389// 1.7.8 XFX-Form
Jim Laskey74ab9962005-10-19 19:51:16 +0000390class XFXForm_1<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
391 InstrItinClass itin>
392 : I<opcode, OL, asmstr, itin> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000393 bits<5> RT;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000394 bits<10> SPR;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000395
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000396 let Inst{6-10} = RT;
Nate Begeman048b2632005-11-29 22:42:50 +0000397 let Inst{11} = SPR{4};
398 let Inst{12} = SPR{3};
399 let Inst{13} = SPR{2};
400 let Inst{14} = SPR{1};
401 let Inst{15} = SPR{0};
402 let Inst{16} = SPR{9};
403 let Inst{17} = SPR{8};
404 let Inst{18} = SPR{7};
405 let Inst{19} = SPR{6};
406 let Inst{20} = SPR{5};
Misha Brukman5295e1d2004-08-09 17:24:04 +0000407 let Inst{21-30} = xo;
408 let Inst{31} = 0;
409}
410
Chris Lattnerd790d222005-04-19 04:40:07 +0000411class XFXForm_1_ext<bits<6> opcode, bits<10> xo, bits<10> spr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000412 dag OL, string asmstr, InstrItinClass itin>
413 : XFXForm_1<opcode, xo, OL, asmstr, itin> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000414 let SPR = spr;
415}
416
Jim Laskey74ab9962005-10-19 19:51:16 +0000417class XFXForm_3<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
418 InstrItinClass itin>
419 : I<opcode, OL, asmstr, itin> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000420 bits<5> RT;
421
422 let Inst{6-10} = RT;
423 let Inst{11-20} = 0;
424 let Inst{21-30} = xo;
425 let Inst{31} = 0;
426}
427
Jim Laskey74ab9962005-10-19 19:51:16 +0000428class XFXForm_5<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
429 InstrItinClass itin>
430 : I<opcode, OL, asmstr, itin> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000431 bits<8> FXM;
432 bits<5> ST;
433
434 let Inst{6-10} = ST;
Nate Begeman9a838672005-08-08 20:04:52 +0000435 let Inst{11} = 0;
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000436 let Inst{12-19} = FXM;
437 let Inst{20} = 0;
438 let Inst{21-30} = xo;
439 let Inst{31} = 0;
440}
441
Jim Laskey74ab9962005-10-19 19:51:16 +0000442class XFXForm_5a<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
443 InstrItinClass itin>
444 : I<opcode, OL, asmstr, itin> {
Nate Begeman9a838672005-08-08 20:04:52 +0000445 bits<5> ST;
446 bits<8> FXM;
447
448 let Inst{6-10} = ST;
449 let Inst{11} = 1;
450 let Inst{12-19} = FXM;
451 let Inst{20} = 0;
452 let Inst{21-30} = xo;
453 let Inst{31} = 0;
454}
455
Jim Laskey74ab9962005-10-19 19:51:16 +0000456class XFXForm_7<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
457 InstrItinClass itin>
458 : XFXForm_1<opcode, xo, OL, asmstr, itin>;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000459
Nate Begeman143cf942004-08-30 02:28:06 +0000460class XFXForm_7_ext<bits<6> opcode, bits<10> xo, bits<10> spr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000461 dag OL, string asmstr, InstrItinClass itin>
462 : XFXForm_7<opcode, xo, OL, asmstr, itin> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000463 let SPR = spr;
464}
465
Nate Begeman765cb5f2004-08-13 02:19:26 +0000466// 1.7.10 XS-Form
Jim Laskey74ab9962005-10-19 19:51:16 +0000467class XSForm_1<bits<6> opcode, bits<9> xo, dag OL, string asmstr,
468 InstrItinClass itin>
469 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000470 bits<5> RS;
471 bits<5> A;
472 bits<6> SH;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000473
Chris Lattnerf9172e12005-04-19 05:15:18 +0000474 bit RC = 0; // set by isDOT
475
Nate Begeman765cb5f2004-08-13 02:19:26 +0000476 let Inst{6-10} = RS;
477 let Inst{11-15} = A;
478 let Inst{16-20} = SH{1-5};
479 let Inst{21-29} = xo;
480 let Inst{30} = SH{0};
Chris Lattnerf9172e12005-04-19 05:15:18 +0000481 let Inst{31} = RC;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000482}
483
Misha Brukman5295e1d2004-08-09 17:24:04 +0000484// 1.7.11 XO-Form
Chris Lattner3a1002d2005-09-02 21:18:00 +0000485class XOForm_1<bits<6> opcode, bits<9> xo, bit oe, dag OL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000486 InstrItinClass itin, list<dag> pattern>
487 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000488 bits<5> RT;
489 bits<5> RA;
490 bits<5> RB;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000491
Chris Lattner3a1002d2005-09-02 21:18:00 +0000492 let Pattern = pattern;
493
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000494 bit RC = 0; // set by isDOT
495
Misha Brukman5295e1d2004-08-09 17:24:04 +0000496 let Inst{6-10} = RT;
497 let Inst{11-15} = RA;
498 let Inst{16-20} = RB;
499 let Inst{21} = oe;
500 let Inst{22-30} = xo;
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000501 let Inst{31} = RC;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000502}
503
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000504class XOForm_3<bits<6> opcode, bits<9> xo, bit oe,
Jim Laskey74ab9962005-10-19 19:51:16 +0000505 dag OL, string asmstr, InstrItinClass itin, list<dag> pattern>
506 : XOForm_1<opcode, xo, oe, OL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000507 let RB = 0;
508}
509
510// 1.7.12 A-Form
Chris Lattner027a2672005-09-29 23:34:24 +0000511class AForm_1<bits<6> opcode, bits<5> xo, dag OL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000512 InstrItinClass itin, list<dag> pattern>
513 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000514 bits<5> FRT;
515 bits<5> FRA;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000516 bits<5> FRC;
Chris Lattnerda76c162004-11-25 04:11:07 +0000517 bits<5> FRB;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000518
Chris Lattner027a2672005-09-29 23:34:24 +0000519 let Pattern = pattern;
520
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000521 bit RC = 0; // set by isDOT
522
Misha Brukman5295e1d2004-08-09 17:24:04 +0000523 let Inst{6-10} = FRT;
524 let Inst{11-15} = FRA;
525 let Inst{16-20} = FRB;
526 let Inst{21-25} = FRC;
527 let Inst{26-30} = xo;
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000528 let Inst{31} = RC;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000529}
530
Jim Laskey74ab9962005-10-19 19:51:16 +0000531class AForm_2<bits<6> opcode, bits<5> xo, dag OL, string asmstr,
532 InstrItinClass itin, list<dag> pattern>
533 : AForm_1<opcode, xo, OL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000534 let FRC = 0;
535}
536
Jim Laskey74ab9962005-10-19 19:51:16 +0000537class AForm_3<bits<6> opcode, bits<5> xo, dag OL, string asmstr,
538 InstrItinClass itin, list<dag> pattern>
539 : AForm_1<opcode, xo, OL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000540 let FRB = 0;
541}
542
Misha Brukman5295e1d2004-08-09 17:24:04 +0000543// 1.7.13 M-Form
Jim Laskey74ab9962005-10-19 19:51:16 +0000544class MForm_1<bits<6> opcode, dag OL, string asmstr,
545 InstrItinClass itin, list<dag> pattern>
546 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000547 bits<5> RA;
Chris Lattner5f4b0e12004-11-23 19:23:32 +0000548 bits<5> RS;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000549 bits<5> RB;
550 bits<5> MB;
551 bits<5> ME;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000552
Nate Begeman9f3c26c2005-10-19 18:42:01 +0000553 let Pattern = pattern;
554
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000555 bit RC = 0; // set by isDOT
556
Misha Brukman5295e1d2004-08-09 17:24:04 +0000557 let Inst{6-10} = RS;
558 let Inst{11-15} = RA;
559 let Inst{16-20} = RB;
560 let Inst{21-25} = MB;
561 let Inst{26-30} = ME;
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000562 let Inst{31} = RC;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000563}
564
Jim Laskey74ab9962005-10-19 19:51:16 +0000565class MForm_2<bits<6> opcode, dag OL, string asmstr,
566 InstrItinClass itin, list<dag> pattern>
567 : MForm_1<opcode, OL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000568}
569
Nate Begeman765cb5f2004-08-13 02:19:26 +0000570// 1.7.14 MD-Form
Jim Laskey74ab9962005-10-19 19:51:16 +0000571class MDForm_1<bits<6> opcode, bits<3> xo, dag OL, string asmstr,
572 InstrItinClass itin, list<dag> pattern>
573 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000574 bits<5> RS;
575 bits<5> RA;
576 bits<6> SH;
577 bits<6> MBE;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000578
Nate Begeman9f3c26c2005-10-19 18:42:01 +0000579 let Pattern = pattern;
580
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000581 bit RC = 0; // set by isDOT
582
Nate Begeman765cb5f2004-08-13 02:19:26 +0000583 let Inst{6-10} = RS;
584 let Inst{11-15} = RA;
585 let Inst{16-20} = SH{1-5};
586 let Inst{21-26} = MBE;
587 let Inst{27-29} = xo;
588 let Inst{30} = SH{0};
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000589 let Inst{31} = RC;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000590}
591
Nate Begeman8492fd32005-11-23 05:29:52 +0000592// E-1 VA-Form
Chris Lattner1738c292006-03-27 03:34:17 +0000593
594// VAForm_1 - DACB ordering.
Nate Begeman8492fd32005-11-23 05:29:52 +0000595class VAForm_1<bits<6> xo, dag OL, string asmstr,
596 InstrItinClass itin, list<dag> pattern>
597 : I<4, OL, asmstr, itin> {
598 bits<5> VD;
599 bits<5> VA;
Nate Begeman8492fd32005-11-23 05:29:52 +0000600 bits<5> VC;
Chris Lattner4e737172006-03-22 01:44:36 +0000601 bits<5> VB;
Nate Begeman11fd6b22005-11-26 22:39:34 +0000602
603 let Pattern = pattern;
Nate Begeman8492fd32005-11-23 05:29:52 +0000604
605 let Inst{6-10} = VD;
606 let Inst{11-15} = VA;
607 let Inst{16-20} = VB;
608 let Inst{21-25} = VC;
609 let Inst{26-31} = xo;
610}
611
Chris Lattner1738c292006-03-27 03:34:17 +0000612// VAForm_1a - DABC ordering.
613class VAForm_1a<bits<6> xo, dag OL, string asmstr,
614 InstrItinClass itin, list<dag> pattern>
615 : I<4, OL, asmstr, itin> {
616 bits<5> VD;
617 bits<5> VA;
618 bits<5> VB;
619 bits<5> VC;
620
621 let Pattern = pattern;
622
623 let Inst{6-10} = VD;
624 let Inst{11-15} = VA;
625 let Inst{16-20} = VB;
626 let Inst{21-25} = VC;
627 let Inst{26-31} = xo;
628}
629
Chris Lattner53e07de2006-03-26 00:41:48 +0000630class VAForm_2<bits<6> xo, dag OL, string asmstr,
631 InstrItinClass itin, list<dag> pattern>
632 : I<4, OL, asmstr, itin> {
633 bits<5> VD;
634 bits<5> VA;
635 bits<5> VB;
636 bits<4> SH;
637
638 let Pattern = pattern;
639
640 let Inst{6-10} = VD;
641 let Inst{11-15} = VA;
642 let Inst{16-20} = VB;
643 let Inst{21} = 0;
644 let Inst{22-25} = SH;
645 let Inst{26-31} = xo;
646}
647
Nate Begeman8492fd32005-11-23 05:29:52 +0000648// E-2 VX-Form
649class VXForm_1<bits<11> xo, dag OL, string asmstr,
650 InstrItinClass itin, list<dag> pattern>
651 : I<4, OL, asmstr, itin> {
652 bits<5> VD;
653 bits<5> VA;
654 bits<5> VB;
655
Nate Begeman11fd6b22005-11-26 22:39:34 +0000656 let Pattern = pattern;
657
Nate Begeman8492fd32005-11-23 05:29:52 +0000658 let Inst{6-10} = VD;
659 let Inst{11-15} = VA;
660 let Inst{16-20} = VB;
661 let Inst{21-31} = xo;
662}
663
Nate Begeman40f081d2005-12-14 00:34:09 +0000664class VXForm_setzero<bits<11> xo, dag OL, string asmstr,
665 InstrItinClass itin, list<dag> pattern>
666 : VXForm_1<xo, OL, asmstr, itin, pattern> {
667 let VA = VD;
668 let VB = VD;
669}
670
671
Nate Begemanc1381182005-11-29 08:04:45 +0000672class VXForm_2<bits<11> xo, dag OL, string asmstr,
673 InstrItinClass itin, list<dag> pattern>
674 : I<4, OL, asmstr, itin> {
675 bits<5> VD;
676 bits<5> VB;
677
678 let Pattern = pattern;
679
680 let Inst{6-10} = VD;
681 let Inst{11-15} = 0;
682 let Inst{16-20} = VB;
683 let Inst{21-31} = xo;
684}
685
Chris Lattnerdf59d532006-03-27 03:28:57 +0000686class VXForm_3<bits<11> xo, dag OL, string asmstr,
687 InstrItinClass itin, list<dag> pattern>
688 : I<4, OL, asmstr, itin> {
689 bits<5> VD;
690 bits<5> IMM;
691
692 let Pattern = pattern;
693
694 let Inst{6-10} = VD;
695 let Inst{11-15} = IMM;
696 let Inst{16-20} = 0;
697 let Inst{21-31} = xo;
698}
699
Chris Lattner5a528e52006-04-05 00:03:57 +0000700/// VXForm_4 - VX instructions with "VD,0,0" register fields, like mfvscr.
701class VXForm_4<bits<11> xo, dag OL, string asmstr,
702 InstrItinClass itin, list<dag> pattern>
703 : I<4, OL, asmstr, itin> {
704 bits<5> VD;
705
706 let Pattern = pattern;
707
708 let Inst{6-10} = VD;
709 let Inst{11-15} = 0;
710 let Inst{16-20} = 0;
711 let Inst{21-31} = xo;
712}
713
714/// VXForm_5 - VX instructions with "0,0,VB" register fields, like mtvscr.
715class VXForm_5<bits<11> xo, dag OL, string asmstr,
716 InstrItinClass itin, list<dag> pattern>
717 : I<4, OL, asmstr, itin> {
718 bits<5> VB;
719
720 let Pattern = pattern;
721
722 let Inst{6-10} = 0;
723 let Inst{11-15} = 0;
724 let Inst{16-20} = VB;
725 let Inst{21-31} = xo;
726}
Chris Lattnerdf59d532006-03-27 03:28:57 +0000727
Nate Begeman8492fd32005-11-23 05:29:52 +0000728// E-4 VXR-Form
Chris Lattner793cbcb2006-03-26 04:57:17 +0000729class VXRForm_1<bits<10> xo, dag OL, string asmstr,
Nate Begeman8492fd32005-11-23 05:29:52 +0000730 InstrItinClass itin, list<dag> pattern>
731 : I<4, OL, asmstr, itin> {
732 bits<5> VD;
733 bits<5> VA;
734 bits<5> VB;
Chris Lattner793cbcb2006-03-26 04:57:17 +0000735 bit RC = 0;
Nate Begeman8492fd32005-11-23 05:29:52 +0000736
Nate Begeman11fd6b22005-11-26 22:39:34 +0000737 let Pattern = pattern;
738
Nate Begeman8492fd32005-11-23 05:29:52 +0000739 let Inst{6-10} = VD;
740 let Inst{11-15} = VA;
741 let Inst{16-20} = VB;
Chris Lattner793cbcb2006-03-26 04:57:17 +0000742 let Inst{21} = RC;
Nate Begeman8492fd32005-11-23 05:29:52 +0000743 let Inst{22-31} = xo;
744}
745
Misha Brukman6b21bde2004-08-02 21:56:35 +0000746//===----------------------------------------------------------------------===//
Chris Lattnerb439dad2005-10-25 20:58:43 +0000747class Pseudo<dag OL, string asmstr, list<dag> pattern>
Chris Lattner12405742006-01-27 01:46:15 +0000748 : I<0, OL, asmstr, NoItinerary> {
Nate Begeman61738782004-09-02 08:13:00 +0000749 let PPC64 = 0;
750 let VMX = 0;
Chris Lattnerb439dad2005-10-25 20:58:43 +0000751 let Pattern = pattern;
Nate Begeman61738782004-09-02 08:13:00 +0000752 let Inst{31-0} = 0;
Misha Brukmancd4f51b2004-08-02 16:54:54 +0000753}