Add conditional and unconditional thumb-2 branch. Add thumb-2 jump table.
[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<0>;
23 def MulFrm        : Format<1>;
24 def BrFrm         : Format<2>;
25 def BrMiscFrm     : Format<3>;
26
27 def DPFrm         : Format<4>;
28 def DPSoRegFrm    : Format<5>;
29
30 def LdFrm         : Format<6>;
31 def StFrm         : Format<7>;
32 def LdMiscFrm     : Format<8>;
33 def StMiscFrm     : Format<9>;
34 def LdStMulFrm    : Format<10>;
35
36 def ArithMiscFrm  : Format<11>;
37 def ExtFrm        : Format<12>;
38
39 def VFPUnaryFrm   : Format<13>;
40 def VFPBinaryFrm  : Format<14>;
41 def VFPConv1Frm   : Format<15>;
42 def VFPConv2Frm   : Format<16>;
43 def VFPConv3Frm   : Format<17>;
44 def VFPConv4Frm   : Format<18>;
45 def VFPConv5Frm   : Format<19>;
46 def VFPLdStFrm    : Format<20>;
47 def VFPLdStMulFrm : Format<21>;
48 def VFPMiscFrm    : Format<22>;
49
50 def ThumbFrm      : Format<23>;
51
52 def NEONFrm       : Format<24>;
53 def NEONGetLnFrm  : Format<25>;
54 def NEONSetLnFrm  : Format<26>;
55 def NEONDupFrm    : Format<27>;
56
57 // Misc flag for data processing instructions that indicates whether
58 // the instruction has a Rn register operand.
59 class UnaryDP  { bit isUnaryDataProc = 1; }
60
61 //===----------------------------------------------------------------------===//
62 // ARM Instruction flags.  These need to match ARMInstrInfo.h.
63 //
64
65 // Addressing mode.
66 class AddrMode<bits<4> val> {
67   bits<4> Value = val;
68 }
69 def AddrModeNone  : AddrMode<0>;
70 def AddrMode1     : AddrMode<1>;
71 def AddrMode2     : AddrMode<2>;
72 def AddrMode3     : AddrMode<3>;
73 def AddrMode4     : AddrMode<4>;
74 def AddrMode5     : AddrMode<5>;
75 def AddrModeT1_1  : AddrMode<6>;
76 def AddrModeT1_2  : AddrMode<7>;
77 def AddrModeT1_4  : AddrMode<8>;
78 def AddrModeT1_s  : AddrMode<9>;
79 def AddrModeT2_i12: AddrMode<10>;
80 def AddrModeT2_i8 : AddrMode<11>;
81 def AddrModeT2_so : AddrMode<12>;
82 def AddrModeT2_pc : AddrMode<13>;
83 def AddrModeT2_i8s4 : AddrMode<14>;
84
85 // Instruction size.
86 class SizeFlagVal<bits<3> val> {
87   bits<3> Value = val;
88 }
89 def SizeInvalid  : SizeFlagVal<0>;  // Unset.
90 def SizeSpecial  : SizeFlagVal<1>;  // Pseudo or special.
91 def Size8Bytes   : SizeFlagVal<2>;
92 def Size4Bytes   : SizeFlagVal<3>;
93 def Size2Bytes   : SizeFlagVal<4>;
94
95 // Load / store index mode.
96 class IndexMode<bits<2> val> {
97   bits<2> Value = val;
98 }
99 def IndexModeNone : IndexMode<0>;
100 def IndexModePre  : IndexMode<1>;
101 def IndexModePost : IndexMode<2>;
102
103 //===----------------------------------------------------------------------===//
104
105 // ARM Instruction templates.
106 //
107
108 class InstARM<AddrMode am, SizeFlagVal sz, IndexMode im,
109               Format f, string cstr>
110   : Instruction {
111   field bits<32> Inst;
112
113   let Namespace = "ARM";
114
115   // TSFlagsFields
116   AddrMode AM = am;
117   bits<4> AddrModeBits = AM.Value;
118   
119   SizeFlagVal SZ = sz;
120   bits<3> SizeFlag = SZ.Value;
121
122   IndexMode IM = im;
123   bits<2> IndexModeBits = IM.Value;
124   
125   Format F = f;
126   bits<5> Form = F.Value;
127
128   //
129   // Attributes specific to ARM instructions...
130   //
131   bit isUnaryDataProc = 0;
132   
133   let Constraints = cstr;
134 }
135
136 class PseudoInst<dag oops, dag iops, string asm, list<dag> pattern>
137   : InstARM<AddrModeNone, SizeSpecial, IndexModeNone, Pseudo, ""> {
138   let OutOperandList = oops;
139   let InOperandList = iops;
140   let AsmString   = asm;
141   let Pattern = pattern;
142 }
143
144 // Almost all ARM instructions are predicable.
145 class I<dag oops, dag iops, AddrMode am, SizeFlagVal sz,
146         IndexMode im, Format f, string opc, string asm, string cstr,
147         list<dag> pattern>
148   : InstARM<am, sz, im, f, cstr> {
149   let OutOperandList = oops;
150   let InOperandList = !con(iops, (ops pred:$p));
151   let AsmString   = !strconcat(opc, !strconcat("${p}", asm));
152   let Pattern = pattern;
153   list<Predicate> Predicates = [IsARM];
154 }
155
156 // Same as I except it can optionally modify CPSR. Note it's modeled as
157 // an input operand since by default it's a zero register. It will
158 // become an implicit def once it's "flipped".
159 class sI<dag oops, dag iops, AddrMode am, SizeFlagVal sz,
160          IndexMode im, Format f, string opc, string asm, string cstr,
161          list<dag> pattern>
162   : InstARM<am, sz, im, f, cstr> {
163   let OutOperandList = oops;
164   let InOperandList = !con(iops, (ops pred:$p, cc_out:$s));
165   let AsmString   = !strconcat(opc, !strconcat("${p}${s}", asm));
166   let Pattern = pattern;
167   list<Predicate> Predicates = [IsARM];
168 }
169
170 // Special cases
171 class XI<dag oops, dag iops, AddrMode am, SizeFlagVal sz,
172          IndexMode im, Format f, string asm, string cstr, list<dag> pattern>
173   : InstARM<am, sz, im, f, cstr> {
174   let OutOperandList = oops;
175   let InOperandList = iops;
176   let AsmString   = asm;
177   let Pattern = pattern;
178   list<Predicate> Predicates = [IsARM];
179 }
180
181 class AI<dag oops, dag iops, Format f, string opc,
182          string asm, list<dag> pattern>
183   : I<oops, iops, AddrModeNone, Size4Bytes, IndexModeNone, f, opc,
184       asm, "", pattern>;
185 class AsI<dag oops, dag iops, Format f, string opc,
186           string asm, list<dag> pattern>
187   : sI<oops, iops, AddrModeNone, Size4Bytes, IndexModeNone, f, opc,
188        asm, "", pattern>;
189 class AXI<dag oops, dag iops, Format f, string asm,
190           list<dag> pattern>
191   : XI<oops, iops, AddrModeNone, Size4Bytes, IndexModeNone, f, asm,
192        "", pattern>;
193
194 // Ctrl flow instructions
195 class ABI<bits<4> opcod, dag oops, dag iops, string opc,
196          string asm, list<dag> pattern>
197   : I<oops, iops, AddrModeNone, Size4Bytes, IndexModeNone, BrFrm, opc,
198       asm, "", pattern> {
199   let Inst{27-24} = opcod;
200 }
201 class ABXI<bits<4> opcod, dag oops, dag iops, string asm, list<dag> pattern>
202   : XI<oops, iops, AddrModeNone, Size4Bytes, IndexModeNone, BrFrm, asm,
203        "", pattern> {
204   let Inst{27-24} = opcod;
205 }
206 class ABXIx2<dag oops, dag iops, string asm, list<dag> pattern>
207   : XI<oops, iops, AddrModeNone, Size8Bytes, IndexModeNone, BrMiscFrm, asm,
208        "", pattern>;
209
210 // BR_JT instructions
211 class JTI<dag oops, dag iops, string asm, list<dag> pattern>
212   : XI<oops, iops, AddrModeNone, SizeSpecial, IndexModeNone, BrMiscFrm,
213        asm, "", pattern>;
214
215 // addrmode1 instructions
216 class AI1<bits<4> opcod, dag oops, dag iops, Format f, string opc,
217           string asm, list<dag> pattern>
218   : I<oops, iops, AddrMode1, Size4Bytes, IndexModeNone, f, opc,
219       asm, "", pattern> {
220   let Inst{24-21} = opcod;
221   let Inst{27-26} = {0,0};
222 }
223 class AsI1<bits<4> opcod, dag oops, dag iops, Format f, string opc,
224            string asm, list<dag> pattern>
225   : sI<oops, iops, AddrMode1, Size4Bytes, IndexModeNone, f, opc,
226        asm, "", pattern> {
227   let Inst{24-21} = opcod;
228   let Inst{27-26} = {0,0};
229 }
230 class AXI1<bits<4> opcod, dag oops, dag iops, Format f, string asm,
231            list<dag> pattern>
232   : XI<oops, iops, AddrMode1, Size4Bytes, IndexModeNone, f, asm,
233        "", pattern> {
234   let Inst{24-21} = opcod;
235   let Inst{27-26} = {0,0};
236 }
237 class AI1x2<dag oops, dag iops, Format f, string opc,
238             string asm, list<dag> pattern>
239   : I<oops, iops, AddrMode1, Size8Bytes, IndexModeNone, f, opc,
240       asm, "", pattern>;
241
242
243 // addrmode2 loads and stores
244 class AI2<dag oops, dag iops, Format f, string opc,
245           string asm, list<dag> pattern>
246   : I<oops, iops, AddrMode2, Size4Bytes, IndexModeNone, f, opc,
247       asm, "", pattern> {
248   let Inst{27-26} = {0,1};
249 }
250
251 // loads
252 class AI2ldw<dag oops, dag iops, Format f, string opc,
253           string asm, list<dag> pattern>
254   : I<oops, iops, AddrMode2, Size4Bytes, IndexModeNone, f, opc,
255       asm, "", pattern> {
256   let Inst{20}    = 1; // L bit
257   let Inst{21}    = 0; // W bit
258   let Inst{22}    = 0; // B bit
259   let Inst{24}    = 1; // P bit
260   let Inst{27-26} = {0,1};
261 }
262 class AXI2ldw<dag oops, dag iops, Format f, string asm,
263            list<dag> pattern>
264   : XI<oops, iops, AddrMode2, Size4Bytes, IndexModeNone, f,
265        asm, "", pattern> {
266   let Inst{20}    = 1; // L bit
267   let Inst{21}    = 0; // W bit
268   let Inst{22}    = 0; // B bit
269   let Inst{24}    = 1; // P bit
270   let Inst{27-26} = {0,1};
271 }
272 class AI2ldb<dag oops, dag iops, Format f, string opc,
273           string asm, list<dag> pattern>
274   : I<oops, iops, AddrMode2, Size4Bytes, IndexModeNone, f, opc,
275       asm, "", pattern> {
276   let Inst{20}    = 1; // L bit
277   let Inst{21}    = 0; // W bit
278   let Inst{22}    = 1; // B bit
279   let Inst{24}    = 1; // P bit
280   let Inst{27-26} = {0,1};
281 }
282 class AXI2ldb<dag oops, dag iops, Format f, string asm,
283            list<dag> pattern>
284   : XI<oops, iops, AddrMode2, Size4Bytes, IndexModeNone, f,
285        asm, "", pattern> {
286   let Inst{20}    = 1; // L bit
287   let Inst{21}    = 0; // W bit
288   let Inst{22}    = 1; // B bit
289   let Inst{24}    = 1; // P bit
290   let Inst{27-26} = {0,1};
291 }
292
293 // stores
294 class AI2stw<dag oops, dag iops, Format f, string opc,
295           string asm, list<dag> pattern>
296   : I<oops, iops, AddrMode2, Size4Bytes, IndexModeNone, f, opc,
297       asm, "", pattern> {
298   let Inst{20}    = 0; // L bit
299   let Inst{21}    = 0; // W bit
300   let Inst{22}    = 0; // B bit
301   let Inst{24}    = 1; // P bit
302   let Inst{27-26} = {0,1};
303 }
304 class AXI2stw<dag oops, dag iops, Format f, string asm,
305            list<dag> pattern>
306   : XI<oops, iops, AddrMode2, Size4Bytes, IndexModeNone, f,
307        asm, "", pattern> {
308   let Inst{20}    = 0; // L bit
309   let Inst{21}    = 0; // W bit
310   let Inst{22}    = 0; // B bit
311   let Inst{24}    = 1; // P bit
312   let Inst{27-26} = {0,1};
313 }
314 class AI2stb<dag oops, dag iops, Format f, string opc,
315           string asm, list<dag> pattern>
316   : I<oops, iops, AddrMode2, Size4Bytes, IndexModeNone, f, opc,
317       asm, "", pattern> {
318   let Inst{20}    = 0; // L bit
319   let Inst{21}    = 0; // W bit
320   let Inst{22}    = 1; // B bit
321   let Inst{24}    = 1; // P bit
322   let Inst{27-26} = {0,1};
323 }
324 class AXI2stb<dag oops, dag iops, Format f, string asm,
325            list<dag> pattern>
326   : XI<oops, iops, AddrMode2, Size4Bytes, IndexModeNone, f,
327        asm, "", pattern> {
328   let Inst{20}    = 0; // L bit
329   let Inst{21}    = 0; // W bit
330   let Inst{22}    = 1; // B bit
331   let Inst{24}    = 1; // P bit
332   let Inst{27-26} = {0,1};
333 }
334
335 // Pre-indexed loads
336 class AI2ldwpr<dag oops, dag iops, Format f, string opc,
337             string asm, string cstr, list<dag> pattern>
338   : I<oops, iops, AddrMode2, Size4Bytes, IndexModePre, f, opc,
339       asm, cstr, pattern> {
340   let Inst{20}    = 1; // L bit
341   let Inst{21}    = 1; // W bit
342   let Inst{22}    = 0; // B bit
343   let Inst{24}    = 1; // P bit
344   let Inst{27-26} = {0,1};
345 }
346 class AI2ldbpr<dag oops, dag iops, Format f, string opc,
347             string asm, string cstr, list<dag> pattern>
348   : I<oops, iops, AddrMode2, Size4Bytes, IndexModePre, f, opc,
349       asm, cstr, pattern> {
350   let Inst{20}    = 1; // L bit
351   let Inst{21}    = 1; // W bit
352   let Inst{22}    = 1; // B bit
353   let Inst{24}    = 1; // P bit
354   let Inst{27-26} = {0,1};
355 }
356
357 // Pre-indexed stores
358 class AI2stwpr<dag oops, dag iops, Format f, string opc,
359             string asm, string cstr, list<dag> pattern>
360   : I<oops, iops, AddrMode2, Size4Bytes, IndexModePre, f, opc,
361       asm, cstr, pattern> {
362   let Inst{20}    = 0; // L bit
363   let Inst{21}    = 1; // W bit
364   let Inst{22}    = 0; // B bit
365   let Inst{24}    = 1; // P bit
366   let Inst{27-26} = {0,1};
367 }
368 class AI2stbpr<dag oops, dag iops, Format f, string opc,
369             string asm, string cstr, list<dag> pattern>
370   : I<oops, iops, AddrMode2, Size4Bytes, IndexModePre, f, opc,
371       asm, cstr, pattern> {
372   let Inst{20}    = 0; // L bit
373   let Inst{21}    = 1; // W bit
374   let Inst{22}    = 1; // B bit
375   let Inst{24}    = 1; // P bit
376   let Inst{27-26} = {0,1};
377 }
378
379 // Post-indexed loads
380 class AI2ldwpo<dag oops, dag iops, Format f, string opc,
381             string asm, string cstr, list<dag> pattern>
382   : I<oops, iops, AddrMode2, Size4Bytes, IndexModePost, f, opc,
383       asm, cstr,pattern> {
384   let Inst{20}    = 1; // L bit
385   let Inst{21}    = 0; // W bit
386   let Inst{22}    = 0; // B bit
387   let Inst{24}    = 0; // P bit
388   let Inst{27-26} = {0,1};
389 }
390 class AI2ldbpo<dag oops, dag iops, Format f, string opc,
391             string asm, string cstr, list<dag> pattern>
392   : I<oops, iops, AddrMode2, Size4Bytes, IndexModePost, f, opc,
393       asm, cstr,pattern> {
394   let Inst{20}    = 1; // L bit
395   let Inst{21}    = 0; // W bit
396   let Inst{22}    = 1; // B bit
397   let Inst{24}    = 0; // P bit
398   let Inst{27-26} = {0,1};
399 }
400
401 // Post-indexed stores
402 class AI2stwpo<dag oops, dag iops, Format f, string opc,
403             string asm, string cstr, list<dag> pattern>
404   : I<oops, iops, AddrMode2, Size4Bytes, IndexModePost, f, opc,
405       asm, cstr,pattern> {
406   let Inst{20}    = 0; // L bit
407   let Inst{21}    = 0; // W bit
408   let Inst{22}    = 0; // B bit
409   let Inst{24}    = 0; // P bit
410   let Inst{27-26} = {0,1};
411 }
412 class AI2stbpo<dag oops, dag iops, Format f, string opc,
413             string asm, string cstr, list<dag> pattern>
414   : I<oops, iops, AddrMode2, Size4Bytes, IndexModePost, f, opc,
415       asm, cstr,pattern> {
416   let Inst{20}    = 0; // L bit
417   let Inst{21}    = 0; // W bit
418   let Inst{22}    = 1; // B bit
419   let Inst{24}    = 0; // P bit
420   let Inst{27-26} = {0,1};
421 }
422
423 // addrmode3 instructions
424 class AI3<dag oops, dag iops, Format f, string opc,
425           string asm, list<dag> pattern>
426   : I<oops, iops, AddrMode3, Size4Bytes, IndexModeNone, f, opc,
427       asm, "", pattern>;
428 class AXI3<dag oops, dag iops, Format f, string asm,
429            list<dag> pattern>
430   : XI<oops, iops, AddrMode3, Size4Bytes, IndexModeNone, f, asm,
431        "", pattern>;
432
433 // loads
434 class AI3ldh<dag oops, dag iops, Format f, string opc,
435           string asm, list<dag> pattern>
436   : I<oops, iops, AddrMode3, Size4Bytes, IndexModeNone, f, opc,
437       asm, "", pattern> {
438   let Inst{4}     = 1;
439   let Inst{5}     = 1; // H bit
440   let Inst{6}     = 0; // S bit
441   let Inst{7}     = 1;
442   let Inst{20}    = 1; // L bit
443   let Inst{21}    = 0; // W bit
444   let Inst{24}    = 1; // P bit
445 }
446 class AXI3ldh<dag oops, dag iops, Format f, string asm,
447            list<dag> pattern>
448   : XI<oops, iops, AddrMode3, Size4Bytes, IndexModeNone, f,
449        asm, "", pattern> {
450   let Inst{4}     = 1;
451   let Inst{5}     = 1; // H bit
452   let Inst{6}     = 0; // S bit
453   let Inst{7}     = 1;
454   let Inst{20}    = 1; // L bit
455   let Inst{21}    = 0; // W bit
456   let Inst{24}    = 1; // P bit
457 }
458 class AI3ldsh<dag oops, dag iops, Format f, string opc,
459           string asm, list<dag> pattern>
460   : I<oops, iops, AddrMode3, Size4Bytes, IndexModeNone, f, opc,
461       asm, "", pattern> {
462   let Inst{4}     = 1;
463   let Inst{5}     = 1; // H bit
464   let Inst{6}     = 1; // S bit
465   let Inst{7}     = 1;
466   let Inst{20}    = 1; // L bit
467   let Inst{21}    = 0; // W bit
468   let Inst{24}    = 1; // P bit
469 }
470 class AXI3ldsh<dag oops, dag iops, Format f, string asm,
471            list<dag> pattern>
472   : XI<oops, iops, AddrMode3, Size4Bytes, IndexModeNone, f,
473        asm, "", pattern> {
474   let Inst{4}     = 1;
475   let Inst{5}     = 1; // H bit
476   let Inst{6}     = 1; // S bit
477   let Inst{7}     = 1;
478   let Inst{20}    = 1; // L bit
479   let Inst{21}    = 0; // W bit
480   let Inst{24}    = 1; // P bit
481 }
482 class AI3ldsb<dag oops, dag iops, Format f, string opc,
483           string asm, list<dag> pattern>
484   : I<oops, iops, AddrMode3, Size4Bytes, IndexModeNone, f, opc,
485       asm, "", pattern> {
486   let Inst{4}     = 1;
487   let Inst{5}     = 0; // H bit
488   let Inst{6}     = 1; // S bit
489   let Inst{7}     = 1;
490   let Inst{20}    = 1; // L bit
491   let Inst{21}    = 0; // W bit
492   let Inst{24}    = 1; // P bit
493 }
494 class AXI3ldsb<dag oops, dag iops, Format f, string asm,
495            list<dag> pattern>
496   : XI<oops, iops, AddrMode3, Size4Bytes, IndexModeNone, f,
497        asm, "", pattern> {
498   let Inst{4}     = 1;
499   let Inst{5}     = 0; // H bit
500   let Inst{6}     = 1; // S bit
501   let Inst{7}     = 1;
502   let Inst{20}    = 1; // L bit
503   let Inst{21}    = 0; // W bit
504   let Inst{24}    = 1; // P bit
505 }
506 class AI3ldd<dag oops, dag iops, Format f, string opc,
507           string asm, list<dag> pattern>
508   : I<oops, iops, AddrMode3, Size4Bytes, IndexModeNone, f, opc,
509       asm, "", pattern> {
510   let Inst{4}     = 1;
511   let Inst{5}     = 0; // H bit
512   let Inst{6}     = 1; // S bit
513   let Inst{7}     = 1;
514   let Inst{20}    = 0; // L bit
515   let Inst{21}    = 0; // W bit
516   let Inst{24}    = 1; // P bit
517 }
518
519 // stores
520 class AI3sth<dag oops, dag iops, Format f, string opc,
521           string asm, list<dag> pattern>
522   : I<oops, iops, AddrMode3, Size4Bytes, IndexModeNone, f, opc,
523       asm, "", pattern> {
524   let Inst{4}     = 1;
525   let Inst{5}     = 1; // H bit
526   let Inst{6}     = 0; // S bit
527   let Inst{7}     = 1;
528   let Inst{20}    = 0; // L bit
529   let Inst{21}    = 0; // W bit
530   let Inst{24}    = 1; // P bit
531 }
532 class AXI3sth<dag oops, dag iops, Format f, string asm,
533            list<dag> pattern>
534   : XI<oops, iops, AddrMode3, Size4Bytes, IndexModeNone, f,
535        asm, "", pattern> {
536   let Inst{4}     = 1;
537   let Inst{5}     = 1; // H bit
538   let Inst{6}     = 0; // S bit
539   let Inst{7}     = 1;
540   let Inst{20}    = 0; // L bit
541   let Inst{21}    = 0; // W bit
542   let Inst{24}    = 1; // P bit
543 }
544 class AI3std<dag oops, dag iops, Format f, string opc,
545           string asm, list<dag> pattern>
546   : I<oops, iops, AddrMode3, Size4Bytes, IndexModeNone, f, opc,
547       asm, "", pattern> {
548   let Inst{4}     = 1;
549   let Inst{5}     = 1; // H bit
550   let Inst{6}     = 1; // S bit
551   let Inst{7}     = 1;
552   let Inst{20}    = 0; // L bit
553   let Inst{21}    = 0; // W bit
554   let Inst{24}    = 1; // P bit
555 }
556
557 // Pre-indexed loads
558 class AI3ldhpr<dag oops, dag iops, Format f, string opc,
559             string asm, string cstr, list<dag> pattern>
560   : I<oops, iops, AddrMode3, Size4Bytes, IndexModePre, f, opc,
561       asm, cstr, pattern> {
562   let Inst{4}     = 1;
563   let Inst{5}     = 1; // H bit
564   let Inst{6}     = 0; // S bit
565   let Inst{7}     = 1;
566   let Inst{20}    = 1; // L bit
567   let Inst{21}    = 1; // W bit
568   let Inst{24}    = 1; // P bit
569 }
570 class AI3ldshpr<dag oops, dag iops, Format f, string opc,
571             string asm, string cstr, list<dag> pattern>
572   : I<oops, iops, AddrMode3, Size4Bytes, IndexModePre, f, opc,
573       asm, cstr, pattern> {
574   let Inst{4}     = 1;
575   let Inst{5}     = 1; // H bit
576   let Inst{6}     = 1; // S bit
577   let Inst{7}     = 1;
578   let Inst{20}    = 1; // L bit
579   let Inst{21}    = 1; // W bit
580   let Inst{24}    = 1; // P bit
581 }
582 class AI3ldsbpr<dag oops, dag iops, Format f, string opc,
583             string asm, string cstr, list<dag> pattern>
584   : I<oops, iops, AddrMode3, Size4Bytes, IndexModePre, f, opc,
585       asm, cstr, pattern> {
586   let Inst{4}     = 1;
587   let Inst{5}     = 0; // H bit
588   let Inst{6}     = 1; // S bit
589   let Inst{7}     = 1;
590   let Inst{20}    = 1; // L bit
591   let Inst{21}    = 1; // W bit
592   let Inst{24}    = 1; // P bit
593 }
594
595 // Pre-indexed stores
596 class AI3sthpr<dag oops, dag iops, Format f, string opc,
597             string asm, string cstr, list<dag> pattern>
598   : I<oops, iops, AddrMode3, Size4Bytes, IndexModePre, f, opc,
599       asm, cstr, pattern> {
600   let Inst{4}     = 1;
601   let Inst{5}     = 1; // H bit
602   let Inst{6}     = 0; // S bit
603   let Inst{7}     = 1;
604   let Inst{20}    = 0; // L bit
605   let Inst{21}    = 1; // W bit
606   let Inst{24}    = 1; // P bit
607 }
608
609 // Post-indexed loads
610 class AI3ldhpo<dag oops, dag iops, Format f, string opc,
611             string asm, string cstr, list<dag> pattern>
612   : I<oops, iops, AddrMode3, Size4Bytes, IndexModePost, f, opc,
613       asm, cstr,pattern> {
614   let Inst{4}     = 1;
615   let Inst{5}     = 1; // H bit
616   let Inst{6}     = 0; // S bit
617   let Inst{7}     = 1;
618   let Inst{20}    = 1; // L bit
619   let Inst{21}    = 1; // W bit
620   let Inst{24}    = 0; // P bit
621 }
622 class AI3ldshpo<dag oops, dag iops, Format f, string opc,
623             string asm, string cstr, list<dag> pattern>
624   : I<oops, iops, AddrMode3, Size4Bytes, IndexModePost, f, opc,
625       asm, cstr,pattern> {
626   let Inst{4}     = 1;
627   let Inst{5}     = 1; // H bit
628   let Inst{6}     = 1; // S bit
629   let Inst{7}     = 1;
630   let Inst{20}    = 1; // L bit
631   let Inst{21}    = 1; // W bit
632   let Inst{24}    = 0; // P bit
633 }
634 class AI3ldsbpo<dag oops, dag iops, Format f, string opc,
635             string asm, string cstr, list<dag> pattern>
636   : I<oops, iops, AddrMode3, Size4Bytes, IndexModePost, f, opc,
637       asm, cstr,pattern> {
638   let Inst{4}     = 1;
639   let Inst{5}     = 0; // H bit
640   let Inst{6}     = 1; // S bit
641   let Inst{7}     = 1;
642   let Inst{20}    = 1; // L bit
643   let Inst{21}    = 1; // W bit
644   let Inst{24}    = 0; // P bit
645 }
646
647 // Post-indexed stores
648 class AI3sthpo<dag oops, dag iops, Format f, string opc,
649             string asm, string cstr, list<dag> pattern>
650   : I<oops, iops, AddrMode3, Size4Bytes, IndexModePost, f, opc,
651       asm, cstr,pattern> {
652   let Inst{4}     = 1;
653   let Inst{5}     = 1; // H bit
654   let Inst{6}     = 0; // S bit
655   let Inst{7}     = 1;
656   let Inst{20}    = 0; // L bit
657   let Inst{21}    = 1; // W bit
658   let Inst{24}    = 0; // P bit
659 }
660
661
662 // addrmode4 instructions
663 class AXI4ld<dag oops, dag iops, Format f, string asm, list<dag> pattern>
664   : XI<oops, iops, AddrMode4, Size4Bytes, IndexModeNone, f, asm,
665        "", pattern> {
666   let Inst{20}    = 1; // L bit
667   let Inst{22}    = 0; // S bit
668   let Inst{27-25} = 0b100;
669 }
670 class AXI4st<dag oops, dag iops, Format f, string asm, list<dag> pattern>
671   : XI<oops, iops, AddrMode4, Size4Bytes, IndexModeNone, f, asm,
672        "", pattern> {
673   let Inst{20}    = 0; // L bit
674   let Inst{22}    = 0; // S bit
675   let Inst{27-25} = 0b100;
676 }
677
678 // Unsigned multiply, multiply-accumulate instructions.
679 class AMul1I<bits<7> opcod, dag oops, dag iops, string opc,
680          string asm, list<dag> pattern>
681   : I<oops, iops, AddrModeNone, Size4Bytes, IndexModeNone, MulFrm, opc,
682       asm, "", pattern> {
683   let Inst{7-4}   = 0b1001;
684   let Inst{20}    = 0; // S bit
685   let Inst{27-21} = opcod;
686 }
687 class AsMul1I<bits<7> opcod, dag oops, dag iops, string opc,
688           string asm, list<dag> pattern>
689   : sI<oops, iops, AddrModeNone, Size4Bytes, IndexModeNone, MulFrm, opc,
690        asm, "", pattern> {
691   let Inst{7-4}   = 0b1001;
692   let Inst{27-21} = opcod;
693 }
694
695 // Most significant word multiply
696 class AMul2I<bits<7> opcod, dag oops, dag iops, string opc,
697          string asm, list<dag> pattern>
698   : I<oops, iops, AddrModeNone, Size4Bytes, IndexModeNone, MulFrm, opc,
699       asm, "", pattern> {
700   let Inst{7-4}   = 0b1001;
701   let Inst{20}    = 1;
702   let Inst{27-21} = opcod;
703 }
704
705 // SMUL<x><y> / SMULW<y> / SMLA<x><y> / SMLAW<x><y>
706 class AMulxyI<bits<7> opcod, dag oops, dag iops, string opc,
707          string asm, list<dag> pattern>
708   : I<oops, iops, AddrModeNone, Size4Bytes, IndexModeNone, MulFrm, opc,
709       asm, "", pattern> {
710   let Inst{4}     = 0;
711   let Inst{7}     = 1;
712   let Inst{20}    = 0;
713   let Inst{27-21} = opcod;
714 }
715
716 // Extend instructions.
717 class AExtI<bits<8> opcod, dag oops, dag iops, string opc,
718             string asm, list<dag> pattern>
719   : I<oops, iops, AddrModeNone, Size4Bytes, IndexModeNone, ExtFrm, opc,
720       asm, "", pattern> {
721   let Inst{7-4}   = 0b0111;
722   let Inst{27-20} = opcod;
723 }
724
725 // Misc Arithmetic instructions.
726 class AMiscA1I<bits<8> opcod, dag oops, dag iops, string opc,
727                string asm, list<dag> pattern>
728   : I<oops, iops, AddrModeNone, Size4Bytes, IndexModeNone, ArithMiscFrm, opc,
729       asm, "", pattern> {
730   let Inst{27-20} = opcod;
731 }
732
733 //===----------------------------------------------------------------------===//
734
735 // ARMPat - Same as Pat<>, but requires that the compiler be in ARM mode.
736 class ARMPat<dag pattern, dag result> : Pat<pattern, result> {
737   list<Predicate> Predicates = [IsARM];
738 }
739 class ARMV5TEPat<dag pattern, dag result> : Pat<pattern, result> {
740   list<Predicate> Predicates = [IsARM, HasV5TE];
741 }
742 class ARMV6Pat<dag pattern, dag result> : Pat<pattern, result> {
743   list<Predicate> Predicates = [IsARM, HasV6];
744 }
745
746 //===----------------------------------------------------------------------===//
747 //
748 // Thumb Instruction Format Definitions.
749 //
750
751 // TI - Thumb instruction.
752
753 class ThumbI<dag outs, dag ins, AddrMode am, SizeFlagVal sz,
754              string asm, string cstr, list<dag> pattern>
755   : InstARM<am, sz, IndexModeNone, ThumbFrm, cstr> {
756   let OutOperandList = outs;
757   let InOperandList = ins;
758   let AsmString   = asm;
759   let Pattern = pattern;
760   list<Predicate> Predicates = [IsThumb];
761 }
762
763 class TI<dag outs, dag ins, string asm, list<dag> pattern>
764   : ThumbI<outs, ins, AddrModeNone, Size2Bytes, asm, "", pattern>;
765
766 // BL, BLX(1) are translated by assembler into two instructions
767 class TIx2<dag outs, dag ins, string asm, list<dag> pattern>
768   : ThumbI<outs, ins, AddrModeNone, Size4Bytes, asm, "", pattern>;
769
770 // BR_JT instructions
771 class TJTI<dag outs, dag ins, string asm, list<dag> pattern>
772   : ThumbI<outs, ins, AddrModeNone, SizeSpecial, asm, "", pattern>;
773
774 // TPat - Same as Pat<>, but requires that the compiler be in Thumb mode.
775 class TPat<dag pattern, dag result> : Pat<pattern, result> {
776   list<Predicate> Predicates = [IsThumb];
777 }
778
779 class Tv5Pat<dag pattern, dag result> : Pat<pattern, result> {
780   list<Predicate> Predicates = [IsThumb, HasV5T];
781 }
782
783 // Thumb1 only
784 class Thumb1I<dag outs, dag ins, AddrMode am, SizeFlagVal sz,
785              string asm, string cstr, list<dag> pattern>
786   : InstARM<am, sz, IndexModeNone, ThumbFrm, cstr> {
787   let OutOperandList = outs;
788   let InOperandList = ins;
789   let AsmString   = asm;
790   let Pattern = pattern;
791   list<Predicate> Predicates = [IsThumb1Only];
792 }
793
794 class T1I<dag outs, dag ins, string asm, list<dag> pattern>
795   : Thumb1I<outs, ins, AddrModeNone, Size2Bytes, asm, "", pattern>;
796 class T1I1<dag outs, dag ins, string asm, list<dag> pattern>
797   : Thumb1I<outs, ins, AddrModeT1_1, Size2Bytes, asm, "", pattern>;
798 class T1I2<dag outs, dag ins, string asm, list<dag> pattern>
799   : Thumb1I<outs, ins, AddrModeT1_2, Size2Bytes, asm, "", pattern>;
800 class T1I4<dag outs, dag ins, string asm, list<dag> pattern>
801   : Thumb1I<outs, ins, AddrModeT1_4, Size2Bytes, asm, "", pattern>;
802 class T1Is<dag outs, dag ins, string asm, list<dag> pattern>
803   : Thumb1I<outs, ins, AddrModeT1_s, Size2Bytes, asm, "", pattern>;
804 class T1Ix2<dag outs, dag ins, string asm, list<dag> pattern>
805   : Thumb1I<outs, ins, AddrModeNone, Size4Bytes, asm, "", pattern>;
806 class T1JTI<dag outs, dag ins, string asm, list<dag> pattern>
807   : Thumb1I<outs, ins, AddrModeNone, SizeSpecial, asm, "", pattern>;
808
809 // Two-address instructions
810 class T1It<dag outs, dag ins, string asm, list<dag> pattern>
811   : Thumb1I<outs, ins, AddrModeNone, Size2Bytes, asm, "$lhs = $dst", pattern>;
812
813 class T1Pat<dag pattern, dag result> : Pat<pattern, result> {
814   list<Predicate> Predicates = [IsThumb1Only];
815 }
816
817 // Thumb2I - Thumb2 instruction. Almost all Thumb2 instructions are predicable.
818 class Thumb2I<dag oops, dag iops, AddrMode am, SizeFlagVal sz,
819               string opc, string asm, string cstr, list<dag> pattern>
820   : InstARM<am, sz, IndexModeNone, ThumbFrm, cstr> {
821   let OutOperandList = oops;
822   let InOperandList = !con(iops, (ops pred:$p));
823   let AsmString = !strconcat(opc, !strconcat("${p}", asm));
824   let Pattern = pattern;
825   list<Predicate> Predicates = [IsThumb, HasThumb2];
826 }
827
828 // Same as Thumb2I except it can optionally modify CPSR. Note it's modeled as
829 // an input operand since by default it's a zero register. It will
830 // become an implicit def once it's "flipped".
831 // FIXME: This uses unified syntax so {s} comes before {p}. We should make it
832 // more consistent.
833 class Thumb2sI<dag oops, dag iops, AddrMode am, SizeFlagVal sz,
834                string opc, string asm, string cstr, list<dag> pattern>
835   : InstARM<am, sz, IndexModeNone, ThumbFrm, cstr> {
836   let OutOperandList = oops;
837   let InOperandList = !con(iops, (ops pred:$p, cc_out:$s));
838   let AsmString   = !strconcat(opc, !strconcat("${s}${p}", asm));
839   let Pattern = pattern;
840   list<Predicate> Predicates = [IsThumb, HasThumb2];
841 }
842
843 // Special cases
844 class Thumb2XI<dag oops, dag iops, AddrMode am, SizeFlagVal sz,
845                string asm, string cstr, list<dag> pattern>
846   : InstARM<am, sz, IndexModeNone, ThumbFrm, cstr> {
847   let OutOperandList = oops;
848   let InOperandList = iops;
849   let AsmString   = asm;
850   let Pattern = pattern;
851   list<Predicate> Predicates = [IsThumb, HasThumb2];
852 }
853
854 class T2I<dag oops, dag iops, string opc, string asm, list<dag> pattern>
855   : Thumb2I<oops, iops, AddrModeNone, Size4Bytes, opc, asm, "", pattern>;
856 class T2Ii12<dag oops, dag iops, string opc, string asm, list<dag> pattern>
857   : Thumb2I<oops, iops, AddrModeT2_i12, Size4Bytes, opc, asm, "", pattern>;
858 class T2Ii8<dag oops, dag iops, string opc, string asm, list<dag> pattern>
859   : Thumb2I<oops, iops, AddrModeT2_i8, Size4Bytes, opc, asm, "", pattern>;
860 class T2Iso<dag oops, dag iops, string opc, string asm, list<dag> pattern>
861   : Thumb2I<oops, iops, AddrModeT2_so, Size4Bytes, opc, asm, "", pattern>;
862 class T2Ipc<dag oops, dag iops, string opc, string asm, list<dag> pattern>
863   : Thumb2I<oops, iops, AddrModeT2_pc, Size4Bytes, opc, asm, "", pattern>;
864 class T2Ii8s4<dag oops, dag iops, string opc, string asm, list<dag> pattern>
865   : Thumb2I<oops, iops, AddrModeT2_i8s4, Size4Bytes, opc, asm, "", pattern>;
866
867 class T2sI<dag oops, dag iops, string opc, string asm, list<dag> pattern>
868   : Thumb2sI<oops, iops, AddrModeNone, Size4Bytes, opc, asm, "", pattern>;
869
870 class T2XI<dag oops, dag iops, string asm, list<dag> pattern>
871   : Thumb2XI<oops, iops, AddrModeNone, Size4Bytes, asm, "", pattern>;
872 class T2JTI<dag oops, dag iops, string asm, list<dag> pattern>
873   : Thumb2XI<oops, iops, AddrModeNone, SizeSpecial, asm, "", pattern>;
874
875 // T2Pat - Same as Pat<>, but requires that the compiler be in Thumb2 mode.
876 class T2Pat<dag pattern, dag result> : Pat<pattern, result> {
877   list<Predicate> Predicates = [IsThumb, HasThumb2];
878 }
879
880 //===----------------------------------------------------------------------===//
881
882 //===----------------------------------------------------------------------===//
883 // ARM VFP Instruction templates.
884 //
885
886 // ARM VFP addrmode5 loads and stores
887 class ADI5<bits<4> opcod1, bits<2> opcod2, dag oops, dag iops,
888            string opc, string asm, list<dag> pattern>
889   : I<oops, iops, AddrMode5, Size4Bytes, IndexModeNone,
890       VFPLdStFrm, opc, asm, "", pattern> {
891   // TODO: Mark the instructions with the appropriate subtarget info.
892   let Inst{27-24} = opcod1;
893   let Inst{21-20} = opcod2;
894   let Inst{11-8}  = 0b1011;
895 }
896
897 class ASI5<bits<4> opcod1, bits<2> opcod2, dag oops, dag iops,
898            string opc, string asm, list<dag> pattern>
899   : I<oops, iops, AddrMode5, Size4Bytes, IndexModeNone,
900       VFPLdStFrm, opc, asm, "", pattern> {
901   // TODO: Mark the instructions with the appropriate subtarget info.
902   let Inst{27-24} = opcod1;
903   let Inst{21-20} = opcod2;
904   let Inst{11-8}  = 0b1010;
905 }
906
907 // Load / store multiple
908 class AXSI5<dag oops, dag iops, string asm, list<dag> pattern>
909   : XI<oops, iops, AddrMode5, Size4Bytes, IndexModeNone,
910        VFPLdStMulFrm, asm, "", pattern> {
911   // TODO: Mark the instructions with the appropriate subtarget info.
912   let Inst{27-25} = 0b110;
913   let Inst{11-8}  = 0b1011;
914 }
915
916 class AXDI5<dag oops, dag iops, string asm, list<dag> pattern>
917   : XI<oops, iops, AddrMode5, Size4Bytes, IndexModeNone,
918        VFPLdStMulFrm, asm, "", pattern> {
919   // TODO: Mark the instructions with the appropriate subtarget info.
920   let Inst{27-25} = 0b110;
921   let Inst{11-8}  = 0b1010;
922 }
923
924
925 // Double precision, unary
926 class ADuI<bits<8> opcod1, bits<4> opcod2, bits<4> opcod3, dag oops, dag iops,
927            string opc, string asm, list<dag> pattern>
928   : AI<oops, iops, VFPUnaryFrm, opc, asm, pattern> {
929   let Inst{27-20} = opcod1;
930   let Inst{19-16} = opcod2;
931   let Inst{11-8}  = 0b1011;
932   let Inst{7-4}   = opcod3;
933 }
934
935 // Double precision, binary
936 class ADbI<bits<8> opcod, dag oops, dag iops, string opc,
937            string asm, list<dag> pattern>
938   : AI<oops, iops, VFPBinaryFrm, opc, asm, pattern> {
939   let Inst{27-20} = opcod;
940   let Inst{11-8}  = 0b1011;
941 }
942
943 // Single precision, unary
944 class ASuI<bits<8> opcod1, bits<4> opcod2, bits<4> opcod3, dag oops, dag iops,
945            string opc, string asm, list<dag> pattern>
946   : AI<oops, iops, VFPUnaryFrm, opc, asm, pattern> {
947   // Bits 22 (D bit) and 5 (M bit) will be changed during instruction encoding.
948   let Inst{27-20} = opcod1;
949   let Inst{19-16} = opcod2;
950   let Inst{11-8}  = 0b1010;
951   let Inst{7-4}   = opcod3;
952 }
953
954 // Single precision, binary
955 class ASbI<bits<8> opcod, dag oops, dag iops, string opc,
956            string asm, list<dag> pattern>
957   : AI<oops, iops, VFPBinaryFrm, opc, asm, pattern> {
958   // Bit 22 (D bit) can be changed during instruction encoding.
959   let Inst{27-20} = opcod;
960   let Inst{11-8}  = 0b1010;
961 }
962
963 // VFP conversion instructions
964 class AVConv1I<bits<8> opcod1, bits<4> opcod2, bits<4> opcod3,
965                dag oops, dag iops, string opc, string asm, list<dag> pattern>
966   : AI<oops, iops, VFPConv1Frm, opc, asm, pattern> {
967   let Inst{27-20} = opcod1;
968   let Inst{19-16} = opcod2;
969   let Inst{11-8}  = opcod3;
970   let Inst{6}     = 1;
971 }
972
973 class AVConvXI<bits<8> opcod1, bits<4> opcod2, dag oops, dag iops, Format f,
974              string opc, string asm, list<dag> pattern>
975   : AI<oops, iops, f, opc, asm, pattern> {
976   let Inst{27-20} = opcod1;
977   let Inst{11-8}  = opcod2;
978   let Inst{4}     = 1;
979 }
980
981 class AVConv2I<bits<8> opcod1, bits<4> opcod2, dag oops, dag iops, string opc,
982               string asm, list<dag> pattern>
983   : AVConvXI<opcod1, opcod2, oops, iops, VFPConv2Frm, opc, asm, pattern>;
984
985 class AVConv3I<bits<8> opcod1, bits<4> opcod2, dag oops, dag iops, string opc,
986               string asm, list<dag> pattern>
987   : AVConvXI<opcod1, opcod2, oops, iops, VFPConv3Frm, opc, asm, pattern>;
988
989 class AVConv4I<bits<8> opcod1, bits<4> opcod2, dag oops, dag iops, string opc,
990               string asm, list<dag> pattern>
991   : AVConvXI<opcod1, opcod2, oops, iops, VFPConv4Frm, opc, asm, pattern>;
992
993 class AVConv5I<bits<8> opcod1, bits<4> opcod2, dag oops, dag iops, string opc,
994               string asm, list<dag> pattern>
995   : AVConvXI<opcod1, opcod2, oops, iops, VFPConv5Frm, opc, asm, pattern>;
996
997 //===----------------------------------------------------------------------===//
998
999 //===----------------------------------------------------------------------===//
1000 // ARM NEON Instruction templates.
1001 //
1002
1003 class NeonI<dag oops, dag iops, AddrMode am, IndexMode im, string asm,
1004             string cstr, list<dag> pattern>
1005   : InstARM<am, Size4Bytes, im, NEONFrm, cstr> {
1006   let OutOperandList = oops;
1007   let InOperandList = iops;
1008   let AsmString = asm;
1009   let Pattern = pattern;
1010   list<Predicate> Predicates = [HasNEON];
1011 }
1012
1013 class NI<dag oops, dag iops, string asm, list<dag> pattern>
1014   : NeonI<oops, iops, AddrModeNone, IndexModeNone, asm, "", pattern> {
1015 }
1016
1017 class NDataI<dag oops, dag iops, string asm, string cstr, list<dag> pattern>
1018   : NeonI<oops, iops, AddrModeNone, IndexModeNone, asm, cstr, pattern> {
1019   let Inst{31-25} = 0b1111001;
1020 }
1021
1022 // NEON "one register and a modified immediate" format.
1023 class N1ModImm<bit op23, bits<3> op21_19, bits<4> op11_8, bit op7, bit op6,
1024                bit op5, bit op4,
1025                dag oops, dag iops, string asm, string cstr, list<dag> pattern>
1026   : NDataI<oops, iops, asm, cstr, pattern> {
1027   let Inst{23} = op23;
1028   let Inst{21-19} = op21_19;
1029   let Inst{11-8} = op11_8;
1030   let Inst{7} = op7;
1031   let Inst{6} = op6;
1032   let Inst{5} = op5;
1033   let Inst{4} = op4;
1034 }
1035
1036 // NEON 2 vector register format.
1037 class N2V<bits<2> op24_23, bits<2> op21_20, bits<2> op19_18, bits<2> op17_16,
1038           bits<5> op11_7, bit op6, bit op4,
1039           dag oops, dag iops, string asm, string cstr, list<dag> pattern>
1040   : NDataI<oops, iops, asm, cstr, pattern> {
1041   let Inst{24-23} = op24_23;
1042   let Inst{21-20} = op21_20;
1043   let Inst{19-18} = op19_18;
1044   let Inst{17-16} = op17_16;
1045   let Inst{11-7} = op11_7;
1046   let Inst{6} = op6;
1047   let Inst{4} = op4;
1048 }
1049
1050 // NEON 2 vector register with immediate.
1051 class N2VImm<bit op24, bit op23, bits<6> op21_16, bits<4> op11_8, bit op7,
1052              bit op6, bit op4,
1053              dag oops, dag iops, string asm, string cstr, list<dag> pattern>
1054   : NDataI<oops, iops, asm, cstr, pattern> {
1055   let Inst{24} = op24;
1056   let Inst{23} = op23;
1057   let Inst{21-16} = op21_16;
1058   let Inst{11-8} = op11_8;
1059   let Inst{7} = op7;
1060   let Inst{6} = op6;
1061   let Inst{4} = op4;
1062 }
1063
1064 // NEON 3 vector register format.
1065 class N3V<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op6, bit op4,
1066           dag oops, dag iops, string asm, string cstr, list<dag> pattern>
1067   : NDataI<oops, iops, asm, cstr, pattern> {
1068   let Inst{24} = op24;
1069   let Inst{23} = op23;
1070   let Inst{21-20} = op21_20;
1071   let Inst{11-8} = op11_8;
1072   let Inst{6} = op6;
1073   let Inst{4} = op4;
1074 }
1075
1076 // NEON VMOVs between scalar and core registers.
1077 class NVLaneOp<bits<8> opcod1, bits<4> opcod2, bits<2> opcod3,
1078                dag oops, dag iops, Format f, string opc, string asm,
1079                list<dag> pattern>
1080   : AI<oops, iops, f, opc, asm, pattern> {
1081   let Inst{27-20} = opcod1;
1082   let Inst{11-8} = opcod2;
1083   let Inst{6-5} = opcod3;
1084   let Inst{4} = 1;
1085   list<Predicate> Predicates = [HasNEON];
1086 }
1087 class NVGetLane<bits<8> opcod1, bits<4> opcod2, bits<2> opcod3,
1088                 dag oops, dag iops, string opc, string asm, list<dag> pattern>
1089   : NVLaneOp<opcod1, opcod2, opcod3, oops, iops, NEONGetLnFrm, opc, asm,
1090              pattern>;
1091 class NVSetLane<bits<8> opcod1, bits<4> opcod2, bits<2> opcod3,
1092                 dag oops, dag iops, string opc, string asm, list<dag> pattern>
1093   : NVLaneOp<opcod1, opcod2, opcod3, oops, iops, NEONSetLnFrm, opc, asm,
1094              pattern>;
1095 class NVDup<bits<8> opcod1, bits<4> opcod2, bits<2> opcod3,
1096             dag oops, dag iops, string opc, string asm, list<dag> pattern>
1097   : NVLaneOp<opcod1, opcod2, opcod3, oops, iops, NEONDupFrm, opc, asm, pattern>;