blob: 880a66a99e296008abdade40c52efa67b89011c0 [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//===----------------------------------------------------------------------===//
9//
10//
11//===----------------------------------------------------------------------===//
12
Misha Brukman6b21bde2004-08-02 21:56:35 +000013//===----------------------------------------------------------------------===//
14//
15// PowerPC instruction formats
Misha Brukmancd4f51b2004-08-02 16:54:54 +000016
Chris Lattner5b78da42005-04-19 05:05:22 +000017class I<bits<6> opcode, dag OL, string asmstr> : Instruction {
Misha Brukman6b21bde2004-08-02 21:56:35 +000018 field bits<32> Inst;
Misha Brukmancd4f51b2004-08-02 16:54:54 +000019
Chris Lattner5b78da42005-04-19 05:05:22 +000020 bit PPC64 = 0; // Default value, override with isPPC64
21 bit VMX = 0; // Default value, override with isVMX
Misha Brukmancd4f51b2004-08-02 16:54:54 +000022
Nate Begeman4bfceb12004-09-04 05:00:00 +000023 let Name = "";
Misha Brukmandad438b2004-08-10 22:47:03 +000024 let Namespace = "PPC";
Misha Brukman5295e1d2004-08-09 17:24:04 +000025 let Inst{0-5} = opcode;
Nate Begeman4bfceb12004-09-04 05:00:00 +000026 let OperandList = OL;
27 let AsmString = asmstr;
Misha Brukmancd4f51b2004-08-02 16:54:54 +000028}
29
Misha Brukman5295e1d2004-08-09 17:24:04 +000030// 1.7.1 I-Form
Chris Lattner116a9e52005-04-19 05:00:59 +000031class IForm<bits<6> opcode, bit aa, bit lk, dag OL, string asmstr>
Chris Lattner5b78da42005-04-19 05:05:22 +000032 : I<opcode, OL, asmstr> {
Misha Brukman189f3dc2004-10-14 05:55:37 +000033 bits<24> LI;
Misha Brukman6b21bde2004-08-02 21:56:35 +000034
Misha Brukman5295e1d2004-08-09 17:24:04 +000035 let Inst{6-29} = LI;
36 let Inst{30} = aa;
37 let Inst{31} = lk;
Misha Brukman6b21bde2004-08-02 21:56:35 +000038}
39
Misha Brukman5295e1d2004-08-09 17:24:04 +000040// 1.7.2 B-Form
Nate Begeman7b809f52005-08-26 04:11:42 +000041class BForm<bits<6> opcode, bit aa, bit lk, bits<5> bo, bits<2> bicode, dag OL,
42 string asmstr>
43 : I<opcode, OL, asmstr> {
44 bits<3> CR;
Misha Brukman189f3dc2004-10-14 05:55:37 +000045 bits<14> BD;
Misha Brukman5295e1d2004-08-09 17:24:04 +000046
Nate Begeman7b809f52005-08-26 04:11:42 +000047 let Inst{6-10} = bo;
48 let Inst{11-13} = CR;
49 let Inst{14-15} = bicode;
Misha Brukman5295e1d2004-08-09 17:24:04 +000050 let Inst{16-29} = BD;
51 let Inst{30} = aa;
52 let Inst{31} = lk;
Misha Brukman6b21bde2004-08-02 21:56:35 +000053}
54
Misha Brukman5295e1d2004-08-09 17:24:04 +000055// 1.7.4 D-Form
Chris Lattner2d8032b2005-09-08 17:33:10 +000056class DForm_base<bits<6> opcode, dag OL, string asmstr, list<dag> pattern>
57 : I<opcode, OL, asmstr> {
58 let Pattern = pattern;
Misha Brukman189f3dc2004-10-14 05:55:37 +000059 bits<5> A;
60 bits<5> B;
61 bits<16> C;
Misha Brukman6b21bde2004-08-02 21:56:35 +000062
Misha Brukman6b21bde2004-08-02 21:56:35 +000063 let Inst{6-10} = A;
64 let Inst{11-15} = B;
65 let Inst{16-31} = C;
66}
67
Chris Lattner2d8032b2005-09-08 17:33:10 +000068class DForm_1<bits<6> opcode, dag OL, string asmstr>
69 : I<opcode, OL, asmstr> {
Misha Brukman15b0fb52004-10-23 06:08:38 +000070 bits<5> A;
71 bits<16> C;
72 bits<5> B;
73
Misha Brukman15b0fb52004-10-23 06:08:38 +000074 let Inst{6-10} = A;
75 let Inst{11-15} = B;
76 let Inst{16-31} = C;
Misha Brukman6b21bde2004-08-02 21:56:35 +000077}
78
Chris Lattner2d8032b2005-09-08 17:33:10 +000079class DForm_2<bits<6> opcode, dag OL, string asmstr, list<dag> pattern>
80 : DForm_base<opcode, OL, asmstr, pattern>;
Misha Brukman6b21bde2004-08-02 21:56:35 +000081
Chris Lattner2d8032b2005-09-08 17:33:10 +000082class DForm_2_r0<bits<6> opcode, dag OL, string asmstr, list<dag> pattern>
Chris Lattner5b78da42005-04-19 05:05:22 +000083 : I<opcode, OL, asmstr> {
Misha Brukman189f3dc2004-10-14 05:55:37 +000084 bits<5> A;
85 bits<16> B;
Nate Begeman4bfceb12004-09-04 05:00:00 +000086
Chris Lattner2d8032b2005-09-08 17:33:10 +000087 let Pattern = pattern;
88
Nate Begeman4bfceb12004-09-04 05:00:00 +000089 let Inst{6-10} = A;
90 let Inst{11-15} = 0;
91 let Inst{16-31} = B;
Misha Brukman6b21bde2004-08-02 21:56:35 +000092}
93
94// Currently we make the use/def reg distinction in ISel, not tablegen
Chris Lattnerb2367e32005-04-19 04:59:28 +000095class DForm_3<bits<6> opcode, dag OL, string asmstr>
96 : DForm_1<opcode, OL, asmstr>;
Misha Brukman6b21bde2004-08-02 21:56:35 +000097
Chris Lattner76cb0062005-09-08 17:40:49 +000098class DForm_4<bits<6> opcode, dag OL, string asmstr, list<dag> pattern>
99 : I<opcode, OL, asmstr> {
Chris Lattner022e2712004-11-24 02:15:41 +0000100 bits<5> B;
101 bits<5> A;
102 bits<16> C;
103
Chris Lattner76cb0062005-09-08 17:40:49 +0000104 let Pattern = pattern;
105
Chris Lattner022e2712004-11-24 02:15:41 +0000106 let Inst{6-10} = A;
107 let Inst{11-15} = B;
108 let Inst{16-31} = C;
109}
Nate Begeman4bfceb12004-09-04 05:00:00 +0000110
Chris Lattnerb2367e32005-04-19 04:59:28 +0000111class DForm_4_zero<bits<6> opcode, dag OL, string asmstr>
112 : DForm_1<opcode, OL, asmstr> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000113 let A = 0;
114 let B = 0;
115 let C = 0;
116}
117
Chris Lattner5b78da42005-04-19 05:05:22 +0000118class DForm_5<bits<6> opcode, dag OL, string asmstr> : I<opcode, OL, asmstr> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000119 bits<3> BF;
120 bits<1> L;
121 bits<5> RA;
122 bits<16> I;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000123
Misha Brukman5295e1d2004-08-09 17:24:04 +0000124 let Inst{6-8} = BF;
125 let Inst{9} = 0;
126 let Inst{10} = L;
127 let Inst{11-15} = RA;
128 let Inst{16-31} = I;
129}
130
Chris Lattnerb2367e32005-04-19 04:59:28 +0000131class DForm_5_ext<bits<6> opcode, dag OL, string asmstr>
132 : DForm_5<opcode, OL, asmstr> {
133 let L = PPC64;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000134}
135
Chris Lattnerb2367e32005-04-19 04:59:28 +0000136class DForm_6<bits<6> opcode, dag OL, string asmstr>
137 : DForm_5<opcode, OL, asmstr>;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000138
Chris Lattnerb2367e32005-04-19 04:59:28 +0000139class DForm_6_ext<bits<6> opcode, dag OL, string asmstr>
140 : DForm_6<opcode, OL, asmstr> {
141 let L = PPC64;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000142}
143
Chris Lattnerb2367e32005-04-19 04:59:28 +0000144class DForm_8<bits<6> opcode, dag OL, string asmstr>
145 : DForm_1<opcode, OL, asmstr> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000146}
147
Chris Lattnerb2367e32005-04-19 04:59:28 +0000148class DForm_9<bits<6> opcode, dag OL, string asmstr>
149 : DForm_1<opcode, OL, asmstr> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000150}
151
Misha Brukman28beda92004-08-11 15:54:36 +0000152// 1.7.5 DS-Form
Chris Lattnerb2367e32005-04-19 04:59:28 +0000153class DSForm_1<bits<6> opcode, bits<2> xo, dag OL, string asmstr>
Chris Lattner5b78da42005-04-19 05:05:22 +0000154 : I<opcode, OL, asmstr> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000155 bits<5> RST;
156 bits<14> DS;
157 bits<5> RA;
Misha Brukman28beda92004-08-11 15:54:36 +0000158
Misha Brukman28beda92004-08-11 15:54:36 +0000159 let Inst{6-10} = RST;
160 let Inst{11-15} = RA;
161 let Inst{16-29} = DS;
162 let Inst{30-31} = xo;
163}
164
Chris Lattnerb2367e32005-04-19 04:59:28 +0000165class DSForm_2<bits<6> opcode, bits<2> xo, dag OL, string asmstr>
166 : DSForm_1<opcode, xo, OL, asmstr>;
Misha Brukman28beda92004-08-11 15:54:36 +0000167
Misha Brukman5295e1d2004-08-09 17:24:04 +0000168// 1.7.6 X-Form
Chris Lattnerf9172e12005-04-19 05:15:18 +0000169class XForm_base_r3xo<bits<6> opcode, bits<10> xo,
Chris Lattner5b78da42005-04-19 05:05:22 +0000170 dag OL, string asmstr> : I<opcode, OL, asmstr> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000171 bits<5> RST;
172 bits<5> A;
173 bits<5> B;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000174
Chris Lattnerf9172e12005-04-19 05:15:18 +0000175 bit RC = 0; // set by isDOT
176
Misha Brukman28beda92004-08-11 15:54:36 +0000177 let Inst{6-10} = RST;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000178 let Inst{11-15} = A;
179 let Inst{16-20} = B;
180 let Inst{21-30} = xo;
Chris Lattnerf9172e12005-04-19 05:15:18 +0000181 let Inst{31} = RC;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000182}
183
Chris Lattner130888ad2004-11-24 03:52:02 +0000184// This is the same as XForm_base_r3xo, but the first two operands are swapped
185// when code is emitted.
186class XForm_base_r3xo_swapped
Chris Lattnerf9172e12005-04-19 05:15:18 +0000187 <bits<6> opcode, bits<10> xo, dag OL, string asmstr>
Chris Lattner5b78da42005-04-19 05:05:22 +0000188 : I<opcode, OL, asmstr> {
Chris Lattner130888ad2004-11-24 03:52:02 +0000189 bits<5> A;
190 bits<5> RST;
191 bits<5> B;
192
Chris Lattnerf9172e12005-04-19 05:15:18 +0000193 bit RC = 0; // set by isDOT
194
Chris Lattner130888ad2004-11-24 03:52:02 +0000195 let Inst{6-10} = RST;
196 let Inst{11-15} = A;
197 let Inst{16-20} = B;
198 let Inst{21-30} = xo;
Chris Lattnerf9172e12005-04-19 05:15:18 +0000199 let Inst{31} = RC;
Chris Lattner130888ad2004-11-24 03:52:02 +0000200}
201
Nate Begeman765cb5f2004-08-13 02:19:26 +0000202
Chris Lattner15709c22005-04-19 04:51:30 +0000203class XForm_1<bits<6> opcode, bits<10> xo, dag OL, string asmstr>
Chris Lattnerf9172e12005-04-19 05:15:18 +0000204 : XForm_base_r3xo<opcode, xo, OL, asmstr>;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000205
Chris Lattnerdcbb5612005-09-02 22:35:53 +0000206class XForm_6<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
207 list<dag> pattern>
208 : XForm_base_r3xo_swapped<opcode, xo, OL, asmstr> {
209 let Pattern = pattern;
210}
Misha Brukman5295e1d2004-08-09 17:24:04 +0000211
Chris Lattner15709c22005-04-19 04:51:30 +0000212class XForm_8<bits<6> opcode, bits<10> xo, dag OL, string asmstr>
Chris Lattnerf9172e12005-04-19 05:15:18 +0000213 : XForm_base_r3xo<opcode, xo, OL, asmstr>;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000214
Chris Lattner027a2672005-09-29 23:34:24 +0000215class XForm_10<bits<6> opcode, bits<10> xo, dag OL, string asmstr, list<dag> pt>
Chris Lattnerf9172e12005-04-19 05:15:18 +0000216 : XForm_base_r3xo_swapped<opcode, xo, OL, asmstr> {
Chris Lattner027a2672005-09-29 23:34:24 +0000217 let Pattern = pt;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000218}
219
Chris Lattnerdcbb5612005-09-02 22:35:53 +0000220class XForm_11<bits<6> opcode, bits<10> xo, dag OL, string asmstr,
221 list<dag> pattern>
Chris Lattnerf9172e12005-04-19 05:15:18 +0000222 : XForm_base_r3xo_swapped<opcode, xo, OL, asmstr> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000223 let B = 0;
Chris Lattnerdcbb5612005-09-02 22:35:53 +0000224 let Pattern = pattern;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000225}
226
Chris Lattner15709c22005-04-19 04:51:30 +0000227class XForm_16<bits<6> opcode, bits<10> xo, dag OL, string asmstr>
Chris Lattner5b78da42005-04-19 05:05:22 +0000228 : I<opcode, OL, asmstr> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000229 bits<3> BF;
230 bits<1> L;
231 bits<5> RA;
232 bits<5> RB;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000233
Misha Brukman5295e1d2004-08-09 17:24:04 +0000234 let Inst{6-8} = BF;
235 let Inst{9} = 0;
236 let Inst{10} = L;
237 let Inst{11-15} = RA;
238 let Inst{16-20} = RB;
239 let Inst{21-30} = xo;
240 let Inst{31} = 0;
241}
242
Chris Lattner15709c22005-04-19 04:51:30 +0000243class XForm_16_ext<bits<6> opcode, bits<10> xo, dag OL, string asmstr>
244 : XForm_16<opcode, xo, OL, asmstr> {
245 let L = PPC64;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000246}
247
Chris Lattner15709c22005-04-19 04:51:30 +0000248class XForm_17<bits<6> opcode, bits<10> xo, dag OL, string asmstr>
Chris Lattner5b78da42005-04-19 05:05:22 +0000249 : I<opcode, OL, asmstr> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000250 bits<3> BF;
251 bits<5> FRA;
252 bits<5> FRB;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000253
Misha Brukman5295e1d2004-08-09 17:24:04 +0000254 let Inst{6-8} = BF;
255 let Inst{9-10} = 0;
256 let Inst{11-15} = FRA;
257 let Inst{16-20} = FRB;
258 let Inst{21-30} = xo;
259 let Inst{31} = 0;
260}
261
Chris Lattner15709c22005-04-19 04:51:30 +0000262class XForm_25<bits<6> opcode, bits<10> xo, dag OL, string asmstr>
Chris Lattnerf9172e12005-04-19 05:15:18 +0000263 : XForm_base_r3xo<opcode, xo, OL, asmstr> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000264}
265
Chris Lattner027a2672005-09-29 23:34:24 +0000266class XForm_26<bits<6> opcode, bits<10> xo, dag OL, string asmstr, list<dag> pt>
Chris Lattnerf9172e12005-04-19 05:15:18 +0000267 : XForm_base_r3xo<opcode, xo, OL, asmstr> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000268 let A = 0;
Chris Lattner027a2672005-09-29 23:34:24 +0000269 let Pattern = pt;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000270}
271
Chris Lattner15709c22005-04-19 04:51:30 +0000272class XForm_28<bits<6> opcode, bits<10> xo, dag OL, string asmstr>
Chris Lattnerf9172e12005-04-19 05:15:18 +0000273 : XForm_base_r3xo<opcode, xo, OL, asmstr> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000274}
275
276// 1.7.7 XL-Form
Chris Lattner15709c22005-04-19 04:51:30 +0000277class XLForm_1<bits<6> opcode, bits<10> xo, dag OL, string asmstr>
Chris Lattner5b78da42005-04-19 05:05:22 +0000278 : I<opcode, OL, asmstr> {
Nate Begeman65a82c52005-04-14 03:20:38 +0000279 bits<3> CRD;
280 bits<2> CRDb;
281 bits<3> CRA;
282 bits<2> CRAb;
283 bits<3> CRB;
284 bits<2> CRBb;
285
286 let Inst{6-8} = CRD;
287 let Inst{9-10} = CRDb;
288 let Inst{11-13} = CRA;
289 let Inst{14-15} = CRAb;
290 let Inst{16-18} = CRB;
291 let Inst{19-20} = CRBb;
292 let Inst{21-30} = xo;
293 let Inst{31} = 0;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000294}
295
Chris Lattner15709c22005-04-19 04:51:30 +0000296class XLForm_2<bits<6> opcode, bits<10> xo, bit lk,
Chris Lattner5b78da42005-04-19 05:05:22 +0000297 dag OL, string asmstr> : I<opcode, OL, asmstr> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000298 bits<5> BO;
299 bits<5> BI;
300 bits<2> BH;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000301
Misha Brukman5295e1d2004-08-09 17:24:04 +0000302 let Inst{6-10} = BO;
303 let Inst{11-15} = BI;
304 let Inst{16-18} = 0;
305 let Inst{19-20} = BH;
306 let Inst{21-30} = xo;
307 let Inst{31} = lk;
308}
309
Nate Begeman61738782004-09-02 08:13:00 +0000310class XLForm_2_ext<bits<6> opcode, bits<10> xo, bits<5> bo,
Chris Lattner15709c22005-04-19 04:51:30 +0000311 bits<5> bi, bit lk, dag OL, string asmstr>
312 : XLForm_2<opcode, xo, lk, OL, asmstr> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000313 let BO = bo;
314 let BI = bi;
315 let BH = 0;
316}
317
Chris Lattner15709c22005-04-19 04:51:30 +0000318class XLForm_3<bits<6> opcode, bits<10> xo, dag OL, string asmstr>
Chris Lattner5b78da42005-04-19 05:05:22 +0000319 : I<opcode, OL, asmstr> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000320 bits<3> BF;
321 bits<3> BFA;
322
323 let Inst{6-8} = BF;
324 let Inst{9-10} = 0;
325 let Inst{11-13} = BFA;
326 let Inst{14-15} = 0;
327 let Inst{16-20} = 0;
328 let Inst{21-30} = xo;
329 let Inst{31} = 0;
330}
331
Misha Brukman5295e1d2004-08-09 17:24:04 +0000332// 1.7.8 XFX-Form
Chris Lattnerd790d222005-04-19 04:40:07 +0000333class XFXForm_1<bits<6> opcode, bits<10> xo, dag OL, string asmstr>
Chris Lattner5b78da42005-04-19 05:05:22 +0000334 : I<opcode, OL, asmstr> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000335 bits<5> RT;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000336 bits<10> SPR;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000337
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000338 let Inst{6-10} = RT;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000339 let Inst{11-20} = SPR;
340 let Inst{21-30} = xo;
341 let Inst{31} = 0;
342}
343
Chris Lattnerd790d222005-04-19 04:40:07 +0000344class XFXForm_1_ext<bits<6> opcode, bits<10> xo, bits<10> spr,
345 dag OL, string asmstr>
346 : XFXForm_1<opcode, xo, OL, asmstr> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000347 let SPR = spr;
348}
349
Chris Lattner5b78da42005-04-19 05:05:22 +0000350class XFXForm_3<bits<6> opcode, bits<10> xo, dag OL, string asmstr>
351 : I<opcode, OL, asmstr> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000352 bits<5> RT;
353
354 let Inst{6-10} = RT;
355 let Inst{11-20} = 0;
356 let Inst{21-30} = xo;
357 let Inst{31} = 0;
358}
359
Nate Begeman9a838672005-08-08 20:04:52 +0000360class XFXForm_5<bits<6> opcode, bits<10> xo, dag OL, string asmstr>
361 : I<opcode, OL, asmstr> {
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000362 bits<8> FXM;
363 bits<5> ST;
364
365 let Inst{6-10} = ST;
Nate Begeman9a838672005-08-08 20:04:52 +0000366 let Inst{11} = 0;
Nate Begemanf67f3bf2005-04-12 07:04:16 +0000367 let Inst{12-19} = FXM;
368 let Inst{20} = 0;
369 let Inst{21-30} = xo;
370 let Inst{31} = 0;
371}
372
Nate Begeman9a838672005-08-08 20:04:52 +0000373class XFXForm_5a<bits<6> opcode, bits<10> xo, dag OL, string asmstr>
374 : I<opcode, OL, asmstr> {
375 bits<5> ST;
376 bits<8> FXM;
377
378 let Inst{6-10} = ST;
379 let Inst{11} = 1;
380 let Inst{12-19} = FXM;
381 let Inst{20} = 0;
382 let Inst{21-30} = xo;
383 let Inst{31} = 0;
384}
385
386
Chris Lattnerd790d222005-04-19 04:40:07 +0000387class XFXForm_7<bits<6> opcode, bits<10> xo, dag OL, string asmstr>
388 : XFXForm_1<opcode, xo, OL, asmstr>;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000389
Nate Begeman143cf942004-08-30 02:28:06 +0000390class XFXForm_7_ext<bits<6> opcode, bits<10> xo, bits<10> spr,
Chris Lattnerd790d222005-04-19 04:40:07 +0000391 dag OL, string asmstr>
392 : XFXForm_7<opcode, xo, OL, asmstr> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000393 let SPR = spr;
394}
395
Nate Begeman765cb5f2004-08-13 02:19:26 +0000396// 1.7.10 XS-Form
Chris Lattnerf9172e12005-04-19 05:15:18 +0000397class XSForm_1<bits<6> opcode, bits<9> xo, dag OL, string asmstr>
Chris Lattner5b78da42005-04-19 05:05:22 +0000398 : I<opcode, OL, asmstr> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000399 bits<5> RS;
400 bits<5> A;
401 bits<6> SH;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000402
Chris Lattnerf9172e12005-04-19 05:15:18 +0000403 bit RC = 0; // set by isDOT
404
Nate Begeman765cb5f2004-08-13 02:19:26 +0000405 let Inst{6-10} = RS;
406 let Inst{11-15} = A;
407 let Inst{16-20} = SH{1-5};
408 let Inst{21-29} = xo;
409 let Inst{30} = SH{0};
Chris Lattnerf9172e12005-04-19 05:15:18 +0000410 let Inst{31} = RC;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000411}
412
Misha Brukman5295e1d2004-08-09 17:24:04 +0000413// 1.7.11 XO-Form
Chris Lattner3a1002d2005-09-02 21:18:00 +0000414class XOForm_1<bits<6> opcode, bits<9> xo, bit oe, dag OL, string asmstr,
415 list<dag> pattern>
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000416 : I<opcode, OL, asmstr> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000417 bits<5> RT;
418 bits<5> RA;
419 bits<5> RB;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000420
Chris Lattner3a1002d2005-09-02 21:18:00 +0000421 let Pattern = pattern;
422
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000423 bit RC = 0; // set by isDOT
424
Misha Brukman5295e1d2004-08-09 17:24:04 +0000425 let Inst{6-10} = RT;
426 let Inst{11-15} = RA;
427 let Inst{16-20} = RB;
428 let Inst{21} = oe;
429 let Inst{22-30} = xo;
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000430 let Inst{31} = RC;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000431}
432
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000433class XOForm_3<bits<6> opcode, bits<9> xo, bit oe,
Chris Lattnercf9b0e62005-09-08 17:01:54 +0000434 dag OL, string asmstr, list<dag> pattern>
435 : XOForm_1<opcode, xo, oe, OL, asmstr, pattern> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000436 let RB = 0;
437}
438
439// 1.7.12 A-Form
Chris Lattner027a2672005-09-29 23:34:24 +0000440class AForm_1<bits<6> opcode, bits<5> xo, dag OL, string asmstr,
441 list<dag> pattern>
Chris Lattner5b78da42005-04-19 05:05:22 +0000442 : I<opcode, OL, asmstr> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000443 bits<5> FRT;
444 bits<5> FRA;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000445 bits<5> FRC;
Chris Lattnerda76c162004-11-25 04:11:07 +0000446 bits<5> FRB;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000447
Chris Lattner027a2672005-09-29 23:34:24 +0000448 let Pattern = pattern;
449
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000450 bit RC = 0; // set by isDOT
451
Misha Brukman5295e1d2004-08-09 17:24:04 +0000452 let Inst{6-10} = FRT;
453 let Inst{11-15} = FRA;
454 let Inst{16-20} = FRB;
455 let Inst{21-25} = FRC;
456 let Inst{26-30} = xo;
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000457 let Inst{31} = RC;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000458}
459
Chris Lattner027a2672005-09-29 23:34:24 +0000460class AForm_2<bits<6> opcode, bits<5> xo, dag OL, string asmstr, list<dag> pat>
461 : AForm_1<opcode, xo, OL, asmstr, pat> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000462 let FRC = 0;
463}
464
Chris Lattner027a2672005-09-29 23:34:24 +0000465class AForm_3<bits<6> opcode, bits<5> xo, dag OL, string asmstr, list<dag> pat>
466 : AForm_1<opcode, xo, OL, asmstr, pat> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000467 let FRB = 0;
468}
469
Misha Brukman5295e1d2004-08-09 17:24:04 +0000470// 1.7.13 M-Form
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000471class MForm_1<bits<6> opcode, dag OL, string asmstr> : I<opcode, OL, asmstr> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000472 bits<5> RA;
Chris Lattner5f4b0e12004-11-23 19:23:32 +0000473 bits<5> RS;
Misha Brukman189f3dc2004-10-14 05:55:37 +0000474 bits<5> RB;
475 bits<5> MB;
476 bits<5> ME;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000477
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000478 bit RC = 0; // set by isDOT
479
Misha Brukman5295e1d2004-08-09 17:24:04 +0000480 let Inst{6-10} = RS;
481 let Inst{11-15} = RA;
482 let Inst{16-20} = RB;
483 let Inst{21-25} = MB;
484 let Inst{26-30} = ME;
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000485 let Inst{31} = RC;
Misha Brukman5295e1d2004-08-09 17:24:04 +0000486}
487
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000488class MForm_2<bits<6> opcode, dag OL, string asmstr>
489 : MForm_1<opcode, OL, asmstr> {
Misha Brukman5295e1d2004-08-09 17:24:04 +0000490}
491
Nate Begeman765cb5f2004-08-13 02:19:26 +0000492// 1.7.14 MD-Form
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000493class MDForm_1<bits<6> opcode, bits<3> xo, dag OL, string asmstr>
494 : I<opcode, OL, asmstr> {
Misha Brukman189f3dc2004-10-14 05:55:37 +0000495 bits<5> RS;
496 bits<5> RA;
497 bits<6> SH;
498 bits<6> MBE;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000499
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000500 bit RC = 0; // set by isDOT
501
Nate Begeman765cb5f2004-08-13 02:19:26 +0000502 let Inst{6-10} = RS;
503 let Inst{11-15} = RA;
504 let Inst{16-20} = SH{1-5};
505 let Inst{21-26} = MBE;
506 let Inst{27-29} = xo;
507 let Inst{30} = SH{0};
Chris Lattnerbaa9be52005-04-19 05:21:30 +0000508 let Inst{31} = RC;
Nate Begeman765cb5f2004-08-13 02:19:26 +0000509}
510
Misha Brukman6b21bde2004-08-02 21:56:35 +0000511//===----------------------------------------------------------------------===//
512
Chris Lattner5b78da42005-04-19 05:05:22 +0000513class Pseudo<dag OL, string asmstr> : I<0, OL, asmstr> {
Nate Begeman61738782004-09-02 08:13:00 +0000514 let PPC64 = 0;
515 let VMX = 0;
Misha Brukmancd4f51b2004-08-02 16:54:54 +0000516
Nate Begeman61738782004-09-02 08:13:00 +0000517 let Inst{31-0} = 0;
Misha Brukmancd4f51b2004-08-02 16:54:54 +0000518}