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