Added SEL, SXTB16, SXTAB16, UXTAB16, SMMULR, SMMLAR, SMMLSR, SMUAD, and SMUSD,
[oota-llvm.git] / lib / Target / ARM / ARMInstrInfo.td
1 //===- ARMInstrInfo.td - Target Description for ARM Target -*- tablegen -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file describes the ARM instructions in TableGen format.
11 //
12 //===----------------------------------------------------------------------===//
13
14 //===----------------------------------------------------------------------===//
15 // ARM specific DAG Nodes.
16 //
17
18 // Type profiles.
19 def SDT_ARMCallSeqStart : SDCallSeqStart<[ SDTCisVT<0, i32> ]>;
20 def SDT_ARMCallSeqEnd   : SDCallSeqEnd<[ SDTCisVT<0, i32>, SDTCisVT<1, i32> ]>;
21
22 def SDT_ARMSaveCallPC : SDTypeProfile<0, 1, []>;
23
24 def SDT_ARMcall    : SDTypeProfile<0, -1, [SDTCisInt<0>]>;
25
26 def SDT_ARMCMov    : SDTypeProfile<1, 3,
27                                    [SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>,
28                                     SDTCisVT<3, i32>]>;
29
30 def SDT_ARMBrcond  : SDTypeProfile<0, 2,
31                                    [SDTCisVT<0, OtherVT>, SDTCisVT<1, i32>]>;
32
33 def SDT_ARMBrJT    : SDTypeProfile<0, 3,
34                                   [SDTCisPtrTy<0>, SDTCisVT<1, i32>,
35                                    SDTCisVT<2, i32>]>;
36
37 def SDT_ARMBr2JT   : SDTypeProfile<0, 4,
38                                   [SDTCisPtrTy<0>, SDTCisVT<1, i32>,
39                                    SDTCisVT<2, i32>, SDTCisVT<3, i32>]>;
40
41 def SDT_ARMCmp     : SDTypeProfile<0, 2, [SDTCisSameAs<0, 1>]>;
42
43 def SDT_ARMPICAdd  : SDTypeProfile<1, 2, [SDTCisSameAs<0, 1>,
44                                           SDTCisPtrTy<1>, SDTCisVT<2, i32>]>;
45
46 def SDT_ARMThreadPointer : SDTypeProfile<1, 0, [SDTCisPtrTy<0>]>;
47 def SDT_ARMEH_SJLJ_Setjmp : SDTypeProfile<1, 2, [SDTCisInt<0>, SDTCisPtrTy<1>,
48                                                  SDTCisInt<2>]>;
49
50 def SDT_ARMMEMBARRIERV7  : SDTypeProfile<0, 0, []>;
51 def SDT_ARMSYNCBARRIERV7 : SDTypeProfile<0, 0, []>;
52 def SDT_ARMMEMBARRIERV6  : SDTypeProfile<0, 1, [SDTCisInt<0>]>;
53 def SDT_ARMSYNCBARRIERV6 : SDTypeProfile<0, 1, [SDTCisInt<0>]>;
54
55 // Node definitions.
56 def ARMWrapper       : SDNode<"ARMISD::Wrapper",     SDTIntUnaryOp>;
57 def ARMWrapperJT     : SDNode<"ARMISD::WrapperJT",   SDTIntBinOp>;
58
59 def ARMcallseq_start : SDNode<"ISD::CALLSEQ_START", SDT_ARMCallSeqStart,
60                               [SDNPHasChain, SDNPOutFlag]>;
61 def ARMcallseq_end   : SDNode<"ISD::CALLSEQ_END",   SDT_ARMCallSeqEnd,
62                               [SDNPHasChain, SDNPOptInFlag, SDNPOutFlag]>;
63
64 def ARMcall          : SDNode<"ARMISD::CALL", SDT_ARMcall,
65                               [SDNPHasChain, SDNPOptInFlag, SDNPOutFlag]>;
66 def ARMcall_pred    : SDNode<"ARMISD::CALL_PRED", SDT_ARMcall,
67                               [SDNPHasChain, SDNPOptInFlag, SDNPOutFlag]>;
68 def ARMcall_nolink   : SDNode<"ARMISD::CALL_NOLINK", SDT_ARMcall,
69                               [SDNPHasChain, SDNPOptInFlag, SDNPOutFlag]>;
70
71 def ARMretflag       : SDNode<"ARMISD::RET_FLAG", SDTNone,
72                               [SDNPHasChain, SDNPOptInFlag]>;
73
74 def ARMcmov          : SDNode<"ARMISD::CMOV", SDT_ARMCMov,
75                               [SDNPInFlag]>;
76 def ARMcneg          : SDNode<"ARMISD::CNEG", SDT_ARMCMov,
77                               [SDNPInFlag]>;
78
79 def ARMbrcond        : SDNode<"ARMISD::BRCOND", SDT_ARMBrcond,
80                               [SDNPHasChain, SDNPInFlag, SDNPOutFlag]>;
81
82 def ARMbrjt          : SDNode<"ARMISD::BR_JT", SDT_ARMBrJT,
83                               [SDNPHasChain]>;
84 def ARMbr2jt         : SDNode<"ARMISD::BR2_JT", SDT_ARMBr2JT,
85                               [SDNPHasChain]>;
86
87 def ARMcmp           : SDNode<"ARMISD::CMP", SDT_ARMCmp,
88                               [SDNPOutFlag]>;
89
90 def ARMcmpZ          : SDNode<"ARMISD::CMPZ", SDT_ARMCmp,
91                               [SDNPOutFlag,SDNPCommutative]>;
92
93 def ARMpic_add       : SDNode<"ARMISD::PIC_ADD", SDT_ARMPICAdd>;
94
95 def ARMsrl_flag      : SDNode<"ARMISD::SRL_FLAG", SDTIntUnaryOp, [SDNPOutFlag]>;
96 def ARMsra_flag      : SDNode<"ARMISD::SRA_FLAG", SDTIntUnaryOp, [SDNPOutFlag]>;
97 def ARMrrx           : SDNode<"ARMISD::RRX"     , SDTIntUnaryOp, [SDNPInFlag ]>;
98
99 def ARMthread_pointer: SDNode<"ARMISD::THREAD_POINTER", SDT_ARMThreadPointer>;
100 def ARMeh_sjlj_setjmp: SDNode<"ARMISD::EH_SJLJ_SETJMP", SDT_ARMEH_SJLJ_Setjmp>;
101
102 def ARMMemBarrierV7  : SDNode<"ARMISD::MEMBARRIER", SDT_ARMMEMBARRIERV7,
103                               [SDNPHasChain]>;
104 def ARMSyncBarrierV7 : SDNode<"ARMISD::SYNCBARRIER", SDT_ARMMEMBARRIERV7,
105                               [SDNPHasChain]>;
106 def ARMMemBarrierV6  : SDNode<"ARMISD::MEMBARRIER", SDT_ARMMEMBARRIERV6,
107                               [SDNPHasChain]>;
108 def ARMSyncBarrierV6 : SDNode<"ARMISD::SYNCBARRIER", SDT_ARMMEMBARRIERV6,
109                               [SDNPHasChain]>;
110
111 def ARMrbit          : SDNode<"ARMISD::RBIT", SDTIntUnaryOp>;
112
113 //===----------------------------------------------------------------------===//
114 // ARM Instruction Predicate Definitions.
115 //
116 def HasV5T    : Predicate<"Subtarget->hasV5TOps()">;
117 def HasV5TE   : Predicate<"Subtarget->hasV5TEOps()">;
118 def HasV6     : Predicate<"Subtarget->hasV6Ops()">;
119 def HasV6T2   : Predicate<"Subtarget->hasV6T2Ops()">;
120 def NoV6T2    : Predicate<"!Subtarget->hasV6T2Ops()">;
121 def HasV7     : Predicate<"Subtarget->hasV7Ops()">;
122 def HasVFP2   : Predicate<"Subtarget->hasVFP2()">;
123 def HasVFP3   : Predicate<"Subtarget->hasVFP3()">;
124 def HasNEON   : Predicate<"Subtarget->hasNEON()">;
125 def UseNEONForFP : Predicate<"Subtarget->useNEONForSinglePrecisionFP()">;
126 def DontUseNEONForFP : Predicate<"!Subtarget->useNEONForSinglePrecisionFP()">;
127 def IsThumb   : Predicate<"Subtarget->isThumb()">;
128 def IsThumb1Only : Predicate<"Subtarget->isThumb1Only()">;
129 def IsThumb2  : Predicate<"Subtarget->isThumb2()">;
130 def IsARM     : Predicate<"!Subtarget->isThumb()">;
131 def IsDarwin    : Predicate<"Subtarget->isTargetDarwin()">;
132 def IsNotDarwin : Predicate<"!Subtarget->isTargetDarwin()">;
133
134 // FIXME: Eventually this will be just "hasV6T2Ops".
135 def UseMovt   : Predicate<"Subtarget->useMovt()">;
136 def DontUseMovt : Predicate<"!Subtarget->useMovt()">;
137
138 //===----------------------------------------------------------------------===//
139 // ARM Flag Definitions.
140
141 class RegConstraint<string C> {
142   string Constraints = C;
143 }
144
145 //===----------------------------------------------------------------------===//
146 //  ARM specific transformation functions and pattern fragments.
147 //
148
149 // so_imm_neg_XFORM - Return a so_imm value packed into the format described for
150 // so_imm_neg def below.
151 def so_imm_neg_XFORM : SDNodeXForm<imm, [{
152   return CurDAG->getTargetConstant(-(int)N->getZExtValue(), MVT::i32);
153 }]>;
154
155 // so_imm_not_XFORM - Return a so_imm value packed into the format described for
156 // so_imm_not def below.
157 def so_imm_not_XFORM : SDNodeXForm<imm, [{
158   return CurDAG->getTargetConstant(~(int)N->getZExtValue(), MVT::i32);
159 }]>;
160
161 // rot_imm predicate - True if the 32-bit immediate is equal to 8, 16, or 24.
162 def rot_imm : PatLeaf<(i32 imm), [{
163   int32_t v = (int32_t)N->getZExtValue();
164   return v == 8 || v == 16 || v == 24;
165 }]>;
166
167 /// imm1_15 predicate - True if the 32-bit immediate is in the range [1,15].
168 def imm1_15 : PatLeaf<(i32 imm), [{
169   return (int32_t)N->getZExtValue() >= 1 && (int32_t)N->getZExtValue() < 16;
170 }]>;
171
172 /// imm16_31 predicate - True if the 32-bit immediate is in the range [16,31].
173 def imm16_31 : PatLeaf<(i32 imm), [{
174   return (int32_t)N->getZExtValue() >= 16 && (int32_t)N->getZExtValue() < 32;
175 }]>;
176
177 def so_imm_neg :
178   PatLeaf<(imm), [{
179     return ARM_AM::getSOImmVal(-(int)N->getZExtValue()) != -1;
180   }], so_imm_neg_XFORM>;
181
182 def so_imm_not :
183   PatLeaf<(imm), [{
184     return ARM_AM::getSOImmVal(~(int)N->getZExtValue()) != -1;
185   }], so_imm_not_XFORM>;
186
187 // sext_16_node predicate - True if the SDNode is sign-extended 16 or more bits.
188 def sext_16_node : PatLeaf<(i32 GPR:$a), [{
189   return CurDAG->ComputeNumSignBits(SDValue(N,0)) >= 17;
190 }]>;
191
192 /// bf_inv_mask_imm predicate - An AND mask to clear an arbitrary width bitfield
193 /// e.g., 0xf000ffff
194 def bf_inv_mask_imm : Operand<i32>,
195                       PatLeaf<(imm), [{
196   uint32_t v = (uint32_t)N->getZExtValue();
197   if (v == 0xffffffff)
198     return 0;
199   // there can be 1's on either or both "outsides", all the "inside"
200   // bits must be 0's
201   unsigned int lsb = 0, msb = 31;
202   while (v & (1 << msb)) --msb;
203   while (v & (1 << lsb)) ++lsb;
204   for (unsigned int i = lsb; i <= msb; ++i) {
205     if (v & (1 << i))
206       return 0;
207   }
208   return 1;
209 }] > {
210   let PrintMethod = "printBitfieldInvMaskImmOperand";
211 }
212
213 /// Split a 32-bit immediate into two 16 bit parts.
214 def lo16 : SDNodeXForm<imm, [{
215   return CurDAG->getTargetConstant((uint32_t)N->getZExtValue() & 0xffff,
216                                    MVT::i32);
217 }]>;
218
219 def hi16 : SDNodeXForm<imm, [{
220   return CurDAG->getTargetConstant((uint32_t)N->getZExtValue() >> 16, MVT::i32);
221 }]>;
222
223 def lo16AllZero : PatLeaf<(i32 imm), [{
224   // Returns true if all low 16-bits are 0.
225   return (((uint32_t)N->getZExtValue()) & 0xFFFFUL) == 0;
226 }], hi16>;
227
228 /// imm0_65535 predicate - True if the 32-bit immediate is in the range
229 /// [0.65535].
230 def imm0_65535 : PatLeaf<(i32 imm), [{
231   return (uint32_t)N->getZExtValue() < 65536;
232 }]>;
233
234 class BinOpFrag<dag res> : PatFrag<(ops node:$LHS, node:$RHS), res>;
235 class UnOpFrag <dag res> : PatFrag<(ops node:$Src), res>;
236
237 /// adde and sube predicates - True based on whether the carry flag output
238 /// will be needed or not.
239 def adde_dead_carry :
240   PatFrag<(ops node:$LHS, node:$RHS), (adde node:$LHS, node:$RHS),
241   [{return !N->hasAnyUseOfValue(1);}]>;
242 def sube_dead_carry :
243   PatFrag<(ops node:$LHS, node:$RHS), (sube node:$LHS, node:$RHS),
244   [{return !N->hasAnyUseOfValue(1);}]>;
245 def adde_live_carry :
246   PatFrag<(ops node:$LHS, node:$RHS), (adde node:$LHS, node:$RHS),
247   [{return N->hasAnyUseOfValue(1);}]>;
248 def sube_live_carry :
249   PatFrag<(ops node:$LHS, node:$RHS), (sube node:$LHS, node:$RHS),
250   [{return N->hasAnyUseOfValue(1);}]>;
251
252 //===----------------------------------------------------------------------===//
253 // Operand Definitions.
254 //
255
256 // Branch target.
257 def brtarget : Operand<OtherVT>;
258
259 // A list of registers separated by comma. Used by load/store multiple.
260 def reglist : Operand<i32> {
261   let PrintMethod = "printRegisterList";
262 }
263
264 // An operand for the CONSTPOOL_ENTRY pseudo-instruction.
265 def cpinst_operand : Operand<i32> {
266   let PrintMethod = "printCPInstOperand";
267 }
268
269 def jtblock_operand : Operand<i32> {
270   let PrintMethod = "printJTBlockOperand";
271 }
272 def jt2block_operand : Operand<i32> {
273   let PrintMethod = "printJT2BlockOperand";
274 }
275
276 // Local PC labels.
277 def pclabel : Operand<i32> {
278   let PrintMethod = "printPCLabel";
279 }
280
281 // shifter_operand operands: so_reg and so_imm.
282 def so_reg : Operand<i32>,    // reg reg imm
283             ComplexPattern<i32, 3, "SelectShifterOperandReg",
284                             [shl,srl,sra,rotr]> {
285   let PrintMethod = "printSORegOperand";
286   let MIOperandInfo = (ops GPR, GPR, i32imm);
287 }
288
289 // so_imm - Match a 32-bit shifter_operand immediate operand, which is an
290 // 8-bit immediate rotated by an arbitrary number of bits.  so_imm values are
291 // represented in the imm field in the same 12-bit form that they are encoded
292 // into so_imm instructions: the 8-bit immediate is the least significant bits
293 // [bits 0-7], the 4-bit shift amount is the next 4 bits [bits 8-11].
294 def so_imm : Operand<i32>,
295              PatLeaf<(imm), [{
296       return ARM_AM::getSOImmVal(N->getZExtValue()) != -1;
297     }]> {
298   let PrintMethod = "printSOImmOperand";
299 }
300
301 // Break so_imm's up into two pieces.  This handles immediates with up to 16
302 // bits set in them.  This uses so_imm2part to match and so_imm2part_[12] to
303 // get the first/second pieces.
304 def so_imm2part : Operand<i32>,
305                   PatLeaf<(imm), [{
306       return ARM_AM::isSOImmTwoPartVal((unsigned)N->getZExtValue());
307     }]> {
308   let PrintMethod = "printSOImm2PartOperand";
309 }
310
311 def so_imm2part_1 : SDNodeXForm<imm, [{
312   unsigned V = ARM_AM::getSOImmTwoPartFirst((unsigned)N->getZExtValue());
313   return CurDAG->getTargetConstant(V, MVT::i32);
314 }]>;
315
316 def so_imm2part_2 : SDNodeXForm<imm, [{
317   unsigned V = ARM_AM::getSOImmTwoPartSecond((unsigned)N->getZExtValue());
318   return CurDAG->getTargetConstant(V, MVT::i32);
319 }]>;
320
321 def so_neg_imm2part : Operand<i32>, PatLeaf<(imm), [{
322       return ARM_AM::isSOImmTwoPartVal(-(int)N->getZExtValue());
323     }]> {
324   let PrintMethod = "printSOImm2PartOperand";
325 }
326
327 def so_neg_imm2part_1 : SDNodeXForm<imm, [{
328   unsigned V = ARM_AM::getSOImmTwoPartFirst(-(int)N->getZExtValue());
329   return CurDAG->getTargetConstant(V, MVT::i32);
330 }]>;
331
332 def so_neg_imm2part_2 : SDNodeXForm<imm, [{
333   unsigned V = ARM_AM::getSOImmTwoPartSecond(-(int)N->getZExtValue());
334   return CurDAG->getTargetConstant(V, MVT::i32);
335 }]>;
336
337 /// imm0_31 predicate - True if the 32-bit immediate is in the range [0,31].
338 def imm0_31 : Operand<i32>, PatLeaf<(imm), [{
339   return (int32_t)N->getZExtValue() < 32;
340 }]>;
341
342 // Define ARM specific addressing modes.
343
344 // addrmode2 := reg +/- reg shop imm
345 // addrmode2 := reg +/- imm12
346 //
347 def addrmode2 : Operand<i32>,
348                 ComplexPattern<i32, 3, "SelectAddrMode2", []> {
349   let PrintMethod = "printAddrMode2Operand";
350   let MIOperandInfo = (ops GPR:$base, GPR:$offsreg, i32imm:$offsimm);
351 }
352
353 def am2offset : Operand<i32>,
354                 ComplexPattern<i32, 2, "SelectAddrMode2Offset", []> {
355   let PrintMethod = "printAddrMode2OffsetOperand";
356   let MIOperandInfo = (ops GPR, i32imm);
357 }
358
359 // addrmode3 := reg +/- reg
360 // addrmode3 := reg +/- imm8
361 //
362 def addrmode3 : Operand<i32>,
363                 ComplexPattern<i32, 3, "SelectAddrMode3", []> {
364   let PrintMethod = "printAddrMode3Operand";
365   let MIOperandInfo = (ops GPR:$base, GPR:$offsreg, i32imm:$offsimm);
366 }
367
368 def am3offset : Operand<i32>,
369                 ComplexPattern<i32, 2, "SelectAddrMode3Offset", []> {
370   let PrintMethod = "printAddrMode3OffsetOperand";
371   let MIOperandInfo = (ops GPR, i32imm);
372 }
373
374 // addrmode4 := reg, <mode|W>
375 //
376 def addrmode4 : Operand<i32>,
377                 ComplexPattern<i32, 2, "SelectAddrMode4", []> {
378   let PrintMethod = "printAddrMode4Operand";
379   let MIOperandInfo = (ops GPR, i32imm);
380 }
381
382 // addrmode5 := reg +/- imm8*4
383 //
384 def addrmode5 : Operand<i32>,
385                 ComplexPattern<i32, 2, "SelectAddrMode5", []> {
386   let PrintMethod = "printAddrMode5Operand";
387   let MIOperandInfo = (ops GPR, i32imm);
388 }
389
390 // addrmode6 := reg with optional writeback
391 //
392 def addrmode6 : Operand<i32>,
393                 ComplexPattern<i32, 4, "SelectAddrMode6", []> {
394   let PrintMethod = "printAddrMode6Operand";
395   let MIOperandInfo = (ops GPR:$addr, GPR:$upd, i32imm, i32imm);
396 }
397
398 // addrmodepc := pc + reg
399 //
400 def addrmodepc : Operand<i32>,
401                  ComplexPattern<i32, 2, "SelectAddrModePC", []> {
402   let PrintMethod = "printAddrModePCOperand";
403   let MIOperandInfo = (ops GPR, i32imm);
404 }
405
406 def nohash_imm : Operand<i32> {
407   let PrintMethod = "printNoHashImmediate";
408 }
409
410 //===----------------------------------------------------------------------===//
411
412 include "ARMInstrFormats.td"
413
414 //===----------------------------------------------------------------------===//
415 // Multiclass helpers...
416 //
417
418 /// AsI1_bin_irs - Defines a set of (op r, {so_imm|r|so_reg}) patterns for a
419 /// binop that produces a value.
420 multiclass AsI1_bin_irs<bits<4> opcod, string opc, PatFrag opnode,
421                         bit Commutable = 0> {
422   def ri : AsI1<opcod, (outs GPR:$dst), (ins GPR:$a, so_imm:$b), DPFrm,
423                IIC_iALUi, opc, "\t$dst, $a, $b",
424                [(set GPR:$dst, (opnode GPR:$a, so_imm:$b))]> {
425     let Inst{25} = 1;
426   }
427   def rr : AsI1<opcod, (outs GPR:$dst), (ins GPR:$a, GPR:$b), DPFrm,
428                IIC_iALUr, opc, "\t$dst, $a, $b",
429                [(set GPR:$dst, (opnode GPR:$a, GPR:$b))]> {
430     let Inst{11-4} = 0b00000000;
431     let Inst{25} = 0;
432     let isCommutable = Commutable;
433   }
434   def rs : AsI1<opcod, (outs GPR:$dst), (ins GPR:$a, so_reg:$b), DPSoRegFrm,
435                IIC_iALUsr, opc, "\t$dst, $a, $b",
436                [(set GPR:$dst, (opnode GPR:$a, so_reg:$b))]> {
437     let Inst{25} = 0;
438   }
439 }
440
441 /// AI1_bin_s_irs - Similar to AsI1_bin_irs except it sets the 's' bit so the
442 /// instruction modifies the CPSR register.
443 let Defs = [CPSR] in {
444 multiclass AI1_bin_s_irs<bits<4> opcod, string opc, PatFrag opnode,
445                          bit Commutable = 0> {
446   def ri : AI1<opcod, (outs GPR:$dst), (ins GPR:$a, so_imm:$b), DPFrm,
447                IIC_iALUi, opc, "\t$dst, $a, $b",
448                [(set GPR:$dst, (opnode GPR:$a, so_imm:$b))]> {
449     let Inst{20} = 1;
450     let Inst{25} = 1;
451   }
452   def rr : AI1<opcod, (outs GPR:$dst), (ins GPR:$a, GPR:$b), DPFrm,
453                IIC_iALUr, opc, "\t$dst, $a, $b",
454                [(set GPR:$dst, (opnode GPR:$a, GPR:$b))]> {
455     let isCommutable = Commutable;
456     let Inst{11-4} = 0b00000000;
457     let Inst{20} = 1;
458     let Inst{25} = 0;
459   }
460   def rs : AI1<opcod, (outs GPR:$dst), (ins GPR:$a, so_reg:$b), DPSoRegFrm,
461                IIC_iALUsr, opc, "\t$dst, $a, $b",
462                [(set GPR:$dst, (opnode GPR:$a, so_reg:$b))]> {
463     let Inst{20} = 1;
464     let Inst{25} = 0;
465   }
466 }
467 }
468
469 /// AI1_cmp_irs - Defines a set of (op r, {so_imm|r|so_reg}) cmp / test
470 /// patterns. Similar to AsI1_bin_irs except the instruction does not produce
471 /// a explicit result, only implicitly set CPSR.
472 let Defs = [CPSR] in {
473 multiclass AI1_cmp_irs<bits<4> opcod, string opc, PatFrag opnode,
474                        bit Commutable = 0> {
475   def ri : AI1<opcod, (outs), (ins GPR:$a, so_imm:$b), DPFrm, IIC_iCMPi,
476                opc, "\t$a, $b",
477                [(opnode GPR:$a, so_imm:$b)]> {
478     let Inst{20} = 1;
479     let Inst{25} = 1;
480   }
481   def rr : AI1<opcod, (outs), (ins GPR:$a, GPR:$b), DPFrm, IIC_iCMPr,
482                opc, "\t$a, $b",
483                [(opnode GPR:$a, GPR:$b)]> {
484     let Inst{11-4} = 0b00000000;
485     let Inst{20} = 1;
486     let Inst{25} = 0;
487     let isCommutable = Commutable;
488   }
489   def rs : AI1<opcod, (outs), (ins GPR:$a, so_reg:$b), DPSoRegFrm, IIC_iCMPsr,
490                opc, "\t$a, $b",
491                [(opnode GPR:$a, so_reg:$b)]> {
492     let Inst{20} = 1;
493     let Inst{25} = 0;
494   }
495 }
496 }
497
498 /// AI_unary_rrot - A unary operation with two forms: one whose operand is a
499 /// register and one whose operand is a register rotated by 8/16/24.
500 /// FIXME: Remove the 'r' variant. Its rot_imm is zero.
501 multiclass AI_unary_rrot<bits<8> opcod, string opc, PatFrag opnode> {
502   def r     : AExtI<opcod, (outs GPR:$dst), (ins GPR:$src),
503                  IIC_iUNAr, opc, "\t$dst, $src",
504                  [(set GPR:$dst, (opnode GPR:$src))]>,
505               Requires<[IsARM, HasV6]> {
506     let Inst{11-10} = 0b00;
507     let Inst{19-16} = 0b1111;
508   }
509   def r_rot : AExtI<opcod, (outs GPR:$dst), (ins GPR:$src, i32imm:$rot),
510                  IIC_iUNAsi, opc, "\t$dst, $src, ror $rot",
511                  [(set GPR:$dst, (opnode (rotr GPR:$src, rot_imm:$rot)))]>,
512               Requires<[IsARM, HasV6]> {
513     let Inst{19-16} = 0b1111;
514   }
515 }
516
517 multiclass AI_unary_rrot_np<bits<8> opcod, string opc> {
518   def r     : AExtI<opcod, (outs GPR:$dst), (ins GPR:$src),
519                  IIC_iUNAr, opc, "\t$dst, $src",
520                  [/* For disassembly only; pattern left blank */]>,
521               Requires<[IsARM, HasV6]> {
522     let Inst{11-10} = 0b00;
523     let Inst{19-16} = 0b1111;
524   }
525   def r_rot : AExtI<opcod, (outs GPR:$dst), (ins GPR:$src, i32imm:$rot),
526                  IIC_iUNAsi, opc, "\t$dst, $src, ror $rot",
527                  [/* For disassembly only; pattern left blank */]>,
528               Requires<[IsARM, HasV6]> {
529     let Inst{19-16} = 0b1111;
530   }
531 }
532
533 /// AI_bin_rrot - A binary operation with two forms: one whose operand is a
534 /// register and one whose operand is a register rotated by 8/16/24.
535 multiclass AI_bin_rrot<bits<8> opcod, string opc, PatFrag opnode> {
536   def rr     : AExtI<opcod, (outs GPR:$dst), (ins GPR:$LHS, GPR:$RHS),
537                   IIC_iALUr, opc, "\t$dst, $LHS, $RHS",
538                   [(set GPR:$dst, (opnode GPR:$LHS, GPR:$RHS))]>,
539                Requires<[IsARM, HasV6]> {
540     let Inst{11-10} = 0b00;
541   }
542   def rr_rot : AExtI<opcod, (outs GPR:$dst), (ins GPR:$LHS, GPR:$RHS,
543                                               i32imm:$rot),
544                   IIC_iALUsi, opc, "\t$dst, $LHS, $RHS, ror $rot",
545                   [(set GPR:$dst, (opnode GPR:$LHS,
546                                           (rotr GPR:$RHS, rot_imm:$rot)))]>,
547                   Requires<[IsARM, HasV6]>;
548 }
549
550 // For disassembly only.
551 multiclass AI_bin_rrot_np<bits<8> opcod, string opc> {
552   def rr     : AExtI<opcod, (outs GPR:$dst), (ins GPR:$LHS, GPR:$RHS),
553                   IIC_iALUr, opc, "\t$dst, $LHS, $RHS",
554                   [/* For disassembly only; pattern left blank */]>,
555                Requires<[IsARM, HasV6]> {
556     let Inst{11-10} = 0b00;
557   }
558   def rr_rot : AExtI<opcod, (outs GPR:$dst), (ins GPR:$LHS, GPR:$RHS,
559                                               i32imm:$rot),
560                   IIC_iALUsi, opc, "\t$dst, $LHS, $RHS, ror $rot",
561                   [/* For disassembly only; pattern left blank */]>,
562                   Requires<[IsARM, HasV6]>;
563 }
564
565 /// AI1_adde_sube_irs - Define instructions and patterns for adde and sube.
566 let Uses = [CPSR] in {
567 multiclass AI1_adde_sube_irs<bits<4> opcod, string opc, PatFrag opnode,
568                              bit Commutable = 0> {
569   def ri : AsI1<opcod, (outs GPR:$dst), (ins GPR:$a, so_imm:$b),
570                 DPFrm, IIC_iALUi, opc, "\t$dst, $a, $b",
571                [(set GPR:$dst, (opnode GPR:$a, so_imm:$b))]>,
572                Requires<[IsARM]> {
573     let Inst{25} = 1;
574   }
575   def rr : AsI1<opcod, (outs GPR:$dst), (ins GPR:$a, GPR:$b),
576                 DPFrm, IIC_iALUr, opc, "\t$dst, $a, $b",
577                [(set GPR:$dst, (opnode GPR:$a, GPR:$b))]>,
578                Requires<[IsARM]> {
579     let isCommutable = Commutable;
580     let Inst{11-4} = 0b00000000;
581     let Inst{25} = 0;
582   }
583   def rs : AsI1<opcod, (outs GPR:$dst), (ins GPR:$a, so_reg:$b),
584                 DPSoRegFrm, IIC_iALUsr, opc, "\t$dst, $a, $b",
585                [(set GPR:$dst, (opnode GPR:$a, so_reg:$b))]>,
586                Requires<[IsARM]> {
587     let Inst{25} = 0;
588   }
589 }
590 // Carry setting variants
591 let Defs = [CPSR] in {
592 multiclass AI1_adde_sube_s_irs<bits<4> opcod, string opc, PatFrag opnode,
593                              bit Commutable = 0> {
594   def Sri : AXI1<opcod, (outs GPR:$dst), (ins GPR:$a, so_imm:$b),
595                 DPFrm, IIC_iALUi, !strconcat(opc, "\t$dst, $a, $b"),
596                [(set GPR:$dst, (opnode GPR:$a, so_imm:$b))]>,
597                Requires<[IsARM]> {
598     let Inst{20} = 1;
599     let Inst{25} = 1;
600   }
601   def Srr : AXI1<opcod, (outs GPR:$dst), (ins GPR:$a, GPR:$b),
602                 DPFrm, IIC_iALUr, !strconcat(opc, "\t$dst, $a, $b"),
603                [(set GPR:$dst, (opnode GPR:$a, GPR:$b))]>,
604                Requires<[IsARM]> {
605     let Inst{11-4} = 0b00000000;
606     let Inst{20} = 1;
607     let Inst{25} = 0;
608   }
609   def Srs : AXI1<opcod, (outs GPR:$dst), (ins GPR:$a, so_reg:$b),
610                 DPSoRegFrm, IIC_iALUsr, !strconcat(opc, "\t$dst, $a, $b"),
611                [(set GPR:$dst, (opnode GPR:$a, so_reg:$b))]>,
612                Requires<[IsARM]> {
613     let Inst{20} = 1;
614     let Inst{25} = 0;
615   }
616 }
617 }
618 }
619
620 //===----------------------------------------------------------------------===//
621 // Instructions
622 //===----------------------------------------------------------------------===//
623
624 //===----------------------------------------------------------------------===//
625 //  Miscellaneous Instructions.
626 //
627
628 /// CONSTPOOL_ENTRY - This instruction represents a floating constant pool in
629 /// the function.  The first operand is the ID# for this instruction, the second
630 /// is the index into the MachineConstantPool that this is, the third is the
631 /// size in bytes of this constant pool entry.
632 let neverHasSideEffects = 1, isNotDuplicable = 1 in
633 def CONSTPOOL_ENTRY :
634 PseudoInst<(outs), (ins cpinst_operand:$instid, cpinst_operand:$cpidx,
635                     i32imm:$size), NoItinerary,
636            "${instid:label} ${cpidx:cpentry}", []>;
637
638 let Defs = [SP], Uses = [SP] in {
639 def ADJCALLSTACKUP :
640 PseudoInst<(outs), (ins i32imm:$amt1, i32imm:$amt2, pred:$p), NoItinerary,
641            "@ ADJCALLSTACKUP $amt1",
642            [(ARMcallseq_end timm:$amt1, timm:$amt2)]>;
643
644 def ADJCALLSTACKDOWN :
645 PseudoInst<(outs), (ins i32imm:$amt, pred:$p), NoItinerary,
646            "@ ADJCALLSTACKDOWN $amt",
647            [(ARMcallseq_start timm:$amt)]>;
648 }
649
650 def NOP : AI<(outs), (ins), MiscFrm, NoItinerary, "nop", "",
651              [/* For disassembly only; pattern left blank */]>,
652           Requires<[IsARM, HasV6T2]> {
653   let Inst{27-16} = 0b001100100000;
654   let Inst{7-0} = 0b00000000;
655 }
656
657 def YIELD : AI<(outs), (ins), MiscFrm, NoItinerary, "yield", "",
658              [/* For disassembly only; pattern left blank */]>,
659           Requires<[IsARM, HasV6T2]> {
660   let Inst{27-16} = 0b001100100000;
661   let Inst{7-0} = 0b00000001;
662 }
663
664 def WFE : AI<(outs), (ins), MiscFrm, NoItinerary, "wfe", "",
665              [/* For disassembly only; pattern left blank */]>,
666           Requires<[IsARM, HasV6T2]> {
667   let Inst{27-16} = 0b001100100000;
668   let Inst{7-0} = 0b00000010;
669 }
670
671 def WFI : AI<(outs), (ins), MiscFrm, NoItinerary, "wfi", "",
672              [/* For disassembly only; pattern left blank */]>,
673           Requires<[IsARM, HasV6T2]> {
674   let Inst{27-16} = 0b001100100000;
675   let Inst{7-0} = 0b00000011;
676 }
677
678 def SEL : AI<(outs GPR:$dst), (ins GPR:$a, GPR:$b), DPFrm, NoItinerary, "sel",
679              "\t$dst, $a, $b",
680              [/* For disassembly only; pattern left blank */]>,
681           Requires<[IsARM, HasV6]> {
682   let Inst{27-20} = 0b01101000;
683   let Inst{7-4} = 0b1011;
684 }
685
686 def SEV : AI<(outs), (ins), MiscFrm, NoItinerary, "sev", "",
687              [/* For disassembly only; pattern left blank */]>,
688           Requires<[IsARM, HasV6T2]> {
689   let Inst{27-16} = 0b001100100000;
690   let Inst{7-0} = 0b00000100;
691 }
692
693 // The i32imm operand $val can be used by a debugger to store more information
694 // about the breakpoint.
695 def BKPT : AI<(outs), (ins i32imm:$val), MiscFrm, NoItinerary, "bkpt", "\t$val",
696               [/* For disassembly only; pattern left blank */]>,
697            Requires<[IsARM]> {
698   let Inst{27-20} = 0b00010010;
699   let Inst{7-4} = 0b0111;
700 }
701
702 // Change Processor State is a system instruction -- for disassembly only.
703 // The singleton $opt operand contains the following information:
704 // opt{4-0} = mode from Inst{4-0}
705 // opt{5} = changemode from Inst{17}
706 // opt{8-6} = AIF from Inst{8-6}
707 // opt{10-9} = imod from Inst{19-18} with 0b10 as enable and 0b11 as disable
708 def CPS : AXI<(outs),(ins i32imm:$opt), MiscFrm, NoItinerary, "cps${opt:cps}",
709               [/* For disassembly only; pattern left blank */]>,
710           Requires<[IsARM]> {
711   let Inst{31-28} = 0b1111;
712   let Inst{27-20} = 0b00010000;
713   let Inst{16} = 0;
714   let Inst{5} = 0;
715 }
716
717 // Preload signals the memory system of possible future data/instruction access.
718 // These are for disassembly only.
719 multiclass APreLoad<bit data, bit read, string opc> {
720
721   def i : AXI<(outs), (ins GPR:$base, i32imm:$imm), MiscFrm, NoItinerary,
722                !strconcat(opc, "\t[$base, $imm]"), []> {
723     let Inst{31-26} = 0b111101;
724     let Inst{25} = 0; // 0 for immediate form
725     let Inst{24} = data;
726     let Inst{22} = read;
727     let Inst{21-20} = 0b01;
728   }
729
730   def r : AXI<(outs), (ins addrmode2:$addr), MiscFrm, NoItinerary,
731                !strconcat(opc, "\t$addr"), []> {
732     let Inst{31-26} = 0b111101;
733     let Inst{25} = 1; // 1 for register form
734     let Inst{24} = data;
735     let Inst{22} = read;
736     let Inst{21-20} = 0b01;
737     let Inst{4} = 0;
738   }
739 }
740
741 defm PLD  : APreLoad<1, 1, "pld">;
742 defm PLDW : APreLoad<1, 0, "pldw">;
743 defm PLI  : APreLoad<0, 1, "pli">;
744
745 def SETENDBE : AXI<(outs),(ins), MiscFrm, NoItinerary, "setend\tbe",
746                    [/* For disassembly only; pattern left blank */]>,
747                Requires<[IsARM]> {
748   let Inst{31-28} = 0b1111;
749   let Inst{27-20} = 0b00010000;
750   let Inst{16} = 1;
751   let Inst{9} = 1;
752   let Inst{7-4} = 0b0000;
753 }
754
755 def SETENDLE : AXI<(outs),(ins), MiscFrm, NoItinerary, "setend\tle",
756                    [/* For disassembly only; pattern left blank */]>,
757                Requires<[IsARM]> {
758   let Inst{31-28} = 0b1111;
759   let Inst{27-20} = 0b00010000;
760   let Inst{16} = 1;
761   let Inst{9} = 0;
762   let Inst{7-4} = 0b0000;
763 }
764
765 def DBG : AI<(outs), (ins i32imm:$opt), MiscFrm, NoItinerary, "dbg", "\t$opt",
766              [/* For disassembly only; pattern left blank */]>,
767           Requires<[IsARM, HasV7]> {
768   let Inst{27-16} = 0b001100100000;
769   let Inst{7-4} = 0b1111;
770 }
771
772 // A5.4 Permanently UNDEFINED instructions.
773 def TRAP : AI<(outs), (ins), MiscFrm, NoItinerary, "trap", "",
774               [/* For disassembly only; pattern left blank */]>,
775            Requires<[IsARM]> {
776   let Inst{27-25} = 0b011;
777   let Inst{24-20} = 0b11111;
778   let Inst{7-5} = 0b111;
779   let Inst{4} = 0b1;
780 }
781
782 // Address computation and loads and stores in PIC mode.
783 let isNotDuplicable = 1 in {
784 def PICADD : AXI1<0b0100, (outs GPR:$dst), (ins GPR:$a, pclabel:$cp, pred:$p),
785                   Pseudo, IIC_iALUr, "\n$cp:\n\tadd$p\t$dst, pc, $a",
786                    [(set GPR:$dst, (ARMpic_add GPR:$a, imm:$cp))]>;
787
788 let AddedComplexity = 10 in {
789 def PICLDR  : AXI2ldw<(outs GPR:$dst), (ins addrmodepc:$addr, pred:$p),
790                   Pseudo, IIC_iLoadr, "\n${addr:label}:\n\tldr$p\t$dst, $addr",
791                   [(set GPR:$dst, (load addrmodepc:$addr))]>;
792
793 def PICLDRH : AXI3ldh<(outs GPR:$dst), (ins addrmodepc:$addr, pred:$p),
794                 Pseudo, IIC_iLoadr, "\n${addr:label}:\n\tldrh${p}\t$dst, $addr",
795                   [(set GPR:$dst, (zextloadi16 addrmodepc:$addr))]>;
796
797 def PICLDRB : AXI2ldb<(outs GPR:$dst), (ins addrmodepc:$addr, pred:$p),
798                 Pseudo, IIC_iLoadr, "\n${addr:label}:\n\tldrb${p}\t$dst, $addr",
799                   [(set GPR:$dst, (zextloadi8 addrmodepc:$addr))]>;
800
801 def PICLDRSH : AXI3ldsh<(outs GPR:$dst), (ins addrmodepc:$addr, pred:$p),
802                Pseudo, IIC_iLoadr, "\n${addr:label}:\n\tldrsh${p}\t$dst, $addr",
803                   [(set GPR:$dst, (sextloadi16 addrmodepc:$addr))]>;
804
805 def PICLDRSB : AXI3ldsb<(outs GPR:$dst), (ins addrmodepc:$addr, pred:$p),
806                Pseudo, IIC_iLoadr, "\n${addr:label}:\n\tldrsb${p}\t$dst, $addr",
807                   [(set GPR:$dst, (sextloadi8 addrmodepc:$addr))]>;
808 }
809 let AddedComplexity = 10 in {
810 def PICSTR  : AXI2stw<(outs), (ins GPR:$src, addrmodepc:$addr, pred:$p),
811                Pseudo, IIC_iStorer, "\n${addr:label}:\n\tstr$p\t$src, $addr",
812                [(store GPR:$src, addrmodepc:$addr)]>;
813
814 def PICSTRH : AXI3sth<(outs), (ins GPR:$src, addrmodepc:$addr, pred:$p),
815                Pseudo, IIC_iStorer, "\n${addr:label}:\n\tstrh${p}\t$src, $addr",
816                [(truncstorei16 GPR:$src, addrmodepc:$addr)]>;
817
818 def PICSTRB : AXI2stb<(outs), (ins GPR:$src, addrmodepc:$addr, pred:$p),
819                Pseudo, IIC_iStorer, "\n${addr:label}:\n\tstrb${p}\t$src, $addr",
820                [(truncstorei8 GPR:$src, addrmodepc:$addr)]>;
821 }
822 } // isNotDuplicable = 1
823
824
825 // LEApcrel - Load a pc-relative address into a register without offending the
826 // assembler.
827 def LEApcrel : AXI1<0x0, (outs GPR:$dst), (ins i32imm:$label, pred:$p),
828                     Pseudo, IIC_iALUi,
829            !strconcat(!strconcat(".set ${:private}PCRELV${:uid}, ($label-(",
830                                  "${:private}PCRELL${:uid}+8))\n"),
831                       !strconcat("${:private}PCRELL${:uid}:\n\t",
832                                  "add$p\t$dst, pc, #${:private}PCRELV${:uid}")),
833                    []>;
834
835 def LEApcrelJT : AXI1<0x0, (outs GPR:$dst),
836                            (ins i32imm:$label, nohash_imm:$id, pred:$p),
837           Pseudo, IIC_iALUi,
838    !strconcat(!strconcat(".set ${:private}PCRELV${:uid}, "
839                          "(${label}_${id}-(",
840                                   "${:private}PCRELL${:uid}+8))\n"),
841                        !strconcat("${:private}PCRELL${:uid}:\n\t",
842                                  "add$p\t$dst, pc, #${:private}PCRELV${:uid}")),
843                    []> {
844     let Inst{25} = 1;
845 }
846
847 //===----------------------------------------------------------------------===//
848 //  Control Flow Instructions.
849 //
850
851 let isReturn = 1, isTerminator = 1, isBarrier = 1 in
852   def BX_RET : AI<(outs), (ins), BrMiscFrm, IIC_Br,
853                   "bx", "\tlr", [(ARMretflag)]> {
854   let Inst{3-0}   = 0b1110;
855   let Inst{7-4}   = 0b0001;
856   let Inst{19-8}  = 0b111111111111;
857   let Inst{27-20} = 0b00010010;
858 }
859
860 // Indirect branches
861 let isBranch = 1, isTerminator = 1, isBarrier = 1, isIndirectBranch = 1 in {
862   def BRIND : AXI<(outs), (ins GPR:$dst), BrMiscFrm, IIC_Br, "bx\t$dst",
863                   [(brind GPR:$dst)]> {
864     let Inst{7-4}   = 0b0001;
865     let Inst{19-8}  = 0b111111111111;
866     let Inst{27-20} = 0b00010010;
867     let Inst{31-28} = 0b1110;
868   }
869 }
870
871 // FIXME: remove when we have a way to marking a MI with these properties.
872 // FIXME: Should pc be an implicit operand like PICADD, etc?
873 let isReturn = 1, isTerminator = 1, isBarrier = 1, mayLoad = 1,
874     hasExtraDefRegAllocReq = 1 in
875   def LDM_RET : AXI4ld<(outs),
876                     (ins addrmode4:$addr, pred:$p, reglist:$wb, variable_ops),
877                     LdStMulFrm, IIC_Br, "ldm${addr:submode}${p}\t$addr, $wb",
878                     []>;
879
880 // On non-Darwin platforms R9 is callee-saved.
881 let isCall = 1,
882   Defs = [R0,  R1,  R2,  R3,  R12, LR,
883           D0,  D1,  D2,  D3,  D4,  D5,  D6,  D7,
884           D16, D17, D18, D19, D20, D21, D22, D23,
885           D24, D25, D26, D27, D28, D29, D30, D31, CPSR, FPSCR] in {
886   def BL  : ABXI<0b1011, (outs), (ins i32imm:$func, variable_ops),
887                 IIC_Br, "bl\t${func:call}",
888                 [(ARMcall tglobaladdr:$func)]>,
889             Requires<[IsARM, IsNotDarwin]> {
890     let Inst{31-28} = 0b1110;
891   }
892
893   def BL_pred : ABI<0b1011, (outs), (ins i32imm:$func, variable_ops),
894                    IIC_Br, "bl", "\t${func:call}",
895                    [(ARMcall_pred tglobaladdr:$func)]>,
896                 Requires<[IsARM, IsNotDarwin]>;
897
898   // ARMv5T and above
899   def BLX : AXI<(outs), (ins GPR:$func, variable_ops), BrMiscFrm,
900                 IIC_Br, "blx\t$func",
901                 [(ARMcall GPR:$func)]>,
902             Requires<[IsARM, HasV5T, IsNotDarwin]> {
903     let Inst{7-4}   = 0b0011;
904     let Inst{19-8}  = 0b111111111111;
905     let Inst{27-20} = 0b00010010;
906   }
907
908   // ARMv4T
909   // Note: Restrict $func to the tGPR regclass to prevent it being in LR.
910   def BX : ABXIx2<(outs), (ins tGPR:$func, variable_ops),
911                   IIC_Br, "mov\tlr, pc\n\tbx\t$func",
912                   [(ARMcall_nolink tGPR:$func)]>,
913            Requires<[IsARM, IsNotDarwin]> {
914     let Inst{7-4}   = 0b0001;
915     let Inst{19-8}  = 0b111111111111;
916     let Inst{27-20} = 0b00010010;
917   }
918 }
919
920 // On Darwin R9 is call-clobbered.
921 let isCall = 1,
922   Defs = [R0,  R1,  R2,  R3,  R9,  R12, LR,
923           D0,  D1,  D2,  D3,  D4,  D5,  D6,  D7,
924           D16, D17, D18, D19, D20, D21, D22, D23,
925           D24, D25, D26, D27, D28, D29, D30, D31, CPSR, FPSCR] in {
926   def BLr9  : ABXI<0b1011, (outs), (ins i32imm:$func, variable_ops),
927                 IIC_Br, "bl\t${func:call}",
928                 [(ARMcall tglobaladdr:$func)]>, Requires<[IsARM, IsDarwin]> {
929     let Inst{31-28} = 0b1110;
930   }
931
932   def BLr9_pred : ABI<0b1011, (outs), (ins i32imm:$func, variable_ops),
933                    IIC_Br, "bl", "\t${func:call}",
934                    [(ARMcall_pred tglobaladdr:$func)]>,
935                   Requires<[IsARM, IsDarwin]>;
936
937   // ARMv5T and above
938   def BLXr9 : AXI<(outs), (ins GPR:$func, variable_ops), BrMiscFrm,
939                 IIC_Br, "blx\t$func",
940                 [(ARMcall GPR:$func)]>, Requires<[IsARM, HasV5T, IsDarwin]> {
941     let Inst{7-4}   = 0b0011;
942     let Inst{19-8}  = 0b111111111111;
943     let Inst{27-20} = 0b00010010;
944   }
945
946   // ARMv4T
947   // Note: Restrict $func to the tGPR regclass to prevent it being in LR.
948   def BXr9 : ABXIx2<(outs), (ins tGPR:$func, variable_ops),
949                   IIC_Br, "mov\tlr, pc\n\tbx\t$func",
950                   [(ARMcall_nolink tGPR:$func)]>, Requires<[IsARM, IsDarwin]> {
951     let Inst{7-4}   = 0b0001;
952     let Inst{19-8}  = 0b111111111111;
953     let Inst{27-20} = 0b00010010;
954   }
955 }
956
957 let isBranch = 1, isTerminator = 1 in {
958   // B is "predicable" since it can be xformed into a Bcc.
959   let isBarrier = 1 in {
960     let isPredicable = 1 in
961     def B : ABXI<0b1010, (outs), (ins brtarget:$target), IIC_Br,
962                 "b\t$target", [(br bb:$target)]>;
963
964   let isNotDuplicable = 1, isIndirectBranch = 1 in {
965   def BR_JTr : JTI<(outs), (ins GPR:$target, jtblock_operand:$jt, i32imm:$id),
966                     IIC_Br, "mov\tpc, $target \n$jt",
967                     [(ARMbrjt GPR:$target, tjumptable:$jt, imm:$id)]> {
968     let Inst{11-4}  = 0b00000000;
969     let Inst{15-12} = 0b1111;
970     let Inst{20}    = 0; // S Bit
971     let Inst{24-21} = 0b1101;
972     let Inst{27-25} = 0b000;
973   }
974   def BR_JTm : JTI<(outs),
975                    (ins addrmode2:$target, jtblock_operand:$jt, i32imm:$id),
976                    IIC_Br, "ldr\tpc, $target \n$jt",
977                    [(ARMbrjt (i32 (load addrmode2:$target)), tjumptable:$jt,
978                      imm:$id)]> {
979     let Inst{15-12} = 0b1111;
980     let Inst{20}    = 1; // L bit
981     let Inst{21}    = 0; // W bit
982     let Inst{22}    = 0; // B bit
983     let Inst{24}    = 1; // P bit
984     let Inst{27-25} = 0b011;
985   }
986   def BR_JTadd : JTI<(outs),
987                    (ins GPR:$target, GPR:$idx, jtblock_operand:$jt, i32imm:$id),
988                     IIC_Br, "add\tpc, $target, $idx \n$jt",
989                     [(ARMbrjt (add GPR:$target, GPR:$idx), tjumptable:$jt,
990                       imm:$id)]> {
991     let Inst{15-12} = 0b1111;
992     let Inst{20}    = 0; // S bit
993     let Inst{24-21} = 0b0100;
994     let Inst{27-25} = 0b000;
995   }
996   } // isNotDuplicable = 1, isIndirectBranch = 1
997   } // isBarrier = 1
998
999   // FIXME: should be able to write a pattern for ARMBrcond, but can't use
1000   // a two-value operand where a dag node expects two operands. :(
1001   def Bcc : ABI<0b1010, (outs), (ins brtarget:$target),
1002                IIC_Br, "b", "\t$target",
1003                [/*(ARMbrcond bb:$target, imm:$cc, CCR:$ccr)*/]>;
1004 }
1005
1006 // Branch and Exchange Jazelle -- for disassembly only
1007 def BXJ : ABI<0b0001, (outs), (ins GPR:$func), NoItinerary, "bxj", "\t$func",
1008               [/* For disassembly only; pattern left blank */]> {
1009   let Inst{23-20} = 0b0010;
1010   //let Inst{19-8} = 0xfff;
1011   let Inst{7-4} = 0b0010;
1012 }
1013
1014 // Secure Monitor Call is a system instruction -- for disassembly only
1015 def SMC : ABI<0b0001, (outs), (ins i32imm:$opt), NoItinerary, "smc", "\t$opt",
1016               [/* For disassembly only; pattern left blank */]> {
1017   let Inst{23-20} = 0b0110;
1018   let Inst{7-4} = 0b0111;
1019 }
1020
1021 // Supervisor Call (Software Interrupt) -- for disassembly only
1022 let isCall = 1 in {
1023 def SVC : ABI<0b1111, (outs), (ins i32imm:$svc), IIC_Br, "svc", "\t$svc",
1024               [/* For disassembly only; pattern left blank */]>;
1025 }
1026
1027 // Store Return State is a system instruction -- for disassembly only
1028 def SRSW : ABXI<{1,0,0,?}, (outs), (ins addrmode4:$addr, i32imm:$mode),
1029                 NoItinerary, "srs${addr:submode}\tsp!, $mode",
1030                 [/* For disassembly only; pattern left blank */]> {
1031   let Inst{31-28} = 0b1111;
1032   let Inst{22-20} = 0b110; // W = 1
1033 }
1034
1035 def SRS  : ABXI<{1,0,0,?}, (outs), (ins addrmode4:$addr, i32imm:$mode),
1036                 NoItinerary, "srs${addr:submode}\tsp, $mode",
1037                 [/* For disassembly only; pattern left blank */]> {
1038   let Inst{31-28} = 0b1111;
1039   let Inst{22-20} = 0b100; // W = 0
1040 }
1041
1042 // Return From Exception is a system instruction -- for disassembly only
1043 def RFEW : ABXI<{1,0,0,?}, (outs), (ins addrmode4:$addr, GPR:$base),
1044                 NoItinerary, "rfe${addr:submode}\t$base!",
1045                 [/* For disassembly only; pattern left blank */]> {
1046   let Inst{31-28} = 0b1111;
1047   let Inst{22-20} = 0b011; // W = 1
1048 }
1049
1050 def RFE  : ABXI<{1,0,0,?}, (outs), (ins addrmode4:$addr, GPR:$base),
1051                 NoItinerary, "rfe${addr:submode}\t$base",
1052                 [/* For disassembly only; pattern left blank */]> {
1053   let Inst{31-28} = 0b1111;
1054   let Inst{22-20} = 0b001; // W = 0
1055 }
1056
1057 //===----------------------------------------------------------------------===//
1058 //  Load / store Instructions.
1059 //
1060
1061 // Load
1062 let canFoldAsLoad = 1, isReMaterializable = 1, mayHaveSideEffects = 1 in
1063 def LDR  : AI2ldw<(outs GPR:$dst), (ins addrmode2:$addr), LdFrm, IIC_iLoadr,
1064                "ldr", "\t$dst, $addr",
1065                [(set GPR:$dst, (load addrmode2:$addr))]>;
1066
1067 // Special LDR for loads from non-pc-relative constpools.
1068 let canFoldAsLoad = 1, mayLoad = 1, isReMaterializable = 1,
1069     mayHaveSideEffects = 1  in
1070 def LDRcp : AI2ldw<(outs GPR:$dst), (ins addrmode2:$addr), LdFrm, IIC_iLoadr,
1071                  "ldr", "\t$dst, $addr", []>;
1072
1073 // Loads with zero extension
1074 def LDRH  : AI3ldh<(outs GPR:$dst), (ins addrmode3:$addr), LdMiscFrm,
1075                   IIC_iLoadr, "ldrh", "\t$dst, $addr",
1076                   [(set GPR:$dst, (zextloadi16 addrmode3:$addr))]>;
1077
1078 def LDRB  : AI2ldb<(outs GPR:$dst), (ins addrmode2:$addr), LdFrm,
1079                   IIC_iLoadr, "ldrb", "\t$dst, $addr",
1080                   [(set GPR:$dst, (zextloadi8 addrmode2:$addr))]>;
1081
1082 // Loads with sign extension
1083 def LDRSH : AI3ldsh<(outs GPR:$dst), (ins addrmode3:$addr), LdMiscFrm,
1084                    IIC_iLoadr, "ldrsh", "\t$dst, $addr",
1085                    [(set GPR:$dst, (sextloadi16 addrmode3:$addr))]>;
1086
1087 def LDRSB : AI3ldsb<(outs GPR:$dst), (ins addrmode3:$addr), LdMiscFrm,
1088                    IIC_iLoadr, "ldrsb", "\t$dst, $addr",
1089                    [(set GPR:$dst, (sextloadi8 addrmode3:$addr))]>;
1090
1091 let mayLoad = 1, hasExtraDefRegAllocReq = 1 in {
1092 // Load doubleword
1093 def LDRD : AI3ldd<(outs GPR:$dst1, GPR:$dst2), (ins addrmode3:$addr), LdMiscFrm,
1094                  IIC_iLoadr, "ldrd", "\t$dst1, $addr",
1095                  []>, Requires<[IsARM, HasV5TE]>;
1096
1097 // Indexed loads
1098 def LDR_PRE  : AI2ldwpr<(outs GPR:$dst, GPR:$base_wb),
1099                      (ins addrmode2:$addr), LdFrm, IIC_iLoadru,
1100                      "ldr", "\t$dst, $addr!", "$addr.base = $base_wb", []>;
1101
1102 def LDR_POST : AI2ldwpo<(outs GPR:$dst, GPR:$base_wb),
1103                      (ins GPR:$base, am2offset:$offset), LdFrm, IIC_iLoadru,
1104                      "ldr", "\t$dst, [$base], $offset", "$base = $base_wb", []>;
1105
1106 def LDRH_PRE  : AI3ldhpr<(outs GPR:$dst, GPR:$base_wb),
1107                      (ins addrmode3:$addr), LdMiscFrm, IIC_iLoadru,
1108                      "ldrh", "\t$dst, $addr!", "$addr.base = $base_wb", []>;
1109
1110 def LDRH_POST : AI3ldhpo<(outs GPR:$dst, GPR:$base_wb),
1111                      (ins GPR:$base,am3offset:$offset), LdMiscFrm, IIC_iLoadru,
1112                     "ldrh", "\t$dst, [$base], $offset", "$base = $base_wb", []>;
1113
1114 def LDRB_PRE  : AI2ldbpr<(outs GPR:$dst, GPR:$base_wb),
1115                      (ins addrmode2:$addr), LdFrm, IIC_iLoadru,
1116                      "ldrb", "\t$dst, $addr!", "$addr.base = $base_wb", []>;
1117
1118 def LDRB_POST : AI2ldbpo<(outs GPR:$dst, GPR:$base_wb),
1119                      (ins GPR:$base,am2offset:$offset), LdFrm, IIC_iLoadru,
1120                     "ldrb", "\t$dst, [$base], $offset", "$base = $base_wb", []>;
1121
1122 def LDRSH_PRE : AI3ldshpr<(outs GPR:$dst, GPR:$base_wb),
1123                       (ins addrmode3:$addr), LdMiscFrm, IIC_iLoadru,
1124                       "ldrsh", "\t$dst, $addr!", "$addr.base = $base_wb", []>;
1125
1126 def LDRSH_POST: AI3ldshpo<(outs GPR:$dst, GPR:$base_wb),
1127                       (ins GPR:$base,am3offset:$offset), LdMiscFrm, IIC_iLoadru,
1128                    "ldrsh", "\t$dst, [$base], $offset", "$base = $base_wb", []>;
1129
1130 def LDRSB_PRE : AI3ldsbpr<(outs GPR:$dst, GPR:$base_wb),
1131                       (ins addrmode3:$addr), LdMiscFrm, IIC_iLoadru,
1132                       "ldrsb", "\t$dst, $addr!", "$addr.base = $base_wb", []>;
1133
1134 def LDRSB_POST: AI3ldsbpo<(outs GPR:$dst, GPR:$base_wb),
1135                       (ins GPR:$base,am3offset:$offset), LdMiscFrm, IIC_iLoadru,
1136                    "ldrsb", "\t$dst, [$base], $offset", "$base = $base_wb", []>;
1137
1138 // For disassembly only
1139 def LDRD_PRE : AI3lddpr<(outs GPR:$dst1, GPR:$dst2, GPR:$base_wb),
1140                         (ins addrmode3:$addr), LdMiscFrm, IIC_iLoadr,
1141                  "ldrd", "\t$dst1, $dst2, $addr!", "$addr.base = $base_wb", []>,
1142                 Requires<[IsARM, HasV5TE]>;
1143
1144 // For disassembly only
1145 def LDRD_POST : AI3lddpo<(outs GPR:$dst1, GPR:$dst2, GPR:$base_wb),
1146                        (ins GPR:$base,am3offset:$offset), LdMiscFrm, IIC_iLoadr,
1147             "ldrd", "\t$dst1, $dst2, [$base], $offset", "$base = $base_wb", []>,
1148                 Requires<[IsARM, HasV5TE]>;
1149
1150 }
1151
1152 // LDRT, LDRBT, LDRSBT, LDRHT, LDRSHT are for disassembly only.
1153
1154 def LDRT : AI2ldwpo<(outs GPR:$dst, GPR:$base_wb),
1155                    (ins GPR:$base, am2offset:$offset), LdFrm, IIC_iLoadru,
1156                    "ldrt", "\t$dst, [$base], $offset", "$base = $base_wb", []> {
1157   let Inst{21} = 1; // overwrite
1158 }
1159
1160 def LDRBT : AI2ldbpo<(outs GPR:$dst, GPR:$base_wb),
1161                   (ins GPR:$base,am2offset:$offset), LdFrm, IIC_iLoadru,
1162                   "ldrbt", "\t$dst, [$base], $offset", "$base = $base_wb", []> {
1163   let Inst{21} = 1; // overwrite
1164 }
1165
1166 def LDRSBT : AI3ldsbpo<(outs GPR:$dst, GPR:$base_wb),
1167                  (ins GPR:$base,am2offset:$offset), LdMiscFrm, IIC_iLoadru,
1168                  "ldrsbt", "\t$dst, [$base], $offset", "$base = $base_wb", []> {
1169   let Inst{21} = 1; // overwrite
1170 }
1171
1172 def LDRHT : AI3ldhpo<(outs GPR:$dst, GPR:$base_wb),
1173                   (ins GPR:$base, am3offset:$offset), LdMiscFrm, IIC_iLoadru,
1174                   "ldrht", "\t$dst, [$base], $offset", "$base = $base_wb", []> {
1175   let Inst{21} = 1; // overwrite
1176 }
1177
1178 def LDRSHT : AI3ldshpo<(outs GPR:$dst, GPR:$base_wb),
1179                  (ins GPR:$base,am3offset:$offset), LdMiscFrm, IIC_iLoadru,
1180                  "ldrsht", "\t$dst, [$base], $offset", "$base = $base_wb", []> {
1181   let Inst{21} = 1; // overwrite
1182 }
1183
1184 // Store
1185 def STR  : AI2stw<(outs), (ins GPR:$src, addrmode2:$addr), StFrm, IIC_iStorer,
1186                "str", "\t$src, $addr",
1187                [(store GPR:$src, addrmode2:$addr)]>;
1188
1189 // Stores with truncate
1190 def STRH : AI3sth<(outs), (ins GPR:$src, addrmode3:$addr), StMiscFrm,
1191                IIC_iStorer, "strh", "\t$src, $addr",
1192                [(truncstorei16 GPR:$src, addrmode3:$addr)]>;
1193
1194 def STRB : AI2stb<(outs), (ins GPR:$src, addrmode2:$addr), StFrm, IIC_iStorer,
1195                "strb", "\t$src, $addr",
1196                [(truncstorei8 GPR:$src, addrmode2:$addr)]>;
1197
1198 // Store doubleword
1199 let mayStore = 1, hasExtraSrcRegAllocReq = 1 in
1200 def STRD : AI3std<(outs), (ins GPR:$src1, GPR:$src2, addrmode3:$addr),
1201                StMiscFrm, IIC_iStorer,
1202                "strd", "\t$src1, $addr", []>, Requires<[IsARM, HasV5TE]>;
1203
1204 // Indexed stores
1205 def STR_PRE  : AI2stwpr<(outs GPR:$base_wb),
1206                      (ins GPR:$src, GPR:$base, am2offset:$offset),
1207                      StFrm, IIC_iStoreru,
1208                     "str", "\t$src, [$base, $offset]!", "$base = $base_wb",
1209                     [(set GPR:$base_wb,
1210                       (pre_store GPR:$src, GPR:$base, am2offset:$offset))]>;
1211
1212 def STR_POST : AI2stwpo<(outs GPR:$base_wb),
1213                      (ins GPR:$src, GPR:$base,am2offset:$offset),
1214                      StFrm, IIC_iStoreru,
1215                     "str", "\t$src, [$base], $offset", "$base = $base_wb",
1216                     [(set GPR:$base_wb,
1217                       (post_store GPR:$src, GPR:$base, am2offset:$offset))]>;
1218
1219 def STRH_PRE : AI3sthpr<(outs GPR:$base_wb),
1220                      (ins GPR:$src, GPR:$base,am3offset:$offset),
1221                      StMiscFrm, IIC_iStoreru,
1222                      "strh", "\t$src, [$base, $offset]!", "$base = $base_wb",
1223                     [(set GPR:$base_wb,
1224                       (pre_truncsti16 GPR:$src, GPR:$base,am3offset:$offset))]>;
1225
1226 def STRH_POST: AI3sthpo<(outs GPR:$base_wb),
1227                      (ins GPR:$src, GPR:$base,am3offset:$offset),
1228                      StMiscFrm, IIC_iStoreru,
1229                      "strh", "\t$src, [$base], $offset", "$base = $base_wb",
1230                     [(set GPR:$base_wb, (post_truncsti16 GPR:$src,
1231                                          GPR:$base, am3offset:$offset))]>;
1232
1233 def STRB_PRE : AI2stbpr<(outs GPR:$base_wb),
1234                      (ins GPR:$src, GPR:$base,am2offset:$offset),
1235                      StFrm, IIC_iStoreru,
1236                      "strb", "\t$src, [$base, $offset]!", "$base = $base_wb",
1237                     [(set GPR:$base_wb, (pre_truncsti8 GPR:$src,
1238                                          GPR:$base, am2offset:$offset))]>;
1239
1240 def STRB_POST: AI2stbpo<(outs GPR:$base_wb),
1241                      (ins GPR:$src, GPR:$base,am2offset:$offset),
1242                      StFrm, IIC_iStoreru,
1243                      "strb", "\t$src, [$base], $offset", "$base = $base_wb",
1244                     [(set GPR:$base_wb, (post_truncsti8 GPR:$src,
1245                                          GPR:$base, am2offset:$offset))]>;
1246
1247 // For disassembly only
1248 def STRD_PRE : AI3stdpr<(outs GPR:$base_wb),
1249                      (ins GPR:$src1, GPR:$src2, GPR:$base, am3offset:$offset),
1250                      StMiscFrm, IIC_iStoreru,
1251                      "strd", "\t$src1, $src2, [$base, $offset]!",
1252                      "$base = $base_wb", []>;
1253
1254 // For disassembly only
1255 def STRD_POST: AI3stdpo<(outs GPR:$base_wb),
1256                      (ins GPR:$src1, GPR:$src2, GPR:$base, am3offset:$offset),
1257                      StMiscFrm, IIC_iStoreru,
1258                      "strd", "\t$src1, $src2, [$base], $offset",
1259                      "$base = $base_wb", []>;
1260
1261 // STRT and STRBT are for disassembly only.
1262
1263 def STRT : AI2stwpo<(outs GPR:$base_wb),
1264                     (ins GPR:$src, GPR:$base,am2offset:$offset),
1265                     StFrm, IIC_iStoreru,
1266                     "strt", "\t$src, [$base], $offset", "$base = $base_wb",
1267                     [/* For disassembly only; pattern left blank */]> {
1268   let Inst{21} = 1; // overwrite
1269 }
1270
1271 def STRBT : AI2stbpo<(outs GPR:$base_wb),
1272                      (ins GPR:$src, GPR:$base,am2offset:$offset),
1273                      StFrm, IIC_iStoreru,
1274                      "strbt", "\t$src, [$base], $offset", "$base = $base_wb",
1275                      [/* For disassembly only; pattern left blank */]> {
1276   let Inst{21} = 1; // overwrite
1277 }
1278
1279 //===----------------------------------------------------------------------===//
1280 //  Load / store multiple Instructions.
1281 //
1282
1283 let mayLoad = 1, hasExtraDefRegAllocReq = 1 in
1284 def LDM : AXI4ld<(outs),
1285                (ins addrmode4:$addr, pred:$p, reglist:$wb, variable_ops),
1286                LdStMulFrm, IIC_iLoadm, "ldm${addr:submode}${p}\t$addr, $wb",
1287                []>;
1288
1289 let mayStore = 1, hasExtraSrcRegAllocReq = 1 in
1290 def STM : AXI4st<(outs),
1291                (ins addrmode4:$addr, pred:$p, reglist:$wb, variable_ops),
1292                LdStMulFrm, IIC_iStorem, "stm${addr:submode}${p}\t$addr, $wb",
1293                []>;
1294
1295 //===----------------------------------------------------------------------===//
1296 //  Move Instructions.
1297 //
1298
1299 let neverHasSideEffects = 1 in
1300 def MOVr : AsI1<0b1101, (outs GPR:$dst), (ins GPR:$src), DPFrm, IIC_iMOVr,
1301                 "mov", "\t$dst, $src", []>, UnaryDP {
1302   let Inst{11-4} = 0b00000000;
1303   let Inst{25} = 0;
1304 }
1305
1306 def MOVs : AsI1<0b1101, (outs GPR:$dst), (ins so_reg:$src),
1307                 DPSoRegFrm, IIC_iMOVsr,
1308                 "mov", "\t$dst, $src", [(set GPR:$dst, so_reg:$src)]>, UnaryDP {
1309   let Inst{25} = 0;
1310 }
1311
1312 let isReMaterializable = 1, isAsCheapAsAMove = 1 in
1313 def MOVi : AsI1<0b1101, (outs GPR:$dst), (ins so_imm:$src), DPFrm, IIC_iMOVi,
1314                 "mov", "\t$dst, $src", [(set GPR:$dst, so_imm:$src)]>, UnaryDP {
1315   let Inst{25} = 1;
1316 }
1317
1318 let isReMaterializable = 1, isAsCheapAsAMove = 1 in
1319 def MOVi16 : AI1<0b1000, (outs GPR:$dst), (ins i32imm:$src),
1320                  DPFrm, IIC_iMOVi,
1321                  "movw", "\t$dst, $src",
1322                  [(set GPR:$dst, imm0_65535:$src)]>,
1323                  Requires<[IsARM, HasV6T2]>, UnaryDP {
1324   let Inst{20} = 0;
1325   let Inst{25} = 1;
1326 }
1327
1328 let Constraints = "$src = $dst" in
1329 def MOVTi16 : AI1<0b1010, (outs GPR:$dst), (ins GPR:$src, i32imm:$imm),
1330                   DPFrm, IIC_iMOVi,
1331                   "movt", "\t$dst, $imm",
1332                   [(set GPR:$dst,
1333                         (or (and GPR:$src, 0xffff),
1334                             lo16AllZero:$imm))]>, UnaryDP,
1335                   Requires<[IsARM, HasV6T2]> {
1336   let Inst{20} = 0;
1337   let Inst{25} = 1;
1338 }
1339
1340 def : ARMPat<(or GPR:$src, 0xffff0000), (MOVTi16 GPR:$src, 0xffff)>,
1341       Requires<[IsARM, HasV6T2]>;
1342
1343 let Uses = [CPSR] in
1344 def MOVrx : AsI1<0b1101, (outs GPR:$dst), (ins GPR:$src), Pseudo, IIC_iMOVsi,
1345                  "mov", "\t$dst, $src, rrx",
1346                  [(set GPR:$dst, (ARMrrx GPR:$src))]>, UnaryDP;
1347
1348 // These aren't really mov instructions, but we have to define them this way
1349 // due to flag operands.
1350
1351 let Defs = [CPSR] in {
1352 def MOVsrl_flag : AI1<0b1101, (outs GPR:$dst), (ins GPR:$src), Pseudo,
1353                       IIC_iMOVsi, "movs", "\t$dst, $src, lsr #1",
1354                       [(set GPR:$dst, (ARMsrl_flag GPR:$src))]>, UnaryDP;
1355 def MOVsra_flag : AI1<0b1101, (outs GPR:$dst), (ins GPR:$src), Pseudo,
1356                       IIC_iMOVsi, "movs", "\t$dst, $src, asr #1",
1357                       [(set GPR:$dst, (ARMsra_flag GPR:$src))]>, UnaryDP;
1358 }
1359
1360 //===----------------------------------------------------------------------===//
1361 //  Extend Instructions.
1362 //
1363
1364 // Sign extenders
1365
1366 defm SXTB  : AI_unary_rrot<0b01101010,
1367                            "sxtb", UnOpFrag<(sext_inreg node:$Src, i8)>>;
1368 defm SXTH  : AI_unary_rrot<0b01101011,
1369                            "sxth", UnOpFrag<(sext_inreg node:$Src, i16)>>;
1370
1371 defm SXTAB : AI_bin_rrot<0b01101010,
1372                "sxtab", BinOpFrag<(add node:$LHS, (sext_inreg node:$RHS, i8))>>;
1373 defm SXTAH : AI_bin_rrot<0b01101011,
1374                "sxtah", BinOpFrag<(add node:$LHS, (sext_inreg node:$RHS,i16))>>;
1375
1376 // For disassembly only
1377 defm SXTB16  : AI_unary_rrot_np<0b01101000, "sxtb16">;
1378
1379 // For disassembly only
1380 defm SXTAB16 : AI_bin_rrot_np<0b01101000, "sxtab16">;
1381
1382 // Zero extenders
1383
1384 let AddedComplexity = 16 in {
1385 defm UXTB   : AI_unary_rrot<0b01101110,
1386                             "uxtb"  , UnOpFrag<(and node:$Src, 0x000000FF)>>;
1387 defm UXTH   : AI_unary_rrot<0b01101111,
1388                             "uxth"  , UnOpFrag<(and node:$Src, 0x0000FFFF)>>;
1389 defm UXTB16 : AI_unary_rrot<0b01101100,
1390                             "uxtb16", UnOpFrag<(and node:$Src, 0x00FF00FF)>>;
1391
1392 def : ARMV6Pat<(and (shl GPR:$Src, (i32 8)), 0xFF00FF),
1393                (UXTB16r_rot GPR:$Src, 24)>;
1394 def : ARMV6Pat<(and (srl GPR:$Src, (i32 8)), 0xFF00FF),
1395                (UXTB16r_rot GPR:$Src, 8)>;
1396
1397 defm UXTAB : AI_bin_rrot<0b01101110, "uxtab",
1398                         BinOpFrag<(add node:$LHS, (and node:$RHS, 0x00FF))>>;
1399 defm UXTAH : AI_bin_rrot<0b01101111, "uxtah",
1400                         BinOpFrag<(add node:$LHS, (and node:$RHS, 0xFFFF))>>;
1401 }
1402
1403 // This isn't safe in general, the add is two 16-bit units, not a 32-bit add.
1404 // For disassembly only
1405 defm UXTAB16 : AI_bin_rrot_np<0b01101100, "uxtab16">;
1406
1407
1408 def SBFX  : I<(outs GPR:$dst),
1409               (ins GPR:$src, imm0_31:$lsb, imm0_31:$width),
1410                AddrMode1, Size4Bytes, IndexModeNone, DPFrm, IIC_iALUi,
1411                "sbfx", "\t$dst, $src, $lsb, $width", "", []>,
1412                Requires<[IsARM, HasV6T2]> {
1413   let Inst{27-21} = 0b0111101;
1414   let Inst{6-4}   = 0b101;
1415 }
1416
1417 def UBFX  : I<(outs GPR:$dst),
1418               (ins GPR:$src, imm0_31:$lsb, imm0_31:$width),
1419                AddrMode1, Size4Bytes, IndexModeNone, DPFrm, IIC_iALUi,
1420                "ubfx", "\t$dst, $src, $lsb, $width", "", []>,
1421                Requires<[IsARM, HasV6T2]> {
1422   let Inst{27-21} = 0b0111111;
1423   let Inst{6-4}   = 0b101;
1424 }
1425
1426 //===----------------------------------------------------------------------===//
1427 //  Arithmetic Instructions.
1428 //
1429
1430 defm ADD  : AsI1_bin_irs<0b0100, "add",
1431                          BinOpFrag<(add  node:$LHS, node:$RHS)>, 1>;
1432 defm SUB  : AsI1_bin_irs<0b0010, "sub",
1433                          BinOpFrag<(sub  node:$LHS, node:$RHS)>>;
1434
1435 // ADD and SUB with 's' bit set.
1436 defm ADDS : AI1_bin_s_irs<0b0100, "adds",
1437                           BinOpFrag<(addc node:$LHS, node:$RHS)>, 1>;
1438 defm SUBS : AI1_bin_s_irs<0b0010, "subs",
1439                           BinOpFrag<(subc node:$LHS, node:$RHS)>>;
1440
1441 defm ADC : AI1_adde_sube_irs<0b0101, "adc",
1442                           BinOpFrag<(adde_dead_carry node:$LHS, node:$RHS)>, 1>;
1443 defm SBC : AI1_adde_sube_irs<0b0110, "sbc",
1444                           BinOpFrag<(sube_dead_carry node:$LHS, node:$RHS)>>;
1445 defm ADCS : AI1_adde_sube_s_irs<0b0101, "adcs",
1446                           BinOpFrag<(adde_live_carry node:$LHS, node:$RHS)>, 1>;
1447 defm SBCS : AI1_adde_sube_s_irs<0b0110, "sbcs",
1448                           BinOpFrag<(sube_live_carry node:$LHS, node:$RHS) >>;
1449
1450 // These don't define reg/reg forms, because they are handled above.
1451 def RSBri : AsI1<0b0011, (outs GPR:$dst), (ins GPR:$a, so_imm:$b), DPFrm,
1452                   IIC_iALUi, "rsb", "\t$dst, $a, $b",
1453                   [(set GPR:$dst, (sub so_imm:$b, GPR:$a))]> {
1454     let Inst{25} = 1;
1455 }
1456
1457 def RSBrs : AsI1<0b0011, (outs GPR:$dst), (ins GPR:$a, so_reg:$b), DPSoRegFrm,
1458                   IIC_iALUsr, "rsb", "\t$dst, $a, $b",
1459                   [(set GPR:$dst, (sub so_reg:$b, GPR:$a))]> {
1460     let Inst{25} = 0;
1461 }
1462
1463 // RSB with 's' bit set.
1464 let Defs = [CPSR] in {
1465 def RSBSri : AI1<0b0011, (outs GPR:$dst), (ins GPR:$a, so_imm:$b), DPFrm,
1466                  IIC_iALUi, "rsbs", "\t$dst, $a, $b",
1467                  [(set GPR:$dst, (subc so_imm:$b, GPR:$a))]> {
1468     let Inst{20} = 1;
1469     let Inst{25} = 1;
1470 }
1471 def RSBSrs : AI1<0b0011, (outs GPR:$dst), (ins GPR:$a, so_reg:$b), DPSoRegFrm,
1472                  IIC_iALUsr, "rsbs", "\t$dst, $a, $b",
1473                  [(set GPR:$dst, (subc so_reg:$b, GPR:$a))]> {
1474     let Inst{20} = 1;
1475     let Inst{25} = 0;
1476 }
1477 }
1478
1479 let Uses = [CPSR] in {
1480 def RSCri : AsI1<0b0111, (outs GPR:$dst), (ins GPR:$a, so_imm:$b),
1481                  DPFrm, IIC_iALUi, "rsc", "\t$dst, $a, $b",
1482                  [(set GPR:$dst, (sube_dead_carry so_imm:$b, GPR:$a))]>,
1483                  Requires<[IsARM]> {
1484     let Inst{25} = 1;
1485 }
1486 def RSCrs : AsI1<0b0111, (outs GPR:$dst), (ins GPR:$a, so_reg:$b),
1487                  DPSoRegFrm, IIC_iALUsr, "rsc", "\t$dst, $a, $b",
1488                  [(set GPR:$dst, (sube_dead_carry so_reg:$b, GPR:$a))]>,
1489                  Requires<[IsARM]> {
1490     let Inst{25} = 0;
1491 }
1492 }
1493
1494 // FIXME: Allow these to be predicated.
1495 let Defs = [CPSR], Uses = [CPSR] in {
1496 def RSCSri : AXI1<0b0111, (outs GPR:$dst), (ins GPR:$a, so_imm:$b),
1497                   DPFrm, IIC_iALUi, "rscs\t$dst, $a, $b",
1498                   [(set GPR:$dst, (sube_dead_carry so_imm:$b, GPR:$a))]>,
1499                   Requires<[IsARM]> {
1500     let Inst{20} = 1;
1501     let Inst{25} = 1;
1502 }
1503 def RSCSrs : AXI1<0b0111, (outs GPR:$dst), (ins GPR:$a, so_reg:$b),
1504                   DPSoRegFrm, IIC_iALUsr, "rscs\t$dst, $a, $b",
1505                   [(set GPR:$dst, (sube_dead_carry so_reg:$b, GPR:$a))]>,
1506                   Requires<[IsARM]> {
1507     let Inst{20} = 1;
1508     let Inst{25} = 0;
1509 }
1510 }
1511
1512 // (sub X, imm) gets canonicalized to (add X, -imm).  Match this form.
1513 def : ARMPat<(add    GPR:$src, so_imm_neg:$imm),
1514              (SUBri  GPR:$src, so_imm_neg:$imm)>;
1515
1516 //def : ARMPat<(addc   GPR:$src, so_imm_neg:$imm),
1517 //             (SUBSri GPR:$src, so_imm_neg:$imm)>;
1518 //def : ARMPat<(adde   GPR:$src, so_imm_neg:$imm),
1519 //             (SBCri  GPR:$src, so_imm_neg:$imm)>;
1520
1521 // Note: These are implemented in C++ code, because they have to generate
1522 // ADD/SUBrs instructions, which use a complex pattern that a xform function
1523 // cannot produce.
1524 // (mul X, 2^n+1) -> (add (X << n), X)
1525 // (mul X, 2^n-1) -> (rsb X, (X << n))
1526
1527 // ARM Arithmetic Instruction -- for disassembly only
1528 // GPR:$dst = GPR:$a op GPR:$b
1529 class AAI<bits<8> op27_20, bits<4> op7_4, string opc>
1530   : AI<(outs GPR:$dst), (ins GPR:$a, GPR:$b), DPFrm, IIC_iALUr,
1531        opc, "\t$dst, $a, $b",
1532        [/* For disassembly only; pattern left blank */]> {
1533   let Inst{27-20} = op27_20;
1534   let Inst{7-4} = op7_4;
1535 }
1536
1537 // Saturating add/subtract -- for disassembly only
1538
1539 def QADD    : AAI<0b00010000, 0b0101, "qadd">;
1540 def QADD16  : AAI<0b01100010, 0b0001, "qadd16">;
1541 def QADD8   : AAI<0b01100010, 0b1001, "qadd8">;
1542 def QASX    : AAI<0b01100010, 0b0011, "qasx">;
1543 def QDADD   : AAI<0b00010100, 0b0101, "qdadd">;
1544 def QDSUB   : AAI<0b00010110, 0b0101, "qdsub">;
1545 def QSAX    : AAI<0b01100010, 0b0101, "qsax">;
1546 def QSUB    : AAI<0b00010010, 0b0101, "qsub">;
1547 def QSUB16  : AAI<0b01100010, 0b0111, "qsub16">;
1548 def QSUB8   : AAI<0b01100010, 0b1111, "qsub8">;
1549 def UQADD16 : AAI<0b01100110, 0b0001, "uqadd16">;
1550 def UQADD8  : AAI<0b01100110, 0b1001, "uqadd8">;
1551 def UQASX   : AAI<0b01100110, 0b0011, "uqasx">;
1552 def UQSAX   : AAI<0b01100110, 0b0101, "uqsax">;
1553 def UQSUB16 : AAI<0b01100110, 0b0111, "uqsub16">;
1554 def UQSUB8  : AAI<0b01100110, 0b1111, "uqsub8">;
1555
1556 // Signed/Unsigned add/subtract -- for disassembly only
1557
1558 def SASX   : AAI<0b01100001, 0b0011, "sasx">;
1559 def SADD16 : AAI<0b01100001, 0b0001, "sadd16">;
1560 def SADD8  : AAI<0b01100001, 0b1001, "sadd8">;
1561 def SSAX   : AAI<0b01100001, 0b0101, "ssax">;
1562 def SSUB16 : AAI<0b01100001, 0b0111, "ssub16">;
1563 def SSUB8  : AAI<0b01100001, 0b1111, "ssub8">;
1564 def UASX   : AAI<0b01100101, 0b0011, "uasx">;
1565 def UADD16 : AAI<0b01100101, 0b0001, "uadd16">;
1566 def UADD8  : AAI<0b01100101, 0b1001, "uadd8">;
1567 def USAX   : AAI<0b01100101, 0b0101, "usax">;
1568 def USUB16 : AAI<0b01100101, 0b0111, "usub16">;
1569 def USUB8  : AAI<0b01100101, 0b1111, "usub8">;
1570
1571 // Signed/Unsigned halving add/subtract -- for disassembly only
1572
1573 def SHASX   : AAI<0b01100011, 0b0011, "shasx">;
1574 def SHADD16 : AAI<0b01100011, 0b0001, "shadd16">;
1575 def SHADD8  : AAI<0b01100011, 0b1001, "shadd8">;
1576 def SHSAX   : AAI<0b01100011, 0b0101, "shsax">;
1577 def SHSUB16 : AAI<0b01100011, 0b0111, "shsub16">;
1578 def SHSUB8  : AAI<0b01100011, 0b1111, "shsub8">;
1579 def UHASX   : AAI<0b01100111, 0b0011, "uhasx">;
1580 def UHADD16 : AAI<0b01100111, 0b0001, "uhadd16">;
1581 def UHADD8  : AAI<0b01100111, 0b1001, "uhadd8">;
1582 def UHSAX   : AAI<0b01100111, 0b0101, "uhsax">;
1583 def UHSUB16 : AAI<0b01100111, 0b0111, "uhsub16">;
1584 def UHSUB8  : AAI<0b01100111, 0b1111, "uhsub8">;
1585
1586 // Unsigned Sum of Absolute Difference [and Accumulate] -- for disassembly only
1587
1588 def USAD8  : AI<(outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$acc),
1589                 MulFrm /* for convenience */, NoItinerary, "usad8",
1590                 "\t$dst, $a, $b", []>,
1591              Requires<[IsARM, HasV6]> {
1592   let Inst{27-20} = 0b01111000;
1593   let Inst{15-12} = 0b1111;
1594   let Inst{7-4} = 0b0001;
1595 }
1596 def USADA8 : AI<(outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$acc),
1597                 MulFrm /* for convenience */, NoItinerary, "usada8",
1598                 "\t$dst, $a, $b, $acc", []>,
1599              Requires<[IsARM, HasV6]> {
1600   let Inst{27-20} = 0b01111000;
1601   let Inst{7-4} = 0b0001;
1602 }
1603
1604 // Signed/Unsigned saturate -- for disassembly only
1605
1606 def SSATlsl : AI<(outs GPR:$dst), (ins i32imm:$bit_pos, GPR:$a, i32imm:$shamt),
1607                  DPFrm, NoItinerary, "ssat", "\t$dst, $bit_pos, $a, LSL $shamt",
1608                  [/* For disassembly only; pattern left blank */]> {
1609   let Inst{27-21} = 0b0110101;
1610   let Inst{6-4} = 0b001;
1611 }
1612
1613 def SSATasr : AI<(outs GPR:$dst), (ins i32imm:$bit_pos, GPR:$a, i32imm:$shamt),
1614                  DPFrm, NoItinerary, "ssat", "\t$dst, $bit_pos, $a, ASR $shamt",
1615                  [/* For disassembly only; pattern left blank */]> {
1616   let Inst{27-21} = 0b0110101;
1617   let Inst{6-4} = 0b101;
1618 }
1619
1620 def SSAT16 : AI<(outs GPR:$dst), (ins i32imm:$bit_pos, GPR:$a), DPFrm,
1621                 NoItinerary, "ssat16", "\t$dst, $bit_pos, $a",
1622                 [/* For disassembly only; pattern left blank */]> {
1623   let Inst{27-20} = 0b01101010;
1624   let Inst{7-4} = 0b0011;
1625 }
1626
1627 def USATlsl : AI<(outs GPR:$dst), (ins i32imm:$bit_pos, GPR:$a, i32imm:$shamt),
1628                  DPFrm, NoItinerary, "usat", "\t$dst, $bit_pos, $a, LSL $shamt",
1629                  [/* For disassembly only; pattern left blank */]> {
1630   let Inst{27-21} = 0b0110111;
1631   let Inst{6-4} = 0b001;
1632 }
1633
1634 def USATasr : AI<(outs GPR:$dst), (ins i32imm:$bit_pos, GPR:$a, i32imm:$shamt),
1635                  DPFrm, NoItinerary, "usat", "\t$dst, $bit_pos, $a, ASR $shamt",
1636                  [/* For disassembly only; pattern left blank */]> {
1637   let Inst{27-21} = 0b0110111;
1638   let Inst{6-4} = 0b101;
1639 }
1640
1641 def USAT16 : AI<(outs GPR:$dst), (ins i32imm:$bit_pos, GPR:$a), DPFrm,
1642                 NoItinerary, "usat16", "\t$dst, $bit_pos, $a",
1643                 [/* For disassembly only; pattern left blank */]> {
1644   let Inst{27-20} = 0b01101110;
1645   let Inst{7-4} = 0b0011;
1646 }
1647
1648 //===----------------------------------------------------------------------===//
1649 //  Bitwise Instructions.
1650 //
1651
1652 defm AND   : AsI1_bin_irs<0b0000, "and",
1653                           BinOpFrag<(and node:$LHS, node:$RHS)>, 1>;
1654 defm ORR   : AsI1_bin_irs<0b1100, "orr",
1655                           BinOpFrag<(or  node:$LHS, node:$RHS)>, 1>;
1656 defm EOR   : AsI1_bin_irs<0b0001, "eor",
1657                           BinOpFrag<(xor node:$LHS, node:$RHS)>, 1>;
1658 defm BIC   : AsI1_bin_irs<0b1110, "bic",
1659                           BinOpFrag<(and node:$LHS, (not node:$RHS))>>;
1660
1661 def BFC    : I<(outs GPR:$dst), (ins GPR:$src, bf_inv_mask_imm:$imm),
1662                AddrMode1, Size4Bytes, IndexModeNone, DPFrm, IIC_iUNAsi,
1663                "bfc", "\t$dst, $imm", "$src = $dst",
1664                [(set GPR:$dst, (and GPR:$src, bf_inv_mask_imm:$imm))]>,
1665                Requires<[IsARM, HasV6T2]> {
1666   let Inst{27-21} = 0b0111110;
1667   let Inst{6-0}   = 0b0011111;
1668 }
1669
1670 // A8.6.18  BFI - Bitfield insert (Encoding A1)
1671 // Added for disassembler with the pattern field purposely left blank.
1672 def BFI    : I<(outs GPR:$dst), (ins GPR:$src, bf_inv_mask_imm:$imm),
1673                AddrMode1, Size4Bytes, IndexModeNone, DPFrm, IIC_iUNAsi,
1674                "bfi", "\t$dst, $src, $imm", "",
1675                [/* For disassembly only; pattern left blank */]>,
1676                Requires<[IsARM, HasV6T2]> {
1677   let Inst{27-21} = 0b0111110;
1678   let Inst{6-4}   = 0b001; // Rn: Inst{3-0} != 15
1679 }
1680
1681 def  MVNr  : AsI1<0b1111, (outs GPR:$dst), (ins GPR:$src), DPFrm, IIC_iMOVr,
1682                   "mvn", "\t$dst, $src",
1683                   [(set GPR:$dst, (not GPR:$src))]>, UnaryDP {
1684   let Inst{25} = 0;
1685   let Inst{11-4} = 0b00000000;
1686 }
1687 def  MVNs  : AsI1<0b1111, (outs GPR:$dst), (ins so_reg:$src), DPSoRegFrm,
1688                   IIC_iMOVsr, "mvn", "\t$dst, $src",
1689                   [(set GPR:$dst, (not so_reg:$src))]>, UnaryDP {
1690   let Inst{25} = 0;
1691 }
1692 let isReMaterializable = 1, isAsCheapAsAMove = 1 in
1693 def  MVNi  : AsI1<0b1111, (outs GPR:$dst), (ins so_imm:$imm), DPFrm,
1694                   IIC_iMOVi, "mvn", "\t$dst, $imm",
1695                   [(set GPR:$dst, so_imm_not:$imm)]>,UnaryDP {
1696     let Inst{25} = 1;
1697 }
1698
1699 def : ARMPat<(and   GPR:$src, so_imm_not:$imm),
1700              (BICri GPR:$src, so_imm_not:$imm)>;
1701
1702 //===----------------------------------------------------------------------===//
1703 //  Multiply Instructions.
1704 //
1705
1706 let isCommutable = 1 in
1707 def MUL   : AsMul1I<0b0000000, (outs GPR:$dst), (ins GPR:$a, GPR:$b),
1708                    IIC_iMUL32, "mul", "\t$dst, $a, $b",
1709                    [(set GPR:$dst, (mul GPR:$a, GPR:$b))]>;
1710
1711 def MLA   : AsMul1I<0b0000001, (outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$c),
1712                     IIC_iMAC32, "mla", "\t$dst, $a, $b, $c",
1713                    [(set GPR:$dst, (add (mul GPR:$a, GPR:$b), GPR:$c))]>;
1714
1715 def MLS   : AMul1I<0b0000011, (outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$c),
1716                    IIC_iMAC32, "mls", "\t$dst, $a, $b, $c",
1717                    [(set GPR:$dst, (sub GPR:$c, (mul GPR:$a, GPR:$b)))]>,
1718                    Requires<[IsARM, HasV6T2]>;
1719
1720 // Extra precision multiplies with low / high results
1721 let neverHasSideEffects = 1 in {
1722 let isCommutable = 1 in {
1723 def SMULL : AsMul1I<0b0000110, (outs GPR:$ldst, GPR:$hdst),
1724                                (ins GPR:$a, GPR:$b), IIC_iMUL64,
1725                     "smull", "\t$ldst, $hdst, $a, $b", []>;
1726
1727 def UMULL : AsMul1I<0b0000100, (outs GPR:$ldst, GPR:$hdst),
1728                                (ins GPR:$a, GPR:$b), IIC_iMUL64,
1729                     "umull", "\t$ldst, $hdst, $a, $b", []>;
1730 }
1731
1732 // Multiply + accumulate
1733 def SMLAL : AsMul1I<0b0000111, (outs GPR:$ldst, GPR:$hdst),
1734                                (ins GPR:$a, GPR:$b), IIC_iMAC64,
1735                     "smlal", "\t$ldst, $hdst, $a, $b", []>;
1736
1737 def UMLAL : AsMul1I<0b0000101, (outs GPR:$ldst, GPR:$hdst),
1738                                (ins GPR:$a, GPR:$b), IIC_iMAC64,
1739                     "umlal", "\t$ldst, $hdst, $a, $b", []>;
1740
1741 def UMAAL : AMul1I <0b0000010, (outs GPR:$ldst, GPR:$hdst),
1742                                (ins GPR:$a, GPR:$b), IIC_iMAC64,
1743                     "umaal", "\t$ldst, $hdst, $a, $b", []>,
1744                     Requires<[IsARM, HasV6]>;
1745 } // neverHasSideEffects
1746
1747 // Most significant word multiply
1748 def SMMUL : AMul2I <0b0111010, (outs GPR:$dst), (ins GPR:$a, GPR:$b),
1749                IIC_iMUL32, "smmul", "\t$dst, $a, $b",
1750                [(set GPR:$dst, (mulhs GPR:$a, GPR:$b))]>,
1751             Requires<[IsARM, HasV6]> {
1752   let Inst{7-4}   = 0b0001;
1753   let Inst{15-12} = 0b1111;
1754 }
1755
1756 def SMMULR : AMul2I <0b0111010, (outs GPR:$dst), (ins GPR:$a, GPR:$b),
1757                IIC_iMUL32, "smmulr", "\t$dst, $a, $b",
1758                [/* For disassembly only; pattern left blank */]>,
1759             Requires<[IsARM, HasV6]> {
1760   let Inst{7-4}   = 0b0011; // R = 1
1761   let Inst{15-12} = 0b1111;
1762 }
1763
1764 def SMMLA : AMul2I <0b0111010, (outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$c),
1765                IIC_iMAC32, "smmla", "\t$dst, $a, $b, $c",
1766                [(set GPR:$dst, (add (mulhs GPR:$a, GPR:$b), GPR:$c))]>,
1767             Requires<[IsARM, HasV6]> {
1768   let Inst{7-4}   = 0b0001;
1769 }
1770
1771 def SMMLAR : AMul2I <0b0111010, (outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$c),
1772                IIC_iMAC32, "smmlar", "\t$dst, $a, $b, $c",
1773                [/* For disassembly only; pattern left blank */]>,
1774             Requires<[IsARM, HasV6]> {
1775   let Inst{7-4}   = 0b0011; // R = 1
1776 }
1777
1778 def SMMLS : AMul2I <0b0111010, (outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$c),
1779                IIC_iMAC32, "smmls", "\t$dst, $a, $b, $c",
1780                [(set GPR:$dst, (sub GPR:$c, (mulhs GPR:$a, GPR:$b)))]>,
1781             Requires<[IsARM, HasV6]> {
1782   let Inst{7-4}   = 0b1101;
1783 }
1784
1785 def SMMLSR : AMul2I <0b0111010, (outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$c),
1786                IIC_iMAC32, "smmlsr", "\t$dst, $a, $b, $c",
1787                [/* For disassembly only; pattern left blank */]>,
1788             Requires<[IsARM, HasV6]> {
1789   let Inst{7-4}   = 0b1111; // R = 1
1790 }
1791
1792 multiclass AI_smul<string opc, PatFrag opnode> {
1793   def BB : AMulxyI<0b0001011, (outs GPR:$dst), (ins GPR:$a, GPR:$b),
1794               IIC_iMUL32, !strconcat(opc, "bb"), "\t$dst, $a, $b",
1795               [(set GPR:$dst, (opnode (sext_inreg GPR:$a, i16),
1796                                       (sext_inreg GPR:$b, i16)))]>,
1797            Requires<[IsARM, HasV5TE]> {
1798              let Inst{5} = 0;
1799              let Inst{6} = 0;
1800            }
1801
1802   def BT : AMulxyI<0b0001011, (outs GPR:$dst), (ins GPR:$a, GPR:$b),
1803               IIC_iMUL32, !strconcat(opc, "bt"), "\t$dst, $a, $b",
1804               [(set GPR:$dst, (opnode (sext_inreg GPR:$a, i16),
1805                                       (sra GPR:$b, (i32 16))))]>,
1806            Requires<[IsARM, HasV5TE]> {
1807              let Inst{5} = 0;
1808              let Inst{6} = 1;
1809            }
1810
1811   def TB : AMulxyI<0b0001011, (outs GPR:$dst), (ins GPR:$a, GPR:$b),
1812               IIC_iMUL32, !strconcat(opc, "tb"), "\t$dst, $a, $b",
1813               [(set GPR:$dst, (opnode (sra GPR:$a, (i32 16)),
1814                                       (sext_inreg GPR:$b, i16)))]>,
1815            Requires<[IsARM, HasV5TE]> {
1816              let Inst{5} = 1;
1817              let Inst{6} = 0;
1818            }
1819
1820   def TT : AMulxyI<0b0001011, (outs GPR:$dst), (ins GPR:$a, GPR:$b),
1821               IIC_iMUL32, !strconcat(opc, "tt"), "\t$dst, $a, $b",
1822               [(set GPR:$dst, (opnode (sra GPR:$a, (i32 16)),
1823                                       (sra GPR:$b, (i32 16))))]>,
1824             Requires<[IsARM, HasV5TE]> {
1825              let Inst{5} = 1;
1826              let Inst{6} = 1;
1827            }
1828
1829   def WB : AMulxyI<0b0001001, (outs GPR:$dst), (ins GPR:$a, GPR:$b),
1830               IIC_iMUL16, !strconcat(opc, "wb"), "\t$dst, $a, $b",
1831               [(set GPR:$dst, (sra (opnode GPR:$a,
1832                                     (sext_inreg GPR:$b, i16)), (i32 16)))]>,
1833            Requires<[IsARM, HasV5TE]> {
1834              let Inst{5} = 1;
1835              let Inst{6} = 0;
1836            }
1837
1838   def WT : AMulxyI<0b0001001, (outs GPR:$dst), (ins GPR:$a, GPR:$b),
1839               IIC_iMUL16, !strconcat(opc, "wt"), "\t$dst, $a, $b",
1840               [(set GPR:$dst, (sra (opnode GPR:$a,
1841                                     (sra GPR:$b, (i32 16))), (i32 16)))]>,
1842             Requires<[IsARM, HasV5TE]> {
1843              let Inst{5} = 1;
1844              let Inst{6} = 1;
1845            }
1846 }
1847
1848
1849 multiclass AI_smla<string opc, PatFrag opnode> {
1850   def BB : AMulxyI<0b0001000, (outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$acc),
1851               IIC_iMAC16, !strconcat(opc, "bb"), "\t$dst, $a, $b, $acc",
1852               [(set GPR:$dst, (add GPR:$acc,
1853                                (opnode (sext_inreg GPR:$a, i16),
1854                                        (sext_inreg GPR:$b, i16))))]>,
1855            Requires<[IsARM, HasV5TE]> {
1856              let Inst{5} = 0;
1857              let Inst{6} = 0;
1858            }
1859
1860   def BT : AMulxyI<0b0001000, (outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$acc),
1861               IIC_iMAC16, !strconcat(opc, "bt"), "\t$dst, $a, $b, $acc",
1862               [(set GPR:$dst, (add GPR:$acc, (opnode (sext_inreg GPR:$a, i16),
1863                                                     (sra GPR:$b, (i32 16)))))]>,
1864            Requires<[IsARM, HasV5TE]> {
1865              let Inst{5} = 0;
1866              let Inst{6} = 1;
1867            }
1868
1869   def TB : AMulxyI<0b0001000, (outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$acc),
1870               IIC_iMAC16, !strconcat(opc, "tb"), "\t$dst, $a, $b, $acc",
1871               [(set GPR:$dst, (add GPR:$acc, (opnode (sra GPR:$a, (i32 16)),
1872                                                  (sext_inreg GPR:$b, i16))))]>,
1873            Requires<[IsARM, HasV5TE]> {
1874              let Inst{5} = 1;
1875              let Inst{6} = 0;
1876            }
1877
1878   def TT : AMulxyI<0b0001000, (outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$acc),
1879               IIC_iMAC16, !strconcat(opc, "tt"), "\t$dst, $a, $b, $acc",
1880              [(set GPR:$dst, (add GPR:$acc, (opnode (sra GPR:$a, (i32 16)),
1881                                                     (sra GPR:$b, (i32 16)))))]>,
1882             Requires<[IsARM, HasV5TE]> {
1883              let Inst{5} = 1;
1884              let Inst{6} = 1;
1885            }
1886
1887   def WB : AMulxyI<0b0001001, (outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$acc),
1888               IIC_iMAC16, !strconcat(opc, "wb"), "\t$dst, $a, $b, $acc",
1889               [(set GPR:$dst, (add GPR:$acc, (sra (opnode GPR:$a,
1890                                        (sext_inreg GPR:$b, i16)), (i32 16))))]>,
1891            Requires<[IsARM, HasV5TE]> {
1892              let Inst{5} = 0;
1893              let Inst{6} = 0;
1894            }
1895
1896   def WT : AMulxyI<0b0001001, (outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$acc),
1897               IIC_iMAC16, !strconcat(opc, "wt"), "\t$dst, $a, $b, $acc",
1898               [(set GPR:$dst, (add GPR:$acc, (sra (opnode GPR:$a,
1899                                          (sra GPR:$b, (i32 16))), (i32 16))))]>,
1900             Requires<[IsARM, HasV5TE]> {
1901              let Inst{5} = 0;
1902              let Inst{6} = 1;
1903            }
1904 }
1905
1906 defm SMUL : AI_smul<"smul", BinOpFrag<(mul node:$LHS, node:$RHS)>>;
1907 defm SMLA : AI_smla<"smla", BinOpFrag<(mul node:$LHS, node:$RHS)>>;
1908
1909 // Halfword multiply accumulate long: SMLAL<x><y> -- for disassembly only
1910 def SMLALBB : AMulxyI<0b0001010,(outs GPR:$ldst,GPR:$hdst),(ins GPR:$a,GPR:$b),
1911                       IIC_iMAC64, "smlalbb", "\t$ldst, $hdst, $a, $b",
1912                       [/* For disassembly only; pattern left blank */]>,
1913               Requires<[IsARM, HasV5TE]> {
1914   let Inst{5} = 0;
1915   let Inst{6} = 0;
1916 }
1917
1918 def SMLALBT : AMulxyI<0b0001010,(outs GPR:$ldst,GPR:$hdst),(ins GPR:$a,GPR:$b),
1919                       IIC_iMAC64, "smlalbt", "\t$ldst, $hdst, $a, $b",
1920                       [/* For disassembly only; pattern left blank */]>,
1921               Requires<[IsARM, HasV5TE]> {
1922   let Inst{5} = 0;
1923   let Inst{6} = 1;
1924 }
1925
1926 def SMLALTB : AMulxyI<0b0001010,(outs GPR:$ldst,GPR:$hdst),(ins GPR:$a,GPR:$b),
1927                       IIC_iMAC64, "smlaltb", "\t$ldst, $hdst, $a, $b",
1928                       [/* For disassembly only; pattern left blank */]>,
1929               Requires<[IsARM, HasV5TE]> {
1930   let Inst{5} = 1;
1931   let Inst{6} = 0;
1932 }
1933
1934 def SMLALTT : AMulxyI<0b0001010,(outs GPR:$ldst,GPR:$hdst),(ins GPR:$a,GPR:$b),
1935                       IIC_iMAC64, "smlaltt", "\t$ldst, $hdst, $a, $b",
1936                       [/* For disassembly only; pattern left blank */]>,
1937               Requires<[IsARM, HasV5TE]> {
1938   let Inst{5} = 1;
1939   let Inst{6} = 1;
1940 }
1941
1942 // Helper class for AI_smld -- for disassembly only
1943 class AMulDualI<bit long, bit sub, bit swap, dag oops, dag iops,
1944                 InstrItinClass itin, string opc, string asm>
1945   : AI<oops, iops, MulFrm, itin, opc, asm, []>, Requires<[IsARM, HasV6]> {
1946   let Inst{4}     = 1;
1947   let Inst{5}     = swap;
1948   let Inst{6}     = sub;
1949   let Inst{7}     = 0;
1950   let Inst{21-20} = 0b00;
1951   let Inst{22}    = long;
1952   let Inst{27-23} = 0b01110;
1953 }
1954
1955 multiclass AI_smld<bit sub, string opc> {
1956
1957   def D : AMulDualI<0, sub, 0, (outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$acc),
1958                   NoItinerary, !strconcat(opc, "d"), "\t$dst, $a, $b, $acc">;
1959
1960   def DX : AMulDualI<0, sub, 1, (outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$acc),
1961                   NoItinerary, !strconcat(opc, "dx"), "\t$dst, $a, $b, $acc">;
1962
1963   def LD : AMulDualI<1, sub, 0, (outs GPR:$ldst,GPR:$hdst), (ins GPR:$a,GPR:$b),
1964                   NoItinerary, !strconcat(opc, "ld"), "\t$ldst, $hdst, $a, $b">;
1965
1966   def LDX : AMulDualI<1, sub, 1, (outs GPR:$ldst,GPR:$hdst),(ins GPR:$a,GPR:$b),
1967                   NoItinerary, !strconcat(opc, "ldx"),"\t$ldst, $hdst, $a, $b">;
1968
1969 }
1970
1971 defm SMLA : AI_smld<0, "smla">;
1972 defm SMLS : AI_smld<1, "smls">;
1973
1974 multiclass AI_sdml<bit sub, string opc> {
1975
1976   def D : AMulDualI<0, sub, 0, (outs GPR:$dst), (ins GPR:$a, GPR:$b),
1977                     NoItinerary, !strconcat(opc, "d"), "\t$dst, $a, $b"> {
1978     let Inst{15-12} = 0b1111;
1979   }
1980
1981   def DX : AMulDualI<0, sub, 1, (outs GPR:$dst), (ins GPR:$a, GPR:$b),
1982                     NoItinerary, !strconcat(opc, "dx"), "\t$dst, $a, $b"> {
1983     let Inst{15-12} = 0b1111;
1984   }
1985
1986 }
1987
1988 defm SMUA : AI_sdml<0, "smua">;
1989 defm SMUS : AI_sdml<1, "smus">;
1990
1991 //===----------------------------------------------------------------------===//
1992 //  Misc. Arithmetic Instructions.
1993 //
1994
1995 def CLZ  : AMiscA1I<0b000010110, (outs GPR:$dst), (ins GPR:$src), IIC_iUNAr,
1996               "clz", "\t$dst, $src",
1997               [(set GPR:$dst, (ctlz GPR:$src))]>, Requires<[IsARM, HasV5T]> {
1998   let Inst{7-4}   = 0b0001;
1999   let Inst{11-8}  = 0b1111;
2000   let Inst{19-16} = 0b1111;
2001 }
2002
2003 def RBIT : AMiscA1I<0b01101111, (outs GPR:$dst), (ins GPR:$src), IIC_iUNAr,
2004               "rbit", "\t$dst, $src",
2005               [(set GPR:$dst, (ARMrbit GPR:$src))]>,
2006            Requires<[IsARM, HasV6T2]> {
2007   let Inst{7-4}   = 0b0011;
2008   let Inst{11-8}  = 0b1111;
2009   let Inst{19-16} = 0b1111;
2010 }
2011
2012 def REV  : AMiscA1I<0b01101011, (outs GPR:$dst), (ins GPR:$src), IIC_iUNAr,
2013               "rev", "\t$dst, $src",
2014               [(set GPR:$dst, (bswap GPR:$src))]>, Requires<[IsARM, HasV6]> {
2015   let Inst{7-4}   = 0b0011;
2016   let Inst{11-8}  = 0b1111;
2017   let Inst{19-16} = 0b1111;
2018 }
2019
2020 def REV16 : AMiscA1I<0b01101011, (outs GPR:$dst), (ins GPR:$src), IIC_iUNAr,
2021                "rev16", "\t$dst, $src",
2022                [(set GPR:$dst,
2023                    (or (and (srl GPR:$src, (i32 8)), 0xFF),
2024                        (or (and (shl GPR:$src, (i32 8)), 0xFF00),
2025                            (or (and (srl GPR:$src, (i32 8)), 0xFF0000),
2026                                (and (shl GPR:$src, (i32 8)), 0xFF000000)))))]>,
2027                Requires<[IsARM, HasV6]> {
2028   let Inst{7-4}   = 0b1011;
2029   let Inst{11-8}  = 0b1111;
2030   let Inst{19-16} = 0b1111;
2031 }
2032
2033 def REVSH : AMiscA1I<0b01101111, (outs GPR:$dst), (ins GPR:$src), IIC_iUNAr,
2034                "revsh", "\t$dst, $src",
2035                [(set GPR:$dst,
2036                   (sext_inreg
2037                     (or (srl (and GPR:$src, 0xFF00), (i32 8)),
2038                         (shl GPR:$src, (i32 8))), i16))]>,
2039                Requires<[IsARM, HasV6]> {
2040   let Inst{7-4}   = 0b1011;
2041   let Inst{11-8}  = 0b1111;
2042   let Inst{19-16} = 0b1111;
2043 }
2044
2045 def PKHBT : AMiscA1I<0b01101000, (outs GPR:$dst),
2046                                  (ins GPR:$src1, GPR:$src2, i32imm:$shamt),
2047                IIC_iALUsi, "pkhbt", "\t$dst, $src1, $src2, LSL $shamt",
2048                [(set GPR:$dst, (or (and GPR:$src1, 0xFFFF),
2049                                    (and (shl GPR:$src2, (i32 imm:$shamt)),
2050                                         0xFFFF0000)))]>,
2051                Requires<[IsARM, HasV6]> {
2052   let Inst{6-4} = 0b001;
2053 }
2054
2055 // Alternate cases for PKHBT where identities eliminate some nodes.
2056 def : ARMV6Pat<(or (and GPR:$src1, 0xFFFF), (and GPR:$src2, 0xFFFF0000)),
2057                (PKHBT GPR:$src1, GPR:$src2, 0)>;
2058 def : ARMV6Pat<(or (and GPR:$src1, 0xFFFF), (shl GPR:$src2, imm16_31:$shamt)),
2059                (PKHBT GPR:$src1, GPR:$src2, imm16_31:$shamt)>;
2060
2061
2062 def PKHTB : AMiscA1I<0b01101000, (outs GPR:$dst),
2063                                  (ins GPR:$src1, GPR:$src2, i32imm:$shamt),
2064                IIC_iALUsi, "pkhtb", "\t$dst, $src1, $src2, ASR $shamt",
2065                [(set GPR:$dst, (or (and GPR:$src1, 0xFFFF0000),
2066                                    (and (sra GPR:$src2, imm16_31:$shamt),
2067                                         0xFFFF)))]>, Requires<[IsARM, HasV6]> {
2068   let Inst{6-4} = 0b101;
2069 }
2070
2071 // Alternate cases for PKHTB where identities eliminate some nodes.  Note that
2072 // a shift amount of 0 is *not legal* here, it is PKHBT instead.
2073 def : ARMV6Pat<(or (and GPR:$src1, 0xFFFF0000), (srl GPR:$src2, (i32 16))),
2074                (PKHTB GPR:$src1, GPR:$src2, 16)>;
2075 def : ARMV6Pat<(or (and GPR:$src1, 0xFFFF0000),
2076                    (and (srl GPR:$src2, imm1_15:$shamt), 0xFFFF)),
2077                (PKHTB GPR:$src1, GPR:$src2, imm1_15:$shamt)>;
2078
2079 //===----------------------------------------------------------------------===//
2080 //  Comparison Instructions...
2081 //
2082
2083 defm CMP  : AI1_cmp_irs<0b1010, "cmp",
2084                         BinOpFrag<(ARMcmp node:$LHS, node:$RHS)>>;
2085 //FIXME: Disable CMN, as CCodes are backwards from compare expectations
2086 //       Compare-to-zero still works out, just not the relationals
2087 //defm CMN  : AI1_cmp_irs<0b1011, "cmn",
2088 //                        BinOpFrag<(ARMcmp node:$LHS,(ineg node:$RHS))>>;
2089
2090 // Note that TST/TEQ don't set all the same flags that CMP does!
2091 defm TST  : AI1_cmp_irs<0b1000, "tst",
2092                         BinOpFrag<(ARMcmpZ (and node:$LHS, node:$RHS), 0)>, 1>;
2093 defm TEQ  : AI1_cmp_irs<0b1001, "teq",
2094                         BinOpFrag<(ARMcmpZ (xor node:$LHS, node:$RHS), 0)>, 1>;
2095
2096 defm CMPz  : AI1_cmp_irs<0b1010, "cmp",
2097                          BinOpFrag<(ARMcmpZ node:$LHS, node:$RHS)>>;
2098 defm CMNz  : AI1_cmp_irs<0b1011, "cmn",
2099                          BinOpFrag<(ARMcmpZ node:$LHS,(ineg node:$RHS))>>;
2100
2101 //def : ARMPat<(ARMcmp GPR:$src, so_imm_neg:$imm),
2102 //             (CMNri  GPR:$src, so_imm_neg:$imm)>;
2103
2104 def : ARMPat<(ARMcmpZ GPR:$src, so_imm_neg:$imm),
2105              (CMNzri  GPR:$src, so_imm_neg:$imm)>;
2106
2107
2108 // Conditional moves
2109 // FIXME: should be able to write a pattern for ARMcmov, but can't use
2110 // a two-value operand where a dag node expects two operands. :(
2111 def MOVCCr : AI1<0b1101, (outs GPR:$dst), (ins GPR:$false, GPR:$true), DPFrm,
2112                 IIC_iCMOVr, "mov", "\t$dst, $true",
2113       [/*(set GPR:$dst, (ARMcmov GPR:$false, GPR:$true, imm:$cc, CCR:$ccr))*/]>,
2114                 RegConstraint<"$false = $dst">, UnaryDP {
2115   let Inst{11-4} = 0b00000000;
2116   let Inst{25} = 0;
2117 }
2118
2119 def MOVCCs : AI1<0b1101, (outs GPR:$dst),
2120                         (ins GPR:$false, so_reg:$true), DPSoRegFrm, IIC_iCMOVsr,
2121                 "mov", "\t$dst, $true",
2122    [/*(set GPR:$dst, (ARMcmov GPR:$false, so_reg:$true, imm:$cc, CCR:$ccr))*/]>,
2123                 RegConstraint<"$false = $dst">, UnaryDP {
2124   let Inst{25} = 0;
2125 }
2126
2127 def MOVCCi : AI1<0b1101, (outs GPR:$dst),
2128                         (ins GPR:$false, so_imm:$true), DPFrm, IIC_iCMOVi,
2129                 "mov", "\t$dst, $true",
2130    [/*(set GPR:$dst, (ARMcmov GPR:$false, so_imm:$true, imm:$cc, CCR:$ccr))*/]>,
2131                 RegConstraint<"$false = $dst">, UnaryDP {
2132   let Inst{25} = 1;
2133 }
2134
2135 //===----------------------------------------------------------------------===//
2136 // Atomic operations intrinsics
2137 //
2138
2139 // memory barriers protect the atomic sequences
2140 let hasSideEffects = 1 in {
2141 def Int_MemBarrierV7 : AInoP<(outs), (ins),
2142                         Pseudo, NoItinerary,
2143                         "dmb", "",
2144                         [(ARMMemBarrierV7)]>,
2145                         Requires<[IsARM, HasV7]> {
2146   let Inst{31-4} = 0xf57ff05;
2147   // FIXME: add support for options other than a full system DMB
2148   // See DMB disassembly-only variants below.
2149   let Inst{3-0} = 0b1111;
2150 }
2151
2152 def Int_SyncBarrierV7 : AInoP<(outs), (ins),
2153                         Pseudo, NoItinerary,
2154                         "dsb", "",
2155                         [(ARMSyncBarrierV7)]>,
2156                         Requires<[IsARM, HasV7]> {
2157   let Inst{31-4} = 0xf57ff04;
2158   // FIXME: add support for options other than a full system DSB
2159   // See DSB disassembly-only variants below.
2160   let Inst{3-0} = 0b1111;
2161 }
2162
2163 def Int_MemBarrierV6 : AInoP<(outs), (ins GPR:$zero),
2164                        Pseudo, NoItinerary,
2165                        "mcr", "\tp15, 0, $zero, c7, c10, 5",
2166                        [(ARMMemBarrierV6 GPR:$zero)]>,
2167                        Requires<[IsARM, HasV6]> {
2168   // FIXME: add support for options other than a full system DMB
2169   // FIXME: add encoding
2170 }
2171
2172 def Int_SyncBarrierV6 : AInoP<(outs), (ins GPR:$zero),
2173                         Pseudo, NoItinerary,
2174                         "mcr", "\tp15, 0, $zero, c7, c10, 4",
2175                         [(ARMSyncBarrierV6 GPR:$zero)]>,
2176                         Requires<[IsARM, HasV6]> {
2177   // FIXME: add support for options other than a full system DSB
2178   // FIXME: add encoding
2179 }
2180 }
2181
2182 // Helper class for multiclass MemB -- for disassembly only
2183 class AMBI<string opc, string asm>
2184   : AInoP<(outs), (ins), MiscFrm, NoItinerary, opc, asm,
2185           [/* For disassembly only; pattern left blank */]>,
2186     Requires<[IsARM, HasV7]> {
2187   let Inst{31-20} = 0xf57;
2188 }
2189
2190 multiclass MemB<bits<4> op7_4, string opc> {
2191
2192   def st : AMBI<opc, "\tst"> {
2193     let Inst{7-4} = op7_4;
2194     let Inst{3-0} = 0b1110;
2195   }
2196
2197   def ish : AMBI<opc, "\tish"> {
2198     let Inst{7-4} = op7_4;
2199     let Inst{3-0} = 0b1011;
2200   }
2201
2202   def ishst : AMBI<opc, "\tishst"> {
2203     let Inst{7-4} = op7_4;
2204     let Inst{3-0} = 0b1010;
2205   }
2206
2207   def nsh : AMBI<opc, "\tnsh"> {
2208     let Inst{7-4} = op7_4;
2209     let Inst{3-0} = 0b0111;
2210   }
2211
2212   def nshst : AMBI<opc, "\tnshst"> {
2213     let Inst{7-4} = op7_4;
2214     let Inst{3-0} = 0b0110;
2215   }
2216
2217   def osh : AMBI<opc, "\tosh"> {
2218     let Inst{7-4} = op7_4;
2219     let Inst{3-0} = 0b0011;
2220   }
2221
2222   def oshst : AMBI<opc, "\toshst"> {
2223     let Inst{7-4} = op7_4;
2224     let Inst{3-0} = 0b0010;
2225   }
2226 }
2227
2228 // These DMB variants are for disassembly only.
2229 defm DMB : MemB<0b0101, "dmb">;
2230
2231 // These DSB variants are for disassembly only.
2232 defm DSB : MemB<0b0100, "dsb">;
2233
2234 // ISB has only full system option -- for disassembly only
2235 def ISBsy : AMBI<"isb", ""> {
2236   let Inst{7-4} = 0b0110;
2237   let Inst{3-0} = 0b1111;
2238 }
2239
2240 let usesCustomInserter = 1 in {
2241   let Uses = [CPSR] in {
2242     def ATOMIC_LOAD_ADD_I8 : PseudoInst<
2243       (outs GPR:$dst), (ins GPR:$ptr, GPR:$incr), NoItinerary,
2244       "${:comment} ATOMIC_LOAD_ADD_I8 PSEUDO!",
2245       [(set GPR:$dst, (atomic_load_add_8 GPR:$ptr, GPR:$incr))]>;
2246     def ATOMIC_LOAD_SUB_I8 : PseudoInst<
2247       (outs GPR:$dst), (ins GPR:$ptr, GPR:$incr), NoItinerary,
2248       "${:comment} ATOMIC_LOAD_SUB_I8 PSEUDO!",
2249       [(set GPR:$dst, (atomic_load_sub_8 GPR:$ptr, GPR:$incr))]>;
2250     def ATOMIC_LOAD_AND_I8 : PseudoInst<
2251       (outs GPR:$dst), (ins GPR:$ptr, GPR:$incr), NoItinerary,
2252       "${:comment} ATOMIC_LOAD_AND_I8 PSEUDO!",
2253       [(set GPR:$dst, (atomic_load_and_8 GPR:$ptr, GPR:$incr))]>;
2254     def ATOMIC_LOAD_OR_I8 : PseudoInst<
2255       (outs GPR:$dst), (ins GPR:$ptr, GPR:$incr), NoItinerary,
2256       "${:comment} ATOMIC_LOAD_OR_I8 PSEUDO!",
2257       [(set GPR:$dst, (atomic_load_or_8 GPR:$ptr, GPR:$incr))]>;
2258     def ATOMIC_LOAD_XOR_I8 : PseudoInst<
2259       (outs GPR:$dst), (ins GPR:$ptr, GPR:$incr), NoItinerary,
2260       "${:comment} ATOMIC_LOAD_XOR_I8 PSEUDO!",
2261       [(set GPR:$dst, (atomic_load_xor_8 GPR:$ptr, GPR:$incr))]>;
2262     def ATOMIC_LOAD_NAND_I8 : PseudoInst<
2263       (outs GPR:$dst), (ins GPR:$ptr, GPR:$incr), NoItinerary,
2264       "${:comment} ATOMIC_LOAD_NAND_I8 PSEUDO!",
2265       [(set GPR:$dst, (atomic_load_nand_8 GPR:$ptr, GPR:$incr))]>;
2266     def ATOMIC_LOAD_ADD_I16 : PseudoInst<
2267       (outs GPR:$dst), (ins GPR:$ptr, GPR:$incr), NoItinerary,
2268       "${:comment} ATOMIC_LOAD_ADD_I16 PSEUDO!",
2269       [(set GPR:$dst, (atomic_load_add_16 GPR:$ptr, GPR:$incr))]>;
2270     def ATOMIC_LOAD_SUB_I16 : PseudoInst<
2271       (outs GPR:$dst), (ins GPR:$ptr, GPR:$incr), NoItinerary,
2272       "${:comment} ATOMIC_LOAD_SUB_I16 PSEUDO!",
2273       [(set GPR:$dst, (atomic_load_sub_16 GPR:$ptr, GPR:$incr))]>;
2274     def ATOMIC_LOAD_AND_I16 : PseudoInst<
2275       (outs GPR:$dst), (ins GPR:$ptr, GPR:$incr), NoItinerary,
2276       "${:comment} ATOMIC_LOAD_AND_I16 PSEUDO!",
2277       [(set GPR:$dst, (atomic_load_and_16 GPR:$ptr, GPR:$incr))]>;
2278     def ATOMIC_LOAD_OR_I16 : PseudoInst<
2279       (outs GPR:$dst), (ins GPR:$ptr, GPR:$incr), NoItinerary,
2280       "${:comment} ATOMIC_LOAD_OR_I16 PSEUDO!",
2281       [(set GPR:$dst, (atomic_load_or_16 GPR:$ptr, GPR:$incr))]>;
2282     def ATOMIC_LOAD_XOR_I16 : PseudoInst<
2283       (outs GPR:$dst), (ins GPR:$ptr, GPR:$incr), NoItinerary,
2284       "${:comment} ATOMIC_LOAD_XOR_I16 PSEUDO!",
2285       [(set GPR:$dst, (atomic_load_xor_16 GPR:$ptr, GPR:$incr))]>;
2286     def ATOMIC_LOAD_NAND_I16 : PseudoInst<
2287       (outs GPR:$dst), (ins GPR:$ptr, GPR:$incr), NoItinerary,
2288       "${:comment} ATOMIC_LOAD_NAND_I16 PSEUDO!",
2289       [(set GPR:$dst, (atomic_load_nand_16 GPR:$ptr, GPR:$incr))]>;
2290     def ATOMIC_LOAD_ADD_I32 : PseudoInst<
2291       (outs GPR:$dst), (ins GPR:$ptr, GPR:$incr), NoItinerary,
2292       "${:comment} ATOMIC_LOAD_ADD_I32 PSEUDO!",
2293       [(set GPR:$dst, (atomic_load_add_32 GPR:$ptr, GPR:$incr))]>;
2294     def ATOMIC_LOAD_SUB_I32 : PseudoInst<
2295       (outs GPR:$dst), (ins GPR:$ptr, GPR:$incr), NoItinerary,
2296       "${:comment} ATOMIC_LOAD_SUB_I32 PSEUDO!",
2297       [(set GPR:$dst, (atomic_load_sub_32 GPR:$ptr, GPR:$incr))]>;
2298     def ATOMIC_LOAD_AND_I32 : PseudoInst<
2299       (outs GPR:$dst), (ins GPR:$ptr, GPR:$incr), NoItinerary,
2300       "${:comment} ATOMIC_LOAD_AND_I32 PSEUDO!",
2301       [(set GPR:$dst, (atomic_load_and_32 GPR:$ptr, GPR:$incr))]>;
2302     def ATOMIC_LOAD_OR_I32 : PseudoInst<
2303       (outs GPR:$dst), (ins GPR:$ptr, GPR:$incr), NoItinerary,
2304       "${:comment} ATOMIC_LOAD_OR_I32 PSEUDO!",
2305       [(set GPR:$dst, (atomic_load_or_32 GPR:$ptr, GPR:$incr))]>;
2306     def ATOMIC_LOAD_XOR_I32 : PseudoInst<
2307       (outs GPR:$dst), (ins GPR:$ptr, GPR:$incr), NoItinerary,
2308       "${:comment} ATOMIC_LOAD_XOR_I32 PSEUDO!",
2309       [(set GPR:$dst, (atomic_load_xor_32 GPR:$ptr, GPR:$incr))]>;
2310     def ATOMIC_LOAD_NAND_I32 : PseudoInst<
2311       (outs GPR:$dst), (ins GPR:$ptr, GPR:$incr), NoItinerary,
2312       "${:comment} ATOMIC_LOAD_NAND_I32 PSEUDO!",
2313       [(set GPR:$dst, (atomic_load_nand_32 GPR:$ptr, GPR:$incr))]>;
2314
2315     def ATOMIC_SWAP_I8 : PseudoInst<
2316       (outs GPR:$dst), (ins GPR:$ptr, GPR:$new), NoItinerary,
2317       "${:comment} ATOMIC_SWAP_I8 PSEUDO!",
2318       [(set GPR:$dst, (atomic_swap_8 GPR:$ptr, GPR:$new))]>;
2319     def ATOMIC_SWAP_I16 : PseudoInst<
2320       (outs GPR:$dst), (ins GPR:$ptr, GPR:$new), NoItinerary,
2321       "${:comment} ATOMIC_SWAP_I16 PSEUDO!",
2322       [(set GPR:$dst, (atomic_swap_16 GPR:$ptr, GPR:$new))]>;
2323     def ATOMIC_SWAP_I32 : PseudoInst<
2324       (outs GPR:$dst), (ins GPR:$ptr, GPR:$new), NoItinerary,
2325       "${:comment} ATOMIC_SWAP_I32 PSEUDO!",
2326       [(set GPR:$dst, (atomic_swap_32 GPR:$ptr, GPR:$new))]>;
2327
2328     def ATOMIC_CMP_SWAP_I8 : PseudoInst<
2329       (outs GPR:$dst), (ins GPR:$ptr, GPR:$old, GPR:$new), NoItinerary,
2330       "${:comment} ATOMIC_CMP_SWAP_I8 PSEUDO!",
2331       [(set GPR:$dst, (atomic_cmp_swap_8 GPR:$ptr, GPR:$old, GPR:$new))]>;
2332     def ATOMIC_CMP_SWAP_I16 : PseudoInst<
2333       (outs GPR:$dst), (ins GPR:$ptr, GPR:$old, GPR:$new), NoItinerary,
2334       "${:comment} ATOMIC_CMP_SWAP_I16 PSEUDO!",
2335       [(set GPR:$dst, (atomic_cmp_swap_16 GPR:$ptr, GPR:$old, GPR:$new))]>;
2336     def ATOMIC_CMP_SWAP_I32 : PseudoInst<
2337       (outs GPR:$dst), (ins GPR:$ptr, GPR:$old, GPR:$new), NoItinerary,
2338       "${:comment} ATOMIC_CMP_SWAP_I32 PSEUDO!",
2339       [(set GPR:$dst, (atomic_cmp_swap_32 GPR:$ptr, GPR:$old, GPR:$new))]>;
2340 }
2341 }
2342
2343 let mayLoad = 1 in {
2344 def LDREXB : AIldrex<0b10, (outs GPR:$dest), (ins GPR:$ptr), NoItinerary,
2345                     "ldrexb", "\t$dest, [$ptr]",
2346                     []>;
2347 def LDREXH : AIldrex<0b11, (outs GPR:$dest), (ins GPR:$ptr), NoItinerary,
2348                     "ldrexh", "\t$dest, [$ptr]",
2349                     []>;
2350 def LDREX  : AIldrex<0b00, (outs GPR:$dest), (ins GPR:$ptr), NoItinerary,
2351                     "ldrex", "\t$dest, [$ptr]",
2352                     []>;
2353 def LDREXD : AIldrex<0b01, (outs GPR:$dest, GPR:$dest2), (ins GPR:$ptr),
2354                     NoItinerary,
2355                     "ldrexd", "\t$dest, $dest2, [$ptr]",
2356                     []>;
2357 }
2358
2359 let mayStore = 1, Constraints = "@earlyclobber $success" in {
2360 def STREXB : AIstrex<0b10, (outs GPR:$success), (ins GPR:$src, GPR:$ptr),
2361                     NoItinerary,
2362                     "strexb", "\t$success, $src, [$ptr]",
2363                     []>;
2364 def STREXH : AIstrex<0b11, (outs GPR:$success), (ins GPR:$src, GPR:$ptr),
2365                     NoItinerary,
2366                     "strexh", "\t$success, $src, [$ptr]",
2367                     []>;
2368 def STREX  : AIstrex<0b00, (outs GPR:$success), (ins GPR:$src, GPR:$ptr),
2369                     NoItinerary,
2370                     "strex", "\t$success, $src, [$ptr]",
2371                     []>;
2372 def STREXD : AIstrex<0b01, (outs GPR:$success),
2373                     (ins GPR:$src, GPR:$src2, GPR:$ptr),
2374                     NoItinerary,
2375                     "strexd", "\t$success, $src, $src2, [$ptr]",
2376                     []>;
2377 }
2378
2379 // Clear-Exclusive is for disassembly only.
2380 def CLREX : AXI<(outs), (ins), MiscFrm, NoItinerary, "clrex",
2381                 [/* For disassembly only; pattern left blank */]>,
2382             Requires<[IsARM, HasV7]>  {
2383   let Inst{31-20} = 0xf57;
2384   let Inst{7-4} = 0b0001;
2385 }
2386
2387 // SWP/SWPB are deprecated in V6/V7 and for disassembly only.
2388 let mayLoad = 1 in {
2389 def SWP : AI<(outs GPR:$dst), (ins GPR:$src, GPR:$ptr), LdStExFrm, NoItinerary,
2390              "swp", "\t$dst, $src, [$ptr]",
2391              [/* For disassembly only; pattern left blank */]> {
2392   let Inst{27-23} = 0b00010;
2393   let Inst{22} = 0; // B = 0
2394   let Inst{21-20} = 0b00;
2395   let Inst{7-4} = 0b1001;
2396 }
2397
2398 def SWPB : AI<(outs GPR:$dst), (ins GPR:$src, GPR:$ptr), LdStExFrm, NoItinerary,
2399              "swpb", "\t$dst, $src, [$ptr]",
2400              [/* For disassembly only; pattern left blank */]> {
2401   let Inst{27-23} = 0b00010;
2402   let Inst{22} = 1; // B = 1
2403   let Inst{21-20} = 0b00;
2404   let Inst{7-4} = 0b1001;
2405 }
2406 }
2407
2408 //===----------------------------------------------------------------------===//
2409 // TLS Instructions
2410 //
2411
2412 // __aeabi_read_tp preserves the registers r1-r3.
2413 let isCall = 1,
2414   Defs = [R0, R12, LR, CPSR] in {
2415   def TPsoft : ABXI<0b1011, (outs), (ins), IIC_Br,
2416                "bl\t__aeabi_read_tp",
2417                [(set R0, ARMthread_pointer)]>;
2418 }
2419
2420 //===----------------------------------------------------------------------===//
2421 // SJLJ Exception handling intrinsics
2422 //   eh_sjlj_setjmp() is an instruction sequence to store the return
2423 //   address and save #0 in R0 for the non-longjmp case.
2424 //   Since by its nature we may be coming from some other function to get
2425 //   here, and we're using the stack frame for the containing function to
2426 //   save/restore registers, we can't keep anything live in regs across
2427 //   the eh_sjlj_setjmp(), else it will almost certainly have been tromped upon
2428 //   when we get here from a longjmp(). We force everthing out of registers
2429 //   except for our own input by listing the relevant registers in Defs. By
2430 //   doing so, we also cause the prologue/epilogue code to actively preserve
2431 //   all of the callee-saved resgisters, which is exactly what we want.
2432 //   A constant value is passed in $val, and we use the location as a scratch.
2433 let Defs =
2434   [ R0,  R1,  R2,  R3,  R4,  R5,  R6,  R7,  R8,  R9,  R10, R11, R12, LR,  D0,
2435     D1,  D2,  D3,  D4,  D5,  D6,  D7,  D8,  D9,  D10, D11, D12, D13, D14, D15,
2436     D16, D17, D18, D19, D20, D21, D22, D23, D24, D25, D26, D27, D28, D29, D30,
2437     D31 ] in {
2438   def Int_eh_sjlj_setjmp : XI<(outs), (ins GPR:$src, GPR:$val),
2439                                AddrModeNone, SizeSpecial, IndexModeNone,
2440                                Pseudo, NoItinerary,
2441                                "str\tsp, [$src, #+8] @ eh_setjmp begin\n\t"
2442                                "add\t$val, pc, #8\n\t"
2443                                "str\t$val, [$src, #+4]\n\t"
2444                                "mov\tr0, #0\n\t"
2445                                "add\tpc, pc, #0\n\t"
2446                                "mov\tr0, #1 @ eh_setjmp end", "",
2447                          [(set R0, (ARMeh_sjlj_setjmp GPR:$src, GPR:$val))]>;
2448 }
2449
2450 //===----------------------------------------------------------------------===//
2451 // Non-Instruction Patterns
2452 //
2453
2454 // Large immediate handling.
2455
2456 // Two piece so_imms.
2457 let isReMaterializable = 1 in
2458 def MOVi2pieces : AI1x2<(outs GPR:$dst), (ins so_imm2part:$src),
2459                          Pseudo, IIC_iMOVi,
2460                          "mov", "\t$dst, $src",
2461                          [(set GPR:$dst, so_imm2part:$src)]>,
2462                   Requires<[IsARM, NoV6T2]>;
2463
2464 def : ARMPat<(or GPR:$LHS, so_imm2part:$RHS),
2465              (ORRri (ORRri GPR:$LHS, (so_imm2part_1 imm:$RHS)),
2466                     (so_imm2part_2 imm:$RHS))>;
2467 def : ARMPat<(xor GPR:$LHS, so_imm2part:$RHS),
2468              (EORri (EORri GPR:$LHS, (so_imm2part_1 imm:$RHS)),
2469                     (so_imm2part_2 imm:$RHS))>;
2470 def : ARMPat<(add GPR:$LHS, so_imm2part:$RHS),
2471              (ADDri (ADDri GPR:$LHS, (so_imm2part_1 imm:$RHS)),
2472                     (so_imm2part_2 imm:$RHS))>;
2473 def : ARMPat<(add GPR:$LHS, so_neg_imm2part:$RHS),
2474              (SUBri (SUBri GPR:$LHS, (so_neg_imm2part_1 imm:$RHS)),
2475                     (so_neg_imm2part_2 imm:$RHS))>;
2476
2477 // 32-bit immediate using movw + movt.
2478 // This is a single pseudo instruction, the benefit is that it can be remat'd
2479 // as a single unit instead of having to handle reg inputs.
2480 // FIXME: Remove this when we can do generalized remat.
2481 let isReMaterializable = 1 in
2482 def MOVi32imm : AI1x2<(outs GPR:$dst), (ins i32imm:$src), Pseudo, IIC_iMOVi,
2483                    "movw", "\t$dst, ${src:lo16}\n\tmovt${p}\t$dst, ${src:hi16}",
2484                      [(set GPR:$dst, (i32 imm:$src))]>,
2485                Requires<[IsARM, HasV6T2]>;
2486
2487 // ConstantPool, GlobalAddress, and JumpTable
2488 def : ARMPat<(ARMWrapper  tglobaladdr :$dst), (LEApcrel tglobaladdr :$dst)>,
2489             Requires<[IsARM, DontUseMovt]>;
2490 def : ARMPat<(ARMWrapper  tconstpool  :$dst), (LEApcrel tconstpool  :$dst)>;
2491 def : ARMPat<(ARMWrapper  tglobaladdr :$dst), (MOVi32imm tglobaladdr :$dst)>,
2492             Requires<[IsARM, UseMovt]>;
2493 def : ARMPat<(ARMWrapperJT tjumptable:$dst, imm:$id),
2494              (LEApcrelJT tjumptable:$dst, imm:$id)>;
2495
2496 // TODO: add,sub,and, 3-instr forms?
2497
2498
2499 // Direct calls
2500 def : ARMPat<(ARMcall texternalsym:$func), (BL texternalsym:$func)>,
2501       Requires<[IsARM, IsNotDarwin]>;
2502 def : ARMPat<(ARMcall texternalsym:$func), (BLr9 texternalsym:$func)>,
2503       Requires<[IsARM, IsDarwin]>;
2504
2505 // zextload i1 -> zextload i8
2506 def : ARMPat<(zextloadi1 addrmode2:$addr),  (LDRB addrmode2:$addr)>;
2507
2508 // extload -> zextload
2509 def : ARMPat<(extloadi1  addrmode2:$addr),  (LDRB addrmode2:$addr)>;
2510 def : ARMPat<(extloadi8  addrmode2:$addr),  (LDRB addrmode2:$addr)>;
2511 def : ARMPat<(extloadi16 addrmode3:$addr),  (LDRH addrmode3:$addr)>;
2512
2513 def : ARMPat<(extloadi8  addrmodepc:$addr), (PICLDRB addrmodepc:$addr)>;
2514 def : ARMPat<(extloadi16 addrmodepc:$addr), (PICLDRH addrmodepc:$addr)>;
2515
2516 // smul* and smla*
2517 def : ARMV5TEPat<(mul (sra (shl GPR:$a, (i32 16)), (i32 16)),
2518                       (sra (shl GPR:$b, (i32 16)), (i32 16))),
2519                  (SMULBB GPR:$a, GPR:$b)>;
2520 def : ARMV5TEPat<(mul sext_16_node:$a, sext_16_node:$b),
2521                  (SMULBB GPR:$a, GPR:$b)>;
2522 def : ARMV5TEPat<(mul (sra (shl GPR:$a, (i32 16)), (i32 16)),
2523                       (sra GPR:$b, (i32 16))),
2524                  (SMULBT GPR:$a, GPR:$b)>;
2525 def : ARMV5TEPat<(mul sext_16_node:$a, (sra GPR:$b, (i32 16))),
2526                  (SMULBT GPR:$a, GPR:$b)>;
2527 def : ARMV5TEPat<(mul (sra GPR:$a, (i32 16)),
2528                       (sra (shl GPR:$b, (i32 16)), (i32 16))),
2529                  (SMULTB GPR:$a, GPR:$b)>;
2530 def : ARMV5TEPat<(mul (sra GPR:$a, (i32 16)), sext_16_node:$b),
2531                 (SMULTB GPR:$a, GPR:$b)>;
2532 def : ARMV5TEPat<(sra (mul GPR:$a, (sra (shl GPR:$b, (i32 16)), (i32 16))),
2533                       (i32 16)),
2534                  (SMULWB GPR:$a, GPR:$b)>;
2535 def : ARMV5TEPat<(sra (mul GPR:$a, sext_16_node:$b), (i32 16)),
2536                  (SMULWB GPR:$a, GPR:$b)>;
2537
2538 def : ARMV5TEPat<(add GPR:$acc,
2539                       (mul (sra (shl GPR:$a, (i32 16)), (i32 16)),
2540                            (sra (shl GPR:$b, (i32 16)), (i32 16)))),
2541                  (SMLABB GPR:$a, GPR:$b, GPR:$acc)>;
2542 def : ARMV5TEPat<(add GPR:$acc,
2543                       (mul sext_16_node:$a, sext_16_node:$b)),
2544                  (SMLABB GPR:$a, GPR:$b, GPR:$acc)>;
2545 def : ARMV5TEPat<(add GPR:$acc,
2546                       (mul (sra (shl GPR:$a, (i32 16)), (i32 16)),
2547                            (sra GPR:$b, (i32 16)))),
2548                  (SMLABT GPR:$a, GPR:$b, GPR:$acc)>;
2549 def : ARMV5TEPat<(add GPR:$acc,
2550                       (mul sext_16_node:$a, (sra GPR:$b, (i32 16)))),
2551                  (SMLABT GPR:$a, GPR:$b, GPR:$acc)>;
2552 def : ARMV5TEPat<(add GPR:$acc,
2553                       (mul (sra GPR:$a, (i32 16)),
2554                            (sra (shl GPR:$b, (i32 16)), (i32 16)))),
2555                  (SMLATB GPR:$a, GPR:$b, GPR:$acc)>;
2556 def : ARMV5TEPat<(add GPR:$acc,
2557                       (mul (sra GPR:$a, (i32 16)), sext_16_node:$b)),
2558                  (SMLATB GPR:$a, GPR:$b, GPR:$acc)>;
2559 def : ARMV5TEPat<(add GPR:$acc,
2560                       (sra (mul GPR:$a, (sra (shl GPR:$b, (i32 16)), (i32 16))),
2561                            (i32 16))),
2562                  (SMLAWB GPR:$a, GPR:$b, GPR:$acc)>;
2563 def : ARMV5TEPat<(add GPR:$acc,
2564                       (sra (mul GPR:$a, sext_16_node:$b), (i32 16))),
2565                  (SMLAWB GPR:$a, GPR:$b, GPR:$acc)>;
2566
2567 //===----------------------------------------------------------------------===//
2568 // Thumb Support
2569 //
2570
2571 include "ARMInstrThumb.td"
2572
2573 //===----------------------------------------------------------------------===//
2574 // Thumb2 Support
2575 //
2576
2577 include "ARMInstrThumb2.td"
2578
2579 //===----------------------------------------------------------------------===//
2580 // Floating Point Support
2581 //
2582
2583 include "ARMInstrVFP.td"
2584
2585 //===----------------------------------------------------------------------===//
2586 // Advanced SIMD (NEON) Support
2587 //
2588
2589 include "ARMInstrNEON.td"
2590
2591 //===----------------------------------------------------------------------===//
2592 // Coprocessor Instructions.  For disassembly only.
2593 //
2594
2595 def CDP : ABI<0b1110, (outs), (ins nohash_imm:$cop, i32imm:$opc1,
2596             nohash_imm:$CRd, nohash_imm:$CRn, nohash_imm:$CRm, i32imm:$opc2),
2597             NoItinerary, "cdp", "\tp$cop, $opc1, cr$CRd, cr$CRn, cr$CRm, $opc2",
2598               [/* For disassembly only; pattern left blank */]> {
2599   let Inst{4} = 0;
2600 }
2601
2602 def CDP2 : ABXI<0b1110, (outs), (ins nohash_imm:$cop, i32imm:$opc1,
2603                nohash_imm:$CRd, nohash_imm:$CRn, nohash_imm:$CRm, i32imm:$opc2),
2604                NoItinerary, "cdp2\tp$cop, $opc1, cr$CRd, cr$CRn, cr$CRm, $opc2",
2605                [/* For disassembly only; pattern left blank */]> {
2606   let Inst{31-28} = 0b1111;
2607   let Inst{4} = 0;
2608 }
2609
2610 class ACI<dag oops, dag iops, string opc, string asm>
2611   : I<oops, iops, AddrModeNone, Size4Bytes, IndexModeNone, BrFrm, NoItinerary,
2612       opc, asm, "", [/* For disassembly only; pattern left blank */]> {
2613   let Inst{27-25} = 0b110;
2614 }
2615
2616 multiclass LdStCop<bits<4> op31_28, bit load, string opc> {
2617
2618   def _OFFSET : ACI<(outs),
2619       (ins nohash_imm:$cop, nohash_imm:$CRd, addrmode2:$addr),
2620       opc, "\tp$cop, cr$CRd, $addr"> {
2621     let Inst{31-28} = op31_28;
2622     let Inst{24} = 1; // P = 1
2623     let Inst{21} = 0; // W = 0
2624     let Inst{22} = 0; // D = 0
2625     let Inst{20} = load;
2626   }
2627
2628   def _PRE : ACI<(outs),
2629       (ins nohash_imm:$cop, nohash_imm:$CRd, addrmode2:$addr),
2630       opc, "\tp$cop, cr$CRd, $addr!"> {
2631     let Inst{31-28} = op31_28;
2632     let Inst{24} = 1; // P = 1
2633     let Inst{21} = 1; // W = 1
2634     let Inst{22} = 0; // D = 0
2635     let Inst{20} = load;
2636   }
2637
2638   def _POST : ACI<(outs),
2639       (ins nohash_imm:$cop, nohash_imm:$CRd, GPR:$base, am2offset:$offset),
2640       opc, "\tp$cop, cr$CRd, [$base], $offset"> {
2641     let Inst{31-28} = op31_28;
2642     let Inst{24} = 0; // P = 0
2643     let Inst{21} = 1; // W = 1
2644     let Inst{22} = 0; // D = 0
2645     let Inst{20} = load;
2646   }
2647
2648   def _OPTION : ACI<(outs),
2649       (ins nohash_imm:$cop, nohash_imm:$CRd, GPR:$base, i32imm:$option),
2650       opc, "\tp$cop, cr$CRd, [$base], $option"> {
2651     let Inst{31-28} = op31_28;
2652     let Inst{24} = 0; // P = 0
2653     let Inst{23} = 1; // U = 1
2654     let Inst{21} = 0; // W = 0
2655     let Inst{22} = 0; // D = 0
2656     let Inst{20} = load;
2657   }
2658
2659   def L_OFFSET : ACI<(outs),
2660       (ins nohash_imm:$cop, nohash_imm:$CRd, addrmode2:$addr),
2661       opc, "l\tp$cop, cr$CRd, $addr"> {
2662     let Inst{31-28} = op31_28;
2663     let Inst{24} = 1; // P = 1
2664     let Inst{21} = 0; // W = 0
2665     let Inst{22} = 1; // D = 1
2666     let Inst{20} = load;
2667   }
2668
2669   def L_PRE : ACI<(outs),
2670       (ins nohash_imm:$cop, nohash_imm:$CRd, addrmode2:$addr),
2671       opc, "l\tp$cop, cr$CRd, $addr!"> {
2672     let Inst{31-28} = op31_28;
2673     let Inst{24} = 1; // P = 1
2674     let Inst{21} = 1; // W = 1
2675     let Inst{22} = 1; // D = 1
2676     let Inst{20} = load;
2677   }
2678
2679   def L_POST : ACI<(outs),
2680       (ins nohash_imm:$cop, nohash_imm:$CRd, GPR:$base, am2offset:$offset),
2681       opc, "l\tp$cop, cr$CRd, [$base], $offset"> {
2682     let Inst{31-28} = op31_28;
2683     let Inst{24} = 0; // P = 0
2684     let Inst{21} = 1; // W = 1
2685     let Inst{22} = 1; // D = 1
2686     let Inst{20} = load;
2687   }
2688
2689   def L_OPTION : ACI<(outs),
2690       (ins nohash_imm:$cop, nohash_imm:$CRd, GPR:$base, nohash_imm:$option),
2691       opc, "l\tp$cop, cr$CRd, [$base], $option"> {
2692     let Inst{31-28} = op31_28;
2693     let Inst{24} = 0; // P = 0
2694     let Inst{23} = 1; // U = 1
2695     let Inst{21} = 0; // W = 0
2696     let Inst{22} = 1; // D = 1
2697     let Inst{20} = load;
2698   }
2699 }
2700
2701 defm LDC  : LdStCop<{?,?,?,?}, 1, "ldc">;
2702 defm LDC2 : LdStCop<0b1111,    1, "ldc2">;
2703 defm STC  : LdStCop<{?,?,?,?}, 0, "stc">;
2704 defm STC2 : LdStCop<0b1111,    0, "stc2">;
2705
2706 def MCR : ABI<0b1110, (outs), (ins nohash_imm:$cop, i32imm:$opc1,
2707               GPR:$Rt, nohash_imm:$CRn, nohash_imm:$CRm, i32imm:$opc2),
2708               NoItinerary, "mcr", "\tp$cop, $opc1, $Rt, cr$CRn, cr$CRm, $opc2",
2709               [/* For disassembly only; pattern left blank */]> {
2710   let Inst{20} = 0;
2711   let Inst{4} = 1;
2712 }
2713
2714 def MCR2 : ABXI<0b1110, (outs), (ins nohash_imm:$cop, i32imm:$opc1,
2715                 GPR:$Rt, nohash_imm:$CRn, nohash_imm:$CRm, i32imm:$opc2),
2716                 NoItinerary, "mcr2\tp$cop, $opc1, $Rt, cr$CRn, cr$CRm, $opc2",
2717                 [/* For disassembly only; pattern left blank */]> {
2718   let Inst{31-28} = 0b1111;
2719   let Inst{20} = 0;
2720   let Inst{4} = 1;
2721 }
2722
2723 def MRC : ABI<0b1110, (outs), (ins nohash_imm:$cop, i32imm:$opc1,
2724               GPR:$Rt, nohash_imm:$CRn, nohash_imm:$CRm, i32imm:$opc2),
2725               NoItinerary, "mrc", "\tp$cop, $opc1, $Rt, cr$CRn, cr$CRm, $opc2",
2726               [/* For disassembly only; pattern left blank */]> {
2727   let Inst{20} = 1;
2728   let Inst{4} = 1;
2729 }
2730
2731 def MRC2 : ABXI<0b1110, (outs), (ins nohash_imm:$cop, i32imm:$opc1,
2732                 GPR:$Rt, nohash_imm:$CRn, nohash_imm:$CRm, i32imm:$opc2),
2733                 NoItinerary, "mrc2\tp$cop, $opc1, $Rt, cr$CRn, cr$CRm, $opc2",
2734                 [/* For disassembly only; pattern left blank */]> {
2735   let Inst{31-28} = 0b1111;
2736   let Inst{20} = 1;
2737   let Inst{4} = 1;
2738 }
2739
2740 def MCRR : ABI<0b1100, (outs), (ins nohash_imm:$cop, i32imm:$opc,
2741                GPR:$Rt, GPR:$Rt2, nohash_imm:$CRm),
2742                NoItinerary, "mcrr", "\tp$cop, $opc, $Rt, $Rt2, cr$CRm",
2743                [/* For disassembly only; pattern left blank */]> {
2744   let Inst{23-20} = 0b0100;
2745 }
2746
2747 def MCRR2 : ABXI<0b1100, (outs), (ins nohash_imm:$cop, i32imm:$opc,
2748                  GPR:$Rt, GPR:$Rt2, nohash_imm:$CRm),
2749                  NoItinerary, "mcrr2\tp$cop, $opc, $Rt, $Rt2, cr$CRm",
2750                  [/* For disassembly only; pattern left blank */]> {
2751   let Inst{31-28} = 0b1111;
2752   let Inst{23-20} = 0b0100;
2753 }
2754
2755 def MRRC : ABI<0b1100, (outs), (ins nohash_imm:$cop, i32imm:$opc,
2756                GPR:$Rt, GPR:$Rt2, nohash_imm:$CRm),
2757                NoItinerary, "mrrc", "\tp$cop, $opc, $Rt, $Rt2, cr$CRm",
2758                [/* For disassembly only; pattern left blank */]> {
2759   let Inst{23-20} = 0b0101;
2760 }
2761
2762 def MRRC2 : ABXI<0b1100, (outs), (ins nohash_imm:$cop, i32imm:$opc,
2763                  GPR:$Rt, GPR:$Rt2, nohash_imm:$CRm),
2764                  NoItinerary, "mrrc2\tp$cop, $opc, $Rt, $Rt2, cr$CRm",
2765                  [/* For disassembly only; pattern left blank */]> {
2766   let Inst{31-28} = 0b1111;
2767   let Inst{23-20} = 0b0101;
2768 }
2769
2770 //===----------------------------------------------------------------------===//
2771 // Move between special register and ARM core register -- for disassembly only
2772 //
2773
2774 def MRS : ABI<0b0001,(outs GPR:$dst),(ins), NoItinerary, "mrs", "\t$dst, cpsr",
2775               [/* For disassembly only; pattern left blank */]> {
2776   let Inst{23-20} = 0b0000;
2777   let Inst{7-4} = 0b0000;
2778 }
2779
2780 def MRSsys : ABI<0b0001,(outs GPR:$dst),(ins), NoItinerary,"mrs","\t$dst, spsr",
2781               [/* For disassembly only; pattern left blank */]> {
2782   let Inst{23-20} = 0b0100;
2783   let Inst{7-4} = 0b0000;
2784 }
2785
2786 // FIXME: mask is ignored for the time being.
2787 def MSR : ABI<0b0001,(outs),(ins GPR:$src), NoItinerary, "msr", "\tcpsr, $src",
2788               [/* For disassembly only; pattern left blank */]> {
2789   let Inst{23-20} = 0b0010;
2790   let Inst{7-4} = 0b0000;
2791 }
2792
2793 // FIXME: mask is ignored for the time being.
2794 def MSRi : ABI<0b0011,(outs),(ins so_imm:$a), NoItinerary, "msr", "\tcpsr, $a",
2795               [/* For disassembly only; pattern left blank */]> {
2796   let Inst{23-20} = 0b0010;
2797   let Inst{7-4} = 0b0000;
2798 }
2799
2800 // FIXME: mask is ignored for the time being.
2801 def MSRsys : ABI<0b0001,(outs),(ins GPR:$src),NoItinerary,"msr","\tspsr, $src",
2802               [/* For disassembly only; pattern left blank */]> {
2803   let Inst{23-20} = 0b0110;
2804   let Inst{7-4} = 0b0000;
2805 }
2806
2807 // FIXME: mask is ignored for the time being.
2808 def MSRsysi : ABI<0b0011,(outs),(ins so_imm:$a),NoItinerary,"msr","\tspsr, $a",
2809               [/* For disassembly only; pattern left blank */]> {
2810   let Inst{23-20} = 0b0110;
2811   let Inst{7-4} = 0b0000;
2812 }