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