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