blob: 2ab9eedc85718bdb42b0b99b9e7d7b00d06187c4 [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
Nate Begeman7b809f52005-08-26 04:11:42 +000063class BForm<bits<6> opcode, bit aa, bit lk, bits<5> bo, bits<2> bicode, dag OL,
Jim Laskey74ab9962005-10-19 19:51:16 +000064 string asmstr, InstrItinClass itin>
65 : I<opcode, OL, asmstr, itin> {
Nate Begeman7b809f52005-08-26 04:11:42 +000066 bits<3> CR;
Misha Brukman189f3dc2004-10-14 05:55:37 +000067 bits<14> BD;
Misha Brukman5295e1d2004-08-09 17:24:04 +000068
Nate Begeman7b809f52005-08-26 04:11:42 +000069 let Inst{6-10} = bo;
70 let Inst{11-13} = CR;
71 let Inst{14-15} = bicode;
Misha Brukman5295e1d2004-08-09 17:24:04 +000072 let Inst{16-29} = BD;
73 let Inst{30} = aa;
74 let Inst{31} = lk;
Misha Brukman6b21bde2004-08-02 21:56:35 +000075}
76
Misha Brukman5295e1d2004-08-09 17:24:04 +000077// 1.7.4 D-Form
Jim Laskey74ab9962005-10-19 19:51:16 +000078class DForm_base<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
Nate Begemanade6f9a2005-12-09 23:54:18 +000079 list<dag> pattern>
80 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +000081 bits<5> A;
82 bits<5> B;
83 bits<16> C;
Nate Begemanade6f9a2005-12-09 23:54:18 +000084
85 let Pattern = pattern;
Misha Brukman6b21bde2004-08-02 21:56:35 +000086
Misha Brukman6b21bde2004-08-02 21:56:35 +000087 let Inst{6-10} = A;
88 let Inst{11-15} = B;
89 let Inst{16-31} = C;
90}
91
Nate Begemanade6f9a2005-12-09 23:54:18 +000092class DForm_1<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
93 list<dag> pattern>
94 : I<opcode, OL, asmstr, itin> {
Misha Brukman15b0fb52004-10-23 06:08:38 +000095 bits<5> A;
96 bits<16> C;
97 bits<5> B;
Nate Begemanade6f9a2005-12-09 23:54:18 +000098
99 let Pattern = pattern;
Misha Brukman15b0fb52004-10-23 06:08:38 +0000100
Misha Brukman15b0fb52004-10-23 06:08:38 +0000101 let Inst{6-10} = A;
102 let Inst{11-15} = B;
103 let Inst{16-31} = C;
Misha Brukman6b21bde2004-08-02 21:56:35 +0000104}
105
Jim Laskey74ab9962005-10-19 19:51:16 +0000106class DForm_2<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
107 list<dag> pattern>
108 : DForm_base<opcode, OL, asmstr, itin, pattern>;
Misha Brukman6b21bde2004-08-02 21:56:35 +0000109
Jim Laskey74ab9962005-10-19 19:51:16 +0000110class DForm_2_r0<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
111 list<dag> pattern>
112 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000113 bits<5> A;
114 bits<16> B;
Nate Begeman4bfceb12004-09-04 05:00:00 +0000115
Chris Lattner2d8032b2005-09-08 17:33:10 +0000116 let Pattern = pattern;
117
Nate Begeman4bfceb12004-09-04 05:00:00 +0000118 let Inst{6-10} = A;
119 let Inst{11-15} = 0;
120 let Inst{16-31} = B;
Misha Brukman6b21bde2004-08-02 21:56:35 +0000121}
122
123// Currently we make the use/def reg distinction in ISel, not tablegen
Nate Begemanade6f9a2005-12-09 23:54:18 +0000124class DForm_3<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
125 list<dag> pattern>
126 : DForm_1<opcode, OL, asmstr, itin, pattern>;
Misha Brukman6b21bde2004-08-02 21:56:35 +0000127
Jim Laskey74ab9962005-10-19 19:51:16 +0000128class DForm_4<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
129 list<dag> pattern>
Nate Begemanade6f9a2005-12-09 23:54:18 +0000130 : I<opcode, OL, asmstr, itin> {
Chris Lattner022e2712004-11-24 02:15:41 +0000131 bits<5> B;
132 bits<5> A;
133 bits<16> C;
134
Chris Lattner76cb0062005-09-08 17:40:49 +0000135 let Pattern = pattern;
136
Chris Lattner022e2712004-11-24 02:15:41 +0000137 let Inst{6-10} = A;
138 let Inst{11-15} = B;
139 let Inst{16-31} = C;
140}
Nate Begeman4bfceb12004-09-04 05:00:00 +0000141
Nate Begemanade6f9a2005-12-09 23:54:18 +0000142class DForm_4_zero<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
143 list<dag> pattern>
144 : DForm_1<opcode, OL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000145 let A = 0;
146 let B = 0;
147 let C = 0;
148}
149
Jim Laskey74ab9962005-10-19 19:51:16 +0000150class DForm_5<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin>
151 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000152 bits<3> BF;
153 bits<1> L;
154 bits<5> RA;
155 bits<16> I;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000156
Misha Brukman5295e1d2004-08-09 17:24:04 +0000157 let Inst{6-8} = BF;
158 let Inst{9} = 0;
159 let Inst{10} = L;
160 let Inst{11-15} = RA;
161 let Inst{16-31} = I;
162}
163
Jim Laskey74ab9962005-10-19 19:51:16 +0000164class DForm_5_ext<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin>
165 : DForm_5<opcode, OL, asmstr, itin> {
Chris Lattnerb2367e32005-04-19 04:59:28 +0000166 let L = PPC64;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000167}
168
Jim Laskey74ab9962005-10-19 19:51:16 +0000169class DForm_6<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin>
170 : DForm_5<opcode, OL, asmstr, itin>;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000171
Jim Laskey74ab9962005-10-19 19:51:16 +0000172class DForm_6_ext<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin>
173 : DForm_6<opcode, OL, asmstr, itin> {
Chris Lattnerb2367e32005-04-19 04:59:28 +0000174 let L = PPC64;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000175}
176
Nate Begemanade6f9a2005-12-09 23:54:18 +0000177class DForm_8<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
178 list<dag> pattern>
179 : DForm_1<opcode, OL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000180}
181
Nate Begemanade6f9a2005-12-09 23:54:18 +0000182class DForm_9<bits<6> opcode, dag OL, string asmstr, InstrItinClass itin,
183 list<dag> pattern>
184 : DForm_1<opcode, OL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000185}
186
Misha Brukman28beda92004-08-11 15:54:36 +0000187// 1.7.5 DS-Form
Jim Laskey74ab9962005-10-19 19:51:16 +0000188class DSForm_1<bits<6> opcode, bits<2> xo, dag OL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000189 InstrItinClass itin, list<dag> pattern>
Jim Laskey74ab9962005-10-19 19:51:16 +0000190 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000191 bits<5> RST;
192 bits<14> DS;
193 bits<5> RA;
Misha Brukman28beda92004-08-11 15:54:36 +0000194
Nate Begemanade6f9a2005-12-09 23:54:18 +0000195 let Pattern = pattern;
196
Misha Brukman28beda92004-08-11 15:54:36 +0000197 let Inst{6-10} = RST;
198 let Inst{11-15} = RA;
199 let Inst{16-29} = DS;
200 let Inst{30-31} = xo;
201}
202
Jim Laskey74ab9962005-10-19 19:51:16 +0000203class DSForm_2<bits<6> opcode, bits<2> xo, dag OL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000204 InstrItinClass itin, list<dag> pattern>
205 : DSForm_1<opcode, xo, OL, asmstr, itin, pattern>;
Misha Brukman28beda92004-08-11 15:54:36 +0000206
Misha Brukman5295e1d2004-08-09 17:24:04 +0000207// 1.7.6 X-Form
Nate Begemanade6f9a2005-12-09 23:54:18 +0000208class XForm_base_r3xo<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
209 InstrItinClass itin, list<dag> pattern>
Jim Laskey74ab9962005-10-19 19:51:16 +0000210 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000211 bits<5> RST;
212 bits<5> A;
213 bits<5> B;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000214
Nate Begemanade6f9a2005-12-09 23:54:18 +0000215 let Pattern = pattern;
216
Chris Lattnerf9172e12005-04-19 05:15:18 +0000217 bit RC = 0; // set by isDOT
218
Misha Brukman28beda92004-08-11 15:54:36 +0000219 let Inst{6-10} = RST;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000220 let Inst{11-15} = A;
221 let Inst{16-20} = B;
222 let Inst{21-30} = xo;
Chris Lattnerf9172e12005-04-19 05:15:18 +0000223 let Inst{31} = RC;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000224}
225
Chris Lattner130888ad2004-11-24 03:52:02 +0000226// This is the same as XForm_base_r3xo, but the first two operands are swapped
227// when code is emitted.
228class XForm_base_r3xo_swapped
Jim Laskey74ab9962005-10-19 19:51:16 +0000229 <bits<6> opcode, bits<10> xo, dag OL, string asmstr,
230 InstrItinClass itin>
231 : I<opcode, OL, asmstr, itin> {
Chris Lattner130888ad2004-11-24 03:52:02 +0000232 bits<5> A;
233 bits<5> RST;
234 bits<5> B;
235
Chris Lattnerf9172e12005-04-19 05:15:18 +0000236 bit RC = 0; // set by isDOT
237
Chris Lattner130888ad2004-11-24 03:52:02 +0000238 let Inst{6-10} = RST;
239 let Inst{11-15} = A;
240 let Inst{16-20} = B;
241 let Inst{21-30} = xo;
Chris Lattnerf9172e12005-04-19 05:15:18 +0000242 let Inst{31} = RC;
Chris Lattner130888ad2004-11-24 03:52:02 +0000243}
244
Nate Begeman765cb5f2004-08-13 02:19:26 +0000245
Jim Laskey74ab9962005-10-19 19:51:16 +0000246class XForm_1<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000247 InstrItinClass itin, list<dag> pattern>
248 : XForm_base_r3xo<opcode, xo, OL, asmstr, itin, pattern>;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000249
Jim Laskey74ab9962005-10-19 19:51:16 +0000250class XForm_6<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
251 InstrItinClass itin, list<dag> pattern>
252 : XForm_base_r3xo_swapped<opcode, xo, OL, asmstr, itin> {
Chris Lattnerdcbb5612005-09-02 22:35:53 +0000253 let Pattern = pattern;
254}
Misha Brukman5295e1d2004-08-09 17:24:04 +0000255
Jim Laskey74ab9962005-10-19 19:51:16 +0000256class XForm_8<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000257 InstrItinClass itin, list<dag> pattern>
258 : XForm_base_r3xo<opcode, xo, OL, asmstr, itin, pattern>;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000259
Jim Laskey74ab9962005-10-19 19:51:16 +0000260class XForm_10<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
261 InstrItinClass itin, list<dag> pattern>
262 : XForm_base_r3xo_swapped<opcode, xo, OL, asmstr, itin> {
263 let Pattern = pattern;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000264}
265
Chris Lattnerdcbb5612005-09-02 22:35:53 +0000266class XForm_11<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000267 InstrItinClass itin, list<dag> pattern>
268 : XForm_base_r3xo_swapped<opcode, xo, OL, asmstr, itin> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000269 let B = 0;
Chris Lattnerdcbb5612005-09-02 22:35:53 +0000270 let Pattern = pattern;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000271}
272
Jim Laskey74ab9962005-10-19 19:51:16 +0000273class XForm_16<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
274 InstrItinClass itin>
275 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000276 bits<3> BF;
277 bits<1> L;
278 bits<5> RA;
279 bits<5> RB;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000280
Misha Brukman5295e1d2004-08-09 17:24:04 +0000281 let Inst{6-8} = BF;
282 let Inst{9} = 0;
283 let Inst{10} = L;
284 let Inst{11-15} = RA;
285 let Inst{16-20} = RB;
286 let Inst{21-30} = xo;
287 let Inst{31} = 0;
288}
289
Jim Laskey74ab9962005-10-19 19:51:16 +0000290class XForm_16_ext<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
291 InstrItinClass itin>
292 : XForm_16<opcode, xo, OL, asmstr, itin> {
Chris Lattner15709c22005-04-19 04:51:30 +0000293 let L = PPC64;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000294}
295
Jim Laskey74ab9962005-10-19 19:51:16 +0000296class XForm_17<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
297 InstrItinClass itin>
298 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000299 bits<3> BF;
300 bits<5> FRA;
301 bits<5> FRB;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000302
Misha Brukman5295e1d2004-08-09 17:24:04 +0000303 let Inst{6-8} = BF;
304 let Inst{9-10} = 0;
305 let Inst{11-15} = FRA;
306 let Inst{16-20} = FRB;
307 let Inst{21-30} = xo;
308 let Inst{31} = 0;
309}
310
Jim Laskey74ab9962005-10-19 19:51:16 +0000311class XForm_25<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000312 InstrItinClass itin, list<dag> pattern>
313 : XForm_base_r3xo<opcode, xo, OL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000314}
315
Jim Laskey74ab9962005-10-19 19:51:16 +0000316class XForm_26<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
317 InstrItinClass itin, list<dag> pattern>
Nate Begemanade6f9a2005-12-09 23:54:18 +0000318 : XForm_base_r3xo<opcode, xo, OL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000319 let A = 0;
320}
321
Jim Laskey74ab9962005-10-19 19:51:16 +0000322class XForm_28<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
Nate Begemanade6f9a2005-12-09 23:54:18 +0000323 InstrItinClass itin, list<dag> pattern>
324 : XForm_base_r3xo<opcode, xo, OL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000325}
326
Chris Lattnerc8587d42006-06-06 21:29:23 +0000327// DCB_Form - Form X instruction, used for dcb* instructions.
328class DCB_Form<bits<10> xo, bits<5> immfield, dag OL, string asmstr,
329 InstrItinClass itin, list<dag> pattern>
330 : I<31, OL, asmstr, itin> {
331 bits<5> A;
332 bits<5> B;
333
334 let Pattern = pattern;
335
336 let Inst{6-10} = immfield;
337 let Inst{11-15} = A;
338 let Inst{16-20} = B;
339 let Inst{21-30} = xo;
340 let Inst{31} = 0;
341}
342
343
Chris Lattnerc94d9322006-04-05 22:27:14 +0000344// DSS_Form - Form X instruction, used for altivec dss* instructions.
345class DSS_Form<bits<10> xo, dag OL, string asmstr,
346 InstrItinClass itin, list<dag> pattern>
347 : I<31, OL, asmstr, itin> {
348 bits<1> T;
349 bits<2> STRM;
350 bits<5> A;
351 bits<5> B;
352
353 let Pattern = pattern;
354
355 let Inst{6} = T;
356 let Inst{7-8} = 0;
357 let Inst{9-10} = STRM;
358 let Inst{11-15} = A;
359 let Inst{16-20} = B;
360 let Inst{21-30} = xo;
361 let Inst{31} = 0;
362}
363
Misha Brukman5295e1d2004-08-09 17:24:04 +0000364// 1.7.7 XL-Form
Jim Laskey74ab9962005-10-19 19:51:16 +0000365class XLForm_1<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
366 InstrItinClass itin>
367 : I<opcode, OL, asmstr, itin> {
Nate Begeman65a82c52005-04-14 03:20:38 +0000368 bits<3> CRD;
369 bits<2> CRDb;
370 bits<3> CRA;
371 bits<2> CRAb;
372 bits<3> CRB;
373 bits<2> CRBb;
374
375 let Inst{6-8} = CRD;
376 let Inst{9-10} = CRDb;
377 let Inst{11-13} = CRA;
378 let Inst{14-15} = CRAb;
379 let Inst{16-18} = CRB;
380 let Inst{19-20} = CRBb;
381 let Inst{21-30} = xo;
382 let Inst{31} = 0;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000383}
384
Jim Laskey74ab9962005-10-19 19:51:16 +0000385class XLForm_2<bits<6> opcode, bits<10> xo, bit lk, dag OL, string asmstr,
Nate Begemanb11b8e42005-12-20 00:26:01 +0000386 InstrItinClass itin, list<dag> pattern>
Jim Laskey74ab9962005-10-19 19:51:16 +0000387 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000388 bits<5> BO;
389 bits<5> BI;
390 bits<2> BH;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000391
Nate Begemanb11b8e42005-12-20 00:26:01 +0000392 let Pattern = pattern;
393
Misha Brukman5295e1d2004-08-09 17:24:04 +0000394 let Inst{6-10} = BO;
395 let Inst{11-15} = BI;
396 let Inst{16-18} = 0;
397 let Inst{19-20} = BH;
398 let Inst{21-30} = xo;
399 let Inst{31} = lk;
400}
401
Chris Lattner29597892006-11-04 05:42:48 +0000402class XLForm_2_br<bits<6> opcode, bits<10> xo, bit lk,
403 dag OL, string asmstr, InstrItinClass itin, list<dag> pattern>
404 : XLForm_2<opcode, xo, lk, OL, asmstr, itin, pattern> {
405 bits<7> BIBO; // 2 bits of BI and 5 bits of BO.
406 bits<3> CR;
407
408 let BO = BIBO{0-4};
409 let BI{0-1} = BIBO{5-6};
410 let BI{2-4} = CR;
411 let BH = 0;
412}
413
414
Jim Laskey74ab9962005-10-19 19:51:16 +0000415class XLForm_2_ext<bits<6> opcode, bits<10> xo, bits<5> bo, bits<5> bi, bit lk,
Nate Begemanb11b8e42005-12-20 00:26:01 +0000416 dag OL, string asmstr, InstrItinClass itin, list<dag> pattern>
417 : XLForm_2<opcode, xo, lk, OL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000418 let BO = bo;
419 let BI = bi;
420 let BH = 0;
421}
422
Jim Laskey74ab9962005-10-19 19:51:16 +0000423class XLForm_3<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
424 InstrItinClass itin>
425 : I<opcode, OL, asmstr, itin> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000426 bits<3> BF;
427 bits<3> BFA;
428
429 let Inst{6-8} = BF;
430 let Inst{9-10} = 0;
431 let Inst{11-13} = BFA;
432 let Inst{14-15} = 0;
433 let Inst{16-20} = 0;
434 let Inst{21-30} = xo;
435 let Inst{31} = 0;
436}
437
Misha Brukman5295e1d2004-08-09 17:24:04 +0000438// 1.7.8 XFX-Form
Jim Laskey74ab9962005-10-19 19:51:16 +0000439class XFXForm_1<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
440 InstrItinClass itin>
441 : I<opcode, OL, asmstr, itin> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000442 bits<5> RT;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000443 bits<10> SPR;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000444
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000445 let Inst{6-10} = RT;
Nate Begeman048b2632005-11-29 22:42:50 +0000446 let Inst{11} = SPR{4};
447 let Inst{12} = SPR{3};
448 let Inst{13} = SPR{2};
449 let Inst{14} = SPR{1};
450 let Inst{15} = SPR{0};
451 let Inst{16} = SPR{9};
452 let Inst{17} = SPR{8};
453 let Inst{18} = SPR{7};
454 let Inst{19} = SPR{6};
455 let Inst{20} = SPR{5};
Misha Brukman5295e1d2004-08-09 17:24:04 +0000456 let Inst{21-30} = xo;
457 let Inst{31} = 0;
458}
459
Chris Lattnerd790d222005-04-19 04:40:07 +0000460class XFXForm_1_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_1<opcode, xo, OL, asmstr, itin> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000463 let SPR = spr;
464}
465
Jim Laskey74ab9962005-10-19 19:51:16 +0000466class XFXForm_3<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
467 InstrItinClass itin>
468 : I<opcode, OL, asmstr, itin> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000469 bits<5> RT;
470
471 let Inst{6-10} = RT;
472 let Inst{11-20} = 0;
473 let Inst{21-30} = xo;
474 let Inst{31} = 0;
475}
476
Jim Laskey74ab9962005-10-19 19:51:16 +0000477class XFXForm_5<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
478 InstrItinClass itin>
479 : I<opcode, OL, asmstr, itin> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000480 bits<8> FXM;
481 bits<5> ST;
482
483 let Inst{6-10} = ST;
Nate Begeman9a838672005-08-08 20:04:52 +0000484 let Inst{11} = 0;
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000485 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_5a<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
492 InstrItinClass itin>
493 : I<opcode, OL, asmstr, itin> {
Nate Begeman9a838672005-08-08 20:04:52 +0000494 bits<5> ST;
495 bits<8> FXM;
496
497 let Inst{6-10} = ST;
498 let Inst{11} = 1;
499 let Inst{12-19} = FXM;
500 let Inst{20} = 0;
501 let Inst{21-30} = xo;
502 let Inst{31} = 0;
503}
504
Jim Laskey74ab9962005-10-19 19:51:16 +0000505class XFXForm_7<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
506 InstrItinClass itin>
507 : XFXForm_1<opcode, xo, OL, asmstr, itin>;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000508
Nate Begeman143cf942004-08-30 02:28:06 +0000509class XFXForm_7_ext<bits<6> opcode, bits<10> xo, bits<10> spr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000510 dag OL, string asmstr, InstrItinClass itin>
511 : XFXForm_7<opcode, xo, OL, asmstr, itin> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000512 let SPR = spr;
513}
514
Nate Begeman765cb5f2004-08-13 02:19:26 +0000515// 1.7.10 XS-Form
Jim Laskey74ab9962005-10-19 19:51:16 +0000516class XSForm_1<bits<6> opcode, bits<9> xo, dag OL, string asmstr,
Chris Lattnera2af3f42006-06-27 20:07:26 +0000517 InstrItinClass itin, list<dag> pattern>
Jim Laskey74ab9962005-10-19 19:51:16 +0000518 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000519 bits<5> RS;
520 bits<5> A;
521 bits<6> SH;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000522
Chris Lattnerf9172e12005-04-19 05:15:18 +0000523 bit RC = 0; // set by isDOT
Chris Lattnera2af3f42006-06-27 20:07:26 +0000524 let Pattern = pattern;
Chris Lattnerf9172e12005-04-19 05:15:18 +0000525
Nate Begeman765cb5f2004-08-13 02:19:26 +0000526 let Inst{6-10} = RS;
527 let Inst{11-15} = A;
528 let Inst{16-20} = SH{1-5};
529 let Inst{21-29} = xo;
530 let Inst{30} = SH{0};
Chris Lattnerf9172e12005-04-19 05:15:18 +0000531 let Inst{31} = RC;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000532}
533
Misha Brukman5295e1d2004-08-09 17:24:04 +0000534// 1.7.11 XO-Form
Chris Lattner3a1002d2005-09-02 21:18:00 +0000535class XOForm_1<bits<6> opcode, bits<9> xo, bit oe, dag OL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000536 InstrItinClass itin, list<dag> pattern>
537 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000538 bits<5> RT;
539 bits<5> RA;
540 bits<5> RB;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000541
Chris Lattner3a1002d2005-09-02 21:18:00 +0000542 let Pattern = pattern;
543
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000544 bit RC = 0; // set by isDOT
545
Misha Brukman5295e1d2004-08-09 17:24:04 +0000546 let Inst{6-10} = RT;
547 let Inst{11-15} = RA;
548 let Inst{16-20} = RB;
549 let Inst{21} = oe;
550 let Inst{22-30} = xo;
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000551 let Inst{31} = RC;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000552}
553
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000554class XOForm_3<bits<6> opcode, bits<9> xo, bit oe,
Jim Laskey74ab9962005-10-19 19:51:16 +0000555 dag OL, string asmstr, InstrItinClass itin, list<dag> pattern>
556 : XOForm_1<opcode, xo, oe, OL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000557 let RB = 0;
558}
559
560// 1.7.12 A-Form
Chris Lattner027a2672005-09-29 23:34:24 +0000561class AForm_1<bits<6> opcode, bits<5> xo, dag OL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000562 InstrItinClass itin, list<dag> pattern>
563 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000564 bits<5> FRT;
565 bits<5> FRA;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000566 bits<5> FRC;
Chris Lattnerda76c162004-11-25 04:11:07 +0000567 bits<5> FRB;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000568
Chris Lattner027a2672005-09-29 23:34:24 +0000569 let Pattern = pattern;
570
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000571 bit RC = 0; // set by isDOT
572
Misha Brukman5295e1d2004-08-09 17:24:04 +0000573 let Inst{6-10} = FRT;
574 let Inst{11-15} = FRA;
575 let Inst{16-20} = FRB;
576 let Inst{21-25} = FRC;
577 let Inst{26-30} = xo;
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000578 let Inst{31} = RC;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000579}
580
Jim Laskey74ab9962005-10-19 19:51:16 +0000581class AForm_2<bits<6> opcode, bits<5> xo, dag OL, string asmstr,
582 InstrItinClass itin, list<dag> pattern>
583 : AForm_1<opcode, xo, OL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000584 let FRC = 0;
585}
586
Jim Laskey74ab9962005-10-19 19:51:16 +0000587class AForm_3<bits<6> opcode, bits<5> xo, dag OL, string asmstr,
588 InstrItinClass itin, list<dag> pattern>
589 : AForm_1<opcode, xo, OL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000590 let FRB = 0;
591}
592
Misha Brukman5295e1d2004-08-09 17:24:04 +0000593// 1.7.13 M-Form
Jim Laskey74ab9962005-10-19 19:51:16 +0000594class MForm_1<bits<6> opcode, dag OL, string asmstr,
595 InstrItinClass itin, list<dag> pattern>
596 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000597 bits<5> RA;
Chris Lattner5f4b0e12004-11-23 19:23:32 +0000598 bits<5> RS;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000599 bits<5> RB;
600 bits<5> MB;
601 bits<5> ME;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000602
Nate Begeman9f3c26c2005-10-19 18:42:01 +0000603 let Pattern = pattern;
604
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000605 bit RC = 0; // set by isDOT
606
Misha Brukman5295e1d2004-08-09 17:24:04 +0000607 let Inst{6-10} = RS;
608 let Inst{11-15} = RA;
609 let Inst{16-20} = RB;
610 let Inst{21-25} = MB;
611 let Inst{26-30} = ME;
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000612 let Inst{31} = RC;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000613}
614
Jim Laskey74ab9962005-10-19 19:51:16 +0000615class MForm_2<bits<6> opcode, dag OL, string asmstr,
616 InstrItinClass itin, list<dag> pattern>
617 : MForm_1<opcode, OL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000618}
619
Nate Begeman765cb5f2004-08-13 02:19:26 +0000620// 1.7.14 MD-Form
Jim Laskey74ab9962005-10-19 19:51:16 +0000621class MDForm_1<bits<6> opcode, bits<3> xo, dag OL, string asmstr,
622 InstrItinClass itin, list<dag> pattern>
623 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000624 bits<5> RA;
Chris Lattner077b86a2006-07-13 21:52:41 +0000625 bits<5> RS;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000626 bits<6> SH;
627 bits<6> MBE;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000628
Nate Begeman9f3c26c2005-10-19 18:42:01 +0000629 let Pattern = pattern;
630
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000631 bit RC = 0; // set by isDOT
632
Nate Begeman765cb5f2004-08-13 02:19:26 +0000633 let Inst{6-10} = RS;
634 let Inst{11-15} = RA;
Chris Lattnerdd57ac42006-07-12 22:08:13 +0000635 let Inst{16-20} = { SH{4}, SH{3}, SH{2}, SH{1}, SH{0} };
636 let Inst{21-26} = { MBE{4}, MBE{3}, MBE{2}, MBE{1}, MBE{0}, MBE{5} };
Nate Begeman765cb5f2004-08-13 02:19:26 +0000637 let Inst{27-29} = xo;
Chris Lattnerdd57ac42006-07-12 22:08:13 +0000638 let Inst{30} = SH{5};
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000639 let Inst{31} = RC;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000640}
641
Chris Lattnerc94d9322006-04-05 22:27:14 +0000642
643
Nate Begeman8492fd32005-11-23 05:29:52 +0000644// E-1 VA-Form
Chris Lattner1738c292006-03-27 03:34:17 +0000645
646// VAForm_1 - DACB ordering.
Nate Begeman8492fd32005-11-23 05:29:52 +0000647class VAForm_1<bits<6> xo, dag OL, string asmstr,
648 InstrItinClass itin, list<dag> pattern>
649 : I<4, OL, asmstr, itin> {
650 bits<5> VD;
651 bits<5> VA;
Nate Begeman8492fd32005-11-23 05:29:52 +0000652 bits<5> VC;
Chris Lattner4e737172006-03-22 01:44:36 +0000653 bits<5> VB;
Nate Begeman11fd6b22005-11-26 22:39:34 +0000654
655 let Pattern = pattern;
Nate Begeman8492fd32005-11-23 05:29:52 +0000656
657 let Inst{6-10} = VD;
658 let Inst{11-15} = VA;
659 let Inst{16-20} = VB;
660 let Inst{21-25} = VC;
661 let Inst{26-31} = xo;
662}
663
Chris Lattner1738c292006-03-27 03:34:17 +0000664// VAForm_1a - DABC ordering.
665class VAForm_1a<bits<6> xo, dag OL, string asmstr,
666 InstrItinClass itin, list<dag> pattern>
667 : I<4, OL, asmstr, itin> {
668 bits<5> VD;
669 bits<5> VA;
670 bits<5> VB;
671 bits<5> VC;
672
673 let Pattern = pattern;
674
675 let Inst{6-10} = VD;
676 let Inst{11-15} = VA;
677 let Inst{16-20} = VB;
678 let Inst{21-25} = VC;
679 let Inst{26-31} = xo;
680}
681
Chris Lattner53e07de2006-03-26 00:41:48 +0000682class VAForm_2<bits<6> xo, dag OL, string asmstr,
683 InstrItinClass itin, list<dag> pattern>
684 : I<4, OL, asmstr, itin> {
685 bits<5> VD;
686 bits<5> VA;
687 bits<5> VB;
688 bits<4> SH;
689
690 let Pattern = pattern;
691
692 let Inst{6-10} = VD;
693 let Inst{11-15} = VA;
694 let Inst{16-20} = VB;
695 let Inst{21} = 0;
696 let Inst{22-25} = SH;
697 let Inst{26-31} = xo;
698}
699
Nate Begeman8492fd32005-11-23 05:29:52 +0000700// E-2 VX-Form
701class VXForm_1<bits<11> xo, dag OL, string asmstr,
702 InstrItinClass itin, list<dag> pattern>
703 : I<4, OL, asmstr, itin> {
704 bits<5> VD;
705 bits<5> VA;
706 bits<5> VB;
707
Nate Begeman11fd6b22005-11-26 22:39:34 +0000708 let Pattern = pattern;
709
Nate Begeman8492fd32005-11-23 05:29:52 +0000710 let Inst{6-10} = VD;
711 let Inst{11-15} = VA;
712 let Inst{16-20} = VB;
713 let Inst{21-31} = xo;
714}
715
Nate Begeman40f081d2005-12-14 00:34:09 +0000716class VXForm_setzero<bits<11> xo, dag OL, string asmstr,
717 InstrItinClass itin, list<dag> pattern>
718 : VXForm_1<xo, OL, asmstr, itin, pattern> {
719 let VA = VD;
720 let VB = VD;
721}
722
723
Nate Begemanc1381182005-11-29 08:04:45 +0000724class VXForm_2<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> VB;
729
730 let Pattern = pattern;
731
732 let Inst{6-10} = VD;
733 let Inst{11-15} = 0;
734 let Inst{16-20} = VB;
735 let Inst{21-31} = xo;
736}
737
Chris Lattnerdf59d532006-03-27 03:28:57 +0000738class VXForm_3<bits<11> xo, dag OL, string asmstr,
739 InstrItinClass itin, list<dag> pattern>
740 : I<4, OL, asmstr, itin> {
741 bits<5> VD;
742 bits<5> IMM;
743
744 let Pattern = pattern;
745
746 let Inst{6-10} = VD;
747 let Inst{11-15} = IMM;
748 let Inst{16-20} = 0;
749 let Inst{21-31} = xo;
750}
751
Chris Lattner5a528e52006-04-05 00:03:57 +0000752/// VXForm_4 - VX instructions with "VD,0,0" register fields, like mfvscr.
753class VXForm_4<bits<11> xo, dag OL, string asmstr,
754 InstrItinClass itin, list<dag> pattern>
755 : I<4, OL, asmstr, itin> {
756 bits<5> VD;
757
758 let Pattern = pattern;
759
760 let Inst{6-10} = VD;
761 let Inst{11-15} = 0;
762 let Inst{16-20} = 0;
763 let Inst{21-31} = xo;
764}
765
766/// VXForm_5 - VX instructions with "0,0,VB" register fields, like mtvscr.
767class VXForm_5<bits<11> xo, dag OL, string asmstr,
768 InstrItinClass itin, list<dag> pattern>
769 : I<4, OL, asmstr, itin> {
770 bits<5> VB;
771
772 let Pattern = pattern;
773
774 let Inst{6-10} = 0;
775 let Inst{11-15} = 0;
776 let Inst{16-20} = VB;
777 let Inst{21-31} = xo;
778}
Chris Lattnerdf59d532006-03-27 03:28:57 +0000779
Nate Begeman8492fd32005-11-23 05:29:52 +0000780// E-4 VXR-Form
Chris Lattner793cbcb2006-03-26 04:57:17 +0000781class VXRForm_1<bits<10> xo, dag OL, string asmstr,
Nate Begeman8492fd32005-11-23 05:29:52 +0000782 InstrItinClass itin, list<dag> pattern>
783 : I<4, OL, asmstr, itin> {
784 bits<5> VD;
785 bits<5> VA;
786 bits<5> VB;
Chris Lattner793cbcb2006-03-26 04:57:17 +0000787 bit RC = 0;
Nate Begeman8492fd32005-11-23 05:29:52 +0000788
Nate Begeman11fd6b22005-11-26 22:39:34 +0000789 let Pattern = pattern;
790
Nate Begeman8492fd32005-11-23 05:29:52 +0000791 let Inst{6-10} = VD;
792 let Inst{11-15} = VA;
793 let Inst{16-20} = VB;
Chris Lattner793cbcb2006-03-26 04:57:17 +0000794 let Inst{21} = RC;
Nate Begeman8492fd32005-11-23 05:29:52 +0000795 let Inst{22-31} = xo;
796}
797
Misha Brukman6b21bde2004-08-02 21:56:35 +0000798//===----------------------------------------------------------------------===//
Chris Lattnerb439dad2005-10-25 20:58:43 +0000799class Pseudo<dag OL, string asmstr, list<dag> pattern>
Chris Lattner12405742006-01-27 01:46:15 +0000800 : I<0, OL, asmstr, NoItinerary> {
Nate Begeman61738782004-09-02 08:13:00 +0000801 let PPC64 = 0;
Chris Lattnerb439dad2005-10-25 20:58:43 +0000802 let Pattern = pattern;
Nate Begeman61738782004-09-02 08:13:00 +0000803 let Inst{31-0} = 0;
Misha Brukmancd4f51b2004-08-02 16:54:54 +0000804}