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