blob: ab4ccd7d75fb64664f3457f0ea10db89362f7373 [file] [log] [blame]
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001//===- ARMInstrInfo.td - Target Description for ARM Target -*- tablegen -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner081ce942007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
Dan Gohmanf17a25c2007-07-18 16:29:46 +00006// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file describes the ARM instructions in TableGen format.
11//
12//===----------------------------------------------------------------------===//
13
14//===----------------------------------------------------------------------===//
15// ARM specific DAG Nodes.
16//
17
18// Type profiles.
Bill Wendling7173da52007-11-13 09:19:02 +000019def SDT_ARMCallSeqStart : SDCallSeqStart<[ SDTCisVT<0, i32> ]>;
20def SDT_ARMCallSeqEnd : SDCallSeqEnd<[ SDTCisVT<0, i32>, SDTCisVT<1, i32> ]>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +000021
22def SDT_ARMSaveCallPC : SDTypeProfile<0, 1, []>;
23
24def SDT_ARMcall : SDTypeProfile<0, -1, [SDTCisInt<0>]>;
25
26def SDT_ARMCMov : SDTypeProfile<1, 3,
27 [SDTCisSameAs<0, 1>, SDTCisSameAs<0, 2>,
28 SDTCisVT<3, i32>]>;
29
30def SDT_ARMBrcond : SDTypeProfile<0, 2,
31 [SDTCisVT<0, OtherVT>, SDTCisVT<1, i32>]>;
32
33def SDT_ARMBrJT : SDTypeProfile<0, 3,
34 [SDTCisPtrTy<0>, SDTCisVT<1, i32>,
35 SDTCisVT<2, i32>]>;
36
37def SDT_ARMCmp : SDTypeProfile<0, 2, [SDTCisSameAs<0, 1>]>;
38
39def SDT_ARMPICAdd : SDTypeProfile<1, 2, [SDTCisSameAs<0, 1>,
40 SDTCisPtrTy<1>, SDTCisVT<2, i32>]>;
41
42def SDT_ARMThreadPointer : SDTypeProfile<1, 0, [SDTCisPtrTy<0>]>;
Jim Grosbach4a9025e2009-05-14 00:46:35 +000043def SDT_ARMEH_SJLJ_Setjmp : SDTypeProfile<1, 1, [SDTCisInt<0>, SDTCisPtrTy<1>]>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +000044
45// Node definitions.
46def ARMWrapper : SDNode<"ARMISD::Wrapper", SDTIntUnaryOp>;
47def ARMWrapperJT : SDNode<"ARMISD::WrapperJT", SDTIntBinOp>;
48
Bill Wendling7173da52007-11-13 09:19:02 +000049def ARMcallseq_start : SDNode<"ISD::CALLSEQ_START", SDT_ARMCallSeqStart,
Bill Wendling6c02cd22008-02-27 06:33:05 +000050 [SDNPHasChain, SDNPOutFlag]>;
Bill Wendling7173da52007-11-13 09:19:02 +000051def ARMcallseq_end : SDNode<"ISD::CALLSEQ_END", SDT_ARMCallSeqEnd,
Bill Wendling6c02cd22008-02-27 06:33:05 +000052 [SDNPHasChain, SDNPOptInFlag, SDNPOutFlag]>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +000053
54def ARMcall : SDNode<"ARMISD::CALL", SDT_ARMcall,
55 [SDNPHasChain, SDNPOptInFlag, SDNPOutFlag]>;
56def ARMcall_pred : SDNode<"ARMISD::CALL_PRED", SDT_ARMcall,
57 [SDNPHasChain, SDNPOptInFlag, SDNPOutFlag]>;
58def ARMcall_nolink : SDNode<"ARMISD::CALL_NOLINK", SDT_ARMcall,
59 [SDNPHasChain, SDNPOptInFlag, SDNPOutFlag]>;
60
Chris Lattner3d254552008-01-15 22:02:54 +000061def ARMretflag : SDNode<"ARMISD::RET_FLAG", SDTNone,
Dan Gohmanf17a25c2007-07-18 16:29:46 +000062 [SDNPHasChain, SDNPOptInFlag]>;
63
64def ARMcmov : SDNode<"ARMISD::CMOV", SDT_ARMCMov,
65 [SDNPInFlag]>;
66def ARMcneg : SDNode<"ARMISD::CNEG", SDT_ARMCMov,
67 [SDNPInFlag]>;
68
69def ARMbrcond : SDNode<"ARMISD::BRCOND", SDT_ARMBrcond,
70 [SDNPHasChain, SDNPInFlag, SDNPOutFlag]>;
71
72def ARMbrjt : SDNode<"ARMISD::BR_JT", SDT_ARMBrJT,
73 [SDNPHasChain]>;
74
75def ARMcmp : SDNode<"ARMISD::CMP", SDT_ARMCmp,
76 [SDNPOutFlag]>;
77
David Goodwin8bdcbb32009-06-29 15:33:01 +000078def ARMcmpZ : SDNode<"ARMISD::CMPZ", SDT_ARMCmp,
79 [SDNPOutFlag,SDNPCommutative]>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +000080
81def ARMpic_add : SDNode<"ARMISD::PIC_ADD", SDT_ARMPICAdd>;
82
83def ARMsrl_flag : SDNode<"ARMISD::SRL_FLAG", SDTIntUnaryOp, [SDNPOutFlag]>;
84def ARMsra_flag : SDNode<"ARMISD::SRA_FLAG", SDTIntUnaryOp, [SDNPOutFlag]>;
85def ARMrrx : SDNode<"ARMISD::RRX" , SDTIntUnaryOp, [SDNPInFlag ]>;
86
87def ARMthread_pointer: SDNode<"ARMISD::THREAD_POINTER", SDT_ARMThreadPointer>;
Jim Grosbach4a9025e2009-05-14 00:46:35 +000088def ARMeh_sjlj_setjmp: SDNode<"ARMISD::EH_SJLJ_SETJMP", SDT_ARMEH_SJLJ_Setjmp>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +000089
90//===----------------------------------------------------------------------===//
91// ARM Instruction Predicate Definitions.
92//
Anton Korobeynikovcba02692009-06-15 21:46:20 +000093def HasV5T : Predicate<"Subtarget->hasV5TOps()">;
94def HasV5TE : Predicate<"Subtarget->hasV5TEOps()">;
95def HasV6 : Predicate<"Subtarget->hasV6Ops()">;
Evan Chengc8147e12009-07-06 22:05:45 +000096def HasV6T2 : Predicate<"Subtarget->hasV6T2Ops()">;
Bob Wilsone60fee02009-06-22 23:27:02 +000097def HasV7 : Predicate<"Subtarget->hasV7Ops()">;
98def HasVFP2 : Predicate<"Subtarget->hasVFP2()">;
99def HasVFP3 : Predicate<"Subtarget->hasVFP3()">;
100def HasNEON : Predicate<"Subtarget->hasNEON()">;
Anton Korobeynikovcba02692009-06-15 21:46:20 +0000101def IsThumb : Predicate<"Subtarget->isThumb()">;
Evan Cheng36173712009-06-23 17:48:47 +0000102def IsThumb1Only : Predicate<"Subtarget->isThumb1Only()">;
Evan Chengb1b2abc2009-07-02 06:38:40 +0000103def IsThumb2 : Predicate<"Subtarget->isThumb2()">;
Anton Korobeynikovcba02692009-06-15 21:46:20 +0000104def IsARM : Predicate<"!Subtarget->isThumb()">;
Bob Wilson243b37c2009-06-22 21:01:46 +0000105def IsDarwin : Predicate<"Subtarget->isTargetDarwin()">;
106def IsNotDarwin : Predicate<"!Subtarget->isTargetDarwin()">;
Evan Cheng3e9a99e2009-06-26 06:10:18 +0000107def CarryDefIsUnused : Predicate<"!N.getNode()->hasAnyUseOfValue(1)">;
Evan Cheng9b4d26f2009-06-25 23:34:10 +0000108def CarryDefIsUsed : Predicate<"N.getNode()->hasAnyUseOfValue(1)">;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000109
110//===----------------------------------------------------------------------===//
111// ARM Flag Definitions.
112
113class RegConstraint<string C> {
114 string Constraints = C;
115}
116
117//===----------------------------------------------------------------------===//
118// ARM specific transformation functions and pattern fragments.
119//
120
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000121// so_imm_neg_XFORM - Return a so_imm value packed into the format described for
122// so_imm_neg def below.
123def so_imm_neg_XFORM : SDNodeXForm<imm, [{
Evan Cheng8be2a5b2009-07-08 21:03:57 +0000124 return CurDAG->getTargetConstant(-(int)N->getZExtValue(), MVT::i32);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000125}]>;
126
127// so_imm_not_XFORM - Return a so_imm value packed into the format described for
128// so_imm_not def below.
129def so_imm_not_XFORM : SDNodeXForm<imm, [{
Evan Cheng8be2a5b2009-07-08 21:03:57 +0000130 return CurDAG->getTargetConstant(~(int)N->getZExtValue(), MVT::i32);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000131}]>;
132
133// rot_imm predicate - True if the 32-bit immediate is equal to 8, 16, or 24.
134def rot_imm : PatLeaf<(i32 imm), [{
Dan Gohmanfaeb4a32008-09-12 16:56:44 +0000135 int32_t v = (int32_t)N->getZExtValue();
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000136 return v == 8 || v == 16 || v == 24;
137}]>;
138
139/// imm1_15 predicate - True if the 32-bit immediate is in the range [1,15].
140def imm1_15 : PatLeaf<(i32 imm), [{
Dan Gohmanfaeb4a32008-09-12 16:56:44 +0000141 return (int32_t)N->getZExtValue() >= 1 && (int32_t)N->getZExtValue() < 16;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000142}]>;
143
144/// imm16_31 predicate - True if the 32-bit immediate is in the range [16,31].
145def imm16_31 : PatLeaf<(i32 imm), [{
Dan Gohmanfaeb4a32008-09-12 16:56:44 +0000146 return (int32_t)N->getZExtValue() >= 16 && (int32_t)N->getZExtValue() < 32;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000147}]>;
148
149def so_imm_neg :
Dan Gohmanfaeb4a32008-09-12 16:56:44 +0000150 PatLeaf<(imm), [{
151 return ARM_AM::getSOImmVal(-(int)N->getZExtValue()) != -1;
152 }], so_imm_neg_XFORM>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000153
154def so_imm_not :
Dan Gohmanfaeb4a32008-09-12 16:56:44 +0000155 PatLeaf<(imm), [{
156 return ARM_AM::getSOImmVal(~(int)N->getZExtValue()) != -1;
157 }], so_imm_not_XFORM>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000158
159// sext_16_node predicate - True if the SDNode is sign-extended 16 or more bits.
160def sext_16_node : PatLeaf<(i32 GPR:$a), [{
Dan Gohman8181bd12008-07-27 21:46:04 +0000161 return CurDAG->ComputeNumSignBits(SDValue(N,0)) >= 17;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000162}]>;
163
Evan Cheng299ee652009-07-06 22:23:46 +0000164/// bf_inv_mask_imm predicate - An AND mask to clear an arbitrary width bitfield
165/// e.g., 0xf000ffff
166def bf_inv_mask_imm : Operand<i32>,
167 PatLeaf<(imm), [{
168 uint32_t v = (uint32_t)N->getZExtValue();
169 if (v == 0xffffffff)
170 return 0;
David Goodwinf354d362009-07-14 00:57:56 +0000171 // there can be 1's on either or both "outsides", all the "inside"
172 // bits must be 0's
173 unsigned int lsb = 0, msb = 31;
174 while (v & (1 << msb)) --msb;
175 while (v & (1 << lsb)) ++lsb;
176 for (unsigned int i = lsb; i <= msb; ++i) {
177 if (v & (1 << i))
178 return 0;
179 }
180 return 1;
Evan Cheng299ee652009-07-06 22:23:46 +0000181}] > {
182 let PrintMethod = "printBitfieldInvMaskImmOperand";
183}
184
Evan Cheng7b0249b2008-08-28 23:39:26 +0000185class BinOpFrag<dag res> : PatFrag<(ops node:$LHS, node:$RHS), res>;
186class UnOpFrag <dag res> : PatFrag<(ops node:$Src), res>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000187
188//===----------------------------------------------------------------------===//
189// Operand Definitions.
190//
191
192// Branch target.
193def brtarget : Operand<OtherVT>;
194
195// A list of registers separated by comma. Used by load/store multiple.
196def reglist : Operand<i32> {
197 let PrintMethod = "printRegisterList";
198}
199
200// An operand for the CONSTPOOL_ENTRY pseudo-instruction.
201def cpinst_operand : Operand<i32> {
202 let PrintMethod = "printCPInstOperand";
203}
204
205def jtblock_operand : Operand<i32> {
206 let PrintMethod = "printJTBlockOperand";
207}
Evan Cheng6e2ebc92009-07-25 00:33:29 +0000208def jt2block_operand : Operand<i32> {
209 let PrintMethod = "printJT2BlockOperand";
210}
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000211
212// Local PC labels.
213def pclabel : Operand<i32> {
214 let PrintMethod = "printPCLabel";
215}
216
217// shifter_operand operands: so_reg and so_imm.
218def so_reg : Operand<i32>, // reg reg imm
219 ComplexPattern<i32, 3, "SelectShifterOperandReg",
220 [shl,srl,sra,rotr]> {
221 let PrintMethod = "printSORegOperand";
222 let MIOperandInfo = (ops GPR, GPR, i32imm);
223}
224
225// so_imm - Match a 32-bit shifter_operand immediate operand, which is an
226// 8-bit immediate rotated by an arbitrary number of bits. so_imm values are
227// represented in the imm field in the same 12-bit form that they are encoded
228// into so_imm instructions: the 8-bit immediate is the least significant bits
229// [bits 0-7], the 4-bit shift amount is the next 4 bits [bits 8-11].
230def so_imm : Operand<i32>,
Evan Cheng8be2a5b2009-07-08 21:03:57 +0000231 PatLeaf<(imm), [{
232 return ARM_AM::getSOImmVal(N->getZExtValue()) != -1;
233 }]> {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000234 let PrintMethod = "printSOImmOperand";
235}
236
237// Break so_imm's up into two pieces. This handles immediates with up to 16
238// bits set in them. This uses so_imm2part to match and so_imm2part_[12] to
239// get the first/second pieces.
240def so_imm2part : Operand<i32>,
Dan Gohmanfaeb4a32008-09-12 16:56:44 +0000241 PatLeaf<(imm), [{
242 return ARM_AM::isSOImmTwoPartVal((unsigned)N->getZExtValue());
243 }]> {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000244 let PrintMethod = "printSOImm2PartOperand";
245}
246
247def so_imm2part_1 : SDNodeXForm<imm, [{
Dan Gohmanfaeb4a32008-09-12 16:56:44 +0000248 unsigned V = ARM_AM::getSOImmTwoPartFirst((unsigned)N->getZExtValue());
Evan Cheng8be2a5b2009-07-08 21:03:57 +0000249 return CurDAG->getTargetConstant(V, MVT::i32);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000250}]>;
251
252def so_imm2part_2 : SDNodeXForm<imm, [{
Dan Gohmanfaeb4a32008-09-12 16:56:44 +0000253 unsigned V = ARM_AM::getSOImmTwoPartSecond((unsigned)N->getZExtValue());
Evan Cheng8be2a5b2009-07-08 21:03:57 +0000254 return CurDAG->getTargetConstant(V, MVT::i32);
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000255}]>;
256
257
258// Define ARM specific addressing modes.
259
260// addrmode2 := reg +/- reg shop imm
261// addrmode2 := reg +/- imm12
262//
263def addrmode2 : Operand<i32>,
264 ComplexPattern<i32, 3, "SelectAddrMode2", []> {
265 let PrintMethod = "printAddrMode2Operand";
266 let MIOperandInfo = (ops GPR:$base, GPR:$offsreg, i32imm:$offsimm);
267}
268
269def am2offset : Operand<i32>,
270 ComplexPattern<i32, 2, "SelectAddrMode2Offset", []> {
271 let PrintMethod = "printAddrMode2OffsetOperand";
272 let MIOperandInfo = (ops GPR, i32imm);
273}
274
275// addrmode3 := reg +/- reg
276// addrmode3 := reg +/- imm8
277//
278def addrmode3 : Operand<i32>,
279 ComplexPattern<i32, 3, "SelectAddrMode3", []> {
280 let PrintMethod = "printAddrMode3Operand";
281 let MIOperandInfo = (ops GPR:$base, GPR:$offsreg, i32imm:$offsimm);
282}
283
284def am3offset : Operand<i32>,
285 ComplexPattern<i32, 2, "SelectAddrMode3Offset", []> {
286 let PrintMethod = "printAddrMode3OffsetOperand";
287 let MIOperandInfo = (ops GPR, i32imm);
288}
289
290// addrmode4 := reg, <mode|W>
291//
292def addrmode4 : Operand<i32>,
293 ComplexPattern<i32, 2, "", []> {
294 let PrintMethod = "printAddrMode4Operand";
295 let MIOperandInfo = (ops GPR, i32imm);
296}
297
298// addrmode5 := reg +/- imm8*4
299//
300def addrmode5 : Operand<i32>,
301 ComplexPattern<i32, 2, "SelectAddrMode5", []> {
302 let PrintMethod = "printAddrMode5Operand";
303 let MIOperandInfo = (ops GPR, i32imm);
304}
305
Bob Wilson970a10d2009-07-01 23:16:05 +0000306// addrmode6 := reg with optional writeback
307//
308def addrmode6 : Operand<i32>,
309 ComplexPattern<i32, 3, "SelectAddrMode6", []> {
310 let PrintMethod = "printAddrMode6Operand";
311 let MIOperandInfo = (ops GPR:$addr, GPR:$upd, i32imm);
312}
313
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000314// addrmodepc := pc + reg
315//
316def addrmodepc : Operand<i32>,
317 ComplexPattern<i32, 2, "SelectAddrModePC", []> {
318 let PrintMethod = "printAddrModePCOperand";
319 let MIOperandInfo = (ops GPR, i32imm);
320}
321
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000322//===----------------------------------------------------------------------===//
Evan Chenga7b3e7c2007-08-07 01:37:15 +0000323
Evan Cheng7b0249b2008-08-28 23:39:26 +0000324include "ARMInstrFormats.td"
Evan Chenga7b3e7c2007-08-07 01:37:15 +0000325
326//===----------------------------------------------------------------------===//
Evan Cheng7b0249b2008-08-28 23:39:26 +0000327// Multiclass helpers...
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000328//
329
Evan Cheng40d64532008-08-29 07:36:24 +0000330/// AsI1_bin_irs - Defines a set of (op r, {so_imm|r|so_reg}) patterns for a
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000331/// binop that produces a value.
Evan Chengbdd679a2009-06-26 00:19:44 +0000332multiclass AsI1_bin_irs<bits<4> opcod, string opc, PatFrag opnode,
333 bit Commutable = 0> {
Evan Cheng86a926a2008-11-05 18:35:52 +0000334 def ri : AsI1<opcod, (outs GPR:$dst), (ins GPR:$a, so_imm:$b), DPFrm,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000335 opc, " $dst, $a, $b",
Evan Cheng83a32b42009-07-07 23:40:25 +0000336 [(set GPR:$dst, (opnode GPR:$a, so_imm:$b))]> {
337 let Inst{25} = 1;
338 }
Evan Cheng86a926a2008-11-05 18:35:52 +0000339 def rr : AsI1<opcod, (outs GPR:$dst), (ins GPR:$a, GPR:$b), DPFrm,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000340 opc, " $dst, $a, $b",
Evan Chengbdd679a2009-06-26 00:19:44 +0000341 [(set GPR:$dst, (opnode GPR:$a, GPR:$b))]> {
Evan Cheng83a32b42009-07-07 23:40:25 +0000342 let Inst{25} = 0;
Evan Chengbdd679a2009-06-26 00:19:44 +0000343 let isCommutable = Commutable;
344 }
Evan Cheng86a926a2008-11-05 18:35:52 +0000345 def rs : AsI1<opcod, (outs GPR:$dst), (ins GPR:$a, so_reg:$b), DPSoRegFrm,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000346 opc, " $dst, $a, $b",
Evan Cheng83a32b42009-07-07 23:40:25 +0000347 [(set GPR:$dst, (opnode GPR:$a, so_reg:$b))]> {
348 let Inst{25} = 0;
349 }
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000350}
351
Evan Chengd4e2f052009-06-25 20:59:23 +0000352/// AI1_bin_s_irs - Similar to AsI1_bin_irs except it sets the 's' bit so the
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000353/// instruction modifies the CSPR register.
Evan Cheng6e4d1d92007-09-11 19:55:27 +0000354let Defs = [CPSR] in {
Evan Chengbdd679a2009-06-26 00:19:44 +0000355multiclass AI1_bin_s_irs<bits<4> opcod, string opc, PatFrag opnode,
356 bit Commutable = 0> {
Evan Cheng86a926a2008-11-05 18:35:52 +0000357 def ri : AI1<opcod, (outs GPR:$dst), (ins GPR:$a, so_imm:$b), DPFrm,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000358 opc, "s $dst, $a, $b",
Evan Cheng83a32b42009-07-07 23:40:25 +0000359 [(set GPR:$dst, (opnode GPR:$a, so_imm:$b))]> {
360 let Inst{25} = 1;
361 }
Evan Cheng86a926a2008-11-05 18:35:52 +0000362 def rr : AI1<opcod, (outs GPR:$dst), (ins GPR:$a, GPR:$b), DPFrm,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000363 opc, "s $dst, $a, $b",
Evan Chengbdd679a2009-06-26 00:19:44 +0000364 [(set GPR:$dst, (opnode GPR:$a, GPR:$b))]> {
365 let isCommutable = Commutable;
Evan Cheng83a32b42009-07-07 23:40:25 +0000366 let Inst{25} = 0;
Evan Chengbdd679a2009-06-26 00:19:44 +0000367 }
Evan Cheng86a926a2008-11-05 18:35:52 +0000368 def rs : AI1<opcod, (outs GPR:$dst), (ins GPR:$a, so_reg:$b), DPSoRegFrm,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000369 opc, "s $dst, $a, $b",
Evan Cheng83a32b42009-07-07 23:40:25 +0000370 [(set GPR:$dst, (opnode GPR:$a, so_reg:$b))]> {
371 let Inst{25} = 0;
372 }
Evan Cheng6e4d1d92007-09-11 19:55:27 +0000373}
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000374}
375
376/// AI1_cmp_irs - Defines a set of (op r, {so_imm|r|so_reg}) cmp / test
377/// patterns. Similar to AsI1_bin_irs except the instruction does not produce
378/// a explicit result, only implicitly set CPSR.
Evan Cheng6e4d1d92007-09-11 19:55:27 +0000379let Defs = [CPSR] in {
Evan Chengbdd679a2009-06-26 00:19:44 +0000380multiclass AI1_cmp_irs<bits<4> opcod, string opc, PatFrag opnode,
381 bit Commutable = 0> {
Evan Cheng86a926a2008-11-05 18:35:52 +0000382 def ri : AI1<opcod, (outs), (ins GPR:$a, so_imm:$b), DPFrm,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000383 opc, " $a, $b",
Evan Cheng83a32b42009-07-07 23:40:25 +0000384 [(opnode GPR:$a, so_imm:$b)]> {
385 let Inst{25} = 1;
386 }
Evan Cheng86a926a2008-11-05 18:35:52 +0000387 def rr : AI1<opcod, (outs), (ins GPR:$a, GPR:$b), DPFrm,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000388 opc, " $a, $b",
Evan Chengbdd679a2009-06-26 00:19:44 +0000389 [(opnode GPR:$a, GPR:$b)]> {
Evan Cheng83a32b42009-07-07 23:40:25 +0000390 let Inst{25} = 0;
Evan Chengbdd679a2009-06-26 00:19:44 +0000391 let isCommutable = Commutable;
392 }
Evan Cheng86a926a2008-11-05 18:35:52 +0000393 def rs : AI1<opcod, (outs), (ins GPR:$a, so_reg:$b), DPSoRegFrm,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000394 opc, " $a, $b",
Evan Cheng83a32b42009-07-07 23:40:25 +0000395 [(opnode GPR:$a, so_reg:$b)]> {
396 let Inst{25} = 0;
397 }
Evan Cheng6e4d1d92007-09-11 19:55:27 +0000398}
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000399}
400
401/// AI_unary_rrot - A unary operation with two forms: one whose operand is a
402/// register and one whose operand is a register rotated by 8/16/24.
Evan Cheng37afa432008-11-06 22:15:19 +0000403/// FIXME: Remove the 'r' variant. Its rot_imm is zero.
404multiclass AI_unary_rrot<bits<8> opcod, string opc, PatFrag opnode> {
405 def r : AExtI<opcod, (outs GPR:$dst), (ins GPR:$Src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000406 opc, " $dst, $Src",
Evan Cheng37afa432008-11-06 22:15:19 +0000407 [(set GPR:$dst, (opnode GPR:$Src))]>,
408 Requires<[IsARM, HasV6]> {
409 let Inst{19-16} = 0b1111;
410 }
411 def r_rot : AExtI<opcod, (outs GPR:$dst), (ins GPR:$Src, i32imm:$rot),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000412 opc, " $dst, $Src, ror $rot",
413 [(set GPR:$dst, (opnode (rotr GPR:$Src, rot_imm:$rot)))]>,
Evan Cheng37afa432008-11-06 22:15:19 +0000414 Requires<[IsARM, HasV6]> {
415 let Inst{19-16} = 0b1111;
416 }
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000417}
418
419/// AI_bin_rrot - A binary operation with two forms: one whose operand is a
420/// register and one whose operand is a register rotated by 8/16/24.
Evan Cheng37afa432008-11-06 22:15:19 +0000421multiclass AI_bin_rrot<bits<8> opcod, string opc, PatFrag opnode> {
422 def rr : AExtI<opcod, (outs GPR:$dst), (ins GPR:$LHS, GPR:$RHS),
423 opc, " $dst, $LHS, $RHS",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000424 [(set GPR:$dst, (opnode GPR:$LHS, GPR:$RHS))]>,
425 Requires<[IsARM, HasV6]>;
Evan Cheng37afa432008-11-06 22:15:19 +0000426 def rr_rot : AExtI<opcod, (outs GPR:$dst), (ins GPR:$LHS, GPR:$RHS, i32imm:$rot),
427 opc, " $dst, $LHS, $RHS, ror $rot",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000428 [(set GPR:$dst, (opnode GPR:$LHS,
429 (rotr GPR:$RHS, rot_imm:$rot)))]>,
430 Requires<[IsARM, HasV6]>;
431}
432
Evan Cheng9b4d26f2009-06-25 23:34:10 +0000433/// AI1_adde_sube_irs - Define instructions and patterns for adde and sube.
434let Uses = [CPSR] in {
Evan Chengbdd679a2009-06-26 00:19:44 +0000435multiclass AI1_adde_sube_irs<bits<4> opcod, string opc, PatFrag opnode,
436 bit Commutable = 0> {
Evan Cheng9b4d26f2009-06-25 23:34:10 +0000437 def ri : AsI1<opcod, (outs GPR:$dst), (ins GPR:$a, so_imm:$b),
438 DPFrm, opc, " $dst, $a, $b",
439 [(set GPR:$dst, (opnode GPR:$a, so_imm:$b))]>,
Evan Cheng83a32b42009-07-07 23:40:25 +0000440 Requires<[IsARM, CarryDefIsUnused]> {
441 let Inst{25} = 1;
442 }
Evan Cheng9b4d26f2009-06-25 23:34:10 +0000443 def rr : AsI1<opcod, (outs GPR:$dst), (ins GPR:$a, GPR:$b),
444 DPFrm, opc, " $dst, $a, $b",
445 [(set GPR:$dst, (opnode GPR:$a, GPR:$b))]>,
Evan Chengbdd679a2009-06-26 00:19:44 +0000446 Requires<[IsARM, CarryDefIsUnused]> {
447 let isCommutable = Commutable;
Evan Cheng83a32b42009-07-07 23:40:25 +0000448 let Inst{25} = 0;
Evan Chengbdd679a2009-06-26 00:19:44 +0000449 }
Evan Cheng9b4d26f2009-06-25 23:34:10 +0000450 def rs : AsI1<opcod, (outs GPR:$dst), (ins GPR:$a, so_reg:$b),
451 DPSoRegFrm, opc, " $dst, $a, $b",
452 [(set GPR:$dst, (opnode GPR:$a, so_reg:$b))]>,
Evan Cheng83a32b42009-07-07 23:40:25 +0000453 Requires<[IsARM, CarryDefIsUnused]> {
454 let Inst{25} = 0;
455 }
Evan Cheng9b4d26f2009-06-25 23:34:10 +0000456 // Carry setting variants
457 def Sri : AXI1<opcod, (outs GPR:$dst), (ins GPR:$a, so_imm:$b),
Evan Chengd4e2f052009-06-25 20:59:23 +0000458 DPFrm, !strconcat(opc, "s $dst, $a, $b"),
Evan Cheng9b4d26f2009-06-25 23:34:10 +0000459 [(set GPR:$dst, (opnode GPR:$a, so_imm:$b))]>,
460 Requires<[IsARM, CarryDefIsUsed]> {
Evan Cheng83a32b42009-07-07 23:40:25 +0000461 let Defs = [CPSR];
462 let Inst{25} = 1;
Evan Chengbdd679a2009-06-26 00:19:44 +0000463 }
Evan Cheng9b4d26f2009-06-25 23:34:10 +0000464 def Srr : AXI1<opcod, (outs GPR:$dst), (ins GPR:$a, GPR:$b),
Evan Chengd4e2f052009-06-25 20:59:23 +0000465 DPFrm, !strconcat(opc, "s $dst, $a, $b"),
Evan Cheng9b4d26f2009-06-25 23:34:10 +0000466 [(set GPR:$dst, (opnode GPR:$a, GPR:$b))]>,
467 Requires<[IsARM, CarryDefIsUsed]> {
Evan Cheng83a32b42009-07-07 23:40:25 +0000468 let Defs = [CPSR];
469 let Inst{25} = 0;
Evan Chengbdd679a2009-06-26 00:19:44 +0000470 }
Evan Cheng9b4d26f2009-06-25 23:34:10 +0000471 def Srs : AXI1<opcod, (outs GPR:$dst), (ins GPR:$a, so_reg:$b),
Evan Chengd4e2f052009-06-25 20:59:23 +0000472 DPSoRegFrm, !strconcat(opc, "s $dst, $a, $b"),
Evan Cheng9b4d26f2009-06-25 23:34:10 +0000473 [(set GPR:$dst, (opnode GPR:$a, so_reg:$b))]>,
474 Requires<[IsARM, CarryDefIsUsed]> {
Evan Cheng83a32b42009-07-07 23:40:25 +0000475 let Defs = [CPSR];
476 let Inst{25} = 0;
Evan Chengbdd679a2009-06-26 00:19:44 +0000477 }
Evan Cheng6e4d1d92007-09-11 19:55:27 +0000478}
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000479}
480
481//===----------------------------------------------------------------------===//
482// Instructions
483//===----------------------------------------------------------------------===//
484
485//===----------------------------------------------------------------------===//
486// Miscellaneous Instructions.
487//
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000488
489/// CONSTPOOL_ENTRY - This instruction represents a floating constant pool in
490/// the function. The first operand is the ID# for this instruction, the second
491/// is the index into the MachineConstantPool that this is, the third is the
492/// size in bytes of this constant pool entry.
Evan Chengd97d7142009-06-12 20:46:18 +0000493let neverHasSideEffects = 1, isNotDuplicable = 1 in
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000494def CONSTPOOL_ENTRY :
Evan Chengb783fa32007-07-19 01:14:50 +0000495PseudoInst<(outs), (ins cpinst_operand:$instid, cpinst_operand:$cpidx,
Evan Chengf8e8b622008-11-06 17:48:05 +0000496 i32imm:$size),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000497 "${instid:label} ${cpidx:cpentry}", []>;
498
Evan Cheng6e4d1d92007-09-11 19:55:27 +0000499let Defs = [SP], Uses = [SP] in {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000500def ADJCALLSTACKUP :
Bill Wendling22f8deb2007-11-13 00:44:25 +0000501PseudoInst<(outs), (ins i32imm:$amt1, i32imm:$amt2, pred:$p),
502 "@ ADJCALLSTACKUP $amt1",
Chris Lattnerfe5d4022008-10-11 22:08:30 +0000503 [(ARMcallseq_end timm:$amt1, timm:$amt2)]>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000504
505def ADJCALLSTACKDOWN :
Evan Chengb783fa32007-07-19 01:14:50 +0000506PseudoInst<(outs), (ins i32imm:$amt, pred:$p),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000507 "@ ADJCALLSTACKDOWN $amt",
Chris Lattnerfe5d4022008-10-11 22:08:30 +0000508 [(ARMcallseq_start timm:$amt)]>;
Evan Cheng6e4d1d92007-09-11 19:55:27 +0000509}
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000510
511def DWARF_LOC :
Evan Chengb783fa32007-07-19 01:14:50 +0000512PseudoInst<(outs), (ins i32imm:$line, i32imm:$col, i32imm:$file),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000513 ".loc $file, $line, $col",
514 [(dwarf_loc (i32 imm:$line), (i32 imm:$col), (i32 imm:$file))]>;
515
Evan Chengf8e8b622008-11-06 17:48:05 +0000516
517// Address computation and loads and stores in PIC mode.
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000518let isNotDuplicable = 1 in {
Evan Cheng0d28b382008-10-31 19:11:09 +0000519def PICADD : AXI1<0b0100, (outs GPR:$dst), (ins GPR:$a, pclabel:$cp, pred:$p),
Evan Chenga7b3e7c2007-08-07 01:37:15 +0000520 Pseudo, "$cp:\n\tadd$p $dst, pc, $a",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000521 [(set GPR:$dst, (ARMpic_add GPR:$a, imm:$cp))]>;
522
Evan Cheng8610a3b2008-01-07 23:56:57 +0000523let AddedComplexity = 10 in {
Dan Gohman5574cc72008-12-03 18:15:48 +0000524let canFoldAsLoad = 1 in
Evan Chengbe998242008-11-06 08:47:38 +0000525def PICLDR : AXI2ldw<(outs GPR:$dst), (ins addrmodepc:$addr, pred:$p),
Evan Chenga7b3e7c2007-08-07 01:37:15 +0000526 Pseudo, "${addr:label}:\n\tldr$p $dst, $addr",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000527 [(set GPR:$dst, (load addrmodepc:$addr))]>;
528
Evan Chengbe998242008-11-06 08:47:38 +0000529def PICLDRH : AXI3ldh<(outs GPR:$dst), (ins addrmodepc:$addr, pred:$p),
Evan Chenga7b3e7c2007-08-07 01:37:15 +0000530 Pseudo, "${addr:label}:\n\tldr${p}h $dst, $addr",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000531 [(set GPR:$dst, (zextloadi16 addrmodepc:$addr))]>;
532
Evan Chengbe998242008-11-06 08:47:38 +0000533def PICLDRB : AXI2ldb<(outs GPR:$dst), (ins addrmodepc:$addr, pred:$p),
Evan Chenga7b3e7c2007-08-07 01:37:15 +0000534 Pseudo, "${addr:label}:\n\tldr${p}b $dst, $addr",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000535 [(set GPR:$dst, (zextloadi8 addrmodepc:$addr))]>;
536
Evan Chengbe998242008-11-06 08:47:38 +0000537def PICLDRSH : AXI3ldsh<(outs GPR:$dst), (ins addrmodepc:$addr, pred:$p),
Evan Chenga7b3e7c2007-08-07 01:37:15 +0000538 Pseudo, "${addr:label}:\n\tldr${p}sh $dst, $addr",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000539 [(set GPR:$dst, (sextloadi16 addrmodepc:$addr))]>;
540
Evan Chengbe998242008-11-06 08:47:38 +0000541def PICLDRSB : AXI3ldsb<(outs GPR:$dst), (ins addrmodepc:$addr, pred:$p),
Evan Chenga7b3e7c2007-08-07 01:37:15 +0000542 Pseudo, "${addr:label}:\n\tldr${p}sb $dst, $addr",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000543 [(set GPR:$dst, (sextloadi8 addrmodepc:$addr))]>;
544}
Chris Lattnerf823faf2008-01-06 05:55:01 +0000545let AddedComplexity = 10 in {
Evan Chengbe998242008-11-06 08:47:38 +0000546def PICSTR : AXI2stw<(outs), (ins GPR:$src, addrmodepc:$addr, pred:$p),
Evan Chenga7b3e7c2007-08-07 01:37:15 +0000547 Pseudo, "${addr:label}:\n\tstr$p $src, $addr",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000548 [(store GPR:$src, addrmodepc:$addr)]>;
549
Evan Chengbe998242008-11-06 08:47:38 +0000550def PICSTRH : AXI3sth<(outs), (ins GPR:$src, addrmodepc:$addr, pred:$p),
Evan Chenga7b3e7c2007-08-07 01:37:15 +0000551 Pseudo, "${addr:label}:\n\tstr${p}h $src, $addr",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000552 [(truncstorei16 GPR:$src, addrmodepc:$addr)]>;
553
Evan Chengbe998242008-11-06 08:47:38 +0000554def PICSTRB : AXI2stb<(outs), (ins GPR:$src, addrmodepc:$addr, pred:$p),
Evan Chenga7b3e7c2007-08-07 01:37:15 +0000555 Pseudo, "${addr:label}:\n\tstr${p}b $src, $addr",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000556 [(truncstorei8 GPR:$src, addrmodepc:$addr)]>;
557}
Evan Chengf8e8b622008-11-06 17:48:05 +0000558} // isNotDuplicable = 1
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000559
Evan Chenga1366cd2009-06-23 05:25:29 +0000560
561// LEApcrel - Load a pc-relative address into a register without offending the
562// assembler.
563def LEApcrel : AXI1<0x0, (outs GPR:$dst), (ins i32imm:$label, pred:$p), Pseudo,
Evan Cheng9cf1e3e2009-07-22 22:03:29 +0000564 !strconcat(!strconcat(".set ${:private}PCRELV${:uid}, ($label-(",
565 "${:private}PCRELL${:uid}+8))\n"),
566 !strconcat("${:private}PCRELL${:uid}:\n\t",
567 "add$p $dst, pc, #${:private}PCRELV${:uid}")),
Evan Chenga1366cd2009-06-23 05:25:29 +0000568 []>;
569
Evan Chengba83d7c2009-06-24 23:14:45 +0000570def LEApcrelJT : AXI1<0x0, (outs GPR:$dst),
571 (ins i32imm:$label, i32imm:$id, pred:$p),
Evan Chenga1366cd2009-06-23 05:25:29 +0000572 Pseudo,
Evan Cheng9cf1e3e2009-07-22 22:03:29 +0000573 !strconcat(!strconcat(".set ${:private}PCRELV${:uid}, "
574 "(${label}_${id:no_hash}-(",
575 "${:private}PCRELL${:uid}+8))\n"),
576 !strconcat("${:private}PCRELL${:uid}:\n\t",
577 "add$p $dst, pc, #${:private}PCRELV${:uid}")),
Evan Cheng83a32b42009-07-07 23:40:25 +0000578 []> {
579 let Inst{25} = 1;
580}
Evan Chenga1366cd2009-06-23 05:25:29 +0000581
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000582//===----------------------------------------------------------------------===//
583// Control Flow Instructions.
584//
585
586let isReturn = 1, isTerminator = 1 in
Evan Chengf8e8b622008-11-06 17:48:05 +0000587 def BX_RET : AI<(outs), (ins), BrMiscFrm, "bx", " lr", [(ARMretflag)]> {
Jim Grosbach88c246f2008-10-14 20:36:24 +0000588 let Inst{7-4} = 0b0001;
589 let Inst{19-8} = 0b111111111111;
590 let Inst{27-20} = 0b00010010;
Evan Cheng469bc762008-09-17 07:53:38 +0000591}
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000592
593// FIXME: remove when we have a way to marking a MI with these properties.
Evan Chengb783fa32007-07-19 01:14:50 +0000594// FIXME: $dst1 should be a def. But the extra ops must be in the end of the
595// operand list.
Evan Chengf8e8b622008-11-06 17:48:05 +0000596// FIXME: Should pc be an implicit operand like PICADD, etc?
Evan Cheng7bd57f82009-07-09 22:57:41 +0000597let isReturn = 1, isTerminator = 1, mayLoad = 1 in
Evan Chengf8e8b622008-11-06 17:48:05 +0000598 def LDM_RET : AXI4ld<(outs),
Evan Chengb783fa32007-07-19 01:14:50 +0000599 (ins addrmode4:$addr, pred:$p, reglist:$dst1, variable_ops),
Evan Cheng11838a82008-11-12 07:18:38 +0000600 LdStMulFrm, "ldm${p}${addr:submode} $addr, $dst1",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000601 []>;
602
Bob Wilson243b37c2009-06-22 21:01:46 +0000603// On non-Darwin platforms R9 is callee-saved.
Evan Cheng88e78d22009-06-19 01:51:50 +0000604let isCall = 1, Itinerary = IIC_Br,
Evan Cheng27396a62009-07-22 06:46:53 +0000605 Defs = [R0, R1, R2, R3, R12, LR,
606 D0, D1, D2, D3, D4, D5, D6, D7,
607 D16, D17, D18, D19, D20, D21, D22, D23,
608 D24, D25, D26, D27, D28, D29, D31, D31, CPSR] in {
Evan Chengf8e8b622008-11-06 17:48:05 +0000609 def BL : ABXI<0b1011, (outs), (ins i32imm:$func, variable_ops),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000610 "bl ${func:call}",
Bob Wilson243b37c2009-06-22 21:01:46 +0000611 [(ARMcall tglobaladdr:$func)]>, Requires<[IsNotDarwin]>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000612
Evan Chengf8e8b622008-11-06 17:48:05 +0000613 def BL_pred : ABI<0b1011, (outs), (ins i32imm:$func, variable_ops),
Evan Cheng10a9eb82008-09-01 08:25:56 +0000614 "bl", " ${func:call}",
Bob Wilson243b37c2009-06-22 21:01:46 +0000615 [(ARMcall_pred tglobaladdr:$func)]>, Requires<[IsNotDarwin]>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000616
617 // ARMv5T and above
Evan Chengf8e8b622008-11-06 17:48:05 +0000618 def BLX : AXI<(outs), (ins GPR:$func, variable_ops), BrMiscFrm,
Evan Chengb783fa32007-07-19 01:14:50 +0000619 "blx $func",
Bob Wilson243b37c2009-06-22 21:01:46 +0000620 [(ARMcall GPR:$func)]>, Requires<[IsARM, HasV5T, IsNotDarwin]> {
Jim Grosbach88c246f2008-10-14 20:36:24 +0000621 let Inst{7-4} = 0b0011;
622 let Inst{19-8} = 0b111111111111;
623 let Inst{27-20} = 0b00010010;
Evan Cheng469bc762008-09-17 07:53:38 +0000624 }
625
Evan Chengfb1d1472009-07-14 01:49:27 +0000626 // ARMv4T
627 def BX : ABXIx2<(outs), (ins GPR:$func, variable_ops),
628 "mov lr, pc\n\tbx $func",
629 [(ARMcall_nolink GPR:$func)]>, Requires<[IsNotDarwin]> {
630 let Inst{7-4} = 0b0001;
631 let Inst{19-8} = 0b111111111111;
632 let Inst{27-20} = 0b00010010;
Bob Wilson243b37c2009-06-22 21:01:46 +0000633 }
634}
635
636// On Darwin R9 is call-clobbered.
637let isCall = 1, Itinerary = IIC_Br,
Evan Cheng27396a62009-07-22 06:46:53 +0000638 Defs = [R0, R1, R2, R3, R9, R12, LR,
639 D0, D1, D2, D3, D4, D5, D6, D7,
640 D16, D17, D18, D19, D20, D21, D22, D23,
641 D24, D25, D26, D27, D28, D29, D31, D31, CPSR] in {
Bob Wilson243b37c2009-06-22 21:01:46 +0000642 def BLr9 : ABXI<0b1011, (outs), (ins i32imm:$func, variable_ops),
643 "bl ${func:call}",
644 [(ARMcall tglobaladdr:$func)]>, Requires<[IsDarwin]>;
645
646 def BLr9_pred : ABI<0b1011, (outs), (ins i32imm:$func, variable_ops),
647 "bl", " ${func:call}",
648 [(ARMcall_pred tglobaladdr:$func)]>, Requires<[IsDarwin]>;
649
650 // ARMv5T and above
651 def BLXr9 : AXI<(outs), (ins GPR:$func, variable_ops), BrMiscFrm,
652 "blx $func",
653 [(ARMcall GPR:$func)]>, Requires<[IsARM, HasV5T, IsDarwin]> {
654 let Inst{7-4} = 0b0011;
655 let Inst{19-8} = 0b111111111111;
656 let Inst{27-20} = 0b00010010;
657 }
658
Evan Chengfb1d1472009-07-14 01:49:27 +0000659 // ARMv4T
660 def BXr9 : ABXIx2<(outs), (ins GPR:$func, variable_ops),
661 "mov lr, pc\n\tbx $func",
662 [(ARMcall_nolink GPR:$func)]>, Requires<[IsARM, IsDarwin]> {
663 let Inst{7-4} = 0b0001;
664 let Inst{19-8} = 0b111111111111;
665 let Inst{27-20} = 0b00010010;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000666 }
667}
668
Evan Cheng88e78d22009-06-19 01:51:50 +0000669let isBranch = 1, isTerminator = 1, Itinerary = IIC_Br in {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000670 // B is "predicable" since it can be xformed into a Bcc.
671 let isBarrier = 1 in {
672 let isPredicable = 1 in
Evan Chengf8e8b622008-11-06 17:48:05 +0000673 def B : ABXI<0b1010, (outs), (ins brtarget:$target), "b $target",
Evan Chengb783fa32007-07-19 01:14:50 +0000674 [(br bb:$target)]>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000675
Owen Andersonf8053082007-11-12 07:39:39 +0000676 let isNotDuplicable = 1, isIndirectBranch = 1 in {
Evan Cheng0f63ae12008-11-07 09:06:08 +0000677 def BR_JTr : JTI<(outs), (ins GPR:$target, jtblock_operand:$jt, i32imm:$id),
Evan Chengb783fa32007-07-19 01:14:50 +0000678 "mov pc, $target \n$jt",
Evan Cheng0f63ae12008-11-07 09:06:08 +0000679 [(ARMbrjt GPR:$target, tjumptable:$jt, imm:$id)]> {
680 let Inst{20} = 0; // S Bit
681 let Inst{24-21} = 0b1101;
Evan Chenge5f32ae2009-07-07 23:45:10 +0000682 let Inst{27-25} = 0b000;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000683 }
Evan Cheng0f63ae12008-11-07 09:06:08 +0000684 def BR_JTm : JTI<(outs),
685 (ins addrmode2:$target, jtblock_operand:$jt, i32imm:$id),
686 "ldr pc, $target \n$jt",
687 [(ARMbrjt (i32 (load addrmode2:$target)), tjumptable:$jt,
688 imm:$id)]> {
689 let Inst{20} = 1; // L bit
690 let Inst{21} = 0; // W bit
691 let Inst{22} = 0; // B bit
692 let Inst{24} = 1; // P bit
Evan Chenge5f32ae2009-07-07 23:45:10 +0000693 let Inst{27-25} = 0b011;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000694 }
Evan Cheng0f63ae12008-11-07 09:06:08 +0000695 def BR_JTadd : JTI<(outs),
696 (ins GPR:$target, GPR:$idx, jtblock_operand:$jt, i32imm:$id),
697 "add pc, $target, $idx \n$jt",
698 [(ARMbrjt (add GPR:$target, GPR:$idx), tjumptable:$jt,
699 imm:$id)]> {
700 let Inst{20} = 0; // S bit
701 let Inst{24-21} = 0b0100;
Evan Chenge5f32ae2009-07-07 23:45:10 +0000702 let Inst{27-25} = 0b000;
Evan Cheng0f63ae12008-11-07 09:06:08 +0000703 }
704 } // isNotDuplicable = 1, isIndirectBranch = 1
705 } // isBarrier = 1
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000706
707 // FIXME: should be able to write a pattern for ARMBrcond, but can't use
708 // a two-value operand where a dag node expects two operands. :(
Evan Chengf8e8b622008-11-06 17:48:05 +0000709 def Bcc : ABI<0b1010, (outs), (ins brtarget:$target),
Evan Chenga7b3e7c2007-08-07 01:37:15 +0000710 "b", " $target",
711 [/*(ARMbrcond bb:$target, imm:$cc, CCR:$ccr)*/]>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000712}
713
714//===----------------------------------------------------------------------===//
715// Load / store Instructions.
716//
717
718// Load
Dan Gohman5574cc72008-12-03 18:15:48 +0000719let canFoldAsLoad = 1 in
Evan Cheng81794bb2008-11-13 07:34:59 +0000720def LDR : AI2ldw<(outs GPR:$dst), (ins addrmode2:$addr), LdFrm,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000721 "ldr", " $dst, $addr",
722 [(set GPR:$dst, (load addrmode2:$addr))]>;
723
724// Special LDR for loads from non-pc-relative constpools.
Dan Gohman5574cc72008-12-03 18:15:48 +0000725let canFoldAsLoad = 1, mayLoad = 1, isReMaterializable = 1 in
Evan Cheng81794bb2008-11-13 07:34:59 +0000726def LDRcp : AI2ldw<(outs GPR:$dst), (ins addrmode2:$addr), LdFrm,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000727 "ldr", " $dst, $addr", []>;
728
729// Loads with zero extension
Evan Cheng81794bb2008-11-13 07:34:59 +0000730def LDRH : AI3ldh<(outs GPR:$dst), (ins addrmode3:$addr), LdMiscFrm,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000731 "ldr", "h $dst, $addr",
732 [(set GPR:$dst, (zextloadi16 addrmode3:$addr))]>;
733
Evan Cheng81794bb2008-11-13 07:34:59 +0000734def LDRB : AI2ldb<(outs GPR:$dst), (ins addrmode2:$addr), LdFrm,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000735 "ldr", "b $dst, $addr",
736 [(set GPR:$dst, (zextloadi8 addrmode2:$addr))]>;
737
738// Loads with sign extension
Evan Cheng81794bb2008-11-13 07:34:59 +0000739def LDRSH : AI3ldsh<(outs GPR:$dst), (ins addrmode3:$addr), LdMiscFrm,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000740 "ldr", "sh $dst, $addr",
741 [(set GPR:$dst, (sextloadi16 addrmode3:$addr))]>;
742
Evan Cheng81794bb2008-11-13 07:34:59 +0000743def LDRSB : AI3ldsb<(outs GPR:$dst), (ins addrmode3:$addr), LdMiscFrm,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000744 "ldr", "sb $dst, $addr",
745 [(set GPR:$dst, (sextloadi8 addrmode3:$addr))]>;
746
Chris Lattnerca4e0fe2008-01-10 05:12:37 +0000747let mayLoad = 1 in {
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000748// Load doubleword
Evan Cheng41169552009-06-15 08:28:29 +0000749def LDRD : AI3ldd<(outs GPR:$dst1, GPR:$dst2), (ins addrmode3:$addr), LdMiscFrm,
750 "ldr", "d $dst1, $addr", []>, Requires<[IsARM, HasV5T]>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000751
752// Indexed loads
Evan Chengbe998242008-11-06 08:47:38 +0000753def LDR_PRE : AI2ldwpr<(outs GPR:$dst, GPR:$base_wb),
Evan Cheng81794bb2008-11-13 07:34:59 +0000754 (ins addrmode2:$addr), LdFrm,
Evan Chenga7b3e7c2007-08-07 01:37:15 +0000755 "ldr", " $dst, $addr!", "$addr.base = $base_wb", []>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000756
Evan Chengbe998242008-11-06 08:47:38 +0000757def LDR_POST : AI2ldwpo<(outs GPR:$dst, GPR:$base_wb),
Evan Cheng81794bb2008-11-13 07:34:59 +0000758 (ins GPR:$base, am2offset:$offset), LdFrm,
Evan Chenga7b3e7c2007-08-07 01:37:15 +0000759 "ldr", " $dst, [$base], $offset", "$base = $base_wb", []>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000760
Evan Chengbe998242008-11-06 08:47:38 +0000761def LDRH_PRE : AI3ldhpr<(outs GPR:$dst, GPR:$base_wb),
Evan Cheng81794bb2008-11-13 07:34:59 +0000762 (ins addrmode3:$addr), LdMiscFrm,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000763 "ldr", "h $dst, $addr!", "$addr.base = $base_wb", []>;
764
Evan Chengbe998242008-11-06 08:47:38 +0000765def LDRH_POST : AI3ldhpo<(outs GPR:$dst, GPR:$base_wb),
Evan Cheng81794bb2008-11-13 07:34:59 +0000766 (ins GPR:$base,am3offset:$offset), LdMiscFrm,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000767 "ldr", "h $dst, [$base], $offset", "$base = $base_wb", []>;
768
Evan Chengbe998242008-11-06 08:47:38 +0000769def LDRB_PRE : AI2ldbpr<(outs GPR:$dst, GPR:$base_wb),
Evan Cheng81794bb2008-11-13 07:34:59 +0000770 (ins addrmode2:$addr), LdFrm,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000771 "ldr", "b $dst, $addr!", "$addr.base = $base_wb", []>;
772
Evan Chengbe998242008-11-06 08:47:38 +0000773def LDRB_POST : AI2ldbpo<(outs GPR:$dst, GPR:$base_wb),
Evan Cheng81794bb2008-11-13 07:34:59 +0000774 (ins GPR:$base,am2offset:$offset), LdFrm,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000775 "ldr", "b $dst, [$base], $offset", "$base = $base_wb", []>;
776
Evan Chengbe998242008-11-06 08:47:38 +0000777def LDRSH_PRE : AI3ldshpr<(outs GPR:$dst, GPR:$base_wb),
Evan Cheng81794bb2008-11-13 07:34:59 +0000778 (ins addrmode3:$addr), LdMiscFrm,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000779 "ldr", "sh $dst, $addr!", "$addr.base = $base_wb", []>;
780
Evan Chengbe998242008-11-06 08:47:38 +0000781def LDRSH_POST: AI3ldshpo<(outs GPR:$dst, GPR:$base_wb),
Evan Cheng81794bb2008-11-13 07:34:59 +0000782 (ins GPR:$base,am3offset:$offset), LdMiscFrm,
783 "ldr", "sh $dst, [$base], $offset", "$base = $base_wb", []>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000784
Evan Chengbe998242008-11-06 08:47:38 +0000785def LDRSB_PRE : AI3ldsbpr<(outs GPR:$dst, GPR:$base_wb),
Evan Cheng81794bb2008-11-13 07:34:59 +0000786 (ins addrmode3:$addr), LdMiscFrm,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000787 "ldr", "sb $dst, $addr!", "$addr.base = $base_wb", []>;
788
Evan Chengbe998242008-11-06 08:47:38 +0000789def LDRSB_POST: AI3ldsbpo<(outs GPR:$dst, GPR:$base_wb),
Evan Cheng81794bb2008-11-13 07:34:59 +0000790 (ins GPR:$base,am3offset:$offset), LdMiscFrm,
Evan Chengb04191f2009-07-02 01:30:04 +0000791 "ldr", "sb $dst, [$base], $offset", "$base = $base_wb", []>;
Chris Lattnerca4e0fe2008-01-10 05:12:37 +0000792}
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000793
794// Store
Evan Cheng81794bb2008-11-13 07:34:59 +0000795def STR : AI2stw<(outs), (ins GPR:$src, addrmode2:$addr), StFrm,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000796 "str", " $src, $addr",
797 [(store GPR:$src, addrmode2:$addr)]>;
798
799// Stores with truncate
Evan Cheng81794bb2008-11-13 07:34:59 +0000800def STRH : AI3sth<(outs), (ins GPR:$src, addrmode3:$addr), StMiscFrm,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000801 "str", "h $src, $addr",
802 [(truncstorei16 GPR:$src, addrmode3:$addr)]>;
803
Evan Cheng81794bb2008-11-13 07:34:59 +0000804def STRB : AI2stb<(outs), (ins GPR:$src, addrmode2:$addr), StFrm,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000805 "str", "b $src, $addr",
806 [(truncstorei8 GPR:$src, addrmode2:$addr)]>;
807
808// Store doubleword
Chris Lattner6887b142008-01-06 08:36:04 +0000809let mayStore = 1 in
Evan Cheng41169552009-06-15 08:28:29 +0000810def STRD : AI3std<(outs), (ins GPR:$src1, GPR:$src2, addrmode3:$addr),StMiscFrm,
811 "str", "d $src1, $addr", []>, Requires<[IsARM, HasV5T]>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000812
813// Indexed stores
Evan Chengbe998242008-11-06 08:47:38 +0000814def STR_PRE : AI2stwpr<(outs GPR:$base_wb),
Evan Cheng81794bb2008-11-13 07:34:59 +0000815 (ins GPR:$src, GPR:$base, am2offset:$offset), StFrm,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000816 "str", " $src, [$base, $offset]!", "$base = $base_wb",
817 [(set GPR:$base_wb,
818 (pre_store GPR:$src, GPR:$base, am2offset:$offset))]>;
819
Evan Chengbe998242008-11-06 08:47:38 +0000820def STR_POST : AI2stwpo<(outs GPR:$base_wb),
Evan Cheng81794bb2008-11-13 07:34:59 +0000821 (ins GPR:$src, GPR:$base,am2offset:$offset), StFrm,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000822 "str", " $src, [$base], $offset", "$base = $base_wb",
823 [(set GPR:$base_wb,
824 (post_store GPR:$src, GPR:$base, am2offset:$offset))]>;
825
Evan Chengbe998242008-11-06 08:47:38 +0000826def STRH_PRE : AI3sthpr<(outs GPR:$base_wb),
Evan Cheng81794bb2008-11-13 07:34:59 +0000827 (ins GPR:$src, GPR:$base,am3offset:$offset), StMiscFrm,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000828 "str", "h $src, [$base, $offset]!", "$base = $base_wb",
829 [(set GPR:$base_wb,
830 (pre_truncsti16 GPR:$src, GPR:$base,am3offset:$offset))]>;
831
Evan Chengbe998242008-11-06 08:47:38 +0000832def STRH_POST: AI3sthpo<(outs GPR:$base_wb),
Evan Cheng81794bb2008-11-13 07:34:59 +0000833 (ins GPR:$src, GPR:$base,am3offset:$offset), StMiscFrm,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000834 "str", "h $src, [$base], $offset", "$base = $base_wb",
835 [(set GPR:$base_wb, (post_truncsti16 GPR:$src,
836 GPR:$base, am3offset:$offset))]>;
837
Evan Chengbe998242008-11-06 08:47:38 +0000838def STRB_PRE : AI2stbpr<(outs GPR:$base_wb),
Evan Cheng81794bb2008-11-13 07:34:59 +0000839 (ins GPR:$src, GPR:$base,am2offset:$offset), StFrm,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000840 "str", "b $src, [$base, $offset]!", "$base = $base_wb",
841 [(set GPR:$base_wb, (pre_truncsti8 GPR:$src,
842 GPR:$base, am2offset:$offset))]>;
843
Evan Chengbe998242008-11-06 08:47:38 +0000844def STRB_POST: AI2stbpo<(outs GPR:$base_wb),
Evan Cheng81794bb2008-11-13 07:34:59 +0000845 (ins GPR:$src, GPR:$base,am2offset:$offset), StFrm,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000846 "str", "b $src, [$base], $offset", "$base = $base_wb",
847 [(set GPR:$base_wb, (post_truncsti8 GPR:$src,
848 GPR:$base, am2offset:$offset))]>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000849
850//===----------------------------------------------------------------------===//
851// Load / store multiple Instructions.
852//
853
Evan Chengb783fa32007-07-19 01:14:50 +0000854// FIXME: $dst1 should be a def.
Chris Lattnerca4e0fe2008-01-10 05:12:37 +0000855let mayLoad = 1 in
Evan Chengbe998242008-11-06 08:47:38 +0000856def LDM : AXI4ld<(outs),
Evan Chengb783fa32007-07-19 01:14:50 +0000857 (ins addrmode4:$addr, pred:$p, reglist:$dst1, variable_ops),
Evan Cheng11838a82008-11-12 07:18:38 +0000858 LdStMulFrm, "ldm${p}${addr:submode} $addr, $dst1",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000859 []>;
860
Chris Lattner6887b142008-01-06 08:36:04 +0000861let mayStore = 1 in
Evan Chengbe998242008-11-06 08:47:38 +0000862def STM : AXI4st<(outs),
Evan Chengb783fa32007-07-19 01:14:50 +0000863 (ins addrmode4:$addr, pred:$p, reglist:$src1, variable_ops),
Evan Cheng11838a82008-11-12 07:18:38 +0000864 LdStMulFrm, "stm${p}${addr:submode} $addr, $src1",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000865 []>;
866
867//===----------------------------------------------------------------------===//
868// Move Instructions.
869//
870
Evan Chengd97d7142009-06-12 20:46:18 +0000871let neverHasSideEffects = 1 in
Evan Cheng86a926a2008-11-05 18:35:52 +0000872def MOVr : AsI1<0b1101, (outs GPR:$dst), (ins GPR:$src), DPFrm,
873 "mov", " $dst, $src", []>, UnaryDP;
874def MOVs : AsI1<0b1101, (outs GPR:$dst), (ins so_reg:$src), DPSoRegFrm,
875 "mov", " $dst, $src", [(set GPR:$dst, so_reg:$src)]>, UnaryDP;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000876
Evan Chengbd0ca9c2009-02-05 08:42:55 +0000877let isReMaterializable = 1, isAsCheapAsAMove = 1 in
Evan Cheng86a926a2008-11-05 18:35:52 +0000878def MOVi : AsI1<0b1101, (outs GPR:$dst), (ins so_imm:$src), DPFrm,
879 "mov", " $dst, $src", [(set GPR:$dst, so_imm:$src)]>, UnaryDP;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000880
Evan Cheng7f240d22008-11-14 20:09:11 +0000881def MOVrx : AsI1<0b1101, (outs GPR:$dst), (ins GPR:$src), Pseudo,
Evan Chengb783fa32007-07-19 01:14:50 +0000882 "mov", " $dst, $src, rrx",
Evan Cheng86a926a2008-11-05 18:35:52 +0000883 [(set GPR:$dst, (ARMrrx GPR:$src))]>, UnaryDP;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000884
885// These aren't really mov instructions, but we have to define them this way
886// due to flag operands.
887
Evan Cheng6e4d1d92007-09-11 19:55:27 +0000888let Defs = [CPSR] in {
Evan Cheng7f240d22008-11-14 20:09:11 +0000889def MOVsrl_flag : AI1<0b1101, (outs GPR:$dst), (ins GPR:$src), Pseudo,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000890 "mov", "s $dst, $src, lsr #1",
Evan Cheng86a926a2008-11-05 18:35:52 +0000891 [(set GPR:$dst, (ARMsrl_flag GPR:$src))]>, UnaryDP;
Evan Cheng7f240d22008-11-14 20:09:11 +0000892def MOVsra_flag : AI1<0b1101, (outs GPR:$dst), (ins GPR:$src), Pseudo,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000893 "mov", "s $dst, $src, asr #1",
Evan Cheng86a926a2008-11-05 18:35:52 +0000894 [(set GPR:$dst, (ARMsra_flag GPR:$src))]>, UnaryDP;
Evan Cheng6e4d1d92007-09-11 19:55:27 +0000895}
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000896
897//===----------------------------------------------------------------------===//
898// Extend Instructions.
899//
900
901// Sign extenders
902
Evan Cheng37afa432008-11-06 22:15:19 +0000903defm SXTB : AI_unary_rrot<0b01101010,
904 "sxtb", UnOpFrag<(sext_inreg node:$Src, i8)>>;
905defm SXTH : AI_unary_rrot<0b01101011,
906 "sxth", UnOpFrag<(sext_inreg node:$Src, i16)>>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000907
Evan Cheng37afa432008-11-06 22:15:19 +0000908defm SXTAB : AI_bin_rrot<0b01101010,
909 "sxtab", BinOpFrag<(add node:$LHS, (sext_inreg node:$RHS, i8))>>;
910defm SXTAH : AI_bin_rrot<0b01101011,
911 "sxtah", BinOpFrag<(add node:$LHS, (sext_inreg node:$RHS,i16))>>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000912
913// TODO: SXT(A){B|H}16
914
915// Zero extenders
916
917let AddedComplexity = 16 in {
Evan Cheng37afa432008-11-06 22:15:19 +0000918defm UXTB : AI_unary_rrot<0b01101110,
919 "uxtb" , UnOpFrag<(and node:$Src, 0x000000FF)>>;
920defm UXTH : AI_unary_rrot<0b01101111,
921 "uxth" , UnOpFrag<(and node:$Src, 0x0000FFFF)>>;
922defm UXTB16 : AI_unary_rrot<0b01101100,
923 "uxtb16", UnOpFrag<(and node:$Src, 0x00FF00FF)>>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000924
Bob Wilson74590a02009-06-22 22:08:29 +0000925def : ARMV6Pat<(and (shl GPR:$Src, (i32 8)), 0xFF00FF),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000926 (UXTB16r_rot GPR:$Src, 24)>;
Bob Wilson74590a02009-06-22 22:08:29 +0000927def : ARMV6Pat<(and (srl GPR:$Src, (i32 8)), 0xFF00FF),
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000928 (UXTB16r_rot GPR:$Src, 8)>;
929
Evan Cheng37afa432008-11-06 22:15:19 +0000930defm UXTAB : AI_bin_rrot<0b01101110, "uxtab",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000931 BinOpFrag<(add node:$LHS, (and node:$RHS, 0x00FF))>>;
Evan Cheng37afa432008-11-06 22:15:19 +0000932defm UXTAH : AI_bin_rrot<0b01101111, "uxtah",
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000933 BinOpFrag<(add node:$LHS, (and node:$RHS, 0xFFFF))>>;
934}
935
936// This isn't safe in general, the add is two 16-bit units, not a 32-bit add.
937//defm UXTAB16 : xxx<"uxtab16", 0xff00ff>;
938
939// TODO: UXT(A){B|H}16
940
941//===----------------------------------------------------------------------===//
942// Arithmetic Instructions.
943//
944
Jim Grosbach88c246f2008-10-14 20:36:24 +0000945defm ADD : AsI1_bin_irs<0b0100, "add",
Evan Chengbdd679a2009-06-26 00:19:44 +0000946 BinOpFrag<(add node:$LHS, node:$RHS)>, 1>;
Jim Grosbach88c246f2008-10-14 20:36:24 +0000947defm SUB : AsI1_bin_irs<0b0010, "sub",
Evan Cheng469bc762008-09-17 07:53:38 +0000948 BinOpFrag<(sub node:$LHS, node:$RHS)>>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000949
950// ADD and SUB with 's' bit set.
Evan Chengd4e2f052009-06-25 20:59:23 +0000951defm ADDS : AI1_bin_s_irs<0b0100, "add",
952 BinOpFrag<(addc node:$LHS, node:$RHS)>>;
953defm SUBS : AI1_bin_s_irs<0b0010, "sub",
954 BinOpFrag<(subc node:$LHS, node:$RHS)>>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000955
Evan Cheng9b4d26f2009-06-25 23:34:10 +0000956defm ADC : AI1_adde_sube_irs<0b0101, "adc",
Evan Chengbdd679a2009-06-26 00:19:44 +0000957 BinOpFrag<(adde node:$LHS, node:$RHS)>, 1>;
Evan Cheng9b4d26f2009-06-25 23:34:10 +0000958defm SBC : AI1_adde_sube_irs<0b0110, "sbc",
959 BinOpFrag<(sube node:$LHS, node:$RHS)>>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000960
961// These don't define reg/reg forms, because they are handled above.
Evan Cheng86a926a2008-11-05 18:35:52 +0000962def RSBri : AsI1<0b0011, (outs GPR:$dst), (ins GPR:$a, so_imm:$b), DPFrm,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000963 "rsb", " $dst, $a, $b",
964 [(set GPR:$dst, (sub so_imm:$b, GPR:$a))]>;
965
Evan Cheng86a926a2008-11-05 18:35:52 +0000966def RSBrs : AsI1<0b0011, (outs GPR:$dst), (ins GPR:$a, so_reg:$b), DPSoRegFrm,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000967 "rsb", " $dst, $a, $b",
968 [(set GPR:$dst, (sub so_reg:$b, GPR:$a))]>;
969
970// RSB with 's' bit set.
Evan Cheng6e4d1d92007-09-11 19:55:27 +0000971let Defs = [CPSR] in {
Evan Cheng86a926a2008-11-05 18:35:52 +0000972def RSBSri : AI1<0b0011, (outs GPR:$dst), (ins GPR:$a, so_imm:$b), DPFrm,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000973 "rsb", "s $dst, $a, $b",
Evan Cheng6e4d1d92007-09-11 19:55:27 +0000974 [(set GPR:$dst, (subc so_imm:$b, GPR:$a))]>;
Evan Cheng86a926a2008-11-05 18:35:52 +0000975def RSBSrs : AI1<0b0011, (outs GPR:$dst), (ins GPR:$a, so_reg:$b), DPSoRegFrm,
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000976 "rsb", "s $dst, $a, $b",
Evan Cheng6e4d1d92007-09-11 19:55:27 +0000977 [(set GPR:$dst, (subc so_reg:$b, GPR:$a))]>;
978}
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000979
Evan Cheng9b4d26f2009-06-25 23:34:10 +0000980let Uses = [CPSR] in {
981def RSCri : AsI1<0b0111, (outs GPR:$dst), (ins GPR:$a, so_imm:$b),
982 DPFrm, "rsc", " $dst, $a, $b",
983 [(set GPR:$dst, (sube so_imm:$b, GPR:$a))]>,
984 Requires<[IsARM, CarryDefIsUnused]>;
985def RSCrs : AsI1<0b0111, (outs GPR:$dst), (ins GPR:$a, so_reg:$b),
986 DPSoRegFrm, "rsc", " $dst, $a, $b",
987 [(set GPR:$dst, (sube so_reg:$b, GPR:$a))]>,
988 Requires<[IsARM, CarryDefIsUnused]>;
989}
990
991// FIXME: Allow these to be predicated.
Evan Chengd4e2f052009-06-25 20:59:23 +0000992let Defs = [CPSR], Uses = [CPSR] in {
993def RSCSri : AXI1<0b0111, (outs GPR:$dst), (ins GPR:$a, so_imm:$b),
994 DPFrm, "rscs $dst, $a, $b",
Evan Cheng9b4d26f2009-06-25 23:34:10 +0000995 [(set GPR:$dst, (sube so_imm:$b, GPR:$a))]>,
996 Requires<[IsARM, CarryDefIsUnused]>;
Evan Chengd4e2f052009-06-25 20:59:23 +0000997def RSCSrs : AXI1<0b0111, (outs GPR:$dst), (ins GPR:$a, so_reg:$b),
998 DPSoRegFrm, "rscs $dst, $a, $b",
Evan Cheng9b4d26f2009-06-25 23:34:10 +0000999 [(set GPR:$dst, (sube so_reg:$b, GPR:$a))]>,
1000 Requires<[IsARM, CarryDefIsUnused]>;
Evan Cheng6e4d1d92007-09-11 19:55:27 +00001001}
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001002
1003// (sub X, imm) gets canonicalized to (add X, -imm). Match this form.
1004def : ARMPat<(add GPR:$src, so_imm_neg:$imm),
1005 (SUBri GPR:$src, so_imm_neg:$imm)>;
1006
1007//def : ARMPat<(addc GPR:$src, so_imm_neg:$imm),
1008// (SUBSri GPR:$src, so_imm_neg:$imm)>;
1009//def : ARMPat<(adde GPR:$src, so_imm_neg:$imm),
1010// (SBCri GPR:$src, so_imm_neg:$imm)>;
1011
1012// Note: These are implemented in C++ code, because they have to generate
1013// ADD/SUBrs instructions, which use a complex pattern that a xform function
1014// cannot produce.
1015// (mul X, 2^n+1) -> (add (X << n), X)
1016// (mul X, 2^n-1) -> (rsb X, (X << n))
1017
1018
1019//===----------------------------------------------------------------------===//
1020// Bitwise Instructions.
1021//
1022
Jim Grosbach88c246f2008-10-14 20:36:24 +00001023defm AND : AsI1_bin_irs<0b0000, "and",
Evan Chengbdd679a2009-06-26 00:19:44 +00001024 BinOpFrag<(and node:$LHS, node:$RHS)>, 1>;
Jim Grosbach88c246f2008-10-14 20:36:24 +00001025defm ORR : AsI1_bin_irs<0b1100, "orr",
Evan Chengbdd679a2009-06-26 00:19:44 +00001026 BinOpFrag<(or node:$LHS, node:$RHS)>, 1>;
Jim Grosbach88c246f2008-10-14 20:36:24 +00001027defm EOR : AsI1_bin_irs<0b0001, "eor",
Evan Chengbdd679a2009-06-26 00:19:44 +00001028 BinOpFrag<(xor node:$LHS, node:$RHS)>, 1>;
Jim Grosbach88c246f2008-10-14 20:36:24 +00001029defm BIC : AsI1_bin_irs<0b1110, "bic",
Evan Cheng469bc762008-09-17 07:53:38 +00001030 BinOpFrag<(and node:$LHS, (not node:$RHS))>>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001031
Evan Cheng299ee652009-07-06 22:23:46 +00001032def BFC : I<(outs GPR:$dst), (ins GPR:$src, bf_inv_mask_imm:$imm),
1033 AddrMode1, Size4Bytes, IndexModeNone, DPFrm,
1034 "bfc", " $dst, $imm", "$src = $dst",
1035 [(set GPR:$dst, (and GPR:$src, bf_inv_mask_imm:$imm))]>,
1036 Requires<[IsARM, HasV6T2]> {
1037 let Inst{27-21} = 0b0111110;
1038 let Inst{6-0} = 0b0011111;
1039}
1040
Evan Cheng86a926a2008-11-05 18:35:52 +00001041def MVNr : AsI1<0b1111, (outs GPR:$dst), (ins GPR:$src), DPFrm,
1042 "mvn", " $dst, $src",
1043 [(set GPR:$dst, (not GPR:$src))]>, UnaryDP;
1044def MVNs : AsI1<0b1111, (outs GPR:$dst), (ins so_reg:$src), DPSoRegFrm,
1045 "mvn", " $dst, $src",
1046 [(set GPR:$dst, (not so_reg:$src))]>, UnaryDP;
Evan Chengbd0ca9c2009-02-05 08:42:55 +00001047let isReMaterializable = 1, isAsCheapAsAMove = 1 in
Evan Cheng86a926a2008-11-05 18:35:52 +00001048def MVNi : AsI1<0b1111, (outs GPR:$dst), (ins so_imm:$imm), DPFrm,
1049 "mvn", " $dst, $imm",
1050 [(set GPR:$dst, so_imm_not:$imm)]>,UnaryDP;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001051
1052def : ARMPat<(and GPR:$src, so_imm_not:$imm),
1053 (BICri GPR:$src, so_imm_not:$imm)>;
1054
1055//===----------------------------------------------------------------------===//
1056// Multiply Instructions.
1057//
1058
Evan Chengbdd679a2009-06-26 00:19:44 +00001059let isCommutable = 1 in
Evan Chengee80fb72008-11-06 01:21:28 +00001060def MUL : AsMul1I<0b0000000, (outs GPR:$dst), (ins GPR:$a, GPR:$b),
Evan Chengf8e8b622008-11-06 17:48:05 +00001061 "mul", " $dst, $a, $b",
1062 [(set GPR:$dst, (mul GPR:$a, GPR:$b))]>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001063
Evan Chengee80fb72008-11-06 01:21:28 +00001064def MLA : AsMul1I<0b0000001, (outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$c),
Evan Chengf8e8b622008-11-06 17:48:05 +00001065 "mla", " $dst, $a, $b, $c",
1066 [(set GPR:$dst, (add (mul GPR:$a, GPR:$b), GPR:$c))]>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001067
Evan Chengc8147e12009-07-06 22:05:45 +00001068def MLS : AMul1I <0b0000011, (outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$c),
1069 "mls", " $dst, $a, $b, $c",
1070 [(set GPR:$dst, (sub GPR:$c, (mul GPR:$a, GPR:$b)))]>,
1071 Requires<[IsARM, HasV6T2]>;
1072
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001073// Extra precision multiplies with low / high results
Evan Chengd97d7142009-06-12 20:46:18 +00001074let neverHasSideEffects = 1 in {
Evan Chengbdd679a2009-06-26 00:19:44 +00001075let isCommutable = 1 in {
Evan Chengee80fb72008-11-06 01:21:28 +00001076def SMULL : AsMul1I<0b0000110, (outs GPR:$ldst, GPR:$hdst),
1077 (ins GPR:$a, GPR:$b),
1078 "smull", " $ldst, $hdst, $a, $b", []>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001079
Evan Chengee80fb72008-11-06 01:21:28 +00001080def UMULL : AsMul1I<0b0000100, (outs GPR:$ldst, GPR:$hdst),
1081 (ins GPR:$a, GPR:$b),
1082 "umull", " $ldst, $hdst, $a, $b", []>;
Evan Chengbdd679a2009-06-26 00:19:44 +00001083}
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001084
1085// Multiply + accumulate
Evan Chengee80fb72008-11-06 01:21:28 +00001086def SMLAL : AsMul1I<0b0000111, (outs GPR:$ldst, GPR:$hdst),
1087 (ins GPR:$a, GPR:$b),
1088 "smlal", " $ldst, $hdst, $a, $b", []>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001089
Evan Chengee80fb72008-11-06 01:21:28 +00001090def UMLAL : AsMul1I<0b0000101, (outs GPR:$ldst, GPR:$hdst),
1091 (ins GPR:$a, GPR:$b),
1092 "umlal", " $ldst, $hdst, $a, $b", []>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001093
Evan Chengee80fb72008-11-06 01:21:28 +00001094def UMAAL : AMul1I <0b0000010, (outs GPR:$ldst, GPR:$hdst),
1095 (ins GPR:$a, GPR:$b),
1096 "umaal", " $ldst, $hdst, $a, $b", []>,
1097 Requires<[IsARM, HasV6]>;
Evan Chengd97d7142009-06-12 20:46:18 +00001098} // neverHasSideEffects
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001099
1100// Most significant word multiply
Evan Chengee80fb72008-11-06 01:21:28 +00001101def SMMUL : AMul2I <0b0111010, (outs GPR:$dst), (ins GPR:$a, GPR:$b),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001102 "smmul", " $dst, $a, $b",
1103 [(set GPR:$dst, (mulhs GPR:$a, GPR:$b))]>,
Evan Chengee80fb72008-11-06 01:21:28 +00001104 Requires<[IsARM, HasV6]> {
1105 let Inst{7-4} = 0b0001;
1106 let Inst{15-12} = 0b1111;
1107}
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001108
Evan Chengee80fb72008-11-06 01:21:28 +00001109def SMMLA : AMul2I <0b0111010, (outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$c),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001110 "smmla", " $dst, $a, $b, $c",
1111 [(set GPR:$dst, (add (mulhs GPR:$a, GPR:$b), GPR:$c))]>,
Evan Chengee80fb72008-11-06 01:21:28 +00001112 Requires<[IsARM, HasV6]> {
1113 let Inst{7-4} = 0b0001;
1114}
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001115
1116
Evan Chengee80fb72008-11-06 01:21:28 +00001117def SMMLS : AMul2I <0b0111010, (outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$c),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001118 "smmls", " $dst, $a, $b, $c",
1119 [(set GPR:$dst, (sub GPR:$c, (mulhs GPR:$a, GPR:$b)))]>,
Evan Chengee80fb72008-11-06 01:21:28 +00001120 Requires<[IsARM, HasV6]> {
1121 let Inst{7-4} = 0b1101;
1122}
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001123
Raul Herbster2e07e8d2007-08-30 23:25:47 +00001124multiclass AI_smul<string opc, PatFrag opnode> {
Evan Cheng38396be2008-11-06 03:35:07 +00001125 def BB : AMulxyI<0b0001011, (outs GPR:$dst), (ins GPR:$a, GPR:$b),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001126 !strconcat(opc, "bb"), " $dst, $a, $b",
1127 [(set GPR:$dst, (opnode (sext_inreg GPR:$a, i16),
1128 (sext_inreg GPR:$b, i16)))]>,
Evan Cheng38396be2008-11-06 03:35:07 +00001129 Requires<[IsARM, HasV5TE]> {
1130 let Inst{5} = 0;
1131 let Inst{6} = 0;
1132 }
Raul Herbster2e07e8d2007-08-30 23:25:47 +00001133
Evan Cheng38396be2008-11-06 03:35:07 +00001134 def BT : AMulxyI<0b0001011, (outs GPR:$dst), (ins GPR:$a, GPR:$b),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001135 !strconcat(opc, "bt"), " $dst, $a, $b",
1136 [(set GPR:$dst, (opnode (sext_inreg GPR:$a, i16),
Bob Wilson74590a02009-06-22 22:08:29 +00001137 (sra GPR:$b, (i32 16))))]>,
Evan Cheng38396be2008-11-06 03:35:07 +00001138 Requires<[IsARM, HasV5TE]> {
1139 let Inst{5} = 0;
1140 let Inst{6} = 1;
1141 }
Raul Herbster2e07e8d2007-08-30 23:25:47 +00001142
Evan Cheng38396be2008-11-06 03:35:07 +00001143 def TB : AMulxyI<0b0001011, (outs GPR:$dst), (ins GPR:$a, GPR:$b),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001144 !strconcat(opc, "tb"), " $dst, $a, $b",
Bob Wilson74590a02009-06-22 22:08:29 +00001145 [(set GPR:$dst, (opnode (sra GPR:$a, (i32 16)),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001146 (sext_inreg GPR:$b, i16)))]>,
Evan Cheng38396be2008-11-06 03:35:07 +00001147 Requires<[IsARM, HasV5TE]> {
1148 let Inst{5} = 1;
1149 let Inst{6} = 0;
1150 }
Raul Herbster2e07e8d2007-08-30 23:25:47 +00001151
Evan Cheng38396be2008-11-06 03:35:07 +00001152 def TT : AMulxyI<0b0001011, (outs GPR:$dst), (ins GPR:$a, GPR:$b),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001153 !strconcat(opc, "tt"), " $dst, $a, $b",
Bob Wilson74590a02009-06-22 22:08:29 +00001154 [(set GPR:$dst, (opnode (sra GPR:$a, (i32 16)),
1155 (sra GPR:$b, (i32 16))))]>,
Evan Cheng38396be2008-11-06 03:35:07 +00001156 Requires<[IsARM, HasV5TE]> {
1157 let Inst{5} = 1;
1158 let Inst{6} = 1;
1159 }
Raul Herbster2e07e8d2007-08-30 23:25:47 +00001160
Evan Cheng38396be2008-11-06 03:35:07 +00001161 def WB : AMulxyI<0b0001001, (outs GPR:$dst), (ins GPR:$a, GPR:$b),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001162 !strconcat(opc, "wb"), " $dst, $a, $b",
1163 [(set GPR:$dst, (sra (opnode GPR:$a,
Bob Wilson74590a02009-06-22 22:08:29 +00001164 (sext_inreg GPR:$b, i16)), (i32 16)))]>,
Evan Cheng38396be2008-11-06 03:35:07 +00001165 Requires<[IsARM, HasV5TE]> {
1166 let Inst{5} = 1;
1167 let Inst{6} = 0;
1168 }
Raul Herbster2e07e8d2007-08-30 23:25:47 +00001169
Evan Cheng38396be2008-11-06 03:35:07 +00001170 def WT : AMulxyI<0b0001001, (outs GPR:$dst), (ins GPR:$a, GPR:$b),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001171 !strconcat(opc, "wt"), " $dst, $a, $b",
1172 [(set GPR:$dst, (sra (opnode GPR:$a,
Bob Wilson74590a02009-06-22 22:08:29 +00001173 (sra GPR:$b, (i32 16))), (i32 16)))]>,
Evan Cheng38396be2008-11-06 03:35:07 +00001174 Requires<[IsARM, HasV5TE]> {
1175 let Inst{5} = 1;
1176 let Inst{6} = 1;
1177 }
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001178}
1179
Raul Herbster2e07e8d2007-08-30 23:25:47 +00001180
1181multiclass AI_smla<string opc, PatFrag opnode> {
Evan Cheng38396be2008-11-06 03:35:07 +00001182 def BB : AMulxyI<0b0001000, (outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$acc),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001183 !strconcat(opc, "bb"), " $dst, $a, $b, $acc",
1184 [(set GPR:$dst, (add GPR:$acc,
1185 (opnode (sext_inreg GPR:$a, i16),
1186 (sext_inreg GPR:$b, i16))))]>,
Evan Cheng38396be2008-11-06 03:35:07 +00001187 Requires<[IsARM, HasV5TE]> {
1188 let Inst{5} = 0;
1189 let Inst{6} = 0;
1190 }
Raul Herbster2e07e8d2007-08-30 23:25:47 +00001191
Evan Cheng38396be2008-11-06 03:35:07 +00001192 def BT : AMulxyI<0b0001000, (outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$acc),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001193 !strconcat(opc, "bt"), " $dst, $a, $b, $acc",
1194 [(set GPR:$dst, (add GPR:$acc, (opnode (sext_inreg GPR:$a, i16),
Bob Wilson74590a02009-06-22 22:08:29 +00001195 (sra GPR:$b, (i32 16)))))]>,
Evan Cheng38396be2008-11-06 03:35:07 +00001196 Requires<[IsARM, HasV5TE]> {
1197 let Inst{5} = 0;
1198 let Inst{6} = 1;
1199 }
Raul Herbster2e07e8d2007-08-30 23:25:47 +00001200
Evan Cheng38396be2008-11-06 03:35:07 +00001201 def TB : AMulxyI<0b0001000, (outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$acc),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001202 !strconcat(opc, "tb"), " $dst, $a, $b, $acc",
Bob Wilson74590a02009-06-22 22:08:29 +00001203 [(set GPR:$dst, (add GPR:$acc, (opnode (sra GPR:$a, (i32 16)),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001204 (sext_inreg GPR:$b, i16))))]>,
Evan Cheng38396be2008-11-06 03:35:07 +00001205 Requires<[IsARM, HasV5TE]> {
1206 let Inst{5} = 1;
1207 let Inst{6} = 0;
1208 }
Raul Herbster2e07e8d2007-08-30 23:25:47 +00001209
Evan Cheng38396be2008-11-06 03:35:07 +00001210 def TT : AMulxyI<0b0001000, (outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$acc),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001211 !strconcat(opc, "tt"), " $dst, $a, $b, $acc",
Bob Wilson74590a02009-06-22 22:08:29 +00001212 [(set GPR:$dst, (add GPR:$acc, (opnode (sra GPR:$a, (i32 16)),
1213 (sra GPR:$b, (i32 16)))))]>,
Evan Cheng38396be2008-11-06 03:35:07 +00001214 Requires<[IsARM, HasV5TE]> {
1215 let Inst{5} = 1;
1216 let Inst{6} = 1;
1217 }
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001218
Evan Cheng38396be2008-11-06 03:35:07 +00001219 def WB : AMulxyI<0b0001001, (outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$acc),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001220 !strconcat(opc, "wb"), " $dst, $a, $b, $acc",
1221 [(set GPR:$dst, (add GPR:$acc, (sra (opnode GPR:$a,
Bob Wilson74590a02009-06-22 22:08:29 +00001222 (sext_inreg GPR:$b, i16)), (i32 16))))]>,
Evan Cheng38396be2008-11-06 03:35:07 +00001223 Requires<[IsARM, HasV5TE]> {
1224 let Inst{5} = 0;
1225 let Inst{6} = 0;
1226 }
Raul Herbster2e07e8d2007-08-30 23:25:47 +00001227
Evan Cheng38396be2008-11-06 03:35:07 +00001228 def WT : AMulxyI<0b0001001, (outs GPR:$dst), (ins GPR:$a, GPR:$b, GPR:$acc),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001229 !strconcat(opc, "wt"), " $dst, $a, $b, $acc",
1230 [(set GPR:$dst, (add GPR:$acc, (sra (opnode GPR:$a,
Bob Wilson74590a02009-06-22 22:08:29 +00001231 (sra GPR:$b, (i32 16))), (i32 16))))]>,
Evan Cheng38396be2008-11-06 03:35:07 +00001232 Requires<[IsARM, HasV5TE]> {
1233 let Inst{5} = 0;
1234 let Inst{6} = 1;
1235 }
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001236}
1237
Raul Herbster2e07e8d2007-08-30 23:25:47 +00001238defm SMUL : AI_smul<"smul", BinOpFrag<(mul node:$LHS, node:$RHS)>>;
1239defm SMLA : AI_smla<"smla", BinOpFrag<(mul node:$LHS, node:$RHS)>>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001240
1241// TODO: Halfword multiple accumulate long: SMLAL<x><y>
1242// TODO: Dual halfword multiple: SMUAD, SMUSD, SMLAD, SMLSD, SMLALD, SMLSLD
1243
1244//===----------------------------------------------------------------------===//
1245// Misc. Arithmetic Instructions.
1246//
1247
Evan Chengc2121a22008-11-07 01:41:35 +00001248def CLZ : AMiscA1I<0b000010110, (outs GPR:$dst), (ins GPR:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001249 "clz", " $dst, $src",
Evan Chengc2121a22008-11-07 01:41:35 +00001250 [(set GPR:$dst, (ctlz GPR:$src))]>, Requires<[IsARM, HasV5T]> {
1251 let Inst{7-4} = 0b0001;
1252 let Inst{11-8} = 0b1111;
1253 let Inst{19-16} = 0b1111;
1254}
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001255
Evan Chengc2121a22008-11-07 01:41:35 +00001256def REV : AMiscA1I<0b01101011, (outs GPR:$dst), (ins GPR:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001257 "rev", " $dst, $src",
Evan Chengc2121a22008-11-07 01:41:35 +00001258 [(set GPR:$dst, (bswap GPR:$src))]>, Requires<[IsARM, HasV6]> {
1259 let Inst{7-4} = 0b0011;
1260 let Inst{11-8} = 0b1111;
1261 let Inst{19-16} = 0b1111;
1262}
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001263
Evan Chengc2121a22008-11-07 01:41:35 +00001264def REV16 : AMiscA1I<0b01101011, (outs GPR:$dst), (ins GPR:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001265 "rev16", " $dst, $src",
1266 [(set GPR:$dst,
Bob Wilson74590a02009-06-22 22:08:29 +00001267 (or (and (srl GPR:$src, (i32 8)), 0xFF),
1268 (or (and (shl GPR:$src, (i32 8)), 0xFF00),
1269 (or (and (srl GPR:$src, (i32 8)), 0xFF0000),
1270 (and (shl GPR:$src, (i32 8)), 0xFF000000)))))]>,
Evan Chengc2121a22008-11-07 01:41:35 +00001271 Requires<[IsARM, HasV6]> {
1272 let Inst{7-4} = 0b1011;
1273 let Inst{11-8} = 0b1111;
1274 let Inst{19-16} = 0b1111;
1275}
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001276
Evan Chengc2121a22008-11-07 01:41:35 +00001277def REVSH : AMiscA1I<0b01101111, (outs GPR:$dst), (ins GPR:$src),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001278 "revsh", " $dst, $src",
1279 [(set GPR:$dst,
1280 (sext_inreg
Bob Wilson74590a02009-06-22 22:08:29 +00001281 (or (srl (and GPR:$src, 0xFF00), (i32 8)),
1282 (shl GPR:$src, (i32 8))), i16))]>,
Evan Chengc2121a22008-11-07 01:41:35 +00001283 Requires<[IsARM, HasV6]> {
1284 let Inst{7-4} = 0b1011;
1285 let Inst{11-8} = 0b1111;
1286 let Inst{19-16} = 0b1111;
1287}
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001288
Evan Chengc2121a22008-11-07 01:41:35 +00001289def PKHBT : AMiscA1I<0b01101000, (outs GPR:$dst),
1290 (ins GPR:$src1, GPR:$src2, i32imm:$shamt),
1291 "pkhbt", " $dst, $src1, $src2, LSL $shamt",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001292 [(set GPR:$dst, (or (and GPR:$src1, 0xFFFF),
1293 (and (shl GPR:$src2, (i32 imm:$shamt)),
1294 0xFFFF0000)))]>,
Evan Chengc2121a22008-11-07 01:41:35 +00001295 Requires<[IsARM, HasV6]> {
1296 let Inst{6-4} = 0b001;
1297}
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001298
1299// Alternate cases for PKHBT where identities eliminate some nodes.
1300def : ARMV6Pat<(or (and GPR:$src1, 0xFFFF), (and GPR:$src2, 0xFFFF0000)),
1301 (PKHBT GPR:$src1, GPR:$src2, 0)>;
1302def : ARMV6Pat<(or (and GPR:$src1, 0xFFFF), (shl GPR:$src2, imm16_31:$shamt)),
1303 (PKHBT GPR:$src1, GPR:$src2, imm16_31:$shamt)>;
1304
1305
Evan Chengc2121a22008-11-07 01:41:35 +00001306def PKHTB : AMiscA1I<0b01101000, (outs GPR:$dst),
1307 (ins GPR:$src1, GPR:$src2, i32imm:$shamt),
1308 "pkhtb", " $dst, $src1, $src2, ASR $shamt",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001309 [(set GPR:$dst, (or (and GPR:$src1, 0xFFFF0000),
1310 (and (sra GPR:$src2, imm16_31:$shamt),
Evan Chengc2121a22008-11-07 01:41:35 +00001311 0xFFFF)))]>, Requires<[IsARM, HasV6]> {
1312 let Inst{6-4} = 0b101;
1313}
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001314
1315// Alternate cases for PKHTB where identities eliminate some nodes. Note that
1316// a shift amount of 0 is *not legal* here, it is PKHBT instead.
Bob Wilson74590a02009-06-22 22:08:29 +00001317def : ARMV6Pat<(or (and GPR:$src1, 0xFFFF0000), (srl GPR:$src2, (i32 16))),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001318 (PKHTB GPR:$src1, GPR:$src2, 16)>;
1319def : ARMV6Pat<(or (and GPR:$src1, 0xFFFF0000),
1320 (and (srl GPR:$src2, imm1_15:$shamt), 0xFFFF)),
1321 (PKHTB GPR:$src1, GPR:$src2, imm1_15:$shamt)>;
1322
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001323//===----------------------------------------------------------------------===//
1324// Comparison Instructions...
1325//
1326
Jim Grosbach88c246f2008-10-14 20:36:24 +00001327defm CMP : AI1_cmp_irs<0b1010, "cmp",
Evan Chenga7b3e7c2007-08-07 01:37:15 +00001328 BinOpFrag<(ARMcmp node:$LHS, node:$RHS)>>;
Jim Grosbach88c246f2008-10-14 20:36:24 +00001329defm CMN : AI1_cmp_irs<0b1011, "cmn",
Evan Chenga7b3e7c2007-08-07 01:37:15 +00001330 BinOpFrag<(ARMcmp node:$LHS,(ineg node:$RHS))>>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001331
1332// Note that TST/TEQ don't set all the same flags that CMP does!
Evan Chengbe998242008-11-06 08:47:38 +00001333defm TST : AI1_cmp_irs<0b1000, "tst",
David Goodwin8bdcbb32009-06-29 15:33:01 +00001334 BinOpFrag<(ARMcmpZ (and node:$LHS, node:$RHS), 0)>, 1>;
Evan Chengbe998242008-11-06 08:47:38 +00001335defm TEQ : AI1_cmp_irs<0b1001, "teq",
David Goodwin8bdcbb32009-06-29 15:33:01 +00001336 BinOpFrag<(ARMcmpZ (xor node:$LHS, node:$RHS), 0)>, 1>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001337
David Goodwin8bdcbb32009-06-29 15:33:01 +00001338defm CMPz : AI1_cmp_irs<0b1010, "cmp",
1339 BinOpFrag<(ARMcmpZ node:$LHS, node:$RHS)>>;
1340defm CMNz : AI1_cmp_irs<0b1011, "cmn",
1341 BinOpFrag<(ARMcmpZ node:$LHS,(ineg node:$RHS))>>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001342
1343def : ARMPat<(ARMcmp GPR:$src, so_imm_neg:$imm),
1344 (CMNri GPR:$src, so_imm_neg:$imm)>;
1345
David Goodwin8bdcbb32009-06-29 15:33:01 +00001346def : ARMPat<(ARMcmpZ GPR:$src, so_imm_neg:$imm),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001347 (CMNri GPR:$src, so_imm_neg:$imm)>;
1348
1349
1350// Conditional moves
1351// FIXME: should be able to write a pattern for ARMcmov, but can't use
1352// a two-value operand where a dag node expects two operands. :(
Evan Chengbe998242008-11-06 08:47:38 +00001353def MOVCCr : AI1<0b1101, (outs GPR:$dst), (ins GPR:$false, GPR:$true), DPFrm,
Evan Cheng86a926a2008-11-05 18:35:52 +00001354 "mov", " $dst, $true",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001355 [/*(set GPR:$dst, (ARMcmov GPR:$false, GPR:$true, imm:$cc, CCR:$ccr))*/]>,
Evan Chengbe998242008-11-06 08:47:38 +00001356 RegConstraint<"$false = $dst">, UnaryDP;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001357
Evan Chengbe998242008-11-06 08:47:38 +00001358def MOVCCs : AI1<0b1101, (outs GPR:$dst),
1359 (ins GPR:$false, so_reg:$true), DPSoRegFrm,
Evan Cheng86a926a2008-11-05 18:35:52 +00001360 "mov", " $dst, $true",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001361 [/*(set GPR:$dst, (ARMcmov GPR:$false, so_reg:$true, imm:$cc, CCR:$ccr))*/]>,
Evan Cheng86a926a2008-11-05 18:35:52 +00001362 RegConstraint<"$false = $dst">, UnaryDP;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001363
Evan Chengbe998242008-11-06 08:47:38 +00001364def MOVCCi : AI1<0b1101, (outs GPR:$dst),
1365 (ins GPR:$false, so_imm:$true), DPFrm,
Evan Cheng86a926a2008-11-05 18:35:52 +00001366 "mov", " $dst, $true",
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001367 [/*(set GPR:$dst, (ARMcmov GPR:$false, so_imm:$true, imm:$cc, CCR:$ccr))*/]>,
Evan Cheng86a926a2008-11-05 18:35:52 +00001368 RegConstraint<"$false = $dst">, UnaryDP;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001369
1370
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001371//===----------------------------------------------------------------------===//
1372// TLS Instructions
1373//
1374
1375// __aeabi_read_tp preserves the registers r1-r3.
1376let isCall = 1,
1377 Defs = [R0, R12, LR, CPSR] in {
Evan Chengf8e8b622008-11-06 17:48:05 +00001378 def TPsoft : ABXI<0b1011, (outs), (ins),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001379 "bl __aeabi_read_tp",
1380 [(set R0, ARMthread_pointer)]>;
1381}
1382
1383//===----------------------------------------------------------------------===//
Jim Grosbachc10915b2009-05-12 23:59:14 +00001384// SJLJ Exception handling intrinsics
Jim Grosbach4a9025e2009-05-14 00:46:35 +00001385// eh_sjlj_setjmp() is a three instruction sequence to store the return
1386// address and save #0 in R0 for the non-longjmp case.
Jim Grosbachc10915b2009-05-12 23:59:14 +00001387// Since by its nature we may be coming from some other function to get
1388// here, and we're using the stack frame for the containing function to
1389// save/restore registers, we can't keep anything live in regs across
Jim Grosbach4a9025e2009-05-14 00:46:35 +00001390// the eh_sjlj_setjmp(), else it will almost certainly have been tromped upon
Jim Grosbachc10915b2009-05-12 23:59:14 +00001391// when we get here from a longjmp(). We force everthing out of registers
Jim Grosbach4a9025e2009-05-14 00:46:35 +00001392// except for our own input by listing the relevant registers in Defs. By
1393// doing so, we also cause the prologue/epilogue code to actively preserve
1394// all of the callee-saved resgisters, which is exactly what we want.
Jim Grosbachc10915b2009-05-12 23:59:14 +00001395let Defs =
Evan Cheng27396a62009-07-22 06:46:53 +00001396 [ R0, R1, R3, R4, R5, R6, R7, R8, R9, R10, R11, R12, LR,
1397 D0, D2, D3, D4, D5, D6, D7, D8, D9, D10, D11, D12, D13, D14, D15,
1398 D16, D17, D18, D19, D20, D21, D22, D23, D24, D25, D26, D27, D28, D29, D31,
1399 D31 ] in {
Jim Grosbach4a9025e2009-05-14 00:46:35 +00001400 def Int_eh_sjlj_setjmp : XI<(outs), (ins GPR:$src),
Jim Grosbachc10915b2009-05-12 23:59:14 +00001401 AddrModeNone, SizeSpecial, IndexModeNone, Pseudo,
1402 "add r0, pc, #4\n\t"
1403 "str r0, [$src, #+4]\n\t"
Jim Grosbach4a9025e2009-05-14 00:46:35 +00001404 "mov r0, #0 @ eh_setjmp", "",
1405 [(set R0, (ARMeh_sjlj_setjmp GPR:$src))]>;
Jim Grosbachc10915b2009-05-12 23:59:14 +00001406}
1407
1408//===----------------------------------------------------------------------===//
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001409// Non-Instruction Patterns
1410//
1411
1412// ConstantPool, GlobalAddress, and JumpTable
1413def : ARMPat<(ARMWrapper tglobaladdr :$dst), (LEApcrel tglobaladdr :$dst)>;
1414def : ARMPat<(ARMWrapper tconstpool :$dst), (LEApcrel tconstpool :$dst)>;
1415def : ARMPat<(ARMWrapperJT tjumptable:$dst, imm:$id),
1416 (LEApcrelJT tjumptable:$dst, imm:$id)>;
1417
1418// Large immediate handling.
1419
1420// Two piece so_imms.
1421let isReMaterializable = 1 in
Evan Chengbe998242008-11-06 08:47:38 +00001422def MOVi2pieces : AI1x2<(outs GPR:$dst), (ins so_imm2part:$src), Pseudo,
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001423 "mov", " $dst, $src",
Evan Cheng7cd4acb2008-11-06 02:25:39 +00001424 [(set GPR:$dst, so_imm2part:$src)]>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001425
1426def : ARMPat<(or GPR:$LHS, so_imm2part:$RHS),
Evan Cheng8be2a5b2009-07-08 21:03:57 +00001427 (ORRri (ORRri GPR:$LHS, (so_imm2part_1 imm:$RHS)),
1428 (so_imm2part_2 imm:$RHS))>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001429def : ARMPat<(xor GPR:$LHS, so_imm2part:$RHS),
Evan Cheng8be2a5b2009-07-08 21:03:57 +00001430 (EORri (EORri GPR:$LHS, (so_imm2part_1 imm:$RHS)),
1431 (so_imm2part_2 imm:$RHS))>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001432
1433// TODO: add,sub,and, 3-instr forms?
1434
1435
1436// Direct calls
Bob Wilson243b37c2009-06-22 21:01:46 +00001437def : ARMPat<(ARMcall texternalsym:$func), (BL texternalsym:$func)>,
1438 Requires<[IsNotDarwin]>;
1439def : ARMPat<(ARMcall texternalsym:$func), (BLr9 texternalsym:$func)>,
1440 Requires<[IsDarwin]>;
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001441
1442// zextload i1 -> zextload i8
1443def : ARMPat<(zextloadi1 addrmode2:$addr), (LDRB addrmode2:$addr)>;
1444
1445// extload -> zextload
1446def : ARMPat<(extloadi1 addrmode2:$addr), (LDRB addrmode2:$addr)>;
1447def : ARMPat<(extloadi8 addrmode2:$addr), (LDRB addrmode2:$addr)>;
1448def : ARMPat<(extloadi16 addrmode3:$addr), (LDRH addrmode3:$addr)>;
1449
Evan Chengc41fb3152008-11-05 23:22:34 +00001450def : ARMPat<(extloadi8 addrmodepc:$addr), (PICLDRB addrmodepc:$addr)>;
1451def : ARMPat<(extloadi16 addrmodepc:$addr), (PICLDRH addrmodepc:$addr)>;
1452
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001453// smul* and smla*
Bob Wilson74590a02009-06-22 22:08:29 +00001454def : ARMV5TEPat<(mul (sra (shl GPR:$a, (i32 16)), (i32 16)),
1455 (sra (shl GPR:$b, (i32 16)), (i32 16))),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001456 (SMULBB GPR:$a, GPR:$b)>;
1457def : ARMV5TEPat<(mul sext_16_node:$a, sext_16_node:$b),
1458 (SMULBB GPR:$a, GPR:$b)>;
Bob Wilson74590a02009-06-22 22:08:29 +00001459def : ARMV5TEPat<(mul (sra (shl GPR:$a, (i32 16)), (i32 16)),
1460 (sra GPR:$b, (i32 16))),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001461 (SMULBT GPR:$a, GPR:$b)>;
Bob Wilson74590a02009-06-22 22:08:29 +00001462def : ARMV5TEPat<(mul sext_16_node:$a, (sra GPR:$b, (i32 16))),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001463 (SMULBT GPR:$a, GPR:$b)>;
Bob Wilson74590a02009-06-22 22:08:29 +00001464def : ARMV5TEPat<(mul (sra GPR:$a, (i32 16)),
1465 (sra (shl GPR:$b, (i32 16)), (i32 16))),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001466 (SMULTB GPR:$a, GPR:$b)>;
Bob Wilson74590a02009-06-22 22:08:29 +00001467def : ARMV5TEPat<(mul (sra GPR:$a, (i32 16)), sext_16_node:$b),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001468 (SMULTB GPR:$a, GPR:$b)>;
Bob Wilson74590a02009-06-22 22:08:29 +00001469def : ARMV5TEPat<(sra (mul GPR:$a, (sra (shl GPR:$b, (i32 16)), (i32 16))),
1470 (i32 16)),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001471 (SMULWB GPR:$a, GPR:$b)>;
Bob Wilson74590a02009-06-22 22:08:29 +00001472def : ARMV5TEPat<(sra (mul GPR:$a, sext_16_node:$b), (i32 16)),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001473 (SMULWB GPR:$a, GPR:$b)>;
1474
1475def : ARMV5TEPat<(add GPR:$acc,
Bob Wilson74590a02009-06-22 22:08:29 +00001476 (mul (sra (shl GPR:$a, (i32 16)), (i32 16)),
1477 (sra (shl GPR:$b, (i32 16)), (i32 16)))),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001478 (SMLABB GPR:$a, GPR:$b, GPR:$acc)>;
1479def : ARMV5TEPat<(add GPR:$acc,
1480 (mul sext_16_node:$a, sext_16_node:$b)),
1481 (SMLABB GPR:$a, GPR:$b, GPR:$acc)>;
1482def : ARMV5TEPat<(add GPR:$acc,
Bob Wilson74590a02009-06-22 22:08:29 +00001483 (mul (sra (shl GPR:$a, (i32 16)), (i32 16)),
1484 (sra GPR:$b, (i32 16)))),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001485 (SMLABT GPR:$a, GPR:$b, GPR:$acc)>;
1486def : ARMV5TEPat<(add GPR:$acc,
Bob Wilson74590a02009-06-22 22:08:29 +00001487 (mul sext_16_node:$a, (sra GPR:$b, (i32 16)))),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001488 (SMLABT GPR:$a, GPR:$b, GPR:$acc)>;
1489def : ARMV5TEPat<(add GPR:$acc,
Bob Wilson74590a02009-06-22 22:08:29 +00001490 (mul (sra GPR:$a, (i32 16)),
1491 (sra (shl GPR:$b, (i32 16)), (i32 16)))),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001492 (SMLATB GPR:$a, GPR:$b, GPR:$acc)>;
1493def : ARMV5TEPat<(add GPR:$acc,
Bob Wilson74590a02009-06-22 22:08:29 +00001494 (mul (sra GPR:$a, (i32 16)), sext_16_node:$b)),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001495 (SMLATB GPR:$a, GPR:$b, GPR:$acc)>;
1496def : ARMV5TEPat<(add GPR:$acc,
Bob Wilson74590a02009-06-22 22:08:29 +00001497 (sra (mul GPR:$a, (sra (shl GPR:$b, (i32 16)), (i32 16))),
1498 (i32 16))),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001499 (SMLAWB GPR:$a, GPR:$b, GPR:$acc)>;
1500def : ARMV5TEPat<(add GPR:$acc,
Bob Wilson74590a02009-06-22 22:08:29 +00001501 (sra (mul GPR:$a, sext_16_node:$b), (i32 16))),
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001502 (SMLAWB GPR:$a, GPR:$b, GPR:$acc)>;
1503
1504//===----------------------------------------------------------------------===//
1505// Thumb Support
1506//
1507
1508include "ARMInstrThumb.td"
1509
1510//===----------------------------------------------------------------------===//
Anton Korobeynikovac869fc2009-06-17 18:13:58 +00001511// Thumb2 Support
1512//
1513
1514include "ARMInstrThumb2.td"
1515
1516//===----------------------------------------------------------------------===//
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001517// Floating Point Support
1518//
1519
1520include "ARMInstrVFP.td"
Bob Wilsone60fee02009-06-22 23:27:02 +00001521
1522//===----------------------------------------------------------------------===//
1523// Advanced SIMD (NEON) Support
1524//
1525
1526include "ARMInstrNEON.td"