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