Add Mac OS X compatible JIT callback routine.
[oota-llvm.git] / lib / Target / ARM / ARMInstrFormats.td
1 //===- 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.
18 class Format<bits<5> val> {
19   bits<5> Value = val;
20 }
21
22 def Pseudo      : Format<1>;
23 def MulFrm      : Format<2>;
24 def MulSMLAW    : Format<3>;
25 def MulSMULW    : Format<4>;
26 def MulSMLA     : Format<5>;
27 def MulSMUL     : Format<6>;
28 def Branch      : Format<7>;
29 def BranchMisc  : Format<8>;
30
31 def DPRdIm      : Format<9>;
32 def DPRdReg     : Format<10>;
33 def DPRdSoReg   : Format<11>;
34 def DPRdMisc    : Format<12>;
35 def DPRnIm      : Format<13>;
36 def DPRnReg     : Format<14>;
37 def DPRnSoReg   : Format<15>;
38 def DPRIm       : Format<16>;
39 def DPRReg      : Format<17>;
40 def DPRSoReg    : Format<18>;
41 def DPRImS      : Format<19>;
42 def DPRRegS     : Format<20>;
43 def DPRSoRegS   : Format<21>;
44
45 def LdFrm       : Format<22>;
46 def StFrm       : Format<23>;
47
48 def ArithMisc   : Format<24>;
49 def ThumbFrm    : Format<25>;
50 def VFPFrm      : Format<26>;
51
52
53 //===----------------------------------------------------------------------===//
54
55 // ARM Instruction templates.
56 //
57
58 class InstARM<bits<4> opcod, AddrMode am, SizeFlagVal sz, IndexMode im,
59               Format f, string cstr>
60   : Instruction {
61   field bits<32> Inst;
62
63   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
81 class 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.
90 class 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".
104 class 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
115 // Special cases
116 class 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
126 class 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>;
130 class 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>;
134 class 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>;
138
139 // Ctrl flow instructions
140 class 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
145   let Inst{25-27} = 5;
146 }
147 class 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
152   let Inst{25-27} = 5;
153 }
154 class 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> {
158   let Inst{4-7}   = 3;
159   let Inst{20-27} = 0x12;
160 }
161 // FIXME: BX
162 class 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>;
166 class 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
171   let Inst{25-27} = 5;
172 }
173 class 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
178   let Inst{25-27} = 5;
179 }
180
181 // BR_JT instructions
182 // == mov pc
183 class 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
187   let Inst{21-24} = 0xd;
188   let Inst{26-27} = 0;
189 }
190 // == ldr pc
191 class 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> {
194   let Inst{20}    = 1; // L bit
195   let Inst{21}    = 0; // W bit
196   let Inst{22}    = 0; // B bit
197   let Inst{24}    = 1; // P bit
198 }
199 // == add pc
200 class JTI2<bits<4> opcod, dag oops, dag iops, string asm, list<dag> pattern>
201   : XI<opcod, oops, iops, AddrMode2, SizeSpecial, IndexModeNone, BranchMisc,
202        asm, "", pattern> {
203   let Inst{20}    = 0; // S bit
204   let Inst{21-24} = 4;
205   let Inst{26-27} = 0;
206 }
207
208
209 // addrmode1 instructions
210 class AI1<bits<4> opcod, dag oops, dag iops, Format f, string opc,
211           string asm, list<dag> pattern>
212   : I<opcod, oops, iops, AddrMode1, Size4Bytes, IndexModeNone, f, opc,
213       asm, "", pattern> {
214   let Inst{21-24} = opcod;
215   let Inst{26-27} = 0;
216 }
217 class AsI1<bits<4> opcod, dag oops, dag iops, Format f, string opc,
218            string asm, list<dag> pattern>
219   : sI<opcod, oops, iops, AddrMode1, Size4Bytes, IndexModeNone, f, opc,
220        asm, "", pattern> {
221   let Inst{20}    = 1;
222   let Inst{21-24} = opcod;
223   let Inst{26-27} = 0;
224 }
225 class 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> {
229   let Inst{20}    = 1;
230   let Inst{21-24} = opcod;
231   let Inst{26-27} = 0;
232 }
233 class AI1x2<bits<4> opcod, dag oops, dag iops, Format f, string opc,
234             string asm, list<dag> pattern>
235   : I<opcod, oops, iops, AddrMode1, Size8Bytes, IndexModeNone, f, opc,
236       asm, "", pattern>;
237
238
239 // addrmode2 loads and stores
240 class AI2<bits<4> opcod, dag oops, dag iops, Format f, string opc,
241           string asm, list<dag> pattern>
242   : I<opcod, oops, iops, AddrMode2, Size4Bytes, IndexModeNone, f, opc,
243       asm, "", pattern> {
244   let Inst{26-27} = 1;
245 }
246 class AXI2<bits<4> opcod, dag oops, dag iops, Format f, string asm,
247            list<dag> pattern>
248   : XI<opcod, oops, iops, AddrMode2, Size4Bytes, IndexModeNone, f, asm,
249        "", pattern>;
250
251 // loads
252 class AI2ldw<bits<4> opcod, dag oops, dag iops, Format f, string opc,
253           string asm, list<dag> pattern>
254   : AI2<opcod, oops, iops, f, opc, asm, pattern> {
255   let Inst{20}    = 1; // L bit
256   let Inst{21}    = 0; // W bit
257   let Inst{22}    = 0; // B bit
258   let Inst{24}    = 1; // P bit
259 }
260 class AXI2ldw<bits<4> opcod, dag oops, dag iops, Format f, string asm,
261            list<dag> pattern>
262   : XI<opcod, oops, iops, AddrMode2, Size4Bytes, IndexModeNone, f, asm,
263        "", pattern> {
264   let Inst{20}    = 1; // L bit
265   let Inst{21}    = 0; // W bit
266   let Inst{22}    = 0; // B bit
267   let Inst{24}    = 1; // P bit
268 }
269 class AI2ldb<bits<4> opcod, dag oops, dag iops, Format f, string opc,
270           string asm, list<dag> pattern>
271   : AI2<opcod, oops, iops, f, opc, asm, pattern> {
272   let Inst{20}    = 1; // L bit
273   let Inst{21}    = 0; // W bit
274   let Inst{22}    = 1; // B bit
275   let Inst{24}    = 1; // P bit
276 }
277 class AXI2ldb<bits<4> opcod, dag oops, dag iops, Format f, string asm,
278            list<dag> pattern>
279   : XI<opcod, oops, iops, AddrMode2, Size4Bytes, IndexModeNone, f, asm,
280        "", pattern> {
281   let Inst{20}    = 1; // L bit
282   let Inst{21}    = 0; // W bit
283   let Inst{22}    = 1; // B bit
284   let Inst{24}    = 1; // P bit
285 }
286
287 // stores
288 class AI2stw<bits<4> opcod, dag oops, dag iops, Format f, string opc,
289           string asm, list<dag> pattern>
290   : AI2<opcod, oops, iops, f, opc, asm, pattern> {
291   let Inst{20}    = 0; // L bit
292   let Inst{21}    = 0; // W bit
293   let Inst{22}    = 0; // B bit
294   let Inst{24}    = 1; // P bit
295 }
296 class AXI2stw<bits<4> opcod, dag oops, dag iops, Format f, string asm,
297            list<dag> pattern>
298   : XI<opcod, oops, iops, AddrMode2, Size4Bytes, IndexModeNone, f, asm,
299        "", pattern> {
300   let Inst{20}    = 0; // L bit
301   let Inst{21}    = 0; // W bit
302   let Inst{22}    = 0; // B bit
303   let Inst{24}    = 1; // P bit
304 }
305 class AI2stb<bits<4> opcod, dag oops, dag iops, Format f, string opc,
306           string asm, list<dag> pattern>
307   : AI2<opcod, oops, iops, f, opc, asm, pattern> {
308   let Inst{20}    = 0; // L bit
309   let Inst{21}    = 0; // W bit
310   let Inst{22}    = 1; // B bit
311   let Inst{24}    = 1; // P bit
312 }
313 class AXI2stb<bits<4> opcod, dag oops, dag iops, Format f, string asm,
314            list<dag> pattern>
315   : XI<opcod, oops, iops, AddrMode2, Size4Bytes, IndexModeNone, f, asm,
316        "", pattern> {
317   let Inst{20}    = 0; // L bit
318   let Inst{21}    = 0; // W bit
319   let Inst{22}    = 1; // B bit
320   let Inst{24}    = 1; // P bit
321 }
322
323 // Pre-indexed loads
324 class AI2ldwpr<bits<4> opcod, dag oops, dag iops, Format f, string opc,
325             string asm, string cstr, list<dag> pattern>
326   : I<opcod, oops, iops, AddrMode2, Size4Bytes, IndexModePre, f, opc,
327       asm, cstr, pattern> {
328   let Inst{20}    = 1; // L bit
329   let Inst{21}    = 1; // W bit
330   let Inst{22}    = 0; // B bit
331   let Inst{24}    = 1; // P bit
332 }
333 class AI2ldbpr<bits<4> opcod, dag oops, dag iops, Format f, string opc,
334             string asm, string cstr, list<dag> pattern>
335   : I<opcod, oops, iops, AddrMode2, Size4Bytes, IndexModePre, f, opc,
336       asm, cstr, pattern> {
337   let Inst{20}    = 1; // L bit
338   let Inst{21}    = 1; // W bit
339   let Inst{22}    = 1; // B bit
340   let Inst{24}    = 1; // P bit
341 }
342
343 // Pre-indexed stores
344 class AI2stwpr<bits<4> opcod, dag oops, dag iops, Format f, string opc,
345             string asm, string cstr, list<dag> pattern>
346   : I<opcod, oops, iops, AddrMode2, Size4Bytes, IndexModePre, f, opc,
347       asm, cstr, pattern> {
348   let Inst{20}    = 0; // L bit
349   let Inst{21}    = 1; // W bit
350   let Inst{22}    = 0; // B bit
351   let Inst{24}    = 1; // P bit
352 }
353 class AI2stbpr<bits<4> opcod, dag oops, dag iops, Format f, string opc,
354             string asm, string cstr, list<dag> pattern>
355   : I<opcod, oops, iops, AddrMode2, Size4Bytes, IndexModePre, f, opc,
356       asm, cstr, pattern> {
357   let Inst{20}    = 0; // L bit
358   let Inst{21}    = 1; // W bit
359   let Inst{22}    = 1; // B bit
360   let Inst{24}    = 1; // P bit
361 }
362
363 // Post-indexed loads
364 class AI2ldwpo<bits<4> opcod, dag oops, dag iops, Format f, string opc,
365             string asm, string cstr, list<dag> pattern>
366   : I<opcod, oops, iops, AddrMode2, Size4Bytes, IndexModePost, f, opc,
367       asm, cstr,pattern> {
368   let Inst{20}    = 1; // L bit
369   let Inst{21}    = 0; // W bit
370   let Inst{22}    = 0; // B bit
371   let Inst{24}    = 0; // P bit
372 }
373 class AI2ldbpo<bits<4> opcod, dag oops, dag iops, Format f, string opc,
374             string asm, string cstr, list<dag> pattern>
375   : I<opcod, oops, iops, AddrMode2, Size4Bytes, IndexModePost, f, opc,
376       asm, cstr,pattern> {
377   let Inst{20}    = 1; // L bit
378   let Inst{21}    = 0; // W bit
379   let Inst{22}    = 1; // B bit
380   let Inst{24}    = 0; // P bit
381 }
382
383 // Post-indexed stores
384 class AI2stwpo<bits<4> opcod, dag oops, dag iops, Format f, string opc,
385             string asm, string cstr, list<dag> pattern>
386   : I<opcod, oops, iops, AddrMode2, Size4Bytes, IndexModePost, f, opc,
387       asm, cstr,pattern> {
388   let Inst{20}    = 0; // L bit
389   let Inst{21}    = 0; // W bit
390   let Inst{22}    = 0; // B bit
391   let Inst{24}    = 0; // P bit
392 }
393 class AI2stbpo<bits<4> opcod, dag oops, dag iops, Format f, string opc,
394             string asm, string cstr, list<dag> pattern>
395   : I<opcod, oops, iops, AddrMode2, Size4Bytes, IndexModePost, f, opc,
396       asm, cstr,pattern> {
397   let Inst{20}    = 0; // L bit
398   let Inst{21}    = 0; // W bit
399   let Inst{22}    = 1; // B bit
400   let Inst{24}    = 0; // P bit
401 }
402
403 // addrmode3 instructions
404 class AI3<bits<4> opcod, dag oops, dag iops, Format f, string opc,
405           string asm, list<dag> pattern>
406   : I<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModeNone, f, opc,
407       asm, "", pattern>;
408 class AXI3<bits<4> opcod, dag oops, dag iops, Format f, string asm,
409            list<dag> pattern>
410   : XI<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModeNone, f, asm,
411        "", pattern>;
412
413 // loads
414 class AI3ldh<bits<4> opcod, dag oops, dag iops, Format f, string opc,
415           string asm, list<dag> pattern>
416   : I<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModeNone, f, opc,
417       asm, "", pattern> {
418   let Inst{4}     = 1;
419   let Inst{5}     = 1; // H bit
420   let Inst{6}     = 0; // S bit
421   let Inst{7}     = 1;
422   let Inst{20}    = 1; // L bit
423   let Inst{21}    = 0; // W bit
424   let Inst{24}    = 1; // P bit
425 }
426 class AXI3ldh<bits<4> opcod, dag oops, dag iops, Format f, string asm,
427            list<dag> pattern>
428   : XI<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModeNone, f, asm,
429        "", pattern> {
430   let Inst{4}     = 1;
431   let Inst{5}     = 1; // H bit
432   let Inst{6}     = 0; // S bit
433   let Inst{7}     = 1;
434   let Inst{20}    = 1; // L bit
435   let Inst{21}    = 0; // W bit
436   let Inst{24}    = 1; // P bit
437 }
438 class AI3ldsh<bits<4> opcod, dag oops, dag iops, Format f, string opc,
439           string asm, list<dag> pattern>
440   : I<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModeNone, f, opc,
441       asm, "", pattern> {
442   let Inst{4}     = 1;
443   let Inst{5}     = 1; // H bit
444   let Inst{6}     = 1; // S bit
445   let Inst{7}     = 1;
446   let Inst{20}    = 1; // L bit
447   let Inst{21}    = 0; // W bit
448   let Inst{24}    = 1; // P bit
449 }
450 class AXI3ldsh<bits<4> opcod, dag oops, dag iops, Format f, string asm,
451            list<dag> pattern>
452   : XI<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModeNone, f, asm,
453        "", pattern> {
454   let Inst{4}     = 1;
455   let Inst{5}     = 1; // H bit
456   let Inst{6}     = 1; // S bit
457   let Inst{7}     = 1;
458   let Inst{20}    = 1; // L bit
459   let Inst{21}    = 0; // W bit
460   let Inst{24}    = 1; // P bit
461 }
462 class AI3ldsb<bits<4> opcod, dag oops, dag iops, Format f, string opc,
463           string asm, list<dag> pattern>
464   : I<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModeNone, f, opc,
465       asm, "", pattern> {
466   let Inst{4}     = 1;
467   let Inst{5}     = 0; // H bit
468   let Inst{6}     = 1; // S bit
469   let Inst{7}     = 1;
470   let Inst{20}    = 1; // L bit
471   let Inst{21}    = 0; // W bit
472   let Inst{24}    = 1; // P bit
473 }
474 class AXI3ldsb<bits<4> opcod, dag oops, dag iops, Format f, string asm,
475            list<dag> pattern>
476   : XI<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModeNone, f, asm,
477        "", pattern> {
478   let Inst{4}     = 1;
479   let Inst{5}     = 0; // H bit
480   let Inst{6}     = 1; // S bit
481   let Inst{7}     = 1;
482   let Inst{20}    = 1; // L bit
483   let Inst{21}    = 0; // W bit
484   let Inst{24}    = 1; // P bit
485 }
486 class AI3ldd<bits<4> opcod, dag oops, dag iops, Format f, string opc,
487           string asm, list<dag> pattern>
488   : I<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModeNone, f, opc,
489       asm, "", pattern> {
490   let Inst{4}     = 1;
491   let Inst{5}     = 0; // H bit
492   let Inst{6}     = 1; // S bit
493   let Inst{7}     = 1;
494   let Inst{20}    = 0; // L bit
495   let Inst{21}    = 0; // W bit
496   let Inst{24}    = 1; // P bit
497 }
498
499 // stores
500 class AI3sth<bits<4> opcod, dag oops, dag iops, Format f, string opc,
501           string asm, list<dag> pattern>
502   : I<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModeNone, f, opc,
503       asm, "", pattern> {
504   let Inst{4}     = 1;
505   let Inst{5}     = 1; // H bit
506   let Inst{6}     = 0; // S bit
507   let Inst{7}     = 1;
508   let Inst{20}    = 0; // L bit
509   let Inst{21}    = 0; // W bit
510   let Inst{24}    = 1; // P bit
511 }
512 class AXI3sth<bits<4> opcod, dag oops, dag iops, Format f, string asm,
513            list<dag> pattern>
514   : XI<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModeNone, f, asm,
515        "", pattern> {
516   let Inst{4}     = 1;
517   let Inst{5}     = 1; // H bit
518   let Inst{6}     = 0; // S bit
519   let Inst{7}     = 1;
520   let Inst{20}    = 0; // L bit
521   let Inst{21}    = 0; // W bit
522   let Inst{24}    = 1; // P bit
523 }
524 class AI3std<bits<4> opcod, dag oops, dag iops, Format f, string opc,
525           string asm, list<dag> pattern>
526   : I<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModeNone, f, opc,
527       asm, "", pattern> {
528   let Inst{4}     = 1;
529   let Inst{5}     = 1; // H bit
530   let Inst{6}     = 1; // S bit
531   let Inst{7}     = 1;
532   let Inst{20}    = 0; // L bit
533   let Inst{21}    = 0; // W bit
534   let Inst{24}    = 1; // P bit
535 }
536
537 // Pre-indexed loads
538 class AI3ldhpr<bits<4> opcod, dag oops, dag iops, Format f, string opc,
539             string asm, string cstr, list<dag> pattern>
540   : I<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModePre, f, opc,
541       asm, cstr, pattern> {
542   let Inst{4}     = 1;
543   let Inst{5}     = 1; // H bit
544   let Inst{6}     = 0; // S bit
545   let Inst{7}     = 1;
546   let Inst{20}    = 1; // L bit
547   let Inst{21}    = 1; // W bit
548   let Inst{24}    = 1; // P bit
549 }
550 class AI3ldshpr<bits<4> opcod, dag oops, dag iops, Format f, string opc,
551             string asm, string cstr, list<dag> pattern>
552   : I<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModePre, f, opc,
553       asm, cstr, pattern> {
554   let Inst{4}     = 1;
555   let Inst{5}     = 1; // H bit
556   let Inst{6}     = 1; // S bit
557   let Inst{7}     = 1;
558   let Inst{20}    = 1; // L bit
559   let Inst{21}    = 1; // W bit
560   let Inst{24}    = 1; // P bit
561 }
562 class AI3ldsbpr<bits<4> opcod, dag oops, dag iops, Format f, string opc,
563             string asm, string cstr, list<dag> pattern>
564   : I<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModePre, f, opc,
565       asm, cstr, pattern> {
566   let Inst{4}     = 1;
567   let Inst{5}     = 0; // H bit
568   let Inst{6}     = 1; // S bit
569   let Inst{7}     = 1;
570   let Inst{20}    = 1; // L bit
571   let Inst{21}    = 1; // W bit
572   let Inst{24}    = 1; // P bit
573 }
574
575 // Pre-indexed stores
576 class AI3sthpr<bits<4> opcod, dag oops, dag iops, Format f, string opc,
577             string asm, string cstr, list<dag> pattern>
578   : I<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModePre, f, opc,
579       asm, cstr, pattern> {
580   let Inst{4}     = 1;
581   let Inst{5}     = 1; // H bit
582   let Inst{6}     = 0; // S bit
583   let Inst{7}     = 1;
584   let Inst{20}    = 0; // L bit
585   let Inst{21}    = 1; // W bit
586   let Inst{24}    = 1; // P bit
587 }
588
589 // Post-indexed loads
590 class AI3ldhpo<bits<4> opcod, dag oops, dag iops, Format f, string opc,
591             string asm, string cstr, list<dag> pattern>
592   : I<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModePost, f, opc,
593       asm, cstr,pattern> {
594   let Inst{4}     = 1;
595   let Inst{5}     = 1; // H bit
596   let Inst{6}     = 0; // S bit
597   let Inst{7}     = 1;
598   let Inst{20}    = 1; // L bit
599   let Inst{21}    = 1; // W bit
600   let Inst{24}    = 0; // P bit
601 }
602 class AI3ldshpo<bits<4> opcod, dag oops, dag iops, Format f, string opc,
603             string asm, string cstr, list<dag> pattern>
604   : I<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModePost, f, opc,
605       asm, cstr,pattern> {
606   let Inst{4}     = 1;
607   let Inst{5}     = 1; // H bit
608   let Inst{6}     = 1; // S bit
609   let Inst{7}     = 1;
610   let Inst{20}    = 1; // L bit
611   let Inst{21}    = 1; // W bit
612   let Inst{24}    = 0; // P bit
613 }
614 class AI3ldsbpo<bits<4> opcod, dag oops, dag iops, Format f, string opc,
615             string asm, string cstr, list<dag> pattern>
616   : I<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModePost, f, opc,
617       asm, cstr,pattern> {
618   let Inst{4}     = 1;
619   let Inst{5}     = 0; // H bit
620   let Inst{6}     = 1; // S bit
621   let Inst{7}     = 1;
622   let Inst{20}    = 1; // L bit
623   let Inst{21}    = 1; // W bit
624   let Inst{24}    = 0; // P bit
625 }
626
627 // Post-indexed stores
628 class AI3sthpo<bits<4> opcod, dag oops, dag iops, Format f, string opc,
629             string asm, string cstr, list<dag> pattern>
630   : I<opcod, oops, iops, AddrMode3, Size4Bytes, IndexModePost, f, opc,
631       asm, cstr,pattern> {
632   let Inst{4}     = 1;
633   let Inst{5}     = 1; // H bit
634   let Inst{6}     = 0; // S bit
635   let Inst{7}     = 1;
636   let Inst{20}    = 0; // L bit
637   let Inst{21}    = 1; // W bit
638   let Inst{24}    = 0; // P bit
639 }
640
641
642 // addrmode4 instructions
643 class AI4<bits<4> opcod, dag oops, dag iops, Format f, string opc,
644           string asm, list<dag> pattern>
645   : I<opcod, oops, iops, AddrMode4, Size4Bytes, IndexModeNone, f, opc,
646       asm, "", pattern> {
647   let Inst{25-27} = 0x4;
648 }
649 class AXI4ld<bits<4> opcod, dag oops, dag iops, Format f, string asm,
650            list<dag> pattern>
651   : XI<opcod, oops, iops, AddrMode4, Size4Bytes, IndexModeNone, f, asm,
652        "", pattern> {
653   let Inst{20}    = 1; // L bit
654   let Inst{22}    = 0; // S bit
655   let Inst{25-27} = 0x4;
656 }
657 class AXI4ldpc<bits<4> opcod, dag oops, dag iops, Format f, string asm,
658            list<dag> pattern>
659   : XI<opcod, oops, iops, AddrMode4, Size4Bytes, IndexModeNone, f, asm,
660        "", pattern> {
661   let Inst{20}    = 1; // L bit
662   let Inst{22}    = 1; // S bit
663   let Inst{25-27} = 0x4;
664 }
665 class AXI4st<bits<4> opcod, dag oops, dag iops, Format f, string asm,
666            list<dag> pattern>
667   : XI<opcod, oops, iops, AddrMode4, Size4Bytes, IndexModeNone, f, asm,
668        "", pattern> {
669   let Inst{20}    = 0; // L bit
670   let Inst{22}    = 0; // S bit
671   let Inst{25-27} = 0x4;
672 }
673
674
675 //===----------------------------------------------------------------------===//
676
677 // ARMPat - Same as Pat<>, but requires that the compiler be in ARM mode.
678 class ARMPat<dag pattern, dag result> : Pat<pattern, result> {
679   list<Predicate> Predicates = [IsARM];
680 }
681 class ARMV5TEPat<dag pattern, dag result> : Pat<pattern, result> {
682   list<Predicate> Predicates = [IsARM, HasV5TE];
683 }
684 class ARMV6Pat<dag pattern, dag result> : Pat<pattern, result> {
685   list<Predicate> Predicates = [IsARM, HasV6];
686 }
687
688 //===----------------------------------------------------------------------===//
689 //
690 // Thumb Instruction Format Definitions.
691 //
692
693
694 // TI - Thumb instruction.
695
696 class ThumbI<dag outs, dag ins, AddrMode am, SizeFlagVal sz,
697              string asm, string cstr, list<dag> pattern>
698   // FIXME: Set all opcodes to 0 for now.
699   : InstARM<0, am, sz, IndexModeNone, ThumbFrm, cstr> {
700   let OutOperandList = outs;
701   let InOperandList = ins;
702   let AsmString   = asm;
703   let Pattern = pattern;
704   list<Predicate> Predicates = [IsThumb];
705 }
706
707 class TI<dag outs, dag ins, string asm, list<dag> pattern>
708   : ThumbI<outs, ins, AddrModeNone, Size2Bytes, asm, "", pattern>;
709 class TI1<dag outs, dag ins, string asm, list<dag> pattern>
710   : ThumbI<outs, ins, AddrModeT1, Size2Bytes, asm, "", pattern>;
711 class TI2<dag outs, dag ins, string asm, list<dag> pattern>
712   : ThumbI<outs, ins, AddrModeT2, Size2Bytes, asm, "", pattern>;
713 class TI4<dag outs, dag ins, string asm, list<dag> pattern>
714   : ThumbI<outs, ins, AddrModeT4, Size2Bytes, asm, "", pattern>;
715 class TIs<dag outs, dag ins, string asm, list<dag> pattern>
716   : ThumbI<outs, ins, AddrModeTs, Size2Bytes, asm, "", pattern>;
717
718 // Two-address instructions
719 class TIt<dag outs, dag ins, string asm, list<dag> pattern>
720   : ThumbI<outs, ins, AddrModeNone, Size2Bytes, asm, "$lhs = $dst", pattern>;
721
722 // BL, BLX(1) are translated by assembler into two instructions
723 class TIx2<dag outs, dag ins, string asm, list<dag> pattern>
724   : ThumbI<outs, ins, AddrModeNone, Size4Bytes, asm, "", pattern>;
725
726 // BR_JT instructions
727 class TJTI<dag outs, dag ins, string asm, list<dag> pattern>
728   : ThumbI<outs, ins, AddrModeNone, SizeSpecial, asm, "", pattern>;
729
730
731 //===----------------------------------------------------------------------===//
732
733
734 // ThumbPat - Same as Pat<>, but requires that the compiler be in Thumb mode.
735 class ThumbPat<dag pattern, dag result> : Pat<pattern, result> {
736   list<Predicate> Predicates = [IsThumb];
737 }
738
739 class ThumbV5Pat<dag pattern, dag result> : Pat<pattern, result> {
740   list<Predicate> Predicates = [IsThumb, HasV5T];
741 }