ARMInstrThumb2.td revision 0635fc5c2726bff3a6cbe91d2ad0f3bcda00671a
1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//===- ARMInstrThumb2.td - Thumb2 support for ARM -------------------------===//
2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//                     The LLVM Compiler Infrastructure
4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is distributed under the University of Illinois Open Source
6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// License. See LICENSE.TXT for details.
7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//===----------------------------------------------------------------------===//
9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file describes the Thumb2 instruction set.
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//===----------------------------------------------------------------------===//
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// IT block predicate field
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathdef it_pred : Operand<i32> {
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  let PrintMethod = "printMandatoryPredicateOperand";
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// IT block condition mask
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathdef it_mask : Operand<i32> {
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  let PrintMethod = "printThumbITMask";
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Table branch address
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathdef tb_addrmode : Operand<i32> {
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  let PrintMethod = "printTBAddrMode";
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Shifted operands. No register controlled shifts for Thumb2.
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Note: We do not support rrx shifted operands yet.
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathdef t2_so_reg : Operand<i32>,    // reg imm
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                ComplexPattern<i32, 2, "SelectT2ShifterOperandReg",
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                               [shl,srl,sra,rotr]> {
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  let PrintMethod = "printT2SOOperand";
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  let MIOperandInfo = (ops GPR, i32imm);
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// t2_so_imm_not_XFORM - Return the complement of a t2_so_imm value
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathdef t2_so_imm_not_XFORM : SDNodeXForm<imm, [{
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return CurDAG->getTargetConstant(~((uint32_t)N->getZExtValue()), MVT::i32);
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}]>;
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// t2_so_imm_neg_XFORM - Return the negation of a t2_so_imm value
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathdef t2_so_imm_neg_XFORM : SDNodeXForm<imm, [{
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return CurDAG->getTargetConstant(-((int)N->getZExtValue()), MVT::i32);
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}]>;
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// t2_so_imm - Match a 32-bit immediate operand, which is an
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 8-bit immediate rotated by an arbitrary number of bits, or an 8-bit
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// immediate splatted into multiple bytes of the word. t2_so_imm values are
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// represented in the imm field in the same 12-bit form that they are encoded
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// into t2_so_imm instructions: the 8-bit immediate is the least significant
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// bits [bits 0-7], the 4-bit shift/splat amount is the next 4 bits [bits 8-11].
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathdef t2_so_imm : Operand<i32>,
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                PatLeaf<(imm), [{
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return ARM_AM::getT2SOImmVal((uint32_t)N->getZExtValue()) != -1;
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}]>;
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// t2_so_imm_not - Match an immediate that is a complement
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// of a t2_so_imm.
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathdef t2_so_imm_not : Operand<i32>,
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    PatLeaf<(imm), [{
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return ARM_AM::getT2SOImmVal(~((uint32_t)N->getZExtValue())) != -1;
64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}], t2_so_imm_not_XFORM>;
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// t2_so_imm_neg - Match an immediate that is a negation of a t2_so_imm.
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathdef t2_so_imm_neg : Operand<i32>,
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    PatLeaf<(imm), [{
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return ARM_AM::getT2SOImmVal(-((int)N->getZExtValue())) != -1;
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}], t2_so_imm_neg_XFORM>;
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Break t2_so_imm's up into two pieces.  This handles immediates with up to 16
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// bits set in them.  This uses t2_so_imm2part to match and t2_so_imm2part_[12]
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// to get the first/second pieces.
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathdef t2_so_imm2part : Operand<i32>,
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                  PatLeaf<(imm), [{
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return ARM_AM::isT2SOImmTwoPartVal((unsigned)N->getZExtValue());
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }]> {
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathdef t2_so_imm2part_1 : SDNodeXForm<imm, [{
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  unsigned V = ARM_AM::getT2SOImmTwoPartFirst((unsigned)N->getZExtValue());
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return CurDAG->getTargetConstant(V, MVT::i32);
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}]>;
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathdef t2_so_imm2part_2 : SDNodeXForm<imm, [{
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  unsigned V = ARM_AM::getT2SOImmTwoPartSecond((unsigned)N->getZExtValue());
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return CurDAG->getTargetConstant(V, MVT::i32);
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}]>;
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathdef t2_so_neg_imm2part : Operand<i32>, PatLeaf<(imm), [{
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      return ARM_AM::isT2SOImmTwoPartVal(-(int)N->getZExtValue());
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }]> {
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathdef t2_so_neg_imm2part_1 : SDNodeXForm<imm, [{
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  unsigned V = ARM_AM::getT2SOImmTwoPartFirst(-(int)N->getZExtValue());
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return CurDAG->getTargetConstant(V, MVT::i32);
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}]>;
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathdef t2_so_neg_imm2part_2 : SDNodeXForm<imm, [{
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  unsigned V = ARM_AM::getT2SOImmTwoPartSecond(-(int)N->getZExtValue());
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return CurDAG->getTargetConstant(V, MVT::i32);
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}]>;
105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/// imm1_31 predicate - True if the 32-bit immediate is in the range [1,31].
107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathdef imm1_31 : PatLeaf<(i32 imm), [{
108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return (int32_t)N->getZExtValue() >= 1 && (int32_t)N->getZExtValue() < 32;
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}]>;
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/// imm0_4095 predicate - True if the 32-bit immediate is in the range [0.4095].
112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathdef imm0_4095 : Operand<i32>,
113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                PatLeaf<(i32 imm), [{
114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return (uint32_t)N->getZExtValue() < 4096;
115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}]>;
116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathdef imm0_4095_neg : PatLeaf<(i32 imm), [{
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return (uint32_t)(-N->getZExtValue()) < 4096;
119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}], imm_neg_XFORM>;
120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathdef imm0_255_neg : PatLeaf<(i32 imm), [{
122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return (uint32_t)(-N->getZExtValue()) < 255;
123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}], imm_neg_XFORM>;
124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Define Thumb2 specific addressing modes.
126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// t2addrmode_imm12  := reg + imm12
128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathdef t2addrmode_imm12 : Operand<i32>,
129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                       ComplexPattern<i32, 2, "SelectT2AddrModeImm12", []> {
130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  let PrintMethod = "printT2AddrModeImm12Operand";
131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  let MIOperandInfo = (ops GPR:$base, i32imm:$offsimm);
132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// t2addrmode_imm8  := reg +/- imm8
135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathdef t2addrmode_imm8 : Operand<i32>,
136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                      ComplexPattern<i32, 2, "SelectT2AddrModeImm8", []> {
137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  let PrintMethod = "printT2AddrModeImm8Operand";
138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  let MIOperandInfo = (ops GPR:$base, i32imm:$offsimm);
139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathdef t2am_imm8_offset : Operand<i32>,
142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                       ComplexPattern<i32, 1, "SelectT2AddrModeImm8Offset", []>{
143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  let PrintMethod = "printT2AddrModeImm8OffsetOperand";
144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// t2addrmode_imm8s4  := reg +/- (imm8 << 2)
147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathdef t2addrmode_imm8s4 : Operand<i32>,
148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                        ComplexPattern<i32, 2, "SelectT2AddrModeImm8s4", []> {
149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  let PrintMethod = "printT2AddrModeImm8s4Operand";
150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  let MIOperandInfo = (ops GPR:$base, i32imm:$offsimm);
151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// t2addrmode_so_reg  := reg + (reg << imm2)
154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathdef t2addrmode_so_reg : Operand<i32>,
155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                        ComplexPattern<i32, 3, "SelectT2AddrModeSoReg", []> {
156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  let PrintMethod = "printT2AddrModeSoRegOperand";
157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  let MIOperandInfo = (ops GPR:$base, GPR:$offsreg, i32imm:$offsimm);
158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//===----------------------------------------------------------------------===//
162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Multiclass helpers...
163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/// T2I_un_irs - Defines a set of (op reg, {so_imm|r|so_reg}) patterns for a
166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/// unary operation that produces a value. These are predicable and can be
167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/// changed to modify CPSR.
168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathmulticlass T2I_un_irs<bits<4> opcod, string opc, PatFrag opnode,
169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                      bit Cheap = 0, bit ReMat = 0> {
170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   // shifted imm
171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   def i : T2sI<(outs GPR:$dst), (ins t2_so_imm:$src), IIC_iMOVi,
172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                opc, "\t$dst, $src",
173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                [(set GPR:$dst, (opnode t2_so_imm:$src))]> {
174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let isAsCheapAsAMove = Cheap;
175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let isReMaterializable = ReMat;
176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{31-27} = 0b11110;
177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{25} = 0;
178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{24-21} = opcod;
179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{20} = ?; // The S bit.
180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{19-16} = 0b1111; // Rn
181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{15} = 0;
182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   }
183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   // register
184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   def r : T2I<(outs GPR:$dst), (ins GPR:$src), IIC_iMOVr,
185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath               opc, ".w\t$dst, $src",
186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                [(set GPR:$dst, (opnode GPR:$src))]> {
187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{31-27} = 0b11101;
188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{26-25} = 0b01;
189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{24-21} = opcod;
190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{20} = ?; // The S bit.
191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{19-16} = 0b1111; // Rn
192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{14-12} = 0b000; // imm3
193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{7-6} = 0b00; // imm2
194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{5-4} = 0b00; // type
195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   }
196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   // shifted register
197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   def s : T2I<(outs GPR:$dst), (ins t2_so_reg:$src), IIC_iMOVsi,
198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath               opc, ".w\t$dst, $src",
199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath               [(set GPR:$dst, (opnode t2_so_reg:$src))]> {
200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{31-27} = 0b11101;
201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{26-25} = 0b01;
202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{24-21} = opcod;
203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{20} = ?; // The S bit.
204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{19-16} = 0b1111; // Rn
205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   }
206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/// T2I_bin_irs - Defines a set of (op reg, {so_imm|r|so_reg}) patterns for a
209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//  binary operation that produces a value. These are predicable and can be
210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/// changed to modify CPSR.
211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathmulticlass T2I_bin_irs<bits<4> opcod, string opc, PatFrag opnode,
212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                       bit Commutable = 0, string wide =""> {
213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   // shifted imm
214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   def ri : T2sI<(outs GPR:$dst), (ins GPR:$lhs, t2_so_imm:$rhs), IIC_iALUi,
215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                 opc, "\t$dst, $lhs, $rhs",
216c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                 [(set GPR:$dst, (opnode GPR:$lhs, t2_so_imm:$rhs))]> {
217c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{31-27} = 0b11110;
218c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{25} = 0;
219c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{24-21} = opcod;
220c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{20} = ?; // The S bit.
221c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{15} = 0;
222c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   }
223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   // register
224c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   def rr : T2sI<(outs GPR:$dst), (ins GPR:$lhs, GPR:$rhs), IIC_iALUr,
225c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                 opc, !strconcat(wide, "\t$dst, $lhs, $rhs"),
226c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                 [(set GPR:$dst, (opnode GPR:$lhs, GPR:$rhs))]> {
227c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let isCommutable = Commutable;
228c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{31-27} = 0b11101;
229c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{26-25} = 0b01;
230c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{24-21} = opcod;
231c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{20} = ?; // The S bit.
232c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{14-12} = 0b000; // imm3
233c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{7-6} = 0b00; // imm2
234c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{5-4} = 0b00; // type
235c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   }
236c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   // shifted register
237c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   def rs : T2sI<(outs GPR:$dst), (ins GPR:$lhs, t2_so_reg:$rhs), IIC_iALUsi,
238c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                 opc, !strconcat(wide, "\t$dst, $lhs, $rhs"),
239c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                 [(set GPR:$dst, (opnode GPR:$lhs, t2_so_reg:$rhs))]> {
240c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{31-27} = 0b11101;
241c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{26-25} = 0b01;
242c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{24-21} = opcod;
243c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{20} = ?; // The S bit.
244c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   }
245c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
246c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
247c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/// T2I_bin_w_irs - Same as T2I_bin_irs except these operations need
248c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//  the ".w" prefix to indicate that they are wide.
249c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathmulticlass T2I_bin_w_irs<bits<4> opcod, string opc, PatFrag opnode,
250c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                         bit Commutable = 0> :
251c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    T2I_bin_irs<opcod, opc, opnode, Commutable, ".w">;
252c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
253c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/// T2I_rbin_is - Same as T2I_bin_irs except the order of operands are
254c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/// reversed. It doesn't define the 'rr' form since it's handled by its
255c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/// T2I_bin_irs counterpart.
256c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathmulticlass T2I_rbin_is<bits<4> opcod, string opc, PatFrag opnode> {
257c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   // shifted imm
258c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   def ri : T2I<(outs GPR:$dst), (ins GPR:$rhs, t2_so_imm:$lhs), IIC_iALUi,
259c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                opc, ".w\t$dst, $rhs, $lhs",
260c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                [(set GPR:$dst, (opnode t2_so_imm:$lhs, GPR:$rhs))]> {
261c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{31-27} = 0b11110;
262c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{25} = 0;
263c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{24-21} = opcod;
264c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{20} = 0; // The S bit.
265c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{15} = 0;
266c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   }
267c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   // shifted register
268c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   def rs : T2I<(outs GPR:$dst), (ins GPR:$rhs, t2_so_reg:$lhs), IIC_iALUsi,
269c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                opc, "\t$dst, $rhs, $lhs",
270c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                [(set GPR:$dst, (opnode t2_so_reg:$lhs, GPR:$rhs))]> {
271c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{31-27} = 0b11101;
272c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{26-25} = 0b01;
273c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{24-21} = opcod;
274c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{20} = 0; // The S bit.
275c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   }
276c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
277c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
278c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/// T2I_bin_s_irs - Similar to T2I_bin_irs except it sets the 's' bit so the
279c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/// instruction modifies the CPSR register.
280c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathlet Defs = [CPSR] in {
281c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathmulticlass T2I_bin_s_irs<bits<4> opcod, string opc, PatFrag opnode,
282c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                         bit Commutable = 0> {
283c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   // shifted imm
284c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   def ri : T2I<(outs GPR:$dst), (ins GPR:$lhs, t2_so_imm:$rhs), IIC_iALUi,
285c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                !strconcat(opc, "s"), ".w\t$dst, $lhs, $rhs",
286c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                [(set GPR:$dst, (opnode GPR:$lhs, t2_so_imm:$rhs))]> {
287c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{31-27} = 0b11110;
288c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{25} = 0;
289c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{24-21} = opcod;
290c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{20} = 1; // The S bit.
291c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{15} = 0;
292c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   }
293c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   // register
294c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   def rr : T2I<(outs GPR:$dst), (ins GPR:$lhs, GPR:$rhs), IIC_iALUr,
295c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                !strconcat(opc, "s"), ".w\t$dst, $lhs, $rhs",
296c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                [(set GPR:$dst, (opnode GPR:$lhs, GPR:$rhs))]> {
297c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let isCommutable = Commutable;
298c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{31-27} = 0b11101;
299c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{26-25} = 0b01;
300c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{24-21} = opcod;
301c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{20} = 1; // The S bit.
302c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{14-12} = 0b000; // imm3
303c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{7-6} = 0b00; // imm2
304c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{5-4} = 0b00; // type
305c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   }
306c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   // shifted register
307c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   def rs : T2I<(outs GPR:$dst), (ins GPR:$lhs, t2_so_reg:$rhs), IIC_iALUsi,
308c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                !strconcat(opc, "s"), ".w\t$dst, $lhs, $rhs",
309c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                [(set GPR:$dst, (opnode GPR:$lhs, t2_so_reg:$rhs))]> {
310c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{31-27} = 0b11101;
311c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{26-25} = 0b01;
312c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{24-21} = opcod;
313c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{20} = 1; // The S bit.
314c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   }
315c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
316c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
317c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
318c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/// T2I_bin_ii12rs - Defines a set of (op reg, {so_imm|imm0_4095|r|so_reg})
319c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/// patterns for a binary operation that produces a value.
320c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathmulticlass T2I_bin_ii12rs<bits<3> op23_21, string opc, PatFrag opnode,
321c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                          bit Commutable = 0> {
322c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   // shifted imm
323c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   def ri : T2sI<(outs GPR:$dst), (ins GPR:$lhs, t2_so_imm:$rhs), IIC_iALUi,
324c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                 opc, ".w\t$dst, $lhs, $rhs",
325c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                 [(set GPR:$dst, (opnode GPR:$lhs, t2_so_imm:$rhs))]> {
326c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{31-27} = 0b11110;
327c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{25} = 0;
328c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{24} = 1;
329c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{23-21} = op23_21;
330c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{20} = 0; // The S bit.
331c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{15} = 0;
332c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   }
333c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   // 12-bit imm
334c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   def ri12 : T2sI<(outs GPR:$dst), (ins GPR:$lhs, imm0_4095:$rhs), IIC_iALUi,
335c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                   !strconcat(opc, "w"), "\t$dst, $lhs, $rhs",
336c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                   [(set GPR:$dst, (opnode GPR:$lhs, imm0_4095:$rhs))]> {
337c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{31-27} = 0b11110;
338c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{25} = 1;
339c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{24} = 0;
340c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{23-21} = op23_21;
341c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{20} = 0; // The S bit.
342c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{15} = 0;
343c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   }
344c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   // register
345c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   def rr : T2sI<(outs GPR:$dst), (ins GPR:$lhs, GPR:$rhs), IIC_iALUr,
346c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                 opc, ".w\t$dst, $lhs, $rhs",
347c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                 [(set GPR:$dst, (opnode GPR:$lhs, GPR:$rhs))]> {
348c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let isCommutable = Commutable;
349c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{31-27} = 0b11101;
350c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{26-25} = 0b01;
351c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{24} = 1;
352c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{23-21} = op23_21;
353c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{20} = 0; // The S bit.
354c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{14-12} = 0b000; // imm3
355c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{7-6} = 0b00; // imm2
356c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{5-4} = 0b00; // type
357c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   }
358c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   // shifted register
359c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   def rs : T2sI<(outs GPR:$dst), (ins GPR:$lhs, t2_so_reg:$rhs), IIC_iALUsi,
360c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                 opc, ".w\t$dst, $lhs, $rhs",
361c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                 [(set GPR:$dst, (opnode GPR:$lhs, t2_so_reg:$rhs))]> {
362c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{31-27} = 0b11101;
363c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{26-25} = 0b01;
364c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{24} = 1;
365c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{23-21} = op23_21;
366c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{20} = 0; // The S bit.
367c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   }
368c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
369c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
370c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/// T2I_adde_sube_irs - Defines a set of (op reg, {so_imm|r|so_reg}) patterns
371c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/// for a binary operation that produces a value and use the carry
372c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/// bit. It's not predicable.
373c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathlet Uses = [CPSR] in {
374c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathmulticlass T2I_adde_sube_irs<bits<4> opcod, string opc, PatFrag opnode,
375c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                             bit Commutable = 0> {
376c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   // shifted imm
377c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   def ri : T2sI<(outs GPR:$dst), (ins GPR:$lhs, t2_so_imm:$rhs), IIC_iALUi,
378c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                 opc, "\t$dst, $lhs, $rhs",
379c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                 [(set GPR:$dst, (opnode GPR:$lhs, t2_so_imm:$rhs))]>,
380c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                 Requires<[IsThumb2]> {
381c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{31-27} = 0b11110;
382c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{25} = 0;
383c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{24-21} = opcod;
384c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{20} = 0; // The S bit.
385c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{15} = 0;
386c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   }
387c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   // register
388c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   def rr : T2sI<(outs GPR:$dst), (ins GPR:$lhs, GPR:$rhs), IIC_iALUr,
389c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                 opc, ".w\t$dst, $lhs, $rhs",
390c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                 [(set GPR:$dst, (opnode GPR:$lhs, GPR:$rhs))]>,
391c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                 Requires<[IsThumb2]> {
392c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let isCommutable = Commutable;
393c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{31-27} = 0b11101;
394c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{26-25} = 0b01;
395c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{24-21} = opcod;
396c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath     let Inst{20} = 0; // The S bit.
397     let Inst{14-12} = 0b000; // imm3
398     let Inst{7-6} = 0b00; // imm2
399     let Inst{5-4} = 0b00; // type
400   }
401   // shifted register
402   def rs : T2sI<(outs GPR:$dst), (ins GPR:$lhs, t2_so_reg:$rhs), IIC_iALUsi,
403                 opc, ".w\t$dst, $lhs, $rhs",
404                 [(set GPR:$dst, (opnode GPR:$lhs, t2_so_reg:$rhs))]>,
405                 Requires<[IsThumb2]> {
406     let Inst{31-27} = 0b11101;
407     let Inst{26-25} = 0b01;
408     let Inst{24-21} = opcod;
409     let Inst{20} = 0; // The S bit.
410   }
411}
412
413// Carry setting variants
414let Defs = [CPSR] in {
415multiclass T2I_adde_sube_s_irs<bits<4> opcod, string opc, PatFrag opnode,
416                               bit Commutable = 0> {
417   // shifted imm
418   def ri : T2sI<(outs GPR:$dst), (ins GPR:$lhs, t2_so_imm:$rhs), IIC_iALUi,
419                 opc, "\t$dst, $lhs, $rhs",
420                 [(set GPR:$dst, (opnode GPR:$lhs, t2_so_imm:$rhs))]>,
421                 Requires<[IsThumb2]> {
422     let Inst{31-27} = 0b11110;
423     let Inst{25} = 0;
424     let Inst{24-21} = opcod;
425     let Inst{20} = 1; // The S bit.
426     let Inst{15} = 0;
427   }
428   // register
429   def rr : T2sI<(outs GPR:$dst), (ins GPR:$lhs, GPR:$rhs), IIC_iALUr,
430                 opc, ".w\t$dst, $lhs, $rhs",
431                 [(set GPR:$dst, (opnode GPR:$lhs, GPR:$rhs))]>,
432                 Requires<[IsThumb2]> {
433     let isCommutable = Commutable;
434     let Inst{31-27} = 0b11101;
435     let Inst{26-25} = 0b01;
436     let Inst{24-21} = opcod;
437     let Inst{20} = 1; // The S bit.
438     let Inst{14-12} = 0b000; // imm3
439     let Inst{7-6} = 0b00; // imm2
440     let Inst{5-4} = 0b00; // type
441   }
442   // shifted register
443   def rs : T2sI<(outs GPR:$dst), (ins GPR:$lhs, t2_so_reg:$rhs), IIC_iALUsi,
444                 opc, ".w\t$dst, $lhs, $rhs",
445                 [(set GPR:$dst, (opnode GPR:$lhs, t2_so_reg:$rhs))]>,
446                 Requires<[IsThumb2]> {
447     let Inst{31-27} = 0b11101;
448     let Inst{26-25} = 0b01;
449     let Inst{24-21} = opcod;
450     let Inst{20} = 1; // The S bit.
451   }
452}
453}
454}
455
456/// T2I_rbin_s_is - Same as T2I_rbin_is except sets 's' bit.
457let Defs = [CPSR] in {
458multiclass T2I_rbin_s_is<bits<4> opcod, string opc, PatFrag opnode> {
459   // shifted imm
460   def ri : T2XI<(outs GPR:$dst), (ins GPR:$rhs, t2_so_imm:$lhs, cc_out:$s),
461                 IIC_iALUi,
462                 !strconcat(opc, "${s}.w\t$dst, $rhs, $lhs"),
463                 [(set GPR:$dst, (opnode t2_so_imm:$lhs, GPR:$rhs))]> {
464     let Inst{31-27} = 0b11110;
465     let Inst{25} = 0;
466     let Inst{24-21} = opcod;
467     let Inst{20} = 1; // The S bit.
468     let Inst{15} = 0;
469   }
470   // shifted register
471   def rs : T2XI<(outs GPR:$dst), (ins GPR:$rhs, t2_so_reg:$lhs, cc_out:$s),
472                 IIC_iALUsi,
473                 !strconcat(opc, "${s}\t$dst, $rhs, $lhs"),
474                 [(set GPR:$dst, (opnode t2_so_reg:$lhs, GPR:$rhs))]> {
475     let Inst{31-27} = 0b11101;
476     let Inst{26-25} = 0b01;
477     let Inst{24-21} = opcod;
478     let Inst{20} = 1; // The S bit.
479   }
480}
481}
482
483/// T2I_sh_ir - Defines a set of (op reg, {so_imm|r}) patterns for a shift /
484//  rotate operation that produces a value.
485multiclass T2I_sh_ir<bits<2> opcod, string opc, PatFrag opnode> {
486   // 5-bit imm
487   def ri : T2sI<(outs GPR:$dst), (ins GPR:$lhs, i32imm:$rhs), IIC_iMOVsi,
488                 opc, ".w\t$dst, $lhs, $rhs",
489                 [(set GPR:$dst, (opnode GPR:$lhs, imm1_31:$rhs))]> {
490     let Inst{31-27} = 0b11101;
491     let Inst{26-21} = 0b010010;
492     let Inst{19-16} = 0b1111; // Rn
493     let Inst{5-4} = opcod;
494   }
495   // register
496   def rr : T2sI<(outs GPR:$dst), (ins GPR:$lhs, GPR:$rhs), IIC_iMOVsr,
497                 opc, ".w\t$dst, $lhs, $rhs",
498                 [(set GPR:$dst, (opnode GPR:$lhs, GPR:$rhs))]> {
499     let Inst{31-27} = 0b11111;
500     let Inst{26-23} = 0b0100;
501     let Inst{22-21} = opcod;
502     let Inst{15-12} = 0b1111;
503     let Inst{7-4} = 0b0000;
504   }
505}
506
507/// T2I_cmp_irs - Defines a set of (op r, {so_imm|r|so_reg}) cmp / test
508/// patterns. Similar to T2I_bin_irs except the instruction does not produce
509/// a explicit result, only implicitly set CPSR.
510let Defs = [CPSR] in {
511multiclass T2I_cmp_irs<bits<4> opcod, string opc, PatFrag opnode> {
512   // shifted imm
513   def ri : T2I<(outs), (ins GPR:$lhs, t2_so_imm:$rhs), IIC_iCMPi,
514                opc, ".w\t$lhs, $rhs",
515                [(opnode GPR:$lhs, t2_so_imm:$rhs)]> {
516     let Inst{31-27} = 0b11110;
517     let Inst{25} = 0;
518     let Inst{24-21} = opcod;
519     let Inst{20} = 1; // The S bit.
520     let Inst{15} = 0;
521     let Inst{11-8} = 0b1111; // Rd
522   }
523   // register
524   def rr : T2I<(outs), (ins GPR:$lhs, GPR:$rhs), IIC_iCMPr,
525                opc, ".w\t$lhs, $rhs",
526                [(opnode GPR:$lhs, GPR:$rhs)]> {
527     let Inst{31-27} = 0b11101;
528     let Inst{26-25} = 0b01;
529     let Inst{24-21} = opcod;
530     let Inst{20} = 1; // The S bit.
531     let Inst{14-12} = 0b000; // imm3
532     let Inst{11-8} = 0b1111; // Rd
533     let Inst{7-6} = 0b00; // imm2
534     let Inst{5-4} = 0b00; // type
535   }
536   // shifted register
537   def rs : T2I<(outs), (ins GPR:$lhs, t2_so_reg:$rhs), IIC_iCMPsi,
538                opc, ".w\t$lhs, $rhs",
539                [(opnode GPR:$lhs, t2_so_reg:$rhs)]> {
540     let Inst{31-27} = 0b11101;
541     let Inst{26-25} = 0b01;
542     let Inst{24-21} = opcod;
543     let Inst{20} = 1; // The S bit.
544     let Inst{11-8} = 0b1111; // Rd
545   }
546}
547}
548
549/// T2I_ld - Defines a set of (op r, {imm12|imm8|so_reg}) load patterns.
550multiclass T2I_ld<bit signed, bits<2> opcod, string opc, PatFrag opnode> {
551  def i12 : T2Ii12<(outs GPR:$dst), (ins t2addrmode_imm12:$addr), IIC_iLoadi,
552                   opc, ".w\t$dst, $addr",
553                   [(set GPR:$dst, (opnode t2addrmode_imm12:$addr))]> {
554    let Inst{31-27} = 0b11111;
555    let Inst{26-25} = 0b00;
556    let Inst{24} = signed;
557    let Inst{23} = 1;
558    let Inst{22-21} = opcod;
559    let Inst{20} = 1; // load
560  }
561  def i8  : T2Ii8 <(outs GPR:$dst), (ins t2addrmode_imm8:$addr), IIC_iLoadi,
562                   opc, "\t$dst, $addr",
563                   [(set GPR:$dst, (opnode t2addrmode_imm8:$addr))]> {
564    let Inst{31-27} = 0b11111;
565    let Inst{26-25} = 0b00;
566    let Inst{24} = signed;
567    let Inst{23} = 0;
568    let Inst{22-21} = opcod;
569    let Inst{20} = 1; // load
570    let Inst{11} = 1;
571    // Offset: index==TRUE, wback==FALSE
572    let Inst{10} = 1; // The P bit.
573    let Inst{8} = 0; // The W bit.
574  }
575  def s   : T2Iso <(outs GPR:$dst), (ins t2addrmode_so_reg:$addr), IIC_iLoadr,
576                   opc, ".w\t$dst, $addr",
577                   [(set GPR:$dst, (opnode t2addrmode_so_reg:$addr))]> {
578    let Inst{31-27} = 0b11111;
579    let Inst{26-25} = 0b00;
580    let Inst{24} = signed;
581    let Inst{23} = 0;
582    let Inst{22-21} = opcod;
583    let Inst{20} = 1; // load
584    let Inst{11-6} = 0b000000;
585  }
586  def pci : T2Ipc <(outs GPR:$dst), (ins i32imm:$addr), IIC_iLoadi,
587                   opc, ".w\t$dst, $addr",
588                   [(set GPR:$dst, (opnode (ARMWrapper tconstpool:$addr)))]> {
589    let isReMaterializable = 1;
590    let Inst{31-27} = 0b11111;
591    let Inst{26-25} = 0b00;
592    let Inst{24} = signed;
593    let Inst{23} = ?; // add = (U == '1')
594    let Inst{22-21} = opcod;
595    let Inst{20} = 1; // load
596    let Inst{19-16} = 0b1111; // Rn
597  }
598}
599
600/// T2I_st - Defines a set of (op r, {imm12|imm8|so_reg}) store patterns.
601multiclass T2I_st<bits<2> opcod, string opc, PatFrag opnode> {
602  def i12 : T2Ii12<(outs), (ins GPR:$src, t2addrmode_imm12:$addr), IIC_iStorei,
603                   opc, ".w\t$src, $addr",
604                   [(opnode GPR:$src, t2addrmode_imm12:$addr)]> {
605    let Inst{31-27} = 0b11111;
606    let Inst{26-23} = 0b0001;
607    let Inst{22-21} = opcod;
608    let Inst{20} = 0; // !load
609  }
610  def i8  : T2Ii8 <(outs), (ins GPR:$src, t2addrmode_imm8:$addr), IIC_iStorei,
611                   opc, "\t$src, $addr",
612                   [(opnode GPR:$src, t2addrmode_imm8:$addr)]> {
613    let Inst{31-27} = 0b11111;
614    let Inst{26-23} = 0b0000;
615    let Inst{22-21} = opcod;
616    let Inst{20} = 0; // !load
617    let Inst{11} = 1;
618    // Offset: index==TRUE, wback==FALSE
619    let Inst{10} = 1; // The P bit.
620    let Inst{8} = 0; // The W bit.
621  }
622  def s   : T2Iso <(outs), (ins GPR:$src, t2addrmode_so_reg:$addr), IIC_iStorer,
623                   opc, ".w\t$src, $addr",
624                   [(opnode GPR:$src, t2addrmode_so_reg:$addr)]> {
625    let Inst{31-27} = 0b11111;
626    let Inst{26-23} = 0b0000;
627    let Inst{22-21} = opcod;
628    let Inst{20} = 0; // !load
629    let Inst{11-6} = 0b000000;
630  }
631}
632
633/// T2I_unary_rrot - A unary operation with two forms: one whose operand is a
634/// register and one whose operand is a register rotated by 8/16/24.
635multiclass T2I_unary_rrot<bits<3> opcod, string opc, PatFrag opnode> {
636  def r     : T2I<(outs GPR:$dst), (ins GPR:$src), IIC_iUNAr,
637                  opc, ".w\t$dst, $src",
638                 [(set GPR:$dst, (opnode GPR:$src))]> {
639     let Inst{31-27} = 0b11111;
640     let Inst{26-23} = 0b0100;
641     let Inst{22-20} = opcod;
642     let Inst{19-16} = 0b1111; // Rn
643     let Inst{15-12} = 0b1111;
644     let Inst{7} = 1;
645     let Inst{5-4} = 0b00; // rotate
646   }
647  def r_rot : T2I<(outs GPR:$dst), (ins GPR:$src, i32imm:$rot), IIC_iUNAsi,
648                  opc, ".w\t$dst, $src, ror $rot",
649                 [(set GPR:$dst, (opnode (rotr GPR:$src, rot_imm:$rot)))]> {
650     let Inst{31-27} = 0b11111;
651     let Inst{26-23} = 0b0100;
652     let Inst{22-20} = opcod;
653     let Inst{19-16} = 0b1111; // Rn
654     let Inst{15-12} = 0b1111;
655     let Inst{7} = 1;
656     let Inst{5-4} = {?,?}; // rotate
657   }
658}
659
660// DO variant - disassembly only, no pattern
661
662multiclass T2I_unary_rrot_DO<bits<3> opcod, string opc> {
663  def r     : T2I<(outs GPR:$dst), (ins GPR:$src), IIC_iUNAr,
664                  opc, "\t$dst, $src", []> {
665     let Inst{31-27} = 0b11111;
666     let Inst{26-23} = 0b0100;
667     let Inst{22-20} = opcod;
668     let Inst{19-16} = 0b1111; // Rn
669     let Inst{15-12} = 0b1111;
670     let Inst{7} = 1;
671     let Inst{5-4} = 0b00; // rotate
672   }
673  def r_rot : T2I<(outs GPR:$dst), (ins GPR:$src, i32imm:$rot), IIC_iUNAsi,
674                  opc, "\t$dst, $src, ror $rot", []> {
675     let Inst{31-27} = 0b11111;
676     let Inst{26-23} = 0b0100;
677     let Inst{22-20} = opcod;
678     let Inst{19-16} = 0b1111; // Rn
679     let Inst{15-12} = 0b1111;
680     let Inst{7} = 1;
681     let Inst{5-4} = {?,?}; // rotate
682   }
683}
684
685/// T2I_bin_rrot - A binary operation with two forms: one whose operand is a
686/// register and one whose operand is a register rotated by 8/16/24.
687multiclass T2I_bin_rrot<bits<3> opcod, string opc, PatFrag opnode> {
688  def rr     : T2I<(outs GPR:$dst), (ins GPR:$LHS, GPR:$RHS), IIC_iALUr,
689                  opc, "\t$dst, $LHS, $RHS",
690                  [(set GPR:$dst, (opnode GPR:$LHS, GPR:$RHS))]> {
691     let Inst{31-27} = 0b11111;
692     let Inst{26-23} = 0b0100;
693     let Inst{22-20} = opcod;
694     let Inst{15-12} = 0b1111;
695     let Inst{7} = 1;
696     let Inst{5-4} = 0b00; // rotate
697   }
698  def rr_rot : T2I<(outs GPR:$dst), (ins GPR:$LHS, GPR:$RHS, i32imm:$rot),
699                  IIC_iALUsr, opc, "\t$dst, $LHS, $RHS, ror $rot",
700                  [(set GPR:$dst, (opnode GPR:$LHS,
701                                          (rotr GPR:$RHS, rot_imm:$rot)))]> {
702     let Inst{31-27} = 0b11111;
703     let Inst{26-23} = 0b0100;
704     let Inst{22-20} = opcod;
705     let Inst{15-12} = 0b1111;
706     let Inst{7} = 1;
707     let Inst{5-4} = {?,?}; // rotate
708   }
709}
710
711// DO variant - disassembly only, no pattern
712
713multiclass T2I_bin_rrot_DO<bits<3> opcod, string opc> {
714  def rr     : T2I<(outs GPR:$dst), (ins GPR:$LHS, GPR:$RHS), IIC_iALUr,
715                  opc, "\t$dst, $LHS, $RHS", []> {
716     let Inst{31-27} = 0b11111;
717     let Inst{26-23} = 0b0100;
718     let Inst{22-20} = opcod;
719     let Inst{15-12} = 0b1111;
720     let Inst{7} = 1;
721     let Inst{5-4} = 0b00; // rotate
722   }
723  def rr_rot : T2I<(outs GPR:$dst), (ins GPR:$LHS, GPR:$RHS, i32imm:$rot),
724                  IIC_iALUsr, opc, "\t$dst, $LHS, $RHS, ror $rot", []> {
725     let Inst{31-27} = 0b11111;
726     let Inst{26-23} = 0b0100;
727     let Inst{22-20} = opcod;
728     let Inst{15-12} = 0b1111;
729     let Inst{7} = 1;
730     let Inst{5-4} = {?,?}; // rotate
731   }
732}
733
734//===----------------------------------------------------------------------===//
735// Instructions
736//===----------------------------------------------------------------------===//
737
738//===----------------------------------------------------------------------===//
739//  Miscellaneous Instructions.
740//
741
742// LEApcrel - Load a pc-relative address into a register without offending the
743// assembler.
744def t2LEApcrel : T2XI<(outs GPR:$dst), (ins i32imm:$label, pred:$p), IIC_iALUi,
745                      "adr$p.w\t$dst, #$label", []> {
746  let Inst{31-27} = 0b11110;
747  let Inst{25-24} = 0b10;
748  // Inst{23:21} = '11' (add = FALSE) or '00' (add = TRUE)
749  let Inst{22} = 0;
750  let Inst{20} = 0;
751  let Inst{19-16} = 0b1111; // Rn
752  let Inst{15} = 0;
753}
754def t2LEApcrelJT : T2XI<(outs GPR:$dst),
755                        (ins i32imm:$label, nohash_imm:$id, pred:$p), IIC_iALUi,
756                        "adr$p.w\t$dst, #${label}_${id}", []> {
757  let Inst{31-27} = 0b11110;
758  let Inst{25-24} = 0b10;
759  // Inst{23:21} = '11' (add = FALSE) or '00' (add = TRUE)
760  let Inst{22} = 0;
761  let Inst{20} = 0;
762  let Inst{19-16} = 0b1111; // Rn
763  let Inst{15} = 0;
764}
765
766// ADD r, sp, {so_imm|i12}
767def t2ADDrSPi   : T2sI<(outs GPR:$dst), (ins GPR:$sp, t2_so_imm:$imm),
768                        IIC_iALUi, "add", ".w\t$dst, $sp, $imm", []> {
769  let Inst{31-27} = 0b11110;
770  let Inst{25} = 0;
771  let Inst{24-21} = 0b1000;
772  let Inst{20} = ?; // The S bit.
773  let Inst{19-16} = 0b1101; // Rn = sp
774  let Inst{15} = 0;
775}
776def t2ADDrSPi12 : T2I<(outs GPR:$dst), (ins GPR:$sp, imm0_4095:$imm),
777                       IIC_iALUi, "addw", "\t$dst, $sp, $imm", []> {
778  let Inst{31-27} = 0b11110;
779  let Inst{25} = 1;
780  let Inst{24-21} = 0b0000;
781  let Inst{20} = 0; // The S bit.
782  let Inst{19-16} = 0b1101; // Rn = sp
783  let Inst{15} = 0;
784}
785
786// ADD r, sp, so_reg
787def t2ADDrSPs   : T2sI<(outs GPR:$dst), (ins GPR:$sp, t2_so_reg:$rhs),
788                        IIC_iALUsi, "add", ".w\t$dst, $sp, $rhs", []> {
789  let Inst{31-27} = 0b11101;
790  let Inst{26-25} = 0b01;
791  let Inst{24-21} = 0b1000;
792  let Inst{20} = ?; // The S bit.
793  let Inst{19-16} = 0b1101; // Rn = sp
794  let Inst{15} = 0;
795}
796
797// SUB r, sp, {so_imm|i12}
798def t2SUBrSPi   : T2sI<(outs GPR:$dst), (ins GPR:$sp, t2_so_imm:$imm),
799                        IIC_iALUi, "sub", ".w\t$dst, $sp, $imm", []> {
800  let Inst{31-27} = 0b11110;
801  let Inst{25} = 0;
802  let Inst{24-21} = 0b1101;
803  let Inst{20} = ?; // The S bit.
804  let Inst{19-16} = 0b1101; // Rn = sp
805  let Inst{15} = 0;
806}
807def t2SUBrSPi12 : T2I<(outs GPR:$dst), (ins GPR:$sp, imm0_4095:$imm),
808                       IIC_iALUi, "subw", "\t$dst, $sp, $imm", []> {
809  let Inst{31-27} = 0b11110;
810  let Inst{25} = 1;
811  let Inst{24-21} = 0b0101;
812  let Inst{20} = 0; // The S bit.
813  let Inst{19-16} = 0b1101; // Rn = sp
814  let Inst{15} = 0;
815}
816
817// SUB r, sp, so_reg
818def t2SUBrSPs   : T2sI<(outs GPR:$dst), (ins GPR:$sp, t2_so_reg:$rhs),
819                       IIC_iALUsi,
820                       "sub", "\t$dst, $sp, $rhs", []> {
821  let Inst{31-27} = 0b11101;
822  let Inst{26-25} = 0b01;
823  let Inst{24-21} = 0b1101;
824  let Inst{20} = ?; // The S bit.
825  let Inst{19-16} = 0b1101; // Rn = sp
826  let Inst{15} = 0;
827}
828
829// Signed and unsigned division, for disassembly only
830def t2SDIV : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b), IIC_iALUi, 
831                 "sdiv", "\t$dst, $a, $b", []> {
832  let Inst{31-27} = 0b11111;
833  let Inst{26-21} = 0b011100;
834  let Inst{20} = 0b1;
835  let Inst{15-12} = 0b1111;
836  let Inst{7-4} = 0b1111;
837}
838
839def t2UDIV : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b), IIC_iALUi, 
840                 "udiv", "\t$dst, $a, $b", []> {
841  let Inst{31-27} = 0b11111;
842  let Inst{26-21} = 0b011101;
843  let Inst{20} = 0b1;
844  let Inst{15-12} = 0b1111;
845  let Inst{7-4} = 0b1111;
846}
847
848// Pseudo instruction that will expand into a t2SUBrSPi + a copy.
849let usesCustomInserter = 1 in { // Expanded after instruction selection.
850def t2SUBrSPi_   : PseudoInst<(outs GPR:$dst), (ins GPR:$sp, t2_so_imm:$imm),
851                   NoItinerary, "@ sub.w\t$dst, $sp, $imm", []>;
852def t2SUBrSPi12_ : PseudoInst<(outs GPR:$dst), (ins GPR:$sp, imm0_4095:$imm),
853                   NoItinerary, "@ subw\t$dst, $sp, $imm", []>;
854def t2SUBrSPs_   : PseudoInst<(outs GPR:$dst), (ins GPR:$sp, t2_so_reg:$rhs),
855                   NoItinerary, "@ sub\t$dst, $sp, $rhs", []>;
856} // usesCustomInserter
857
858
859//===----------------------------------------------------------------------===//
860//  Load / store Instructions.
861//
862
863// Load
864let canFoldAsLoad = 1, isReMaterializable = 1  in
865defm t2LDR   : T2I_ld<0, 0b10, "ldr",  UnOpFrag<(load node:$Src)>>;
866
867// Loads with zero extension
868defm t2LDRH  : T2I_ld<0, 0b01, "ldrh", UnOpFrag<(zextloadi16 node:$Src)>>;
869defm t2LDRB  : T2I_ld<0, 0b00, "ldrb", UnOpFrag<(zextloadi8  node:$Src)>>;
870
871// Loads with sign extension
872defm t2LDRSH : T2I_ld<1, 0b01, "ldrsh", UnOpFrag<(sextloadi16 node:$Src)>>;
873defm t2LDRSB : T2I_ld<1, 0b00, "ldrsb", UnOpFrag<(sextloadi8  node:$Src)>>;
874
875let mayLoad = 1, hasExtraDefRegAllocReq = 1 in {
876// Load doubleword
877def t2LDRDi8  : T2Ii8s4<1, 0, 1, (outs GPR:$dst1, GPR:$dst2),
878                        (ins t2addrmode_imm8s4:$addr),
879                        IIC_iLoadi, "ldrd", "\t$dst1, $addr", []>;
880def t2LDRDpci : T2Ii8s4<?, ?, 1, (outs GPR:$dst1, GPR:$dst2),
881                        (ins i32imm:$addr), IIC_iLoadi,
882                       "ldrd", "\t$dst1, $addr", []> {
883  let Inst{19-16} = 0b1111; // Rn
884}
885}
886
887// zextload i1 -> zextload i8
888def : T2Pat<(zextloadi1 t2addrmode_imm12:$addr),
889            (t2LDRBi12  t2addrmode_imm12:$addr)>;
890def : T2Pat<(zextloadi1 t2addrmode_imm8:$addr),
891            (t2LDRBi8   t2addrmode_imm8:$addr)>;
892def : T2Pat<(zextloadi1 t2addrmode_so_reg:$addr),
893            (t2LDRBs    t2addrmode_so_reg:$addr)>;
894def : T2Pat<(zextloadi1 (ARMWrapper tconstpool:$addr)),
895            (t2LDRBpci  tconstpool:$addr)>;
896
897// extload -> zextload
898// FIXME: Reduce the number of patterns by legalizing extload to zextload
899// earlier?
900def : T2Pat<(extloadi1  t2addrmode_imm12:$addr),
901            (t2LDRBi12  t2addrmode_imm12:$addr)>;
902def : T2Pat<(extloadi1  t2addrmode_imm8:$addr),
903            (t2LDRBi8   t2addrmode_imm8:$addr)>;
904def : T2Pat<(extloadi1  t2addrmode_so_reg:$addr),
905            (t2LDRBs    t2addrmode_so_reg:$addr)>;
906def : T2Pat<(extloadi1  (ARMWrapper tconstpool:$addr)),
907            (t2LDRBpci  tconstpool:$addr)>;
908
909def : T2Pat<(extloadi8  t2addrmode_imm12:$addr),
910            (t2LDRBi12  t2addrmode_imm12:$addr)>;
911def : T2Pat<(extloadi8  t2addrmode_imm8:$addr),
912            (t2LDRBi8   t2addrmode_imm8:$addr)>;
913def : T2Pat<(extloadi8  t2addrmode_so_reg:$addr),
914            (t2LDRBs    t2addrmode_so_reg:$addr)>;
915def : T2Pat<(extloadi8  (ARMWrapper tconstpool:$addr)),
916            (t2LDRBpci  tconstpool:$addr)>;
917
918def : T2Pat<(extloadi16 t2addrmode_imm12:$addr),
919            (t2LDRHi12  t2addrmode_imm12:$addr)>;
920def : T2Pat<(extloadi16 t2addrmode_imm8:$addr),
921            (t2LDRHi8   t2addrmode_imm8:$addr)>;
922def : T2Pat<(extloadi16 t2addrmode_so_reg:$addr),
923            (t2LDRHs    t2addrmode_so_reg:$addr)>;
924def : T2Pat<(extloadi16 (ARMWrapper tconstpool:$addr)),
925            (t2LDRHpci  tconstpool:$addr)>;
926
927// Indexed loads
928let mayLoad = 1 in {
929def t2LDR_PRE  : T2Iidxldst<0, 0b10, 1, 1, (outs GPR:$dst, GPR:$base_wb),
930                            (ins t2addrmode_imm8:$addr),
931                            AddrModeT2_i8, IndexModePre, IIC_iLoadiu,
932                            "ldr", "\t$dst, $addr!", "$addr.base = $base_wb",
933                            []>;
934
935def t2LDR_POST : T2Iidxldst<0, 0b10, 1, 0, (outs GPR:$dst, GPR:$base_wb),
936                            (ins GPR:$base, t2am_imm8_offset:$offset),
937                            AddrModeT2_i8, IndexModePost, IIC_iLoadiu,
938                          "ldr", "\t$dst, [$base], $offset", "$base = $base_wb",
939                            []>;
940
941def t2LDRB_PRE : T2Iidxldst<0, 0b00, 1, 1, (outs GPR:$dst, GPR:$base_wb),
942                            (ins t2addrmode_imm8:$addr),
943                            AddrModeT2_i8, IndexModePre, IIC_iLoadiu,
944                            "ldrb", "\t$dst, $addr!", "$addr.base = $base_wb",
945                            []>;
946def t2LDRB_POST : T2Iidxldst<0, 0b00, 1, 0, (outs GPR:$dst, GPR:$base_wb),
947                            (ins GPR:$base, t2am_imm8_offset:$offset),
948                            AddrModeT2_i8, IndexModePost, IIC_iLoadiu,
949                         "ldrb", "\t$dst, [$base], $offset", "$base = $base_wb",
950                            []>;
951
952def t2LDRH_PRE : T2Iidxldst<0, 0b01, 1, 1, (outs GPR:$dst, GPR:$base_wb),
953                            (ins t2addrmode_imm8:$addr),
954                            AddrModeT2_i8, IndexModePre, IIC_iLoadiu,
955                            "ldrh", "\t$dst, $addr!", "$addr.base = $base_wb",
956                            []>;
957def t2LDRH_POST : T2Iidxldst<0, 0b01, 1, 0, (outs GPR:$dst, GPR:$base_wb),
958                            (ins GPR:$base, t2am_imm8_offset:$offset),
959                            AddrModeT2_i8, IndexModePost, IIC_iLoadiu,
960                         "ldrh", "\t$dst, [$base], $offset", "$base = $base_wb",
961                            []>;
962
963def t2LDRSB_PRE : T2Iidxldst<1, 0b00, 1, 1, (outs GPR:$dst, GPR:$base_wb),
964                            (ins t2addrmode_imm8:$addr),
965                            AddrModeT2_i8, IndexModePre, IIC_iLoadiu,
966                            "ldrsb", "\t$dst, $addr!", "$addr.base = $base_wb",
967                            []>;
968def t2LDRSB_POST : T2Iidxldst<1, 0b00, 1, 0, (outs GPR:$dst, GPR:$base_wb),
969                            (ins GPR:$base, t2am_imm8_offset:$offset),
970                            AddrModeT2_i8, IndexModePost, IIC_iLoadiu,
971                        "ldrsb", "\t$dst, [$base], $offset", "$base = $base_wb",
972                            []>;
973
974def t2LDRSH_PRE : T2Iidxldst<1, 0b01, 1, 1, (outs GPR:$dst, GPR:$base_wb),
975                            (ins t2addrmode_imm8:$addr),
976                            AddrModeT2_i8, IndexModePre, IIC_iLoadiu,
977                            "ldrsh", "\t$dst, $addr!", "$addr.base = $base_wb",
978                            []>;
979def t2LDRSH_POST : T2Iidxldst<1, 0b01, 1, 0, (outs GPR:$dst, GPR:$base_wb),
980                            (ins GPR:$base, t2am_imm8_offset:$offset),
981                            AddrModeT2_i8, IndexModePost, IIC_iLoadiu,
982                        "ldrsh", "\t$dst, [$base], $offset", "$base = $base_wb",
983                            []>;
984}
985
986// LDRT, LDRBT, LDRHT, LDRSBT, LDRSHT all have offset mode (PUW=0b110) and are
987// for disassembly only.
988// Ref: A8.6.57 LDR (immediate, Thumb) Encoding T4
989class T2IldT<bit signed, bits<2> type, string opc>
990  : T2Ii8<(outs GPR:$dst), (ins t2addrmode_imm8:$addr), IIC_iLoadi, opc,
991          "\t$dst, $addr", []> {
992  let Inst{31-27} = 0b11111;
993  let Inst{26-25} = 0b00;
994  let Inst{24} = signed;
995  let Inst{23} = 0;
996  let Inst{22-21} = type;
997  let Inst{20} = 1; // load
998  let Inst{11} = 1;
999  let Inst{10-8} = 0b110; // PUW.
1000}
1001
1002def t2LDRT   : T2IldT<0, 0b10, "ldrt">;
1003def t2LDRBT  : T2IldT<0, 0b00, "ldrbt">;
1004def t2LDRHT  : T2IldT<0, 0b01, "ldrht">;
1005def t2LDRSBT : T2IldT<1, 0b00, "ldrsbt">;
1006def t2LDRSHT : T2IldT<1, 0b01, "ldrsht">;
1007
1008// Store
1009defm t2STR :T2I_st<0b10,"str", BinOpFrag<(store node:$LHS, node:$RHS)>>;
1010defm t2STRB:T2I_st<0b00,"strb",BinOpFrag<(truncstorei8 node:$LHS, node:$RHS)>>;
1011defm t2STRH:T2I_st<0b01,"strh",BinOpFrag<(truncstorei16 node:$LHS, node:$RHS)>>;
1012
1013// Store doubleword
1014let mayLoad = 1, hasExtraSrcRegAllocReq = 1 in
1015def t2STRDi8 : T2Ii8s4<1, 0, 0, (outs),
1016                       (ins GPR:$src1, GPR:$src2, t2addrmode_imm8s4:$addr),
1017               IIC_iStorer, "strd", "\t$src1, $addr", []>;
1018
1019// Indexed stores
1020def t2STR_PRE  : T2Iidxldst<0, 0b10, 0, 1, (outs GPR:$base_wb),
1021                            (ins GPR:$src, GPR:$base, t2am_imm8_offset:$offset),
1022                            AddrModeT2_i8, IndexModePre, IIC_iStoreiu,
1023                         "str", "\t$src, [$base, $offset]!", "$base = $base_wb",
1024             [(set GPR:$base_wb,
1025                   (pre_store GPR:$src, GPR:$base, t2am_imm8_offset:$offset))]>;
1026
1027def t2STR_POST : T2Iidxldst<0, 0b10, 0, 0, (outs GPR:$base_wb),
1028                            (ins GPR:$src, GPR:$base, t2am_imm8_offset:$offset),
1029                            AddrModeT2_i8, IndexModePost, IIC_iStoreiu,
1030                          "str", "\t$src, [$base], $offset", "$base = $base_wb",
1031             [(set GPR:$base_wb,
1032                  (post_store GPR:$src, GPR:$base, t2am_imm8_offset:$offset))]>;
1033
1034def t2STRH_PRE  : T2Iidxldst<0, 0b01, 0, 1, (outs GPR:$base_wb),
1035                            (ins GPR:$src, GPR:$base, t2am_imm8_offset:$offset),
1036                            AddrModeT2_i8, IndexModePre, IIC_iStoreiu,
1037                        "strh", "\t$src, [$base, $offset]!", "$base = $base_wb",
1038        [(set GPR:$base_wb,
1039              (pre_truncsti16 GPR:$src, GPR:$base, t2am_imm8_offset:$offset))]>;
1040
1041def t2STRH_POST : T2Iidxldst<0, 0b01, 0, 0, (outs GPR:$base_wb),
1042                            (ins GPR:$src, GPR:$base, t2am_imm8_offset:$offset),
1043                            AddrModeT2_i8, IndexModePost, IIC_iStoreiu,
1044                         "strh", "\t$src, [$base], $offset", "$base = $base_wb",
1045       [(set GPR:$base_wb,
1046             (post_truncsti16 GPR:$src, GPR:$base, t2am_imm8_offset:$offset))]>;
1047
1048def t2STRB_PRE  : T2Iidxldst<0, 0b00, 0, 1, (outs GPR:$base_wb),
1049                            (ins GPR:$src, GPR:$base, t2am_imm8_offset:$offset),
1050                            AddrModeT2_i8, IndexModePre, IIC_iStoreiu,
1051                        "strb", "\t$src, [$base, $offset]!", "$base = $base_wb",
1052         [(set GPR:$base_wb,
1053               (pre_truncsti8 GPR:$src, GPR:$base, t2am_imm8_offset:$offset))]>;
1054
1055def t2STRB_POST : T2Iidxldst<0, 0b00, 0, 0, (outs GPR:$base_wb),
1056                            (ins GPR:$src, GPR:$base, t2am_imm8_offset:$offset),
1057                            AddrModeT2_i8, IndexModePost, IIC_iStoreiu,
1058                         "strb", "\t$src, [$base], $offset", "$base = $base_wb",
1059        [(set GPR:$base_wb,
1060              (post_truncsti8 GPR:$src, GPR:$base, t2am_imm8_offset:$offset))]>;
1061
1062// STRT, STRBT, STRHT all have offset mode (PUW=0b110) and are for disassembly
1063// only.
1064// Ref: A8.6.193 STR (immediate, Thumb) Encoding T4
1065class T2IstT<bits<2> type, string opc>
1066  : T2Ii8<(outs GPR:$src), (ins t2addrmode_imm8:$addr), IIC_iStorei, opc,
1067          "\t$src, $addr", []> {
1068  let Inst{31-27} = 0b11111;
1069  let Inst{26-25} = 0b00;
1070  let Inst{24} = 0; // not signed
1071  let Inst{23} = 0;
1072  let Inst{22-21} = type;
1073  let Inst{20} = 0; // store
1074  let Inst{11} = 1;
1075  let Inst{10-8} = 0b110; // PUW
1076}
1077
1078def t2STRT   : T2IstT<0b10, "strt">;
1079def t2STRBT  : T2IstT<0b00, "strbt">;
1080def t2STRHT  : T2IstT<0b01, "strht">;
1081
1082// FIXME: ldrd / strd pre / post variants
1083
1084// T2Ipl (Preload Data/Instruction) signals the memory system of possible future
1085// data/instruction access.  These are for disassembly only.
1086multiclass T2Ipl<bit instr, bit write, string opc> {
1087
1088  def i12 : T2I<(outs), (ins t2addrmode_imm12:$addr), IIC_iLoadi, opc,
1089                "\t$addr", []> {
1090    let Inst{31-25} = 0b1111100;
1091    let Inst{24} = instr;
1092    let Inst{23} = 1; // U = 1
1093    let Inst{22} = 0;
1094    let Inst{21} = write;
1095    let Inst{20} = 1;
1096    let Inst{15-12} = 0b1111;
1097  }
1098
1099  def i8 : T2I<(outs), (ins t2addrmode_imm8:$addr), IIC_iLoadi, opc,
1100                "\t$addr", []> {
1101    let Inst{31-25} = 0b1111100;
1102    let Inst{24} = instr;
1103    let Inst{23} = 0; // U = 0
1104    let Inst{22} = 0;
1105    let Inst{21} = write;
1106    let Inst{20} = 1;
1107    let Inst{15-12} = 0b1111;
1108    let Inst{11-8} = 0b1100;
1109  }
1110
1111  // A8.6.118 #0 and #-0 differs.  Maps -0 to -1, -1 to -2, ..., etc.
1112  def pci : T2I<(outs), (ins GPR:$base, i32imm:$imm), IIC_iLoadi, opc,
1113                "\t[pc, ${imm:negzero}]", []> {
1114    let Inst{31-25} = 0b1111100;
1115    let Inst{24} = instr;
1116    let Inst{23} = ?; // add = (U == 1)
1117    let Inst{22} = 0;
1118    let Inst{21} = write;
1119    let Inst{20} = 1;
1120    let Inst{19-16} = 0b1111; // Rn = 0b1111
1121    let Inst{15-12} = 0b1111;
1122  }
1123
1124  def r   : T2I<(outs), (ins GPR:$base, GPR:$a), IIC_iLoadi, opc,
1125                "\t[$base, $a]", []> {
1126    let Inst{31-25} = 0b1111100;
1127    let Inst{24} = instr;
1128    let Inst{23} = 0; // add = TRUE for T1
1129    let Inst{22} = 0;
1130    let Inst{21} = write;
1131    let Inst{20} = 1;
1132    let Inst{15-12} = 0b1111;
1133    let Inst{11-6} = 0000000;
1134    let Inst{5-4} = 0b00; // no shift is applied
1135  }
1136
1137  def s   : T2I<(outs), (ins GPR:$base, GPR:$a, i32imm:$shamt), IIC_iLoadi, opc,
1138                "\t[$base, $a, lsl $shamt]", []> {
1139    let Inst{31-25} = 0b1111100;
1140    let Inst{24} = instr;
1141    let Inst{23} = 0; // add = TRUE for T1
1142    let Inst{22} = 0;
1143    let Inst{21} = write;
1144    let Inst{20} = 1;
1145    let Inst{15-12} = 0b1111;
1146    let Inst{11-6} = 0000000;
1147  }
1148}
1149
1150defm t2PLD  : T2Ipl<0, 0, "pld">;
1151defm t2PLDW : T2Ipl<0, 1, "pldw">;
1152defm t2PLI  : T2Ipl<1, 0, "pli">;
1153
1154//===----------------------------------------------------------------------===//
1155//  Load / store multiple Instructions.
1156//
1157
1158let mayLoad = 1, hasExtraDefRegAllocReq = 1 in
1159def t2LDM : T2XI<(outs),
1160                 (ins addrmode4:$addr, pred:$p, reglist:$wb, variable_ops),
1161             IIC_iLoadm, "ldm${addr:submode}${p}${addr:wide}\t$addr, $wb", []> {
1162  let Inst{31-27} = 0b11101;
1163  let Inst{26-25} = 0b00;
1164  let Inst{24-23} = {?, ?}; // IA: '01', DB: '10'
1165  let Inst{22} = 0;
1166  let Inst{21} = ?; // The W bit.
1167  let Inst{20} = 1; // Load
1168}
1169
1170let mayStore = 1, hasExtraSrcRegAllocReq = 1 in
1171def t2STM : T2XI<(outs),
1172                 (ins addrmode4:$addr, pred:$p, reglist:$wb, variable_ops),
1173            IIC_iStorem, "stm${addr:submode}${p}${addr:wide}\t$addr, $wb", []> {
1174  let Inst{31-27} = 0b11101;
1175  let Inst{26-25} = 0b00;
1176  let Inst{24-23} = {?, ?}; // IA: '01', DB: '10'
1177  let Inst{22} = 0;
1178  let Inst{21} = ?; // The W bit.
1179  let Inst{20} = 0; // Store
1180}
1181
1182//===----------------------------------------------------------------------===//
1183//  Move Instructions.
1184//
1185
1186let neverHasSideEffects = 1 in
1187def t2MOVr : T2sI<(outs GPR:$dst), (ins GPR:$src), IIC_iMOVr,
1188                   "mov", ".w\t$dst, $src", []> {
1189  let Inst{31-27} = 0b11101;
1190  let Inst{26-25} = 0b01;
1191  let Inst{24-21} = 0b0010;
1192  let Inst{20} = ?; // The S bit.
1193  let Inst{19-16} = 0b1111; // Rn
1194  let Inst{14-12} = 0b000;
1195  let Inst{7-4} = 0b0000;
1196}
1197
1198// AddedComplexity to ensure isel tries t2MOVi before t2MOVi16.
1199let isReMaterializable = 1, isAsCheapAsAMove = 1, AddedComplexity = 1 in
1200def t2MOVi : T2sI<(outs GPR:$dst), (ins t2_so_imm:$src), IIC_iMOVi,
1201                   "mov", ".w\t$dst, $src",
1202                   [(set GPR:$dst, t2_so_imm:$src)]> {
1203  let Inst{31-27} = 0b11110;
1204  let Inst{25} = 0;
1205  let Inst{24-21} = 0b0010;
1206  let Inst{20} = ?; // The S bit.
1207  let Inst{19-16} = 0b1111; // Rn
1208  let Inst{15} = 0;
1209}
1210
1211let isReMaterializable = 1, isAsCheapAsAMove = 1 in
1212def t2MOVi16 : T2I<(outs GPR:$dst), (ins i32imm:$src), IIC_iMOVi,
1213                   "movw", "\t$dst, $src",
1214                   [(set GPR:$dst, imm0_65535:$src)]> {
1215  let Inst{31-27} = 0b11110;
1216  let Inst{25} = 1;
1217  let Inst{24-21} = 0b0010;
1218  let Inst{20} = 0; // The S bit.
1219  let Inst{15} = 0;
1220}
1221
1222let Constraints = "$src = $dst" in
1223def t2MOVTi16 : T2I<(outs GPR:$dst), (ins GPR:$src, i32imm:$imm), IIC_iMOVi,
1224                    "movt", "\t$dst, $imm",
1225                    [(set GPR:$dst,
1226                          (or (and GPR:$src, 0xffff), lo16AllZero:$imm))]> {
1227  let Inst{31-27} = 0b11110;
1228  let Inst{25} = 1;
1229  let Inst{24-21} = 0b0110;
1230  let Inst{20} = 0; // The S bit.
1231  let Inst{15} = 0;
1232}
1233
1234def : T2Pat<(or GPR:$src, 0xffff0000), (t2MOVTi16 GPR:$src, 0xffff)>;
1235
1236//===----------------------------------------------------------------------===//
1237//  Extend Instructions.
1238//
1239
1240// Sign extenders
1241
1242defm t2SXTB  : T2I_unary_rrot<0b100, "sxtb",
1243                              UnOpFrag<(sext_inreg node:$Src, i8)>>;
1244defm t2SXTH  : T2I_unary_rrot<0b000, "sxth",
1245                              UnOpFrag<(sext_inreg node:$Src, i16)>>;
1246defm t2SXTB16 : T2I_unary_rrot_DO<0b010, "sxtb16">;
1247
1248defm t2SXTAB : T2I_bin_rrot<0b100, "sxtab",
1249                        BinOpFrag<(add node:$LHS, (sext_inreg node:$RHS, i8))>>;
1250defm t2SXTAH : T2I_bin_rrot<0b000, "sxtah",
1251                        BinOpFrag<(add node:$LHS, (sext_inreg node:$RHS,i16))>>;
1252defm t2SXTAB16 : T2I_bin_rrot_DO<0b010, "sxtab16">;
1253
1254// TODO: SXT(A){B|H}16 - done for disassembly only
1255
1256// Zero extenders
1257
1258let AddedComplexity = 16 in {
1259defm t2UXTB   : T2I_unary_rrot<0b101, "uxtb",
1260                               UnOpFrag<(and node:$Src, 0x000000FF)>>;
1261defm t2UXTH   : T2I_unary_rrot<0b001, "uxth",
1262                               UnOpFrag<(and node:$Src, 0x0000FFFF)>>;
1263defm t2UXTB16 : T2I_unary_rrot<0b011, "uxtb16",
1264                               UnOpFrag<(and node:$Src, 0x00FF00FF)>>;
1265
1266def : T2Pat<(and (shl GPR:$Src, (i32 8)), 0xFF00FF),
1267            (t2UXTB16r_rot GPR:$Src, 24)>;
1268def : T2Pat<(and (srl GPR:$Src, (i32 8)), 0xFF00FF),
1269            (t2UXTB16r_rot GPR:$Src, 8)>;
1270
1271defm t2UXTAB : T2I_bin_rrot<0b101, "uxtab",
1272                           BinOpFrag<(add node:$LHS, (and node:$RHS, 0x00FF))>>;
1273defm t2UXTAH : T2I_bin_rrot<0b001, "uxtah",
1274                           BinOpFrag<(add node:$LHS, (and node:$RHS, 0xFFFF))>>;
1275defm t2UXTAB16 : T2I_bin_rrot_DO<0b011, "uxtab16">;
1276}
1277
1278//===----------------------------------------------------------------------===//
1279//  Arithmetic Instructions.
1280//
1281
1282defm t2ADD  : T2I_bin_ii12rs<0b000, "add",
1283                             BinOpFrag<(add  node:$LHS, node:$RHS)>, 1>;
1284defm t2SUB  : T2I_bin_ii12rs<0b101, "sub",
1285                             BinOpFrag<(sub  node:$LHS, node:$RHS)>>;
1286
1287// ADD and SUB with 's' bit set. No 12-bit immediate (T4) variants.
1288defm t2ADDS : T2I_bin_s_irs <0b1000, "add",
1289                             BinOpFrag<(addc node:$LHS, node:$RHS)>, 1>;
1290defm t2SUBS : T2I_bin_s_irs <0b1101, "sub",
1291                             BinOpFrag<(subc node:$LHS, node:$RHS)>>;
1292
1293defm t2ADC  : T2I_adde_sube_irs<0b1010, "adc",
1294                          BinOpFrag<(adde_dead_carry node:$LHS, node:$RHS)>, 1>;
1295defm t2SBC  : T2I_adde_sube_irs<0b1011, "sbc",
1296                          BinOpFrag<(sube_dead_carry node:$LHS, node:$RHS)>>;
1297defm t2ADCS : T2I_adde_sube_s_irs<0b1010, "adc",
1298                          BinOpFrag<(adde_live_carry node:$LHS, node:$RHS)>, 1>;
1299defm t2SBCS : T2I_adde_sube_s_irs<0b1011, "sbc",
1300                          BinOpFrag<(sube_live_carry node:$LHS, node:$RHS)>>;
1301
1302// RSB
1303defm t2RSB  : T2I_rbin_is   <0b1110, "rsb",
1304                             BinOpFrag<(sub  node:$LHS, node:$RHS)>>;
1305defm t2RSBS : T2I_rbin_s_is <0b1110, "rsb",
1306                             BinOpFrag<(subc node:$LHS, node:$RHS)>>;
1307
1308// (sub X, imm) gets canonicalized to (add X, -imm).  Match this form.
1309let AddedComplexity = 1 in
1310def : T2Pat<(add       GPR:$src, imm0_255_neg:$imm),
1311            (t2SUBri   GPR:$src, imm0_255_neg:$imm)>;
1312def : T2Pat<(add       GPR:$src, t2_so_imm_neg:$imm),
1313            (t2SUBri   GPR:$src, t2_so_imm_neg:$imm)>;
1314def : T2Pat<(add       GPR:$src, imm0_4095_neg:$imm),
1315            (t2SUBri12 GPR:$src, imm0_4095_neg:$imm)>;
1316
1317// Select Bytes -- for disassembly only
1318
1319def t2SEL : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b), NoItinerary, "sel",
1320                "\t$dst, $a, $b", []> {
1321  let Inst{31-27} = 0b11111;
1322  let Inst{26-24} = 0b010;
1323  let Inst{23} = 0b1;
1324  let Inst{22-20} = 0b010;
1325  let Inst{15-12} = 0b1111;
1326  let Inst{7} = 0b1;
1327  let Inst{6-4} = 0b000;
1328}
1329
1330// A6.3.13, A6.3.14, A6.3.15 Parallel addition and subtraction (signed/unsigned)
1331// And Miscellaneous operations -- for disassembly only
1332class T2I_pam<bits<3> op22_20, bits<4> op7_4, string opc>
1333  : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b), NoItinerary, opc,
1334        "\t$dst, $a, $b", [/* For disassembly only; pattern left blank */]> {
1335  let Inst{31-27} = 0b11111;
1336  let Inst{26-23} = 0b0101;
1337  let Inst{22-20} = op22_20;
1338  let Inst{15-12} = 0b1111;
1339  let Inst{7-4} = op7_4;
1340}
1341
1342// Saturating add/subtract -- for disassembly only
1343
1344def t2QADD    : T2I_pam<0b000, 0b1000, "qadd">;
1345def t2QADD16  : T2I_pam<0b001, 0b0001, "qadd16">;
1346def t2QADD8   : T2I_pam<0b000, 0b0001, "qadd8">;
1347def t2QASX    : T2I_pam<0b010, 0b0001, "qasx">;
1348def t2QDADD   : T2I_pam<0b000, 0b1001, "qdadd">;
1349def t2QDSUB   : T2I_pam<0b000, 0b1011, "qdsub">;
1350def t2QSAX    : T2I_pam<0b110, 0b0001, "qsax">;
1351def t2QSUB    : T2I_pam<0b000, 0b1010, "qsub">;
1352def t2QSUB16  : T2I_pam<0b101, 0b0001, "qsub16">;
1353def t2QSUB8   : T2I_pam<0b100, 0b0001, "qsub8">;
1354def t2UQADD16 : T2I_pam<0b001, 0b0101, "uqadd16">;
1355def t2UQADD8  : T2I_pam<0b000, 0b0101, "uqadd8">;
1356def t2UQASX   : T2I_pam<0b010, 0b0101, "uqasx">;
1357def t2UQSAX   : T2I_pam<0b110, 0b0101, "uqsax">;
1358def t2UQSUB16 : T2I_pam<0b101, 0b0101, "uqsub16">;
1359def t2UQSUB8  : T2I_pam<0b100, 0b0101, "uqsub8">;
1360
1361// Signed/Unsigned add/subtract -- for disassembly only
1362
1363def t2SASX    : T2I_pam<0b010, 0b0000, "sasx">;
1364def t2SADD16  : T2I_pam<0b001, 0b0000, "sadd16">;
1365def t2SADD8   : T2I_pam<0b000, 0b0000, "sadd8">;
1366def t2SSAX    : T2I_pam<0b110, 0b0000, "ssax">;
1367def t2SSUB16  : T2I_pam<0b101, 0b0000, "ssub16">;
1368def t2SSUB8   : T2I_pam<0b100, 0b0000, "ssub8">;
1369def t2UASX    : T2I_pam<0b010, 0b0100, "uasx">;
1370def t2UADD16  : T2I_pam<0b001, 0b0100, "uadd16">;
1371def t2UADD8   : T2I_pam<0b000, 0b0100, "uadd8">;
1372def t2USAX    : T2I_pam<0b110, 0b0100, "usax">;
1373def t2USUB16  : T2I_pam<0b101, 0b0100, "usub16">;
1374def t2USUB8   : T2I_pam<0b100, 0b0100, "usub8">;
1375
1376// Signed/Unsigned halving add/subtract -- for disassembly only
1377
1378def t2SHASX   : T2I_pam<0b010, 0b0010, "shasx">;
1379def t2SHADD16 : T2I_pam<0b001, 0b0010, "shadd16">;
1380def t2SHADD8  : T2I_pam<0b000, 0b0010, "shadd8">;
1381def t2SHSAX   : T2I_pam<0b110, 0b0010, "shsax">;
1382def t2SHSUB16 : T2I_pam<0b101, 0b0010, "shsub16">;
1383def t2SHSUB8  : T2I_pam<0b100, 0b0010, "shsub8">;
1384def t2UHASX   : T2I_pam<0b010, 0b0110, "uhasx">;
1385def t2UHADD16 : T2I_pam<0b001, 0b0110, "uhadd16">;
1386def t2UHADD8  : T2I_pam<0b000, 0b0110, "uhadd8">;
1387def t2UHSAX   : T2I_pam<0b110, 0b0110, "uhsax">;
1388def t2UHSUB16 : T2I_pam<0b101, 0b0110, "uhsub16">;
1389def t2UHSUB8  : T2I_pam<0b100, 0b0110, "uhsub8">;
1390
1391// Unsigned Sum of Absolute Differences [and Accumulate] -- for disassembly only
1392
1393def t2USAD8   : T2I_mac<0, 0b111, 0b0000, (outs GPR:$dst), (ins GPR:$a, GPR:$b),
1394                        NoItinerary, "usad8", "\t$dst, $a, $b", []> {
1395  let Inst{15-12} = 0b1111;
1396}
1397def t2USADA8  : T2I_mac<0, 0b111, 0b0000, (outs GPR:$dst),
1398                        (ins GPR:$a, GPR:$b, GPR:$acc), NoItinerary, "usada8",
1399                        "\t$dst, $a, $b, $acc", []>;
1400
1401// Signed/Unsigned saturate -- for disassembly only
1402
1403def t2SSATlsl : T2I<(outs GPR:$dst), (ins i32imm:$bit_pos,GPR:$a,i32imm:$shamt),
1404                    NoItinerary, "ssat", "\t$dst, $bit_pos, $a, lsl $shamt",
1405                    [/* For disassembly only; pattern left blank */]> {
1406  let Inst{31-27} = 0b11110;
1407  let Inst{25-22} = 0b1100;
1408  let Inst{20} = 0;
1409  let Inst{15} = 0;
1410  let Inst{21} = 0;        // sh = '0'
1411}
1412
1413def t2SSATasr : T2I<(outs GPR:$dst), (ins i32imm:$bit_pos,GPR:$a,i32imm:$shamt),
1414                    NoItinerary, "ssat", "\t$dst, $bit_pos, $a, asr $shamt",
1415                    [/* For disassembly only; pattern left blank */]> {
1416  let Inst{31-27} = 0b11110;
1417  let Inst{25-22} = 0b1100;
1418  let Inst{20} = 0;
1419  let Inst{15} = 0;
1420  let Inst{21} = 1;        // sh = '1'
1421}
1422
1423def t2SSAT16 : T2I<(outs GPR:$dst), (ins i32imm:$bit_pos, GPR:$a), NoItinerary,
1424                   "ssat16", "\t$dst, $bit_pos, $a",
1425                   [/* For disassembly only; pattern left blank */]> {
1426  let Inst{31-27} = 0b11110;
1427  let Inst{25-22} = 0b1100;
1428  let Inst{20} = 0;
1429  let Inst{15} = 0;
1430  let Inst{21} = 1;        // sh = '1'
1431  let Inst{14-12} = 0b000; // imm3 = '000'
1432  let Inst{7-6} = 0b00;    // imm2 = '00'
1433}
1434
1435def t2USATlsl : T2I<(outs GPR:$dst), (ins i32imm:$bit_pos,GPR:$a,i32imm:$shamt),
1436                     NoItinerary, "usat", "\t$dst, $bit_pos, $a, lsl $shamt",
1437                     [/* For disassembly only; pattern left blank */]> {
1438  let Inst{31-27} = 0b11110;
1439  let Inst{25-22} = 0b1110;
1440  let Inst{20} = 0;
1441  let Inst{15} = 0;
1442  let Inst{21} = 0;        // sh = '0'
1443}
1444
1445def t2USATasr : T2I<(outs GPR:$dst), (ins i32imm:$bit_pos,GPR:$a,i32imm:$shamt),
1446                     NoItinerary, "usat", "\t$dst, $bit_pos, $a, asr $shamt",
1447                     [/* For disassembly only; pattern left blank */]> {
1448  let Inst{31-27} = 0b11110;
1449  let Inst{25-22} = 0b1110;
1450  let Inst{20} = 0;
1451  let Inst{15} = 0;
1452  let Inst{21} = 1;        // sh = '1'
1453}
1454
1455def t2USAT16 : T2I<(outs GPR:$dst), (ins i32imm:$bit_pos, GPR:$a), NoItinerary,
1456                   "usat16", "\t$dst, $bit_pos, $a",
1457                   [/* For disassembly only; pattern left blank */]> {
1458  let Inst{31-27} = 0b11110;
1459  let Inst{25-22} = 0b1110;
1460  let Inst{20} = 0;
1461  let Inst{15} = 0;
1462  let Inst{21} = 1;        // sh = '1'
1463  let Inst{14-12} = 0b000; // imm3 = '000'
1464  let Inst{7-6} = 0b00;    // imm2 = '00'
1465}
1466
1467//===----------------------------------------------------------------------===//
1468//  Shift and rotate Instructions.
1469//
1470
1471defm t2LSL  : T2I_sh_ir<0b00, "lsl", BinOpFrag<(shl  node:$LHS, node:$RHS)>>;
1472defm t2LSR  : T2I_sh_ir<0b01, "lsr", BinOpFrag<(srl  node:$LHS, node:$RHS)>>;
1473defm t2ASR  : T2I_sh_ir<0b10, "asr", BinOpFrag<(sra  node:$LHS, node:$RHS)>>;
1474defm t2ROR  : T2I_sh_ir<0b11, "ror", BinOpFrag<(rotr node:$LHS, node:$RHS)>>;
1475
1476let Uses = [CPSR] in {
1477def t2MOVrx : T2sI<(outs GPR:$dst), (ins GPR:$src), IIC_iMOVsi,
1478                   "rrx", "\t$dst, $src",
1479                   [(set GPR:$dst, (ARMrrx GPR:$src))]> {
1480  let Inst{31-27} = 0b11101;
1481  let Inst{26-25} = 0b01;
1482  let Inst{24-21} = 0b0010;
1483  let Inst{20} = ?; // The S bit.
1484  let Inst{19-16} = 0b1111; // Rn
1485  let Inst{14-12} = 0b000;
1486  let Inst{7-4} = 0b0011;
1487}
1488}
1489
1490let Defs = [CPSR] in {
1491def t2MOVsrl_flag : T2XI<(outs GPR:$dst), (ins GPR:$src), IIC_iMOVsi,
1492                         "lsrs.w\t$dst, $src, #1",
1493                         [(set GPR:$dst, (ARMsrl_flag GPR:$src))]> {
1494  let Inst{31-27} = 0b11101;
1495  let Inst{26-25} = 0b01;
1496  let Inst{24-21} = 0b0010;
1497  let Inst{20} = 1; // The S bit.
1498  let Inst{19-16} = 0b1111; // Rn
1499  let Inst{5-4} = 0b01; // Shift type.
1500  // Shift amount = Inst{14-12:7-6} = 1.
1501  let Inst{14-12} = 0b000;
1502  let Inst{7-6} = 0b01;
1503}
1504def t2MOVsra_flag : T2XI<(outs GPR:$dst), (ins GPR:$src), IIC_iMOVsi,
1505                         "asrs.w\t$dst, $src, #1",
1506                         [(set GPR:$dst, (ARMsra_flag GPR:$src))]> {
1507  let Inst{31-27} = 0b11101;
1508  let Inst{26-25} = 0b01;
1509  let Inst{24-21} = 0b0010;
1510  let Inst{20} = 1; // The S bit.
1511  let Inst{19-16} = 0b1111; // Rn
1512  let Inst{5-4} = 0b10; // Shift type.
1513  // Shift amount = Inst{14-12:7-6} = 1.
1514  let Inst{14-12} = 0b000;
1515  let Inst{7-6} = 0b01;
1516}
1517}
1518
1519//===----------------------------------------------------------------------===//
1520//  Bitwise Instructions.
1521//
1522
1523defm t2AND  : T2I_bin_w_irs<0b0000, "and",
1524                            BinOpFrag<(and node:$LHS, node:$RHS)>, 1>;
1525defm t2ORR  : T2I_bin_w_irs<0b0010, "orr",
1526                            BinOpFrag<(or  node:$LHS, node:$RHS)>, 1>;
1527defm t2EOR  : T2I_bin_w_irs<0b0100, "eor",
1528                            BinOpFrag<(xor node:$LHS, node:$RHS)>, 1>;
1529
1530defm t2BIC  : T2I_bin_w_irs<0b0001, "bic",
1531                            BinOpFrag<(and node:$LHS, (not node:$RHS))>>;
1532
1533let Constraints = "$src = $dst" in
1534def t2BFC : T2I<(outs GPR:$dst), (ins GPR:$src, bf_inv_mask_imm:$imm),
1535                IIC_iUNAsi, "bfc", "\t$dst, $imm",
1536                [(set GPR:$dst, (and GPR:$src, bf_inv_mask_imm:$imm))]> {
1537  let Inst{31-27} = 0b11110;
1538  let Inst{25} = 1;
1539  let Inst{24-20} = 0b10110;
1540  let Inst{19-16} = 0b1111; // Rn
1541  let Inst{15} = 0;
1542}
1543
1544def t2SBFX : T2I<(outs GPR:$dst), (ins GPR:$src, imm0_31:$lsb, imm0_31:$width),
1545                 IIC_iALUi, "sbfx", "\t$dst, $src, $lsb, $width", []> {
1546  let Inst{31-27} = 0b11110;
1547  let Inst{25} = 1;
1548  let Inst{24-20} = 0b10100;
1549  let Inst{15} = 0;
1550}
1551
1552def t2UBFX : T2I<(outs GPR:$dst), (ins GPR:$src, imm0_31:$lsb, imm0_31:$width),
1553                 IIC_iALUi, "ubfx", "\t$dst, $src, $lsb, $width", []> {
1554  let Inst{31-27} = 0b11110;
1555  let Inst{25} = 1;
1556  let Inst{24-20} = 0b11100;
1557  let Inst{15} = 0;
1558}
1559
1560// A8.6.18  BFI - Bitfield insert (Encoding T1)
1561// Added for disassembler with the pattern field purposely left blank.
1562// FIXME: Utilize this instruction in codgen.
1563def t2BFI : T2I<(outs GPR:$dst), (ins GPR:$src, imm0_31:$lsb, imm0_31:$width),
1564                IIC_iALUi, "bfi", "\t$dst, $src, $lsb, $width", []> {
1565  let Inst{31-27} = 0b11110;
1566  let Inst{25} = 1;
1567  let Inst{24-20} = 0b10110;
1568  let Inst{15} = 0;
1569}
1570
1571defm t2ORN  : T2I_bin_irs<0b0011, "orn", BinOpFrag<(or  node:$LHS,
1572                          (not node:$RHS))>>;
1573
1574// Prefer over of t2EORri ra, rb, -1 because mvn has 16-bit version
1575let AddedComplexity = 1 in
1576defm t2MVN  : T2I_un_irs <0b0011, "mvn", UnOpFrag<(not node:$Src)>, 1, 1>;
1577
1578
1579def : T2Pat<(and     GPR:$src, t2_so_imm_not:$imm),
1580            (t2BICri GPR:$src, t2_so_imm_not:$imm)>;
1581
1582// FIXME: Disable this pattern on Darwin to workaround an assembler bug.
1583def : T2Pat<(or      GPR:$src, t2_so_imm_not:$imm),
1584            (t2ORNri GPR:$src, t2_so_imm_not:$imm)>,
1585            Requires<[IsThumb2]>;
1586
1587def : T2Pat<(t2_so_imm_not:$src),
1588            (t2MVNi t2_so_imm_not:$src)>;
1589
1590//===----------------------------------------------------------------------===//
1591//  Multiply Instructions.
1592//
1593let isCommutable = 1 in
1594def t2MUL: T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b), IIC_iMUL32,
1595                "mul", "\t$dst, $a, $b",
1596                [(set GPR:$dst, (mul GPR:$a, GPR:$b))]> {
1597  let Inst{31-27} = 0b11111;
1598  let Inst{26-23} = 0b0110;
1599  let Inst{22-20} = 0b000;
1600  let Inst{15-12} = 0b1111; // Ra = 0b1111 (no accumulate)
1601  let Inst{7-4} = 0b0000; // Multiply
1602}
1603
1604def t2MLA: T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$c), IIC_iMAC32,
1605		"mla", "\t$dst, $a, $b, $c",
1606		[(set GPR:$dst, (add (mul GPR:$a, GPR:$b), GPR:$c))]> {
1607  let Inst{31-27} = 0b11111;
1608  let Inst{26-23} = 0b0110;
1609  let Inst{22-20} = 0b000;
1610  let Inst{15-12} = {?, ?, ?, ?}; // Ra
1611  let Inst{7-4} = 0b0000; // Multiply
1612}
1613
1614def t2MLS: T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$c), IIC_iMAC32,
1615		"mls", "\t$dst, $a, $b, $c",
1616                [(set GPR:$dst, (sub GPR:$c, (mul GPR:$a, GPR:$b)))]> {
1617  let Inst{31-27} = 0b11111;
1618  let Inst{26-23} = 0b0110;
1619  let Inst{22-20} = 0b000;
1620  let Inst{15-12} = {?, ?, ?, ?}; // Ra
1621  let Inst{7-4} = 0b0001; // Multiply and Subtract
1622}
1623
1624// Extra precision multiplies with low / high results
1625let neverHasSideEffects = 1 in {
1626let isCommutable = 1 in {
1627def t2SMULL : T2I<(outs GPR:$ldst, GPR:$hdst), (ins GPR:$a, GPR:$b), IIC_iMUL64,
1628                   "smull", "\t$ldst, $hdst, $a, $b", []> {
1629  let Inst{31-27} = 0b11111;
1630  let Inst{26-23} = 0b0111;
1631  let Inst{22-20} = 0b000;
1632  let Inst{7-4} = 0b0000;
1633}
1634
1635def t2UMULL : T2I<(outs GPR:$ldst, GPR:$hdst), (ins GPR:$a, GPR:$b), IIC_iMUL64,
1636                   "umull", "\t$ldst, $hdst, $a, $b", []> {
1637  let Inst{31-27} = 0b11111;
1638  let Inst{26-23} = 0b0111;
1639  let Inst{22-20} = 0b010;
1640  let Inst{7-4} = 0b0000;
1641}
1642} // isCommutable
1643
1644// Multiply + accumulate
1645def t2SMLAL : T2I<(outs GPR:$ldst, GPR:$hdst), (ins GPR:$a, GPR:$b), IIC_iMAC64,
1646                  "smlal", "\t$ldst, $hdst, $a, $b", []>{
1647  let Inst{31-27} = 0b11111;
1648  let Inst{26-23} = 0b0111;
1649  let Inst{22-20} = 0b100;
1650  let Inst{7-4} = 0b0000;
1651}
1652
1653def t2UMLAL : T2I<(outs GPR:$ldst, GPR:$hdst), (ins GPR:$a, GPR:$b), IIC_iMAC64,
1654                  "umlal", "\t$ldst, $hdst, $a, $b", []>{
1655  let Inst{31-27} = 0b11111;
1656  let Inst{26-23} = 0b0111;
1657  let Inst{22-20} = 0b110;
1658  let Inst{7-4} = 0b0000;
1659}
1660
1661def t2UMAAL : T2I<(outs GPR:$ldst, GPR:$hdst), (ins GPR:$a, GPR:$b), IIC_iMAC64,
1662                  "umaal", "\t$ldst, $hdst, $a, $b", []>{
1663  let Inst{31-27} = 0b11111;
1664  let Inst{26-23} = 0b0111;
1665  let Inst{22-20} = 0b110;
1666  let Inst{7-4} = 0b0110;
1667}
1668} // neverHasSideEffects
1669
1670// Rounding variants of the below included for disassembly only
1671
1672// Most significant word multiply
1673def t2SMMUL : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b), IIC_iMUL32,
1674                  "smmul", "\t$dst, $a, $b",
1675                  [(set GPR:$dst, (mulhs GPR:$a, GPR:$b))]> {
1676  let Inst{31-27} = 0b11111;
1677  let Inst{26-23} = 0b0110;
1678  let Inst{22-20} = 0b101;
1679  let Inst{15-12} = 0b1111; // Ra = 0b1111 (no accumulate)
1680  let Inst{7-4} = 0b0000; // No Rounding (Inst{4} = 0)
1681}
1682
1683def t2SMMULR : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b), IIC_iMUL32,
1684                  "smmulr", "\t$dst, $a, $b", []> {
1685  let Inst{31-27} = 0b11111;
1686  let Inst{26-23} = 0b0110;
1687  let Inst{22-20} = 0b101;
1688  let Inst{15-12} = 0b1111; // Ra = 0b1111 (no accumulate)
1689  let Inst{7-4} = 0b0001; // Rounding (Inst{4} = 1)
1690}
1691
1692def t2SMMLA : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$c), IIC_iMAC32,
1693                  "smmla", "\t$dst, $a, $b, $c",
1694                  [(set GPR:$dst, (add (mulhs GPR:$a, GPR:$b), GPR:$c))]> {
1695  let Inst{31-27} = 0b11111;
1696  let Inst{26-23} = 0b0110;
1697  let Inst{22-20} = 0b101;
1698  let Inst{15-12} = {?, ?, ?, ?}; // Ra
1699  let Inst{7-4} = 0b0000; // No Rounding (Inst{4} = 0)
1700}
1701
1702def t2SMMLAR : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$c), IIC_iMAC32,
1703                  "smmlar", "\t$dst, $a, $b, $c", []> {
1704  let Inst{31-27} = 0b11111;
1705  let Inst{26-23} = 0b0110;
1706  let Inst{22-20} = 0b101;
1707  let Inst{15-12} = {?, ?, ?, ?}; // Ra
1708  let Inst{7-4} = 0b0001; // Rounding (Inst{4} = 1)
1709}
1710
1711def t2SMMLS : T2I <(outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$c), IIC_iMAC32,
1712                   "smmls", "\t$dst, $a, $b, $c",
1713                   [(set GPR:$dst, (sub GPR:$c, (mulhs GPR:$a, GPR:$b)))]> {
1714  let Inst{31-27} = 0b11111;
1715  let Inst{26-23} = 0b0110;
1716  let Inst{22-20} = 0b110;
1717  let Inst{15-12} = {?, ?, ?, ?}; // Ra
1718  let Inst{7-4} = 0b0000; // No Rounding (Inst{4} = 0)
1719}
1720
1721def t2SMMLSR : T2I <(outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$c), IIC_iMAC32,
1722                   "smmlsr", "\t$dst, $a, $b, $c", []> {
1723  let Inst{31-27} = 0b11111;
1724  let Inst{26-23} = 0b0110;
1725  let Inst{22-20} = 0b110;
1726  let Inst{15-12} = {?, ?, ?, ?}; // Ra
1727  let Inst{7-4} = 0b0001; // Rounding (Inst{4} = 1)
1728}
1729
1730multiclass T2I_smul<string opc, PatFrag opnode> {
1731  def BB : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b), IIC_iMUL32,
1732              !strconcat(opc, "bb"), "\t$dst, $a, $b",
1733              [(set GPR:$dst, (opnode (sext_inreg GPR:$a, i16),
1734                                      (sext_inreg GPR:$b, i16)))]> {
1735    let Inst{31-27} = 0b11111;
1736    let Inst{26-23} = 0b0110;
1737    let Inst{22-20} = 0b001;
1738    let Inst{15-12} = 0b1111; // Ra = 0b1111 (no accumulate)
1739    let Inst{7-6} = 0b00;
1740    let Inst{5-4} = 0b00;
1741  }
1742
1743  def BT : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b), IIC_iMUL32,
1744              !strconcat(opc, "bt"), "\t$dst, $a, $b",
1745              [(set GPR:$dst, (opnode (sext_inreg GPR:$a, i16),
1746                                      (sra GPR:$b, (i32 16))))]> {
1747    let Inst{31-27} = 0b11111;
1748    let Inst{26-23} = 0b0110;
1749    let Inst{22-20} = 0b001;
1750    let Inst{15-12} = 0b1111; // Ra = 0b1111 (no accumulate)
1751    let Inst{7-6} = 0b00;
1752    let Inst{5-4} = 0b01;
1753  }
1754
1755  def TB : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b), IIC_iMUL32,
1756              !strconcat(opc, "tb"), "\t$dst, $a, $b",
1757              [(set GPR:$dst, (opnode (sra GPR:$a, (i32 16)),
1758                                      (sext_inreg GPR:$b, i16)))]> {
1759    let Inst{31-27} = 0b11111;
1760    let Inst{26-23} = 0b0110;
1761    let Inst{22-20} = 0b001;
1762    let Inst{15-12} = 0b1111; // Ra = 0b1111 (no accumulate)
1763    let Inst{7-6} = 0b00;
1764    let Inst{5-4} = 0b10;
1765  }
1766
1767  def TT : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b), IIC_iMUL32,
1768              !strconcat(opc, "tt"), "\t$dst, $a, $b",
1769              [(set GPR:$dst, (opnode (sra GPR:$a, (i32 16)),
1770                                      (sra GPR:$b, (i32 16))))]> {
1771    let Inst{31-27} = 0b11111;
1772    let Inst{26-23} = 0b0110;
1773    let Inst{22-20} = 0b001;
1774    let Inst{15-12} = 0b1111; // Ra = 0b1111 (no accumulate)
1775    let Inst{7-6} = 0b00;
1776    let Inst{5-4} = 0b11;
1777  }
1778
1779  def WB : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b), IIC_iMUL16,
1780              !strconcat(opc, "wb"), "\t$dst, $a, $b",
1781              [(set GPR:$dst, (sra (opnode GPR:$a,
1782                                    (sext_inreg GPR:$b, i16)), (i32 16)))]> {
1783    let Inst{31-27} = 0b11111;
1784    let Inst{26-23} = 0b0110;
1785    let Inst{22-20} = 0b011;
1786    let Inst{15-12} = 0b1111; // Ra = 0b1111 (no accumulate)
1787    let Inst{7-6} = 0b00;
1788    let Inst{5-4} = 0b00;
1789  }
1790
1791  def WT : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b), IIC_iMUL16,
1792              !strconcat(opc, "wt"), "\t$dst, $a, $b",
1793              [(set GPR:$dst, (sra (opnode GPR:$a,
1794                                    (sra GPR:$b, (i32 16))), (i32 16)))]> {
1795    let Inst{31-27} = 0b11111;
1796    let Inst{26-23} = 0b0110;
1797    let Inst{22-20} = 0b011;
1798    let Inst{15-12} = 0b1111; // Ra = 0b1111 (no accumulate)
1799    let Inst{7-6} = 0b00;
1800    let Inst{5-4} = 0b01;
1801  }
1802}
1803
1804
1805multiclass T2I_smla<string opc, PatFrag opnode> {
1806  def BB : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$acc), IIC_iMAC16,
1807              !strconcat(opc, "bb"), "\t$dst, $a, $b, $acc",
1808              [(set GPR:$dst, (add GPR:$acc,
1809                               (opnode (sext_inreg GPR:$a, i16),
1810                                       (sext_inreg GPR:$b, i16))))]> {
1811    let Inst{31-27} = 0b11111;
1812    let Inst{26-23} = 0b0110;
1813    let Inst{22-20} = 0b001;
1814    let Inst{15-12} = {?, ?, ?, ?}; // Ra
1815    let Inst{7-6} = 0b00;
1816    let Inst{5-4} = 0b00;
1817  }
1818
1819  def BT : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$acc), IIC_iMAC16,
1820             !strconcat(opc, "bt"), "\t$dst, $a, $b, $acc",
1821             [(set GPR:$dst, (add GPR:$acc, (opnode (sext_inreg GPR:$a, i16),
1822                                                   (sra GPR:$b, (i32 16)))))]> {
1823    let Inst{31-27} = 0b11111;
1824    let Inst{26-23} = 0b0110;
1825    let Inst{22-20} = 0b001;
1826    let Inst{15-12} = {?, ?, ?, ?}; // Ra
1827    let Inst{7-6} = 0b00;
1828    let Inst{5-4} = 0b01;
1829  }
1830
1831  def TB : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$acc), IIC_iMAC16,
1832              !strconcat(opc, "tb"), "\t$dst, $a, $b, $acc",
1833              [(set GPR:$dst, (add GPR:$acc, (opnode (sra GPR:$a, (i32 16)),
1834                                                 (sext_inreg GPR:$b, i16))))]> {
1835    let Inst{31-27} = 0b11111;
1836    let Inst{26-23} = 0b0110;
1837    let Inst{22-20} = 0b001;
1838    let Inst{15-12} = {?, ?, ?, ?}; // Ra
1839    let Inst{7-6} = 0b00;
1840    let Inst{5-4} = 0b10;
1841  }
1842
1843  def TT : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$acc), IIC_iMAC16,
1844              !strconcat(opc, "tt"), "\t$dst, $a, $b, $acc",
1845             [(set GPR:$dst, (add GPR:$acc, (opnode (sra GPR:$a, (i32 16)),
1846                                                   (sra GPR:$b, (i32 16)))))]> {
1847    let Inst{31-27} = 0b11111;
1848    let Inst{26-23} = 0b0110;
1849    let Inst{22-20} = 0b001;
1850    let Inst{15-12} = {?, ?, ?, ?}; // Ra
1851    let Inst{7-6} = 0b00;
1852    let Inst{5-4} = 0b11;
1853  }
1854
1855  def WB : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$acc), IIC_iMAC16,
1856              !strconcat(opc, "wb"), "\t$dst, $a, $b, $acc",
1857              [(set GPR:$dst, (add GPR:$acc, (sra (opnode GPR:$a,
1858                                      (sext_inreg GPR:$b, i16)), (i32 16))))]> {
1859    let Inst{31-27} = 0b11111;
1860    let Inst{26-23} = 0b0110;
1861    let Inst{22-20} = 0b011;
1862    let Inst{15-12} = {?, ?, ?, ?}; // Ra
1863    let Inst{7-6} = 0b00;
1864    let Inst{5-4} = 0b00;
1865  }
1866
1867  def WT : T2I<(outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$acc), IIC_iMAC16,
1868              !strconcat(opc, "wt"), "\t$dst, $a, $b, $acc",
1869              [(set GPR:$dst, (add GPR:$acc, (sra (opnode GPR:$a,
1870                                        (sra GPR:$b, (i32 16))), (i32 16))))]> {
1871    let Inst{31-27} = 0b11111;
1872    let Inst{26-23} = 0b0110;
1873    let Inst{22-20} = 0b011;
1874    let Inst{15-12} = {?, ?, ?, ?}; // Ra
1875    let Inst{7-6} = 0b00;
1876    let Inst{5-4} = 0b01;
1877  }
1878}
1879
1880defm t2SMUL : T2I_smul<"smul", BinOpFrag<(mul node:$LHS, node:$RHS)>>;
1881defm t2SMLA : T2I_smla<"smla", BinOpFrag<(mul node:$LHS, node:$RHS)>>;
1882
1883// Halfword multiple accumulate long: SMLAL<x><y> -- for disassembly only
1884def t2SMLALBB : T2I_mac<1, 0b100, 0b1000, (outs GPR:$ldst,GPR:$hdst),
1885           (ins GPR:$a,GPR:$b), IIC_iMAC64, "smlalbb", "\t$ldst, $hdst, $a, $b",
1886           [/* For disassembly only; pattern left blank */]>;
1887def t2SMLALBT : T2I_mac<1, 0b100, 0b1001, (outs GPR:$ldst,GPR:$hdst),
1888           (ins GPR:$a,GPR:$b), IIC_iMAC64, "smlalbt", "\t$ldst, $hdst, $a, $b",
1889           [/* For disassembly only; pattern left blank */]>;
1890def t2SMLALTB : T2I_mac<1, 0b100, 0b1010, (outs GPR:$ldst,GPR:$hdst),
1891           (ins GPR:$a,GPR:$b), IIC_iMAC64, "smlaltb", "\t$ldst, $hdst, $a, $b",
1892           [/* For disassembly only; pattern left blank */]>;
1893def t2SMLALTT : T2I_mac<1, 0b100, 0b1011, (outs GPR:$ldst,GPR:$hdst),
1894           (ins GPR:$a,GPR:$b), IIC_iMAC64, "smlaltt", "\t$ldst, $hdst, $a, $b",
1895           [/* For disassembly only; pattern left blank */]>;
1896
1897// Dual halfword multiple: SMUAD, SMUSD, SMLAD, SMLSD, SMLALD, SMLSLD
1898// These are for disassembly only.
1899
1900def t2SMUAD   : T2I_mac<0, 0b010, 0b0000, (outs GPR:$dst), (ins GPR:$a, GPR:$b),
1901                        IIC_iMAC32, "smuad", "\t$dst, $a, $b", []> {
1902  let Inst{15-12} = 0b1111;
1903}
1904def t2SMUADX  : T2I_mac<0, 0b010, 0b0001, (outs GPR:$dst), (ins GPR:$a, GPR:$b),
1905                        IIC_iMAC32, "smuadx", "\t$dst, $a, $b", []> {
1906  let Inst{15-12} = 0b1111;
1907}
1908def t2SMUSD   : T2I_mac<0, 0b100, 0b0000, (outs GPR:$dst), (ins GPR:$a, GPR:$b),
1909                        IIC_iMAC32, "smusd", "\t$dst, $a, $b", []> {
1910  let Inst{15-12} = 0b1111;
1911}
1912def t2SMUSDX  : T2I_mac<0, 0b100, 0b0001, (outs GPR:$dst), (ins GPR:$a, GPR:$b),
1913                        IIC_iMAC32, "smusdx", "\t$dst, $a, $b", []> {
1914  let Inst{15-12} = 0b1111;
1915}
1916def t2SMLAD   : T2I_mac<0, 0b010, 0b0000, (outs GPR:$dst),
1917                        (ins GPR:$a, GPR:$b, GPR:$acc), IIC_iMAC32, "smlad",
1918                        "\t$dst, $a, $b, $acc", []>;
1919def t2SMLADX  : T2I_mac<0, 0b010, 0b0001, (outs GPR:$dst),
1920                        (ins GPR:$a, GPR:$b, GPR:$acc), IIC_iMAC32, "smladx",
1921                        "\t$dst, $a, $b, $acc", []>;
1922def t2SMLSD   : T2I_mac<0, 0b100, 0b0000, (outs GPR:$dst),
1923                        (ins GPR:$a, GPR:$b, GPR:$acc), IIC_iMAC32, "smlsd",
1924                        "\t$dst, $a, $b, $acc", []>;
1925def t2SMLSDX  : T2I_mac<0, 0b100, 0b0001, (outs GPR:$dst),
1926                        (ins GPR:$a, GPR:$b, GPR:$acc), IIC_iMAC32, "smlsdx",
1927                        "\t$dst, $a, $b, $acc", []>;
1928def t2SMLALD  : T2I_mac<1, 0b100, 0b1100, (outs GPR:$ldst,GPR:$hdst),
1929                        (ins GPR:$a,GPR:$b), IIC_iMAC64, "smlald",
1930                        "\t$ldst, $hdst, $a, $b", []>;
1931def t2SMLALDX : T2I_mac<1, 0b100, 0b1101, (outs GPR:$ldst,GPR:$hdst),
1932                        (ins GPR:$a,GPR:$b), IIC_iMAC64, "smlaldx",
1933                        "\t$ldst, $hdst, $a, $b", []>;
1934def t2SMLSLD  : T2I_mac<1, 0b101, 0b1100, (outs GPR:$ldst,GPR:$hdst),
1935                        (ins GPR:$a,GPR:$b), IIC_iMAC64, "smlsld",
1936                        "\t$ldst, $hdst, $a, $b", []>;
1937def t2SMLSLDX : T2I_mac<1, 0b101, 0b1101, (outs GPR:$ldst,GPR:$hdst),
1938                        (ins GPR:$a,GPR:$b), IIC_iMAC64, "smlsldx",
1939                        "\t$ldst, $hdst, $a, $b", []>;
1940
1941//===----------------------------------------------------------------------===//
1942//  Misc. Arithmetic Instructions.
1943//
1944
1945class T2I_misc<bits<2> op1, bits<2> op2, dag oops, dag iops,
1946      InstrItinClass itin, string opc, string asm, list<dag> pattern>
1947  : T2I<oops, iops, itin, opc, asm, pattern> {
1948  let Inst{31-27} = 0b11111;
1949  let Inst{26-22} = 0b01010;
1950  let Inst{21-20} = op1;
1951  let Inst{15-12} = 0b1111;
1952  let Inst{7-6} = 0b10;
1953  let Inst{5-4} = op2;
1954}
1955
1956def t2CLZ : T2I_misc<0b11, 0b00, (outs GPR:$dst), (ins GPR:$src), IIC_iUNAr,
1957                    "clz", "\t$dst, $src", [(set GPR:$dst, (ctlz GPR:$src))]>;
1958
1959def t2RBIT : T2I_misc<0b01, 0b10, (outs GPR:$dst), (ins GPR:$src), IIC_iUNAr,
1960                      "rbit", "\t$dst, $src",
1961                      [(set GPR:$dst, (ARMrbit GPR:$src))]>;
1962
1963def t2REV : T2I_misc<0b01, 0b00, (outs GPR:$dst), (ins GPR:$src), IIC_iUNAr,
1964                   "rev", ".w\t$dst, $src", [(set GPR:$dst, (bswap GPR:$src))]>;
1965
1966def t2REV16 : T2I_misc<0b01, 0b01, (outs GPR:$dst), (ins GPR:$src), IIC_iUNAr,
1967                       "rev16", ".w\t$dst, $src",
1968                [(set GPR:$dst,
1969                    (or (and (srl GPR:$src, (i32 8)), 0xFF),
1970                        (or (and (shl GPR:$src, (i32 8)), 0xFF00),
1971                            (or (and (srl GPR:$src, (i32 8)), 0xFF0000),
1972                                (and (shl GPR:$src, (i32 8)), 0xFF000000)))))]>;
1973
1974def t2REVSH : T2I_misc<0b01, 0b11, (outs GPR:$dst), (ins GPR:$src), IIC_iUNAr,
1975                       "revsh", ".w\t$dst, $src",
1976                 [(set GPR:$dst,
1977                    (sext_inreg
1978                      (or (srl (and GPR:$src, 0xFF00), (i32 8)),
1979                          (shl GPR:$src, (i32 8))), i16))]>;
1980
1981def t2PKHBT : T2I<(outs GPR:$dst), (ins GPR:$src1, GPR:$src2, i32imm:$shamt),
1982                  IIC_iALUsi, "pkhbt", "\t$dst, $src1, $src2, lsl $shamt",
1983                  [(set GPR:$dst, (or (and GPR:$src1, 0xFFFF),
1984                                      (and (shl GPR:$src2, (i32 imm:$shamt)),
1985                                           0xFFFF0000)))]> {
1986  let Inst{31-27} = 0b11101;
1987  let Inst{26-25} = 0b01;
1988  let Inst{24-20} = 0b01100;
1989  let Inst{5} = 0; // BT form
1990  let Inst{4} = 0;
1991}
1992
1993// Alternate cases for PKHBT where identities eliminate some nodes.
1994def : T2Pat<(or (and GPR:$src1, 0xFFFF), (and GPR:$src2, 0xFFFF0000)),
1995            (t2PKHBT GPR:$src1, GPR:$src2, 0)>;
1996def : T2Pat<(or (and GPR:$src1, 0xFFFF), (shl GPR:$src2, imm16_31:$shamt)),
1997            (t2PKHBT GPR:$src1, GPR:$src2, imm16_31:$shamt)>;
1998
1999def t2PKHTB : T2I<(outs GPR:$dst), (ins GPR:$src1, GPR:$src2, i32imm:$shamt),
2000                  IIC_iALUsi, "pkhtb", "\t$dst, $src1, $src2, asr $shamt",
2001                  [(set GPR:$dst, (or (and GPR:$src1, 0xFFFF0000),
2002                                      (and (sra GPR:$src2, imm16_31:$shamt),
2003                                           0xFFFF)))]> {
2004  let Inst{31-27} = 0b11101;
2005  let Inst{26-25} = 0b01;
2006  let Inst{24-20} = 0b01100;
2007  let Inst{5} = 1; // TB form
2008  let Inst{4} = 0;
2009}
2010
2011// Alternate cases for PKHTB where identities eliminate some nodes.  Note that
2012// a shift amount of 0 is *not legal* here, it is PKHBT instead.
2013def : T2Pat<(or (and GPR:$src1, 0xFFFF0000), (srl GPR:$src2, (i32 16))),
2014            (t2PKHTB GPR:$src1, GPR:$src2, 16)>;
2015def : T2Pat<(or (and GPR:$src1, 0xFFFF0000),
2016                     (and (srl GPR:$src2, imm1_15:$shamt), 0xFFFF)),
2017            (t2PKHTB GPR:$src1, GPR:$src2, imm1_15:$shamt)>;
2018
2019//===----------------------------------------------------------------------===//
2020//  Comparison Instructions...
2021//
2022
2023defm t2CMP  : T2I_cmp_irs<0b1101, "cmp",
2024                          BinOpFrag<(ARMcmp node:$LHS, node:$RHS)>>;
2025defm t2CMPz : T2I_cmp_irs<0b1101, "cmp",
2026                          BinOpFrag<(ARMcmpZ node:$LHS, node:$RHS)>>;
2027
2028//FIXME: Disable CMN, as CCodes are backwards from compare expectations
2029//       Compare-to-zero still works out, just not the relationals
2030//defm t2CMN  : T2I_cmp_irs<0b1000, "cmn",
2031//                          BinOpFrag<(ARMcmp node:$LHS,(ineg node:$RHS))>>;
2032defm t2CMNz : T2I_cmp_irs<0b1000, "cmn",
2033                          BinOpFrag<(ARMcmpZ node:$LHS,(ineg node:$RHS))>>;
2034
2035//def : T2Pat<(ARMcmp  GPR:$src, t2_so_imm_neg:$imm),
2036//            (t2CMNri GPR:$src, t2_so_imm_neg:$imm)>;
2037
2038def : T2Pat<(ARMcmpZ  GPR:$src, t2_so_imm_neg:$imm),
2039            (t2CMNzri GPR:$src, t2_so_imm_neg:$imm)>;
2040
2041defm t2TST  : T2I_cmp_irs<0b0000, "tst",
2042                          BinOpFrag<(ARMcmpZ (and node:$LHS, node:$RHS), 0)>>;
2043defm t2TEQ  : T2I_cmp_irs<0b0100, "teq",
2044                          BinOpFrag<(ARMcmpZ (xor node:$LHS, node:$RHS), 0)>>;
2045
2046// A8.6.27  CBNZ, CBZ - Compare and branch on (non)zero.
2047// Short range conditional branch. Looks awesome for loops. Need to figure
2048// out how to use this one.
2049
2050
2051// Conditional moves
2052// FIXME: should be able to write a pattern for ARMcmov, but can't use
2053// a two-value operand where a dag node expects two operands. :(
2054def t2MOVCCr : T2I<(outs GPR:$dst), (ins GPR:$false, GPR:$true), IIC_iCMOVr,
2055                   "mov", ".w\t$dst, $true",
2056      [/*(set GPR:$dst, (ARMcmov GPR:$false, GPR:$true, imm:$cc, CCR:$ccr))*/]>,
2057                RegConstraint<"$false = $dst"> {
2058  let Inst{31-27} = 0b11101;
2059  let Inst{26-25} = 0b01;
2060  let Inst{24-21} = 0b0010;
2061  let Inst{20} = 0; // The S bit.
2062  let Inst{19-16} = 0b1111; // Rn
2063  let Inst{14-12} = 0b000;
2064  let Inst{7-4} = 0b0000;
2065}
2066
2067def t2MOVCCi : T2I<(outs GPR:$dst), (ins GPR:$false, t2_so_imm:$true),
2068                   IIC_iCMOVi, "mov", ".w\t$dst, $true",
2069[/*(set GPR:$dst, (ARMcmov GPR:$false, t2_so_imm:$true, imm:$cc, CCR:$ccr))*/]>,
2070                   RegConstraint<"$false = $dst"> {
2071  let Inst{31-27} = 0b11110;
2072  let Inst{25} = 0;
2073  let Inst{24-21} = 0b0010;
2074  let Inst{20} = 0; // The S bit.
2075  let Inst{19-16} = 0b1111; // Rn
2076  let Inst{15} = 0;
2077}
2078
2079class T2I_movcc_sh<bits<2> opcod, dag oops, dag iops, InstrItinClass itin,
2080                   string opc, string asm, list<dag> pattern>
2081  : T2I<oops, iops, itin, opc, asm, pattern> {
2082  let Inst{31-27} = 0b11101;
2083  let Inst{26-25} = 0b01;
2084  let Inst{24-21} = 0b0010;
2085  let Inst{20} = 0; // The S bit.
2086  let Inst{19-16} = 0b1111; // Rn
2087  let Inst{5-4} = opcod; // Shift type.
2088}
2089def t2MOVCClsl : T2I_movcc_sh<0b00, (outs GPR:$dst),
2090                             (ins GPR:$false, GPR:$true, i32imm:$rhs),
2091                             IIC_iCMOVsi, "lsl", ".w\t$dst, $true, $rhs", []>,
2092                 RegConstraint<"$false = $dst">;
2093def t2MOVCClsr : T2I_movcc_sh<0b01, (outs GPR:$dst),
2094                             (ins GPR:$false, GPR:$true, i32imm:$rhs),
2095                             IIC_iCMOVsi, "lsr", ".w\t$dst, $true, $rhs", []>,
2096                 RegConstraint<"$false = $dst">;
2097def t2MOVCCasr : T2I_movcc_sh<0b10, (outs GPR:$dst),
2098                             (ins GPR:$false, GPR:$true, i32imm:$rhs),
2099                             IIC_iCMOVsi, "asr", ".w\t$dst, $true, $rhs", []>,
2100                 RegConstraint<"$false = $dst">;
2101def t2MOVCCror : T2I_movcc_sh<0b11, (outs GPR:$dst),
2102                             (ins GPR:$false, GPR:$true, i32imm:$rhs),
2103                             IIC_iCMOVsi, "ror", ".w\t$dst, $true, $rhs", []>,
2104                 RegConstraint<"$false = $dst">;
2105
2106//===----------------------------------------------------------------------===//
2107// Atomic operations intrinsics
2108//
2109
2110// memory barriers protect the atomic sequences
2111let hasSideEffects = 1 in {
2112def t2Int_MemBarrierV7 : AInoP<(outs), (ins),
2113                        Pseudo, NoItinerary,
2114                        "dmb", "",
2115                        [(ARMMemBarrierV7)]>,
2116                        Requires<[IsThumb2]> {
2117  let Inst{31-4} = 0xF3BF8F5;
2118  // FIXME: add support for options other than a full system DMB
2119  let Inst{3-0} = 0b1111;
2120}
2121
2122def t2Int_SyncBarrierV7 : AInoP<(outs), (ins),
2123                        Pseudo, NoItinerary,
2124                        "dsb", "",
2125                        [(ARMSyncBarrierV7)]>,
2126                        Requires<[IsThumb2]> {
2127  let Inst{31-4} = 0xF3BF8F4;
2128  // FIXME: add support for options other than a full system DSB
2129  let Inst{3-0} = 0b1111;
2130}
2131}
2132
2133// Helper class for multiclass T2MemB -- for disassembly only
2134class T2I_memb<string opc, string asm>
2135  : T2I<(outs), (ins), NoItinerary, opc, asm,
2136        [/* For disassembly only; pattern left blank */]>,
2137    Requires<[IsThumb2, HasV7]> {
2138  let Inst{31-20} = 0xf3b;
2139  let Inst{15-14} = 0b10;
2140  let Inst{12} = 0;
2141}
2142
2143multiclass T2MemB<bits<4> op7_4, string opc> {
2144
2145  def st : T2I_memb<opc, "\tst"> {
2146    let Inst{7-4} = op7_4;
2147    let Inst{3-0} = 0b1110;
2148  }
2149
2150  def ish : T2I_memb<opc, "\tish"> {
2151    let Inst{7-4} = op7_4;
2152    let Inst{3-0} = 0b1011;
2153  }
2154
2155  def ishst : T2I_memb<opc, "\tishst"> {
2156    let Inst{7-4} = op7_4;
2157    let Inst{3-0} = 0b1010;
2158  }
2159
2160  def nsh : T2I_memb<opc, "\tnsh"> {
2161    let Inst{7-4} = op7_4;
2162    let Inst{3-0} = 0b0111;
2163  }
2164
2165  def nshst : T2I_memb<opc, "\tnshst"> {
2166    let Inst{7-4} = op7_4;
2167    let Inst{3-0} = 0b0110;
2168  }
2169
2170  def osh : T2I_memb<opc, "\tosh"> {
2171    let Inst{7-4} = op7_4;
2172    let Inst{3-0} = 0b0011;
2173  }
2174
2175  def oshst : T2I_memb<opc, "\toshst"> {
2176    let Inst{7-4} = op7_4;
2177    let Inst{3-0} = 0b0010;
2178  }
2179}
2180
2181// These DMB variants are for disassembly only.
2182defm t2DMB : T2MemB<0b0101, "dmb">;
2183
2184// These DSB variants are for disassembly only.
2185defm t2DSB : T2MemB<0b0100, "dsb">;
2186
2187// ISB has only full system option -- for disassembly only
2188def t2ISBsy : T2I_memb<"isb", ""> {
2189  let Inst{7-4} = 0b0110;
2190  let Inst{3-0} = 0b1111;
2191}
2192
2193class T2I_ldrex<bits<2> opcod, dag oops, dag iops, AddrMode am, SizeFlagVal sz,
2194                InstrItinClass itin, string opc, string asm, string cstr,
2195                list<dag> pattern, bits<4> rt2 = 0b1111>
2196  : Thumb2I<oops, iops, am, sz, itin, opc, asm, cstr, pattern> {
2197  let Inst{31-27} = 0b11101;
2198  let Inst{26-20} = 0b0001101;
2199  let Inst{11-8} = rt2;
2200  let Inst{7-6} = 0b01;
2201  let Inst{5-4} = opcod;
2202  let Inst{3-0} = 0b1111;
2203}
2204class T2I_strex<bits<2> opcod, dag oops, dag iops, AddrMode am, SizeFlagVal sz,
2205                InstrItinClass itin, string opc, string asm, string cstr,
2206                list<dag> pattern, bits<4> rt2 = 0b1111>
2207  : Thumb2I<oops, iops, am, sz, itin, opc, asm, cstr, pattern> {
2208  let Inst{31-27} = 0b11101;
2209  let Inst{26-20} = 0b0001100;
2210  let Inst{11-8} = rt2;
2211  let Inst{7-6} = 0b01;
2212  let Inst{5-4} = opcod;
2213}
2214
2215let mayLoad = 1 in {
2216def t2LDREXB : T2I_ldrex<0b00, (outs GPR:$dest), (ins GPR:$ptr), AddrModeNone,
2217                         Size4Bytes, NoItinerary, "ldrexb", "\t$dest, [$ptr]",
2218                         "", []>;
2219def t2LDREXH : T2I_ldrex<0b01, (outs GPR:$dest), (ins GPR:$ptr), AddrModeNone,
2220                         Size4Bytes, NoItinerary, "ldrexh", "\t$dest, [$ptr]",
2221                         "", []>;
2222def t2LDREX  : Thumb2I<(outs GPR:$dest), (ins GPR:$ptr), AddrModeNone,
2223                       Size4Bytes, NoItinerary,
2224                       "ldrex", "\t$dest, [$ptr]", "",
2225                      []> {
2226  let Inst{31-27} = 0b11101;
2227  let Inst{26-20} = 0b0000101;
2228  let Inst{11-8} = 0b1111;
2229  let Inst{7-0} = 0b00000000; // imm8 = 0
2230}
2231def t2LDREXD : T2I_ldrex<0b11, (outs GPR:$dest, GPR:$dest2), (ins GPR:$ptr),
2232                         AddrModeNone, Size4Bytes, NoItinerary,
2233                         "ldrexd", "\t$dest, $dest2, [$ptr]", "",
2234                         [], {?, ?, ?, ?}>;
2235}
2236
2237let mayStore = 1, Constraints = "@earlyclobber $success" in {
2238def t2STREXB : T2I_strex<0b00, (outs GPR:$success), (ins GPR:$src, GPR:$ptr),
2239                         AddrModeNone, Size4Bytes, NoItinerary,
2240                         "strexb", "\t$success, $src, [$ptr]", "", []>;
2241def t2STREXH : T2I_strex<0b01, (outs GPR:$success), (ins GPR:$src, GPR:$ptr),
2242                         AddrModeNone, Size4Bytes, NoItinerary,
2243                         "strexh", "\t$success, $src, [$ptr]", "", []>;
2244def t2STREX  : Thumb2I<(outs GPR:$success), (ins GPR:$src, GPR:$ptr),
2245                       AddrModeNone, Size4Bytes, NoItinerary,
2246                       "strex", "\t$success, $src, [$ptr]", "",
2247                      []> {
2248  let Inst{31-27} = 0b11101;
2249  let Inst{26-20} = 0b0000100;
2250  let Inst{7-0} = 0b00000000; // imm8 = 0
2251}
2252def t2STREXD : T2I_strex<0b11, (outs GPR:$success),
2253                         (ins GPR:$src, GPR:$src2, GPR:$ptr),
2254                         AddrModeNone, Size4Bytes, NoItinerary,
2255                         "strexd", "\t$success, $src, $src2, [$ptr]", "", [],
2256                         {?, ?, ?, ?}>;
2257}
2258
2259// Clear-Exclusive is for disassembly only.
2260def t2CLREX : T2I<(outs), (ins), NoItinerary, "clrex", "",
2261                  [/* For disassembly only; pattern left blank */]>,
2262            Requires<[IsARM, HasV7]>  {
2263  let Inst{31-20} = 0xf3b;
2264  let Inst{15-14} = 0b10;
2265  let Inst{12} = 0;
2266  let Inst{7-4} = 0b0010;
2267}
2268
2269//===----------------------------------------------------------------------===//
2270// TLS Instructions
2271//
2272
2273// __aeabi_read_tp preserves the registers r1-r3.
2274let isCall = 1,
2275  Defs = [R0, R12, LR, CPSR] in {
2276  def t2TPsoft : T2XI<(outs), (ins), IIC_Br,
2277                     "bl\t__aeabi_read_tp",
2278                     [(set R0, ARMthread_pointer)]> {
2279    let Inst{31-27} = 0b11110;
2280    let Inst{15-14} = 0b11;
2281    let Inst{12} = 1;
2282  }
2283}
2284
2285//===----------------------------------------------------------------------===//
2286// SJLJ Exception handling intrinsics
2287//   eh_sjlj_setjmp() is an instruction sequence to store the return
2288//   address and save #0 in R0 for the non-longjmp case.
2289//   Since by its nature we may be coming from some other function to get
2290//   here, and we're using the stack frame for the containing function to
2291//   save/restore registers, we can't keep anything live in regs across
2292//   the eh_sjlj_setjmp(), else it will almost certainly have been tromped upon
2293//   when we get here from a longjmp(). We force everthing out of registers
2294//   except for our own input by listing the relevant registers in Defs. By
2295//   doing so, we also cause the prologue/epilogue code to actively preserve
2296//   all of the callee-saved resgisters, which is exactly what we want.
2297//   The current SP is passed in $val, and we reuse the reg as a scratch.
2298let Defs =
2299  [ R0,  R1,  R2,  R3,  R4,  R5,  R6,  R7,  R8,  R9,  R10, R11, R12, LR,  D0,
2300    D1,  D2,  D3,  D4,  D5,  D6,  D7,  D8,  D9,  D10, D11, D12, D13, D14, D15,
2301    D16, D17, D18, D19, D20, D21, D22, D23, D24, D25, D26, D27, D28, D29, D30,
2302    D31 ] in {
2303  def t2Int_eh_sjlj_setjmp : Thumb2XI<(outs), (ins GPR:$src, tGPR:$val),
2304                               AddrModeNone, SizeSpecial, NoItinerary,
2305                               "str\t$val, [$src, #8]\t@ begin eh.setjmp\n"
2306                               "\tmov\t$val, pc\n"
2307                               "\tadds\t$val, #9\n"
2308                               "\tstr\t$val, [$src, #4]\n"
2309                               "\tmovs\tr0, #0\n"
2310                               "\tb\t1f\n"
2311                               "\tmovs\tr0, #1\t@ end eh.setjmp\n"
2312                               "1:", "",
2313                          [(set R0, (ARMeh_sjlj_setjmp GPR:$src, tGPR:$val))]>;
2314}
2315
2316
2317
2318//===----------------------------------------------------------------------===//
2319// Control-Flow Instructions
2320//
2321
2322// FIXME: remove when we have a way to marking a MI with these properties.
2323// FIXME: $dst1 should be a def. But the extra ops must be in the end of the
2324// operand list.
2325// FIXME: Should pc be an implicit operand like PICADD, etc?
2326let isReturn = 1, isTerminator = 1, isBarrier = 1, mayLoad = 1,
2327    hasExtraDefRegAllocReq = 1 in
2328  def t2LDM_RET : T2XI<(outs),
2329                    (ins addrmode4:$addr, pred:$p, reglist:$wb, variable_ops),
2330                    IIC_Br, "ldm${addr:submode}${p}${addr:wide}\t$addr, $wb",
2331                    []> {
2332  let Inst{31-27} = 0b11101;
2333  let Inst{26-25} = 0b00;
2334  let Inst{24-23} = {?, ?}; // IA: '01', DB: '10'
2335  let Inst{22} = 0;
2336  let Inst{21} = ?; // The W bit.
2337  let Inst{20} = 1; // Load
2338}
2339
2340let isBranch = 1, isTerminator = 1, isBarrier = 1 in {
2341let isPredicable = 1 in
2342def t2B   : T2XI<(outs), (ins brtarget:$target), IIC_Br,
2343                 "b.w\t$target",
2344                 [(br bb:$target)]> {
2345  let Inst{31-27} = 0b11110;
2346  let Inst{15-14} = 0b10;
2347  let Inst{12} = 1;
2348}
2349
2350let isNotDuplicable = 1, isIndirectBranch = 1 in {
2351def t2BR_JT :
2352    T2JTI<(outs),
2353          (ins GPR:$target, GPR:$index, jt2block_operand:$jt, i32imm:$id),
2354           IIC_Br, "mov\tpc, $target\n$jt",
2355          [(ARMbr2jt GPR:$target, GPR:$index, tjumptable:$jt, imm:$id)]> {
2356  let Inst{31-27} = 0b11101;
2357  let Inst{26-20} = 0b0100100;
2358  let Inst{19-16} = 0b1111;
2359  let Inst{14-12} = 0b000;
2360  let Inst{11-8} = 0b1111; // Rd = pc
2361  let Inst{7-4} = 0b0000;
2362}
2363
2364// FIXME: Add a non-pc based case that can be predicated.
2365def t2TBB :
2366    T2JTI<(outs),
2367        (ins tb_addrmode:$index, jt2block_operand:$jt, i32imm:$id),
2368         IIC_Br, "tbb\t$index\n$jt", []> {
2369  let Inst{31-27} = 0b11101;
2370  let Inst{26-20} = 0b0001101;
2371  let Inst{19-16} = 0b1111; // Rn = pc (table follows this instruction)
2372  let Inst{15-8} = 0b11110000;
2373  let Inst{7-4} = 0b0000; // B form
2374}
2375
2376def t2TBH :
2377    T2JTI<(outs),
2378        (ins tb_addrmode:$index, jt2block_operand:$jt, i32imm:$id),
2379         IIC_Br, "tbh\t$index\n$jt", []> {
2380  let Inst{31-27} = 0b11101;
2381  let Inst{26-20} = 0b0001101;
2382  let Inst{19-16} = 0b1111; // Rn = pc (table follows this instruction)
2383  let Inst{15-8} = 0b11110000;
2384  let Inst{7-4} = 0b0001; // H form
2385}
2386
2387// Generic versions of the above two instructions, for disassembly only
2388
2389def t2TBBgen : T2I<(outs), (ins GPR:$a, GPR:$b), IIC_Br,
2390                    "tbb", "\t[$a, $b]", []>{
2391  let Inst{31-27} = 0b11101;
2392  let Inst{26-20} = 0b0001101;
2393  let Inst{15-8} = 0b11110000;
2394  let Inst{7-4} = 0b0000; // B form
2395}
2396
2397def t2TBHgen : T2I<(outs), (ins GPR:$a, GPR:$b), IIC_Br,
2398                   "tbh", "\t[$a, $b, lsl #1]", []> {
2399  let Inst{31-27} = 0b11101;
2400  let Inst{26-20} = 0b0001101;
2401  let Inst{15-8} = 0b11110000;
2402  let Inst{7-4} = 0b0001; // H form
2403}
2404} // isNotDuplicable, isIndirectBranch
2405
2406} // isBranch, isTerminator, isBarrier
2407
2408// FIXME: should be able to write a pattern for ARMBrcond, but can't use
2409// a two-value operand where a dag node expects two operands. :(
2410let isBranch = 1, isTerminator = 1 in
2411def t2Bcc : T2I<(outs), (ins brtarget:$target), IIC_Br,
2412                "b", ".w\t$target",
2413                [/*(ARMbrcond bb:$target, imm:$cc)*/]> {
2414  let Inst{31-27} = 0b11110;
2415  let Inst{15-14} = 0b10;
2416  let Inst{12} = 0;
2417}
2418
2419
2420// IT block
2421def t2IT : Thumb2XI<(outs), (ins it_pred:$cc, it_mask:$mask),
2422                    AddrModeNone, Size2Bytes,  IIC_iALUx,
2423                    "it$mask\t$cc", "", []> {
2424  // 16-bit instruction.
2425  let Inst{31-16} = 0x0000;
2426  let Inst{15-8} = 0b10111111;
2427}
2428
2429// Branch and Exchange Jazelle -- for disassembly only
2430// Rm = Inst{19-16}
2431def t2BXJ : T2I<(outs), (ins GPR:$func), NoItinerary, "bxj", "\t$func",
2432              [/* For disassembly only; pattern left blank */]> {
2433  let Inst{31-27} = 0b11110;
2434  let Inst{26} = 0;
2435  let Inst{25-20} = 0b111100;
2436  let Inst{15-14} = 0b10;
2437  let Inst{12} = 0;
2438}
2439
2440// Change Processor State is a system instruction -- for disassembly only.
2441// The singleton $opt operand contains the following information:
2442// opt{4-0} = mode from Inst{4-0}
2443// opt{5} = changemode from Inst{17}
2444// opt{8-6} = AIF from Inst{8-6}
2445// opt{10-9} = imod from Inst{19-18} with 0b10 as enable and 0b11 as disable
2446def t2CPS : T2XI<(outs),(ins i32imm:$opt), NoItinerary, "cps${opt:cps}",
2447                 [/* For disassembly only; pattern left blank */]> {
2448  let Inst{31-27} = 0b11110;
2449  let Inst{26} = 0;
2450  let Inst{25-20} = 0b111010;
2451  let Inst{15-14} = 0b10;
2452  let Inst{12} = 0;
2453}
2454
2455// A6.3.4 Branches and miscellaneous control
2456// Table A6-14 Change Processor State, and hint instructions
2457// Helper class for disassembly only.
2458class T2I_hint<bits<8> op7_0, string opc, string asm>
2459  : T2I<(outs), (ins), NoItinerary, opc, asm,
2460        [/* For disassembly only; pattern left blank */]> {
2461  let Inst{31-20} = 0xf3a;
2462  let Inst{15-14} = 0b10;
2463  let Inst{12} = 0;
2464  let Inst{10-8} = 0b000;
2465  let Inst{7-0} = op7_0;
2466}
2467
2468def t2NOP   : T2I_hint<0b00000000, "nop",   ".w">;
2469def t2YIELD : T2I_hint<0b00000001, "yield", ".w">;
2470def t2WFE   : T2I_hint<0b00000010, "wfe",   ".w">;
2471def t2WFI   : T2I_hint<0b00000011, "wfi",   ".w">;
2472def t2SEV   : T2I_hint<0b00000100, "sev",   ".w">;
2473
2474def t2DBG : T2I<(outs),(ins i32imm:$opt), NoItinerary, "dbg", "\t$opt",
2475                [/* For disassembly only; pattern left blank */]> {
2476  let Inst{31-20} = 0xf3a;
2477  let Inst{15-14} = 0b10;
2478  let Inst{12} = 0;
2479  let Inst{10-8} = 0b000;
2480  let Inst{7-4} = 0b1111;
2481}
2482
2483// Secure Monitor Call is a system instruction -- for disassembly only
2484// Option = Inst{19-16}
2485def t2SMC : T2I<(outs), (ins i32imm:$opt), NoItinerary, "smc", "\t$opt",
2486                [/* For disassembly only; pattern left blank */]> {
2487  let Inst{31-27} = 0b11110;
2488  let Inst{26-20} = 0b1111111;
2489  let Inst{15-12} = 0b1000;
2490}
2491
2492// Store Return State is a system instruction -- for disassembly only
2493def t2SRSDBW : T2I<(outs),(ins i32imm:$mode),NoItinerary,"srsdb","\tsp!, $mode",
2494                   [/* For disassembly only; pattern left blank */]> {
2495  let Inst{31-27} = 0b11101;
2496  let Inst{26-20} = 0b0000010; // W = 1
2497}
2498
2499def t2SRSDB  : T2I<(outs),(ins i32imm:$mode),NoItinerary,"srsdb","\tsp, $mode",
2500                   [/* For disassembly only; pattern left blank */]> {
2501  let Inst{31-27} = 0b11101;
2502  let Inst{26-20} = 0b0000000; // W = 0
2503}
2504
2505def t2SRSIAW : T2I<(outs),(ins i32imm:$mode),NoItinerary,"srsia","\tsp!, $mode",
2506                   [/* For disassembly only; pattern left blank */]> {
2507  let Inst{31-27} = 0b11101;
2508  let Inst{26-20} = 0b0011010; // W = 1
2509}
2510
2511def t2SRSIA  : T2I<(outs), (ins i32imm:$mode),NoItinerary,"srsia","\tsp, $mode",
2512                   [/* For disassembly only; pattern left blank */]> {
2513  let Inst{31-27} = 0b11101;
2514  let Inst{26-20} = 0b0011000; // W = 0
2515}
2516
2517// Return From Exception is a system instruction -- for disassembly only
2518def t2RFEDBW : T2I<(outs), (ins GPR:$base), NoItinerary, "rfedb", "\t$base!",
2519                   [/* For disassembly only; pattern left blank */]> {
2520  let Inst{31-27} = 0b11101;
2521  let Inst{26-20} = 0b0000011; // W = 1
2522}
2523
2524def t2RFEDB  : T2I<(outs), (ins GPR:$base), NoItinerary, "rfeab", "\t$base",
2525                   [/* For disassembly only; pattern left blank */]> {
2526  let Inst{31-27} = 0b11101;
2527  let Inst{26-20} = 0b0000001; // W = 0
2528}
2529
2530def t2RFEIAW : T2I<(outs), (ins GPR:$base), NoItinerary, "rfeia", "\t$base!",
2531                   [/* For disassembly only; pattern left blank */]> {
2532  let Inst{31-27} = 0b11101;
2533  let Inst{26-20} = 0b0011011; // W = 1
2534}
2535
2536def t2RFEIA  : T2I<(outs), (ins GPR:$base), NoItinerary, "rfeia", "\t$base",
2537                   [/* For disassembly only; pattern left blank */]> {
2538  let Inst{31-27} = 0b11101;
2539  let Inst{26-20} = 0b0011001; // W = 0
2540}
2541
2542//===----------------------------------------------------------------------===//
2543// Non-Instruction Patterns
2544//
2545
2546// Two piece so_imms.
2547def : T2Pat<(or GPR:$LHS, t2_so_imm2part:$RHS),
2548             (t2ORRri (t2ORRri GPR:$LHS, (t2_so_imm2part_1 imm:$RHS)),
2549                    (t2_so_imm2part_2 imm:$RHS))>;
2550def : T2Pat<(xor GPR:$LHS, t2_so_imm2part:$RHS),
2551             (t2EORri (t2EORri GPR:$LHS, (t2_so_imm2part_1 imm:$RHS)),
2552                    (t2_so_imm2part_2 imm:$RHS))>;
2553def : T2Pat<(add GPR:$LHS, t2_so_imm2part:$RHS),
2554             (t2ADDri (t2ADDri GPR:$LHS, (t2_so_imm2part_1 imm:$RHS)),
2555                    (t2_so_imm2part_2 imm:$RHS))>;
2556def : T2Pat<(add GPR:$LHS, t2_so_neg_imm2part:$RHS),
2557             (t2SUBri (t2SUBri GPR:$LHS, (t2_so_neg_imm2part_1 imm:$RHS)),
2558                    (t2_so_neg_imm2part_2 imm:$RHS))>;
2559
2560// 32-bit immediate using movw + movt.
2561// This is a single pseudo instruction to make it re-materializable. Remove
2562// when we can do generalized remat.
2563let isReMaterializable = 1 in
2564def t2MOVi32imm : T2Ix2<(outs GPR:$dst), (ins i32imm:$src), IIC_iMOVi,
2565                   "movw", "\t$dst, ${src:lo16}\n\tmovt${p}\t$dst, ${src:hi16}",
2566                     [(set GPR:$dst, (i32 imm:$src))]>;
2567
2568// ConstantPool, GlobalAddress, and JumpTable
2569def : T2Pat<(ARMWrapper  tglobaladdr :$dst), (t2LEApcrel tglobaladdr :$dst)>,
2570           Requires<[IsThumb2, DontUseMovt]>;
2571def : T2Pat<(ARMWrapper  tconstpool  :$dst), (t2LEApcrel tconstpool  :$dst)>;
2572def : T2Pat<(ARMWrapper  tglobaladdr :$dst), (t2MOVi32imm tglobaladdr :$dst)>,
2573           Requires<[IsThumb2, UseMovt]>;
2574
2575def : T2Pat<(ARMWrapperJT tjumptable:$dst, imm:$id),
2576            (t2LEApcrelJT tjumptable:$dst, imm:$id)>;
2577
2578// Pseudo instruction that combines ldr from constpool and add pc. This should
2579// be expanded into two instructions late to allow if-conversion and
2580// scheduling.
2581let canFoldAsLoad = 1, isReMaterializable = 1 in
2582def t2LDRpci_pic : PseudoInst<(outs GPR:$dst), (ins i32imm:$addr, pclabel:$cp),
2583                   NoItinerary, "@ ldr.w\t$dst, $addr\n$cp:\n\tadd\t$dst, pc",
2584               [(set GPR:$dst, (ARMpic_add (load (ARMWrapper tconstpool:$addr)),
2585                                           imm:$cp))]>,
2586               Requires<[IsThumb2]>;
2587
2588//===----------------------------------------------------------------------===//
2589// Move between special register and ARM core register -- for disassembly only
2590//
2591
2592// Rd = Instr{11-8}
2593def t2MRS : T2I<(outs GPR:$dst), (ins), NoItinerary, "mrs", "\t$dst, cpsr",
2594                [/* For disassembly only; pattern left blank */]> {
2595  let Inst{31-27} = 0b11110;
2596  let Inst{26} = 0;
2597  let Inst{25-21} = 0b11111;
2598  let Inst{20} = 0; // The R bit.
2599  let Inst{15-14} = 0b10;
2600  let Inst{12} = 0;
2601}
2602
2603// Rd = Instr{11-8}
2604def t2MRSsys : T2I<(outs GPR:$dst), (ins), NoItinerary, "mrs", "\t$dst, spsr",
2605                   [/* For disassembly only; pattern left blank */]> {
2606  let Inst{31-27} = 0b11110;
2607  let Inst{26} = 0;
2608  let Inst{25-21} = 0b11111;
2609  let Inst{20} = 1; // The R bit.
2610  let Inst{15-14} = 0b10;
2611  let Inst{12} = 0;
2612}
2613
2614// FIXME: mask is ignored for the time being.
2615// Rn = Inst{19-16}
2616def t2MSR : T2I<(outs), (ins GPR:$src), NoItinerary, "msr", "\tcpsr, $src",
2617                [/* For disassembly only; pattern left blank */]> {
2618  let Inst{31-27} = 0b11110;
2619  let Inst{26} = 0;
2620  let Inst{25-21} = 0b11100;
2621  let Inst{20} = 0; // The R bit.
2622  let Inst{15-14} = 0b10;
2623  let Inst{12} = 0;
2624}
2625
2626// FIXME: mask is ignored for the time being.
2627// Rn = Inst{19-16}
2628def t2MSRsys : T2I<(outs), (ins GPR:$src), NoItinerary, "msr", "\tspsr, $src",
2629                   [/* For disassembly only; pattern left blank */]> {
2630  let Inst{31-27} = 0b11110;
2631  let Inst{26} = 0;
2632  let Inst{25-21} = 0b11100;
2633  let Inst{20} = 1; // The R bit.
2634  let Inst{15-14} = 0b10;
2635  let Inst{12} = 0;
2636}
2637