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