Add encoding support for Thumb2 PLD and PLI instructions.
[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 : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b), NoItinerary, "sel",
1874                 "\t$dst, $a, $b", []> {
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: T2I<(outs rGPR:$Rd), (ins i32imm:$sat_imm, rGPR:$Rn, shift_imm:$sh),
2009                 NoItinerary, "ssat", "\t$Rd, $sat_imm, $Rn$sh",
2010                 [/* For disassembly only; pattern left blank */]> {
2011   let Inst{31-27} = 0b11110;
2012   let Inst{25-22} = 0b1100;
2013   let Inst{20} = 0;
2014   let Inst{15} = 0;
2015 }
2016
2017 def t2SSAT16: T2I<(outs rGPR:$Rd), (ins i32imm:$sat_imm, rGPR:$Rn), NoItinerary,
2018                    "ssat16", "\t$Rd, $sat_imm, $Rn",
2019                    [/* For disassembly only; pattern left blank */]> {
2020   let Inst{31-27} = 0b11110;
2021   let Inst{25-22} = 0b1100;
2022   let Inst{20} = 0;
2023   let Inst{15} = 0;
2024   let Inst{21} = 1;        // sh = '1'
2025   let Inst{14-12} = 0b000; // imm3 = '000'
2026   let Inst{7-6} = 0b00;    // imm2 = '00'
2027 }
2028
2029 def t2USAT: T2I<(outs rGPR:$dst), (ins i32imm:$bit_pos, rGPR:$a, shift_imm:$sh),
2030                 NoItinerary, "usat", "\t$dst, $bit_pos, $a$sh",
2031                 [/* For disassembly only; pattern left blank */]> {
2032   let Inst{31-27} = 0b11110;
2033   let Inst{25-22} = 0b1110;
2034   let Inst{20} = 0;
2035   let Inst{15} = 0;
2036 }
2037
2038 def t2USAT16: T2I<(outs rGPR:$dst), (ins i32imm:$bit_pos, rGPR:$a), NoItinerary,
2039                    "usat16", "\t$dst, $bit_pos, $a",
2040                    [/* For disassembly only; pattern left blank */]> {
2041   let Inst{31-27} = 0b11110;
2042   let Inst{25-22} = 0b1110;
2043   let Inst{20} = 0;
2044   let Inst{15} = 0;
2045   let Inst{21} = 1;        // sh = '1'
2046   let Inst{14-12} = 0b000; // imm3 = '000'
2047   let Inst{7-6} = 0b00;    // imm2 = '00'
2048 }
2049
2050 def : T2Pat<(int_arm_ssat GPR:$a, imm:$pos), (t2SSAT imm:$pos, GPR:$a, 0)>;
2051 def : T2Pat<(int_arm_usat GPR:$a, imm:$pos), (t2USAT imm:$pos, GPR:$a, 0)>;
2052
2053 //===----------------------------------------------------------------------===//
2054 //  Shift and rotate Instructions.
2055 //
2056
2057 defm t2LSL  : T2I_sh_ir<0b00, "lsl", BinOpFrag<(shl  node:$LHS, node:$RHS)>>;
2058 defm t2LSR  : T2I_sh_ir<0b01, "lsr", BinOpFrag<(srl  node:$LHS, node:$RHS)>>;
2059 defm t2ASR  : T2I_sh_ir<0b10, "asr", BinOpFrag<(sra  node:$LHS, node:$RHS)>>;
2060 defm t2ROR  : T2I_sh_ir<0b11, "ror", BinOpFrag<(rotr node:$LHS, node:$RHS)>>;
2061
2062 let Uses = [CPSR] in {
2063 def t2RRX : T2sTwoReg<(outs rGPR:$Rd), (ins rGPR:$Rm), IIC_iMOVsi,
2064                    "rrx", "\t$Rd, $Rm",
2065                    [(set rGPR:$Rd, (ARMrrx rGPR:$Rm))]> {
2066   let Inst{31-27} = 0b11101;
2067   let Inst{26-25} = 0b01;
2068   let Inst{24-21} = 0b0010;
2069   let Inst{20} = ?; // The S bit.
2070   let Inst{19-16} = 0b1111; // Rn
2071   let Inst{14-12} = 0b000;
2072   let Inst{7-4} = 0b0011;
2073 }
2074 }
2075
2076 let Defs = [CPSR] in {
2077 def t2MOVsrl_flag : T2TwoRegShiftImm<
2078                         (outs rGPR:$Rd), (ins rGPR:$Rm), IIC_iMOVsi,
2079                         "lsrs", ".w\t$Rd, $Rm, #1",
2080                         [(set rGPR:$Rd, (ARMsrl_flag rGPR:$Rm))]> {
2081   let Inst{31-27} = 0b11101;
2082   let Inst{26-25} = 0b01;
2083   let Inst{24-21} = 0b0010;
2084   let Inst{20} = 1; // The S bit.
2085   let Inst{19-16} = 0b1111; // Rn
2086   let Inst{5-4} = 0b01; // Shift type.
2087   // Shift amount = Inst{14-12:7-6} = 1.
2088   let Inst{14-12} = 0b000;
2089   let Inst{7-6} = 0b01;
2090 }
2091 def t2MOVsra_flag : T2TwoRegShiftImm<
2092                         (outs rGPR:$Rd), (ins rGPR:$Rm), IIC_iMOVsi,
2093                         "asrs", ".w\t$Rd, $Rm, #1",
2094                         [(set rGPR:$Rd, (ARMsra_flag rGPR:$Rm))]> {
2095   let Inst{31-27} = 0b11101;
2096   let Inst{26-25} = 0b01;
2097   let Inst{24-21} = 0b0010;
2098   let Inst{20} = 1; // The S bit.
2099   let Inst{19-16} = 0b1111; // Rn
2100   let Inst{5-4} = 0b10; // Shift type.
2101   // Shift amount = Inst{14-12:7-6} = 1.
2102   let Inst{14-12} = 0b000;
2103   let Inst{7-6} = 0b01;
2104 }
2105 }
2106
2107 //===----------------------------------------------------------------------===//
2108 //  Bitwise Instructions.
2109 //
2110
2111 defm t2AND  : T2I_bin_w_irs<0b0000, "and",
2112                             IIC_iBITi, IIC_iBITr, IIC_iBITsi,
2113                             BinOpFrag<(and node:$LHS, node:$RHS)>, 1>;
2114 defm t2ORR  : T2I_bin_w_irs<0b0010, "orr",
2115                             IIC_iBITi, IIC_iBITr, IIC_iBITsi,
2116                             BinOpFrag<(or  node:$LHS, node:$RHS)>, 1>;
2117 defm t2EOR  : T2I_bin_w_irs<0b0100, "eor",
2118                             IIC_iBITi, IIC_iBITr, IIC_iBITsi,
2119                             BinOpFrag<(xor node:$LHS, node:$RHS)>, 1>;
2120
2121 defm t2BIC  : T2I_bin_w_irs<0b0001, "bic",
2122                             IIC_iBITi, IIC_iBITr, IIC_iBITsi,
2123                             BinOpFrag<(and node:$LHS, (not node:$RHS))>>;
2124
2125 class T2BitFI<dag oops, dag iops, InstrItinClass itin,
2126               string opc, string asm, list<dag> pattern>
2127     : T2I<oops, iops, itin, opc, asm, pattern> {
2128   bits<4> Rd;
2129   bits<5> msb;
2130   bits<5> lsb;
2131
2132   let Inst{11-8}  = Rd{3-0};
2133   let Inst{4-0}   = msb{4-0};
2134   let Inst{14-12} = lsb{4-2};
2135   let Inst{7-6}   = lsb{1-0};
2136 }
2137
2138 class T2TwoRegBitFI<dag oops, dag iops, InstrItinClass itin,
2139               string opc, string asm, list<dag> pattern>
2140     : T2BitFI<oops, iops, itin, opc, asm, pattern> {
2141   bits<4> Rn;
2142
2143   let Inst{19-16} = Rn{3-0};
2144 }
2145
2146 let Constraints = "$src = $Rd" in
2147 def t2BFC : T2BitFI<(outs rGPR:$Rd), (ins rGPR:$src, bf_inv_mask_imm:$imm),
2148                 IIC_iUNAsi, "bfc", "\t$Rd, $imm",
2149                 [(set rGPR:$Rd, (and rGPR:$src, bf_inv_mask_imm:$imm))]> {
2150   let Inst{31-27} = 0b11110;
2151   let Inst{25} = 1;
2152   let Inst{24-20} = 0b10110;
2153   let Inst{19-16} = 0b1111; // Rn
2154   let Inst{15} = 0;
2155
2156   bits<10> imm;
2157   let msb{4-0} = imm{9-5};
2158   let lsb{4-0} = imm{4-0};
2159 }
2160
2161 def t2SBFX: T2TwoRegBitFI<
2162                 (outs rGPR:$Rd), (ins rGPR:$Rn, imm0_31:$lsb, imm0_31_m1:$msb),
2163                  IIC_iUNAsi, "sbfx", "\t$Rd, $Rn, $lsb, $msb", []> {
2164   let Inst{31-27} = 0b11110;
2165   let Inst{25} = 1;
2166   let Inst{24-20} = 0b10100;
2167   let Inst{15} = 0;
2168 }
2169
2170 def t2UBFX: T2TwoRegBitFI<
2171                 (outs rGPR:$Rd), (ins rGPR:$Rn, imm0_31:$lsb, imm0_31_m1:$msb),
2172                  IIC_iUNAsi, "ubfx", "\t$Rd, $Rn, $lsb, $msb", []> {
2173   let Inst{31-27} = 0b11110;
2174   let Inst{25} = 1;
2175   let Inst{24-20} = 0b11100;
2176   let Inst{15} = 0;
2177 }
2178
2179 // A8.6.18  BFI - Bitfield insert (Encoding T1)
2180 let Constraints = "$src = $Rd" in
2181 def t2BFI : T2TwoRegBitFI<(outs rGPR:$Rd),
2182                 (ins rGPR:$src, rGPR:$Rn, bf_inv_mask_imm:$imm),
2183                 IIC_iBITi, "bfi", "\t$Rd, $Rn, $imm",
2184                 [(set rGPR:$Rd, (ARMbfi rGPR:$src, rGPR:$Rn,
2185                                  bf_inv_mask_imm:$imm))]> {
2186   let Inst{31-27} = 0b11110;
2187   let Inst{25} = 1;
2188   let Inst{24-20} = 0b10110;
2189   let Inst{15} = 0;
2190
2191   bits<10> imm;
2192   let msb{4-0} = imm{9-5};
2193   let lsb{4-0} = imm{4-0};
2194 }
2195
2196 defm t2ORN  : T2I_bin_irs<0b0011, "orn",
2197                           IIC_iBITi, IIC_iBITr, IIC_iBITsi,
2198                           BinOpFrag<(or  node:$LHS, (not node:$RHS))>, 0, "">;
2199
2200 // Prefer over of t2EORri ra, rb, -1 because mvn has 16-bit version
2201 let AddedComplexity = 1 in
2202 defm t2MVN  : T2I_un_irs <0b0011, "mvn",
2203                           IIC_iMVNi, IIC_iMVNr, IIC_iMVNsi,
2204                           UnOpFrag<(not node:$Src)>, 1, 1>;
2205
2206
2207 let AddedComplexity = 1 in
2208 def : T2Pat<(and     rGPR:$src, t2_so_imm_not:$imm),
2209             (t2BICri rGPR:$src, t2_so_imm_not:$imm)>;
2210
2211 // FIXME: Disable this pattern on Darwin to workaround an assembler bug.
2212 def : T2Pat<(or      rGPR:$src, t2_so_imm_not:$imm),
2213             (t2ORNri rGPR:$src, t2_so_imm_not:$imm)>,
2214             Requires<[IsThumb2]>;
2215
2216 def : T2Pat<(t2_so_imm_not:$src),
2217             (t2MVNi t2_so_imm_not:$src)>;
2218
2219 //===----------------------------------------------------------------------===//
2220 //  Multiply Instructions.
2221 //
2222 let isCommutable = 1 in
2223 def t2MUL: T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iMUL32,
2224                 "mul", "\t$Rd, $Rn, $Rm",
2225                 [(set rGPR:$Rd, (mul rGPR:$Rn, rGPR:$Rm))]> {
2226   let Inst{31-27} = 0b11111;
2227   let Inst{26-23} = 0b0110;
2228   let Inst{22-20} = 0b000;
2229   let Inst{15-12} = 0b1111; // Ra = 0b1111 (no accumulate)
2230   let Inst{7-4} = 0b0000; // Multiply
2231 }
2232
2233 def t2MLA: T2FourReg<
2234                 (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC32,
2235                 "mla", "\t$Rd, $Rn, $Rm, $Ra",
2236                 [(set rGPR:$Rd, (add (mul rGPR:$Rn, rGPR:$Rm), rGPR:$Ra))]> {
2237   let Inst{31-27} = 0b11111;
2238   let Inst{26-23} = 0b0110;
2239   let Inst{22-20} = 0b000;
2240   let Inst{7-4} = 0b0000; // Multiply
2241 }
2242
2243 def t2MLS: T2FourReg<
2244                 (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC32,
2245                 "mls", "\t$Rd, $Rn, $Rm, $Ra",
2246                 [(set rGPR:$Rd, (sub rGPR:$Ra, (mul rGPR:$Rn, rGPR:$Rm)))]> {
2247   let Inst{31-27} = 0b11111;
2248   let Inst{26-23} = 0b0110;
2249   let Inst{22-20} = 0b000;
2250   let Inst{7-4} = 0b0001; // Multiply and Subtract
2251 }
2252
2253 // Extra precision multiplies with low / high results
2254 let neverHasSideEffects = 1 in {
2255 let isCommutable = 1 in {
2256 def t2SMULL : T2FourReg<
2257                   (outs rGPR:$Rd, rGPR:$Ra),
2258                   (ins rGPR:$Rn, rGPR:$Rm), IIC_iMUL64,
2259                    "smull", "\t$Rd, $Ra, $Rn, $Rm", []> {
2260   let Inst{31-27} = 0b11111;
2261   let Inst{26-23} = 0b0111;
2262   let Inst{22-20} = 0b000;
2263   let Inst{7-4} = 0b0000;
2264 }
2265
2266 def t2UMULL : T2FourReg<
2267                   (outs rGPR:$Rd, rGPR:$Ra),
2268                   (ins rGPR:$Rn, rGPR:$Rm), IIC_iMUL64,
2269                    "umull", "\t$Rd, $Ra, $Rn, $Rm", []> {
2270   let Inst{31-27} = 0b11111;
2271   let Inst{26-23} = 0b0111;
2272   let Inst{22-20} = 0b010;
2273   let Inst{7-4} = 0b0000;
2274 }
2275 } // isCommutable
2276
2277 // Multiply + accumulate
2278 def t2SMLAL : T2FourReg<(outs rGPR:$Ra, rGPR:$Rd),
2279                   (ins rGPR:$Rn, rGPR:$Rm), IIC_iMAC64,
2280                   "smlal", "\t$Ra, $Rd, $Rn, $Rm", []>{
2281   let Inst{31-27} = 0b11111;
2282   let Inst{26-23} = 0b0111;
2283   let Inst{22-20} = 0b100;
2284   let Inst{7-4} = 0b0000;
2285 }
2286
2287 def t2UMLAL : T2FourReg<(outs rGPR:$Ra, rGPR:$Rd),
2288                   (ins rGPR:$Rn, rGPR:$Rm), IIC_iMAC64,
2289                   "umlal", "\t$Ra, $Rd, $Rn, $Rm", []>{
2290   let Inst{31-27} = 0b11111;
2291   let Inst{26-23} = 0b0111;
2292   let Inst{22-20} = 0b110;
2293   let Inst{7-4} = 0b0000;
2294 }
2295
2296 def t2UMAAL : T2FourReg<(outs rGPR:$Ra, rGPR:$Rd),
2297                   (ins rGPR:$Rn, rGPR:$Rm), IIC_iMAC64,
2298                   "umaal", "\t$Ra, $Rd, $Rn, $Rm", []>{
2299   let Inst{31-27} = 0b11111;
2300   let Inst{26-23} = 0b0111;
2301   let Inst{22-20} = 0b110;
2302   let Inst{7-4} = 0b0110;
2303 }
2304 } // neverHasSideEffects
2305
2306 // Rounding variants of the below included for disassembly only
2307
2308 // Most significant word multiply
2309 def t2SMMUL : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iMUL32,
2310                   "smmul", "\t$Rd, $Rn, $Rm",
2311                   [(set rGPR:$Rd, (mulhs rGPR:$Rn, rGPR:$Rm))]> {
2312   let Inst{31-27} = 0b11111;
2313   let Inst{26-23} = 0b0110;
2314   let Inst{22-20} = 0b101;
2315   let Inst{15-12} = 0b1111; // Ra = 0b1111 (no accumulate)
2316   let Inst{7-4} = 0b0000; // No Rounding (Inst{4} = 0)
2317 }
2318
2319 def t2SMMULR : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iMUL32,
2320                   "smmulr", "\t$Rd, $Rn, $Rm", []> {
2321   let Inst{31-27} = 0b11111;
2322   let Inst{26-23} = 0b0110;
2323   let Inst{22-20} = 0b101;
2324   let Inst{15-12} = 0b1111; // Ra = 0b1111 (no accumulate)
2325   let Inst{7-4} = 0b0001; // Rounding (Inst{4} = 1)
2326 }
2327
2328 def t2SMMLA : T2FourReg<
2329         (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC32,
2330                 "smmla", "\t$Rd, $Rn, $Rm, $Ra",
2331                 [(set rGPR:$Rd, (add (mulhs rGPR:$Rm, rGPR:$Rn), rGPR:$Ra))]> {
2332   let Inst{31-27} = 0b11111;
2333   let Inst{26-23} = 0b0110;
2334   let Inst{22-20} = 0b101;
2335   let Inst{7-4} = 0b0000; // No Rounding (Inst{4} = 0)
2336 }
2337
2338 def t2SMMLAR: T2FourReg<
2339         (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC32,
2340                   "smmlar", "\t$Rd, $Rn, $Rm, $Ra", []> {
2341   let Inst{31-27} = 0b11111;
2342   let Inst{26-23} = 0b0110;
2343   let Inst{22-20} = 0b101;
2344   let Inst{7-4} = 0b0001; // Rounding (Inst{4} = 1)
2345 }
2346
2347 def t2SMMLS: T2FourReg<
2348         (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC32,
2349                 "smmls", "\t$Rd, $Rn, $Rm, $Ra",
2350                 [(set rGPR:$Rd, (sub rGPR:$Ra, (mulhs rGPR:$Rn, rGPR:$Rm)))]> {
2351   let Inst{31-27} = 0b11111;
2352   let Inst{26-23} = 0b0110;
2353   let Inst{22-20} = 0b110;
2354   let Inst{7-4} = 0b0000; // No Rounding (Inst{4} = 0)
2355 }
2356
2357 def t2SMMLSR:T2FourReg<
2358         (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC32,
2359                 "smmlsr", "\t$Rd, $Rn, $Rm, $Ra", []> {
2360   let Inst{31-27} = 0b11111;
2361   let Inst{26-23} = 0b0110;
2362   let Inst{22-20} = 0b110;
2363   let Inst{7-4} = 0b0001; // Rounding (Inst{4} = 1)
2364 }
2365
2366 multiclass T2I_smul<string opc, PatFrag opnode> {
2367   def BB : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iMUL16,
2368               !strconcat(opc, "bb"), "\t$Rd, $Rn, $Rm",
2369               [(set rGPR:$Rd, (opnode (sext_inreg rGPR:$Rn, i16),
2370                                       (sext_inreg rGPR:$Rm, i16)))]> {
2371     let Inst{31-27} = 0b11111;
2372     let Inst{26-23} = 0b0110;
2373     let Inst{22-20} = 0b001;
2374     let Inst{15-12} = 0b1111; // Ra = 0b1111 (no accumulate)
2375     let Inst{7-6} = 0b00;
2376     let Inst{5-4} = 0b00;
2377   }
2378
2379   def BT : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iMUL16,
2380               !strconcat(opc, "bt"), "\t$Rd, $Rn, $Rm",
2381               [(set rGPR:$Rd, (opnode (sext_inreg rGPR:$Rn, i16),
2382                                       (sra rGPR:$Rm, (i32 16))))]> {
2383     let Inst{31-27} = 0b11111;
2384     let Inst{26-23} = 0b0110;
2385     let Inst{22-20} = 0b001;
2386     let Inst{15-12} = 0b1111; // Ra = 0b1111 (no accumulate)
2387     let Inst{7-6} = 0b00;
2388     let Inst{5-4} = 0b01;
2389   }
2390
2391   def TB : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iMUL16,
2392               !strconcat(opc, "tb"), "\t$Rd, $Rn, $Rm",
2393               [(set rGPR:$Rd, (opnode (sra rGPR:$Rn, (i32 16)),
2394                                       (sext_inreg rGPR:$Rm, i16)))]> {
2395     let Inst{31-27} = 0b11111;
2396     let Inst{26-23} = 0b0110;
2397     let Inst{22-20} = 0b001;
2398     let Inst{15-12} = 0b1111; // Ra = 0b1111 (no accumulate)
2399     let Inst{7-6} = 0b00;
2400     let Inst{5-4} = 0b10;
2401   }
2402
2403   def TT : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iMUL16,
2404               !strconcat(opc, "tt"), "\t$Rd, $Rn, $Rm",
2405               [(set rGPR:$Rd, (opnode (sra rGPR:$Rn, (i32 16)),
2406                                       (sra rGPR:$Rm, (i32 16))))]> {
2407     let Inst{31-27} = 0b11111;
2408     let Inst{26-23} = 0b0110;
2409     let Inst{22-20} = 0b001;
2410     let Inst{15-12} = 0b1111; // Ra = 0b1111 (no accumulate)
2411     let Inst{7-6} = 0b00;
2412     let Inst{5-4} = 0b11;
2413   }
2414
2415   def WB : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iMUL16,
2416               !strconcat(opc, "wb"), "\t$Rd, $Rn, $Rm",
2417               [(set rGPR:$Rd, (sra (opnode rGPR:$Rn,
2418                                     (sext_inreg rGPR:$Rm, i16)), (i32 16)))]> {
2419     let Inst{31-27} = 0b11111;
2420     let Inst{26-23} = 0b0110;
2421     let Inst{22-20} = 0b011;
2422     let Inst{15-12} = 0b1111; // Ra = 0b1111 (no accumulate)
2423     let Inst{7-6} = 0b00;
2424     let Inst{5-4} = 0b00;
2425   }
2426
2427   def WT : T2ThreeReg<(outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm), IIC_iMUL16,
2428               !strconcat(opc, "wt"), "\t$Rd, $Rn, $Rm",
2429               [(set rGPR:$Rd, (sra (opnode rGPR:$Rn,
2430                                     (sra rGPR:$Rm, (i32 16))), (i32 16)))]> {
2431     let Inst{31-27} = 0b11111;
2432     let Inst{26-23} = 0b0110;
2433     let Inst{22-20} = 0b011;
2434     let Inst{15-12} = 0b1111; // Ra = 0b1111 (no accumulate)
2435     let Inst{7-6} = 0b00;
2436     let Inst{5-4} = 0b01;
2437   }
2438 }
2439
2440
2441 multiclass T2I_smla<string opc, PatFrag opnode> {
2442   def BB : T2FourReg<
2443         (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC16,
2444               !strconcat(opc, "bb"), "\t$Rd, $Rn, $Rm, $Ra",
2445               [(set rGPR:$Rd, (add rGPR:$Ra,
2446                                (opnode (sext_inreg rGPR:$Rn, i16),
2447                                        (sext_inreg rGPR:$Rm, i16))))]> {
2448     let Inst{31-27} = 0b11111;
2449     let Inst{26-23} = 0b0110;
2450     let Inst{22-20} = 0b001;
2451     let Inst{7-6} = 0b00;
2452     let Inst{5-4} = 0b00;
2453   }
2454
2455   def BT : T2FourReg<
2456        (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC16,
2457              !strconcat(opc, "bt"), "\t$Rd, $Rn, $Rm, $Ra",
2458              [(set rGPR:$Rd, (add rGPR:$Ra, (opnode (sext_inreg rGPR:$Rn, i16),
2459                                                  (sra rGPR:$Rm, (i32 16)))))]> {
2460     let Inst{31-27} = 0b11111;
2461     let Inst{26-23} = 0b0110;
2462     let Inst{22-20} = 0b001;
2463     let Inst{7-6} = 0b00;
2464     let Inst{5-4} = 0b01;
2465   }
2466
2467   def TB : T2FourReg<
2468         (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC16,
2469               !strconcat(opc, "tb"), "\t$Rd, $Rn, $Rm, $Ra",
2470               [(set rGPR:$Rd, (add rGPR:$Ra, (opnode (sra rGPR:$Rn, (i32 16)),
2471                                                (sext_inreg rGPR:$Rm, i16))))]> {
2472     let Inst{31-27} = 0b11111;
2473     let Inst{26-23} = 0b0110;
2474     let Inst{22-20} = 0b001;
2475     let Inst{7-6} = 0b00;
2476     let Inst{5-4} = 0b10;
2477   }
2478
2479   def TT : T2FourReg<
2480         (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC16,
2481               !strconcat(opc, "tt"), "\t$Rd, $Rn, $Rm, $Ra",
2482              [(set rGPR:$Rd, (add rGPR:$Ra, (opnode (sra rGPR:$Rn, (i32 16)),
2483                                                  (sra rGPR:$Rm, (i32 16)))))]> {
2484     let Inst{31-27} = 0b11111;
2485     let Inst{26-23} = 0b0110;
2486     let Inst{22-20} = 0b001;
2487     let Inst{7-6} = 0b00;
2488     let Inst{5-4} = 0b11;
2489   }
2490
2491   def WB : T2FourReg<
2492         (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC16,
2493               !strconcat(opc, "wb"), "\t$Rd, $Rn, $Rm, $Ra",
2494               [(set rGPR:$Rd, (add rGPR:$Ra, (sra (opnode rGPR:$Rn,
2495                                     (sext_inreg rGPR:$Rm, i16)), (i32 16))))]> {
2496     let Inst{31-27} = 0b11111;
2497     let Inst{26-23} = 0b0110;
2498     let Inst{22-20} = 0b011;
2499     let Inst{7-6} = 0b00;
2500     let Inst{5-4} = 0b00;
2501   }
2502
2503   def WT : T2FourReg<
2504         (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC16,
2505               !strconcat(opc, "wt"), "\t$Rd, $Rn, $Rm, $Ra",
2506               [(set rGPR:$Rd, (add rGPR:$Ra, (sra (opnode rGPR:$Rn,
2507                                       (sra rGPR:$Rm, (i32 16))), (i32 16))))]> {
2508     let Inst{31-27} = 0b11111;
2509     let Inst{26-23} = 0b0110;
2510     let Inst{22-20} = 0b011;
2511     let Inst{7-6} = 0b00;
2512     let Inst{5-4} = 0b01;
2513   }
2514 }
2515
2516 defm t2SMUL : T2I_smul<"smul", BinOpFrag<(mul node:$LHS, node:$RHS)>>;
2517 defm t2SMLA : T2I_smla<"smla", BinOpFrag<(mul node:$LHS, node:$RHS)>>;
2518
2519 // Halfword multiple accumulate long: SMLAL<x><y> -- for disassembly only
2520 def t2SMLALBB : T2FourReg_mac<1, 0b100, 0b1000, (outs rGPR:$Ra,rGPR:$Rd),
2521          (ins rGPR:$Rn,rGPR:$Rm), IIC_iMAC64, "smlalbb", "\t$Ra, $Rd, $Rn, $Rm",
2522            [/* For disassembly only; pattern left blank */]>;
2523 def t2SMLALBT : T2FourReg_mac<1, 0b100, 0b1001, (outs rGPR:$Ra,rGPR:$Rd),
2524          (ins rGPR:$Rn,rGPR:$Rm), IIC_iMAC64, "smlalbt", "\t$Ra, $Rd, $Rn, $Rm",
2525            [/* For disassembly only; pattern left blank */]>;
2526 def t2SMLALTB : T2FourReg_mac<1, 0b100, 0b1010, (outs rGPR:$Ra,rGPR:$Rd),
2527          (ins rGPR:$Rn,rGPR:$Rm), IIC_iMAC64, "smlaltb", "\t$Ra, $Rd, $Rn, $Rm",
2528            [/* For disassembly only; pattern left blank */]>;
2529 def t2SMLALTT : T2FourReg_mac<1, 0b100, 0b1011, (outs rGPR:$Ra,rGPR:$Rd),
2530          (ins rGPR:$Rn,rGPR:$Rm), IIC_iMAC64, "smlaltt", "\t$Ra, $Rd, $Rn, $Rm",
2531            [/* For disassembly only; pattern left blank */]>;
2532
2533 // Dual halfword multiple: SMUAD, SMUSD, SMLAD, SMLSD, SMLALD, SMLSLD
2534 // These are for disassembly only.
2535
2536 def t2SMUAD: T2ThreeReg_mac<
2537             0, 0b010, 0b0000, (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm),
2538             IIC_iMAC32, "smuad", "\t$Rd, $Rn, $Rm", []> {
2539   let Inst{15-12} = 0b1111;
2540 }
2541 def t2SMUADX:T2ThreeReg_mac<
2542             0, 0b010, 0b0001, (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm),
2543             IIC_iMAC32, "smuadx", "\t$Rd, $Rn, $Rm", []> {
2544   let Inst{15-12} = 0b1111;
2545 }
2546 def t2SMUSD: T2ThreeReg_mac<
2547             0, 0b100, 0b0000, (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm),
2548             IIC_iMAC32, "smusd", "\t$Rd, $Rn, $Rm", []> {
2549   let Inst{15-12} = 0b1111;
2550 }
2551 def t2SMUSDX:T2ThreeReg_mac<
2552             0, 0b100, 0b0001, (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm),
2553             IIC_iMAC32, "smusdx", "\t$Rd, $Rn, $Rm", []> {
2554   let Inst{15-12} = 0b1111;
2555 }
2556 def t2SMLAD   : T2ThreeReg_mac<
2557             0, 0b010, 0b0000, (outs rGPR:$Rd),
2558             (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC32, "smlad",
2559             "\t$Rd, $Rn, $Rm, $Ra", []>;
2560 def t2SMLADX  : T2FourReg_mac<
2561             0, 0b010, 0b0001, (outs rGPR:$Rd),
2562             (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC32, "smladx",
2563             "\t$Rd, $Rn, $Rm, $Ra", []>;
2564 def t2SMLSD   : T2FourReg_mac<0, 0b100, 0b0000, (outs rGPR:$Rd),
2565             (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC32, "smlsd",
2566             "\t$Rd, $Rn, $Rm, $Ra", []>;
2567 def t2SMLSDX  : T2FourReg_mac<0, 0b100, 0b0001, (outs rGPR:$Rd),
2568             (ins rGPR:$Rn, rGPR:$Rm, rGPR:$Ra), IIC_iMAC32, "smlsdx",
2569             "\t$Rd, $Rn, $Rm, $Ra", []>;
2570 def t2SMLALD  : T2FourReg_mac<1, 0b100, 0b1100, (outs rGPR:$Ra,rGPR:$Rd),
2571                         (ins rGPR:$Rm, rGPR:$Rn), IIC_iMAC64, "smlald",
2572                         "\t$Ra, $Rd, $Rm, $Rn", []>;
2573 def t2SMLALDX : T2FourReg_mac<1, 0b100, 0b1101, (outs rGPR:$Ra,rGPR:$Rd),
2574                         (ins rGPR:$Rm,rGPR:$Rn), IIC_iMAC64, "smlaldx",
2575                         "\t$Ra, $Rd, $Rm, $Rn", []>;
2576 def t2SMLSLD  : T2FourReg_mac<1, 0b101, 0b1100, (outs rGPR:$Ra,rGPR:$Rd),
2577                         (ins rGPR:$Rm,rGPR:$Rn), IIC_iMAC64, "smlsld",
2578                         "\t$Ra, $Rd, $Rm, $Rn", []>;
2579 def t2SMLSLDX : T2FourReg_mac<1, 0b101, 0b1101, (outs rGPR:$Ra,rGPR:$Rd),
2580                         (ins rGPR:$Rm,rGPR:$Rn), IIC_iMAC64, "smlsldx",
2581                         "\t$Ra, $Rd, $Rm, $Rn", []>;
2582
2583 //===----------------------------------------------------------------------===//
2584 //  Misc. Arithmetic Instructions.
2585 //
2586
2587 class T2I_misc<bits<2> op1, bits<2> op2, dag oops, dag iops,
2588       InstrItinClass itin, string opc, string asm, list<dag> pattern>
2589   : T2ThreeReg<oops, iops, itin, opc, asm, pattern> {
2590   let Inst{31-27} = 0b11111;
2591   let Inst{26-22} = 0b01010;
2592   let Inst{21-20} = op1;
2593   let Inst{15-12} = 0b1111;
2594   let Inst{7-6} = 0b10;
2595   let Inst{5-4} = op2;
2596   let Rn{3-0} = Rm{3-0};
2597 }
2598
2599 def t2CLZ : T2I_misc<0b11, 0b00, (outs rGPR:$Rd), (ins rGPR:$Rm), IIC_iUNAr,
2600                     "clz", "\t$Rd, $Rm", [(set rGPR:$Rd, (ctlz rGPR:$Rm))]>;
2601
2602 def t2RBIT : T2I_misc<0b01, 0b10, (outs rGPR:$Rd), (ins rGPR:$Rm), IIC_iUNAr,
2603                       "rbit", "\t$Rd, $Rm",
2604                       [(set rGPR:$Rd, (ARMrbit rGPR:$Rm))]>;
2605
2606 def t2REV : T2I_misc<0b01, 0b00, (outs rGPR:$Rd), (ins rGPR:$Rm), IIC_iUNAr,
2607                  "rev", ".w\t$Rd, $Rm", [(set rGPR:$Rd, (bswap rGPR:$Rm))]>;
2608
2609 def t2REV16 : T2I_misc<0b01, 0b01, (outs rGPR:$Rd), (ins rGPR:$Rm), IIC_iUNAr,
2610                        "rev16", ".w\t$Rd, $Rm",
2611                 [(set rGPR:$Rd,
2612                     (or (and (srl rGPR:$Rm, (i32 8)), 0xFF),
2613                         (or (and (shl rGPR:$Rm, (i32 8)), 0xFF00),
2614                             (or (and (srl rGPR:$Rm, (i32 8)), 0xFF0000),
2615                                (and (shl rGPR:$Rm, (i32 8)), 0xFF000000)))))]>;
2616
2617 def t2REVSH : T2I_misc<0b01, 0b11, (outs rGPR:$Rd), (ins rGPR:$Rm), IIC_iUNAr,
2618                        "revsh", ".w\t$Rd, $Rm",
2619                  [(set rGPR:$Rd,
2620                     (sext_inreg
2621                       (or (srl (and rGPR:$Rm, 0xFF00), (i32 8)),
2622                           (shl rGPR:$Rm, (i32 8))), i16))]>;
2623
2624 def t2PKHBT : T2ThreeReg<
2625             (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, shift_imm:$sh),
2626                   IIC_iBITsi, "pkhbt", "\t$Rd, $Rn, $Rm$sh",
2627                   [(set rGPR:$Rd, (or (and rGPR:$Rn, 0xFFFF),
2628                                       (and (shl rGPR:$Rm, lsl_amt:$sh),
2629                                            0xFFFF0000)))]>,
2630                   Requires<[HasT2ExtractPack, IsThumb2]> {
2631   let Inst{31-27} = 0b11101;
2632   let Inst{26-25} = 0b01;
2633   let Inst{24-20} = 0b01100;
2634   let Inst{5} = 0; // BT form
2635   let Inst{4} = 0;
2636
2637   bits<8> sh;
2638   let Inst{14-12} = sh{7-5};
2639   let Inst{7-6}   = sh{4-3};
2640 }
2641
2642 // Alternate cases for PKHBT where identities eliminate some nodes.
2643 def : T2Pat<(or (and rGPR:$src1, 0xFFFF), (and rGPR:$src2, 0xFFFF0000)),
2644             (t2PKHBT rGPR:$src1, rGPR:$src2, 0)>,
2645             Requires<[HasT2ExtractPack, IsThumb2]>;
2646 def : T2Pat<(or (and rGPR:$src1, 0xFFFF), (shl rGPR:$src2, imm16_31:$sh)),
2647             (t2PKHBT rGPR:$src1, rGPR:$src2, (lsl_shift_imm imm16_31:$sh))>,
2648             Requires<[HasT2ExtractPack, IsThumb2]>;
2649
2650 // Note: Shifts of 1-15 bits will be transformed to srl instead of sra and
2651 // will match the pattern below.
2652 def t2PKHTB : T2ThreeReg<
2653                   (outs rGPR:$Rd), (ins rGPR:$Rn, rGPR:$Rm, shift_imm:$sh),
2654                   IIC_iBITsi, "pkhtb", "\t$Rd, $Rn, $Rm$sh",
2655                   [(set rGPR:$Rd, (or (and rGPR:$Rn, 0xFFFF0000),
2656                                        (and (sra rGPR:$Rm, asr_amt:$sh),
2657                                             0xFFFF)))]>,
2658                   Requires<[HasT2ExtractPack, IsThumb2]> {
2659   let Inst{31-27} = 0b11101;
2660   let Inst{26-25} = 0b01;
2661   let Inst{24-20} = 0b01100;
2662   let Inst{5} = 1; // TB form
2663   let Inst{4} = 0;
2664
2665   bits<8> sh;
2666   let Inst{14-12} = sh{7-5};
2667   let Inst{7-6}   = sh{4-3};
2668 }
2669
2670 // Alternate cases for PKHTB where identities eliminate some nodes.  Note that
2671 // a shift amount of 0 is *not legal* here, it is PKHBT instead.
2672 def : T2Pat<(or (and rGPR:$src1, 0xFFFF0000), (srl rGPR:$src2, imm16_31:$sh)),
2673             (t2PKHTB rGPR:$src1, rGPR:$src2, (asr_shift_imm imm16_31:$sh))>,
2674             Requires<[HasT2ExtractPack, IsThumb2]>;
2675 def : T2Pat<(or (and rGPR:$src1, 0xFFFF0000),
2676                 (and (srl rGPR:$src2, imm1_15:$sh), 0xFFFF)),
2677             (t2PKHTB rGPR:$src1, rGPR:$src2, (asr_shift_imm imm1_15:$sh))>,
2678             Requires<[HasT2ExtractPack, IsThumb2]>;
2679
2680 //===----------------------------------------------------------------------===//
2681 //  Comparison Instructions...
2682 //
2683 defm t2CMP  : T2I_cmp_irs<0b1101, "cmp",
2684                           IIC_iCMPi, IIC_iCMPr, IIC_iCMPsi,
2685                           BinOpFrag<(ARMcmp node:$LHS, node:$RHS)>>;
2686 defm t2CMPz : T2I_cmp_irs<0b1101, "cmp",
2687                           IIC_iCMPi, IIC_iCMPr, IIC_iCMPsi,
2688                           BinOpFrag<(ARMcmpZ node:$LHS, node:$RHS)>>;
2689
2690 //FIXME: Disable CMN, as CCodes are backwards from compare expectations
2691 //       Compare-to-zero still works out, just not the relationals
2692 //defm t2CMN  : T2I_cmp_irs<0b1000, "cmn",
2693 //                          BinOpFrag<(ARMcmp node:$LHS,(ineg node:$RHS))>>;
2694 defm t2CMNz : T2I_cmp_irs<0b1000, "cmn",
2695                           IIC_iCMPi, IIC_iCMPr, IIC_iCMPsi,
2696                           BinOpFrag<(ARMcmpZ node:$LHS,(ineg node:$RHS))>>;
2697
2698 //def : T2Pat<(ARMcmp  GPR:$src, t2_so_imm_neg:$imm),
2699 //            (t2CMNri GPR:$src, t2_so_imm_neg:$imm)>;
2700
2701 def : T2Pat<(ARMcmpZ  GPR:$src, t2_so_imm_neg:$imm),
2702             (t2CMNzri GPR:$src, t2_so_imm_neg:$imm)>;
2703
2704 defm t2TST  : T2I_cmp_irs<0b0000, "tst",
2705                           IIC_iTSTi, IIC_iTSTr, IIC_iTSTsi,
2706                          BinOpFrag<(ARMcmpZ (and_su node:$LHS, node:$RHS), 0)>>;
2707 defm t2TEQ  : T2I_cmp_irs<0b0100, "teq",
2708                           IIC_iTSTi, IIC_iTSTr, IIC_iTSTsi,
2709                          BinOpFrag<(ARMcmpZ (xor_su node:$LHS, node:$RHS), 0)>>;
2710
2711 // Conditional moves
2712 // FIXME: should be able to write a pattern for ARMcmov, but can't use
2713 // a two-value operand where a dag node expects two operands. :(
2714 let neverHasSideEffects = 1 in {
2715 def t2MOVCCr : T2TwoReg<
2716                    (outs rGPR:$Rd), (ins rGPR:$false, rGPR:$Rm), IIC_iCMOVr,
2717                    "mov", ".w\t$Rd, $Rm",
2718    [/*(set rGPR:$Rd, (ARMcmov rGPR:$false, rGPR:$Rm, imm:$cc, CCR:$ccr))*/]>,
2719                 RegConstraint<"$false = $Rd"> {
2720   let Inst{31-27} = 0b11101;
2721   let Inst{26-25} = 0b01;
2722   let Inst{24-21} = 0b0010;
2723   let Inst{20} = 0; // The S bit.
2724   let Inst{19-16} = 0b1111; // Rn
2725   let Inst{14-12} = 0b000;
2726   let Inst{7-4} = 0b0000;
2727 }
2728
2729 let isMoveImm = 1 in
2730 def t2MOVCCi : T2OneRegImm<(outs rGPR:$Rd), (ins rGPR:$false, t2_so_imm:$imm),
2731                    IIC_iCMOVi, "mov", ".w\t$Rd, $imm",
2732 [/*(set rGPR:$Rd,(ARMcmov rGPR:$false,t2_so_imm:$imm, imm:$cc, CCR:$ccr))*/]>,
2733                    RegConstraint<"$false = $Rd"> {
2734   let Inst{31-27} = 0b11110;
2735   let Inst{25} = 0;
2736   let Inst{24-21} = 0b0010;
2737   let Inst{20} = 0; // The S bit.
2738   let Inst{19-16} = 0b1111; // Rn
2739   let Inst{15} = 0;
2740 }
2741
2742 let isMoveImm = 1 in
2743 def t2MOVCCi16 : T2I<(outs rGPR:$Rd), (ins rGPR:$false, i32imm:$imm),
2744                       IIC_iCMOVi,
2745                       "movw", "\t$Rd, $imm", []>,
2746                       RegConstraint<"$false = $Rd"> {
2747   let Inst{31-27} = 0b11110;
2748   let Inst{25} = 1;
2749   let Inst{24-21} = 0b0010;
2750   let Inst{20} = 0; // The S bit.
2751   let Inst{15} = 0;
2752
2753   bits<4> Rd;
2754   bits<16> imm;
2755
2756   let Inst{11-8}  = Rd{3-0};
2757   let Inst{19-16} = imm{15-12};
2758   let Inst{26}    = imm{11};
2759   let Inst{14-12} = imm{10-8};
2760   let Inst{7-0}   = imm{7-0};
2761 }
2762
2763 let isMoveImm = 1 in
2764 def t2MOVCCi32imm : PseudoInst<(outs rGPR:$dst),
2765                                (ins rGPR:$false, i32imm:$src, pred:$p),
2766                     IIC_iCMOVix2, []>, RegConstraint<"$false = $dst">;
2767
2768 let isMoveImm = 1 in
2769 def t2MVNCCi : T2OneRegImm<(outs rGPR:$Rd), (ins rGPR:$false, t2_so_imm:$imm),
2770                    IIC_iCMOVi, "mvn", ".w\t$Rd, $imm",
2771 [/*(set rGPR:$Rd,(ARMcmov rGPR:$false,t2_so_imm_not:$imm,
2772                    imm:$cc, CCR:$ccr))*/]>,
2773                    RegConstraint<"$false = $Rd"> {
2774   let Inst{31-27} = 0b11110;
2775   let Inst{25} = 0;
2776   let Inst{24-21} = 0b0011;
2777   let Inst{20} = 0; // The S bit.
2778   let Inst{19-16} = 0b1111; // Rn
2779   let Inst{15} = 0;
2780 }
2781
2782 class T2I_movcc_sh<bits<2> opcod, dag oops, dag iops, InstrItinClass itin,
2783                    string opc, string asm, list<dag> pattern>
2784   : T2TwoRegShiftImm<oops, iops, itin, opc, asm, pattern> {
2785   let Inst{31-27} = 0b11101;
2786   let Inst{26-25} = 0b01;
2787   let Inst{24-21} = 0b0010;
2788   let Inst{20} = 0; // The S bit.
2789   let Inst{19-16} = 0b1111; // Rn
2790   let Inst{5-4} = opcod; // Shift type.
2791 }
2792 def t2MOVCClsl : T2I_movcc_sh<0b00, (outs rGPR:$Rd),
2793                              (ins rGPR:$false, rGPR:$Rm, i32imm:$imm),
2794                              IIC_iCMOVsi, "lsl", ".w\t$Rd, $Rm, $imm", []>,
2795                  RegConstraint<"$false = $Rd">;
2796 def t2MOVCClsr : T2I_movcc_sh<0b01, (outs rGPR:$Rd),
2797                              (ins rGPR:$false, rGPR:$Rm, i32imm:$imm),
2798                              IIC_iCMOVsi, "lsr", ".w\t$Rd, $Rm, $imm", []>,
2799                  RegConstraint<"$false = $Rd">;
2800 def t2MOVCCasr : T2I_movcc_sh<0b10, (outs rGPR:$Rd),
2801                              (ins rGPR:$false, rGPR:$Rm, i32imm:$imm),
2802                              IIC_iCMOVsi, "asr", ".w\t$Rd, $Rm, $imm", []>,
2803                  RegConstraint<"$false = $Rd">;
2804 def t2MOVCCror : T2I_movcc_sh<0b11, (outs rGPR:$Rd),
2805                              (ins rGPR:$false, rGPR:$Rm, i32imm:$imm),
2806                              IIC_iCMOVsi, "ror", ".w\t$Rd, $Rm, $imm", []>,
2807                  RegConstraint<"$false = $Rd">;
2808 } // neverHasSideEffects
2809
2810 //===----------------------------------------------------------------------===//
2811 // Atomic operations intrinsics
2812 //
2813
2814 // memory barriers protect the atomic sequences
2815 let hasSideEffects = 1 in {
2816 def t2DMB : AInoP<(outs), (ins memb_opt:$opt), ThumbFrm, NoItinerary,
2817                   "dmb", "\t$opt", [(ARMMemBarrier (i32 imm:$opt))]>,
2818                   Requires<[IsThumb, HasDB]> {
2819   bits<4> opt;
2820   let Inst{31-4} = 0xf3bf8f5;
2821   let Inst{3-0} = opt;
2822 }
2823 }
2824
2825 def t2DSB : AInoP<(outs), (ins memb_opt:$opt), ThumbFrm, NoItinerary,
2826                   "dsb", "\t$opt",
2827                   [/* For disassembly only; pattern left blank */]>,
2828                   Requires<[IsThumb, HasDB]> {
2829   bits<4> opt;
2830   let Inst{31-4} = 0xf3bf8f4;
2831   let Inst{3-0} = opt;
2832 }
2833
2834 // ISB has only full system option -- for disassembly only
2835 def t2ISB : T2I<(outs), (ins), NoItinerary, "isb", "",
2836                   [/* For disassembly only; pattern left blank */]>,
2837                   Requires<[IsThumb2, HasV7]> {
2838   let Inst{31-4} = 0xf3bf8f6;
2839   let Inst{3-0} = 0b1111;
2840 }
2841
2842 class T2I_ldrex<bits<2> opcod, dag oops, dag iops, AddrMode am, SizeFlagVal sz,
2843                 InstrItinClass itin, string opc, string asm, string cstr,
2844                 list<dag> pattern, bits<4> rt2 = 0b1111>
2845   : Thumb2I<oops, iops, am, sz, itin, opc, asm, cstr, pattern> {
2846   let Inst{31-27} = 0b11101;
2847   let Inst{26-20} = 0b0001101;
2848   let Inst{11-8} = rt2;
2849   let Inst{7-6} = 0b01;
2850   let Inst{5-4} = opcod;
2851   let Inst{3-0} = 0b1111;
2852
2853   bits<4> Rn;
2854   bits<4> Rt;
2855   let Inst{19-16} = Rn{3-0};
2856   let Inst{15-12} = Rt{3-0};
2857 }
2858 class T2I_strex<bits<2> opcod, dag oops, dag iops, AddrMode am, SizeFlagVal sz,
2859                 InstrItinClass itin, string opc, string asm, string cstr,
2860                 list<dag> pattern, bits<4> rt2 = 0b1111>
2861   : Thumb2I<oops, iops, am, sz, itin, opc, asm, cstr, pattern> {
2862   let Inst{31-27} = 0b11101;
2863   let Inst{26-20} = 0b0001100;
2864   let Inst{11-8} = rt2;
2865   let Inst{7-6} = 0b01;
2866   let Inst{5-4} = opcod;
2867
2868   bits<4> Rd;
2869   bits<4> Rn;
2870   bits<4> Rt;
2871   let Inst{11-8}  = Rd{3-0};
2872   let Inst{19-16} = Rn{3-0};
2873   let Inst{15-12} = Rt{3-0};
2874 }
2875
2876 let mayLoad = 1 in {
2877 def t2LDREXB : T2I_ldrex<0b00, (outs rGPR:$Rt), (ins rGPR:$Rn), AddrModeNone,
2878                          Size4Bytes, NoItinerary, "ldrexb", "\t$Rt, [$Rn]",
2879                          "", []>;
2880 def t2LDREXH : T2I_ldrex<0b01, (outs rGPR:$Rt), (ins rGPR:$Rn), AddrModeNone,
2881                          Size4Bytes, NoItinerary, "ldrexh", "\t$Rt, [$Rn]",
2882                          "", []>;
2883 def t2LDREX  : Thumb2I<(outs rGPR:$Rt), (ins rGPR:$Rn), AddrModeNone,
2884                        Size4Bytes, NoItinerary,
2885                        "ldrex", "\t$Rt, [$Rn]", "",
2886                       []> {
2887   let Inst{31-27} = 0b11101;
2888   let Inst{26-20} = 0b0000101;
2889   let Inst{11-8} = 0b1111;
2890   let Inst{7-0} = 0b00000000; // imm8 = 0
2891 }
2892 def t2LDREXD : T2I_ldrex<0b11, (outs rGPR:$Rt, rGPR:$Rt2), (ins rGPR:$Rn),
2893                          AddrModeNone, Size4Bytes, NoItinerary,
2894                          "ldrexd", "\t$Rt, $Rt2, [$Rn]", "",
2895                          [], {?, ?, ?, ?}> {
2896   bits<4> Rt2;
2897   let Inst{11-8} = Rt2{3-0};
2898 }
2899 }
2900
2901 let mayStore = 1, Constraints = "@earlyclobber $Rd" in {
2902 def t2STREXB : T2I_strex<0b00, (outs rGPR:$Rd), (ins rGPR:$Rt, rGPR:$Rn),
2903                          AddrModeNone, Size4Bytes, NoItinerary,
2904                          "strexb", "\t$Rd, $Rt, [$Rn]", "", []>;
2905 def t2STREXH : T2I_strex<0b01, (outs rGPR:$Rd), (ins rGPR:$Rt, rGPR:$Rn),
2906                          AddrModeNone, Size4Bytes, NoItinerary,
2907                          "strexh", "\t$Rd, $Rt, [$Rn]", "", []>;
2908 def t2STREX  : Thumb2I<(outs rGPR:$Rd), (ins rGPR:$Rt, rGPR:$Rn),
2909                        AddrModeNone, Size4Bytes, NoItinerary,
2910                        "strex", "\t$Rd, $Rt, [$Rn]", "",
2911                       []> {
2912   let Inst{31-27} = 0b11101;
2913   let Inst{26-20} = 0b0000100;
2914   let Inst{7-0} = 0b00000000; // imm8 = 0
2915 }
2916 def t2STREXD : T2I_strex<0b11, (outs rGPR:$Rd),
2917                          (ins rGPR:$Rt, rGPR:$Rt2, rGPR:$Rn),
2918                          AddrModeNone, Size4Bytes, NoItinerary,
2919                          "strexd", "\t$Rd, $Rt, $Rt2, [$Rn]", "", [],
2920                          {?, ?, ?, ?}> {
2921   bits<4> Rt2;
2922   let Inst{11-8} = Rt2{3-0};
2923 }
2924 }
2925
2926 // Clear-Exclusive is for disassembly only.
2927 def t2CLREX : T2I<(outs), (ins), NoItinerary, "clrex", "",
2928                   [/* For disassembly only; pattern left blank */]>,
2929             Requires<[IsARM, HasV7]>  {
2930   let Inst{31-20} = 0xf3b;
2931   let Inst{15-14} = 0b10;
2932   let Inst{12} = 0;
2933   let Inst{7-4} = 0b0010;
2934 }
2935
2936 //===----------------------------------------------------------------------===//
2937 // TLS Instructions
2938 //
2939
2940 // __aeabi_read_tp preserves the registers r1-r3.
2941 let isCall = 1,
2942   Defs = [R0, R12, LR, CPSR], Uses = [SP] in {
2943   def t2TPsoft : T2XI<(outs), (ins), IIC_Br,
2944                      "bl\t__aeabi_read_tp",
2945                      [(set R0, ARMthread_pointer)]> {
2946     let Inst{31-27} = 0b11110;
2947     let Inst{15-14} = 0b11;
2948     let Inst{12} = 1;
2949   }
2950 }
2951
2952 //===----------------------------------------------------------------------===//
2953 // SJLJ Exception handling intrinsics
2954 //   eh_sjlj_setjmp() is an instruction sequence to store the return
2955 //   address and save #0 in R0 for the non-longjmp case.
2956 //   Since by its nature we may be coming from some other function to get
2957 //   here, and we're using the stack frame for the containing function to
2958 //   save/restore registers, we can't keep anything live in regs across
2959 //   the eh_sjlj_setjmp(), else it will almost certainly have been tromped upon
2960 //   when we get here from a longjmp(). We force everthing out of registers
2961 //   except for our own input by listing the relevant registers in Defs. By
2962 //   doing so, we also cause the prologue/epilogue code to actively preserve
2963 //   all of the callee-saved resgisters, which is exactly what we want.
2964 //   $val is a scratch register for our use.
2965 let Defs =
2966   [ R0,  R1,  R2,  R3,  R4,  R5,  R6,  R7,  R8,  R9,  R10, R11, R12, LR,  D0,
2967     D1,  D2,  D3,  D4,  D5,  D6,  D7,  D8,  D9,  D10, D11, D12, D13, D14, D15,
2968     D16, D17, D18, D19, D20, D21, D22, D23, D24, D25, D26, D27, D28, D29, D30,
2969     D31 ], hasSideEffects = 1, isBarrier = 1, isCodeGenOnly = 1 in {
2970   def t2Int_eh_sjlj_setjmp : Thumb2XI<(outs), (ins tGPR:$src, tGPR:$val),
2971                                AddrModeNone, SizeSpecial, NoItinerary, "", "",
2972                           [(set R0, (ARMeh_sjlj_setjmp tGPR:$src, tGPR:$val))]>,
2973                              Requires<[IsThumb2, HasVFP2]>;
2974 }
2975
2976 let Defs =
2977   [ R0,  R1,  R2,  R3,  R4,  R5,  R6,  R7,  R8,  R9,  R10, R11, R12, LR ],
2978   hasSideEffects = 1, isBarrier = 1, isCodeGenOnly = 1 in {
2979   def t2Int_eh_sjlj_setjmp_nofp : Thumb2XI<(outs), (ins tGPR:$src, tGPR:$val),
2980                                AddrModeNone, SizeSpecial, NoItinerary, "", "",
2981                           [(set R0, (ARMeh_sjlj_setjmp tGPR:$src, tGPR:$val))]>,
2982                                   Requires<[IsThumb2, NoVFP]>;
2983 }
2984
2985
2986 //===----------------------------------------------------------------------===//
2987 // Control-Flow Instructions
2988 //
2989
2990 // FIXME: remove when we have a way to marking a MI with these properties.
2991 // FIXME: $dst1 should be a def. But the extra ops must be in the end of the
2992 // operand list.
2993 // FIXME: Should pc be an implicit operand like PICADD, etc?
2994 let isReturn = 1, isTerminator = 1, isBarrier = 1, mayLoad = 1,
2995     hasExtraDefRegAllocReq = 1, isCodeGenOnly = 1 in
2996 def t2LDMIA_RET: T2XIt<(outs GPR:$wb), (ins GPR:$Rn, pred:$p,
2997                                         reglist:$regs, variable_ops),
2998                         IIC_iLoad_mBr,
2999                         "ldmia${p}.w\t$Rn!, $regs",
3000                         "$Rn = $wb", []> {
3001   bits<4>  Rn;
3002   bits<16> regs;
3003
3004   let Inst{31-27} = 0b11101;
3005   let Inst{26-25} = 0b00;
3006   let Inst{24-23} = 0b01;     // Increment After
3007   let Inst{22}    = 0;
3008   let Inst{21}    = 1;        // Writeback
3009   let Inst{20}    = 1;
3010   let Inst{19-16} = Rn;
3011   let Inst{15-0}  = regs;
3012 }
3013
3014 let isBranch = 1, isTerminator = 1, isBarrier = 1 in {
3015 let isPredicable = 1 in
3016 def t2B   : T2XI<(outs), (ins brtarget:$target), IIC_Br,
3017                  "b.w\t$target",
3018                  [(br bb:$target)]> {
3019   let Inst{31-27} = 0b11110;
3020   let Inst{15-14} = 0b10;
3021   let Inst{12} = 1;
3022
3023   bits<20> target;
3024   let Inst{26} = target{19};
3025   let Inst{11} = target{18};
3026   let Inst{13} = target{17};
3027   let Inst{21-16} = target{16-11};
3028   let Inst{10-0} = target{10-0};
3029 }
3030
3031 let isNotDuplicable = 1, isIndirectBranch = 1 in {
3032 def t2BR_JT : tPseudoInst<(outs),
3033           (ins GPR:$target, GPR:$index, i32imm:$jt, i32imm:$id),
3034            SizeSpecial, IIC_Br,
3035           [(ARMbr2jt GPR:$target, GPR:$index, tjumptable:$jt, imm:$id)]>;
3036
3037 // FIXME: Add a non-pc based case that can be predicated.
3038 def t2TBB_JT : tPseudoInst<(outs),
3039         (ins GPR:$index, i32imm:$jt, i32imm:$id),
3040          SizeSpecial, IIC_Br, []>;
3041
3042 def t2TBH_JT : tPseudoInst<(outs),
3043         (ins GPR:$index, i32imm:$jt, i32imm:$id),
3044          SizeSpecial, IIC_Br, []>;
3045
3046 def t2TBB : T2I<(outs), (ins GPR:$Rn, GPR:$Rm), IIC_Br,
3047                     "tbb", "\t[$Rn, $Rm]", []> {
3048   bits<4> Rn;
3049   bits<4> Rm;
3050   let Inst{27-20} = 0b10001101;
3051   let Inst{19-16} = Rn;
3052   let Inst{15-5} = 0b11110000000;
3053   let Inst{4} = 0; // B form
3054   let Inst{3-0} = Rm;
3055 }
3056
3057 def t2TBH : T2I<(outs), (ins GPR:$Rn, GPR:$Rm), IIC_Br,
3058                    "tbh", "\t[$Rn, $Rm, lsl #1]", []> {
3059   bits<4> Rn;
3060   bits<4> Rm;
3061   let Inst{27-20} = 0b10001101;
3062   let Inst{19-16} = Rn;
3063   let Inst{15-5} = 0b11110000000;
3064   let Inst{4} = 1; // H form
3065   let Inst{3-0} = Rm;
3066 }
3067 } // isNotDuplicable, isIndirectBranch
3068
3069 } // isBranch, isTerminator, isBarrier
3070
3071 // FIXME: should be able to write a pattern for ARMBrcond, but can't use
3072 // a two-value operand where a dag node expects two operands. :(
3073 let isBranch = 1, isTerminator = 1 in
3074 def t2Bcc : T2I<(outs), (ins brtarget:$target), IIC_Br,
3075                 "b", ".w\t$target",
3076                 [/*(ARMbrcond bb:$target, imm:$cc)*/]> {
3077   let Inst{31-27} = 0b11110;
3078   let Inst{15-14} = 0b10;
3079   let Inst{12} = 0;
3080 }
3081
3082
3083 // IT block
3084 let Defs = [ITSTATE] in
3085 def t2IT : Thumb2XI<(outs), (ins it_pred:$cc, it_mask:$mask),
3086                     AddrModeNone, Size2Bytes,  IIC_iALUx,
3087                     "it$mask\t$cc", "", []> {
3088   // 16-bit instruction.
3089   let Inst{31-16} = 0x0000;
3090   let Inst{15-8} = 0b10111111;
3091
3092   bits<4> cc;
3093   bits<4> mask;
3094   let Inst{7-4} = cc{3-0};
3095   let Inst{3-0} = mask{3-0};
3096 }
3097
3098 // Branch and Exchange Jazelle -- for disassembly only
3099 // Rm = Inst{19-16}
3100 def t2BXJ : T2I<(outs), (ins rGPR:$func), NoItinerary, "bxj", "\t$func",
3101               [/* For disassembly only; pattern left blank */]> {
3102   let Inst{31-27} = 0b11110;
3103   let Inst{26} = 0;
3104   let Inst{25-20} = 0b111100;
3105   let Inst{15-14} = 0b10;
3106   let Inst{12} = 0;
3107   
3108   bits<4> func;
3109   let Inst{19-16} = func{3-0};
3110 }
3111
3112 // Change Processor State is a system instruction -- for disassembly only.
3113 // The singleton $opt operand contains the following information:
3114 // opt{4-0} = mode from Inst{4-0}
3115 // opt{5} = changemode from Inst{17}
3116 // opt{8-6} = AIF from Inst{8-6}
3117 // opt{10-9} = imod from Inst{19-18} with 0b10 as enable and 0b11 as disable
3118 def t2CPS : T2XI<(outs),(ins cps_opt:$opt), NoItinerary, "cps$opt",
3119                  [/* For disassembly only; pattern left blank */]> {
3120   let Inst{31-27} = 0b11110;
3121   let Inst{26} = 0;
3122   let Inst{25-20} = 0b111010;
3123   let Inst{15-14} = 0b10;
3124   let Inst{12} = 0;
3125   
3126   bits<11> opt;
3127   
3128   // mode number
3129   let Inst{4-0} = opt{4-0};
3130   
3131   // M flag
3132   let Inst{8} = opt{5};
3133   
3134   // F flag
3135   let Inst{5} = opt{6};
3136   
3137   // I flag
3138   let Inst{6} = opt{7};
3139   
3140   // A flag
3141   let Inst{7} = opt{8};
3142   
3143   // imod flag
3144   let Inst{10-9} = opt{10-9};
3145 }
3146
3147 // A6.3.4 Branches and miscellaneous control
3148 // Table A6-14 Change Processor State, and hint instructions
3149 // Helper class for disassembly only.
3150 class T2I_hint<bits<8> op7_0, string opc, string asm>
3151   : T2I<(outs), (ins), NoItinerary, opc, asm,
3152         [/* For disassembly only; pattern left blank */]> {
3153   let Inst{31-20} = 0xf3a;
3154   let Inst{15-14} = 0b10;
3155   let Inst{12} = 0;
3156   let Inst{10-8} = 0b000;
3157   let Inst{7-0} = op7_0;
3158 }
3159
3160 def t2NOP   : T2I_hint<0b00000000, "nop",   ".w">;
3161 def t2YIELD : T2I_hint<0b00000001, "yield", ".w">;
3162 def t2WFE   : T2I_hint<0b00000010, "wfe",   ".w">;
3163 def t2WFI   : T2I_hint<0b00000011, "wfi",   ".w">;
3164 def t2SEV   : T2I_hint<0b00000100, "sev",   ".w">;
3165
3166 def t2DBG : T2I<(outs),(ins i32imm:$opt), NoItinerary, "dbg", "\t$opt",
3167                 [/* For disassembly only; pattern left blank */]> {
3168   let Inst{31-20} = 0xf3a;
3169   let Inst{15-14} = 0b10;
3170   let Inst{12} = 0;
3171   let Inst{10-8} = 0b000;
3172   let Inst{7-4} = 0b1111;
3173 }
3174
3175 // Secure Monitor Call is a system instruction -- for disassembly only
3176 // Option = Inst{19-16}
3177 def t2SMC : T2I<(outs), (ins i32imm:$opt), NoItinerary, "smc", "\t$opt",
3178                 [/* For disassembly only; pattern left blank */]> {
3179   let Inst{31-27} = 0b11110;
3180   let Inst{26-20} = 0b1111111;
3181   let Inst{15-12} = 0b1000;
3182   
3183   bits<4> opt;
3184   let Inst{19-16} = opt{3-0};
3185 }
3186
3187 class T2SRS<bits<12> op31_20, 
3188            dag oops, dag iops, InstrItinClass itin,
3189           string opc, string asm, list<dag> pattern>
3190   : T2I<oops, iops, itin, opc, asm, pattern> {
3191   let Inst{31-20} = op31_20{11-0};
3192   
3193   bits<5> mode;
3194   let Inst{4-0} = mode{4-0};
3195 }
3196
3197 // Store Return State is a system instruction -- for disassembly only
3198 def t2SRSDBW : T2SRS<0b111010000010,
3199                    (outs),(ins i32imm:$mode),NoItinerary,"srsdb","\tsp!, $mode",
3200                    [/* For disassembly only; pattern left blank */]>;
3201 def t2SRSDB  : T2SRS<0b111010000000,
3202                    (outs),(ins i32imm:$mode),NoItinerary,"srsdb","\tsp, $mode",
3203                    [/* For disassembly only; pattern left blank */]>;
3204 def t2SRSIAW : T2SRS<0b111010011010,
3205                    (outs),(ins i32imm:$mode),NoItinerary,"srsia","\tsp!, $mode",
3206                    [/* For disassembly only; pattern left blank */]>;
3207 def t2SRSIA  : T2SRS<0b111010011000,
3208                    (outs), (ins i32imm:$mode),NoItinerary,"srsia","\tsp, $mode",
3209                    [/* For disassembly only; pattern left blank */]>;
3210
3211 // Return From Exception is a system instruction -- for disassembly only
3212
3213 class T2RFE<bits<12> op31_20, dag oops, dag iops, InstrItinClass itin,
3214           string opc, string asm, list<dag> pattern>
3215   : T2I<oops, iops, itin, opc, asm, pattern> {
3216   let Inst{31-20} = op31_20{11-0};
3217   
3218   bits<4> Rn;
3219   let Inst{19-16} = Rn{3-0};
3220 }
3221
3222 def t2RFEDBW : T2RFE<0b111010000011,
3223                    (outs), (ins rGPR:$Rn), NoItinerary, "rfedb", "\t$Rn!",
3224                    [/* For disassembly only; pattern left blank */]>;
3225 def t2RFEDB  : T2RFE<0b111010000001,
3226                    (outs), (ins rGPR:$Rn), NoItinerary, "rfeab", "\t$Rn",
3227                    [/* For disassembly only; pattern left blank */]>;
3228 def t2RFEIAW : T2RFE<0b111010011011,
3229                    (outs), (ins rGPR:$Rn), NoItinerary, "rfeia", "\t$Rn!",
3230                    [/* For disassembly only; pattern left blank */]>;
3231 def t2RFEIA  : T2RFE<0b111010011001,
3232                    (outs), (ins rGPR:$Rn), NoItinerary, "rfeia", "\t$Rn",
3233                    [/* For disassembly only; pattern left blank */]>;
3234
3235 //===----------------------------------------------------------------------===//
3236 // Non-Instruction Patterns
3237 //
3238
3239 // 32-bit immediate using movw + movt.
3240 // This is a single pseudo instruction to make it re-materializable.
3241 // FIXME: Remove this when we can do generalized remat.
3242 let isReMaterializable = 1, isMoveImm = 1 in
3243 def t2MOVi32imm : PseudoInst<(outs rGPR:$dst), (ins i32imm:$src), IIC_iMOVix2,
3244                             [(set rGPR:$dst, (i32 imm:$src))]>,
3245                             Requires<[IsThumb, HasV6T2]>;
3246
3247 // ConstantPool, GlobalAddress, and JumpTable
3248 def : T2Pat<(ARMWrapper  tglobaladdr :$dst), (t2LEApcrel tglobaladdr :$dst)>,
3249            Requires<[IsThumb2, DontUseMovt]>;
3250 def : T2Pat<(ARMWrapper  tconstpool  :$dst), (t2LEApcrel tconstpool  :$dst)>;
3251 def : T2Pat<(ARMWrapper  tglobaladdr :$dst), (t2MOVi32imm tglobaladdr :$dst)>,
3252            Requires<[IsThumb2, UseMovt]>;
3253
3254 def : T2Pat<(ARMWrapperJT tjumptable:$dst, imm:$id),
3255             (t2LEApcrelJT tjumptable:$dst, imm:$id)>;
3256
3257 // Pseudo instruction that combines ldr from constpool and add pc. This should
3258 // be expanded into two instructions late to allow if-conversion and
3259 // scheduling.
3260 let canFoldAsLoad = 1, isReMaterializable = 1 in
3261 def t2LDRpci_pic : PseudoInst<(outs GPR:$dst), (ins i32imm:$addr, pclabel:$cp),
3262                    IIC_iLoadiALU,
3263                [(set GPR:$dst, (ARMpic_add (load (ARMWrapper tconstpool:$addr)),
3264                                            imm:$cp))]>,
3265                Requires<[IsThumb2]>;
3266
3267 //===----------------------------------------------------------------------===//
3268 // Move between special register and ARM core register -- for disassembly only
3269 //
3270
3271 class T2SpecialReg<bits<12> op31_20, bits<2> op15_14, bits<1> op12,
3272           dag oops, dag iops, InstrItinClass itin,
3273           string opc, string asm, list<dag> pattern>
3274   : T2I<oops, iops, itin, opc, asm, pattern> {
3275   let Inst{31-20} = op31_20{11-0};
3276   let Inst{15-14} = op15_14{1-0};
3277   let Inst{12} = op12{0};
3278 }
3279
3280 class T2MRS<bits<12> op31_20, bits<2> op15_14, bits<1> op12,
3281           dag oops, dag iops, InstrItinClass itin,
3282           string opc, string asm, list<dag> pattern>
3283   : T2SpecialReg<op31_20, op15_14, op12, oops, iops, itin, opc, asm, pattern> {
3284   bits<4> Rd;
3285   let Inst{11-8} = Rd{3-0};
3286 }
3287
3288 def t2MRS : T2MRS<0b111100111110, 0b10, 0,
3289                 (outs rGPR:$Rd), (ins), NoItinerary, "mrs", "\t$Rd, cpsr",
3290                 [/* For disassembly only; pattern left blank */]>;
3291 def t2MRSsys : T2MRS<0b111100111111, 0b10, 0,
3292                    (outs rGPR:$Rd), (ins), NoItinerary, "mrs", "\t$Rd, spsr",
3293                    [/* For disassembly only; pattern left blank */]>;
3294
3295 class T2MSR<bits<12> op31_20, bits<2> op15_14, bits<1> op12,
3296             dag oops, dag iops, InstrItinClass itin,
3297           string opc, string asm, list<dag> pattern>
3298   : T2SpecialReg<op31_20, op15_14, op12, oops, iops, itin, opc, asm, pattern> {
3299   bits<4> Rn;
3300   bits<4> mask;
3301   let Inst{19-16} = Rn{3-0};
3302   let Inst{11-8} = mask{3-0};
3303 }
3304
3305 def t2MSR : T2MSR<0b111100111000, 0b10, 0,
3306                 (outs), (ins rGPR:$Rn, msr_mask:$mask), NoItinerary, "msr",
3307                 "\tcpsr$mask, $Rn",
3308                 [/* For disassembly only; pattern left blank */]>;
3309 def t2MSRsys : T2MSR<0b111100111001, 0b10, 0,
3310                    (outs), (ins rGPR:$Rn, msr_mask:$mask), NoItinerary, "msr",
3311                    "\tspsr$mask, $Rn",
3312                    [/* For disassembly only; pattern left blank */]>;