Add support for binary encoding of ARM 'adr' instructions referencing constant
[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, [SDTCisPtrTy<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_ARMBCC_i64 : SDTypeProfile<0, 6,
42                                   [SDTCisVT<0, i32>,
43                                    SDTCisVT<1, i32>, SDTCisVT<2, i32>,
44                                    SDTCisVT<3, i32>, SDTCisVT<4, i32>,
45                                    SDTCisVT<5, OtherVT>]>;
46
47 def SDT_ARMAnd     : SDTypeProfile<1, 2,
48                                    [SDTCisVT<0, i32>, SDTCisVT<1, i32>,
49                                     SDTCisVT<2, i32>]>;
50
51 def SDT_ARMCmp     : SDTypeProfile<0, 2, [SDTCisSameAs<0, 1>]>;
52
53 def SDT_ARMPICAdd  : SDTypeProfile<1, 2, [SDTCisSameAs<0, 1>,
54                                           SDTCisPtrTy<1>, SDTCisVT<2, i32>]>;
55
56 def SDT_ARMThreadPointer : SDTypeProfile<1, 0, [SDTCisPtrTy<0>]>;
57 def SDT_ARMEH_SJLJ_Setjmp : SDTypeProfile<1, 2, [SDTCisInt<0>, SDTCisPtrTy<1>,
58                                                  SDTCisInt<2>]>;
59 def SDT_ARMEH_SJLJ_Longjmp: SDTypeProfile<0, 2, [SDTCisPtrTy<0>, SDTCisInt<1>]>;
60
61 def SDT_ARMEH_SJLJ_DispatchSetup: SDTypeProfile<0, 1, [SDTCisPtrTy<0>]>;
62
63 def SDT_ARMMEMBARRIER     : SDTypeProfile<0, 1, [SDTCisInt<0>]>;
64
65 def SDT_ARMTCRET : SDTypeProfile<0, 1, [SDTCisPtrTy<0>]>;
66
67 def SDT_ARMBFI : SDTypeProfile<1, 3, [SDTCisVT<0, i32>, SDTCisVT<1, i32>,
68                                       SDTCisVT<2, i32>, SDTCisVT<3, i32>]>;
69
70 // Node definitions.
71 def ARMWrapper       : SDNode<"ARMISD::Wrapper",     SDTIntUnaryOp>;
72 def ARMWrapperJT     : SDNode<"ARMISD::WrapperJT",   SDTIntBinOp>;
73
74 def ARMcallseq_start : SDNode<"ISD::CALLSEQ_START", SDT_ARMCallSeqStart,
75                               [SDNPHasChain, SDNPOutFlag]>;
76 def ARMcallseq_end   : SDNode<"ISD::CALLSEQ_END",   SDT_ARMCallSeqEnd,
77                               [SDNPHasChain, SDNPOptInFlag, SDNPOutFlag]>;
78
79 def ARMcall          : SDNode<"ARMISD::CALL", SDT_ARMcall,
80                               [SDNPHasChain, SDNPOptInFlag, SDNPOutFlag,
81                                SDNPVariadic]>;
82 def ARMcall_pred    : SDNode<"ARMISD::CALL_PRED", SDT_ARMcall,
83                               [SDNPHasChain, SDNPOptInFlag, SDNPOutFlag,
84                                SDNPVariadic]>;
85 def ARMcall_nolink   : SDNode<"ARMISD::CALL_NOLINK", SDT_ARMcall,
86                               [SDNPHasChain, SDNPOptInFlag, SDNPOutFlag,
87                                SDNPVariadic]>;
88
89 def ARMretflag       : SDNode<"ARMISD::RET_FLAG", SDTNone,
90                               [SDNPHasChain, SDNPOptInFlag]>;
91
92 def ARMcmov          : SDNode<"ARMISD::CMOV", SDT_ARMCMov,
93                               [SDNPInFlag]>;
94 def ARMcneg          : SDNode<"ARMISD::CNEG", SDT_ARMCMov,
95                               [SDNPInFlag]>;
96
97 def ARMbrcond        : SDNode<"ARMISD::BRCOND", SDT_ARMBrcond,
98                               [SDNPHasChain, SDNPInFlag, SDNPOutFlag]>;
99
100 def ARMbrjt          : SDNode<"ARMISD::BR_JT", SDT_ARMBrJT,
101                               [SDNPHasChain]>;
102 def ARMbr2jt         : SDNode<"ARMISD::BR2_JT", SDT_ARMBr2JT,
103                               [SDNPHasChain]>;
104
105 def ARMBcci64        : SDNode<"ARMISD::BCC_i64", SDT_ARMBCC_i64,
106                               [SDNPHasChain]>;
107
108 def ARMcmp           : SDNode<"ARMISD::CMP", SDT_ARMCmp,
109                               [SDNPOutFlag]>;
110
111 def ARMcmpZ          : SDNode<"ARMISD::CMPZ", SDT_ARMCmp,
112                               [SDNPOutFlag, SDNPCommutative]>;
113
114 def ARMpic_add       : SDNode<"ARMISD::PIC_ADD", SDT_ARMPICAdd>;
115
116 def ARMsrl_flag      : SDNode<"ARMISD::SRL_FLAG", SDTIntUnaryOp, [SDNPOutFlag]>;
117 def ARMsra_flag      : SDNode<"ARMISD::SRA_FLAG", SDTIntUnaryOp, [SDNPOutFlag]>;
118 def ARMrrx           : SDNode<"ARMISD::RRX"     , SDTIntUnaryOp, [SDNPInFlag ]>;
119
120 def ARMthread_pointer: SDNode<"ARMISD::THREAD_POINTER", SDT_ARMThreadPointer>;
121 def ARMeh_sjlj_setjmp: SDNode<"ARMISD::EH_SJLJ_SETJMP",
122                                SDT_ARMEH_SJLJ_Setjmp, [SDNPHasChain]>;
123 def ARMeh_sjlj_longjmp: SDNode<"ARMISD::EH_SJLJ_LONGJMP",
124                                SDT_ARMEH_SJLJ_Longjmp, [SDNPHasChain]>;
125 def ARMeh_sjlj_dispatchsetup: SDNode<"ARMISD::EH_SJLJ_DISPATCHSETUP",
126                                SDT_ARMEH_SJLJ_DispatchSetup, [SDNPHasChain]>;
127
128
129 def ARMMemBarrier     : SDNode<"ARMISD::MEMBARRIER", SDT_ARMMEMBARRIER,
130                                [SDNPHasChain]>;
131 def ARMMemBarrierMCR  : SDNode<"ARMISD::MEMBARRIER_MCR", SDT_ARMMEMBARRIER,
132                                [SDNPHasChain]>;
133 def ARMPreload        : SDNode<"ARMISD::PRELOAD", SDTPrefetch,
134                                [SDNPHasChain, SDNPMayLoad, SDNPMayStore]>;
135
136 def ARMrbit          : SDNode<"ARMISD::RBIT", SDTIntUnaryOp>;
137
138 def ARMtcret         : SDNode<"ARMISD::TC_RETURN", SDT_ARMTCRET,
139                         [SDNPHasChain,  SDNPOptInFlag, SDNPVariadic]>;
140
141
142 def ARMbfi           : SDNode<"ARMISD::BFI", SDT_ARMBFI>;
143
144 //===----------------------------------------------------------------------===//
145 // ARM Instruction Predicate Definitions.
146 //
147 def HasV4T           : Predicate<"Subtarget->hasV4TOps()">, AssemblerPredicate;
148 def NoV4T            : Predicate<"!Subtarget->hasV4TOps()">;
149 def HasV5T           : Predicate<"Subtarget->hasV5TOps()">;
150 def HasV5TE          : Predicate<"Subtarget->hasV5TEOps()">, AssemblerPredicate;
151 def HasV6            : Predicate<"Subtarget->hasV6Ops()">, AssemblerPredicate;
152 def HasV6T2          : Predicate<"Subtarget->hasV6T2Ops()">, AssemblerPredicate;
153 def NoV6T2           : Predicate<"!Subtarget->hasV6T2Ops()">;
154 def HasV7            : Predicate<"Subtarget->hasV7Ops()">, AssemblerPredicate;
155 def NoVFP            : Predicate<"!Subtarget->hasVFP2()">;
156 def HasVFP2          : Predicate<"Subtarget->hasVFP2()">, AssemblerPredicate;
157 def HasVFP3          : Predicate<"Subtarget->hasVFP3()">, AssemblerPredicate;
158 def HasNEON          : Predicate<"Subtarget->hasNEON()">, AssemblerPredicate;
159 def HasDivide        : Predicate<"Subtarget->hasDivide()">, AssemblerPredicate;
160 def HasT2ExtractPack : Predicate<"Subtarget->hasT2ExtractPack()">,
161                                  AssemblerPredicate;
162 def HasDB            : Predicate<"Subtarget->hasDataBarrier()">,
163                                  AssemblerPredicate;
164 def HasMP            : Predicate<"Subtarget->hasMPExtension()">,
165                                  AssemblerPredicate;
166 def UseNEONForFP     : Predicate<"Subtarget->useNEONForSinglePrecisionFP()">;
167 def DontUseNEONForFP : Predicate<"!Subtarget->useNEONForSinglePrecisionFP()">;
168 def IsThumb          : Predicate<"Subtarget->isThumb()">, AssemblerPredicate;
169 def IsThumb1Only     : Predicate<"Subtarget->isThumb1Only()">;
170 def IsThumb2         : Predicate<"Subtarget->isThumb2()">, AssemblerPredicate;
171 def IsARM            : Predicate<"!Subtarget->isThumb()">, AssemblerPredicate;
172 def IsDarwin         : Predicate<"Subtarget->isTargetDarwin()">;
173 def IsNotDarwin      : Predicate<"!Subtarget->isTargetDarwin()">;
174
175 // FIXME: Eventually this will be just "hasV6T2Ops".
176 def UseMovt          : Predicate<"Subtarget->useMovt()">;
177 def DontUseMovt      : Predicate<"!Subtarget->useMovt()">;
178 def UseVMLx          : Predicate<"Subtarget->useVMLx()">;
179
180 //===----------------------------------------------------------------------===//
181 // ARM Flag Definitions.
182
183 class RegConstraint<string C> {
184   string Constraints = C;
185 }
186
187 //===----------------------------------------------------------------------===//
188 //  ARM specific transformation functions and pattern fragments.
189 //
190
191 // so_imm_neg_XFORM - Return a so_imm value packed into the format described for
192 // so_imm_neg def below.
193 def so_imm_neg_XFORM : SDNodeXForm<imm, [{
194   return CurDAG->getTargetConstant(-(int)N->getZExtValue(), MVT::i32);
195 }]>;
196
197 // so_imm_not_XFORM - Return a so_imm value packed into the format described for
198 // so_imm_not def below.
199 def so_imm_not_XFORM : SDNodeXForm<imm, [{
200   return CurDAG->getTargetConstant(~(int)N->getZExtValue(), MVT::i32);
201 }]>;
202
203 /// imm1_15 predicate - True if the 32-bit immediate is in the range [1,15].
204 def imm1_15 : PatLeaf<(i32 imm), [{
205   return (int32_t)N->getZExtValue() >= 1 && (int32_t)N->getZExtValue() < 16;
206 }]>;
207
208 /// imm16_31 predicate - True if the 32-bit immediate is in the range [16,31].
209 def imm16_31 : PatLeaf<(i32 imm), [{
210   return (int32_t)N->getZExtValue() >= 16 && (int32_t)N->getZExtValue() < 32;
211 }]>;
212
213 def so_imm_neg :
214   PatLeaf<(imm), [{
215     return ARM_AM::getSOImmVal(-(uint32_t)N->getZExtValue()) != -1;
216   }], so_imm_neg_XFORM>;
217
218 def so_imm_not :
219   PatLeaf<(imm), [{
220     return ARM_AM::getSOImmVal(~(uint32_t)N->getZExtValue()) != -1;
221   }], so_imm_not_XFORM>;
222
223 // sext_16_node predicate - True if the SDNode is sign-extended 16 or more bits.
224 def sext_16_node : PatLeaf<(i32 GPR:$a), [{
225   return CurDAG->ComputeNumSignBits(SDValue(N,0)) >= 17;
226 }]>;
227
228 /// bf_inv_mask_imm predicate - An AND mask to clear an arbitrary width bitfield
229 /// e.g., 0xf000ffff
230 def bf_inv_mask_imm : Operand<i32>,
231                       PatLeaf<(imm), [{
232   return ARM::isBitFieldInvertedMask(N->getZExtValue());
233 }] > {
234   let EncoderMethod = "getBitfieldInvertedMaskOpValue";
235   let PrintMethod = "printBitfieldInvMaskImmOperand";
236 }
237
238 /// Split a 32-bit immediate into two 16 bit parts.
239 def hi16 : SDNodeXForm<imm, [{
240   return CurDAG->getTargetConstant((uint32_t)N->getZExtValue() >> 16, MVT::i32);
241 }]>;
242
243 def lo16AllZero : PatLeaf<(i32 imm), [{
244   // Returns true if all low 16-bits are 0.
245   return (((uint32_t)N->getZExtValue()) & 0xFFFFUL) == 0;
246 }], hi16>;
247
248 /// imm0_65535 predicate - True if the 32-bit immediate is in the range
249 /// [0.65535].
250 def imm0_65535 : PatLeaf<(i32 imm), [{
251   return (uint32_t)N->getZExtValue() < 65536;
252 }]>;
253
254 class BinOpFrag<dag res> : PatFrag<(ops node:$LHS, node:$RHS), res>;
255 class UnOpFrag <dag res> : PatFrag<(ops node:$Src), res>;
256
257 /// adde and sube predicates - True based on whether the carry flag output
258 /// will be needed or not.
259 def adde_dead_carry :
260   PatFrag<(ops node:$LHS, node:$RHS), (adde node:$LHS, node:$RHS),
261   [{return !N->hasAnyUseOfValue(1);}]>;
262 def sube_dead_carry :
263   PatFrag<(ops node:$LHS, node:$RHS), (sube node:$LHS, node:$RHS),
264   [{return !N->hasAnyUseOfValue(1);}]>;
265 def adde_live_carry :
266   PatFrag<(ops node:$LHS, node:$RHS), (adde node:$LHS, node:$RHS),
267   [{return N->hasAnyUseOfValue(1);}]>;
268 def sube_live_carry :
269   PatFrag<(ops node:$LHS, node:$RHS), (sube node:$LHS, node:$RHS),
270   [{return N->hasAnyUseOfValue(1);}]>;
271
272 // An 'and' node with a single use.
273 def and_su : PatFrag<(ops node:$lhs, node:$rhs), (and node:$lhs, node:$rhs), [{
274   return N->hasOneUse();
275 }]>;
276
277 // An 'xor' node with a single use.
278 def xor_su : PatFrag<(ops node:$lhs, node:$rhs), (xor node:$lhs, node:$rhs), [{
279   return N->hasOneUse();
280 }]>;
281
282 //===----------------------------------------------------------------------===//
283 // Operand Definitions.
284 //
285
286 // Branch target.
287 def brtarget : Operand<OtherVT> {
288   let EncoderMethod = "getBranchTargetOpValue";
289 }
290
291 // Call target.
292 def bltarget : Operand<i32> {
293   // Encoded the same as branch targets.
294   let EncoderMethod = "getBranchTargetOpValue";
295 }
296
297 // A list of registers separated by comma. Used by load/store multiple.
298 def RegListAsmOperand : AsmOperandClass {
299   let Name = "RegList";
300   let SuperClasses = [];
301 }
302
303 def DPRRegListAsmOperand : AsmOperandClass {
304   let Name = "DPRRegList";
305   let SuperClasses = [];
306 }
307
308 def SPRRegListAsmOperand : AsmOperandClass {
309   let Name = "SPRRegList";
310   let SuperClasses = [];
311 }
312
313 def reglist : Operand<i32> {
314   let EncoderMethod = "getRegisterListOpValue";
315   let ParserMatchClass = RegListAsmOperand;
316   let PrintMethod = "printRegisterList";
317 }
318
319 def dpr_reglist : Operand<i32> {
320   let EncoderMethod = "getRegisterListOpValue";
321   let ParserMatchClass = DPRRegListAsmOperand;
322   let PrintMethod = "printRegisterList";
323 }
324
325 def spr_reglist : Operand<i32> {
326   let EncoderMethod = "getRegisterListOpValue";
327   let ParserMatchClass = SPRRegListAsmOperand;
328   let PrintMethod = "printRegisterList";
329 }
330
331 // An operand for the CONSTPOOL_ENTRY pseudo-instruction.
332 def cpinst_operand : Operand<i32> {
333   let PrintMethod = "printCPInstOperand";
334 }
335
336 // Local PC labels.
337 def pclabel : Operand<i32> {
338   let PrintMethod = "printPCLabel";
339 }
340
341 // ADR instruction labels.
342 def adrlabel : Operand<i32> {
343   let EncoderMethod = "getAdrLabelOpValue";
344 }
345
346 def neon_vcvt_imm32 : Operand<i32> {
347   let EncoderMethod = "getNEONVcvtImm32OpValue";
348 }
349
350 // rot_imm: An integer that encodes a rotate amount. Must be 8, 16, or 24.
351 def rot_imm : Operand<i32>, PatLeaf<(i32 imm), [{
352     int32_t v = (int32_t)N->getZExtValue();
353     return v == 8 || v == 16 || v == 24; }]> {
354   let EncoderMethod = "getRotImmOpValue";
355 }
356
357 // shift_imm: An integer that encodes a shift amount and the type of shift
358 // (currently either asr or lsl) using the same encoding used for the
359 // immediates in so_reg operands.
360 def shift_imm : Operand<i32> {
361   let PrintMethod = "printShiftImmOperand";
362 }
363
364 // shifter_operand operands: so_reg and so_imm.
365 def so_reg : Operand<i32>,    // reg reg imm
366              ComplexPattern<i32, 3, "SelectShifterOperandReg",
367                             [shl,srl,sra,rotr]> {
368   let EncoderMethod = "getSORegOpValue";
369   let PrintMethod = "printSORegOperand";
370   let MIOperandInfo = (ops GPR, GPR, i32imm);
371 }
372 def shift_so_reg : Operand<i32>,    // reg reg imm
373                    ComplexPattern<i32, 3, "SelectShiftShifterOperandReg",
374                                   [shl,srl,sra,rotr]> {
375   let EncoderMethod = "getSORegOpValue";
376   let PrintMethod = "printSORegOperand";
377   let MIOperandInfo = (ops GPR, GPR, i32imm);
378 }
379
380 // so_imm - Match a 32-bit shifter_operand immediate operand, which is an
381 // 8-bit immediate rotated by an arbitrary number of bits.  so_imm values are
382 // represented in the imm field in the same 12-bit form that they are encoded
383 // into so_imm instructions: the 8-bit immediate is the least significant bits
384 // [bits 0-7], the 4-bit shift amount is the next 4 bits [bits 8-11].
385 def so_imm : Operand<i32>, PatLeaf<(imm), [{ return Pred_so_imm(N); }]> {
386   let EncoderMethod = "getSOImmOpValue";
387   let PrintMethod = "printSOImmOperand";
388 }
389
390 // Break so_imm's up into two pieces.  This handles immediates with up to 16
391 // bits set in them.  This uses so_imm2part to match and so_imm2part_[12] to
392 // get the first/second pieces.
393 def so_imm2part : PatLeaf<(imm), [{
394       return ARM_AM::isSOImmTwoPartVal((unsigned)N->getZExtValue());
395 }]>;
396
397 /// arm_i32imm - True for +V6T2, or true only if so_imm2part is true.
398 ///
399 def arm_i32imm : PatLeaf<(imm), [{
400   if (Subtarget->hasV6T2Ops())
401     return true;
402   return ARM_AM::isSOImmTwoPartVal((unsigned)N->getZExtValue());
403 }]>;
404
405 def so_imm2part_1 : SDNodeXForm<imm, [{
406   unsigned V = ARM_AM::getSOImmTwoPartFirst((unsigned)N->getZExtValue());
407   return CurDAG->getTargetConstant(V, MVT::i32);
408 }]>;
409
410 def so_imm2part_2 : SDNodeXForm<imm, [{
411   unsigned V = ARM_AM::getSOImmTwoPartSecond((unsigned)N->getZExtValue());
412   return CurDAG->getTargetConstant(V, MVT::i32);
413 }]>;
414
415 def so_neg_imm2part : Operand<i32>, PatLeaf<(imm), [{
416       return ARM_AM::isSOImmTwoPartVal(-(int)N->getZExtValue());
417     }]> {
418   let PrintMethod = "printSOImm2PartOperand";
419 }
420
421 def so_neg_imm2part_1 : SDNodeXForm<imm, [{
422   unsigned V = ARM_AM::getSOImmTwoPartFirst(-(int)N->getZExtValue());
423   return CurDAG->getTargetConstant(V, MVT::i32);
424 }]>;
425
426 def so_neg_imm2part_2 : SDNodeXForm<imm, [{
427   unsigned V = ARM_AM::getSOImmTwoPartSecond(-(int)N->getZExtValue());
428   return CurDAG->getTargetConstant(V, MVT::i32);
429 }]>;
430
431 /// imm0_31 predicate - True if the 32-bit immediate is in the range [0,31].
432 def imm0_31 : Operand<i32>, PatLeaf<(imm), [{
433   return (int32_t)N->getZExtValue() < 32;
434 }]>;
435
436 /// imm0_31_m1 - Matches and prints like imm0_31, but encodes as 'value - 1'.
437 def imm0_31_m1 : Operand<i32>, PatLeaf<(imm), [{
438   return (int32_t)N->getZExtValue() < 32;
439 }]> {
440   let EncoderMethod = "getImmMinusOneOpValue";
441 }
442
443 // For movt/movw - sets the MC Encoder method.
444 // The imm is split into imm{15-12}, imm{11-0}
445 //
446 def movt_imm : Operand<i32> {
447   let EncoderMethod = "getMovtImmOpValue";
448 }
449
450 // Define ARM specific addressing modes.
451
452
453 // addrmode_imm12 := reg +/- imm12
454 //
455 def addrmode_imm12 : Operand<i32>,
456                      ComplexPattern<i32, 2, "SelectAddrModeImm12", []> {
457   // 12-bit immediate operand. Note that instructions using this encode
458   // #0 and #-0 differently. We flag #-0 as the magic value INT32_MIN. All other
459   // immediate values are as normal.
460
461   let EncoderMethod = "getAddrModeImm12OpValue";
462   let PrintMethod = "printAddrModeImm12Operand";
463   let MIOperandInfo = (ops GPR:$base, i32imm:$offsimm);
464 }
465 // ldst_so_reg := reg +/- reg shop imm
466 //
467 def ldst_so_reg : Operand<i32>,
468                   ComplexPattern<i32, 3, "SelectLdStSOReg", []> {
469   let EncoderMethod = "getLdStSORegOpValue";
470   // FIXME: Simplify the printer
471   let PrintMethod = "printAddrMode2Operand";
472   let MIOperandInfo = (ops GPR:$base, GPR:$offsreg, i32imm:$offsimm);
473 }
474
475 // addrmode2 := reg +/- imm12
476 //           := reg +/- reg shop imm
477 //
478 def addrmode2 : Operand<i32>,
479                 ComplexPattern<i32, 3, "SelectAddrMode2", []> {
480   string EncoderMethod = "getAddrMode2OpValue";
481   let PrintMethod = "printAddrMode2Operand";
482   let MIOperandInfo = (ops GPR:$base, GPR:$offsreg, i32imm:$offsimm);
483 }
484
485 def am2offset : Operand<i32>,
486                 ComplexPattern<i32, 2, "SelectAddrMode2Offset",
487                 [], [SDNPWantRoot]> {
488   string EncoderMethod = "getAddrMode2OffsetOpValue";
489   let PrintMethod = "printAddrMode2OffsetOperand";
490   let MIOperandInfo = (ops GPR, i32imm);
491 }
492
493 // addrmode3 := reg +/- reg
494 // addrmode3 := reg +/- imm8
495 //
496 def addrmode3 : Operand<i32>,
497                 ComplexPattern<i32, 3, "SelectAddrMode3", []> {
498   let EncoderMethod = "getAddrMode3OpValue";
499   let PrintMethod = "printAddrMode3Operand";
500   let MIOperandInfo = (ops GPR:$base, GPR:$offsreg, i32imm:$offsimm);
501 }
502
503 def am3offset : Operand<i32>,
504                 ComplexPattern<i32, 2, "SelectAddrMode3Offset",
505                                [], [SDNPWantRoot]> {
506   let EncoderMethod = "getAddrMode3OffsetOpValue";
507   let PrintMethod = "printAddrMode3OffsetOperand";
508   let MIOperandInfo = (ops GPR, i32imm);
509 }
510
511 // ldstm_mode := {ia, ib, da, db}
512 //
513 def ldstm_mode : OptionalDefOperand<OtherVT, (ops i32), (ops (i32 1))> {
514   let EncoderMethod = "getLdStmModeOpValue";
515   let PrintMethod = "printLdStmModeOperand";
516 }
517
518 def MemMode5AsmOperand : AsmOperandClass {
519   let Name = "MemMode5";
520   let SuperClasses = [];
521 }
522
523 // addrmode5 := reg +/- imm8*4
524 //
525 def addrmode5 : Operand<i32>,
526                 ComplexPattern<i32, 2, "SelectAddrMode5", []> {
527   let PrintMethod = "printAddrMode5Operand";
528   let MIOperandInfo = (ops GPR:$base, i32imm);
529   let ParserMatchClass = MemMode5AsmOperand;
530   let EncoderMethod = "getAddrMode5OpValue";
531 }
532
533 // addrmode6 := reg with optional writeback
534 //
535 def addrmode6 : Operand<i32>,
536                 ComplexPattern<i32, 2, "SelectAddrMode6", [], [SDNPWantParent]>{
537   let PrintMethod = "printAddrMode6Operand";
538   let MIOperandInfo = (ops GPR:$addr, i32imm);
539   let EncoderMethod = "getAddrMode6AddressOpValue";
540 }
541
542 def am6offset : Operand<i32> {
543   let PrintMethod = "printAddrMode6OffsetOperand";
544   let MIOperandInfo = (ops GPR);
545   let EncoderMethod = "getAddrMode6OffsetOpValue";
546 }
547
548 // Special version of addrmode6 to handle alignment encoding for VLD-dup
549 // instructions, specifically VLD4-dup.
550 def addrmode6dup : Operand<i32>,
551                 ComplexPattern<i32, 2, "SelectAddrMode6", [], [SDNPWantParent]>{
552   let PrintMethod = "printAddrMode6Operand";
553   let MIOperandInfo = (ops GPR:$addr, i32imm);
554   let EncoderMethod = "getAddrMode6DupAddressOpValue";
555 }
556
557 // addrmodepc := pc + reg
558 //
559 def addrmodepc : Operand<i32>,
560                  ComplexPattern<i32, 2, "SelectAddrModePC", []> {
561   let PrintMethod = "printAddrModePCOperand";
562   let MIOperandInfo = (ops GPR, i32imm);
563 }
564
565 def nohash_imm : Operand<i32> {
566   let PrintMethod = "printNoHashImmediate";
567 }
568
569 //===----------------------------------------------------------------------===//
570
571 include "ARMInstrFormats.td"
572
573 //===----------------------------------------------------------------------===//
574 // Multiclass helpers...
575 //
576
577 /// AsI1_bin_irs - Defines a set of (op r, {so_imm|r|so_reg}) patterns for a
578 /// binop that produces a value.
579 multiclass AsI1_bin_irs<bits<4> opcod, string opc,
580                      InstrItinClass iii, InstrItinClass iir, InstrItinClass iis,
581                         PatFrag opnode, bit Commutable = 0> {
582   // The register-immediate version is re-materializable. This is useful
583   // in particular for taking the address of a local.
584   let isReMaterializable = 1 in {
585   def ri : AsI1<opcod, (outs GPR:$Rd), (ins GPR:$Rn, so_imm:$imm), DPFrm,
586                iii, opc, "\t$Rd, $Rn, $imm",
587                [(set GPR:$Rd, (opnode GPR:$Rn, so_imm:$imm))]> {
588     bits<4> Rd;
589     bits<4> Rn;
590     bits<12> imm;
591     let Inst{25} = 1;
592     let Inst{19-16} = Rn;
593     let Inst{15-12} = Rd;
594     let Inst{11-0} = imm;
595   }
596   }
597   def rr : AsI1<opcod, (outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm), DPFrm,
598                iir, opc, "\t$Rd, $Rn, $Rm",
599                [(set GPR:$Rd, (opnode GPR:$Rn, GPR:$Rm))]> {
600     bits<4> Rd;
601     bits<4> Rn;
602     bits<4> Rm;
603     let Inst{25} = 0;
604     let isCommutable = Commutable;
605     let Inst{19-16} = Rn;
606     let Inst{15-12} = Rd;
607     let Inst{11-4} = 0b00000000;
608     let Inst{3-0} = Rm;
609   }
610   def rs : AsI1<opcod, (outs GPR:$Rd), (ins GPR:$Rn, so_reg:$shift), DPSoRegFrm,
611                iis, opc, "\t$Rd, $Rn, $shift",
612                [(set GPR:$Rd, (opnode GPR:$Rn, so_reg:$shift))]> {
613     bits<4> Rd;
614     bits<4> Rn;
615     bits<12> shift;
616     let Inst{25} = 0;
617     let Inst{19-16} = Rn;
618     let Inst{15-12} = Rd;
619     let Inst{11-0} = shift;
620   }
621 }
622
623 /// AI1_bin_s_irs - Similar to AsI1_bin_irs except it sets the 's' bit so the
624 /// instruction modifies the CPSR register.
625 let Defs = [CPSR] in {
626 multiclass AI1_bin_s_irs<bits<4> opcod, string opc,
627                      InstrItinClass iii, InstrItinClass iir, InstrItinClass iis,
628                          PatFrag opnode, bit Commutable = 0> {
629   def ri : AI1<opcod, (outs GPR:$Rd), (ins GPR:$Rn, so_imm:$imm), DPFrm,
630                iii, opc, "\t$Rd, $Rn, $imm",
631                [(set GPR:$Rd, (opnode GPR:$Rn, so_imm:$imm))]> {
632     bits<4> Rd;
633     bits<4> Rn;
634     bits<12> imm;
635     let Inst{25} = 1;
636     let Inst{20} = 1;
637     let Inst{19-16} = Rn;
638     let Inst{15-12} = Rd;
639     let Inst{11-0} = imm;
640   }
641   def rr : AI1<opcod, (outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm), DPFrm,
642                iir, opc, "\t$Rd, $Rn, $Rm",
643                [(set GPR:$Rd, (opnode GPR:$Rn, GPR:$Rm))]> {
644     bits<4> Rd;
645     bits<4> Rn;
646     bits<4> Rm;
647     let isCommutable = Commutable;
648     let Inst{25} = 0;
649     let Inst{20} = 1;
650     let Inst{19-16} = Rn;
651     let Inst{15-12} = Rd;
652     let Inst{11-4} = 0b00000000;
653     let Inst{3-0} = Rm;
654   }
655   def rs : AI1<opcod, (outs GPR:$Rd), (ins GPR:$Rn, so_reg:$shift), DPSoRegFrm,
656                iis, opc, "\t$Rd, $Rn, $shift",
657                [(set GPR:$Rd, (opnode GPR:$Rn, so_reg:$shift))]> {
658     bits<4> Rd;
659     bits<4> Rn;
660     bits<12> shift;
661     let Inst{25} = 0;
662     let Inst{20} = 1;
663     let Inst{19-16} = Rn;
664     let Inst{15-12} = Rd;
665     let Inst{11-0} = shift;
666   }
667 }
668 }
669
670 /// AI1_cmp_irs - Defines a set of (op r, {so_imm|r|so_reg}) cmp / test
671 /// patterns. Similar to AsI1_bin_irs except the instruction does not produce
672 /// a explicit result, only implicitly set CPSR.
673 let isCompare = 1, Defs = [CPSR] in {
674 multiclass AI1_cmp_irs<bits<4> opcod, string opc,
675                      InstrItinClass iii, InstrItinClass iir, InstrItinClass iis,
676                        PatFrag opnode, bit Commutable = 0> {
677   def ri : AI1<opcod, (outs), (ins GPR:$Rn, so_imm:$imm), DPFrm, iii,
678                opc, "\t$Rn, $imm",
679                [(opnode GPR:$Rn, so_imm:$imm)]> {
680     bits<4> Rn;
681     bits<12> imm;
682     let Inst{25} = 1;
683     let Inst{20} = 1;
684     let Inst{19-16} = Rn;
685     let Inst{15-12} = 0b0000;
686     let Inst{11-0} = imm;
687   }
688   def rr : AI1<opcod, (outs), (ins GPR:$Rn, GPR:$Rm), DPFrm, iir,
689                opc, "\t$Rn, $Rm",
690                [(opnode GPR:$Rn, GPR:$Rm)]> {
691     bits<4> Rn;
692     bits<4> Rm;
693     let isCommutable = Commutable;
694     let Inst{25} = 0;
695     let Inst{20} = 1;
696     let Inst{19-16} = Rn;
697     let Inst{15-12} = 0b0000;
698     let Inst{11-4} = 0b00000000;
699     let Inst{3-0} = Rm;
700   }
701   def rs : AI1<opcod, (outs), (ins GPR:$Rn, so_reg:$shift), DPSoRegFrm, iis,
702                opc, "\t$Rn, $shift",
703                [(opnode GPR:$Rn, so_reg:$shift)]> {
704     bits<4> Rn;
705     bits<12> shift;
706     let Inst{25} = 0;
707     let Inst{20} = 1;
708     let Inst{19-16} = Rn;
709     let Inst{15-12} = 0b0000;
710     let Inst{11-0} = shift;
711   }
712 }
713 }
714
715 /// AI_ext_rrot - A unary operation with two forms: one whose operand is a
716 /// register and one whose operand is a register rotated by 8/16/24.
717 /// FIXME: Remove the 'r' variant. Its rot_imm is zero.
718 multiclass AI_ext_rrot<bits<8> opcod, string opc, PatFrag opnode> {
719   def r     : AExtI<opcod, (outs GPR:$Rd), (ins GPR:$Rm),
720                  IIC_iEXTr, opc, "\t$Rd, $Rm",
721                  [(set GPR:$Rd, (opnode GPR:$Rm))]>,
722               Requires<[IsARM, HasV6]> {
723     bits<4> Rd;
724     bits<4> Rm;
725     let Inst{19-16} = 0b1111;
726     let Inst{15-12} = Rd;
727     let Inst{11-10} = 0b00;
728     let Inst{3-0}   = Rm;
729   }
730   def r_rot : AExtI<opcod, (outs GPR:$Rd), (ins GPR:$Rm, rot_imm:$rot),
731                  IIC_iEXTr, opc, "\t$Rd, $Rm, ror $rot",
732                  [(set GPR:$Rd, (opnode (rotr GPR:$Rm, rot_imm:$rot)))]>,
733               Requires<[IsARM, HasV6]> {
734     bits<4> Rd;
735     bits<4> Rm;
736     bits<2> rot;
737     let Inst{19-16} = 0b1111;
738     let Inst{15-12} = Rd;
739     let Inst{11-10} = rot;
740     let Inst{3-0}   = Rm;
741   }
742 }
743
744 multiclass AI_ext_rrot_np<bits<8> opcod, string opc> {
745   def r     : AExtI<opcod, (outs GPR:$Rd), (ins GPR:$Rm),
746                  IIC_iEXTr, opc, "\t$Rd, $Rm",
747                  [/* For disassembly only; pattern left blank */]>,
748               Requires<[IsARM, HasV6]> {
749     let Inst{19-16} = 0b1111;
750     let Inst{11-10} = 0b00;
751   }
752   def r_rot : AExtI<opcod, (outs GPR:$Rd), (ins GPR:$Rm, rot_imm:$rot),
753                  IIC_iEXTr, opc, "\t$Rd, $Rm, ror $rot",
754                  [/* For disassembly only; pattern left blank */]>,
755               Requires<[IsARM, HasV6]> {
756     bits<2> rot;
757     let Inst{19-16} = 0b1111;
758     let Inst{11-10} = rot;
759   }
760 }
761
762 /// AI_exta_rrot - A binary operation with two forms: one whose operand is a
763 /// register and one whose operand is a register rotated by 8/16/24.
764 multiclass AI_exta_rrot<bits<8> opcod, string opc, PatFrag opnode> {
765   def rr     : AExtI<opcod, (outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm),
766                   IIC_iEXTAr, opc, "\t$Rd, $Rn, $Rm",
767                   [(set GPR:$Rd, (opnode GPR:$Rn, GPR:$Rm))]>,
768                Requires<[IsARM, HasV6]> {
769     bits<4> Rd;
770     bits<4> Rm;
771     bits<4> Rn;
772     let Inst{19-16} = Rn;
773     let Inst{15-12} = Rd;
774     let Inst{11-10} = 0b00;
775     let Inst{9-4}   = 0b000111;
776     let Inst{3-0}   = Rm;
777   }
778   def rr_rot : AExtI<opcod, (outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm,
779                                              rot_imm:$rot),
780                   IIC_iEXTAr, opc, "\t$Rd, $Rn, $Rm, ror $rot",
781                   [(set GPR:$Rd, (opnode GPR:$Rn,
782                                           (rotr GPR:$Rm, rot_imm:$rot)))]>,
783                   Requires<[IsARM, HasV6]> {
784     bits<4> Rd;
785     bits<4> Rm;
786     bits<4> Rn;
787     bits<2> rot;
788     let Inst{19-16} = Rn;
789     let Inst{15-12} = Rd;
790     let Inst{11-10} = rot;
791     let Inst{9-4}   = 0b000111;
792     let Inst{3-0}   = Rm;
793   }
794 }
795
796 // For disassembly only.
797 multiclass AI_exta_rrot_np<bits<8> opcod, string opc> {
798   def rr     : AExtI<opcod, (outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm),
799                   IIC_iEXTAr, opc, "\t$Rd, $Rn, $Rm",
800                   [/* For disassembly only; pattern left blank */]>,
801                Requires<[IsARM, HasV6]> {
802     let Inst{11-10} = 0b00;
803   }
804   def rr_rot : AExtI<opcod, (outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm,
805                                              rot_imm:$rot),
806                   IIC_iEXTAr, opc, "\t$Rd, $Rn, $Rm, ror $rot",
807                   [/* For disassembly only; pattern left blank */]>,
808                   Requires<[IsARM, HasV6]> {
809     bits<4> Rn;
810     bits<2> rot;
811     let Inst{19-16} = Rn;
812     let Inst{11-10} = rot;
813   }
814 }
815
816 /// AI1_adde_sube_irs - Define instructions and patterns for adde and sube.
817 let Uses = [CPSR] in {
818 multiclass AI1_adde_sube_irs<bits<4> opcod, string opc, PatFrag opnode,
819                              bit Commutable = 0> {
820   def ri : AsI1<opcod, (outs GPR:$Rd), (ins GPR:$Rn, so_imm:$imm),
821                 DPFrm, IIC_iALUi, opc, "\t$Rd, $Rn, $imm",
822                [(set GPR:$Rd, (opnode GPR:$Rn, so_imm:$imm))]>,
823                Requires<[IsARM]> {
824     bits<4> Rd;
825     bits<4> Rn;
826     bits<12> imm;
827     let Inst{25} = 1;
828     let Inst{15-12} = Rd;
829     let Inst{19-16} = Rn;
830     let Inst{11-0} = imm;
831   }
832   def rr : AsI1<opcod, (outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm),
833                 DPFrm, IIC_iALUr, opc, "\t$Rd, $Rn, $Rm",
834                [(set GPR:$Rd, (opnode GPR:$Rn, GPR:$Rm))]>,
835                Requires<[IsARM]> {
836     bits<4> Rd;
837     bits<4> Rn;
838     bits<4> Rm;
839     let Inst{11-4} = 0b00000000;
840     let Inst{25} = 0;
841     let isCommutable = Commutable;
842     let Inst{3-0} = Rm;
843     let Inst{15-12} = Rd;
844     let Inst{19-16} = Rn;
845   }
846   def rs : AsI1<opcod, (outs GPR:$Rd), (ins GPR:$Rn, so_reg:$shift),
847                 DPSoRegFrm, IIC_iALUsr, opc, "\t$Rd, $Rn, $shift",
848                [(set GPR:$Rd, (opnode GPR:$Rn, so_reg:$shift))]>,
849                Requires<[IsARM]> {
850     bits<4> Rd;
851     bits<4> Rn;
852     bits<12> shift;
853     let Inst{25} = 0;
854     let Inst{11-0} = shift;
855     let Inst{15-12} = Rd;
856     let Inst{19-16} = Rn;
857   }
858 }
859 // Carry setting variants
860 let Defs = [CPSR] in {
861 multiclass AI1_adde_sube_s_irs<bits<4> opcod, string opc, PatFrag opnode,
862                              bit Commutable = 0> {
863   def Sri : AXI1<opcod, (outs GPR:$Rd), (ins GPR:$Rn, so_imm:$imm),
864                 DPFrm, IIC_iALUi, !strconcat(opc, "\t$Rd, $Rn, $imm"),
865                [(set GPR:$Rd, (opnode GPR:$Rn, so_imm:$imm))]>,
866                Requires<[IsARM]> {
867     bits<4> Rd;
868     bits<4> Rn;
869     bits<12> imm;
870     let Inst{15-12} = Rd;
871     let Inst{19-16} = Rn;
872     let Inst{11-0} = imm;
873     let Inst{20} = 1;
874     let Inst{25} = 1;
875   }
876   def Srr : AXI1<opcod, (outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm),
877                 DPFrm, IIC_iALUr, !strconcat(opc, "\t$Rd, $Rn, $Rm"),
878                [(set GPR:$Rd, (opnode GPR:$Rn, GPR:$Rm))]>,
879                Requires<[IsARM]> {
880     bits<4> Rd;
881     bits<4> Rn;
882     bits<4> Rm;
883     let Inst{11-4} = 0b00000000;
884     let isCommutable = Commutable;
885     let Inst{3-0} = Rm;
886     let Inst{15-12} = Rd;
887     let Inst{19-16} = Rn;
888     let Inst{20} = 1;
889     let Inst{25} = 0;
890   }
891   def Srs : AXI1<opcod, (outs GPR:$Rd), (ins GPR:$Rn, so_reg:$shift),
892                 DPSoRegFrm, IIC_iALUsr, !strconcat(opc, "\t$Rd, $Rn, $shift"),
893                [(set GPR:$Rd, (opnode GPR:$Rn, so_reg:$shift))]>,
894                Requires<[IsARM]> {
895     bits<4> Rd;
896     bits<4> Rn;
897     bits<12> shift;
898     let Inst{11-0} = shift;
899     let Inst{15-12} = Rd;
900     let Inst{19-16} = Rn;
901     let Inst{20} = 1;
902     let Inst{25} = 0;
903   }
904 }
905 }
906 }
907
908 let canFoldAsLoad = 1, isReMaterializable = 1 in {
909 multiclass AI_ldr1<bit isByte, string opc, InstrItinClass iii,
910            InstrItinClass iir, PatFrag opnode> {
911   // Note: We use the complex addrmode_imm12 rather than just an input
912   // GPR and a constrained immediate so that we can use this to match
913   // frame index references and avoid matching constant pool references.
914   def i12: AI2ldst<0b010, 1, isByte, (outs GPR:$Rt), (ins addrmode_imm12:$addr),
915                    AddrMode_i12, LdFrm, iii, opc, "\t$Rt, $addr",
916                   [(set GPR:$Rt, (opnode addrmode_imm12:$addr))]> {
917     bits<4>  Rt;
918     bits<17> addr;
919     let Inst{23}    = addr{12};     // U (add = ('U' == 1))
920     let Inst{19-16} = addr{16-13};  // Rn
921     let Inst{15-12} = Rt;
922     let Inst{11-0}  = addr{11-0};   // imm12
923   }
924   def rs : AI2ldst<0b011, 1, isByte, (outs GPR:$Rt), (ins ldst_so_reg:$shift),
925                   AddrModeNone, LdFrm, iir, opc, "\t$Rt, $shift",
926                  [(set GPR:$Rt, (opnode ldst_so_reg:$shift))]> {
927     bits<4>  Rt;
928     bits<17> shift;
929     let Inst{23}    = shift{12};    // U (add = ('U' == 1))
930     let Inst{19-16} = shift{16-13}; // Rn
931     let Inst{15-12} = Rt;
932     let Inst{11-0}  = shift{11-0};
933   }
934 }
935 }
936
937 multiclass AI_str1<bit isByte, string opc, InstrItinClass iii,
938            InstrItinClass iir, PatFrag opnode> {
939   // Note: We use the complex addrmode_imm12 rather than just an input
940   // GPR and a constrained immediate so that we can use this to match
941   // frame index references and avoid matching constant pool references.
942   def i12 : AI2ldst<0b010, 0, isByte, (outs),
943                    (ins GPR:$Rt, addrmode_imm12:$addr),
944                    AddrMode_i12, StFrm, iii, opc, "\t$Rt, $addr",
945                   [(opnode GPR:$Rt, addrmode_imm12:$addr)]> {
946     bits<4> Rt;
947     bits<17> addr;
948     let Inst{23}    = addr{12};     // U (add = ('U' == 1))
949     let Inst{19-16} = addr{16-13};  // Rn
950     let Inst{15-12} = Rt;
951     let Inst{11-0}  = addr{11-0};   // imm12
952   }
953   def rs : AI2ldst<0b011, 0, isByte, (outs), (ins GPR:$Rt, ldst_so_reg:$shift),
954                   AddrModeNone, StFrm, iir, opc, "\t$Rt, $shift",
955                  [(opnode GPR:$Rt, ldst_so_reg:$shift)]> {
956     bits<4> Rt;
957     bits<17> shift;
958     let Inst{23}    = shift{12};    // U (add = ('U' == 1))
959     let Inst{19-16} = shift{16-13}; // Rn
960     let Inst{15-12} = Rt;
961     let Inst{11-0}  = shift{11-0};
962   }
963 }
964 //===----------------------------------------------------------------------===//
965 // Instructions
966 //===----------------------------------------------------------------------===//
967
968 //===----------------------------------------------------------------------===//
969 //  Miscellaneous Instructions.
970 //
971
972 /// CONSTPOOL_ENTRY - This instruction represents a floating constant pool in
973 /// the function.  The first operand is the ID# for this instruction, the second
974 /// is the index into the MachineConstantPool that this is, the third is the
975 /// size in bytes of this constant pool entry.
976 let neverHasSideEffects = 1, isNotDuplicable = 1 in
977 def CONSTPOOL_ENTRY :
978 PseudoInst<(outs), (ins cpinst_operand:$instid, cpinst_operand:$cpidx,
979                     i32imm:$size), NoItinerary, []>;
980
981 // FIXME: Marking these as hasSideEffects is necessary to prevent machine DCE
982 // from removing one half of the matched pairs. That breaks PEI, which assumes
983 // these will always be in pairs, and asserts if it finds otherwise. Better way?
984 let Defs = [SP], Uses = [SP], hasSideEffects = 1 in {
985 def ADJCALLSTACKUP :
986 PseudoInst<(outs), (ins i32imm:$amt1, i32imm:$amt2, pred:$p), NoItinerary,
987            [(ARMcallseq_end timm:$amt1, timm:$amt2)]>;
988
989 def ADJCALLSTACKDOWN :
990 PseudoInst<(outs), (ins i32imm:$amt, pred:$p), NoItinerary,
991            [(ARMcallseq_start timm:$amt)]>;
992 }
993
994 def NOP : AI<(outs), (ins), MiscFrm, NoItinerary, "nop", "",
995              [/* For disassembly only; pattern left blank */]>,
996           Requires<[IsARM, HasV6T2]> {
997   let Inst{27-16} = 0b001100100000;
998   let Inst{15-8} = 0b11110000;
999   let Inst{7-0} = 0b00000000;
1000 }
1001
1002 def YIELD : AI<(outs), (ins), MiscFrm, NoItinerary, "yield", "",
1003              [/* For disassembly only; pattern left blank */]>,
1004           Requires<[IsARM, HasV6T2]> {
1005   let Inst{27-16} = 0b001100100000;
1006   let Inst{15-8} = 0b11110000;
1007   let Inst{7-0} = 0b00000001;
1008 }
1009
1010 def WFE : AI<(outs), (ins), MiscFrm, NoItinerary, "wfe", "",
1011              [/* For disassembly only; pattern left blank */]>,
1012           Requires<[IsARM, HasV6T2]> {
1013   let Inst{27-16} = 0b001100100000;
1014   let Inst{15-8} = 0b11110000;
1015   let Inst{7-0} = 0b00000010;
1016 }
1017
1018 def WFI : AI<(outs), (ins), MiscFrm, NoItinerary, "wfi", "",
1019              [/* For disassembly only; pattern left blank */]>,
1020           Requires<[IsARM, HasV6T2]> {
1021   let Inst{27-16} = 0b001100100000;
1022   let Inst{15-8} = 0b11110000;
1023   let Inst{7-0} = 0b00000011;
1024 }
1025
1026 def SEL : AI<(outs GPR:$dst), (ins GPR:$a, GPR:$b), DPFrm, NoItinerary, "sel",
1027              "\t$dst, $a, $b",
1028              [/* For disassembly only; pattern left blank */]>,
1029           Requires<[IsARM, HasV6]> {
1030   bits<4> Rd;
1031   bits<4> Rn;
1032   bits<4> Rm;
1033   let Inst{3-0} = Rm;
1034   let Inst{15-12} = Rd;
1035   let Inst{19-16} = Rn;
1036   let Inst{27-20} = 0b01101000;
1037   let Inst{7-4} = 0b1011;
1038   let Inst{11-8} = 0b1111;
1039 }
1040
1041 def SEV : AI<(outs), (ins), MiscFrm, NoItinerary, "sev", "",
1042              [/* For disassembly only; pattern left blank */]>,
1043           Requires<[IsARM, HasV6T2]> {
1044   let Inst{27-16} = 0b001100100000;
1045   let Inst{15-8} = 0b11110000;
1046   let Inst{7-0} = 0b00000100;
1047 }
1048
1049 // The i32imm operand $val can be used by a debugger to store more information
1050 // about the breakpoint.
1051 def BKPT : AI<(outs), (ins i32imm:$val), MiscFrm, NoItinerary, "bkpt", "\t$val",
1052               [/* For disassembly only; pattern left blank */]>,
1053            Requires<[IsARM]> {
1054   bits<16> val;
1055   let Inst{3-0} = val{3-0};
1056   let Inst{19-8} = val{15-4};
1057   let Inst{27-20} = 0b00010010;
1058   let Inst{7-4} = 0b0111;
1059 }
1060
1061 // Change Processor State is a system instruction -- for disassembly only.
1062 // The singleton $opt operand contains the following information:
1063 // opt{4-0} = mode from Inst{4-0}
1064 // opt{5} = changemode from Inst{17}
1065 // opt{8-6} = AIF from Inst{8-6}
1066 // opt{10-9} = imod from Inst{19-18} with 0b10 as enable and 0b11 as disable
1067 // FIXME: Integrated assembler will need these split out.
1068 def CPS : AXI<(outs), (ins cps_opt:$opt), MiscFrm, NoItinerary, "cps$opt",
1069               [/* For disassembly only; pattern left blank */]>,
1070           Requires<[IsARM]> {
1071   let Inst{31-28} = 0b1111;
1072   let Inst{27-20} = 0b00010000;
1073   let Inst{16} = 0;
1074   let Inst{5} = 0;
1075 }
1076
1077 // Preload signals the memory system of possible future data/instruction access.
1078 // These are for disassembly only.
1079 multiclass APreLoad<bits<1> read, bits<1> data, string opc> {
1080
1081   def i12 : AXI<(outs), (ins addrmode_imm12:$addr), MiscFrm, IIC_Preload,
1082                 !strconcat(opc, "\t$addr"),
1083                 [(ARMPreload addrmode_imm12:$addr, (i32 read), (i32 data))]> {
1084     bits<4> Rt;
1085     bits<17> addr;
1086     let Inst{31-26} = 0b111101;
1087     let Inst{25} = 0; // 0 for immediate form
1088     let Inst{24} = data;
1089     let Inst{23} = addr{12};        // U (add = ('U' == 1))
1090     let Inst{22} = read;
1091     let Inst{21-20} = 0b01;
1092     let Inst{19-16} = addr{16-13};  // Rn
1093     let Inst{15-12} = Rt;
1094     let Inst{11-0}  = addr{11-0};   // imm12
1095   }
1096
1097   def rs : AXI<(outs), (ins ldst_so_reg:$shift), MiscFrm, IIC_Preload,
1098                !strconcat(opc, "\t$shift"),
1099                [(ARMPreload ldst_so_reg:$shift, (i32 read), (i32 data))]> {
1100     bits<4> Rt;
1101     bits<17> shift;
1102     let Inst{31-26} = 0b111101;
1103     let Inst{25} = 1; // 1 for register form
1104     let Inst{24} = data;
1105     let Inst{23} = shift{12};    // U (add = ('U' == 1))
1106     let Inst{22} = read;
1107     let Inst{21-20} = 0b01;
1108     let Inst{19-16} = shift{16-13}; // Rn
1109     let Inst{11-0}  = shift{11-0};
1110   }
1111 }
1112
1113 defm PLD  : APreLoad<1, 1, "pld">,  Requires<[IsARM]>;
1114 defm PLDW : APreLoad<0, 1, "pldw">, Requires<[IsARM,HasV7,HasMP]>;
1115 defm PLI  : APreLoad<1, 0, "pli">,  Requires<[IsARM,HasV7]>;
1116
1117 def SETEND : AXI<(outs),(ins setend_op:$end), MiscFrm, NoItinerary,
1118                  "setend\t$end",
1119                  [/* For disassembly only; pattern left blank */]>,
1120                Requires<[IsARM]> {
1121   bits<1> end;
1122   let Inst{31-10} = 0b1111000100000001000000;
1123   let Inst{9} = end;
1124   let Inst{8-0} = 0;
1125 }
1126
1127 def DBG : AI<(outs), (ins i32imm:$opt), MiscFrm, NoItinerary, "dbg", "\t$opt",
1128              [/* For disassembly only; pattern left blank */]>,
1129           Requires<[IsARM, HasV7]> {
1130   bits<4> opt;
1131   let Inst{27-4} = 0b001100100000111100001111;
1132   let Inst{3-0} = opt;
1133 }
1134
1135 // A5.4 Permanently UNDEFINED instructions.
1136 let isBarrier = 1, isTerminator = 1 in
1137 def TRAP : AXI<(outs), (ins), MiscFrm, NoItinerary,
1138                "trap", [(trap)]>,
1139            Requires<[IsARM]> {
1140   let Inst = 0xe7ffdefe;
1141 }
1142
1143 // Address computation and loads and stores in PIC mode.
1144 let isNotDuplicable = 1 in {
1145 def PICADD  : ARMPseudoInst<(outs GPR:$dst), (ins GPR:$a, pclabel:$cp, pred:$p),
1146                             Size4Bytes, IIC_iALUr,
1147                             [(set GPR:$dst, (ARMpic_add GPR:$a, imm:$cp))]>;
1148
1149 let AddedComplexity = 10 in {
1150 def PICLDR  : ARMPseudoInst<(outs GPR:$dst), (ins addrmodepc:$addr, pred:$p),
1151                             Size4Bytes, IIC_iLoad_r,
1152                             [(set GPR:$dst, (load addrmodepc:$addr))]>;
1153
1154 def PICLDRH : ARMPseudoInst<(outs GPR:$Rt), (ins addrmodepc:$addr, pred:$p),
1155                             Size4Bytes, IIC_iLoad_bh_r,
1156                             [(set GPR:$Rt, (zextloadi16 addrmodepc:$addr))]>;
1157
1158 def PICLDRB : ARMPseudoInst<(outs GPR:$Rt), (ins addrmodepc:$addr, pred:$p),
1159                             Size4Bytes, IIC_iLoad_bh_r,
1160                             [(set GPR:$Rt, (zextloadi8 addrmodepc:$addr))]>;
1161
1162 def PICLDRSH : ARMPseudoInst<(outs GPR:$Rt), (ins addrmodepc:$addr, pred:$p),
1163                             Size4Bytes, IIC_iLoad_bh_r,
1164                             [(set GPR:$Rt, (sextloadi16 addrmodepc:$addr))]>;
1165
1166 def PICLDRSB : ARMPseudoInst<(outs GPR:$Rt), (ins addrmodepc:$addr, pred:$p),
1167                             Size4Bytes, IIC_iLoad_bh_r,
1168                             [(set GPR:$Rt, (sextloadi8 addrmodepc:$addr))]>;
1169 }
1170 let AddedComplexity = 10 in {
1171 def PICSTR  : ARMPseudoInst<(outs), (ins GPR:$src, addrmodepc:$addr, pred:$p),
1172       Size4Bytes, IIC_iStore_r, [(store GPR:$src, addrmodepc:$addr)]>;
1173
1174 def PICSTRH : ARMPseudoInst<(outs), (ins GPR:$src, addrmodepc:$addr, pred:$p),
1175       Size4Bytes, IIC_iStore_bh_r, [(truncstorei16 GPR:$src, addrmodepc:$addr)]>;
1176
1177 def PICSTRB : ARMPseudoInst<(outs), (ins GPR:$src, addrmodepc:$addr, pred:$p),
1178       Size4Bytes, IIC_iStore_bh_r, [(truncstorei8 GPR:$src, addrmodepc:$addr)]>;
1179 }
1180 } // isNotDuplicable = 1
1181
1182
1183 // LEApcrel - Load a pc-relative address into a register without offending the
1184 // assembler.
1185 let neverHasSideEffects = 1, isReMaterializable = 1 in
1186 // The 'adr' mnemonic encodes differently if the label is before or after
1187 // the instruction. The {24-21} opcode bits are set by the fixup, as we don't
1188 // know until then which form of the instruction will be used.
1189 def ADR : AI1<0, (outs GPR:$Rd), (ins adrlabel:$label),
1190                  MiscFrm, IIC_iALUi, "adr", "\t$Rd, #$label", []> {
1191   bits<4> Rd;
1192   bits<12> label;
1193   let Inst{27-25} = 0b001;
1194   let Inst{20} = 0;
1195   let Inst{19-16} = 0b1111;
1196   let Inst{15-12} = Rd;
1197   let Inst{11-0} = label;
1198 }
1199 def LEApcrel : ARMPseudoInst<(outs GPR:$Rd), (ins i32imm:$label, pred:$p),
1200                     Size4Bytes, IIC_iALUi, []>;
1201
1202 def LEApcrelJT : ARMPseudoInst<(outs GPR:$Rd),
1203                       (ins i32imm:$label, nohash_imm:$id, pred:$p),
1204                       Size4Bytes, IIC_iALUi, []>;
1205
1206 //===----------------------------------------------------------------------===//
1207 //  Control Flow Instructions.
1208 //
1209
1210 let isReturn = 1, isTerminator = 1, isBarrier = 1 in {
1211   // ARMV4T and above
1212   def BX_RET : AI<(outs), (ins), BrMiscFrm, IIC_Br,
1213                   "bx", "\tlr", [(ARMretflag)]>,
1214                Requires<[IsARM, HasV4T]> {
1215     let Inst{27-0}  = 0b0001001011111111111100011110;
1216   }
1217
1218   // ARMV4 only
1219   def MOVPCLR : AI<(outs), (ins), BrMiscFrm, IIC_Br,
1220                   "mov", "\tpc, lr", [(ARMretflag)]>,
1221                Requires<[IsARM, NoV4T]> {
1222     let Inst{27-0} = 0b0001101000001111000000001110;
1223   }
1224 }
1225
1226 // Indirect branches
1227 let isBranch = 1, isTerminator = 1, isBarrier = 1, isIndirectBranch = 1 in {
1228   // ARMV4T and above
1229   def BX : AXI<(outs), (ins GPR:$dst), BrMiscFrm, IIC_Br, "bx\t$dst",
1230                   [(brind GPR:$dst)]>,
1231               Requires<[IsARM, HasV4T]> {
1232     bits<4> dst;
1233     let Inst{31-4} = 0b1110000100101111111111110001;
1234     let Inst{3-0}  = dst;
1235   }
1236
1237   // ARMV4 only
1238   // FIXME: We would really like to define this as a vanilla ARMPat like:
1239   // ARMPat<(brind GPR:$dst), (MOVr PC, GPR:$dst)>
1240   // With that, however, we can't set isBranch, isTerminator, etc..
1241   def MOVPCRX : ARMPseudoInst<(outs), (ins GPR:$dst),
1242                     Size4Bytes, IIC_Br, [(brind GPR:$dst)]>,
1243                     Requires<[IsARM, NoV4T]>;
1244 }
1245
1246 // All calls clobber the non-callee saved registers. SP is marked as
1247 // a use to prevent stack-pointer assignments that appear immediately
1248 // before calls from potentially appearing dead.
1249 let isCall = 1,
1250   // On non-Darwin platforms R9 is callee-saved.
1251   Defs = [R0,  R1,  R2,  R3,  R12, LR,
1252           D0,  D1,  D2,  D3,  D4,  D5,  D6,  D7,
1253           D16, D17, D18, D19, D20, D21, D22, D23,
1254           D24, D25, D26, D27, D28, D29, D30, D31, CPSR, FPSCR],
1255   Uses = [SP] in {
1256   def BL  : ABXI<0b1011, (outs), (ins bltarget:$func, variable_ops),
1257                 IIC_Br, "bl\t$func",
1258                 [(ARMcall tglobaladdr:$func)]>,
1259             Requires<[IsARM, IsNotDarwin]> {
1260     let Inst{31-28} = 0b1110;
1261     bits<24> func;
1262     let Inst{23-0} = func;
1263   }
1264
1265   def BL_pred : ABI<0b1011, (outs), (ins bltarget:$func, variable_ops),
1266                    IIC_Br, "bl", "\t$func",
1267                    [(ARMcall_pred tglobaladdr:$func)]>,
1268                 Requires<[IsARM, IsNotDarwin]> {
1269     bits<24> func;
1270     let Inst{23-0} = func;
1271   }
1272
1273   // ARMv5T and above
1274   def BLX : AXI<(outs), (ins GPR:$func, variable_ops), BrMiscFrm,
1275                 IIC_Br, "blx\t$func",
1276                 [(ARMcall GPR:$func)]>,
1277             Requires<[IsARM, HasV5T, IsNotDarwin]> {
1278     bits<4> func;
1279     let Inst{31-4} = 0b1110000100101111111111110011;
1280     let Inst{3-0}   = func;
1281   }
1282
1283   // ARMv4T
1284   // Note: Restrict $func to the tGPR regclass to prevent it being in LR.
1285   def BX_CALL : ARMPseudoInst<(outs), (ins tGPR:$func, variable_ops),
1286                    Size8Bytes, IIC_Br, [(ARMcall_nolink tGPR:$func)]>,
1287                    Requires<[IsARM, HasV4T, IsNotDarwin]>;
1288
1289   // ARMv4
1290   def BMOVPCRX_CALL : ARMPseudoInst<(outs), (ins tGPR:$func, variable_ops),
1291                    Size8Bytes, IIC_Br, [(ARMcall_nolink tGPR:$func)]>,
1292                    Requires<[IsARM, NoV4T, IsNotDarwin]>;
1293 }
1294
1295 let isCall = 1,
1296   // On Darwin R9 is call-clobbered.
1297   // R7 is marked as a use to prevent frame-pointer assignments from being
1298   // moved above / below calls.
1299   Defs = [R0,  R1,  R2,  R3,  R9,  R12, LR,
1300           D0,  D1,  D2,  D3,  D4,  D5,  D6,  D7,
1301           D16, D17, D18, D19, D20, D21, D22, D23,
1302           D24, D25, D26, D27, D28, D29, D30, D31, CPSR, FPSCR],
1303   Uses = [R7, SP] in {
1304   def BLr9  : ABXI<0b1011, (outs), (ins bltarget:$func, variable_ops),
1305                 IIC_Br, "bl\t$func",
1306                 [(ARMcall tglobaladdr:$func)]>, Requires<[IsARM, IsDarwin]> {
1307     let Inst{31-28} = 0b1110;
1308     bits<24> func;
1309     let Inst{23-0} = func;
1310   }
1311
1312   def BLr9_pred : ABI<0b1011, (outs), (ins bltarget:$func, variable_ops),
1313                    IIC_Br, "bl", "\t$func",
1314                    [(ARMcall_pred tglobaladdr:$func)]>,
1315                   Requires<[IsARM, IsDarwin]> {
1316     bits<24> func;
1317     let Inst{23-0} = func;
1318   }
1319
1320   // ARMv5T and above
1321   def BLXr9 : AXI<(outs), (ins GPR:$func, variable_ops), BrMiscFrm,
1322                 IIC_Br, "blx\t$func",
1323                 [(ARMcall GPR:$func)]>, Requires<[IsARM, HasV5T, IsDarwin]> {
1324     bits<4> func;
1325     let Inst{31-4} = 0b1110000100101111111111110011;
1326     let Inst{3-0}   = func;
1327   }
1328
1329   // ARMv4T
1330   // Note: Restrict $func to the tGPR regclass to prevent it being in LR.
1331   def BXr9_CALL : ARMPseudoInst<(outs), (ins tGPR:$func, variable_ops),
1332                   Size8Bytes, IIC_Br, [(ARMcall_nolink tGPR:$func)]>,
1333                   Requires<[IsARM, HasV4T, IsDarwin]>;
1334
1335   // ARMv4
1336   def BMOVPCRXr9_CALL : ARMPseudoInst<(outs), (ins tGPR:$func, variable_ops),
1337                   Size8Bytes, IIC_Br, [(ARMcall_nolink tGPR:$func)]>,
1338                   Requires<[IsARM, NoV4T, IsDarwin]>;
1339 }
1340
1341 // Tail calls.
1342
1343 // FIXME: These should probably be xformed into the non-TC versions of the
1344 // instructions as part of MC lowering.
1345 // FIXME: These seem to be used for both Thumb and ARM instruction selection.
1346 // Thumb should have its own version since the instruction is actually
1347 // different, even though the mnemonic is the same.
1348 let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1 in {
1349   // Darwin versions.
1350   let Defs = [R0, R1, R2, R3, R9, R12,
1351               D0, D1, D2, D3, D4, D5, D6, D7,
1352               D16, D17, D18, D19, D20, D21, D22, D23, D24, D25, D26,
1353               D27, D28, D29, D30, D31, PC],
1354       Uses = [SP] in {
1355     def TCRETURNdi : PseudoInst<(outs), (ins i32imm:$dst, variable_ops),
1356                        IIC_Br, []>, Requires<[IsDarwin]>;
1357
1358     def TCRETURNri : PseudoInst<(outs), (ins tcGPR:$dst, variable_ops),
1359                        IIC_Br, []>, Requires<[IsDarwin]>;
1360
1361     def TAILJMPd : ABXI<0b1010, (outs), (ins brtarget:$dst, variable_ops),
1362                    IIC_Br, "b\t$dst  @ TAILCALL",
1363                    []>, Requires<[IsARM, IsDarwin]>;
1364
1365     def TAILJMPdt: ABXI<0b1010, (outs), (ins brtarget:$dst, variable_ops),
1366                    IIC_Br, "b.w\t$dst  @ TAILCALL",
1367                    []>, Requires<[IsThumb, IsDarwin]>;
1368
1369     def TAILJMPr : AXI<(outs), (ins tcGPR:$dst, variable_ops),
1370                      BrMiscFrm, IIC_Br, "bx\t$dst  @ TAILCALL",
1371                    []>, Requires<[IsDarwin]> {
1372       bits<4> dst;
1373       let Inst{31-4} = 0b1110000100101111111111110001;
1374       let Inst{3-0}  = dst;
1375     }
1376   }
1377
1378   // Non-Darwin versions (the difference is R9).
1379   let Defs = [R0, R1, R2, R3, R12,
1380               D0, D1, D2, D3, D4, D5, D6, D7,
1381               D16, D17, D18, D19, D20, D21, D22, D23, D24, D25, D26,
1382               D27, D28, D29, D30, D31, PC],
1383       Uses = [SP] in {
1384     def TCRETURNdiND : PseudoInst<(outs), (ins i32imm:$dst, variable_ops),
1385                        IIC_Br, []>, Requires<[IsNotDarwin]>;
1386
1387     def TCRETURNriND : PseudoInst<(outs), (ins tcGPR:$dst, variable_ops),
1388                        IIC_Br, []>, Requires<[IsNotDarwin]>;
1389
1390     def TAILJMPdND : ABXI<0b1010, (outs), (ins brtarget:$dst, variable_ops),
1391                    IIC_Br, "b\t$dst  @ TAILCALL",
1392                    []>, Requires<[IsARM, IsNotDarwin]>;
1393
1394     def TAILJMPdNDt : ABXI<0b1010, (outs), (ins brtarget:$dst, variable_ops),
1395                    IIC_Br, "b.w\t$dst  @ TAILCALL",
1396                    []>, Requires<[IsThumb, IsNotDarwin]>;
1397
1398     def TAILJMPrND : AXI<(outs), (ins tcGPR:$dst, variable_ops),
1399                      BrMiscFrm, IIC_Br, "bx\t$dst  @ TAILCALL",
1400                    []>, Requires<[IsNotDarwin]> {
1401       bits<4> dst;
1402       let Inst{31-4} = 0b1110000100101111111111110001;
1403       let Inst{3-0}  = dst;
1404     }
1405   }
1406 }
1407
1408 let isBranch = 1, isTerminator = 1 in {
1409   // B is "predicable" since it can be xformed into a Bcc.
1410   let isBarrier = 1 in {
1411     let isPredicable = 1 in
1412     def B : ABXI<0b1010, (outs), (ins brtarget:$target), IIC_Br,
1413                 "b\t$target", [(br bb:$target)]> {
1414       bits<24> target;
1415       let Inst{31-28} = 0b1110;
1416       let Inst{23-0} = target;
1417     }
1418
1419     let isNotDuplicable = 1, isIndirectBranch = 1 in {
1420     def BR_JTr : ARMPseudoInst<(outs),
1421                       (ins GPR:$target, i32imm:$jt, i32imm:$id),
1422                       SizeSpecial, IIC_Br,
1423                       [(ARMbrjt GPR:$target, tjumptable:$jt, imm:$id)]>;
1424     // FIXME: This shouldn't use the generic "addrmode2," but rather be split
1425     // into i12 and rs suffixed versions.
1426     def BR_JTm : ARMPseudoInst<(outs),
1427                      (ins addrmode2:$target, i32imm:$jt, i32imm:$id),
1428                      SizeSpecial, IIC_Br,
1429                      [(ARMbrjt (i32 (load addrmode2:$target)), tjumptable:$jt,
1430                        imm:$id)]>;
1431     def BR_JTadd : ARMPseudoInst<(outs),
1432                    (ins GPR:$target, GPR:$idx, i32imm:$jt, i32imm:$id),
1433                    SizeSpecial, IIC_Br,
1434                    [(ARMbrjt (add GPR:$target, GPR:$idx), tjumptable:$jt,
1435                      imm:$id)]>;
1436     } // isNotDuplicable = 1, isIndirectBranch = 1
1437   } // isBarrier = 1
1438
1439   // FIXME: should be able to write a pattern for ARMBrcond, but can't use
1440   // a two-value operand where a dag node expects two operands. :(
1441   def Bcc : ABI<0b1010, (outs), (ins brtarget:$target),
1442                IIC_Br, "b", "\t$target",
1443                [/*(ARMbrcond bb:$target, imm:$cc, CCR:$ccr)*/]> {
1444     bits<24> target;
1445     let Inst{23-0} = target;
1446   }
1447 }
1448
1449 // Branch and Exchange Jazelle -- for disassembly only
1450 def BXJ : ABI<0b0001, (outs), (ins GPR:$func), NoItinerary, "bxj", "\t$func",
1451               [/* For disassembly only; pattern left blank */]> {
1452   let Inst{23-20} = 0b0010;
1453   //let Inst{19-8} = 0xfff;
1454   let Inst{7-4} = 0b0010;
1455 }
1456
1457 // Secure Monitor Call is a system instruction -- for disassembly only
1458 def SMC : ABI<0b0001, (outs), (ins i32imm:$opt), NoItinerary, "smc", "\t$opt",
1459               [/* For disassembly only; pattern left blank */]> {
1460   bits<4> opt;
1461   let Inst{23-4} = 0b01100000000000000111;
1462   let Inst{3-0} = opt;
1463 }
1464
1465 // Supervisor Call (Software Interrupt) -- for disassembly only
1466 let isCall = 1, Uses = [SP] in {
1467 def SVC : ABI<0b1111, (outs), (ins i32imm:$svc), IIC_Br, "svc", "\t$svc",
1468               [/* For disassembly only; pattern left blank */]> {
1469   bits<24> svc;
1470   let Inst{23-0} = svc;
1471 }
1472 }
1473
1474 // Store Return State is a system instruction -- for disassembly only
1475 let isCodeGenOnly = 1 in {  // FIXME: This should not use submode!
1476 def SRSW : ABXI<{1,0,0,?}, (outs), (ins ldstm_mode:$amode, i32imm:$mode),
1477                 NoItinerary, "srs${amode}\tsp!, $mode",
1478                 [/* For disassembly only; pattern left blank */]> {
1479   let Inst{31-28} = 0b1111;
1480   let Inst{22-20} = 0b110; // W = 1
1481 }
1482
1483 def SRS  : ABXI<{1,0,0,?}, (outs), (ins ldstm_mode:$amode, i32imm:$mode),
1484                 NoItinerary, "srs${amode}\tsp, $mode",
1485                 [/* For disassembly only; pattern left blank */]> {
1486   let Inst{31-28} = 0b1111;
1487   let Inst{22-20} = 0b100; // W = 0
1488 }
1489
1490 // Return From Exception is a system instruction -- for disassembly only
1491 def RFEW : ABXI<{1,0,0,?}, (outs), (ins ldstm_mode:$amode, GPR:$base),
1492                 NoItinerary, "rfe${amode}\t$base!",
1493                 [/* For disassembly only; pattern left blank */]> {
1494   let Inst{31-28} = 0b1111;
1495   let Inst{22-20} = 0b011; // W = 1
1496 }
1497
1498 def RFE  : ABXI<{1,0,0,?}, (outs), (ins ldstm_mode:$amode, GPR:$base),
1499                 NoItinerary, "rfe${amode}\t$base",
1500                 [/* For disassembly only; pattern left blank */]> {
1501   let Inst{31-28} = 0b1111;
1502   let Inst{22-20} = 0b001; // W = 0
1503 }
1504 } // isCodeGenOnly = 1
1505
1506 //===----------------------------------------------------------------------===//
1507 //  Load / store Instructions.
1508 //
1509
1510 // Load
1511
1512
1513 defm LDR  : AI_ldr1<0, "ldr", IIC_iLoad_r, IIC_iLoad_si,
1514                     UnOpFrag<(load node:$Src)>>;
1515 defm LDRB : AI_ldr1<1, "ldrb", IIC_iLoad_bh_r, IIC_iLoad_bh_si,
1516                     UnOpFrag<(zextloadi8 node:$Src)>>;
1517 defm STR  : AI_str1<0, "str", IIC_iStore_r, IIC_iStore_si,
1518                    BinOpFrag<(store node:$LHS, node:$RHS)>>;
1519 defm STRB : AI_str1<1, "strb", IIC_iStore_bh_r, IIC_iStore_bh_si,
1520                    BinOpFrag<(truncstorei8 node:$LHS, node:$RHS)>>;
1521
1522 // Special LDR for loads from non-pc-relative constpools.
1523 let canFoldAsLoad = 1, mayLoad = 1, neverHasSideEffects = 1,
1524     isReMaterializable = 1 in
1525 def LDRcp : AI2ldst<0b010, 1, 0, (outs GPR:$Rt), (ins addrmode_imm12:$addr),
1526                  AddrMode_i12, LdFrm, IIC_iLoad_r, "ldr", "\t$Rt, $addr",
1527                  []> {
1528   bits<4> Rt;
1529   bits<17> addr;
1530   let Inst{23}    = addr{12};     // U (add = ('U' == 1))
1531   let Inst{19-16} = 0b1111;
1532   let Inst{15-12} = Rt;
1533   let Inst{11-0}  = addr{11-0};   // imm12
1534 }
1535
1536 // Loads with zero extension
1537 def LDRH  : AI3ld<0b1011, 1, (outs GPR:$Rt), (ins addrmode3:$addr), LdMiscFrm,
1538                   IIC_iLoad_bh_r, "ldrh", "\t$Rt, $addr",
1539                   [(set GPR:$Rt, (zextloadi16 addrmode3:$addr))]>;
1540
1541 // Loads with sign extension
1542 def LDRSH : AI3ld<0b1111, 1, (outs GPR:$Rt), (ins addrmode3:$addr), LdMiscFrm,
1543                    IIC_iLoad_bh_r, "ldrsh", "\t$Rt, $addr",
1544                    [(set GPR:$Rt, (sextloadi16 addrmode3:$addr))]>;
1545
1546 def LDRSB : AI3ld<0b1101, 1, (outs GPR:$Rt), (ins addrmode3:$addr), LdMiscFrm,
1547                    IIC_iLoad_bh_r, "ldrsb", "\t$Rt, $addr",
1548                    [(set GPR:$Rt, (sextloadi8 addrmode3:$addr))]>;
1549
1550 let mayLoad = 1, neverHasSideEffects = 1, hasExtraDefRegAllocReq = 1,
1551     isCodeGenOnly = 1 in { // $dst2 doesn't exist in asmstring?
1552 // FIXME: $dst2 isn't in the asm string as it's implied by $Rd (dst2 = Rd+1)
1553 //        how to represent that such that tblgen is happy and we don't
1554 //        mark this codegen only?
1555 // Load doubleword
1556 def LDRD : AI3ld<0b1101, 0, (outs GPR:$Rd, GPR:$dst2),
1557                  (ins addrmode3:$addr), LdMiscFrm,
1558                  IIC_iLoad_d_r, "ldrd", "\t$Rd, $addr",
1559                  []>, Requires<[IsARM, HasV5TE]>;
1560 }
1561
1562 // Indexed loads
1563 multiclass AI2_ldridx<bit isByte, string opc, InstrItinClass itin> {
1564   def _PRE  : AI2ldstidx<1, isByte, 1, (outs GPR:$Rt, GPR:$Rn_wb),
1565                       (ins addrmode2:$addr), IndexModePre, LdFrm, itin,
1566                       opc, "\t$Rt, $addr!", "$addr.base = $Rn_wb", []> {
1567     // {17-14}  Rn
1568     // {13}     1 == Rm, 0 == imm12
1569     // {12}     isAdd
1570     // {11-0}   imm12/Rm
1571     bits<18> addr;
1572     let Inst{25} = addr{13};
1573     let Inst{23} = addr{12};
1574     let Inst{19-16} = addr{17-14};
1575     let Inst{11-0} = addr{11-0};
1576   }
1577   def _POST : AI2ldstidx<1, isByte, 0, (outs GPR:$Rt, GPR:$Rn_wb),
1578                       (ins GPR:$Rn, am2offset:$offset),
1579                       IndexModePost, LdFrm, itin,
1580                       opc, "\t$Rt, [$Rn], $offset", "$Rn = $Rn_wb", []> {
1581     // {13}     1 == Rm, 0 == imm12
1582     // {12}     isAdd
1583     // {11-0}   imm12/Rm
1584     bits<14> offset;
1585     bits<4> Rn;
1586     let Inst{25} = offset{13};
1587     let Inst{23} = offset{12};
1588     let Inst{19-16} = Rn;
1589     let Inst{11-0} = offset{11-0};
1590   }
1591 }
1592
1593 let mayLoad = 1, neverHasSideEffects = 1 in {
1594 defm LDR  : AI2_ldridx<0, "ldr", IIC_iLoad_ru>;
1595 defm LDRB : AI2_ldridx<1, "ldrb", IIC_iLoad_bh_ru>;
1596 }
1597
1598 multiclass AI3_ldridx<bits<4> op, bit op20, string opc, InstrItinClass itin> {
1599   def _PRE  : AI3ldstidx<op, op20, 1, 1, (outs GPR:$Rt, GPR:$Rn_wb),
1600                         (ins addrmode3:$addr), IndexModePre,
1601                         LdMiscFrm, itin,
1602                         opc, "\t$Rt, $addr!", "$addr.base = $Rn_wb", []> {
1603     bits<14> addr;
1604     let Inst{23}    = addr{8};      // U bit
1605     let Inst{22}    = addr{13};     // 1 == imm8, 0 == Rm
1606     let Inst{19-16} = addr{12-9};   // Rn
1607     let Inst{11-8}  = addr{7-4};    // imm7_4/zero
1608     let Inst{3-0}   = addr{3-0};    // imm3_0/Rm
1609   }
1610   def _POST : AI3ldstidx<op, op20, 1, 0, (outs GPR:$Rt, GPR:$Rn_wb),
1611                         (ins GPR:$Rn, am3offset:$offset), IndexModePost,
1612                         LdMiscFrm, itin,
1613                         opc, "\t$Rt, [$Rn], $offset", "$Rn = $Rn_wb", []> {
1614     bits<10> offset;
1615     bits<4> Rn;
1616     let Inst{23}    = offset{8};      // U bit
1617     let Inst{22}    = offset{9};      // 1 == imm8, 0 == Rm
1618     let Inst{19-16} = Rn;
1619     let Inst{11-8}  = offset{7-4};    // imm7_4/zero
1620     let Inst{3-0}   = offset{3-0};    // imm3_0/Rm
1621   }
1622 }
1623
1624 let mayLoad = 1, neverHasSideEffects = 1 in {
1625 defm LDRH  : AI3_ldridx<0b1011, 1, "ldrh", IIC_iLoad_bh_ru>;
1626 defm LDRSH : AI3_ldridx<0b1111, 1, "ldrsh", IIC_iLoad_bh_ru>;
1627 defm LDRSB : AI3_ldridx<0b1101, 1, "ldrsb", IIC_iLoad_bh_ru>;
1628 let hasExtraDefRegAllocReq = 1, isCodeGenOnly = 1 in
1629 defm LDRD :  AI3_ldridx<0b1101, 0, "ldrd", IIC_iLoad_d_ru>;
1630 } // mayLoad = 1, neverHasSideEffects = 1
1631
1632 // LDRT, LDRBT, LDRSBT, LDRHT, LDRSHT are for disassembly only.
1633 let mayLoad = 1, neverHasSideEffects = 1 in {
1634 def LDRT : AI2ldstidx<1, 0, 0, (outs GPR:$dst, GPR:$base_wb),
1635                    (ins GPR:$base, am2offset:$offset), IndexModeNone,
1636                    LdFrm, IIC_iLoad_ru,
1637                    "ldrt", "\t$dst, [$base], $offset", "$base = $base_wb", []> {
1638   let Inst{21} = 1; // overwrite
1639 }
1640 def LDRBT : AI2ldstidx<1, 1, 0, (outs GPR:$dst, GPR:$base_wb),
1641                   (ins GPR:$base, am2offset:$offset), IndexModeNone,
1642                   LdFrm, IIC_iLoad_bh_ru,
1643                   "ldrbt", "\t$dst, [$base], $offset", "$base = $base_wb", []> {
1644   let Inst{21} = 1; // overwrite
1645 }
1646 def LDRSBT : AI3ldstidx<0b1101, 1, 1, 0, (outs GPR:$dst, GPR:$base_wb),
1647                  (ins GPR:$base, am3offset:$offset), IndexModePost,
1648                  LdMiscFrm, IIC_iLoad_bh_ru,
1649                  "ldrsbt", "\t$dst, [$base], $offset", "$base = $base_wb", []> {
1650   let Inst{21} = 1; // overwrite
1651 }
1652 def LDRHT : AI3ldstidx<0b1011, 1, 1, 0, (outs GPR:$dst, GPR:$base_wb),
1653                  (ins GPR:$base, am3offset:$offset), IndexModePost,
1654                  LdMiscFrm, IIC_iLoad_bh_ru,
1655                  "ldrht", "\t$dst, [$base], $offset", "$base = $base_wb", []> {
1656   let Inst{21} = 1; // overwrite
1657 }
1658 def LDRSHT : AI3ldstidx<0b1111, 1, 1, 0, (outs GPR:$dst, GPR:$base_wb),
1659                  (ins GPR:$base, am3offset:$offset), IndexModePost,
1660                  LdMiscFrm, IIC_iLoad_bh_ru,
1661                  "ldrsht", "\t$dst, [$base], $offset", "$base = $base_wb", []> {
1662   let Inst{21} = 1; // overwrite
1663 }
1664 }
1665
1666 // Store
1667
1668 // Stores with truncate
1669 def STRH : AI3str<0b1011, (outs), (ins GPR:$Rt, addrmode3:$addr), StMiscFrm,
1670                IIC_iStore_bh_r, "strh", "\t$Rt, $addr",
1671                [(truncstorei16 GPR:$Rt, addrmode3:$addr)]>;
1672
1673 // Store doubleword
1674 let mayStore = 1, neverHasSideEffects = 1, hasExtraSrcRegAllocReq = 1,
1675     isCodeGenOnly = 1 in  // $src2 doesn't exist in asm string
1676 def STRD : AI3str<0b1111, (outs), (ins GPR:$src1, GPR:$src2, addrmode3:$addr),
1677                StMiscFrm, IIC_iStore_d_r,
1678                "strd", "\t$src1, $addr", []>, Requires<[IsARM, HasV5TE]>;
1679
1680 // Indexed stores
1681 def STR_PRE  : AI2stridx<0, 1, (outs GPR:$Rn_wb),
1682                      (ins GPR:$Rt, GPR:$Rn, am2offset:$offset),
1683                      IndexModePre, StFrm, IIC_iStore_ru,
1684                      "str", "\t$Rt, [$Rn, $offset]!", "$Rn = $Rn_wb",
1685                      [(set GPR:$Rn_wb,
1686                       (pre_store GPR:$Rt, GPR:$Rn, am2offset:$offset))]>;
1687
1688 def STR_POST : AI2stridx<0, 0, (outs GPR:$Rn_wb),
1689                      (ins GPR:$Rt, GPR:$Rn, am2offset:$offset),
1690                      IndexModePost, StFrm, IIC_iStore_ru,
1691                      "str", "\t$Rt, [$Rn], $offset", "$Rn = $Rn_wb",
1692                      [(set GPR:$Rn_wb,
1693                       (post_store GPR:$Rt, GPR:$Rn, am2offset:$offset))]>;
1694
1695 def STRB_PRE : AI2stridx<1, 1, (outs GPR:$Rn_wb),
1696                      (ins GPR:$Rt, GPR:$Rn, am2offset:$offset),
1697                      IndexModePre, StFrm, IIC_iStore_bh_ru,
1698                      "strb", "\t$Rt, [$Rn, $offset]!", "$Rn = $Rn_wb",
1699                      [(set GPR:$Rn_wb, (pre_truncsti8 GPR:$Rt,
1700                                         GPR:$Rn, am2offset:$offset))]>;
1701 def STRB_POST: AI2stridx<1, 0, (outs GPR:$Rn_wb),
1702                      (ins GPR:$Rt, GPR:$Rn, am2offset:$offset),
1703                      IndexModePost, StFrm, IIC_iStore_bh_ru,
1704                      "strb", "\t$Rt, [$Rn], $offset", "$Rn = $Rn_wb",
1705                      [(set GPR:$Rn_wb, (post_truncsti8 GPR:$Rt,
1706                                         GPR:$Rn, am2offset:$offset))]>;
1707
1708 def STRH_PRE : AI3stridx<0b1011, 0, 1, (outs GPR:$Rn_wb),
1709                      (ins GPR:$Rt, GPR:$Rn, am3offset:$offset),
1710                      IndexModePre, StMiscFrm, IIC_iStore_ru,
1711                      "strh", "\t$Rt, [$Rn, $offset]!", "$Rn = $Rn_wb",
1712                      [(set GPR:$Rn_wb,
1713                       (pre_truncsti16 GPR:$Rt, GPR:$Rn, am3offset:$offset))]>;
1714
1715 def STRH_POST: AI3stridx<0b1011, 0, 0, (outs GPR:$Rn_wb),
1716                      (ins GPR:$Rt, GPR:$Rn, am3offset:$offset),
1717                      IndexModePost, StMiscFrm, IIC_iStore_bh_ru,
1718                      "strh", "\t$Rt, [$Rn], $offset", "$Rn = $Rn_wb",
1719                      [(set GPR:$Rn_wb, (post_truncsti16 GPR:$Rt,
1720                                         GPR:$Rn, am3offset:$offset))]>;
1721
1722 // For disassembly only
1723 def STRD_PRE : AI3stdpr<(outs GPR:$base_wb),
1724                      (ins GPR:$src1, GPR:$src2, GPR:$base, am3offset:$offset),
1725                      StMiscFrm, IIC_iStore_d_ru,
1726                      "strd", "\t$src1, $src2, [$base, $offset]!",
1727                      "$base = $base_wb", []>;
1728
1729 // For disassembly only
1730 def STRD_POST: AI3stdpo<(outs GPR:$base_wb),
1731                      (ins GPR:$src1, GPR:$src2, GPR:$base, am3offset:$offset),
1732                      StMiscFrm, IIC_iStore_d_ru,
1733                      "strd", "\t$src1, $src2, [$base], $offset",
1734                      "$base = $base_wb", []>;
1735
1736 // STRT, STRBT, and STRHT are for disassembly only.
1737
1738 def STRT : AI2stridx<0, 0, (outs GPR:$Rn_wb),
1739                     (ins GPR:$Rt, GPR:$Rn,am2offset:$offset),
1740                     IndexModeNone, StFrm, IIC_iStore_ru,
1741                     "strt", "\t$Rt, [$Rn], $offset", "$Rn = $Rn_wb",
1742                     [/* For disassembly only; pattern left blank */]> {
1743   let Inst{21} = 1; // overwrite
1744 }
1745
1746 def STRBT : AI2stridx<1, 0, (outs GPR:$Rn_wb),
1747                      (ins GPR:$Rt, GPR:$Rn, am2offset:$offset),
1748                      IndexModeNone, StFrm, IIC_iStore_bh_ru,
1749                      "strbt", "\t$Rt, [$Rn], $offset", "$Rn = $Rn_wb",
1750                      [/* For disassembly only; pattern left blank */]> {
1751   let Inst{21} = 1; // overwrite
1752 }
1753
1754 def STRHT: AI3sthpo<(outs GPR:$base_wb),
1755                     (ins GPR:$src, GPR:$base,am3offset:$offset),
1756                     StMiscFrm, IIC_iStore_bh_ru,
1757                     "strht", "\t$src, [$base], $offset", "$base = $base_wb",
1758                     [/* For disassembly only; pattern left blank */]> {
1759   let Inst{21} = 1; // overwrite
1760 }
1761
1762 //===----------------------------------------------------------------------===//
1763 //  Load / store multiple Instructions.
1764 //
1765
1766 multiclass arm_ldst_mult<string asm, bit L_bit, Format f,
1767                          InstrItinClass itin, InstrItinClass itin_upd> {
1768   def IA :
1769     AXI4<(outs), (ins GPR:$Rn, pred:$p, reglist:$regs, variable_ops),
1770          IndexModeNone, f, itin,
1771          !strconcat(asm, "ia${p}\t$Rn, $regs"), "", []> {
1772     let Inst{24-23} = 0b01;       // Increment After
1773     let Inst{21}    = 0;          // No writeback
1774     let Inst{20}    = L_bit;
1775   }
1776   def IA_UPD :
1777     AXI4<(outs GPR:$wb), (ins GPR:$Rn, pred:$p, reglist:$regs, variable_ops),
1778          IndexModeUpd, f, itin_upd,
1779          !strconcat(asm, "ia${p}\t$Rn!, $regs"), "$Rn = $wb", []> {
1780     let Inst{24-23} = 0b01;       // Increment After
1781     let Inst{21}    = 1;          // Writeback
1782     let Inst{20}    = L_bit;
1783   }
1784   def DA :
1785     AXI4<(outs), (ins GPR:$Rn, pred:$p, reglist:$regs, variable_ops),
1786          IndexModeNone, f, itin,
1787          !strconcat(asm, "da${p}\t$Rn, $regs"), "", []> {
1788     let Inst{24-23} = 0b00;       // Decrement After
1789     let Inst{21}    = 0;          // No writeback
1790     let Inst{20}    = L_bit;
1791   }
1792   def DA_UPD :
1793     AXI4<(outs GPR:$wb), (ins GPR:$Rn, pred:$p, reglist:$regs, variable_ops),
1794          IndexModeUpd, f, itin_upd,
1795          !strconcat(asm, "da${p}\t$Rn!, $regs"), "$Rn = $wb", []> {
1796     let Inst{24-23} = 0b00;       // Decrement After
1797     let Inst{21}    = 1;          // Writeback
1798     let Inst{20}    = L_bit;
1799   }
1800   def DB :
1801     AXI4<(outs), (ins GPR:$Rn, pred:$p, reglist:$regs, variable_ops),
1802          IndexModeNone, f, itin,
1803          !strconcat(asm, "db${p}\t$Rn, $regs"), "", []> {
1804     let Inst{24-23} = 0b10;       // Decrement Before
1805     let Inst{21}    = 0;          // No writeback
1806     let Inst{20}    = L_bit;
1807   }
1808   def DB_UPD :
1809     AXI4<(outs GPR:$wb), (ins GPR:$Rn, pred:$p, reglist:$regs, variable_ops),
1810          IndexModeUpd, f, itin_upd,
1811          !strconcat(asm, "db${p}\t$Rn!, $regs"), "$Rn = $wb", []> {
1812     let Inst{24-23} = 0b10;       // Decrement Before
1813     let Inst{21}    = 1;          // Writeback
1814     let Inst{20}    = L_bit;
1815   }
1816   def IB :
1817     AXI4<(outs), (ins GPR:$Rn, pred:$p, reglist:$regs, variable_ops),
1818          IndexModeNone, f, itin,
1819          !strconcat(asm, "ib${p}\t$Rn, $regs"), "", []> {
1820     let Inst{24-23} = 0b11;       // Increment Before
1821     let Inst{21}    = 0;          // No writeback
1822     let Inst{20}    = L_bit;
1823   }
1824   def IB_UPD :
1825     AXI4<(outs GPR:$wb), (ins GPR:$Rn, pred:$p, reglist:$regs, variable_ops),
1826          IndexModeUpd, f, itin_upd,
1827          !strconcat(asm, "ib${p}\t$Rn!, $regs"), "$Rn = $wb", []> {
1828     let Inst{24-23} = 0b11;       // Increment Before
1829     let Inst{21}    = 1;          // Writeback
1830     let Inst{20}    = L_bit;
1831   }
1832
1833
1834 let neverHasSideEffects = 1 in {
1835
1836 let mayLoad = 1, hasExtraDefRegAllocReq = 1 in
1837 defm LDM : arm_ldst_mult<"ldm", 1, LdStMulFrm, IIC_iLoad_m, IIC_iLoad_mu>;
1838
1839 let mayStore = 1, hasExtraSrcRegAllocReq = 1 in
1840 defm STM : arm_ldst_mult<"stm", 0, LdStMulFrm, IIC_iStore_m, IIC_iStore_mu>;
1841
1842 } // neverHasSideEffects
1843
1844 // Load / Store Multiple Mnemnoic Aliases
1845 def : MnemonicAlias<"ldm", "ldmia">;
1846 def : MnemonicAlias<"stm", "stmia">;
1847
1848 // FIXME: remove when we have a way to marking a MI with these properties.
1849 // FIXME: Should pc be an implicit operand like PICADD, etc?
1850 let isReturn = 1, isTerminator = 1, isBarrier = 1, mayLoad = 1,
1851     hasExtraDefRegAllocReq = 1, isCodeGenOnly = 1 in
1852 // FIXME: Should be a pseudo-instruction.
1853 def LDMIA_RET : AXI4<(outs GPR:$wb), (ins GPR:$Rn, pred:$p,
1854                                       reglist:$regs, variable_ops),
1855                      IndexModeUpd, LdStMulFrm, IIC_iLoad_mBr,
1856                      "ldmia${p}\t$Rn!, $regs",
1857                      "$Rn = $wb", []> {
1858   let Inst{24-23} = 0b01;       // Increment After
1859   let Inst{21}    = 1;          // Writeback
1860   let Inst{20}    = 1;          // Load
1861 }
1862
1863 //===----------------------------------------------------------------------===//
1864 //  Move Instructions.
1865 //
1866
1867 let neverHasSideEffects = 1 in
1868 def MOVr : AsI1<0b1101, (outs GPR:$Rd), (ins GPR:$Rm), DPFrm, IIC_iMOVr,
1869                 "mov", "\t$Rd, $Rm", []>, UnaryDP {
1870   bits<4> Rd;
1871   bits<4> Rm;
1872
1873   let Inst{11-4} = 0b00000000;
1874   let Inst{25} = 0;
1875   let Inst{3-0} = Rm;
1876   let Inst{15-12} = Rd;
1877 }
1878
1879 // A version for the smaller set of tail call registers.
1880 let neverHasSideEffects = 1 in
1881 def MOVr_TC : AsI1<0b1101, (outs tcGPR:$Rd), (ins tcGPR:$Rm), DPFrm,
1882                 IIC_iMOVr, "mov", "\t$Rd, $Rm", []>, UnaryDP {
1883   bits<4> Rd;
1884   bits<4> Rm;
1885
1886   let Inst{11-4} = 0b00000000;
1887   let Inst{25} = 0;
1888   let Inst{3-0} = Rm;
1889   let Inst{15-12} = Rd;
1890 }
1891
1892 def MOVs : AsI1<0b1101, (outs GPR:$Rd), (ins shift_so_reg:$src),
1893                 DPSoRegFrm, IIC_iMOVsr,
1894                 "mov", "\t$Rd, $src", [(set GPR:$Rd, shift_so_reg:$src)]>,
1895                 UnaryDP {
1896   bits<4> Rd;
1897   bits<12> src;
1898   let Inst{15-12} = Rd;
1899   let Inst{11-0} = src;
1900   let Inst{25} = 0;
1901 }
1902
1903 let isReMaterializable = 1, isAsCheapAsAMove = 1, isMoveImm = 1 in
1904 def MOVi : AsI1<0b1101, (outs GPR:$Rd), (ins so_imm:$imm), DPFrm, IIC_iMOVi,
1905                 "mov", "\t$Rd, $imm", [(set GPR:$Rd, so_imm:$imm)]>, UnaryDP {
1906   bits<4> Rd;
1907   bits<12> imm;
1908   let Inst{25} = 1;
1909   let Inst{15-12} = Rd;
1910   let Inst{19-16} = 0b0000;
1911   let Inst{11-0} = imm;
1912 }
1913
1914 let isReMaterializable = 1, isAsCheapAsAMove = 1, isMoveImm = 1 in
1915 def MOVi16 : AI1<0b1000, (outs GPR:$Rd), (ins movt_imm:$imm),
1916                  DPFrm, IIC_iMOVi,
1917                  "movw", "\t$Rd, $imm",
1918                  [(set GPR:$Rd, imm0_65535:$imm)]>,
1919                  Requires<[IsARM, HasV6T2]>, UnaryDP {
1920   bits<4> Rd;
1921   bits<16> imm;
1922   let Inst{15-12} = Rd;
1923   let Inst{11-0}  = imm{11-0};
1924   let Inst{19-16} = imm{15-12};
1925   let Inst{20} = 0;
1926   let Inst{25} = 1;
1927 }
1928
1929 let Constraints = "$src = $Rd" in
1930 def MOVTi16 : AI1<0b1010, (outs GPR:$Rd), (ins GPR:$src, movt_imm:$imm),
1931                   DPFrm, IIC_iMOVi,
1932                   "movt", "\t$Rd, $imm",
1933                   [(set GPR:$Rd,
1934                         (or (and GPR:$src, 0xffff),
1935                             lo16AllZero:$imm))]>, UnaryDP,
1936                   Requires<[IsARM, HasV6T2]> {
1937   bits<4> Rd;
1938   bits<16> imm;
1939   let Inst{15-12} = Rd;
1940   let Inst{11-0}  = imm{11-0};
1941   let Inst{19-16} = imm{15-12};
1942   let Inst{20} = 0;
1943   let Inst{25} = 1;
1944 }
1945
1946 def : ARMPat<(or GPR:$src, 0xffff0000), (MOVTi16 GPR:$src, 0xffff)>,
1947       Requires<[IsARM, HasV6T2]>;
1948
1949 let Uses = [CPSR] in
1950 def RRX: PseudoInst<(outs GPR:$Rd), (ins GPR:$Rm), IIC_iMOVsi,
1951                     [(set GPR:$Rd, (ARMrrx GPR:$Rm))]>, UnaryDP,
1952                     Requires<[IsARM]>;
1953
1954 // These aren't really mov instructions, but we have to define them this way
1955 // due to flag operands.
1956
1957 let Defs = [CPSR] in {
1958 def MOVsrl_flag : PseudoInst<(outs GPR:$dst), (ins GPR:$src), IIC_iMOVsi,
1959                       [(set GPR:$dst, (ARMsrl_flag GPR:$src))]>, UnaryDP,
1960                       Requires<[IsARM]>;
1961 def MOVsra_flag : PseudoInst<(outs GPR:$dst), (ins GPR:$src), IIC_iMOVsi,
1962                       [(set GPR:$dst, (ARMsra_flag GPR:$src))]>, UnaryDP,
1963                       Requires<[IsARM]>;
1964 }
1965
1966 //===----------------------------------------------------------------------===//
1967 //  Extend Instructions.
1968 //
1969
1970 // Sign extenders
1971
1972 defm SXTB  : AI_ext_rrot<0b01101010,
1973                          "sxtb", UnOpFrag<(sext_inreg node:$Src, i8)>>;
1974 defm SXTH  : AI_ext_rrot<0b01101011,
1975                          "sxth", UnOpFrag<(sext_inreg node:$Src, i16)>>;
1976
1977 defm SXTAB : AI_exta_rrot<0b01101010,
1978                "sxtab", BinOpFrag<(add node:$LHS, (sext_inreg node:$RHS, i8))>>;
1979 defm SXTAH : AI_exta_rrot<0b01101011,
1980                "sxtah", BinOpFrag<(add node:$LHS, (sext_inreg node:$RHS,i16))>>;
1981
1982 // For disassembly only
1983 defm SXTB16  : AI_ext_rrot_np<0b01101000, "sxtb16">;
1984
1985 // For disassembly only
1986 defm SXTAB16 : AI_exta_rrot_np<0b01101000, "sxtab16">;
1987
1988 // Zero extenders
1989
1990 let AddedComplexity = 16 in {
1991 defm UXTB   : AI_ext_rrot<0b01101110,
1992                           "uxtb"  , UnOpFrag<(and node:$Src, 0x000000FF)>>;
1993 defm UXTH   : AI_ext_rrot<0b01101111,
1994                           "uxth"  , UnOpFrag<(and node:$Src, 0x0000FFFF)>>;
1995 defm UXTB16 : AI_ext_rrot<0b01101100,
1996                           "uxtb16", UnOpFrag<(and node:$Src, 0x00FF00FF)>>;
1997
1998 // FIXME: This pattern incorrectly assumes the shl operator is a rotate.
1999 //        The transformation should probably be done as a combiner action
2000 //        instead so we can include a check for masking back in the upper
2001 //        eight bits of the source into the lower eight bits of the result.
2002 //def : ARMV6Pat<(and (shl GPR:$Src, (i32 8)), 0xFF00FF),
2003 //               (UXTB16r_rot GPR:$Src, 24)>;
2004 def : ARMV6Pat<(and (srl GPR:$Src, (i32 8)), 0xFF00FF),
2005                (UXTB16r_rot GPR:$Src, 8)>;
2006
2007 defm UXTAB : AI_exta_rrot<0b01101110, "uxtab",
2008                         BinOpFrag<(add node:$LHS, (and node:$RHS, 0x00FF))>>;
2009 defm UXTAH : AI_exta_rrot<0b01101111, "uxtah",
2010                         BinOpFrag<(add node:$LHS, (and node:$RHS, 0xFFFF))>>;
2011 }
2012
2013 // This isn't safe in general, the add is two 16-bit units, not a 32-bit add.
2014 // For disassembly only
2015 defm UXTAB16 : AI_exta_rrot_np<0b01101100, "uxtab16">;
2016
2017
2018 def SBFX  : I<(outs GPR:$Rd),
2019               (ins GPR:$Rn, imm0_31:$lsb, imm0_31_m1:$width),
2020                AddrMode1, Size4Bytes, IndexModeNone, DPFrm, IIC_iUNAsi,
2021                "sbfx", "\t$Rd, $Rn, $lsb, $width", "", []>,
2022                Requires<[IsARM, HasV6T2]> {
2023   bits<4> Rd;
2024   bits<4> Rn;
2025   bits<5> lsb;
2026   bits<5> width;
2027   let Inst{27-21} = 0b0111101;
2028   let Inst{6-4}   = 0b101;
2029   let Inst{20-16} = width;
2030   let Inst{15-12} = Rd;
2031   let Inst{11-7}  = lsb;
2032   let Inst{3-0}   = Rn;
2033 }
2034
2035 def UBFX  : I<(outs GPR:$Rd),
2036               (ins GPR:$Rn, imm0_31:$lsb, imm0_31_m1:$width),
2037                AddrMode1, Size4Bytes, IndexModeNone, DPFrm, IIC_iUNAsi,
2038                "ubfx", "\t$Rd, $Rn, $lsb, $width", "", []>,
2039                Requires<[IsARM, HasV6T2]> {
2040   bits<4> Rd;
2041   bits<4> Rn;
2042   bits<5> lsb;
2043   bits<5> width;
2044   let Inst{27-21} = 0b0111111;
2045   let Inst{6-4}   = 0b101;
2046   let Inst{20-16} = width;
2047   let Inst{15-12} = Rd;
2048   let Inst{11-7}  = lsb;
2049   let Inst{3-0}   = Rn;
2050 }
2051
2052 //===----------------------------------------------------------------------===//
2053 //  Arithmetic Instructions.
2054 //
2055
2056 defm ADD  : AsI1_bin_irs<0b0100, "add",
2057                          IIC_iALUi, IIC_iALUr, IIC_iALUsr,
2058                          BinOpFrag<(add  node:$LHS, node:$RHS)>, 1>;
2059 defm SUB  : AsI1_bin_irs<0b0010, "sub",
2060                          IIC_iALUi, IIC_iALUr, IIC_iALUsr,
2061                          BinOpFrag<(sub  node:$LHS, node:$RHS)>>;
2062
2063 // ADD and SUB with 's' bit set.
2064 defm ADDS : AI1_bin_s_irs<0b0100, "adds",
2065                           IIC_iALUi, IIC_iALUr, IIC_iALUsr,
2066                           BinOpFrag<(addc node:$LHS, node:$RHS)>, 1>;
2067 defm SUBS : AI1_bin_s_irs<0b0010, "subs",
2068                           IIC_iALUi, IIC_iALUr, IIC_iALUsr,
2069                           BinOpFrag<(subc node:$LHS, node:$RHS)>>;
2070
2071 defm ADC : AI1_adde_sube_irs<0b0101, "adc",
2072                           BinOpFrag<(adde_dead_carry node:$LHS, node:$RHS)>, 1>;
2073 defm SBC : AI1_adde_sube_irs<0b0110, "sbc",
2074                           BinOpFrag<(sube_dead_carry node:$LHS, node:$RHS)>>;
2075 defm ADCS : AI1_adde_sube_s_irs<0b0101, "adcs",
2076                           BinOpFrag<(adde_live_carry node:$LHS, node:$RHS)>, 1>;
2077 defm SBCS : AI1_adde_sube_s_irs<0b0110, "sbcs",
2078                           BinOpFrag<(sube_live_carry node:$LHS, node:$RHS) >>;
2079
2080 def RSBri : AsI1<0b0011, (outs GPR:$Rd), (ins GPR:$Rn, so_imm:$imm), DPFrm,
2081                  IIC_iALUi, "rsb", "\t$Rd, $Rn, $imm",
2082                  [(set GPR:$Rd, (sub so_imm:$imm, GPR:$Rn))]> {
2083   bits<4> Rd;
2084   bits<4> Rn;
2085   bits<12> imm;
2086   let Inst{25} = 1;
2087   let Inst{15-12} = Rd;
2088   let Inst{19-16} = Rn;
2089   let Inst{11-0} = imm;
2090 }
2091
2092 // The reg/reg form is only defined for the disassembler; for codegen it is
2093 // equivalent to SUBrr.
2094 def RSBrr : AsI1<0b0011, (outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm), DPFrm,
2095                  IIC_iALUr, "rsb", "\t$Rd, $Rn, $Rm",
2096                  [/* For disassembly only; pattern left blank */]> {
2097   bits<4> Rd;
2098   bits<4> Rn;
2099   bits<4> Rm;
2100   let Inst{11-4} = 0b00000000;
2101   let Inst{25} = 0;
2102   let Inst{3-0} = Rm;
2103   let Inst{15-12} = Rd;
2104   let Inst{19-16} = Rn;
2105 }
2106
2107 def RSBrs : AsI1<0b0011, (outs GPR:$Rd), (ins GPR:$Rn, so_reg:$shift),
2108                  DPSoRegFrm, IIC_iALUsr, "rsb", "\t$Rd, $Rn, $shift",
2109                  [(set GPR:$Rd, (sub so_reg:$shift, GPR:$Rn))]> {
2110   bits<4> Rd;
2111   bits<4> Rn;
2112   bits<12> shift;
2113   let Inst{25} = 0;
2114   let Inst{11-0} = shift;
2115   let Inst{15-12} = Rd;
2116   let Inst{19-16} = Rn;
2117 }
2118
2119 // RSB with 's' bit set.
2120 let Defs = [CPSR] in {
2121 def RSBSri : AI1<0b0011, (outs GPR:$Rd), (ins GPR:$Rn, so_imm:$imm), DPFrm,
2122                  IIC_iALUi, "rsbs", "\t$Rd, $Rn, $imm",
2123                  [(set GPR:$Rd, (subc so_imm:$imm, GPR:$Rn))]> {
2124   bits<4> Rd;
2125   bits<4> Rn;
2126   bits<12> imm;
2127   let Inst{25} = 1;
2128   let Inst{20} = 1;
2129   let Inst{15-12} = Rd;
2130   let Inst{19-16} = Rn;
2131   let Inst{11-0} = imm;
2132 }
2133 def RSBSrs : AI1<0b0011, (outs GPR:$Rd), (ins GPR:$Rn, so_reg:$shift),
2134                  DPSoRegFrm, IIC_iALUsr, "rsbs", "\t$Rd, $Rn, $shift",
2135                  [(set GPR:$Rd, (subc so_reg:$shift, GPR:$Rn))]> {
2136   bits<4> Rd;
2137   bits<4> Rn;
2138   bits<12> shift;
2139   let Inst{25} = 0;
2140   let Inst{20} = 1;
2141   let Inst{11-0} = shift;
2142   let Inst{15-12} = Rd;
2143   let Inst{19-16} = Rn;
2144 }
2145 }
2146
2147 let Uses = [CPSR] in {
2148 def RSCri : AsI1<0b0111, (outs GPR:$Rd), (ins GPR:$Rn, so_imm:$imm),
2149                  DPFrm, IIC_iALUi, "rsc", "\t$Rd, $Rn, $imm",
2150                  [(set GPR:$Rd, (sube_dead_carry so_imm:$imm, GPR:$Rn))]>,
2151                  Requires<[IsARM]> {
2152   bits<4> Rd;
2153   bits<4> Rn;
2154   bits<12> imm;
2155   let Inst{25} = 1;
2156   let Inst{15-12} = Rd;
2157   let Inst{19-16} = Rn;
2158   let Inst{11-0} = imm;
2159 }
2160 // The reg/reg form is only defined for the disassembler; for codegen it is
2161 // equivalent to SUBrr.
2162 def RSCrr : AsI1<0b0111, (outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm),
2163                  DPFrm, IIC_iALUr, "rsc", "\t$Rd, $Rn, $Rm",
2164                  [/* For disassembly only; pattern left blank */]> {
2165   bits<4> Rd;
2166   bits<4> Rn;
2167   bits<4> Rm;
2168   let Inst{11-4} = 0b00000000;
2169   let Inst{25} = 0;
2170   let Inst{3-0} = Rm;
2171   let Inst{15-12} = Rd;
2172   let Inst{19-16} = Rn;
2173 }
2174 def RSCrs : AsI1<0b0111, (outs GPR:$Rd), (ins GPR:$Rn, so_reg:$shift),
2175                  DPSoRegFrm, IIC_iALUsr, "rsc", "\t$Rd, $Rn, $shift",
2176                  [(set GPR:$Rd, (sube_dead_carry so_reg:$shift, GPR:$Rn))]>,
2177                  Requires<[IsARM]> {
2178   bits<4> Rd;
2179   bits<4> Rn;
2180   bits<12> shift;
2181   let Inst{25} = 0;
2182   let Inst{11-0} = shift;
2183   let Inst{15-12} = Rd;
2184   let Inst{19-16} = Rn;
2185 }
2186 }
2187
2188 // FIXME: Allow these to be predicated.
2189 let Defs = [CPSR], Uses = [CPSR] in {
2190 def RSCSri : AXI1<0b0111, (outs GPR:$Rd), (ins GPR:$Rn, so_imm:$imm),
2191                   DPFrm, IIC_iALUi, "rscs\t$Rd, $Rn, $imm",
2192                   [(set GPR:$Rd, (sube_dead_carry so_imm:$imm, GPR:$Rn))]>,
2193                   Requires<[IsARM]> {
2194   bits<4> Rd;
2195   bits<4> Rn;
2196   bits<12> imm;
2197   let Inst{25} = 1;
2198   let Inst{20} = 1;
2199   let Inst{15-12} = Rd;
2200   let Inst{19-16} = Rn;
2201   let Inst{11-0} = imm;
2202 }
2203 def RSCSrs : AXI1<0b0111, (outs GPR:$Rd), (ins GPR:$Rn, so_reg:$shift),
2204                   DPSoRegFrm, IIC_iALUsr, "rscs\t$Rd, $Rn, $shift",
2205                   [(set GPR:$Rd, (sube_dead_carry so_reg:$shift, GPR:$Rn))]>,
2206                   Requires<[IsARM]> {
2207   bits<4> Rd;
2208   bits<4> Rn;
2209   bits<12> shift;
2210   let Inst{25} = 0;
2211   let Inst{20} = 1;
2212   let Inst{11-0} = shift;
2213   let Inst{15-12} = Rd;
2214   let Inst{19-16} = Rn;
2215 }
2216 }
2217
2218 // (sub X, imm) gets canonicalized to (add X, -imm).  Match this form.
2219 // The assume-no-carry-in form uses the negation of the input since add/sub
2220 // assume opposite meanings of the carry flag (i.e., carry == !borrow).
2221 // See the definition of AddWithCarry() in the ARM ARM A2.2.1 for the gory
2222 // details.
2223 def : ARMPat<(add    GPR:$src, so_imm_neg:$imm),
2224              (SUBri  GPR:$src, so_imm_neg:$imm)>;
2225 def : ARMPat<(addc   GPR:$src, so_imm_neg:$imm),
2226              (SUBSri GPR:$src, so_imm_neg:$imm)>;
2227 // The with-carry-in form matches bitwise not instead of the negation.
2228 // Effectively, the inverse interpretation of the carry flag already accounts
2229 // for part of the negation.
2230 def : ARMPat<(adde   GPR:$src, so_imm_not:$imm),
2231              (SBCri  GPR:$src, so_imm_not:$imm)>;
2232
2233 // Note: These are implemented in C++ code, because they have to generate
2234 // ADD/SUBrs instructions, which use a complex pattern that a xform function
2235 // cannot produce.
2236 // (mul X, 2^n+1) -> (add (X << n), X)
2237 // (mul X, 2^n-1) -> (rsb X, (X << n))
2238
2239 // ARM Arithmetic Instruction -- for disassembly only
2240 // GPR:$dst = GPR:$a op GPR:$b
2241 class AAI<bits<8> op27_20, bits<8> op11_4, string opc,
2242           list<dag> pattern = [/* For disassembly only; pattern left blank */]>
2243   : AI<(outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm), DPFrm, IIC_iALUr,
2244        opc, "\t$Rd, $Rn, $Rm", pattern> {
2245   bits<4> Rd;
2246   bits<4> Rn;
2247   bits<4> Rm;
2248   let Inst{27-20} = op27_20;
2249   let Inst{11-4} = op11_4;
2250   let Inst{19-16} = Rn;
2251   let Inst{15-12} = Rd;
2252   let Inst{3-0}   = Rm;
2253 }
2254
2255 // Saturating add/subtract -- for disassembly only
2256
2257 def QADD    : AAI<0b00010000, 0b00000101, "qadd",
2258                   [(set GPR:$Rd, (int_arm_qadd GPR:$Rn, GPR:$Rm))]>;
2259 def QSUB    : AAI<0b00010010, 0b00000101, "qsub",
2260                   [(set GPR:$Rd, (int_arm_qsub GPR:$Rn, GPR:$Rm))]>;
2261 def QDADD   : AAI<0b00010100, 0b00000101, "qdadd">;
2262 def QDSUB   : AAI<0b00010110, 0b00000101, "qdsub">;
2263
2264 def QADD16  : AAI<0b01100010, 0b11110001, "qadd16">;
2265 def QADD8   : AAI<0b01100010, 0b11111001, "qadd8">;
2266 def QASX    : AAI<0b01100010, 0b11110011, "qasx">;
2267 def QSAX    : AAI<0b01100010, 0b11110101, "qsax">;
2268 def QSUB16  : AAI<0b01100010, 0b11110111, "qsub16">;
2269 def QSUB8   : AAI<0b01100010, 0b11111111, "qsub8">;
2270 def UQADD16 : AAI<0b01100110, 0b11110001, "uqadd16">;
2271 def UQADD8  : AAI<0b01100110, 0b11111001, "uqadd8">;
2272 def UQASX   : AAI<0b01100110, 0b11110011, "uqasx">;
2273 def UQSAX   : AAI<0b01100110, 0b11110101, "uqsax">;
2274 def UQSUB16 : AAI<0b01100110, 0b11110111, "uqsub16">;
2275 def UQSUB8  : AAI<0b01100110, 0b11111111, "uqsub8">;
2276
2277 // Signed/Unsigned add/subtract -- for disassembly only
2278
2279 def SASX   : AAI<0b01100001, 0b11110011, "sasx">;
2280 def SADD16 : AAI<0b01100001, 0b11110001, "sadd16">;
2281 def SADD8  : AAI<0b01100001, 0b11111001, "sadd8">;
2282 def SSAX   : AAI<0b01100001, 0b11110101, "ssax">;
2283 def SSUB16 : AAI<0b01100001, 0b11110111, "ssub16">;
2284 def SSUB8  : AAI<0b01100001, 0b11111111, "ssub8">;
2285 def UASX   : AAI<0b01100101, 0b11110011, "uasx">;
2286 def UADD16 : AAI<0b01100101, 0b11110001, "uadd16">;
2287 def UADD8  : AAI<0b01100101, 0b11111001, "uadd8">;
2288 def USAX   : AAI<0b01100101, 0b11110101, "usax">;
2289 def USUB16 : AAI<0b01100101, 0b11110111, "usub16">;
2290 def USUB8  : AAI<0b01100101, 0b11111111, "usub8">;
2291
2292 // Signed/Unsigned halving add/subtract -- for disassembly only
2293
2294 def SHASX   : AAI<0b01100011, 0b11110011, "shasx">;
2295 def SHADD16 : AAI<0b01100011, 0b11110001, "shadd16">;
2296 def SHADD8  : AAI<0b01100011, 0b11111001, "shadd8">;
2297 def SHSAX   : AAI<0b01100011, 0b11110101, "shsax">;
2298 def SHSUB16 : AAI<0b01100011, 0b11110111, "shsub16">;
2299 def SHSUB8  : AAI<0b01100011, 0b11111111, "shsub8">;
2300 def UHASX   : AAI<0b01100111, 0b11110011, "uhasx">;
2301 def UHADD16 : AAI<0b01100111, 0b11110001, "uhadd16">;
2302 def UHADD8  : AAI<0b01100111, 0b11111001, "uhadd8">;
2303 def UHSAX   : AAI<0b01100111, 0b11110101, "uhsax">;
2304 def UHSUB16 : AAI<0b01100111, 0b11110111, "uhsub16">;
2305 def UHSUB8  : AAI<0b01100111, 0b11111111, "uhsub8">;
2306
2307 // Unsigned Sum of Absolute Differences [and Accumulate] -- for disassembly only
2308
2309 def USAD8  : AI<(outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm),
2310                 MulFrm /* for convenience */, NoItinerary, "usad8",
2311                 "\t$Rd, $Rn, $Rm", []>,
2312              Requires<[IsARM, HasV6]> {
2313   bits<4> Rd;
2314   bits<4> Rn;
2315   bits<4> Rm;
2316   let Inst{27-20} = 0b01111000;
2317   let Inst{15-12} = 0b1111;
2318   let Inst{7-4} = 0b0001;
2319   let Inst{19-16} = Rd;
2320   let Inst{11-8} = Rm;
2321   let Inst{3-0} = Rn;
2322 }
2323 def USADA8 : AI<(outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm, GPR:$Ra),
2324                 MulFrm /* for convenience */, NoItinerary, "usada8",
2325                 "\t$Rd, $Rn, $Rm, $Ra", []>,
2326              Requires<[IsARM, HasV6]> {
2327   bits<4> Rd;
2328   bits<4> Rn;
2329   bits<4> Rm;
2330   bits<4> Ra;
2331   let Inst{27-20} = 0b01111000;
2332   let Inst{7-4} = 0b0001;
2333   let Inst{19-16} = Rd;
2334   let Inst{15-12} = Ra;
2335   let Inst{11-8} = Rm;
2336   let Inst{3-0} = Rn;
2337 }
2338
2339 // Signed/Unsigned saturate -- for disassembly only
2340
2341 def SSAT : AI<(outs GPR:$Rd), (ins i32imm:$sat_imm, GPR:$a, shift_imm:$sh),
2342               SatFrm, NoItinerary, "ssat", "\t$Rd, $sat_imm, $a$sh",
2343               [/* For disassembly only; pattern left blank */]> {
2344   bits<4> Rd;
2345   bits<5> sat_imm;
2346   bits<4> Rn;
2347   bits<8> sh;
2348   let Inst{27-21} = 0b0110101;
2349   let Inst{5-4} = 0b01;
2350   let Inst{20-16} = sat_imm;
2351   let Inst{15-12} = Rd;
2352   let Inst{11-7} = sh{7-3};
2353   let Inst{6} = sh{0};
2354   let Inst{3-0} = Rn;
2355 }
2356
2357 def SSAT16 : AI<(outs GPR:$Rd), (ins i32imm:$sat_imm, GPR:$Rn), SatFrm,
2358                 NoItinerary, "ssat16", "\t$Rd, $sat_imm, $Rn",
2359                 [/* For disassembly only; pattern left blank */]> {
2360   bits<4> Rd;
2361   bits<4> sat_imm;
2362   bits<4> Rn;
2363   let Inst{27-20} = 0b01101010;
2364   let Inst{11-4} = 0b11110011;
2365   let Inst{15-12} = Rd;
2366   let Inst{19-16} = sat_imm;
2367   let Inst{3-0} = Rn;
2368 }
2369
2370 def USAT : AI<(outs GPR:$Rd), (ins i32imm:$sat_imm, GPR:$a, shift_imm:$sh),
2371               SatFrm, NoItinerary, "usat", "\t$Rd, $sat_imm, $a$sh",
2372               [/* For disassembly only; pattern left blank */]> {
2373   bits<4> Rd;
2374   bits<5> sat_imm;
2375   bits<4> Rn;
2376   bits<8> sh;
2377   let Inst{27-21} = 0b0110111;
2378   let Inst{5-4} = 0b01;
2379   let Inst{15-12} = Rd;
2380   let Inst{11-7} = sh{7-3};
2381   let Inst{6} = sh{0};
2382   let Inst{20-16} = sat_imm;
2383   let Inst{3-0} = Rn;
2384 }
2385
2386 def USAT16 : AI<(outs GPR:$Rd), (ins i32imm:$sat_imm, GPR:$a), SatFrm,
2387                 NoItinerary, "usat16", "\t$Rd, $sat_imm, $a",
2388                 [/* For disassembly only; pattern left blank */]> {
2389   bits<4> Rd;
2390   bits<4> sat_imm;
2391   bits<4> Rn;
2392   let Inst{27-20} = 0b01101110;
2393   let Inst{11-4} = 0b11110011;
2394   let Inst{15-12} = Rd;
2395   let Inst{19-16} = sat_imm;
2396   let Inst{3-0} = Rn;
2397 }
2398
2399 def : ARMV6Pat<(int_arm_ssat GPR:$a, imm:$pos), (SSAT imm:$pos, GPR:$a, 0)>;
2400 def : ARMV6Pat<(int_arm_usat GPR:$a, imm:$pos), (USAT imm:$pos, GPR:$a, 0)>;
2401
2402 //===----------------------------------------------------------------------===//
2403 //  Bitwise Instructions.
2404 //
2405
2406 defm AND   : AsI1_bin_irs<0b0000, "and",
2407                           IIC_iBITi, IIC_iBITr, IIC_iBITsr,
2408                           BinOpFrag<(and node:$LHS, node:$RHS)>, 1>;
2409 defm ORR   : AsI1_bin_irs<0b1100, "orr",
2410                           IIC_iBITi, IIC_iBITr, IIC_iBITsr,
2411                           BinOpFrag<(or  node:$LHS, node:$RHS)>, 1>;
2412 defm EOR   : AsI1_bin_irs<0b0001, "eor",
2413                           IIC_iBITi, IIC_iBITr, IIC_iBITsr,
2414                           BinOpFrag<(xor node:$LHS, node:$RHS)>, 1>;
2415 defm BIC   : AsI1_bin_irs<0b1110, "bic",
2416                           IIC_iBITi, IIC_iBITr, IIC_iBITsr,
2417                           BinOpFrag<(and node:$LHS, (not node:$RHS))>>;
2418
2419 def BFC    : I<(outs GPR:$Rd), (ins GPR:$src, bf_inv_mask_imm:$imm),
2420                AddrMode1, Size4Bytes, IndexModeNone, DPFrm, IIC_iUNAsi,
2421                "bfc", "\t$Rd, $imm", "$src = $Rd",
2422                [(set GPR:$Rd, (and GPR:$src, bf_inv_mask_imm:$imm))]>,
2423                Requires<[IsARM, HasV6T2]> {
2424   bits<4> Rd;
2425   bits<10> imm;
2426   let Inst{27-21} = 0b0111110;
2427   let Inst{6-0}   = 0b0011111;
2428   let Inst{15-12} = Rd;
2429   let Inst{11-7}  = imm{4-0}; // lsb
2430   let Inst{20-16} = imm{9-5}; // width
2431 }
2432
2433 // A8.6.18  BFI - Bitfield insert (Encoding A1)
2434 def BFI    : I<(outs GPR:$Rd), (ins GPR:$src, GPR:$Rn, bf_inv_mask_imm:$imm),
2435                AddrMode1, Size4Bytes, IndexModeNone, DPFrm, IIC_iUNAsi,
2436                "bfi", "\t$Rd, $Rn, $imm", "$src = $Rd",
2437                [(set GPR:$Rd, (ARMbfi GPR:$src, GPR:$Rn,
2438                                 bf_inv_mask_imm:$imm))]>,
2439                Requires<[IsARM, HasV6T2]> {
2440   bits<4> Rd;
2441   bits<4> Rn;
2442   bits<10> imm;
2443   let Inst{27-21} = 0b0111110;
2444   let Inst{6-4}   = 0b001; // Rn: Inst{3-0} != 15
2445   let Inst{15-12} = Rd;
2446   let Inst{11-7}  = imm{4-0}; // lsb
2447   let Inst{20-16} = imm{9-5}; // width
2448   let Inst{3-0}   = Rn;
2449 }
2450
2451 def  MVNr  : AsI1<0b1111, (outs GPR:$Rd), (ins GPR:$Rm), DPFrm, IIC_iMVNr,
2452                   "mvn", "\t$Rd, $Rm",
2453                   [(set GPR:$Rd, (not GPR:$Rm))]>, UnaryDP {
2454   bits<4> Rd;
2455   bits<4> Rm;
2456   let Inst{25} = 0;
2457   let Inst{19-16} = 0b0000;
2458   let Inst{11-4} = 0b00000000;
2459   let Inst{15-12} = Rd;
2460   let Inst{3-0} = Rm;
2461 }
2462 def  MVNs  : AsI1<0b1111, (outs GPR:$Rd), (ins so_reg:$shift), DPSoRegFrm,
2463                   IIC_iMVNsr, "mvn", "\t$Rd, $shift",
2464                   [(set GPR:$Rd, (not so_reg:$shift))]>, UnaryDP {
2465   bits<4> Rd;
2466   bits<12> shift;
2467   let Inst{25} = 0;
2468   let Inst{19-16} = 0b0000;
2469   let Inst{15-12} = Rd;
2470   let Inst{11-0} = shift;
2471 }
2472 let isReMaterializable = 1, isAsCheapAsAMove = 1, isMoveImm = 1 in
2473 def  MVNi  : AsI1<0b1111, (outs GPR:$Rd), (ins so_imm:$imm), DPFrm,
2474                   IIC_iMVNi, "mvn", "\t$Rd, $imm",
2475                   [(set GPR:$Rd, so_imm_not:$imm)]>,UnaryDP {
2476   bits<4> Rd;
2477   bits<12> imm;
2478   let Inst{25} = 1;
2479   let Inst{19-16} = 0b0000;
2480   let Inst{15-12} = Rd;
2481   let Inst{11-0} = imm;
2482 }
2483
2484 def : ARMPat<(and   GPR:$src, so_imm_not:$imm),
2485              (BICri GPR:$src, so_imm_not:$imm)>;
2486
2487 //===----------------------------------------------------------------------===//
2488 //  Multiply Instructions.
2489 //
2490 class AsMul1I32<bits<7> opcod, dag oops, dag iops, InstrItinClass itin,
2491              string opc, string asm, list<dag> pattern>
2492   : AsMul1I<opcod, oops, iops, itin, opc, asm, pattern> {
2493   bits<4> Rd;
2494   bits<4> Rm;
2495   bits<4> Rn;
2496   let Inst{19-16} = Rd;
2497   let Inst{11-8}  = Rm;
2498   let Inst{3-0}   = Rn;
2499 }
2500 class AsMul1I64<bits<7> opcod, dag oops, dag iops, InstrItinClass itin,
2501              string opc, string asm, list<dag> pattern>
2502   : AsMul1I<opcod, oops, iops, itin, opc, asm, pattern> {
2503   bits<4> RdLo;
2504   bits<4> RdHi;
2505   bits<4> Rm;
2506   bits<4> Rn;
2507   let Inst{19-16} = RdHi;
2508   let Inst{15-12} = RdLo;
2509   let Inst{11-8}  = Rm;
2510   let Inst{3-0}   = Rn;
2511 }
2512
2513 let isCommutable = 1 in
2514 def MUL  : AsMul1I32<0b0000000, (outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm),
2515                    IIC_iMUL32, "mul", "\t$Rd, $Rn, $Rm",
2516                    [(set GPR:$Rd, (mul GPR:$Rn, GPR:$Rm))]>;
2517
2518 def MLA  : AsMul1I32<0b0000001, (outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm, GPR:$Ra),
2519                     IIC_iMAC32, "mla", "\t$Rd, $Rn, $Rm, $Ra",
2520                    [(set GPR:$Rd, (add (mul GPR:$Rn, GPR:$Rm), GPR:$Ra))]> {
2521   bits<4> Ra;
2522   let Inst{15-12} = Ra;
2523 }
2524
2525 def MLS  : AMul1I<0b0000011, (outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm, GPR:$Ra),
2526                    IIC_iMAC32, "mls", "\t$Rd, $Rn, $Rm, $Ra",
2527                    [(set GPR:$Rd, (sub GPR:$Ra, (mul GPR:$Rn, GPR:$Rm)))]>,
2528                    Requires<[IsARM, HasV6T2]> {
2529   bits<4> Rd;
2530   bits<4> Rm;
2531   bits<4> Rn;
2532   bits<4> Ra;
2533   let Inst{19-16} = Rd;
2534   let Inst{15-12} = Ra;
2535   let Inst{11-8}  = Rm;
2536   let Inst{3-0}   = Rn;
2537 }
2538
2539 // Extra precision multiplies with low / high results
2540
2541 let neverHasSideEffects = 1 in {
2542 let isCommutable = 1 in {
2543 def SMULL : AsMul1I64<0b0000110, (outs GPR:$RdLo, GPR:$RdHi),
2544                                (ins GPR:$Rn, GPR:$Rm), IIC_iMUL64,
2545                     "smull", "\t$RdLo, $RdHi, $Rn, $Rm", []>;
2546
2547 def UMULL : AsMul1I64<0b0000100, (outs GPR:$RdLo, GPR:$RdHi),
2548                                (ins GPR:$Rn, GPR:$Rm), IIC_iMUL64,
2549                     "umull", "\t$RdLo, $RdHi, $Rn, $Rm", []>;
2550 }
2551
2552 // Multiply + accumulate
2553 def SMLAL : AsMul1I64<0b0000111, (outs GPR:$RdLo, GPR:$RdHi),
2554                                (ins GPR:$Rn, GPR:$Rm), IIC_iMAC64,
2555                     "smlal", "\t$RdLo, $RdHi, $Rn, $Rm", []>;
2556
2557 def UMLAL : AsMul1I64<0b0000101, (outs GPR:$RdLo, GPR:$RdHi),
2558                                (ins GPR:$Rn, GPR:$Rm), IIC_iMAC64,
2559                     "umlal", "\t$RdLo, $RdHi, $Rn, $Rm", []>;
2560
2561 def UMAAL : AMul1I <0b0000010, (outs GPR:$RdLo, GPR:$RdHi),
2562                                (ins GPR:$Rn, GPR:$Rm), IIC_iMAC64,
2563                     "umaal", "\t$RdLo, $RdHi, $Rn, $Rm", []>,
2564                     Requires<[IsARM, HasV6]> {
2565   bits<4> RdLo;
2566   bits<4> RdHi;
2567   bits<4> Rm;
2568   bits<4> Rn;
2569   let Inst{19-16} = RdLo;
2570   let Inst{15-12} = RdHi;
2571   let Inst{11-8}  = Rm;
2572   let Inst{3-0}   = Rn;
2573 }
2574 } // neverHasSideEffects
2575
2576 // Most significant word multiply
2577 def SMMUL : AMul2I <0b0111010, 0b0001, (outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm),
2578                IIC_iMUL32, "smmul", "\t$Rd, $Rn, $Rm",
2579                [(set GPR:$Rd, (mulhs GPR:$Rn, GPR:$Rm))]>,
2580             Requires<[IsARM, HasV6]> {
2581   let Inst{15-12} = 0b1111;
2582 }
2583
2584 def SMMULR : AMul2I <0b0111010, 0b0011, (outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm),
2585                IIC_iMUL32, "smmulr", "\t$Rd, $Rn, $Rm",
2586                [/* For disassembly only; pattern left blank */]>,
2587             Requires<[IsARM, HasV6]> {
2588   let Inst{15-12} = 0b1111;
2589 }
2590
2591 def SMMLA : AMul2Ia <0b0111010, 0b0001, (outs GPR:$Rd),
2592                (ins GPR:$Rn, GPR:$Rm, GPR:$Ra),
2593                IIC_iMAC32, "smmla", "\t$Rd, $Rn, $Rm, $Ra",
2594                [(set GPR:$Rd, (add (mulhs GPR:$Rn, GPR:$Rm), GPR:$Ra))]>,
2595             Requires<[IsARM, HasV6]>;
2596
2597 def SMMLAR : AMul2Ia <0b0111010, 0b0011, (outs GPR:$Rd),
2598                (ins GPR:$Rn, GPR:$Rm, GPR:$Ra),
2599                IIC_iMAC32, "smmlar", "\t$Rd, $Rn, $Rm, $Ra",
2600                [/* For disassembly only; pattern left blank */]>,
2601             Requires<[IsARM, HasV6]>;
2602
2603 def SMMLS : AMul2Ia <0b0111010, 0b1101, (outs GPR:$Rd),
2604                (ins GPR:$Rn, GPR:$Rm, GPR:$Ra),
2605                IIC_iMAC32, "smmls", "\t$Rd, $Rn, $Rm, $Ra",
2606                [(set GPR:$Rd, (sub GPR:$Ra, (mulhs GPR:$Rn, GPR:$Rm)))]>,
2607             Requires<[IsARM, HasV6]>;
2608
2609 def SMMLSR : AMul2Ia <0b0111010, 0b1111, (outs GPR:$Rd),
2610                (ins GPR:$Rn, GPR:$Rm, GPR:$Ra),
2611                IIC_iMAC32, "smmlsr", "\t$Rd, $Rn, $Rm, $Ra",
2612                [/* For disassembly only; pattern left blank */]>,
2613             Requires<[IsARM, HasV6]>;
2614
2615 multiclass AI_smul<string opc, PatFrag opnode> {
2616   def BB : AMulxyI<0b0001011, 0b00, (outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm),
2617               IIC_iMUL16, !strconcat(opc, "bb"), "\t$Rd, $Rn, $Rm",
2618               [(set GPR:$Rd, (opnode (sext_inreg GPR:$Rn, i16),
2619                                       (sext_inreg GPR:$Rm, i16)))]>,
2620            Requires<[IsARM, HasV5TE]>;
2621
2622   def BT : AMulxyI<0b0001011, 0b10, (outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm),
2623               IIC_iMUL16, !strconcat(opc, "bt"), "\t$Rd, $Rn, $Rm",
2624               [(set GPR:$Rd, (opnode (sext_inreg GPR:$Rn, i16),
2625                                       (sra GPR:$Rm, (i32 16))))]>,
2626            Requires<[IsARM, HasV5TE]>;
2627
2628   def TB : AMulxyI<0b0001011, 0b01, (outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm),
2629               IIC_iMUL16, !strconcat(opc, "tb"), "\t$Rd, $Rn, $Rm",
2630               [(set GPR:$Rd, (opnode (sra GPR:$Rn, (i32 16)),
2631                                       (sext_inreg GPR:$Rm, i16)))]>,
2632            Requires<[IsARM, HasV5TE]>;
2633
2634   def TT : AMulxyI<0b0001011, 0b11, (outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm),
2635               IIC_iMUL16, !strconcat(opc, "tt"), "\t$Rd, $Rn, $Rm",
2636               [(set GPR:$Rd, (opnode (sra GPR:$Rn, (i32 16)),
2637                                       (sra GPR:$Rm, (i32 16))))]>,
2638             Requires<[IsARM, HasV5TE]>;
2639
2640   def WB : AMulxyI<0b0001001, 0b01, (outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm),
2641               IIC_iMUL16, !strconcat(opc, "wb"), "\t$Rd, $Rn, $Rm",
2642               [(set GPR:$Rd, (sra (opnode GPR:$Rn,
2643                                     (sext_inreg GPR:$Rm, i16)), (i32 16)))]>,
2644            Requires<[IsARM, HasV5TE]>;
2645
2646   def WT : AMulxyI<0b0001001, 0b11, (outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm),
2647               IIC_iMUL16, !strconcat(opc, "wt"), "\t$Rd, $Rn, $Rm",
2648               [(set GPR:$Rd, (sra (opnode GPR:$Rn,
2649                                     (sra GPR:$Rm, (i32 16))), (i32 16)))]>,
2650             Requires<[IsARM, HasV5TE]>;
2651 }
2652
2653
2654 multiclass AI_smla<string opc, PatFrag opnode> {
2655   def BB : AMulxyIa<0b0001000, 0b00, (outs GPR:$Rd),
2656               (ins GPR:$Rn, GPR:$Rm, GPR:$Ra),
2657               IIC_iMAC16, !strconcat(opc, "bb"), "\t$Rd, $Rn, $Rm, $Ra",
2658               [(set GPR:$Rd, (add GPR:$Ra,
2659                                (opnode (sext_inreg GPR:$Rn, i16),
2660                                        (sext_inreg GPR:$Rm, i16))))]>,
2661            Requires<[IsARM, HasV5TE]>;
2662
2663   def BT : AMulxyIa<0b0001000, 0b10, (outs GPR:$Rd),
2664               (ins GPR:$Rn, GPR:$Rm, GPR:$Ra),
2665               IIC_iMAC16, !strconcat(opc, "bt"), "\t$Rd, $Rn, $Rm, $Ra",
2666               [(set GPR:$Rd, (add GPR:$Ra, (opnode (sext_inreg GPR:$Rn, i16),
2667                                                    (sra GPR:$Rm, (i32 16)))))]>,
2668            Requires<[IsARM, HasV5TE]>;
2669
2670   def TB : AMulxyIa<0b0001000, 0b01, (outs GPR:$Rd),
2671               (ins GPR:$Rn, GPR:$Rm, GPR:$Ra),
2672               IIC_iMAC16, !strconcat(opc, "tb"), "\t$Rd, $Rn, $Rm, $Ra",
2673               [(set GPR:$Rd, (add GPR:$Ra, (opnode (sra GPR:$Rn, (i32 16)),
2674                                                 (sext_inreg GPR:$Rm, i16))))]>,
2675            Requires<[IsARM, HasV5TE]>;
2676
2677   def TT : AMulxyIa<0b0001000, 0b11, (outs GPR:$Rd),
2678               (ins GPR:$Rn, GPR:$Rm, GPR:$Ra),
2679               IIC_iMAC16, !strconcat(opc, "tt"), "\t$Rd, $Rn, $Rm, $Ra",
2680              [(set GPR:$Rd, (add GPR:$Ra, (opnode (sra GPR:$Rn, (i32 16)),
2681                                                    (sra GPR:$Rm, (i32 16)))))]>,
2682             Requires<[IsARM, HasV5TE]>;
2683
2684   def WB : AMulxyIa<0b0001001, 0b00, (outs GPR:$Rd),
2685               (ins GPR:$Rn, GPR:$Rm, GPR:$Ra),
2686               IIC_iMAC16, !strconcat(opc, "wb"), "\t$Rd, $Rn, $Rm, $Ra",
2687               [(set GPR:$Rd, (add GPR:$Ra, (sra (opnode GPR:$Rn,
2688                                       (sext_inreg GPR:$Rm, i16)), (i32 16))))]>,
2689            Requires<[IsARM, HasV5TE]>;
2690
2691   def WT : AMulxyIa<0b0001001, 0b10, (outs GPR:$Rd),
2692               (ins GPR:$Rn, GPR:$Rm, GPR:$Ra),
2693               IIC_iMAC16, !strconcat(opc, "wt"), "\t$Rd, $Rn, $Rm, $Ra",
2694               [(set GPR:$Rd, (add GPR:$Ra, (sra (opnode GPR:$Rn,
2695                                         (sra GPR:$Rm, (i32 16))), (i32 16))))]>,
2696             Requires<[IsARM, HasV5TE]>;
2697 }
2698
2699 defm SMUL : AI_smul<"smul", BinOpFrag<(mul node:$LHS, node:$RHS)>>;
2700 defm SMLA : AI_smla<"smla", BinOpFrag<(mul node:$LHS, node:$RHS)>>;
2701
2702 // Halfword multiply accumulate long: SMLAL<x><y> -- for disassembly only
2703 def SMLALBB : AMulxyI64<0b0001010, 0b00, (outs GPR:$RdLo, GPR:$RdHi),
2704                       (ins GPR:$Rn, GPR:$Rm),
2705                       IIC_iMAC64, "smlalbb", "\t$RdLo, $RdHi, $Rn, $Rm",
2706                       [/* For disassembly only; pattern left blank */]>,
2707               Requires<[IsARM, HasV5TE]>;
2708
2709 def SMLALBT : AMulxyI64<0b0001010, 0b10, (outs GPR:$RdLo, GPR:$RdHi),
2710                       (ins GPR:$Rn, GPR:$Rm),
2711                       IIC_iMAC64, "smlalbt", "\t$RdLo, $RdHi, $Rn, $Rm",
2712                       [/* For disassembly only; pattern left blank */]>,
2713               Requires<[IsARM, HasV5TE]>;
2714
2715 def SMLALTB : AMulxyI64<0b0001010, 0b01, (outs GPR:$RdLo, GPR:$RdHi),
2716                       (ins GPR:$Rn, GPR:$Rm),
2717                       IIC_iMAC64, "smlaltb", "\t$RdLo, $RdHi, $Rn, $Rm",
2718                       [/* For disassembly only; pattern left blank */]>,
2719               Requires<[IsARM, HasV5TE]>;
2720
2721 def SMLALTT : AMulxyI64<0b0001010, 0b11, (outs GPR:$RdLo, GPR:$RdHi),
2722                       (ins GPR:$Rn, GPR:$Rm),
2723                       IIC_iMAC64, "smlaltt", "\t$RdLo, $RdHi, $Rn, $Rm",
2724                       [/* For disassembly only; pattern left blank */]>,
2725               Requires<[IsARM, HasV5TE]>;
2726
2727 // Helper class for AI_smld -- for disassembly only
2728 class AMulDualIbase<bit long, bit sub, bit swap, dag oops, dag iops,
2729                     InstrItinClass itin, string opc, string asm>
2730   : AI<oops, iops, MulFrm, itin, opc, asm, []>, Requires<[IsARM, HasV6]> {
2731   bits<4> Rn;
2732   bits<4> Rm;
2733   let Inst{4}     = 1;
2734   let Inst{5}     = swap;
2735   let Inst{6}     = sub;
2736   let Inst{7}     = 0;
2737   let Inst{21-20} = 0b00;
2738   let Inst{22}    = long;
2739   let Inst{27-23} = 0b01110;
2740   let Inst{11-8}  = Rm;
2741   let Inst{3-0}   = Rn;
2742 }
2743 class AMulDualI<bit long, bit sub, bit swap, dag oops, dag iops,
2744                 InstrItinClass itin, string opc, string asm>
2745   : AMulDualIbase<long, sub, swap, oops, iops, itin, opc, asm> {
2746   bits<4> Rd;
2747   let Inst{15-12} = 0b1111;
2748   let Inst{19-16} = Rd;
2749 }
2750 class AMulDualIa<bit long, bit sub, bit swap, dag oops, dag iops,
2751                 InstrItinClass itin, string opc, string asm>
2752   : AMulDualIbase<long, sub, swap, oops, iops, itin, opc, asm> {
2753   bits<4> Ra;
2754   let Inst{15-12} = Ra;
2755 }
2756 class AMulDualI64<bit long, bit sub, bit swap, dag oops, dag iops,
2757                   InstrItinClass itin, string opc, string asm>
2758   : AMulDualIbase<long, sub, swap, oops, iops, itin, opc, asm> {
2759   bits<4> RdLo;
2760   bits<4> RdHi;
2761   let Inst{19-16} = RdHi;
2762   let Inst{15-12} = RdLo;
2763 }
2764
2765 multiclass AI_smld<bit sub, string opc> {
2766
2767   def D : AMulDualIa<0, sub, 0, (outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm, GPR:$Ra),
2768                   NoItinerary, !strconcat(opc, "d"), "\t$Rd, $Rn, $Rm, $Ra">;
2769
2770   def DX: AMulDualIa<0, sub, 1, (outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm, GPR:$Ra),
2771                   NoItinerary, !strconcat(opc, "dx"), "\t$Rd, $Rn, $Rm, $Ra">;
2772
2773   def LD: AMulDualI64<1, sub, 0, (outs GPR:$RdLo,GPR:$RdHi),
2774                   (ins GPR:$Rn, GPR:$Rm), NoItinerary,
2775                   !strconcat(opc, "ld"), "\t$RdLo, $RdHi, $Rn, $Rm">;
2776
2777   def LDX : AMulDualI64<1, sub, 1, (outs GPR:$RdLo,GPR:$RdHi),
2778                   (ins GPR:$Rn, GPR:$Rm), NoItinerary,
2779                   !strconcat(opc, "ldx"),"\t$RdLo, $RdHi, $Rn, $Rm">;
2780
2781 }
2782
2783 defm SMLA : AI_smld<0, "smla">;
2784 defm SMLS : AI_smld<1, "smls">;
2785
2786 multiclass AI_sdml<bit sub, string opc> {
2787
2788   def D : AMulDualI<0, sub, 0, (outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm),
2789                     NoItinerary, !strconcat(opc, "d"), "\t$Rd, $Rn, $Rm">;
2790   def DX : AMulDualI<0, sub, 1, (outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm),
2791                     NoItinerary, !strconcat(opc, "dx"), "\t$Rd, $Rn, $Rm">;
2792 }
2793
2794 defm SMUA : AI_sdml<0, "smua">;
2795 defm SMUS : AI_sdml<1, "smus">;
2796
2797 //===----------------------------------------------------------------------===//
2798 //  Misc. Arithmetic Instructions.
2799 //
2800
2801 def CLZ  : AMiscA1I<0b000010110, 0b0001, (outs GPR:$Rd), (ins GPR:$Rm),
2802               IIC_iUNAr, "clz", "\t$Rd, $Rm",
2803               [(set GPR:$Rd, (ctlz GPR:$Rm))]>, Requires<[IsARM, HasV5T]>;
2804
2805 def RBIT : AMiscA1I<0b01101111, 0b0011, (outs GPR:$Rd), (ins GPR:$Rm),
2806               IIC_iUNAr, "rbit", "\t$Rd, $Rm",
2807               [(set GPR:$Rd, (ARMrbit GPR:$Rm))]>,
2808            Requires<[IsARM, HasV6T2]>;
2809
2810 def REV  : AMiscA1I<0b01101011, 0b0011, (outs GPR:$Rd), (ins GPR:$Rm),
2811               IIC_iUNAr, "rev", "\t$Rd, $Rm",
2812               [(set GPR:$Rd, (bswap GPR:$Rm))]>, Requires<[IsARM, HasV6]>;
2813
2814 def REV16 : AMiscA1I<0b01101011, 0b1011, (outs GPR:$Rd), (ins GPR:$Rm),
2815                IIC_iUNAr, "rev16", "\t$Rd, $Rm",
2816                [(set GPR:$Rd,
2817                    (or (and (srl GPR:$Rm, (i32 8)), 0xFF),
2818                        (or (and (shl GPR:$Rm, (i32 8)), 0xFF00),
2819                            (or (and (srl GPR:$Rm, (i32 8)), 0xFF0000),
2820                                (and (shl GPR:$Rm, (i32 8)), 0xFF000000)))))]>,
2821                Requires<[IsARM, HasV6]>;
2822
2823 def REVSH : AMiscA1I<0b01101111, 0b1011, (outs GPR:$Rd), (ins GPR:$Rm),
2824                IIC_iUNAr, "revsh", "\t$Rd, $Rm",
2825                [(set GPR:$Rd,
2826                   (sext_inreg
2827                     (or (srl (and GPR:$Rm, 0xFF00), (i32 8)),
2828                         (shl GPR:$Rm, (i32 8))), i16))]>,
2829                Requires<[IsARM, HasV6]>;
2830
2831 def lsl_shift_imm : SDNodeXForm<imm, [{
2832   unsigned Sh = ARM_AM::getSORegOpc(ARM_AM::lsl, N->getZExtValue());
2833   return CurDAG->getTargetConstant(Sh, MVT::i32);
2834 }]>;
2835
2836 def lsl_amt : PatLeaf<(i32 imm), [{
2837   return (N->getZExtValue() < 32);
2838 }], lsl_shift_imm>;
2839
2840 def PKHBT : APKHI<0b01101000, 0, (outs GPR:$Rd),
2841                               (ins GPR:$Rn, GPR:$Rm, shift_imm:$sh),
2842                IIC_iALUsi, "pkhbt", "\t$Rd, $Rn, $Rm$sh",
2843                [(set GPR:$Rd, (or (and GPR:$Rn, 0xFFFF),
2844                                   (and (shl GPR:$Rm, lsl_amt:$sh),
2845                                        0xFFFF0000)))]>,
2846                Requires<[IsARM, HasV6]>;
2847
2848 // Alternate cases for PKHBT where identities eliminate some nodes.
2849 def : ARMV6Pat<(or (and GPR:$Rn, 0xFFFF), (and GPR:$Rm, 0xFFFF0000)),
2850                (PKHBT GPR:$Rn, GPR:$Rm, 0)>;
2851 def : ARMV6Pat<(or (and GPR:$Rn, 0xFFFF), (shl GPR:$Rm, imm16_31:$sh)),
2852                (PKHBT GPR:$Rn, GPR:$Rm, (lsl_shift_imm imm16_31:$sh))>;
2853
2854 def asr_shift_imm : SDNodeXForm<imm, [{
2855   unsigned Sh = ARM_AM::getSORegOpc(ARM_AM::asr, N->getZExtValue());
2856   return CurDAG->getTargetConstant(Sh, MVT::i32);
2857 }]>;
2858
2859 def asr_amt : PatLeaf<(i32 imm), [{
2860   return (N->getZExtValue() <= 32);
2861 }], asr_shift_imm>;
2862
2863 // Note: Shifts of 1-15 bits will be transformed to srl instead of sra and
2864 // will match the pattern below.
2865 def PKHTB : APKHI<0b01101000, 1, (outs GPR:$Rd),
2866                               (ins GPR:$Rn, GPR:$Rm, shift_imm:$sh),
2867                IIC_iBITsi, "pkhtb", "\t$Rd, $Rn, $Rm$sh",
2868                [(set GPR:$Rd, (or (and GPR:$Rn, 0xFFFF0000),
2869                                   (and (sra GPR:$Rm, asr_amt:$sh),
2870                                        0xFFFF)))]>,
2871                Requires<[IsARM, HasV6]>;
2872
2873 // Alternate cases for PKHTB where identities eliminate some nodes.  Note that
2874 // a shift amount of 0 is *not legal* here, it is PKHBT instead.
2875 def : ARMV6Pat<(or (and GPR:$src1, 0xFFFF0000), (srl GPR:$src2, imm16_31:$sh)),
2876                (PKHTB GPR:$src1, GPR:$src2, (asr_shift_imm imm16_31:$sh))>;
2877 def : ARMV6Pat<(or (and GPR:$src1, 0xFFFF0000),
2878                    (and (srl GPR:$src2, imm1_15:$sh), 0xFFFF)),
2879                (PKHTB GPR:$src1, GPR:$src2, (asr_shift_imm imm1_15:$sh))>;
2880
2881 //===----------------------------------------------------------------------===//
2882 //  Comparison Instructions...
2883 //
2884
2885 defm CMP  : AI1_cmp_irs<0b1010, "cmp",
2886                         IIC_iCMPi, IIC_iCMPr, IIC_iCMPsr,
2887                         BinOpFrag<(ARMcmp node:$LHS, node:$RHS)>>;
2888
2889 // FIXME: We have to be careful when using the CMN instruction and comparison
2890 // with 0. One would expect these two pieces of code should give identical
2891 // results:
2892 //
2893 //   rsbs r1, r1, 0
2894 //   cmp  r0, r1
2895 //   mov  r0, #0
2896 //   it   ls
2897 //   mov  r0, #1
2898 //
2899 // and:
2900 //
2901 //   cmn  r0, r1
2902 //   mov  r0, #0
2903 //   it   ls
2904 //   mov  r0, #1
2905 //
2906 // However, the CMN gives the *opposite* result when r1 is 0. This is because
2907 // the carry flag is set in the CMP case but not in the CMN case. In short, the
2908 // CMP instruction doesn't perform a truncate of the (logical) NOT of 0 plus the
2909 // value of r0 and the carry bit (because the "carry bit" parameter to
2910 // AddWithCarry is defined as 1 in this case, the carry flag will always be set
2911 // when r0 >= 0). The CMN instruction doesn't perform a NOT of 0 so there is
2912 // never a "carry" when this AddWithCarry is performed (because the "carry bit"
2913 // parameter to AddWithCarry is defined as 0).
2914 //
2915 // When x is 0 and unsigned:
2916 //
2917 //    x = 0
2918 //   ~x = 0xFFFF FFFF
2919 //   ~x + 1 = 0x1 0000 0000
2920 //   (-x = 0) != (0x1 0000 0000 = ~x + 1)
2921 //
2922 // Therefore, we should disable CMN when comparing against zero, until we can
2923 // limit when the CMN instruction is used (when we know that the RHS is not 0 or
2924 // when it's a comparison which doesn't look at the 'carry' flag).
2925 //
2926 // (See the ARM docs for the "AddWithCarry" pseudo-code.)
2927 //
2928 // This is related to <rdar://problem/7569620>.
2929 //
2930 //defm CMN  : AI1_cmp_irs<0b1011, "cmn",
2931 //                        BinOpFrag<(ARMcmp node:$LHS,(ineg node:$RHS))>>;
2932
2933 // Note that TST/TEQ don't set all the same flags that CMP does!
2934 defm TST  : AI1_cmp_irs<0b1000, "tst",
2935                         IIC_iTSTi, IIC_iTSTr, IIC_iTSTsr,
2936                       BinOpFrag<(ARMcmpZ (and_su node:$LHS, node:$RHS), 0)>, 1>;
2937 defm TEQ  : AI1_cmp_irs<0b1001, "teq",
2938                         IIC_iTSTi, IIC_iTSTr, IIC_iTSTsr,
2939                       BinOpFrag<(ARMcmpZ (xor_su node:$LHS, node:$RHS), 0)>, 1>;
2940
2941 defm CMPz  : AI1_cmp_irs<0b1010, "cmp",
2942                          IIC_iCMPi, IIC_iCMPr, IIC_iCMPsr,
2943                          BinOpFrag<(ARMcmpZ node:$LHS, node:$RHS)>>;
2944 defm CMNz  : AI1_cmp_irs<0b1011, "cmn",
2945                          IIC_iCMPi, IIC_iCMPr, IIC_iCMPsr,
2946                          BinOpFrag<(ARMcmpZ node:$LHS,(ineg node:$RHS))>>;
2947
2948 //def : ARMPat<(ARMcmp GPR:$src, so_imm_neg:$imm),
2949 //             (CMNri  GPR:$src, so_imm_neg:$imm)>;
2950
2951 def : ARMPat<(ARMcmpZ GPR:$src, so_imm_neg:$imm),
2952              (CMNzri  GPR:$src, so_imm_neg:$imm)>;
2953
2954 // Pseudo i64 compares for some floating point compares.
2955 let usesCustomInserter = 1, isBranch = 1, isTerminator = 1,
2956     Defs = [CPSR] in {
2957 def BCCi64 : PseudoInst<(outs),
2958     (ins i32imm:$cc, GPR:$lhs1, GPR:$lhs2, GPR:$rhs1, GPR:$rhs2, brtarget:$dst),
2959      IIC_Br,
2960     [(ARMBcci64 imm:$cc, GPR:$lhs1, GPR:$lhs2, GPR:$rhs1, GPR:$rhs2, bb:$dst)]>;
2961
2962 def BCCZi64 : PseudoInst<(outs),
2963      (ins i32imm:$cc, GPR:$lhs1, GPR:$lhs2, brtarget:$dst), IIC_Br,
2964     [(ARMBcci64 imm:$cc, GPR:$lhs1, GPR:$lhs2, 0, 0, bb:$dst)]>;
2965 } // usesCustomInserter
2966
2967
2968 // Conditional moves
2969 // FIXME: should be able to write a pattern for ARMcmov, but can't use
2970 // a two-value operand where a dag node expects two operands. :(
2971 // FIXME: These should all be pseudo-instructions that get expanded to
2972 //        the normal MOV instructions. That would fix the dependency on
2973 //        special casing them in tblgen.
2974 let neverHasSideEffects = 1 in {
2975 def MOVCCr : AI1<0b1101, (outs GPR:$Rd), (ins GPR:$false, GPR:$Rm), DPFrm,
2976                 IIC_iCMOVr, "mov", "\t$Rd, $Rm",
2977       [/*(set GPR:$Rd, (ARMcmov GPR:$false, GPR:$Rm, imm:$cc, CCR:$ccr))*/]>,
2978                 RegConstraint<"$false = $Rd">, UnaryDP {
2979   bits<4> Rd;
2980   bits<4> Rm;
2981   let Inst{25} = 0;
2982   let Inst{20} = 0;
2983   let Inst{15-12} = Rd;
2984   let Inst{11-4} = 0b00000000;
2985   let Inst{3-0} = Rm;
2986 }
2987
2988 def MOVCCs : AI1<0b1101, (outs GPR:$Rd),
2989                  (ins GPR:$false, so_reg:$shift), DPSoRegFrm, IIC_iCMOVsr,
2990                 "mov", "\t$Rd, $shift",
2991    [/*(set GPR:$Rd, (ARMcmov GPR:$false, so_reg:$shift, imm:$cc, CCR:$ccr))*/]>,
2992                 RegConstraint<"$false = $Rd">, UnaryDP {
2993   bits<4> Rd;
2994   bits<12> shift;
2995   let Inst{25} = 0;
2996   let Inst{20} = 0;
2997   let Inst{19-16} = 0;
2998   let Inst{15-12} = Rd;
2999   let Inst{11-0} = shift;
3000 }
3001
3002 let isMoveImm = 1 in
3003 def MOVCCi16 : AI1<0b1000, (outs GPR:$Rd), (ins GPR:$false, movt_imm:$imm),
3004                  DPFrm, IIC_iMOVi,
3005                  "movw", "\t$Rd, $imm",
3006                  []>,
3007                  RegConstraint<"$false = $Rd">, Requires<[IsARM, HasV6T2]>,
3008                  UnaryDP {
3009   bits<4> Rd;
3010   bits<16> imm;
3011   let Inst{25} = 1;
3012   let Inst{20} = 0;
3013   let Inst{19-16} = imm{15-12};
3014   let Inst{15-12} = Rd;
3015   let Inst{11-0}  = imm{11-0};
3016 }
3017
3018 let isMoveImm = 1 in
3019 def MOVCCi : AI1<0b1101, (outs GPR:$Rd),
3020                          (ins GPR:$false, so_imm:$imm), DPFrm, IIC_iCMOVi,
3021                 "mov", "\t$Rd, $imm",
3022    [/*(set GPR:$Rd, (ARMcmov GPR:$false, so_imm:$imm, imm:$cc, CCR:$ccr))*/]>,
3023                 RegConstraint<"$false = $Rd">, UnaryDP {
3024   bits<4> Rd;
3025   bits<12> imm;
3026   let Inst{25} = 1;
3027   let Inst{20} = 0;
3028   let Inst{19-16} = 0b0000;
3029   let Inst{15-12} = Rd;
3030   let Inst{11-0} = imm;
3031 }
3032
3033 // Two instruction predicate mov immediate.
3034 let isMoveImm = 1 in
3035 def MOVCCi32imm : PseudoInst<(outs GPR:$Rd),
3036                              (ins GPR:$false, i32imm:$src, pred:$p),
3037                   IIC_iCMOVix2, []>, RegConstraint<"$false = $Rd">;
3038
3039 let isMoveImm = 1 in
3040 def MVNCCi : AI1<0b1111, (outs GPR:$Rd),
3041                          (ins GPR:$false, so_imm:$imm), DPFrm, IIC_iCMOVi,
3042                 "mvn", "\t$Rd, $imm",
3043  [/*(set GPR:$Rd, (ARMcmov GPR:$false, so_imm_not:$imm, imm:$cc, CCR:$ccr))*/]>,
3044                 RegConstraint<"$false = $Rd">, UnaryDP {
3045   bits<4> Rd;
3046   bits<12> imm;
3047   let Inst{25} = 1;
3048   let Inst{20} = 0;
3049   let Inst{19-16} = 0b0000;
3050   let Inst{15-12} = Rd;
3051   let Inst{11-0} = imm;
3052 }
3053 } // neverHasSideEffects
3054
3055 //===----------------------------------------------------------------------===//
3056 // Atomic operations intrinsics
3057 //
3058
3059 def memb_opt : Operand<i32> {
3060   let PrintMethod = "printMemBOption";
3061 }
3062
3063 // memory barriers protect the atomic sequences
3064 let hasSideEffects = 1 in {
3065 def DMB : AInoP<(outs), (ins memb_opt:$opt), MiscFrm, NoItinerary,
3066                 "dmb", "\t$opt", [(ARMMemBarrier (i32 imm:$opt))]>,
3067                 Requires<[IsARM, HasDB]> {
3068   bits<4> opt;
3069   let Inst{31-4} = 0xf57ff05;
3070   let Inst{3-0} = opt;
3071 }
3072
3073 def DMB_MCR : AInoP<(outs), (ins GPR:$zero), MiscFrm, NoItinerary,
3074                        "mcr", "\tp15, 0, $zero, c7, c10, 5",
3075                        [(ARMMemBarrierMCR GPR:$zero)]>,
3076                        Requires<[IsARM, HasV6]> {
3077   // FIXME: add encoding
3078 }
3079 }
3080
3081 def DSB : AInoP<(outs), (ins memb_opt:$opt), MiscFrm, NoItinerary,
3082                 "dsb", "\t$opt",
3083                 [/* For disassembly only; pattern left blank */]>,
3084                 Requires<[IsARM, HasDB]> {
3085   bits<4> opt;
3086   let Inst{31-4} = 0xf57ff04;
3087   let Inst{3-0} = opt;
3088 }
3089
3090 // ISB has only full system option -- for disassembly only
3091 def ISB : AInoP<(outs), (ins), MiscFrm, NoItinerary, "isb", "", []>,
3092                 Requires<[IsARM, HasDB]> {
3093   let Inst{31-4} = 0xf57ff06;
3094   let Inst{3-0} = 0b1111;
3095 }
3096
3097 let usesCustomInserter = 1 in {
3098   let Uses = [CPSR] in {
3099     def ATOMIC_LOAD_ADD_I8 : PseudoInst<
3100       (outs GPR:$dst), (ins GPR:$ptr, GPR:$incr), NoItinerary,
3101       [(set GPR:$dst, (atomic_load_add_8 GPR:$ptr, GPR:$incr))]>;
3102     def ATOMIC_LOAD_SUB_I8 : PseudoInst<
3103       (outs GPR:$dst), (ins GPR:$ptr, GPR:$incr), NoItinerary,
3104       [(set GPR:$dst, (atomic_load_sub_8 GPR:$ptr, GPR:$incr))]>;
3105     def ATOMIC_LOAD_AND_I8 : PseudoInst<
3106       (outs GPR:$dst), (ins GPR:$ptr, GPR:$incr), NoItinerary,
3107       [(set GPR:$dst, (atomic_load_and_8 GPR:$ptr, GPR:$incr))]>;
3108     def ATOMIC_LOAD_OR_I8 : PseudoInst<
3109       (outs GPR:$dst), (ins GPR:$ptr, GPR:$incr), NoItinerary,
3110       [(set GPR:$dst, (atomic_load_or_8 GPR:$ptr, GPR:$incr))]>;
3111     def ATOMIC_LOAD_XOR_I8 : PseudoInst<
3112       (outs GPR:$dst), (ins GPR:$ptr, GPR:$incr), NoItinerary,
3113       [(set GPR:$dst, (atomic_load_xor_8 GPR:$ptr, GPR:$incr))]>;
3114     def ATOMIC_LOAD_NAND_I8 : PseudoInst<
3115       (outs GPR:$dst), (ins GPR:$ptr, GPR:$incr), NoItinerary,
3116       [(set GPR:$dst, (atomic_load_nand_8 GPR:$ptr, GPR:$incr))]>;
3117     def ATOMIC_LOAD_ADD_I16 : PseudoInst<
3118       (outs GPR:$dst), (ins GPR:$ptr, GPR:$incr), NoItinerary,
3119       [(set GPR:$dst, (atomic_load_add_16 GPR:$ptr, GPR:$incr))]>;
3120     def ATOMIC_LOAD_SUB_I16 : PseudoInst<
3121       (outs GPR:$dst), (ins GPR:$ptr, GPR:$incr), NoItinerary,
3122       [(set GPR:$dst, (atomic_load_sub_16 GPR:$ptr, GPR:$incr))]>;
3123     def ATOMIC_LOAD_AND_I16 : PseudoInst<
3124       (outs GPR:$dst), (ins GPR:$ptr, GPR:$incr), NoItinerary,
3125       [(set GPR:$dst, (atomic_load_and_16 GPR:$ptr, GPR:$incr))]>;
3126     def ATOMIC_LOAD_OR_I16 : PseudoInst<
3127       (outs GPR:$dst), (ins GPR:$ptr, GPR:$incr), NoItinerary,
3128       [(set GPR:$dst, (atomic_load_or_16 GPR:$ptr, GPR:$incr))]>;
3129     def ATOMIC_LOAD_XOR_I16 : PseudoInst<
3130       (outs GPR:$dst), (ins GPR:$ptr, GPR:$incr), NoItinerary,
3131       [(set GPR:$dst, (atomic_load_xor_16 GPR:$ptr, GPR:$incr))]>;
3132     def ATOMIC_LOAD_NAND_I16 : PseudoInst<
3133       (outs GPR:$dst), (ins GPR:$ptr, GPR:$incr), NoItinerary,
3134       [(set GPR:$dst, (atomic_load_nand_16 GPR:$ptr, GPR:$incr))]>;
3135     def ATOMIC_LOAD_ADD_I32 : PseudoInst<
3136       (outs GPR:$dst), (ins GPR:$ptr, GPR:$incr), NoItinerary,
3137       [(set GPR:$dst, (atomic_load_add_32 GPR:$ptr, GPR:$incr))]>;
3138     def ATOMIC_LOAD_SUB_I32 : PseudoInst<
3139       (outs GPR:$dst), (ins GPR:$ptr, GPR:$incr), NoItinerary,
3140       [(set GPR:$dst, (atomic_load_sub_32 GPR:$ptr, GPR:$incr))]>;
3141     def ATOMIC_LOAD_AND_I32 : PseudoInst<
3142       (outs GPR:$dst), (ins GPR:$ptr, GPR:$incr), NoItinerary,
3143       [(set GPR:$dst, (atomic_load_and_32 GPR:$ptr, GPR:$incr))]>;
3144     def ATOMIC_LOAD_OR_I32 : PseudoInst<
3145       (outs GPR:$dst), (ins GPR:$ptr, GPR:$incr), NoItinerary,
3146       [(set GPR:$dst, (atomic_load_or_32 GPR:$ptr, GPR:$incr))]>;
3147     def ATOMIC_LOAD_XOR_I32 : PseudoInst<
3148       (outs GPR:$dst), (ins GPR:$ptr, GPR:$incr), NoItinerary,
3149       [(set GPR:$dst, (atomic_load_xor_32 GPR:$ptr, GPR:$incr))]>;
3150     def ATOMIC_LOAD_NAND_I32 : PseudoInst<
3151       (outs GPR:$dst), (ins GPR:$ptr, GPR:$incr), NoItinerary,
3152       [(set GPR:$dst, (atomic_load_nand_32 GPR:$ptr, GPR:$incr))]>;
3153
3154     def ATOMIC_SWAP_I8 : PseudoInst<
3155       (outs GPR:$dst), (ins GPR:$ptr, GPR:$new), NoItinerary,
3156       [(set GPR:$dst, (atomic_swap_8 GPR:$ptr, GPR:$new))]>;
3157     def ATOMIC_SWAP_I16 : PseudoInst<
3158       (outs GPR:$dst), (ins GPR:$ptr, GPR:$new), NoItinerary,
3159       [(set GPR:$dst, (atomic_swap_16 GPR:$ptr, GPR:$new))]>;
3160     def ATOMIC_SWAP_I32 : PseudoInst<
3161       (outs GPR:$dst), (ins GPR:$ptr, GPR:$new), NoItinerary,
3162       [(set GPR:$dst, (atomic_swap_32 GPR:$ptr, GPR:$new))]>;
3163
3164     def ATOMIC_CMP_SWAP_I8 : PseudoInst<
3165       (outs GPR:$dst), (ins GPR:$ptr, GPR:$old, GPR:$new), NoItinerary,
3166       [(set GPR:$dst, (atomic_cmp_swap_8 GPR:$ptr, GPR:$old, GPR:$new))]>;
3167     def ATOMIC_CMP_SWAP_I16 : PseudoInst<
3168       (outs GPR:$dst), (ins GPR:$ptr, GPR:$old, GPR:$new), NoItinerary,
3169       [(set GPR:$dst, (atomic_cmp_swap_16 GPR:$ptr, GPR:$old, GPR:$new))]>;
3170     def ATOMIC_CMP_SWAP_I32 : PseudoInst<
3171       (outs GPR:$dst), (ins GPR:$ptr, GPR:$old, GPR:$new), NoItinerary,
3172       [(set GPR:$dst, (atomic_cmp_swap_32 GPR:$ptr, GPR:$old, GPR:$new))]>;
3173 }
3174 }
3175
3176 let mayLoad = 1 in {
3177 def LDREXB : AIldrex<0b10, (outs GPR:$Rt), (ins GPR:$Rn), NoItinerary,
3178                     "ldrexb", "\t$Rt, [$Rn]",
3179                     []>;
3180 def LDREXH : AIldrex<0b11, (outs GPR:$Rt), (ins GPR:$Rn), NoItinerary,
3181                     "ldrexh", "\t$Rt, [$Rn]",
3182                     []>;
3183 def LDREX  : AIldrex<0b00, (outs GPR:$Rt), (ins GPR:$Rn), NoItinerary,
3184                     "ldrex", "\t$Rt, [$Rn]",
3185                     []>;
3186 def LDREXD : AIldrex<0b01, (outs GPR:$Rt, GPR:$Rt2), (ins GPR:$Rn),
3187                     NoItinerary,
3188                     "ldrexd", "\t$Rt, $Rt2, [$Rn]",
3189                     []>;
3190 }
3191
3192 let mayStore = 1, Constraints = "@earlyclobber $Rd" in {
3193 def STREXB : AIstrex<0b10, (outs GPR:$Rd), (ins GPR:$src, GPR:$Rn),
3194                     NoItinerary,
3195                     "strexb", "\t$Rd, $src, [$Rn]",
3196                     []>;
3197 def STREXH : AIstrex<0b11, (outs GPR:$Rd), (ins GPR:$Rt, GPR:$Rn),
3198                     NoItinerary,
3199                     "strexh", "\t$Rd, $Rt, [$Rn]",
3200                     []>;
3201 def STREX  : AIstrex<0b00, (outs GPR:$Rd), (ins GPR:$Rt, GPR:$Rn),
3202                     NoItinerary,
3203                     "strex", "\t$Rd, $Rt, [$Rn]",
3204                     []>;
3205 def STREXD : AIstrex<0b01, (outs GPR:$Rd),
3206                     (ins GPR:$Rt, GPR:$Rt2, GPR:$Rn),
3207                     NoItinerary,
3208                     "strexd", "\t$Rd, $Rt, $Rt2, [$Rn]",
3209                     []>;
3210 }
3211
3212 // Clear-Exclusive is for disassembly only.
3213 def CLREX : AXI<(outs), (ins), MiscFrm, NoItinerary, "clrex",
3214                 [/* For disassembly only; pattern left blank */]>,
3215             Requires<[IsARM, HasV7]>  {
3216   let Inst{31-0} = 0b11110101011111111111000000011111;
3217 }
3218
3219 // SWP/SWPB are deprecated in V6/V7 and for disassembly only.
3220 let mayLoad = 1 in {
3221 def SWP  : AIswp<0, (outs GPR:$Rt), (ins GPR:$Rt2, GPR:$Rn), "swp",
3222              [/* For disassembly only; pattern left blank */]>;
3223 def SWPB : AIswp<1, (outs GPR:$Rt), (ins GPR:$Rt2, GPR:$Rn), "swpb",
3224              [/* For disassembly only; pattern left blank */]>;
3225 }
3226
3227 //===----------------------------------------------------------------------===//
3228 // TLS Instructions
3229 //
3230
3231 // __aeabi_read_tp preserves the registers r1-r3.
3232 // FIXME: This needs to be a pseudo of some sort so that we can get the
3233 // encoding right, complete with fixup for the aeabi_read_tp function.
3234 let isCall = 1,
3235   Defs = [R0, R12, LR, CPSR], Uses = [SP] in {
3236   def TPsoft : ABXI<0b1011, (outs), (ins), IIC_Br,
3237                "bl\t__aeabi_read_tp",
3238                [(set R0, ARMthread_pointer)]>;
3239 }
3240
3241 //===----------------------------------------------------------------------===//
3242 // SJLJ Exception handling intrinsics
3243 //   eh_sjlj_setjmp() is an instruction sequence to store the return
3244 //   address and save #0 in R0 for the non-longjmp case.
3245 //   Since by its nature we may be coming from some other function to get
3246 //   here, and we're using the stack frame for the containing function to
3247 //   save/restore registers, we can't keep anything live in regs across
3248 //   the eh_sjlj_setjmp(), else it will almost certainly have been tromped upon
3249 //   when we get here from a longjmp(). We force everthing out of registers
3250 //   except for our own input by listing the relevant registers in Defs. By
3251 //   doing so, we also cause the prologue/epilogue code to actively preserve
3252 //   all of the callee-saved resgisters, which is exactly what we want.
3253 //   A constant value is passed in $val, and we use the location as a scratch.
3254 //
3255 // These are pseudo-instructions and are lowered to individual MC-insts, so
3256 // no encoding information is necessary.
3257 let Defs =
3258   [ R0,  R1,  R2,  R3,  R4,  R5,  R6,  R7,  R8,  R9,  R10, R11, R12, LR,  D0,
3259     D1,  D2,  D3,  D4,  D5,  D6,  D7,  D8,  D9,  D10, D11, D12, D13, D14, D15,
3260     D16, D17, D18, D19, D20, D21, D22, D23, D24, D25, D26, D27, D28, D29, D30,
3261     D31 ], hasSideEffects = 1, isBarrier = 1 in {
3262   def Int_eh_sjlj_setjmp : PseudoInst<(outs), (ins GPR:$src, GPR:$val),
3263                                NoItinerary,
3264                          [(set R0, (ARMeh_sjlj_setjmp GPR:$src, GPR:$val))]>,
3265                            Requires<[IsARM, HasVFP2]>;
3266 }
3267
3268 let Defs =
3269   [ R0,  R1,  R2,  R3,  R4,  R5,  R6,  R7,  R8,  R9,  R10, R11, R12, LR ],
3270   hasSideEffects = 1, isBarrier = 1 in {
3271   def Int_eh_sjlj_setjmp_nofp : PseudoInst<(outs), (ins GPR:$src, GPR:$val),
3272                                    NoItinerary,
3273                          [(set R0, (ARMeh_sjlj_setjmp GPR:$src, GPR:$val))]>,
3274                                 Requires<[IsARM, NoVFP]>;
3275 }
3276
3277 // FIXME: Non-Darwin version(s)
3278 let isBarrier = 1, hasSideEffects = 1, isTerminator = 1,
3279     Defs = [ R7, LR, SP ] in {
3280 def Int_eh_sjlj_longjmp : PseudoInst<(outs), (ins GPR:$src, GPR:$scratch),
3281                              NoItinerary,
3282                          [(ARMeh_sjlj_longjmp GPR:$src, GPR:$scratch)]>,
3283                                 Requires<[IsARM, IsDarwin]>;
3284 }
3285
3286 // eh.sjlj.dispatchsetup pseudo-instruction.
3287 // This pseudo is used for ARM, Thumb1 and Thumb2. Any differences are
3288 // handled when the pseudo is expanded (which happens before any passes
3289 // that need the instruction size).
3290 let isBarrier = 1, hasSideEffects = 1 in
3291 def Int_eh_sjlj_dispatchsetup :
3292  PseudoInst<(outs), (ins GPR:$src), NoItinerary,
3293             [(ARMeh_sjlj_dispatchsetup GPR:$src)]>,
3294               Requires<[IsDarwin]>;
3295
3296 //===----------------------------------------------------------------------===//
3297 // Non-Instruction Patterns
3298 //
3299
3300 // Large immediate handling.
3301
3302 // 32-bit immediate using two piece so_imms or movw + movt.
3303 // This is a single pseudo instruction, the benefit is that it can be remat'd
3304 // as a single unit instead of having to handle reg inputs.
3305 // FIXME: Remove this when we can do generalized remat.
3306 let isReMaterializable = 1, isMoveImm = 1 in
3307 def MOVi32imm : PseudoInst<(outs GPR:$dst), (ins i32imm:$src), IIC_iMOVix2,
3308                            [(set GPR:$dst, (arm_i32imm:$src))]>,
3309                            Requires<[IsARM]>;
3310
3311 // ConstantPool, GlobalAddress, and JumpTable
3312 def : ARMPat<(ARMWrapper  tglobaladdr :$dst), (LEApcrel tglobaladdr :$dst)>,
3313             Requires<[IsARM, DontUseMovt]>;
3314 def : ARMPat<(ARMWrapper  tconstpool  :$dst), (LEApcrel tconstpool  :$dst)>;
3315 def : ARMPat<(ARMWrapper  tglobaladdr :$dst), (MOVi32imm tglobaladdr :$dst)>,
3316             Requires<[IsARM, UseMovt]>;
3317 def : ARMPat<(ARMWrapperJT tjumptable:$dst, imm:$id),
3318              (LEApcrelJT tjumptable:$dst, imm:$id)>;
3319
3320 // TODO: add,sub,and, 3-instr forms?
3321
3322 // Tail calls
3323 def : ARMPat<(ARMtcret tcGPR:$dst),
3324           (TCRETURNri tcGPR:$dst)>, Requires<[IsDarwin]>;
3325
3326 def : ARMPat<(ARMtcret (i32 tglobaladdr:$dst)),
3327           (TCRETURNdi texternalsym:$dst)>, Requires<[IsDarwin]>;
3328
3329 def : ARMPat<(ARMtcret (i32 texternalsym:$dst)),
3330           (TCRETURNdi texternalsym:$dst)>, Requires<[IsDarwin]>;
3331
3332 def : ARMPat<(ARMtcret tcGPR:$dst),
3333           (TCRETURNriND tcGPR:$dst)>, Requires<[IsNotDarwin]>;
3334
3335 def : ARMPat<(ARMtcret (i32 tglobaladdr:$dst)),
3336           (TCRETURNdiND texternalsym:$dst)>, Requires<[IsNotDarwin]>;
3337
3338 def : ARMPat<(ARMtcret (i32 texternalsym:$dst)),
3339           (TCRETURNdiND texternalsym:$dst)>, Requires<[IsNotDarwin]>;
3340
3341 // Direct calls
3342 def : ARMPat<(ARMcall texternalsym:$func), (BL texternalsym:$func)>,
3343       Requires<[IsARM, IsNotDarwin]>;
3344 def : ARMPat<(ARMcall texternalsym:$func), (BLr9 texternalsym:$func)>,
3345       Requires<[IsARM, IsDarwin]>;
3346
3347 // zextload i1 -> zextload i8
3348 def : ARMPat<(zextloadi1 addrmode_imm12:$addr), (LDRBi12 addrmode_imm12:$addr)>;
3349 def : ARMPat<(zextloadi1 ldst_so_reg:$addr),    (LDRBrs ldst_so_reg:$addr)>;
3350
3351 // extload -> zextload
3352 def : ARMPat<(extloadi1 addrmode_imm12:$addr),  (LDRBi12 addrmode_imm12:$addr)>;
3353 def : ARMPat<(extloadi1 ldst_so_reg:$addr),     (LDRBrs ldst_so_reg:$addr)>;
3354 def : ARMPat<(extloadi8 addrmode_imm12:$addr),  (LDRBi12 addrmode_imm12:$addr)>;
3355 def : ARMPat<(extloadi8 ldst_so_reg:$addr),     (LDRBrs ldst_so_reg:$addr)>;
3356
3357 def : ARMPat<(extloadi16 addrmode3:$addr),  (LDRH addrmode3:$addr)>;
3358
3359 def : ARMPat<(extloadi8  addrmodepc:$addr), (PICLDRB addrmodepc:$addr)>;
3360 def : ARMPat<(extloadi16 addrmodepc:$addr), (PICLDRH addrmodepc:$addr)>;
3361
3362 // smul* and smla*
3363 def : ARMV5TEPat<(mul (sra (shl GPR:$a, (i32 16)), (i32 16)),
3364                       (sra (shl GPR:$b, (i32 16)), (i32 16))),
3365                  (SMULBB GPR:$a, GPR:$b)>;
3366 def : ARMV5TEPat<(mul sext_16_node:$a, sext_16_node:$b),
3367                  (SMULBB GPR:$a, GPR:$b)>;
3368 def : ARMV5TEPat<(mul (sra (shl GPR:$a, (i32 16)), (i32 16)),
3369                       (sra GPR:$b, (i32 16))),
3370                  (SMULBT GPR:$a, GPR:$b)>;
3371 def : ARMV5TEPat<(mul sext_16_node:$a, (sra GPR:$b, (i32 16))),
3372                  (SMULBT GPR:$a, GPR:$b)>;
3373 def : ARMV5TEPat<(mul (sra GPR:$a, (i32 16)),
3374                       (sra (shl GPR:$b, (i32 16)), (i32 16))),
3375                  (SMULTB GPR:$a, GPR:$b)>;
3376 def : ARMV5TEPat<(mul (sra GPR:$a, (i32 16)), sext_16_node:$b),
3377                 (SMULTB GPR:$a, GPR:$b)>;
3378 def : ARMV5TEPat<(sra (mul GPR:$a, (sra (shl GPR:$b, (i32 16)), (i32 16))),
3379                       (i32 16)),
3380                  (SMULWB GPR:$a, GPR:$b)>;
3381 def : ARMV5TEPat<(sra (mul GPR:$a, sext_16_node:$b), (i32 16)),
3382                  (SMULWB GPR:$a, GPR:$b)>;
3383
3384 def : ARMV5TEPat<(add GPR:$acc,
3385                       (mul (sra (shl GPR:$a, (i32 16)), (i32 16)),
3386                            (sra (shl GPR:$b, (i32 16)), (i32 16)))),
3387                  (SMLABB GPR:$a, GPR:$b, GPR:$acc)>;
3388 def : ARMV5TEPat<(add GPR:$acc,
3389                       (mul sext_16_node:$a, sext_16_node:$b)),
3390                  (SMLABB GPR:$a, GPR:$b, GPR:$acc)>;
3391 def : ARMV5TEPat<(add GPR:$acc,
3392                       (mul (sra (shl GPR:$a, (i32 16)), (i32 16)),
3393                            (sra GPR:$b, (i32 16)))),
3394                  (SMLABT GPR:$a, GPR:$b, GPR:$acc)>;
3395 def : ARMV5TEPat<(add GPR:$acc,
3396                       (mul sext_16_node:$a, (sra GPR:$b, (i32 16)))),
3397                  (SMLABT GPR:$a, GPR:$b, GPR:$acc)>;
3398 def : ARMV5TEPat<(add GPR:$acc,
3399                       (mul (sra GPR:$a, (i32 16)),
3400                            (sra (shl GPR:$b, (i32 16)), (i32 16)))),
3401                  (SMLATB GPR:$a, GPR:$b, GPR:$acc)>;
3402 def : ARMV5TEPat<(add GPR:$acc,
3403                       (mul (sra GPR:$a, (i32 16)), sext_16_node:$b)),
3404                  (SMLATB GPR:$a, GPR:$b, GPR:$acc)>;
3405 def : ARMV5TEPat<(add GPR:$acc,
3406                       (sra (mul GPR:$a, (sra (shl GPR:$b, (i32 16)), (i32 16))),
3407                            (i32 16))),
3408                  (SMLAWB GPR:$a, GPR:$b, GPR:$acc)>;
3409 def : ARMV5TEPat<(add GPR:$acc,
3410                       (sra (mul GPR:$a, sext_16_node:$b), (i32 16))),
3411                  (SMLAWB GPR:$a, GPR:$b, GPR:$acc)>;
3412
3413 //===----------------------------------------------------------------------===//
3414 // Thumb Support
3415 //
3416
3417 include "ARMInstrThumb.td"
3418
3419 //===----------------------------------------------------------------------===//
3420 // Thumb2 Support
3421 //
3422
3423 include "ARMInstrThumb2.td"
3424
3425 //===----------------------------------------------------------------------===//
3426 // Floating Point Support
3427 //
3428
3429 include "ARMInstrVFP.td"
3430
3431 //===----------------------------------------------------------------------===//
3432 // Advanced SIMD (NEON) Support
3433 //
3434
3435 include "ARMInstrNEON.td"
3436
3437 //===----------------------------------------------------------------------===//
3438 // Coprocessor Instructions.  For disassembly only.
3439 //
3440
3441 def CDP : ABI<0b1110, (outs), (ins nohash_imm:$cop, i32imm:$opc1,
3442             nohash_imm:$CRd, nohash_imm:$CRn, nohash_imm:$CRm, i32imm:$opc2),
3443             NoItinerary, "cdp", "\tp$cop, $opc1, cr$CRd, cr$CRn, cr$CRm, $opc2",
3444               [/* For disassembly only; pattern left blank */]> {
3445   let Inst{4} = 0;
3446 }
3447
3448 def CDP2 : ABXI<0b1110, (outs), (ins nohash_imm:$cop, i32imm:$opc1,
3449                nohash_imm:$CRd, nohash_imm:$CRn, nohash_imm:$CRm, i32imm:$opc2),
3450                NoItinerary, "cdp2\tp$cop, $opc1, cr$CRd, cr$CRn, cr$CRm, $opc2",
3451                [/* For disassembly only; pattern left blank */]> {
3452   let Inst{31-28} = 0b1111;
3453   let Inst{4} = 0;
3454 }
3455
3456 class ACI<dag oops, dag iops, string opc, string asm>
3457   : I<oops, iops, AddrModeNone, Size4Bytes, IndexModeNone, BrFrm, NoItinerary,
3458       opc, asm, "", [/* For disassembly only; pattern left blank */]> {
3459   let Inst{27-25} = 0b110;
3460 }
3461
3462 multiclass LdStCop<bits<4> op31_28, bit load, string opc> {
3463
3464   def _OFFSET : ACI<(outs),
3465       (ins nohash_imm:$cop, nohash_imm:$CRd, addrmode2:$addr),
3466       opc, "\tp$cop, cr$CRd, $addr"> {
3467     let Inst{31-28} = op31_28;
3468     let Inst{24} = 1; // P = 1
3469     let Inst{21} = 0; // W = 0
3470     let Inst{22} = 0; // D = 0
3471     let Inst{20} = load;
3472   }
3473
3474   def _PRE : ACI<(outs),
3475       (ins nohash_imm:$cop, nohash_imm:$CRd, addrmode2:$addr),
3476       opc, "\tp$cop, cr$CRd, $addr!"> {
3477     let Inst{31-28} = op31_28;
3478     let Inst{24} = 1; // P = 1
3479     let Inst{21} = 1; // W = 1
3480     let Inst{22} = 0; // D = 0
3481     let Inst{20} = load;
3482   }
3483
3484   def _POST : ACI<(outs),
3485       (ins nohash_imm:$cop, nohash_imm:$CRd, GPR:$base, am2offset:$offset),
3486       opc, "\tp$cop, cr$CRd, [$base], $offset"> {
3487     let Inst{31-28} = op31_28;
3488     let Inst{24} = 0; // P = 0
3489     let Inst{21} = 1; // W = 1
3490     let Inst{22} = 0; // D = 0
3491     let Inst{20} = load;
3492   }
3493
3494   def _OPTION : ACI<(outs),
3495       (ins nohash_imm:$cop, nohash_imm:$CRd, GPR:$base, i32imm:$option),
3496       opc, "\tp$cop, cr$CRd, [$base], $option"> {
3497     let Inst{31-28} = op31_28;
3498     let Inst{24} = 0; // P = 0
3499     let Inst{23} = 1; // U = 1
3500     let Inst{21} = 0; // W = 0
3501     let Inst{22} = 0; // D = 0
3502     let Inst{20} = load;
3503   }
3504
3505   def L_OFFSET : ACI<(outs),
3506       (ins nohash_imm:$cop, nohash_imm:$CRd, addrmode2:$addr),
3507       !strconcat(opc, "l"), "\tp$cop, cr$CRd, $addr"> {
3508     let Inst{31-28} = op31_28;
3509     let Inst{24} = 1; // P = 1
3510     let Inst{21} = 0; // W = 0
3511     let Inst{22} = 1; // D = 1
3512     let Inst{20} = load;
3513   }
3514
3515   def L_PRE : ACI<(outs),
3516       (ins nohash_imm:$cop, nohash_imm:$CRd, addrmode2:$addr),
3517       !strconcat(opc, "l"), "\tp$cop, cr$CRd, $addr!"> {
3518     let Inst{31-28} = op31_28;
3519     let Inst{24} = 1; // P = 1
3520     let Inst{21} = 1; // W = 1
3521     let Inst{22} = 1; // D = 1
3522     let Inst{20} = load;
3523   }
3524
3525   def L_POST : ACI<(outs),
3526       (ins nohash_imm:$cop, nohash_imm:$CRd, GPR:$base, am2offset:$offset),
3527       !strconcat(opc, "l"), "\tp$cop, cr$CRd, [$base], $offset"> {
3528     let Inst{31-28} = op31_28;
3529     let Inst{24} = 0; // P = 0
3530     let Inst{21} = 1; // W = 1
3531     let Inst{22} = 1; // D = 1
3532     let Inst{20} = load;
3533   }
3534
3535   def L_OPTION : ACI<(outs),
3536       (ins nohash_imm:$cop, nohash_imm:$CRd, GPR:$base, nohash_imm:$option),
3537       !strconcat(opc, "l"), "\tp$cop, cr$CRd, [$base], $option"> {
3538     let Inst{31-28} = op31_28;
3539     let Inst{24} = 0; // P = 0
3540     let Inst{23} = 1; // U = 1
3541     let Inst{21} = 0; // W = 0
3542     let Inst{22} = 1; // D = 1
3543     let Inst{20} = load;
3544   }
3545 }
3546
3547 defm LDC  : LdStCop<{?,?,?,?}, 1, "ldc">;
3548 defm LDC2 : LdStCop<0b1111,    1, "ldc2">;
3549 defm STC  : LdStCop<{?,?,?,?}, 0, "stc">;
3550 defm STC2 : LdStCop<0b1111,    0, "stc2">;
3551
3552 def MCR : ABI<0b1110, (outs), (ins nohash_imm:$cop, i32imm:$opc1,
3553               GPR:$Rt, nohash_imm:$CRn, nohash_imm:$CRm, i32imm:$opc2),
3554               NoItinerary, "mcr", "\tp$cop, $opc1, $Rt, cr$CRn, cr$CRm, $opc2",
3555               [/* For disassembly only; pattern left blank */]> {
3556   let Inst{20} = 0;
3557   let Inst{4} = 1;
3558 }
3559
3560 def MCR2 : ABXI<0b1110, (outs), (ins nohash_imm:$cop, i32imm:$opc1,
3561                 GPR:$Rt, nohash_imm:$CRn, nohash_imm:$CRm, i32imm:$opc2),
3562                 NoItinerary, "mcr2\tp$cop, $opc1, $Rt, cr$CRn, cr$CRm, $opc2",
3563                 [/* For disassembly only; pattern left blank */]> {
3564   let Inst{31-28} = 0b1111;
3565   let Inst{20} = 0;
3566   let Inst{4} = 1;
3567 }
3568
3569 def MRC : ABI<0b1110, (outs), (ins nohash_imm:$cop, i32imm:$opc1,
3570               GPR:$Rt, nohash_imm:$CRn, nohash_imm:$CRm, i32imm:$opc2),
3571               NoItinerary, "mrc", "\tp$cop, $opc1, $Rt, cr$CRn, cr$CRm, $opc2",
3572               [/* For disassembly only; pattern left blank */]> {
3573   let Inst{20} = 1;
3574   let Inst{4} = 1;
3575 }
3576
3577 def MRC2 : ABXI<0b1110, (outs), (ins nohash_imm:$cop, i32imm:$opc1,
3578                 GPR:$Rt, nohash_imm:$CRn, nohash_imm:$CRm, i32imm:$opc2),
3579                 NoItinerary, "mrc2\tp$cop, $opc1, $Rt, cr$CRn, cr$CRm, $opc2",
3580                 [/* For disassembly only; pattern left blank */]> {
3581   let Inst{31-28} = 0b1111;
3582   let Inst{20} = 1;
3583   let Inst{4} = 1;
3584 }
3585
3586 def MCRR : ABI<0b1100, (outs), (ins nohash_imm:$cop, i32imm:$opc,
3587                GPR:$Rt, GPR:$Rt2, nohash_imm:$CRm),
3588                NoItinerary, "mcrr", "\tp$cop, $opc, $Rt, $Rt2, cr$CRm",
3589                [/* For disassembly only; pattern left blank */]> {
3590   let Inst{23-20} = 0b0100;
3591 }
3592
3593 def MCRR2 : ABXI<0b1100, (outs), (ins nohash_imm:$cop, i32imm:$opc,
3594                  GPR:$Rt, GPR:$Rt2, nohash_imm:$CRm),
3595                  NoItinerary, "mcrr2\tp$cop, $opc, $Rt, $Rt2, cr$CRm",
3596                  [/* For disassembly only; pattern left blank */]> {
3597   let Inst{31-28} = 0b1111;
3598   let Inst{23-20} = 0b0100;
3599 }
3600
3601 def MRRC : ABI<0b1100, (outs), (ins nohash_imm:$cop, i32imm:$opc,
3602                GPR:$Rt, GPR:$Rt2, nohash_imm:$CRm),
3603                NoItinerary, "mrrc", "\tp$cop, $opc, $Rt, $Rt2, cr$CRm",
3604                [/* For disassembly only; pattern left blank */]> {
3605   let Inst{23-20} = 0b0101;
3606 }
3607
3608 def MRRC2 : ABXI<0b1100, (outs), (ins nohash_imm:$cop, i32imm:$opc,
3609                  GPR:$Rt, GPR:$Rt2, nohash_imm:$CRm),
3610                  NoItinerary, "mrrc2\tp$cop, $opc, $Rt, $Rt2, cr$CRm",
3611                  [/* For disassembly only; pattern left blank */]> {
3612   let Inst{31-28} = 0b1111;
3613   let Inst{23-20} = 0b0101;
3614 }
3615
3616 //===----------------------------------------------------------------------===//
3617 // Move between special register and ARM core register -- for disassembly only
3618 //
3619
3620 def MRS : ABI<0b0001,(outs GPR:$dst),(ins), NoItinerary, "mrs", "\t$dst, cpsr",
3621               [/* For disassembly only; pattern left blank */]> {
3622   let Inst{23-20} = 0b0000;
3623   let Inst{7-4} = 0b0000;
3624 }
3625
3626 def MRSsys : ABI<0b0001,(outs GPR:$dst),(ins), NoItinerary,"mrs","\t$dst, spsr",
3627               [/* For disassembly only; pattern left blank */]> {
3628   let Inst{23-20} = 0b0100;
3629   let Inst{7-4} = 0b0000;
3630 }
3631
3632 def MSR : ABI<0b0001, (outs), (ins GPR:$src, msr_mask:$mask), NoItinerary,
3633               "msr", "\tcpsr$mask, $src",
3634               [/* For disassembly only; pattern left blank */]> {
3635   let Inst{23-20} = 0b0010;
3636   let Inst{7-4} = 0b0000;
3637 }
3638
3639 def MSRi : ABI<0b0011, (outs), (ins so_imm:$a, msr_mask:$mask), NoItinerary,
3640               "msr", "\tcpsr$mask, $a",
3641               [/* For disassembly only; pattern left blank */]> {
3642   let Inst{23-20} = 0b0010;
3643   let Inst{7-4} = 0b0000;
3644 }
3645
3646 def MSRsys : ABI<0b0001, (outs), (ins GPR:$src, msr_mask:$mask), NoItinerary,
3647               "msr", "\tspsr$mask, $src",
3648               [/* For disassembly only; pattern left blank */]> {
3649   let Inst{23-20} = 0b0110;
3650   let Inst{7-4} = 0b0000;
3651 }
3652
3653 def MSRsysi : ABI<0b0011, (outs), (ins so_imm:$a, msr_mask:$mask), NoItinerary,
3654               "msr", "\tspsr$mask, $a",
3655               [/* For disassembly only; pattern left blank */]> {
3656   let Inst{23-20} = 0b0110;
3657   let Inst{7-4} = 0b0000;
3658 }