9f0399ac8ccf2475eada4826251db7af892dfdad
[oota-llvm.git] / lib / Target / ARM / ARMInstrThumb2.td
1 //===- ARMInstrThumb2.td - Thumb2 support for ARM -------------------------===//
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 // This file describes the Thumb2 instruction set.
11 //
12 //===----------------------------------------------------------------------===//
13
14 // IT block predicate field
15 def it_pred : Operand<i32> {
16   let PrintMethod = "printMandatoryPredicateOperand";
17 }
18
19 // IT block condition mask
20 def it_mask : Operand<i32> {
21   let PrintMethod = "printThumbITMask";
22 }
23
24 // Shifted operands. No register controlled shifts for Thumb2.
25 // Note: We do not support rrx shifted operands yet.
26 def t2_so_reg : Operand<i32>,    // reg imm
27                 ComplexPattern<i32, 2, "SelectT2ShifterOperandReg",
28                                [shl,srl,sra,rotr]> {
29   let EncoderMethod = "getT2SORegOpValue";
30   let PrintMethod = "printT2SOOperand";
31   let MIOperandInfo = (ops rGPR, i32imm);
32 }
33
34 // t2_so_imm_not_XFORM - Return the complement of a t2_so_imm value
35 def t2_so_imm_not_XFORM : SDNodeXForm<imm, [{
36   return CurDAG->getTargetConstant(~((uint32_t)N->getZExtValue()), MVT::i32);
37 }]>;
38
39 // t2_so_imm_neg_XFORM - Return the negation of a t2_so_imm value
40 def t2_so_imm_neg_XFORM : SDNodeXForm<imm, [{
41   return CurDAG->getTargetConstant(-((int)N->getZExtValue()), MVT::i32);
42 }]>;
43
44 // t2_so_imm - Match a 32-bit immediate operand, which is an
45 // 8-bit immediate rotated by an arbitrary number of bits, or an 8-bit
46 // immediate splatted into multiple bytes of the word. t2_so_imm values are
47 // represented in the imm field in the same 12-bit form that they are encoded
48 // into t2_so_imm instructions: the 8-bit immediate is the least significant
49 // bits [bits 0-7], the 4-bit shift/splat amount is the next 4 bits [bits 8-11].
50 def t2_so_imm : Operand<i32>, PatLeaf<(imm), [{ return Pred_t2_so_imm(N); }]> {
51   let EncoderMethod = "getT2SOImmOpValue";
52 }
53
54 // t2_so_imm_not - Match an immediate that is a complement
55 // of a t2_so_imm.
56 def t2_so_imm_not : Operand<i32>,
57                     PatLeaf<(imm), [{
58   return ARM_AM::getT2SOImmVal(~((uint32_t)N->getZExtValue())) != -1;
59 }], t2_so_imm_not_XFORM>;
60
61 // t2_so_imm_neg - Match an immediate that is a negation of a t2_so_imm.
62 def t2_so_imm_neg : Operand<i32>,
63                     PatLeaf<(imm), [{
64   return ARM_AM::getT2SOImmVal(-((uint32_t)N->getZExtValue())) != -1;
65 }], t2_so_imm_neg_XFORM>;
66
67 // Break t2_so_imm's up into two pieces.  This handles immediates with up to 16
68 // bits set in them.  This uses t2_so_imm2part to match and t2_so_imm2part_[12]
69 // to get the first/second pieces.
70 def t2_so_imm2part : Operand<i32>,
71                   PatLeaf<(imm), [{
72       return ARM_AM::isT2SOImmTwoPartVal((unsigned)N->getZExtValue());
73     }]> {
74 }
75
76 def t2_so_imm2part_1 : SDNodeXForm<imm, [{
77   unsigned V = ARM_AM::getT2SOImmTwoPartFirst((unsigned)N->getZExtValue());
78   return CurDAG->getTargetConstant(V, MVT::i32);
79 }]>;
80
81 def t2_so_imm2part_2 : SDNodeXForm<imm, [{
82   unsigned V = ARM_AM::getT2SOImmTwoPartSecond((unsigned)N->getZExtValue());
83   return CurDAG->getTargetConstant(V, MVT::i32);
84 }]>;
85
86 def t2_so_neg_imm2part : Operand<i32>, PatLeaf<(imm), [{
87       return ARM_AM::isT2SOImmTwoPartVal(-(int)N->getZExtValue());
88     }]> {
89 }
90
91 def t2_so_neg_imm2part_1 : SDNodeXForm<imm, [{
92   unsigned V = ARM_AM::getT2SOImmTwoPartFirst(-(int)N->getZExtValue());
93   return CurDAG->getTargetConstant(V, MVT::i32);
94 }]>;
95
96 def t2_so_neg_imm2part_2 : SDNodeXForm<imm, [{
97   unsigned V = ARM_AM::getT2SOImmTwoPartSecond(-(int)N->getZExtValue());
98   return CurDAG->getTargetConstant(V, MVT::i32);
99 }]>;
100
101 /// imm1_31 predicate - True if the 32-bit immediate is in the range [1,31].
102 def imm1_31 : PatLeaf<(i32 imm), [{
103   return (int32_t)N->getZExtValue() >= 1 && (int32_t)N->getZExtValue() < 32;
104 }]>;
105
106 /// imm0_4095 predicate - True if the 32-bit immediate is in the range [0.4095].
107 def imm0_4095 : Operand<i32>,
108                 PatLeaf<(i32 imm), [{
109   return (uint32_t)N->getZExtValue() < 4096;
110 }]>;
111
112 def imm0_4095_neg : PatLeaf<(i32 imm), [{
113  return (uint32_t)(-N->getZExtValue()) < 4096;
114 }], imm_neg_XFORM>;
115
116 def imm0_255_neg : PatLeaf<(i32 imm), [{
117   return (uint32_t)(-N->getZExtValue()) < 255;
118 }], imm_neg_XFORM>;
119
120 def imm0_255_not : PatLeaf<(i32 imm), [{
121   return (uint32_t)(~N->getZExtValue()) < 255;
122 }], imm_comp_XFORM>;
123
124 // Define Thumb2 specific addressing modes.
125
126 // t2addrmode_imm12  := reg + imm12
127 def t2addrmode_imm12 : Operand<i32>,
128                        ComplexPattern<i32, 2, "SelectT2AddrModeImm12", []> {
129   let PrintMethod = "printAddrModeImm12Operand";
130   string EncoderMethod = "getT2AddrModeImm12OpValue";
131   let MIOperandInfo = (ops GPR:$base, i32imm:$offsimm);
132 }
133
134 // t2addrmode_imm8  := reg +/- imm8
135 def t2addrmode_imm8 : Operand<i32>,
136                       ComplexPattern<i32, 2, "SelectT2AddrModeImm8", []> {
137   let PrintMethod = "printT2AddrModeImm8Operand";
138   string EncoderMethod = "getT2AddrModeImm8OpValue";
139   let MIOperandInfo = (ops GPR:$base, i32imm:$offsimm);
140 }
141
142 def t2am_imm8_offset : Operand<i32>,
143                        ComplexPattern<i32, 1, "SelectT2AddrModeImm8Offset",
144                                       [], [SDNPWantRoot]> {
145   let PrintMethod = "printT2AddrModeImm8OffsetOperand";
146   string EncoderMethod = "getT2AddrModeImm8OffsetOpValue";
147 }
148
149 def t2am_imm12_offset : Operand<i32> {
150   string EncoderMethod = "getT2AddrModeImm12OffsetOpValue";
151 }
152
153
154 // t2addrmode_imm8s4  := reg +/- (imm8 << 2)
155 def t2addrmode_imm8s4 : Operand<i32> {
156   let PrintMethod = "printT2AddrModeImm8s4Operand";
157   let MIOperandInfo = (ops GPR:$base, i32imm:$offsimm);
158 }
159
160 def t2am_imm8s4_offset : Operand<i32> {
161   let PrintMethod = "printT2AddrModeImm8s4OffsetOperand";
162 }
163
164 // t2addrmode_so_reg  := reg + (reg << imm2)
165 def t2addrmode_so_reg : Operand<i32>,
166                         ComplexPattern<i32, 3, "SelectT2AddrModeSoReg", []> {
167   let PrintMethod = "printT2AddrModeSoRegOperand";
168   string EncoderMethod = "getT2AddrModeSORegOpValue";
169   let MIOperandInfo = (ops GPR:$base, rGPR:$offsreg, i32imm:$offsimm);
170 }
171
172
173 //===----------------------------------------------------------------------===//
174 // Multiclass helpers...
175 //
176
177
178 class T2OneRegImm<dag oops, dag iops, InstrItinClass itin,
179            string opc, string asm, list<dag> pattern>
180   : T2I<oops, iops, itin, opc, asm, pattern> {
181   bits<4> Rd;
182   bits<12> imm;
183
184   let Inst{11-8}  = Rd{3-0};
185   let Inst{26}    = imm{11};
186   let Inst{14-12} = imm{10-8};
187   let Inst{7-0}   = imm{7-0};
188 }
189
190
191 class T2sOneRegImm<dag oops, dag iops, InstrItinClass itin,
192            string opc, string asm, list<dag> pattern>
193   : T2sI<oops, iops, itin, opc, asm, pattern> {
194   bits<4> Rd;
195   bits<4> Rn;
196   bits<12> imm;
197
198   let Inst{11-8}  = Rd{3-0};
199   let Inst{26}    = imm{11};
200   let Inst{14-12} = imm{10-8};
201   let Inst{7-0}   = imm{7-0};
202 }
203
204 class T2OneRegCmpImm<dag oops, dag iops, InstrItinClass itin,
205            string opc, string asm, list<dag> pattern>
206   : T2I<oops, iops, itin, opc, asm, pattern> {
207   bits<4> Rn;
208   bits<12> imm;
209
210   let Inst{19-16}  = Rn{3-0};
211   let Inst{26}    = imm{11};
212   let Inst{14-12} = imm{10-8};
213   let Inst{7-0}   = imm{7-0};
214 }
215
216
217 class T2OneRegShiftedReg<dag oops, dag iops, InstrItinClass itin,
218            string opc, string asm, list<dag> pattern>
219   : T2I<oops, iops, itin, opc, asm, pattern> {
220   bits<4> Rd;
221   bits<12> ShiftedRm;
222
223   let Inst{11-8}  = Rd{3-0};
224   let Inst{3-0}   = ShiftedRm{3-0};
225   let Inst{5-4}   = ShiftedRm{6-5};
226   let Inst{14-12} = ShiftedRm{11-9};
227   let Inst{7-6}   = ShiftedRm{8-7};
228 }
229
230 class T2sOneRegShiftedReg<dag oops, dag iops, InstrItinClass itin,
231            string opc, string asm, list<dag> pattern>
232   : T2I<oops, iops, itin, opc, asm, pattern> {
233   bits<4> Rd;
234   bits<12> ShiftedRm;
235
236   let Inst{11-8}  = Rd{3-0};
237   let Inst{3-0}   = ShiftedRm{3-0};
238   let Inst{5-4}   = ShiftedRm{6-5};
239   let Inst{14-12} = ShiftedRm{11-9};
240   let Inst{7-6}   = ShiftedRm{8-7};
241 }
242
243 class T2OneRegCmpShiftedReg<dag oops, dag iops, InstrItinClass itin,
244            string opc, string asm, list<dag> pattern>
245   : T2I<oops, iops, itin, opc, asm, pattern> {
246   bits<4> Rn;
247   bits<12> ShiftedRm;
248
249   let Inst{19-16} = Rn{3-0};
250   let Inst{3-0}   = ShiftedRm{3-0};
251   let Inst{5-4}   = ShiftedRm{6-5};
252   let Inst{14-12} = ShiftedRm{11-9};
253   let Inst{7-6}   = ShiftedRm{8-7};
254 }
255
256 class T2TwoReg<dag oops, dag iops, InstrItinClass itin,
257            string opc, string asm, list<dag> pattern>
258   : T2I<oops, iops, itin, opc, asm, pattern> {
259   bits<4> Rd;
260   bits<4> Rm;
261
262   let Inst{11-8}  = Rd{3-0};
263   let Inst{3-0}   = Rm{3-0};
264 }
265
266 class T2sTwoReg<dag oops, dag iops, InstrItinClass itin,
267            string opc, string asm, list<dag> pattern>
268   : T2sI<oops, iops, itin, opc, asm, pattern> {
269   bits<4> Rd;
270   bits<4> Rm;
271
272   let Inst{11-8}  = Rd{3-0};
273   let Inst{3-0}   = Rm{3-0};
274 }
275
276 class T2TwoRegCmp<dag oops, dag iops, InstrItinClass itin,
277            string opc, string asm, list<dag> pattern>
278   : T2I<oops, iops, itin, opc, asm, pattern> {
279   bits<4> Rn;
280   bits<4> Rm;
281
282   let Inst{19-16} = Rn{3-0};
283   let Inst{3-0}   = Rm{3-0};
284 }
285
286
287 class T2TwoRegImm<dag oops, dag iops, InstrItinClass itin,
288            string opc, string asm, list<dag> pattern>
289   : T2I<oops, iops, itin, opc, asm, pattern> {
290   bits<4> Rd;
291   bits<4> Rm;
292
293   let Inst{11-8}  = Rd{3-0};
294   let Inst{3-0}   = Rm{3-0};
295 }
296
297 class T2sTwoRegImm<dag oops, dag iops, InstrItinClass itin,
298            string opc, string asm, list<dag> pattern>
299   : T2sI<oops, iops, itin, opc, asm, pattern> {
300   bits<4> Rd;
301   bits<4> Rn;
302   bits<12> imm;
303
304   let Inst{11-8}  = Rd{3-0};
305   let Inst{19-16} = Rn{3-0};
306   let Inst{26}    = imm{11};
307   let Inst{14-12} = imm{10-8};
308   let Inst{7-0}   = imm{7-0};
309 }
310
311 class T2TwoRegShiftImm<dag oops, dag iops, InstrItinClass itin,
312            string opc, string asm, list<dag> pattern>
313   : T2I<oops, iops, itin, opc, asm, pattern> {
314   bits<4> Rd;
315   bits<4> Rm;
316   bits<5> imm;
317
318   let Inst{11-8}  = Rd{3-0};
319   let Inst{3-0}   = Rm{3-0};
320   let Inst{14-12} = imm{4-2};
321   let Inst{7-6}   = imm{1-0};
322 }
323
324 class T2sTwoRegShiftImm<dag oops, dag iops, InstrItinClass itin,
325            string opc, string asm, list<dag> pattern>
326   : T2sI<oops, iops, itin, opc, asm, pattern> {
327   bits<4> Rd;
328   bits<4> Rm;
329   bits<5> imm;
330
331   let Inst{11-8}  = Rd{3-0};
332   let Inst{3-0}   = Rm{3-0};
333   let Inst{14-12} = imm{4-2};
334   let Inst{7-6}   = imm{1-0};
335 }
336
337 class T2ThreeReg<dag oops, dag iops, InstrItinClass itin,
338            string opc, string asm, list<dag> pattern>
339   : T2I<oops, iops, itin, opc, asm, pattern> {
340   bits<4> Rd;
341   bits<4> Rn;
342   bits<4> Rm;
343
344   let Inst{11-8}  = Rd{3-0};
345   let Inst{19-16} = Rn{3-0};
346   let Inst{3-0}   = Rm{3-0};
347 }
348
349 class T2sThreeReg<dag oops, dag iops, InstrItinClass itin,
350            string opc, string asm, list<dag> pattern>
351   : T2sI<oops, iops, itin, opc, asm, pattern> {
352   bits<4> Rd;
353   bits<4> Rn;
354   bits<4> Rm;
355
356   let Inst{11-8}  = Rd{3-0};
357   let Inst{19-16} = Rn{3-0};
358   let Inst{3-0}   = Rm{3-0};
359 }
360
361 class T2TwoRegShiftedReg<dag oops, dag iops, InstrItinClass itin,
362            string opc, string asm, list<dag> pattern>
363   : T2I<oops, iops, itin, opc, asm, pattern> {
364   bits<4> Rd;
365   bits<4> Rn;
366   bits<12> ShiftedRm;
367
368   let Inst{11-8}  = Rd{3-0};
369   let Inst{19-16} = Rn{3-0};
370   let Inst{3-0}   = ShiftedRm{3-0};
371   let Inst{5-4}   = ShiftedRm{6-5};
372   let Inst{14-12} = ShiftedRm{11-9};
373   let Inst{7-6}   = ShiftedRm{8-7};
374 }
375
376 class T2sTwoRegShiftedReg<dag oops, dag iops, InstrItinClass itin,
377            string opc, string asm, list<dag> pattern>
378   : T2sI<oops, iops, itin, opc, asm, pattern> {
379   bits<4> Rd;
380   bits<4> Rn;
381   bits<12> ShiftedRm;
382
383   let Inst{11-8}  = Rd{3-0};
384   let Inst{19-16} = Rn{3-0};
385   let Inst{3-0}   = ShiftedRm{3-0};
386   let Inst{5-4}   = ShiftedRm{6-5};
387   let Inst{14-12} = ShiftedRm{11-9};
388   let Inst{7-6}   = ShiftedRm{8-7};
389 }
390
391 class T2FourReg<dag oops, dag iops, InstrItinClass itin,
392            string opc, string asm, list<dag> pattern>
393   : T2I<oops, iops, itin, opc, asm, pattern> {
394   bits<4> Rd;
395   bits<4> Rn;
396   bits<4> Rm;
397   bits<4> Ra;
398
399   let Inst{11-8}  = Rd{3-0};
400   let Inst{19-16} = Rn{3-0};
401   let Inst{3-0}   = Rm{3-0};
402   let Inst{15-12} = Ra{3-0};
403 }
404
405
406 /// T2I_un_irs - Defines a set of (op reg, {so_imm|r|so_reg}) patterns for a
407 /// unary operation that produces a value. These are predicable and can be
408 /// changed to modify CPSR.
409 multiclass T2I_un_irs<bits<4> opcod, string opc,
410                      InstrItinClass iii, InstrItinClass iir, InstrItinClass iis,
411                       PatFrag opnode, bit Cheap = 0, bit ReMat = 0> {
412    // shifted imm
413    def i : T2sOneRegImm<(outs rGPR:$Rd), (ins t2_so_imm:$imm), iii,
414                 opc, "\t$Rd, $imm",
415                 [(set rGPR:$Rd, (opnode t2_so_imm:$imm))]> {
416      let isAsCheapAsAMove = Cheap;
417      let isReMaterializable = ReMat;
418      let Inst{31-27} = 0b11110;
419      let Inst{25} = 0;
420      let Inst{24-21} = opcod;
421      let Inst{20} = ?; // The S bit.
422      let Inst{19-16} = 0b1111; // Rn
423      let Inst{15} = 0;
424    }
425    // register
426    def r : T2sTwoReg<(outs rGPR:$Rd), (ins rGPR:$Rm), iir,
427                 opc, ".w\t$Rd, $Rm",
428                 [(set rGPR:$Rd, (opnode rGPR:$Rm))]> {
429      let Inst{31-27} = 0b11101;
430      let Inst{26-25} = 0b01;
431      let Inst{24-21} = opcod;
432      let Inst{20} = ?; // The S bit.
433      let Inst{19-16} = 0b1111; // Rn
434      let Inst{14-12} = 0b000; // imm3
435      let Inst{7-6} = 0b00; // imm2
436      let Inst{5-4} = 0b00; // type
437    }
438    // shifted register
439    def s : T2sOneRegShiftedReg<(outs rGPR:$Rd), (ins t2_so_reg:$ShiftedRm), iis,
440                 opc, ".w\t$Rd, $ShiftedRm",
441                 [(set rGPR:$Rd, (opnode t2_so_reg:$ShiftedRm))]> {
442      let Inst{31-27} = 0b11101;
443      let Inst{26-25} = 0b01;
444      let Inst{24-21} = opcod;
445      let Inst{20} = ?; // The S bit.
446      let Inst{19-16} = 0b1111; // Rn
447    }
448 }
449
450 /// T2I_bin_irs - Defines a set of (op reg, {so_imm|r|so_reg}) patterns for a
451 /// binary operation that produces a value. These are predicable and can be
452 /// changed to modify CPSR.
453 multiclass T2I_bin_irs<bits<4> opcod, string opc,
454                      InstrItinClass iii, InstrItinClass iir, InstrItinClass iis,
455                        PatFrag opnode, bit Commutable = 0, string wide = ""> {
456    // shifted imm
457    def ri : T2sTwoRegImm<
458                 (outs rGPR:$Rd), (ins rGPR:$Rn, t2_so_imm:$imm), iii,
459                  opc, "\t$Rd, $Rn, $imm",
460                  [(set rGPR:$Rd, (opnode rGPR:$Rn, t2_so_imm:$imm))]> {
461      let Inst{31-27} = 0b11110;
462      let Inst{25} = 0;
463      let Inst{24-21} = opcod;
464      let Inst{20} = ?; // The S bit.
465      let Inst{15} = 0;
466    }
467    // register
468    def rr : T2sThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), iir,
469                  opc, !strconcat(wide, "\t$Rd, $Rn, $Rm"),
470                  [(set rGPR:$Rd, (opnode rGPR:$Rn, rGPR:$Rm))]> {
471      let isCommutable = Commutable;
472      let Inst{31-27} = 0b11101;
473      let Inst{26-25} = 0b01;
474      let Inst{24-21} = opcod;
475      let Inst{20} = ?; // The S bit.
476      let Inst{14-12} = 0b000; // imm3
477      let Inst{7-6} = 0b00; // imm2
478      let Inst{5-4} = 0b00; // type
479    }
480    // shifted register
481    def rs : T2sTwoRegShiftedReg<
482                  (outs rGPR:$Rd), (ins rGPR:$Rn, t2_so_reg:$ShiftedRm), iis,
483                  opc, !strconcat(wide, "\t$Rd, $Rn, $ShiftedRm"),
484                  [(set rGPR:$Rd, (opnode rGPR:$Rn, t2_so_reg:$ShiftedRm))]> {
485      let Inst{31-27} = 0b11101;
486      let Inst{26-25} = 0b01;
487      let Inst{24-21} = opcod;
488      let Inst{20} = ?; // The S bit.
489    }
490 }
491
492 /// T2I_bin_w_irs - Same as T2I_bin_irs except these operations need
493 //  the ".w" prefix to indicate that they are wide.
494 multiclass T2I_bin_w_irs<bits<4> opcod, string opc,
495                      InstrItinClass iii, InstrItinClass iir, InstrItinClass iis,
496                          PatFrag opnode, bit Commutable = 0> :
497     T2I_bin_irs<opcod, opc, iii, iir, iis, opnode, Commutable, ".w">;
498
499 /// T2I_rbin_is - Same as T2I_bin_irs except the order of operands are
500 /// reversed.  The 'rr' form is only defined for the disassembler; for codegen
501 /// it is equivalent to the T2I_bin_irs counterpart.
502 multiclass T2I_rbin_irs<bits<4> opcod, string opc, PatFrag opnode> {
503    // shifted imm
504    def ri : T2sTwoRegImm<
505                  (outs rGPR:$Rd), (ins rGPR:$Rn, t2_so_imm:$imm), IIC_iALUi,
506                  opc, ".w\t$Rd, $Rn, $imm",
507                  [(set rGPR:$Rd, (opnode t2_so_imm:$imm, rGPR:$Rn))]> {
508      let Inst{31-27} = 0b11110;
509      let Inst{25} = 0;
510      let Inst{24-21} = opcod;
511      let Inst{20} = ?; // The S bit.
512      let Inst{15} = 0;
513    }
514    // register
515    def rr : T2sThreeReg<
516                  (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iALUr,
517                  opc, "\t$Rd, $Rn, $Rm",
518                  [/* For disassembly only; pattern left blank */]> {
519      let Inst{31-27} = 0b11101;
520      let Inst{26-25} = 0b01;
521      let Inst{24-21} = opcod;
522      let Inst{20} = ?; // The S bit.
523      let Inst{14-12} = 0b000; // imm3
524      let Inst{7-6} = 0b00; // imm2
525      let Inst{5-4} = 0b00; // type
526    }
527    // shifted register
528    def rs : T2sTwoRegShiftedReg<
529                  (outs rGPR:$Rd), (ins rGPR:$Rn, t2_so_reg:$ShiftedRm),
530                  IIC_iALUsir, opc, "\t$Rd, $Rn, $ShiftedRm",
531                  [(set rGPR:$Rd, (opnode t2_so_reg:$ShiftedRm, rGPR:$Rn))]> {
532      let Inst{31-27} = 0b11101;
533      let Inst{26-25} = 0b01;
534      let Inst{24-21} = opcod;
535      let Inst{20} = ?; // The S bit.
536    }
537 }
538
539 /// T2I_bin_s_irs - Similar to T2I_bin_irs except it sets the 's' bit so the
540 /// instruction modifies the CPSR register.
541 let Defs = [CPSR] in {
542 multiclass T2I_bin_s_irs<bits<4> opcod, string opc,
543                      InstrItinClass iii, InstrItinClass iir, InstrItinClass iis,
544                          PatFrag opnode, bit Commutable = 0> {
545    // shifted imm
546    def ri : T2TwoRegImm<
547                 (outs rGPR:$Rd), (ins GPR:$Rn, t2_so_imm:$imm), iii,
548                 !strconcat(opc, "s"), ".w\t$Rd, $Rn, $imm",
549                 [(set rGPR:$Rd, (opnode GPR:$Rn, t2_so_imm:$imm))]> {
550      let Inst{31-27} = 0b11110;
551      let Inst{25} = 0;
552      let Inst{24-21} = opcod;
553      let Inst{20} = 1; // The S bit.
554      let Inst{15} = 0;
555    }
556    // register
557    def rr : T2ThreeReg<
558                 (outs rGPR:$Rd), (ins GPR:$Rn, rGPR:$Rm), iir,
559                 !strconcat(opc, "s"), ".w\t$Rd, $Rn, $Rm",
560                 [(set rGPR:$Rd, (opnode GPR:$Rn, rGPR:$Rm))]> {
561      let isCommutable = Commutable;
562      let Inst{31-27} = 0b11101;
563      let Inst{26-25} = 0b01;
564      let Inst{24-21} = opcod;
565      let Inst{20} = 1; // The S bit.
566      let Inst{14-12} = 0b000; // imm3
567      let Inst{7-6} = 0b00; // imm2
568      let Inst{5-4} = 0b00; // type
569    }
570    // shifted register
571    def rs : T2TwoRegShiftedReg<
572                 (outs rGPR:$Rd), (ins GPR:$Rn, t2_so_reg:$ShiftedRm), iis,
573                 !strconcat(opc, "s"), ".w\t$Rd, $Rn, $ShiftedRm",
574                 [(set rGPR:$Rd, (opnode GPR:$Rn, t2_so_reg:$ShiftedRm))]> {
575      let Inst{31-27} = 0b11101;
576      let Inst{26-25} = 0b01;
577      let Inst{24-21} = opcod;
578      let Inst{20} = 1; // The S bit.
579    }
580 }
581 }
582
583 /// T2I_bin_ii12rs - Defines a set of (op reg, {so_imm|imm0_4095|r|so_reg})
584 /// patterns for a binary operation that produces a value.
585 multiclass T2I_bin_ii12rs<bits<3> op23_21, string opc, PatFrag opnode,
586                           bit Commutable = 0> {
587    // shifted imm
588    // The register-immediate version is re-materializable. This is useful
589    // in particular for taking the address of a local.
590    let isReMaterializable = 1 in {
591    def ri : T2sTwoRegImm<
592                  (outs rGPR:$Rd), (ins GPR:$Rn, t2_so_imm:$imm), IIC_iALUi,
593                  opc, ".w\t$Rd, $Rn, $imm",
594                  [(set rGPR:$Rd, (opnode GPR:$Rn, t2_so_imm:$imm))]> {
595      let Inst{31-27} = 0b11110;
596      let Inst{25} = 0;
597      let Inst{24} = 1;
598      let Inst{23-21} = op23_21;
599      let Inst{20} = 0; // The S bit.
600      let Inst{15} = 0;
601    }
602    }
603    // 12-bit imm
604    def ri12 : T2TwoRegImm<
605                   (outs rGPR:$Rd), (ins GPR:$Rn, imm0_4095:$imm), IIC_iALUi,
606                   !strconcat(opc, "w"), "\t$Rd, $Rn, $imm",
607                   [(set rGPR:$Rd, (opnode GPR:$Rn, imm0_4095:$imm))]> {
608      let Inst{31-27} = 0b11110;
609      let Inst{25} = 1;
610      let Inst{24} = 0;
611      let Inst{23-21} = op23_21;
612      let Inst{20} = 0; // The S bit.
613      let Inst{15} = 0;
614    }
615    // register
616    def rr : T2sThreeReg<(outs rGPR:$Rd), (ins GPR:$Rn, rGPR:$Rm), IIC_iALUr,
617                  opc, ".w\t$Rd, $Rn, $Rm",
618                  [(set rGPR:$Rd, (opnode GPR:$Rn, rGPR:$Rm))]> {
619      let isCommutable = Commutable;
620      let Inst{31-27} = 0b11101;
621      let Inst{26-25} = 0b01;
622      let Inst{24} = 1;
623      let Inst{23-21} = op23_21;
624      let Inst{20} = 0; // The S bit.
625      let Inst{14-12} = 0b000; // imm3
626      let Inst{7-6} = 0b00; // imm2
627      let Inst{5-4} = 0b00; // type
628    }
629    // shifted register
630    def rs : T2sTwoRegShiftedReg<
631                  (outs rGPR:$Rd), (ins GPR:$Rn, t2_so_reg:$ShiftedRm),
632                  IIC_iALUsi, opc, ".w\t$Rd, $Rn, $ShiftedRm",
633                  [(set rGPR:$Rd, (opnode GPR:$Rn, t2_so_reg:$ShiftedRm))]> {
634      let Inst{31-27} = 0b11101;
635      let Inst{26-25} = 0b01;
636      let Inst{24} = 1;
637      let Inst{23-21} = op23_21;
638      let Inst{20} = 0; // The S bit.
639    }
640 }
641
642 /// T2I_adde_sube_irs - Defines a set of (op reg, {so_imm|r|so_reg}) patterns
643 /// for a binary operation that produces a value and use the carry
644 /// bit. It's not predicable.
645 let Uses = [CPSR] in {
646 multiclass T2I_adde_sube_irs<bits<4> opcod, string opc, PatFrag opnode,
647                              bit Commutable = 0> {
648    // shifted imm
649    def ri : T2sTwoRegImm<(outs rGPR:$Rd), (ins rGPR:$Rn, t2_so_imm:$imm),
650                  IIC_iALUi, opc, "\t$Rd, $Rn, $imm",
651                  [(set rGPR:$Rd, (opnode rGPR:$Rn, t2_so_imm:$imm))]>,
652                  Requires<[IsThumb2]> {
653      let Inst{31-27} = 0b11110;
654      let Inst{25} = 0;
655      let Inst{24-21} = opcod;
656      let Inst{20} = 0; // The S bit.
657      let Inst{15} = 0;
658    }
659    // register
660    def rr : T2sThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iALUr,
661                  opc, ".w\t$Rd, $Rn, $Rm",
662                  [(set rGPR:$Rd, (opnode rGPR:$Rn, rGPR:$Rm))]>,
663                  Requires<[IsThumb2]> {
664      let isCommutable = Commutable;
665      let Inst{31-27} = 0b11101;
666      let Inst{26-25} = 0b01;
667      let Inst{24-21} = opcod;
668      let Inst{20} = 0; // The S bit.
669      let Inst{14-12} = 0b000; // imm3
670      let Inst{7-6} = 0b00; // imm2
671      let Inst{5-4} = 0b00; // type
672    }
673    // shifted register
674    def rs : T2sTwoRegShiftedReg<
675                  (outs rGPR:$Rd), (ins rGPR:$Rn, t2_so_reg:$ShiftedRm),
676                  IIC_iALUsi, opc, ".w\t$Rd, $Rn, $ShiftedRm",
677                  [(set rGPR:$Rd, (opnode rGPR:$Rn, t2_so_reg:$ShiftedRm))]>,
678                  Requires<[IsThumb2]> {
679      let Inst{31-27} = 0b11101;
680      let Inst{26-25} = 0b01;
681      let Inst{24-21} = opcod;
682      let Inst{20} = 0; // The S bit.
683    }
684 }
685
686 // Carry setting variants
687 let Defs = [CPSR] in {
688 multiclass T2I_adde_sube_s_irs<bits<4> opcod, string opc, PatFrag opnode,
689                                bit Commutable = 0> {
690    // shifted imm
691    def ri : T2sTwoRegImm<
692                  (outs rGPR:$Rd), (ins rGPR:$Rn, t2_so_imm:$imm), IIC_iALUi,
693                  opc, "\t$Rd, $Rn, $imm",
694                  [(set rGPR:$Rd, (opnode rGPR:$Rn, t2_so_imm:$imm))]>,
695                  Requires<[IsThumb2]> {
696      let Inst{31-27} = 0b11110;
697      let Inst{25} = 0;
698      let Inst{24-21} = opcod;
699      let Inst{20} = 1; // The S bit.
700      let Inst{15} = 0;
701    }
702    // register
703    def rr : T2sThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iALUr,
704                  opc, ".w\t$Rd, $Rn, $Rm",
705                  [(set rGPR:$Rd, (opnode rGPR:$Rn, rGPR:$Rm))]>,
706                  Requires<[IsThumb2]> {
707      let isCommutable = Commutable;
708      let Inst{31-27} = 0b11101;
709      let Inst{26-25} = 0b01;
710      let Inst{24-21} = opcod;
711      let Inst{20} = 1; // The S bit.
712      let Inst{14-12} = 0b000; // imm3
713      let Inst{7-6} = 0b00; // imm2
714      let Inst{5-4} = 0b00; // type
715    }
716    // shifted register
717    def rs : T2sTwoRegShiftedReg<
718                  (outs rGPR:$Rd), (ins rGPR:$Rn, t2_so_reg:$ShiftedRm),
719                  IIC_iALUsi, opc, ".w\t$Rd, $Rn, $ShiftedRm",
720                  [(set rGPR:$Rd, (opnode rGPR:$Rn, t2_so_reg:$ShiftedRm))]>,
721                  Requires<[IsThumb2]> {
722      let Inst{31-27} = 0b11101;
723      let Inst{26-25} = 0b01;
724      let Inst{24-21} = opcod;
725      let Inst{20} = 1; // The S bit.
726    }
727 }
728 }
729 }
730
731 /// T2I_rbin_s_is - Same as T2I_rbin_irs except sets 's' bit and the register
732 /// version is not needed since this is only for codegen.
733 let Defs = [CPSR] in {
734 multiclass T2I_rbin_s_is<bits<4> opcod, string opc, PatFrag opnode> {
735    // shifted imm
736    def ri : T2TwoRegImm<
737                 (outs rGPR:$Rd), (ins rGPR:$Rn, t2_so_imm:$imm), IIC_iALUi,
738                 !strconcat(opc, "s"), ".w\t$Rd, $Rn, $imm",
739                 [(set rGPR:$Rd, (opnode t2_so_imm:$imm, rGPR:$Rn))]> {
740      let Inst{31-27} = 0b11110;
741      let Inst{25} = 0;
742      let Inst{24-21} = opcod;
743      let Inst{20} = 1; // The S bit.
744      let Inst{15} = 0;
745    }
746    // shifted register
747    def rs : T2TwoRegShiftedReg<
748                 (outs rGPR:$Rd), (ins rGPR:$Rn, t2_so_reg:$ShiftedRm),
749                 IIC_iALUsi, !strconcat(opc, "s"), "\t$Rd, $Rn, $ShiftedRm",
750                 [(set rGPR:$Rd, (opnode t2_so_reg:$ShiftedRm, rGPR:$Rn))]> {
751      let Inst{31-27} = 0b11101;
752      let Inst{26-25} = 0b01;
753      let Inst{24-21} = opcod;
754      let Inst{20} = 1; // The S bit.
755    }
756 }
757 }
758
759 /// T2I_sh_ir - Defines a set of (op reg, {so_imm|r}) patterns for a shift /
760 //  rotate operation that produces a value.
761 multiclass T2I_sh_ir<bits<2> opcod, string opc, PatFrag opnode> {
762    // 5-bit imm
763    def ri : T2sTwoRegShiftImm<
764                  (outs rGPR:$Rd), (ins rGPR:$Rm, i32imm:$imm), IIC_iMOVsi,
765                  opc, ".w\t$Rd, $Rm, $imm",
766                  [(set rGPR:$Rd, (opnode rGPR:$Rm, imm1_31:$imm))]> {
767      let Inst{31-27} = 0b11101;
768      let Inst{26-21} = 0b010010;
769      let Inst{19-16} = 0b1111; // Rn
770      let Inst{5-4} = opcod;
771    }
772    // register
773    def rr : T2sThreeReg<
774                  (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iMOVsr,
775                  opc, ".w\t$Rd, $Rn, $Rm",
776                  [(set rGPR:$Rd, (opnode rGPR:$Rn, rGPR:$Rm))]> {
777      let Inst{31-27} = 0b11111;
778      let Inst{26-23} = 0b0100;
779      let Inst{22-21} = opcod;
780      let Inst{15-12} = 0b1111;
781      let Inst{7-4} = 0b0000;
782    }
783 }
784
785 /// T2I_cmp_irs - Defines a set of (op r, {so_imm|r|so_reg}) cmp / test
786 /// patterns. Similar to T2I_bin_irs except the instruction does not produce
787 /// a explicit result, only implicitly set CPSR.
788 let isCompare = 1, Defs = [CPSR] in {
789 multiclass T2I_cmp_irs<bits<4> opcod, string opc,
790                      InstrItinClass iii, InstrItinClass iir, InstrItinClass iis,
791                        PatFrag opnode> {
792    // shifted imm
793    def ri : T2OneRegCmpImm<
794                 (outs), (ins GPR:$Rn, t2_so_imm:$imm), iii,
795                 opc, ".w\t$Rn, $imm",
796                 [(opnode GPR:$Rn, t2_so_imm:$imm)]> {
797      let Inst{31-27} = 0b11110;
798      let Inst{25} = 0;
799      let Inst{24-21} = opcod;
800      let Inst{20} = 1; // The S bit.
801      let Inst{15} = 0;
802      let Inst{11-8} = 0b1111; // Rd
803    }
804    // register
805    def rr : T2TwoRegCmp<
806                 (outs), (ins GPR:$lhs, rGPR:$rhs), iir,
807                 opc, ".w\t$lhs, $rhs",
808                 [(opnode GPR:$lhs, rGPR:$rhs)]> {
809      let Inst{31-27} = 0b11101;
810      let Inst{26-25} = 0b01;
811      let Inst{24-21} = opcod;
812      let Inst{20} = 1; // The S bit.
813      let Inst{14-12} = 0b000; // imm3
814      let Inst{11-8} = 0b1111; // Rd
815      let Inst{7-6} = 0b00; // imm2
816      let Inst{5-4} = 0b00; // type
817    }
818    // shifted register
819    def rs : T2OneRegCmpShiftedReg<
820                 (outs), (ins GPR:$Rn, t2_so_reg:$ShiftedRm), iis,
821                 opc, ".w\t$Rn, $ShiftedRm",
822                 [(opnode GPR:$Rn, t2_so_reg:$ShiftedRm)]> {
823      let Inst{31-27} = 0b11101;
824      let Inst{26-25} = 0b01;
825      let Inst{24-21} = opcod;
826      let Inst{20} = 1; // The S bit.
827      let Inst{11-8} = 0b1111; // Rd
828    }
829 }
830 }
831
832 /// T2I_ld - Defines a set of (op r, {imm12|imm8|so_reg}) load patterns.
833 multiclass T2I_ld<bit signed, bits<2> opcod, string opc,
834                   InstrItinClass iii, InstrItinClass iis, PatFrag opnode> {
835   def i12 : T2Ii12<(outs GPR:$Rt), (ins t2addrmode_imm12:$addr), iii,
836                    opc, ".w\t$Rt, $addr",
837                    [(set GPR:$Rt, (opnode t2addrmode_imm12:$addr))]> {
838     let Inst{31-27} = 0b11111;
839     let Inst{26-25} = 0b00;
840     let Inst{24} = signed;
841     let Inst{23} = 1;
842     let Inst{22-21} = opcod;
843     let Inst{20} = 1; // load
844     
845     bits<4> Rt;
846     let Inst{15-12} = Rt{3-0};
847     
848     bits<16> addr;
849     let Inst{19-16} = addr{15-12}; // Rn
850     let Inst{11-0}   = addr{11-0};  // imm
851   }
852   def i8  : T2Ii8 <(outs GPR:$Rt), (ins t2addrmode_imm8:$addr), iii,
853                    opc, "\t$Rt, $addr",
854                    [(set GPR:$Rt, (opnode t2addrmode_imm8:$addr))]> {
855     let Inst{31-27} = 0b11111;
856     let Inst{26-25} = 0b00;
857     let Inst{24} = signed;
858     let Inst{23} = 0;
859     let Inst{22-21} = opcod;
860     let Inst{20} = 1; // load
861     let Inst{11} = 1;
862     // Offset: index==TRUE, wback==FALSE
863     let Inst{10} = 1; // The P bit.
864     let Inst{8} = 0; // The W bit.
865     
866     bits<4> Rt;
867     let Inst{15-12} = Rt{3-0};
868     
869     bits<13> addr;
870     let Inst{19-16} = addr{12-9}; // Rn
871     let Inst{9}     = addr{8};    // U
872     let Inst{7-0}   = addr{7-0};  // imm
873   }
874   def s   : T2Iso <(outs GPR:$Rt), (ins t2addrmode_so_reg:$addr), iis,
875                    opc, ".w\t$Rt, $addr",
876                    [(set GPR:$Rt, (opnode t2addrmode_so_reg:$addr))]> {
877     let Inst{31-27} = 0b11111;
878     let Inst{26-25} = 0b00;
879     let Inst{24} = signed;
880     let Inst{23} = 0;
881     let Inst{22-21} = opcod;
882     let Inst{20} = 1; // load
883     let Inst{11-6} = 0b000000;
884     
885     bits<4> Rt;
886     let Inst{15-12} = Rt{3-0};
887     
888     bits<10> addr;
889     let Inst{19-16} = addr{9-6}; // Rn
890     let Inst{3-0}   = addr{5-2}; // Rm
891     let Inst{5-4}   = addr{1-0}; // imm
892   }
893
894   // FIXME: Is the pci variant actually needed?
895   def pci : T2Ipc <(outs GPR:$Rt), (ins i32imm:$addr), iii,
896                    opc, ".w\t$Rt, $addr",
897                    [(set GPR:$Rt, (opnode (ARMWrapper tconstpool:$addr)))]> {
898     let isReMaterializable = 1;
899     let Inst{31-27} = 0b11111;
900     let Inst{26-25} = 0b00;
901     let Inst{24} = signed;
902     let Inst{23} = ?; // add = (U == '1')
903     let Inst{22-21} = opcod;
904     let Inst{20} = 1; // load
905     let Inst{19-16} = 0b1111; // Rn
906     
907     bits<4> Rt;
908     bits<12> addr;
909     let Inst{15-12} = Rt{3-0};
910     let Inst{11-0}  = addr{11-0};
911   }
912 }
913
914 /// T2I_st - Defines a set of (op r, {imm12|imm8|so_reg}) store patterns.
915 multiclass T2I_st<bits<2> opcod, string opc,
916                   InstrItinClass iii, InstrItinClass iis, PatFrag opnode> {
917   def i12 : T2Ii12<(outs), (ins GPR:$Rt, t2addrmode_imm12:$addr), iii,
918                    opc, ".w\t$Rt, $addr",
919                    [(opnode GPR:$Rt, t2addrmode_imm12:$addr)]> {
920     let Inst{31-27} = 0b11111;
921     let Inst{26-23} = 0b0001;
922     let Inst{22-21} = opcod;
923     let Inst{20} = 0; // !load
924     
925     bits<4> Rt;
926     let Inst{15-12} = Rt{3-0};
927     
928     bits<16> addr;
929     let Inst{19-16} = addr{15-12}; // Rn
930     let Inst{11-0}   = addr{11-0};  // imm
931   }
932   def i8  : T2Ii8 <(outs), (ins GPR:$Rt, t2addrmode_imm8:$addr), iii,
933                    opc, "\t$Rt, $addr",
934                    [(opnode GPR:$Rt, t2addrmode_imm8:$addr)]> {
935     let Inst{31-27} = 0b11111;
936     let Inst{26-23} = 0b0000;
937     let Inst{22-21} = opcod;
938     let Inst{20} = 0; // !load
939     let Inst{11} = 1;
940     // Offset: index==TRUE, wback==FALSE
941     let Inst{10} = 1; // The P bit.
942     let Inst{8} = 0; // The W bit.
943     
944     bits<4> Rt;
945     let Inst{15-12} = Rt{3-0};
946     
947     bits<13> addr;
948     let Inst{19-16} = addr{12-9}; // Rn
949     let Inst{9}     = addr{8};    // U
950     let Inst{7-0}   = addr{7-0};  // imm
951   }
952   def s   : T2Iso <(outs), (ins GPR:$Rt, t2addrmode_so_reg:$addr), iis,
953                    opc, ".w\t$Rt, $addr",
954                    [(opnode GPR:$Rt, t2addrmode_so_reg:$addr)]> {
955     let Inst{31-27} = 0b11111;
956     let Inst{26-23} = 0b0000;
957     let Inst{22-21} = opcod;
958     let Inst{20} = 0; // !load
959     let Inst{11-6} = 0b000000;
960     
961     bits<4> Rt;
962     let Inst{15-12} = Rt{3-0};
963     
964     bits<10> addr;
965     let Inst{19-16}   = addr{9-6}; // Rn
966     let Inst{3-0} = addr{5-2}; // Rm
967     let Inst{5-4}   = addr{1-0}; // imm
968   }
969 }
970
971 /// T2I_ext_rrot - A unary operation with two forms: one whose operand is a
972 /// register and one whose operand is a register rotated by 8/16/24.
973 multiclass T2I_ext_rrot<bits<3> opcod, string opc, PatFrag opnode> {
974   def r     : T2TwoReg<(outs rGPR:$Rd), (ins rGPR:$Rm), IIC_iEXTr,
975                   opc, ".w\t$Rd, $Rm",
976                  [(set rGPR:$Rd, (opnode rGPR:$Rm))]> {
977      let Inst{31-27} = 0b11111;
978      let Inst{26-23} = 0b0100;
979      let Inst{22-20} = opcod;
980      let Inst{19-16} = 0b1111; // Rn
981      let Inst{15-12} = 0b1111;
982      let Inst{7} = 1;
983      let Inst{5-4} = 0b00; // rotate
984    }
985   def r_rot : T2TwoReg<(outs rGPR:$Rd), (ins rGPR:$Rm, i32imm:$rot), IIC_iEXTr,
986                   opc, ".w\t$Rd, $Rm, ror $rot",
987                  [(set rGPR:$Rd, (opnode (rotr rGPR:$Rm, rot_imm:$rot)))]> {
988      let Inst{31-27} = 0b11111;
989      let Inst{26-23} = 0b0100;
990      let Inst{22-20} = opcod;
991      let Inst{19-16} = 0b1111; // Rn
992      let Inst{15-12} = 0b1111;
993      let Inst{7} = 1;
994
995      bits<2> rot;
996      let Inst{5-4} = rot{1-0}; // rotate
997    }
998 }
999
1000 // UXTB16 - Requres T2ExtractPack, does not need the .w qualifier.
1001 multiclass T2I_ext_rrot_uxtb16<bits<3> opcod, string opc, PatFrag opnode> {
1002   def r     : T2TwoReg<(outs rGPR:$Rd), (ins rGPR:$Rm), IIC_iEXTr,
1003                   opc, "\t$Rd, $Rm",
1004                  [(set rGPR:$Rd, (opnode rGPR:$Rm))]>,
1005                  Requires<[HasT2ExtractPack, IsThumb2]> {
1006      let Inst{31-27} = 0b11111;
1007      let Inst{26-23} = 0b0100;
1008      let Inst{22-20} = opcod;
1009      let Inst{19-16} = 0b1111; // Rn
1010      let Inst{15-12} = 0b1111;
1011      let Inst{7} = 1;
1012      let Inst{5-4} = 0b00; // rotate
1013    }
1014   def r_rot : T2TwoReg<(outs rGPR:$dst), (ins rGPR:$Rm, i32imm:$rot), IIC_iEXTr,
1015                   opc, "\t$dst, $Rm, ror $rot",
1016                  [(set rGPR:$dst, (opnode (rotr rGPR:$Rm, rot_imm:$rot)))]>,
1017                  Requires<[HasT2ExtractPack, IsThumb2]> {
1018      let Inst{31-27} = 0b11111;
1019      let Inst{26-23} = 0b0100;
1020      let Inst{22-20} = opcod;
1021      let Inst{19-16} = 0b1111; // Rn
1022      let Inst{15-12} = 0b1111;
1023      let Inst{7} = 1;
1024
1025      bits<2> rot;
1026      let Inst{5-4} = rot{1-0}; // rotate
1027    }
1028 }
1029
1030 // SXTB16 - Requres T2ExtractPack, does not need the .w qualifier, no pattern
1031 // supported yet.
1032 multiclass T2I_ext_rrot_sxtb16<bits<3> opcod, string opc> {
1033   def r     : T2TwoReg<(outs rGPR:$Rd), (ins rGPR:$Rm), IIC_iEXTr,
1034                   opc, "\t$Rd, $Rm", []> {
1035      let Inst{31-27} = 0b11111;
1036      let Inst{26-23} = 0b0100;
1037      let Inst{22-20} = opcod;
1038      let Inst{19-16} = 0b1111; // Rn
1039      let Inst{15-12} = 0b1111;
1040      let Inst{7} = 1;
1041      let Inst{5-4} = 0b00; // rotate
1042    }
1043   def r_rot : T2TwoReg<(outs rGPR:$Rd), (ins rGPR:$Rm, i32imm:$rot), IIC_iEXTr,
1044                   opc, "\t$Rd, $Rm, ror $rot", []> {
1045      let Inst{31-27} = 0b11111;
1046      let Inst{26-23} = 0b0100;
1047      let Inst{22-20} = opcod;
1048      let Inst{19-16} = 0b1111; // Rn
1049      let Inst{15-12} = 0b1111;
1050      let Inst{7} = 1;
1051
1052       bits<2> rot;
1053       let Inst{5-4} = rot{1-0}; // rotate
1054    }
1055 }
1056
1057 /// T2I_exta_rrot - A binary operation with two forms: one whose operand is a
1058 /// register and one whose operand is a register rotated by 8/16/24.
1059 multiclass T2I_exta_rrot<bits<3> opcod, string opc, PatFrag opnode> {
1060   def rr     : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iEXTAr,
1061                   opc, "\t$Rd, $Rn, $Rm",
1062                   [(set rGPR:$Rd, (opnode rGPR:$Rn, rGPR:$Rm))]>,
1063                   Requires<[HasT2ExtractPack, IsThumb2]> {
1064      let Inst{31-27} = 0b11111;
1065      let Inst{26-23} = 0b0100;
1066      let Inst{22-20} = opcod;
1067      let Inst{15-12} = 0b1111;
1068      let Inst{7} = 1;
1069      let Inst{5-4} = 0b00; // rotate
1070    }
1071   def rr_rot : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, i32imm:$rot),
1072                   IIC_iEXTAsr, opc, "\t$Rd, $Rn, $Rm, ror $rot",
1073                   [(set rGPR:$Rd, (opnode rGPR:$Rn,
1074                                           (rotr rGPR:$Rm, rot_imm:$rot)))]>,
1075                   Requires<[HasT2ExtractPack, IsThumb2]> {
1076      let Inst{31-27} = 0b11111;
1077      let Inst{26-23} = 0b0100;
1078      let Inst{22-20} = opcod;
1079      let Inst{15-12} = 0b1111;
1080      let Inst{7} = 1;
1081
1082      bits<2> rot;
1083      let Inst{5-4} = rot{1-0}; // rotate
1084    }
1085 }
1086
1087 // DO variant - disassembly only, no pattern
1088
1089 multiclass T2I_exta_rrot_DO<bits<3> opcod, string opc> {
1090   def rr     : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iEXTAr,
1091                   opc, "\t$Rd, $Rn, $Rm", []> {
1092      let Inst{31-27} = 0b11111;
1093      let Inst{26-23} = 0b0100;
1094      let Inst{22-20} = opcod;
1095      let Inst{15-12} = 0b1111;
1096      let Inst{7} = 1;
1097      let Inst{5-4} = 0b00; // rotate
1098    }
1099   def rr_rot : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, i32imm:$rot),
1100                   IIC_iEXTAsr, opc, "\t$Rd, $Rn, $Rm, ror $rot", []> {
1101      let Inst{31-27} = 0b11111;
1102      let Inst{26-23} = 0b0100;
1103      let Inst{22-20} = opcod;
1104      let Inst{15-12} = 0b1111;
1105      let Inst{7} = 1;
1106
1107      bits<2> rot;
1108      let Inst{5-4} = rot{1-0}; // rotate
1109    }
1110 }
1111
1112 //===----------------------------------------------------------------------===//
1113 // Instructions
1114 //===----------------------------------------------------------------------===//
1115
1116 //===----------------------------------------------------------------------===//
1117 //  Miscellaneous Instructions.
1118 //
1119
1120 class T2PCOneRegImm<dag oops, dag iops, InstrItinClass itin,
1121            string asm, list<dag> pattern>
1122   : T2XI<oops, iops, itin, asm, pattern> {
1123   bits<4> Rd;
1124   bits<12> label;
1125
1126   let Inst{11-8}  = Rd{3-0};
1127   let Inst{26}    = label{11};
1128   let Inst{14-12} = label{10-8};
1129   let Inst{7-0}   = label{7-0};
1130 }
1131
1132 // LEApcrel - Load a pc-relative address into a register without offending the
1133 // assembler.
1134 let neverHasSideEffects = 1 in {
1135 let isReMaterializable = 1 in
1136 def t2LEApcrel : T2PCOneRegImm<(outs rGPR:$Rd), (ins i32imm:$label, pred:$p), IIC_iALUi,
1137                       "adr${p}.w\t$Rd, #$label", []> {
1138   let Inst{31-27} = 0b11110;
1139   let Inst{25-24} = 0b10;
1140   // Inst{23:21} = '11' (add = FALSE) or '00' (add = TRUE)
1141   let Inst{22} = 0;
1142   let Inst{20} = 0;
1143   let Inst{19-16} = 0b1111; // Rn
1144   let Inst{15} = 0;
1145
1146
1147 }
1148 } // neverHasSideEffects
1149 def t2LEApcrelJT : T2PCOneRegImm<(outs rGPR:$Rd),
1150                         (ins i32imm:$label, nohash_imm:$id, pred:$p), IIC_iALUi,
1151                         "adr${p}.w\t$Rd, #${label}_${id}", []> {
1152   let Inst{31-27} = 0b11110;
1153   let Inst{25-24} = 0b10;
1154   // Inst{23:21} = '11' (add = FALSE) or '00' (add = TRUE)
1155   let Inst{22} = 0;
1156   let Inst{20} = 0;
1157   let Inst{19-16} = 0b1111; // Rn
1158   let Inst{15} = 0;
1159 }
1160
1161 // ADD r, sp, {so_imm|i12}
1162 def t2ADDrSPi   : T2sTwoRegImm<(outs GPR:$Rd), (ins GPR:$sp, t2_so_imm:$imm),
1163                         IIC_iALUi, "add", ".w\t$Rd, $sp, $imm", []> {
1164   let Inst{31-27} = 0b11110;
1165   let Inst{25} = 0;
1166   let Inst{24-21} = 0b1000;
1167   let Inst{20} = ?; // The S bit.
1168   let Inst{19-16} = 0b1101; // Rn = sp
1169   let Inst{15} = 0;
1170 }
1171 def t2ADDrSPi12 : T2TwoRegImm<(outs GPR:$Rd), (ins GPR:$sp, imm0_4095:$imm),
1172                        IIC_iALUi, "addw", "\t$Rd, $sp, $imm", []> {
1173   let Inst{31-27} = 0b11110;
1174   let Inst{25} = 1;
1175   let Inst{24-21} = 0b0000;
1176   let Inst{20} = 0; // The S bit.
1177   let Inst{19-16} = 0b1101; // Rn = sp
1178   let Inst{15} = 0;
1179 }
1180
1181 // ADD r, sp, so_reg
1182 def t2ADDrSPs   : T2sTwoRegShiftedReg<
1183                         (outs GPR:$Rd), (ins GPR:$sp, t2_so_reg:$ShiftedRm),
1184                         IIC_iALUsi, "add", ".w\t$Rd, $sp, $ShiftedRm", []> {
1185   let Inst{31-27} = 0b11101;
1186   let Inst{26-25} = 0b01;
1187   let Inst{24-21} = 0b1000;
1188   let Inst{20} = ?; // The S bit.
1189   let Inst{19-16} = 0b1101; // Rn = sp
1190   let Inst{15} = 0;
1191 }
1192
1193 // SUB r, sp, {so_imm|i12}
1194 def t2SUBrSPi   : T2sTwoRegImm<(outs GPR:$Rd), (ins GPR:$sp, t2_so_imm:$imm),
1195                         IIC_iALUi, "sub", ".w\t$Rd, $sp, $imm", []> {
1196   let Inst{31-27} = 0b11110;
1197   let Inst{25} = 0;
1198   let Inst{24-21} = 0b1101;
1199   let Inst{20} = ?; // The S bit.
1200   let Inst{19-16} = 0b1101; // Rn = sp
1201   let Inst{15} = 0;
1202 }
1203 def t2SUBrSPi12 : T2TwoRegImm<(outs GPR:$Rd), (ins GPR:$sp, imm0_4095:$imm),
1204                        IIC_iALUi, "subw", "\t$Rd, $sp, $imm", []> {
1205   let Inst{31-27} = 0b11110;
1206   let Inst{25} = 1;
1207   let Inst{24-21} = 0b0101;
1208   let Inst{20} = 0; // The S bit.
1209   let Inst{19-16} = 0b1101; // Rn = sp
1210   let Inst{15} = 0;
1211 }
1212
1213 // SUB r, sp, so_reg
1214 def t2SUBrSPs   : T2sTwoRegImm<(outs GPR:$Rd), (ins GPR:$sp, t2_so_reg:$imm),
1215                        IIC_iALUsi,
1216                        "sub", "\t$Rd, $sp, $imm", []> {
1217   let Inst{31-27} = 0b11101;
1218   let Inst{26-25} = 0b01;
1219   let Inst{24-21} = 0b1101;
1220   let Inst{20} = ?; // The S bit.
1221   let Inst{19-16} = 0b1101; // Rn = sp
1222   let Inst{15} = 0;
1223 }
1224
1225 // Signed and unsigned division on v7-M
1226 def t2SDIV : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iALUi,
1227                  "sdiv", "\t$Rd, $Rn, $Rm",
1228                  [(set rGPR:$Rd, (sdiv rGPR:$Rn, rGPR:$Rm))]>,
1229                  Requires<[HasDivide, IsThumb2]> {
1230   let Inst{31-27} = 0b11111;
1231   let Inst{26-21} = 0b011100;
1232   let Inst{20} = 0b1;
1233   let Inst{15-12} = 0b1111;
1234   let Inst{7-4} = 0b1111;
1235 }
1236
1237 def t2UDIV : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iALUi,
1238                  "udiv", "\t$Rd, $Rn, $Rm",
1239                  [(set rGPR:$Rd, (udiv rGPR:$Rn, rGPR:$Rm))]>,
1240                  Requires<[HasDivide, IsThumb2]> {
1241   let Inst{31-27} = 0b11111;
1242   let Inst{26-21} = 0b011101;
1243   let Inst{20} = 0b1;
1244   let Inst{15-12} = 0b1111;
1245   let Inst{7-4} = 0b1111;
1246 }
1247
1248 //===----------------------------------------------------------------------===//
1249 //  Load / store Instructions.
1250 //
1251
1252 // Load
1253 let canFoldAsLoad = 1, isReMaterializable = 1  in
1254 defm t2LDR   : T2I_ld<0, 0b10, "ldr", IIC_iLoad_i, IIC_iLoad_si,
1255                       UnOpFrag<(load node:$Src)>>;
1256
1257 // Loads with zero extension
1258 defm t2LDRH  : T2I_ld<0, 0b01, "ldrh", IIC_iLoad_bh_i, IIC_iLoad_bh_si,
1259                       UnOpFrag<(zextloadi16 node:$Src)>>;
1260 defm t2LDRB  : T2I_ld<0, 0b00, "ldrb", IIC_iLoad_bh_i, IIC_iLoad_bh_si,
1261                       UnOpFrag<(zextloadi8  node:$Src)>>;
1262
1263 // Loads with sign extension
1264 defm t2LDRSH : T2I_ld<1, 0b01, "ldrsh", IIC_iLoad_bh_i, IIC_iLoad_bh_si,
1265                       UnOpFrag<(sextloadi16 node:$Src)>>;
1266 defm t2LDRSB : T2I_ld<1, 0b00, "ldrsb", IIC_iLoad_bh_i, IIC_iLoad_bh_si,
1267                       UnOpFrag<(sextloadi8  node:$Src)>>;
1268
1269 let mayLoad = 1, neverHasSideEffects = 1, hasExtraDefRegAllocReq = 1,
1270     isCodeGenOnly = 1 in { // $dst doesn't exist in asmstring?
1271 // Load doubleword
1272 def t2LDRDi8  : T2Ii8s4<1, 0, 1, (outs rGPR:$dst1, rGPR:$dst2),
1273                         (ins t2addrmode_imm8s4:$addr),
1274                         IIC_iLoad_d_i, "ldrd", "\t$dst1, $addr", []>;
1275 def t2LDRDpci : T2Ii8s4<1, 0, 1, (outs rGPR:$dst1, rGPR:$dst2),
1276                         (ins i32imm:$addr), IIC_iLoad_d_i,
1277                        "ldrd", "\t$dst1, $addr", []> {
1278   let Inst{19-16} = 0b1111; // Rn
1279 }
1280 } // mayLoad = 1, neverHasSideEffects = 1, hasExtraDefRegAllocReq = 1
1281
1282 // zextload i1 -> zextload i8
1283 def : T2Pat<(zextloadi1 t2addrmode_imm12:$addr),
1284             (t2LDRBi12  t2addrmode_imm12:$addr)>;
1285 def : T2Pat<(zextloadi1 t2addrmode_imm8:$addr),
1286             (t2LDRBi8   t2addrmode_imm8:$addr)>;
1287 def : T2Pat<(zextloadi1 t2addrmode_so_reg:$addr),
1288             (t2LDRBs    t2addrmode_so_reg:$addr)>;
1289 def : T2Pat<(zextloadi1 (ARMWrapper tconstpool:$addr)),
1290             (t2LDRBpci  tconstpool:$addr)>;
1291
1292 // extload -> zextload
1293 // FIXME: Reduce the number of patterns by legalizing extload to zextload
1294 // earlier?
1295 def : T2Pat<(extloadi1  t2addrmode_imm12:$addr),
1296             (t2LDRBi12  t2addrmode_imm12:$addr)>;
1297 def : T2Pat<(extloadi1  t2addrmode_imm8:$addr),
1298             (t2LDRBi8   t2addrmode_imm8:$addr)>;
1299 def : T2Pat<(extloadi1  t2addrmode_so_reg:$addr),
1300             (t2LDRBs    t2addrmode_so_reg:$addr)>;
1301 def : T2Pat<(extloadi1  (ARMWrapper tconstpool:$addr)),
1302             (t2LDRBpci  tconstpool:$addr)>;
1303
1304 def : T2Pat<(extloadi8  t2addrmode_imm12:$addr),
1305             (t2LDRBi12  t2addrmode_imm12:$addr)>;
1306 def : T2Pat<(extloadi8  t2addrmode_imm8:$addr),
1307             (t2LDRBi8   t2addrmode_imm8:$addr)>;
1308 def : T2Pat<(extloadi8  t2addrmode_so_reg:$addr),
1309             (t2LDRBs    t2addrmode_so_reg:$addr)>;
1310 def : T2Pat<(extloadi8  (ARMWrapper tconstpool:$addr)),
1311             (t2LDRBpci  tconstpool:$addr)>;
1312
1313 def : T2Pat<(extloadi16 t2addrmode_imm12:$addr),
1314             (t2LDRHi12  t2addrmode_imm12:$addr)>;
1315 def : T2Pat<(extloadi16 t2addrmode_imm8:$addr),
1316             (t2LDRHi8   t2addrmode_imm8:$addr)>;
1317 def : T2Pat<(extloadi16 t2addrmode_so_reg:$addr),
1318             (t2LDRHs    t2addrmode_so_reg:$addr)>;
1319 def : T2Pat<(extloadi16 (ARMWrapper tconstpool:$addr)),
1320             (t2LDRHpci  tconstpool:$addr)>;
1321
1322 // FIXME: The destination register of the loads and stores can't be PC, but
1323 //        can be SP. We need another regclass (similar to rGPR) to represent
1324 //        that. Not a pressing issue since these are selected manually,
1325 //        not via pattern.
1326
1327 // Indexed loads
1328
1329 class T2Iidxld<bit signed, bits<2> opcod, bit pre,
1330                  dag oops, dag iops,
1331                  AddrMode am, IndexMode im, InstrItinClass itin,
1332                  string opc, string asm, string cstr, list<dag> pattern>
1333   : T2Iidxldst<signed, opcod, 1, pre, oops,
1334                iops, am,im,itin, opc, asm, cstr, pattern>;
1335 class T2Iidxst<bit signed, bits<2> opcod, bit pre,
1336                  dag oops, dag iops,
1337                  AddrMode am, IndexMode im, InstrItinClass itin,
1338                  string opc, string asm, string cstr, list<dag> pattern>
1339   : T2Iidxldst<signed, opcod, 0, pre, oops,
1340                iops, am,im,itin, opc, asm, cstr, pattern>;
1341
1342 let mayLoad = 1, neverHasSideEffects = 1 in {
1343 def t2LDR_PRE  : T2Iidxld<0, 0b10, 1, (outs GPR:$Rt, GPR:$Rn),
1344                             (ins t2addrmode_imm8:$addr),
1345                             AddrModeT2_i8, IndexModePre, IIC_iLoad_iu,
1346                             "ldr", "\t$Rt, $addr!", "$addr.base = $Rn",
1347                             []>;
1348
1349 def t2LDR_POST : T2Iidxld<0, 0b10, 0, (outs GPR:$Rt, GPR:$Rn),
1350                             (ins GPR:$base, t2am_imm8_offset:$offset),
1351                             AddrModeT2_i8, IndexModePost, IIC_iLoad_iu,
1352                           "ldr", "\t$Rt, [$Rn], $offset", "$base = $Rn",
1353                             []>;
1354
1355 def t2LDRB_PRE : T2Iidxld<0, 0b00, 1, (outs GPR:$Rt, GPR:$Rn),
1356                             (ins t2addrmode_imm8:$addr),
1357                             AddrModeT2_i8, IndexModePre, IIC_iLoad_bh_iu,
1358                             "ldrb", "\t$Rt, $addr!", "$addr.base = $Rn",
1359                             []>;
1360 def t2LDRB_POST : T2Iidxld<0, 0b00, 0, (outs GPR:$Rt, GPR:$Rn),
1361                             (ins GPR:$base, t2am_imm8_offset:$offset),
1362                             AddrModeT2_i8, IndexModePost, IIC_iLoad_bh_iu,
1363                          "ldrb", "\t$Rt, [$Rn], $offset", "$base = $Rn",
1364                             []>;
1365
1366 def t2LDRH_PRE : T2Iidxld<0, 0b01, 1, (outs GPR:$Rt, GPR:$Rn),
1367                             (ins t2addrmode_imm8:$addr),
1368                             AddrModeT2_i8, IndexModePre, IIC_iLoad_bh_iu,
1369                             "ldrh", "\t$Rt, $addr!", "$addr.base = $Rn",
1370                             []>;
1371 def t2LDRH_POST : T2Iidxld<0, 0b01, 0, (outs GPR:$Rt, GPR:$Rn),
1372                             (ins GPR:$base, t2am_imm8_offset:$offset),
1373                             AddrModeT2_i8, IndexModePost, IIC_iLoad_bh_iu,
1374                          "ldrh", "\t$Rt, [$Rn], $offset", "$base = $Rn",
1375                             []>;
1376
1377 def t2LDRSB_PRE : T2Iidxld<1, 0b00, 1, (outs GPR:$Rt, GPR:$Rn),
1378                             (ins t2addrmode_imm8:$addr),
1379                             AddrModeT2_i8, IndexModePre, IIC_iLoad_bh_iu,
1380                             "ldrsb", "\t$Rt, $addr!", "$addr.base = $Rn",
1381                             []>;
1382 def t2LDRSB_POST : T2Iidxld<1, 0b00, 0, (outs GPR:$Rt, GPR:$Rn),
1383                             (ins GPR:$base, t2am_imm8_offset:$offset),
1384                             AddrModeT2_i8, IndexModePost, IIC_iLoad_bh_iu,
1385                         "ldrsb", "\t$Rt, [$Rn], $offset", "$base = $Rn",
1386                             []>;
1387
1388 def t2LDRSH_PRE : T2Iidxld<1, 0b01, 1, (outs GPR:$Rt, GPR:$Rn),
1389                             (ins t2addrmode_imm8:$addr),
1390                             AddrModeT2_i8, IndexModePre, IIC_iLoad_bh_iu,
1391                             "ldrsh", "\t$Rt, $addr!", "$addr.base = $Rn",
1392                             []>;
1393 def t2LDRSH_POST : T2Iidxld<1, 0b01, 0, (outs GPR:$dst, GPR:$Rn),
1394                             (ins GPR:$base, t2am_imm8_offset:$offset),
1395                             AddrModeT2_i8, IndexModePost, IIC_iLoad_bh_iu,
1396                         "ldrsh", "\t$dst, [$Rn], $offset", "$base = $Rn",
1397                             []>;
1398 } // mayLoad = 1, neverHasSideEffects = 1
1399
1400 // LDRT, LDRBT, LDRHT, LDRSBT, LDRSHT all have offset mode (PUW=0b110) and are
1401 // for disassembly only.
1402 // Ref: A8.6.57 LDR (immediate, Thumb) Encoding T4
1403 class T2IldT<bit signed, bits<2> type, string opc, InstrItinClass ii>
1404   : T2Ii8<(outs GPR:$Rt), (ins t2addrmode_imm8:$addr), ii, opc,
1405           "\t$Rt, $addr", []> {
1406   let Inst{31-27} = 0b11111;
1407   let Inst{26-25} = 0b00;
1408   let Inst{24} = signed;
1409   let Inst{23} = 0;
1410   let Inst{22-21} = type;
1411   let Inst{20} = 1; // load
1412   let Inst{11} = 1;
1413   let Inst{10-8} = 0b110; // PUW.
1414   
1415   bits<4> Rt;
1416   bits<13> addr;
1417   let Inst{15-12} = Rt{3-0};
1418   let Inst{19-16} = addr{12-9};
1419   let Inst{7-0}   = addr{7-0};
1420 }
1421
1422 def t2LDRT   : T2IldT<0, 0b10, "ldrt", IIC_iLoad_i>;
1423 def t2LDRBT  : T2IldT<0, 0b00, "ldrbt", IIC_iLoad_bh_i>;
1424 def t2LDRHT  : T2IldT<0, 0b01, "ldrht", IIC_iLoad_bh_i>;
1425 def t2LDRSBT : T2IldT<1, 0b00, "ldrsbt", IIC_iLoad_bh_i>;
1426 def t2LDRSHT : T2IldT<1, 0b01, "ldrsht", IIC_iLoad_bh_i>;
1427
1428 // Store
1429 defm t2STR :T2I_st<0b10,"str", IIC_iStore_i, IIC_iStore_si,
1430                    BinOpFrag<(store node:$LHS, node:$RHS)>>;
1431 defm t2STRB:T2I_st<0b00,"strb", IIC_iStore_bh_i, IIC_iStore_bh_si,
1432                    BinOpFrag<(truncstorei8 node:$LHS, node:$RHS)>>;
1433 defm t2STRH:T2I_st<0b01,"strh", IIC_iStore_bh_i, IIC_iStore_bh_si,
1434                    BinOpFrag<(truncstorei16 node:$LHS, node:$RHS)>>;
1435
1436 // Store doubleword
1437 let mayLoad = 1, neverHasSideEffects = 1, hasExtraSrcRegAllocReq = 1,
1438     isCodeGenOnly = 1 in  // $src2 doesn't exist in asm string
1439 def t2STRDi8 : T2Ii8s4<1, 0, 0, (outs),
1440                        (ins GPR:$src1, GPR:$src2, t2addrmode_imm8s4:$addr),
1441                IIC_iStore_d_r, "strd", "\t$src1, $addr", []>;
1442
1443 // Indexed stores
1444 def t2STR_PRE  : T2Iidxst<0, 0b10, 1, (outs GPR:$base_wb),
1445                             (ins GPR:$Rt, GPR:$Rn, t2am_imm8_offset:$addr),
1446                             AddrModeT2_i8, IndexModePre, IIC_iStore_iu,
1447                          "str", "\t$Rt, [$Rn, $addr]!", "$Rn = $base_wb",
1448              [(set GPR:$base_wb,
1449                    (pre_store GPR:$Rt, GPR:$Rn, t2am_imm8_offset:$addr))]>;
1450
1451 def t2STR_POST : T2Iidxst<0, 0b10, 0, (outs GPR:$base_wb),
1452                             (ins GPR:$Rt, GPR:$Rn, t2am_imm8_offset:$addr),
1453                             AddrModeT2_i8, IndexModePost, IIC_iStore_iu,
1454                           "str", "\t$Rt, [$Rn], $addr", "$Rn = $base_wb",
1455              [(set GPR:$base_wb,
1456                   (post_store GPR:$Rt, GPR:$Rn, t2am_imm8_offset:$addr))]>;
1457
1458 def t2STRH_PRE  : T2Iidxst<0, 0b01, 1, (outs GPR:$base_wb),
1459                             (ins GPR:$Rt, GPR:$Rn, t2am_imm8_offset:$addr),
1460                             AddrModeT2_i8, IndexModePre, IIC_iStore_iu,
1461                         "strh", "\t$Rt, [$Rn, $addr]!", "$Rn = $base_wb",
1462         [(set GPR:$base_wb,
1463               (pre_truncsti16 GPR:$Rt, GPR:$Rn, t2am_imm8_offset:$addr))]>;
1464
1465 def t2STRH_POST : T2Iidxst<0, 0b01, 0, (outs GPR:$base_wb),
1466                             (ins GPR:$Rt, GPR:$Rn, t2am_imm8_offset:$addr),
1467                             AddrModeT2_i8, IndexModePost, IIC_iStore_bh_iu,
1468                          "strh", "\t$Rt, [$Rn], $addr", "$Rn = $base_wb",
1469        [(set GPR:$base_wb,
1470              (post_truncsti16 GPR:$Rt, GPR:$Rn, t2am_imm8_offset:$addr))]>;
1471
1472 def t2STRB_PRE  : T2Iidxst<0, 0b00, 1, (outs GPR:$base_wb),
1473                             (ins GPR:$Rt, GPR:$Rn, t2am_imm8_offset:$addr),
1474                             AddrModeT2_i8, IndexModePre, IIC_iStore_bh_iu,
1475                         "strb", "\t$Rt, [$Rn, $addr]!", "$Rn = $base_wb",
1476          [(set GPR:$base_wb,
1477                (pre_truncsti8 GPR:$Rt, GPR:$Rn, t2am_imm8_offset:$addr))]>;
1478
1479 def t2STRB_POST : T2Iidxst<0, 0b00, 0, (outs GPR:$base_wb),
1480                             (ins GPR:$Rt, GPR:$Rn, t2am_imm8_offset:$addr),
1481                             AddrModeT2_i8, IndexModePost, IIC_iStore_bh_iu,
1482                          "strb", "\t$Rt, [$Rn], $addr", "$Rn = $base_wb",
1483         [(set GPR:$base_wb,
1484               (post_truncsti8 GPR:$Rt, GPR:$Rn, t2am_imm8_offset:$addr))]>;
1485
1486 // STRT, STRBT, STRHT all have offset mode (PUW=0b110) and are for disassembly
1487 // only.
1488 // Ref: A8.6.193 STR (immediate, Thumb) Encoding T4
1489 class T2IstT<bits<2> type, string opc, InstrItinClass ii>
1490   : T2Ii8<(outs GPR:$Rt), (ins t2addrmode_imm8:$addr), ii, opc,
1491           "\t$Rt, $addr", []> {
1492   let Inst{31-27} = 0b11111;
1493   let Inst{26-25} = 0b00;
1494   let Inst{24} = 0; // not signed
1495   let Inst{23} = 0;
1496   let Inst{22-21} = type;
1497   let Inst{20} = 0; // store
1498   let Inst{11} = 1;
1499   let Inst{10-8} = 0b110; // PUW
1500   
1501   bits<4> Rt;
1502   bits<13> addr;
1503   let Inst{15-12} = Rt{3-0};
1504   let Inst{19-16} = addr{12-9};
1505   let Inst{7-0}   = addr{7-0};
1506 }
1507
1508 def t2STRT   : T2IstT<0b10, "strt", IIC_iStore_i>;
1509 def t2STRBT  : T2IstT<0b00, "strbt", IIC_iStore_bh_i>;
1510 def t2STRHT  : T2IstT<0b01, "strht", IIC_iStore_bh_i>;
1511
1512 // ldrd / strd pre / post variants
1513 // For disassembly only.
1514
1515 def t2LDRD_PRE  : T2Ii8s4<1, 1, 1, (outs GPR:$dst1, GPR:$dst2),
1516                  (ins GPR:$base, t2am_imm8s4_offset:$imm), IIC_iLoad_d_ru,
1517                  "ldrd", "\t$dst1, $dst2, [$base, $imm]!", []>;
1518
1519 def t2LDRD_POST : T2Ii8s4<0, 1, 1, (outs GPR:$dst1, GPR:$dst2),
1520                  (ins GPR:$base, t2am_imm8s4_offset:$imm), IIC_iLoad_d_ru,
1521                  "ldrd", "\t$dst1, $dst2, [$base], $imm", []>;
1522
1523 def t2STRD_PRE  : T2Ii8s4<1, 1, 0, (outs),
1524                  (ins GPR:$src1, GPR:$src2, GPR:$base, t2am_imm8s4_offset:$imm),
1525                  IIC_iStore_d_ru, "strd", "\t$src1, $src2, [$base, $imm]!", []>;
1526
1527 def t2STRD_POST : T2Ii8s4<0, 1, 0, (outs),
1528                  (ins GPR:$src1, GPR:$src2, GPR:$base, t2am_imm8s4_offset:$imm),
1529                  IIC_iStore_d_ru, "strd", "\t$src1, $src2, [$base], $imm", []>;
1530
1531 // T2Ipl (Preload Data/Instruction) signals the memory system of possible future
1532 // data/instruction access.  These are for disassembly only.
1533 // instr_write is inverted for Thumb mode: (prefetch 3) -> (preload 0),
1534 // (prefetch 1) -> (preload 2),  (prefetch 2) -> (preload 1).
1535 multiclass T2Ipl<bits<1> write, bits<1> instr, string opc> {
1536
1537   def i12 : T2Ii12<(outs), (ins t2addrmode_imm12:$addr), IIC_Preload, opc,
1538                 "\t$addr",
1539               [(ARMPreload t2addrmode_imm12:$addr, (i32 write), (i32 instr))]> {
1540     let Inst{31-25} = 0b1111100;
1541     let Inst{24} = instr;
1542     let Inst{23} = 1; // U = 1
1543     let Inst{22} = 0;
1544     let Inst{21} = write;
1545     let Inst{20} = 1;
1546     let Inst{15-12} = 0b1111;
1547     
1548     bits<16> addr;
1549     let Inst{19-16} = addr{15-12}; // Rn
1550     let Inst{11-0}  = addr{11-0};  // imm12
1551   }
1552
1553   def i8 : T2Ii8<(outs), (ins t2addrmode_imm8:$addr), IIC_Preload, opc,
1554                 "\t$addr",
1555                [(ARMPreload t2addrmode_imm8:$addr, (i32 write), (i32 instr))]> {
1556     let Inst{31-25} = 0b1111100;
1557     let Inst{24} = instr;
1558     let Inst{23} = 0; // U = 0
1559     let Inst{22} = 0;
1560     let Inst{21} = write;
1561     let Inst{20} = 1;
1562     let Inst{15-12} = 0b1111;
1563     let Inst{11-8} = 0b1100;
1564     
1565     bits<13> addr;
1566     let Inst{19-16} = addr{12-9}; // Rn
1567     let Inst{7-0}   = addr{7-0};  // imm8
1568   }
1569
1570   def s : T2Iso<(outs), (ins t2addrmode_so_reg:$addr), IIC_Preload, opc,
1571                "\t$addr",
1572              [(ARMPreload t2addrmode_so_reg:$addr, (i32 write), (i32 instr))]> {
1573     let Inst{31-25} = 0b1111100;
1574     let Inst{24} = instr;
1575     let Inst{23} = 0; // add = TRUE for T1
1576     let Inst{22} = 0;
1577     let Inst{21} = write;
1578     let Inst{20} = 1;
1579     let Inst{15-12} = 0b1111;
1580     let Inst{11-6} = 0000000;
1581     
1582     bits<10> addr;
1583     let Inst{19-16} = addr{9-6}; // Rn
1584     let Inst{3-0}   = addr{5-2}; // Rm
1585     let Inst{5-4}   = addr{1-0}; // imm2
1586   }
1587
1588   let isCodeGenOnly = 1 in
1589   def pci : T2Ipc<(outs), (ins t2am_imm12_offset:$addr), IIC_Preload, opc,
1590                 "\t$addr",
1591                []> {
1592     let Inst{31-25} = 0b1111100;
1593     let Inst{24} = write;
1594     let Inst{23} = ?; // add = (U == 1)
1595     let Inst{22} = 0;
1596     let Inst{21} = instr;
1597     let Inst{20} = 1;
1598     let Inst{19-16} = 0b1111; // Rn = 0b1111
1599     let Inst{15-12} = 0b1111;
1600     
1601     bits<13> addr;
1602     let Inst{23}   = addr{12};
1603     let Inst{11-0} = addr{11-0};
1604   }
1605 }
1606
1607 defm t2PLD  : T2Ipl<0, 0, "pld">,  Requires<[IsThumb2]>;
1608 defm t2PLDW : T2Ipl<1, 0, "pldw">, Requires<[IsThumb2,HasV7,HasMP]>;
1609 defm t2PLI  : T2Ipl<0, 1, "pli">,  Requires<[IsThumb2,HasV7]>;
1610
1611 //===----------------------------------------------------------------------===//
1612 //  Load / store multiple Instructions.
1613 //
1614
1615 multiclass thumb2_ldst_mult<string asm, InstrItinClass itin,
1616                             InstrItinClass itin_upd, bit L_bit> {
1617   def IA :
1618     T2XI<(outs), (ins GPR:$Rn, pred:$p, reglist:$regs, variable_ops),
1619          itin, !strconcat(asm, "ia${p}.w\t$Rn, $regs"), []> {
1620     bits<4>  Rn;
1621     bits<16> regs;
1622
1623     let Inst{31-27} = 0b11101;
1624     let Inst{26-25} = 0b00;
1625     let Inst{24-23} = 0b01;     // Increment After
1626     let Inst{22}    = 0;
1627     let Inst{21}    = 0;        // No writeback
1628     let Inst{20}    = L_bit;
1629     let Inst{19-16} = Rn;
1630     let Inst{15-0}  = regs;
1631   }
1632   def IA_UPD :
1633     T2XIt<(outs GPR:$wb), (ins GPR:$Rn, pred:$p, reglist:$regs, variable_ops),
1634           itin_upd, !strconcat(asm, "ia${p}.w\t$Rn!, $regs"), "$Rn = $wb", []> {
1635     bits<4>  Rn;
1636     bits<16> regs;
1637
1638     let Inst{31-27} = 0b11101;
1639     let Inst{26-25} = 0b00;
1640     let Inst{24-23} = 0b01;     // Increment After
1641     let Inst{22}    = 0;
1642     let Inst{21}    = 1;        // Writeback
1643     let Inst{20}    = L_bit;
1644     let Inst{19-16} = Rn;
1645     let Inst{15-0}  = regs;
1646   }
1647   def DB :
1648     T2XI<(outs), (ins GPR:$Rn, pred:$p, reglist:$regs, variable_ops),
1649          itin, !strconcat(asm, "db${p}.w\t$Rn, $regs"), []> {
1650     bits<4>  Rn;
1651     bits<16> regs;
1652
1653     let Inst{31-27} = 0b11101;
1654     let Inst{26-25} = 0b00;
1655     let Inst{24-23} = 0b10;     // Decrement Before
1656     let Inst{22}    = 0;
1657     let Inst{21}    = 0;        // No writeback
1658     let Inst{20}    = L_bit;
1659     let Inst{19-16} = Rn;
1660     let Inst{15-0}  = regs;
1661   }
1662   def DB_UPD :
1663     T2XIt<(outs GPR:$wb), (ins GPR:$Rn, pred:$p, reglist:$regs, variable_ops),
1664           itin_upd, !strconcat(asm, "db${p}.w\t$Rn, $regs"), "$Rn = $wb", []> {
1665     bits<4>  Rn;
1666     bits<16> regs;
1667
1668     let Inst{31-27} = 0b11101;
1669     let Inst{26-25} = 0b00;
1670     let Inst{24-23} = 0b10;     // Decrement Before
1671     let Inst{22}    = 0;
1672     let Inst{21}    = 1;        // Writeback
1673     let Inst{20}    = L_bit;
1674     let Inst{19-16} = Rn;
1675     let Inst{15-0}  = regs;
1676   }
1677 }
1678
1679 let neverHasSideEffects = 1 in {
1680
1681 let mayLoad = 1, hasExtraDefRegAllocReq = 1 in
1682 defm t2LDM : thumb2_ldst_mult<"ldm", IIC_iLoad_m, IIC_iLoad_mu, 1>;
1683
1684 let mayStore = 1, hasExtraSrcRegAllocReq = 1 in
1685 defm t2STM : thumb2_ldst_mult<"stm", IIC_iStore_m, IIC_iStore_mu, 0>;
1686
1687 } // neverHasSideEffects
1688
1689
1690 //===----------------------------------------------------------------------===//
1691 //  Move Instructions.
1692 //
1693
1694 let neverHasSideEffects = 1 in
1695 def t2MOVr : T2sTwoReg<(outs GPR:$Rd), (ins GPR:$Rm), IIC_iMOVr,
1696                    "mov", ".w\t$Rd, $Rm", []> {
1697   let Inst{31-27} = 0b11101;
1698   let Inst{26-25} = 0b01;
1699   let Inst{24-21} = 0b0010;
1700   let Inst{20} = ?; // The S bit.
1701   let Inst{19-16} = 0b1111; // Rn
1702   let Inst{14-12} = 0b000;
1703   let Inst{7-4} = 0b0000;
1704 }
1705
1706 // AddedComplexity to ensure isel tries t2MOVi before t2MOVi16.
1707 let isReMaterializable = 1, isAsCheapAsAMove = 1, isMoveImm = 1,
1708     AddedComplexity = 1 in
1709 def t2MOVi : T2sOneRegImm<(outs rGPR:$Rd), (ins t2_so_imm:$imm), IIC_iMOVi,
1710                    "mov", ".w\t$Rd, $imm",
1711                    [(set rGPR:$Rd, t2_so_imm:$imm)]> {
1712   let Inst{31-27} = 0b11110;
1713   let Inst{25} = 0;
1714   let Inst{24-21} = 0b0010;
1715   let Inst{20} = ?; // The S bit.
1716   let Inst{19-16} = 0b1111; // Rn
1717   let Inst{15} = 0;
1718 }
1719
1720 let isReMaterializable = 1, isAsCheapAsAMove = 1, isMoveImm = 1 in
1721 def t2MOVi16 : T2I<(outs rGPR:$Rd), (ins i32imm:$imm), IIC_iMOVi,
1722                    "movw", "\t$Rd, $imm",
1723                    [(set rGPR:$Rd, imm0_65535:$imm)]> {
1724   let Inst{31-27} = 0b11110;
1725   let Inst{25} = 1;
1726   let Inst{24-21} = 0b0010;
1727   let Inst{20} = 0; // The S bit.
1728   let Inst{15} = 0;
1729
1730   bits<4> Rd;
1731   bits<16> imm;
1732
1733   let Inst{11-8}  = Rd{3-0};
1734   let Inst{19-16} = imm{15-12};
1735   let Inst{26}    = imm{11};
1736   let Inst{14-12} = imm{10-8};
1737   let Inst{7-0}   = imm{7-0};
1738 }
1739
1740 let Constraints = "$src = $Rd" in
1741 def t2MOVTi16 : T2I<(outs rGPR:$Rd), (ins rGPR:$src, i32imm:$imm), IIC_iMOVi,
1742                     "movt", "\t$Rd, $imm",
1743                     [(set rGPR:$Rd,
1744                           (or (and rGPR:$src, 0xffff), lo16AllZero:$imm))]> {
1745   let Inst{31-27} = 0b11110;
1746   let Inst{25} = 1;
1747   let Inst{24-21} = 0b0110;
1748   let Inst{20} = 0; // The S bit.
1749   let Inst{15} = 0;
1750
1751   bits<4> Rd;
1752   bits<16> imm;
1753
1754   let Inst{11-8}  = Rd{3-0};
1755   let Inst{19-16} = imm{15-12};
1756   let Inst{26}    = imm{11};
1757   let Inst{14-12} = imm{10-8};
1758   let Inst{7-0}   = imm{7-0};
1759 }
1760
1761 def : T2Pat<(or rGPR:$src, 0xffff0000), (t2MOVTi16 rGPR:$src, 0xffff)>;
1762
1763 //===----------------------------------------------------------------------===//
1764 //  Extend Instructions.
1765 //
1766
1767 // Sign extenders
1768
1769 defm t2SXTB  : T2I_ext_rrot<0b100, "sxtb",
1770                               UnOpFrag<(sext_inreg node:$Src, i8)>>;
1771 defm t2SXTH  : T2I_ext_rrot<0b000, "sxth",
1772                               UnOpFrag<(sext_inreg node:$Src, i16)>>;
1773 defm t2SXTB16 : T2I_ext_rrot_sxtb16<0b010, "sxtb16">;
1774
1775 defm t2SXTAB : T2I_exta_rrot<0b100, "sxtab",
1776                         BinOpFrag<(add node:$LHS, (sext_inreg node:$RHS, i8))>>;
1777 defm t2SXTAH : T2I_exta_rrot<0b000, "sxtah",
1778                         BinOpFrag<(add node:$LHS, (sext_inreg node:$RHS,i16))>>;
1779 defm t2SXTAB16 : T2I_exta_rrot_DO<0b010, "sxtab16">;
1780
1781 // TODO: SXT(A){B|H}16 - done for disassembly only
1782
1783 // Zero extenders
1784
1785 let AddedComplexity = 16 in {
1786 defm t2UXTB   : T2I_ext_rrot<0b101, "uxtb",
1787                                UnOpFrag<(and node:$Src, 0x000000FF)>>;
1788 defm t2UXTH   : T2I_ext_rrot<0b001, "uxth",
1789                                UnOpFrag<(and node:$Src, 0x0000FFFF)>>;
1790 defm t2UXTB16 : T2I_ext_rrot_uxtb16<0b011, "uxtb16",
1791                                UnOpFrag<(and node:$Src, 0x00FF00FF)>>;
1792
1793 // FIXME: This pattern incorrectly assumes the shl operator is a rotate.
1794 //        The transformation should probably be done as a combiner action
1795 //        instead so we can include a check for masking back in the upper
1796 //        eight bits of the source into the lower eight bits of the result.
1797 //def : T2Pat<(and (shl rGPR:$Src, (i32 8)), 0xFF00FF),
1798 //            (t2UXTB16r_rot rGPR:$Src, 24)>,
1799 //          Requires<[HasT2ExtractPack, IsThumb2]>;
1800 def : T2Pat<(and (srl rGPR:$Src, (i32 8)), 0xFF00FF),
1801             (t2UXTB16r_rot rGPR:$Src, 8)>,
1802         Requires<[HasT2ExtractPack, IsThumb2]>;
1803
1804 defm t2UXTAB : T2I_exta_rrot<0b101, "uxtab",
1805                            BinOpFrag<(add node:$LHS, (and node:$RHS, 0x00FF))>>;
1806 defm t2UXTAH : T2I_exta_rrot<0b001, "uxtah",
1807                            BinOpFrag<(add node:$LHS, (and node:$RHS, 0xFFFF))>>;
1808 defm t2UXTAB16 : T2I_exta_rrot_DO<0b011, "uxtab16">;
1809 }
1810
1811 //===----------------------------------------------------------------------===//
1812 //  Arithmetic Instructions.
1813 //
1814
1815 defm t2ADD  : T2I_bin_ii12rs<0b000, "add",
1816                              BinOpFrag<(add  node:$LHS, node:$RHS)>, 1>;
1817 defm t2SUB  : T2I_bin_ii12rs<0b101, "sub",
1818                              BinOpFrag<(sub  node:$LHS, node:$RHS)>>;
1819
1820 // ADD and SUB with 's' bit set. No 12-bit immediate (T4) variants.
1821 defm t2ADDS : T2I_bin_s_irs <0b1000, "add",
1822                              IIC_iALUi, IIC_iALUr, IIC_iALUsi,
1823                              BinOpFrag<(addc node:$LHS, node:$RHS)>, 1>;
1824 defm t2SUBS : T2I_bin_s_irs <0b1101, "sub",
1825                              IIC_iALUi, IIC_iALUr, IIC_iALUsi,
1826                              BinOpFrag<(subc node:$LHS, node:$RHS)>>;
1827
1828 defm t2ADC  : T2I_adde_sube_irs<0b1010, "adc",
1829                           BinOpFrag<(adde_dead_carry node:$LHS, node:$RHS)>, 1>;
1830 defm t2SBC  : T2I_adde_sube_irs<0b1011, "sbc",
1831                           BinOpFrag<(sube_dead_carry node:$LHS, node:$RHS)>>;
1832 defm t2ADCS : T2I_adde_sube_s_irs<0b1010, "adc",
1833                           BinOpFrag<(adde_live_carry node:$LHS, node:$RHS)>, 1>;
1834 defm t2SBCS : T2I_adde_sube_s_irs<0b1011, "sbc",
1835                           BinOpFrag<(sube_live_carry node:$LHS, node:$RHS)>>;
1836
1837 // RSB
1838 defm t2RSB  : T2I_rbin_irs  <0b1110, "rsb",
1839                              BinOpFrag<(sub  node:$LHS, node:$RHS)>>;
1840 defm t2RSBS : T2I_rbin_s_is <0b1110, "rsb",
1841                              BinOpFrag<(subc node:$LHS, node:$RHS)>>;
1842
1843 // (sub X, imm) gets canonicalized to (add X, -imm).  Match this form.
1844 // The assume-no-carry-in form uses the negation of the input since add/sub
1845 // assume opposite meanings of the carry flag (i.e., carry == !borrow).
1846 // See the definition of AddWithCarry() in the ARM ARM A2.2.1 for the gory
1847 // details.
1848 // The AddedComplexity preferences the first variant over the others since
1849 // it can be shrunk to a 16-bit wide encoding, while the others cannot.
1850 let AddedComplexity = 1 in
1851 def : T2Pat<(add        GPR:$src, imm0_255_neg:$imm),
1852             (t2SUBri    GPR:$src, imm0_255_neg:$imm)>;
1853 def : T2Pat<(add        GPR:$src, t2_so_imm_neg:$imm),
1854             (t2SUBri    GPR:$src, t2_so_imm_neg:$imm)>;
1855 def : T2Pat<(add        GPR:$src, imm0_4095_neg:$imm),
1856             (t2SUBri12  GPR:$src, imm0_4095_neg:$imm)>;
1857 let AddedComplexity = 1 in
1858 def : T2Pat<(addc       rGPR:$src, imm0_255_neg:$imm),
1859             (t2SUBSri   rGPR:$src, imm0_255_neg:$imm)>;
1860 def : T2Pat<(addc       rGPR:$src, t2_so_imm_neg:$imm),
1861             (t2SUBSri   rGPR:$src, t2_so_imm_neg:$imm)>;
1862 // The with-carry-in form matches bitwise not instead of the negation.
1863 // Effectively, the inverse interpretation of the carry flag already accounts
1864 // for part of the negation.
1865 let AddedComplexity = 1 in
1866 def : T2Pat<(adde       rGPR:$src, imm0_255_not:$imm),
1867             (t2SBCSri   rGPR:$src, imm0_255_not:$imm)>;
1868 def : T2Pat<(adde       rGPR:$src, t2_so_imm_not:$imm),
1869             (t2SBCSri   rGPR:$src, t2_so_imm_not:$imm)>;
1870
1871 // Select Bytes -- for disassembly only
1872
1873 def t2SEL : T2ThreeReg<(outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm),
1874                 NoItinerary, "sel", "\t$Rd, $Rn, $Rm", []> {
1875   let Inst{31-27} = 0b11111;
1876   let Inst{26-24} = 0b010;
1877   let Inst{23} = 0b1;
1878   let Inst{22-20} = 0b010;
1879   let Inst{15-12} = 0b1111;
1880   let Inst{7} = 0b1;
1881   let Inst{6-4} = 0b000;
1882 }
1883
1884 // A6.3.13, A6.3.14, A6.3.15 Parallel addition and subtraction (signed/unsigned)
1885 // And Miscellaneous operations -- for disassembly only
1886 class T2I_pam<bits<3> op22_20, bits<4> op7_4, string opc,
1887               list<dag> pat = [/* For disassembly only; pattern left blank */]>
1888   : T2I<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), NoItinerary, opc,
1889         "\t$Rd, $Rn, $Rm", pat> {
1890   let Inst{31-27} = 0b11111;
1891   let Inst{26-23} = 0b0101;
1892   let Inst{22-20} = op22_20;
1893   let Inst{15-12} = 0b1111;
1894   let Inst{7-4} = op7_4;
1895
1896   bits<4> Rd;
1897   bits<4> Rn;
1898   bits<4> Rm;
1899
1900   let Inst{11-8}  = Rd{3-0};
1901   let Inst{19-16} = Rn{3-0};
1902   let Inst{3-0}   = Rm{3-0};
1903 }
1904
1905 // Saturating add/subtract -- for disassembly only
1906
1907 def t2QADD    : T2I_pam<0b000, 0b1000, "qadd",
1908                         [(set rGPR:$Rd, (int_arm_qadd rGPR:$Rn, rGPR:$Rm))]>;
1909 def t2QADD16  : T2I_pam<0b001, 0b0001, "qadd16">;
1910 def t2QADD8   : T2I_pam<0b000, 0b0001, "qadd8">;
1911 def t2QASX    : T2I_pam<0b010, 0b0001, "qasx">;
1912 def t2QDADD   : T2I_pam<0b000, 0b1001, "qdadd">;
1913 def t2QDSUB   : T2I_pam<0b000, 0b1011, "qdsub">;
1914 def t2QSAX    : T2I_pam<0b110, 0b0001, "qsax">;
1915 def t2QSUB    : T2I_pam<0b000, 0b1010, "qsub",
1916                         [(set rGPR:$Rd, (int_arm_qsub rGPR:$Rn, rGPR:$Rm))]>;
1917 def t2QSUB16  : T2I_pam<0b101, 0b0001, "qsub16">;
1918 def t2QSUB8   : T2I_pam<0b100, 0b0001, "qsub8">;
1919 def t2UQADD16 : T2I_pam<0b001, 0b0101, "uqadd16">;
1920 def t2UQADD8  : T2I_pam<0b000, 0b0101, "uqadd8">;
1921 def t2UQASX   : T2I_pam<0b010, 0b0101, "uqasx">;
1922 def t2UQSAX   : T2I_pam<0b110, 0b0101, "uqsax">;
1923 def t2UQSUB16 : T2I_pam<0b101, 0b0101, "uqsub16">;
1924 def t2UQSUB8  : T2I_pam<0b100, 0b0101, "uqsub8">;
1925
1926 // Signed/Unsigned add/subtract -- for disassembly only
1927
1928 def t2SASX    : T2I_pam<0b010, 0b0000, "sasx">;
1929 def t2SADD16  : T2I_pam<0b001, 0b0000, "sadd16">;
1930 def t2SADD8   : T2I_pam<0b000, 0b0000, "sadd8">;
1931 def t2SSAX    : T2I_pam<0b110, 0b0000, "ssax">;
1932 def t2SSUB16  : T2I_pam<0b101, 0b0000, "ssub16">;
1933 def t2SSUB8   : T2I_pam<0b100, 0b0000, "ssub8">;
1934 def t2UASX    : T2I_pam<0b010, 0b0100, "uasx">;
1935 def t2UADD16  : T2I_pam<0b001, 0b0100, "uadd16">;
1936 def t2UADD8   : T2I_pam<0b000, 0b0100, "uadd8">;
1937 def t2USAX    : T2I_pam<0b110, 0b0100, "usax">;
1938 def t2USUB16  : T2I_pam<0b101, 0b0100, "usub16">;
1939 def t2USUB8   : T2I_pam<0b100, 0b0100, "usub8">;
1940
1941 // Signed/Unsigned halving add/subtract -- for disassembly only
1942
1943 def t2SHASX   : T2I_pam<0b010, 0b0010, "shasx">;
1944 def t2SHADD16 : T2I_pam<0b001, 0b0010, "shadd16">;
1945 def t2SHADD8  : T2I_pam<0b000, 0b0010, "shadd8">;
1946 def t2SHSAX   : T2I_pam<0b110, 0b0010, "shsax">;
1947 def t2SHSUB16 : T2I_pam<0b101, 0b0010, "shsub16">;
1948 def t2SHSUB8  : T2I_pam<0b100, 0b0010, "shsub8">;
1949 def t2UHASX   : T2I_pam<0b010, 0b0110, "uhasx">;
1950 def t2UHADD16 : T2I_pam<0b001, 0b0110, "uhadd16">;
1951 def t2UHADD8  : T2I_pam<0b000, 0b0110, "uhadd8">;
1952 def t2UHSAX   : T2I_pam<0b110, 0b0110, "uhsax">;
1953 def t2UHSUB16 : T2I_pam<0b101, 0b0110, "uhsub16">;
1954 def t2UHSUB8  : T2I_pam<0b100, 0b0110, "uhsub8">;
1955
1956 // Helper class for disassembly only
1957 // A6.3.16 & A6.3.17
1958 // T2Imac - Thumb2 multiply [accumulate, and absolute difference] instructions.
1959 class T2ThreeReg_mac<bit long, bits<3> op22_20, bits<4> op7_4, dag oops,
1960   dag iops, InstrItinClass itin, string opc, string asm, list<dag> pattern>
1961   : T2ThreeReg<oops, iops, itin, opc, asm, pattern> {
1962   let Inst{31-27} = 0b11111;
1963   let Inst{26-24} = 0b011;
1964   let Inst{23}    = long;
1965   let Inst{22-20} = op22_20;
1966   let Inst{7-4}   = op7_4;
1967 }
1968
1969 class T2FourReg_mac<bit long, bits<3> op22_20, bits<4> op7_4, dag oops,
1970   dag iops, InstrItinClass itin, string opc, string asm, list<dag> pattern>
1971   : T2FourReg<oops, iops, itin, opc, asm, pattern> {
1972   let Inst{31-27} = 0b11111;
1973   let Inst{26-24} = 0b011;
1974   let Inst{23}    = long;
1975   let Inst{22-20} = op22_20;
1976   let Inst{7-4}   = op7_4;
1977 }
1978
1979 // Unsigned Sum of Absolute Differences [and Accumulate] -- for disassembly only
1980
1981 def t2USAD8   : T2ThreeReg_mac<0, 0b111, 0b0000, (outs rGPR:$Rd),
1982                                            (ins rGPR:$Rn, rGPR:$Rm),
1983                         NoItinerary, "usad8", "\t$Rd, $Rn, $Rm", []> {
1984   let Inst{15-12} = 0b1111;
1985 }
1986 def t2USADA8  : T2FourReg_mac<0, 0b111, 0b0000, (outs rGPR:$Rd),
1987                        (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), NoItinerary,
1988                         "usada8", "\t$Rd, $Rn, $Rm, $Ra", []>;
1989
1990 // Signed/Unsigned saturate -- for disassembly only
1991
1992 class T2SatI<dag oops, dag iops, InstrItinClass itin,
1993            string opc, string asm, list<dag> pattern>
1994   : T2I<oops, iops, itin, opc, asm, pattern> {
1995   bits<4> Rd;
1996   bits<4> Rn;
1997   bits<5> sat_imm;
1998   bits<7> sh;
1999
2000   let Inst{11-8}  = Rd{3-0};
2001   let Inst{19-16} = Rn{3-0};
2002   let Inst{4-0}   = sat_imm{4-0};
2003   let Inst{21}    = sh{6};
2004   let Inst{14-12} = sh{4-2};
2005   let Inst{7-6}   = sh{1-0};
2006 }
2007
2008 def t2SSAT: T2SatI<
2009                 (outs rGPR:$Rd), (ins i32imm:$sat_imm, rGPR:$Rn, shift_imm:$sh),
2010                 NoItinerary, "ssat", "\t$Rd, $sat_imm, $Rn$sh",
2011                 [/* For disassembly only; pattern left blank */]> {
2012   let Inst{31-27} = 0b11110;
2013   let Inst{25-22} = 0b1100;
2014   let Inst{20} = 0;
2015   let Inst{15} = 0;
2016 }
2017
2018 def t2SSAT16: T2SatI<
2019                    (outs rGPR:$Rd), (ins i32imm:$sat_imm, rGPR:$Rn), NoItinerary,
2020                    "ssat16", "\t$Rd, $sat_imm, $Rn",
2021                    [/* For disassembly only; pattern left blank */]> {
2022   let Inst{31-27} = 0b11110;
2023   let Inst{25-22} = 0b1100;
2024   let Inst{20} = 0;
2025   let Inst{15} = 0;
2026   let Inst{21} = 1;        // sh = '1'
2027   let Inst{14-12} = 0b000; // imm3 = '000'
2028   let Inst{7-6} = 0b00;    // imm2 = '00'
2029 }
2030
2031 def t2USAT: T2SatI<
2032                 (outs rGPR:$Rd), (ins i32imm:$sat_imm, rGPR:$Rn, shift_imm:$sh),
2033                 NoItinerary, "usat", "\t$Rd, $sat_imm, $Rn$sh",
2034                 [/* For disassembly only; pattern left blank */]> {
2035   let Inst{31-27} = 0b11110;
2036   let Inst{25-22} = 0b1110;
2037   let Inst{20} = 0;
2038   let Inst{15} = 0;
2039 }
2040
2041 def t2USAT16: T2SatI<
2042                     (outs rGPR:$dst), (ins i32imm:$sat_imm, rGPR:$Rn), NoItinerary,
2043                    "usat16", "\t$dst, $sat_imm, $Rn",
2044                    [/* For disassembly only; pattern left blank */]> {
2045   let Inst{31-27} = 0b11110;
2046   let Inst{25-22} = 0b1110;
2047   let Inst{20} = 0;
2048   let Inst{15} = 0;
2049   let Inst{21} = 1;        // sh = '1'
2050   let Inst{14-12} = 0b000; // imm3 = '000'
2051   let Inst{7-6} = 0b00;    // imm2 = '00'
2052 }
2053
2054 def : T2Pat<(int_arm_ssat GPR:$a, imm:$pos), (t2SSAT imm:$pos, GPR:$a, 0)>;
2055 def : T2Pat<(int_arm_usat GPR:$a, imm:$pos), (t2USAT imm:$pos, GPR:$a, 0)>;
2056
2057 //===----------------------------------------------------------------------===//
2058 //  Shift and rotate Instructions.
2059 //
2060
2061 defm t2LSL  : T2I_sh_ir<0b00, "lsl", BinOpFrag<(shl  node:$LHS, node:$RHS)>>;
2062 defm t2LSR  : T2I_sh_ir<0b01, "lsr", BinOpFrag<(srl  node:$LHS, node:$RHS)>>;
2063 defm t2ASR  : T2I_sh_ir<0b10, "asr", BinOpFrag<(sra  node:$LHS, node:$RHS)>>;
2064 defm t2ROR  : T2I_sh_ir<0b11, "ror", BinOpFrag<(rotr node:$LHS, node:$RHS)>>;
2065
2066 let Uses = [CPSR] in {
2067 def t2RRX : T2sTwoReg<(outs rGPR:$Rd), (ins rGPR:$Rm), IIC_iMOVsi,
2068                    "rrx", "\t$Rd, $Rm",
2069                    [(set rGPR:$Rd, (ARMrrx rGPR:$Rm))]> {
2070   let Inst{31-27} = 0b11101;
2071   let Inst{26-25} = 0b01;
2072   let Inst{24-21} = 0b0010;
2073   let Inst{20} = ?; // The S bit.
2074   let Inst{19-16} = 0b1111; // Rn
2075   let Inst{14-12} = 0b000;
2076   let Inst{7-4} = 0b0011;
2077 }
2078 }
2079
2080 let Defs = [CPSR] in {
2081 def t2MOVsrl_flag : T2TwoRegShiftImm<
2082                         (outs rGPR:$Rd), (ins rGPR:$Rm), IIC_iMOVsi,
2083                         "lsrs", ".w\t$Rd, $Rm, #1",
2084                         [(set rGPR:$Rd, (ARMsrl_flag rGPR:$Rm))]> {
2085   let Inst{31-27} = 0b11101;
2086   let Inst{26-25} = 0b01;
2087   let Inst{24-21} = 0b0010;
2088   let Inst{20} = 1; // The S bit.
2089   let Inst{19-16} = 0b1111; // Rn
2090   let Inst{5-4} = 0b01; // Shift type.
2091   // Shift amount = Inst{14-12:7-6} = 1.
2092   let Inst{14-12} = 0b000;
2093   let Inst{7-6} = 0b01;
2094 }
2095 def t2MOVsra_flag : T2TwoRegShiftImm<
2096                         (outs rGPR:$Rd), (ins rGPR:$Rm), IIC_iMOVsi,
2097                         "asrs", ".w\t$Rd, $Rm, #1",
2098                         [(set rGPR:$Rd, (ARMsra_flag rGPR:$Rm))]> {
2099   let Inst{31-27} = 0b11101;
2100   let Inst{26-25} = 0b01;
2101   let Inst{24-21} = 0b0010;
2102   let Inst{20} = 1; // The S bit.
2103   let Inst{19-16} = 0b1111; // Rn
2104   let Inst{5-4} = 0b10; // Shift type.
2105   // Shift amount = Inst{14-12:7-6} = 1.
2106   let Inst{14-12} = 0b000;
2107   let Inst{7-6} = 0b01;
2108 }
2109 }
2110
2111 //===----------------------------------------------------------------------===//
2112 //  Bitwise Instructions.
2113 //
2114
2115 defm t2AND  : T2I_bin_w_irs<0b0000, "and",
2116                             IIC_iBITi, IIC_iBITr, IIC_iBITsi,
2117                             BinOpFrag<(and node:$LHS, node:$RHS)>, 1>;
2118 defm t2ORR  : T2I_bin_w_irs<0b0010, "orr",
2119                             IIC_iBITi, IIC_iBITr, IIC_iBITsi,
2120                             BinOpFrag<(or  node:$LHS, node:$RHS)>, 1>;
2121 defm t2EOR  : T2I_bin_w_irs<0b0100, "eor",
2122                             IIC_iBITi, IIC_iBITr, IIC_iBITsi,
2123                             BinOpFrag<(xor node:$LHS, node:$RHS)>, 1>;
2124
2125 defm t2BIC  : T2I_bin_w_irs<0b0001, "bic",
2126                             IIC_iBITi, IIC_iBITr, IIC_iBITsi,
2127                             BinOpFrag<(and node:$LHS, (not node:$RHS))>>;
2128
2129 class T2BitFI<dag oops, dag iops, InstrItinClass itin,
2130               string opc, string asm, list<dag> pattern>
2131     : T2I<oops, iops, itin, opc, asm, pattern> {
2132   bits<4> Rd;
2133   bits<5> msb;
2134   bits<5> lsb;
2135
2136   let Inst{11-8}  = Rd{3-0};
2137   let Inst{4-0}   = msb{4-0};
2138   let Inst{14-12} = lsb{4-2};
2139   let Inst{7-6}   = lsb{1-0};
2140 }
2141
2142 class T2TwoRegBitFI<dag oops, dag iops, InstrItinClass itin,
2143               string opc, string asm, list<dag> pattern>
2144     : T2BitFI<oops, iops, itin, opc, asm, pattern> {
2145   bits<4> Rn;
2146
2147   let Inst{19-16} = Rn{3-0};
2148 }
2149
2150 let Constraints = "$src = $Rd" in
2151 def t2BFC : T2BitFI<(outs rGPR:$Rd), (ins rGPR:$src, bf_inv_mask_imm:$imm),
2152                 IIC_iUNAsi, "bfc", "\t$Rd, $imm",
2153                 [(set rGPR:$Rd, (and rGPR:$src, bf_inv_mask_imm:$imm))]> {
2154   let Inst{31-27} = 0b11110;
2155   let Inst{25} = 1;
2156   let Inst{24-20} = 0b10110;
2157   let Inst{19-16} = 0b1111; // Rn
2158   let Inst{15} = 0;
2159
2160   bits<10> imm;
2161   let msb{4-0} = imm{9-5};
2162   let lsb{4-0} = imm{4-0};
2163 }
2164
2165 def t2SBFX: T2TwoRegBitFI<
2166                 (outs rGPR:$Rd), (ins rGPR:$Rn, imm0_31:$lsb, imm0_31_m1:$msb),
2167                  IIC_iUNAsi, "sbfx", "\t$Rd, $Rn, $lsb, $msb", []> {
2168   let Inst{31-27} = 0b11110;
2169   let Inst{25} = 1;
2170   let Inst{24-20} = 0b10100;
2171   let Inst{15} = 0;
2172 }
2173
2174 def t2UBFX: T2TwoRegBitFI<
2175                 (outs rGPR:$Rd), (ins rGPR:$Rn, imm0_31:$lsb, imm0_31_m1:$msb),
2176                  IIC_iUNAsi, "ubfx", "\t$Rd, $Rn, $lsb, $msb", []> {
2177   let Inst{31-27} = 0b11110;
2178   let Inst{25} = 1;
2179   let Inst{24-20} = 0b11100;
2180   let Inst{15} = 0;
2181 }
2182
2183 // A8.6.18  BFI - Bitfield insert (Encoding T1)
2184 let Constraints = "$src = $Rd" in
2185 def t2BFI : T2TwoRegBitFI<(outs rGPR:$Rd),
2186                 (ins rGPR:$src, rGPR:$Rn, bf_inv_mask_imm:$imm),
2187                 IIC_iBITi, "bfi", "\t$Rd, $Rn, $imm",
2188                 [(set rGPR:$Rd, (ARMbfi rGPR:$src, rGPR:$Rn,
2189                                  bf_inv_mask_imm:$imm))]> {
2190   let Inst{31-27} = 0b11110;
2191   let Inst{25} = 1;
2192   let Inst{24-20} = 0b10110;
2193   let Inst{15} = 0;
2194
2195   bits<10> imm;
2196   let msb{4-0} = imm{9-5};
2197   let lsb{4-0} = imm{4-0};
2198 }
2199
2200 defm t2ORN  : T2I_bin_irs<0b0011, "orn",
2201                           IIC_iBITi, IIC_iBITr, IIC_iBITsi,
2202                           BinOpFrag<(or  node:$LHS, (not node:$RHS))>, 0, "">;
2203
2204 // Prefer over of t2EORri ra, rb, -1 because mvn has 16-bit version
2205 let AddedComplexity = 1 in
2206 defm t2MVN  : T2I_un_irs <0b0011, "mvn",
2207                           IIC_iMVNi, IIC_iMVNr, IIC_iMVNsi,
2208                           UnOpFrag<(not node:$Src)>, 1, 1>;
2209
2210
2211 let AddedComplexity = 1 in
2212 def : T2Pat<(and     rGPR:$src, t2_so_imm_not:$imm),
2213             (t2BICri rGPR:$src, t2_so_imm_not:$imm)>;
2214
2215 // FIXME: Disable this pattern on Darwin to workaround an assembler bug.
2216 def : T2Pat<(or      rGPR:$src, t2_so_imm_not:$imm),
2217             (t2ORNri rGPR:$src, t2_so_imm_not:$imm)>,
2218             Requires<[IsThumb2]>;
2219
2220 def : T2Pat<(t2_so_imm_not:$src),
2221             (t2MVNi t2_so_imm_not:$src)>;
2222
2223 //===----------------------------------------------------------------------===//
2224 //  Multiply Instructions.
2225 //
2226 let isCommutable = 1 in
2227 def t2MUL: T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iMUL32,
2228                 "mul", "\t$Rd, $Rn, $Rm",
2229                 [(set rGPR:$Rd, (mul rGPR:$Rn, rGPR:$Rm))]> {
2230   let Inst{31-27} = 0b11111;
2231   let Inst{26-23} = 0b0110;
2232   let Inst{22-20} = 0b000;
2233   let Inst{15-12} = 0b1111; // Ra = 0b1111 (no accumulate)
2234   let Inst{7-4} = 0b0000; // Multiply
2235 }
2236
2237 def t2MLA: T2FourReg<
2238                 (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC32,
2239                 "mla", "\t$Rd, $Rn, $Rm, $Ra",
2240                 [(set rGPR:$Rd, (add (mul rGPR:$Rn, rGPR:$Rm), rGPR:$Ra))]> {
2241   let Inst{31-27} = 0b11111;
2242   let Inst{26-23} = 0b0110;
2243   let Inst{22-20} = 0b000;
2244   let Inst{7-4} = 0b0000; // Multiply
2245 }
2246
2247 def t2MLS: T2FourReg<
2248                 (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC32,
2249                 "mls", "\t$Rd, $Rn, $Rm, $Ra",
2250                 [(set rGPR:$Rd, (sub rGPR:$Ra, (mul rGPR:$Rn, rGPR:$Rm)))]> {
2251   let Inst{31-27} = 0b11111;
2252   let Inst{26-23} = 0b0110;
2253   let Inst{22-20} = 0b000;
2254   let Inst{7-4} = 0b0001; // Multiply and Subtract
2255 }
2256
2257 // Extra precision multiplies with low / high results
2258 let neverHasSideEffects = 1 in {
2259 let isCommutable = 1 in {
2260 def t2SMULL : T2FourReg<
2261                   (outs rGPR:$Rd, rGPR:$Ra),
2262                   (ins rGPR:$Rn, rGPR:$Rm), IIC_iMUL64,
2263                    "smull", "\t$Rd, $Ra, $Rn, $Rm", []> {
2264   let Inst{31-27} = 0b11111;
2265   let Inst{26-23} = 0b0111;
2266   let Inst{22-20} = 0b000;
2267   let Inst{7-4} = 0b0000;
2268 }
2269
2270 def t2UMULL : T2FourReg<
2271                   (outs rGPR:$Rd, rGPR:$Ra),
2272                   (ins rGPR:$Rn, rGPR:$Rm), IIC_iMUL64,
2273                    "umull", "\t$Rd, $Ra, $Rn, $Rm", []> {
2274   let Inst{31-27} = 0b11111;
2275   let Inst{26-23} = 0b0111;
2276   let Inst{22-20} = 0b010;
2277   let Inst{7-4} = 0b0000;
2278 }
2279 } // isCommutable
2280
2281 // Multiply + accumulate
2282 def t2SMLAL : T2FourReg<(outs rGPR:$Ra, rGPR:$Rd),
2283                   (ins rGPR:$Rn, rGPR:$Rm), IIC_iMAC64,
2284                   "smlal", "\t$Ra, $Rd, $Rn, $Rm", []>{
2285   let Inst{31-27} = 0b11111;
2286   let Inst{26-23} = 0b0111;
2287   let Inst{22-20} = 0b100;
2288   let Inst{7-4} = 0b0000;
2289 }
2290
2291 def t2UMLAL : T2FourReg<(outs rGPR:$Ra, rGPR:$Rd),
2292                   (ins rGPR:$Rn, rGPR:$Rm), IIC_iMAC64,
2293                   "umlal", "\t$Ra, $Rd, $Rn, $Rm", []>{
2294   let Inst{31-27} = 0b11111;
2295   let Inst{26-23} = 0b0111;
2296   let Inst{22-20} = 0b110;
2297   let Inst{7-4} = 0b0000;
2298 }
2299
2300 def t2UMAAL : T2FourReg<(outs rGPR:$Ra, rGPR:$Rd),
2301                   (ins rGPR:$Rn, rGPR:$Rm), IIC_iMAC64,
2302                   "umaal", "\t$Ra, $Rd, $Rn, $Rm", []>{
2303   let Inst{31-27} = 0b11111;
2304   let Inst{26-23} = 0b0111;
2305   let Inst{22-20} = 0b110;
2306   let Inst{7-4} = 0b0110;
2307 }
2308 } // neverHasSideEffects
2309
2310 // Rounding variants of the below included for disassembly only
2311
2312 // Most significant word multiply
2313 def t2SMMUL : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iMUL32,
2314                   "smmul", "\t$Rd, $Rn, $Rm",
2315                   [(set rGPR:$Rd, (mulhs rGPR:$Rn, rGPR:$Rm))]> {
2316   let Inst{31-27} = 0b11111;
2317   let Inst{26-23} = 0b0110;
2318   let Inst{22-20} = 0b101;
2319   let Inst{15-12} = 0b1111; // Ra = 0b1111 (no accumulate)
2320   let Inst{7-4} = 0b0000; // No Rounding (Inst{4} = 0)
2321 }
2322
2323 def t2SMMULR : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iMUL32,
2324                   "smmulr", "\t$Rd, $Rn, $Rm", []> {
2325   let Inst{31-27} = 0b11111;
2326   let Inst{26-23} = 0b0110;
2327   let Inst{22-20} = 0b101;
2328   let Inst{15-12} = 0b1111; // Ra = 0b1111 (no accumulate)
2329   let Inst{7-4} = 0b0001; // Rounding (Inst{4} = 1)
2330 }
2331
2332 def t2SMMLA : T2FourReg<
2333         (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC32,
2334                 "smmla", "\t$Rd, $Rn, $Rm, $Ra",
2335                 [(set rGPR:$Rd, (add (mulhs rGPR:$Rm, rGPR:$Rn), rGPR:$Ra))]> {
2336   let Inst{31-27} = 0b11111;
2337   let Inst{26-23} = 0b0110;
2338   let Inst{22-20} = 0b101;
2339   let Inst{7-4} = 0b0000; // No Rounding (Inst{4} = 0)
2340 }
2341
2342 def t2SMMLAR: T2FourReg<
2343         (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC32,
2344                   "smmlar", "\t$Rd, $Rn, $Rm, $Ra", []> {
2345   let Inst{31-27} = 0b11111;
2346   let Inst{26-23} = 0b0110;
2347   let Inst{22-20} = 0b101;
2348   let Inst{7-4} = 0b0001; // Rounding (Inst{4} = 1)
2349 }
2350
2351 def t2SMMLS: T2FourReg<
2352         (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC32,
2353                 "smmls", "\t$Rd, $Rn, $Rm, $Ra",
2354                 [(set rGPR:$Rd, (sub rGPR:$Ra, (mulhs rGPR:$Rn, rGPR:$Rm)))]> {
2355   let Inst{31-27} = 0b11111;
2356   let Inst{26-23} = 0b0110;
2357   let Inst{22-20} = 0b110;
2358   let Inst{7-4} = 0b0000; // No Rounding (Inst{4} = 0)
2359 }
2360
2361 def t2SMMLSR:T2FourReg<
2362         (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC32,
2363                 "smmlsr", "\t$Rd, $Rn, $Rm, $Ra", []> {
2364   let Inst{31-27} = 0b11111;
2365   let Inst{26-23} = 0b0110;
2366   let Inst{22-20} = 0b110;
2367   let Inst{7-4} = 0b0001; // Rounding (Inst{4} = 1)
2368 }
2369
2370 multiclass T2I_smul<string opc, PatFrag opnode> {
2371   def BB : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iMUL16,
2372               !strconcat(opc, "bb"), "\t$Rd, $Rn, $Rm",
2373               [(set rGPR:$Rd, (opnode (sext_inreg rGPR:$Rn, i16),
2374                                       (sext_inreg rGPR:$Rm, i16)))]> {
2375     let Inst{31-27} = 0b11111;
2376     let Inst{26-23} = 0b0110;
2377     let Inst{22-20} = 0b001;
2378     let Inst{15-12} = 0b1111; // Ra = 0b1111 (no accumulate)
2379     let Inst{7-6} = 0b00;
2380     let Inst{5-4} = 0b00;
2381   }
2382
2383   def BT : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iMUL16,
2384               !strconcat(opc, "bt"), "\t$Rd, $Rn, $Rm",
2385               [(set rGPR:$Rd, (opnode (sext_inreg rGPR:$Rn, i16),
2386                                       (sra rGPR:$Rm, (i32 16))))]> {
2387     let Inst{31-27} = 0b11111;
2388     let Inst{26-23} = 0b0110;
2389     let Inst{22-20} = 0b001;
2390     let Inst{15-12} = 0b1111; // Ra = 0b1111 (no accumulate)
2391     let Inst{7-6} = 0b00;
2392     let Inst{5-4} = 0b01;
2393   }
2394
2395   def TB : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iMUL16,
2396               !strconcat(opc, "tb"), "\t$Rd, $Rn, $Rm",
2397               [(set rGPR:$Rd, (opnode (sra rGPR:$Rn, (i32 16)),
2398                                       (sext_inreg rGPR:$Rm, i16)))]> {
2399     let Inst{31-27} = 0b11111;
2400     let Inst{26-23} = 0b0110;
2401     let Inst{22-20} = 0b001;
2402     let Inst{15-12} = 0b1111; // Ra = 0b1111 (no accumulate)
2403     let Inst{7-6} = 0b00;
2404     let Inst{5-4} = 0b10;
2405   }
2406
2407   def TT : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iMUL16,
2408               !strconcat(opc, "tt"), "\t$Rd, $Rn, $Rm",
2409               [(set rGPR:$Rd, (opnode (sra rGPR:$Rn, (i32 16)),
2410                                       (sra rGPR:$Rm, (i32 16))))]> {
2411     let Inst{31-27} = 0b11111;
2412     let Inst{26-23} = 0b0110;
2413     let Inst{22-20} = 0b001;
2414     let Inst{15-12} = 0b1111; // Ra = 0b1111 (no accumulate)
2415     let Inst{7-6} = 0b00;
2416     let Inst{5-4} = 0b11;
2417   }
2418
2419   def WB : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iMUL16,
2420               !strconcat(opc, "wb"), "\t$Rd, $Rn, $Rm",
2421               [(set rGPR:$Rd, (sra (opnode rGPR:$Rn,
2422                                     (sext_inreg rGPR:$Rm, i16)), (i32 16)))]> {
2423     let Inst{31-27} = 0b11111;
2424     let Inst{26-23} = 0b0110;
2425     let Inst{22-20} = 0b011;
2426     let Inst{15-12} = 0b1111; // Ra = 0b1111 (no accumulate)
2427     let Inst{7-6} = 0b00;
2428     let Inst{5-4} = 0b00;
2429   }
2430
2431   def WT : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iMUL16,
2432               !strconcat(opc, "wt"), "\t$Rd, $Rn, $Rm",
2433               [(set rGPR:$Rd, (sra (opnode rGPR:$Rn,
2434                                     (sra rGPR:$Rm, (i32 16))), (i32 16)))]> {
2435     let Inst{31-27} = 0b11111;
2436     let Inst{26-23} = 0b0110;
2437     let Inst{22-20} = 0b011;
2438     let Inst{15-12} = 0b1111; // Ra = 0b1111 (no accumulate)
2439     let Inst{7-6} = 0b00;
2440     let Inst{5-4} = 0b01;
2441   }
2442 }
2443
2444
2445 multiclass T2I_smla<string opc, PatFrag opnode> {
2446   def BB : T2FourReg<
2447         (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC16,
2448               !strconcat(opc, "bb"), "\t$Rd, $Rn, $Rm, $Ra",
2449               [(set rGPR:$Rd, (add rGPR:$Ra,
2450                                (opnode (sext_inreg rGPR:$Rn, i16),
2451                                        (sext_inreg rGPR:$Rm, i16))))]> {
2452     let Inst{31-27} = 0b11111;
2453     let Inst{26-23} = 0b0110;
2454     let Inst{22-20} = 0b001;
2455     let Inst{7-6} = 0b00;
2456     let Inst{5-4} = 0b00;
2457   }
2458
2459   def BT : T2FourReg<
2460        (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC16,
2461              !strconcat(opc, "bt"), "\t$Rd, $Rn, $Rm, $Ra",
2462              [(set rGPR:$Rd, (add rGPR:$Ra, (opnode (sext_inreg rGPR:$Rn, i16),
2463                                                  (sra rGPR:$Rm, (i32 16)))))]> {
2464     let Inst{31-27} = 0b11111;
2465     let Inst{26-23} = 0b0110;
2466     let Inst{22-20} = 0b001;
2467     let Inst{7-6} = 0b00;
2468     let Inst{5-4} = 0b01;
2469   }
2470
2471   def TB : T2FourReg<
2472         (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC16,
2473               !strconcat(opc, "tb"), "\t$Rd, $Rn, $Rm, $Ra",
2474               [(set rGPR:$Rd, (add rGPR:$Ra, (opnode (sra rGPR:$Rn, (i32 16)),
2475                                                (sext_inreg rGPR:$Rm, i16))))]> {
2476     let Inst{31-27} = 0b11111;
2477     let Inst{26-23} = 0b0110;
2478     let Inst{22-20} = 0b001;
2479     let Inst{7-6} = 0b00;
2480     let Inst{5-4} = 0b10;
2481   }
2482
2483   def TT : T2FourReg<
2484         (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC16,
2485               !strconcat(opc, "tt"), "\t$Rd, $Rn, $Rm, $Ra",
2486              [(set rGPR:$Rd, (add rGPR:$Ra, (opnode (sra rGPR:$Rn, (i32 16)),
2487                                                  (sra rGPR:$Rm, (i32 16)))))]> {
2488     let Inst{31-27} = 0b11111;
2489     let Inst{26-23} = 0b0110;
2490     let Inst{22-20} = 0b001;
2491     let Inst{7-6} = 0b00;
2492     let Inst{5-4} = 0b11;
2493   }
2494
2495   def WB : T2FourReg<
2496         (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC16,
2497               !strconcat(opc, "wb"), "\t$Rd, $Rn, $Rm, $Ra",
2498               [(set rGPR:$Rd, (add rGPR:$Ra, (sra (opnode rGPR:$Rn,
2499                                     (sext_inreg rGPR:$Rm, i16)), (i32 16))))]> {
2500     let Inst{31-27} = 0b11111;
2501     let Inst{26-23} = 0b0110;
2502     let Inst{22-20} = 0b011;
2503     let Inst{7-6} = 0b00;
2504     let Inst{5-4} = 0b00;
2505   }
2506
2507   def WT : T2FourReg<
2508         (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC16,
2509               !strconcat(opc, "wt"), "\t$Rd, $Rn, $Rm, $Ra",
2510               [(set rGPR:$Rd, (add rGPR:$Ra, (sra (opnode rGPR:$Rn,
2511                                       (sra rGPR:$Rm, (i32 16))), (i32 16))))]> {
2512     let Inst{31-27} = 0b11111;
2513     let Inst{26-23} = 0b0110;
2514     let Inst{22-20} = 0b011;
2515     let Inst{7-6} = 0b00;
2516     let Inst{5-4} = 0b01;
2517   }
2518 }
2519
2520 defm t2SMUL : T2I_smul<"smul", BinOpFrag<(mul node:$LHS, node:$RHS)>>;
2521 defm t2SMLA : T2I_smla<"smla", BinOpFrag<(mul node:$LHS, node:$RHS)>>;
2522
2523 // Halfword multiple accumulate long: SMLAL<x><y> -- for disassembly only
2524 def t2SMLALBB : T2FourReg_mac<1, 0b100, 0b1000, (outs rGPR:$Ra,rGPR:$Rd),
2525          (ins rGPR:$Rn,rGPR:$Rm), IIC_iMAC64, "smlalbb", "\t$Ra, $Rd, $Rn, $Rm",
2526            [/* For disassembly only; pattern left blank */]>;
2527 def t2SMLALBT : T2FourReg_mac<1, 0b100, 0b1001, (outs rGPR:$Ra,rGPR:$Rd),
2528          (ins rGPR:$Rn,rGPR:$Rm), IIC_iMAC64, "smlalbt", "\t$Ra, $Rd, $Rn, $Rm",
2529            [/* For disassembly only; pattern left blank */]>;
2530 def t2SMLALTB : T2FourReg_mac<1, 0b100, 0b1010, (outs rGPR:$Ra,rGPR:$Rd),
2531          (ins rGPR:$Rn,rGPR:$Rm), IIC_iMAC64, "smlaltb", "\t$Ra, $Rd, $Rn, $Rm",
2532            [/* For disassembly only; pattern left blank */]>;
2533 def t2SMLALTT : T2FourReg_mac<1, 0b100, 0b1011, (outs rGPR:$Ra,rGPR:$Rd),
2534          (ins rGPR:$Rn,rGPR:$Rm), IIC_iMAC64, "smlaltt", "\t$Ra, $Rd, $Rn, $Rm",
2535            [/* For disassembly only; pattern left blank */]>;
2536
2537 // Dual halfword multiple: SMUAD, SMUSD, SMLAD, SMLSD, SMLALD, SMLSLD
2538 // These are for disassembly only.
2539
2540 def t2SMUAD: T2ThreeReg_mac<
2541             0, 0b010, 0b0000, (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm),
2542             IIC_iMAC32, "smuad", "\t$Rd, $Rn, $Rm", []> {
2543   let Inst{15-12} = 0b1111;
2544 }
2545 def t2SMUADX:T2ThreeReg_mac<
2546             0, 0b010, 0b0001, (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm),
2547             IIC_iMAC32, "smuadx", "\t$Rd, $Rn, $Rm", []> {
2548   let Inst{15-12} = 0b1111;
2549 }
2550 def t2SMUSD: T2ThreeReg_mac<
2551             0, 0b100, 0b0000, (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm),
2552             IIC_iMAC32, "smusd", "\t$Rd, $Rn, $Rm", []> {
2553   let Inst{15-12} = 0b1111;
2554 }
2555 def t2SMUSDX:T2ThreeReg_mac<
2556             0, 0b100, 0b0001, (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm),
2557             IIC_iMAC32, "smusdx", "\t$Rd, $Rn, $Rm", []> {
2558   let Inst{15-12} = 0b1111;
2559 }
2560 def t2SMLAD   : T2ThreeReg_mac<
2561             0, 0b010, 0b0000, (outs rGPR:$Rd),
2562             (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC32, "smlad",
2563             "\t$Rd, $Rn, $Rm, $Ra", []>;
2564 def t2SMLADX  : T2FourReg_mac<
2565             0, 0b010, 0b0001, (outs rGPR:$Rd),
2566             (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC32, "smladx",
2567             "\t$Rd, $Rn, $Rm, $Ra", []>;
2568 def t2SMLSD   : T2FourReg_mac<0, 0b100, 0b0000, (outs rGPR:$Rd),
2569             (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC32, "smlsd",
2570             "\t$Rd, $Rn, $Rm, $Ra", []>;
2571 def t2SMLSDX  : T2FourReg_mac<0, 0b100, 0b0001, (outs rGPR:$Rd),
2572             (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC32, "smlsdx",
2573             "\t$Rd, $Rn, $Rm, $Ra", []>;
2574 def t2SMLALD  : T2FourReg_mac<1, 0b100, 0b1100, (outs rGPR:$Ra,rGPR:$Rd),
2575                         (ins rGPR:$Rm, rGPR:$Rn), IIC_iMAC64, "smlald",
2576                         "\t$Ra, $Rd, $Rm, $Rn", []>;
2577 def t2SMLALDX : T2FourReg_mac<1, 0b100, 0b1101, (outs rGPR:$Ra,rGPR:$Rd),
2578                         (ins rGPR:$Rm,rGPR:$Rn), IIC_iMAC64, "smlaldx",
2579                         "\t$Ra, $Rd, $Rm, $Rn", []>;
2580 def t2SMLSLD  : T2FourReg_mac<1, 0b101, 0b1100, (outs rGPR:$Ra,rGPR:$Rd),
2581                         (ins rGPR:$Rm,rGPR:$Rn), IIC_iMAC64, "smlsld",
2582                         "\t$Ra, $Rd, $Rm, $Rn", []>;
2583 def t2SMLSLDX : T2FourReg_mac<1, 0b101, 0b1101, (outs rGPR:$Ra,rGPR:$Rd),
2584                         (ins rGPR:$Rm,rGPR:$Rn), IIC_iMAC64, "smlsldx",
2585                         "\t$Ra, $Rd, $Rm, $Rn", []>;
2586
2587 //===----------------------------------------------------------------------===//
2588 //  Misc. Arithmetic Instructions.
2589 //
2590
2591 class T2I_misc<bits<2> op1, bits<2> op2, dag oops, dag iops,
2592       InstrItinClass itin, string opc, string asm, list<dag> pattern>
2593   : T2ThreeReg<oops, iops, itin, opc, asm, pattern> {
2594   let Inst{31-27} = 0b11111;
2595   let Inst{26-22} = 0b01010;
2596   let Inst{21-20} = op1;
2597   let Inst{15-12} = 0b1111;
2598   let Inst{7-6} = 0b10;
2599   let Inst{5-4} = op2;
2600   let Rn{3-0} = Rm{3-0};
2601 }
2602
2603 def t2CLZ : T2I_misc<0b11, 0b00, (outs rGPR:$Rd), (ins rGPR:$Rm), IIC_iUNAr,
2604                     "clz", "\t$Rd, $Rm", [(set rGPR:$Rd, (ctlz rGPR:$Rm))]>;
2605
2606 def t2RBIT : T2I_misc<0b01, 0b10, (outs rGPR:$Rd), (ins rGPR:$Rm), IIC_iUNAr,
2607                       "rbit", "\t$Rd, $Rm",
2608                       [(set rGPR:$Rd, (ARMrbit rGPR:$Rm))]>;
2609
2610 def t2REV : T2I_misc<0b01, 0b00, (outs rGPR:$Rd), (ins rGPR:$Rm), IIC_iUNAr,
2611                  "rev", ".w\t$Rd, $Rm", [(set rGPR:$Rd, (bswap rGPR:$Rm))]>;
2612
2613 def t2REV16 : T2I_misc<0b01, 0b01, (outs rGPR:$Rd), (ins rGPR:$Rm), IIC_iUNAr,
2614                        "rev16", ".w\t$Rd, $Rm",
2615                 [(set rGPR:$Rd,
2616                     (or (and (srl rGPR:$Rm, (i32 8)), 0xFF),
2617                         (or (and (shl rGPR:$Rm, (i32 8)), 0xFF00),
2618                             (or (and (srl rGPR:$Rm, (i32 8)), 0xFF0000),
2619                                (and (shl rGPR:$Rm, (i32 8)), 0xFF000000)))))]>;
2620
2621 def t2REVSH : T2I_misc<0b01, 0b11, (outs rGPR:$Rd), (ins rGPR:$Rm), IIC_iUNAr,
2622                        "revsh", ".w\t$Rd, $Rm",
2623                  [(set rGPR:$Rd,
2624                     (sext_inreg
2625                       (or (srl (and rGPR:$Rm, 0xFF00), (i32 8)),
2626                           (shl rGPR:$Rm, (i32 8))), i16))]>;
2627
2628 def t2PKHBT : T2ThreeReg<
2629             (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, shift_imm:$sh),
2630                   IIC_iBITsi, "pkhbt", "\t$Rd, $Rn, $Rm$sh",
2631                   [(set rGPR:$Rd, (or (and rGPR:$Rn, 0xFFFF),
2632                                       (and (shl rGPR:$Rm, lsl_amt:$sh),
2633                                            0xFFFF0000)))]>,
2634                   Requires<[HasT2ExtractPack, IsThumb2]> {
2635   let Inst{31-27} = 0b11101;
2636   let Inst{26-25} = 0b01;
2637   let Inst{24-20} = 0b01100;
2638   let Inst{5} = 0; // BT form
2639   let Inst{4} = 0;
2640
2641   bits<8> sh;
2642   let Inst{14-12} = sh{7-5};
2643   let Inst{7-6}   = sh{4-3};
2644 }
2645
2646 // Alternate cases for PKHBT where identities eliminate some nodes.
2647 def : T2Pat<(or (and rGPR:$src1, 0xFFFF), (and rGPR:$src2, 0xFFFF0000)),
2648             (t2PKHBT rGPR:$src1, rGPR:$src2, 0)>,
2649             Requires<[HasT2ExtractPack, IsThumb2]>;
2650 def : T2Pat<(or (and rGPR:$src1, 0xFFFF), (shl rGPR:$src2, imm16_31:$sh)),
2651             (t2PKHBT rGPR:$src1, rGPR:$src2, (lsl_shift_imm imm16_31:$sh))>,
2652             Requires<[HasT2ExtractPack, IsThumb2]>;
2653
2654 // Note: Shifts of 1-15 bits will be transformed to srl instead of sra and
2655 // will match the pattern below.
2656 def t2PKHTB : T2ThreeReg<
2657                   (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, shift_imm:$sh),
2658                   IIC_iBITsi, "pkhtb", "\t$Rd, $Rn, $Rm$sh",
2659                   [(set rGPR:$Rd, (or (and rGPR:$Rn, 0xFFFF0000),
2660                                        (and (sra rGPR:$Rm, asr_amt:$sh),
2661                                             0xFFFF)))]>,
2662                   Requires<[HasT2ExtractPack, IsThumb2]> {
2663   let Inst{31-27} = 0b11101;
2664   let Inst{26-25} = 0b01;
2665   let Inst{24-20} = 0b01100;
2666   let Inst{5} = 1; // TB form
2667   let Inst{4} = 0;
2668
2669   bits<8> sh;
2670   let Inst{14-12} = sh{7-5};
2671   let Inst{7-6}   = sh{4-3};
2672 }
2673
2674 // Alternate cases for PKHTB where identities eliminate some nodes.  Note that
2675 // a shift amount of 0 is *not legal* here, it is PKHBT instead.
2676 def : T2Pat<(or (and rGPR:$src1, 0xFFFF0000), (srl rGPR:$src2, imm16_31:$sh)),
2677             (t2PKHTB rGPR:$src1, rGPR:$src2, (asr_shift_imm imm16_31:$sh))>,
2678             Requires<[HasT2ExtractPack, IsThumb2]>;
2679 def : T2Pat<(or (and rGPR:$src1, 0xFFFF0000),
2680                 (and (srl rGPR:$src2, imm1_15:$sh), 0xFFFF)),
2681             (t2PKHTB rGPR:$src1, rGPR:$src2, (asr_shift_imm imm1_15:$sh))>,
2682             Requires<[HasT2ExtractPack, IsThumb2]>;
2683
2684 //===----------------------------------------------------------------------===//
2685 //  Comparison Instructions...
2686 //
2687 defm t2CMP  : T2I_cmp_irs<0b1101, "cmp",
2688                           IIC_iCMPi, IIC_iCMPr, IIC_iCMPsi,
2689                           BinOpFrag<(ARMcmp node:$LHS, node:$RHS)>>;
2690 defm t2CMPz : T2I_cmp_irs<0b1101, "cmp",
2691                           IIC_iCMPi, IIC_iCMPr, IIC_iCMPsi,
2692                           BinOpFrag<(ARMcmpZ node:$LHS, node:$RHS)>>;
2693
2694 //FIXME: Disable CMN, as CCodes are backwards from compare expectations
2695 //       Compare-to-zero still works out, just not the relationals
2696 //defm t2CMN  : T2I_cmp_irs<0b1000, "cmn",
2697 //                          BinOpFrag<(ARMcmp node:$LHS,(ineg node:$RHS))>>;
2698 defm t2CMNz : T2I_cmp_irs<0b1000, "cmn",
2699                           IIC_iCMPi, IIC_iCMPr, IIC_iCMPsi,
2700                           BinOpFrag<(ARMcmpZ node:$LHS,(ineg node:$RHS))>>;
2701
2702 //def : T2Pat<(ARMcmp  GPR:$src, t2_so_imm_neg:$imm),
2703 //            (t2CMNri GPR:$src, t2_so_imm_neg:$imm)>;
2704
2705 def : T2Pat<(ARMcmpZ  GPR:$src, t2_so_imm_neg:$imm),
2706             (t2CMNzri GPR:$src, t2_so_imm_neg:$imm)>;
2707
2708 defm t2TST  : T2I_cmp_irs<0b0000, "tst",
2709                           IIC_iTSTi, IIC_iTSTr, IIC_iTSTsi,
2710                          BinOpFrag<(ARMcmpZ (and_su node:$LHS, node:$RHS), 0)>>;
2711 defm t2TEQ  : T2I_cmp_irs<0b0100, "teq",
2712                           IIC_iTSTi, IIC_iTSTr, IIC_iTSTsi,
2713                          BinOpFrag<(ARMcmpZ (xor_su node:$LHS, node:$RHS), 0)>>;
2714
2715 // Conditional moves
2716 // FIXME: should be able to write a pattern for ARMcmov, but can't use
2717 // a two-value operand where a dag node expects two operands. :(
2718 let neverHasSideEffects = 1 in {
2719 def t2MOVCCr : T2TwoReg<
2720                    (outs rGPR:$Rd), (ins rGPR:$false, rGPR:$Rm), IIC_iCMOVr,
2721                    "mov", ".w\t$Rd, $Rm",
2722    [/*(set rGPR:$Rd, (ARMcmov rGPR:$false, rGPR:$Rm, imm:$cc, CCR:$ccr))*/]>,
2723                 RegConstraint<"$false = $Rd"> {
2724   let Inst{31-27} = 0b11101;
2725   let Inst{26-25} = 0b01;
2726   let Inst{24-21} = 0b0010;
2727   let Inst{20} = 0; // The S bit.
2728   let Inst{19-16} = 0b1111; // Rn
2729   let Inst{14-12} = 0b000;
2730   let Inst{7-4} = 0b0000;
2731 }
2732
2733 let isMoveImm = 1 in
2734 def t2MOVCCi : T2OneRegImm<(outs rGPR:$Rd), (ins rGPR:$false, t2_so_imm:$imm),
2735                    IIC_iCMOVi, "mov", ".w\t$Rd, $imm",
2736 [/*(set rGPR:$Rd,(ARMcmov rGPR:$false,t2_so_imm:$imm, imm:$cc, CCR:$ccr))*/]>,
2737                    RegConstraint<"$false = $Rd"> {
2738   let Inst{31-27} = 0b11110;
2739   let Inst{25} = 0;
2740   let Inst{24-21} = 0b0010;
2741   let Inst{20} = 0; // The S bit.
2742   let Inst{19-16} = 0b1111; // Rn
2743   let Inst{15} = 0;
2744 }
2745
2746 let isMoveImm = 1 in
2747 def t2MOVCCi16 : T2I<(outs rGPR:$Rd), (ins rGPR:$false, i32imm:$imm),
2748                       IIC_iCMOVi,
2749                       "movw", "\t$Rd, $imm", []>,
2750                       RegConstraint<"$false = $Rd"> {
2751   let Inst{31-27} = 0b11110;
2752   let Inst{25} = 1;
2753   let Inst{24-21} = 0b0010;
2754   let Inst{20} = 0; // The S bit.
2755   let Inst{15} = 0;
2756
2757   bits<4> Rd;
2758   bits<16> imm;
2759
2760   let Inst{11-8}  = Rd{3-0};
2761   let Inst{19-16} = imm{15-12};
2762   let Inst{26}    = imm{11};
2763   let Inst{14-12} = imm{10-8};
2764   let Inst{7-0}   = imm{7-0};
2765 }
2766
2767 let isMoveImm = 1 in
2768 def t2MOVCCi32imm : PseudoInst<(outs rGPR:$dst),
2769                                (ins rGPR:$false, i32imm:$src, pred:$p),
2770                     IIC_iCMOVix2, []>, RegConstraint<"$false = $dst">;
2771
2772 let isMoveImm = 1 in
2773 def t2MVNCCi : T2OneRegImm<(outs rGPR:$Rd), (ins rGPR:$false, t2_so_imm:$imm),
2774                    IIC_iCMOVi, "mvn", ".w\t$Rd, $imm",
2775 [/*(set rGPR:$Rd,(ARMcmov rGPR:$false,t2_so_imm_not:$imm,
2776                    imm:$cc, CCR:$ccr))*/]>,
2777                    RegConstraint<"$false = $Rd"> {
2778   let Inst{31-27} = 0b11110;
2779   let Inst{25} = 0;
2780   let Inst{24-21} = 0b0011;
2781   let Inst{20} = 0; // The S bit.
2782   let Inst{19-16} = 0b1111; // Rn
2783   let Inst{15} = 0;
2784 }
2785
2786 class T2I_movcc_sh<bits<2> opcod, dag oops, dag iops, InstrItinClass itin,
2787                    string opc, string asm, list<dag> pattern>
2788   : T2TwoRegShiftImm<oops, iops, itin, opc, asm, pattern> {
2789   let Inst{31-27} = 0b11101;
2790   let Inst{26-25} = 0b01;
2791   let Inst{24-21} = 0b0010;
2792   let Inst{20} = 0; // The S bit.
2793   let Inst{19-16} = 0b1111; // Rn
2794   let Inst{5-4} = opcod; // Shift type.
2795 }
2796 def t2MOVCClsl : T2I_movcc_sh<0b00, (outs rGPR:$Rd),
2797                              (ins rGPR:$false, rGPR:$Rm, i32imm:$imm),
2798                              IIC_iCMOVsi, "lsl", ".w\t$Rd, $Rm, $imm", []>,
2799                  RegConstraint<"$false = $Rd">;
2800 def t2MOVCClsr : T2I_movcc_sh<0b01, (outs rGPR:$Rd),
2801                              (ins rGPR:$false, rGPR:$Rm, i32imm:$imm),
2802                              IIC_iCMOVsi, "lsr", ".w\t$Rd, $Rm, $imm", []>,
2803                  RegConstraint<"$false = $Rd">;
2804 def t2MOVCCasr : T2I_movcc_sh<0b10, (outs rGPR:$Rd),
2805                              (ins rGPR:$false, rGPR:$Rm, i32imm:$imm),
2806                              IIC_iCMOVsi, "asr", ".w\t$Rd, $Rm, $imm", []>,
2807                  RegConstraint<"$false = $Rd">;
2808 def t2MOVCCror : T2I_movcc_sh<0b11, (outs rGPR:$Rd),
2809                              (ins rGPR:$false, rGPR:$Rm, i32imm:$imm),
2810                              IIC_iCMOVsi, "ror", ".w\t$Rd, $Rm, $imm", []>,
2811                  RegConstraint<"$false = $Rd">;
2812 } // neverHasSideEffects
2813
2814 //===----------------------------------------------------------------------===//
2815 // Atomic operations intrinsics
2816 //
2817
2818 // memory barriers protect the atomic sequences
2819 let hasSideEffects = 1 in {
2820 def t2DMB : AInoP<(outs), (ins memb_opt:$opt), ThumbFrm, NoItinerary,
2821                   "dmb", "\t$opt", [(ARMMemBarrier (i32 imm:$opt))]>,
2822                   Requires<[IsThumb, HasDB]> {
2823   bits<4> opt;
2824   let Inst{31-4} = 0xf3bf8f5;
2825   let Inst{3-0} = opt;
2826 }
2827 }
2828
2829 def t2DSB : AInoP<(outs), (ins memb_opt:$opt), ThumbFrm, NoItinerary,
2830                   "dsb", "\t$opt",
2831                   [/* For disassembly only; pattern left blank */]>,
2832                   Requires<[IsThumb, HasDB]> {
2833   bits<4> opt;
2834   let Inst{31-4} = 0xf3bf8f4;
2835   let Inst{3-0} = opt;
2836 }
2837
2838 // ISB has only full system option -- for disassembly only
2839 def t2ISB : T2I<(outs), (ins), NoItinerary, "isb", "",
2840                   [/* For disassembly only; pattern left blank */]>,
2841                   Requires<[IsThumb2, HasV7]> {
2842   let Inst{31-4} = 0xf3bf8f6;
2843   let Inst{3-0} = 0b1111;
2844 }
2845
2846 class T2I_ldrex<bits<2> opcod, dag oops, dag iops, AddrMode am, SizeFlagVal sz,
2847                 InstrItinClass itin, string opc, string asm, string cstr,
2848                 list<dag> pattern, bits<4> rt2 = 0b1111>
2849   : Thumb2I<oops, iops, am, sz, itin, opc, asm, cstr, pattern> {
2850   let Inst{31-27} = 0b11101;
2851   let Inst{26-20} = 0b0001101;
2852   let Inst{11-8} = rt2;
2853   let Inst{7-6} = 0b01;
2854   let Inst{5-4} = opcod;
2855   let Inst{3-0} = 0b1111;
2856
2857   bits<4> Rn;
2858   bits<4> Rt;
2859   let Inst{19-16} = Rn{3-0};
2860   let Inst{15-12} = Rt{3-0};
2861 }
2862 class T2I_strex<bits<2> opcod, dag oops, dag iops, AddrMode am, SizeFlagVal sz,
2863                 InstrItinClass itin, string opc, string asm, string cstr,
2864                 list<dag> pattern, bits<4> rt2 = 0b1111>
2865   : Thumb2I<oops, iops, am, sz, itin, opc, asm, cstr, pattern> {
2866   let Inst{31-27} = 0b11101;
2867   let Inst{26-20} = 0b0001100;
2868   let Inst{11-8} = rt2;
2869   let Inst{7-6} = 0b01;
2870   let Inst{5-4} = opcod;
2871
2872   bits<4> Rd;
2873   bits<4> Rn;
2874   bits<4> Rt;
2875   let Inst{11-8}  = Rd{3-0};
2876   let Inst{19-16} = Rn{3-0};
2877   let Inst{15-12} = Rt{3-0};
2878 }
2879
2880 let mayLoad = 1 in {
2881 def t2LDREXB : T2I_ldrex<0b00, (outs rGPR:$Rt), (ins rGPR:$Rn), AddrModeNone,
2882                          Size4Bytes, NoItinerary, "ldrexb", "\t$Rt, [$Rn]",
2883                          "", []>;
2884 def t2LDREXH : T2I_ldrex<0b01, (outs rGPR:$Rt), (ins rGPR:$Rn), AddrModeNone,
2885                          Size4Bytes, NoItinerary, "ldrexh", "\t$Rt, [$Rn]",
2886                          "", []>;
2887 def t2LDREX  : Thumb2I<(outs rGPR:$Rt), (ins rGPR:$Rn), AddrModeNone,
2888                        Size4Bytes, NoItinerary,
2889                        "ldrex", "\t$Rt, [$Rn]", "",
2890                       []> {
2891   let Inst{31-27} = 0b11101;
2892   let Inst{26-20} = 0b0000101;
2893   let Inst{11-8} = 0b1111;
2894   let Inst{7-0} = 0b00000000; // imm8 = 0
2895 }
2896 def t2LDREXD : T2I_ldrex<0b11, (outs rGPR:$Rt, rGPR:$Rt2), (ins rGPR:$Rn),
2897                          AddrModeNone, Size4Bytes, NoItinerary,
2898                          "ldrexd", "\t$Rt, $Rt2, [$Rn]", "",
2899                          [], {?, ?, ?, ?}> {
2900   bits<4> Rt2;
2901   let Inst{11-8} = Rt2{3-0};
2902 }
2903 }
2904
2905 let mayStore = 1, Constraints = "@earlyclobber $Rd" in {
2906 def t2STREXB : T2I_strex<0b00, (outs rGPR:$Rd), (ins rGPR:$Rt, rGPR:$Rn),
2907                          AddrModeNone, Size4Bytes, NoItinerary,
2908                          "strexb", "\t$Rd, $Rt, [$Rn]", "", []>;
2909 def t2STREXH : T2I_strex<0b01, (outs rGPR:$Rd), (ins rGPR:$Rt, rGPR:$Rn),
2910                          AddrModeNone, Size4Bytes, NoItinerary,
2911                          "strexh", "\t$Rd, $Rt, [$Rn]", "", []>;
2912 def t2STREX  : Thumb2I<(outs rGPR:$Rd), (ins rGPR:$Rt, rGPR:$Rn),
2913                        AddrModeNone, Size4Bytes, NoItinerary,
2914                        "strex", "\t$Rd, $Rt, [$Rn]", "",
2915                       []> {
2916   let Inst{31-27} = 0b11101;
2917   let Inst{26-20} = 0b0000100;
2918   let Inst{7-0} = 0b00000000; // imm8 = 0
2919 }
2920 def t2STREXD : T2I_strex<0b11, (outs rGPR:$Rd),
2921                          (ins rGPR:$Rt, rGPR:$Rt2, rGPR:$Rn),
2922                          AddrModeNone, Size4Bytes, NoItinerary,
2923                          "strexd", "\t$Rd, $Rt, $Rt2, [$Rn]", "", [],
2924                          {?, ?, ?, ?}> {
2925   bits<4> Rt2;
2926   let Inst{11-8} = Rt2{3-0};
2927 }
2928 }
2929
2930 // Clear-Exclusive is for disassembly only.
2931 def t2CLREX : T2I<(outs), (ins), NoItinerary, "clrex", "",
2932                   [/* For disassembly only; pattern left blank */]>,
2933             Requires<[IsARM, HasV7]>  {
2934   let Inst{31-20} = 0xf3b;
2935   let Inst{15-14} = 0b10;
2936   let Inst{12} = 0;
2937   let Inst{7-4} = 0b0010;
2938 }
2939
2940 //===----------------------------------------------------------------------===//
2941 // TLS Instructions
2942 //
2943
2944 // __aeabi_read_tp preserves the registers r1-r3.
2945 let isCall = 1,
2946   Defs = [R0, R12, LR, CPSR], Uses = [SP] in {
2947   def t2TPsoft : T2XI<(outs), (ins), IIC_Br,
2948                      "bl\t__aeabi_read_tp",
2949                      [(set R0, ARMthread_pointer)]> {
2950     let Inst{31-27} = 0b11110;
2951     let Inst{15-14} = 0b11;
2952     let Inst{12} = 1;
2953   }
2954 }
2955
2956 //===----------------------------------------------------------------------===//
2957 // SJLJ Exception handling intrinsics
2958 //   eh_sjlj_setjmp() is an instruction sequence to store the return
2959 //   address and save #0 in R0 for the non-longjmp case.
2960 //   Since by its nature we may be coming from some other function to get
2961 //   here, and we're using the stack frame for the containing function to
2962 //   save/restore registers, we can't keep anything live in regs across
2963 //   the eh_sjlj_setjmp(), else it will almost certainly have been tromped upon
2964 //   when we get here from a longjmp(). We force everthing out of registers
2965 //   except for our own input by listing the relevant registers in Defs. By
2966 //   doing so, we also cause the prologue/epilogue code to actively preserve
2967 //   all of the callee-saved resgisters, which is exactly what we want.
2968 //   $val is a scratch register for our use.
2969 let Defs =
2970   [ R0,  R1,  R2,  R3,  R4,  R5,  R6,  R7,  R8,  R9,  R10, R11, R12, LR,  D0,
2971     D1,  D2,  D3,  D4,  D5,  D6,  D7,  D8,  D9,  D10, D11, D12, D13, D14, D15,
2972     D16, D17, D18, D19, D20, D21, D22, D23, D24, D25, D26, D27, D28, D29, D30,
2973     D31 ], hasSideEffects = 1, isBarrier = 1, isCodeGenOnly = 1 in {
2974   def t2Int_eh_sjlj_setjmp : Thumb2XI<(outs), (ins tGPR:$src, tGPR:$val),
2975                                AddrModeNone, SizeSpecial, NoItinerary, "", "",
2976                           [(set R0, (ARMeh_sjlj_setjmp tGPR:$src, tGPR:$val))]>,
2977                              Requires<[IsThumb2, HasVFP2]>;
2978 }
2979
2980 let Defs =
2981   [ R0,  R1,  R2,  R3,  R4,  R5,  R6,  R7,  R8,  R9,  R10, R11, R12, LR ],
2982   hasSideEffects = 1, isBarrier = 1, isCodeGenOnly = 1 in {
2983   def t2Int_eh_sjlj_setjmp_nofp : Thumb2XI<(outs), (ins tGPR:$src, tGPR:$val),
2984                                AddrModeNone, SizeSpecial, NoItinerary, "", "",
2985                           [(set R0, (ARMeh_sjlj_setjmp tGPR:$src, tGPR:$val))]>,
2986                                   Requires<[IsThumb2, NoVFP]>;
2987 }
2988
2989
2990 //===----------------------------------------------------------------------===//
2991 // Control-Flow Instructions
2992 //
2993
2994 // FIXME: remove when we have a way to marking a MI with these properties.
2995 // FIXME: $dst1 should be a def. But the extra ops must be in the end of the
2996 // operand list.
2997 // FIXME: Should pc be an implicit operand like PICADD, etc?
2998 let isReturn = 1, isTerminator = 1, isBarrier = 1, mayLoad = 1,
2999     hasExtraDefRegAllocReq = 1, isCodeGenOnly = 1 in
3000 def t2LDMIA_RET: T2XIt<(outs GPR:$wb), (ins GPR:$Rn, pred:$p,
3001                                         reglist:$regs, variable_ops),
3002                         IIC_iLoad_mBr,
3003                         "ldmia${p}.w\t$Rn!, $regs",
3004                         "$Rn = $wb", []> {
3005   bits<4>  Rn;
3006   bits<16> regs;
3007
3008   let Inst{31-27} = 0b11101;
3009   let Inst{26-25} = 0b00;
3010   let Inst{24-23} = 0b01;     // Increment After
3011   let Inst{22}    = 0;
3012   let Inst{21}    = 1;        // Writeback
3013   let Inst{20}    = 1;
3014   let Inst{19-16} = Rn;
3015   let Inst{15-0}  = regs;
3016 }
3017
3018 let isBranch = 1, isTerminator = 1, isBarrier = 1 in {
3019 let isPredicable = 1 in
3020 def t2B   : T2XI<(outs), (ins brtarget:$target), IIC_Br,
3021                  "b.w\t$target",
3022                  [(br bb:$target)]> {
3023   let Inst{31-27} = 0b11110;
3024   let Inst{15-14} = 0b10;
3025   let Inst{12} = 1;
3026
3027   bits<20> target;
3028   let Inst{26} = target{19};
3029   let Inst{11} = target{18};
3030   let Inst{13} = target{17};
3031   let Inst{21-16} = target{16-11};
3032   let Inst{10-0} = target{10-0};
3033 }
3034
3035 let isNotDuplicable = 1, isIndirectBranch = 1 in {
3036 def t2BR_JT : tPseudoInst<(outs),
3037           (ins GPR:$target, GPR:$index, i32imm:$jt, i32imm:$id),
3038            SizeSpecial, IIC_Br,
3039           [(ARMbr2jt GPR:$target, GPR:$index, tjumptable:$jt, imm:$id)]>;
3040
3041 // FIXME: Add a non-pc based case that can be predicated.
3042 def t2TBB_JT : tPseudoInst<(outs),
3043         (ins GPR:$index, i32imm:$jt, i32imm:$id),
3044          SizeSpecial, IIC_Br, []>;
3045
3046 def t2TBH_JT : tPseudoInst<(outs),
3047         (ins GPR:$index, i32imm:$jt, i32imm:$id),
3048          SizeSpecial, IIC_Br, []>;
3049
3050 def t2TBB : T2I<(outs), (ins GPR:$Rn, GPR:$Rm), IIC_Br,
3051                     "tbb", "\t[$Rn, $Rm]", []> {
3052   bits<4> Rn;
3053   bits<4> Rm;
3054   let Inst{27-20} = 0b10001101;
3055   let Inst{19-16} = Rn;
3056   let Inst{15-5} = 0b11110000000;
3057   let Inst{4} = 0; // B form
3058   let Inst{3-0} = Rm;
3059 }
3060
3061 def t2TBH : T2I<(outs), (ins GPR:$Rn, GPR:$Rm), IIC_Br,
3062                    "tbh", "\t[$Rn, $Rm, lsl #1]", []> {
3063   bits<4> Rn;
3064   bits<4> Rm;
3065   let Inst{27-20} = 0b10001101;
3066   let Inst{19-16} = Rn;
3067   let Inst{15-5} = 0b11110000000;
3068   let Inst{4} = 1; // H form
3069   let Inst{3-0} = Rm;
3070 }
3071 } // isNotDuplicable, isIndirectBranch
3072
3073 } // isBranch, isTerminator, isBarrier
3074
3075 // FIXME: should be able to write a pattern for ARMBrcond, but can't use
3076 // a two-value operand where a dag node expects two operands. :(
3077 let isBranch = 1, isTerminator = 1 in
3078 def t2Bcc : T2I<(outs), (ins brtarget:$target), IIC_Br,
3079                 "b", ".w\t$target",
3080                 [/*(ARMbrcond bb:$target, imm:$cc)*/]> {
3081   let Inst{31-27} = 0b11110;
3082   let Inst{15-14} = 0b10;
3083   let Inst{12} = 0;
3084   
3085   bits<20> target;
3086   let Inst{26} = target{19};
3087   let Inst{11} = target{18};
3088   let Inst{13} = target{17};
3089   let Inst{21-16} = target{16-11};
3090   let Inst{10-0} = target{10-0};
3091 }
3092
3093
3094 // IT block
3095 let Defs = [ITSTATE] in
3096 def t2IT : Thumb2XI<(outs), (ins it_pred:$cc, it_mask:$mask),
3097                     AddrModeNone, Size2Bytes,  IIC_iALUx,
3098                     "it$mask\t$cc", "", []> {
3099   // 16-bit instruction.
3100   let Inst{31-16} = 0x0000;
3101   let Inst{15-8} = 0b10111111;
3102
3103   bits<4> cc;
3104   bits<4> mask;
3105   let Inst{7-4} = cc{3-0};
3106   let Inst{3-0} = mask{3-0};
3107 }
3108
3109 // Branch and Exchange Jazelle -- for disassembly only
3110 // Rm = Inst{19-16}
3111 def t2BXJ : T2I<(outs), (ins rGPR:$func), NoItinerary, "bxj", "\t$func",
3112               [/* For disassembly only; pattern left blank */]> {
3113   let Inst{31-27} = 0b11110;
3114   let Inst{26} = 0;
3115   let Inst{25-20} = 0b111100;
3116   let Inst{15-14} = 0b10;
3117   let Inst{12} = 0;
3118   
3119   bits<4> func;
3120   let Inst{19-16} = func{3-0};
3121 }
3122
3123 // Change Processor State is a system instruction -- for disassembly only.
3124 // The singleton $opt operand contains the following information:
3125 // opt{4-0} = mode from Inst{4-0}
3126 // opt{5} = changemode from Inst{17}
3127 // opt{8-6} = AIF from Inst{8-6}
3128 // opt{10-9} = imod from Inst{19-18} with 0b10 as enable and 0b11 as disable
3129 def t2CPS : T2XI<(outs),(ins cps_opt:$opt), NoItinerary, "cps$opt",
3130                  [/* For disassembly only; pattern left blank */]> {
3131   let Inst{31-27} = 0b11110;
3132   let Inst{26} = 0;
3133   let Inst{25-20} = 0b111010;
3134   let Inst{15-14} = 0b10;
3135   let Inst{12} = 0;
3136   
3137   bits<11> opt;
3138   
3139   // mode number
3140   let Inst{4-0} = opt{4-0};
3141   
3142   // M flag
3143   let Inst{8} = opt{5};
3144   
3145   // F flag
3146   let Inst{5} = opt{6};
3147   
3148   // I flag
3149   let Inst{6} = opt{7};
3150   
3151   // A flag
3152   let Inst{7} = opt{8};
3153   
3154   // imod flag
3155   let Inst{10-9} = opt{10-9};
3156 }
3157
3158 // A6.3.4 Branches and miscellaneous control
3159 // Table A6-14 Change Processor State, and hint instructions
3160 // Helper class for disassembly only.
3161 class T2I_hint<bits<8> op7_0, string opc, string asm>
3162   : T2I<(outs), (ins), NoItinerary, opc, asm,
3163         [/* For disassembly only; pattern left blank */]> {
3164   let Inst{31-20} = 0xf3a;
3165   let Inst{15-14} = 0b10;
3166   let Inst{12} = 0;
3167   let Inst{10-8} = 0b000;
3168   let Inst{7-0} = op7_0;
3169 }
3170
3171 def t2NOP   : T2I_hint<0b00000000, "nop",   ".w">;
3172 def t2YIELD : T2I_hint<0b00000001, "yield", ".w">;
3173 def t2WFE   : T2I_hint<0b00000010, "wfe",   ".w">;
3174 def t2WFI   : T2I_hint<0b00000011, "wfi",   ".w">;
3175 def t2SEV   : T2I_hint<0b00000100, "sev",   ".w">;
3176
3177 def t2DBG : T2I<(outs),(ins i32imm:$opt), NoItinerary, "dbg", "\t$opt",
3178                 [/* For disassembly only; pattern left blank */]> {
3179   let Inst{31-20} = 0xf3a;
3180   let Inst{15-14} = 0b10;
3181   let Inst{12} = 0;
3182   let Inst{10-8} = 0b000;
3183   let Inst{7-4} = 0b1111;
3184   
3185   bits<4> opt;
3186   let Inst{3-0} = opt{3-0};
3187 }
3188
3189 // Secure Monitor Call is a system instruction -- for disassembly only
3190 // Option = Inst{19-16}
3191 def t2SMC : T2I<(outs), (ins i32imm:$opt), NoItinerary, "smc", "\t$opt",
3192                 [/* For disassembly only; pattern left blank */]> {
3193   let Inst{31-27} = 0b11110;
3194   let Inst{26-20} = 0b1111111;
3195   let Inst{15-12} = 0b1000;
3196   
3197   bits<4> opt;
3198   let Inst{19-16} = opt{3-0};
3199 }
3200
3201 class T2SRS<bits<12> op31_20, 
3202            dag oops, dag iops, InstrItinClass itin,
3203           string opc, string asm, list<dag> pattern>
3204   : T2I<oops, iops, itin, opc, asm, pattern> {
3205   let Inst{31-20} = op31_20{11-0};
3206   
3207   bits<5> mode;
3208   let Inst{4-0} = mode{4-0};
3209 }
3210
3211 // Store Return State is a system instruction -- for disassembly only
3212 def t2SRSDBW : T2SRS<0b111010000010,
3213                    (outs),(ins i32imm:$mode),NoItinerary,"srsdb","\tsp!, $mode",
3214                    [/* For disassembly only; pattern left blank */]>;
3215 def t2SRSDB  : T2SRS<0b111010000000,
3216                    (outs),(ins i32imm:$mode),NoItinerary,"srsdb","\tsp, $mode",
3217                    [/* For disassembly only; pattern left blank */]>;
3218 def t2SRSIAW : T2SRS<0b111010011010,
3219                    (outs),(ins i32imm:$mode),NoItinerary,"srsia","\tsp!, $mode",
3220                    [/* For disassembly only; pattern left blank */]>;
3221 def t2SRSIA  : T2SRS<0b111010011000,
3222                    (outs), (ins i32imm:$mode),NoItinerary,"srsia","\tsp, $mode",
3223                    [/* For disassembly only; pattern left blank */]>;
3224
3225 // Return From Exception is a system instruction -- for disassembly only
3226
3227 class T2RFE<bits<12> op31_20, dag oops, dag iops, InstrItinClass itin,
3228           string opc, string asm, list<dag> pattern>
3229   : T2I<oops, iops, itin, opc, asm, pattern> {
3230   let Inst{31-20} = op31_20{11-0};
3231   
3232   bits<4> Rn;
3233   let Inst{19-16} = Rn{3-0};
3234 }
3235
3236 def t2RFEDBW : T2RFE<0b111010000011,
3237                    (outs), (ins rGPR:$Rn), NoItinerary, "rfedb", "\t$Rn!",
3238                    [/* For disassembly only; pattern left blank */]>;
3239 def t2RFEDB  : T2RFE<0b111010000001,
3240                    (outs), (ins rGPR:$Rn), NoItinerary, "rfeab", "\t$Rn",
3241                    [/* For disassembly only; pattern left blank */]>;
3242 def t2RFEIAW : T2RFE<0b111010011011,
3243                    (outs), (ins rGPR:$Rn), NoItinerary, "rfeia", "\t$Rn!",
3244                    [/* For disassembly only; pattern left blank */]>;
3245 def t2RFEIA  : T2RFE<0b111010011001,
3246                    (outs), (ins rGPR:$Rn), NoItinerary, "rfeia", "\t$Rn",
3247                    [/* For disassembly only; pattern left blank */]>;
3248
3249 //===----------------------------------------------------------------------===//
3250 // Non-Instruction Patterns
3251 //
3252
3253 // 32-bit immediate using movw + movt.
3254 // This is a single pseudo instruction to make it re-materializable.
3255 // FIXME: Remove this when we can do generalized remat.
3256 let isReMaterializable = 1, isMoveImm = 1 in
3257 def t2MOVi32imm : PseudoInst<(outs rGPR:$dst), (ins i32imm:$src), IIC_iMOVix2,
3258                             [(set rGPR:$dst, (i32 imm:$src))]>,
3259                             Requires<[IsThumb, HasV6T2]>;
3260
3261 // ConstantPool, GlobalAddress, and JumpTable
3262 def : T2Pat<(ARMWrapper  tglobaladdr :$dst), (t2LEApcrel tglobaladdr :$dst)>,
3263            Requires<[IsThumb2, DontUseMovt]>;
3264 def : T2Pat<(ARMWrapper  tconstpool  :$dst), (t2LEApcrel tconstpool  :$dst)>;
3265 def : T2Pat<(ARMWrapper  tglobaladdr :$dst), (t2MOVi32imm tglobaladdr :$dst)>,
3266            Requires<[IsThumb2, UseMovt]>;
3267
3268 def : T2Pat<(ARMWrapperJT tjumptable:$dst, imm:$id),
3269             (t2LEApcrelJT tjumptable:$dst, imm:$id)>;
3270
3271 // Pseudo instruction that combines ldr from constpool and add pc. This should
3272 // be expanded into two instructions late to allow if-conversion and
3273 // scheduling.
3274 let canFoldAsLoad = 1, isReMaterializable = 1 in
3275 def t2LDRpci_pic : PseudoInst<(outs GPR:$dst), (ins i32imm:$addr, pclabel:$cp),
3276                    IIC_iLoadiALU,
3277                [(set GPR:$dst, (ARMpic_add (load (ARMWrapper tconstpool:$addr)),
3278                                            imm:$cp))]>,
3279                Requires<[IsThumb2]>;
3280
3281 //===----------------------------------------------------------------------===//
3282 // Move between special register and ARM core register -- for disassembly only
3283 //
3284
3285 class T2SpecialReg<bits<12> op31_20, bits<2> op15_14, bits<1> op12,
3286           dag oops, dag iops, InstrItinClass itin,
3287           string opc, string asm, list<dag> pattern>
3288   : T2I<oops, iops, itin, opc, asm, pattern> {
3289   let Inst{31-20} = op31_20{11-0};
3290   let Inst{15-14} = op15_14{1-0};
3291   let Inst{12} = op12{0};
3292 }
3293
3294 class T2MRS<bits<12> op31_20, bits<2> op15_14, bits<1> op12,
3295           dag oops, dag iops, InstrItinClass itin,
3296           string opc, string asm, list<dag> pattern>
3297   : T2SpecialReg<op31_20, op15_14, op12, oops, iops, itin, opc, asm, pattern> {
3298   bits<4> Rd;
3299   let Inst{11-8} = Rd{3-0};
3300 }
3301
3302 def t2MRS : T2MRS<0b111100111110, 0b10, 0,
3303                 (outs rGPR:$Rd), (ins), NoItinerary, "mrs", "\t$Rd, cpsr",
3304                 [/* For disassembly only; pattern left blank */]>;
3305 def t2MRSsys : T2MRS<0b111100111111, 0b10, 0,
3306                    (outs rGPR:$Rd), (ins), NoItinerary, "mrs", "\t$Rd, spsr",
3307                    [/* For disassembly only; pattern left blank */]>;
3308
3309 class T2MSR<bits<12> op31_20, bits<2> op15_14, bits<1> op12,
3310             dag oops, dag iops, InstrItinClass itin,
3311           string opc, string asm, list<dag> pattern>
3312   : T2SpecialReg<op31_20, op15_14, op12, oops, iops, itin, opc, asm, pattern> {
3313   bits<4> Rn;
3314   bits<4> mask;
3315   let Inst{19-16} = Rn{3-0};
3316   let Inst{11-8} = mask{3-0};
3317 }
3318
3319 def t2MSR : T2MSR<0b111100111000, 0b10, 0,
3320                 (outs), (ins rGPR:$Rn, msr_mask:$mask), NoItinerary, "msr",
3321                 "\tcpsr$mask, $Rn",
3322                 [/* For disassembly only; pattern left blank */]>;
3323 def t2MSRsys : T2MSR<0b111100111001, 0b10, 0,
3324                    (outs), (ins rGPR:$Rn, msr_mask:$mask), NoItinerary, "msr",
3325                    "\tspsr$mask, $Rn",
3326                    [/* For disassembly only; pattern left blank */]>;