blob: 10ac79b1c2e34eb698ccb75cf07a904b40514f2e [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
Chris Lattnerc94d9322006-04-05 22:27:14 +0000328// DSS_Form - Form X instruction, used for altivec dss* instructions.
329class DSS_Form<bits<10> xo, dag OL, string asmstr,
330 InstrItinClass itin, list<dag> pattern>
331 : I<31, OL, asmstr, itin> {
332 bits<1> T;
333 bits<2> STRM;
334 bits<5> A;
335 bits<5> B;
336
337 let Pattern = pattern;
338
339 let Inst{6} = T;
340 let Inst{7-8} = 0;
341 let Inst{9-10} = STRM;
342 let Inst{11-15} = A;
343 let Inst{16-20} = B;
344 let Inst{21-30} = xo;
345 let Inst{31} = 0;
346}
347
Misha Brukman5295e1d2004-08-09 17:24:04 +0000348// 1.7.7 XL-Form
Jim Laskey74ab9962005-10-19 19:51:16 +0000349class XLForm_1<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
350 InstrItinClass itin>
351 : I<opcode, OL, asmstr, itin> {
Nate Begeman65a82c52005-04-14 03:20:38 +0000352 bits<3> CRD;
353 bits<2> CRDb;
354 bits<3> CRA;
355 bits<2> CRAb;
356 bits<3> CRB;
357 bits<2> CRBb;
358
359 let Inst{6-8} = CRD;
360 let Inst{9-10} = CRDb;
361 let Inst{11-13} = CRA;
362 let Inst{14-15} = CRAb;
363 let Inst{16-18} = CRB;
364 let Inst{19-20} = CRBb;
365 let Inst{21-30} = xo;
366 let Inst{31} = 0;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000367}
368
Jim Laskey74ab9962005-10-19 19:51:16 +0000369class XLForm_2<bits<6> opcode, bits<10> xo, bit lk, dag OL, string asmstr,
Nate Begemanb11b8e42005-12-20 00:26:01 +0000370 InstrItinClass itin, list<dag> pattern>
Jim Laskey74ab9962005-10-19 19:51:16 +0000371 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000372 bits<5> BO;
373 bits<5> BI;
374 bits<2> BH;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000375
Nate Begemanb11b8e42005-12-20 00:26:01 +0000376 let Pattern = pattern;
377
Misha Brukman5295e1d2004-08-09 17:24:04 +0000378 let Inst{6-10} = BO;
379 let Inst{11-15} = BI;
380 let Inst{16-18} = 0;
381 let Inst{19-20} = BH;
382 let Inst{21-30} = xo;
383 let Inst{31} = lk;
384}
385
Jim Laskey74ab9962005-10-19 19:51:16 +0000386class XLForm_2_ext<bits<6> opcode, bits<10> xo, bits<5> bo, bits<5> bi, bit lk,
Nate Begemanb11b8e42005-12-20 00:26:01 +0000387 dag OL, string asmstr, InstrItinClass itin, list<dag> pattern>
388 : XLForm_2<opcode, xo, lk, OL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000389 let BO = bo;
390 let BI = bi;
391 let BH = 0;
392}
393
Jim Laskey74ab9962005-10-19 19:51:16 +0000394class XLForm_3<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
395 InstrItinClass itin>
396 : I<opcode, OL, asmstr, itin> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000397 bits<3> BF;
398 bits<3> BFA;
399
400 let Inst{6-8} = BF;
401 let Inst{9-10} = 0;
402 let Inst{11-13} = BFA;
403 let Inst{14-15} = 0;
404 let Inst{16-20} = 0;
405 let Inst{21-30} = xo;
406 let Inst{31} = 0;
407}
408
Misha Brukman5295e1d2004-08-09 17:24:04 +0000409// 1.7.8 XFX-Form
Jim Laskey74ab9962005-10-19 19:51:16 +0000410class XFXForm_1<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
411 InstrItinClass itin>
412 : I<opcode, OL, asmstr, itin> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000413 bits<5> RT;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000414 bits<10> SPR;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000415
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000416 let Inst{6-10} = RT;
Nate Begeman048b2632005-11-29 22:42:50 +0000417 let Inst{11} = SPR{4};
418 let Inst{12} = SPR{3};
419 let Inst{13} = SPR{2};
420 let Inst{14} = SPR{1};
421 let Inst{15} = SPR{0};
422 let Inst{16} = SPR{9};
423 let Inst{17} = SPR{8};
424 let Inst{18} = SPR{7};
425 let Inst{19} = SPR{6};
426 let Inst{20} = SPR{5};
Misha Brukman5295e1d2004-08-09 17:24:04 +0000427 let Inst{21-30} = xo;
428 let Inst{31} = 0;
429}
430
Chris Lattnerd790d222005-04-19 04:40:07 +0000431class XFXForm_1_ext<bits<6> opcode, bits<10> xo, bits<10> spr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000432 dag OL, string asmstr, InstrItinClass itin>
433 : XFXForm_1<opcode, xo, OL, asmstr, itin> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000434 let SPR = spr;
435}
436
Jim Laskey74ab9962005-10-19 19:51:16 +0000437class XFXForm_3<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
438 InstrItinClass itin>
439 : I<opcode, OL, asmstr, itin> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000440 bits<5> RT;
441
442 let Inst{6-10} = RT;
443 let Inst{11-20} = 0;
444 let Inst{21-30} = xo;
445 let Inst{31} = 0;
446}
447
Jim Laskey74ab9962005-10-19 19:51:16 +0000448class XFXForm_5<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
449 InstrItinClass itin>
450 : I<opcode, OL, asmstr, itin> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000451 bits<8> FXM;
452 bits<5> ST;
453
454 let Inst{6-10} = ST;
Nate Begeman9a838672005-08-08 20:04:52 +0000455 let Inst{11} = 0;
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000456 let Inst{12-19} = FXM;
457 let Inst{20} = 0;
458 let Inst{21-30} = xo;
459 let Inst{31} = 0;
460}
461
Jim Laskey74ab9962005-10-19 19:51:16 +0000462class XFXForm_5a<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
463 InstrItinClass itin>
464 : I<opcode, OL, asmstr, itin> {
Nate Begeman9a838672005-08-08 20:04:52 +0000465 bits<5> ST;
466 bits<8> FXM;
467
468 let Inst{6-10} = ST;
469 let Inst{11} = 1;
470 let Inst{12-19} = FXM;
471 let Inst{20} = 0;
472 let Inst{21-30} = xo;
473 let Inst{31} = 0;
474}
475
Jim Laskey74ab9962005-10-19 19:51:16 +0000476class XFXForm_7<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
477 InstrItinClass itin>
478 : XFXForm_1<opcode, xo, OL, asmstr, itin>;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000479
Nate Begeman143cf942004-08-30 02:28:06 +0000480class XFXForm_7_ext<bits<6> opcode, bits<10> xo, bits<10> spr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000481 dag OL, string asmstr, InstrItinClass itin>
482 : XFXForm_7<opcode, xo, OL, asmstr, itin> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000483 let SPR = spr;
484}
485
Nate Begeman765cb5f2004-08-13 02:19:26 +0000486// 1.7.10 XS-Form
Jim Laskey74ab9962005-10-19 19:51:16 +0000487class XSForm_1<bits<6> opcode, bits<9> xo, dag OL, string asmstr,
488 InstrItinClass itin>
489 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000490 bits<5> RS;
491 bits<5> A;
492 bits<6> SH;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000493
Chris Lattnerf9172e12005-04-19 05:15:18 +0000494 bit RC = 0; // set by isDOT
495
Nate Begeman765cb5f2004-08-13 02:19:26 +0000496 let Inst{6-10} = RS;
497 let Inst{11-15} = A;
498 let Inst{16-20} = SH{1-5};
499 let Inst{21-29} = xo;
500 let Inst{30} = SH{0};
Chris Lattnerf9172e12005-04-19 05:15:18 +0000501 let Inst{31} = RC;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000502}
503
Misha Brukman5295e1d2004-08-09 17:24:04 +0000504// 1.7.11 XO-Form
Chris Lattner3a1002d2005-09-02 21:18:00 +0000505class XOForm_1<bits<6> opcode, bits<9> xo, bit oe, dag OL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000506 InstrItinClass itin, list<dag> pattern>
507 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000508 bits<5> RT;
509 bits<5> RA;
510 bits<5> RB;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000511
Chris Lattner3a1002d2005-09-02 21:18:00 +0000512 let Pattern = pattern;
513
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000514 bit RC = 0; // set by isDOT
515
Misha Brukman5295e1d2004-08-09 17:24:04 +0000516 let Inst{6-10} = RT;
517 let Inst{11-15} = RA;
518 let Inst{16-20} = RB;
519 let Inst{21} = oe;
520 let Inst{22-30} = xo;
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000521 let Inst{31} = RC;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000522}
523
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000524class XOForm_3<bits<6> opcode, bits<9> xo, bit oe,
Jim Laskey74ab9962005-10-19 19:51:16 +0000525 dag OL, string asmstr, InstrItinClass itin, list<dag> pattern>
526 : XOForm_1<opcode, xo, oe, OL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000527 let RB = 0;
528}
529
530// 1.7.12 A-Form
Chris Lattner027a2672005-09-29 23:34:24 +0000531class AForm_1<bits<6> opcode, bits<5> xo, dag OL, string asmstr,
Jim Laskey74ab9962005-10-19 19:51:16 +0000532 InstrItinClass itin, list<dag> pattern>
533 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000534 bits<5> FRT;
535 bits<5> FRA;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000536 bits<5> FRC;
Chris Lattnerda76c162004-11-25 04:11:07 +0000537 bits<5> FRB;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000538
Chris Lattner027a2672005-09-29 23:34:24 +0000539 let Pattern = pattern;
540
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000541 bit RC = 0; // set by isDOT
542
Misha Brukman5295e1d2004-08-09 17:24:04 +0000543 let Inst{6-10} = FRT;
544 let Inst{11-15} = FRA;
545 let Inst{16-20} = FRB;
546 let Inst{21-25} = FRC;
547 let Inst{26-30} = xo;
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000548 let Inst{31} = RC;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000549}
550
Jim Laskey74ab9962005-10-19 19:51:16 +0000551class AForm_2<bits<6> opcode, bits<5> xo, dag OL, string asmstr,
552 InstrItinClass itin, list<dag> pattern>
553 : AForm_1<opcode, xo, OL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000554 let FRC = 0;
555}
556
Jim Laskey74ab9962005-10-19 19:51:16 +0000557class AForm_3<bits<6> opcode, bits<5> xo, dag OL, string asmstr,
558 InstrItinClass itin, list<dag> pattern>
559 : AForm_1<opcode, xo, OL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000560 let FRB = 0;
561}
562
Misha Brukman5295e1d2004-08-09 17:24:04 +0000563// 1.7.13 M-Form
Jim Laskey74ab9962005-10-19 19:51:16 +0000564class MForm_1<bits<6> opcode, dag OL, string asmstr,
565 InstrItinClass itin, list<dag> pattern>
566 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000567 bits<5> RA;
Chris Lattner5f4b0e12004-11-23 19:23:32 +0000568 bits<5> RS;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000569 bits<5> RB;
570 bits<5> MB;
571 bits<5> ME;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000572
Nate Begeman9f3c26c2005-10-19 18:42:01 +0000573 let Pattern = pattern;
574
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000575 bit RC = 0; // set by isDOT
576
Misha Brukman5295e1d2004-08-09 17:24:04 +0000577 let Inst{6-10} = RS;
578 let Inst{11-15} = RA;
579 let Inst{16-20} = RB;
580 let Inst{21-25} = MB;
581 let Inst{26-30} = ME;
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000582 let Inst{31} = RC;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000583}
584
Jim Laskey74ab9962005-10-19 19:51:16 +0000585class MForm_2<bits<6> opcode, dag OL, string asmstr,
586 InstrItinClass itin, list<dag> pattern>
587 : MForm_1<opcode, OL, asmstr, itin, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000588}
589
Nate Begeman765cb5f2004-08-13 02:19:26 +0000590// 1.7.14 MD-Form
Jim Laskey74ab9962005-10-19 19:51:16 +0000591class MDForm_1<bits<6> opcode, bits<3> xo, dag OL, string asmstr,
592 InstrItinClass itin, list<dag> pattern>
593 : I<opcode, OL, asmstr, itin> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000594 bits<5> RS;
595 bits<5> RA;
596 bits<6> SH;
597 bits<6> MBE;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000598
Nate Begeman9f3c26c2005-10-19 18:42:01 +0000599 let Pattern = pattern;
600
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000601 bit RC = 0; // set by isDOT
602
Nate Begeman765cb5f2004-08-13 02:19:26 +0000603 let Inst{6-10} = RS;
604 let Inst{11-15} = RA;
605 let Inst{16-20} = SH{1-5};
606 let Inst{21-26} = MBE;
607 let Inst{27-29} = xo;
608 let Inst{30} = SH{0};
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000609 let Inst{31} = RC;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000610}
611
Chris Lattnerc94d9322006-04-05 22:27:14 +0000612
613
Nate Begeman8492fd32005-11-23 05:29:52 +0000614// E-1 VA-Form
Chris Lattner1738c292006-03-27 03:34:17 +0000615
616// VAForm_1 - DACB ordering.
Nate Begeman8492fd32005-11-23 05:29:52 +0000617class VAForm_1<bits<6> xo, dag OL, string asmstr,
618 InstrItinClass itin, list<dag> pattern>
619 : I<4, OL, asmstr, itin> {
620 bits<5> VD;
621 bits<5> VA;
Nate Begeman8492fd32005-11-23 05:29:52 +0000622 bits<5> VC;
Chris Lattner4e737172006-03-22 01:44:36 +0000623 bits<5> VB;
Nate Begeman11fd6b22005-11-26 22:39:34 +0000624
625 let Pattern = pattern;
Nate Begeman8492fd32005-11-23 05:29:52 +0000626
627 let Inst{6-10} = VD;
628 let Inst{11-15} = VA;
629 let Inst{16-20} = VB;
630 let Inst{21-25} = VC;
631 let Inst{26-31} = xo;
632}
633
Chris Lattner1738c292006-03-27 03:34:17 +0000634// VAForm_1a - DABC ordering.
635class VAForm_1a<bits<6> xo, dag OL, string asmstr,
636 InstrItinClass itin, list<dag> pattern>
637 : I<4, OL, asmstr, itin> {
638 bits<5> VD;
639 bits<5> VA;
640 bits<5> VB;
641 bits<5> VC;
642
643 let Pattern = pattern;
644
645 let Inst{6-10} = VD;
646 let Inst{11-15} = VA;
647 let Inst{16-20} = VB;
648 let Inst{21-25} = VC;
649 let Inst{26-31} = xo;
650}
651
Chris Lattner53e07de2006-03-26 00:41:48 +0000652class VAForm_2<bits<6> xo, dag OL, string asmstr,
653 InstrItinClass itin, list<dag> pattern>
654 : I<4, OL, asmstr, itin> {
655 bits<5> VD;
656 bits<5> VA;
657 bits<5> VB;
658 bits<4> SH;
659
660 let Pattern = pattern;
661
662 let Inst{6-10} = VD;
663 let Inst{11-15} = VA;
664 let Inst{16-20} = VB;
665 let Inst{21} = 0;
666 let Inst{22-25} = SH;
667 let Inst{26-31} = xo;
668}
669
Nate Begeman8492fd32005-11-23 05:29:52 +0000670// E-2 VX-Form
671class VXForm_1<bits<11> xo, dag OL, string asmstr,
672 InstrItinClass itin, list<dag> pattern>
673 : I<4, OL, asmstr, itin> {
674 bits<5> VD;
675 bits<5> VA;
676 bits<5> VB;
677
Nate Begeman11fd6b22005-11-26 22:39:34 +0000678 let Pattern = pattern;
679
Nate Begeman8492fd32005-11-23 05:29:52 +0000680 let Inst{6-10} = VD;
681 let Inst{11-15} = VA;
682 let Inst{16-20} = VB;
683 let Inst{21-31} = xo;
684}
685
Nate Begeman40f081d2005-12-14 00:34:09 +0000686class VXForm_setzero<bits<11> xo, dag OL, string asmstr,
687 InstrItinClass itin, list<dag> pattern>
688 : VXForm_1<xo, OL, asmstr, itin, pattern> {
689 let VA = VD;
690 let VB = VD;
691}
692
693
Nate Begemanc1381182005-11-29 08:04:45 +0000694class VXForm_2<bits<11> xo, dag OL, string asmstr,
695 InstrItinClass itin, list<dag> pattern>
696 : I<4, OL, asmstr, itin> {
697 bits<5> VD;
698 bits<5> VB;
699
700 let Pattern = pattern;
701
702 let Inst{6-10} = VD;
703 let Inst{11-15} = 0;
704 let Inst{16-20} = VB;
705 let Inst{21-31} = xo;
706}
707
Chris Lattnerdf59d532006-03-27 03:28:57 +0000708class VXForm_3<bits<11> xo, dag OL, string asmstr,
709 InstrItinClass itin, list<dag> pattern>
710 : I<4, OL, asmstr, itin> {
711 bits<5> VD;
712 bits<5> IMM;
713
714 let Pattern = pattern;
715
716 let Inst{6-10} = VD;
717 let Inst{11-15} = IMM;
718 let Inst{16-20} = 0;
719 let Inst{21-31} = xo;
720}
721
Chris Lattner5a528e52006-04-05 00:03:57 +0000722/// VXForm_4 - VX instructions with "VD,0,0" register fields, like mfvscr.
723class VXForm_4<bits<11> xo, dag OL, string asmstr,
724 InstrItinClass itin, list<dag> pattern>
725 : I<4, OL, asmstr, itin> {
726 bits<5> VD;
727
728 let Pattern = pattern;
729
730 let Inst{6-10} = VD;
731 let Inst{11-15} = 0;
732 let Inst{16-20} = 0;
733 let Inst{21-31} = xo;
734}
735
736/// VXForm_5 - VX instructions with "0,0,VB" register fields, like mtvscr.
737class VXForm_5<bits<11> xo, dag OL, string asmstr,
738 InstrItinClass itin, list<dag> pattern>
739 : I<4, OL, asmstr, itin> {
740 bits<5> VB;
741
742 let Pattern = pattern;
743
744 let Inst{6-10} = 0;
745 let Inst{11-15} = 0;
746 let Inst{16-20} = VB;
747 let Inst{21-31} = xo;
748}
Chris Lattnerdf59d532006-03-27 03:28:57 +0000749
Nate Begeman8492fd32005-11-23 05:29:52 +0000750// E-4 VXR-Form
Chris Lattner793cbcb2006-03-26 04:57:17 +0000751class VXRForm_1<bits<10> xo, dag OL, string asmstr,
Nate Begeman8492fd32005-11-23 05:29:52 +0000752 InstrItinClass itin, list<dag> pattern>
753 : I<4, OL, asmstr, itin> {
754 bits<5> VD;
755 bits<5> VA;
756 bits<5> VB;
Chris Lattner793cbcb2006-03-26 04:57:17 +0000757 bit RC = 0;
Nate Begeman8492fd32005-11-23 05:29:52 +0000758
Nate Begeman11fd6b22005-11-26 22:39:34 +0000759 let Pattern = pattern;
760
Nate Begeman8492fd32005-11-23 05:29:52 +0000761 let Inst{6-10} = VD;
762 let Inst{11-15} = VA;
763 let Inst{16-20} = VB;
Chris Lattner793cbcb2006-03-26 04:57:17 +0000764 let Inst{21} = RC;
Nate Begeman8492fd32005-11-23 05:29:52 +0000765 let Inst{22-31} = xo;
766}
767
Misha Brukman6b21bde2004-08-02 21:56:35 +0000768//===----------------------------------------------------------------------===//
Chris Lattnerb439dad2005-10-25 20:58:43 +0000769class Pseudo<dag OL, string asmstr, list<dag> pattern>
Chris Lattner12405742006-01-27 01:46:15 +0000770 : I<0, OL, asmstr, NoItinerary> {
Nate Begeman61738782004-09-02 08:13:00 +0000771 let PPC64 = 0;
772 let VMX = 0;
Chris Lattnerb439dad2005-10-25 20:58:43 +0000773 let Pattern = pattern;
Nate Begeman61738782004-09-02 08:13:00 +0000774 let Inst{31-0} = 0;
Misha Brukmancd4f51b2004-08-02 16:54:54 +0000775}