blob: df3dc93252ff1ac0ef9bfbd681a8ae1c1e64c9c1 [file] [log] [blame]
Evan Cheng37f25d92008-08-28 23:39:26 +00001//===- ARMInstrFormats.td - ARM Instruction Formats --*- tablegen -*---------=//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10//===----------------------------------------------------------------------===//
11//
12// ARM Instruction Format Definitions.
13//
14
15// Format specifies the encoding used by the instruction. This is part of the
16// ad-hoc solution used to emit machine instruction encodings by our machine
17// code emitter.
18class Format<bits<5> val> {
19 bits<5> Value = val;
20}
21
22def Pseudo : Format<1>;
23def MulFrm : Format<2>;
24def MulSMLAW : Format<3>;
25def MulSMULW : Format<4>;
26def MulSMLA : Format<5>;
27def MulSMUL : Format<6>;
28def Branch : Format<7>;
29def BranchMisc : Format<8>;
30
Evan Cheng05fc9662008-09-13 01:35:33 +000031def DPRdIm : Format<9>;
32def DPRdReg : Format<10>;
33def DPRdSoReg : Format<11>;
34def DPRdMisc : Format<12>;
35def DPRnIm : Format<13>;
36def DPRnReg : Format<14>;
37def DPRnSoReg : Format<15>;
38def DPRIm : Format<16>;
39def DPRReg : Format<17>;
40def DPRSoReg : Format<18>;
41def DPRImS : Format<19>;
42def DPRRegS : Format<20>;
43def DPRSoRegS : Format<21>;
Evan Cheng37f25d92008-08-28 23:39:26 +000044
Evan Cheng05fc9662008-09-13 01:35:33 +000045def LdFrm : Format<22>;
46def StFrm : Format<23>;
Evan Cheng37f25d92008-08-28 23:39:26 +000047
Evan Cheng05fc9662008-09-13 01:35:33 +000048def ArithMisc : Format<24>;
49def ThumbFrm : Format<25>;
50def VFPFrm : Format<26>;
Evan Cheng37f25d92008-08-28 23:39:26 +000051
52
Evan Cheng37f25d92008-08-28 23:39:26 +000053//===----------------------------------------------------------------------===//
54
55// ARM Instruction templates.
56//
57
58class InstARM<bits<4> opcod, AddrMode am, SizeFlagVal sz, IndexMode im,
59 Format f, string cstr>
60 : Instruction {
Evan Cheng612b79e2008-08-29 07:40:52 +000061 field bits<32> Inst;
62
Evan Cheng37f25d92008-08-28 23:39:26 +000063 let Namespace = "ARM";
64
65 bits<4> Opcode = opcod;
66 AddrMode AM = am;
67 bits<4> AddrModeBits = AM.Value;
68
69 SizeFlagVal SZ = sz;
70 bits<3> SizeFlag = SZ.Value;
71
72 IndexMode IM = im;
73 bits<2> IndexModeBits = IM.Value;
74
75 Format F = f;
76 bits<5> Form = F.Value;
77
78 let Constraints = cstr;
79}
80
81class PseudoInst<dag oops, dag iops, string asm, list<dag> pattern>
82 : InstARM<0, AddrModeNone, SizeSpecial, IndexModeNone, Pseudo, ""> {
83 let OutOperandList = oops;
84 let InOperandList = iops;
85 let AsmString = asm;
86 let Pattern = pattern;
87}
88
89// Almost all ARM instructions are predicable.
90class I<bits<4> opcod, dag oops, dag iops, AddrMode am, SizeFlagVal sz,
91 IndexMode im, Format f, string opc, string asm, string cstr,
92 list<dag> pattern>
93 : InstARM<opcod, am, sz, im, f, cstr> {
94 let OutOperandList = oops;
95 let InOperandList = !con(iops, (ops pred:$p));
96 let AsmString = !strconcat(opc, !strconcat("${p}", asm));
97 let Pattern = pattern;
98 list<Predicate> Predicates = [IsARM];
99}
100
101// Same as I except it can optionally modify CPSR. Note it's modeled as
102// an input operand since by default it's a zero register. It will
103// become an implicit def once it's "flipped".
104class sI<bits<4> opcod, dag oops, dag iops, AddrMode am, SizeFlagVal sz,
105 IndexMode im, Format f, string opc, string asm, string cstr,
106 list<dag> pattern>
107 : InstARM<opcod, am, sz, im, f, cstr> {
108 let OutOperandList = oops;
109 let InOperandList = !con(iops, (ops pred:$p, cc_out:$s));
110 let AsmString = !strconcat(opc, !strconcat("${p}${s}", asm));
111 let Pattern = pattern;
112 list<Predicate> Predicates = [IsARM];
113}
114
Evan Cheng4bbd5f82008-09-01 07:19:00 +0000115// Special cases
116class XI<bits<4> opcod, dag oops, dag iops, AddrMode am, SizeFlagVal sz,
117 IndexMode im, Format f, string asm, string cstr, list<dag> pattern>
118 : InstARM<opcod, am, sz, im, f, cstr> {
119 let OutOperandList = oops;
120 let InOperandList = iops;
121 let AsmString = asm;
122 let Pattern = pattern;
123 list<Predicate> Predicates = [IsARM];
124}
125
Evan Cheng37f25d92008-08-28 23:39:26 +0000126class AI<bits<4> opcod, dag oops, dag iops, Format f, string opc,
127 string asm, list<dag> pattern>
128 : I<opcod, oops, iops, AddrModeNone, Size4Bytes, IndexModeNone, f, opc,
129 asm,"",pattern>;
130class AsI<bits<4> opcod, dag oops, dag iops, Format f, string opc,
131 string asm, list<dag> pattern>
132 : sI<opcod, oops, iops, AddrModeNone, Size4Bytes, IndexModeNone, f, opc,
133 asm,"",pattern>;
Evan Cheng4bbd5f82008-09-01 07:19:00 +0000134class AXI<bits<4> opcod, dag oops, dag iops, Format f, string asm,
135 list<dag> pattern>
136 : XI<opcod, oops, iops, AddrModeNone, Size4Bytes, IndexModeNone, f, asm,
137 "", pattern>;
Evan Cheng3aac7882008-09-01 08:25:56 +0000138
139// Ctrl flow instructions
140class ABLpredI<bits<4> opcod, dag oops, dag iops, Format f, string opc,
141 string asm, list<dag> pattern>
142 : I<opcod, oops, iops, AddrModeNone, Size4Bytes, IndexModeNone, f, opc,
143 asm,"",pattern> {
144 let Inst{24} = 1; // L bit
Evan Cheng29c57c32008-09-17 07:16:21 +0000145 let Inst{25-27} = {1,0,1};
Evan Cheng3aac7882008-09-01 08:25:56 +0000146}
147class ABLI<bits<4> opcod, dag oops, dag iops, Format f, string asm,
148 list<dag> pattern>
149 : XI<opcod, oops, iops, AddrModeNone, Size4Bytes, IndexModeNone, f, asm,
150 "", pattern> {
151 let Inst{24} = 1; // L bit
Evan Cheng29c57c32008-09-17 07:16:21 +0000152 let Inst{25-27} = {1,0,1};
Evan Cheng3aac7882008-09-01 08:25:56 +0000153}
154class ABLXI<bits<4> opcod, dag oops, dag iops, Format f, string asm,
155 list<dag> pattern>
156 : XI<opcod, oops, iops, AddrModeNone, Size4Bytes, IndexModeNone, f, asm,
157 "", pattern> {
Evan Cheng29c57c32008-09-17 07:16:21 +0000158 let Inst{4-7} = {1,1,0,0};
159 let Inst{20-27} = {0,1,0,0,1,0,0,0};
Evan Cheng3aac7882008-09-01 08:25:56 +0000160}
161// FIXME: BX
Evan Cheng4bbd5f82008-09-01 07:19:00 +0000162class AXIx2<bits<4> opcod, dag oops, dag iops, Format f, string asm,
163 list<dag> pattern>
164 : XI<opcod, oops, iops, AddrModeNone, Size8Bytes, IndexModeNone, f, asm,
165 "", pattern>;
Evan Cheng3aac7882008-09-01 08:25:56 +0000166class ABI<bits<4> opcod, dag oops, dag iops, Format f, string asm,
167 list<dag> pattern>
168 : XI<opcod, oops, iops, AddrModeNone, Size4Bytes, IndexModeNone, f, asm,
169 "", pattern> {
170 let Inst{24} = 0; // L bit
Evan Cheng29c57c32008-09-17 07:16:21 +0000171 let Inst{25-27} = {1,0,1};
Evan Cheng3aac7882008-09-01 08:25:56 +0000172}
173class ABccI<bits<4> opcod, dag oops, dag iops, Format f, string opc,
174 string asm, list<dag> pattern>
175 : I<opcod, oops, iops, AddrModeNone, Size4Bytes, IndexModeNone, f, opc,
176 asm,"",pattern> {
177 let Inst{24} = 0; // L bit
Evan Cheng29c57c32008-09-17 07:16:21 +0000178 let Inst{25-27} = {1,0,1};
Evan Cheng3aac7882008-09-01 08:25:56 +0000179}
180
181// BR_JT instructions
182// == mov pc
183class JTI<bits<4> opcod, dag oops, dag iops, string asm, list<dag> pattern>
184 : XI<opcod, oops, iops, AddrModeNone, SizeSpecial, IndexModeNone, BranchMisc,
185 asm, "", pattern> {
186 let Inst{20} = 0; // S Bit
Evan Cheng29c57c32008-09-17 07:16:21 +0000187 let Inst{21-24} = {1,0,1,1};
188 let Inst{26-27} = {0,0};
Evan Cheng3aac7882008-09-01 08:25:56 +0000189}
Evan Cheng29c57c32008-09-17 07:16:21 +0000190// == add pc
Evan Cheng3aac7882008-09-01 08:25:56 +0000191class JTI1<bits<4> opcod, dag oops, dag iops, string asm, list<dag> pattern>
192 : XI<opcod, oops, iops, AddrMode1, SizeSpecial, IndexModeNone, BranchMisc,
193 asm, "", pattern> {
Evan Cheng29c57c32008-09-17 07:16:21 +0000194 let Inst{20} = 0; // S bit
195 let Inst{21-24} = {0,0,1,0};
196 let Inst{26-27} = {0,0};
197}
198// == ldr pc
199class JTI2<bits<4> opcod, dag oops, dag iops, string asm, list<dag> pattern>
200 : XI<opcod, oops, iops, AddrMode2, SizeSpecial, IndexModeNone, BranchMisc,
201 asm, "", pattern> {
Evan Cheng3aac7882008-09-01 08:25:56 +0000202 let Inst{20} = 1; // L bit
203 let Inst{21} = 0; // W bit
204 let Inst{22} = 0; // B bit
205 let Inst{24} = 1; // P bit
Evan Cheng29c57c32008-09-17 07:16:21 +0000206 let Inst{26-27} = {0,0};
Evan Cheng3aac7882008-09-01 08:25:56 +0000207}
208
Evan Cheng0d14fc82008-09-01 01:51:14 +0000209
210// addrmode1 instructions
Evan Cheng37f25d92008-08-28 23:39:26 +0000211class AI1<bits<4> opcod, dag oops, dag iops, Format f, string opc,
212 string asm, list<dag> pattern>
213 : I<opcod, oops, iops, AddrMode1, Size4Bytes, IndexModeNone, f, opc,
Evan Cheng612b79e2008-08-29 07:40:52 +0000214 asm, "", pattern> {
Evan Chengb7880ac2008-08-31 18:32:16 +0000215 let Inst{21-24} = opcod;
Evan Cheng29c57c32008-09-17 07:16:21 +0000216 let Inst{26-27} = {0,0};
Evan Cheng612b79e2008-08-29 07:40:52 +0000217}
Evan Cheng37f25d92008-08-28 23:39:26 +0000218class AsI1<bits<4> opcod, dag oops, dag iops, Format f, string opc,
219 string asm, list<dag> pattern>
220 : sI<opcod, oops, iops, AddrMode1, Size4Bytes, IndexModeNone, f, opc,
Evan Cheng612b79e2008-08-29 07:40:52 +0000221 asm, "", pattern> {
Evan Chengb7880ac2008-08-31 18:32:16 +0000222 let Inst{21-24} = opcod;
Evan Cheng29c57c32008-09-17 07:16:21 +0000223 let Inst{26-27} = {0,0};
Evan Cheng612b79e2008-08-29 07:40:52 +0000224}
Evan Cheng4bbd5f82008-09-01 07:19:00 +0000225class AXI1<bits<4> opcod, dag oops, dag iops, Format f, string asm,
226 list<dag> pattern>
227 : XI<opcod, oops, iops, AddrMode1, Size4Bytes, IndexModeNone, f, asm,
228 "", pattern> {
Evan Cheng4bbd5f82008-09-01 07:19:00 +0000229 let Inst{21-24} = opcod;
Evan Cheng29c57c32008-09-17 07:16:21 +0000230 let Inst{26-27} = {0,0};
Evan Cheng4bbd5f82008-09-01 07:19:00 +0000231}
Evan Cheng0d14fc82008-09-01 01:51:14 +0000232class AI1x2<bits<4> opcod, dag oops, dag iops, Format f, string opc,
233 string asm, list<dag> pattern>
234 : I<opcod, oops, iops, AddrMode1, Size8Bytes, IndexModeNone, f, opc,
235 asm, "", pattern>;
Evan Cheng17222df2008-08-31 19:02:21 +0000236
Evan Cheng0d14fc82008-09-01 01:51:14 +0000237
238// addrmode2 loads and stores
Evan Cheng37f25d92008-08-28 23:39:26 +0000239class AI2<bits<4> opcod, dag oops, dag iops, Format f, string opc,
240 string asm, list<dag> pattern>
241 : I<opcod, oops, iops, AddrMode2, Size4Bytes, IndexModeNone, f, opc,
Evan Cheng17222df2008-08-31 19:02:21 +0000242 asm, "", pattern> {
Evan Cheng29c57c32008-09-17 07:16:21 +0000243 let Inst{26-27} = {1,0};
Evan Cheng17222df2008-08-31 19:02:21 +0000244}
Evan Cheng4bbd5f82008-09-01 07:19:00 +0000245class AXI2<bits<4> opcod, dag oops, dag iops, Format f, string asm,
246 list<dag> pattern>
247 : XI<opcod, oops, iops, AddrMode2, Size4Bytes, IndexModeNone, f, asm,
248 "", pattern>;
Evan Cheng93912732008-09-01 01:27:33 +0000249
250// loads
Evan Cheng17222df2008-08-31 19:02:21 +0000251class AI2ldw<bits<4> opcod, dag oops, dag iops, Format f, string opc,
252 string asm, list<dag> pattern>
253 : AI2<opcod, oops, iops, f, opc, asm, pattern> {
Evan Cheng840917b2008-09-01 07:00:14 +0000254 let Inst{20} = 1; // L bit
Evan Cheng17222df2008-08-31 19:02:21 +0000255 let Inst{21} = 0; // W bit
256 let Inst{22} = 0; // B bit
257 let Inst{24} = 1; // P bit
258}
Evan Cheng5d2c1cf2008-09-01 07:34:13 +0000259class AXI2ldw<bits<4> opcod, dag oops, dag iops, Format f, string asm,
260 list<dag> pattern>
261 : XI<opcod, oops, iops, AddrMode2, Size4Bytes, IndexModeNone, f, asm,
262 "", pattern> {
263 let Inst{20} = 1; // L bit
264 let Inst{21} = 0; // W bit
265 let Inst{22} = 0; // B bit
266 let Inst{24} = 1; // P bit
267}
Evan Cheng17222df2008-08-31 19:02:21 +0000268class AI2ldb<bits<4> opcod, dag oops, dag iops, Format f, string opc,
269 string asm, list<dag> pattern>
270 : AI2<opcod, oops, iops, f, opc, asm, pattern> {
Evan Cheng840917b2008-09-01 07:00:14 +0000271 let Inst{20} = 1; // L bit
Evan Cheng17222df2008-08-31 19:02:21 +0000272 let Inst{21} = 0; // W bit
273 let Inst{22} = 1; // B bit
274 let Inst{24} = 1; // P bit
275}
Evan Cheng5d2c1cf2008-09-01 07:34:13 +0000276class AXI2ldb<bits<4> opcod, dag oops, dag iops, Format f, string asm,
277 list<dag> pattern>
278 : XI<opcod, oops, iops, AddrMode2, Size4Bytes, IndexModeNone, f, asm,
279 "", pattern> {
280 let Inst{20} = 1; // L bit
281 let Inst{21} = 0; // W bit
282 let Inst{22} = 1; // B bit
283 let Inst{24} = 1; // P bit
284}
Evan Cheng17222df2008-08-31 19:02:21 +0000285
Evan Cheng93912732008-09-01 01:27:33 +0000286// stores
287class AI2stw<bits<4> opcod, dag oops, dag iops, Format f, string opc,
288 string asm, list<dag> pattern>
289 : AI2<opcod, oops, iops, f, opc, asm, pattern> {
Evan Cheng840917b2008-09-01 07:00:14 +0000290 let Inst{20} = 0; // L bit
Evan Cheng93912732008-09-01 01:27:33 +0000291 let Inst{21} = 0; // W bit
292 let Inst{22} = 0; // B bit
293 let Inst{24} = 1; // P bit
294}
Evan Cheng5d2c1cf2008-09-01 07:34:13 +0000295class AXI2stw<bits<4> opcod, dag oops, dag iops, Format f, string asm,
296 list<dag> pattern>
297 : XI<opcod, oops, iops, AddrMode2, Size4Bytes, IndexModeNone, f, asm,
298 "", pattern> {
299 let Inst{20} = 0; // L bit
300 let Inst{21} = 0; // W bit
301 let Inst{22} = 0; // B bit
302 let Inst{24} = 1; // P bit
303}
Evan Cheng93912732008-09-01 01:27:33 +0000304class AI2stb<bits<4> opcod, dag oops, dag iops, Format f, string opc,
305 string asm, list<dag> pattern>
306 : AI2<opcod, oops, iops, f, opc, asm, pattern> {
Evan Cheng840917b2008-09-01 07:00:14 +0000307 let Inst{20} = 0; // L bit
Evan Cheng93912732008-09-01 01:27:33 +0000308 let Inst{21} = 0; // W bit
309 let Inst{22} = 1; // B bit
310 let Inst{24} = 1; // P bit
311}
Evan Cheng5d2c1cf2008-09-01 07:34:13 +0000312class AXI2stb<bits<4> opcod, dag oops, dag iops, Format f, string asm,
313 list<dag> pattern>
314 : XI<opcod, oops, iops, AddrMode2, Size4Bytes, IndexModeNone, f, asm,
315 "", pattern> {
316 let Inst{20} = 0; // L bit
317 let Inst{21} = 0; // W bit
318 let Inst{22} = 1; // B bit
319 let Inst{24} = 1; // P bit
320}
Evan Cheng93912732008-09-01 01:27:33 +0000321
Evan Cheng840917b2008-09-01 07:00:14 +0000322// Pre-indexed loads
Evan Cheng93912732008-09-01 01:27:33 +0000323class AI2ldwpr<bits<4> opcod, dag oops, dag iops, Format f, string opc,
Evan Cheng37f25d92008-08-28 23:39:26 +0000324 string asm, string cstr, list<dag> pattern>
325 : I<opcod, oops, iops, AddrMode2, Size4Bytes, IndexModePre, f, opc,
Evan Cheng93912732008-09-01 01:27:33 +0000326 asm, cstr, pattern> {
Evan Cheng840917b2008-09-01 07:00:14 +0000327 let Inst{20} = 1; // L bit
Evan Cheng93912732008-09-01 01:27:33 +0000328 let Inst{21} = 1; // W bit
329 let Inst{22} = 0; // B bit
330 let Inst{24} = 1; // P bit
331}
332class AI2ldbpr<bits<4> opcod, dag oops, dag iops, Format f, string opc,
333 string asm, string cstr, list<dag> pattern>
334 : I<opcod, oops, iops, AddrMode2, Size4Bytes, IndexModePre, f, opc,
335 asm, cstr, pattern> {
Evan Cheng840917b2008-09-01 07:00:14 +0000336 let Inst{20} = 1; // L bit
Evan Cheng93912732008-09-01 01:27:33 +0000337 let Inst{21} = 1; // W bit
338 let Inst{22} = 1; // B bit
339 let Inst{24} = 1; // P bit
340}
341
Evan Cheng840917b2008-09-01 07:00:14 +0000342// Pre-indexed stores
Evan Cheng93912732008-09-01 01:27:33 +0000343class AI2stwpr<bits<4> opcod, dag oops, dag iops, Format f, string opc,
344 string asm, string cstr, list<dag> pattern>
345 : I<opcod, oops, iops, AddrMode2, Size4Bytes, IndexModePre, f, opc,
346 asm, cstr, pattern> {
Evan Cheng840917b2008-09-01 07:00:14 +0000347 let Inst{20} = 0; // L bit
Evan Cheng93912732008-09-01 01:27:33 +0000348 let Inst{21} = 1; // W bit
349 let Inst{22} = 0; // B bit
350 let Inst{24} = 1; // P bit
351}
352class AI2stbpr<bits<4> opcod, dag oops, dag iops, Format f, string opc,
353 string asm, string cstr, list<dag> pattern>
354 : I<opcod, oops, iops, AddrMode2, Size4Bytes, IndexModePre, f, opc,
355 asm, cstr, pattern> {
Evan Cheng840917b2008-09-01 07:00:14 +0000356 let Inst{20} = 0; // L bit
Evan Cheng93912732008-09-01 01:27:33 +0000357 let Inst{21} = 1; // W bit
358 let Inst{22} = 1; // B bit
359 let Inst{24} = 1; // P bit
360}
361
Evan Cheng840917b2008-09-01 07:00:14 +0000362// Post-indexed loads
Evan Cheng93912732008-09-01 01:27:33 +0000363class AI2ldwpo<bits<4> opcod, dag oops, dag iops, Format f, string opc,
Evan Cheng37f25d92008-08-28 23:39:26 +0000364 string asm, string cstr, list<dag> pattern>
365 : I<opcod, oops, iops, AddrMode2, Size4Bytes, IndexModePost, f, opc,
Evan Cheng93912732008-09-01 01:27:33 +0000366 asm, cstr,pattern> {
Evan Cheng840917b2008-09-01 07:00:14 +0000367 let Inst{20} = 1; // L bit
Evan Cheng93912732008-09-01 01:27:33 +0000368 let Inst{21} = 0; // W bit
369 let Inst{22} = 0; // B bit
370 let Inst{24} = 0; // P bit
371}
372class AI2ldbpo<bits<4> opcod, dag oops, dag iops, Format f, string opc,
373 string asm, string cstr, list<dag> pattern>
374 : I<opcod, oops, iops, AddrMode2, Size4Bytes, IndexModePost, f, opc,
375 asm, cstr,pattern> {
Evan Cheng840917b2008-09-01 07:00:14 +0000376 let Inst{20} = 1; // L bit
Evan Cheng93912732008-09-01 01:27:33 +0000377 let Inst{21} = 0; // W bit
378 let Inst{22} = 1; // B bit
379 let Inst{24} = 0; // P bit
380}
381
Evan Cheng840917b2008-09-01 07:00:14 +0000382// Post-indexed stores
Evan Cheng93912732008-09-01 01:27:33 +0000383class AI2stwpo<bits<4> opcod, dag oops, dag iops, Format f, string opc,
384 string asm, string cstr, list<dag> pattern>
385 : I<opcod, oops, iops, AddrMode2, Size4Bytes, IndexModePost, f, opc,
386 asm, cstr,pattern> {
Evan Cheng840917b2008-09-01 07:00:14 +0000387 let Inst{20} = 0; // L bit
Evan Cheng93912732008-09-01 01:27:33 +0000388 let Inst{21} = 0; // W bit
389 let Inst{22} = 0; // B bit
390 let Inst{24} = 0; // P bit
391}
392class AI2stbpo<bits<4> opcod, dag oops, dag iops, Format f, string opc,
393 string asm, string cstr, list<dag> pattern>
394 : I<opcod, oops, iops, AddrMode2, Size4Bytes, IndexModePost, f, opc,
395 asm, cstr,pattern> {
Evan Cheng840917b2008-09-01 07:00:14 +0000396 let Inst{20} = 0; // L bit
Evan Cheng93912732008-09-01 01:27:33 +0000397 let Inst{21} = 0; // W bit
398 let Inst{22} = 1; // B bit
399 let Inst{24} = 0; // P bit
400}
401
Evan Cheng0d14fc82008-09-01 01:51:14 +0000402// addrmode3 instructions
403class AI3<bits<4> opcod, dag oops, dag iops, Format f, string opc,
404 string asm, list<dag> pattern>
405 : I<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModeNone, f, opc,
406 asm, "", pattern>;
Evan Cheng4bbd5f82008-09-01 07:19:00 +0000407class AXI3<bits<4> opcod, dag oops, dag iops, Format f, string asm,
408 list<dag> pattern>
409 : XI<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModeNone, f, asm,
410 "", pattern>;
Evan Cheng0d14fc82008-09-01 01:51:14 +0000411
Evan Cheng840917b2008-09-01 07:00:14 +0000412// loads
413class AI3ldh<bits<4> opcod, dag oops, dag iops, Format f, string opc,
414 string asm, list<dag> pattern>
415 : I<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModeNone, f, opc,
416 asm, "", pattern> {
417 let Inst{4} = 1;
418 let Inst{5} = 1; // H bit
419 let Inst{6} = 0; // S bit
420 let Inst{7} = 1;
421 let Inst{20} = 1; // L bit
422 let Inst{21} = 0; // W bit
423 let Inst{24} = 1; // P bit
424}
Evan Cheng5d2c1cf2008-09-01 07:34:13 +0000425class AXI3ldh<bits<4> opcod, dag oops, dag iops, Format f, string asm,
426 list<dag> pattern>
427 : XI<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModeNone, f, asm,
428 "", pattern> {
429 let Inst{4} = 1;
430 let Inst{5} = 1; // H bit
431 let Inst{6} = 0; // S bit
432 let Inst{7} = 1;
433 let Inst{20} = 1; // L bit
434 let Inst{21} = 0; // W bit
435 let Inst{24} = 1; // P bit
436}
Evan Cheng840917b2008-09-01 07:00:14 +0000437class AI3ldsh<bits<4> opcod, dag oops, dag iops, Format f, string opc,
438 string asm, list<dag> pattern>
439 : I<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModeNone, f, opc,
440 asm, "", pattern> {
441 let Inst{4} = 1;
442 let Inst{5} = 1; // H bit
443 let Inst{6} = 1; // S bit
444 let Inst{7} = 1;
445 let Inst{20} = 1; // L bit
446 let Inst{21} = 0; // W bit
447 let Inst{24} = 1; // P bit
448}
Evan Cheng5d2c1cf2008-09-01 07:34:13 +0000449class AXI3ldsh<bits<4> opcod, dag oops, dag iops, Format f, string asm,
450 list<dag> pattern>
451 : XI<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModeNone, f, asm,
452 "", pattern> {
453 let Inst{4} = 1;
454 let Inst{5} = 1; // H bit
455 let Inst{6} = 1; // S bit
456 let Inst{7} = 1;
457 let Inst{20} = 1; // L bit
458 let Inst{21} = 0; // W bit
459 let Inst{24} = 1; // P bit
460}
Evan Cheng840917b2008-09-01 07:00:14 +0000461class AI3ldsb<bits<4> opcod, dag oops, dag iops, Format f, string opc,
462 string asm, list<dag> pattern>
463 : I<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModeNone, f, opc,
464 asm, "", pattern> {
465 let Inst{4} = 1;
466 let Inst{5} = 0; // H bit
467 let Inst{6} = 1; // S bit
468 let Inst{7} = 1;
469 let Inst{20} = 1; // L bit
470 let Inst{21} = 0; // W bit
471 let Inst{24} = 1; // P bit
472}
Evan Cheng5d2c1cf2008-09-01 07:34:13 +0000473class AXI3ldsb<bits<4> opcod, dag oops, dag iops, Format f, string asm,
474 list<dag> pattern>
475 : XI<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModeNone, f, asm,
476 "", pattern> {
477 let Inst{4} = 1;
478 let Inst{5} = 0; // H bit
479 let Inst{6} = 1; // S bit
480 let Inst{7} = 1;
481 let Inst{20} = 1; // L bit
482 let Inst{21} = 0; // W bit
483 let Inst{24} = 1; // P bit
484}
Evan Cheng840917b2008-09-01 07:00:14 +0000485class AI3ldd<bits<4> opcod, dag oops, dag iops, Format f, string opc,
486 string asm, list<dag> pattern>
487 : I<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModeNone, f, opc,
488 asm, "", pattern> {
489 let Inst{4} = 1;
490 let Inst{5} = 0; // H bit
491 let Inst{6} = 1; // S bit
492 let Inst{7} = 1;
493 let Inst{20} = 0; // L bit
494 let Inst{21} = 0; // W bit
495 let Inst{24} = 1; // P bit
496}
497
498// stores
499class AI3sth<bits<4> opcod, dag oops, dag iops, Format f, string opc,
500 string asm, list<dag> pattern>
501 : I<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModeNone, f, opc,
502 asm, "", pattern> {
503 let Inst{4} = 1;
504 let Inst{5} = 1; // H bit
505 let Inst{6} = 0; // S bit
506 let Inst{7} = 1;
507 let Inst{20} = 0; // L bit
508 let Inst{21} = 0; // W bit
509 let Inst{24} = 1; // P bit
510}
Evan Cheng5d2c1cf2008-09-01 07:34:13 +0000511class AXI3sth<bits<4> opcod, dag oops, dag iops, Format f, string asm,
512 list<dag> pattern>
513 : XI<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModeNone, f, asm,
514 "", pattern> {
515 let Inst{4} = 1;
516 let Inst{5} = 1; // H bit
517 let Inst{6} = 0; // S bit
518 let Inst{7} = 1;
519 let Inst{20} = 0; // L bit
520 let Inst{21} = 0; // W bit
521 let Inst{24} = 1; // P bit
522}
Evan Cheng840917b2008-09-01 07:00:14 +0000523class AI3std<bits<4> opcod, dag oops, dag iops, Format f, string opc,
524 string asm, list<dag> pattern>
525 : I<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModeNone, f, opc,
526 asm, "", pattern> {
527 let Inst{4} = 1;
528 let Inst{5} = 1; // H bit
529 let Inst{6} = 1; // S bit
530 let Inst{7} = 1;
531 let Inst{20} = 0; // L bit
532 let Inst{21} = 0; // W bit
533 let Inst{24} = 1; // P bit
534}
535
536// Pre-indexed loads
537class AI3ldhpr<bits<4> opcod, dag oops, dag iops, Format f, string opc,
538 string asm, string cstr, list<dag> pattern>
539 : I<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModePre, f, opc,
540 asm, cstr, pattern> {
541 let Inst{4} = 1;
542 let Inst{5} = 1; // H bit
543 let Inst{6} = 0; // S bit
544 let Inst{7} = 1;
545 let Inst{20} = 1; // L bit
546 let Inst{21} = 1; // W bit
547 let Inst{24} = 1; // P bit
548}
549class AI3ldshpr<bits<4> opcod, dag oops, dag iops, Format f, string opc,
550 string asm, string cstr, list<dag> pattern>
551 : I<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModePre, f, opc,
552 asm, cstr, pattern> {
553 let Inst{4} = 1;
554 let Inst{5} = 1; // H bit
555 let Inst{6} = 1; // S bit
556 let Inst{7} = 1;
557 let Inst{20} = 1; // L bit
558 let Inst{21} = 1; // W bit
559 let Inst{24} = 1; // P bit
560}
561class AI3ldsbpr<bits<4> opcod, dag oops, dag iops, Format f, string opc,
562 string asm, string cstr, list<dag> pattern>
563 : I<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModePre, f, opc,
564 asm, cstr, pattern> {
565 let Inst{4} = 1;
566 let Inst{5} = 0; // H bit
567 let Inst{6} = 1; // S bit
568 let Inst{7} = 1;
569 let Inst{20} = 1; // L bit
570 let Inst{21} = 1; // W bit
571 let Inst{24} = 1; // P bit
572}
573
574// Pre-indexed stores
575class AI3sthpr<bits<4> opcod, dag oops, dag iops, Format f, string opc,
576 string asm, string cstr, list<dag> pattern>
577 : I<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModePre, f, opc,
578 asm, cstr, pattern> {
579 let Inst{4} = 1;
580 let Inst{5} = 1; // H bit
581 let Inst{6} = 0; // S bit
582 let Inst{7} = 1;
583 let Inst{20} = 0; // L bit
584 let Inst{21} = 1; // W bit
585 let Inst{24} = 1; // P bit
586}
587
588// Post-indexed loads
589class AI3ldhpo<bits<4> opcod, dag oops, dag iops, Format f, string opc,
590 string asm, string cstr, list<dag> pattern>
591 : I<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModePost, f, opc,
592 asm, cstr,pattern> {
593 let Inst{4} = 1;
594 let Inst{5} = 1; // H bit
595 let Inst{6} = 0; // S bit
596 let Inst{7} = 1;
597 let Inst{20} = 1; // L bit
598 let Inst{21} = 1; // W bit
599 let Inst{24} = 0; // P bit
600}
601class AI3ldshpo<bits<4> opcod, dag oops, dag iops, Format f, string opc,
602 string asm, string cstr, list<dag> pattern>
603 : I<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModePost, f, opc,
604 asm, cstr,pattern> {
605 let Inst{4} = 1;
606 let Inst{5} = 1; // H bit
607 let Inst{6} = 1; // S bit
608 let Inst{7} = 1;
609 let Inst{20} = 1; // L bit
610 let Inst{21} = 1; // W bit
611 let Inst{24} = 0; // P bit
612}
613class AI3ldsbpo<bits<4> opcod, dag oops, dag iops, Format f, string opc,
614 string asm, string cstr, list<dag> pattern>
615 : I<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModePost, f, opc,
616 asm, cstr,pattern> {
617 let Inst{4} = 1;
618 let Inst{5} = 0; // H bit
619 let Inst{6} = 1; // S bit
620 let Inst{7} = 1;
621 let Inst{20} = 1; // L bit
622 let Inst{21} = 1; // W bit
623 let Inst{24} = 0; // P bit
624}
625
626// Post-indexed stores
627class AI3sthpo<bits<4> opcod, dag oops, dag iops, Format f, string opc,
628 string asm, string cstr, list<dag> pattern>
629 : I<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModePost, f, opc,
630 asm, cstr,pattern> {
631 let Inst{4} = 1;
632 let Inst{5} = 1; // H bit
633 let Inst{6} = 0; // S bit
634 let Inst{7} = 1;
635 let Inst{20} = 0; // L bit
636 let Inst{21} = 1; // W bit
637 let Inst{24} = 0; // P bit
638}
639
640
Evan Cheng0d14fc82008-09-01 01:51:14 +0000641// addrmode4 instructions
642class AI4<bits<4> opcod, dag oops, dag iops, Format f, string opc,
643 string asm, list<dag> pattern>
644 : I<opcod, oops, iops, AddrMode4, Size4Bytes, IndexModeNone, f, opc,
Evan Cheng3c2ee492008-09-01 07:48:18 +0000645 asm, "", pattern> {
Evan Cheng29c57c32008-09-17 07:16:21 +0000646 let Inst{25-27} = {0,0,1};
Evan Cheng3c2ee492008-09-01 07:48:18 +0000647}
648class AXI4ld<bits<4> opcod, dag oops, dag iops, Format f, string asm,
Evan Cheng37f25d92008-08-28 23:39:26 +0000649 list<dag> pattern>
650 : XI<opcod, oops, iops, AddrMode4, Size4Bytes, IndexModeNone, f, asm,
Evan Cheng3c2ee492008-09-01 07:48:18 +0000651 "", pattern> {
652 let Inst{20} = 1; // L bit
653 let Inst{22} = 0; // S bit
Evan Cheng29c57c32008-09-17 07:16:21 +0000654 let Inst{25-27} = {0,0,1};
Evan Cheng3c2ee492008-09-01 07:48:18 +0000655}
656class AXI4ldpc<bits<4> opcod, dag oops, dag iops, Format f, string asm,
657 list<dag> pattern>
658 : XI<opcod, oops, iops, AddrMode4, Size4Bytes, IndexModeNone, f, asm,
659 "", pattern> {
660 let Inst{20} = 1; // L bit
661 let Inst{22} = 1; // S bit
Evan Cheng29c57c32008-09-17 07:16:21 +0000662 let Inst{25-27} = {0,0,1};
Evan Cheng3c2ee492008-09-01 07:48:18 +0000663}
664class AXI4st<bits<4> opcod, dag oops, dag iops, Format f, string asm,
665 list<dag> pattern>
666 : XI<opcod, oops, iops, AddrMode4, Size4Bytes, IndexModeNone, f, asm,
667 "", pattern> {
668 let Inst{20} = 0; // L bit
669 let Inst{22} = 0; // S bit
Evan Cheng29c57c32008-09-17 07:16:21 +0000670 let Inst{25-27} = {0,0,1};
Evan Cheng3c2ee492008-09-01 07:48:18 +0000671}
Evan Cheng37f25d92008-08-28 23:39:26 +0000672
Evan Cheng37f25d92008-08-28 23:39:26 +0000673
Evan Cheng37f25d92008-08-28 23:39:26 +0000674//===----------------------------------------------------------------------===//
675
676// ARMPat - Same as Pat<>, but requires that the compiler be in ARM mode.
677class ARMPat<dag pattern, dag result> : Pat<pattern, result> {
678 list<Predicate> Predicates = [IsARM];
679}
680class ARMV5TEPat<dag pattern, dag result> : Pat<pattern, result> {
681 list<Predicate> Predicates = [IsARM, HasV5TE];
682}
683class ARMV6Pat<dag pattern, dag result> : Pat<pattern, result> {
684 list<Predicate> Predicates = [IsARM, HasV6];
685}
Evan Cheng13096642008-08-29 06:41:12 +0000686
687//===----------------------------------------------------------------------===//
688//
689// Thumb Instruction Format Definitions.
690//
691
692
693// TI - Thumb instruction.
694
695class ThumbI<dag outs, dag ins, AddrMode am, SizeFlagVal sz,
696 string asm, string cstr, list<dag> pattern>
697 // FIXME: Set all opcodes to 0 for now.
698 : InstARM<0, am, sz, IndexModeNone, ThumbFrm, cstr> {
699 let OutOperandList = outs;
700 let InOperandList = ins;
701 let AsmString = asm;
702 let Pattern = pattern;
703 list<Predicate> Predicates = [IsThumb];
704}
705
706class TI<dag outs, dag ins, string asm, list<dag> pattern>
707 : ThumbI<outs, ins, AddrModeNone, Size2Bytes, asm, "", pattern>;
708class TI1<dag outs, dag ins, string asm, list<dag> pattern>
709 : ThumbI<outs, ins, AddrModeT1, Size2Bytes, asm, "", pattern>;
710class TI2<dag outs, dag ins, string asm, list<dag> pattern>
711 : ThumbI<outs, ins, AddrModeT2, Size2Bytes, asm, "", pattern>;
712class TI4<dag outs, dag ins, string asm, list<dag> pattern>
713 : ThumbI<outs, ins, AddrModeT4, Size2Bytes, asm, "", pattern>;
714class TIs<dag outs, dag ins, string asm, list<dag> pattern>
715 : ThumbI<outs, ins, AddrModeTs, Size2Bytes, asm, "", pattern>;
716
717// Two-address instructions
718class TIt<dag outs, dag ins, string asm, list<dag> pattern>
719 : ThumbI<outs, ins, AddrModeNone, Size2Bytes, asm, "$lhs = $dst", pattern>;
720
721// BL, BLX(1) are translated by assembler into two instructions
722class TIx2<dag outs, dag ins, string asm, list<dag> pattern>
723 : ThumbI<outs, ins, AddrModeNone, Size4Bytes, asm, "", pattern>;
724
725// BR_JT instructions
726class TJTI<dag outs, dag ins, string asm, list<dag> pattern>
727 : ThumbI<outs, ins, AddrModeNone, SizeSpecial, asm, "", pattern>;
728
729
730//===----------------------------------------------------------------------===//
731
732
733// ThumbPat - Same as Pat<>, but requires that the compiler be in Thumb mode.
734class ThumbPat<dag pattern, dag result> : Pat<pattern, result> {
735 list<Predicate> Predicates = [IsThumb];
736}
737
738class ThumbV5Pat<dag pattern, dag result> : Pat<pattern, result> {
739 list<Predicate> Predicates = [IsThumb, HasV5T];
740}