blob: f78fa2c100c7e33d8b31c5dabdf9bb0027bacc68 [file] [log] [blame]
Bob Wilson5bafff32009-06-22 23:27:02 +00001//===- ARMInstrNEON.td - NEON support for ARM -----------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file describes the ARM NEON instruction set.
11//
12//===----------------------------------------------------------------------===//
13
Jim Grosbach460a9052011-10-07 23:56:00 +000014
15//===----------------------------------------------------------------------===//
16// NEON-specific Operands.
17//===----------------------------------------------------------------------===//
Jim Grosbach698f3b02011-10-17 21:00:11 +000018def nModImm : Operand<i32> {
19 let PrintMethod = "printNEONModImmOperand";
20}
21
Jim Grosbach0e387b22011-10-17 22:26:03 +000022def nImmSplatI8AsmOperand : AsmOperandClass { let Name = "NEONi8splat"; }
23def nImmSplatI8 : Operand<i32> {
24 let PrintMethod = "printNEONModImmOperand";
25 let ParserMatchClass = nImmSplatI8AsmOperand;
26}
Jim Grosbachea461102011-10-17 23:09:09 +000027def nImmSplatI16AsmOperand : AsmOperandClass { let Name = "NEONi16splat"; }
28def nImmSplatI16 : Operand<i32> {
29 let PrintMethod = "printNEONModImmOperand";
30 let ParserMatchClass = nImmSplatI16AsmOperand;
31}
Jim Grosbach6248a542011-10-18 00:22:00 +000032def nImmSplatI32AsmOperand : AsmOperandClass { let Name = "NEONi32splat"; }
33def nImmSplatI32 : Operand<i32> {
34 let PrintMethod = "printNEONModImmOperand";
35 let ParserMatchClass = nImmSplatI32AsmOperand;
36}
37def nImmVMOVI32AsmOperand : AsmOperandClass { let Name = "NEONi32vmov"; }
38def nImmVMOVI32 : Operand<i32> {
39 let PrintMethod = "printNEONModImmOperand";
40 let ParserMatchClass = nImmVMOVI32AsmOperand;
41}
Jim Grosbach9b087852011-12-19 23:51:07 +000042def nImmVMOVI32NegAsmOperand : AsmOperandClass { let Name = "NEONi32vmovNeg"; }
43def nImmVMOVI32Neg : Operand<i32> {
44 let PrintMethod = "printNEONModImmOperand";
45 let ParserMatchClass = nImmVMOVI32NegAsmOperand;
46}
Evan Chengeaa192a2011-11-15 02:12:34 +000047def nImmVMOVF32 : Operand<i32> {
48 let PrintMethod = "printFPImmOperand";
49 let ParserMatchClass = FPImmOperand;
50}
Jim Grosbachf2f5bc62011-10-18 16:18:11 +000051def nImmSplatI64AsmOperand : AsmOperandClass { let Name = "NEONi64splat"; }
52def nImmSplatI64 : Operand<i32> {
53 let PrintMethod = "printNEONModImmOperand";
54 let ParserMatchClass = nImmSplatI64AsmOperand;
55}
Jim Grosbach0e387b22011-10-17 22:26:03 +000056
Jim Grosbach460a9052011-10-07 23:56:00 +000057def VectorIndex8Operand : AsmOperandClass { let Name = "VectorIndex8"; }
58def VectorIndex16Operand : AsmOperandClass { let Name = "VectorIndex16"; }
59def VectorIndex32Operand : AsmOperandClass { let Name = "VectorIndex32"; }
60def VectorIndex8 : Operand<i32>, ImmLeaf<i32, [{
61 return ((uint64_t)Imm) < 8;
62}]> {
63 let ParserMatchClass = VectorIndex8Operand;
64 let PrintMethod = "printVectorIndex";
65 let MIOperandInfo = (ops i32imm);
66}
67def VectorIndex16 : Operand<i32>, ImmLeaf<i32, [{
68 return ((uint64_t)Imm) < 4;
69}]> {
70 let ParserMatchClass = VectorIndex16Operand;
71 let PrintMethod = "printVectorIndex";
72 let MIOperandInfo = (ops i32imm);
73}
74def VectorIndex32 : Operand<i32>, ImmLeaf<i32, [{
75 return ((uint64_t)Imm) < 2;
76}]> {
77 let ParserMatchClass = VectorIndex32Operand;
78 let PrintMethod = "printVectorIndex";
79 let MIOperandInfo = (ops i32imm);
80}
81
Jim Grosbachbd1cff52011-11-29 23:33:40 +000082// Register list of one D register.
Jim Grosbach862019c2011-10-18 23:02:30 +000083def VecListOneDAsmOperand : AsmOperandClass {
84 let Name = "VecListOneD";
85 let ParserMethod = "parseVectorList";
Jim Grosbach6029b6d2011-11-29 23:51:09 +000086 let RenderMethod = "addVecListOperands";
Jim Grosbach862019c2011-10-18 23:02:30 +000087}
88def VecListOneD : RegisterOperand<DPR, "printVectorListOne"> {
89 let ParserMatchClass = VecListOneDAsmOperand;
90}
Jim Grosbach280dfad2011-10-21 18:54:25 +000091// Register list of two sequential D registers.
92def VecListTwoDAsmOperand : AsmOperandClass {
93 let Name = "VecListTwoD";
94 let ParserMethod = "parseVectorList";
Jim Grosbach6029b6d2011-11-29 23:51:09 +000095 let RenderMethod = "addVecListOperands";
Jim Grosbach280dfad2011-10-21 18:54:25 +000096}
97def VecListTwoD : RegisterOperand<DPR, "printVectorListTwo"> {
98 let ParserMatchClass = VecListTwoDAsmOperand;
99}
Jim Grosbachcdcfa282011-10-21 20:02:19 +0000100// Register list of three sequential D registers.
101def VecListThreeDAsmOperand : AsmOperandClass {
102 let Name = "VecListThreeD";
103 let ParserMethod = "parseVectorList";
Jim Grosbach6029b6d2011-11-29 23:51:09 +0000104 let RenderMethod = "addVecListOperands";
Jim Grosbachcdcfa282011-10-21 20:02:19 +0000105}
106def VecListThreeD : RegisterOperand<DPR, "printVectorListThree"> {
107 let ParserMatchClass = VecListThreeDAsmOperand;
108}
Jim Grosbachb6310312011-10-21 20:35:01 +0000109// Register list of four sequential D registers.
110def VecListFourDAsmOperand : AsmOperandClass {
111 let Name = "VecListFourD";
112 let ParserMethod = "parseVectorList";
Jim Grosbach6029b6d2011-11-29 23:51:09 +0000113 let RenderMethod = "addVecListOperands";
Jim Grosbachb6310312011-10-21 20:35:01 +0000114}
115def VecListFourD : RegisterOperand<DPR, "printVectorListFour"> {
116 let ParserMatchClass = VecListFourDAsmOperand;
117}
Jim Grosbach4661d4c2011-10-21 22:21:10 +0000118// Register list of two D registers spaced by 2 (two sequential Q registers).
119def VecListTwoQAsmOperand : AsmOperandClass {
120 let Name = "VecListTwoQ";
121 let ParserMethod = "parseVectorList";
Jim Grosbach6029b6d2011-11-29 23:51:09 +0000122 let RenderMethod = "addVecListOperands";
Jim Grosbach4661d4c2011-10-21 22:21:10 +0000123}
Jim Grosbache90ac9b2011-12-14 19:35:22 +0000124def VecListTwoQ : RegisterOperand<DPR, "printVectorListTwoSpaced"> {
Jim Grosbach4661d4c2011-10-21 22:21:10 +0000125 let ParserMatchClass = VecListTwoQAsmOperand;
126}
Jim Grosbachc387fc62012-01-23 23:20:46 +0000127// Register list of three D registers spaced by 2 (three Q registers).
128def VecListThreeQAsmOperand : AsmOperandClass {
129 let Name = "VecListThreeQ";
130 let ParserMethod = "parseVectorList";
131 let RenderMethod = "addVecListOperands";
132}
133def VecListThreeQ : RegisterOperand<DPR, "printVectorListThreeSpaced"> {
134 let ParserMatchClass = VecListThreeQAsmOperand;
135}
Jim Grosbach8abe7e32012-01-24 00:43:17 +0000136// Register list of three D registers spaced by 2 (three Q registers).
137def VecListFourQAsmOperand : AsmOperandClass {
138 let Name = "VecListFourQ";
139 let ParserMethod = "parseVectorList";
140 let RenderMethod = "addVecListOperands";
141}
142def VecListFourQ : RegisterOperand<DPR, "printVectorListFourSpaced"> {
143 let ParserMatchClass = VecListFourQAsmOperand;
144}
Jim Grosbach862019c2011-10-18 23:02:30 +0000145
Jim Grosbach98b05a52011-11-30 01:09:44 +0000146// Register list of one D register, with "all lanes" subscripting.
147def VecListOneDAllLanesAsmOperand : AsmOperandClass {
148 let Name = "VecListOneDAllLanes";
149 let ParserMethod = "parseVectorList";
150 let RenderMethod = "addVecListOperands";
151}
152def VecListOneDAllLanes : RegisterOperand<DPR, "printVectorListOneAllLanes"> {
153 let ParserMatchClass = VecListOneDAllLanesAsmOperand;
154}
Jim Grosbach13af2222011-11-30 18:21:25 +0000155// Register list of two D registers, with "all lanes" subscripting.
156def VecListTwoDAllLanesAsmOperand : AsmOperandClass {
157 let Name = "VecListTwoDAllLanes";
158 let ParserMethod = "parseVectorList";
159 let RenderMethod = "addVecListOperands";
160}
161def VecListTwoDAllLanes : RegisterOperand<DPR, "printVectorListTwoAllLanes"> {
162 let ParserMatchClass = VecListTwoDAllLanesAsmOperand;
163}
Jim Grosbach3471d4f2011-12-21 00:38:54 +0000164// Register list of two D registers spaced by 2 (two sequential Q registers).
165def VecListTwoQAllLanesAsmOperand : AsmOperandClass {
166 let Name = "VecListTwoQAllLanes";
167 let ParserMethod = "parseVectorList";
168 let RenderMethod = "addVecListOperands";
169}
170def VecListTwoQAllLanes : RegisterOperand<DPR,
171 "printVectorListTwoSpacedAllLanes"> {
172 let ParserMatchClass = VecListTwoQAllLanesAsmOperand;
173}
Jim Grosbach5e59f7e2012-01-24 23:47:04 +0000174// Register list of three D registers, with "all lanes" subscripting.
175def VecListThreeDAllLanesAsmOperand : AsmOperandClass {
176 let Name = "VecListThreeDAllLanes";
177 let ParserMethod = "parseVectorList";
178 let RenderMethod = "addVecListOperands";
179}
180def VecListThreeDAllLanes : RegisterOperand<DPR,
181 "printVectorListThreeAllLanes"> {
182 let ParserMatchClass = VecListThreeDAllLanesAsmOperand;
183}
184// Register list of three D registers spaced by 2 (three sequential Q regs).
185def VecListThreeQAllLanesAsmOperand : AsmOperandClass {
186 let Name = "VecListThreeQAllLanes";
187 let ParserMethod = "parseVectorList";
188 let RenderMethod = "addVecListOperands";
189}
190def VecListThreeQAllLanes : RegisterOperand<DPR,
191 "printVectorListThreeSpacedAllLanes"> {
192 let ParserMatchClass = VecListThreeQAllLanesAsmOperand;
193}
194
Jim Grosbach98b05a52011-11-30 01:09:44 +0000195
Jim Grosbach7636bf62011-12-02 00:35:16 +0000196// Register list of one D register, with byte lane subscripting.
197def VecListOneDByteIndexAsmOperand : AsmOperandClass {
198 let Name = "VecListOneDByteIndexed";
199 let ParserMethod = "parseVectorList";
200 let RenderMethod = "addVecListIndexedOperands";
201}
202def VecListOneDByteIndexed : Operand<i32> {
203 let ParserMatchClass = VecListOneDByteIndexAsmOperand;
204 let MIOperandInfo = (ops DPR:$Vd, i32imm:$idx);
205}
Jim Grosbach799ca9d2011-12-14 23:35:06 +0000206// ...with half-word lane subscripting.
207def VecListOneDHWordIndexAsmOperand : AsmOperandClass {
208 let Name = "VecListOneDHWordIndexed";
209 let ParserMethod = "parseVectorList";
210 let RenderMethod = "addVecListIndexedOperands";
211}
212def VecListOneDHWordIndexed : Operand<i32> {
213 let ParserMatchClass = VecListOneDHWordIndexAsmOperand;
214 let MIOperandInfo = (ops DPR:$Vd, i32imm:$idx);
215}
216// ...with word lane subscripting.
217def VecListOneDWordIndexAsmOperand : AsmOperandClass {
218 let Name = "VecListOneDWordIndexed";
219 let ParserMethod = "parseVectorList";
220 let RenderMethod = "addVecListIndexedOperands";
221}
222def VecListOneDWordIndexed : Operand<i32> {
223 let ParserMatchClass = VecListOneDWordIndexAsmOperand;
224 let MIOperandInfo = (ops DPR:$Vd, i32imm:$idx);
225}
Jim Grosbach3a678af2012-01-23 21:53:26 +0000226
Jim Grosbach95fad1c2011-12-20 19:21:26 +0000227// Register list of two D registers with byte lane subscripting.
Jim Grosbach9b1b3902011-12-14 23:25:46 +0000228def VecListTwoDByteIndexAsmOperand : AsmOperandClass {
229 let Name = "VecListTwoDByteIndexed";
230 let ParserMethod = "parseVectorList";
231 let RenderMethod = "addVecListIndexedOperands";
232}
233def VecListTwoDByteIndexed : Operand<i32> {
234 let ParserMatchClass = VecListTwoDByteIndexAsmOperand;
235 let MIOperandInfo = (ops DPR:$Vd, i32imm:$idx);
236}
Jim Grosbach799ca9d2011-12-14 23:35:06 +0000237// ...with half-word lane subscripting.
238def VecListTwoDHWordIndexAsmOperand : AsmOperandClass {
239 let Name = "VecListTwoDHWordIndexed";
240 let ParserMethod = "parseVectorList";
241 let RenderMethod = "addVecListIndexedOperands";
242}
243def VecListTwoDHWordIndexed : Operand<i32> {
244 let ParserMatchClass = VecListTwoDHWordIndexAsmOperand;
245 let MIOperandInfo = (ops DPR:$Vd, i32imm:$idx);
246}
247// ...with word lane subscripting.
248def VecListTwoDWordIndexAsmOperand : AsmOperandClass {
249 let Name = "VecListTwoDWordIndexed";
250 let ParserMethod = "parseVectorList";
251 let RenderMethod = "addVecListIndexedOperands";
252}
253def VecListTwoDWordIndexed : Operand<i32> {
254 let ParserMatchClass = VecListTwoDWordIndexAsmOperand;
255 let MIOperandInfo = (ops DPR:$Vd, i32imm:$idx);
256}
Jim Grosbach95fad1c2011-12-20 19:21:26 +0000257// Register list of two Q registers with half-word lane subscripting.
258def VecListTwoQHWordIndexAsmOperand : AsmOperandClass {
259 let Name = "VecListTwoQHWordIndexed";
260 let ParserMethod = "parseVectorList";
261 let RenderMethod = "addVecListIndexedOperands";
262}
263def VecListTwoQHWordIndexed : Operand<i32> {
264 let ParserMatchClass = VecListTwoQHWordIndexAsmOperand;
265 let MIOperandInfo = (ops DPR:$Vd, i32imm:$idx);
266}
267// ...with word lane subscripting.
268def VecListTwoQWordIndexAsmOperand : AsmOperandClass {
269 let Name = "VecListTwoQWordIndexed";
270 let ParserMethod = "parseVectorList";
271 let RenderMethod = "addVecListIndexedOperands";
272}
273def VecListTwoQWordIndexed : Operand<i32> {
274 let ParserMatchClass = VecListTwoQWordIndexAsmOperand;
275 let MIOperandInfo = (ops DPR:$Vd, i32imm:$idx);
276}
Jim Grosbach7636bf62011-12-02 00:35:16 +0000277
Jim Grosbach3a678af2012-01-23 21:53:26 +0000278
279// Register list of three D registers with byte lane subscripting.
280def VecListThreeDByteIndexAsmOperand : AsmOperandClass {
281 let Name = "VecListThreeDByteIndexed";
282 let ParserMethod = "parseVectorList";
283 let RenderMethod = "addVecListIndexedOperands";
284}
285def VecListThreeDByteIndexed : Operand<i32> {
286 let ParserMatchClass = VecListThreeDByteIndexAsmOperand;
287 let MIOperandInfo = (ops DPR:$Vd, i32imm:$idx);
288}
289// ...with half-word lane subscripting.
290def VecListThreeDHWordIndexAsmOperand : AsmOperandClass {
291 let Name = "VecListThreeDHWordIndexed";
292 let ParserMethod = "parseVectorList";
293 let RenderMethod = "addVecListIndexedOperands";
294}
295def VecListThreeDHWordIndexed : Operand<i32> {
296 let ParserMatchClass = VecListThreeDHWordIndexAsmOperand;
297 let MIOperandInfo = (ops DPR:$Vd, i32imm:$idx);
298}
299// ...with word lane subscripting.
300def VecListThreeDWordIndexAsmOperand : AsmOperandClass {
301 let Name = "VecListThreeDWordIndexed";
302 let ParserMethod = "parseVectorList";
303 let RenderMethod = "addVecListIndexedOperands";
304}
305def VecListThreeDWordIndexed : Operand<i32> {
306 let ParserMatchClass = VecListThreeDWordIndexAsmOperand;
307 let MIOperandInfo = (ops DPR:$Vd, i32imm:$idx);
308}
309// Register list of three Q registers with half-word lane subscripting.
310def VecListThreeQHWordIndexAsmOperand : AsmOperandClass {
311 let Name = "VecListThreeQHWordIndexed";
312 let ParserMethod = "parseVectorList";
313 let RenderMethod = "addVecListIndexedOperands";
314}
315def VecListThreeQHWordIndexed : Operand<i32> {
316 let ParserMatchClass = VecListThreeQHWordIndexAsmOperand;
317 let MIOperandInfo = (ops DPR:$Vd, i32imm:$idx);
318}
319// ...with word lane subscripting.
320def VecListThreeQWordIndexAsmOperand : AsmOperandClass {
321 let Name = "VecListThreeQWordIndexed";
322 let ParserMethod = "parseVectorList";
323 let RenderMethod = "addVecListIndexedOperands";
324}
325def VecListThreeQWordIndexed : Operand<i32> {
326 let ParserMatchClass = VecListThreeQWordIndexAsmOperand;
327 let MIOperandInfo = (ops DPR:$Vd, i32imm:$idx);
328}
329
Jim Grosbache983a132012-01-24 18:37:25 +0000330// Register list of four D registers with byte lane subscripting.
331def VecListFourDByteIndexAsmOperand : AsmOperandClass {
332 let Name = "VecListFourDByteIndexed";
333 let ParserMethod = "parseVectorList";
334 let RenderMethod = "addVecListIndexedOperands";
335}
336def VecListFourDByteIndexed : Operand<i32> {
337 let ParserMatchClass = VecListFourDByteIndexAsmOperand;
338 let MIOperandInfo = (ops DPR:$Vd, i32imm:$idx);
339}
340// ...with half-word lane subscripting.
341def VecListFourDHWordIndexAsmOperand : AsmOperandClass {
342 let Name = "VecListFourDHWordIndexed";
343 let ParserMethod = "parseVectorList";
344 let RenderMethod = "addVecListIndexedOperands";
345}
346def VecListFourDHWordIndexed : Operand<i32> {
347 let ParserMatchClass = VecListFourDHWordIndexAsmOperand;
348 let MIOperandInfo = (ops DPR:$Vd, i32imm:$idx);
349}
350// ...with word lane subscripting.
351def VecListFourDWordIndexAsmOperand : AsmOperandClass {
352 let Name = "VecListFourDWordIndexed";
353 let ParserMethod = "parseVectorList";
354 let RenderMethod = "addVecListIndexedOperands";
355}
356def VecListFourDWordIndexed : Operand<i32> {
357 let ParserMatchClass = VecListFourDWordIndexAsmOperand;
358 let MIOperandInfo = (ops DPR:$Vd, i32imm:$idx);
359}
360// Register list of four Q registers with half-word lane subscripting.
361def VecListFourQHWordIndexAsmOperand : AsmOperandClass {
362 let Name = "VecListFourQHWordIndexed";
363 let ParserMethod = "parseVectorList";
364 let RenderMethod = "addVecListIndexedOperands";
365}
366def VecListFourQHWordIndexed : Operand<i32> {
367 let ParserMatchClass = VecListFourQHWordIndexAsmOperand;
368 let MIOperandInfo = (ops DPR:$Vd, i32imm:$idx);
369}
370// ...with word lane subscripting.
371def VecListFourQWordIndexAsmOperand : AsmOperandClass {
372 let Name = "VecListFourQWordIndexed";
373 let ParserMethod = "parseVectorList";
374 let RenderMethod = "addVecListIndexedOperands";
375}
376def VecListFourQWordIndexed : Operand<i32> {
377 let ParserMatchClass = VecListFourQWordIndexAsmOperand;
378 let MIOperandInfo = (ops DPR:$Vd, i32imm:$idx);
379}
380
Jim Grosbach3a678af2012-01-23 21:53:26 +0000381
Bob Wilson5bafff32009-06-22 23:27:02 +0000382//===----------------------------------------------------------------------===//
383// NEON-specific DAG Nodes.
384//===----------------------------------------------------------------------===//
385
386def SDTARMVCMP : SDTypeProfile<1, 2, [SDTCisInt<0>, SDTCisSameAs<1, 2>]>;
Owen Andersonc24cb352010-11-08 23:21:22 +0000387def SDTARMVCMPZ : SDTypeProfile<1, 1, []>;
Bob Wilson5bafff32009-06-22 23:27:02 +0000388
389def NEONvceq : SDNode<"ARMISD::VCEQ", SDTARMVCMP>;
Owen Andersonc24cb352010-11-08 23:21:22 +0000390def NEONvceqz : SDNode<"ARMISD::VCEQZ", SDTARMVCMPZ>;
Bob Wilson5bafff32009-06-22 23:27:02 +0000391def NEONvcge : SDNode<"ARMISD::VCGE", SDTARMVCMP>;
Owen Andersonc24cb352010-11-08 23:21:22 +0000392def NEONvcgez : SDNode<"ARMISD::VCGEZ", SDTARMVCMPZ>;
393def NEONvclez : SDNode<"ARMISD::VCLEZ", SDTARMVCMPZ>;
Bob Wilson5bafff32009-06-22 23:27:02 +0000394def NEONvcgeu : SDNode<"ARMISD::VCGEU", SDTARMVCMP>;
395def NEONvcgt : SDNode<"ARMISD::VCGT", SDTARMVCMP>;
Owen Andersonc24cb352010-11-08 23:21:22 +0000396def NEONvcgtz : SDNode<"ARMISD::VCGTZ", SDTARMVCMPZ>;
397def NEONvcltz : SDNode<"ARMISD::VCLTZ", SDTARMVCMPZ>;
Bob Wilson5bafff32009-06-22 23:27:02 +0000398def NEONvcgtu : SDNode<"ARMISD::VCGTU", SDTARMVCMP>;
399def NEONvtst : SDNode<"ARMISD::VTST", SDTARMVCMP>;
400
401// Types for vector shift by immediates. The "SHX" version is for long and
402// narrow operations where the source and destination vectors have different
403// types. The "SHINS" version is for shift and insert operations.
404def SDTARMVSH : SDTypeProfile<1, 2, [SDTCisInt<0>, SDTCisSameAs<0, 1>,
405 SDTCisVT<2, i32>]>;
406def SDTARMVSHX : SDTypeProfile<1, 2, [SDTCisInt<0>, SDTCisInt<1>,
407 SDTCisVT<2, i32>]>;
408def SDTARMVSHINS : SDTypeProfile<1, 3, [SDTCisInt<0>, SDTCisSameAs<0, 1>,
409 SDTCisSameAs<0, 2>, SDTCisVT<3, i32>]>;
410
411def NEONvshl : SDNode<"ARMISD::VSHL", SDTARMVSH>;
412def NEONvshrs : SDNode<"ARMISD::VSHRs", SDTARMVSH>;
413def NEONvshru : SDNode<"ARMISD::VSHRu", SDTARMVSH>;
414def NEONvshlls : SDNode<"ARMISD::VSHLLs", SDTARMVSHX>;
415def NEONvshllu : SDNode<"ARMISD::VSHLLu", SDTARMVSHX>;
416def NEONvshlli : SDNode<"ARMISD::VSHLLi", SDTARMVSHX>;
417def NEONvshrn : SDNode<"ARMISD::VSHRN", SDTARMVSHX>;
418
419def NEONvrshrs : SDNode<"ARMISD::VRSHRs", SDTARMVSH>;
420def NEONvrshru : SDNode<"ARMISD::VRSHRu", SDTARMVSH>;
421def NEONvrshrn : SDNode<"ARMISD::VRSHRN", SDTARMVSHX>;
422
423def NEONvqshls : SDNode<"ARMISD::VQSHLs", SDTARMVSH>;
424def NEONvqshlu : SDNode<"ARMISD::VQSHLu", SDTARMVSH>;
425def NEONvqshlsu : SDNode<"ARMISD::VQSHLsu", SDTARMVSH>;
426def NEONvqshrns : SDNode<"ARMISD::VQSHRNs", SDTARMVSHX>;
427def NEONvqshrnu : SDNode<"ARMISD::VQSHRNu", SDTARMVSHX>;
428def NEONvqshrnsu : SDNode<"ARMISD::VQSHRNsu", SDTARMVSHX>;
429
430def NEONvqrshrns : SDNode<"ARMISD::VQRSHRNs", SDTARMVSHX>;
431def NEONvqrshrnu : SDNode<"ARMISD::VQRSHRNu", SDTARMVSHX>;
432def NEONvqrshrnsu : SDNode<"ARMISD::VQRSHRNsu", SDTARMVSHX>;
433
434def NEONvsli : SDNode<"ARMISD::VSLI", SDTARMVSHINS>;
435def NEONvsri : SDNode<"ARMISD::VSRI", SDTARMVSHINS>;
436
437def SDTARMVGETLN : SDTypeProfile<1, 2, [SDTCisVT<0, i32>, SDTCisInt<1>,
438 SDTCisVT<2, i32>]>;
439def NEONvgetlaneu : SDNode<"ARMISD::VGETLANEu", SDTARMVGETLN>;
440def NEONvgetlanes : SDNode<"ARMISD::VGETLANEs", SDTARMVGETLN>;
441
Bob Wilson7e3f0d22010-07-14 06:31:50 +0000442def SDTARMVMOVIMM : SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisVT<1, i32>]>;
443def NEONvmovImm : SDNode<"ARMISD::VMOVIMM", SDTARMVMOVIMM>;
444def NEONvmvnImm : SDNode<"ARMISD::VMVNIMM", SDTARMVMOVIMM>;
Evan Chengeaa192a2011-11-15 02:12:34 +0000445def NEONvmovFPImm : SDNode<"ARMISD::VMOVFPIMM", SDTARMVMOVIMM>;
Bob Wilson7e3f0d22010-07-14 06:31:50 +0000446
Owen Andersond9668172010-11-03 22:44:51 +0000447def SDTARMVORRIMM : SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0, 1>,
448 SDTCisVT<2, i32>]>;
449def NEONvorrImm : SDNode<"ARMISD::VORRIMM", SDTARMVORRIMM>;
Owen Anderson080c0922010-11-05 19:27:46 +0000450def NEONvbicImm : SDNode<"ARMISD::VBICIMM", SDTARMVORRIMM>;
Owen Andersond9668172010-11-03 22:44:51 +0000451
Cameron Zwarichc0e6d782011-03-30 23:01:21 +0000452def NEONvbsl : SDNode<"ARMISD::VBSL",
453 SDTypeProfile<1, 3, [SDTCisVec<0>,
454 SDTCisSameAs<0, 1>,
455 SDTCisSameAs<0, 2>,
456 SDTCisSameAs<0, 3>]>>;
457
Bob Wilsonc1d287b2009-08-14 05:13:08 +0000458def NEONvdup : SDNode<"ARMISD::VDUP", SDTypeProfile<1, 1, [SDTCisVec<0>]>>;
459
Bob Wilson0ce37102009-08-14 05:08:32 +0000460// VDUPLANE can produce a quad-register result from a double-register source,
461// so the result is not constrained to match the source.
462def NEONvduplane : SDNode<"ARMISD::VDUPLANE",
463 SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisVec<1>,
464 SDTCisVT<2, i32>]>>;
Bob Wilson5bafff32009-06-22 23:27:02 +0000465
Bob Wilsonde95c1b82009-08-19 17:03:43 +0000466def SDTARMVEXT : SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisSameAs<0, 1>,
467 SDTCisSameAs<0, 2>, SDTCisVT<3, i32>]>;
468def NEONvext : SDNode<"ARMISD::VEXT", SDTARMVEXT>;
469
Bob Wilsond8e17572009-08-12 22:31:50 +0000470def SDTARMVSHUF : SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisSameAs<0, 1>]>;
471def NEONvrev64 : SDNode<"ARMISD::VREV64", SDTARMVSHUF>;
472def NEONvrev32 : SDNode<"ARMISD::VREV32", SDTARMVSHUF>;
473def NEONvrev16 : SDNode<"ARMISD::VREV16", SDTARMVSHUF>;
474
Anton Korobeynikov62e84f12009-08-21 12:40:50 +0000475def SDTARMVSHUF2 : SDTypeProfile<2, 2, [SDTCisVec<0>, SDTCisSameAs<0, 1>,
Bob Wilson9abe19d2010-02-17 00:31:29 +0000476 SDTCisSameAs<0, 2>,
477 SDTCisSameAs<0, 3>]>;
Anton Korobeynikov051cfd62009-08-21 12:41:42 +0000478def NEONzip : SDNode<"ARMISD::VZIP", SDTARMVSHUF2>;
479def NEONuzp : SDNode<"ARMISD::VUZP", SDTARMVSHUF2>;
480def NEONtrn : SDNode<"ARMISD::VTRN", SDTARMVSHUF2>;
Anton Korobeynikov62e84f12009-08-21 12:40:50 +0000481
Bob Wilsond0b69cf2010-09-01 23:50:19 +0000482def SDTARMVMULL : SDTypeProfile<1, 2, [SDTCisInt<0>, SDTCisInt<1>,
483 SDTCisSameAs<1, 2>]>;
484def NEONvmulls : SDNode<"ARMISD::VMULLs", SDTARMVMULL>;
485def NEONvmullu : SDNode<"ARMISD::VMULLu", SDTARMVMULL>;
486
Bob Wilson9f6c4c12010-02-18 06:05:53 +0000487def SDTARMFMAX : SDTypeProfile<1, 2, [SDTCisVT<0, f32>, SDTCisSameAs<0, 1>,
488 SDTCisSameAs<0, 2>]>;
489def NEONfmax : SDNode<"ARMISD::FMAX", SDTARMFMAX>;
490def NEONfmin : SDNode<"ARMISD::FMIN", SDTARMFMAX>;
491
Bob Wilsoncba270d2010-07-13 21:16:48 +0000492def NEONimmAllZerosV: PatLeaf<(NEONvmovImm (i32 timm)), [{
493 ConstantSDNode *ConstVal = cast<ConstantSDNode>(N->getOperand(0));
Daniel Dunbar425f6342010-07-31 21:08:54 +0000494 unsigned EltBits = 0;
Bob Wilsoncba270d2010-07-13 21:16:48 +0000495 uint64_t EltVal = ARM_AM::decodeNEONModImm(ConstVal->getZExtValue(), EltBits);
496 return (EltBits == 32 && EltVal == 0);
497}]>;
498
499def NEONimmAllOnesV: PatLeaf<(NEONvmovImm (i32 timm)), [{
500 ConstantSDNode *ConstVal = cast<ConstantSDNode>(N->getOperand(0));
Daniel Dunbar425f6342010-07-31 21:08:54 +0000501 unsigned EltBits = 0;
Bob Wilsoncba270d2010-07-13 21:16:48 +0000502 uint64_t EltVal = ARM_AM::decodeNEONModImm(ConstVal->getZExtValue(), EltBits);
503 return (EltBits == 8 && EltVal == 0xff);
504}]>;
505
Bob Wilson5bafff32009-06-22 23:27:02 +0000506//===----------------------------------------------------------------------===//
Bob Wilson5bafff32009-06-22 23:27:02 +0000507// NEON load / store instructions
508//===----------------------------------------------------------------------===//
509
Bob Wilson9d4ebc02010-09-16 00:31:02 +0000510// Use VLDM to load a Q register as a D register pair.
511// This is a pseudo instruction that is expanded to VLDMD after reg alloc.
Bill Wendling73fe34a2010-11-16 01:16:36 +0000512def VLDMQIA
513 : PseudoVFPLdStM<(outs QPR:$dst), (ins GPR:$Rn),
514 IIC_fpLoad_m, "",
515 [(set QPR:$dst, (v2f64 (load GPR:$Rn)))]>;
Evan Cheng69b9f982010-05-13 01:12:06 +0000516
Bob Wilson9d4ebc02010-09-16 00:31:02 +0000517// Use VSTM to store a Q register as a D register pair.
518// This is a pseudo instruction that is expanded to VSTMD after reg alloc.
Bill Wendling73fe34a2010-11-16 01:16:36 +0000519def VSTMQIA
520 : PseudoVFPLdStM<(outs), (ins QPR:$src, GPR:$Rn),
521 IIC_fpStore_m, "",
522 [(store (v2f64 QPR:$src), GPR:$Rn)]>;
Evan Cheng69b9f982010-05-13 01:12:06 +0000523
Bob Wilsonffde0802010-09-02 16:00:54 +0000524// Classes for VLD* pseudo-instructions with multi-register operands.
525// These are expanded to real instructions after register allocation.
Bob Wilson9d84fb32010-09-14 20:59:49 +0000526class VLDQPseudo<InstrItinClass itin>
527 : PseudoNLdSt<(outs QPR:$dst), (ins addrmode6:$addr), itin, "">;
528class VLDQWBPseudo<InstrItinClass itin>
Bob Wilsonffde0802010-09-02 16:00:54 +0000529 : PseudoNLdSt<(outs QPR:$dst, GPR:$wb),
Bob Wilson9d84fb32010-09-14 20:59:49 +0000530 (ins addrmode6:$addr, am6offset:$offset), itin,
Bob Wilsonffde0802010-09-02 16:00:54 +0000531 "$addr.addr = $wb">;
Jim Grosbach10b90a92011-10-24 21:45:13 +0000532class VLDQWBfixedPseudo<InstrItinClass itin>
533 : PseudoNLdSt<(outs QPR:$dst, GPR:$wb),
534 (ins addrmode6:$addr), itin,
535 "$addr.addr = $wb">;
536class VLDQWBregisterPseudo<InstrItinClass itin>
537 : PseudoNLdSt<(outs QPR:$dst, GPR:$wb),
538 (ins addrmode6:$addr, rGPR:$offset), itin,
539 "$addr.addr = $wb">;
Jim Grosbacha4e3c7f2011-12-09 21:28:25 +0000540
Bob Wilson9d84fb32010-09-14 20:59:49 +0000541class VLDQQPseudo<InstrItinClass itin>
542 : PseudoNLdSt<(outs QQPR:$dst), (ins addrmode6:$addr), itin, "">;
543class VLDQQWBPseudo<InstrItinClass itin>
Bob Wilsonffde0802010-09-02 16:00:54 +0000544 : PseudoNLdSt<(outs QQPR:$dst, GPR:$wb),
Bob Wilson9d84fb32010-09-14 20:59:49 +0000545 (ins addrmode6:$addr, am6offset:$offset), itin,
Bob Wilsonffde0802010-09-02 16:00:54 +0000546 "$addr.addr = $wb">;
Jim Grosbacha4e3c7f2011-12-09 21:28:25 +0000547class VLDQQWBfixedPseudo<InstrItinClass itin>
548 : PseudoNLdSt<(outs QQPR:$dst, GPR:$wb),
549 (ins addrmode6:$addr), itin,
550 "$addr.addr = $wb">;
551class VLDQQWBregisterPseudo<InstrItinClass itin>
552 : PseudoNLdSt<(outs QQPR:$dst, GPR:$wb),
553 (ins addrmode6:$addr, rGPR:$offset), itin,
554 "$addr.addr = $wb">;
555
556
Bob Wilson7de68142011-02-07 17:43:15 +0000557class VLDQQQQPseudo<InstrItinClass itin>
Bob Wilson9a450082011-08-05 07:24:09 +0000558 : PseudoNLdSt<(outs QQQQPR:$dst), (ins addrmode6:$addr, QQQQPR:$src),itin,
559 "$src = $dst">;
Bob Wilson9d84fb32010-09-14 20:59:49 +0000560class VLDQQQQWBPseudo<InstrItinClass itin>
Bob Wilsonf5721912010-09-03 18:16:02 +0000561 : PseudoNLdSt<(outs QQQQPR:$dst, GPR:$wb),
Bob Wilson9d84fb32010-09-14 20:59:49 +0000562 (ins addrmode6:$addr, am6offset:$offset, QQQQPR:$src), itin,
Bob Wilsonf5721912010-09-03 18:16:02 +0000563 "$addr.addr = $wb, $src = $dst">;
Bob Wilsonffde0802010-09-02 16:00:54 +0000564
Bob Wilson2a0e9742010-11-27 06:35:16 +0000565let mayLoad = 1, neverHasSideEffects = 1, hasExtraDefRegAllocReq = 1 in {
566
Bob Wilson205a5ca2009-07-08 18:11:30 +0000567// VLD1 : Vector Load (multiple single elements)
Bob Wilson621f1952010-03-23 05:25:43 +0000568class VLD1D<bits<4> op7_4, string Dt>
Jim Grosbach6b09c772011-10-20 15:04:25 +0000569 : NLdSt<0,0b10,0b0111,op7_4, (outs VecListOneD:$Vd),
Owen Andersonf431eda2010-11-02 23:47:29 +0000570 (ins addrmode6:$Rn), IIC_VLD1,
Jim Grosbach6b09c772011-10-20 15:04:25 +0000571 "vld1", Dt, "$Vd, $Rn", "", []> {
Owen Andersonf431eda2010-11-02 23:47:29 +0000572 let Rm = 0b1111;
573 let Inst{4} = Rn{4};
Owen Anderson8d7d2e12011-08-09 20:55:18 +0000574 let DecoderMethod = "DecodeVLDInstruction";
Owen Andersond9aa7d32010-11-02 00:05:05 +0000575}
Bob Wilson621f1952010-03-23 05:25:43 +0000576class VLD1Q<bits<4> op7_4, string Dt>
Jim Grosbach280dfad2011-10-21 18:54:25 +0000577 : NLdSt<0,0b10,0b1010,op7_4, (outs VecListTwoD:$Vd),
Owen Andersonf431eda2010-11-02 23:47:29 +0000578 (ins addrmode6:$Rn), IIC_VLD1x2,
Jim Grosbach280dfad2011-10-21 18:54:25 +0000579 "vld1", Dt, "$Vd, $Rn", "", []> {
Owen Andersonf431eda2010-11-02 23:47:29 +0000580 let Rm = 0b1111;
581 let Inst{5-4} = Rn{5-4};
Owen Anderson8d7d2e12011-08-09 20:55:18 +0000582 let DecoderMethod = "DecodeVLDInstruction";
Owen Andersond9aa7d32010-11-02 00:05:05 +0000583}
Bob Wilson205a5ca2009-07-08 18:11:30 +0000584
Owen Andersond9aa7d32010-11-02 00:05:05 +0000585def VLD1d8 : VLD1D<{0,0,0,?}, "8">;
586def VLD1d16 : VLD1D<{0,1,0,?}, "16">;
587def VLD1d32 : VLD1D<{1,0,0,?}, "32">;
588def VLD1d64 : VLD1D<{1,1,0,?}, "64">;
Bob Wilson205a5ca2009-07-08 18:11:30 +0000589
Owen Andersond9aa7d32010-11-02 00:05:05 +0000590def VLD1q8 : VLD1Q<{0,0,?,?}, "8">;
591def VLD1q16 : VLD1Q<{0,1,?,?}, "16">;
592def VLD1q32 : VLD1Q<{1,0,?,?}, "32">;
593def VLD1q64 : VLD1Q<{1,1,?,?}, "64">;
Bob Wilson99493b22010-03-20 17:59:03 +0000594
Evan Chengd2ca8132010-10-09 01:03:04 +0000595def VLD1q8Pseudo : VLDQPseudo<IIC_VLD1x2>;
596def VLD1q16Pseudo : VLDQPseudo<IIC_VLD1x2>;
597def VLD1q32Pseudo : VLDQPseudo<IIC_VLD1x2>;
598def VLD1q64Pseudo : VLDQPseudo<IIC_VLD1x2>;
Bob Wilsonffde0802010-09-02 16:00:54 +0000599
Bob Wilson99493b22010-03-20 17:59:03 +0000600// ...with address register writeback:
Jim Grosbach10b90a92011-10-24 21:45:13 +0000601multiclass VLD1DWB<bits<4> op7_4, string Dt> {
602 def _fixed : NLdSt<0,0b10, 0b0111,op7_4, (outs VecListOneD:$Vd, GPR:$wb),
603 (ins addrmode6:$Rn), IIC_VLD1u,
604 "vld1", Dt, "$Vd, $Rn!",
605 "$Rn.addr = $wb", []> {
606 let Rm = 0b1101; // NLdSt will assign to the right encoding bits.
607 let Inst{4} = Rn{4};
608 let DecoderMethod = "DecodeVLDInstruction";
Jim Grosbach12431322011-10-24 22:16:58 +0000609 let AsmMatchConverter = "cvtVLDwbFixed";
Jim Grosbach10b90a92011-10-24 21:45:13 +0000610 }
611 def _register : NLdSt<0,0b10,0b0111,op7_4, (outs VecListOneD:$Vd, GPR:$wb),
612 (ins addrmode6:$Rn, rGPR:$Rm), IIC_VLD1u,
613 "vld1", Dt, "$Vd, $Rn, $Rm",
614 "$Rn.addr = $wb", []> {
615 let Inst{4} = Rn{4};
616 let DecoderMethod = "DecodeVLDInstruction";
Jim Grosbach12431322011-10-24 22:16:58 +0000617 let AsmMatchConverter = "cvtVLDwbRegister";
Jim Grosbach10b90a92011-10-24 21:45:13 +0000618 }
Owen Andersone85bd772010-11-02 00:24:52 +0000619}
Jim Grosbach10b90a92011-10-24 21:45:13 +0000620multiclass VLD1QWB<bits<4> op7_4, string Dt> {
621 def _fixed : NLdSt<0,0b10,0b1010,op7_4, (outs VecListTwoD:$Vd, GPR:$wb),
622 (ins addrmode6:$Rn), IIC_VLD1x2u,
623 "vld1", Dt, "$Vd, $Rn!",
624 "$Rn.addr = $wb", []> {
625 let Rm = 0b1101; // NLdSt will assign to the right encoding bits.
626 let Inst{5-4} = Rn{5-4};
627 let DecoderMethod = "DecodeVLDInstruction";
Jim Grosbach12431322011-10-24 22:16:58 +0000628 let AsmMatchConverter = "cvtVLDwbFixed";
Jim Grosbach10b90a92011-10-24 21:45:13 +0000629 }
630 def _register : NLdSt<0,0b10,0b1010,op7_4, (outs VecListTwoD:$Vd, GPR:$wb),
631 (ins addrmode6:$Rn, rGPR:$Rm), IIC_VLD1x2u,
632 "vld1", Dt, "$Vd, $Rn, $Rm",
633 "$Rn.addr = $wb", []> {
634 let Inst{5-4} = Rn{5-4};
635 let DecoderMethod = "DecodeVLDInstruction";
Jim Grosbach12431322011-10-24 22:16:58 +0000636 let AsmMatchConverter = "cvtVLDwbRegister";
Jim Grosbach10b90a92011-10-24 21:45:13 +0000637 }
Owen Andersone85bd772010-11-02 00:24:52 +0000638}
Bob Wilson99493b22010-03-20 17:59:03 +0000639
Jim Grosbach10b90a92011-10-24 21:45:13 +0000640defm VLD1d8wb : VLD1DWB<{0,0,0,?}, "8">;
641defm VLD1d16wb : VLD1DWB<{0,1,0,?}, "16">;
642defm VLD1d32wb : VLD1DWB<{1,0,0,?}, "32">;
643defm VLD1d64wb : VLD1DWB<{1,1,0,?}, "64">;
644defm VLD1q8wb : VLD1QWB<{0,0,?,?}, "8">;
645defm VLD1q16wb : VLD1QWB<{0,1,?,?}, "16">;
646defm VLD1q32wb : VLD1QWB<{1,0,?,?}, "32">;
647defm VLD1q64wb : VLD1QWB<{1,1,?,?}, "64">;
Bob Wilson99493b22010-03-20 17:59:03 +0000648
Jim Grosbach10b90a92011-10-24 21:45:13 +0000649def VLD1q8PseudoWB_fixed : VLDQWBfixedPseudo<IIC_VLD1x2u>;
650def VLD1q16PseudoWB_fixed : VLDQWBfixedPseudo<IIC_VLD1x2u>;
651def VLD1q32PseudoWB_fixed : VLDQWBfixedPseudo<IIC_VLD1x2u>;
652def VLD1q64PseudoWB_fixed : VLDQWBfixedPseudo<IIC_VLD1x2u>;
653def VLD1q8PseudoWB_register : VLDQWBregisterPseudo<IIC_VLD1x2u>;
654def VLD1q16PseudoWB_register : VLDQWBregisterPseudo<IIC_VLD1x2u>;
655def VLD1q32PseudoWB_register : VLDQWBregisterPseudo<IIC_VLD1x2u>;
656def VLD1q64PseudoWB_register : VLDQWBregisterPseudo<IIC_VLD1x2u>;
Bob Wilsonffde0802010-09-02 16:00:54 +0000657
Jim Grosbachfe7b4992011-10-21 16:14:12 +0000658// ...with 3 registers
Bob Wilson95808322010-03-18 20:18:39 +0000659class VLD1D3<bits<4> op7_4, string Dt>
Jim Grosbachcdcfa282011-10-21 20:02:19 +0000660 : NLdSt<0,0b10,0b0110,op7_4, (outs VecListThreeD:$Vd),
Owen Andersonf431eda2010-11-02 23:47:29 +0000661 (ins addrmode6:$Rn), IIC_VLD1x3, "vld1", Dt,
Jim Grosbachcdcfa282011-10-21 20:02:19 +0000662 "$Vd, $Rn", "", []> {
Owen Andersonf431eda2010-11-02 23:47:29 +0000663 let Rm = 0b1111;
664 let Inst{4} = Rn{4};
Owen Anderson8d7d2e12011-08-09 20:55:18 +0000665 let DecoderMethod = "DecodeVLDInstruction";
Owen Andersone85bd772010-11-02 00:24:52 +0000666}
Jim Grosbach59216752011-10-24 23:26:05 +0000667multiclass VLD1D3WB<bits<4> op7_4, string Dt> {
668 def _fixed : NLdSt<0,0b10,0b0110, op7_4, (outs VecListThreeD:$Vd, GPR:$wb),
669 (ins addrmode6:$Rn), IIC_VLD1x2u,
670 "vld1", Dt, "$Vd, $Rn!",
671 "$Rn.addr = $wb", []> {
672 let Rm = 0b1101; // NLdSt will assign to the right encoding bits.
Owen Andersonb3727fe2011-10-28 20:43:24 +0000673 let Inst{4} = Rn{4};
Jim Grosbach59216752011-10-24 23:26:05 +0000674 let DecoderMethod = "DecodeVLDInstruction";
675 let AsmMatchConverter = "cvtVLDwbFixed";
676 }
677 def _register : NLdSt<0,0b10,0b0110,op7_4, (outs VecListThreeD:$Vd, GPR:$wb),
678 (ins addrmode6:$Rn, rGPR:$Rm), IIC_VLD1x2u,
679 "vld1", Dt, "$Vd, $Rn, $Rm",
680 "$Rn.addr = $wb", []> {
Owen Andersonb3727fe2011-10-28 20:43:24 +0000681 let Inst{4} = Rn{4};
Jim Grosbach59216752011-10-24 23:26:05 +0000682 let DecoderMethod = "DecodeVLDInstruction";
683 let AsmMatchConverter = "cvtVLDwbRegister";
684 }
Owen Andersone85bd772010-11-02 00:24:52 +0000685}
Bob Wilson052ba452010-03-22 18:22:06 +0000686
Owen Andersone85bd772010-11-02 00:24:52 +0000687def VLD1d8T : VLD1D3<{0,0,0,?}, "8">;
688def VLD1d16T : VLD1D3<{0,1,0,?}, "16">;
689def VLD1d32T : VLD1D3<{1,0,0,?}, "32">;
690def VLD1d64T : VLD1D3<{1,1,0,?}, "64">;
Bob Wilson052ba452010-03-22 18:22:06 +0000691
Jim Grosbach59216752011-10-24 23:26:05 +0000692defm VLD1d8Twb : VLD1D3WB<{0,0,0,?}, "8">;
693defm VLD1d16Twb : VLD1D3WB<{0,1,0,?}, "16">;
694defm VLD1d32Twb : VLD1D3WB<{1,0,0,?}, "32">;
695defm VLD1d64Twb : VLD1D3WB<{1,1,0,?}, "64">;
Bob Wilson052ba452010-03-22 18:22:06 +0000696
Jim Grosbach59216752011-10-24 23:26:05 +0000697def VLD1d64TPseudo : VLDQQPseudo<IIC_VLD1x3>;
Bob Wilsonffde0802010-09-02 16:00:54 +0000698
Jim Grosbachfe7b4992011-10-21 16:14:12 +0000699// ...with 4 registers
Bob Wilson052ba452010-03-22 18:22:06 +0000700class VLD1D4<bits<4> op7_4, string Dt>
Jim Grosbachb6310312011-10-21 20:35:01 +0000701 : NLdSt<0, 0b10, 0b0010, op7_4, (outs VecListFourD:$Vd),
Owen Andersonf431eda2010-11-02 23:47:29 +0000702 (ins addrmode6:$Rn), IIC_VLD1x4, "vld1", Dt,
Jim Grosbachb6310312011-10-21 20:35:01 +0000703 "$Vd, $Rn", "", []> {
Owen Andersonf431eda2010-11-02 23:47:29 +0000704 let Rm = 0b1111;
705 let Inst{5-4} = Rn{5-4};
Owen Anderson8d7d2e12011-08-09 20:55:18 +0000706 let DecoderMethod = "DecodeVLDInstruction";
Owen Andersone85bd772010-11-02 00:24:52 +0000707}
Jim Grosbach399cdca2011-10-25 00:14:01 +0000708multiclass VLD1D4WB<bits<4> op7_4, string Dt> {
709 def _fixed : NLdSt<0,0b10,0b0010, op7_4, (outs VecListFourD:$Vd, GPR:$wb),
710 (ins addrmode6:$Rn), IIC_VLD1x2u,
711 "vld1", Dt, "$Vd, $Rn!",
712 "$Rn.addr = $wb", []> {
713 let Rm = 0b1101; // NLdSt will assign to the right encoding bits.
714 let Inst{5-4} = Rn{5-4};
715 let DecoderMethod = "DecodeVLDInstruction";
716 let AsmMatchConverter = "cvtVLDwbFixed";
717 }
718 def _register : NLdSt<0,0b10,0b0010,op7_4, (outs VecListFourD:$Vd, GPR:$wb),
719 (ins addrmode6:$Rn, rGPR:$Rm), IIC_VLD1x2u,
720 "vld1", Dt, "$Vd, $Rn, $Rm",
721 "$Rn.addr = $wb", []> {
722 let Inst{5-4} = Rn{5-4};
723 let DecoderMethod = "DecodeVLDInstruction";
724 let AsmMatchConverter = "cvtVLDwbRegister";
725 }
Owen Andersone85bd772010-11-02 00:24:52 +0000726}
Johnny Chend7283d92010-02-23 20:51:23 +0000727
Owen Andersone85bd772010-11-02 00:24:52 +0000728def VLD1d8Q : VLD1D4<{0,0,?,?}, "8">;
729def VLD1d16Q : VLD1D4<{0,1,?,?}, "16">;
730def VLD1d32Q : VLD1D4<{1,0,?,?}, "32">;
731def VLD1d64Q : VLD1D4<{1,1,?,?}, "64">;
Bob Wilson99493b22010-03-20 17:59:03 +0000732
Jim Grosbach399cdca2011-10-25 00:14:01 +0000733defm VLD1d8Qwb : VLD1D4WB<{0,0,?,?}, "8">;
734defm VLD1d16Qwb : VLD1D4WB<{0,1,?,?}, "16">;
735defm VLD1d32Qwb : VLD1D4WB<{1,0,?,?}, "32">;
736defm VLD1d64Qwb : VLD1D4WB<{1,1,?,?}, "64">;
Bob Wilson9f7d60f2009-08-12 17:04:56 +0000737
Jim Grosbach399cdca2011-10-25 00:14:01 +0000738def VLD1d64QPseudo : VLDQQPseudo<IIC_VLD1x4>;
Bob Wilsonffde0802010-09-02 16:00:54 +0000739
Bob Wilson4a3d35a2009-08-05 00:49:09 +0000740// VLD2 : Vector Load (multiple 2-element structures)
Jim Grosbach2af50d92011-12-09 19:07:20 +0000741class VLD2<bits<4> op11_8, bits<4> op7_4, string Dt, RegisterOperand VdTy,
742 InstrItinClass itin>
Jim Grosbach4661d4c2011-10-21 22:21:10 +0000743 : NLdSt<0, 0b10, op11_8, op7_4, (outs VdTy:$Vd),
Jim Grosbach2af50d92011-12-09 19:07:20 +0000744 (ins addrmode6:$Rn), itin,
Jim Grosbach224180e2011-10-21 23:58:57 +0000745 "vld2", Dt, "$Vd, $Rn", "", []> {
Owen Andersonf431eda2010-11-02 23:47:29 +0000746 let Rm = 0b1111;
747 let Inst{5-4} = Rn{5-4};
Owen Anderson8d7d2e12011-08-09 20:55:18 +0000748 let DecoderMethod = "DecodeVLDInstruction";
Owen Andersoncf667be2010-11-02 01:24:55 +0000749}
Bob Wilson4a3d35a2009-08-05 00:49:09 +0000750
Jim Grosbach2af50d92011-12-09 19:07:20 +0000751def VLD2d8 : VLD2<0b1000, {0,0,?,?}, "8", VecListTwoD, IIC_VLD2>;
752def VLD2d16 : VLD2<0b1000, {0,1,?,?}, "16", VecListTwoD, IIC_VLD2>;
753def VLD2d32 : VLD2<0b1000, {1,0,?,?}, "32", VecListTwoD, IIC_VLD2>;
Bob Wilson4a3d35a2009-08-05 00:49:09 +0000754
Jim Grosbach2af50d92011-12-09 19:07:20 +0000755def VLD2q8 : VLD2<0b0011, {0,0,?,?}, "8", VecListFourD, IIC_VLD2x2>;
756def VLD2q16 : VLD2<0b0011, {0,1,?,?}, "16", VecListFourD, IIC_VLD2x2>;
757def VLD2q32 : VLD2<0b0011, {1,0,?,?}, "32", VecListFourD, IIC_VLD2x2>;
Bob Wilson3bf12ab2009-10-06 22:01:59 +0000758
Bob Wilson9d84fb32010-09-14 20:59:49 +0000759def VLD2d8Pseudo : VLDQPseudo<IIC_VLD2>;
760def VLD2d16Pseudo : VLDQPseudo<IIC_VLD2>;
761def VLD2d32Pseudo : VLDQPseudo<IIC_VLD2>;
Bob Wilsonffde0802010-09-02 16:00:54 +0000762
Evan Chengd2ca8132010-10-09 01:03:04 +0000763def VLD2q8Pseudo : VLDQQPseudo<IIC_VLD2x2>;
764def VLD2q16Pseudo : VLDQQPseudo<IIC_VLD2x2>;
765def VLD2q32Pseudo : VLDQQPseudo<IIC_VLD2x2>;
Bob Wilsonffde0802010-09-02 16:00:54 +0000766
Bob Wilson92cb9322010-03-20 20:10:51 +0000767// ...with address register writeback:
Jim Grosbacha4e3c7f2011-12-09 21:28:25 +0000768multiclass VLD2WB<bits<4> op11_8, bits<4> op7_4, string Dt,
769 RegisterOperand VdTy, InstrItinClass itin> {
770 def _fixed : NLdSt<0, 0b10, op11_8, op7_4, (outs VdTy:$Vd, GPR:$wb),
771 (ins addrmode6:$Rn), itin,
772 "vld2", Dt, "$Vd, $Rn!",
773 "$Rn.addr = $wb", []> {
774 let Rm = 0b1101; // NLdSt will assign to the right encoding bits.
775 let Inst{5-4} = Rn{5-4};
776 let DecoderMethod = "DecodeVLDInstruction";
777 let AsmMatchConverter = "cvtVLDwbFixed";
778 }
779 def _register : NLdSt<0, 0b10, op11_8, op7_4, (outs VdTy:$Vd, GPR:$wb),
780 (ins addrmode6:$Rn, rGPR:$Rm), itin,
781 "vld2", Dt, "$Vd, $Rn, $Rm",
782 "$Rn.addr = $wb", []> {
783 let Inst{5-4} = Rn{5-4};
784 let DecoderMethod = "DecodeVLDInstruction";
785 let AsmMatchConverter = "cvtVLDwbRegister";
786 }
Owen Andersoncf667be2010-11-02 01:24:55 +0000787}
Bob Wilson92cb9322010-03-20 20:10:51 +0000788
Jim Grosbacha4e3c7f2011-12-09 21:28:25 +0000789defm VLD2d8wb : VLD2WB<0b1000, {0,0,?,?}, "8", VecListTwoD, IIC_VLD2u>;
790defm VLD2d16wb : VLD2WB<0b1000, {0,1,?,?}, "16", VecListTwoD, IIC_VLD2u>;
791defm VLD2d32wb : VLD2WB<0b1000, {1,0,?,?}, "32", VecListTwoD, IIC_VLD2u>;
Bob Wilson92cb9322010-03-20 20:10:51 +0000792
Jim Grosbacha4e3c7f2011-12-09 21:28:25 +0000793defm VLD2q8wb : VLD2WB<0b0011, {0,0,?,?}, "8", VecListFourD, IIC_VLD2x2u>;
794defm VLD2q16wb : VLD2WB<0b0011, {0,1,?,?}, "16", VecListFourD, IIC_VLD2x2u>;
795defm VLD2q32wb : VLD2WB<0b0011, {1,0,?,?}, "32", VecListFourD, IIC_VLD2x2u>;
Bob Wilson92cb9322010-03-20 20:10:51 +0000796
Jim Grosbacha4e3c7f2011-12-09 21:28:25 +0000797def VLD2d8PseudoWB_fixed : VLDQWBfixedPseudo<IIC_VLD2u>;
798def VLD2d16PseudoWB_fixed : VLDQWBfixedPseudo<IIC_VLD2u>;
799def VLD2d32PseudoWB_fixed : VLDQWBfixedPseudo<IIC_VLD2u>;
800def VLD2d8PseudoWB_register : VLDQWBregisterPseudo<IIC_VLD2u>;
801def VLD2d16PseudoWB_register : VLDQWBregisterPseudo<IIC_VLD2u>;
802def VLD2d32PseudoWB_register : VLDQWBregisterPseudo<IIC_VLD2u>;
Bob Wilsonffde0802010-09-02 16:00:54 +0000803
Jim Grosbacha4e3c7f2011-12-09 21:28:25 +0000804def VLD2q8PseudoWB_fixed : VLDQQWBfixedPseudo<IIC_VLD2x2u>;
805def VLD2q16PseudoWB_fixed : VLDQQWBfixedPseudo<IIC_VLD2x2u>;
806def VLD2q32PseudoWB_fixed : VLDQQWBfixedPseudo<IIC_VLD2x2u>;
807def VLD2q8PseudoWB_register : VLDQQWBregisterPseudo<IIC_VLD2x2u>;
808def VLD2q16PseudoWB_register : VLDQQWBregisterPseudo<IIC_VLD2x2u>;
809def VLD2q32PseudoWB_register : VLDQQWBregisterPseudo<IIC_VLD2x2u>;
Bob Wilsonffde0802010-09-02 16:00:54 +0000810
Jim Grosbachfe7b4992011-10-21 16:14:12 +0000811// ...with double-spaced registers
Jim Grosbacha4e3c7f2011-12-09 21:28:25 +0000812def VLD2b8 : VLD2<0b1001, {0,0,?,?}, "8", VecListTwoQ, IIC_VLD2>;
813def VLD2b16 : VLD2<0b1001, {0,1,?,?}, "16", VecListTwoQ, IIC_VLD2>;
814def VLD2b32 : VLD2<0b1001, {1,0,?,?}, "32", VecListTwoQ, IIC_VLD2>;
815defm VLD2b8wb : VLD2WB<0b1001, {0,0,?,?}, "8", VecListTwoQ, IIC_VLD2u>;
816defm VLD2b16wb : VLD2WB<0b1001, {0,1,?,?}, "16", VecListTwoQ, IIC_VLD2u>;
817defm VLD2b32wb : VLD2WB<0b1001, {1,0,?,?}, "32", VecListTwoQ, IIC_VLD2u>;
Johnny Chend7283d92010-02-23 20:51:23 +0000818
Bob Wilson4a3d35a2009-08-05 00:49:09 +0000819// VLD3 : Vector Load (multiple 3-element structures)
Bob Wilson00bf1d92010-03-20 18:14:26 +0000820class VLD3D<bits<4> op11_8, bits<4> op7_4, string Dt>
Owen Andersoncf667be2010-11-02 01:24:55 +0000821 : NLdSt<0, 0b10, op11_8, op7_4, (outs DPR:$Vd, DPR:$dst2, DPR:$dst3),
Owen Andersonf431eda2010-11-02 23:47:29 +0000822 (ins addrmode6:$Rn), IIC_VLD3,
823 "vld3", Dt, "\\{$Vd, $dst2, $dst3\\}, $Rn", "", []> {
824 let Rm = 0b1111;
825 let Inst{4} = Rn{4};
Owen Anderson8d7d2e12011-08-09 20:55:18 +0000826 let DecoderMethod = "DecodeVLDInstruction";
Owen Andersoncf667be2010-11-02 01:24:55 +0000827}
Bob Wilson4a3d35a2009-08-05 00:49:09 +0000828
Owen Andersoncf667be2010-11-02 01:24:55 +0000829def VLD3d8 : VLD3D<0b0100, {0,0,0,?}, "8">;
830def VLD3d16 : VLD3D<0b0100, {0,1,0,?}, "16">;
831def VLD3d32 : VLD3D<0b0100, {1,0,0,?}, "32">;
Bob Wilson4a3d35a2009-08-05 00:49:09 +0000832
Bob Wilson9d84fb32010-09-14 20:59:49 +0000833def VLD3d8Pseudo : VLDQQPseudo<IIC_VLD3>;
834def VLD3d16Pseudo : VLDQQPseudo<IIC_VLD3>;
835def VLD3d32Pseudo : VLDQQPseudo<IIC_VLD3>;
Bob Wilsonf5721912010-09-03 18:16:02 +0000836
Bob Wilson92cb9322010-03-20 20:10:51 +0000837// ...with address register writeback:
838class VLD3DWB<bits<4> op11_8, bits<4> op7_4, string Dt>
839 : NLdSt<0, 0b10, op11_8, op7_4,
Owen Andersoncf667be2010-11-02 01:24:55 +0000840 (outs DPR:$Vd, DPR:$dst2, DPR:$dst3, GPR:$wb),
Owen Andersonf431eda2010-11-02 23:47:29 +0000841 (ins addrmode6:$Rn, am6offset:$Rm), IIC_VLD3u,
842 "vld3", Dt, "\\{$Vd, $dst2, $dst3\\}, $Rn$Rm",
843 "$Rn.addr = $wb", []> {
844 let Inst{4} = Rn{4};
Owen Anderson8d7d2e12011-08-09 20:55:18 +0000845 let DecoderMethod = "DecodeVLDInstruction";
Owen Andersoncf667be2010-11-02 01:24:55 +0000846}
Bob Wilson92cb9322010-03-20 20:10:51 +0000847
Owen Andersoncf667be2010-11-02 01:24:55 +0000848def VLD3d8_UPD : VLD3DWB<0b0100, {0,0,0,?}, "8">;
849def VLD3d16_UPD : VLD3DWB<0b0100, {0,1,0,?}, "16">;
850def VLD3d32_UPD : VLD3DWB<0b0100, {1,0,0,?}, "32">;
Bob Wilson92cb9322010-03-20 20:10:51 +0000851
Evan Cheng84f69e82010-10-09 01:45:34 +0000852def VLD3d8Pseudo_UPD : VLDQQWBPseudo<IIC_VLD3u>;
853def VLD3d16Pseudo_UPD : VLDQQWBPseudo<IIC_VLD3u>;
854def VLD3d32Pseudo_UPD : VLDQQWBPseudo<IIC_VLD3u>;
Bob Wilsonf5721912010-09-03 18:16:02 +0000855
Bob Wilson7de68142011-02-07 17:43:15 +0000856// ...with double-spaced registers:
Owen Andersoncf667be2010-11-02 01:24:55 +0000857def VLD3q8 : VLD3D<0b0101, {0,0,0,?}, "8">;
858def VLD3q16 : VLD3D<0b0101, {0,1,0,?}, "16">;
859def VLD3q32 : VLD3D<0b0101, {1,0,0,?}, "32">;
860def VLD3q8_UPD : VLD3DWB<0b0101, {0,0,0,?}, "8">;
861def VLD3q16_UPD : VLD3DWB<0b0101, {0,1,0,?}, "16">;
862def VLD3q32_UPD : VLD3DWB<0b0101, {1,0,0,?}, "32">;
Bob Wilson00bf1d92010-03-20 18:14:26 +0000863
Evan Cheng84f69e82010-10-09 01:45:34 +0000864def VLD3q8Pseudo_UPD : VLDQQQQWBPseudo<IIC_VLD3u>;
865def VLD3q16Pseudo_UPD : VLDQQQQWBPseudo<IIC_VLD3u>;
866def VLD3q32Pseudo_UPD : VLDQQQQWBPseudo<IIC_VLD3u>;
Bob Wilsonf5721912010-09-03 18:16:02 +0000867
Bob Wilson92cb9322010-03-20 20:10:51 +0000868// ...alternate versions to be allocated odd register numbers:
Bob Wilson7de68142011-02-07 17:43:15 +0000869def VLD3q8oddPseudo : VLDQQQQPseudo<IIC_VLD3>;
870def VLD3q16oddPseudo : VLDQQQQPseudo<IIC_VLD3>;
871def VLD3q32oddPseudo : VLDQQQQPseudo<IIC_VLD3>;
872
Evan Cheng84f69e82010-10-09 01:45:34 +0000873def VLD3q8oddPseudo_UPD : VLDQQQQWBPseudo<IIC_VLD3u>;
874def VLD3q16oddPseudo_UPD : VLDQQQQWBPseudo<IIC_VLD3u>;
875def VLD3q32oddPseudo_UPD : VLDQQQQWBPseudo<IIC_VLD3u>;
Bob Wilsonff8952e2009-10-07 17:24:55 +0000876
Bob Wilson4a3d35a2009-08-05 00:49:09 +0000877// VLD4 : Vector Load (multiple 4-element structures)
Bob Wilson00bf1d92010-03-20 18:14:26 +0000878class VLD4D<bits<4> op11_8, bits<4> op7_4, string Dt>
879 : NLdSt<0, 0b10, op11_8, op7_4,
Owen Andersoncf667be2010-11-02 01:24:55 +0000880 (outs DPR:$Vd, DPR:$dst2, DPR:$dst3, DPR:$dst4),
Owen Andersonf431eda2010-11-02 23:47:29 +0000881 (ins addrmode6:$Rn), IIC_VLD4,
882 "vld4", Dt, "\\{$Vd, $dst2, $dst3, $dst4\\}, $Rn", "", []> {
883 let Rm = 0b1111;
884 let Inst{5-4} = Rn{5-4};
Owen Anderson8d7d2e12011-08-09 20:55:18 +0000885 let DecoderMethod = "DecodeVLDInstruction";
Owen Andersoncf667be2010-11-02 01:24:55 +0000886}
Bob Wilson4a3d35a2009-08-05 00:49:09 +0000887
Owen Andersoncf667be2010-11-02 01:24:55 +0000888def VLD4d8 : VLD4D<0b0000, {0,0,?,?}, "8">;
889def VLD4d16 : VLD4D<0b0000, {0,1,?,?}, "16">;
890def VLD4d32 : VLD4D<0b0000, {1,0,?,?}, "32">;
Bob Wilson243fcc52009-09-01 04:26:28 +0000891
Bob Wilson9d84fb32010-09-14 20:59:49 +0000892def VLD4d8Pseudo : VLDQQPseudo<IIC_VLD4>;
893def VLD4d16Pseudo : VLDQQPseudo<IIC_VLD4>;
894def VLD4d32Pseudo : VLDQQPseudo<IIC_VLD4>;
Bob Wilsonf5721912010-09-03 18:16:02 +0000895
Bob Wilson92cb9322010-03-20 20:10:51 +0000896// ...with address register writeback:
897class VLD4DWB<bits<4> op11_8, bits<4> op7_4, string Dt>
898 : NLdSt<0, 0b10, op11_8, op7_4,
Owen Andersoncf667be2010-11-02 01:24:55 +0000899 (outs DPR:$Vd, DPR:$dst2, DPR:$dst3, DPR:$dst4, GPR:$wb),
Bob Wilson6eb08dd2011-02-07 17:43:12 +0000900 (ins addrmode6:$Rn, am6offset:$Rm), IIC_VLD4u,
Owen Andersonf431eda2010-11-02 23:47:29 +0000901 "vld4", Dt, "\\{$Vd, $dst2, $dst3, $dst4\\}, $Rn$Rm",
902 "$Rn.addr = $wb", []> {
903 let Inst{5-4} = Rn{5-4};
Owen Anderson8d7d2e12011-08-09 20:55:18 +0000904 let DecoderMethod = "DecodeVLDInstruction";
Owen Andersoncf667be2010-11-02 01:24:55 +0000905}
Bob Wilson92cb9322010-03-20 20:10:51 +0000906
Owen Andersoncf667be2010-11-02 01:24:55 +0000907def VLD4d8_UPD : VLD4DWB<0b0000, {0,0,?,?}, "8">;
908def VLD4d16_UPD : VLD4DWB<0b0000, {0,1,?,?}, "16">;
909def VLD4d32_UPD : VLD4DWB<0b0000, {1,0,?,?}, "32">;
Bob Wilson92cb9322010-03-20 20:10:51 +0000910
Bob Wilson6eb08dd2011-02-07 17:43:12 +0000911def VLD4d8Pseudo_UPD : VLDQQWBPseudo<IIC_VLD4u>;
912def VLD4d16Pseudo_UPD : VLDQQWBPseudo<IIC_VLD4u>;
913def VLD4d32Pseudo_UPD : VLDQQWBPseudo<IIC_VLD4u>;
Bob Wilsonf5721912010-09-03 18:16:02 +0000914
Bob Wilson7de68142011-02-07 17:43:15 +0000915// ...with double-spaced registers:
Owen Andersoncf667be2010-11-02 01:24:55 +0000916def VLD4q8 : VLD4D<0b0001, {0,0,?,?}, "8">;
917def VLD4q16 : VLD4D<0b0001, {0,1,?,?}, "16">;
918def VLD4q32 : VLD4D<0b0001, {1,0,?,?}, "32">;
919def VLD4q8_UPD : VLD4DWB<0b0001, {0,0,?,?}, "8">;
920def VLD4q16_UPD : VLD4DWB<0b0001, {0,1,?,?}, "16">;
921def VLD4q32_UPD : VLD4DWB<0b0001, {1,0,?,?}, "32">;
Bob Wilson00bf1d92010-03-20 18:14:26 +0000922
Bob Wilson6eb08dd2011-02-07 17:43:12 +0000923def VLD4q8Pseudo_UPD : VLDQQQQWBPseudo<IIC_VLD4u>;
924def VLD4q16Pseudo_UPD : VLDQQQQWBPseudo<IIC_VLD4u>;
925def VLD4q32Pseudo_UPD : VLDQQQQWBPseudo<IIC_VLD4u>;
Bob Wilsonf5721912010-09-03 18:16:02 +0000926
Bob Wilson92cb9322010-03-20 20:10:51 +0000927// ...alternate versions to be allocated odd register numbers:
Bob Wilson6eb08dd2011-02-07 17:43:12 +0000928def VLD4q8oddPseudo : VLDQQQQPseudo<IIC_VLD4>;
929def VLD4q16oddPseudo : VLDQQQQPseudo<IIC_VLD4>;
930def VLD4q32oddPseudo : VLDQQQQPseudo<IIC_VLD4>;
931
932def VLD4q8oddPseudo_UPD : VLDQQQQWBPseudo<IIC_VLD4u>;
933def VLD4q16oddPseudo_UPD : VLDQQQQWBPseudo<IIC_VLD4u>;
934def VLD4q32oddPseudo_UPD : VLDQQQQWBPseudo<IIC_VLD4u>;
Bob Wilsonb07c1712009-10-07 21:53:04 +0000935
Bob Wilsonb796bbb2010-11-01 22:04:05 +0000936} // mayLoad = 1, neverHasSideEffects = 1, hasExtraDefRegAllocReq = 1
937
Bob Wilson8466fa12010-09-13 23:01:35 +0000938// Classes for VLD*LN pseudo-instructions with multi-register operands.
939// These are expanded to real instructions after register allocation.
940class VLDQLNPseudo<InstrItinClass itin>
941 : PseudoNLdSt<(outs QPR:$dst),
942 (ins addrmode6:$addr, QPR:$src, nohash_imm:$lane),
943 itin, "$src = $dst">;
944class VLDQLNWBPseudo<InstrItinClass itin>
945 : PseudoNLdSt<(outs QPR:$dst, GPR:$wb),
946 (ins addrmode6:$addr, am6offset:$offset, QPR:$src,
947 nohash_imm:$lane), itin, "$addr.addr = $wb, $src = $dst">;
948class VLDQQLNPseudo<InstrItinClass itin>
949 : PseudoNLdSt<(outs QQPR:$dst),
950 (ins addrmode6:$addr, QQPR:$src, nohash_imm:$lane),
951 itin, "$src = $dst">;
952class VLDQQLNWBPseudo<InstrItinClass itin>
953 : PseudoNLdSt<(outs QQPR:$dst, GPR:$wb),
954 (ins addrmode6:$addr, am6offset:$offset, QQPR:$src,
955 nohash_imm:$lane), itin, "$addr.addr = $wb, $src = $dst">;
956class VLDQQQQLNPseudo<InstrItinClass itin>
957 : PseudoNLdSt<(outs QQQQPR:$dst),
958 (ins addrmode6:$addr, QQQQPR:$src, nohash_imm:$lane),
959 itin, "$src = $dst">;
960class VLDQQQQLNWBPseudo<InstrItinClass itin>
961 : PseudoNLdSt<(outs QQQQPR:$dst, GPR:$wb),
962 (ins addrmode6:$addr, am6offset:$offset, QQQQPR:$src,
963 nohash_imm:$lane), itin, "$addr.addr = $wb, $src = $dst">;
964
Bob Wilsonb07c1712009-10-07 21:53:04 +0000965// VLD1LN : Vector Load (single element to one lane)
Bob Wilsonb796bbb2010-11-01 22:04:05 +0000966class VLD1LN<bits<4> op11_8, bits<4> op7_4, string Dt, ValueType Ty,
967 PatFrag LoadOp>
Owen Andersond138d702010-11-02 20:47:39 +0000968 : NLdStLn<1, 0b10, op11_8, op7_4, (outs DPR:$Vd),
Owen Andersonf431eda2010-11-02 23:47:29 +0000969 (ins addrmode6:$Rn, DPR:$src, nohash_imm:$lane),
970 IIC_VLD1ln, "vld1", Dt, "\\{$Vd[$lane]\\}, $Rn",
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000971 "$src = $Vd",
972 [(set DPR:$Vd, (vector_insert (Ty DPR:$src),
Owen Andersonf431eda2010-11-02 23:47:29 +0000973 (i32 (LoadOp addrmode6:$Rn)),
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000974 imm:$lane))]> {
Owen Andersonf431eda2010-11-02 23:47:29 +0000975 let Rm = 0b1111;
Owen Anderson7a2e1772011-08-15 18:44:44 +0000976 let DecoderMethod = "DecodeVLD1LN";
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000977}
Mon P Wang183c6272011-05-09 17:47:27 +0000978class VLD1LN32<bits<4> op11_8, bits<4> op7_4, string Dt, ValueType Ty,
979 PatFrag LoadOp>
980 : NLdStLn<1, 0b10, op11_8, op7_4, (outs DPR:$Vd),
981 (ins addrmode6oneL32:$Rn, DPR:$src, nohash_imm:$lane),
982 IIC_VLD1ln, "vld1", Dt, "\\{$Vd[$lane]\\}, $Rn",
983 "$src = $Vd",
984 [(set DPR:$Vd, (vector_insert (Ty DPR:$src),
985 (i32 (LoadOp addrmode6oneL32:$Rn)),
986 imm:$lane))]> {
987 let Rm = 0b1111;
Owen Anderson7a2e1772011-08-15 18:44:44 +0000988 let DecoderMethod = "DecodeVLD1LN";
Mon P Wang183c6272011-05-09 17:47:27 +0000989}
Bob Wilsonb796bbb2010-11-01 22:04:05 +0000990class VLD1QLNPseudo<ValueType Ty, PatFrag LoadOp> : VLDQLNPseudo<IIC_VLD1ln> {
991 let Pattern = [(set QPR:$dst, (vector_insert (Ty QPR:$src),
992 (i32 (LoadOp addrmode6:$addr)),
993 imm:$lane))];
994}
995
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000996def VLD1LNd8 : VLD1LN<0b0000, {?,?,?,0}, "8", v8i8, extloadi8> {
997 let Inst{7-5} = lane{2-0};
998}
999def VLD1LNd16 : VLD1LN<0b0100, {?,?,0,?}, "16", v4i16, extloadi16> {
1000 let Inst{7-6} = lane{1-0};
Jim Grosbacheeaf1c12011-12-19 18:31:43 +00001001 let Inst{5-4} = Rn{5-4};
Owen Andersonf0ea0f22010-11-02 20:40:59 +00001002}
Mon P Wang183c6272011-05-09 17:47:27 +00001003def VLD1LNd32 : VLD1LN32<0b1000, {?,0,?,?}, "32", v2i32, load> {
Owen Andersonf0ea0f22010-11-02 20:40:59 +00001004 let Inst{7} = lane{0};
Jim Grosbacheeaf1c12011-12-19 18:31:43 +00001005 let Inst{5-4} = Rn{5-4};
Owen Andersonf0ea0f22010-11-02 20:40:59 +00001006}
Bob Wilsonb796bbb2010-11-01 22:04:05 +00001007
1008def VLD1LNq8Pseudo : VLD1QLNPseudo<v16i8, extloadi8>;
1009def VLD1LNq16Pseudo : VLD1QLNPseudo<v8i16, extloadi16>;
1010def VLD1LNq32Pseudo : VLD1QLNPseudo<v4i32, load>;
1011
Bob Wilson746fa172010-12-10 22:13:32 +00001012def : Pat<(vector_insert (v2f32 DPR:$src),
1013 (f32 (load addrmode6:$addr)), imm:$lane),
1014 (VLD1LNd32 addrmode6:$addr, DPR:$src, imm:$lane)>;
1015def : Pat<(vector_insert (v4f32 QPR:$src),
1016 (f32 (load addrmode6:$addr)), imm:$lane),
1017 (VLD1LNq32Pseudo addrmode6:$addr, QPR:$src, imm:$lane)>;
1018
Bob Wilsonb796bbb2010-11-01 22:04:05 +00001019let mayLoad = 1, neverHasSideEffects = 1, hasExtraDefRegAllocReq = 1 in {
1020
1021// ...with address register writeback:
1022class VLD1LNWB<bits<4> op11_8, bits<4> op7_4, string Dt>
Owen Andersond138d702010-11-02 20:47:39 +00001023 : NLdStLn<1, 0b10, op11_8, op7_4, (outs DPR:$Vd, GPR:$wb),
Owen Andersonf431eda2010-11-02 23:47:29 +00001024 (ins addrmode6:$Rn, am6offset:$Rm,
Bob Wilsonb796bbb2010-11-01 22:04:05 +00001025 DPR:$src, nohash_imm:$lane), IIC_VLD1lnu, "vld1", Dt,
Owen Andersonf431eda2010-11-02 23:47:29 +00001026 "\\{$Vd[$lane]\\}, $Rn$Rm",
Owen Anderson7a2e1772011-08-15 18:44:44 +00001027 "$src = $Vd, $Rn.addr = $wb", []> {
1028 let DecoderMethod = "DecodeVLD1LN";
1029}
Bob Wilsonb796bbb2010-11-01 22:04:05 +00001030
Owen Andersonf0ea0f22010-11-02 20:40:59 +00001031def VLD1LNd8_UPD : VLD1LNWB<0b0000, {?,?,?,0}, "8"> {
1032 let Inst{7-5} = lane{2-0};
1033}
1034def VLD1LNd16_UPD : VLD1LNWB<0b0100, {?,?,0,?}, "16"> {
1035 let Inst{7-6} = lane{1-0};
Owen Andersonf431eda2010-11-02 23:47:29 +00001036 let Inst{4} = Rn{4};
Owen Andersonf0ea0f22010-11-02 20:40:59 +00001037}
1038def VLD1LNd32_UPD : VLD1LNWB<0b1000, {?,0,?,?}, "32"> {
1039 let Inst{7} = lane{0};
Owen Andersonf431eda2010-11-02 23:47:29 +00001040 let Inst{5} = Rn{4};
1041 let Inst{4} = Rn{4};
Owen Andersonf0ea0f22010-11-02 20:40:59 +00001042}
Bob Wilsonb796bbb2010-11-01 22:04:05 +00001043
1044def VLD1LNq8Pseudo_UPD : VLDQLNWBPseudo<IIC_VLD1lnu>;
1045def VLD1LNq16Pseudo_UPD : VLDQLNWBPseudo<IIC_VLD1lnu>;
1046def VLD1LNq32Pseudo_UPD : VLDQLNWBPseudo<IIC_VLD1lnu>;
Bob Wilson7708c222009-10-07 18:09:32 +00001047
Bob Wilson243fcc52009-09-01 04:26:28 +00001048// VLD2LN : Vector Load (single 2-element structure to one lane)
Bob Wilson39842552010-03-22 16:43:10 +00001049class VLD2LN<bits<4> op11_8, bits<4> op7_4, string Dt>
Owen Andersond138d702010-11-02 20:47:39 +00001050 : NLdStLn<1, 0b10, op11_8, op7_4, (outs DPR:$Vd, DPR:$dst2),
Owen Andersonf431eda2010-11-02 23:47:29 +00001051 (ins addrmode6:$Rn, DPR:$src1, DPR:$src2, nohash_imm:$lane),
1052 IIC_VLD2ln, "vld2", Dt, "\\{$Vd[$lane], $dst2[$lane]\\}, $Rn",
Owen Andersonf0ea0f22010-11-02 20:40:59 +00001053 "$src1 = $Vd, $src2 = $dst2", []> {
Owen Andersonf431eda2010-11-02 23:47:29 +00001054 let Rm = 0b1111;
1055 let Inst{4} = Rn{4};
Owen Anderson7a2e1772011-08-15 18:44:44 +00001056 let DecoderMethod = "DecodeVLD2LN";
Owen Andersonf0ea0f22010-11-02 20:40:59 +00001057}
Bob Wilson243fcc52009-09-01 04:26:28 +00001058
Owen Andersonf0ea0f22010-11-02 20:40:59 +00001059def VLD2LNd8 : VLD2LN<0b0001, {?,?,?,?}, "8"> {
1060 let Inst{7-5} = lane{2-0};
1061}
1062def VLD2LNd16 : VLD2LN<0b0101, {?,?,0,?}, "16"> {
1063 let Inst{7-6} = lane{1-0};
1064}
1065def VLD2LNd32 : VLD2LN<0b1001, {?,0,0,?}, "32"> {
1066 let Inst{7} = lane{0};
1067}
Bob Wilson30aea9d2009-10-08 18:56:10 +00001068
Evan Chengd2ca8132010-10-09 01:03:04 +00001069def VLD2LNd8Pseudo : VLDQLNPseudo<IIC_VLD2ln>;
1070def VLD2LNd16Pseudo : VLDQLNPseudo<IIC_VLD2ln>;
1071def VLD2LNd32Pseudo : VLDQLNPseudo<IIC_VLD2ln>;
Bob Wilson8466fa12010-09-13 23:01:35 +00001072
Bob Wilson41315282010-03-20 20:39:53 +00001073// ...with double-spaced registers:
Owen Andersonf0ea0f22010-11-02 20:40:59 +00001074def VLD2LNq16 : VLD2LN<0b0101, {?,?,1,?}, "16"> {
1075 let Inst{7-6} = lane{1-0};
1076}
1077def VLD2LNq32 : VLD2LN<0b1001, {?,1,0,?}, "32"> {
1078 let Inst{7} = lane{0};
1079}
Bob Wilson30aea9d2009-10-08 18:56:10 +00001080
Evan Chengd2ca8132010-10-09 01:03:04 +00001081def VLD2LNq16Pseudo : VLDQQLNPseudo<IIC_VLD2ln>;
1082def VLD2LNq32Pseudo : VLDQQLNPseudo<IIC_VLD2ln>;
Bob Wilson243fcc52009-09-01 04:26:28 +00001083
Bob Wilsona1023642010-03-20 20:47:18 +00001084// ...with address register writeback:
Bob Wilson39842552010-03-22 16:43:10 +00001085class VLD2LNWB<bits<4> op11_8, bits<4> op7_4, string Dt>
Owen Andersond138d702010-11-02 20:47:39 +00001086 : NLdStLn<1, 0b10, op11_8, op7_4, (outs DPR:$Vd, DPR:$dst2, GPR:$wb),
Owen Andersonf431eda2010-11-02 23:47:29 +00001087 (ins addrmode6:$Rn, am6offset:$Rm,
Evan Chengd2ca8132010-10-09 01:03:04 +00001088 DPR:$src1, DPR:$src2, nohash_imm:$lane), IIC_VLD2lnu, "vld2", Dt,
Owen Andersonf431eda2010-11-02 23:47:29 +00001089 "\\{$Vd[$lane], $dst2[$lane]\\}, $Rn$Rm",
1090 "$src1 = $Vd, $src2 = $dst2, $Rn.addr = $wb", []> {
1091 let Inst{4} = Rn{4};
Owen Anderson7a2e1772011-08-15 18:44:44 +00001092 let DecoderMethod = "DecodeVLD2LN";
Owen Andersonf0ea0f22010-11-02 20:40:59 +00001093}
Bob Wilsona1023642010-03-20 20:47:18 +00001094
Owen Andersonf0ea0f22010-11-02 20:40:59 +00001095def VLD2LNd8_UPD : VLD2LNWB<0b0001, {?,?,?,?}, "8"> {
1096 let Inst{7-5} = lane{2-0};
1097}
1098def VLD2LNd16_UPD : VLD2LNWB<0b0101, {?,?,0,?}, "16"> {
1099 let Inst{7-6} = lane{1-0};
1100}
1101def VLD2LNd32_UPD : VLD2LNWB<0b1001, {?,0,0,?}, "32"> {
1102 let Inst{7} = lane{0};
1103}
Bob Wilsona1023642010-03-20 20:47:18 +00001104
Evan Chengd2ca8132010-10-09 01:03:04 +00001105def VLD2LNd8Pseudo_UPD : VLDQLNWBPseudo<IIC_VLD2lnu>;
1106def VLD2LNd16Pseudo_UPD : VLDQLNWBPseudo<IIC_VLD2lnu>;
1107def VLD2LNd32Pseudo_UPD : VLDQLNWBPseudo<IIC_VLD2lnu>;
Bob Wilson8466fa12010-09-13 23:01:35 +00001108
Owen Andersonf0ea0f22010-11-02 20:40:59 +00001109def VLD2LNq16_UPD : VLD2LNWB<0b0101, {?,?,1,?}, "16"> {
1110 let Inst{7-6} = lane{1-0};
1111}
1112def VLD2LNq32_UPD : VLD2LNWB<0b1001, {?,1,0,?}, "32"> {
1113 let Inst{7} = lane{0};
1114}
Bob Wilsona1023642010-03-20 20:47:18 +00001115
Evan Chengd2ca8132010-10-09 01:03:04 +00001116def VLD2LNq16Pseudo_UPD : VLDQQLNWBPseudo<IIC_VLD2lnu>;
1117def VLD2LNq32Pseudo_UPD : VLDQQLNWBPseudo<IIC_VLD2lnu>;
Bob Wilson8466fa12010-09-13 23:01:35 +00001118
Bob Wilson243fcc52009-09-01 04:26:28 +00001119// VLD3LN : Vector Load (single 3-element structure to one lane)
Bob Wilson39842552010-03-22 16:43:10 +00001120class VLD3LN<bits<4> op11_8, bits<4> op7_4, string Dt>
Owen Andersond138d702010-11-02 20:47:39 +00001121 : NLdStLn<1, 0b10, op11_8, op7_4, (outs DPR:$Vd, DPR:$dst2, DPR:$dst3),
Owen Andersonf431eda2010-11-02 23:47:29 +00001122 (ins addrmode6:$Rn, DPR:$src1, DPR:$src2, DPR:$src3,
Evan Cheng84f69e82010-10-09 01:45:34 +00001123 nohash_imm:$lane), IIC_VLD3ln, "vld3", Dt,
Owen Andersonf431eda2010-11-02 23:47:29 +00001124 "\\{$Vd[$lane], $dst2[$lane], $dst3[$lane]\\}, $Rn",
Owen Andersonf0ea0f22010-11-02 20:40:59 +00001125 "$src1 = $Vd, $src2 = $dst2, $src3 = $dst3", []> {
Owen Andersonf431eda2010-11-02 23:47:29 +00001126 let Rm = 0b1111;
Owen Anderson7a2e1772011-08-15 18:44:44 +00001127 let DecoderMethod = "DecodeVLD3LN";
Owen Andersonf0ea0f22010-11-02 20:40:59 +00001128}
Bob Wilson243fcc52009-09-01 04:26:28 +00001129
Owen Andersonf0ea0f22010-11-02 20:40:59 +00001130def VLD3LNd8 : VLD3LN<0b0010, {?,?,?,0}, "8"> {
1131 let Inst{7-5} = lane{2-0};
1132}
1133def VLD3LNd16 : VLD3LN<0b0110, {?,?,0,0}, "16"> {
1134 let Inst{7-6} = lane{1-0};
1135}
1136def VLD3LNd32 : VLD3LN<0b1010, {?,0,0,0}, "32"> {
1137 let Inst{7} = lane{0};
1138}
Bob Wilson0bf7d992009-10-08 22:27:33 +00001139
Evan Cheng84f69e82010-10-09 01:45:34 +00001140def VLD3LNd8Pseudo : VLDQQLNPseudo<IIC_VLD3ln>;
1141def VLD3LNd16Pseudo : VLDQQLNPseudo<IIC_VLD3ln>;
1142def VLD3LNd32Pseudo : VLDQQLNPseudo<IIC_VLD3ln>;
Bob Wilson8466fa12010-09-13 23:01:35 +00001143
Bob Wilson41315282010-03-20 20:39:53 +00001144// ...with double-spaced registers:
Owen Andersonf0ea0f22010-11-02 20:40:59 +00001145def VLD3LNq16 : VLD3LN<0b0110, {?,?,1,0}, "16"> {
1146 let Inst{7-6} = lane{1-0};
1147}
1148def VLD3LNq32 : VLD3LN<0b1010, {?,1,0,0}, "32"> {
1149 let Inst{7} = lane{0};
1150}
Bob Wilson0bf7d992009-10-08 22:27:33 +00001151
Evan Cheng84f69e82010-10-09 01:45:34 +00001152def VLD3LNq16Pseudo : VLDQQQQLNPseudo<IIC_VLD3ln>;
1153def VLD3LNq32Pseudo : VLDQQQQLNPseudo<IIC_VLD3ln>;
Bob Wilson243fcc52009-09-01 04:26:28 +00001154
Bob Wilsona1023642010-03-20 20:47:18 +00001155// ...with address register writeback:
Bob Wilson39842552010-03-22 16:43:10 +00001156class VLD3LNWB<bits<4> op11_8, bits<4> op7_4, string Dt>
Owen Andersond138d702010-11-02 20:47:39 +00001157 : NLdStLn<1, 0b10, op11_8, op7_4,
Owen Andersonf0ea0f22010-11-02 20:40:59 +00001158 (outs DPR:$Vd, DPR:$dst2, DPR:$dst3, GPR:$wb),
Owen Andersonf431eda2010-11-02 23:47:29 +00001159 (ins addrmode6:$Rn, am6offset:$Rm,
Bob Wilsona1023642010-03-20 20:47:18 +00001160 DPR:$src1, DPR:$src2, DPR:$src3, nohash_imm:$lane),
Evan Cheng84f69e82010-10-09 01:45:34 +00001161 IIC_VLD3lnu, "vld3", Dt,
Owen Andersonf431eda2010-11-02 23:47:29 +00001162 "\\{$Vd[$lane], $dst2[$lane], $dst3[$lane]\\}, $Rn$Rm",
1163 "$src1 = $Vd, $src2 = $dst2, $src3 = $dst3, $Rn.addr = $wb",
Owen Anderson7a2e1772011-08-15 18:44:44 +00001164 []> {
1165 let DecoderMethod = "DecodeVLD3LN";
1166}
Bob Wilsona1023642010-03-20 20:47:18 +00001167
Owen Andersonf0ea0f22010-11-02 20:40:59 +00001168def VLD3LNd8_UPD : VLD3LNWB<0b0010, {?,?,?,0}, "8"> {
1169 let Inst{7-5} = lane{2-0};
1170}
1171def VLD3LNd16_UPD : VLD3LNWB<0b0110, {?,?,0,0}, "16"> {
1172 let Inst{7-6} = lane{1-0};
1173}
1174def VLD3LNd32_UPD : VLD3LNWB<0b1010, {?,0,0,0}, "32"> {
Jim Grosbach3346dce2011-12-19 18:11:17 +00001175 let Inst{7} = lane{0};
Owen Andersonf0ea0f22010-11-02 20:40:59 +00001176}
Bob Wilsona1023642010-03-20 20:47:18 +00001177
Evan Cheng84f69e82010-10-09 01:45:34 +00001178def VLD3LNd8Pseudo_UPD : VLDQQLNWBPseudo<IIC_VLD3lnu>;
1179def VLD3LNd16Pseudo_UPD : VLDQQLNWBPseudo<IIC_VLD3lnu>;
1180def VLD3LNd32Pseudo_UPD : VLDQQLNWBPseudo<IIC_VLD3lnu>;
Bob Wilson8466fa12010-09-13 23:01:35 +00001181
Owen Andersonf0ea0f22010-11-02 20:40:59 +00001182def VLD3LNq16_UPD : VLD3LNWB<0b0110, {?,?,1,0}, "16"> {
1183 let Inst{7-6} = lane{1-0};
1184}
1185def VLD3LNq32_UPD : VLD3LNWB<0b1010, {?,1,0,0}, "32"> {
Jim Grosbach3346dce2011-12-19 18:11:17 +00001186 let Inst{7} = lane{0};
Owen Andersonf0ea0f22010-11-02 20:40:59 +00001187}
Bob Wilsona1023642010-03-20 20:47:18 +00001188
Evan Cheng84f69e82010-10-09 01:45:34 +00001189def VLD3LNq16Pseudo_UPD : VLDQQQQLNWBPseudo<IIC_VLD3lnu>;
1190def VLD3LNq32Pseudo_UPD : VLDQQQQLNWBPseudo<IIC_VLD3lnu>;
Bob Wilson8466fa12010-09-13 23:01:35 +00001191
Bob Wilson243fcc52009-09-01 04:26:28 +00001192// VLD4LN : Vector Load (single 4-element structure to one lane)
Bob Wilson39842552010-03-22 16:43:10 +00001193class VLD4LN<bits<4> op11_8, bits<4> op7_4, string Dt>
Owen Andersond138d702010-11-02 20:47:39 +00001194 : NLdStLn<1, 0b10, op11_8, op7_4,
Owen Andersonf0ea0f22010-11-02 20:40:59 +00001195 (outs DPR:$Vd, DPR:$dst2, DPR:$dst3, DPR:$dst4),
Owen Andersonf431eda2010-11-02 23:47:29 +00001196 (ins addrmode6:$Rn, DPR:$src1, DPR:$src2, DPR:$src3, DPR:$src4,
Evan Cheng10dc63f2010-10-09 04:07:58 +00001197 nohash_imm:$lane), IIC_VLD4ln, "vld4", Dt,
Owen Andersonf431eda2010-11-02 23:47:29 +00001198 "\\{$Vd[$lane], $dst2[$lane], $dst3[$lane], $dst4[$lane]\\}, $Rn",
Owen Andersonf0ea0f22010-11-02 20:40:59 +00001199 "$src1 = $Vd, $src2 = $dst2, $src3 = $dst3, $src4 = $dst4", []> {
Owen Andersonf431eda2010-11-02 23:47:29 +00001200 let Rm = 0b1111;
Jim Grosbach3346dce2011-12-19 18:11:17 +00001201 let Inst{4} = Rn{4};
Owen Anderson7a2e1772011-08-15 18:44:44 +00001202 let DecoderMethod = "DecodeVLD4LN";
Owen Andersonf0ea0f22010-11-02 20:40:59 +00001203}
Bob Wilson243fcc52009-09-01 04:26:28 +00001204
Owen Andersonf0ea0f22010-11-02 20:40:59 +00001205def VLD4LNd8 : VLD4LN<0b0011, {?,?,?,?}, "8"> {
1206 let Inst{7-5} = lane{2-0};
1207}
1208def VLD4LNd16 : VLD4LN<0b0111, {?,?,0,?}, "16"> {
1209 let Inst{7-6} = lane{1-0};
1210}
1211def VLD4LNd32 : VLD4LN<0b1011, {?,0,?,?}, "32"> {
Jim Grosbach3346dce2011-12-19 18:11:17 +00001212 let Inst{7} = lane{0};
Owen Andersonf431eda2010-11-02 23:47:29 +00001213 let Inst{5} = Rn{5};
Owen Andersonf0ea0f22010-11-02 20:40:59 +00001214}
Bob Wilson62e053e2009-10-08 22:53:57 +00001215
Evan Cheng10dc63f2010-10-09 04:07:58 +00001216def VLD4LNd8Pseudo : VLDQQLNPseudo<IIC_VLD4ln>;
1217def VLD4LNd16Pseudo : VLDQQLNPseudo<IIC_VLD4ln>;
1218def VLD4LNd32Pseudo : VLDQQLNPseudo<IIC_VLD4ln>;
Bob Wilson8466fa12010-09-13 23:01:35 +00001219
Bob Wilson41315282010-03-20 20:39:53 +00001220// ...with double-spaced registers:
Owen Andersonf0ea0f22010-11-02 20:40:59 +00001221def VLD4LNq16 : VLD4LN<0b0111, {?,?,1,?}, "16"> {
1222 let Inst{7-6} = lane{1-0};
1223}
1224def VLD4LNq32 : VLD4LN<0b1011, {?,1,?,?}, "32"> {
Jim Grosbach3346dce2011-12-19 18:11:17 +00001225 let Inst{7} = lane{0};
Owen Andersonf431eda2010-11-02 23:47:29 +00001226 let Inst{5} = Rn{5};
Owen Andersonf0ea0f22010-11-02 20:40:59 +00001227}
Bob Wilson62e053e2009-10-08 22:53:57 +00001228
Evan Cheng10dc63f2010-10-09 04:07:58 +00001229def VLD4LNq16Pseudo : VLDQQQQLNPseudo<IIC_VLD4ln>;
1230def VLD4LNq32Pseudo : VLDQQQQLNPseudo<IIC_VLD4ln>;
Bob Wilsonb07c1712009-10-07 21:53:04 +00001231
Bob Wilsona1023642010-03-20 20:47:18 +00001232// ...with address register writeback:
Bob Wilson39842552010-03-22 16:43:10 +00001233class VLD4LNWB<bits<4> op11_8, bits<4> op7_4, string Dt>
Owen Andersond138d702010-11-02 20:47:39 +00001234 : NLdStLn<1, 0b10, op11_8, op7_4,
Owen Andersonf0ea0f22010-11-02 20:40:59 +00001235 (outs DPR:$Vd, DPR:$dst2, DPR:$dst3, DPR:$dst4, GPR:$wb),
Owen Andersonf431eda2010-11-02 23:47:29 +00001236 (ins addrmode6:$Rn, am6offset:$Rm,
Bob Wilsona1023642010-03-20 20:47:18 +00001237 DPR:$src1, DPR:$src2, DPR:$src3, DPR:$src4, nohash_imm:$lane),
Bob Wilson6eb08dd2011-02-07 17:43:12 +00001238 IIC_VLD4lnu, "vld4", Dt,
Owen Andersonf431eda2010-11-02 23:47:29 +00001239"\\{$Vd[$lane], $dst2[$lane], $dst3[$lane], $dst4[$lane]\\}, $Rn$Rm",
1240"$src1 = $Vd, $src2 = $dst2, $src3 = $dst3, $src4 = $dst4, $Rn.addr = $wb",
Owen Andersonf0ea0f22010-11-02 20:40:59 +00001241 []> {
Owen Andersonf431eda2010-11-02 23:47:29 +00001242 let Inst{4} = Rn{4};
Owen Anderson7a2e1772011-08-15 18:44:44 +00001243 let DecoderMethod = "DecodeVLD4LN" ;
Owen Andersonf0ea0f22010-11-02 20:40:59 +00001244}
Bob Wilsona1023642010-03-20 20:47:18 +00001245
Owen Andersonf0ea0f22010-11-02 20:40:59 +00001246def VLD4LNd8_UPD : VLD4LNWB<0b0011, {?,?,?,?}, "8"> {
1247 let Inst{7-5} = lane{2-0};
1248}
1249def VLD4LNd16_UPD : VLD4LNWB<0b0111, {?,?,0,?}, "16"> {
1250 let Inst{7-6} = lane{1-0};
1251}
1252def VLD4LNd32_UPD : VLD4LNWB<0b1011, {?,0,?,?}, "32"> {
Jim Grosbach3346dce2011-12-19 18:11:17 +00001253 let Inst{7} = lane{0};
Owen Andersonf431eda2010-11-02 23:47:29 +00001254 let Inst{5} = Rn{5};
Owen Andersonf0ea0f22010-11-02 20:40:59 +00001255}
Bob Wilsona1023642010-03-20 20:47:18 +00001256
Evan Cheng10dc63f2010-10-09 04:07:58 +00001257def VLD4LNd8Pseudo_UPD : VLDQQLNWBPseudo<IIC_VLD4lnu>;
1258def VLD4LNd16Pseudo_UPD : VLDQQLNWBPseudo<IIC_VLD4lnu>;
1259def VLD4LNd32Pseudo_UPD : VLDQQLNWBPseudo<IIC_VLD4lnu>;
Bob Wilson8466fa12010-09-13 23:01:35 +00001260
Owen Andersonf0ea0f22010-11-02 20:40:59 +00001261def VLD4LNq16_UPD : VLD4LNWB<0b0111, {?,?,1,?}, "16"> {
1262 let Inst{7-6} = lane{1-0};
1263}
1264def VLD4LNq32_UPD : VLD4LNWB<0b1011, {?,1,?,?}, "32"> {
Jim Grosbach3346dce2011-12-19 18:11:17 +00001265 let Inst{7} = lane{0};
Owen Andersonf431eda2010-11-02 23:47:29 +00001266 let Inst{5} = Rn{5};
Owen Andersonf0ea0f22010-11-02 20:40:59 +00001267}
Bob Wilsona1023642010-03-20 20:47:18 +00001268
Evan Cheng10dc63f2010-10-09 04:07:58 +00001269def VLD4LNq16Pseudo_UPD : VLDQQQQLNWBPseudo<IIC_VLD4lnu>;
1270def VLD4LNq32Pseudo_UPD : VLDQQQQLNWBPseudo<IIC_VLD4lnu>;
Bob Wilson8466fa12010-09-13 23:01:35 +00001271
Bob Wilson2a0e9742010-11-27 06:35:16 +00001272} // mayLoad = 1, neverHasSideEffects = 1, hasExtraDefRegAllocReq = 1
1273
Bob Wilsonb07c1712009-10-07 21:53:04 +00001274// VLD1DUP : Vector Load (single element to all lanes)
Bob Wilsonf3d2f9d2010-11-28 06:51:15 +00001275class VLD1DUP<bits<4> op7_4, string Dt, ValueType Ty, PatFrag LoadOp>
Jim Grosbach98b05a52011-11-30 01:09:44 +00001276 : NLdSt<1, 0b10, 0b1100, op7_4, (outs VecListOneDAllLanes:$Vd),
1277 (ins addrmode6dup:$Rn),
1278 IIC_VLD1dup, "vld1", Dt, "$Vd, $Rn", "",
1279 [(set VecListOneDAllLanes:$Vd,
1280 (Ty (NEONvdup (i32 (LoadOp addrmode6dup:$Rn)))))]> {
Bob Wilson2a0e9742010-11-27 06:35:16 +00001281 let Rm = 0b1111;
Bob Wilsonbce55772010-11-27 07:12:02 +00001282 let Inst{4} = Rn{4};
Owen Anderson8d7d2e12011-08-09 20:55:18 +00001283 let DecoderMethod = "DecodeVLD1DupInstruction";
Bob Wilson2a0e9742010-11-27 06:35:16 +00001284}
1285class VLD1QDUPPseudo<ValueType Ty, PatFrag LoadOp> : VLDQPseudo<IIC_VLD1dup> {
1286 let Pattern = [(set QPR:$dst,
Bob Wilson8e0c7b52010-11-30 00:00:42 +00001287 (Ty (NEONvdup (i32 (LoadOp addrmode6dup:$addr)))))];
Bob Wilson2a0e9742010-11-27 06:35:16 +00001288}
1289
Bob Wilsonf3d2f9d2010-11-28 06:51:15 +00001290def VLD1DUPd8 : VLD1DUP<{0,0,0,?}, "8", v8i8, extloadi8>;
1291def VLD1DUPd16 : VLD1DUP<{0,1,0,?}, "16", v4i16, extloadi16>;
1292def VLD1DUPd32 : VLD1DUP<{1,0,0,?}, "32", v2i32, load>;
Bob Wilson2a0e9742010-11-27 06:35:16 +00001293
1294def VLD1DUPq8Pseudo : VLD1QDUPPseudo<v16i8, extloadi8>;
1295def VLD1DUPq16Pseudo : VLD1QDUPPseudo<v8i16, extloadi16>;
1296def VLD1DUPq32Pseudo : VLD1QDUPPseudo<v4i32, load>;
1297
Bob Wilson746fa172010-12-10 22:13:32 +00001298def : Pat<(v2f32 (NEONvdup (f32 (load addrmode6dup:$addr)))),
1299 (VLD1DUPd32 addrmode6:$addr)>;
1300def : Pat<(v4f32 (NEONvdup (f32 (load addrmode6dup:$addr)))),
1301 (VLD1DUPq32Pseudo addrmode6:$addr)>;
1302
Bob Wilson2a0e9742010-11-27 06:35:16 +00001303let mayLoad = 1, neverHasSideEffects = 1, hasExtraDefRegAllocReq = 1 in {
1304
Bob Wilson20d55152010-12-10 22:13:24 +00001305class VLD1QDUP<bits<4> op7_4, string Dt>
Jim Grosbach13af2222011-11-30 18:21:25 +00001306 : NLdSt<1, 0b10, 0b1100, op7_4, (outs VecListTwoDAllLanes:$Vd),
Bob Wilson8e0c7b52010-11-30 00:00:42 +00001307 (ins addrmode6dup:$Rn), IIC_VLD1dup,
Jim Grosbach13af2222011-11-30 18:21:25 +00001308 "vld1", Dt, "$Vd, $Rn", "", []> {
Bob Wilson2a0e9742010-11-27 06:35:16 +00001309 let Rm = 0b1111;
Bob Wilsonbce55772010-11-27 07:12:02 +00001310 let Inst{4} = Rn{4};
Owen Anderson8d7d2e12011-08-09 20:55:18 +00001311 let DecoderMethod = "DecodeVLD1DupInstruction";
Bob Wilson2a0e9742010-11-27 06:35:16 +00001312}
1313
Bob Wilson20d55152010-12-10 22:13:24 +00001314def VLD1DUPq8 : VLD1QDUP<{0,0,1,0}, "8">;
1315def VLD1DUPq16 : VLD1QDUP<{0,1,1,?}, "16">;
1316def VLD1DUPq32 : VLD1QDUP<{1,0,1,?}, "32">;
Bob Wilson2a0e9742010-11-27 06:35:16 +00001317
1318// ...with address register writeback:
Jim Grosbach096334e2011-11-30 19:35:44 +00001319multiclass VLD1DUPWB<bits<4> op7_4, string Dt> {
1320 def _fixed : NLdSt<1, 0b10, 0b1100, op7_4,
1321 (outs VecListOneDAllLanes:$Vd, GPR:$wb),
1322 (ins addrmode6dup:$Rn), IIC_VLD1dupu,
1323 "vld1", Dt, "$Vd, $Rn!",
1324 "$Rn.addr = $wb", []> {
1325 let Rm = 0b1101; // NLdSt will assign to the right encoding bits.
1326 let Inst{4} = Rn{4};
1327 let DecoderMethod = "DecodeVLD1DupInstruction";
1328 let AsmMatchConverter = "cvtVLDwbFixed";
1329 }
1330 def _register : NLdSt<1, 0b10, 0b1100, op7_4,
1331 (outs VecListOneDAllLanes:$Vd, GPR:$wb),
1332 (ins addrmode6dup:$Rn, rGPR:$Rm), IIC_VLD1dupu,
1333 "vld1", Dt, "$Vd, $Rn, $Rm",
1334 "$Rn.addr = $wb", []> {
1335 let Inst{4} = Rn{4};
1336 let DecoderMethod = "DecodeVLD1DupInstruction";
1337 let AsmMatchConverter = "cvtVLDwbRegister";
1338 }
Bob Wilsonbce55772010-11-27 07:12:02 +00001339}
Jim Grosbach096334e2011-11-30 19:35:44 +00001340multiclass VLD1QDUPWB<bits<4> op7_4, string Dt> {
1341 def _fixed : NLdSt<1, 0b10, 0b1100, op7_4,
1342 (outs VecListTwoDAllLanes:$Vd, GPR:$wb),
1343 (ins addrmode6dup:$Rn), IIC_VLD1dupu,
1344 "vld1", Dt, "$Vd, $Rn!",
1345 "$Rn.addr = $wb", []> {
1346 let Rm = 0b1101; // NLdSt will assign to the right encoding bits.
1347 let Inst{4} = Rn{4};
1348 let DecoderMethod = "DecodeVLD1DupInstruction";
1349 let AsmMatchConverter = "cvtVLDwbFixed";
1350 }
1351 def _register : NLdSt<1, 0b10, 0b1100, op7_4,
1352 (outs VecListTwoDAllLanes:$Vd, GPR:$wb),
1353 (ins addrmode6dup:$Rn, rGPR:$Rm), IIC_VLD1dupu,
1354 "vld1", Dt, "$Vd, $Rn, $Rm",
1355 "$Rn.addr = $wb", []> {
1356 let Inst{4} = Rn{4};
1357 let DecoderMethod = "DecodeVLD1DupInstruction";
1358 let AsmMatchConverter = "cvtVLDwbRegister";
1359 }
Bob Wilsonbce55772010-11-27 07:12:02 +00001360}
Bob Wilson2a0e9742010-11-27 06:35:16 +00001361
Jim Grosbach096334e2011-11-30 19:35:44 +00001362defm VLD1DUPd8wb : VLD1DUPWB<{0,0,0,0}, "8">;
1363defm VLD1DUPd16wb : VLD1DUPWB<{0,1,0,?}, "16">;
1364defm VLD1DUPd32wb : VLD1DUPWB<{1,0,0,?}, "32">;
Bob Wilson2a0e9742010-11-27 06:35:16 +00001365
Jim Grosbach096334e2011-11-30 19:35:44 +00001366defm VLD1DUPq8wb : VLD1QDUPWB<{0,0,1,0}, "8">;
1367defm VLD1DUPq16wb : VLD1QDUPWB<{0,1,1,?}, "16">;
1368defm VLD1DUPq32wb : VLD1QDUPWB<{1,0,1,?}, "32">;
Bob Wilson2a0e9742010-11-27 06:35:16 +00001369
Jim Grosbach096334e2011-11-30 19:35:44 +00001370def VLD1DUPq8PseudoWB_fixed : VLDQWBfixedPseudo<IIC_VLD1dupu>;
1371def VLD1DUPq16PseudoWB_fixed : VLDQWBfixedPseudo<IIC_VLD1dupu>;
1372def VLD1DUPq32PseudoWB_fixed : VLDQWBfixedPseudo<IIC_VLD1dupu>;
1373def VLD1DUPq8PseudoWB_register : VLDQWBregisterPseudo<IIC_VLD1dupu>;
1374def VLD1DUPq16PseudoWB_register : VLDQWBregisterPseudo<IIC_VLD1dupu>;
1375def VLD1DUPq32PseudoWB_register : VLDQWBregisterPseudo<IIC_VLD1dupu>;
Bob Wilson2a0e9742010-11-27 06:35:16 +00001376
Bob Wilsonb07c1712009-10-07 21:53:04 +00001377// VLD2DUP : Vector Load (single 2-element structure to all lanes)
Jim Grosbach3471d4f2011-12-21 00:38:54 +00001378class VLD2DUP<bits<4> op7_4, string Dt, RegisterOperand VdTy>
1379 : NLdSt<1, 0b10, 0b1101, op7_4, (outs VdTy:$Vd),
Bob Wilson8e0c7b52010-11-30 00:00:42 +00001380 (ins addrmode6dup:$Rn), IIC_VLD2dup,
Jim Grosbach3471d4f2011-12-21 00:38:54 +00001381 "vld2", Dt, "$Vd, $Rn", "", []> {
Bob Wilsonb1dfa7a2010-11-28 06:51:26 +00001382 let Rm = 0b1111;
1383 let Inst{4} = Rn{4};
Owen Anderson8d7d2e12011-08-09 20:55:18 +00001384 let DecoderMethod = "DecodeVLD2DupInstruction";
Bob Wilsonb1dfa7a2010-11-28 06:51:26 +00001385}
1386
Jim Grosbach3471d4f2011-12-21 00:38:54 +00001387def VLD2DUPd8 : VLD2DUP<{0,0,0,?}, "8", VecListTwoDAllLanes>;
1388def VLD2DUPd16 : VLD2DUP<{0,1,0,?}, "16", VecListTwoDAllLanes>;
1389def VLD2DUPd32 : VLD2DUP<{1,0,0,?}, "32", VecListTwoDAllLanes>;
Bob Wilsonb1dfa7a2010-11-28 06:51:26 +00001390
1391def VLD2DUPd8Pseudo : VLDQPseudo<IIC_VLD2dup>;
1392def VLD2DUPd16Pseudo : VLDQPseudo<IIC_VLD2dup>;
1393def VLD2DUPd32Pseudo : VLDQPseudo<IIC_VLD2dup>;
1394
1395// ...with double-spaced registers (not used for codegen):
Jim Grosbach3471d4f2011-12-21 00:38:54 +00001396def VLD2DUPd8x2 : VLD2DUP<{0,0,1,?}, "8", VecListTwoQAllLanes>;
1397def VLD2DUPd16x2 : VLD2DUP<{0,1,1,?}, "16", VecListTwoQAllLanes>;
1398def VLD2DUPd32x2 : VLD2DUP<{1,0,1,?}, "32", VecListTwoQAllLanes>;
Bob Wilsonb1dfa7a2010-11-28 06:51:26 +00001399
1400// ...with address register writeback:
Jim Grosbache6949b12011-12-21 19:40:55 +00001401multiclass VLD2DUPWB<bits<4> op7_4, string Dt, RegisterOperand VdTy> {
1402 def _fixed : NLdSt<1, 0b10, 0b1101, op7_4,
1403 (outs VdTy:$Vd, GPR:$wb),
1404 (ins addrmode6dup:$Rn), IIC_VLD2dupu,
1405 "vld2", Dt, "$Vd, $Rn!",
1406 "$Rn.addr = $wb", []> {
1407 let Rm = 0b1101; // NLdSt will assign to the right encoding bits.
1408 let Inst{4} = Rn{4};
1409 let DecoderMethod = "DecodeVLD2DupInstruction";
1410 let AsmMatchConverter = "cvtVLDwbFixed";
1411 }
1412 def _register : NLdSt<1, 0b10, 0b1101, op7_4,
1413 (outs VdTy:$Vd, GPR:$wb),
1414 (ins addrmode6dup:$Rn, rGPR:$Rm), IIC_VLD2dupu,
1415 "vld2", Dt, "$Vd, $Rn, $Rm",
1416 "$Rn.addr = $wb", []> {
1417 let Inst{4} = Rn{4};
1418 let DecoderMethod = "DecodeVLD2DupInstruction";
1419 let AsmMatchConverter = "cvtVLDwbRegister";
1420 }
Bob Wilsonb1dfa7a2010-11-28 06:51:26 +00001421}
1422
Jim Grosbache6949b12011-12-21 19:40:55 +00001423defm VLD2DUPd8wb : VLD2DUPWB<{0,0,0,0}, "8", VecListTwoDAllLanes>;
1424defm VLD2DUPd16wb : VLD2DUPWB<{0,1,0,?}, "16", VecListTwoDAllLanes>;
1425defm VLD2DUPd32wb : VLD2DUPWB<{1,0,0,?}, "32", VecListTwoDAllLanes>;
Bob Wilsonb1dfa7a2010-11-28 06:51:26 +00001426
Jim Grosbache6949b12011-12-21 19:40:55 +00001427defm VLD2DUPd8x2wb : VLD2DUPWB<{0,0,1,0}, "8", VecListTwoQAllLanes>;
1428defm VLD2DUPd16x2wb : VLD2DUPWB<{0,1,1,?}, "16", VecListTwoQAllLanes>;
1429defm VLD2DUPd32x2wb : VLD2DUPWB<{1,0,1,?}, "32", VecListTwoQAllLanes>;
Bob Wilsonb1dfa7a2010-11-28 06:51:26 +00001430
Jim Grosbache6949b12011-12-21 19:40:55 +00001431def VLD2DUPd8PseudoWB_fixed : VLDQWBfixedPseudo <IIC_VLD2dupu>;
1432def VLD2DUPd8PseudoWB_register : VLDQWBregisterPseudo<IIC_VLD2dupu>;
1433def VLD2DUPd16PseudoWB_fixed : VLDQWBfixedPseudo <IIC_VLD2dupu>;
1434def VLD2DUPd16PseudoWB_register : VLDQWBregisterPseudo<IIC_VLD2dupu>;
1435def VLD2DUPd32PseudoWB_fixed : VLDQWBfixedPseudo <IIC_VLD2dupu>;
1436def VLD2DUPd32PseudoWB_register : VLDQWBregisterPseudo<IIC_VLD2dupu>;
Bob Wilsonb1dfa7a2010-11-28 06:51:26 +00001437
Bob Wilsonb07c1712009-10-07 21:53:04 +00001438// VLD3DUP : Vector Load (single 3-element structure to all lanes)
Bob Wilson86c6d802010-11-29 19:35:29 +00001439class VLD3DUP<bits<4> op7_4, string Dt>
1440 : NLdSt<1, 0b10, 0b1110, op7_4, (outs DPR:$Vd, DPR:$dst2, DPR:$dst3),
Bob Wilson8e0c7b52010-11-30 00:00:42 +00001441 (ins addrmode6dup:$Rn), IIC_VLD3dup,
Bob Wilson86c6d802010-11-29 19:35:29 +00001442 "vld3", Dt, "\\{$Vd[], $dst2[], $dst3[]\\}, $Rn", "", []> {
1443 let Rm = 0b1111;
Owen Andersonef2865a2011-08-15 23:38:54 +00001444 let Inst{4} = 0;
Owen Anderson8d7d2e12011-08-09 20:55:18 +00001445 let DecoderMethod = "DecodeVLD3DupInstruction";
Bob Wilson86c6d802010-11-29 19:35:29 +00001446}
1447
1448def VLD3DUPd8 : VLD3DUP<{0,0,0,?}, "8">;
1449def VLD3DUPd16 : VLD3DUP<{0,1,0,?}, "16">;
1450def VLD3DUPd32 : VLD3DUP<{1,0,0,?}, "32">;
1451
1452def VLD3DUPd8Pseudo : VLDQQPseudo<IIC_VLD3dup>;
1453def VLD3DUPd16Pseudo : VLDQQPseudo<IIC_VLD3dup>;
1454def VLD3DUPd32Pseudo : VLDQQPseudo<IIC_VLD3dup>;
1455
1456// ...with double-spaced registers (not used for codegen):
Jim Grosbach5e59f7e2012-01-24 23:47:04 +00001457def VLD3DUPq8 : VLD3DUP<{0,0,1,?}, "8">;
1458def VLD3DUPq16 : VLD3DUP<{0,1,1,?}, "16">;
1459def VLD3DUPq32 : VLD3DUP<{1,0,1,?}, "32">;
Bob Wilson86c6d802010-11-29 19:35:29 +00001460
1461// ...with address register writeback:
1462class VLD3DUPWB<bits<4> op7_4, string Dt>
1463 : NLdSt<1, 0b10, 0b1110, op7_4, (outs DPR:$Vd, DPR:$dst2, DPR:$dst3, GPR:$wb),
Bob Wilson8e0c7b52010-11-30 00:00:42 +00001464 (ins addrmode6dup:$Rn, am6offset:$Rm), IIC_VLD3dupu,
Bob Wilson86c6d802010-11-29 19:35:29 +00001465 "vld3", Dt, "\\{$Vd[], $dst2[], $dst3[]\\}, $Rn$Rm",
1466 "$Rn.addr = $wb", []> {
Owen Andersonef2865a2011-08-15 23:38:54 +00001467 let Inst{4} = 0;
Owen Anderson8d7d2e12011-08-09 20:55:18 +00001468 let DecoderMethod = "DecodeVLD3DupInstruction";
Bob Wilson86c6d802010-11-29 19:35:29 +00001469}
1470
1471def VLD3DUPd8_UPD : VLD3DUPWB<{0,0,0,0}, "8">;
1472def VLD3DUPd16_UPD : VLD3DUPWB<{0,1,0,?}, "16">;
1473def VLD3DUPd32_UPD : VLD3DUPWB<{1,0,0,?}, "32">;
1474
Jim Grosbach5e59f7e2012-01-24 23:47:04 +00001475def VLD3DUPq8_UPD : VLD3DUPWB<{0,0,1,0}, "8">;
1476def VLD3DUPq16_UPD : VLD3DUPWB<{0,1,1,?}, "16">;
1477def VLD3DUPq32_UPD : VLD3DUPWB<{1,0,1,?}, "32">;
Bob Wilson86c6d802010-11-29 19:35:29 +00001478
1479def VLD3DUPd8Pseudo_UPD : VLDQQWBPseudo<IIC_VLD3dupu>;
1480def VLD3DUPd16Pseudo_UPD : VLDQQWBPseudo<IIC_VLD3dupu>;
1481def VLD3DUPd32Pseudo_UPD : VLDQQWBPseudo<IIC_VLD3dupu>;
1482
Bob Wilsonb07c1712009-10-07 21:53:04 +00001483// VLD4DUP : Vector Load (single 4-element structure to all lanes)
Bob Wilson6c4c9822010-11-30 00:00:35 +00001484class VLD4DUP<bits<4> op7_4, string Dt>
1485 : NLdSt<1, 0b10, 0b1111, op7_4,
1486 (outs DPR:$Vd, DPR:$dst2, DPR:$dst3, DPR:$dst4),
Bob Wilson8e0c7b52010-11-30 00:00:42 +00001487 (ins addrmode6dup:$Rn), IIC_VLD4dup,
Bob Wilson6c4c9822010-11-30 00:00:35 +00001488 "vld4", Dt, "\\{$Vd[], $dst2[], $dst3[], $dst4[]\\}, $Rn", "", []> {
1489 let Rm = 0b1111;
Bob Wilson8e0c7b52010-11-30 00:00:42 +00001490 let Inst{4} = Rn{4};
Owen Anderson8d7d2e12011-08-09 20:55:18 +00001491 let DecoderMethod = "DecodeVLD4DupInstruction";
Bob Wilson6c4c9822010-11-30 00:00:35 +00001492}
1493
Bob Wilson8e0c7b52010-11-30 00:00:42 +00001494def VLD4DUPd8 : VLD4DUP<{0,0,0,?}, "8">;
1495def VLD4DUPd16 : VLD4DUP<{0,1,0,?}, "16">;
1496def VLD4DUPd32 : VLD4DUP<{1,?,0,?}, "32"> { let Inst{6} = Rn{5}; }
Bob Wilson6c4c9822010-11-30 00:00:35 +00001497
1498def VLD4DUPd8Pseudo : VLDQQPseudo<IIC_VLD4dup>;
1499def VLD4DUPd16Pseudo : VLDQQPseudo<IIC_VLD4dup>;
1500def VLD4DUPd32Pseudo : VLDQQPseudo<IIC_VLD4dup>;
1501
1502// ...with double-spaced registers (not used for codegen):
Jim Grosbach6cd6a682012-01-24 23:47:07 +00001503def VLD4DUPq8 : VLD4DUP<{0,0,1,?}, "8">;
1504def VLD4DUPq16 : VLD4DUP<{0,1,1,?}, "16">;
1505def VLD4DUPq32 : VLD4DUP<{1,?,1,?}, "32"> { let Inst{6} = Rn{5}; }
Bob Wilson6c4c9822010-11-30 00:00:35 +00001506
1507// ...with address register writeback:
1508class VLD4DUPWB<bits<4> op7_4, string Dt>
1509 : NLdSt<1, 0b10, 0b1111, op7_4,
1510 (outs DPR:$Vd, DPR:$dst2, DPR:$dst3, DPR:$dst4, GPR:$wb),
Bob Wilson8e0c7b52010-11-30 00:00:42 +00001511 (ins addrmode6dup:$Rn, am6offset:$Rm), IIC_VLD4dupu,
Bob Wilson6c4c9822010-11-30 00:00:35 +00001512 "vld4", Dt, "\\{$Vd[], $dst2[], $dst3[], $dst4[]\\}, $Rn$Rm",
Bob Wilson8e0c7b52010-11-30 00:00:42 +00001513 "$Rn.addr = $wb", []> {
1514 let Inst{4} = Rn{4};
Owen Anderson8d7d2e12011-08-09 20:55:18 +00001515 let DecoderMethod = "DecodeVLD4DupInstruction";
Bob Wilson6c4c9822010-11-30 00:00:35 +00001516}
1517
Bob Wilson8e0c7b52010-11-30 00:00:42 +00001518def VLD4DUPd8_UPD : VLD4DUPWB<{0,0,0,0}, "8">;
1519def VLD4DUPd16_UPD : VLD4DUPWB<{0,1,0,?}, "16">;
1520def VLD4DUPd32_UPD : VLD4DUPWB<{1,?,0,?}, "32"> { let Inst{6} = Rn{5}; }
1521
Jim Grosbach6cd6a682012-01-24 23:47:07 +00001522def VLD4DUPq8_UPD : VLD4DUPWB<{0,0,1,0}, "8">;
1523def VLD4DUPq16_UPD : VLD4DUPWB<{0,1,1,?}, "16">;
1524def VLD4DUPq32_UPD : VLD4DUPWB<{1,?,1,?}, "32"> { let Inst{6} = Rn{5}; }
Bob Wilson6c4c9822010-11-30 00:00:35 +00001525
1526def VLD4DUPd8Pseudo_UPD : VLDQQWBPseudo<IIC_VLD4dupu>;
1527def VLD4DUPd16Pseudo_UPD : VLDQQWBPseudo<IIC_VLD4dupu>;
1528def VLD4DUPd32Pseudo_UPD : VLDQQWBPseudo<IIC_VLD4dupu>;
1529
Evan Cheng5fd1c9b2010-05-19 06:07:03 +00001530} // mayLoad = 1, neverHasSideEffects = 1, hasExtraDefRegAllocReq = 1
Bob Wilsondbd3c0e2009-08-12 00:49:01 +00001531
Evan Cheng5fd1c9b2010-05-19 06:07:03 +00001532let mayStore = 1, neverHasSideEffects = 1, hasExtraSrcRegAllocReq = 1 in {
Bob Wilson25eb5012010-03-20 20:54:36 +00001533
Bob Wilson709d5922010-08-25 23:27:42 +00001534// Classes for VST* pseudo-instructions with multi-register operands.
1535// These are expanded to real instructions after register allocation.
Bob Wilson9d84fb32010-09-14 20:59:49 +00001536class VSTQPseudo<InstrItinClass itin>
1537 : PseudoNLdSt<(outs), (ins addrmode6:$addr, QPR:$src), itin, "">;
1538class VSTQWBPseudo<InstrItinClass itin>
Bob Wilsone5ce4f62010-08-28 05:12:57 +00001539 : PseudoNLdSt<(outs GPR:$wb),
Bob Wilson9d84fb32010-09-14 20:59:49 +00001540 (ins addrmode6:$addr, am6offset:$offset, QPR:$src), itin,
Bob Wilsone5ce4f62010-08-28 05:12:57 +00001541 "$addr.addr = $wb">;
Jim Grosbach4334e032011-10-31 21:50:31 +00001542class VSTQWBfixedPseudo<InstrItinClass itin>
1543 : PseudoNLdSt<(outs GPR:$wb),
1544 (ins addrmode6:$addr, QPR:$src), itin,
1545 "$addr.addr = $wb">;
1546class VSTQWBregisterPseudo<InstrItinClass itin>
1547 : PseudoNLdSt<(outs GPR:$wb),
1548 (ins addrmode6:$addr, rGPR:$offset, QPR:$src), itin,
1549 "$addr.addr = $wb">;
Bob Wilson9d84fb32010-09-14 20:59:49 +00001550class VSTQQPseudo<InstrItinClass itin>
1551 : PseudoNLdSt<(outs), (ins addrmode6:$addr, QQPR:$src), itin, "">;
1552class VSTQQWBPseudo<InstrItinClass itin>
Bob Wilson709d5922010-08-25 23:27:42 +00001553 : PseudoNLdSt<(outs GPR:$wb),
Bob Wilson9d84fb32010-09-14 20:59:49 +00001554 (ins addrmode6:$addr, am6offset:$offset, QQPR:$src), itin,
Bob Wilson709d5922010-08-25 23:27:42 +00001555 "$addr.addr = $wb">;
Jim Grosbach6d567302012-01-20 19:16:00 +00001556class VSTQQWBfixedPseudo<InstrItinClass itin>
1557 : PseudoNLdSt<(outs GPR:$wb),
1558 (ins addrmode6:$addr, QQPR:$src), itin,
1559 "$addr.addr = $wb">;
1560class VSTQQWBregisterPseudo<InstrItinClass itin>
1561 : PseudoNLdSt<(outs GPR:$wb),
1562 (ins addrmode6:$addr, rGPR:$offset, QQPR:$src), itin,
1563 "$addr.addr = $wb">;
1564
Bob Wilson7de68142011-02-07 17:43:15 +00001565class VSTQQQQPseudo<InstrItinClass itin>
1566 : PseudoNLdSt<(outs), (ins addrmode6:$addr, QQQQPR:$src), itin, "">;
Bob Wilson9d84fb32010-09-14 20:59:49 +00001567class VSTQQQQWBPseudo<InstrItinClass itin>
Bob Wilson709d5922010-08-25 23:27:42 +00001568 : PseudoNLdSt<(outs GPR:$wb),
Evan Cheng60ff8792010-10-11 22:03:18 +00001569 (ins addrmode6:$addr, am6offset:$offset, QQQQPR:$src), itin,
Bob Wilson709d5922010-08-25 23:27:42 +00001570 "$addr.addr = $wb">;
1571
Bob Wilson11d98992010-03-23 06:20:33 +00001572// VST1 : Vector Store (multiple single elements)
1573class VST1D<bits<4> op7_4, string Dt>
Jim Grosbach6b09c772011-10-20 15:04:25 +00001574 : NLdSt<0,0b00,0b0111,op7_4, (outs), (ins addrmode6:$Rn, VecListOneD:$Vd),
1575 IIC_VST1, "vst1", Dt, "$Vd, $Rn", "", []> {
Owen Andersonf431eda2010-11-02 23:47:29 +00001576 let Rm = 0b1111;
1577 let Inst{4} = Rn{4};
Owen Anderson8d7d2e12011-08-09 20:55:18 +00001578 let DecoderMethod = "DecodeVSTInstruction";
Owen Andersoncfebe3a2010-11-02 21:06:06 +00001579}
Bob Wilson11d98992010-03-23 06:20:33 +00001580class VST1Q<bits<4> op7_4, string Dt>
Jim Grosbach742c4ba2011-11-12 00:31:53 +00001581 : NLdSt<0,0b00,0b1010,op7_4, (outs), (ins addrmode6:$Rn, VecListTwoD:$Vd),
1582 IIC_VST1x2, "vst1", Dt, "$Vd, $Rn", "", []> {
Owen Andersonf431eda2010-11-02 23:47:29 +00001583 let Rm = 0b1111;
1584 let Inst{5-4} = Rn{5-4};
Jim Grosbach4d061382011-11-11 23:51:31 +00001585 let DecoderMethod = "DecodeVSTInstruction";
Owen Andersoncfebe3a2010-11-02 21:06:06 +00001586}
Bob Wilson11d98992010-03-23 06:20:33 +00001587
Owen Andersoncfebe3a2010-11-02 21:06:06 +00001588def VST1d8 : VST1D<{0,0,0,?}, "8">;
1589def VST1d16 : VST1D<{0,1,0,?}, "16">;
1590def VST1d32 : VST1D<{1,0,0,?}, "32">;
1591def VST1d64 : VST1D<{1,1,0,?}, "64">;
Bob Wilson11d98992010-03-23 06:20:33 +00001592
Owen Andersoncfebe3a2010-11-02 21:06:06 +00001593def VST1q8 : VST1Q<{0,0,?,?}, "8">;
1594def VST1q16 : VST1Q<{0,1,?,?}, "16">;
1595def VST1q32 : VST1Q<{1,0,?,?}, "32">;
1596def VST1q64 : VST1Q<{1,1,?,?}, "64">;
Bob Wilson11d98992010-03-23 06:20:33 +00001597
Evan Cheng60ff8792010-10-11 22:03:18 +00001598def VST1q8Pseudo : VSTQPseudo<IIC_VST1x2>;
1599def VST1q16Pseudo : VSTQPseudo<IIC_VST1x2>;
1600def VST1q32Pseudo : VSTQPseudo<IIC_VST1x2>;
1601def VST1q64Pseudo : VSTQPseudo<IIC_VST1x2>;
Bob Wilsone5ce4f62010-08-28 05:12:57 +00001602
Bob Wilson25eb5012010-03-20 20:54:36 +00001603// ...with address register writeback:
Jim Grosbach4334e032011-10-31 21:50:31 +00001604multiclass VST1DWB<bits<4> op7_4, string Dt> {
1605 def _fixed : NLdSt<0,0b00, 0b0111,op7_4, (outs GPR:$wb),
1606 (ins addrmode6:$Rn, VecListOneD:$Vd), IIC_VLD1u,
1607 "vst1", Dt, "$Vd, $Rn!",
1608 "$Rn.addr = $wb", []> {
1609 let Rm = 0b1101; // NLdSt will assign to the right encoding bits.
1610 let Inst{4} = Rn{4};
1611 let DecoderMethod = "DecodeVSTInstruction";
1612 let AsmMatchConverter = "cvtVSTwbFixed";
1613 }
1614 def _register : NLdSt<0,0b00,0b0111,op7_4, (outs GPR:$wb),
1615 (ins addrmode6:$Rn, rGPR:$Rm, VecListOneD:$Vd),
1616 IIC_VLD1u,
1617 "vst1", Dt, "$Vd, $Rn, $Rm",
1618 "$Rn.addr = $wb", []> {
1619 let Inst{4} = Rn{4};
1620 let DecoderMethod = "DecodeVSTInstruction";
1621 let AsmMatchConverter = "cvtVSTwbRegister";
1622 }
Owen Andersoncfebe3a2010-11-02 21:06:06 +00001623}
Jim Grosbach4334e032011-10-31 21:50:31 +00001624multiclass VST1QWB<bits<4> op7_4, string Dt> {
1625 def _fixed : NLdSt<0,0b00,0b1010,op7_4, (outs GPR:$wb),
1626 (ins addrmode6:$Rn, VecListTwoD:$Vd), IIC_VLD1x2u,
1627 "vst1", Dt, "$Vd, $Rn!",
1628 "$Rn.addr = $wb", []> {
1629 let Rm = 0b1101; // NLdSt will assign to the right encoding bits.
1630 let Inst{5-4} = Rn{5-4};
1631 let DecoderMethod = "DecodeVSTInstruction";
1632 let AsmMatchConverter = "cvtVSTwbFixed";
1633 }
1634 def _register : NLdSt<0,0b00,0b1010,op7_4, (outs GPR:$wb),
1635 (ins addrmode6:$Rn, rGPR:$Rm, VecListTwoD:$Vd),
1636 IIC_VLD1x2u,
1637 "vst1", Dt, "$Vd, $Rn, $Rm",
1638 "$Rn.addr = $wb", []> {
1639 let Inst{5-4} = Rn{5-4};
1640 let DecoderMethod = "DecodeVSTInstruction";
1641 let AsmMatchConverter = "cvtVSTwbRegister";
1642 }
Owen Andersoncfebe3a2010-11-02 21:06:06 +00001643}
Bob Wilson25eb5012010-03-20 20:54:36 +00001644
Jim Grosbach4334e032011-10-31 21:50:31 +00001645defm VST1d8wb : VST1DWB<{0,0,0,?}, "8">;
1646defm VST1d16wb : VST1DWB<{0,1,0,?}, "16">;
1647defm VST1d32wb : VST1DWB<{1,0,0,?}, "32">;
1648defm VST1d64wb : VST1DWB<{1,1,0,?}, "64">;
Bob Wilson25eb5012010-03-20 20:54:36 +00001649
Jim Grosbach4334e032011-10-31 21:50:31 +00001650defm VST1q8wb : VST1QWB<{0,0,?,?}, "8">;
1651defm VST1q16wb : VST1QWB<{0,1,?,?}, "16">;
1652defm VST1q32wb : VST1QWB<{1,0,?,?}, "32">;
1653defm VST1q64wb : VST1QWB<{1,1,?,?}, "64">;
Bob Wilson25eb5012010-03-20 20:54:36 +00001654
Jim Grosbach4334e032011-10-31 21:50:31 +00001655def VST1q8PseudoWB_fixed : VSTQWBfixedPseudo<IIC_VST1x2u>;
1656def VST1q16PseudoWB_fixed : VSTQWBfixedPseudo<IIC_VST1x2u>;
1657def VST1q32PseudoWB_fixed : VSTQWBfixedPseudo<IIC_VST1x2u>;
1658def VST1q64PseudoWB_fixed : VSTQWBfixedPseudo<IIC_VST1x2u>;
1659def VST1q8PseudoWB_register : VSTQWBregisterPseudo<IIC_VST1x2u>;
1660def VST1q16PseudoWB_register : VSTQWBregisterPseudo<IIC_VST1x2u>;
1661def VST1q32PseudoWB_register : VSTQWBregisterPseudo<IIC_VST1x2u>;
1662def VST1q64PseudoWB_register : VSTQWBregisterPseudo<IIC_VST1x2u>;
Bob Wilsone5ce4f62010-08-28 05:12:57 +00001663
Jim Grosbachfe7b4992011-10-21 16:14:12 +00001664// ...with 3 registers
Bob Wilson95808322010-03-18 20:18:39 +00001665class VST1D3<bits<4> op7_4, string Dt>
Johnny Chenf50e83f2010-02-24 02:57:20 +00001666 : NLdSt<0, 0b00, 0b0110, op7_4, (outs),
Jim Grosbachd5ca2012011-11-29 22:38:04 +00001667 (ins addrmode6:$Rn, VecListThreeD:$Vd),
1668 IIC_VST1x3, "vst1", Dt, "$Vd, $Rn", "", []> {
Owen Andersonf431eda2010-11-02 23:47:29 +00001669 let Rm = 0b1111;
1670 let Inst{4} = Rn{4};
Owen Anderson8d7d2e12011-08-09 20:55:18 +00001671 let DecoderMethod = "DecodeVSTInstruction";
Owen Andersoncfebe3a2010-11-02 21:06:06 +00001672}
Jim Grosbachd5ca2012011-11-29 22:38:04 +00001673multiclass VST1D3WB<bits<4> op7_4, string Dt> {
1674 def _fixed : NLdSt<0,0b00,0b0110,op7_4, (outs GPR:$wb),
1675 (ins addrmode6:$Rn, VecListThreeD:$Vd), IIC_VLD1x3u,
1676 "vst1", Dt, "$Vd, $Rn!",
1677 "$Rn.addr = $wb", []> {
1678 let Rm = 0b1101; // NLdSt will assign to the right encoding bits.
1679 let Inst{5-4} = Rn{5-4};
1680 let DecoderMethod = "DecodeVSTInstruction";
1681 let AsmMatchConverter = "cvtVSTwbFixed";
1682 }
1683 def _register : NLdSt<0,0b00,0b0110,op7_4, (outs GPR:$wb),
1684 (ins addrmode6:$Rn, rGPR:$Rm, VecListThreeD:$Vd),
1685 IIC_VLD1x3u,
1686 "vst1", Dt, "$Vd, $Rn, $Rm",
1687 "$Rn.addr = $wb", []> {
1688 let Inst{5-4} = Rn{5-4};
1689 let DecoderMethod = "DecodeVSTInstruction";
1690 let AsmMatchConverter = "cvtVSTwbRegister";
1691 }
Owen Andersoncfebe3a2010-11-02 21:06:06 +00001692}
Bob Wilson052ba452010-03-22 18:22:06 +00001693
Jim Grosbachd5ca2012011-11-29 22:38:04 +00001694def VST1d8T : VST1D3<{0,0,0,?}, "8">;
1695def VST1d16T : VST1D3<{0,1,0,?}, "16">;
1696def VST1d32T : VST1D3<{1,0,0,?}, "32">;
1697def VST1d64T : VST1D3<{1,1,0,?}, "64">;
Bob Wilson052ba452010-03-22 18:22:06 +00001698
Jim Grosbachd5ca2012011-11-29 22:38:04 +00001699defm VST1d8Twb : VST1D3WB<{0,0,0,?}, "8">;
1700defm VST1d16Twb : VST1D3WB<{0,1,0,?}, "16">;
1701defm VST1d32Twb : VST1D3WB<{1,0,0,?}, "32">;
1702defm VST1d64Twb : VST1D3WB<{1,1,0,?}, "64">;
Bob Wilson052ba452010-03-22 18:22:06 +00001703
Jim Grosbachd5ca2012011-11-29 22:38:04 +00001704def VST1d64TPseudo : VSTQQPseudo<IIC_VST1x3>;
1705def VST1d64TPseudoWB_fixed : VSTQQWBPseudo<IIC_VST1x3u>;
1706def VST1d64TPseudoWB_register : VSTQQWBPseudo<IIC_VST1x3u>;
Bob Wilson01ba4612010-08-26 18:51:29 +00001707
Jim Grosbachfe7b4992011-10-21 16:14:12 +00001708// ...with 4 registers
Bob Wilson052ba452010-03-22 18:22:06 +00001709class VST1D4<bits<4> op7_4, string Dt>
1710 : NLdSt<0, 0b00, 0b0010, op7_4, (outs),
Jim Grosbach4c7edb32011-11-29 22:58:48 +00001711 (ins addrmode6:$Rn, VecListFourD:$Vd),
1712 IIC_VST1x4, "vst1", Dt, "$Vd, $Rn", "",
Owen Andersoncfebe3a2010-11-02 21:06:06 +00001713 []> {
Owen Andersonf431eda2010-11-02 23:47:29 +00001714 let Rm = 0b1111;
1715 let Inst{5-4} = Rn{5-4};
Owen Anderson8d7d2e12011-08-09 20:55:18 +00001716 let DecoderMethod = "DecodeVSTInstruction";
Owen Andersoncfebe3a2010-11-02 21:06:06 +00001717}
Jim Grosbach4c7edb32011-11-29 22:58:48 +00001718multiclass VST1D4WB<bits<4> op7_4, string Dt> {
1719 def _fixed : NLdSt<0,0b00,0b0010,op7_4, (outs GPR:$wb),
1720 (ins addrmode6:$Rn, VecListFourD:$Vd), IIC_VLD1x4u,
1721 "vst1", Dt, "$Vd, $Rn!",
1722 "$Rn.addr = $wb", []> {
1723 let Rm = 0b1101; // NLdSt will assign to the right encoding bits.
1724 let Inst{5-4} = Rn{5-4};
1725 let DecoderMethod = "DecodeVSTInstruction";
1726 let AsmMatchConverter = "cvtVSTwbFixed";
1727 }
1728 def _register : NLdSt<0,0b00,0b0010,op7_4, (outs GPR:$wb),
1729 (ins addrmode6:$Rn, rGPR:$Rm, VecListFourD:$Vd),
1730 IIC_VLD1x4u,
1731 "vst1", Dt, "$Vd, $Rn, $Rm",
1732 "$Rn.addr = $wb", []> {
1733 let Inst{5-4} = Rn{5-4};
1734 let DecoderMethod = "DecodeVSTInstruction";
1735 let AsmMatchConverter = "cvtVSTwbRegister";
1736 }
Owen Andersoncfebe3a2010-11-02 21:06:06 +00001737}
Bob Wilson25eb5012010-03-20 20:54:36 +00001738
Jim Grosbach4c7edb32011-11-29 22:58:48 +00001739def VST1d8Q : VST1D4<{0,0,?,?}, "8">;
1740def VST1d16Q : VST1D4<{0,1,?,?}, "16">;
1741def VST1d32Q : VST1D4<{1,0,?,?}, "32">;
1742def VST1d64Q : VST1D4<{1,1,?,?}, "64">;
Bob Wilson25eb5012010-03-20 20:54:36 +00001743
Jim Grosbach4c7edb32011-11-29 22:58:48 +00001744defm VST1d8Qwb : VST1D4WB<{0,0,?,?}, "8">;
1745defm VST1d16Qwb : VST1D4WB<{0,1,?,?}, "16">;
1746defm VST1d32Qwb : VST1D4WB<{1,0,?,?}, "32">;
1747defm VST1d64Qwb : VST1D4WB<{1,1,?,?}, "64">;
Bob Wilson9f7d60f2009-08-12 17:04:56 +00001748
Jim Grosbach4c7edb32011-11-29 22:58:48 +00001749def VST1d64QPseudo : VSTQQPseudo<IIC_VST1x4>;
1750def VST1d64QPseudoWB_fixed : VSTQQWBPseudo<IIC_VST1x4u>;
1751def VST1d64QPseudoWB_register : VSTQQWBPseudo<IIC_VST1x4u>;
Bob Wilson70e48b22010-08-26 05:33:30 +00001752
Bob Wilsonb36ec862009-08-06 18:47:44 +00001753// VST2 : Vector Store (multiple 2-element structures)
Jim Grosbach20accfc2011-12-14 20:59:15 +00001754class VST2<bits<4> op11_8, bits<4> op7_4, string Dt, RegisterOperand VdTy,
1755 InstrItinClass itin>
Jim Grosbache90ac9b2011-12-14 19:35:22 +00001756 : NLdSt<0, 0b00, op11_8, op7_4, (outs), (ins addrmode6:$Rn, VdTy:$Vd),
Jim Grosbach20accfc2011-12-14 20:59:15 +00001757 itin, "vst2", Dt, "$Vd, $Rn", "", []> {
Owen Andersonf431eda2010-11-02 23:47:29 +00001758 let Rm = 0b1111;
1759 let Inst{5-4} = Rn{5-4};
Owen Anderson8d7d2e12011-08-09 20:55:18 +00001760 let DecoderMethod = "DecodeVSTInstruction";
Owen Andersond2f37942010-11-02 21:16:58 +00001761}
Bob Wilsonb36ec862009-08-06 18:47:44 +00001762
Jim Grosbach20accfc2011-12-14 20:59:15 +00001763def VST2d8 : VST2<0b1000, {0,0,?,?}, "8", VecListTwoD, IIC_VST2>;
1764def VST2d16 : VST2<0b1000, {0,1,?,?}, "16", VecListTwoD, IIC_VST2>;
1765def VST2d32 : VST2<0b1000, {1,0,?,?}, "32", VecListTwoD, IIC_VST2>;
Bob Wilsonb36ec862009-08-06 18:47:44 +00001766
Jim Grosbach20accfc2011-12-14 20:59:15 +00001767def VST2q8 : VST2<0b0011, {0,0,?,?}, "8", VecListFourD, IIC_VST2x2>;
1768def VST2q16 : VST2<0b0011, {0,1,?,?}, "16", VecListFourD, IIC_VST2x2>;
1769def VST2q32 : VST2<0b0011, {1,0,?,?}, "32", VecListFourD, IIC_VST2x2>;
Bob Wilsond2855752009-10-07 18:47:39 +00001770
Evan Cheng60ff8792010-10-11 22:03:18 +00001771def VST2d8Pseudo : VSTQPseudo<IIC_VST2>;
1772def VST2d16Pseudo : VSTQPseudo<IIC_VST2>;
1773def VST2d32Pseudo : VSTQPseudo<IIC_VST2>;
Bob Wilsone5ce4f62010-08-28 05:12:57 +00001774
Evan Cheng60ff8792010-10-11 22:03:18 +00001775def VST2q8Pseudo : VSTQQPseudo<IIC_VST2x2>;
1776def VST2q16Pseudo : VSTQQPseudo<IIC_VST2x2>;
1777def VST2q32Pseudo : VSTQQPseudo<IIC_VST2x2>;
Bob Wilsone5ce4f62010-08-28 05:12:57 +00001778
Bob Wilson4f4f93f2010-03-20 21:45:18 +00001779// ...with address register writeback:
Jim Grosbachbb3a2e42011-12-14 21:32:11 +00001780multiclass VST2DWB<bits<4> op11_8, bits<4> op7_4, string Dt,
1781 RegisterOperand VdTy> {
1782 def _fixed : NLdSt<0, 0b00, op11_8, op7_4, (outs GPR:$wb),
1783 (ins addrmode6:$Rn, VdTy:$Vd), IIC_VLD1u,
1784 "vst2", Dt, "$Vd, $Rn!",
1785 "$Rn.addr = $wb", []> {
1786 let Rm = 0b1101; // NLdSt will assign to the right encoding bits.
Jim Grosbachec04a3f2011-12-14 21:49:24 +00001787 let Inst{5-4} = Rn{5-4};
Jim Grosbachbb3a2e42011-12-14 21:32:11 +00001788 let DecoderMethod = "DecodeVSTInstruction";
1789 let AsmMatchConverter = "cvtVSTwbFixed";
1790 }
1791 def _register : NLdSt<0, 0b00, op11_8, op7_4, (outs GPR:$wb),
1792 (ins addrmode6:$Rn, rGPR:$Rm, VdTy:$Vd), IIC_VLD1u,
1793 "vst2", Dt, "$Vd, $Rn, $Rm",
1794 "$Rn.addr = $wb", []> {
Jim Grosbachec04a3f2011-12-14 21:49:24 +00001795 let Inst{5-4} = Rn{5-4};
Jim Grosbachbb3a2e42011-12-14 21:32:11 +00001796 let DecoderMethod = "DecodeVSTInstruction";
1797 let AsmMatchConverter = "cvtVSTwbRegister";
1798 }
Owen Andersond2f37942010-11-02 21:16:58 +00001799}
Jim Grosbachbb3a2e42011-12-14 21:32:11 +00001800multiclass VST2QWB<bits<4> op7_4, string Dt> {
1801 def _fixed : NLdSt<0, 0b00, 0b0011, op7_4, (outs GPR:$wb),
1802 (ins addrmode6:$Rn, VecListFourD:$Vd), IIC_VLD1u,
1803 "vst2", Dt, "$Vd, $Rn!",
1804 "$Rn.addr = $wb", []> {
1805 let Rm = 0b1101; // NLdSt will assign to the right encoding bits.
Jim Grosbachec04a3f2011-12-14 21:49:24 +00001806 let Inst{5-4} = Rn{5-4};
Jim Grosbachbb3a2e42011-12-14 21:32:11 +00001807 let DecoderMethod = "DecodeVSTInstruction";
1808 let AsmMatchConverter = "cvtVSTwbFixed";
1809 }
1810 def _register : NLdSt<0, 0b00, 0b0011, op7_4, (outs GPR:$wb),
1811 (ins addrmode6:$Rn, rGPR:$Rm, VecListFourD:$Vd),
1812 IIC_VLD1u,
1813 "vst2", Dt, "$Vd, $Rn, $Rm",
1814 "$Rn.addr = $wb", []> {
Jim Grosbachec04a3f2011-12-14 21:49:24 +00001815 let Inst{5-4} = Rn{5-4};
Jim Grosbachbb3a2e42011-12-14 21:32:11 +00001816 let DecoderMethod = "DecodeVSTInstruction";
1817 let AsmMatchConverter = "cvtVSTwbRegister";
1818 }
Owen Andersond2f37942010-11-02 21:16:58 +00001819}
Bob Wilson4f4f93f2010-03-20 21:45:18 +00001820
Jim Grosbachbb3a2e42011-12-14 21:32:11 +00001821defm VST2d8wb : VST2DWB<0b1000, {0,0,?,?}, "8", VecListTwoD>;
1822defm VST2d16wb : VST2DWB<0b1000, {0,1,?,?}, "16", VecListTwoD>;
1823defm VST2d32wb : VST2DWB<0b1000, {1,0,?,?}, "32", VecListTwoD>;
Bob Wilson4f4f93f2010-03-20 21:45:18 +00001824
Jim Grosbachbb3a2e42011-12-14 21:32:11 +00001825defm VST2q8wb : VST2QWB<{0,0,?,?}, "8">;
1826defm VST2q16wb : VST2QWB<{0,1,?,?}, "16">;
1827defm VST2q32wb : VST2QWB<{1,0,?,?}, "32">;
Bob Wilson4f4f93f2010-03-20 21:45:18 +00001828
Jim Grosbachf1f16c82012-01-10 21:11:12 +00001829def VST2d8PseudoWB_fixed : VSTQWBfixedPseudo<IIC_VST2u>;
1830def VST2d16PseudoWB_fixed : VSTQWBfixedPseudo<IIC_VST2u>;
1831def VST2d32PseudoWB_fixed : VSTQWBfixedPseudo<IIC_VST2u>;
1832def VST2d8PseudoWB_register : VSTQWBregisterPseudo<IIC_VST2u>;
1833def VST2d16PseudoWB_register : VSTQWBregisterPseudo<IIC_VST2u>;
1834def VST2d32PseudoWB_register : VSTQWBregisterPseudo<IIC_VST2u>;
Bob Wilsone5ce4f62010-08-28 05:12:57 +00001835
Jim Grosbach6d567302012-01-20 19:16:00 +00001836def VST2q8PseudoWB_fixed : VSTQQWBfixedPseudo<IIC_VST2x2u>;
1837def VST2q16PseudoWB_fixed : VSTQQWBfixedPseudo<IIC_VST2x2u>;
1838def VST2q32PseudoWB_fixed : VSTQQWBfixedPseudo<IIC_VST2x2u>;
1839def VST2q8PseudoWB_register : VSTQQWBregisterPseudo<IIC_VST2x2u>;
1840def VST2q16PseudoWB_register : VSTQQWBregisterPseudo<IIC_VST2x2u>;
1841def VST2q32PseudoWB_register : VSTQQWBregisterPseudo<IIC_VST2x2u>;
Bob Wilsone5ce4f62010-08-28 05:12:57 +00001842
Jim Grosbachfe7b4992011-10-21 16:14:12 +00001843// ...with double-spaced registers
Jim Grosbach20accfc2011-12-14 20:59:15 +00001844def VST2b8 : VST2<0b1001, {0,0,?,?}, "8", VecListTwoQ, IIC_VST2>;
1845def VST2b16 : VST2<0b1001, {0,1,?,?}, "16", VecListTwoQ, IIC_VST2>;
1846def VST2b32 : VST2<0b1001, {1,0,?,?}, "32", VecListTwoQ, IIC_VST2>;
Jim Grosbachbb3a2e42011-12-14 21:32:11 +00001847defm VST2b8wb : VST2DWB<0b1001, {0,0,?,?}, "8", VecListTwoQ>;
1848defm VST2b16wb : VST2DWB<0b1001, {0,1,?,?}, "16", VecListTwoQ>;
1849defm VST2b32wb : VST2DWB<0b1001, {1,0,?,?}, "32", VecListTwoQ>;
Johnny Chenf50e83f2010-02-24 02:57:20 +00001850
Bob Wilsonb36ec862009-08-06 18:47:44 +00001851// VST3 : Vector Store (multiple 3-element structures)
Bob Wilson068b18b2010-03-20 21:15:48 +00001852class VST3D<bits<4> op11_8, bits<4> op7_4, string Dt>
1853 : NLdSt<0, 0b00, op11_8, op7_4, (outs),
Owen Andersonf431eda2010-11-02 23:47:29 +00001854 (ins addrmode6:$Rn, DPR:$Vd, DPR:$src2, DPR:$src3), IIC_VST3,
1855 "vst3", Dt, "\\{$Vd, $src2, $src3\\}, $Rn", "", []> {
1856 let Rm = 0b1111;
1857 let Inst{4} = Rn{4};
Owen Anderson8d7d2e12011-08-09 20:55:18 +00001858 let DecoderMethod = "DecodeVSTInstruction";
Owen Andersona1a45fd2010-11-02 21:47:03 +00001859}
Bob Wilsonb36ec862009-08-06 18:47:44 +00001860
Owen Andersona1a45fd2010-11-02 21:47:03 +00001861def VST3d8 : VST3D<0b0100, {0,0,0,?}, "8">;
1862def VST3d16 : VST3D<0b0100, {0,1,0,?}, "16">;
1863def VST3d32 : VST3D<0b0100, {1,0,0,?}, "32">;
Bob Wilsonb36ec862009-08-06 18:47:44 +00001864
Evan Cheng60ff8792010-10-11 22:03:18 +00001865def VST3d8Pseudo : VSTQQPseudo<IIC_VST3>;
1866def VST3d16Pseudo : VSTQQPseudo<IIC_VST3>;
1867def VST3d32Pseudo : VSTQQPseudo<IIC_VST3>;
Bob Wilson01ba4612010-08-26 18:51:29 +00001868
Bob Wilson4f4f93f2010-03-20 21:45:18 +00001869// ...with address register writeback:
1870class VST3DWB<bits<4> op11_8, bits<4> op7_4, string Dt>
1871 : NLdSt<0, 0b00, op11_8, op7_4, (outs GPR:$wb),
Owen Andersonf431eda2010-11-02 23:47:29 +00001872 (ins addrmode6:$Rn, am6offset:$Rm,
Owen Andersona1a45fd2010-11-02 21:47:03 +00001873 DPR:$Vd, DPR:$src2, DPR:$src3), IIC_VST3u,
Owen Andersonf431eda2010-11-02 23:47:29 +00001874 "vst3", Dt, "\\{$Vd, $src2, $src3\\}, $Rn$Rm",
1875 "$Rn.addr = $wb", []> {
1876 let Inst{4} = Rn{4};
Owen Anderson8d7d2e12011-08-09 20:55:18 +00001877 let DecoderMethod = "DecodeVSTInstruction";
Owen Andersona1a45fd2010-11-02 21:47:03 +00001878}
Bob Wilson4f4f93f2010-03-20 21:45:18 +00001879
Owen Andersona1a45fd2010-11-02 21:47:03 +00001880def VST3d8_UPD : VST3DWB<0b0100, {0,0,0,?}, "8">;
1881def VST3d16_UPD : VST3DWB<0b0100, {0,1,0,?}, "16">;
1882def VST3d32_UPD : VST3DWB<0b0100, {1,0,0,?}, "32">;
Bob Wilson4f4f93f2010-03-20 21:45:18 +00001883
Evan Cheng60ff8792010-10-11 22:03:18 +00001884def VST3d8Pseudo_UPD : VSTQQWBPseudo<IIC_VST3u>;
1885def VST3d16Pseudo_UPD : VSTQQWBPseudo<IIC_VST3u>;
1886def VST3d32Pseudo_UPD : VSTQQWBPseudo<IIC_VST3u>;
Bob Wilson01ba4612010-08-26 18:51:29 +00001887
Bob Wilson7de68142011-02-07 17:43:15 +00001888// ...with double-spaced registers:
Owen Andersona1a45fd2010-11-02 21:47:03 +00001889def VST3q8 : VST3D<0b0101, {0,0,0,?}, "8">;
1890def VST3q16 : VST3D<0b0101, {0,1,0,?}, "16">;
1891def VST3q32 : VST3D<0b0101, {1,0,0,?}, "32">;
1892def VST3q8_UPD : VST3DWB<0b0101, {0,0,0,?}, "8">;
1893def VST3q16_UPD : VST3DWB<0b0101, {0,1,0,?}, "16">;
1894def VST3q32_UPD : VST3DWB<0b0101, {1,0,0,?}, "32">;
Bob Wilson068b18b2010-03-20 21:15:48 +00001895
Evan Cheng60ff8792010-10-11 22:03:18 +00001896def VST3q8Pseudo_UPD : VSTQQQQWBPseudo<IIC_VST3u>;
1897def VST3q16Pseudo_UPD : VSTQQQQWBPseudo<IIC_VST3u>;
1898def VST3q32Pseudo_UPD : VSTQQQQWBPseudo<IIC_VST3u>;
Bob Wilson01ba4612010-08-26 18:51:29 +00001899
Bob Wilson4f4f93f2010-03-20 21:45:18 +00001900// ...alternate versions to be allocated odd register numbers:
Bob Wilson7de68142011-02-07 17:43:15 +00001901def VST3q8oddPseudo : VSTQQQQPseudo<IIC_VST3>;
1902def VST3q16oddPseudo : VSTQQQQPseudo<IIC_VST3>;
1903def VST3q32oddPseudo : VSTQQQQPseudo<IIC_VST3>;
1904
Evan Cheng60ff8792010-10-11 22:03:18 +00001905def VST3q8oddPseudo_UPD : VSTQQQQWBPseudo<IIC_VST3u>;
1906def VST3q16oddPseudo_UPD : VSTQQQQWBPseudo<IIC_VST3u>;
1907def VST3q32oddPseudo_UPD : VSTQQQQWBPseudo<IIC_VST3u>;
Bob Wilson66a70632009-10-07 20:30:08 +00001908
Bob Wilsonb36ec862009-08-06 18:47:44 +00001909// VST4 : Vector Store (multiple 4-element structures)
Bob Wilson068b18b2010-03-20 21:15:48 +00001910class VST4D<bits<4> op11_8, bits<4> op7_4, string Dt>
1911 : NLdSt<0, 0b00, op11_8, op7_4, (outs),
Owen Andersonf431eda2010-11-02 23:47:29 +00001912 (ins addrmode6:$Rn, DPR:$Vd, DPR:$src2, DPR:$src3, DPR:$src4),
1913 IIC_VST4, "vst4", Dt, "\\{$Vd, $src2, $src3, $src4\\}, $Rn",
Owen Andersona1a45fd2010-11-02 21:47:03 +00001914 "", []> {
Owen Andersonf431eda2010-11-02 23:47:29 +00001915 let Rm = 0b1111;
1916 let Inst{5-4} = Rn{5-4};
Owen Anderson8d7d2e12011-08-09 20:55:18 +00001917 let DecoderMethod = "DecodeVSTInstruction";
Owen Andersona1a45fd2010-11-02 21:47:03 +00001918}
Bob Wilsonb36ec862009-08-06 18:47:44 +00001919
Owen Andersona1a45fd2010-11-02 21:47:03 +00001920def VST4d8 : VST4D<0b0000, {0,0,?,?}, "8">;
1921def VST4d16 : VST4D<0b0000, {0,1,?,?}, "16">;
1922def VST4d32 : VST4D<0b0000, {1,0,?,?}, "32">;
Bob Wilson8a3198b2009-09-01 18:51:56 +00001923
Evan Cheng60ff8792010-10-11 22:03:18 +00001924def VST4d8Pseudo : VSTQQPseudo<IIC_VST4>;
1925def VST4d16Pseudo : VSTQQPseudo<IIC_VST4>;
1926def VST4d32Pseudo : VSTQQPseudo<IIC_VST4>;
Bob Wilson709d5922010-08-25 23:27:42 +00001927
Bob Wilson4f4f93f2010-03-20 21:45:18 +00001928// ...with address register writeback:
1929class VST4DWB<bits<4> op11_8, bits<4> op7_4, string Dt>
1930 : NLdSt<0, 0b00, op11_8, op7_4, (outs GPR:$wb),
Owen Andersonf431eda2010-11-02 23:47:29 +00001931 (ins addrmode6:$Rn, am6offset:$Rm,
Owen Andersona1a45fd2010-11-02 21:47:03 +00001932 DPR:$Vd, DPR:$src2, DPR:$src3, DPR:$src4), IIC_VST4u,
Owen Andersonf431eda2010-11-02 23:47:29 +00001933 "vst4", Dt, "\\{$Vd, $src2, $src3, $src4\\}, $Rn$Rm",
1934 "$Rn.addr = $wb", []> {
1935 let Inst{5-4} = Rn{5-4};
Owen Anderson8d7d2e12011-08-09 20:55:18 +00001936 let DecoderMethod = "DecodeVSTInstruction";
Owen Andersona1a45fd2010-11-02 21:47:03 +00001937}
Bob Wilson4f4f93f2010-03-20 21:45:18 +00001938
Owen Andersona1a45fd2010-11-02 21:47:03 +00001939def VST4d8_UPD : VST4DWB<0b0000, {0,0,?,?}, "8">;
1940def VST4d16_UPD : VST4DWB<0b0000, {0,1,?,?}, "16">;
1941def VST4d32_UPD : VST4DWB<0b0000, {1,0,?,?}, "32">;
Bob Wilson4f4f93f2010-03-20 21:45:18 +00001942
Evan Cheng60ff8792010-10-11 22:03:18 +00001943def VST4d8Pseudo_UPD : VSTQQWBPseudo<IIC_VST4u>;
1944def VST4d16Pseudo_UPD : VSTQQWBPseudo<IIC_VST4u>;
1945def VST4d32Pseudo_UPD : VSTQQWBPseudo<IIC_VST4u>;
Bob Wilson709d5922010-08-25 23:27:42 +00001946
Bob Wilson7de68142011-02-07 17:43:15 +00001947// ...with double-spaced registers:
Owen Andersona1a45fd2010-11-02 21:47:03 +00001948def VST4q8 : VST4D<0b0001, {0,0,?,?}, "8">;
1949def VST4q16 : VST4D<0b0001, {0,1,?,?}, "16">;
1950def VST4q32 : VST4D<0b0001, {1,0,?,?}, "32">;
1951def VST4q8_UPD : VST4DWB<0b0001, {0,0,?,?}, "8">;
1952def VST4q16_UPD : VST4DWB<0b0001, {0,1,?,?}, "16">;
1953def VST4q32_UPD : VST4DWB<0b0001, {1,0,?,?}, "32">;
Bob Wilson068b18b2010-03-20 21:15:48 +00001954
Evan Cheng60ff8792010-10-11 22:03:18 +00001955def VST4q8Pseudo_UPD : VSTQQQQWBPseudo<IIC_VST4u>;
1956def VST4q16Pseudo_UPD : VSTQQQQWBPseudo<IIC_VST4u>;
1957def VST4q32Pseudo_UPD : VSTQQQQWBPseudo<IIC_VST4u>;
Bob Wilson709d5922010-08-25 23:27:42 +00001958
Bob Wilson4f4f93f2010-03-20 21:45:18 +00001959// ...alternate versions to be allocated odd register numbers:
Bob Wilson7de68142011-02-07 17:43:15 +00001960def VST4q8oddPseudo : VSTQQQQPseudo<IIC_VST4>;
1961def VST4q16oddPseudo : VSTQQQQPseudo<IIC_VST4>;
1962def VST4q32oddPseudo : VSTQQQQPseudo<IIC_VST4>;
1963
Evan Cheng60ff8792010-10-11 22:03:18 +00001964def VST4q8oddPseudo_UPD : VSTQQQQWBPseudo<IIC_VST4u>;
1965def VST4q16oddPseudo_UPD : VSTQQQQWBPseudo<IIC_VST4u>;
1966def VST4q32oddPseudo_UPD : VSTQQQQWBPseudo<IIC_VST4u>;
Bob Wilsonb07c1712009-10-07 21:53:04 +00001967
Bob Wilsond0c6bc22010-11-02 21:18:25 +00001968} // mayStore = 1, neverHasSideEffects = 1, hasExtraSrcRegAllocReq = 1
1969
Bob Wilson8466fa12010-09-13 23:01:35 +00001970// Classes for VST*LN pseudo-instructions with multi-register operands.
1971// These are expanded to real instructions after register allocation.
1972class VSTQLNPseudo<InstrItinClass itin>
1973 : PseudoNLdSt<(outs), (ins addrmode6:$addr, QPR:$src, nohash_imm:$lane),
1974 itin, "">;
1975class VSTQLNWBPseudo<InstrItinClass itin>
1976 : PseudoNLdSt<(outs GPR:$wb),
1977 (ins addrmode6:$addr, am6offset:$offset, QPR:$src,
1978 nohash_imm:$lane), itin, "$addr.addr = $wb">;
1979class VSTQQLNPseudo<InstrItinClass itin>
1980 : PseudoNLdSt<(outs), (ins addrmode6:$addr, QQPR:$src, nohash_imm:$lane),
1981 itin, "">;
1982class VSTQQLNWBPseudo<InstrItinClass itin>
1983 : PseudoNLdSt<(outs GPR:$wb),
1984 (ins addrmode6:$addr, am6offset:$offset, QQPR:$src,
1985 nohash_imm:$lane), itin, "$addr.addr = $wb">;
1986class VSTQQQQLNPseudo<InstrItinClass itin>
1987 : PseudoNLdSt<(outs), (ins addrmode6:$addr, QQQQPR:$src, nohash_imm:$lane),
1988 itin, "">;
1989class VSTQQQQLNWBPseudo<InstrItinClass itin>
1990 : PseudoNLdSt<(outs GPR:$wb),
1991 (ins addrmode6:$addr, am6offset:$offset, QQQQPR:$src,
1992 nohash_imm:$lane), itin, "$addr.addr = $wb">;
1993
Bob Wilsonb07c1712009-10-07 21:53:04 +00001994// VST1LN : Vector Store (single element from one lane)
Bob Wilsond168cef2010-11-03 16:24:53 +00001995class VST1LN<bits<4> op11_8, bits<4> op7_4, string Dt, ValueType Ty,
1996 PatFrag StoreOp, SDNode ExtractOp>
Owen Andersone95c9462010-11-02 21:54:45 +00001997 : NLdStLn<1, 0b00, op11_8, op7_4, (outs),
Owen Andersonf431eda2010-11-02 23:47:29 +00001998 (ins addrmode6:$Rn, DPR:$Vd, nohash_imm:$lane),
Bob Wilsond168cef2010-11-03 16:24:53 +00001999 IIC_VST1ln, "vst1", Dt, "\\{$Vd[$lane]\\}, $Rn", "",
2000 [(StoreOp (ExtractOp (Ty DPR:$Vd), imm:$lane), addrmode6:$Rn)]> {
Owen Andersonf431eda2010-11-02 23:47:29 +00002001 let Rm = 0b1111;
Owen Anderson7a2e1772011-08-15 18:44:44 +00002002 let DecoderMethod = "DecodeVST1LN";
Owen Andersone95c9462010-11-02 21:54:45 +00002003}
Mon P Wang183c6272011-05-09 17:47:27 +00002004class VST1LN32<bits<4> op11_8, bits<4> op7_4, string Dt, ValueType Ty,
2005 PatFrag StoreOp, SDNode ExtractOp>
2006 : NLdStLn<1, 0b00, op11_8, op7_4, (outs),
2007 (ins addrmode6oneL32:$Rn, DPR:$Vd, nohash_imm:$lane),
2008 IIC_VST1ln, "vst1", Dt, "\\{$Vd[$lane]\\}, $Rn", "",
Jim Grosbachf921c0fe2011-06-13 22:54:22 +00002009 [(StoreOp (ExtractOp (Ty DPR:$Vd), imm:$lane), addrmode6oneL32:$Rn)]>{
Mon P Wang183c6272011-05-09 17:47:27 +00002010 let Rm = 0b1111;
Owen Anderson7a2e1772011-08-15 18:44:44 +00002011 let DecoderMethod = "DecodeVST1LN";
Mon P Wang183c6272011-05-09 17:47:27 +00002012}
Bob Wilsond168cef2010-11-03 16:24:53 +00002013class VST1QLNPseudo<ValueType Ty, PatFrag StoreOp, SDNode ExtractOp>
2014 : VSTQLNPseudo<IIC_VST1ln> {
2015 let Pattern = [(StoreOp (ExtractOp (Ty QPR:$src), imm:$lane),
2016 addrmode6:$addr)];
2017}
Bob Wilsond0c6bc22010-11-02 21:18:25 +00002018
Bob Wilsond168cef2010-11-03 16:24:53 +00002019def VST1LNd8 : VST1LN<0b0000, {?,?,?,0}, "8", v8i8, truncstorei8,
2020 NEONvgetlaneu> {
Owen Andersone95c9462010-11-02 21:54:45 +00002021 let Inst{7-5} = lane{2-0};
2022}
Bob Wilsond168cef2010-11-03 16:24:53 +00002023def VST1LNd16 : VST1LN<0b0100, {?,?,0,?}, "16", v4i16, truncstorei16,
2024 NEONvgetlaneu> {
Owen Andersone95c9462010-11-02 21:54:45 +00002025 let Inst{7-6} = lane{1-0};
Owen Andersonf431eda2010-11-02 23:47:29 +00002026 let Inst{4} = Rn{5};
Owen Andersone95c9462010-11-02 21:54:45 +00002027}
Mon P Wang183c6272011-05-09 17:47:27 +00002028
2029def VST1LNd32 : VST1LN32<0b1000, {?,0,?,?}, "32", v2i32, store, extractelt> {
Owen Andersone95c9462010-11-02 21:54:45 +00002030 let Inst{7} = lane{0};
Owen Andersonf431eda2010-11-02 23:47:29 +00002031 let Inst{5-4} = Rn{5-4};
Owen Andersone95c9462010-11-02 21:54:45 +00002032}
Bob Wilsond0c6bc22010-11-02 21:18:25 +00002033
Bob Wilsond168cef2010-11-03 16:24:53 +00002034def VST1LNq8Pseudo : VST1QLNPseudo<v16i8, truncstorei8, NEONvgetlaneu>;
2035def VST1LNq16Pseudo : VST1QLNPseudo<v8i16, truncstorei16, NEONvgetlaneu>;
2036def VST1LNq32Pseudo : VST1QLNPseudo<v4i32, store, extractelt>;
Bob Wilsond0c6bc22010-11-02 21:18:25 +00002037
Bob Wilson746fa172010-12-10 22:13:32 +00002038def : Pat<(store (extractelt (v2f32 DPR:$src), imm:$lane), addrmode6:$addr),
2039 (VST1LNd32 addrmode6:$addr, DPR:$src, imm:$lane)>;
2040def : Pat<(store (extractelt (v4f32 QPR:$src), imm:$lane), addrmode6:$addr),
2041 (VST1LNq32Pseudo addrmode6:$addr, QPR:$src, imm:$lane)>;
2042
Bob Wilsond0c6bc22010-11-02 21:18:25 +00002043// ...with address register writeback:
Bob Wilsonda525062011-02-25 06:42:42 +00002044class VST1LNWB<bits<4> op11_8, bits<4> op7_4, string Dt, ValueType Ty,
2045 PatFrag StoreOp, SDNode ExtractOp>
Owen Andersone95c9462010-11-02 21:54:45 +00002046 : NLdStLn<1, 0b00, op11_8, op7_4, (outs GPR:$wb),
Owen Andersonf431eda2010-11-02 23:47:29 +00002047 (ins addrmode6:$Rn, am6offset:$Rm,
Owen Andersone95c9462010-11-02 21:54:45 +00002048 DPR:$Vd, nohash_imm:$lane), IIC_VST1lnu, "vst1", Dt,
Owen Andersonf431eda2010-11-02 23:47:29 +00002049 "\\{$Vd[$lane]\\}, $Rn$Rm",
Bob Wilsonda525062011-02-25 06:42:42 +00002050 "$Rn.addr = $wb",
2051 [(set GPR:$wb, (StoreOp (ExtractOp (Ty DPR:$Vd), imm:$lane),
Owen Anderson7a2e1772011-08-15 18:44:44 +00002052 addrmode6:$Rn, am6offset:$Rm))]> {
2053 let DecoderMethod = "DecodeVST1LN";
2054}
Bob Wilsonda525062011-02-25 06:42:42 +00002055class VST1QLNWBPseudo<ValueType Ty, PatFrag StoreOp, SDNode ExtractOp>
2056 : VSTQLNWBPseudo<IIC_VST1lnu> {
2057 let Pattern = [(set GPR:$wb, (StoreOp (ExtractOp (Ty QPR:$src), imm:$lane),
2058 addrmode6:$addr, am6offset:$offset))];
2059}
Bob Wilsond0c6bc22010-11-02 21:18:25 +00002060
Bob Wilsonda525062011-02-25 06:42:42 +00002061def VST1LNd8_UPD : VST1LNWB<0b0000, {?,?,?,0}, "8", v8i8, post_truncsti8,
2062 NEONvgetlaneu> {
Owen Andersone95c9462010-11-02 21:54:45 +00002063 let Inst{7-5} = lane{2-0};
2064}
Bob Wilsonda525062011-02-25 06:42:42 +00002065def VST1LNd16_UPD : VST1LNWB<0b0100, {?,?,0,?}, "16", v4i16, post_truncsti16,
2066 NEONvgetlaneu> {
Owen Andersone95c9462010-11-02 21:54:45 +00002067 let Inst{7-6} = lane{1-0};
Owen Andersonf431eda2010-11-02 23:47:29 +00002068 let Inst{4} = Rn{5};
Owen Andersone95c9462010-11-02 21:54:45 +00002069}
Bob Wilsonda525062011-02-25 06:42:42 +00002070def VST1LNd32_UPD : VST1LNWB<0b1000, {?,0,?,?}, "32", v2i32, post_store,
2071 extractelt> {
Owen Andersone95c9462010-11-02 21:54:45 +00002072 let Inst{7} = lane{0};
Owen Andersonf431eda2010-11-02 23:47:29 +00002073 let Inst{5-4} = Rn{5-4};
Owen Andersone95c9462010-11-02 21:54:45 +00002074}
Bob Wilsond0c6bc22010-11-02 21:18:25 +00002075
Bob Wilsonda525062011-02-25 06:42:42 +00002076def VST1LNq8Pseudo_UPD : VST1QLNWBPseudo<v16i8, post_truncsti8, NEONvgetlaneu>;
2077def VST1LNq16Pseudo_UPD : VST1QLNWBPseudo<v8i16, post_truncsti16,NEONvgetlaneu>;
2078def VST1LNq32Pseudo_UPD : VST1QLNWBPseudo<v4i32, post_store, extractelt>;
2079
2080let mayStore = 1, neverHasSideEffects = 1, hasExtraSrcRegAllocReq = 1 in {
Bob Wilson63c90632009-10-07 20:49:18 +00002081
Bob Wilson8a3198b2009-09-01 18:51:56 +00002082// VST2LN : Vector Store (single 2-element structure from one lane)
Bob Wilson39842552010-03-22 16:43:10 +00002083class VST2LN<bits<4> op11_8, bits<4> op7_4, string Dt>
Owen Andersonb20594f2010-11-02 22:18:18 +00002084 : NLdStLn<1, 0b00, op11_8, op7_4, (outs),
Owen Andersonf431eda2010-11-02 23:47:29 +00002085 (ins addrmode6:$Rn, DPR:$Vd, DPR:$src2, nohash_imm:$lane),
2086 IIC_VST2ln, "vst2", Dt, "\\{$Vd[$lane], $src2[$lane]\\}, $Rn",
Owen Andersonb20594f2010-11-02 22:18:18 +00002087 "", []> {
Owen Andersonf431eda2010-11-02 23:47:29 +00002088 let Rm = 0b1111;
2089 let Inst{4} = Rn{4};
Owen Anderson7a2e1772011-08-15 18:44:44 +00002090 let DecoderMethod = "DecodeVST2LN";
Owen Andersonb20594f2010-11-02 22:18:18 +00002091}
Bob Wilson8a3198b2009-09-01 18:51:56 +00002092
Owen Andersonb20594f2010-11-02 22:18:18 +00002093def VST2LNd8 : VST2LN<0b0001, {?,?,?,?}, "8"> {
2094 let Inst{7-5} = lane{2-0};
2095}
2096def VST2LNd16 : VST2LN<0b0101, {?,?,0,?}, "16"> {
2097 let Inst{7-6} = lane{1-0};
2098}
2099def VST2LNd32 : VST2LN<0b1001, {?,0,0,?}, "32"> {
2100 let Inst{7} = lane{0};
2101}
Bob Wilsonc5c6edb2009-10-08 23:38:24 +00002102
Evan Cheng60ff8792010-10-11 22:03:18 +00002103def VST2LNd8Pseudo : VSTQLNPseudo<IIC_VST2ln>;
2104def VST2LNd16Pseudo : VSTQLNPseudo<IIC_VST2ln>;
2105def VST2LNd32Pseudo : VSTQLNPseudo<IIC_VST2ln>;
Bob Wilson8466fa12010-09-13 23:01:35 +00002106
Bob Wilson41315282010-03-20 20:39:53 +00002107// ...with double-spaced registers:
Owen Andersonb20594f2010-11-02 22:18:18 +00002108def VST2LNq16 : VST2LN<0b0101, {?,?,1,?}, "16"> {
2109 let Inst{7-6} = lane{1-0};
Owen Andersonf431eda2010-11-02 23:47:29 +00002110 let Inst{4} = Rn{4};
Owen Andersonb20594f2010-11-02 22:18:18 +00002111}
2112def VST2LNq32 : VST2LN<0b1001, {?,1,0,?}, "32"> {
2113 let Inst{7} = lane{0};
Owen Andersonf431eda2010-11-02 23:47:29 +00002114 let Inst{4} = Rn{4};
Owen Andersonb20594f2010-11-02 22:18:18 +00002115}
Bob Wilsonc5c6edb2009-10-08 23:38:24 +00002116
Evan Cheng60ff8792010-10-11 22:03:18 +00002117def VST2LNq16Pseudo : VSTQQLNPseudo<IIC_VST2ln>;
2118def VST2LNq32Pseudo : VSTQQLNPseudo<IIC_VST2ln>;
Bob Wilson8a3198b2009-09-01 18:51:56 +00002119
Bob Wilsond5fadaf2010-03-20 21:57:36 +00002120// ...with address register writeback:
Bob Wilson39842552010-03-22 16:43:10 +00002121class VST2LNWB<bits<4> op11_8, bits<4> op7_4, string Dt>
Owen Andersonb20594f2010-11-02 22:18:18 +00002122 : NLdStLn<1, 0b00, op11_8, op7_4, (outs GPR:$wb),
Jim Grosbach9b1b3902011-12-14 23:25:46 +00002123 (ins addrmode6:$Rn, am6offset:$Rm,
2124 DPR:$Vd, DPR:$src2, nohash_imm:$lane), IIC_VST2lnu, "vst2", Dt,
2125 "\\{$Vd[$lane], $src2[$lane]\\}, $Rn$Rm",
2126 "$Rn.addr = $wb", []> {
Owen Andersonf431eda2010-11-02 23:47:29 +00002127 let Inst{4} = Rn{4};
Owen Anderson7a2e1772011-08-15 18:44:44 +00002128 let DecoderMethod = "DecodeVST2LN";
Owen Andersonb20594f2010-11-02 22:18:18 +00002129}
Bob Wilsond5fadaf2010-03-20 21:57:36 +00002130
Owen Andersonb20594f2010-11-02 22:18:18 +00002131def VST2LNd8_UPD : VST2LNWB<0b0001, {?,?,?,?}, "8"> {
2132 let Inst{7-5} = lane{2-0};
2133}
2134def VST2LNd16_UPD : VST2LNWB<0b0101, {?,?,0,?}, "16"> {
2135 let Inst{7-6} = lane{1-0};
2136}
2137def VST2LNd32_UPD : VST2LNWB<0b1001, {?,0,0,?}, "32"> {
2138 let Inst{7} = lane{0};
2139}
Bob Wilsond5fadaf2010-03-20 21:57:36 +00002140
Evan Cheng60ff8792010-10-11 22:03:18 +00002141def VST2LNd8Pseudo_UPD : VSTQLNWBPseudo<IIC_VST2lnu>;
2142def VST2LNd16Pseudo_UPD : VSTQLNWBPseudo<IIC_VST2lnu>;
2143def VST2LNd32Pseudo_UPD : VSTQLNWBPseudo<IIC_VST2lnu>;
Bob Wilson8466fa12010-09-13 23:01:35 +00002144
Owen Andersonb20594f2010-11-02 22:18:18 +00002145def VST2LNq16_UPD : VST2LNWB<0b0101, {?,?,1,?}, "16"> {
2146 let Inst{7-6} = lane{1-0};
2147}
2148def VST2LNq32_UPD : VST2LNWB<0b1001, {?,1,0,?}, "32"> {
2149 let Inst{7} = lane{0};
2150}
Bob Wilsond5fadaf2010-03-20 21:57:36 +00002151
Evan Cheng60ff8792010-10-11 22:03:18 +00002152def VST2LNq16Pseudo_UPD : VSTQQLNWBPseudo<IIC_VST2lnu>;
2153def VST2LNq32Pseudo_UPD : VSTQQLNWBPseudo<IIC_VST2lnu>;
Bob Wilson8466fa12010-09-13 23:01:35 +00002154
Bob Wilson8a3198b2009-09-01 18:51:56 +00002155// VST3LN : Vector Store (single 3-element structure from one lane)
Bob Wilson39842552010-03-22 16:43:10 +00002156class VST3LN<bits<4> op11_8, bits<4> op7_4, string Dt>
Owen Andersonb20594f2010-11-02 22:18:18 +00002157 : NLdStLn<1, 0b00, op11_8, op7_4, (outs),
Owen Andersonf431eda2010-11-02 23:47:29 +00002158 (ins addrmode6:$Rn, DPR:$Vd, DPR:$src2, DPR:$src3,
Evan Cheng60ff8792010-10-11 22:03:18 +00002159 nohash_imm:$lane), IIC_VST3ln, "vst3", Dt,
Owen Andersonf431eda2010-11-02 23:47:29 +00002160 "\\{$Vd[$lane], $src2[$lane], $src3[$lane]\\}, $Rn", "", []> {
2161 let Rm = 0b1111;
Owen Anderson7a2e1772011-08-15 18:44:44 +00002162 let DecoderMethod = "DecodeVST3LN";
Owen Andersonb20594f2010-11-02 22:18:18 +00002163}
Bob Wilson8a3198b2009-09-01 18:51:56 +00002164
Owen Andersonb20594f2010-11-02 22:18:18 +00002165def VST3LNd8 : VST3LN<0b0010, {?,?,?,0}, "8"> {
2166 let Inst{7-5} = lane{2-0};
2167}
2168def VST3LNd16 : VST3LN<0b0110, {?,?,0,0}, "16"> {
2169 let Inst{7-6} = lane{1-0};
2170}
2171def VST3LNd32 : VST3LN<0b1010, {?,0,0,0}, "32"> {
2172 let Inst{7} = lane{0};
2173}
Bob Wilson8cdb2692009-10-08 23:51:31 +00002174
Evan Cheng60ff8792010-10-11 22:03:18 +00002175def VST3LNd8Pseudo : VSTQQLNPseudo<IIC_VST3ln>;
2176def VST3LNd16Pseudo : VSTQQLNPseudo<IIC_VST3ln>;
2177def VST3LNd32Pseudo : VSTQQLNPseudo<IIC_VST3ln>;
Bob Wilson8466fa12010-09-13 23:01:35 +00002178
Bob Wilson41315282010-03-20 20:39:53 +00002179// ...with double-spaced registers:
Owen Andersonb20594f2010-11-02 22:18:18 +00002180def VST3LNq16 : VST3LN<0b0110, {?,?,1,0}, "16"> {
2181 let Inst{7-6} = lane{1-0};
2182}
2183def VST3LNq32 : VST3LN<0b1010, {?,1,0,0}, "32"> {
2184 let Inst{7} = lane{0};
2185}
Bob Wilson8cdb2692009-10-08 23:51:31 +00002186
Evan Cheng60ff8792010-10-11 22:03:18 +00002187def VST3LNq16Pseudo : VSTQQQQLNPseudo<IIC_VST3ln>;
2188def VST3LNq32Pseudo : VSTQQQQLNPseudo<IIC_VST3ln>;
Bob Wilson8a3198b2009-09-01 18:51:56 +00002189
Bob Wilsond5fadaf2010-03-20 21:57:36 +00002190// ...with address register writeback:
Bob Wilson39842552010-03-22 16:43:10 +00002191class VST3LNWB<bits<4> op11_8, bits<4> op7_4, string Dt>
Owen Andersonb20594f2010-11-02 22:18:18 +00002192 : NLdStLn<1, 0b00, op11_8, op7_4, (outs GPR:$wb),
Owen Andersonf431eda2010-11-02 23:47:29 +00002193 (ins addrmode6:$Rn, am6offset:$Rm,
Owen Andersonb20594f2010-11-02 22:18:18 +00002194 DPR:$Vd, DPR:$src2, DPR:$src3, nohash_imm:$lane),
Evan Cheng60ff8792010-10-11 22:03:18 +00002195 IIC_VST3lnu, "vst3", Dt,
Owen Andersonf431eda2010-11-02 23:47:29 +00002196 "\\{$Vd[$lane], $src2[$lane], $src3[$lane]\\}, $Rn$Rm",
Owen Anderson7a2e1772011-08-15 18:44:44 +00002197 "$Rn.addr = $wb", []> {
2198 let DecoderMethod = "DecodeVST3LN";
2199}
Bob Wilsond5fadaf2010-03-20 21:57:36 +00002200
Owen Andersonb20594f2010-11-02 22:18:18 +00002201def VST3LNd8_UPD : VST3LNWB<0b0010, {?,?,?,0}, "8"> {
2202 let Inst{7-5} = lane{2-0};
2203}
2204def VST3LNd16_UPD : VST3LNWB<0b0110, {?,?,0,0}, "16"> {
2205 let Inst{7-6} = lane{1-0};
2206}
2207def VST3LNd32_UPD : VST3LNWB<0b1010, {?,0,0,0}, "32"> {
2208 let Inst{7} = lane{0};
2209}
Bob Wilsond5fadaf2010-03-20 21:57:36 +00002210
Evan Cheng60ff8792010-10-11 22:03:18 +00002211def VST3LNd8Pseudo_UPD : VSTQQLNWBPseudo<IIC_VST3lnu>;
2212def VST3LNd16Pseudo_UPD : VSTQQLNWBPseudo<IIC_VST3lnu>;
2213def VST3LNd32Pseudo_UPD : VSTQQLNWBPseudo<IIC_VST3lnu>;
Bob Wilson8466fa12010-09-13 23:01:35 +00002214
Owen Andersonb20594f2010-11-02 22:18:18 +00002215def VST3LNq16_UPD : VST3LNWB<0b0110, {?,?,1,0}, "16"> {
2216 let Inst{7-6} = lane{1-0};
2217}
2218def VST3LNq32_UPD : VST3LNWB<0b1010, {?,1,0,0}, "32"> {
2219 let Inst{7} = lane{0};
2220}
Bob Wilsond5fadaf2010-03-20 21:57:36 +00002221
Evan Cheng60ff8792010-10-11 22:03:18 +00002222def VST3LNq16Pseudo_UPD : VSTQQQQLNWBPseudo<IIC_VST3lnu>;
2223def VST3LNq32Pseudo_UPD : VSTQQQQLNWBPseudo<IIC_VST3lnu>;
Bob Wilson8466fa12010-09-13 23:01:35 +00002224
Bob Wilson8a3198b2009-09-01 18:51:56 +00002225// VST4LN : Vector Store (single 4-element structure from one lane)
Bob Wilson39842552010-03-22 16:43:10 +00002226class VST4LN<bits<4> op11_8, bits<4> op7_4, string Dt>
Owen Andersonb20594f2010-11-02 22:18:18 +00002227 : NLdStLn<1, 0b00, op11_8, op7_4, (outs),
Owen Andersonf431eda2010-11-02 23:47:29 +00002228 (ins addrmode6:$Rn, DPR:$Vd, DPR:$src2, DPR:$src3, DPR:$src4,
Evan Cheng60ff8792010-10-11 22:03:18 +00002229 nohash_imm:$lane), IIC_VST4ln, "vst4", Dt,
Owen Andersonf431eda2010-11-02 23:47:29 +00002230 "\\{$Vd[$lane], $src2[$lane], $src3[$lane], $src4[$lane]\\}, $Rn",
Owen Andersonb20594f2010-11-02 22:18:18 +00002231 "", []> {
Owen Andersonf431eda2010-11-02 23:47:29 +00002232 let Rm = 0b1111;
2233 let Inst{4} = Rn{4};
Owen Anderson7a2e1772011-08-15 18:44:44 +00002234 let DecoderMethod = "DecodeVST4LN";
Owen Andersonb20594f2010-11-02 22:18:18 +00002235}
Bob Wilson8a3198b2009-09-01 18:51:56 +00002236
Owen Andersonb20594f2010-11-02 22:18:18 +00002237def VST4LNd8 : VST4LN<0b0011, {?,?,?,?}, "8"> {
2238 let Inst{7-5} = lane{2-0};
2239}
2240def VST4LNd16 : VST4LN<0b0111, {?,?,0,?}, "16"> {
2241 let Inst{7-6} = lane{1-0};
2242}
2243def VST4LNd32 : VST4LN<0b1011, {?,0,?,?}, "32"> {
2244 let Inst{7} = lane{0};
Owen Andersonf431eda2010-11-02 23:47:29 +00002245 let Inst{5} = Rn{5};
Owen Andersonb20594f2010-11-02 22:18:18 +00002246}
Bob Wilson56311392009-10-09 00:01:36 +00002247
Evan Cheng60ff8792010-10-11 22:03:18 +00002248def VST4LNd8Pseudo : VSTQQLNPseudo<IIC_VST4ln>;
2249def VST4LNd16Pseudo : VSTQQLNPseudo<IIC_VST4ln>;
2250def VST4LNd32Pseudo : VSTQQLNPseudo<IIC_VST4ln>;
Bob Wilson8466fa12010-09-13 23:01:35 +00002251
Bob Wilson41315282010-03-20 20:39:53 +00002252// ...with double-spaced registers:
Owen Andersonb20594f2010-11-02 22:18:18 +00002253def VST4LNq16 : VST4LN<0b0111, {?,?,1,?}, "16"> {
2254 let Inst{7-6} = lane{1-0};
2255}
2256def VST4LNq32 : VST4LN<0b1011, {?,1,?,?}, "32"> {
2257 let Inst{7} = lane{0};
Owen Andersonf431eda2010-11-02 23:47:29 +00002258 let Inst{5} = Rn{5};
Owen Andersonb20594f2010-11-02 22:18:18 +00002259}
Bob Wilson56311392009-10-09 00:01:36 +00002260
Evan Cheng60ff8792010-10-11 22:03:18 +00002261def VST4LNq16Pseudo : VSTQQQQLNPseudo<IIC_VST4ln>;
2262def VST4LNq32Pseudo : VSTQQQQLNPseudo<IIC_VST4ln>;
Bob Wilson56311392009-10-09 00:01:36 +00002263
Bob Wilsond5fadaf2010-03-20 21:57:36 +00002264// ...with address register writeback:
Bob Wilson39842552010-03-22 16:43:10 +00002265class VST4LNWB<bits<4> op11_8, bits<4> op7_4, string Dt>
Owen Andersonb20594f2010-11-02 22:18:18 +00002266 : NLdStLn<1, 0b00, op11_8, op7_4, (outs GPR:$wb),
Owen Andersonf431eda2010-11-02 23:47:29 +00002267 (ins addrmode6:$Rn, am6offset:$Rm,
Owen Andersonb20594f2010-11-02 22:18:18 +00002268 DPR:$Vd, DPR:$src2, DPR:$src3, DPR:$src4, nohash_imm:$lane),
Evan Cheng60ff8792010-10-11 22:03:18 +00002269 IIC_VST4lnu, "vst4", Dt,
Owen Andersonf431eda2010-11-02 23:47:29 +00002270 "\\{$Vd[$lane], $src2[$lane], $src3[$lane], $src4[$lane]\\}, $Rn$Rm",
2271 "$Rn.addr = $wb", []> {
2272 let Inst{4} = Rn{4};
Owen Anderson7a2e1772011-08-15 18:44:44 +00002273 let DecoderMethod = "DecodeVST4LN";
Owen Andersonb20594f2010-11-02 22:18:18 +00002274}
Bob Wilsond5fadaf2010-03-20 21:57:36 +00002275
Owen Andersonb20594f2010-11-02 22:18:18 +00002276def VST4LNd8_UPD : VST4LNWB<0b0011, {?,?,?,?}, "8"> {
2277 let Inst{7-5} = lane{2-0};
2278}
2279def VST4LNd16_UPD : VST4LNWB<0b0111, {?,?,0,?}, "16"> {
2280 let Inst{7-6} = lane{1-0};
2281}
2282def VST4LNd32_UPD : VST4LNWB<0b1011, {?,0,?,?}, "32"> {
2283 let Inst{7} = lane{0};
Owen Andersonf431eda2010-11-02 23:47:29 +00002284 let Inst{5} = Rn{5};
Owen Andersonb20594f2010-11-02 22:18:18 +00002285}
Bob Wilsond5fadaf2010-03-20 21:57:36 +00002286
Evan Cheng60ff8792010-10-11 22:03:18 +00002287def VST4LNd8Pseudo_UPD : VSTQQLNWBPseudo<IIC_VST4lnu>;
2288def VST4LNd16Pseudo_UPD : VSTQQLNWBPseudo<IIC_VST4lnu>;
2289def VST4LNd32Pseudo_UPD : VSTQQLNWBPseudo<IIC_VST4lnu>;
Bob Wilson8466fa12010-09-13 23:01:35 +00002290
Owen Andersonb20594f2010-11-02 22:18:18 +00002291def VST4LNq16_UPD : VST4LNWB<0b0111, {?,?,1,?}, "16"> {
2292 let Inst{7-6} = lane{1-0};
2293}
2294def VST4LNq32_UPD : VST4LNWB<0b1011, {?,1,?,?}, "32"> {
2295 let Inst{7} = lane{0};
Owen Andersonf431eda2010-11-02 23:47:29 +00002296 let Inst{5} = Rn{5};
Owen Andersonb20594f2010-11-02 22:18:18 +00002297}
Bob Wilsond5fadaf2010-03-20 21:57:36 +00002298
Evan Cheng60ff8792010-10-11 22:03:18 +00002299def VST4LNq16Pseudo_UPD : VSTQQQQLNWBPseudo<IIC_VST4lnu>;
2300def VST4LNq32Pseudo_UPD : VSTQQQQLNWBPseudo<IIC_VST4lnu>;
Bob Wilson8466fa12010-09-13 23:01:35 +00002301
Evan Cheng5fd1c9b2010-05-19 06:07:03 +00002302} // mayStore = 1, neverHasSideEffects = 1, hasExtraSrcRegAllocReq = 1
Bob Wilsonb36ec862009-08-06 18:47:44 +00002303
Bob Wilson205a5ca2009-07-08 18:11:30 +00002304
Bob Wilson5bafff32009-06-22 23:27:02 +00002305//===----------------------------------------------------------------------===//
2306// NEON pattern fragments
2307//===----------------------------------------------------------------------===//
2308
2309// Extract D sub-registers of Q registers.
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00002310def DSubReg_i8_reg : SDNodeXForm<imm, [{
Jakob Stoklund Olesen7bb31e32010-05-24 17:13:28 +00002311 assert(ARM::dsub_7 == ARM::dsub_0+7 && "Unexpected subreg numbering");
2312 return CurDAG->getTargetConstant(ARM::dsub_0 + N->getZExtValue()/8, MVT::i32);
Bob Wilson5bafff32009-06-22 23:27:02 +00002313}]>;
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00002314def DSubReg_i16_reg : SDNodeXForm<imm, [{
Jakob Stoklund Olesen7bb31e32010-05-24 17:13:28 +00002315 assert(ARM::dsub_7 == ARM::dsub_0+7 && "Unexpected subreg numbering");
2316 return CurDAG->getTargetConstant(ARM::dsub_0 + N->getZExtValue()/4, MVT::i32);
Bob Wilson5bafff32009-06-22 23:27:02 +00002317}]>;
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00002318def DSubReg_i32_reg : SDNodeXForm<imm, [{
Jakob Stoklund Olesen7bb31e32010-05-24 17:13:28 +00002319 assert(ARM::dsub_7 == ARM::dsub_0+7 && "Unexpected subreg numbering");
2320 return CurDAG->getTargetConstant(ARM::dsub_0 + N->getZExtValue()/2, MVT::i32);
Bob Wilson5bafff32009-06-22 23:27:02 +00002321}]>;
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00002322def DSubReg_f64_reg : SDNodeXForm<imm, [{
Jakob Stoklund Olesen7bb31e32010-05-24 17:13:28 +00002323 assert(ARM::dsub_7 == ARM::dsub_0+7 && "Unexpected subreg numbering");
2324 return CurDAG->getTargetConstant(ARM::dsub_0 + N->getZExtValue(), MVT::i32);
Bob Wilson5bafff32009-06-22 23:27:02 +00002325}]>;
2326
Anton Korobeynikov2324bdc2009-08-28 23:41:26 +00002327// Extract S sub-registers of Q/D registers.
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00002328def SSubReg_f32_reg : SDNodeXForm<imm, [{
Jakob Stoklund Olesen7bb31e32010-05-24 17:13:28 +00002329 assert(ARM::ssub_3 == ARM::ssub_0+3 && "Unexpected subreg numbering");
2330 return CurDAG->getTargetConstant(ARM::ssub_0 + N->getZExtValue(), MVT::i32);
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00002331}]>;
2332
Bob Wilson5bafff32009-06-22 23:27:02 +00002333// Translate lane numbers from Q registers to D subregs.
2334def SubReg_i8_lane : SDNodeXForm<imm, [{
Owen Anderson825b72b2009-08-11 20:47:22 +00002335 return CurDAG->getTargetConstant(N->getZExtValue() & 7, MVT::i32);
Bob Wilson5bafff32009-06-22 23:27:02 +00002336}]>;
2337def SubReg_i16_lane : SDNodeXForm<imm, [{
Owen Anderson825b72b2009-08-11 20:47:22 +00002338 return CurDAG->getTargetConstant(N->getZExtValue() & 3, MVT::i32);
Bob Wilson5bafff32009-06-22 23:27:02 +00002339}]>;
2340def SubReg_i32_lane : SDNodeXForm<imm, [{
Owen Anderson825b72b2009-08-11 20:47:22 +00002341 return CurDAG->getTargetConstant(N->getZExtValue() & 1, MVT::i32);
Bob Wilson5bafff32009-06-22 23:27:02 +00002342}]>;
2343
2344//===----------------------------------------------------------------------===//
2345// Instruction Classes
2346//===----------------------------------------------------------------------===//
2347
Bob Wilson4711d5c2010-12-13 23:02:37 +00002348// Basic 2-register operations: double- and quad-register.
Bob Wilson5bafff32009-06-22 23:27:02 +00002349class N2VD<bits<2> op24_23, bits<2> op21_20, bits<2> op19_18,
Bob Wilson3c0f96e2010-02-17 22:23:11 +00002350 bits<2> op17_16, bits<5> op11_7, bit op4, string OpcodeStr,
2351 string Dt, ValueType ResTy, ValueType OpTy, SDNode OpNode>
Owen Andersonca6945e2010-12-01 00:28:25 +00002352 : N2V<op24_23, op21_20, op19_18, op17_16, op11_7, 0, op4, (outs DPR:$Vd),
2353 (ins DPR:$Vm), IIC_VUNAD, OpcodeStr, Dt,"$Vd, $Vm", "",
2354 [(set DPR:$Vd, (ResTy (OpNode (OpTy DPR:$Vm))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002355class N2VQ<bits<2> op24_23, bits<2> op21_20, bits<2> op19_18,
Bob Wilson3c0f96e2010-02-17 22:23:11 +00002356 bits<2> op17_16, bits<5> op11_7, bit op4, string OpcodeStr,
2357 string Dt, ValueType ResTy, ValueType OpTy, SDNode OpNode>
Owen Andersonca6945e2010-12-01 00:28:25 +00002358 : N2V<op24_23, op21_20, op19_18, op17_16, op11_7, 1, op4, (outs QPR:$Vd),
2359 (ins QPR:$Vm), IIC_VUNAQ, OpcodeStr, Dt,"$Vd, $Vm", "",
2360 [(set QPR:$Vd, (ResTy (OpNode (OpTy QPR:$Vm))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002361
Bob Wilson69bfbd62010-02-17 22:42:54 +00002362// Basic 2-register intrinsics, both double- and quad-register.
Bob Wilson5bafff32009-06-22 23:27:02 +00002363class N2VDInt<bits<2> op24_23, bits<2> op21_20, bits<2> op19_18,
Johnny Chenfa80bec2010-03-25 20:39:04 +00002364 bits<2> op17_16, bits<5> op11_7, bit op4,
Evan Chengf81bf152009-11-23 21:57:23 +00002365 InstrItinClass itin, string OpcodeStr, string Dt,
Bob Wilson5bafff32009-06-22 23:27:02 +00002366 ValueType ResTy, ValueType OpTy, Intrinsic IntOp>
Owen Andersonca6945e2010-12-01 00:28:25 +00002367 : N2V<op24_23, op21_20, op19_18, op17_16, op11_7, 0, op4, (outs DPR:$Vd),
2368 (ins DPR:$Vm), itin, OpcodeStr, Dt, "$Vd, $Vm", "",
2369 [(set DPR:$Vd, (ResTy (IntOp (OpTy DPR:$Vm))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002370class N2VQInt<bits<2> op24_23, bits<2> op21_20, bits<2> op19_18,
David Goodwin127221f2009-09-23 21:38:08 +00002371 bits<2> op17_16, bits<5> op11_7, bit op4,
Evan Chengf81bf152009-11-23 21:57:23 +00002372 InstrItinClass itin, string OpcodeStr, string Dt,
Bob Wilson5bafff32009-06-22 23:27:02 +00002373 ValueType ResTy, ValueType OpTy, Intrinsic IntOp>
Owen Andersonca6945e2010-12-01 00:28:25 +00002374 : N2V<op24_23, op21_20, op19_18, op17_16, op11_7, 1, op4, (outs QPR:$Vd),
2375 (ins QPR:$Vm), itin, OpcodeStr, Dt, "$Vd, $Vm", "",
2376 [(set QPR:$Vd, (ResTy (IntOp (OpTy QPR:$Vm))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002377
Bob Wilson973a0742010-08-30 20:02:30 +00002378// Narrow 2-register operations.
2379class N2VN<bits<2> op24_23, bits<2> op21_20, bits<2> op19_18,
2380 bits<2> op17_16, bits<5> op11_7, bit op6, bit op4,
2381 InstrItinClass itin, string OpcodeStr, string Dt,
2382 ValueType TyD, ValueType TyQ, SDNode OpNode>
Owen Andersonca6945e2010-12-01 00:28:25 +00002383 : N2V<op24_23, op21_20, op19_18, op17_16, op11_7, op6, op4, (outs DPR:$Vd),
2384 (ins QPR:$Vm), itin, OpcodeStr, Dt, "$Vd, $Vm", "",
2385 [(set DPR:$Vd, (TyD (OpNode (TyQ QPR:$Vm))))]>;
Bob Wilson973a0742010-08-30 20:02:30 +00002386
Bob Wilson5bafff32009-06-22 23:27:02 +00002387// Narrow 2-register intrinsics.
2388class N2VNInt<bits<2> op24_23, bits<2> op21_20, bits<2> op19_18,
2389 bits<2> op17_16, bits<5> op11_7, bit op6, bit op4,
Evan Chengf81bf152009-11-23 21:57:23 +00002390 InstrItinClass itin, string OpcodeStr, string Dt,
David Goodwin127221f2009-09-23 21:38:08 +00002391 ValueType TyD, ValueType TyQ, Intrinsic IntOp>
Owen Andersonca6945e2010-12-01 00:28:25 +00002392 : N2V<op24_23, op21_20, op19_18, op17_16, op11_7, op6, op4, (outs DPR:$Vd),
2393 (ins QPR:$Vm), itin, OpcodeStr, Dt, "$Vd, $Vm", "",
2394 [(set DPR:$Vd, (TyD (IntOp (TyQ QPR:$Vm))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002395
Bob Wilsonb31a11b2010-08-20 04:54:02 +00002396// Long 2-register operations (currently only used for VMOVL).
2397class N2VL<bits<2> op24_23, bits<2> op21_20, bits<2> op19_18,
2398 bits<2> op17_16, bits<5> op11_7, bit op6, bit op4,
2399 InstrItinClass itin, string OpcodeStr, string Dt,
2400 ValueType TyQ, ValueType TyD, SDNode OpNode>
Owen Andersonca6945e2010-12-01 00:28:25 +00002401 : N2V<op24_23, op21_20, op19_18, op17_16, op11_7, op6, op4, (outs QPR:$Vd),
2402 (ins DPR:$Vm), itin, OpcodeStr, Dt, "$Vd, $Vm", "",
2403 [(set QPR:$Vd, (TyQ (OpNode (TyD DPR:$Vm))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002404
Bob Wilson04063562010-12-15 22:14:12 +00002405// Long 2-register intrinsics.
2406class N2VLInt<bits<2> op24_23, bits<2> op21_20, bits<2> op19_18,
2407 bits<2> op17_16, bits<5> op11_7, bit op6, bit op4,
2408 InstrItinClass itin, string OpcodeStr, string Dt,
2409 ValueType TyQ, ValueType TyD, Intrinsic IntOp>
2410 : N2V<op24_23, op21_20, op19_18, op17_16, op11_7, op6, op4, (outs QPR:$Vd),
2411 (ins DPR:$Vm), itin, OpcodeStr, Dt, "$Vd, $Vm", "",
2412 [(set QPR:$Vd, (TyQ (IntOp (TyD DPR:$Vm))))]>;
2413
Bob Wilsonb6ab51e2009-08-08 06:13:25 +00002414// 2-register shuffles (VTRN/VZIP/VUZP), both double- and quad-register.
Evan Chengf81bf152009-11-23 21:57:23 +00002415class N2VDShuffle<bits<2> op19_18, bits<5> op11_7, string OpcodeStr, string Dt>
Owen Andersonca6945e2010-12-01 00:28:25 +00002416 : N2V<0b11, 0b11, op19_18, 0b10, op11_7, 0, 0, (outs DPR:$Vd, DPR:$Vm),
Jim Grosbach1251e1a2010-11-18 01:39:50 +00002417 (ins DPR:$src1, DPR:$src2), IIC_VPERMD,
Owen Andersonca6945e2010-12-01 00:28:25 +00002418 OpcodeStr, Dt, "$Vd, $Vm",
2419 "$src1 = $Vd, $src2 = $Vm", []>;
David Goodwin127221f2009-09-23 21:38:08 +00002420class N2VQShuffle<bits<2> op19_18, bits<5> op11_7,
Evan Chengf81bf152009-11-23 21:57:23 +00002421 InstrItinClass itin, string OpcodeStr, string Dt>
Owen Andersonca6945e2010-12-01 00:28:25 +00002422 : N2V<0b11, 0b11, op19_18, 0b10, op11_7, 1, 0, (outs QPR:$Vd, QPR:$Vm),
2423 (ins QPR:$src1, QPR:$src2), itin, OpcodeStr, Dt, "$Vd, $Vm",
2424 "$src1 = $Vd, $src2 = $Vm", []>;
Bob Wilsonb6ab51e2009-08-08 06:13:25 +00002425
Bob Wilson4711d5c2010-12-13 23:02:37 +00002426// Basic 3-register operations: double- and quad-register.
Bob Wilson5bafff32009-06-22 23:27:02 +00002427class N3VD<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
Evan Chengf81bf152009-11-23 21:57:23 +00002428 InstrItinClass itin, string OpcodeStr, string Dt,
Bob Wilson9abe19d2010-02-17 00:31:29 +00002429 ValueType ResTy, ValueType OpTy, SDNode OpNode, bit Commutable>
Bob Wilson5bafff32009-06-22 23:27:02 +00002430 : N3V<op24, op23, op21_20, op11_8, 0, op4,
Owen Andersond451f882010-10-21 20:21:49 +00002431 (outs DPR:$Vd), (ins DPR:$Vn, DPR:$Vm), N3RegFrm, itin,
2432 OpcodeStr, Dt, "$Vd, $Vn, $Vm", "",
2433 [(set DPR:$Vd, (ResTy (OpNode (OpTy DPR:$Vn), (OpTy DPR:$Vm))))]> {
Evan Chengf81bf152009-11-23 21:57:23 +00002434 let isCommutable = Commutable;
2435}
2436// Same as N3VD but no data type.
2437class N3VDX<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
2438 InstrItinClass itin, string OpcodeStr,
2439 ValueType ResTy, ValueType OpTy,
2440 SDNode OpNode, bit Commutable>
2441 : N3VX<op24, op23, op21_20, op11_8, 0, op4,
Jim Grosbachefaeb412010-11-19 22:36:02 +00002442 (outs DPR:$Vd), (ins DPR:$Vn, DPR:$Vm), N3RegFrm, itin,
2443 OpcodeStr, "$Vd, $Vn, $Vm", "",
2444 [(set DPR:$Vd, (ResTy (OpNode (OpTy DPR:$Vn), (OpTy DPR:$Vm))))]>{
Bob Wilson5bafff32009-06-22 23:27:02 +00002445 let isCommutable = Commutable;
2446}
Johnny Chen897dd0c2010-03-27 01:03:13 +00002447
Jim Grosbach1251e1a2010-11-18 01:39:50 +00002448class N3VDSL<bits<2> op21_20, bits<4> op11_8,
Evan Chengf81bf152009-11-23 21:57:23 +00002449 InstrItinClass itin, string OpcodeStr, string Dt,
2450 ValueType Ty, SDNode ShOp>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00002451 : N3VLane32<0, 1, op21_20, op11_8, 1, 0,
Jim Grosbach970f7872011-10-18 18:01:52 +00002452 (outs DPR:$Vd), (ins DPR:$Vn, DPR_VFP2:$Vm, VectorIndex32:$lane),
2453 NVMulSLFrm, itin, OpcodeStr, Dt, "$Vd, $Vn, $Vm$lane", "",
Owen Andersonca6945e2010-12-01 00:28:25 +00002454 [(set (Ty DPR:$Vd),
2455 (Ty (ShOp (Ty DPR:$Vn),
2456 (Ty (NEONvduplane (Ty DPR_VFP2:$Vm),imm:$lane)))))]> {
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00002457 let isCommutable = 0;
2458}
Jim Grosbach1251e1a2010-11-18 01:39:50 +00002459class N3VDSL16<bits<2> op21_20, bits<4> op11_8,
Evan Chengf81bf152009-11-23 21:57:23 +00002460 string OpcodeStr, string Dt, ValueType Ty, SDNode ShOp>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00002461 : N3VLane16<0, 1, op21_20, op11_8, 1, 0,
Jim Grosbach970f7872011-10-18 18:01:52 +00002462 (outs DPR:$Vd), (ins DPR:$Vn, DPR_8:$Vm, VectorIndex16:$lane),
2463 NVMulSLFrm, IIC_VMULi16D, OpcodeStr, Dt,"$Vd, $Vn, $Vm$lane","",
Owen Andersonca6945e2010-12-01 00:28:25 +00002464 [(set (Ty DPR:$Vd),
2465 (Ty (ShOp (Ty DPR:$Vn),
2466 (Ty (NEONvduplane (Ty DPR_8:$Vm), imm:$lane)))))]> {
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00002467 let isCommutable = 0;
2468}
2469
Bob Wilson5bafff32009-06-22 23:27:02 +00002470class N3VQ<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
Evan Chengf81bf152009-11-23 21:57:23 +00002471 InstrItinClass itin, string OpcodeStr, string Dt,
Bob Wilson9abe19d2010-02-17 00:31:29 +00002472 ValueType ResTy, ValueType OpTy, SDNode OpNode, bit Commutable>
Bob Wilson5bafff32009-06-22 23:27:02 +00002473 : N3V<op24, op23, op21_20, op11_8, 1, op4,
Owen Andersonca6945e2010-12-01 00:28:25 +00002474 (outs QPR:$Vd), (ins QPR:$Vn, QPR:$Vm), N3RegFrm, itin,
2475 OpcodeStr, Dt, "$Vd, $Vn, $Vm", "",
2476 [(set QPR:$Vd, (ResTy (OpNode (OpTy QPR:$Vn), (OpTy QPR:$Vm))))]> {
Evan Chengf81bf152009-11-23 21:57:23 +00002477 let isCommutable = Commutable;
2478}
2479class N3VQX<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
2480 InstrItinClass itin, string OpcodeStr,
Bob Wilson9abe19d2010-02-17 00:31:29 +00002481 ValueType ResTy, ValueType OpTy, SDNode OpNode, bit Commutable>
Evan Chengf81bf152009-11-23 21:57:23 +00002482 : N3VX<op24, op23, op21_20, op11_8, 1, op4,
Owen Andersonca6945e2010-12-01 00:28:25 +00002483 (outs QPR:$Vd), (ins QPR:$Vn, QPR:$Vm), N3RegFrm, itin,
2484 OpcodeStr, "$Vd, $Vn, $Vm", "",
2485 [(set QPR:$Vd, (ResTy (OpNode (OpTy QPR:$Vn), (OpTy QPR:$Vm))))]>{
Bob Wilson5bafff32009-06-22 23:27:02 +00002486 let isCommutable = Commutable;
2487}
Jim Grosbach1251e1a2010-11-18 01:39:50 +00002488class N3VQSL<bits<2> op21_20, bits<4> op11_8,
Evan Chengf81bf152009-11-23 21:57:23 +00002489 InstrItinClass itin, string OpcodeStr, string Dt,
David Goodwin658ea602009-09-25 18:38:29 +00002490 ValueType ResTy, ValueType OpTy, SDNode ShOp>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00002491 : N3VLane32<1, 1, op21_20, op11_8, 1, 0,
Jim Grosbacha7d2e752011-10-18 20:21:17 +00002492 (outs QPR:$Vd), (ins QPR:$Vn, DPR_VFP2:$Vm, VectorIndex32:$lane),
2493 NVMulSLFrm, itin, OpcodeStr, Dt, "$Vd, $Vn, $Vm$lane", "",
Owen Andersonca6945e2010-12-01 00:28:25 +00002494 [(set (ResTy QPR:$Vd),
2495 (ResTy (ShOp (ResTy QPR:$Vn),
2496 (ResTy (NEONvduplane (OpTy DPR_VFP2:$Vm),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002497 imm:$lane)))))]> {
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00002498 let isCommutable = 0;
2499}
Bob Wilson9abe19d2010-02-17 00:31:29 +00002500class N3VQSL16<bits<2> op21_20, bits<4> op11_8, string OpcodeStr, string Dt,
Evan Chengf81bf152009-11-23 21:57:23 +00002501 ValueType ResTy, ValueType OpTy, SDNode ShOp>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00002502 : N3VLane16<1, 1, op21_20, op11_8, 1, 0,
Jim Grosbacha7d2e752011-10-18 20:21:17 +00002503 (outs QPR:$Vd), (ins QPR:$Vn, DPR_8:$Vm, VectorIndex16:$lane),
2504 NVMulSLFrm, IIC_VMULi16Q, OpcodeStr, Dt,"$Vd, $Vn, $Vm$lane", "",
Owen Andersonca6945e2010-12-01 00:28:25 +00002505 [(set (ResTy QPR:$Vd),
2506 (ResTy (ShOp (ResTy QPR:$Vn),
2507 (ResTy (NEONvduplane (OpTy DPR_8:$Vm),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002508 imm:$lane)))))]> {
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00002509 let isCommutable = 0;
2510}
Bob Wilson5bafff32009-06-22 23:27:02 +00002511
2512// Basic 3-register intrinsics, both double- and quad-register.
2513class N3VDInt<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00002514 Format f, InstrItinClass itin, string OpcodeStr, string Dt,
Bob Wilson9abe19d2010-02-17 00:31:29 +00002515 ValueType ResTy, ValueType OpTy, Intrinsic IntOp, bit Commutable>
Bob Wilson10bc69c2010-03-27 03:56:52 +00002516 : N3V<op24, op23, op21_20, op11_8, 0, op4,
Owen Andersond451f882010-10-21 20:21:49 +00002517 (outs DPR:$Vd), (ins DPR:$Vn, DPR:$Vm), f, itin,
2518 OpcodeStr, Dt, "$Vd, $Vn, $Vm", "",
2519 [(set DPR:$Vd, (ResTy (IntOp (OpTy DPR:$Vn), (OpTy DPR:$Vm))))]> {
Bob Wilson5bafff32009-06-22 23:27:02 +00002520 let isCommutable = Commutable;
2521}
Jim Grosbach1251e1a2010-11-18 01:39:50 +00002522class N3VDIntSL<bits<2> op21_20, bits<4> op11_8, InstrItinClass itin,
Evan Chengf81bf152009-11-23 21:57:23 +00002523 string OpcodeStr, string Dt, ValueType Ty, Intrinsic IntOp>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00002524 : N3VLane32<0, 1, op21_20, op11_8, 1, 0,
Jim Grosbach0a037402011-10-18 18:12:09 +00002525 (outs DPR:$Vd), (ins DPR:$Vn, DPR_VFP2:$Vm, VectorIndex32:$lane),
2526 NVMulSLFrm, itin, OpcodeStr, Dt, "$Vd, $Vn, $Vm$lane", "",
Owen Andersonca6945e2010-12-01 00:28:25 +00002527 [(set (Ty DPR:$Vd),
2528 (Ty (IntOp (Ty DPR:$Vn),
2529 (Ty (NEONvduplane (Ty DPR_VFP2:$Vm),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002530 imm:$lane)))))]> {
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00002531 let isCommutable = 0;
2532}
David Goodwin658ea602009-09-25 18:38:29 +00002533class N3VDIntSL16<bits<2> op21_20, bits<4> op11_8, InstrItinClass itin,
Evan Chengf81bf152009-11-23 21:57:23 +00002534 string OpcodeStr, string Dt, ValueType Ty, Intrinsic IntOp>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00002535 : N3VLane16<0, 1, op21_20, op11_8, 1, 0,
Jim Grosbach0a037402011-10-18 18:12:09 +00002536 (outs DPR:$Vd), (ins DPR:$Vn, DPR_8:$Vm, VectorIndex16:$lane),
2537 NVMulSLFrm, itin, OpcodeStr, Dt, "$Vd, $Vn, $Vm$lane", "",
Owen Andersonca6945e2010-12-01 00:28:25 +00002538 [(set (Ty DPR:$Vd),
2539 (Ty (IntOp (Ty DPR:$Vn),
2540 (Ty (NEONvduplane (Ty DPR_8:$Vm), imm:$lane)))))]> {
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00002541 let isCommutable = 0;
2542}
Owen Anderson3557d002010-10-26 20:56:57 +00002543class N3VDIntSh<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
2544 Format f, InstrItinClass itin, string OpcodeStr, string Dt,
Owen Andersonac922622010-10-26 21:13:59 +00002545 ValueType ResTy, ValueType OpTy, Intrinsic IntOp>
Owen Anderson3557d002010-10-26 20:56:57 +00002546 : N3V<op24, op23, op21_20, op11_8, 0, op4,
2547 (outs DPR:$Vd), (ins DPR:$Vm, DPR:$Vn), f, itin,
2548 OpcodeStr, Dt, "$Vd, $Vm, $Vn", "",
2549 [(set DPR:$Vd, (ResTy (IntOp (OpTy DPR:$Vm), (OpTy DPR:$Vn))))]> {
Owen Andersonac922622010-10-26 21:13:59 +00002550 let isCommutable = 0;
Owen Anderson3557d002010-10-26 20:56:57 +00002551}
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00002552
Bob Wilson5bafff32009-06-22 23:27:02 +00002553class N3VQInt<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00002554 Format f, InstrItinClass itin, string OpcodeStr, string Dt,
Bob Wilson9abe19d2010-02-17 00:31:29 +00002555 ValueType ResTy, ValueType OpTy, Intrinsic IntOp, bit Commutable>
Bob Wilson10bc69c2010-03-27 03:56:52 +00002556 : N3V<op24, op23, op21_20, op11_8, 1, op4,
Owen Andersond451f882010-10-21 20:21:49 +00002557 (outs QPR:$Vd), (ins QPR:$Vn, QPR:$Vm), f, itin,
2558 OpcodeStr, Dt, "$Vd, $Vn, $Vm", "",
2559 [(set QPR:$Vd, (ResTy (IntOp (OpTy QPR:$Vn), (OpTy QPR:$Vm))))]> {
Bob Wilson5bafff32009-06-22 23:27:02 +00002560 let isCommutable = Commutable;
2561}
Jim Grosbach1251e1a2010-11-18 01:39:50 +00002562class N3VQIntSL<bits<2> op21_20, bits<4> op11_8, InstrItinClass itin,
Evan Chengf81bf152009-11-23 21:57:23 +00002563 string OpcodeStr, string Dt,
2564 ValueType ResTy, ValueType OpTy, Intrinsic IntOp>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00002565 : N3VLane32<1, 1, op21_20, op11_8, 1, 0,
Jim Grosbacha7d2e752011-10-18 20:21:17 +00002566 (outs QPR:$Vd), (ins QPR:$Vn, DPR_VFP2:$Vm, VectorIndex32:$lane),
2567 NVMulSLFrm, itin, OpcodeStr, Dt, "$Vd, $Vn, $Vm$lane", "",
Owen Andersonca6945e2010-12-01 00:28:25 +00002568 [(set (ResTy QPR:$Vd),
2569 (ResTy (IntOp (ResTy QPR:$Vn),
2570 (ResTy (NEONvduplane (OpTy DPR_VFP2:$Vm),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002571 imm:$lane)))))]> {
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00002572 let isCommutable = 0;
2573}
David Goodwin658ea602009-09-25 18:38:29 +00002574class N3VQIntSL16<bits<2> op21_20, bits<4> op11_8, InstrItinClass itin,
Evan Chengf81bf152009-11-23 21:57:23 +00002575 string OpcodeStr, string Dt,
2576 ValueType ResTy, ValueType OpTy, Intrinsic IntOp>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00002577 : N3VLane16<1, 1, op21_20, op11_8, 1, 0,
Jim Grosbacha7d2e752011-10-18 20:21:17 +00002578 (outs QPR:$Vd), (ins QPR:$Vn, DPR_8:$Vm, VectorIndex16:$lane),
2579 NVMulSLFrm, itin, OpcodeStr, Dt, "$Vd, $Vn, $Vm$lane", "",
Owen Andersonca6945e2010-12-01 00:28:25 +00002580 [(set (ResTy QPR:$Vd),
2581 (ResTy (IntOp (ResTy QPR:$Vn),
2582 (ResTy (NEONvduplane (OpTy DPR_8:$Vm),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002583 imm:$lane)))))]> {
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00002584 let isCommutable = 0;
2585}
Owen Anderson3557d002010-10-26 20:56:57 +00002586class N3VQIntSh<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
2587 Format f, InstrItinClass itin, string OpcodeStr, string Dt,
Owen Andersonac922622010-10-26 21:13:59 +00002588 ValueType ResTy, ValueType OpTy, Intrinsic IntOp>
Owen Anderson3557d002010-10-26 20:56:57 +00002589 : N3V<op24, op23, op21_20, op11_8, 1, op4,
2590 (outs QPR:$Vd), (ins QPR:$Vm, QPR:$Vn), f, itin,
2591 OpcodeStr, Dt, "$Vd, $Vm, $Vn", "",
2592 [(set QPR:$Vd, (ResTy (IntOp (OpTy QPR:$Vm), (OpTy QPR:$Vn))))]> {
Owen Andersonac922622010-10-26 21:13:59 +00002593 let isCommutable = 0;
Owen Anderson3557d002010-10-26 20:56:57 +00002594}
Bob Wilson5bafff32009-06-22 23:27:02 +00002595
Bob Wilson4711d5c2010-12-13 23:02:37 +00002596// Multiply-Add/Sub operations: double- and quad-register.
Bob Wilson5bafff32009-06-22 23:27:02 +00002597class N3VDMulOp<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
Evan Chengf81bf152009-11-23 21:57:23 +00002598 InstrItinClass itin, string OpcodeStr, string Dt,
Evan Cheng48575f62010-12-05 22:04:16 +00002599 ValueType Ty, SDPatternOperator MulOp, SDPatternOperator OpNode>
Bob Wilson5bafff32009-06-22 23:27:02 +00002600 : N3V<op24, op23, op21_20, op11_8, 0, op4,
Owen Anderson18341e92010-10-22 18:54:37 +00002601 (outs DPR:$Vd), (ins DPR:$src1, DPR:$Vn, DPR:$Vm), N3RegFrm, itin,
2602 OpcodeStr, Dt, "$Vd, $Vn, $Vm", "$src1 = $Vd",
2603 [(set DPR:$Vd, (Ty (OpNode DPR:$src1,
2604 (Ty (MulOp DPR:$Vn, DPR:$Vm)))))]>;
2605
David Goodwin658ea602009-09-25 18:38:29 +00002606class N3VDMulOpSL<bits<2> op21_20, bits<4> op11_8, InstrItinClass itin,
Evan Chengf81bf152009-11-23 21:57:23 +00002607 string OpcodeStr, string Dt,
Evan Cheng48575f62010-12-05 22:04:16 +00002608 ValueType Ty, SDPatternOperator MulOp, SDPatternOperator ShOp>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00002609 : N3VLane32<0, 1, op21_20, op11_8, 1, 0,
Owen Andersonca6945e2010-12-01 00:28:25 +00002610 (outs DPR:$Vd),
Jim Grosbach91200882011-10-18 18:27:07 +00002611 (ins DPR:$src1, DPR:$Vn, DPR_VFP2:$Vm, VectorIndex32:$lane),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002612 NVMulSLFrm, itin,
Jim Grosbach91200882011-10-18 18:27:07 +00002613 OpcodeStr, Dt, "$Vd, $Vn, $Vm$lane", "$src1 = $Vd",
Owen Andersonca6945e2010-12-01 00:28:25 +00002614 [(set (Ty DPR:$Vd),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002615 (Ty (ShOp (Ty DPR:$src1),
Owen Andersonca6945e2010-12-01 00:28:25 +00002616 (Ty (MulOp DPR:$Vn,
2617 (Ty (NEONvduplane (Ty DPR_VFP2:$Vm),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002618 imm:$lane)))))))]>;
David Goodwin658ea602009-09-25 18:38:29 +00002619class N3VDMulOpSL16<bits<2> op21_20, bits<4> op11_8, InstrItinClass itin,
Evan Chengf81bf152009-11-23 21:57:23 +00002620 string OpcodeStr, string Dt,
2621 ValueType Ty, SDNode MulOp, SDNode ShOp>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00002622 : N3VLane16<0, 1, op21_20, op11_8, 1, 0,
Owen Anderson18341e92010-10-22 18:54:37 +00002623 (outs DPR:$Vd),
Jim Grosbach91200882011-10-18 18:27:07 +00002624 (ins DPR:$src1, DPR:$Vn, DPR_8:$Vm, VectorIndex16:$lane),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002625 NVMulSLFrm, itin,
Jim Grosbach91200882011-10-18 18:27:07 +00002626 OpcodeStr, Dt, "$Vd, $Vn, $Vm$lane", "$src1 = $Vd",
Owen Anderson18341e92010-10-22 18:54:37 +00002627 [(set (Ty DPR:$Vd),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002628 (Ty (ShOp (Ty DPR:$src1),
Owen Anderson18341e92010-10-22 18:54:37 +00002629 (Ty (MulOp DPR:$Vn,
2630 (Ty (NEONvduplane (Ty DPR_8:$Vm),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002631 imm:$lane)))))))]>;
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00002632
Bob Wilson5bafff32009-06-22 23:27:02 +00002633class N3VQMulOp<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
Evan Chengf81bf152009-11-23 21:57:23 +00002634 InstrItinClass itin, string OpcodeStr, string Dt, ValueType Ty,
Evan Cheng48575f62010-12-05 22:04:16 +00002635 SDPatternOperator MulOp, SDPatternOperator OpNode>
Bob Wilson5bafff32009-06-22 23:27:02 +00002636 : N3V<op24, op23, op21_20, op11_8, 1, op4,
Owen Anderson18341e92010-10-22 18:54:37 +00002637 (outs QPR:$Vd), (ins QPR:$src1, QPR:$Vn, QPR:$Vm), N3RegFrm, itin,
2638 OpcodeStr, Dt, "$Vd, $Vn, $Vm", "$src1 = $Vd",
2639 [(set QPR:$Vd, (Ty (OpNode QPR:$src1,
2640 (Ty (MulOp QPR:$Vn, QPR:$Vm)))))]>;
David Goodwin658ea602009-09-25 18:38:29 +00002641class N3VQMulOpSL<bits<2> op21_20, bits<4> op11_8, InstrItinClass itin,
Evan Chengf81bf152009-11-23 21:57:23 +00002642 string OpcodeStr, string Dt, ValueType ResTy, ValueType OpTy,
Evan Cheng48575f62010-12-05 22:04:16 +00002643 SDPatternOperator MulOp, SDPatternOperator ShOp>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00002644 : N3VLane32<1, 1, op21_20, op11_8, 1, 0,
Owen Andersonca6945e2010-12-01 00:28:25 +00002645 (outs QPR:$Vd),
Jim Grosbach91200882011-10-18 18:27:07 +00002646 (ins QPR:$src1, QPR:$Vn, DPR_VFP2:$Vm, VectorIndex32:$lane),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002647 NVMulSLFrm, itin,
Jim Grosbach91200882011-10-18 18:27:07 +00002648 OpcodeStr, Dt, "$Vd, $Vn, $Vm$lane", "$src1 = $Vd",
Owen Andersonca6945e2010-12-01 00:28:25 +00002649 [(set (ResTy QPR:$Vd),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002650 (ResTy (ShOp (ResTy QPR:$src1),
Owen Andersonca6945e2010-12-01 00:28:25 +00002651 (ResTy (MulOp QPR:$Vn,
2652 (ResTy (NEONvduplane (OpTy DPR_VFP2:$Vm),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002653 imm:$lane)))))))]>;
David Goodwin658ea602009-09-25 18:38:29 +00002654class N3VQMulOpSL16<bits<2> op21_20, bits<4> op11_8, InstrItinClass itin,
Evan Chengf81bf152009-11-23 21:57:23 +00002655 string OpcodeStr, string Dt,
2656 ValueType ResTy, ValueType OpTy,
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00002657 SDNode MulOp, SDNode ShOp>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00002658 : N3VLane16<1, 1, op21_20, op11_8, 1, 0,
Owen Andersonca6945e2010-12-01 00:28:25 +00002659 (outs QPR:$Vd),
Jim Grosbach91200882011-10-18 18:27:07 +00002660 (ins QPR:$src1, QPR:$Vn, DPR_8:$Vm, VectorIndex16:$lane),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002661 NVMulSLFrm, itin,
Jim Grosbach91200882011-10-18 18:27:07 +00002662 OpcodeStr, Dt, "$Vd, $Vn, $Vm$lane", "$src1 = $Vd",
Owen Andersonca6945e2010-12-01 00:28:25 +00002663 [(set (ResTy QPR:$Vd),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002664 (ResTy (ShOp (ResTy QPR:$src1),
Owen Andersonca6945e2010-12-01 00:28:25 +00002665 (ResTy (MulOp QPR:$Vn,
2666 (ResTy (NEONvduplane (OpTy DPR_8:$Vm),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002667 imm:$lane)))))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002668
Bob Wilsoneb0c3d32010-09-03 01:35:08 +00002669// Neon Intrinsic-Op instructions (VABA): double- and quad-register.
2670class N3VDIntOp<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
2671 InstrItinClass itin, string OpcodeStr, string Dt,
2672 ValueType Ty, Intrinsic IntOp, SDNode OpNode>
2673 : N3V<op24, op23, op21_20, op11_8, 0, op4,
Owen Anderson410aebc2010-10-25 20:52:57 +00002674 (outs DPR:$Vd), (ins DPR:$src1, DPR:$Vn, DPR:$Vm), N3RegFrm, itin,
2675 OpcodeStr, Dt, "$Vd, $Vn, $Vm", "$src1 = $Vd",
2676 [(set DPR:$Vd, (Ty (OpNode DPR:$src1,
2677 (Ty (IntOp (Ty DPR:$Vn), (Ty DPR:$Vm))))))]>;
Bob Wilsoneb0c3d32010-09-03 01:35:08 +00002678class N3VQIntOp<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
2679 InstrItinClass itin, string OpcodeStr, string Dt,
2680 ValueType Ty, Intrinsic IntOp, SDNode OpNode>
2681 : N3V<op24, op23, op21_20, op11_8, 1, op4,
Owen Anderson410aebc2010-10-25 20:52:57 +00002682 (outs QPR:$Vd), (ins QPR:$src1, QPR:$Vn, QPR:$Vm), N3RegFrm, itin,
2683 OpcodeStr, Dt, "$Vd, $Vn, $Vm", "$src1 = $Vd",
2684 [(set QPR:$Vd, (Ty (OpNode QPR:$src1,
2685 (Ty (IntOp (Ty QPR:$Vn), (Ty QPR:$Vm))))))]>;
Bob Wilsoneb0c3d32010-09-03 01:35:08 +00002686
Bob Wilson5bafff32009-06-22 23:27:02 +00002687// Neon 3-argument intrinsics, both double- and quad-register.
2688// The destination register is also used as the first source operand register.
2689class N3VDInt3<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
Evan Chengf81bf152009-11-23 21:57:23 +00002690 InstrItinClass itin, string OpcodeStr, string Dt,
David Goodwin658ea602009-09-25 18:38:29 +00002691 ValueType ResTy, ValueType OpTy, Intrinsic IntOp>
Bob Wilson5bafff32009-06-22 23:27:02 +00002692 : N3V<op24, op23, op21_20, op11_8, 0, op4,
Owen Andersonca6945e2010-12-01 00:28:25 +00002693 (outs DPR:$Vd), (ins DPR:$src1, DPR:$Vn, DPR:$Vm), N3RegFrm, itin,
2694 OpcodeStr, Dt, "$Vd, $Vn, $Vm", "$src1 = $Vd",
2695 [(set DPR:$Vd, (ResTy (IntOp (OpTy DPR:$src1),
2696 (OpTy DPR:$Vn), (OpTy DPR:$Vm))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002697class N3VQInt3<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
Evan Chengf81bf152009-11-23 21:57:23 +00002698 InstrItinClass itin, string OpcodeStr, string Dt,
David Goodwin658ea602009-09-25 18:38:29 +00002699 ValueType ResTy, ValueType OpTy, Intrinsic IntOp>
Bob Wilson5bafff32009-06-22 23:27:02 +00002700 : N3V<op24, op23, op21_20, op11_8, 1, op4,
Owen Andersonca6945e2010-12-01 00:28:25 +00002701 (outs QPR:$Vd), (ins QPR:$src1, QPR:$Vn, QPR:$Vm), N3RegFrm, itin,
2702 OpcodeStr, Dt, "$Vd, $Vn, $Vm", "$src1 = $Vd",
2703 [(set QPR:$Vd, (ResTy (IntOp (OpTy QPR:$src1),
2704 (OpTy QPR:$Vn), (OpTy QPR:$Vm))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002705
Bob Wilsond0b69cf2010-09-01 23:50:19 +00002706// Long Multiply-Add/Sub operations.
2707class N3VLMulOp<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
2708 InstrItinClass itin, string OpcodeStr, string Dt,
2709 ValueType TyQ, ValueType TyD, SDNode MulOp, SDNode OpNode>
2710 : N3V<op24, op23, op21_20, op11_8, 0, op4,
Owen Anderson92205842010-10-22 19:05:25 +00002711 (outs QPR:$Vd), (ins QPR:$src1, DPR:$Vn, DPR:$Vm), N3RegFrm, itin,
2712 OpcodeStr, Dt, "$Vd, $Vn, $Vm", "$src1 = $Vd",
2713 [(set QPR:$Vd, (OpNode (TyQ QPR:$src1),
2714 (TyQ (MulOp (TyD DPR:$Vn),
2715 (TyD DPR:$Vm)))))]>;
Bob Wilsond0b69cf2010-09-01 23:50:19 +00002716class N3VLMulOpSL<bit op24, bits<2> op21_20, bits<4> op11_8,
2717 InstrItinClass itin, string OpcodeStr, string Dt,
2718 ValueType TyQ, ValueType TyD, SDNode MulOp, SDNode OpNode>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00002719 : N3VLane32<op24, 1, op21_20, op11_8, 1, 0, (outs QPR:$Vd),
Jim Grosbachaead5792011-10-18 20:14:56 +00002720 (ins QPR:$src1, DPR:$Vn, DPR_VFP2:$Vm, VectorIndex32:$lane),
Bob Wilsond0b69cf2010-09-01 23:50:19 +00002721 NVMulSLFrm, itin,
Jim Grosbachaead5792011-10-18 20:14:56 +00002722 OpcodeStr, Dt, "$Vd, $Vn, $Vm$lane", "$src1 = $Vd",
Owen Andersonca6945e2010-12-01 00:28:25 +00002723 [(set QPR:$Vd,
Bob Wilsond0b69cf2010-09-01 23:50:19 +00002724 (OpNode (TyQ QPR:$src1),
Owen Andersonca6945e2010-12-01 00:28:25 +00002725 (TyQ (MulOp (TyD DPR:$Vn),
2726 (TyD (NEONvduplane (TyD DPR_VFP2:$Vm),
Bob Wilsond0b69cf2010-09-01 23:50:19 +00002727 imm:$lane))))))]>;
2728class N3VLMulOpSL16<bit op24, bits<2> op21_20, bits<4> op11_8,
2729 InstrItinClass itin, string OpcodeStr, string Dt,
2730 ValueType TyQ, ValueType TyD, SDNode MulOp, SDNode OpNode>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00002731 : N3VLane16<op24, 1, op21_20, op11_8, 1, 0, (outs QPR:$Vd),
Jim Grosbachaead5792011-10-18 20:14:56 +00002732 (ins QPR:$src1, DPR:$Vn, DPR_8:$Vm, VectorIndex16:$lane),
Bob Wilsond0b69cf2010-09-01 23:50:19 +00002733 NVMulSLFrm, itin,
Jim Grosbachaead5792011-10-18 20:14:56 +00002734 OpcodeStr, Dt, "$Vd, $Vn, $Vm$lane", "$src1 = $Vd",
Owen Andersonca6945e2010-12-01 00:28:25 +00002735 [(set QPR:$Vd,
Bob Wilsond0b69cf2010-09-01 23:50:19 +00002736 (OpNode (TyQ QPR:$src1),
Owen Andersonca6945e2010-12-01 00:28:25 +00002737 (TyQ (MulOp (TyD DPR:$Vn),
2738 (TyD (NEONvduplane (TyD DPR_8:$Vm),
Bob Wilsond0b69cf2010-09-01 23:50:19 +00002739 imm:$lane))))))]>;
2740
Bob Wilsoneb0c3d32010-09-03 01:35:08 +00002741// Long Intrinsic-Op vector operations with explicit extend (VABAL).
2742class N3VLIntExtOp<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
2743 InstrItinClass itin, string OpcodeStr, string Dt,
2744 ValueType TyQ, ValueType TyD, Intrinsic IntOp, SDNode ExtOp,
2745 SDNode OpNode>
2746 : N3V<op24, op23, op21_20, op11_8, 0, op4,
Owen Anderson5258b612010-10-25 21:29:04 +00002747 (outs QPR:$Vd), (ins QPR:$src1, DPR:$Vn, DPR:$Vm), N3RegFrm, itin,
2748 OpcodeStr, Dt, "$Vd, $Vn, $Vm", "$src1 = $Vd",
2749 [(set QPR:$Vd, (OpNode (TyQ QPR:$src1),
2750 (TyQ (ExtOp (TyD (IntOp (TyD DPR:$Vn),
2751 (TyD DPR:$Vm)))))))]>;
Bob Wilsond0b69cf2010-09-01 23:50:19 +00002752
Bob Wilson5bafff32009-06-22 23:27:02 +00002753// Neon Long 3-argument intrinsic. The destination register is
2754// a quad-register and is also used as the first source operand register.
2755class N3VLInt3<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
Evan Chengf81bf152009-11-23 21:57:23 +00002756 InstrItinClass itin, string OpcodeStr, string Dt,
David Goodwin658ea602009-09-25 18:38:29 +00002757 ValueType TyQ, ValueType TyD, Intrinsic IntOp>
Bob Wilson5bafff32009-06-22 23:27:02 +00002758 : N3V<op24, op23, op21_20, op11_8, 0, op4,
Owen Anderson9b264972010-10-22 19:35:48 +00002759 (outs QPR:$Vd), (ins QPR:$src1, DPR:$Vn, DPR:$Vm), N3RegFrm, itin,
2760 OpcodeStr, Dt, "$Vd, $Vn, $Vm", "$src1 = $Vd",
2761 [(set QPR:$Vd,
2762 (TyQ (IntOp (TyQ QPR:$src1), (TyD DPR:$Vn), (TyD DPR:$Vm))))]>;
David Goodwin658ea602009-09-25 18:38:29 +00002763class N3VLInt3SL<bit op24, bits<2> op21_20, bits<4> op11_8, InstrItinClass itin,
Evan Chengf81bf152009-11-23 21:57:23 +00002764 string OpcodeStr, string Dt,
2765 ValueType ResTy, ValueType OpTy, Intrinsic IntOp>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00002766 : N3VLane32<op24, 1, op21_20, op11_8, 1, 0,
Owen Andersonca6945e2010-12-01 00:28:25 +00002767 (outs QPR:$Vd),
Jim Grosbacha7d2e752011-10-18 20:21:17 +00002768 (ins QPR:$src1, DPR:$Vn, DPR_VFP2:$Vm, VectorIndex32:$lane),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002769 NVMulSLFrm, itin,
Jim Grosbacha7d2e752011-10-18 20:21:17 +00002770 OpcodeStr, Dt, "$Vd, $Vn, $Vm$lane", "$src1 = $Vd",
Owen Andersonca6945e2010-12-01 00:28:25 +00002771 [(set (ResTy QPR:$Vd),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002772 (ResTy (IntOp (ResTy QPR:$src1),
Owen Andersonca6945e2010-12-01 00:28:25 +00002773 (OpTy DPR:$Vn),
2774 (OpTy (NEONvduplane (OpTy DPR_VFP2:$Vm),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002775 imm:$lane)))))]>;
Bob Wilson9abe19d2010-02-17 00:31:29 +00002776class N3VLInt3SL16<bit op24, bits<2> op21_20, bits<4> op11_8,
2777 InstrItinClass itin, string OpcodeStr, string Dt,
2778 ValueType ResTy, ValueType OpTy, Intrinsic IntOp>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00002779 : N3VLane16<op24, 1, op21_20, op11_8, 1, 0,
Owen Andersonca6945e2010-12-01 00:28:25 +00002780 (outs QPR:$Vd),
Jim Grosbache873d2a2011-10-18 17:16:30 +00002781 (ins QPR:$src1, DPR:$Vn, DPR_8:$Vm, VectorIndex16:$lane),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002782 NVMulSLFrm, itin,
Jim Grosbache873d2a2011-10-18 17:16:30 +00002783 OpcodeStr, Dt, "$Vd, $Vn, $Vm$lane", "$src1 = $Vd",
Owen Andersonca6945e2010-12-01 00:28:25 +00002784 [(set (ResTy QPR:$Vd),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002785 (ResTy (IntOp (ResTy QPR:$src1),
Owen Andersonca6945e2010-12-01 00:28:25 +00002786 (OpTy DPR:$Vn),
2787 (OpTy (NEONvduplane (OpTy DPR_8:$Vm),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002788 imm:$lane)))))]>;
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00002789
Bob Wilson5bafff32009-06-22 23:27:02 +00002790// Narrowing 3-register intrinsics.
2791class N3VNInt<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
Evan Chengf81bf152009-11-23 21:57:23 +00002792 string OpcodeStr, string Dt, ValueType TyD, ValueType TyQ,
Bob Wilson5bafff32009-06-22 23:27:02 +00002793 Intrinsic IntOp, bit Commutable>
2794 : N3V<op24, op23, op21_20, op11_8, 0, op4,
Owen Andersonca6945e2010-12-01 00:28:25 +00002795 (outs DPR:$Vd), (ins QPR:$Vn, QPR:$Vm), N3RegFrm, IIC_VBINi4D,
2796 OpcodeStr, Dt, "$Vd, $Vn, $Vm", "",
2797 [(set DPR:$Vd, (TyD (IntOp (TyQ QPR:$Vn), (TyQ QPR:$Vm))))]> {
Bob Wilson5bafff32009-06-22 23:27:02 +00002798 let isCommutable = Commutable;
2799}
2800
Bob Wilson04d6c282010-08-29 05:57:34 +00002801// Long 3-register operations.
2802class N3VL<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
2803 InstrItinClass itin, string OpcodeStr, string Dt,
Bob Wilsond0b69cf2010-09-01 23:50:19 +00002804 ValueType TyQ, ValueType TyD, SDNode OpNode, bit Commutable>
2805 : N3V<op24, op23, op21_20, op11_8, 0, op4,
Owen Andersonca6945e2010-12-01 00:28:25 +00002806 (outs QPR:$Vd), (ins DPR:$Vn, DPR:$Vm), N3RegFrm, itin,
2807 OpcodeStr, Dt, "$Vd, $Vn, $Vm", "",
2808 [(set QPR:$Vd, (TyQ (OpNode (TyD DPR:$Vn), (TyD DPR:$Vm))))]> {
Bob Wilsond0b69cf2010-09-01 23:50:19 +00002809 let isCommutable = Commutable;
2810}
2811class N3VLSL<bit op24, bits<2> op21_20, bits<4> op11_8,
2812 InstrItinClass itin, string OpcodeStr, string Dt,
2813 ValueType TyQ, ValueType TyD, SDNode OpNode>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00002814 : N3VLane32<op24, 1, op21_20, op11_8, 1, 0,
Jim Grosbacha7d2e752011-10-18 20:21:17 +00002815 (outs QPR:$Vd), (ins DPR:$Vn, DPR_VFP2:$Vm, VectorIndex32:$lane),
2816 NVMulSLFrm, itin, OpcodeStr, Dt, "$Vd, $Vn, $Vm$lane", "",
Owen Andersonca6945e2010-12-01 00:28:25 +00002817 [(set QPR:$Vd,
2818 (TyQ (OpNode (TyD DPR:$Vn),
2819 (TyD (NEONvduplane (TyD DPR_VFP2:$Vm),imm:$lane)))))]>;
Bob Wilsond0b69cf2010-09-01 23:50:19 +00002820class N3VLSL16<bit op24, bits<2> op21_20, bits<4> op11_8,
2821 InstrItinClass itin, string OpcodeStr, string Dt,
2822 ValueType TyQ, ValueType TyD, SDNode OpNode>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00002823 : N3VLane16<op24, 1, op21_20, op11_8, 1, 0,
Jim Grosbacha7d2e752011-10-18 20:21:17 +00002824 (outs QPR:$Vd), (ins DPR:$Vn, DPR_8:$Vm, VectorIndex16:$lane),
2825 NVMulSLFrm, itin, OpcodeStr, Dt, "$Vd, $Vn, $Vm$lane", "",
Owen Andersonca6945e2010-12-01 00:28:25 +00002826 [(set QPR:$Vd,
2827 (TyQ (OpNode (TyD DPR:$Vn),
2828 (TyD (NEONvduplane (TyD DPR_8:$Vm), imm:$lane)))))]>;
Bob Wilsond0b69cf2010-09-01 23:50:19 +00002829
2830// Long 3-register operations with explicitly extended operands.
2831class N3VLExt<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
2832 InstrItinClass itin, string OpcodeStr, string Dt,
2833 ValueType TyQ, ValueType TyD, SDNode OpNode, SDNode ExtOp,
2834 bit Commutable>
Bob Wilson04d6c282010-08-29 05:57:34 +00002835 : N3V<op24, op23, op21_20, op11_8, 0, op4,
Owen Andersonca6945e2010-12-01 00:28:25 +00002836 (outs QPR:$Vd), (ins DPR:$Vn, DPR:$Vm), N3RegFrm, itin,
2837 OpcodeStr, Dt, "$Vd, $Vn, $Vm", "",
2838 [(set QPR:$Vd, (OpNode (TyQ (ExtOp (TyD DPR:$Vn))),
2839 (TyQ (ExtOp (TyD DPR:$Vm)))))]> {
Owen Andersone0e6dc32010-10-21 18:09:17 +00002840 let isCommutable = Commutable;
Bob Wilson04d6c282010-08-29 05:57:34 +00002841}
2842
Bob Wilsoneb0c3d32010-09-03 01:35:08 +00002843// Long 3-register intrinsics with explicit extend (VABDL).
2844class N3VLIntExt<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
2845 InstrItinClass itin, string OpcodeStr, string Dt,
2846 ValueType TyQ, ValueType TyD, Intrinsic IntOp, SDNode ExtOp,
2847 bit Commutable>
2848 : N3V<op24, op23, op21_20, op11_8, 0, op4,
Owen Andersonca6945e2010-12-01 00:28:25 +00002849 (outs QPR:$Vd), (ins DPR:$Vn, DPR:$Vm), N3RegFrm, itin,
2850 OpcodeStr, Dt, "$Vd, $Vn, $Vm", "",
2851 [(set QPR:$Vd, (TyQ (ExtOp (TyD (IntOp (TyD DPR:$Vn),
2852 (TyD DPR:$Vm))))))]> {
Bob Wilsoneb0c3d32010-09-03 01:35:08 +00002853 let isCommutable = Commutable;
2854}
2855
Bob Wilson5bafff32009-06-22 23:27:02 +00002856// Long 3-register intrinsics.
2857class N3VLInt<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
Evan Chengf81bf152009-11-23 21:57:23 +00002858 InstrItinClass itin, string OpcodeStr, string Dt,
2859 ValueType TyQ, ValueType TyD, Intrinsic IntOp, bit Commutable>
Bob Wilson5bafff32009-06-22 23:27:02 +00002860 : N3V<op24, op23, op21_20, op11_8, 0, op4,
Owen Andersonca6945e2010-12-01 00:28:25 +00002861 (outs QPR:$Vd), (ins DPR:$Vn, DPR:$Vm), N3RegFrm, itin,
2862 OpcodeStr, Dt, "$Vd, $Vn, $Vm", "",
2863 [(set QPR:$Vd, (TyQ (IntOp (TyD DPR:$Vn), (TyD DPR:$Vm))))]> {
Bob Wilson5bafff32009-06-22 23:27:02 +00002864 let isCommutable = Commutable;
2865}
David Goodwin658ea602009-09-25 18:38:29 +00002866class N3VLIntSL<bit op24, bits<2> op21_20, bits<4> op11_8, InstrItinClass itin,
Evan Chengf81bf152009-11-23 21:57:23 +00002867 string OpcodeStr, string Dt,
2868 ValueType ResTy, ValueType OpTy, Intrinsic IntOp>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00002869 : N3VLane32<op24, 1, op21_20, op11_8, 1, 0,
Jim Grosbacha7d2e752011-10-18 20:21:17 +00002870 (outs QPR:$Vd), (ins DPR:$Vn, DPR_VFP2:$Vm, VectorIndex32:$lane),
2871 NVMulSLFrm, itin, OpcodeStr, Dt, "$Vd, $Vn, $Vm$lane", "",
Owen Andersonca6945e2010-12-01 00:28:25 +00002872 [(set (ResTy QPR:$Vd),
2873 (ResTy (IntOp (OpTy DPR:$Vn),
2874 (OpTy (NEONvduplane (OpTy DPR_VFP2:$Vm),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002875 imm:$lane)))))]>;
Bob Wilson9abe19d2010-02-17 00:31:29 +00002876class N3VLIntSL16<bit op24, bits<2> op21_20, bits<4> op11_8,
2877 InstrItinClass itin, string OpcodeStr, string Dt,
2878 ValueType ResTy, ValueType OpTy, Intrinsic IntOp>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00002879 : N3VLane16<op24, 1, op21_20, op11_8, 1, 0,
Jim Grosbacha7d2e752011-10-18 20:21:17 +00002880 (outs QPR:$Vd), (ins DPR:$Vn, DPR_8:$Vm, VectorIndex16:$lane),
2881 NVMulSLFrm, itin, OpcodeStr, Dt, "$Vd, $Vn, $Vm$lane", "",
Owen Andersonca6945e2010-12-01 00:28:25 +00002882 [(set (ResTy QPR:$Vd),
2883 (ResTy (IntOp (OpTy DPR:$Vn),
2884 (OpTy (NEONvduplane (OpTy DPR_8:$Vm),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002885 imm:$lane)))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002886
Bob Wilson04d6c282010-08-29 05:57:34 +00002887// Wide 3-register operations.
2888class N3VW<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
2889 string OpcodeStr, string Dt, ValueType TyQ, ValueType TyD,
2890 SDNode OpNode, SDNode ExtOp, bit Commutable>
Bob Wilson5bafff32009-06-22 23:27:02 +00002891 : N3V<op24, op23, op21_20, op11_8, 0, op4,
Owen Andersonca6945e2010-12-01 00:28:25 +00002892 (outs QPR:$Vd), (ins QPR:$Vn, DPR:$Vm), N3RegFrm, IIC_VSUBiD,
2893 OpcodeStr, Dt, "$Vd, $Vn, $Vm", "",
2894 [(set QPR:$Vd, (OpNode (TyQ QPR:$Vn),
2895 (TyQ (ExtOp (TyD DPR:$Vm)))))]> {
Bob Wilson5bafff32009-06-22 23:27:02 +00002896 let isCommutable = Commutable;
2897}
2898
2899// Pairwise long 2-register intrinsics, both double- and quad-register.
2900class N2VDPLInt<bits<2> op24_23, bits<2> op21_20, bits<2> op19_18,
Evan Chengf81bf152009-11-23 21:57:23 +00002901 bits<2> op17_16, bits<5> op11_7, bit op4,
2902 string OpcodeStr, string Dt,
Bob Wilson5bafff32009-06-22 23:27:02 +00002903 ValueType ResTy, ValueType OpTy, Intrinsic IntOp>
Owen Andersonca6945e2010-12-01 00:28:25 +00002904 : N2V<op24_23, op21_20, op19_18, op17_16, op11_7, 0, op4, (outs DPR:$Vd),
2905 (ins DPR:$Vm), IIC_VSHLiD, OpcodeStr, Dt, "$Vd, $Vm", "",
2906 [(set DPR:$Vd, (ResTy (IntOp (OpTy DPR:$Vm))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002907class N2VQPLInt<bits<2> op24_23, bits<2> op21_20, bits<2> op19_18,
Evan Chengf81bf152009-11-23 21:57:23 +00002908 bits<2> op17_16, bits<5> op11_7, bit op4,
2909 string OpcodeStr, string Dt,
Bob Wilson5bafff32009-06-22 23:27:02 +00002910 ValueType ResTy, ValueType OpTy, Intrinsic IntOp>
Owen Andersonca6945e2010-12-01 00:28:25 +00002911 : N2V<op24_23, op21_20, op19_18, op17_16, op11_7, 1, op4, (outs QPR:$Vd),
2912 (ins QPR:$Vm), IIC_VSHLiD, OpcodeStr, Dt, "$Vd, $Vm", "",
2913 [(set QPR:$Vd, (ResTy (IntOp (OpTy QPR:$Vm))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002914
2915// Pairwise long 2-register accumulate intrinsics,
2916// both double- and quad-register.
2917// The destination register is also used as the first source operand register.
2918class N2VDPLInt2<bits<2> op24_23, bits<2> op21_20, bits<2> op19_18,
Evan Chengf81bf152009-11-23 21:57:23 +00002919 bits<2> op17_16, bits<5> op11_7, bit op4,
2920 string OpcodeStr, string Dt,
Bob Wilson5bafff32009-06-22 23:27:02 +00002921 ValueType ResTy, ValueType OpTy, Intrinsic IntOp>
2922 : N2V<op24_23, op21_20, op19_18, op17_16, op11_7, 0, op4,
Owen Andersonbc4118b2010-10-26 18:18:03 +00002923 (outs DPR:$Vd), (ins DPR:$src1, DPR:$Vm), IIC_VPALiD,
2924 OpcodeStr, Dt, "$Vd, $Vm", "$src1 = $Vd",
2925 [(set DPR:$Vd, (ResTy (IntOp (ResTy DPR:$src1), (OpTy DPR:$Vm))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002926class N2VQPLInt2<bits<2> op24_23, bits<2> op21_20, bits<2> op19_18,
Evan Chengf81bf152009-11-23 21:57:23 +00002927 bits<2> op17_16, bits<5> op11_7, bit op4,
2928 string OpcodeStr, string Dt,
Bob Wilson5bafff32009-06-22 23:27:02 +00002929 ValueType ResTy, ValueType OpTy, Intrinsic IntOp>
2930 : N2V<op24_23, op21_20, op19_18, op17_16, op11_7, 1, op4,
Owen Andersonbc4118b2010-10-26 18:18:03 +00002931 (outs QPR:$Vd), (ins QPR:$src1, QPR:$Vm), IIC_VPALiQ,
2932 OpcodeStr, Dt, "$Vd, $Vm", "$src1 = $Vd",
2933 [(set QPR:$Vd, (ResTy (IntOp (ResTy QPR:$src1), (OpTy QPR:$Vm))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002934
2935// Shift by immediate,
2936// both double- and quad-register.
Bob Wilson507df402009-10-21 02:15:46 +00002937class N2VDSh<bit op24, bit op23, bits<4> op11_8, bit op7, bit op4,
Bill Wendling7c6b6082011-03-08 23:48:09 +00002938 Format f, InstrItinClass itin, Operand ImmTy,
2939 string OpcodeStr, string Dt, ValueType Ty, SDNode OpNode>
Bob Wilson507df402009-10-21 02:15:46 +00002940 : N2VImm<op24, op23, op11_8, op7, 0, op4,
Bill Wendling7c6b6082011-03-08 23:48:09 +00002941 (outs DPR:$Vd), (ins DPR:$Vm, ImmTy:$SIMM), f, itin,
Owen Andersonca6945e2010-12-01 00:28:25 +00002942 OpcodeStr, Dt, "$Vd, $Vm, $SIMM", "",
2943 [(set DPR:$Vd, (Ty (OpNode (Ty DPR:$Vm), (i32 imm:$SIMM))))]>;
Bob Wilson507df402009-10-21 02:15:46 +00002944class N2VQSh<bit op24, bit op23, bits<4> op11_8, bit op7, bit op4,
Bill Wendling7c6b6082011-03-08 23:48:09 +00002945 Format f, InstrItinClass itin, Operand ImmTy,
2946 string OpcodeStr, string Dt, ValueType Ty, SDNode OpNode>
Bob Wilson507df402009-10-21 02:15:46 +00002947 : N2VImm<op24, op23, op11_8, op7, 1, op4,
Bill Wendling7c6b6082011-03-08 23:48:09 +00002948 (outs QPR:$Vd), (ins QPR:$Vm, ImmTy:$SIMM), f, itin,
Owen Andersonca6945e2010-12-01 00:28:25 +00002949 OpcodeStr, Dt, "$Vd, $Vm, $SIMM", "",
2950 [(set QPR:$Vd, (Ty (OpNode (Ty QPR:$Vm), (i32 imm:$SIMM))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002951
Johnny Chen6c8648b2010-03-17 23:26:50 +00002952// Long shift by immediate.
2953class N2VLSh<bit op24, bit op23, bits<4> op11_8, bit op7, bit op6, bit op4,
2954 string OpcodeStr, string Dt,
Jim Grosbach4e413952011-12-07 00:02:17 +00002955 ValueType ResTy, ValueType OpTy, Operand ImmTy, SDNode OpNode>
Johnny Chen6c8648b2010-03-17 23:26:50 +00002956 : N2VImm<op24, op23, op11_8, op7, op6, op4,
Jim Grosbach4e413952011-12-07 00:02:17 +00002957 (outs QPR:$Vd), (ins DPR:$Vm, ImmTy:$SIMM), N2RegVShLFrm,
Owen Andersonca6945e2010-12-01 00:28:25 +00002958 IIC_VSHLiD, OpcodeStr, Dt, "$Vd, $Vm, $SIMM", "",
2959 [(set QPR:$Vd, (ResTy (OpNode (OpTy DPR:$Vm),
Johnny Chen6c8648b2010-03-17 23:26:50 +00002960 (i32 imm:$SIMM))))]>;
2961
Bob Wilson5bafff32009-06-22 23:27:02 +00002962// Narrow shift by immediate.
Bob Wilson507df402009-10-21 02:15:46 +00002963class N2VNSh<bit op24, bit op23, bits<4> op11_8, bit op7, bit op6, bit op4,
Evan Chengf81bf152009-11-23 21:57:23 +00002964 InstrItinClass itin, string OpcodeStr, string Dt,
Bill Wendlinga656b632011-03-01 01:00:59 +00002965 ValueType ResTy, ValueType OpTy, Operand ImmTy, SDNode OpNode>
Bob Wilson507df402009-10-21 02:15:46 +00002966 : N2VImm<op24, op23, op11_8, op7, op6, op4,
Bill Wendlinga656b632011-03-01 01:00:59 +00002967 (outs DPR:$Vd), (ins QPR:$Vm, ImmTy:$SIMM), N2RegVShRFrm, itin,
Owen Andersonca6945e2010-12-01 00:28:25 +00002968 OpcodeStr, Dt, "$Vd, $Vm, $SIMM", "",
2969 [(set DPR:$Vd, (ResTy (OpNode (OpTy QPR:$Vm),
Bob Wilson5bafff32009-06-22 23:27:02 +00002970 (i32 imm:$SIMM))))]>;
2971
2972// Shift right by immediate and accumulate,
2973// both double- and quad-register.
Bob Wilson507df402009-10-21 02:15:46 +00002974class N2VDShAdd<bit op24, bit op23, bits<4> op11_8, bit op7, bit op4,
Bill Wendlingc04a9de2011-03-09 00:00:35 +00002975 Operand ImmTy, string OpcodeStr, string Dt,
2976 ValueType Ty, SDNode ShOp>
Owen Andersondd31ed62010-10-27 17:29:29 +00002977 : N2VImm<op24, op23, op11_8, op7, 0, op4, (outs DPR:$Vd),
Bill Wendlingc04a9de2011-03-09 00:00:35 +00002978 (ins DPR:$src1, DPR:$Vm, ImmTy:$SIMM), N2RegVShRFrm, IIC_VPALiD,
Owen Andersondd31ed62010-10-27 17:29:29 +00002979 OpcodeStr, Dt, "$Vd, $Vm, $SIMM", "$src1 = $Vd",
2980 [(set DPR:$Vd, (Ty (add DPR:$src1,
2981 (Ty (ShOp DPR:$Vm, (i32 imm:$SIMM))))))]>;
Bob Wilson507df402009-10-21 02:15:46 +00002982class N2VQShAdd<bit op24, bit op23, bits<4> op11_8, bit op7, bit op4,
Bill Wendlingc04a9de2011-03-09 00:00:35 +00002983 Operand ImmTy, string OpcodeStr, string Dt,
2984 ValueType Ty, SDNode ShOp>
Owen Andersondd31ed62010-10-27 17:29:29 +00002985 : N2VImm<op24, op23, op11_8, op7, 1, op4, (outs QPR:$Vd),
Bill Wendlingc04a9de2011-03-09 00:00:35 +00002986 (ins QPR:$src1, QPR:$Vm, ImmTy:$SIMM), N2RegVShRFrm, IIC_VPALiD,
Owen Andersondd31ed62010-10-27 17:29:29 +00002987 OpcodeStr, Dt, "$Vd, $Vm, $SIMM", "$src1 = $Vd",
2988 [(set QPR:$Vd, (Ty (add QPR:$src1,
2989 (Ty (ShOp QPR:$Vm, (i32 imm:$SIMM))))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002990
2991// Shift by immediate and insert,
2992// both double- and quad-register.
Bob Wilson507df402009-10-21 02:15:46 +00002993class N2VDShIns<bit op24, bit op23, bits<4> op11_8, bit op7, bit op4,
Bill Wendling620d0cc2011-03-09 00:33:17 +00002994 Operand ImmTy, Format f, string OpcodeStr, string Dt,
2995 ValueType Ty,SDNode ShOp>
Owen Anderson0745c382010-10-27 17:40:08 +00002996 : N2VImm<op24, op23, op11_8, op7, 0, op4, (outs DPR:$Vd),
Bill Wendling620d0cc2011-03-09 00:33:17 +00002997 (ins DPR:$src1, DPR:$Vm, ImmTy:$SIMM), f, IIC_VSHLiD,
Owen Anderson0745c382010-10-27 17:40:08 +00002998 OpcodeStr, Dt, "$Vd, $Vm, $SIMM", "$src1 = $Vd",
2999 [(set DPR:$Vd, (Ty (ShOp DPR:$src1, DPR:$Vm, (i32 imm:$SIMM))))]>;
Bob Wilson507df402009-10-21 02:15:46 +00003000class N2VQShIns<bit op24, bit op23, bits<4> op11_8, bit op7, bit op4,
Bill Wendling620d0cc2011-03-09 00:33:17 +00003001 Operand ImmTy, Format f, string OpcodeStr, string Dt,
3002 ValueType Ty,SDNode ShOp>
Owen Anderson0745c382010-10-27 17:40:08 +00003003 : N2VImm<op24, op23, op11_8, op7, 1, op4, (outs QPR:$Vd),
Bill Wendling620d0cc2011-03-09 00:33:17 +00003004 (ins QPR:$src1, QPR:$Vm, ImmTy:$SIMM), f, IIC_VSHLiQ,
Owen Anderson0745c382010-10-27 17:40:08 +00003005 OpcodeStr, Dt, "$Vd, $Vm, $SIMM", "$src1 = $Vd",
3006 [(set QPR:$Vd, (Ty (ShOp QPR:$src1, QPR:$Vm, (i32 imm:$SIMM))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003007
3008// Convert, with fractional bits immediate,
3009// both double- and quad-register.
Bob Wilson507df402009-10-21 02:15:46 +00003010class N2VCvtD<bit op24, bit op23, bits<4> op11_8, bit op7, bit op4,
Evan Chengf81bf152009-11-23 21:57:23 +00003011 string OpcodeStr, string Dt, ValueType ResTy, ValueType OpTy,
Bob Wilson5bafff32009-06-22 23:27:02 +00003012 Intrinsic IntOp>
Bob Wilson507df402009-10-21 02:15:46 +00003013 : N2VImm<op24, op23, op11_8, op7, 0, op4,
Owen Anderson498ec202010-10-27 22:49:00 +00003014 (outs DPR:$Vd), (ins DPR:$Vm, neon_vcvt_imm32:$SIMM), NVCVTFrm,
3015 IIC_VUNAD, OpcodeStr, Dt, "$Vd, $Vm, $SIMM", "",
3016 [(set DPR:$Vd, (ResTy (IntOp (OpTy DPR:$Vm), (i32 imm:$SIMM))))]>;
Bob Wilson507df402009-10-21 02:15:46 +00003017class N2VCvtQ<bit op24, bit op23, bits<4> op11_8, bit op7, bit op4,
Evan Chengf81bf152009-11-23 21:57:23 +00003018 string OpcodeStr, string Dt, ValueType ResTy, ValueType OpTy,
Bob Wilson5bafff32009-06-22 23:27:02 +00003019 Intrinsic IntOp>
Bob Wilson507df402009-10-21 02:15:46 +00003020 : N2VImm<op24, op23, op11_8, op7, 1, op4,
Owen Anderson498ec202010-10-27 22:49:00 +00003021 (outs QPR:$Vd), (ins QPR:$Vm, neon_vcvt_imm32:$SIMM), NVCVTFrm,
3022 IIC_VUNAQ, OpcodeStr, Dt, "$Vd, $Vm, $SIMM", "",
3023 [(set QPR:$Vd, (ResTy (IntOp (OpTy QPR:$Vm), (i32 imm:$SIMM))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003024
3025//===----------------------------------------------------------------------===//
3026// Multiclasses
3027//===----------------------------------------------------------------------===//
3028
Bob Wilson916ac5b2009-10-03 04:44:16 +00003029// Abbreviations used in multiclass suffixes:
3030// Q = quarter int (8 bit) elements
3031// H = half int (16 bit) elements
3032// S = single int (32 bit) elements
3033// D = double int (64 bit) elements
3034
Bob Wilson094dd802010-12-18 00:42:58 +00003035// Neon 2-register vector operations and intrinsics.
Johnny Chenec5a4cd2010-02-23 00:33:12 +00003036
Bob Wilson094dd802010-12-18 00:42:58 +00003037// Neon 2-register comparisons.
3038// source operand element sizes of 8, 16 and 32 bits:
Johnny Chen363ac582010-02-23 01:42:58 +00003039multiclass N2V_QHS_cmp<bits<2> op24_23, bits<2> op21_20, bits<2> op17_16,
3040 bits<5> op11_7, bit op4, string opc, string Dt,
Owen Andersonc24cb352010-11-08 23:21:22 +00003041 string asm, SDNode OpNode> {
Johnny Chenec5a4cd2010-02-23 00:33:12 +00003042 // 64-bit vector types.
3043 def v8i8 : N2V<op24_23, op21_20, 0b00, op17_16, op11_7, 0, op4,
Owen Andersonca6945e2010-12-01 00:28:25 +00003044 (outs DPR:$Vd), (ins DPR:$Vm), NoItinerary,
Owen Andersonc24cb352010-11-08 23:21:22 +00003045 opc, !strconcat(Dt, "8"), asm, "",
Owen Andersonca6945e2010-12-01 00:28:25 +00003046 [(set DPR:$Vd, (v8i8 (OpNode (v8i8 DPR:$Vm))))]>;
Johnny Chenec5a4cd2010-02-23 00:33:12 +00003047 def v4i16 : N2V<op24_23, op21_20, 0b01, op17_16, op11_7, 0, op4,
Owen Andersonca6945e2010-12-01 00:28:25 +00003048 (outs DPR:$Vd), (ins DPR:$Vm), NoItinerary,
Owen Andersonc24cb352010-11-08 23:21:22 +00003049 opc, !strconcat(Dt, "16"), asm, "",
Owen Andersonca6945e2010-12-01 00:28:25 +00003050 [(set DPR:$Vd, (v4i16 (OpNode (v4i16 DPR:$Vm))))]>;
Johnny Chenec5a4cd2010-02-23 00:33:12 +00003051 def v2i32 : N2V<op24_23, op21_20, 0b10, op17_16, op11_7, 0, op4,
Owen Andersonca6945e2010-12-01 00:28:25 +00003052 (outs DPR:$Vd), (ins DPR:$Vm), NoItinerary,
Owen Andersonc24cb352010-11-08 23:21:22 +00003053 opc, !strconcat(Dt, "32"), asm, "",
Owen Andersonca6945e2010-12-01 00:28:25 +00003054 [(set DPR:$Vd, (v2i32 (OpNode (v2i32 DPR:$Vm))))]>;
Johnny Chenec5a4cd2010-02-23 00:33:12 +00003055 def v2f32 : N2V<op24_23, op21_20, 0b10, op17_16, op11_7, 0, op4,
Owen Andersonca6945e2010-12-01 00:28:25 +00003056 (outs DPR:$Vd), (ins DPR:$Vm), NoItinerary,
Owen Andersonc24cb352010-11-08 23:21:22 +00003057 opc, "f32", asm, "",
Bob Wilson3deb4512010-12-18 00:04:33 +00003058 [(set DPR:$Vd, (v2i32 (OpNode (v2f32 DPR:$Vm))))]> {
Johnny Chenec5a4cd2010-02-23 00:33:12 +00003059 let Inst{10} = 1; // overwrite F = 1
3060 }
3061
3062 // 128-bit vector types.
3063 def v16i8 : N2V<op24_23, op21_20, 0b00, op17_16, op11_7, 1, op4,
Owen Andersonca6945e2010-12-01 00:28:25 +00003064 (outs QPR:$Vd), (ins QPR:$Vm), NoItinerary,
Owen Andersonc24cb352010-11-08 23:21:22 +00003065 opc, !strconcat(Dt, "8"), asm, "",
Owen Andersonca6945e2010-12-01 00:28:25 +00003066 [(set QPR:$Vd, (v16i8 (OpNode (v16i8 QPR:$Vm))))]>;
Johnny Chenec5a4cd2010-02-23 00:33:12 +00003067 def v8i16 : N2V<op24_23, op21_20, 0b01, op17_16, op11_7, 1, op4,
Owen Andersonca6945e2010-12-01 00:28:25 +00003068 (outs QPR:$Vd), (ins QPR:$Vm), NoItinerary,
Owen Andersonc24cb352010-11-08 23:21:22 +00003069 opc, !strconcat(Dt, "16"), asm, "",
Owen Andersonca6945e2010-12-01 00:28:25 +00003070 [(set QPR:$Vd, (v8i16 (OpNode (v8i16 QPR:$Vm))))]>;
Johnny Chenec5a4cd2010-02-23 00:33:12 +00003071 def v4i32 : N2V<op24_23, op21_20, 0b10, op17_16, op11_7, 1, op4,
Owen Andersonca6945e2010-12-01 00:28:25 +00003072 (outs QPR:$Vd), (ins QPR:$Vm), NoItinerary,
Owen Andersonc24cb352010-11-08 23:21:22 +00003073 opc, !strconcat(Dt, "32"), asm, "",
Owen Andersonca6945e2010-12-01 00:28:25 +00003074 [(set QPR:$Vd, (v4i32 (OpNode (v4i32 QPR:$Vm))))]>;
Johnny Chenec5a4cd2010-02-23 00:33:12 +00003075 def v4f32 : N2V<op24_23, op21_20, 0b10, op17_16, op11_7, 1, op4,
Owen Andersonca6945e2010-12-01 00:28:25 +00003076 (outs QPR:$Vd), (ins QPR:$Vm), NoItinerary,
Owen Andersonc24cb352010-11-08 23:21:22 +00003077 opc, "f32", asm, "",
Bob Wilson3deb4512010-12-18 00:04:33 +00003078 [(set QPR:$Vd, (v4i32 (OpNode (v4f32 QPR:$Vm))))]> {
Johnny Chenec5a4cd2010-02-23 00:33:12 +00003079 let Inst{10} = 1; // overwrite F = 1
3080 }
3081}
3082
Bob Wilson094dd802010-12-18 00:42:58 +00003083
3084// Neon 2-register vector intrinsics,
3085// element sizes of 8, 16 and 32 bits:
3086multiclass N2VInt_QHS<bits<2> op24_23, bits<2> op21_20, bits<2> op17_16,
3087 bits<5> op11_7, bit op4,
3088 InstrItinClass itinD, InstrItinClass itinQ,
3089 string OpcodeStr, string Dt, Intrinsic IntOp> {
3090 // 64-bit vector types.
3091 def v8i8 : N2VDInt<op24_23, op21_20, 0b00, op17_16, op11_7, op4,
3092 itinD, OpcodeStr, !strconcat(Dt, "8"), v8i8, v8i8, IntOp>;
3093 def v4i16 : N2VDInt<op24_23, op21_20, 0b01, op17_16, op11_7, op4,
3094 itinD, OpcodeStr, !strconcat(Dt, "16"),v4i16,v4i16,IntOp>;
3095 def v2i32 : N2VDInt<op24_23, op21_20, 0b10, op17_16, op11_7, op4,
3096 itinD, OpcodeStr, !strconcat(Dt, "32"),v2i32,v2i32,IntOp>;
3097
3098 // 128-bit vector types.
3099 def v16i8 : N2VQInt<op24_23, op21_20, 0b00, op17_16, op11_7, op4,
3100 itinQ, OpcodeStr, !strconcat(Dt, "8"), v16i8,v16i8,IntOp>;
3101 def v8i16 : N2VQInt<op24_23, op21_20, 0b01, op17_16, op11_7, op4,
3102 itinQ, OpcodeStr, !strconcat(Dt, "16"),v8i16,v8i16,IntOp>;
3103 def v4i32 : N2VQInt<op24_23, op21_20, 0b10, op17_16, op11_7, op4,
3104 itinQ, OpcodeStr, !strconcat(Dt, "32"),v4i32,v4i32,IntOp>;
3105}
3106
3107
3108// Neon Narrowing 2-register vector operations,
3109// source operand element sizes of 16, 32 and 64 bits:
3110multiclass N2VN_HSD<bits<2> op24_23, bits<2> op21_20, bits<2> op17_16,
3111 bits<5> op11_7, bit op6, bit op4,
3112 InstrItinClass itin, string OpcodeStr, string Dt,
3113 SDNode OpNode> {
3114 def v8i8 : N2VN<op24_23, op21_20, 0b00, op17_16, op11_7, op6, op4,
3115 itin, OpcodeStr, !strconcat(Dt, "16"),
3116 v8i8, v8i16, OpNode>;
3117 def v4i16 : N2VN<op24_23, op21_20, 0b01, op17_16, op11_7, op6, op4,
3118 itin, OpcodeStr, !strconcat(Dt, "32"),
3119 v4i16, v4i32, OpNode>;
3120 def v2i32 : N2VN<op24_23, op21_20, 0b10, op17_16, op11_7, op6, op4,
3121 itin, OpcodeStr, !strconcat(Dt, "64"),
3122 v2i32, v2i64, OpNode>;
3123}
3124
3125// Neon Narrowing 2-register vector intrinsics,
3126// source operand element sizes of 16, 32 and 64 bits:
3127multiclass N2VNInt_HSD<bits<2> op24_23, bits<2> op21_20, bits<2> op17_16,
3128 bits<5> op11_7, bit op6, bit op4,
3129 InstrItinClass itin, string OpcodeStr, string Dt,
3130 Intrinsic IntOp> {
3131 def v8i8 : N2VNInt<op24_23, op21_20, 0b00, op17_16, op11_7, op6, op4,
3132 itin, OpcodeStr, !strconcat(Dt, "16"),
3133 v8i8, v8i16, IntOp>;
3134 def v4i16 : N2VNInt<op24_23, op21_20, 0b01, op17_16, op11_7, op6, op4,
3135 itin, OpcodeStr, !strconcat(Dt, "32"),
3136 v4i16, v4i32, IntOp>;
3137 def v2i32 : N2VNInt<op24_23, op21_20, 0b10, op17_16, op11_7, op6, op4,
3138 itin, OpcodeStr, !strconcat(Dt, "64"),
3139 v2i32, v2i64, IntOp>;
3140}
3141
3142
3143// Neon Lengthening 2-register vector intrinsic (currently specific to VMOVL).
3144// source operand element sizes of 16, 32 and 64 bits:
3145multiclass N2VL_QHS<bits<2> op24_23, bits<5> op11_7, bit op6, bit op4,
3146 string OpcodeStr, string Dt, SDNode OpNode> {
3147 def v8i16 : N2VL<op24_23, 0b00, 0b10, 0b00, op11_7, op6, op4, IIC_VQUNAiD,
3148 OpcodeStr, !strconcat(Dt, "8"), v8i16, v8i8, OpNode>;
3149 def v4i32 : N2VL<op24_23, 0b01, 0b00, 0b00, op11_7, op6, op4, IIC_VQUNAiD,
3150 OpcodeStr, !strconcat(Dt, "16"), v4i32, v4i16, OpNode>;
3151 def v2i64 : N2VL<op24_23, 0b10, 0b00, 0b00, op11_7, op6, op4, IIC_VQUNAiD,
3152 OpcodeStr, !strconcat(Dt, "32"), v2i64, v2i32, OpNode>;
3153}
3154
3155
Bob Wilson5bafff32009-06-22 23:27:02 +00003156// Neon 3-register vector operations.
3157
3158// First with only element sizes of 8, 16 and 32 bits:
3159multiclass N3V_QHS<bit op24, bit op23, bits<4> op11_8, bit op4,
David Goodwin127221f2009-09-23 21:38:08 +00003160 InstrItinClass itinD16, InstrItinClass itinD32,
3161 InstrItinClass itinQ16, InstrItinClass itinQ32,
Evan Chengf81bf152009-11-23 21:57:23 +00003162 string OpcodeStr, string Dt,
3163 SDNode OpNode, bit Commutable = 0> {
Bob Wilson5bafff32009-06-22 23:27:02 +00003164 // 64-bit vector types.
Jim Grosbach1251e1a2010-11-18 01:39:50 +00003165 def v8i8 : N3VD<op24, op23, 0b00, op11_8, op4, itinD16,
Evan Chengf81bf152009-11-23 21:57:23 +00003166 OpcodeStr, !strconcat(Dt, "8"),
3167 v8i8, v8i8, OpNode, Commutable>;
David Goodwin127221f2009-09-23 21:38:08 +00003168 def v4i16 : N3VD<op24, op23, 0b01, op11_8, op4, itinD16,
Bob Wilson9abe19d2010-02-17 00:31:29 +00003169 OpcodeStr, !strconcat(Dt, "16"),
3170 v4i16, v4i16, OpNode, Commutable>;
David Goodwin127221f2009-09-23 21:38:08 +00003171 def v2i32 : N3VD<op24, op23, 0b10, op11_8, op4, itinD32,
Bob Wilson9abe19d2010-02-17 00:31:29 +00003172 OpcodeStr, !strconcat(Dt, "32"),
3173 v2i32, v2i32, OpNode, Commutable>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003174
3175 // 128-bit vector types.
David Goodwin127221f2009-09-23 21:38:08 +00003176 def v16i8 : N3VQ<op24, op23, 0b00, op11_8, op4, itinQ16,
Bob Wilson9abe19d2010-02-17 00:31:29 +00003177 OpcodeStr, !strconcat(Dt, "8"),
3178 v16i8, v16i8, OpNode, Commutable>;
David Goodwin127221f2009-09-23 21:38:08 +00003179 def v8i16 : N3VQ<op24, op23, 0b01, op11_8, op4, itinQ16,
Bob Wilson9abe19d2010-02-17 00:31:29 +00003180 OpcodeStr, !strconcat(Dt, "16"),
3181 v8i16, v8i16, OpNode, Commutable>;
David Goodwin127221f2009-09-23 21:38:08 +00003182 def v4i32 : N3VQ<op24, op23, 0b10, op11_8, op4, itinQ32,
Bob Wilson9abe19d2010-02-17 00:31:29 +00003183 OpcodeStr, !strconcat(Dt, "32"),
3184 v4i32, v4i32, OpNode, Commutable>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003185}
3186
Jim Grosbach45755a72011-12-05 20:09:44 +00003187multiclass N3VSL_HS<bits<4> op11_8, string OpcodeStr, SDNode ShOp> {
Jim Grosbach422faab2011-12-05 20:12:26 +00003188 def v4i16 : N3VDSL16<0b01, op11_8, OpcodeStr, "i16", v4i16, ShOp>;
3189 def v2i32 : N3VDSL<0b10, op11_8, IIC_VMULi32D, OpcodeStr, "i32", v2i32, ShOp>;
Jim Grosbach45755a72011-12-05 20:09:44 +00003190 def v8i16 : N3VQSL16<0b01, op11_8, OpcodeStr, "i16", v8i16, v4i16, ShOp>;
Jim Grosbach422faab2011-12-05 20:12:26 +00003191 def v4i32 : N3VQSL<0b10, op11_8, IIC_VMULi32Q, OpcodeStr, "i32",
Evan Chengac0869d2009-11-21 06:21:52 +00003192 v4i32, v2i32, ShOp>;
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003193}
3194
Bob Wilson5bafff32009-06-22 23:27:02 +00003195// ....then also with element size 64 bits:
3196multiclass N3V_QHSD<bit op24, bit op23, bits<4> op11_8, bit op4,
David Goodwin127221f2009-09-23 21:38:08 +00003197 InstrItinClass itinD, InstrItinClass itinQ,
Evan Chengf81bf152009-11-23 21:57:23 +00003198 string OpcodeStr, string Dt,
3199 SDNode OpNode, bit Commutable = 0>
David Goodwin127221f2009-09-23 21:38:08 +00003200 : N3V_QHS<op24, op23, op11_8, op4, itinD, itinD, itinQ, itinQ,
Evan Chengf81bf152009-11-23 21:57:23 +00003201 OpcodeStr, Dt, OpNode, Commutable> {
David Goodwin127221f2009-09-23 21:38:08 +00003202 def v1i64 : N3VD<op24, op23, 0b11, op11_8, op4, itinD,
Evan Chengf81bf152009-11-23 21:57:23 +00003203 OpcodeStr, !strconcat(Dt, "64"),
3204 v1i64, v1i64, OpNode, Commutable>;
David Goodwin127221f2009-09-23 21:38:08 +00003205 def v2i64 : N3VQ<op24, op23, 0b11, op11_8, op4, itinQ,
Evan Chengf81bf152009-11-23 21:57:23 +00003206 OpcodeStr, !strconcat(Dt, "64"),
3207 v2i64, v2i64, OpNode, Commutable>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003208}
3209
3210
Bob Wilson5bafff32009-06-22 23:27:02 +00003211// Neon 3-register vector intrinsics.
3212
3213// First with only element sizes of 16 and 32 bits:
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003214multiclass N3VInt_HS<bit op24, bit op23, bits<4> op11_8, bit op4, Format f,
David Goodwin658ea602009-09-25 18:38:29 +00003215 InstrItinClass itinD16, InstrItinClass itinD32,
3216 InstrItinClass itinQ16, InstrItinClass itinQ32,
Evan Chengf81bf152009-11-23 21:57:23 +00003217 string OpcodeStr, string Dt,
3218 Intrinsic IntOp, bit Commutable = 0> {
Bob Wilson5bafff32009-06-22 23:27:02 +00003219 // 64-bit vector types.
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003220 def v4i16 : N3VDInt<op24, op23, 0b01, op11_8, op4, f, itinD16,
Evan Chengf81bf152009-11-23 21:57:23 +00003221 OpcodeStr, !strconcat(Dt, "16"),
Bob Wilson5bafff32009-06-22 23:27:02 +00003222 v4i16, v4i16, IntOp, Commutable>;
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003223 def v2i32 : N3VDInt<op24, op23, 0b10, op11_8, op4, f, itinD32,
Evan Chengf81bf152009-11-23 21:57:23 +00003224 OpcodeStr, !strconcat(Dt, "32"),
Bob Wilson5bafff32009-06-22 23:27:02 +00003225 v2i32, v2i32, IntOp, Commutable>;
3226
3227 // 128-bit vector types.
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003228 def v8i16 : N3VQInt<op24, op23, 0b01, op11_8, op4, f, itinQ16,
Evan Chengf81bf152009-11-23 21:57:23 +00003229 OpcodeStr, !strconcat(Dt, "16"),
Bob Wilson5bafff32009-06-22 23:27:02 +00003230 v8i16, v8i16, IntOp, Commutable>;
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003231 def v4i32 : N3VQInt<op24, op23, 0b10, op11_8, op4, f, itinQ32,
Evan Chengf81bf152009-11-23 21:57:23 +00003232 OpcodeStr, !strconcat(Dt, "32"),
Bob Wilson5bafff32009-06-22 23:27:02 +00003233 v4i32, v4i32, IntOp, Commutable>;
3234}
Owen Anderson3557d002010-10-26 20:56:57 +00003235multiclass N3VInt_HSSh<bit op24, bit op23, bits<4> op11_8, bit op4, Format f,
3236 InstrItinClass itinD16, InstrItinClass itinD32,
3237 InstrItinClass itinQ16, InstrItinClass itinQ32,
3238 string OpcodeStr, string Dt,
Owen Andersonac922622010-10-26 21:13:59 +00003239 Intrinsic IntOp> {
Owen Anderson3557d002010-10-26 20:56:57 +00003240 // 64-bit vector types.
3241 def v4i16 : N3VDIntSh<op24, op23, 0b01, op11_8, op4, f, itinD16,
3242 OpcodeStr, !strconcat(Dt, "16"),
Owen Andersonac922622010-10-26 21:13:59 +00003243 v4i16, v4i16, IntOp>;
Owen Anderson3557d002010-10-26 20:56:57 +00003244 def v2i32 : N3VDIntSh<op24, op23, 0b10, op11_8, op4, f, itinD32,
3245 OpcodeStr, !strconcat(Dt, "32"),
Owen Andersonac922622010-10-26 21:13:59 +00003246 v2i32, v2i32, IntOp>;
Owen Anderson3557d002010-10-26 20:56:57 +00003247
3248 // 128-bit vector types.
3249 def v8i16 : N3VQIntSh<op24, op23, 0b01, op11_8, op4, f, itinQ16,
3250 OpcodeStr, !strconcat(Dt, "16"),
Owen Andersonac922622010-10-26 21:13:59 +00003251 v8i16, v8i16, IntOp>;
Owen Anderson3557d002010-10-26 20:56:57 +00003252 def v4i32 : N3VQIntSh<op24, op23, 0b10, op11_8, op4, f, itinQ32,
3253 OpcodeStr, !strconcat(Dt, "32"),
Owen Andersonac922622010-10-26 21:13:59 +00003254 v4i32, v4i32, IntOp>;
Owen Anderson3557d002010-10-26 20:56:57 +00003255}
Bob Wilson5bafff32009-06-22 23:27:02 +00003256
Jim Grosbach1251e1a2010-11-18 01:39:50 +00003257multiclass N3VIntSL_HS<bits<4> op11_8,
David Goodwin658ea602009-09-25 18:38:29 +00003258 InstrItinClass itinD16, InstrItinClass itinD32,
3259 InstrItinClass itinQ16, InstrItinClass itinQ32,
Evan Chengf81bf152009-11-23 21:57:23 +00003260 string OpcodeStr, string Dt, Intrinsic IntOp> {
Evan Chengac0869d2009-11-21 06:21:52 +00003261 def v4i16 : N3VDIntSL16<0b01, op11_8, itinD16,
Evan Chengf81bf152009-11-23 21:57:23 +00003262 OpcodeStr, !strconcat(Dt, "16"), v4i16, IntOp>;
Evan Chengac0869d2009-11-21 06:21:52 +00003263 def v2i32 : N3VDIntSL<0b10, op11_8, itinD32,
Evan Chengf81bf152009-11-23 21:57:23 +00003264 OpcodeStr, !strconcat(Dt, "32"), v2i32, IntOp>;
Evan Chengac0869d2009-11-21 06:21:52 +00003265 def v8i16 : N3VQIntSL16<0b01, op11_8, itinQ16,
Bob Wilson9abe19d2010-02-17 00:31:29 +00003266 OpcodeStr, !strconcat(Dt, "16"), v8i16, v4i16, IntOp>;
Evan Chengac0869d2009-11-21 06:21:52 +00003267 def v4i32 : N3VQIntSL<0b10, op11_8, itinQ32,
Evan Chengf81bf152009-11-23 21:57:23 +00003268 OpcodeStr, !strconcat(Dt, "32"), v4i32, v2i32, IntOp>;
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003269}
3270
Bob Wilson5bafff32009-06-22 23:27:02 +00003271// ....then also with element size of 8 bits:
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003272multiclass N3VInt_QHS<bit op24, bit op23, bits<4> op11_8, bit op4, Format f,
David Goodwin658ea602009-09-25 18:38:29 +00003273 InstrItinClass itinD16, InstrItinClass itinD32,
3274 InstrItinClass itinQ16, InstrItinClass itinQ32,
Evan Chengf81bf152009-11-23 21:57:23 +00003275 string OpcodeStr, string Dt,
3276 Intrinsic IntOp, bit Commutable = 0>
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003277 : N3VInt_HS<op24, op23, op11_8, op4, f, itinD16, itinD32, itinQ16, itinQ32,
Evan Chengf81bf152009-11-23 21:57:23 +00003278 OpcodeStr, Dt, IntOp, Commutable> {
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003279 def v8i8 : N3VDInt<op24, op23, 0b00, op11_8, op4, f, itinD16,
Bob Wilson9abe19d2010-02-17 00:31:29 +00003280 OpcodeStr, !strconcat(Dt, "8"),
3281 v8i8, v8i8, IntOp, Commutable>;
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003282 def v16i8 : N3VQInt<op24, op23, 0b00, op11_8, op4, f, itinQ16,
Evan Chengf81bf152009-11-23 21:57:23 +00003283 OpcodeStr, !strconcat(Dt, "8"),
3284 v16i8, v16i8, IntOp, Commutable>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003285}
Owen Anderson3557d002010-10-26 20:56:57 +00003286multiclass N3VInt_QHSSh<bit op24, bit op23, bits<4> op11_8, bit op4, Format f,
3287 InstrItinClass itinD16, InstrItinClass itinD32,
3288 InstrItinClass itinQ16, InstrItinClass itinQ32,
3289 string OpcodeStr, string Dt,
Owen Andersonac922622010-10-26 21:13:59 +00003290 Intrinsic IntOp>
Owen Anderson3557d002010-10-26 20:56:57 +00003291 : N3VInt_HSSh<op24, op23, op11_8, op4, f, itinD16, itinD32, itinQ16, itinQ32,
Owen Andersonac922622010-10-26 21:13:59 +00003292 OpcodeStr, Dt, IntOp> {
Owen Anderson3557d002010-10-26 20:56:57 +00003293 def v8i8 : N3VDIntSh<op24, op23, 0b00, op11_8, op4, f, itinD16,
3294 OpcodeStr, !strconcat(Dt, "8"),
Owen Andersonac922622010-10-26 21:13:59 +00003295 v8i8, v8i8, IntOp>;
Owen Anderson3557d002010-10-26 20:56:57 +00003296 def v16i8 : N3VQIntSh<op24, op23, 0b00, op11_8, op4, f, itinQ16,
3297 OpcodeStr, !strconcat(Dt, "8"),
Owen Andersonac922622010-10-26 21:13:59 +00003298 v16i8, v16i8, IntOp>;
Owen Anderson3557d002010-10-26 20:56:57 +00003299}
3300
Bob Wilson5bafff32009-06-22 23:27:02 +00003301
3302// ....then also with element size of 64 bits:
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003303multiclass N3VInt_QHSD<bit op24, bit op23, bits<4> op11_8, bit op4, Format f,
David Goodwin658ea602009-09-25 18:38:29 +00003304 InstrItinClass itinD16, InstrItinClass itinD32,
3305 InstrItinClass itinQ16, InstrItinClass itinQ32,
Evan Chengf81bf152009-11-23 21:57:23 +00003306 string OpcodeStr, string Dt,
3307 Intrinsic IntOp, bit Commutable = 0>
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003308 : N3VInt_QHS<op24, op23, op11_8, op4, f, itinD16, itinD32, itinQ16, itinQ32,
Evan Chengf81bf152009-11-23 21:57:23 +00003309 OpcodeStr, Dt, IntOp, Commutable> {
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003310 def v1i64 : N3VDInt<op24, op23, 0b11, op11_8, op4, f, itinD32,
Bob Wilson9abe19d2010-02-17 00:31:29 +00003311 OpcodeStr, !strconcat(Dt, "64"),
3312 v1i64, v1i64, IntOp, Commutable>;
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003313 def v2i64 : N3VQInt<op24, op23, 0b11, op11_8, op4, f, itinQ32,
Bob Wilson9abe19d2010-02-17 00:31:29 +00003314 OpcodeStr, !strconcat(Dt, "64"),
3315 v2i64, v2i64, IntOp, Commutable>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003316}
Owen Anderson3557d002010-10-26 20:56:57 +00003317multiclass N3VInt_QHSDSh<bit op24, bit op23, bits<4> op11_8, bit op4, Format f,
3318 InstrItinClass itinD16, InstrItinClass itinD32,
3319 InstrItinClass itinQ16, InstrItinClass itinQ32,
3320 string OpcodeStr, string Dt,
Owen Andersonac922622010-10-26 21:13:59 +00003321 Intrinsic IntOp>
Owen Anderson3557d002010-10-26 20:56:57 +00003322 : N3VInt_QHSSh<op24, op23, op11_8, op4, f, itinD16, itinD32, itinQ16, itinQ32,
Owen Andersonac922622010-10-26 21:13:59 +00003323 OpcodeStr, Dt, IntOp> {
Owen Anderson3557d002010-10-26 20:56:57 +00003324 def v1i64 : N3VDIntSh<op24, op23, 0b11, op11_8, op4, f, itinD32,
3325 OpcodeStr, !strconcat(Dt, "64"),
Owen Andersonac922622010-10-26 21:13:59 +00003326 v1i64, v1i64, IntOp>;
Owen Anderson3557d002010-10-26 20:56:57 +00003327 def v2i64 : N3VQIntSh<op24, op23, 0b11, op11_8, op4, f, itinQ32,
3328 OpcodeStr, !strconcat(Dt, "64"),
Owen Andersonac922622010-10-26 21:13:59 +00003329 v2i64, v2i64, IntOp>;
Owen Anderson3557d002010-10-26 20:56:57 +00003330}
Bob Wilson5bafff32009-06-22 23:27:02 +00003331
Bob Wilson5bafff32009-06-22 23:27:02 +00003332// Neon Narrowing 3-register vector intrinsics,
3333// source operand element sizes of 16, 32 and 64 bits:
3334multiclass N3VNInt_HSD<bit op24, bit op23, bits<4> op11_8, bit op4,
Evan Chengf81bf152009-11-23 21:57:23 +00003335 string OpcodeStr, string Dt,
3336 Intrinsic IntOp, bit Commutable = 0> {
3337 def v8i8 : N3VNInt<op24, op23, 0b00, op11_8, op4,
3338 OpcodeStr, !strconcat(Dt, "16"),
Bob Wilson5bafff32009-06-22 23:27:02 +00003339 v8i8, v8i16, IntOp, Commutable>;
Evan Chengf81bf152009-11-23 21:57:23 +00003340 def v4i16 : N3VNInt<op24, op23, 0b01, op11_8, op4,
3341 OpcodeStr, !strconcat(Dt, "32"),
Bob Wilson5bafff32009-06-22 23:27:02 +00003342 v4i16, v4i32, IntOp, Commutable>;
Evan Chengf81bf152009-11-23 21:57:23 +00003343 def v2i32 : N3VNInt<op24, op23, 0b10, op11_8, op4,
3344 OpcodeStr, !strconcat(Dt, "64"),
Bob Wilson5bafff32009-06-22 23:27:02 +00003345 v2i32, v2i64, IntOp, Commutable>;
3346}
3347
3348
Bob Wilson04d6c282010-08-29 05:57:34 +00003349// Neon Long 3-register vector operations.
3350
3351multiclass N3VL_QHS<bit op24, bit op23, bits<4> op11_8, bit op4,
3352 InstrItinClass itin16, InstrItinClass itin32,
3353 string OpcodeStr, string Dt,
Bob Wilsond0b69cf2010-09-01 23:50:19 +00003354 SDNode OpNode, bit Commutable = 0> {
Bob Wilson04d6c282010-08-29 05:57:34 +00003355 def v8i16 : N3VL<op24, op23, 0b00, op11_8, op4, itin16,
3356 OpcodeStr, !strconcat(Dt, "8"),
Bob Wilsond0b69cf2010-09-01 23:50:19 +00003357 v8i16, v8i8, OpNode, Commutable>;
Jim Grosbach1251e1a2010-11-18 01:39:50 +00003358 def v4i32 : N3VL<op24, op23, 0b01, op11_8, op4, itin16,
Bob Wilsond0b69cf2010-09-01 23:50:19 +00003359 OpcodeStr, !strconcat(Dt, "16"),
3360 v4i32, v4i16, OpNode, Commutable>;
3361 def v2i64 : N3VL<op24, op23, 0b10, op11_8, op4, itin32,
3362 OpcodeStr, !strconcat(Dt, "32"),
3363 v2i64, v2i32, OpNode, Commutable>;
3364}
3365
3366multiclass N3VLSL_HS<bit op24, bits<4> op11_8,
3367 InstrItinClass itin, string OpcodeStr, string Dt,
3368 SDNode OpNode> {
3369 def v4i16 : N3VLSL16<op24, 0b01, op11_8, itin, OpcodeStr,
3370 !strconcat(Dt, "16"), v4i32, v4i16, OpNode>;
3371 def v2i32 : N3VLSL<op24, 0b10, op11_8, itin, OpcodeStr,
3372 !strconcat(Dt, "32"), v2i64, v2i32, OpNode>;
3373}
3374
3375multiclass N3VLExt_QHS<bit op24, bit op23, bits<4> op11_8, bit op4,
3376 InstrItinClass itin16, InstrItinClass itin32,
3377 string OpcodeStr, string Dt,
3378 SDNode OpNode, SDNode ExtOp, bit Commutable = 0> {
3379 def v8i16 : N3VLExt<op24, op23, 0b00, op11_8, op4, itin16,
3380 OpcodeStr, !strconcat(Dt, "8"),
3381 v8i16, v8i8, OpNode, ExtOp, Commutable>;
Jim Grosbach1251e1a2010-11-18 01:39:50 +00003382 def v4i32 : N3VLExt<op24, op23, 0b01, op11_8, op4, itin16,
Bob Wilsond0b69cf2010-09-01 23:50:19 +00003383 OpcodeStr, !strconcat(Dt, "16"),
3384 v4i32, v4i16, OpNode, ExtOp, Commutable>;
3385 def v2i64 : N3VLExt<op24, op23, 0b10, op11_8, op4, itin32,
3386 OpcodeStr, !strconcat(Dt, "32"),
3387 v2i64, v2i32, OpNode, ExtOp, Commutable>;
Bob Wilson04d6c282010-08-29 05:57:34 +00003388}
3389
Bob Wilson5bafff32009-06-22 23:27:02 +00003390// Neon Long 3-register vector intrinsics.
3391
3392// First with only element sizes of 16 and 32 bits:
3393multiclass N3VLInt_HS<bit op24, bit op23, bits<4> op11_8, bit op4,
Anton Korobeynikovecc64062010-04-07 18:21:10 +00003394 InstrItinClass itin16, InstrItinClass itin32,
3395 string OpcodeStr, string Dt,
David Goodwin658ea602009-09-25 18:38:29 +00003396 Intrinsic IntOp, bit Commutable = 0> {
Jim Grosbach1251e1a2010-11-18 01:39:50 +00003397 def v4i32 : N3VLInt<op24, op23, 0b01, op11_8, op4, itin16,
Evan Chengf81bf152009-11-23 21:57:23 +00003398 OpcodeStr, !strconcat(Dt, "16"),
3399 v4i32, v4i16, IntOp, Commutable>;
Anton Korobeynikovecc64062010-04-07 18:21:10 +00003400 def v2i64 : N3VLInt<op24, op23, 0b10, op11_8, op4, itin32,
Evan Chengf81bf152009-11-23 21:57:23 +00003401 OpcodeStr, !strconcat(Dt, "32"),
3402 v2i64, v2i32, IntOp, Commutable>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003403}
3404
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003405multiclass N3VLIntSL_HS<bit op24, bits<4> op11_8,
Evan Chengf81bf152009-11-23 21:57:23 +00003406 InstrItinClass itin, string OpcodeStr, string Dt,
3407 Intrinsic IntOp> {
Jim Grosbach1251e1a2010-11-18 01:39:50 +00003408 def v4i16 : N3VLIntSL16<op24, 0b01, op11_8, itin,
Evan Chengf81bf152009-11-23 21:57:23 +00003409 OpcodeStr, !strconcat(Dt, "16"), v4i32, v4i16, IntOp>;
David Goodwin658ea602009-09-25 18:38:29 +00003410 def v2i32 : N3VLIntSL<op24, 0b10, op11_8, itin,
Evan Chengf81bf152009-11-23 21:57:23 +00003411 OpcodeStr, !strconcat(Dt, "32"), v2i64, v2i32, IntOp>;
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003412}
3413
Bob Wilson5bafff32009-06-22 23:27:02 +00003414// ....then also with element size of 8 bits:
3415multiclass N3VLInt_QHS<bit op24, bit op23, bits<4> op11_8, bit op4,
Anton Korobeynikovecc64062010-04-07 18:21:10 +00003416 InstrItinClass itin16, InstrItinClass itin32,
3417 string OpcodeStr, string Dt,
David Goodwin658ea602009-09-25 18:38:29 +00003418 Intrinsic IntOp, bit Commutable = 0>
Anton Korobeynikovecc64062010-04-07 18:21:10 +00003419 : N3VLInt_HS<op24, op23, op11_8, op4, itin16, itin32, OpcodeStr, Dt,
Evan Chengf81bf152009-11-23 21:57:23 +00003420 IntOp, Commutable> {
Anton Korobeynikovecc64062010-04-07 18:21:10 +00003421 def v8i16 : N3VLInt<op24, op23, 0b00, op11_8, op4, itin16,
Evan Chengf81bf152009-11-23 21:57:23 +00003422 OpcodeStr, !strconcat(Dt, "8"),
3423 v8i16, v8i8, IntOp, Commutable>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003424}
3425
Bob Wilsoneb0c3d32010-09-03 01:35:08 +00003426// ....with explicit extend (VABDL).
3427multiclass N3VLIntExt_QHS<bit op24, bit op23, bits<4> op11_8, bit op4,
3428 InstrItinClass itin, string OpcodeStr, string Dt,
3429 Intrinsic IntOp, SDNode ExtOp, bit Commutable = 0> {
3430 def v8i16 : N3VLIntExt<op24, op23, 0b00, op11_8, op4, itin,
3431 OpcodeStr, !strconcat(Dt, "8"),
3432 v8i16, v8i8, IntOp, ExtOp, Commutable>;
Jim Grosbach1251e1a2010-11-18 01:39:50 +00003433 def v4i32 : N3VLIntExt<op24, op23, 0b01, op11_8, op4, itin,
Bob Wilsoneb0c3d32010-09-03 01:35:08 +00003434 OpcodeStr, !strconcat(Dt, "16"),
3435 v4i32, v4i16, IntOp, ExtOp, Commutable>;
3436 def v2i64 : N3VLIntExt<op24, op23, 0b10, op11_8, op4, itin,
3437 OpcodeStr, !strconcat(Dt, "32"),
3438 v2i64, v2i32, IntOp, ExtOp, Commutable>;
3439}
3440
Bob Wilson5bafff32009-06-22 23:27:02 +00003441
3442// Neon Wide 3-register vector intrinsics,
3443// source operand element sizes of 8, 16 and 32 bits:
Bob Wilson04d6c282010-08-29 05:57:34 +00003444multiclass N3VW_QHS<bit op24, bit op23, bits<4> op11_8, bit op4,
3445 string OpcodeStr, string Dt,
3446 SDNode OpNode, SDNode ExtOp, bit Commutable = 0> {
3447 def v8i16 : N3VW<op24, op23, 0b00, op11_8, op4,
3448 OpcodeStr, !strconcat(Dt, "8"),
3449 v8i16, v8i8, OpNode, ExtOp, Commutable>;
3450 def v4i32 : N3VW<op24, op23, 0b01, op11_8, op4,
3451 OpcodeStr, !strconcat(Dt, "16"),
3452 v4i32, v4i16, OpNode, ExtOp, Commutable>;
3453 def v2i64 : N3VW<op24, op23, 0b10, op11_8, op4,
3454 OpcodeStr, !strconcat(Dt, "32"),
3455 v2i64, v2i32, OpNode, ExtOp, Commutable>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003456}
3457
3458
3459// Neon Multiply-Op vector operations,
3460// element sizes of 8, 16 and 32 bits:
3461multiclass N3VMulOp_QHS<bit op24, bit op23, bits<4> op11_8, bit op4,
David Goodwin658ea602009-09-25 18:38:29 +00003462 InstrItinClass itinD16, InstrItinClass itinD32,
3463 InstrItinClass itinQ16, InstrItinClass itinQ32,
Evan Chengf81bf152009-11-23 21:57:23 +00003464 string OpcodeStr, string Dt, SDNode OpNode> {
Bob Wilson5bafff32009-06-22 23:27:02 +00003465 // 64-bit vector types.
David Goodwin658ea602009-09-25 18:38:29 +00003466 def v8i8 : N3VDMulOp<op24, op23, 0b00, op11_8, op4, itinD16,
Evan Chengf81bf152009-11-23 21:57:23 +00003467 OpcodeStr, !strconcat(Dt, "8"), v8i8, mul, OpNode>;
David Goodwin658ea602009-09-25 18:38:29 +00003468 def v4i16 : N3VDMulOp<op24, op23, 0b01, op11_8, op4, itinD16,
Evan Chengf81bf152009-11-23 21:57:23 +00003469 OpcodeStr, !strconcat(Dt, "16"), v4i16, mul, OpNode>;
David Goodwin658ea602009-09-25 18:38:29 +00003470 def v2i32 : N3VDMulOp<op24, op23, 0b10, op11_8, op4, itinD32,
Evan Chengf81bf152009-11-23 21:57:23 +00003471 OpcodeStr, !strconcat(Dt, "32"), v2i32, mul, OpNode>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003472
3473 // 128-bit vector types.
David Goodwin658ea602009-09-25 18:38:29 +00003474 def v16i8 : N3VQMulOp<op24, op23, 0b00, op11_8, op4, itinQ16,
Evan Chengf81bf152009-11-23 21:57:23 +00003475 OpcodeStr, !strconcat(Dt, "8"), v16i8, mul, OpNode>;
David Goodwin658ea602009-09-25 18:38:29 +00003476 def v8i16 : N3VQMulOp<op24, op23, 0b01, op11_8, op4, itinQ16,
Evan Chengf81bf152009-11-23 21:57:23 +00003477 OpcodeStr, !strconcat(Dt, "16"), v8i16, mul, OpNode>;
David Goodwin658ea602009-09-25 18:38:29 +00003478 def v4i32 : N3VQMulOp<op24, op23, 0b10, op11_8, op4, itinQ32,
Evan Chengf81bf152009-11-23 21:57:23 +00003479 OpcodeStr, !strconcat(Dt, "32"), v4i32, mul, OpNode>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003480}
3481
Jim Grosbach1251e1a2010-11-18 01:39:50 +00003482multiclass N3VMulOpSL_HS<bits<4> op11_8,
David Goodwin658ea602009-09-25 18:38:29 +00003483 InstrItinClass itinD16, InstrItinClass itinD32,
3484 InstrItinClass itinQ16, InstrItinClass itinQ32,
Evan Chengf81bf152009-11-23 21:57:23 +00003485 string OpcodeStr, string Dt, SDNode ShOp> {
David Goodwin658ea602009-09-25 18:38:29 +00003486 def v4i16 : N3VDMulOpSL16<0b01, op11_8, itinD16,
Evan Chengf81bf152009-11-23 21:57:23 +00003487 OpcodeStr, !strconcat(Dt, "16"), v4i16, mul, ShOp>;
David Goodwin658ea602009-09-25 18:38:29 +00003488 def v2i32 : N3VDMulOpSL<0b10, op11_8, itinD32,
Evan Chengf81bf152009-11-23 21:57:23 +00003489 OpcodeStr, !strconcat(Dt, "32"), v2i32, mul, ShOp>;
David Goodwin658ea602009-09-25 18:38:29 +00003490 def v8i16 : N3VQMulOpSL16<0b01, op11_8, itinQ16,
Bob Wilson9abe19d2010-02-17 00:31:29 +00003491 OpcodeStr, !strconcat(Dt, "16"), v8i16, v4i16,
3492 mul, ShOp>;
David Goodwin658ea602009-09-25 18:38:29 +00003493 def v4i32 : N3VQMulOpSL<0b10, op11_8, itinQ32,
Bob Wilson9abe19d2010-02-17 00:31:29 +00003494 OpcodeStr, !strconcat(Dt, "32"), v4i32, v2i32,
3495 mul, ShOp>;
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003496}
Bob Wilson5bafff32009-06-22 23:27:02 +00003497
Bob Wilsoneb0c3d32010-09-03 01:35:08 +00003498// Neon Intrinsic-Op vector operations,
3499// element sizes of 8, 16 and 32 bits:
3500multiclass N3VIntOp_QHS<bit op24, bit op23, bits<4> op11_8, bit op4,
3501 InstrItinClass itinD, InstrItinClass itinQ,
3502 string OpcodeStr, string Dt, Intrinsic IntOp,
3503 SDNode OpNode> {
3504 // 64-bit vector types.
3505 def v8i8 : N3VDIntOp<op24, op23, 0b00, op11_8, op4, itinD,
3506 OpcodeStr, !strconcat(Dt, "8"), v8i8, IntOp, OpNode>;
3507 def v4i16 : N3VDIntOp<op24, op23, 0b01, op11_8, op4, itinD,
3508 OpcodeStr, !strconcat(Dt, "16"), v4i16, IntOp, OpNode>;
3509 def v2i32 : N3VDIntOp<op24, op23, 0b10, op11_8, op4, itinD,
3510 OpcodeStr, !strconcat(Dt, "32"), v2i32, IntOp, OpNode>;
3511
3512 // 128-bit vector types.
3513 def v16i8 : N3VQIntOp<op24, op23, 0b00, op11_8, op4, itinQ,
3514 OpcodeStr, !strconcat(Dt, "8"), v16i8, IntOp, OpNode>;
3515 def v8i16 : N3VQIntOp<op24, op23, 0b01, op11_8, op4, itinQ,
3516 OpcodeStr, !strconcat(Dt, "16"), v8i16, IntOp, OpNode>;
3517 def v4i32 : N3VQIntOp<op24, op23, 0b10, op11_8, op4, itinQ,
3518 OpcodeStr, !strconcat(Dt, "32"), v4i32, IntOp, OpNode>;
3519}
3520
Bob Wilson5bafff32009-06-22 23:27:02 +00003521// Neon 3-argument intrinsics,
3522// element sizes of 8, 16 and 32 bits:
3523multiclass N3VInt3_QHS<bit op24, bit op23, bits<4> op11_8, bit op4,
Anton Korobeynikov0a3e2b52010-04-07 18:20:42 +00003524 InstrItinClass itinD, InstrItinClass itinQ,
Evan Chengf81bf152009-11-23 21:57:23 +00003525 string OpcodeStr, string Dt, Intrinsic IntOp> {
Bob Wilson5bafff32009-06-22 23:27:02 +00003526 // 64-bit vector types.
Anton Korobeynikov0a3e2b52010-04-07 18:20:42 +00003527 def v8i8 : N3VDInt3<op24, op23, 0b00, op11_8, op4, itinD,
Bob Wilson9abe19d2010-02-17 00:31:29 +00003528 OpcodeStr, !strconcat(Dt, "8"), v8i8, v8i8, IntOp>;
Anton Korobeynikov0a3e2b52010-04-07 18:20:42 +00003529 def v4i16 : N3VDInt3<op24, op23, 0b01, op11_8, op4, itinD,
Bob Wilson9abe19d2010-02-17 00:31:29 +00003530 OpcodeStr, !strconcat(Dt, "16"), v4i16, v4i16, IntOp>;
Anton Korobeynikov0a3e2b52010-04-07 18:20:42 +00003531 def v2i32 : N3VDInt3<op24, op23, 0b10, op11_8, op4, itinD,
Bob Wilson9abe19d2010-02-17 00:31:29 +00003532 OpcodeStr, !strconcat(Dt, "32"), v2i32, v2i32, IntOp>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003533
3534 // 128-bit vector types.
Anton Korobeynikov0a3e2b52010-04-07 18:20:42 +00003535 def v16i8 : N3VQInt3<op24, op23, 0b00, op11_8, op4, itinQ,
Bob Wilson9abe19d2010-02-17 00:31:29 +00003536 OpcodeStr, !strconcat(Dt, "8"), v16i8, v16i8, IntOp>;
Anton Korobeynikov0a3e2b52010-04-07 18:20:42 +00003537 def v8i16 : N3VQInt3<op24, op23, 0b01, op11_8, op4, itinQ,
Bob Wilson9abe19d2010-02-17 00:31:29 +00003538 OpcodeStr, !strconcat(Dt, "16"), v8i16, v8i16, IntOp>;
Anton Korobeynikov0a3e2b52010-04-07 18:20:42 +00003539 def v4i32 : N3VQInt3<op24, op23, 0b10, op11_8, op4, itinQ,
Bob Wilson9abe19d2010-02-17 00:31:29 +00003540 OpcodeStr, !strconcat(Dt, "32"), v4i32, v4i32, IntOp>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003541}
3542
3543
Bob Wilsond0b69cf2010-09-01 23:50:19 +00003544// Neon Long Multiply-Op vector operations,
3545// element sizes of 8, 16 and 32 bits:
3546multiclass N3VLMulOp_QHS<bit op24, bit op23, bits<4> op11_8, bit op4,
3547 InstrItinClass itin16, InstrItinClass itin32,
3548 string OpcodeStr, string Dt, SDNode MulOp,
3549 SDNode OpNode> {
3550 def v8i16 : N3VLMulOp<op24, op23, 0b00, op11_8, op4, itin16, OpcodeStr,
3551 !strconcat(Dt, "8"), v8i16, v8i8, MulOp, OpNode>;
3552 def v4i32 : N3VLMulOp<op24, op23, 0b01, op11_8, op4, itin16, OpcodeStr,
3553 !strconcat(Dt, "16"), v4i32, v4i16, MulOp, OpNode>;
3554 def v2i64 : N3VLMulOp<op24, op23, 0b10, op11_8, op4, itin32, OpcodeStr,
3555 !strconcat(Dt, "32"), v2i64, v2i32, MulOp, OpNode>;
3556}
3557
3558multiclass N3VLMulOpSL_HS<bit op24, bits<4> op11_8, string OpcodeStr,
3559 string Dt, SDNode MulOp, SDNode OpNode> {
3560 def v4i16 : N3VLMulOpSL16<op24, 0b01, op11_8, IIC_VMACi16D, OpcodeStr,
3561 !strconcat(Dt,"16"), v4i32, v4i16, MulOp, OpNode>;
3562 def v2i32 : N3VLMulOpSL<op24, 0b10, op11_8, IIC_VMACi32D, OpcodeStr,
3563 !strconcat(Dt, "32"), v2i64, v2i32, MulOp, OpNode>;
3564}
3565
3566
Bob Wilson5bafff32009-06-22 23:27:02 +00003567// Neon Long 3-argument intrinsics.
3568
3569// First with only element sizes of 16 and 32 bits:
3570multiclass N3VLInt3_HS<bit op24, bit op23, bits<4> op11_8, bit op4,
Anton Korobeynikov95102072010-04-07 18:21:04 +00003571 InstrItinClass itin16, InstrItinClass itin32,
Evan Chengf81bf152009-11-23 21:57:23 +00003572 string OpcodeStr, string Dt, Intrinsic IntOp> {
Anton Korobeynikov95102072010-04-07 18:21:04 +00003573 def v4i32 : N3VLInt3<op24, op23, 0b01, op11_8, op4, itin16,
Evan Chengf81bf152009-11-23 21:57:23 +00003574 OpcodeStr, !strconcat(Dt, "16"), v4i32, v4i16, IntOp>;
Anton Korobeynikov95102072010-04-07 18:21:04 +00003575 def v2i64 : N3VLInt3<op24, op23, 0b10, op11_8, op4, itin32,
Evan Chengf81bf152009-11-23 21:57:23 +00003576 OpcodeStr, !strconcat(Dt, "32"), v2i64, v2i32, IntOp>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003577}
3578
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003579multiclass N3VLInt3SL_HS<bit op24, bits<4> op11_8,
Evan Chengf81bf152009-11-23 21:57:23 +00003580 string OpcodeStr, string Dt, Intrinsic IntOp> {
David Goodwin658ea602009-09-25 18:38:29 +00003581 def v4i16 : N3VLInt3SL16<op24, 0b01, op11_8, IIC_VMACi16D,
Evan Chengf81bf152009-11-23 21:57:23 +00003582 OpcodeStr, !strconcat(Dt,"16"), v4i32, v4i16, IntOp>;
David Goodwin658ea602009-09-25 18:38:29 +00003583 def v2i32 : N3VLInt3SL<op24, 0b10, op11_8, IIC_VMACi32D,
Evan Chengf81bf152009-11-23 21:57:23 +00003584 OpcodeStr, !strconcat(Dt, "32"), v2i64, v2i32, IntOp>;
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003585}
3586
Bob Wilson5bafff32009-06-22 23:27:02 +00003587// ....then also with element size of 8 bits:
3588multiclass N3VLInt3_QHS<bit op24, bit op23, bits<4> op11_8, bit op4,
Anton Korobeynikov95102072010-04-07 18:21:04 +00003589 InstrItinClass itin16, InstrItinClass itin32,
Evan Chengf81bf152009-11-23 21:57:23 +00003590 string OpcodeStr, string Dt, Intrinsic IntOp>
Anton Korobeynikov95102072010-04-07 18:21:04 +00003591 : N3VLInt3_HS<op24, op23, op11_8, op4, itin16, itin32, OpcodeStr, Dt, IntOp> {
3592 def v8i16 : N3VLInt3<op24, op23, 0b00, op11_8, op4, itin16,
Evan Chengf81bf152009-11-23 21:57:23 +00003593 OpcodeStr, !strconcat(Dt, "8"), v8i16, v8i8, IntOp>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003594}
3595
Bob Wilsoneb0c3d32010-09-03 01:35:08 +00003596// ....with explicit extend (VABAL).
3597multiclass N3VLIntExtOp_QHS<bit op24, bit op23, bits<4> op11_8, bit op4,
3598 InstrItinClass itin, string OpcodeStr, string Dt,
3599 Intrinsic IntOp, SDNode ExtOp, SDNode OpNode> {
3600 def v8i16 : N3VLIntExtOp<op24, op23, 0b00, op11_8, op4, itin,
3601 OpcodeStr, !strconcat(Dt, "8"), v8i16, v8i8,
3602 IntOp, ExtOp, OpNode>;
3603 def v4i32 : N3VLIntExtOp<op24, op23, 0b01, op11_8, op4, itin,
3604 OpcodeStr, !strconcat(Dt, "16"), v4i32, v4i16,
3605 IntOp, ExtOp, OpNode>;
3606 def v2i64 : N3VLIntExtOp<op24, op23, 0b10, op11_8, op4, itin,
3607 OpcodeStr, !strconcat(Dt, "32"), v2i64, v2i32,
3608 IntOp, ExtOp, OpNode>;
3609}
3610
Bob Wilson5bafff32009-06-22 23:27:02 +00003611
Bob Wilson5bafff32009-06-22 23:27:02 +00003612// Neon Pairwise long 2-register intrinsics,
3613// element sizes of 8, 16 and 32 bits:
3614multiclass N2VPLInt_QHS<bits<2> op24_23, bits<2> op21_20, bits<2> op17_16,
3615 bits<5> op11_7, bit op4,
Evan Chengf81bf152009-11-23 21:57:23 +00003616 string OpcodeStr, string Dt, Intrinsic IntOp> {
Bob Wilson5bafff32009-06-22 23:27:02 +00003617 // 64-bit vector types.
3618 def v8i8 : N2VDPLInt<op24_23, op21_20, 0b00, op17_16, op11_7, op4,
Evan Chengf81bf152009-11-23 21:57:23 +00003619 OpcodeStr, !strconcat(Dt, "8"), v4i16, v8i8, IntOp>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003620 def v4i16 : N2VDPLInt<op24_23, op21_20, 0b01, op17_16, op11_7, op4,
Evan Chengf81bf152009-11-23 21:57:23 +00003621 OpcodeStr, !strconcat(Dt, "16"), v2i32, v4i16, IntOp>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003622 def v2i32 : N2VDPLInt<op24_23, op21_20, 0b10, op17_16, op11_7, op4,
Evan Chengf81bf152009-11-23 21:57:23 +00003623 OpcodeStr, !strconcat(Dt, "32"), v1i64, v2i32, IntOp>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003624
3625 // 128-bit vector types.
3626 def v16i8 : N2VQPLInt<op24_23, op21_20, 0b00, op17_16, op11_7, op4,
Evan Chengf81bf152009-11-23 21:57:23 +00003627 OpcodeStr, !strconcat(Dt, "8"), v8i16, v16i8, IntOp>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003628 def v8i16 : N2VQPLInt<op24_23, op21_20, 0b01, op17_16, op11_7, op4,
Evan Chengf81bf152009-11-23 21:57:23 +00003629 OpcodeStr, !strconcat(Dt, "16"), v4i32, v8i16, IntOp>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003630 def v4i32 : N2VQPLInt<op24_23, op21_20, 0b10, op17_16, op11_7, op4,
Evan Chengf81bf152009-11-23 21:57:23 +00003631 OpcodeStr, !strconcat(Dt, "32"), v2i64, v4i32, IntOp>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003632}
3633
3634
3635// Neon Pairwise long 2-register accumulate intrinsics,
3636// element sizes of 8, 16 and 32 bits:
3637multiclass N2VPLInt2_QHS<bits<2> op24_23, bits<2> op21_20, bits<2> op17_16,
3638 bits<5> op11_7, bit op4,
Evan Chengf81bf152009-11-23 21:57:23 +00003639 string OpcodeStr, string Dt, Intrinsic IntOp> {
Bob Wilson5bafff32009-06-22 23:27:02 +00003640 // 64-bit vector types.
3641 def v8i8 : N2VDPLInt2<op24_23, op21_20, 0b00, op17_16, op11_7, op4,
Evan Chengf81bf152009-11-23 21:57:23 +00003642 OpcodeStr, !strconcat(Dt, "8"), v4i16, v8i8, IntOp>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003643 def v4i16 : N2VDPLInt2<op24_23, op21_20, 0b01, op17_16, op11_7, op4,
Evan Chengf81bf152009-11-23 21:57:23 +00003644 OpcodeStr, !strconcat(Dt, "16"), v2i32, v4i16, IntOp>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003645 def v2i32 : N2VDPLInt2<op24_23, op21_20, 0b10, op17_16, op11_7, op4,
Evan Chengf81bf152009-11-23 21:57:23 +00003646 OpcodeStr, !strconcat(Dt, "32"), v1i64, v2i32, IntOp>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003647
3648 // 128-bit vector types.
3649 def v16i8 : N2VQPLInt2<op24_23, op21_20, 0b00, op17_16, op11_7, op4,
Evan Chengf81bf152009-11-23 21:57:23 +00003650 OpcodeStr, !strconcat(Dt, "8"), v8i16, v16i8, IntOp>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003651 def v8i16 : N2VQPLInt2<op24_23, op21_20, 0b01, op17_16, op11_7, op4,
Evan Chengf81bf152009-11-23 21:57:23 +00003652 OpcodeStr, !strconcat(Dt, "16"), v4i32, v8i16, IntOp>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003653 def v4i32 : N2VQPLInt2<op24_23, op21_20, 0b10, op17_16, op11_7, op4,
Evan Chengf81bf152009-11-23 21:57:23 +00003654 OpcodeStr, !strconcat(Dt, "32"), v2i64, v4i32, IntOp>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003655}
3656
3657
3658// Neon 2-register vector shift by immediate,
Johnny Chen0a3dc102010-03-26 01:07:59 +00003659// with f of either N2RegVShLFrm or N2RegVShRFrm
Bob Wilson5bafff32009-06-22 23:27:02 +00003660// element sizes of 8, 16, 32 and 64 bits:
Bill Wendling7c6b6082011-03-08 23:48:09 +00003661multiclass N2VShL_QHSD<bit op24, bit op23, bits<4> op11_8, bit op4,
3662 InstrItinClass itin, string OpcodeStr, string Dt,
3663 SDNode OpNode> {
Bob Wilson5bafff32009-06-22 23:27:02 +00003664 // 64-bit vector types.
Bill Wendling7c6b6082011-03-08 23:48:09 +00003665 def v8i8 : N2VDSh<op24, op23, op11_8, 0, op4, N2RegVShLFrm, itin, i32imm,
Evan Chengf81bf152009-11-23 21:57:23 +00003666 OpcodeStr, !strconcat(Dt, "8"), v8i8, OpNode> {
Bob Wilson507df402009-10-21 02:15:46 +00003667 let Inst{21-19} = 0b001; // imm6 = 001xxx
3668 }
Bill Wendling7c6b6082011-03-08 23:48:09 +00003669 def v4i16 : N2VDSh<op24, op23, op11_8, 0, op4, N2RegVShLFrm, itin, i32imm,
Evan Chengf81bf152009-11-23 21:57:23 +00003670 OpcodeStr, !strconcat(Dt, "16"), v4i16, OpNode> {
Bob Wilson507df402009-10-21 02:15:46 +00003671 let Inst{21-20} = 0b01; // imm6 = 01xxxx
3672 }
Bill Wendling7c6b6082011-03-08 23:48:09 +00003673 def v2i32 : N2VDSh<op24, op23, op11_8, 0, op4, N2RegVShLFrm, itin, i32imm,
Evan Chengf81bf152009-11-23 21:57:23 +00003674 OpcodeStr, !strconcat(Dt, "32"), v2i32, OpNode> {
Bob Wilson507df402009-10-21 02:15:46 +00003675 let Inst{21} = 0b1; // imm6 = 1xxxxx
3676 }
Bill Wendling7c6b6082011-03-08 23:48:09 +00003677 def v1i64 : N2VDSh<op24, op23, op11_8, 1, op4, N2RegVShLFrm, itin, i32imm,
Evan Chengf81bf152009-11-23 21:57:23 +00003678 OpcodeStr, !strconcat(Dt, "64"), v1i64, OpNode>;
Bob Wilson507df402009-10-21 02:15:46 +00003679 // imm6 = xxxxxx
Bob Wilson5bafff32009-06-22 23:27:02 +00003680
3681 // 128-bit vector types.
Bill Wendling7c6b6082011-03-08 23:48:09 +00003682 def v16i8 : N2VQSh<op24, op23, op11_8, 0, op4, N2RegVShLFrm, itin, i32imm,
Evan Chengf81bf152009-11-23 21:57:23 +00003683 OpcodeStr, !strconcat(Dt, "8"), v16i8, OpNode> {
Bob Wilson507df402009-10-21 02:15:46 +00003684 let Inst{21-19} = 0b001; // imm6 = 001xxx
3685 }
Bill Wendling7c6b6082011-03-08 23:48:09 +00003686 def v8i16 : N2VQSh<op24, op23, op11_8, 0, op4, N2RegVShLFrm, itin, i32imm,
Evan Chengf81bf152009-11-23 21:57:23 +00003687 OpcodeStr, !strconcat(Dt, "16"), v8i16, OpNode> {
Bob Wilson507df402009-10-21 02:15:46 +00003688 let Inst{21-20} = 0b01; // imm6 = 01xxxx
3689 }
Bill Wendling7c6b6082011-03-08 23:48:09 +00003690 def v4i32 : N2VQSh<op24, op23, op11_8, 0, op4, N2RegVShLFrm, itin, i32imm,
Evan Chengf81bf152009-11-23 21:57:23 +00003691 OpcodeStr, !strconcat(Dt, "32"), v4i32, OpNode> {
Bob Wilson507df402009-10-21 02:15:46 +00003692 let Inst{21} = 0b1; // imm6 = 1xxxxx
3693 }
Bill Wendling7c6b6082011-03-08 23:48:09 +00003694 def v2i64 : N2VQSh<op24, op23, op11_8, 1, op4, N2RegVShLFrm, itin, i32imm,
3695 OpcodeStr, !strconcat(Dt, "64"), v2i64, OpNode>;
3696 // imm6 = xxxxxx
3697}
3698multiclass N2VShR_QHSD<bit op24, bit op23, bits<4> op11_8, bit op4,
3699 InstrItinClass itin, string OpcodeStr, string Dt,
3700 SDNode OpNode> {
3701 // 64-bit vector types.
3702 def v8i8 : N2VDSh<op24, op23, op11_8, 0, op4, N2RegVShRFrm, itin, shr_imm8,
3703 OpcodeStr, !strconcat(Dt, "8"), v8i8, OpNode> {
3704 let Inst{21-19} = 0b001; // imm6 = 001xxx
3705 }
3706 def v4i16 : N2VDSh<op24, op23, op11_8, 0, op4, N2RegVShRFrm, itin, shr_imm16,
3707 OpcodeStr, !strconcat(Dt, "16"), v4i16, OpNode> {
3708 let Inst{21-20} = 0b01; // imm6 = 01xxxx
3709 }
3710 def v2i32 : N2VDSh<op24, op23, op11_8, 0, op4, N2RegVShRFrm, itin, shr_imm32,
3711 OpcodeStr, !strconcat(Dt, "32"), v2i32, OpNode> {
3712 let Inst{21} = 0b1; // imm6 = 1xxxxx
3713 }
3714 def v1i64 : N2VDSh<op24, op23, op11_8, 1, op4, N2RegVShRFrm, itin, shr_imm64,
3715 OpcodeStr, !strconcat(Dt, "64"), v1i64, OpNode>;
3716 // imm6 = xxxxxx
3717
3718 // 128-bit vector types.
3719 def v16i8 : N2VQSh<op24, op23, op11_8, 0, op4, N2RegVShRFrm, itin, shr_imm8,
3720 OpcodeStr, !strconcat(Dt, "8"), v16i8, OpNode> {
3721 let Inst{21-19} = 0b001; // imm6 = 001xxx
3722 }
3723 def v8i16 : N2VQSh<op24, op23, op11_8, 0, op4, N2RegVShRFrm, itin, shr_imm16,
3724 OpcodeStr, !strconcat(Dt, "16"), v8i16, OpNode> {
3725 let Inst{21-20} = 0b01; // imm6 = 01xxxx
3726 }
3727 def v4i32 : N2VQSh<op24, op23, op11_8, 0, op4, N2RegVShRFrm, itin, shr_imm32,
3728 OpcodeStr, !strconcat(Dt, "32"), v4i32, OpNode> {
3729 let Inst{21} = 0b1; // imm6 = 1xxxxx
3730 }
3731 def v2i64 : N2VQSh<op24, op23, op11_8, 1, op4, N2RegVShRFrm, itin, shr_imm64,
Evan Chengf81bf152009-11-23 21:57:23 +00003732 OpcodeStr, !strconcat(Dt, "64"), v2i64, OpNode>;
Bob Wilson507df402009-10-21 02:15:46 +00003733 // imm6 = xxxxxx
Bob Wilson5bafff32009-06-22 23:27:02 +00003734}
3735
Bob Wilson5bafff32009-06-22 23:27:02 +00003736// Neon Shift-Accumulate vector operations,
3737// element sizes of 8, 16, 32 and 64 bits:
3738multiclass N2VShAdd_QHSD<bit op24, bit op23, bits<4> op11_8, bit op4,
Evan Chengf81bf152009-11-23 21:57:23 +00003739 string OpcodeStr, string Dt, SDNode ShOp> {
Bob Wilson5bafff32009-06-22 23:27:02 +00003740 // 64-bit vector types.
Bill Wendlingc04a9de2011-03-09 00:00:35 +00003741 def v8i8 : N2VDShAdd<op24, op23, op11_8, 0, op4, shr_imm8,
Evan Chengf81bf152009-11-23 21:57:23 +00003742 OpcodeStr, !strconcat(Dt, "8"), v8i8, ShOp> {
Bob Wilson507df402009-10-21 02:15:46 +00003743 let Inst{21-19} = 0b001; // imm6 = 001xxx
3744 }
Bill Wendlingc04a9de2011-03-09 00:00:35 +00003745 def v4i16 : N2VDShAdd<op24, op23, op11_8, 0, op4, shr_imm16,
Evan Chengf81bf152009-11-23 21:57:23 +00003746 OpcodeStr, !strconcat(Dt, "16"), v4i16, ShOp> {
Bob Wilson507df402009-10-21 02:15:46 +00003747 let Inst{21-20} = 0b01; // imm6 = 01xxxx
3748 }
Bill Wendlingc04a9de2011-03-09 00:00:35 +00003749 def v2i32 : N2VDShAdd<op24, op23, op11_8, 0, op4, shr_imm32,
Evan Chengf81bf152009-11-23 21:57:23 +00003750 OpcodeStr, !strconcat(Dt, "32"), v2i32, ShOp> {
Bob Wilson507df402009-10-21 02:15:46 +00003751 let Inst{21} = 0b1; // imm6 = 1xxxxx
3752 }
Bill Wendlingc04a9de2011-03-09 00:00:35 +00003753 def v1i64 : N2VDShAdd<op24, op23, op11_8, 1, op4, shr_imm64,
Evan Chengf81bf152009-11-23 21:57:23 +00003754 OpcodeStr, !strconcat(Dt, "64"), v1i64, ShOp>;
Bob Wilson507df402009-10-21 02:15:46 +00003755 // imm6 = xxxxxx
Bob Wilson5bafff32009-06-22 23:27:02 +00003756
3757 // 128-bit vector types.
Bill Wendlingc04a9de2011-03-09 00:00:35 +00003758 def v16i8 : N2VQShAdd<op24, op23, op11_8, 0, op4, shr_imm8,
Evan Chengf81bf152009-11-23 21:57:23 +00003759 OpcodeStr, !strconcat(Dt, "8"), v16i8, ShOp> {
Bob Wilson507df402009-10-21 02:15:46 +00003760 let Inst{21-19} = 0b001; // imm6 = 001xxx
3761 }
Bill Wendlingc04a9de2011-03-09 00:00:35 +00003762 def v8i16 : N2VQShAdd<op24, op23, op11_8, 0, op4, shr_imm16,
Evan Chengf81bf152009-11-23 21:57:23 +00003763 OpcodeStr, !strconcat(Dt, "16"), v8i16, ShOp> {
Bob Wilson507df402009-10-21 02:15:46 +00003764 let Inst{21-20} = 0b01; // imm6 = 01xxxx
3765 }
Bill Wendlingc04a9de2011-03-09 00:00:35 +00003766 def v4i32 : N2VQShAdd<op24, op23, op11_8, 0, op4, shr_imm32,
Evan Chengf81bf152009-11-23 21:57:23 +00003767 OpcodeStr, !strconcat(Dt, "32"), v4i32, ShOp> {
Bob Wilson507df402009-10-21 02:15:46 +00003768 let Inst{21} = 0b1; // imm6 = 1xxxxx
3769 }
Bill Wendlingc04a9de2011-03-09 00:00:35 +00003770 def v2i64 : N2VQShAdd<op24, op23, op11_8, 1, op4, shr_imm64,
Evan Chengf81bf152009-11-23 21:57:23 +00003771 OpcodeStr, !strconcat(Dt, "64"), v2i64, ShOp>;
Bob Wilson507df402009-10-21 02:15:46 +00003772 // imm6 = xxxxxx
Bob Wilson5bafff32009-06-22 23:27:02 +00003773}
3774
Bob Wilson5bafff32009-06-22 23:27:02 +00003775// Neon Shift-Insert vector operations,
Johnny Chen0a3dc102010-03-26 01:07:59 +00003776// with f of either N2RegVShLFrm or N2RegVShRFrm
Bob Wilson5bafff32009-06-22 23:27:02 +00003777// element sizes of 8, 16, 32 and 64 bits:
Bill Wendling620d0cc2011-03-09 00:33:17 +00003778multiclass N2VShInsL_QHSD<bit op24, bit op23, bits<4> op11_8, bit op4,
3779 string OpcodeStr> {
Bob Wilson5bafff32009-06-22 23:27:02 +00003780 // 64-bit vector types.
Bill Wendling620d0cc2011-03-09 00:33:17 +00003781 def v8i8 : N2VDShIns<op24, op23, op11_8, 0, op4, i32imm,
3782 N2RegVShLFrm, OpcodeStr, "8", v8i8, NEONvsli> {
Bob Wilson507df402009-10-21 02:15:46 +00003783 let Inst{21-19} = 0b001; // imm6 = 001xxx
3784 }
Bill Wendling620d0cc2011-03-09 00:33:17 +00003785 def v4i16 : N2VDShIns<op24, op23, op11_8, 0, op4, i32imm,
3786 N2RegVShLFrm, OpcodeStr, "16", v4i16, NEONvsli> {
Bob Wilson507df402009-10-21 02:15:46 +00003787 let Inst{21-20} = 0b01; // imm6 = 01xxxx
3788 }
Bill Wendling620d0cc2011-03-09 00:33:17 +00003789 def v2i32 : N2VDShIns<op24, op23, op11_8, 0, op4, i32imm,
3790 N2RegVShLFrm, OpcodeStr, "32", v2i32, NEONvsli> {
Bob Wilson507df402009-10-21 02:15:46 +00003791 let Inst{21} = 0b1; // imm6 = 1xxxxx
3792 }
Bill Wendling620d0cc2011-03-09 00:33:17 +00003793 def v1i64 : N2VDShIns<op24, op23, op11_8, 1, op4, i32imm,
3794 N2RegVShLFrm, OpcodeStr, "64", v1i64, NEONvsli>;
Bob Wilson507df402009-10-21 02:15:46 +00003795 // imm6 = xxxxxx
Bob Wilson5bafff32009-06-22 23:27:02 +00003796
3797 // 128-bit vector types.
Bill Wendling620d0cc2011-03-09 00:33:17 +00003798 def v16i8 : N2VQShIns<op24, op23, op11_8, 0, op4, i32imm,
3799 N2RegVShLFrm, OpcodeStr, "8", v16i8, NEONvsli> {
Bob Wilson507df402009-10-21 02:15:46 +00003800 let Inst{21-19} = 0b001; // imm6 = 001xxx
3801 }
Bill Wendling620d0cc2011-03-09 00:33:17 +00003802 def v8i16 : N2VQShIns<op24, op23, op11_8, 0, op4, i32imm,
3803 N2RegVShLFrm, OpcodeStr, "16", v8i16, NEONvsli> {
Bob Wilson507df402009-10-21 02:15:46 +00003804 let Inst{21-20} = 0b01; // imm6 = 01xxxx
3805 }
Bill Wendling620d0cc2011-03-09 00:33:17 +00003806 def v4i32 : N2VQShIns<op24, op23, op11_8, 0, op4, i32imm,
3807 N2RegVShLFrm, OpcodeStr, "32", v4i32, NEONvsli> {
Bob Wilson507df402009-10-21 02:15:46 +00003808 let Inst{21} = 0b1; // imm6 = 1xxxxx
3809 }
Bill Wendling620d0cc2011-03-09 00:33:17 +00003810 def v2i64 : N2VQShIns<op24, op23, op11_8, 1, op4, i32imm,
3811 N2RegVShLFrm, OpcodeStr, "64", v2i64, NEONvsli>;
3812 // imm6 = xxxxxx
3813}
3814multiclass N2VShInsR_QHSD<bit op24, bit op23, bits<4> op11_8, bit op4,
3815 string OpcodeStr> {
3816 // 64-bit vector types.
3817 def v8i8 : N2VDShIns<op24, op23, op11_8, 0, op4, shr_imm8,
3818 N2RegVShRFrm, OpcodeStr, "8", v8i8, NEONvsri> {
3819 let Inst{21-19} = 0b001; // imm6 = 001xxx
3820 }
3821 def v4i16 : N2VDShIns<op24, op23, op11_8, 0, op4, shr_imm16,
3822 N2RegVShRFrm, OpcodeStr, "16", v4i16, NEONvsri> {
3823 let Inst{21-20} = 0b01; // imm6 = 01xxxx
3824 }
3825 def v2i32 : N2VDShIns<op24, op23, op11_8, 0, op4, shr_imm32,
3826 N2RegVShRFrm, OpcodeStr, "32", v2i32, NEONvsri> {
3827 let Inst{21} = 0b1; // imm6 = 1xxxxx
3828 }
3829 def v1i64 : N2VDShIns<op24, op23, op11_8, 1, op4, shr_imm64,
3830 N2RegVShRFrm, OpcodeStr, "64", v1i64, NEONvsri>;
3831 // imm6 = xxxxxx
3832
3833 // 128-bit vector types.
3834 def v16i8 : N2VQShIns<op24, op23, op11_8, 0, op4, shr_imm8,
3835 N2RegVShRFrm, OpcodeStr, "8", v16i8, NEONvsri> {
3836 let Inst{21-19} = 0b001; // imm6 = 001xxx
3837 }
3838 def v8i16 : N2VQShIns<op24, op23, op11_8, 0, op4, shr_imm16,
3839 N2RegVShRFrm, OpcodeStr, "16", v8i16, NEONvsri> {
3840 let Inst{21-20} = 0b01; // imm6 = 01xxxx
3841 }
3842 def v4i32 : N2VQShIns<op24, op23, op11_8, 0, op4, shr_imm32,
3843 N2RegVShRFrm, OpcodeStr, "32", v4i32, NEONvsri> {
3844 let Inst{21} = 0b1; // imm6 = 1xxxxx
3845 }
3846 def v2i64 : N2VQShIns<op24, op23, op11_8, 1, op4, shr_imm64,
3847 N2RegVShRFrm, OpcodeStr, "64", v2i64, NEONvsri>;
Bob Wilson507df402009-10-21 02:15:46 +00003848 // imm6 = xxxxxx
3849}
3850
3851// Neon Shift Long operations,
3852// element sizes of 8, 16, 32 bits:
3853multiclass N2VLSh_QHS<bit op24, bit op23, bits<4> op11_8, bit op7, bit op6,
Evan Chengf81bf152009-11-23 21:57:23 +00003854 bit op4, string OpcodeStr, string Dt, SDNode OpNode> {
Bob Wilson507df402009-10-21 02:15:46 +00003855 def v8i16 : N2VLSh<op24, op23, op11_8, op7, op6, op4,
Jim Grosbach3b8991c2011-12-07 01:07:24 +00003856 OpcodeStr, !strconcat(Dt, "8"), v8i16, v8i8, imm1_7, OpNode> {
Bob Wilson507df402009-10-21 02:15:46 +00003857 let Inst{21-19} = 0b001; // imm6 = 001xxx
3858 }
3859 def v4i32 : N2VLSh<op24, op23, op11_8, op7, op6, op4,
Jim Grosbach3b8991c2011-12-07 01:07:24 +00003860 OpcodeStr, !strconcat(Dt, "16"), v4i32, v4i16, imm1_15, OpNode> {
Bob Wilson507df402009-10-21 02:15:46 +00003861 let Inst{21-20} = 0b01; // imm6 = 01xxxx
3862 }
3863 def v2i64 : N2VLSh<op24, op23, op11_8, op7, op6, op4,
Jim Grosbach3b8991c2011-12-07 01:07:24 +00003864 OpcodeStr, !strconcat(Dt, "32"), v2i64, v2i32, imm1_31, OpNode> {
Bob Wilson507df402009-10-21 02:15:46 +00003865 let Inst{21} = 0b1; // imm6 = 1xxxxx
3866 }
3867}
3868
3869// Neon Shift Narrow operations,
3870// element sizes of 16, 32, 64 bits:
3871multiclass N2VNSh_HSD<bit op24, bit op23, bits<4> op11_8, bit op7, bit op6,
Evan Chengf81bf152009-11-23 21:57:23 +00003872 bit op4, InstrItinClass itin, string OpcodeStr, string Dt,
Bob Wilson507df402009-10-21 02:15:46 +00003873 SDNode OpNode> {
3874 def v8i8 : N2VNSh<op24, op23, op11_8, op7, op6, op4, itin,
Bill Wendlinga656b632011-03-01 01:00:59 +00003875 OpcodeStr, !strconcat(Dt, "16"),
Bill Wendling3116dce2011-03-07 23:38:41 +00003876 v8i8, v8i16, shr_imm8, OpNode> {
Bob Wilson507df402009-10-21 02:15:46 +00003877 let Inst{21-19} = 0b001; // imm6 = 001xxx
3878 }
3879 def v4i16 : N2VNSh<op24, op23, op11_8, op7, op6, op4, itin,
Bill Wendlinga656b632011-03-01 01:00:59 +00003880 OpcodeStr, !strconcat(Dt, "32"),
Bill Wendling3116dce2011-03-07 23:38:41 +00003881 v4i16, v4i32, shr_imm16, OpNode> {
Bob Wilson507df402009-10-21 02:15:46 +00003882 let Inst{21-20} = 0b01; // imm6 = 01xxxx
3883 }
3884 def v2i32 : N2VNSh<op24, op23, op11_8, op7, op6, op4, itin,
Bill Wendlinga656b632011-03-01 01:00:59 +00003885 OpcodeStr, !strconcat(Dt, "64"),
Bill Wendling3116dce2011-03-07 23:38:41 +00003886 v2i32, v2i64, shr_imm32, OpNode> {
Bob Wilson507df402009-10-21 02:15:46 +00003887 let Inst{21} = 0b1; // imm6 = 1xxxxx
3888 }
Bob Wilson5bafff32009-06-22 23:27:02 +00003889}
3890
3891//===----------------------------------------------------------------------===//
3892// Instruction Definitions.
3893//===----------------------------------------------------------------------===//
3894
3895// Vector Add Operations.
3896
3897// VADD : Vector Add (integer and floating-point)
Evan Chengf81bf152009-11-23 21:57:23 +00003898defm VADD : N3V_QHSD<0, 0, 0b1000, 0, IIC_VBINiD, IIC_VBINiQ, "vadd", "i",
Evan Chengac0869d2009-11-21 06:21:52 +00003899 add, 1>;
Evan Chengf81bf152009-11-23 21:57:23 +00003900def VADDfd : N3VD<0, 0, 0b00, 0b1101, 0, IIC_VBIND, "vadd", "f32",
Evan Chengac0869d2009-11-21 06:21:52 +00003901 v2f32, v2f32, fadd, 1>;
Evan Chengf81bf152009-11-23 21:57:23 +00003902def VADDfq : N3VQ<0, 0, 0b00, 0b1101, 0, IIC_VBINQ, "vadd", "f32",
Evan Chengac0869d2009-11-21 06:21:52 +00003903 v4f32, v4f32, fadd, 1>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003904// VADDL : Vector Add Long (Q = D + D)
Bob Wilsond0b69cf2010-09-01 23:50:19 +00003905defm VADDLs : N3VLExt_QHS<0,1,0b0000,0, IIC_VSHLiD, IIC_VSHLiD,
3906 "vaddl", "s", add, sext, 1>;
3907defm VADDLu : N3VLExt_QHS<1,1,0b0000,0, IIC_VSHLiD, IIC_VSHLiD,
3908 "vaddl", "u", add, zext, 1>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003909// VADDW : Vector Add Wide (Q = Q + D)
Bob Wilson04d6c282010-08-29 05:57:34 +00003910defm VADDWs : N3VW_QHS<0,1,0b0001,0, "vaddw", "s", add, sext, 0>;
3911defm VADDWu : N3VW_QHS<1,1,0b0001,0, "vaddw", "u", add, zext, 0>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003912// VHADD : Vector Halving Add
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003913defm VHADDs : N3VInt_QHS<0, 0, 0b0000, 0, N3RegFrm,
3914 IIC_VBINi4D, IIC_VBINi4D, IIC_VBINi4Q, IIC_VBINi4Q,
3915 "vhadd", "s", int_arm_neon_vhadds, 1>;
3916defm VHADDu : N3VInt_QHS<1, 0, 0b0000, 0, N3RegFrm,
3917 IIC_VBINi4D, IIC_VBINi4D, IIC_VBINi4Q, IIC_VBINi4Q,
3918 "vhadd", "u", int_arm_neon_vhaddu, 1>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003919// VRHADD : Vector Rounding Halving Add
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003920defm VRHADDs : N3VInt_QHS<0, 0, 0b0001, 0, N3RegFrm,
3921 IIC_VBINi4D, IIC_VBINi4D, IIC_VBINi4Q, IIC_VBINi4Q,
3922 "vrhadd", "s", int_arm_neon_vrhadds, 1>;
3923defm VRHADDu : N3VInt_QHS<1, 0, 0b0001, 0, N3RegFrm,
3924 IIC_VBINi4D, IIC_VBINi4D, IIC_VBINi4Q, IIC_VBINi4Q,
3925 "vrhadd", "u", int_arm_neon_vrhaddu, 1>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003926// VQADD : Vector Saturating Add
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003927defm VQADDs : N3VInt_QHSD<0, 0, 0b0000, 1, N3RegFrm,
3928 IIC_VBINi4D, IIC_VBINi4D, IIC_VBINi4Q, IIC_VBINi4Q,
3929 "vqadd", "s", int_arm_neon_vqadds, 1>;
3930defm VQADDu : N3VInt_QHSD<1, 0, 0b0000, 1, N3RegFrm,
3931 IIC_VBINi4D, IIC_VBINi4D, IIC_VBINi4Q, IIC_VBINi4Q,
3932 "vqadd", "u", int_arm_neon_vqaddu, 1>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003933// VADDHN : Vector Add and Narrow Returning High Half (D = Q + Q)
Evan Chengf81bf152009-11-23 21:57:23 +00003934defm VADDHN : N3VNInt_HSD<0,1,0b0100,0, "vaddhn", "i",
3935 int_arm_neon_vaddhn, 1>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003936// VRADDHN : Vector Rounding Add and Narrow Returning High Half (D = Q + Q)
Evan Chengf81bf152009-11-23 21:57:23 +00003937defm VRADDHN : N3VNInt_HSD<1,1,0b0100,0, "vraddhn", "i",
3938 int_arm_neon_vraddhn, 1>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003939
3940// Vector Multiply Operations.
3941
3942// VMUL : Vector Multiply (integer, polynomial and floating-point)
Evan Chengac0869d2009-11-21 06:21:52 +00003943defm VMUL : N3V_QHS<0, 0, 0b1001, 1, IIC_VMULi16D, IIC_VMULi32D,
Evan Chengf81bf152009-11-23 21:57:23 +00003944 IIC_VMULi16Q, IIC_VMULi32Q, "vmul", "i", mul, 1>;
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003945def VMULpd : N3VDInt<1, 0, 0b00, 0b1001, 1, N3RegFrm, IIC_VMULi16D, "vmul",
3946 "p8", v8i8, v8i8, int_arm_neon_vmulp, 1>;
3947def VMULpq : N3VQInt<1, 0, 0b00, 0b1001, 1, N3RegFrm, IIC_VMULi16Q, "vmul",
3948 "p8", v16i8, v16i8, int_arm_neon_vmulp, 1>;
Evan Cheng08cec1e2010-10-11 23:41:41 +00003949def VMULfd : N3VD<1, 0, 0b00, 0b1101, 1, IIC_VFMULD, "vmul", "f32",
Bob Wilson9abe19d2010-02-17 00:31:29 +00003950 v2f32, v2f32, fmul, 1>;
Evan Cheng08cec1e2010-10-11 23:41:41 +00003951def VMULfq : N3VQ<1, 0, 0b00, 0b1101, 1, IIC_VFMULQ, "vmul", "f32",
Bob Wilson9abe19d2010-02-17 00:31:29 +00003952 v4f32, v4f32, fmul, 1>;
Jim Grosbach45755a72011-12-05 20:09:44 +00003953defm VMULsl : N3VSL_HS<0b1000, "vmul", mul>;
Bob Wilson9abe19d2010-02-17 00:31:29 +00003954def VMULslfd : N3VDSL<0b10, 0b1001, IIC_VBIND, "vmul", "f32", v2f32, fmul>;
3955def VMULslfq : N3VQSL<0b10, 0b1001, IIC_VBINQ, "vmul", "f32", v4f32,
3956 v2f32, fmul>;
3957
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003958def : Pat<(v8i16 (mul (v8i16 QPR:$src1),
3959 (v8i16 (NEONvduplane (v8i16 QPR:$src2), imm:$lane)))),
3960 (v8i16 (VMULslv8i16 (v8i16 QPR:$src1),
3961 (v4i16 (EXTRACT_SUBREG QPR:$src2,
Bob Wilson9abe19d2010-02-17 00:31:29 +00003962 (DSubReg_i16_reg imm:$lane))),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003963 (SubReg_i16_lane imm:$lane)))>;
3964def : Pat<(v4i32 (mul (v4i32 QPR:$src1),
3965 (v4i32 (NEONvduplane (v4i32 QPR:$src2), imm:$lane)))),
3966 (v4i32 (VMULslv4i32 (v4i32 QPR:$src1),
3967 (v2i32 (EXTRACT_SUBREG QPR:$src2,
Bob Wilson9abe19d2010-02-17 00:31:29 +00003968 (DSubReg_i32_reg imm:$lane))),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003969 (SubReg_i32_lane imm:$lane)))>;
3970def : Pat<(v4f32 (fmul (v4f32 QPR:$src1),
3971 (v4f32 (NEONvduplane (v4f32 QPR:$src2), imm:$lane)))),
3972 (v4f32 (VMULslfq (v4f32 QPR:$src1),
3973 (v2f32 (EXTRACT_SUBREG QPR:$src2,
Bob Wilson9abe19d2010-02-17 00:31:29 +00003974 (DSubReg_i32_reg imm:$lane))),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003975 (SubReg_i32_lane imm:$lane)))>;
3976
Bob Wilson5bafff32009-06-22 23:27:02 +00003977// VQDMULH : Vector Saturating Doubling Multiply Returning High Half
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003978defm VQDMULH : N3VInt_HS<0, 0, 0b1011, 0, N3RegFrm, IIC_VMULi16D, IIC_VMULi32D,
Jim Grosbach1251e1a2010-11-18 01:39:50 +00003979 IIC_VMULi16Q, IIC_VMULi32Q,
Evan Chengf81bf152009-11-23 21:57:23 +00003980 "vqdmulh", "s", int_arm_neon_vqdmulh, 1>;
David Goodwin658ea602009-09-25 18:38:29 +00003981defm VQDMULHsl: N3VIntSL_HS<0b1100, IIC_VMULi16D, IIC_VMULi32D,
3982 IIC_VMULi16Q, IIC_VMULi32Q,
Evan Chengf81bf152009-11-23 21:57:23 +00003983 "vqdmulh", "s", int_arm_neon_vqdmulh>;
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003984def : Pat<(v8i16 (int_arm_neon_vqdmulh (v8i16 QPR:$src1),
Evan Chengac0869d2009-11-21 06:21:52 +00003985 (v8i16 (NEONvduplane (v8i16 QPR:$src2),
3986 imm:$lane)))),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003987 (v8i16 (VQDMULHslv8i16 (v8i16 QPR:$src1),
3988 (v4i16 (EXTRACT_SUBREG QPR:$src2,
Bob Wilson9abe19d2010-02-17 00:31:29 +00003989 (DSubReg_i16_reg imm:$lane))),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003990 (SubReg_i16_lane imm:$lane)))>;
3991def : Pat<(v4i32 (int_arm_neon_vqdmulh (v4i32 QPR:$src1),
Evan Chengac0869d2009-11-21 06:21:52 +00003992 (v4i32 (NEONvduplane (v4i32 QPR:$src2),
3993 imm:$lane)))),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003994 (v4i32 (VQDMULHslv4i32 (v4i32 QPR:$src1),
3995 (v2i32 (EXTRACT_SUBREG QPR:$src2,
Bob Wilson9abe19d2010-02-17 00:31:29 +00003996 (DSubReg_i32_reg imm:$lane))),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003997 (SubReg_i32_lane imm:$lane)))>;
3998
Bob Wilson5bafff32009-06-22 23:27:02 +00003999// VQRDMULH : Vector Rounding Saturating Doubling Multiply Returning High Half
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004000defm VQRDMULH : N3VInt_HS<1, 0, 0b1011, 0, N3RegFrm,
4001 IIC_VMULi16D,IIC_VMULi32D,IIC_VMULi16Q,IIC_VMULi32Q,
Evan Chengf81bf152009-11-23 21:57:23 +00004002 "vqrdmulh", "s", int_arm_neon_vqrdmulh, 1>;
David Goodwin658ea602009-09-25 18:38:29 +00004003defm VQRDMULHsl : N3VIntSL_HS<0b1101, IIC_VMULi16D, IIC_VMULi32D,
4004 IIC_VMULi16Q, IIC_VMULi32Q,
Evan Chengf81bf152009-11-23 21:57:23 +00004005 "vqrdmulh", "s", int_arm_neon_vqrdmulh>;
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00004006def : Pat<(v8i16 (int_arm_neon_vqrdmulh (v8i16 QPR:$src1),
Evan Chengac0869d2009-11-21 06:21:52 +00004007 (v8i16 (NEONvduplane (v8i16 QPR:$src2),
4008 imm:$lane)))),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00004009 (v8i16 (VQRDMULHslv8i16 (v8i16 QPR:$src1),
4010 (v4i16 (EXTRACT_SUBREG QPR:$src2,
Bob Wilson9abe19d2010-02-17 00:31:29 +00004011 (DSubReg_i16_reg imm:$lane))),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00004012 (SubReg_i16_lane imm:$lane)))>;
4013def : Pat<(v4i32 (int_arm_neon_vqrdmulh (v4i32 QPR:$src1),
Evan Chengac0869d2009-11-21 06:21:52 +00004014 (v4i32 (NEONvduplane (v4i32 QPR:$src2),
4015 imm:$lane)))),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00004016 (v4i32 (VQRDMULHslv4i32 (v4i32 QPR:$src1),
4017 (v2i32 (EXTRACT_SUBREG QPR:$src2,
Bob Wilson9abe19d2010-02-17 00:31:29 +00004018 (DSubReg_i32_reg imm:$lane))),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00004019 (SubReg_i32_lane imm:$lane)))>;
4020
Bob Wilson5bafff32009-06-22 23:27:02 +00004021// VMULL : Vector Multiply Long (integer and polynomial) (Q = D * D)
Bob Wilsond0b69cf2010-09-01 23:50:19 +00004022defm VMULLs : N3VL_QHS<0,1,0b1100,0, IIC_VMULi16D, IIC_VMULi32D,
4023 "vmull", "s", NEONvmulls, 1>;
4024defm VMULLu : N3VL_QHS<1,1,0b1100,0, IIC_VMULi16D, IIC_VMULi32D,
4025 "vmull", "u", NEONvmullu, 1>;
Evan Chengf81bf152009-11-23 21:57:23 +00004026def VMULLp : N3VLInt<0, 1, 0b00, 0b1110, 0, IIC_VMULi16D, "vmull", "p8",
Evan Chengac0869d2009-11-21 06:21:52 +00004027 v8i16, v8i8, int_arm_neon_vmullp, 1>;
Bob Wilsond0b69cf2010-09-01 23:50:19 +00004028defm VMULLsls : N3VLSL_HS<0, 0b1010, IIC_VMULi16D, "vmull", "s", NEONvmulls>;
4029defm VMULLslu : N3VLSL_HS<1, 0b1010, IIC_VMULi16D, "vmull", "u", NEONvmullu>;
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00004030
Bob Wilson5bafff32009-06-22 23:27:02 +00004031// VQDMULL : Vector Saturating Doubling Multiply Long (Q = D * D)
Anton Korobeynikovecc64062010-04-07 18:21:10 +00004032defm VQDMULL : N3VLInt_HS<0,1,0b1101,0, IIC_VMULi16D, IIC_VMULi32D,
4033 "vqdmull", "s", int_arm_neon_vqdmull, 1>;
4034defm VQDMULLsl: N3VLIntSL_HS<0, 0b1011, IIC_VMULi16D,
4035 "vqdmull", "s", int_arm_neon_vqdmull>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004036
4037// Vector Multiply-Accumulate and Multiply-Subtract Operations.
4038
4039// VMLA : Vector Multiply Accumulate (integer and floating-point)
David Goodwin658ea602009-09-25 18:38:29 +00004040defm VMLA : N3VMulOp_QHS<0, 0, 0b1001, 0, IIC_VMACi16D, IIC_VMACi32D,
Evan Chengf81bf152009-11-23 21:57:23 +00004041 IIC_VMACi16Q, IIC_VMACi32Q, "vmla", "i", add>;
4042def VMLAfd : N3VDMulOp<0, 0, 0b00, 0b1101, 1, IIC_VMACD, "vmla", "f32",
Evan Cheng48575f62010-12-05 22:04:16 +00004043 v2f32, fmul_su, fadd_mlx>,
Anton Korobeynikov4b4e6222012-01-22 12:07:33 +00004044 Requires<[HasNEON, UseFPVMLx, NoNEONVFP4]>;
Evan Chengf81bf152009-11-23 21:57:23 +00004045def VMLAfq : N3VQMulOp<0, 0, 0b00, 0b1101, 1, IIC_VMACQ, "vmla", "f32",
Evan Cheng48575f62010-12-05 22:04:16 +00004046 v4f32, fmul_su, fadd_mlx>,
Anton Korobeynikov4b4e6222012-01-22 12:07:33 +00004047 Requires<[HasNEON, UseFPVMLx, NoNEONVFP4]>;
David Goodwin658ea602009-09-25 18:38:29 +00004048defm VMLAsl : N3VMulOpSL_HS<0b0000, IIC_VMACi16D, IIC_VMACi32D,
Evan Chengf81bf152009-11-23 21:57:23 +00004049 IIC_VMACi16Q, IIC_VMACi32Q, "vmla", "i", add>;
4050def VMLAslfd : N3VDMulOpSL<0b10, 0b0001, IIC_VMACD, "vmla", "f32",
Evan Cheng48575f62010-12-05 22:04:16 +00004051 v2f32, fmul_su, fadd_mlx>,
4052 Requires<[HasNEON, UseFPVMLx]>;
Evan Chengf81bf152009-11-23 21:57:23 +00004053def VMLAslfq : N3VQMulOpSL<0b10, 0b0001, IIC_VMACQ, "vmla", "f32",
Evan Cheng48575f62010-12-05 22:04:16 +00004054 v4f32, v2f32, fmul_su, fadd_mlx>,
4055 Requires<[HasNEON, UseFPVMLx]>;
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00004056
4057def : Pat<(v8i16 (add (v8i16 QPR:$src1),
Bob Wilson9abe19d2010-02-17 00:31:29 +00004058 (mul (v8i16 QPR:$src2),
4059 (v8i16 (NEONvduplane (v8i16 QPR:$src3), imm:$lane))))),
4060 (v8i16 (VMLAslv8i16 (v8i16 QPR:$src1), (v8i16 QPR:$src2),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00004061 (v4i16 (EXTRACT_SUBREG QPR:$src3,
Bob Wilson9abe19d2010-02-17 00:31:29 +00004062 (DSubReg_i16_reg imm:$lane))),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00004063 (SubReg_i16_lane imm:$lane)))>;
4064
4065def : Pat<(v4i32 (add (v4i32 QPR:$src1),
Bob Wilson9abe19d2010-02-17 00:31:29 +00004066 (mul (v4i32 QPR:$src2),
4067 (v4i32 (NEONvduplane (v4i32 QPR:$src3), imm:$lane))))),
4068 (v4i32 (VMLAslv4i32 (v4i32 QPR:$src1), (v4i32 QPR:$src2),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00004069 (v2i32 (EXTRACT_SUBREG QPR:$src3,
Bob Wilson9abe19d2010-02-17 00:31:29 +00004070 (DSubReg_i32_reg imm:$lane))),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00004071 (SubReg_i32_lane imm:$lane)))>;
4072
Evan Cheng48575f62010-12-05 22:04:16 +00004073def : Pat<(v4f32 (fadd_mlx (v4f32 QPR:$src1),
4074 (fmul_su (v4f32 QPR:$src2),
Bob Wilson9abe19d2010-02-17 00:31:29 +00004075 (v4f32 (NEONvduplane (v4f32 QPR:$src3), imm:$lane))))),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00004076 (v4f32 (VMLAslfq (v4f32 QPR:$src1),
4077 (v4f32 QPR:$src2),
4078 (v2f32 (EXTRACT_SUBREG QPR:$src3,
Bob Wilson9abe19d2010-02-17 00:31:29 +00004079 (DSubReg_i32_reg imm:$lane))),
Evan Cheng48575f62010-12-05 22:04:16 +00004080 (SubReg_i32_lane imm:$lane)))>,
4081 Requires<[HasNEON, UseFPVMLx]>;
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00004082
Bob Wilson5bafff32009-06-22 23:27:02 +00004083// VMLAL : Vector Multiply Accumulate Long (Q += D * D)
Bob Wilsond0b69cf2010-09-01 23:50:19 +00004084defm VMLALs : N3VLMulOp_QHS<0,1,0b1000,0, IIC_VMACi16D, IIC_VMACi32D,
4085 "vmlal", "s", NEONvmulls, add>;
4086defm VMLALu : N3VLMulOp_QHS<1,1,0b1000,0, IIC_VMACi16D, IIC_VMACi32D,
4087 "vmlal", "u", NEONvmullu, add>;
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00004088
Bob Wilsond0b69cf2010-09-01 23:50:19 +00004089defm VMLALsls : N3VLMulOpSL_HS<0, 0b0010, "vmlal", "s", NEONvmulls, add>;
4090defm VMLALslu : N3VLMulOpSL_HS<1, 0b0010, "vmlal", "u", NEONvmullu, add>;
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00004091
Bob Wilson5bafff32009-06-22 23:27:02 +00004092// VQDMLAL : Vector Saturating Doubling Multiply Accumulate Long (Q += D * D)
Anton Korobeynikov95102072010-04-07 18:21:04 +00004093defm VQDMLAL : N3VLInt3_HS<0, 1, 0b1001, 0, IIC_VMACi16D, IIC_VMACi32D,
Anton Korobeynikov0a3e2b52010-04-07 18:20:42 +00004094 "vqdmlal", "s", int_arm_neon_vqdmlal>;
Evan Chengf81bf152009-11-23 21:57:23 +00004095defm VQDMLALsl: N3VLInt3SL_HS<0, 0b0011, "vqdmlal", "s", int_arm_neon_vqdmlal>;
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00004096
Bob Wilson5bafff32009-06-22 23:27:02 +00004097// VMLS : Vector Multiply Subtract (integer and floating-point)
Bob Wilson8f07b9e2009-10-03 04:41:21 +00004098defm VMLS : N3VMulOp_QHS<1, 0, 0b1001, 0, IIC_VMACi16D, IIC_VMACi32D,
Evan Chengf81bf152009-11-23 21:57:23 +00004099 IIC_VMACi16Q, IIC_VMACi32Q, "vmls", "i", sub>;
4100def VMLSfd : N3VDMulOp<0, 0, 0b10, 0b1101, 1, IIC_VMACD, "vmls", "f32",
Evan Cheng48575f62010-12-05 22:04:16 +00004101 v2f32, fmul_su, fsub_mlx>,
Anton Korobeynikov4b4e6222012-01-22 12:07:33 +00004102 Requires<[HasNEON, UseFPVMLx, NoNEONVFP4]>;
Evan Chengf81bf152009-11-23 21:57:23 +00004103def VMLSfq : N3VQMulOp<0, 0, 0b10, 0b1101, 1, IIC_VMACQ, "vmls", "f32",
Evan Cheng48575f62010-12-05 22:04:16 +00004104 v4f32, fmul_su, fsub_mlx>,
Anton Korobeynikov4b4e6222012-01-22 12:07:33 +00004105 Requires<[HasNEON, UseFPVMLx, NoNEONVFP4]>;
David Goodwin658ea602009-09-25 18:38:29 +00004106defm VMLSsl : N3VMulOpSL_HS<0b0100, IIC_VMACi16D, IIC_VMACi32D,
Evan Chengf81bf152009-11-23 21:57:23 +00004107 IIC_VMACi16Q, IIC_VMACi32Q, "vmls", "i", sub>;
4108def VMLSslfd : N3VDMulOpSL<0b10, 0b0101, IIC_VMACD, "vmls", "f32",
Evan Cheng48575f62010-12-05 22:04:16 +00004109 v2f32, fmul_su, fsub_mlx>,
4110 Requires<[HasNEON, UseFPVMLx]>;
Evan Chengf81bf152009-11-23 21:57:23 +00004111def VMLSslfq : N3VQMulOpSL<0b10, 0b0101, IIC_VMACQ, "vmls", "f32",
Evan Cheng48575f62010-12-05 22:04:16 +00004112 v4f32, v2f32, fmul_su, fsub_mlx>,
4113 Requires<[HasNEON, UseFPVMLx]>;
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00004114
4115def : Pat<(v8i16 (sub (v8i16 QPR:$src1),
Bob Wilson9abe19d2010-02-17 00:31:29 +00004116 (mul (v8i16 QPR:$src2),
4117 (v8i16 (NEONvduplane (v8i16 QPR:$src3), imm:$lane))))),
4118 (v8i16 (VMLSslv8i16 (v8i16 QPR:$src1), (v8i16 QPR:$src2),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00004119 (v4i16 (EXTRACT_SUBREG QPR:$src3,
Bob Wilson9abe19d2010-02-17 00:31:29 +00004120 (DSubReg_i16_reg imm:$lane))),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00004121 (SubReg_i16_lane imm:$lane)))>;
4122
4123def : Pat<(v4i32 (sub (v4i32 QPR:$src1),
Bob Wilson9abe19d2010-02-17 00:31:29 +00004124 (mul (v4i32 QPR:$src2),
4125 (v4i32 (NEONvduplane (v4i32 QPR:$src3), imm:$lane))))),
4126 (v4i32 (VMLSslv4i32 (v4i32 QPR:$src1), (v4i32 QPR:$src2),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00004127 (v2i32 (EXTRACT_SUBREG QPR:$src3,
Bob Wilson9abe19d2010-02-17 00:31:29 +00004128 (DSubReg_i32_reg imm:$lane))),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00004129 (SubReg_i32_lane imm:$lane)))>;
4130
Evan Cheng48575f62010-12-05 22:04:16 +00004131def : Pat<(v4f32 (fsub_mlx (v4f32 QPR:$src1),
4132 (fmul_su (v4f32 QPR:$src2),
Bob Wilson9abe19d2010-02-17 00:31:29 +00004133 (v4f32 (NEONvduplane (v4f32 QPR:$src3), imm:$lane))))),
4134 (v4f32 (VMLSslfq (v4f32 QPR:$src1), (v4f32 QPR:$src2),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00004135 (v2f32 (EXTRACT_SUBREG QPR:$src3,
Bob Wilson9abe19d2010-02-17 00:31:29 +00004136 (DSubReg_i32_reg imm:$lane))),
Evan Cheng48575f62010-12-05 22:04:16 +00004137 (SubReg_i32_lane imm:$lane)))>,
4138 Requires<[HasNEON, UseFPVMLx]>;
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00004139
Bob Wilson5bafff32009-06-22 23:27:02 +00004140// VMLSL : Vector Multiply Subtract Long (Q -= D * D)
Bob Wilsond0b69cf2010-09-01 23:50:19 +00004141defm VMLSLs : N3VLMulOp_QHS<0,1,0b1010,0, IIC_VMACi16D, IIC_VMACi32D,
4142 "vmlsl", "s", NEONvmulls, sub>;
4143defm VMLSLu : N3VLMulOp_QHS<1,1,0b1010,0, IIC_VMACi16D, IIC_VMACi32D,
4144 "vmlsl", "u", NEONvmullu, sub>;
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00004145
Bob Wilsond0b69cf2010-09-01 23:50:19 +00004146defm VMLSLsls : N3VLMulOpSL_HS<0, 0b0110, "vmlsl", "s", NEONvmulls, sub>;
4147defm VMLSLslu : N3VLMulOpSL_HS<1, 0b0110, "vmlsl", "u", NEONvmullu, sub>;
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00004148
Bob Wilson5bafff32009-06-22 23:27:02 +00004149// VQDMLSL : Vector Saturating Doubling Multiply Subtract Long (Q -= D * D)
Anton Korobeynikov95102072010-04-07 18:21:04 +00004150defm VQDMLSL : N3VLInt3_HS<0, 1, 0b1011, 0, IIC_VMACi16D, IIC_VMACi32D,
Anton Korobeynikov0a3e2b52010-04-07 18:20:42 +00004151 "vqdmlsl", "s", int_arm_neon_vqdmlsl>;
Evan Chengf81bf152009-11-23 21:57:23 +00004152defm VQDMLSLsl: N3VLInt3SL_HS<0, 0b111, "vqdmlsl", "s", int_arm_neon_vqdmlsl>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004153
Anton Korobeynikov4b4e6222012-01-22 12:07:33 +00004154
4155// Fused Vector Multiply-Accumulate and Fused Multiply-Subtract Operations.
4156def VFMAfd : N3VDMulOp<0, 0, 0b00, 0b1100, 1, IIC_VFMACD, "vfma", "f32",
4157 v2f32, fmul_su, fadd_mlx>,
4158 Requires<[HasNEONVFP4]>;
4159
4160def VFMAfq : N3VQMulOp<0, 0, 0b00, 0b1100, 1, IIC_VFMACQ, "vfma", "f32",
4161 v4f32, fmul_su, fadd_mlx>,
4162 Requires<[HasNEONVFP4]>;
4163
4164// Fused Vector Multiply Subtract (floating-point)
4165def VFMSfd : N3VDMulOp<0, 0, 0b10, 0b1100, 1, IIC_VFMACD, "vfms", "f32",
4166 v2f32, fmul_su, fsub_mlx>,
4167 Requires<[HasNEONVFP4]>;
4168def VFMSfq : N3VQMulOp<0, 0, 0b10, 0b1100, 1, IIC_VFMACQ, "vfms", "f32",
4169 v4f32, fmul_su, fsub_mlx>,
4170 Requires<[HasNEONVFP4]>;
4171
Bob Wilson5bafff32009-06-22 23:27:02 +00004172// Vector Subtract Operations.
4173
4174// VSUB : Vector Subtract (integer and floating-point)
Evan Chengac0869d2009-11-21 06:21:52 +00004175defm VSUB : N3V_QHSD<1, 0, 0b1000, 0, IIC_VSUBiD, IIC_VSUBiQ,
Evan Chengf81bf152009-11-23 21:57:23 +00004176 "vsub", "i", sub, 0>;
4177def VSUBfd : N3VD<0, 0, 0b10, 0b1101, 0, IIC_VBIND, "vsub", "f32",
Evan Chengac0869d2009-11-21 06:21:52 +00004178 v2f32, v2f32, fsub, 0>;
Evan Chengf81bf152009-11-23 21:57:23 +00004179def VSUBfq : N3VQ<0, 0, 0b10, 0b1101, 0, IIC_VBINQ, "vsub", "f32",
Evan Chengac0869d2009-11-21 06:21:52 +00004180 v4f32, v4f32, fsub, 0>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004181// VSUBL : Vector Subtract Long (Q = D - D)
Bob Wilsond0b69cf2010-09-01 23:50:19 +00004182defm VSUBLs : N3VLExt_QHS<0,1,0b0010,0, IIC_VSHLiD, IIC_VSHLiD,
4183 "vsubl", "s", sub, sext, 0>;
4184defm VSUBLu : N3VLExt_QHS<1,1,0b0010,0, IIC_VSHLiD, IIC_VSHLiD,
4185 "vsubl", "u", sub, zext, 0>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004186// VSUBW : Vector Subtract Wide (Q = Q - D)
Bob Wilson04d6c282010-08-29 05:57:34 +00004187defm VSUBWs : N3VW_QHS<0,1,0b0011,0, "vsubw", "s", sub, sext, 0>;
4188defm VSUBWu : N3VW_QHS<1,1,0b0011,0, "vsubw", "u", sub, zext, 0>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004189// VHSUB : Vector Halving Subtract
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004190defm VHSUBs : N3VInt_QHS<0, 0, 0b0010, 0, N3RegFrm,
Anton Korobeynikovf8b5c632010-04-07 18:20:13 +00004191 IIC_VSUBi4D, IIC_VSUBi4D, IIC_VSUBi4Q, IIC_VSUBi4Q,
Evan Chengf81bf152009-11-23 21:57:23 +00004192 "vhsub", "s", int_arm_neon_vhsubs, 0>;
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004193defm VHSUBu : N3VInt_QHS<1, 0, 0b0010, 0, N3RegFrm,
Anton Korobeynikovf8b5c632010-04-07 18:20:13 +00004194 IIC_VSUBi4D, IIC_VSUBi4D, IIC_VSUBi4Q, IIC_VSUBi4Q,
Evan Chengf81bf152009-11-23 21:57:23 +00004195 "vhsub", "u", int_arm_neon_vhsubu, 0>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004196// VQSUB : Vector Saturing Subtract
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004197defm VQSUBs : N3VInt_QHSD<0, 0, 0b0010, 1, N3RegFrm,
Anton Korobeynikovf8b5c632010-04-07 18:20:13 +00004198 IIC_VSUBi4D, IIC_VSUBi4D, IIC_VSUBi4Q, IIC_VSUBi4Q,
Evan Chengf81bf152009-11-23 21:57:23 +00004199 "vqsub", "s", int_arm_neon_vqsubs, 0>;
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004200defm VQSUBu : N3VInt_QHSD<1, 0, 0b0010, 1, N3RegFrm,
Anton Korobeynikovf8b5c632010-04-07 18:20:13 +00004201 IIC_VSUBi4D, IIC_VSUBi4D, IIC_VSUBi4Q, IIC_VSUBi4Q,
Evan Chengf81bf152009-11-23 21:57:23 +00004202 "vqsub", "u", int_arm_neon_vqsubu, 0>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004203// VSUBHN : Vector Subtract and Narrow Returning High Half (D = Q - Q)
Evan Chengf81bf152009-11-23 21:57:23 +00004204defm VSUBHN : N3VNInt_HSD<0,1,0b0110,0, "vsubhn", "i",
4205 int_arm_neon_vsubhn, 0>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004206// VRSUBHN : Vector Rounding Subtract and Narrow Returning High Half (D=Q-Q)
Evan Chengf81bf152009-11-23 21:57:23 +00004207defm VRSUBHN : N3VNInt_HSD<1,1,0b0110,0, "vrsubhn", "i",
4208 int_arm_neon_vrsubhn, 0>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004209
4210// Vector Comparisons.
4211
4212// VCEQ : Vector Compare Equal
Anton Korobeynikovf8b5c632010-04-07 18:20:13 +00004213defm VCEQ : N3V_QHS<1, 0, 0b1000, 1, IIC_VSUBi4D, IIC_VSUBi4D, IIC_VSUBi4Q,
4214 IIC_VSUBi4Q, "vceq", "i", NEONvceq, 1>;
Evan Chengf81bf152009-11-23 21:57:23 +00004215def VCEQfd : N3VD<0,0,0b00,0b1110,0, IIC_VBIND, "vceq", "f32", v2i32, v2f32,
Evan Chengac0869d2009-11-21 06:21:52 +00004216 NEONvceq, 1>;
Evan Chengf81bf152009-11-23 21:57:23 +00004217def VCEQfq : N3VQ<0,0,0b00,0b1110,0, IIC_VBINQ, "vceq", "f32", v4i32, v4f32,
Evan Chengac0869d2009-11-21 06:21:52 +00004218 NEONvceq, 1>;
Owen Andersonc24cb352010-11-08 23:21:22 +00004219
Johnny Chen363ac582010-02-23 01:42:58 +00004220defm VCEQz : N2V_QHS_cmp<0b11, 0b11, 0b01, 0b00010, 0, "vceq", "i",
Owen Andersonca6945e2010-12-01 00:28:25 +00004221 "$Vd, $Vm, #0", NEONvceqz>;
Johnny Chenec5a4cd2010-02-23 00:33:12 +00004222
Bob Wilson5bafff32009-06-22 23:27:02 +00004223// VCGE : Vector Compare Greater Than or Equal
Anton Korobeynikovf8b5c632010-04-07 18:20:13 +00004224defm VCGEs : N3V_QHS<0, 0, 0b0011, 1, IIC_VSUBi4D, IIC_VSUBi4D, IIC_VSUBi4Q,
4225 IIC_VSUBi4Q, "vcge", "s", NEONvcge, 0>;
Jim Grosbach1251e1a2010-11-18 01:39:50 +00004226defm VCGEu : N3V_QHS<1, 0, 0b0011, 1, IIC_VSUBi4D, IIC_VSUBi4D, IIC_VSUBi4Q,
Anton Korobeynikovf8b5c632010-04-07 18:20:13 +00004227 IIC_VSUBi4Q, "vcge", "u", NEONvcgeu, 0>;
Johnny Chen69631b12010-03-24 21:25:07 +00004228def VCGEfd : N3VD<1,0,0b00,0b1110,0, IIC_VBIND, "vcge", "f32", v2i32, v2f32,
4229 NEONvcge, 0>;
Evan Chengf81bf152009-11-23 21:57:23 +00004230def VCGEfq : N3VQ<1,0,0b00,0b1110,0, IIC_VBINQ, "vcge", "f32", v4i32, v4f32,
Evan Chengac0869d2009-11-21 06:21:52 +00004231 NEONvcge, 0>;
Owen Andersonc24cb352010-11-08 23:21:22 +00004232
Johnny Chen363ac582010-02-23 01:42:58 +00004233defm VCGEz : N2V_QHS_cmp<0b11, 0b11, 0b01, 0b00001, 0, "vcge", "s",
Owen Andersonca6945e2010-12-01 00:28:25 +00004234 "$Vd, $Vm, #0", NEONvcgez>;
Johnny Chen363ac582010-02-23 01:42:58 +00004235defm VCLEz : N2V_QHS_cmp<0b11, 0b11, 0b01, 0b00011, 0, "vcle", "s",
Owen Andersonca6945e2010-12-01 00:28:25 +00004236 "$Vd, $Vm, #0", NEONvclez>;
Johnny Chen363ac582010-02-23 01:42:58 +00004237
Bob Wilson5bafff32009-06-22 23:27:02 +00004238// VCGT : Vector Compare Greater Than
Anton Korobeynikovf8b5c632010-04-07 18:20:13 +00004239defm VCGTs : N3V_QHS<0, 0, 0b0011, 0, IIC_VSUBi4D, IIC_VSUBi4D, IIC_VSUBi4Q,
4240 IIC_VSUBi4Q, "vcgt", "s", NEONvcgt, 0>;
4241defm VCGTu : N3V_QHS<1, 0, 0b0011, 0, IIC_VSUBi4D, IIC_VSUBi4D, IIC_VSUBi4Q,
4242 IIC_VSUBi4Q, "vcgt", "u", NEONvcgtu, 0>;
Evan Chengf81bf152009-11-23 21:57:23 +00004243def VCGTfd : N3VD<1,0,0b10,0b1110,0, IIC_VBIND, "vcgt", "f32", v2i32, v2f32,
Evan Chengac0869d2009-11-21 06:21:52 +00004244 NEONvcgt, 0>;
Evan Chengf81bf152009-11-23 21:57:23 +00004245def VCGTfq : N3VQ<1,0,0b10,0b1110,0, IIC_VBINQ, "vcgt", "f32", v4i32, v4f32,
Evan Chengac0869d2009-11-21 06:21:52 +00004246 NEONvcgt, 0>;
Owen Andersonc24cb352010-11-08 23:21:22 +00004247
Johnny Chen363ac582010-02-23 01:42:58 +00004248defm VCGTz : N2V_QHS_cmp<0b11, 0b11, 0b01, 0b00000, 0, "vcgt", "s",
Owen Andersonca6945e2010-12-01 00:28:25 +00004249 "$Vd, $Vm, #0", NEONvcgtz>;
Johnny Chen363ac582010-02-23 01:42:58 +00004250defm VCLTz : N2V_QHS_cmp<0b11, 0b11, 0b01, 0b00100, 0, "vclt", "s",
Owen Andersonca6945e2010-12-01 00:28:25 +00004251 "$Vd, $Vm, #0", NEONvcltz>;
Johnny Chen363ac582010-02-23 01:42:58 +00004252
Bob Wilson5bafff32009-06-22 23:27:02 +00004253// VACGE : Vector Absolute Compare Greater Than or Equal (aka VCAGE)
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004254def VACGEd : N3VDInt<1, 0, 0b00, 0b1110, 1, N3RegFrm, IIC_VBIND, "vacge",
4255 "f32", v2i32, v2f32, int_arm_neon_vacged, 0>;
4256def VACGEq : N3VQInt<1, 0, 0b00, 0b1110, 1, N3RegFrm, IIC_VBINQ, "vacge",
4257 "f32", v4i32, v4f32, int_arm_neon_vacgeq, 0>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004258// VACGT : Vector Absolute Compare Greater Than (aka VCAGT)
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004259def VACGTd : N3VDInt<1, 0, 0b10, 0b1110, 1, N3RegFrm, IIC_VBIND, "vacgt",
4260 "f32", v2i32, v2f32, int_arm_neon_vacgtd, 0>;
4261def VACGTq : N3VQInt<1, 0, 0b10, 0b1110, 1, N3RegFrm, IIC_VBINQ, "vacgt",
4262 "f32", v4i32, v4f32, int_arm_neon_vacgtq, 0>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004263// VTST : Vector Test Bits
Jim Grosbach1251e1a2010-11-18 01:39:50 +00004264defm VTST : N3V_QHS<0, 0, 0b1000, 1, IIC_VBINi4D, IIC_VBINi4D, IIC_VBINi4Q,
Bob Wilson3a4a8322010-01-17 06:35:17 +00004265 IIC_VBINi4Q, "vtst", "", NEONvtst, 1>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004266
4267// Vector Bitwise Operations.
4268
Bob Wilsoncba270d2010-07-13 21:16:48 +00004269def vnotd : PatFrag<(ops node:$in),
4270 (xor node:$in, (bitconvert (v8i8 NEONimmAllOnesV)))>;
4271def vnotq : PatFrag<(ops node:$in),
4272 (xor node:$in, (bitconvert (v16i8 NEONimmAllOnesV)))>;
Chris Lattnerb26fdcb2010-03-28 08:08:07 +00004273
4274
Bob Wilson5bafff32009-06-22 23:27:02 +00004275// VAND : Vector Bitwise AND
Evan Chengf81bf152009-11-23 21:57:23 +00004276def VANDd : N3VDX<0, 0, 0b00, 0b0001, 1, IIC_VBINiD, "vand",
4277 v2i32, v2i32, and, 1>;
4278def VANDq : N3VQX<0, 0, 0b00, 0b0001, 1, IIC_VBINiQ, "vand",
4279 v4i32, v4i32, and, 1>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004280
4281// VEOR : Vector Bitwise Exclusive OR
Evan Chengf81bf152009-11-23 21:57:23 +00004282def VEORd : N3VDX<1, 0, 0b00, 0b0001, 1, IIC_VBINiD, "veor",
4283 v2i32, v2i32, xor, 1>;
4284def VEORq : N3VQX<1, 0, 0b00, 0b0001, 1, IIC_VBINiQ, "veor",
4285 v4i32, v4i32, xor, 1>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004286
4287// VORR : Vector Bitwise OR
Evan Chengf81bf152009-11-23 21:57:23 +00004288def VORRd : N3VDX<0, 0, 0b10, 0b0001, 1, IIC_VBINiD, "vorr",
4289 v2i32, v2i32, or, 1>;
4290def VORRq : N3VQX<0, 0, 0b10, 0b0001, 1, IIC_VBINiQ, "vorr",
4291 v4i32, v4i32, or, 1>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004292
Owen Andersond9668172010-11-03 22:44:51 +00004293def VORRiv4i16 : N1ModImm<1, 0b000, {1,0,?,1}, 0, 0, 0, 1,
Jim Grosbachea461102011-10-17 23:09:09 +00004294 (outs DPR:$Vd), (ins nImmSplatI16:$SIMM, DPR:$src),
Owen Andersond9668172010-11-03 22:44:51 +00004295 IIC_VMOVImm,
4296 "vorr", "i16", "$Vd, $SIMM", "$src = $Vd",
4297 [(set DPR:$Vd,
4298 (v4i16 (NEONvorrImm DPR:$src, timm:$SIMM)))]> {
4299 let Inst{9} = SIMM{9};
4300}
4301
Owen Anderson080c0922010-11-05 19:27:46 +00004302def VORRiv2i32 : N1ModImm<1, 0b000, {0,?,?,1}, 0, 0, 0, 1,
Jim Grosbach6248a542011-10-18 00:22:00 +00004303 (outs DPR:$Vd), (ins nImmSplatI32:$SIMM, DPR:$src),
Owen Andersond9668172010-11-03 22:44:51 +00004304 IIC_VMOVImm,
4305 "vorr", "i32", "$Vd, $SIMM", "$src = $Vd",
4306 [(set DPR:$Vd,
4307 (v2i32 (NEONvorrImm DPR:$src, timm:$SIMM)))]> {
Owen Anderson080c0922010-11-05 19:27:46 +00004308 let Inst{10-9} = SIMM{10-9};
Owen Andersond9668172010-11-03 22:44:51 +00004309}
4310
4311def VORRiv8i16 : N1ModImm<1, 0b000, {1,0,?,1}, 0, 1, 0, 1,
Jim Grosbachea461102011-10-17 23:09:09 +00004312 (outs QPR:$Vd), (ins nImmSplatI16:$SIMM, QPR:$src),
Owen Andersond9668172010-11-03 22:44:51 +00004313 IIC_VMOVImm,
4314 "vorr", "i16", "$Vd, $SIMM", "$src = $Vd",
4315 [(set QPR:$Vd,
4316 (v8i16 (NEONvorrImm QPR:$src, timm:$SIMM)))]> {
4317 let Inst{9} = SIMM{9};
4318}
4319
Owen Anderson080c0922010-11-05 19:27:46 +00004320def VORRiv4i32 : N1ModImm<1, 0b000, {0,?,?,1}, 0, 1, 0, 1,
Jim Grosbach6248a542011-10-18 00:22:00 +00004321 (outs QPR:$Vd), (ins nImmSplatI32:$SIMM, QPR:$src),
Owen Andersond9668172010-11-03 22:44:51 +00004322 IIC_VMOVImm,
4323 "vorr", "i32", "$Vd, $SIMM", "$src = $Vd",
4324 [(set QPR:$Vd,
4325 (v4i32 (NEONvorrImm QPR:$src, timm:$SIMM)))]> {
Owen Anderson080c0922010-11-05 19:27:46 +00004326 let Inst{10-9} = SIMM{10-9};
Owen Andersond9668172010-11-03 22:44:51 +00004327}
4328
4329
Bob Wilson5bafff32009-06-22 23:27:02 +00004330// VBIC : Vector Bitwise Bit Clear (AND NOT)
Owen Andersonca6945e2010-12-01 00:28:25 +00004331def VBICd : N3VX<0, 0, 0b01, 0b0001, 0, 1, (outs DPR:$Vd),
4332 (ins DPR:$Vn, DPR:$Vm), N3RegFrm, IIC_VBINiD,
4333 "vbic", "$Vd, $Vn, $Vm", "",
4334 [(set DPR:$Vd, (v2i32 (and DPR:$Vn,
4335 (vnotd DPR:$Vm))))]>;
4336def VBICq : N3VX<0, 0, 0b01, 0b0001, 1, 1, (outs QPR:$Vd),
4337 (ins QPR:$Vn, QPR:$Vm), N3RegFrm, IIC_VBINiQ,
4338 "vbic", "$Vd, $Vn, $Vm", "",
4339 [(set QPR:$Vd, (v4i32 (and QPR:$Vn,
4340 (vnotq QPR:$Vm))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004341
Owen Anderson080c0922010-11-05 19:27:46 +00004342def VBICiv4i16 : N1ModImm<1, 0b000, {1,0,?,1}, 0, 0, 1, 1,
Jim Grosbachea461102011-10-17 23:09:09 +00004343 (outs DPR:$Vd), (ins nImmSplatI16:$SIMM, DPR:$src),
Owen Anderson080c0922010-11-05 19:27:46 +00004344 IIC_VMOVImm,
4345 "vbic", "i16", "$Vd, $SIMM", "$src = $Vd",
4346 [(set DPR:$Vd,
4347 (v4i16 (NEONvbicImm DPR:$src, timm:$SIMM)))]> {
4348 let Inst{9} = SIMM{9};
4349}
4350
4351def VBICiv2i32 : N1ModImm<1, 0b000, {0,?,?,1}, 0, 0, 1, 1,
Jim Grosbach6248a542011-10-18 00:22:00 +00004352 (outs DPR:$Vd), (ins nImmSplatI32:$SIMM, DPR:$src),
Owen Anderson080c0922010-11-05 19:27:46 +00004353 IIC_VMOVImm,
4354 "vbic", "i32", "$Vd, $SIMM", "$src = $Vd",
4355 [(set DPR:$Vd,
4356 (v2i32 (NEONvbicImm DPR:$src, timm:$SIMM)))]> {
4357 let Inst{10-9} = SIMM{10-9};
4358}
4359
4360def VBICiv8i16 : N1ModImm<1, 0b000, {1,0,?,1}, 0, 1, 1, 1,
Jim Grosbachea461102011-10-17 23:09:09 +00004361 (outs QPR:$Vd), (ins nImmSplatI16:$SIMM, QPR:$src),
Owen Anderson080c0922010-11-05 19:27:46 +00004362 IIC_VMOVImm,
4363 "vbic", "i16", "$Vd, $SIMM", "$src = $Vd",
4364 [(set QPR:$Vd,
4365 (v8i16 (NEONvbicImm QPR:$src, timm:$SIMM)))]> {
4366 let Inst{9} = SIMM{9};
4367}
4368
4369def VBICiv4i32 : N1ModImm<1, 0b000, {0,?,?,1}, 0, 1, 1, 1,
Jim Grosbach6248a542011-10-18 00:22:00 +00004370 (outs QPR:$Vd), (ins nImmSplatI32:$SIMM, QPR:$src),
Owen Anderson080c0922010-11-05 19:27:46 +00004371 IIC_VMOVImm,
4372 "vbic", "i32", "$Vd, $SIMM", "$src = $Vd",
4373 [(set QPR:$Vd,
4374 (v4i32 (NEONvbicImm QPR:$src, timm:$SIMM)))]> {
4375 let Inst{10-9} = SIMM{10-9};
4376}
4377
Bob Wilson5bafff32009-06-22 23:27:02 +00004378// VORN : Vector Bitwise OR NOT
Owen Andersonca6945e2010-12-01 00:28:25 +00004379def VORNd : N3VX<0, 0, 0b11, 0b0001, 0, 1, (outs DPR:$Vd),
4380 (ins DPR:$Vn, DPR:$Vm), N3RegFrm, IIC_VBINiD,
4381 "vorn", "$Vd, $Vn, $Vm", "",
4382 [(set DPR:$Vd, (v2i32 (or DPR:$Vn,
4383 (vnotd DPR:$Vm))))]>;
4384def VORNq : N3VX<0, 0, 0b11, 0b0001, 1, 1, (outs QPR:$Vd),
4385 (ins QPR:$Vn, QPR:$Vm), N3RegFrm, IIC_VBINiQ,
4386 "vorn", "$Vd, $Vn, $Vm", "",
4387 [(set QPR:$Vd, (v4i32 (or QPR:$Vn,
4388 (vnotq QPR:$Vm))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004389
Bob Wilson7e3f0d22010-07-14 06:31:50 +00004390// VMVN : Vector Bitwise NOT (Immediate)
4391
4392let isReMaterializable = 1 in {
Owen Andersona88ea032010-10-26 17:40:54 +00004393
Owen Andersonca6945e2010-12-01 00:28:25 +00004394def VMVNv4i16 : N1ModImm<1, 0b000, {1,0,?,0}, 0, 0, 1, 1, (outs DPR:$Vd),
Jim Grosbachea461102011-10-17 23:09:09 +00004395 (ins nImmSplatI16:$SIMM), IIC_VMOVImm,
Owen Andersonca6945e2010-12-01 00:28:25 +00004396 "vmvn", "i16", "$Vd, $SIMM", "",
4397 [(set DPR:$Vd, (v4i16 (NEONvmvnImm timm:$SIMM)))]> {
Owen Andersona88ea032010-10-26 17:40:54 +00004398 let Inst{9} = SIMM{9};
4399}
4400
Owen Andersonca6945e2010-12-01 00:28:25 +00004401def VMVNv8i16 : N1ModImm<1, 0b000, {1,0,?,0}, 0, 1, 1, 1, (outs QPR:$Vd),
Jim Grosbachea461102011-10-17 23:09:09 +00004402 (ins nImmSplatI16:$SIMM), IIC_VMOVImm,
Owen Andersonca6945e2010-12-01 00:28:25 +00004403 "vmvn", "i16", "$Vd, $SIMM", "",
4404 [(set QPR:$Vd, (v8i16 (NEONvmvnImm timm:$SIMM)))]> {
Owen Andersona88ea032010-10-26 17:40:54 +00004405 let Inst{9} = SIMM{9};
4406}
4407
Owen Andersonca6945e2010-12-01 00:28:25 +00004408def VMVNv2i32 : N1ModImm<1, 0b000, {?,?,?,?}, 0, 0, 1, 1, (outs DPR:$Vd),
Jim Grosbach6248a542011-10-18 00:22:00 +00004409 (ins nImmVMOVI32:$SIMM), IIC_VMOVImm,
Owen Andersonca6945e2010-12-01 00:28:25 +00004410 "vmvn", "i32", "$Vd, $SIMM", "",
4411 [(set DPR:$Vd, (v2i32 (NEONvmvnImm timm:$SIMM)))]> {
Owen Andersona88ea032010-10-26 17:40:54 +00004412 let Inst{11-8} = SIMM{11-8};
4413}
4414
Owen Andersonca6945e2010-12-01 00:28:25 +00004415def VMVNv4i32 : N1ModImm<1, 0b000, {?,?,?,?}, 0, 1, 1, 1, (outs QPR:$Vd),
Jim Grosbach6248a542011-10-18 00:22:00 +00004416 (ins nImmVMOVI32:$SIMM), IIC_VMOVImm,
Owen Andersonca6945e2010-12-01 00:28:25 +00004417 "vmvn", "i32", "$Vd, $SIMM", "",
4418 [(set QPR:$Vd, (v4i32 (NEONvmvnImm timm:$SIMM)))]> {
Owen Andersona88ea032010-10-26 17:40:54 +00004419 let Inst{11-8} = SIMM{11-8};
4420}
Bob Wilson7e3f0d22010-07-14 06:31:50 +00004421}
4422
Bob Wilson5bafff32009-06-22 23:27:02 +00004423// VMVN : Vector Bitwise NOT
Evan Chengf81bf152009-11-23 21:57:23 +00004424def VMVNd : N2VX<0b11, 0b11, 0b00, 0b00, 0b01011, 0, 0,
Owen Andersonca6945e2010-12-01 00:28:25 +00004425 (outs DPR:$Vd), (ins DPR:$Vm), IIC_VSUBiD,
4426 "vmvn", "$Vd, $Vm", "",
4427 [(set DPR:$Vd, (v2i32 (vnotd DPR:$Vm)))]>;
Evan Chengf81bf152009-11-23 21:57:23 +00004428def VMVNq : N2VX<0b11, 0b11, 0b00, 0b00, 0b01011, 1, 0,
Owen Andersonca6945e2010-12-01 00:28:25 +00004429 (outs QPR:$Vd), (ins QPR:$Vm), IIC_VSUBiD,
4430 "vmvn", "$Vd, $Vm", "",
4431 [(set QPR:$Vd, (v4i32 (vnotq QPR:$Vm)))]>;
Bob Wilsoncba270d2010-07-13 21:16:48 +00004432def : Pat<(v2i32 (vnotd DPR:$src)), (VMVNd DPR:$src)>;
4433def : Pat<(v4i32 (vnotq QPR:$src)), (VMVNq QPR:$src)>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004434
4435// VBSL : Vector Bitwise Select
Owen Anderson4110b432010-10-25 20:13:13 +00004436def VBSLd : N3VX<1, 0, 0b01, 0b0001, 0, 1, (outs DPR:$Vd),
4437 (ins DPR:$src1, DPR:$Vn, DPR:$Vm),
Bob Wilson2cd1a122010-03-27 04:01:23 +00004438 N3RegFrm, IIC_VCNTiD,
Owen Anderson4110b432010-10-25 20:13:13 +00004439 "vbsl", "$Vd, $Vn, $Vm", "$src1 = $Vd",
Jim Grosbachf921c0fe2011-06-13 22:54:22 +00004440 [(set DPR:$Vd,
4441 (v2i32 (NEONvbsl DPR:$src1, DPR:$Vn, DPR:$Vm)))]>;
Cameron Zwarichc0e6d782011-03-30 23:01:21 +00004442
4443def : Pat<(v2i32 (or (and DPR:$Vn, DPR:$Vd),
4444 (and DPR:$Vm, (vnotd DPR:$Vd)))),
4445 (VBSLd DPR:$Vd, DPR:$Vn, DPR:$Vm)>;
4446
Owen Anderson4110b432010-10-25 20:13:13 +00004447def VBSLq : N3VX<1, 0, 0b01, 0b0001, 1, 1, (outs QPR:$Vd),
4448 (ins QPR:$src1, QPR:$Vn, QPR:$Vm),
Bob Wilson2cd1a122010-03-27 04:01:23 +00004449 N3RegFrm, IIC_VCNTiQ,
Owen Anderson4110b432010-10-25 20:13:13 +00004450 "vbsl", "$Vd, $Vn, $Vm", "$src1 = $Vd",
Jim Grosbachf921c0fe2011-06-13 22:54:22 +00004451 [(set QPR:$Vd,
4452 (v4i32 (NEONvbsl QPR:$src1, QPR:$Vn, QPR:$Vm)))]>;
Cameron Zwarichc0e6d782011-03-30 23:01:21 +00004453
4454def : Pat<(v4i32 (or (and QPR:$Vn, QPR:$Vd),
4455 (and QPR:$Vm, (vnotq QPR:$Vd)))),
4456 (VBSLq QPR:$Vd, QPR:$Vn, QPR:$Vm)>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004457
4458// VBIF : Vector Bitwise Insert if False
Evan Chengf81bf152009-11-23 21:57:23 +00004459// like VBSL but with: "vbif $dst, $src3, $src1", "$src2 = $dst",
Owen Anderson31e6ed82010-10-25 20:17:22 +00004460// FIXME: This instruction's encoding MAY NOT BE correct.
Johnny Chen4814e712010-02-09 23:05:23 +00004461def VBIFd : N3VX<1, 0, 0b11, 0b0001, 0, 1,
Owen Anderson31e6ed82010-10-25 20:17:22 +00004462 (outs DPR:$Vd), (ins DPR:$src1, DPR:$Vn, DPR:$Vm),
Bob Wilson10bc69c2010-03-27 03:56:52 +00004463 N3RegFrm, IIC_VBINiD,
Owen Anderson31e6ed82010-10-25 20:17:22 +00004464 "vbif", "$Vd, $Vn, $Vm", "$src1 = $Vd",
Jim Grosbachfe7b4992011-10-21 16:14:12 +00004465 []>;
Johnny Chen4814e712010-02-09 23:05:23 +00004466def VBIFq : N3VX<1, 0, 0b11, 0b0001, 1, 1,
Owen Anderson31e6ed82010-10-25 20:17:22 +00004467 (outs QPR:$Vd), (ins QPR:$src1, QPR:$Vn, QPR:$Vm),
Bob Wilson10bc69c2010-03-27 03:56:52 +00004468 N3RegFrm, IIC_VBINiQ,
Owen Anderson31e6ed82010-10-25 20:17:22 +00004469 "vbif", "$Vd, $Vn, $Vm", "$src1 = $Vd",
Jim Grosbachfe7b4992011-10-21 16:14:12 +00004470 []>;
Johnny Chen4814e712010-02-09 23:05:23 +00004471
Bob Wilson5bafff32009-06-22 23:27:02 +00004472// VBIT : Vector Bitwise Insert if True
Evan Chengf81bf152009-11-23 21:57:23 +00004473// like VBSL but with: "vbit $dst, $src2, $src1", "$src3 = $dst",
Owen Anderson31e6ed82010-10-25 20:17:22 +00004474// FIXME: This instruction's encoding MAY NOT BE correct.
Johnny Chen4814e712010-02-09 23:05:23 +00004475def VBITd : N3VX<1, 0, 0b10, 0b0001, 0, 1,
Owen Anderson31e6ed82010-10-25 20:17:22 +00004476 (outs DPR:$Vd), (ins DPR:$src1, DPR:$Vn, DPR:$Vm),
Bob Wilson10bc69c2010-03-27 03:56:52 +00004477 N3RegFrm, IIC_VBINiD,
Owen Anderson31e6ed82010-10-25 20:17:22 +00004478 "vbit", "$Vd, $Vn, $Vm", "$src1 = $Vd",
Jim Grosbachfe7b4992011-10-21 16:14:12 +00004479 []>;
Johnny Chen4814e712010-02-09 23:05:23 +00004480def VBITq : N3VX<1, 0, 0b10, 0b0001, 1, 1,
Owen Anderson31e6ed82010-10-25 20:17:22 +00004481 (outs QPR:$Vd), (ins QPR:$src1, QPR:$Vn, QPR:$Vm),
Bob Wilson10bc69c2010-03-27 03:56:52 +00004482 N3RegFrm, IIC_VBINiQ,
Owen Anderson31e6ed82010-10-25 20:17:22 +00004483 "vbit", "$Vd, $Vn, $Vm", "$src1 = $Vd",
Jim Grosbachfe7b4992011-10-21 16:14:12 +00004484 []>;
Johnny Chen4814e712010-02-09 23:05:23 +00004485
4486// VBIT/VBIF are not yet implemented. The TwoAddress pass will not go looking
Bob Wilson5bafff32009-06-22 23:27:02 +00004487// for equivalent operations with different register constraints; it just
4488// inserts copies.
4489
4490// Vector Absolute Differences.
4491
4492// VABD : Vector Absolute Difference
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004493defm VABDs : N3VInt_QHS<0, 0, 0b0111, 0, N3RegFrm,
Anton Korobeynikov4ac0af82010-04-07 18:20:18 +00004494 IIC_VSUBi4D, IIC_VSUBi4D, IIC_VSUBi4Q, IIC_VSUBi4Q,
Bob Wilsoneb0c3d32010-09-03 01:35:08 +00004495 "vabd", "s", int_arm_neon_vabds, 1>;
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004496defm VABDu : N3VInt_QHS<1, 0, 0b0111, 0, N3RegFrm,
Anton Korobeynikov4ac0af82010-04-07 18:20:18 +00004497 IIC_VSUBi4D, IIC_VSUBi4D, IIC_VSUBi4Q, IIC_VSUBi4Q,
Bob Wilsoneb0c3d32010-09-03 01:35:08 +00004498 "vabd", "u", int_arm_neon_vabdu, 1>;
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004499def VABDfd : N3VDInt<1, 0, 0b10, 0b1101, 0, N3RegFrm, IIC_VBIND,
Bob Wilsoneb0c3d32010-09-03 01:35:08 +00004500 "vabd", "f32", v2f32, v2f32, int_arm_neon_vabds, 1>;
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004501def VABDfq : N3VQInt<1, 0, 0b10, 0b1101, 0, N3RegFrm, IIC_VBINQ,
Bob Wilsoneb0c3d32010-09-03 01:35:08 +00004502 "vabd", "f32", v4f32, v4f32, int_arm_neon_vabds, 1>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004503
4504// VABDL : Vector Absolute Difference Long (Q = | D - D |)
Bob Wilsoneb0c3d32010-09-03 01:35:08 +00004505defm VABDLs : N3VLIntExt_QHS<0,1,0b0111,0, IIC_VSUBi4Q,
4506 "vabdl", "s", int_arm_neon_vabds, zext, 1>;
4507defm VABDLu : N3VLIntExt_QHS<1,1,0b0111,0, IIC_VSUBi4Q,
4508 "vabdl", "u", int_arm_neon_vabdu, zext, 1>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004509
4510// VABA : Vector Absolute Difference and Accumulate
Bob Wilsoneb0c3d32010-09-03 01:35:08 +00004511defm VABAs : N3VIntOp_QHS<0,0,0b0111,1, IIC_VABAD, IIC_VABAQ,
4512 "vaba", "s", int_arm_neon_vabds, add>;
4513defm VABAu : N3VIntOp_QHS<1,0,0b0111,1, IIC_VABAD, IIC_VABAQ,
4514 "vaba", "u", int_arm_neon_vabdu, add>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004515
4516// VABAL : Vector Absolute Difference and Accumulate Long (Q += | D - D |)
Bob Wilsoneb0c3d32010-09-03 01:35:08 +00004517defm VABALs : N3VLIntExtOp_QHS<0,1,0b0101,0, IIC_VABAD,
4518 "vabal", "s", int_arm_neon_vabds, zext, add>;
4519defm VABALu : N3VLIntExtOp_QHS<1,1,0b0101,0, IIC_VABAD,
4520 "vabal", "u", int_arm_neon_vabdu, zext, add>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004521
4522// Vector Maximum and Minimum.
4523
4524// VMAX : Vector Maximum
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004525defm VMAXs : N3VInt_QHS<0, 0, 0b0110, 0, N3RegFrm,
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00004526 IIC_VSUBi4D, IIC_VSUBi4D, IIC_VSUBi4Q, IIC_VSUBi4Q,
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004527 "vmax", "s", int_arm_neon_vmaxs, 1>;
4528defm VMAXu : N3VInt_QHS<1, 0, 0b0110, 0, N3RegFrm,
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00004529 IIC_VSUBi4D, IIC_VSUBi4D, IIC_VSUBi4Q, IIC_VSUBi4Q,
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004530 "vmax", "u", int_arm_neon_vmaxu, 1>;
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00004531def VMAXfd : N3VDInt<0, 0, 0b00, 0b1111, 0, N3RegFrm, IIC_VBIND,
4532 "vmax", "f32",
Anton Korobeynikovf8b5c632010-04-07 18:20:13 +00004533 v2f32, v2f32, int_arm_neon_vmaxs, 1>;
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00004534def VMAXfq : N3VQInt<0, 0, 0b00, 0b1111, 0, N3RegFrm, IIC_VBINQ,
4535 "vmax", "f32",
Anton Korobeynikovf8b5c632010-04-07 18:20:13 +00004536 v4f32, v4f32, int_arm_neon_vmaxs, 1>;
4537
4538// VMIN : Vector Minimum
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00004539defm VMINs : N3VInt_QHS<0, 0, 0b0110, 1, N3RegFrm,
4540 IIC_VSUBi4D, IIC_VSUBi4D, IIC_VSUBi4Q, IIC_VSUBi4Q,
4541 "vmin", "s", int_arm_neon_vmins, 1>;
4542defm VMINu : N3VInt_QHS<1, 0, 0b0110, 1, N3RegFrm,
4543 IIC_VSUBi4D, IIC_VSUBi4D, IIC_VSUBi4Q, IIC_VSUBi4Q,
4544 "vmin", "u", int_arm_neon_vminu, 1>;
4545def VMINfd : N3VDInt<0, 0, 0b10, 0b1111, 0, N3RegFrm, IIC_VBIND,
4546 "vmin", "f32",
Anton Korobeynikovf8b5c632010-04-07 18:20:13 +00004547 v2f32, v2f32, int_arm_neon_vmins, 1>;
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00004548def VMINfq : N3VQInt<0, 0, 0b10, 0b1111, 0, N3RegFrm, IIC_VBINQ,
4549 "vmin", "f32",
Anton Korobeynikovf8b5c632010-04-07 18:20:13 +00004550 v4f32, v4f32, int_arm_neon_vmins, 1>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004551
4552// Vector Pairwise Operations.
4553
4554// VPADD : Vector Pairwise Add
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00004555def VPADDi8 : N3VDInt<0, 0, 0b00, 0b1011, 1, N3RegFrm, IIC_VSHLiD,
4556 "vpadd", "i8",
4557 v8i8, v8i8, int_arm_neon_vpadd, 0>;
4558def VPADDi16 : N3VDInt<0, 0, 0b01, 0b1011, 1, N3RegFrm, IIC_VSHLiD,
4559 "vpadd", "i16",
4560 v4i16, v4i16, int_arm_neon_vpadd, 0>;
4561def VPADDi32 : N3VDInt<0, 0, 0b10, 0b1011, 1, N3RegFrm, IIC_VSHLiD,
4562 "vpadd", "i32",
4563 v2i32, v2i32, int_arm_neon_vpadd, 0>;
Jim Grosbach1251e1a2010-11-18 01:39:50 +00004564def VPADDf : N3VDInt<1, 0, 0b00, 0b1101, 0, N3RegFrm,
Evan Cheng08cec1e2010-10-11 23:41:41 +00004565 IIC_VPBIND, "vpadd", "f32",
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00004566 v2f32, v2f32, int_arm_neon_vpadd, 0>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004567
4568// VPADDL : Vector Pairwise Add Long
Evan Chengf81bf152009-11-23 21:57:23 +00004569defm VPADDLs : N2VPLInt_QHS<0b11, 0b11, 0b00, 0b00100, 0, "vpaddl", "s",
Bob Wilson5bafff32009-06-22 23:27:02 +00004570 int_arm_neon_vpaddls>;
Evan Chengf81bf152009-11-23 21:57:23 +00004571defm VPADDLu : N2VPLInt_QHS<0b11, 0b11, 0b00, 0b00101, 0, "vpaddl", "u",
Bob Wilson5bafff32009-06-22 23:27:02 +00004572 int_arm_neon_vpaddlu>;
4573
4574// VPADAL : Vector Pairwise Add and Accumulate Long
Evan Chengf81bf152009-11-23 21:57:23 +00004575defm VPADALs : N2VPLInt2_QHS<0b11, 0b11, 0b00, 0b01100, 0, "vpadal", "s",
Bob Wilson5bafff32009-06-22 23:27:02 +00004576 int_arm_neon_vpadals>;
Evan Chengf81bf152009-11-23 21:57:23 +00004577defm VPADALu : N2VPLInt2_QHS<0b11, 0b11, 0b00, 0b01101, 0, "vpadal", "u",
Bob Wilson5bafff32009-06-22 23:27:02 +00004578 int_arm_neon_vpadalu>;
4579
4580// VPMAX : Vector Pairwise Maximum
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00004581def VPMAXs8 : N3VDInt<0, 0, 0b00, 0b1010, 0, N3RegFrm, IIC_VSUBi4D, "vpmax",
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004582 "s8", v8i8, v8i8, int_arm_neon_vpmaxs, 0>;
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00004583def VPMAXs16 : N3VDInt<0, 0, 0b01, 0b1010, 0, N3RegFrm, IIC_VSUBi4D, "vpmax",
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004584 "s16", v4i16, v4i16, int_arm_neon_vpmaxs, 0>;
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00004585def VPMAXs32 : N3VDInt<0, 0, 0b10, 0b1010, 0, N3RegFrm, IIC_VSUBi4D, "vpmax",
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004586 "s32", v2i32, v2i32, int_arm_neon_vpmaxs, 0>;
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00004587def VPMAXu8 : N3VDInt<1, 0, 0b00, 0b1010, 0, N3RegFrm, IIC_VSUBi4D, "vpmax",
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004588 "u8", v8i8, v8i8, int_arm_neon_vpmaxu, 0>;
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00004589def VPMAXu16 : N3VDInt<1, 0, 0b01, 0b1010, 0, N3RegFrm, IIC_VSUBi4D, "vpmax",
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004590 "u16", v4i16, v4i16, int_arm_neon_vpmaxu, 0>;
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00004591def VPMAXu32 : N3VDInt<1, 0, 0b10, 0b1010, 0, N3RegFrm, IIC_VSUBi4D, "vpmax",
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004592 "u32", v2i32, v2i32, int_arm_neon_vpmaxu, 0>;
Evan Cheng08cec1e2010-10-11 23:41:41 +00004593def VPMAXf : N3VDInt<1, 0, 0b00, 0b1111, 0, N3RegFrm, IIC_VPBIND, "vpmax",
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004594 "f32", v2f32, v2f32, int_arm_neon_vpmaxs, 0>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004595
4596// VPMIN : Vector Pairwise Minimum
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00004597def VPMINs8 : N3VDInt<0, 0, 0b00, 0b1010, 1, N3RegFrm, IIC_VSUBi4D, "vpmin",
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004598 "s8", v8i8, v8i8, int_arm_neon_vpmins, 0>;
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00004599def VPMINs16 : N3VDInt<0, 0, 0b01, 0b1010, 1, N3RegFrm, IIC_VSUBi4D, "vpmin",
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004600 "s16", v4i16, v4i16, int_arm_neon_vpmins, 0>;
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00004601def VPMINs32 : N3VDInt<0, 0, 0b10, 0b1010, 1, N3RegFrm, IIC_VSUBi4D, "vpmin",
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004602 "s32", v2i32, v2i32, int_arm_neon_vpmins, 0>;
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00004603def VPMINu8 : N3VDInt<1, 0, 0b00, 0b1010, 1, N3RegFrm, IIC_VSUBi4D, "vpmin",
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004604 "u8", v8i8, v8i8, int_arm_neon_vpminu, 0>;
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00004605def VPMINu16 : N3VDInt<1, 0, 0b01, 0b1010, 1, N3RegFrm, IIC_VSUBi4D, "vpmin",
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004606 "u16", v4i16, v4i16, int_arm_neon_vpminu, 0>;
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00004607def VPMINu32 : N3VDInt<1, 0, 0b10, 0b1010, 1, N3RegFrm, IIC_VSUBi4D, "vpmin",
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004608 "u32", v2i32, v2i32, int_arm_neon_vpminu, 0>;
Evan Cheng08cec1e2010-10-11 23:41:41 +00004609def VPMINf : N3VDInt<1, 0, 0b10, 0b1111, 0, N3RegFrm, IIC_VPBIND, "vpmin",
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004610 "f32", v2f32, v2f32, int_arm_neon_vpmins, 0>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004611
4612// Vector Reciprocal and Reciprocal Square Root Estimate and Step.
4613
4614// VRECPE : Vector Reciprocal Estimate
Jim Grosbach1251e1a2010-11-18 01:39:50 +00004615def VRECPEd : N2VDInt<0b11, 0b11, 0b10, 0b11, 0b01000, 0,
Evan Chengf81bf152009-11-23 21:57:23 +00004616 IIC_VUNAD, "vrecpe", "u32",
Bob Wilson5bafff32009-06-22 23:27:02 +00004617 v2i32, v2i32, int_arm_neon_vrecpe>;
Jim Grosbach1251e1a2010-11-18 01:39:50 +00004618def VRECPEq : N2VQInt<0b11, 0b11, 0b10, 0b11, 0b01000, 0,
Evan Chengf81bf152009-11-23 21:57:23 +00004619 IIC_VUNAQ, "vrecpe", "u32",
Bob Wilson5bafff32009-06-22 23:27:02 +00004620 v4i32, v4i32, int_arm_neon_vrecpe>;
David Goodwin127221f2009-09-23 21:38:08 +00004621def VRECPEfd : N2VDInt<0b11, 0b11, 0b10, 0b11, 0b01010, 0,
Evan Chengf81bf152009-11-23 21:57:23 +00004622 IIC_VUNAD, "vrecpe", "f32",
Bob Wilsonb0abb4d2009-08-11 05:39:44 +00004623 v2f32, v2f32, int_arm_neon_vrecpe>;
David Goodwin127221f2009-09-23 21:38:08 +00004624def VRECPEfq : N2VQInt<0b11, 0b11, 0b10, 0b11, 0b01010, 0,
Evan Chengf81bf152009-11-23 21:57:23 +00004625 IIC_VUNAQ, "vrecpe", "f32",
Bob Wilsonb0abb4d2009-08-11 05:39:44 +00004626 v4f32, v4f32, int_arm_neon_vrecpe>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004627
4628// VRECPS : Vector Reciprocal Step
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004629def VRECPSfd : N3VDInt<0, 0, 0b00, 0b1111, 1, N3RegFrm,
Evan Chengf81bf152009-11-23 21:57:23 +00004630 IIC_VRECSD, "vrecps", "f32",
4631 v2f32, v2f32, int_arm_neon_vrecps, 1>;
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004632def VRECPSfq : N3VQInt<0, 0, 0b00, 0b1111, 1, N3RegFrm,
Evan Chengf81bf152009-11-23 21:57:23 +00004633 IIC_VRECSQ, "vrecps", "f32",
4634 v4f32, v4f32, int_arm_neon_vrecps, 1>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004635
4636// VRSQRTE : Vector Reciprocal Square Root Estimate
David Goodwin127221f2009-09-23 21:38:08 +00004637def VRSQRTEd : N2VDInt<0b11, 0b11, 0b10, 0b11, 0b01001, 0,
Evan Chengf81bf152009-11-23 21:57:23 +00004638 IIC_VUNAD, "vrsqrte", "u32",
David Goodwin127221f2009-09-23 21:38:08 +00004639 v2i32, v2i32, int_arm_neon_vrsqrte>;
4640def VRSQRTEq : N2VQInt<0b11, 0b11, 0b10, 0b11, 0b01001, 0,
Evan Chengf81bf152009-11-23 21:57:23 +00004641 IIC_VUNAQ, "vrsqrte", "u32",
David Goodwin127221f2009-09-23 21:38:08 +00004642 v4i32, v4i32, int_arm_neon_vrsqrte>;
4643def VRSQRTEfd : N2VDInt<0b11, 0b11, 0b10, 0b11, 0b01011, 0,
Evan Chengf81bf152009-11-23 21:57:23 +00004644 IIC_VUNAD, "vrsqrte", "f32",
David Goodwin127221f2009-09-23 21:38:08 +00004645 v2f32, v2f32, int_arm_neon_vrsqrte>;
Jim Grosbach1251e1a2010-11-18 01:39:50 +00004646def VRSQRTEfq : N2VQInt<0b11, 0b11, 0b10, 0b11, 0b01011, 0,
Evan Chengf81bf152009-11-23 21:57:23 +00004647 IIC_VUNAQ, "vrsqrte", "f32",
David Goodwin127221f2009-09-23 21:38:08 +00004648 v4f32, v4f32, int_arm_neon_vrsqrte>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004649
4650// VRSQRTS : Vector Reciprocal Square Root Step
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004651def VRSQRTSfd : N3VDInt<0, 0, 0b10, 0b1111, 1, N3RegFrm,
Evan Chengf81bf152009-11-23 21:57:23 +00004652 IIC_VRECSD, "vrsqrts", "f32",
4653 v2f32, v2f32, int_arm_neon_vrsqrts, 1>;
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004654def VRSQRTSfq : N3VQInt<0, 0, 0b10, 0b1111, 1, N3RegFrm,
Evan Chengf81bf152009-11-23 21:57:23 +00004655 IIC_VRECSQ, "vrsqrts", "f32",
4656 v4f32, v4f32, int_arm_neon_vrsqrts, 1>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004657
4658// Vector Shifts.
4659
4660// VSHL : Vector Shift
Owen Anderson3557d002010-10-26 20:56:57 +00004661defm VSHLs : N3VInt_QHSDSh<0, 0, 0b0100, 0, N3RegVShFrm,
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004662 IIC_VSHLiD, IIC_VSHLiD, IIC_VSHLiQ, IIC_VSHLiQ,
Owen Andersonac922622010-10-26 21:13:59 +00004663 "vshl", "s", int_arm_neon_vshifts>;
Owen Anderson3557d002010-10-26 20:56:57 +00004664defm VSHLu : N3VInt_QHSDSh<1, 0, 0b0100, 0, N3RegVShFrm,
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004665 IIC_VSHLiD, IIC_VSHLiD, IIC_VSHLiQ, IIC_VSHLiQ,
Owen Andersonac922622010-10-26 21:13:59 +00004666 "vshl", "u", int_arm_neon_vshiftu>;
Bill Wendling7c6b6082011-03-08 23:48:09 +00004667
Bob Wilson5bafff32009-06-22 23:27:02 +00004668// VSHL : Vector Shift Left (Immediate)
Bill Wendling7c6b6082011-03-08 23:48:09 +00004669defm VSHLi : N2VShL_QHSD<0, 1, 0b0101, 1, IIC_VSHLiD, "vshl", "i", NEONvshl>;
4670
Bob Wilson5bafff32009-06-22 23:27:02 +00004671// VSHR : Vector Shift Right (Immediate)
Bill Wendling7c6b6082011-03-08 23:48:09 +00004672defm VSHRs : N2VShR_QHSD<0, 1, 0b0000, 1, IIC_VSHLiD, "vshr", "s",NEONvshrs>;
4673defm VSHRu : N2VShR_QHSD<1, 1, 0b0000, 1, IIC_VSHLiD, "vshr", "u",NEONvshru>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004674
4675// VSHLL : Vector Shift Left Long
Evan Chengf81bf152009-11-23 21:57:23 +00004676defm VSHLLs : N2VLSh_QHS<0, 1, 0b1010, 0, 0, 1, "vshll", "s", NEONvshlls>;
4677defm VSHLLu : N2VLSh_QHS<1, 1, 0b1010, 0, 0, 1, "vshll", "u", NEONvshllu>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004678
4679// VSHLL : Vector Shift Left Long (with maximum shift count)
Bob Wilson507df402009-10-21 02:15:46 +00004680class N2VLShMax<bit op24, bit op23, bits<6> op21_16, bits<4> op11_8, bit op7,
Evan Chengf81bf152009-11-23 21:57:23 +00004681 bit op6, bit op4, string OpcodeStr, string Dt, ValueType ResTy,
Jim Grosbach4e413952011-12-07 00:02:17 +00004682 ValueType OpTy, Operand ImmTy, SDNode OpNode>
Evan Chengf81bf152009-11-23 21:57:23 +00004683 : N2VLSh<op24, op23, op11_8, op7, op6, op4, OpcodeStr, Dt,
Jim Grosbach4e413952011-12-07 00:02:17 +00004684 ResTy, OpTy, ImmTy, OpNode> {
Bob Wilson507df402009-10-21 02:15:46 +00004685 let Inst{21-16} = op21_16;
Owen Anderson8d7d2e12011-08-09 20:55:18 +00004686 let DecoderMethod = "DecodeVSHLMaxInstruction";
Bob Wilson507df402009-10-21 02:15:46 +00004687}
Evan Chengf81bf152009-11-23 21:57:23 +00004688def VSHLLi8 : N2VLShMax<1, 1, 0b110010, 0b0011, 0, 0, 0, "vshll", "i8",
Jim Grosbach3b8991c2011-12-07 01:07:24 +00004689 v8i16, v8i8, imm8, NEONvshlli>;
Evan Chengf81bf152009-11-23 21:57:23 +00004690def VSHLLi16 : N2VLShMax<1, 1, 0b110110, 0b0011, 0, 0, 0, "vshll", "i16",
Jim Grosbach3b8991c2011-12-07 01:07:24 +00004691 v4i32, v4i16, imm16, NEONvshlli>;
Evan Chengf81bf152009-11-23 21:57:23 +00004692def VSHLLi32 : N2VLShMax<1, 1, 0b111010, 0b0011, 0, 0, 0, "vshll", "i32",
Jim Grosbach3b8991c2011-12-07 01:07:24 +00004693 v2i64, v2i32, imm32, NEONvshlli>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004694
4695// VSHRN : Vector Shift Right and Narrow
Evan Chengef0ccad2010-10-01 21:48:06 +00004696defm VSHRN : N2VNSh_HSD<0,1,0b1000,0,0,1, IIC_VSHLiD, "vshrn", "i",
Bob Wilson9abe19d2010-02-17 00:31:29 +00004697 NEONvshrn>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004698
4699// VRSHL : Vector Rounding Shift
Owen Anderson632c2352010-10-26 21:58:41 +00004700defm VRSHLs : N3VInt_QHSDSh<0, 0, 0b0101, 0, N3RegVShFrm,
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004701 IIC_VSHLi4D, IIC_VSHLi4D, IIC_VSHLi4Q, IIC_VSHLi4Q,
Owen Anderson632c2352010-10-26 21:58:41 +00004702 "vrshl", "s", int_arm_neon_vrshifts>;
4703defm VRSHLu : N3VInt_QHSDSh<1, 0, 0b0101, 0, N3RegVShFrm,
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004704 IIC_VSHLi4D, IIC_VSHLi4D, IIC_VSHLi4Q, IIC_VSHLi4Q,
Owen Anderson632c2352010-10-26 21:58:41 +00004705 "vrshl", "u", int_arm_neon_vrshiftu>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004706// VRSHR : Vector Rounding Shift Right
Bill Wendling7c6b6082011-03-08 23:48:09 +00004707defm VRSHRs : N2VShR_QHSD<0,1,0b0010,1, IIC_VSHLi4D, "vrshr", "s",NEONvrshrs>;
4708defm VRSHRu : N2VShR_QHSD<1,1,0b0010,1, IIC_VSHLi4D, "vrshr", "u",NEONvrshru>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004709
4710// VRSHRN : Vector Rounding Shift Right and Narrow
Evan Chengf81bf152009-11-23 21:57:23 +00004711defm VRSHRN : N2VNSh_HSD<0, 1, 0b1000, 0, 1, 1, IIC_VSHLi4D, "vrshrn", "i",
Bob Wilson507df402009-10-21 02:15:46 +00004712 NEONvrshrn>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004713
4714// VQSHL : Vector Saturating Shift
Owen Anderson86ed2322010-10-26 22:50:46 +00004715defm VQSHLs : N3VInt_QHSDSh<0, 0, 0b0100, 1, N3RegVShFrm,
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004716 IIC_VSHLi4D, IIC_VSHLi4D, IIC_VSHLi4Q, IIC_VSHLi4Q,
Owen Anderson86ed2322010-10-26 22:50:46 +00004717 "vqshl", "s", int_arm_neon_vqshifts>;
4718defm VQSHLu : N3VInt_QHSDSh<1, 0, 0b0100, 1, N3RegVShFrm,
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004719 IIC_VSHLi4D, IIC_VSHLi4D, IIC_VSHLi4Q, IIC_VSHLi4Q,
Owen Anderson86ed2322010-10-26 22:50:46 +00004720 "vqshl", "u", int_arm_neon_vqshiftu>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004721// VQSHL : Vector Saturating Shift Left (Immediate)
Bill Wendling7c6b6082011-03-08 23:48:09 +00004722defm VQSHLsi : N2VShL_QHSD<0,1,0b0111,1, IIC_VSHLi4D, "vqshl", "s",NEONvqshls>;
4723defm VQSHLui : N2VShL_QHSD<1,1,0b0111,1, IIC_VSHLi4D, "vqshl", "u",NEONvqshlu>;
4724
Bob Wilson5bafff32009-06-22 23:27:02 +00004725// VQSHLU : Vector Saturating Shift Left (Immediate, Unsigned)
Bill Wendling7c6b6082011-03-08 23:48:09 +00004726defm VQSHLsu : N2VShL_QHSD<1,1,0b0110,1, IIC_VSHLi4D,"vqshlu","s",NEONvqshlsu>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004727
4728// VQSHRN : Vector Saturating Shift Right and Narrow
Evan Chengf81bf152009-11-23 21:57:23 +00004729defm VQSHRNs : N2VNSh_HSD<0, 1, 0b1001, 0, 0, 1, IIC_VSHLi4D, "vqshrn", "s",
Bob Wilson507df402009-10-21 02:15:46 +00004730 NEONvqshrns>;
Evan Chengf81bf152009-11-23 21:57:23 +00004731defm VQSHRNu : N2VNSh_HSD<1, 1, 0b1001, 0, 0, 1, IIC_VSHLi4D, "vqshrn", "u",
Bob Wilson507df402009-10-21 02:15:46 +00004732 NEONvqshrnu>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004733
4734// VQSHRUN : Vector Saturating Shift Right and Narrow (Unsigned)
Evan Chengf81bf152009-11-23 21:57:23 +00004735defm VQSHRUN : N2VNSh_HSD<1, 1, 0b1000, 0, 0, 1, IIC_VSHLi4D, "vqshrun", "s",
Bob Wilson507df402009-10-21 02:15:46 +00004736 NEONvqshrnsu>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004737
4738// VQRSHL : Vector Saturating Rounding Shift
Owen Anderson86ed2322010-10-26 22:50:46 +00004739defm VQRSHLs : N3VInt_QHSDSh<0, 0, 0b0101, 1, N3RegVShFrm,
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004740 IIC_VSHLi4D, IIC_VSHLi4D, IIC_VSHLi4Q, IIC_VSHLi4Q,
Owen Anderson86ed2322010-10-26 22:50:46 +00004741 "vqrshl", "s", int_arm_neon_vqrshifts>;
4742defm VQRSHLu : N3VInt_QHSDSh<1, 0, 0b0101, 1, N3RegVShFrm,
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004743 IIC_VSHLi4D, IIC_VSHLi4D, IIC_VSHLi4Q, IIC_VSHLi4Q,
Owen Anderson86ed2322010-10-26 22:50:46 +00004744 "vqrshl", "u", int_arm_neon_vqrshiftu>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004745
4746// VQRSHRN : Vector Saturating Rounding Shift Right and Narrow
Evan Chengf81bf152009-11-23 21:57:23 +00004747defm VQRSHRNs : N2VNSh_HSD<0, 1, 0b1001, 0, 1, 1, IIC_VSHLi4D, "vqrshrn", "s",
Bob Wilson507df402009-10-21 02:15:46 +00004748 NEONvqrshrns>;
Evan Chengf81bf152009-11-23 21:57:23 +00004749defm VQRSHRNu : N2VNSh_HSD<1, 1, 0b1001, 0, 1, 1, IIC_VSHLi4D, "vqrshrn", "u",
Bob Wilson507df402009-10-21 02:15:46 +00004750 NEONvqrshrnu>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004751
4752// VQRSHRUN : Vector Saturating Rounding Shift Right and Narrow (Unsigned)
Evan Chengf81bf152009-11-23 21:57:23 +00004753defm VQRSHRUN : N2VNSh_HSD<1, 1, 0b1000, 0, 1, 1, IIC_VSHLi4D, "vqrshrun", "s",
Bob Wilson507df402009-10-21 02:15:46 +00004754 NEONvqrshrnsu>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004755
4756// VSRA : Vector Shift Right and Accumulate
Evan Chengf81bf152009-11-23 21:57:23 +00004757defm VSRAs : N2VShAdd_QHSD<0, 1, 0b0001, 1, "vsra", "s", NEONvshrs>;
4758defm VSRAu : N2VShAdd_QHSD<1, 1, 0b0001, 1, "vsra", "u", NEONvshru>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004759// VRSRA : Vector Rounding Shift Right and Accumulate
Evan Chengf81bf152009-11-23 21:57:23 +00004760defm VRSRAs : N2VShAdd_QHSD<0, 1, 0b0011, 1, "vrsra", "s", NEONvrshrs>;
4761defm VRSRAu : N2VShAdd_QHSD<1, 1, 0b0011, 1, "vrsra", "u", NEONvrshru>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004762
4763// VSLI : Vector Shift Left and Insert
Bill Wendling620d0cc2011-03-09 00:33:17 +00004764defm VSLI : N2VShInsL_QHSD<1, 1, 0b0101, 1, "vsli">;
4765
Bob Wilson5bafff32009-06-22 23:27:02 +00004766// VSRI : Vector Shift Right and Insert
Bill Wendling620d0cc2011-03-09 00:33:17 +00004767defm VSRI : N2VShInsR_QHSD<1, 1, 0b0100, 1, "vsri">;
Bob Wilson5bafff32009-06-22 23:27:02 +00004768
4769// Vector Absolute and Saturating Absolute.
4770
4771// VABS : Vector Absolute Value
Jim Grosbach1251e1a2010-11-18 01:39:50 +00004772defm VABS : N2VInt_QHS<0b11, 0b11, 0b01, 0b00110, 0,
Evan Chengf81bf152009-11-23 21:57:23 +00004773 IIC_VUNAiD, IIC_VUNAiQ, "vabs", "s",
Bob Wilson5bafff32009-06-22 23:27:02 +00004774 int_arm_neon_vabs>;
David Goodwin127221f2009-09-23 21:38:08 +00004775def VABSfd : N2VDInt<0b11, 0b11, 0b10, 0b01, 0b01110, 0,
Evan Chengf81bf152009-11-23 21:57:23 +00004776 IIC_VUNAD, "vabs", "f32",
Bob Wilsonb0abb4d2009-08-11 05:39:44 +00004777 v2f32, v2f32, int_arm_neon_vabs>;
David Goodwin127221f2009-09-23 21:38:08 +00004778def VABSfq : N2VQInt<0b11, 0b11, 0b10, 0b01, 0b01110, 0,
Evan Chengf81bf152009-11-23 21:57:23 +00004779 IIC_VUNAQ, "vabs", "f32",
Bob Wilsonb0abb4d2009-08-11 05:39:44 +00004780 v4f32, v4f32, int_arm_neon_vabs>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004781
4782// VQABS : Vector Saturating Absolute Value
Jim Grosbach1251e1a2010-11-18 01:39:50 +00004783defm VQABS : N2VInt_QHS<0b11, 0b11, 0b00, 0b01110, 0,
Evan Chengf81bf152009-11-23 21:57:23 +00004784 IIC_VQUNAiD, IIC_VQUNAiQ, "vqabs", "s",
Bob Wilson5bafff32009-06-22 23:27:02 +00004785 int_arm_neon_vqabs>;
4786
4787// Vector Negate.
4788
Bob Wilsoncba270d2010-07-13 21:16:48 +00004789def vnegd : PatFrag<(ops node:$in),
4790 (sub (bitconvert (v2i32 NEONimmAllZerosV)), node:$in)>;
4791def vnegq : PatFrag<(ops node:$in),
4792 (sub (bitconvert (v4i32 NEONimmAllZerosV)), node:$in)>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004793
Evan Chengf81bf152009-11-23 21:57:23 +00004794class VNEGD<bits<2> size, string OpcodeStr, string Dt, ValueType Ty>
Owen Andersonca6945e2010-12-01 00:28:25 +00004795 : N2V<0b11, 0b11, size, 0b01, 0b00111, 0, 0, (outs DPR:$Vd), (ins DPR:$Vm),
4796 IIC_VSHLiD, OpcodeStr, Dt, "$Vd, $Vm", "",
4797 [(set DPR:$Vd, (Ty (vnegd DPR:$Vm)))]>;
Evan Chengf81bf152009-11-23 21:57:23 +00004798class VNEGQ<bits<2> size, string OpcodeStr, string Dt, ValueType Ty>
Owen Andersonca6945e2010-12-01 00:28:25 +00004799 : N2V<0b11, 0b11, size, 0b01, 0b00111, 1, 0, (outs QPR:$Vd), (ins QPR:$Vm),
4800 IIC_VSHLiQ, OpcodeStr, Dt, "$Vd, $Vm", "",
4801 [(set QPR:$Vd, (Ty (vnegq QPR:$Vm)))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004802
Chris Lattner0a00ed92010-03-28 08:39:10 +00004803// VNEG : Vector Negate (integer)
Evan Chengf81bf152009-11-23 21:57:23 +00004804def VNEGs8d : VNEGD<0b00, "vneg", "s8", v8i8>;
4805def VNEGs16d : VNEGD<0b01, "vneg", "s16", v4i16>;
4806def VNEGs32d : VNEGD<0b10, "vneg", "s32", v2i32>;
4807def VNEGs8q : VNEGQ<0b00, "vneg", "s8", v16i8>;
4808def VNEGs16q : VNEGQ<0b01, "vneg", "s16", v8i16>;
4809def VNEGs32q : VNEGQ<0b10, "vneg", "s32", v4i32>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004810
4811// VNEG : Vector Negate (floating-point)
Bob Wilson3c0f96e2010-02-17 22:23:11 +00004812def VNEGfd : N2V<0b11, 0b11, 0b10, 0b01, 0b01111, 0, 0,
Owen Andersonca6945e2010-12-01 00:28:25 +00004813 (outs DPR:$Vd), (ins DPR:$Vm), IIC_VUNAD,
4814 "vneg", "f32", "$Vd, $Vm", "",
4815 [(set DPR:$Vd, (v2f32 (fneg DPR:$Vm)))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004816def VNEGf32q : N2V<0b11, 0b11, 0b10, 0b01, 0b01111, 1, 0,
Owen Andersonca6945e2010-12-01 00:28:25 +00004817 (outs QPR:$Vd), (ins QPR:$Vm), IIC_VUNAQ,
4818 "vneg", "f32", "$Vd, $Vm", "",
4819 [(set QPR:$Vd, (v4f32 (fneg QPR:$Vm)))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004820
Bob Wilsoncba270d2010-07-13 21:16:48 +00004821def : Pat<(v8i8 (vnegd DPR:$src)), (VNEGs8d DPR:$src)>;
4822def : Pat<(v4i16 (vnegd DPR:$src)), (VNEGs16d DPR:$src)>;
4823def : Pat<(v2i32 (vnegd DPR:$src)), (VNEGs32d DPR:$src)>;
4824def : Pat<(v16i8 (vnegq QPR:$src)), (VNEGs8q QPR:$src)>;
4825def : Pat<(v8i16 (vnegq QPR:$src)), (VNEGs16q QPR:$src)>;
4826def : Pat<(v4i32 (vnegq QPR:$src)), (VNEGs32q QPR:$src)>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004827
4828// VQNEG : Vector Saturating Negate
Jim Grosbach1251e1a2010-11-18 01:39:50 +00004829defm VQNEG : N2VInt_QHS<0b11, 0b11, 0b00, 0b01111, 0,
Evan Chengf81bf152009-11-23 21:57:23 +00004830 IIC_VQUNAiD, IIC_VQUNAiQ, "vqneg", "s",
Bob Wilson5bafff32009-06-22 23:27:02 +00004831 int_arm_neon_vqneg>;
4832
4833// Vector Bit Counting Operations.
4834
4835// VCLS : Vector Count Leading Sign Bits
Jim Grosbach1251e1a2010-11-18 01:39:50 +00004836defm VCLS : N2VInt_QHS<0b11, 0b11, 0b00, 0b01000, 0,
Evan Chengf81bf152009-11-23 21:57:23 +00004837 IIC_VCNTiD, IIC_VCNTiQ, "vcls", "s",
Bob Wilson5bafff32009-06-22 23:27:02 +00004838 int_arm_neon_vcls>;
4839// VCLZ : Vector Count Leading Zeros
Jim Grosbach1251e1a2010-11-18 01:39:50 +00004840defm VCLZ : N2VInt_QHS<0b11, 0b11, 0b00, 0b01001, 0,
Evan Chengf81bf152009-11-23 21:57:23 +00004841 IIC_VCNTiD, IIC_VCNTiQ, "vclz", "i",
Bob Wilson5bafff32009-06-22 23:27:02 +00004842 int_arm_neon_vclz>;
4843// VCNT : Vector Count One Bits
Jim Grosbach1251e1a2010-11-18 01:39:50 +00004844def VCNTd : N2VDInt<0b11, 0b11, 0b00, 0b00, 0b01010, 0,
Evan Chengf81bf152009-11-23 21:57:23 +00004845 IIC_VCNTiD, "vcnt", "8",
Bob Wilson5bafff32009-06-22 23:27:02 +00004846 v8i8, v8i8, int_arm_neon_vcnt>;
David Goodwin127221f2009-09-23 21:38:08 +00004847def VCNTq : N2VQInt<0b11, 0b11, 0b00, 0b00, 0b01010, 0,
Evan Chengf81bf152009-11-23 21:57:23 +00004848 IIC_VCNTiQ, "vcnt", "8",
Bob Wilson5bafff32009-06-22 23:27:02 +00004849 v16i8, v16i8, int_arm_neon_vcnt>;
4850
Jim Grosbachfe7b4992011-10-21 16:14:12 +00004851// Vector Swap
Johnny Chend8836042010-02-24 20:06:07 +00004852def VSWPd : N2VX<0b11, 0b11, 0b00, 0b10, 0b00000, 0, 0,
Owen Andersonca6945e2010-12-01 00:28:25 +00004853 (outs DPR:$Vd), (ins DPR:$Vm), NoItinerary,
4854 "vswp", "$Vd, $Vm", "", []>;
Johnny Chend8836042010-02-24 20:06:07 +00004855def VSWPq : N2VX<0b11, 0b11, 0b00, 0b10, 0b00000, 1, 0,
Owen Andersonca6945e2010-12-01 00:28:25 +00004856 (outs QPR:$Vd), (ins QPR:$Vm), NoItinerary,
4857 "vswp", "$Vd, $Vm", "", []>;
Johnny Chend8836042010-02-24 20:06:07 +00004858
Bob Wilson5bafff32009-06-22 23:27:02 +00004859// Vector Move Operations.
4860
4861// VMOV : Vector Move (Register)
Owen Anderson43967a92011-07-15 18:46:47 +00004862def : InstAlias<"vmov${p} $Vd, $Vm",
4863 (VORRd DPR:$Vd, DPR:$Vm, DPR:$Vm, pred:$p)>;
4864def : InstAlias<"vmov${p} $Vd, $Vm",
4865 (VORRq QPR:$Vd, QPR:$Vm, QPR:$Vm, pred:$p)>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004866
Bob Wilson5bafff32009-06-22 23:27:02 +00004867// VMOV : Vector Move (Immediate)
4868
Evan Cheng47006be2010-05-17 21:54:50 +00004869let isReMaterializable = 1 in {
Owen Andersonca6945e2010-12-01 00:28:25 +00004870def VMOVv8i8 : N1ModImm<1, 0b000, 0b1110, 0, 0, 0, 1, (outs DPR:$Vd),
Jim Grosbach0e387b22011-10-17 22:26:03 +00004871 (ins nImmSplatI8:$SIMM), IIC_VMOVImm,
Owen Andersonca6945e2010-12-01 00:28:25 +00004872 "vmov", "i8", "$Vd, $SIMM", "",
4873 [(set DPR:$Vd, (v8i8 (NEONvmovImm timm:$SIMM)))]>;
4874def VMOVv16i8 : N1ModImm<1, 0b000, 0b1110, 0, 1, 0, 1, (outs QPR:$Vd),
Jim Grosbach0e387b22011-10-17 22:26:03 +00004875 (ins nImmSplatI8:$SIMM), IIC_VMOVImm,
Owen Andersonca6945e2010-12-01 00:28:25 +00004876 "vmov", "i8", "$Vd, $SIMM", "",
4877 [(set QPR:$Vd, (v16i8 (NEONvmovImm timm:$SIMM)))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004878
Owen Andersonca6945e2010-12-01 00:28:25 +00004879def VMOVv4i16 : N1ModImm<1, 0b000, {1,0,?,0}, 0, 0, 0, 1, (outs DPR:$Vd),
Jim Grosbachea461102011-10-17 23:09:09 +00004880 (ins nImmSplatI16:$SIMM), IIC_VMOVImm,
Owen Andersonca6945e2010-12-01 00:28:25 +00004881 "vmov", "i16", "$Vd, $SIMM", "",
4882 [(set DPR:$Vd, (v4i16 (NEONvmovImm timm:$SIMM)))]> {
Jim Grosbach1251e1a2010-11-18 01:39:50 +00004883 let Inst{9} = SIMM{9};
Owen Andersona88ea032010-10-26 17:40:54 +00004884}
4885
Owen Andersonca6945e2010-12-01 00:28:25 +00004886def VMOVv8i16 : N1ModImm<1, 0b000, {1,0,?,0}, 0, 1, 0, 1, (outs QPR:$Vd),
Jim Grosbachea461102011-10-17 23:09:09 +00004887 (ins nImmSplatI16:$SIMM), IIC_VMOVImm,
Owen Andersonca6945e2010-12-01 00:28:25 +00004888 "vmov", "i16", "$Vd, $SIMM", "",
4889 [(set QPR:$Vd, (v8i16 (NEONvmovImm timm:$SIMM)))]> {
Owen Andersona88ea032010-10-26 17:40:54 +00004890 let Inst{9} = SIMM{9};
4891}
Bob Wilson5bafff32009-06-22 23:27:02 +00004892
Owen Andersonca6945e2010-12-01 00:28:25 +00004893def VMOVv2i32 : N1ModImm<1, 0b000, {?,?,?,?}, 0, 0, 0, 1, (outs DPR:$Vd),
Jim Grosbach6248a542011-10-18 00:22:00 +00004894 (ins nImmVMOVI32:$SIMM), IIC_VMOVImm,
Owen Andersonca6945e2010-12-01 00:28:25 +00004895 "vmov", "i32", "$Vd, $SIMM", "",
4896 [(set DPR:$Vd, (v2i32 (NEONvmovImm timm:$SIMM)))]> {
Owen Andersona88ea032010-10-26 17:40:54 +00004897 let Inst{11-8} = SIMM{11-8};
4898}
4899
Owen Andersonca6945e2010-12-01 00:28:25 +00004900def VMOVv4i32 : N1ModImm<1, 0b000, {?,?,?,?}, 0, 1, 0, 1, (outs QPR:$Vd),
Jim Grosbach6248a542011-10-18 00:22:00 +00004901 (ins nImmVMOVI32:$SIMM), IIC_VMOVImm,
Owen Andersonca6945e2010-12-01 00:28:25 +00004902 "vmov", "i32", "$Vd, $SIMM", "",
4903 [(set QPR:$Vd, (v4i32 (NEONvmovImm timm:$SIMM)))]> {
Owen Andersona88ea032010-10-26 17:40:54 +00004904 let Inst{11-8} = SIMM{11-8};
4905}
Bob Wilson5bafff32009-06-22 23:27:02 +00004906
Owen Andersonca6945e2010-12-01 00:28:25 +00004907def VMOVv1i64 : N1ModImm<1, 0b000, 0b1110, 0, 0, 1, 1, (outs DPR:$Vd),
Jim Grosbachf2f5bc62011-10-18 16:18:11 +00004908 (ins nImmSplatI64:$SIMM), IIC_VMOVImm,
Owen Andersonca6945e2010-12-01 00:28:25 +00004909 "vmov", "i64", "$Vd, $SIMM", "",
4910 [(set DPR:$Vd, (v1i64 (NEONvmovImm timm:$SIMM)))]>;
4911def VMOVv2i64 : N1ModImm<1, 0b000, 0b1110, 0, 1, 1, 1, (outs QPR:$Vd),
Jim Grosbachf2f5bc62011-10-18 16:18:11 +00004912 (ins nImmSplatI64:$SIMM), IIC_VMOVImm,
Owen Andersonca6945e2010-12-01 00:28:25 +00004913 "vmov", "i64", "$Vd, $SIMM", "",
4914 [(set QPR:$Vd, (v2i64 (NEONvmovImm timm:$SIMM)))]>;
Evan Chengeaa192a2011-11-15 02:12:34 +00004915
4916def VMOVv2f32 : N1ModImm<1, 0b000, 0b1111, 0, 0, 0, 1, (outs DPR:$Vd),
4917 (ins nImmVMOVF32:$SIMM), IIC_VMOVImm,
4918 "vmov", "f32", "$Vd, $SIMM", "",
4919 [(set DPR:$Vd, (v2f32 (NEONvmovFPImm timm:$SIMM)))]>;
4920def VMOVv4f32 : N1ModImm<1, 0b000, 0b1111, 0, 1, 0, 1, (outs QPR:$Vd),
4921 (ins nImmVMOVF32:$SIMM), IIC_VMOVImm,
4922 "vmov", "f32", "$Vd, $SIMM", "",
4923 [(set QPR:$Vd, (v4f32 (NEONvmovFPImm timm:$SIMM)))]>;
Evan Cheng47006be2010-05-17 21:54:50 +00004924} // isReMaterializable
Bob Wilson5bafff32009-06-22 23:27:02 +00004925
4926// VMOV : Vector Get Lane (move scalar to ARM core register)
4927
Johnny Chen131c4a52009-11-23 17:48:17 +00004928def VGETLNs8 : NVGetLane<{1,1,1,0,0,1,?,1}, 0b1011, {?,?},
Jim Grosbach687656c2011-10-18 20:10:47 +00004929 (outs GPR:$R), (ins DPR:$V, VectorIndex8:$lane),
4930 IIC_VMOVSI, "vmov", "s8", "$R, $V$lane",
Owen Andersond2fbdb72010-10-27 21:28:09 +00004931 [(set GPR:$R, (NEONvgetlanes (v8i8 DPR:$V),
4932 imm:$lane))]> {
4933 let Inst{21} = lane{2};
4934 let Inst{6-5} = lane{1-0};
4935}
Johnny Chen131c4a52009-11-23 17:48:17 +00004936def VGETLNs16 : NVGetLane<{1,1,1,0,0,0,?,1}, 0b1011, {?,1},
Jim Grosbach687656c2011-10-18 20:10:47 +00004937 (outs GPR:$R), (ins DPR:$V, VectorIndex16:$lane),
4938 IIC_VMOVSI, "vmov", "s16", "$R, $V$lane",
Owen Andersond2fbdb72010-10-27 21:28:09 +00004939 [(set GPR:$R, (NEONvgetlanes (v4i16 DPR:$V),
4940 imm:$lane))]> {
4941 let Inst{21} = lane{1};
4942 let Inst{6} = lane{0};
4943}
Johnny Chen131c4a52009-11-23 17:48:17 +00004944def VGETLNu8 : NVGetLane<{1,1,1,0,1,1,?,1}, 0b1011, {?,?},
Jim Grosbach687656c2011-10-18 20:10:47 +00004945 (outs GPR:$R), (ins DPR:$V, VectorIndex8:$lane),
4946 IIC_VMOVSI, "vmov", "u8", "$R, $V$lane",
Owen Andersond2fbdb72010-10-27 21:28:09 +00004947 [(set GPR:$R, (NEONvgetlaneu (v8i8 DPR:$V),
4948 imm:$lane))]> {
4949 let Inst{21} = lane{2};
4950 let Inst{6-5} = lane{1-0};
4951}
Johnny Chen131c4a52009-11-23 17:48:17 +00004952def VGETLNu16 : NVGetLane<{1,1,1,0,1,0,?,1}, 0b1011, {?,1},
Jim Grosbach687656c2011-10-18 20:10:47 +00004953 (outs GPR:$R), (ins DPR:$V, VectorIndex16:$lane),
4954 IIC_VMOVSI, "vmov", "u16", "$R, $V$lane",
Owen Andersond2fbdb72010-10-27 21:28:09 +00004955 [(set GPR:$R, (NEONvgetlaneu (v4i16 DPR:$V),
4956 imm:$lane))]> {
4957 let Inst{21} = lane{1};
4958 let Inst{6} = lane{0};
4959}
Johnny Chen131c4a52009-11-23 17:48:17 +00004960def VGETLNi32 : NVGetLane<{1,1,1,0,0,0,?,1}, 0b1011, 0b00,
Jim Grosbach687656c2011-10-18 20:10:47 +00004961 (outs GPR:$R), (ins DPR:$V, VectorIndex32:$lane),
4962 IIC_VMOVSI, "vmov", "32", "$R, $V$lane",
Owen Andersond2fbdb72010-10-27 21:28:09 +00004963 [(set GPR:$R, (extractelt (v2i32 DPR:$V),
4964 imm:$lane))]> {
4965 let Inst{21} = lane{0};
4966}
Bob Wilson5bafff32009-06-22 23:27:02 +00004967// def VGETLNf32: see FMRDH and FMRDL in ARMInstrVFP.td
4968def : Pat<(NEONvgetlanes (v16i8 QPR:$src), imm:$lane),
4969 (VGETLNs8 (v8i8 (EXTRACT_SUBREG QPR:$src,
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00004970 (DSubReg_i8_reg imm:$lane))),
Bob Wilson5bafff32009-06-22 23:27:02 +00004971 (SubReg_i8_lane imm:$lane))>;
4972def : Pat<(NEONvgetlanes (v8i16 QPR:$src), imm:$lane),
4973 (VGETLNs16 (v4i16 (EXTRACT_SUBREG QPR:$src,
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00004974 (DSubReg_i16_reg imm:$lane))),
Bob Wilson5bafff32009-06-22 23:27:02 +00004975 (SubReg_i16_lane imm:$lane))>;
4976def : Pat<(NEONvgetlaneu (v16i8 QPR:$src), imm:$lane),
4977 (VGETLNu8 (v8i8 (EXTRACT_SUBREG QPR:$src,
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00004978 (DSubReg_i8_reg imm:$lane))),
Bob Wilson5bafff32009-06-22 23:27:02 +00004979 (SubReg_i8_lane imm:$lane))>;
4980def : Pat<(NEONvgetlaneu (v8i16 QPR:$src), imm:$lane),
4981 (VGETLNu16 (v4i16 (EXTRACT_SUBREG QPR:$src,
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00004982 (DSubReg_i16_reg imm:$lane))),
Bob Wilson5bafff32009-06-22 23:27:02 +00004983 (SubReg_i16_lane imm:$lane))>;
4984def : Pat<(extractelt (v4i32 QPR:$src), imm:$lane),
4985 (VGETLNi32 (v2i32 (EXTRACT_SUBREG QPR:$src,
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00004986 (DSubReg_i32_reg imm:$lane))),
Bob Wilson5bafff32009-06-22 23:27:02 +00004987 (SubReg_i32_lane imm:$lane))>;
Anton Korobeynikov2324bdc2009-08-28 23:41:26 +00004988def : Pat<(extractelt (v2f32 DPR:$src1), imm:$src2),
Bob Wilson9abe19d2010-02-17 00:31:29 +00004989 (EXTRACT_SUBREG (v2f32 (COPY_TO_REGCLASS (v2f32 DPR:$src1),DPR_VFP2)),
Anton Korobeynikove56f9082009-09-12 22:21:08 +00004990 (SSubReg_f32_reg imm:$src2))>;
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00004991def : Pat<(extractelt (v4f32 QPR:$src1), imm:$src2),
Bob Wilson9abe19d2010-02-17 00:31:29 +00004992 (EXTRACT_SUBREG (v4f32 (COPY_TO_REGCLASS (v4f32 QPR:$src1),QPR_VFP2)),
Anton Korobeynikove56f9082009-09-12 22:21:08 +00004993 (SSubReg_f32_reg imm:$src2))>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004994//def : Pat<(extractelt (v2i64 QPR:$src1), imm:$src2),
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00004995// (EXTRACT_SUBREG QPR:$src1, (DSubReg_f64_reg imm:$src2))>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004996def : Pat<(extractelt (v2f64 QPR:$src1), imm:$src2),
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00004997 (EXTRACT_SUBREG QPR:$src1, (DSubReg_f64_reg imm:$src2))>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004998
4999
5000// VMOV : Vector Set Lane (move ARM core register to scalar)
5001
Owen Andersond2fbdb72010-10-27 21:28:09 +00005002let Constraints = "$src1 = $V" in {
5003def VSETLNi8 : NVSetLane<{1,1,1,0,0,1,?,0}, 0b1011, {?,?}, (outs DPR:$V),
Jim Grosbach687656c2011-10-18 20:10:47 +00005004 (ins DPR:$src1, GPR:$R, VectorIndex8:$lane),
5005 IIC_VMOVISL, "vmov", "8", "$V$lane, $R",
Owen Andersond2fbdb72010-10-27 21:28:09 +00005006 [(set DPR:$V, (vector_insert (v8i8 DPR:$src1),
5007 GPR:$R, imm:$lane))]> {
5008 let Inst{21} = lane{2};
5009 let Inst{6-5} = lane{1-0};
5010}
5011def VSETLNi16 : NVSetLane<{1,1,1,0,0,0,?,0}, 0b1011, {?,1}, (outs DPR:$V),
Jim Grosbach687656c2011-10-18 20:10:47 +00005012 (ins DPR:$src1, GPR:$R, VectorIndex16:$lane),
5013 IIC_VMOVISL, "vmov", "16", "$V$lane, $R",
Owen Andersond2fbdb72010-10-27 21:28:09 +00005014 [(set DPR:$V, (vector_insert (v4i16 DPR:$src1),
5015 GPR:$R, imm:$lane))]> {
5016 let Inst{21} = lane{1};
5017 let Inst{6} = lane{0};
5018}
5019def VSETLNi32 : NVSetLane<{1,1,1,0,0,0,?,0}, 0b1011, 0b00, (outs DPR:$V),
Jim Grosbach687656c2011-10-18 20:10:47 +00005020 (ins DPR:$src1, GPR:$R, VectorIndex32:$lane),
5021 IIC_VMOVISL, "vmov", "32", "$V$lane, $R",
Owen Andersond2fbdb72010-10-27 21:28:09 +00005022 [(set DPR:$V, (insertelt (v2i32 DPR:$src1),
5023 GPR:$R, imm:$lane))]> {
5024 let Inst{21} = lane{0};
5025}
Bob Wilson5bafff32009-06-22 23:27:02 +00005026}
5027def : Pat<(vector_insert (v16i8 QPR:$src1), GPR:$src2, imm:$lane),
Jim Grosbach1251e1a2010-11-18 01:39:50 +00005028 (v16i8 (INSERT_SUBREG QPR:$src1,
Chris Lattnerd10a53d2010-03-08 18:51:21 +00005029 (v8i8 (VSETLNi8 (v8i8 (EXTRACT_SUBREG QPR:$src1,
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00005030 (DSubReg_i8_reg imm:$lane))),
Chris Lattnerd10a53d2010-03-08 18:51:21 +00005031 GPR:$src2, (SubReg_i8_lane imm:$lane))),
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00005032 (DSubReg_i8_reg imm:$lane)))>;
Bob Wilson5bafff32009-06-22 23:27:02 +00005033def : Pat<(vector_insert (v8i16 QPR:$src1), GPR:$src2, imm:$lane),
Jim Grosbach1251e1a2010-11-18 01:39:50 +00005034 (v8i16 (INSERT_SUBREG QPR:$src1,
Chris Lattnerd10a53d2010-03-08 18:51:21 +00005035 (v4i16 (VSETLNi16 (v4i16 (EXTRACT_SUBREG QPR:$src1,
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00005036 (DSubReg_i16_reg imm:$lane))),
Chris Lattnerd10a53d2010-03-08 18:51:21 +00005037 GPR:$src2, (SubReg_i16_lane imm:$lane))),
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00005038 (DSubReg_i16_reg imm:$lane)))>;
Bob Wilson5bafff32009-06-22 23:27:02 +00005039def : Pat<(insertelt (v4i32 QPR:$src1), GPR:$src2, imm:$lane),
Jim Grosbach1251e1a2010-11-18 01:39:50 +00005040 (v4i32 (INSERT_SUBREG QPR:$src1,
Chris Lattnerd10a53d2010-03-08 18:51:21 +00005041 (v2i32 (VSETLNi32 (v2i32 (EXTRACT_SUBREG QPR:$src1,
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00005042 (DSubReg_i32_reg imm:$lane))),
Chris Lattnerd10a53d2010-03-08 18:51:21 +00005043 GPR:$src2, (SubReg_i32_lane imm:$lane))),
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00005044 (DSubReg_i32_reg imm:$lane)))>;
5045
Anton Korobeynikovd91aafd2009-08-30 19:06:39 +00005046def : Pat<(v2f32 (insertelt DPR:$src1, SPR:$src2, imm:$src3)),
Anton Korobeynikov3a639a02009-11-02 00:11:39 +00005047 (INSERT_SUBREG (v2f32 (COPY_TO_REGCLASS DPR:$src1, DPR_VFP2)),
5048 SPR:$src2, (SSubReg_f32_reg imm:$src3))>;
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00005049def : Pat<(v4f32 (insertelt QPR:$src1, SPR:$src2, imm:$src3)),
Anton Korobeynikov3a639a02009-11-02 00:11:39 +00005050 (INSERT_SUBREG (v4f32 (COPY_TO_REGCLASS QPR:$src1, QPR_VFP2)),
5051 SPR:$src2, (SSubReg_f32_reg imm:$src3))>;
Bob Wilson5bafff32009-06-22 23:27:02 +00005052
5053//def : Pat<(v2i64 (insertelt QPR:$src1, DPR:$src2, imm:$src3)),
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00005054// (INSERT_SUBREG QPR:$src1, DPR:$src2, (DSubReg_f64_reg imm:$src3))>;
Bob Wilson5bafff32009-06-22 23:27:02 +00005055def : Pat<(v2f64 (insertelt QPR:$src1, DPR:$src2, imm:$src3)),
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00005056 (INSERT_SUBREG QPR:$src1, DPR:$src2, (DSubReg_f64_reg imm:$src3))>;
Bob Wilson5bafff32009-06-22 23:27:02 +00005057
Anton Korobeynikovfdf189a2009-08-27 14:38:44 +00005058def : Pat<(v2f32 (scalar_to_vector SPR:$src)),
Jakob Stoklund Olesen558661d2010-05-24 16:54:32 +00005059 (INSERT_SUBREG (v2f32 (IMPLICIT_DEF)), SPR:$src, ssub_0)>;
Chris Lattner77144e72010-03-15 00:52:43 +00005060def : Pat<(v2f64 (scalar_to_vector (f64 DPR:$src))),
Jakob Stoklund Olesen558661d2010-05-24 16:54:32 +00005061 (INSERT_SUBREG (v2f64 (IMPLICIT_DEF)), DPR:$src, dsub_0)>;
Anton Korobeynikovfdf189a2009-08-27 14:38:44 +00005062def : Pat<(v4f32 (scalar_to_vector SPR:$src)),
Jakob Stoklund Olesen558661d2010-05-24 16:54:32 +00005063 (INSERT_SUBREG (v4f32 (IMPLICIT_DEF)), SPR:$src, ssub_0)>;
Anton Korobeynikovfdf189a2009-08-27 14:38:44 +00005064
Anton Korobeynikovb5cdf872009-08-27 16:10:17 +00005065def : Pat<(v8i8 (scalar_to_vector GPR:$src)),
5066 (VSETLNi8 (v8i8 (IMPLICIT_DEF)), GPR:$src, (i32 0))>;
5067def : Pat<(v4i16 (scalar_to_vector GPR:$src)),
5068 (VSETLNi16 (v4i16 (IMPLICIT_DEF)), GPR:$src, (i32 0))>;
5069def : Pat<(v2i32 (scalar_to_vector GPR:$src)),
5070 (VSETLNi32 (v2i32 (IMPLICIT_DEF)), GPR:$src, (i32 0))>;
5071
5072def : Pat<(v16i8 (scalar_to_vector GPR:$src)),
5073 (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
5074 (VSETLNi8 (v8i8 (IMPLICIT_DEF)), GPR:$src, (i32 0)),
Jakob Stoklund Olesen558661d2010-05-24 16:54:32 +00005075 dsub_0)>;
Anton Korobeynikovb5cdf872009-08-27 16:10:17 +00005076def : Pat<(v8i16 (scalar_to_vector GPR:$src)),
5077 (INSERT_SUBREG (v8i16 (IMPLICIT_DEF)),
5078 (VSETLNi16 (v4i16 (IMPLICIT_DEF)), GPR:$src, (i32 0)),
Jakob Stoklund Olesen558661d2010-05-24 16:54:32 +00005079 dsub_0)>;
Anton Korobeynikovb5cdf872009-08-27 16:10:17 +00005080def : Pat<(v4i32 (scalar_to_vector GPR:$src)),
5081 (INSERT_SUBREG (v4i32 (IMPLICIT_DEF)),
5082 (VSETLNi32 (v2i32 (IMPLICIT_DEF)), GPR:$src, (i32 0)),
Jakob Stoklund Olesen558661d2010-05-24 16:54:32 +00005083 dsub_0)>;
Anton Korobeynikovb5cdf872009-08-27 16:10:17 +00005084
Bob Wilson5bafff32009-06-22 23:27:02 +00005085// VDUP : Vector Duplicate (from ARM core register to all elements)
5086
Evan Chengf81bf152009-11-23 21:57:23 +00005087class VDUPD<bits<8> opcod1, bits<2> opcod3, string Dt, ValueType Ty>
Owen Andersonca6945e2010-12-01 00:28:25 +00005088 : NVDup<opcod1, 0b1011, opcod3, (outs DPR:$V), (ins GPR:$R),
5089 IIC_VMOVIS, "vdup", Dt, "$V, $R",
5090 [(set DPR:$V, (Ty (NEONvdup (i32 GPR:$R))))]>;
Evan Chengf81bf152009-11-23 21:57:23 +00005091class VDUPQ<bits<8> opcod1, bits<2> opcod3, string Dt, ValueType Ty>
Owen Andersonca6945e2010-12-01 00:28:25 +00005092 : NVDup<opcod1, 0b1011, opcod3, (outs QPR:$V), (ins GPR:$R),
5093 IIC_VMOVIS, "vdup", Dt, "$V, $R",
5094 [(set QPR:$V, (Ty (NEONvdup (i32 GPR:$R))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00005095
Evan Chengf81bf152009-11-23 21:57:23 +00005096def VDUP8d : VDUPD<0b11101100, 0b00, "8", v8i8>;
5097def VDUP16d : VDUPD<0b11101000, 0b01, "16", v4i16>;
5098def VDUP32d : VDUPD<0b11101000, 0b00, "32", v2i32>;
5099def VDUP8q : VDUPQ<0b11101110, 0b00, "8", v16i8>;
5100def VDUP16q : VDUPQ<0b11101010, 0b01, "16", v8i16>;
5101def VDUP32q : VDUPQ<0b11101010, 0b00, "32", v4i32>;
Bob Wilson5bafff32009-06-22 23:27:02 +00005102
Jim Grosbach958108a2011-03-11 20:44:08 +00005103def : Pat<(v2f32 (NEONvdup (f32 (bitconvert GPR:$R)))), (VDUP32d GPR:$R)>;
5104def : Pat<(v4f32 (NEONvdup (f32 (bitconvert GPR:$R)))), (VDUP32q GPR:$R)>;
Bob Wilson5bafff32009-06-22 23:27:02 +00005105
5106// VDUP : Vector Duplicate Lane (from scalar to all elements)
5107
Johnny Chene4614f72010-03-25 17:01:27 +00005108class VDUPLND<bits<4> op19_16, string OpcodeStr, string Dt,
Jim Grosbach460a9052011-10-07 23:56:00 +00005109 ValueType Ty, Operand IdxTy>
5110 : NVDupLane<op19_16, 0, (outs DPR:$Vd), (ins DPR:$Vm, IdxTy:$lane),
5111 IIC_VMOVD, OpcodeStr, Dt, "$Vd, $Vm$lane",
Owen Andersonca6945e2010-12-01 00:28:25 +00005112 [(set DPR:$Vd, (Ty (NEONvduplane (Ty DPR:$Vm), imm:$lane)))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00005113
Johnny Chene4614f72010-03-25 17:01:27 +00005114class VDUPLNQ<bits<4> op19_16, string OpcodeStr, string Dt,
Jim Grosbach460a9052011-10-07 23:56:00 +00005115 ValueType ResTy, ValueType OpTy, Operand IdxTy>
5116 : NVDupLane<op19_16, 1, (outs QPR:$Vd), (ins DPR:$Vm, IdxTy:$lane),
5117 IIC_VMOVQ, OpcodeStr, Dt, "$Vd, $Vm$lane",
Owen Andersonca6945e2010-12-01 00:28:25 +00005118 [(set QPR:$Vd, (ResTy (NEONvduplane (OpTy DPR:$Vm),
Jim Grosbach460a9052011-10-07 23:56:00 +00005119 VectorIndex32:$lane)))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00005120
Bob Wilson507df402009-10-21 02:15:46 +00005121// Inst{19-16} is partially specified depending on the element size.
5122
Jim Grosbach460a9052011-10-07 23:56:00 +00005123def VDUPLN8d : VDUPLND<{?,?,?,1}, "vdup", "8", v8i8, VectorIndex8> {
5124 bits<3> lane;
Owen Andersonf587a932010-10-27 19:25:54 +00005125 let Inst{19-17} = lane{2-0};
5126}
Jim Grosbach460a9052011-10-07 23:56:00 +00005127def VDUPLN16d : VDUPLND<{?,?,1,0}, "vdup", "16", v4i16, VectorIndex16> {
5128 bits<2> lane;
Owen Andersonf587a932010-10-27 19:25:54 +00005129 let Inst{19-18} = lane{1-0};
5130}
Jim Grosbach460a9052011-10-07 23:56:00 +00005131def VDUPLN32d : VDUPLND<{?,1,0,0}, "vdup", "32", v2i32, VectorIndex32> {
5132 bits<1> lane;
Owen Andersonf587a932010-10-27 19:25:54 +00005133 let Inst{19} = lane{0};
5134}
Jim Grosbach460a9052011-10-07 23:56:00 +00005135def VDUPLN8q : VDUPLNQ<{?,?,?,1}, "vdup", "8", v16i8, v8i8, VectorIndex8> {
5136 bits<3> lane;
Owen Andersonf587a932010-10-27 19:25:54 +00005137 let Inst{19-17} = lane{2-0};
5138}
Jim Grosbach460a9052011-10-07 23:56:00 +00005139def VDUPLN16q : VDUPLNQ<{?,?,1,0}, "vdup", "16", v8i16, v4i16, VectorIndex16> {
5140 bits<2> lane;
Owen Andersonf587a932010-10-27 19:25:54 +00005141 let Inst{19-18} = lane{1-0};
5142}
Jim Grosbach460a9052011-10-07 23:56:00 +00005143def VDUPLN32q : VDUPLNQ<{?,1,0,0}, "vdup", "32", v4i32, v2i32, VectorIndex32> {
5144 bits<1> lane;
Owen Andersonf587a932010-10-27 19:25:54 +00005145 let Inst{19} = lane{0};
5146}
Jim Grosbach8b8515c2011-03-11 20:31:17 +00005147
5148def : Pat<(v2f32 (NEONvduplane (v2f32 DPR:$Vm), imm:$lane)),
5149 (VDUPLN32d DPR:$Vm, imm:$lane)>;
5150
5151def : Pat<(v4f32 (NEONvduplane (v2f32 DPR:$Vm), imm:$lane)),
5152 (VDUPLN32q DPR:$Vm, imm:$lane)>;
Bob Wilson5bafff32009-06-22 23:27:02 +00005153
Bob Wilson0ce37102009-08-14 05:08:32 +00005154def : Pat<(v16i8 (NEONvduplane (v16i8 QPR:$src), imm:$lane)),
5155 (v16i8 (VDUPLN8q (v8i8 (EXTRACT_SUBREG QPR:$src,
5156 (DSubReg_i8_reg imm:$lane))),
5157 (SubReg_i8_lane imm:$lane)))>;
5158def : Pat<(v8i16 (NEONvduplane (v8i16 QPR:$src), imm:$lane)),
5159 (v8i16 (VDUPLN16q (v4i16 (EXTRACT_SUBREG QPR:$src,
5160 (DSubReg_i16_reg imm:$lane))),
5161 (SubReg_i16_lane imm:$lane)))>;
5162def : Pat<(v4i32 (NEONvduplane (v4i32 QPR:$src), imm:$lane)),
5163 (v4i32 (VDUPLN32q (v2i32 (EXTRACT_SUBREG QPR:$src,
5164 (DSubReg_i32_reg imm:$lane))),
5165 (SubReg_i32_lane imm:$lane)))>;
5166def : Pat<(v4f32 (NEONvduplane (v4f32 QPR:$src), imm:$lane)),
Jim Grosbach8b8515c2011-03-11 20:31:17 +00005167 (v4f32 (VDUPLN32q (v2f32 (EXTRACT_SUBREG QPR:$src,
Bob Wilson0ce37102009-08-14 05:08:32 +00005168 (DSubReg_i32_reg imm:$lane))),
5169 (SubReg_i32_lane imm:$lane)))>;
5170
Jim Grosbach65dc3032010-10-06 21:16:16 +00005171def VDUPfdf : PseudoNeonI<(outs DPR:$dst), (ins SPR:$src), IIC_VMOVD, "",
Johnny Chenda1aea42009-11-23 21:00:43 +00005172 [(set DPR:$dst, (v2f32 (NEONvdup (f32 SPR:$src))))]>;
Jim Grosbach65dc3032010-10-06 21:16:16 +00005173def VDUPfqf : PseudoNeonI<(outs QPR:$dst), (ins SPR:$src), IIC_VMOVD, "",
Johnny Chenda1aea42009-11-23 21:00:43 +00005174 [(set QPR:$dst, (v4f32 (NEONvdup (f32 SPR:$src))))]>;
Anton Korobeynikov32a1b252009-08-07 22:36:50 +00005175
Bob Wilson5bafff32009-06-22 23:27:02 +00005176// VMOVN : Vector Narrowing Move
Evan Chengcae6a122010-10-01 20:50:58 +00005177defm VMOVN : N2VN_HSD<0b11,0b11,0b10,0b00100,0,0, IIC_VMOVN,
Bob Wilson973a0742010-08-30 20:02:30 +00005178 "vmovn", "i", trunc>;
Bob Wilson5bafff32009-06-22 23:27:02 +00005179// VQMOVN : Vector Saturating Narrowing Move
Evan Chengf81bf152009-11-23 21:57:23 +00005180defm VQMOVNs : N2VNInt_HSD<0b11,0b11,0b10,0b00101,0,0, IIC_VQUNAiD,
5181 "vqmovn", "s", int_arm_neon_vqmovns>;
5182defm VQMOVNu : N2VNInt_HSD<0b11,0b11,0b10,0b00101,1,0, IIC_VQUNAiD,
5183 "vqmovn", "u", int_arm_neon_vqmovnu>;
5184defm VQMOVNsu : N2VNInt_HSD<0b11,0b11,0b10,0b00100,1,0, IIC_VQUNAiD,
5185 "vqmovun", "s", int_arm_neon_vqmovnsu>;
Bob Wilson5bafff32009-06-22 23:27:02 +00005186// VMOVL : Vector Lengthening Move
Bob Wilsonb31a11b2010-08-20 04:54:02 +00005187defm VMOVLs : N2VL_QHS<0b01,0b10100,0,1, "vmovl", "s", sext>;
5188defm VMOVLu : N2VL_QHS<0b11,0b10100,0,1, "vmovl", "u", zext>;
Bob Wilson1e9ccd62012-01-20 20:59:56 +00005189def : Pat<(v8i16 (anyext (v8i8 DPR:$Vm))), (VMOVLuv8i16 DPR:$Vm)>;
5190def : Pat<(v4i32 (anyext (v4i16 DPR:$Vm))), (VMOVLuv4i32 DPR:$Vm)>;
5191def : Pat<(v2i64 (anyext (v2i32 DPR:$Vm))), (VMOVLuv2i64 DPR:$Vm)>;
Bob Wilson5bafff32009-06-22 23:27:02 +00005192
5193// Vector Conversions.
5194
Johnny Chen9e088762010-03-17 17:52:21 +00005195// VCVT : Vector Convert Between Floating-Point and Integers
Johnny Chen6c8648b2010-03-17 23:26:50 +00005196def VCVTf2sd : N2VD<0b11, 0b11, 0b10, 0b11, 0b01110, 0, "vcvt", "s32.f32",
5197 v2i32, v2f32, fp_to_sint>;
5198def VCVTf2ud : N2VD<0b11, 0b11, 0b10, 0b11, 0b01111, 0, "vcvt", "u32.f32",
5199 v2i32, v2f32, fp_to_uint>;
5200def VCVTs2fd : N2VD<0b11, 0b11, 0b10, 0b11, 0b01100, 0, "vcvt", "f32.s32",
5201 v2f32, v2i32, sint_to_fp>;
5202def VCVTu2fd : N2VD<0b11, 0b11, 0b10, 0b11, 0b01101, 0, "vcvt", "f32.u32",
5203 v2f32, v2i32, uint_to_fp>;
Johnny Chen9e088762010-03-17 17:52:21 +00005204
Johnny Chen6c8648b2010-03-17 23:26:50 +00005205def VCVTf2sq : N2VQ<0b11, 0b11, 0b10, 0b11, 0b01110, 0, "vcvt", "s32.f32",
5206 v4i32, v4f32, fp_to_sint>;
5207def VCVTf2uq : N2VQ<0b11, 0b11, 0b10, 0b11, 0b01111, 0, "vcvt", "u32.f32",
5208 v4i32, v4f32, fp_to_uint>;
5209def VCVTs2fq : N2VQ<0b11, 0b11, 0b10, 0b11, 0b01100, 0, "vcvt", "f32.s32",
5210 v4f32, v4i32, sint_to_fp>;
5211def VCVTu2fq : N2VQ<0b11, 0b11, 0b10, 0b11, 0b01101, 0, "vcvt", "f32.u32",
5212 v4f32, v4i32, uint_to_fp>;
Bob Wilson5bafff32009-06-22 23:27:02 +00005213
5214// VCVT : Vector Convert Between Floating-Point and Fixed-Point.
Owen Andersonb589be92011-11-15 19:55:00 +00005215let DecoderMethod = "DecodeVCVTD" in {
Evan Chengf81bf152009-11-23 21:57:23 +00005216def VCVTf2xsd : N2VCvtD<0, 1, 0b1111, 0, 1, "vcvt", "s32.f32",
Bob Wilson5bafff32009-06-22 23:27:02 +00005217 v2i32, v2f32, int_arm_neon_vcvtfp2fxs>;
Evan Chengf81bf152009-11-23 21:57:23 +00005218def VCVTf2xud : N2VCvtD<1, 1, 0b1111, 0, 1, "vcvt", "u32.f32",
Bob Wilson5bafff32009-06-22 23:27:02 +00005219 v2i32, v2f32, int_arm_neon_vcvtfp2fxu>;
Evan Chengf81bf152009-11-23 21:57:23 +00005220def VCVTxs2fd : N2VCvtD<0, 1, 0b1110, 0, 1, "vcvt", "f32.s32",
Bob Wilson5bafff32009-06-22 23:27:02 +00005221 v2f32, v2i32, int_arm_neon_vcvtfxs2fp>;
Evan Chengf81bf152009-11-23 21:57:23 +00005222def VCVTxu2fd : N2VCvtD<1, 1, 0b1110, 0, 1, "vcvt", "f32.u32",
Bob Wilson5bafff32009-06-22 23:27:02 +00005223 v2f32, v2i32, int_arm_neon_vcvtfxu2fp>;
Owen Andersonb589be92011-11-15 19:55:00 +00005224}
Bob Wilson5bafff32009-06-22 23:27:02 +00005225
Owen Andersonb589be92011-11-15 19:55:00 +00005226let DecoderMethod = "DecodeVCVTQ" in {
Evan Chengf81bf152009-11-23 21:57:23 +00005227def VCVTf2xsq : N2VCvtQ<0, 1, 0b1111, 0, 1, "vcvt", "s32.f32",
Bob Wilson5bafff32009-06-22 23:27:02 +00005228 v4i32, v4f32, int_arm_neon_vcvtfp2fxs>;
Evan Chengf81bf152009-11-23 21:57:23 +00005229def VCVTf2xuq : N2VCvtQ<1, 1, 0b1111, 0, 1, "vcvt", "u32.f32",
Bob Wilson5bafff32009-06-22 23:27:02 +00005230 v4i32, v4f32, int_arm_neon_vcvtfp2fxu>;
Evan Chengf81bf152009-11-23 21:57:23 +00005231def VCVTxs2fq : N2VCvtQ<0, 1, 0b1110, 0, 1, "vcvt", "f32.s32",
Bob Wilson5bafff32009-06-22 23:27:02 +00005232 v4f32, v4i32, int_arm_neon_vcvtfxs2fp>;
Evan Chengf81bf152009-11-23 21:57:23 +00005233def VCVTxu2fq : N2VCvtQ<1, 1, 0b1110, 0, 1, "vcvt", "f32.u32",
Bob Wilson5bafff32009-06-22 23:27:02 +00005234 v4f32, v4i32, int_arm_neon_vcvtfxu2fp>;
Owen Andersonb589be92011-11-15 19:55:00 +00005235}
Bob Wilson5bafff32009-06-22 23:27:02 +00005236
Bob Wilson04063562010-12-15 22:14:12 +00005237// VCVT : Vector Convert Between Half-Precision and Single-Precision.
5238def VCVTf2h : N2VNInt<0b11, 0b11, 0b01, 0b10, 0b01100, 0, 0,
5239 IIC_VUNAQ, "vcvt", "f16.f32",
5240 v4i16, v4f32, int_arm_neon_vcvtfp2hf>,
5241 Requires<[HasNEON, HasFP16]>;
5242def VCVTh2f : N2VLInt<0b11, 0b11, 0b01, 0b10, 0b01110, 0, 0,
5243 IIC_VUNAQ, "vcvt", "f32.f16",
5244 v4f32, v4i16, int_arm_neon_vcvthf2fp>,
5245 Requires<[HasNEON, HasFP16]>;
5246
Bob Wilsond8e17572009-08-12 22:31:50 +00005247// Vector Reverse.
Bob Wilson8bb9e482009-07-26 00:39:34 +00005248
5249// VREV64 : Vector Reverse elements within 64-bit doublewords
5250
Evan Chengf81bf152009-11-23 21:57:23 +00005251class VREV64D<bits<2> op19_18, string OpcodeStr, string Dt, ValueType Ty>
Owen Andersonaa545242010-11-21 06:47:06 +00005252 : N2V<0b11, 0b11, op19_18, 0b00, 0b00000, 0, 0, (outs DPR:$Vd),
5253 (ins DPR:$Vm), IIC_VMOVD,
5254 OpcodeStr, Dt, "$Vd, $Vm", "",
5255 [(set DPR:$Vd, (Ty (NEONvrev64 (Ty DPR:$Vm))))]>;
Evan Chengf81bf152009-11-23 21:57:23 +00005256class VREV64Q<bits<2> op19_18, string OpcodeStr, string Dt, ValueType Ty>
Owen Andersonaa545242010-11-21 06:47:06 +00005257 : N2V<0b11, 0b11, op19_18, 0b00, 0b00000, 1, 0, (outs QPR:$Vd),
5258 (ins QPR:$Vm), IIC_VMOVQ,
5259 OpcodeStr, Dt, "$Vd, $Vm", "",
5260 [(set QPR:$Vd, (Ty (NEONvrev64 (Ty QPR:$Vm))))]>;
Bob Wilson8bb9e482009-07-26 00:39:34 +00005261
Evan Chengf81bf152009-11-23 21:57:23 +00005262def VREV64d8 : VREV64D<0b00, "vrev64", "8", v8i8>;
5263def VREV64d16 : VREV64D<0b01, "vrev64", "16", v4i16>;
5264def VREV64d32 : VREV64D<0b10, "vrev64", "32", v2i32>;
Jim Grosbach1558df72011-03-11 20:18:05 +00005265def : Pat<(v2f32 (NEONvrev64 (v2f32 DPR:$Vm))), (VREV64d32 DPR:$Vm)>;
Bob Wilson8bb9e482009-07-26 00:39:34 +00005266
Evan Chengf81bf152009-11-23 21:57:23 +00005267def VREV64q8 : VREV64Q<0b00, "vrev64", "8", v16i8>;
5268def VREV64q16 : VREV64Q<0b01, "vrev64", "16", v8i16>;
5269def VREV64q32 : VREV64Q<0b10, "vrev64", "32", v4i32>;
Jim Grosbach1558df72011-03-11 20:18:05 +00005270def : Pat<(v4f32 (NEONvrev64 (v4f32 QPR:$Vm))), (VREV64q32 QPR:$Vm)>;
Bob Wilson8bb9e482009-07-26 00:39:34 +00005271
5272// VREV32 : Vector Reverse elements within 32-bit words
5273
Evan Chengf81bf152009-11-23 21:57:23 +00005274class VREV32D<bits<2> op19_18, string OpcodeStr, string Dt, ValueType Ty>
Owen Andersonaa545242010-11-21 06:47:06 +00005275 : N2V<0b11, 0b11, op19_18, 0b00, 0b00001, 0, 0, (outs DPR:$Vd),
5276 (ins DPR:$Vm), IIC_VMOVD,
5277 OpcodeStr, Dt, "$Vd, $Vm", "",
5278 [(set DPR:$Vd, (Ty (NEONvrev32 (Ty DPR:$Vm))))]>;
Evan Chengf81bf152009-11-23 21:57:23 +00005279class VREV32Q<bits<2> op19_18, string OpcodeStr, string Dt, ValueType Ty>
Owen Andersonaa545242010-11-21 06:47:06 +00005280 : N2V<0b11, 0b11, op19_18, 0b00, 0b00001, 1, 0, (outs QPR:$Vd),
5281 (ins QPR:$Vm), IIC_VMOVQ,
5282 OpcodeStr, Dt, "$Vd, $Vm", "",
5283 [(set QPR:$Vd, (Ty (NEONvrev32 (Ty QPR:$Vm))))]>;
Bob Wilson8bb9e482009-07-26 00:39:34 +00005284
Evan Chengf81bf152009-11-23 21:57:23 +00005285def VREV32d8 : VREV32D<0b00, "vrev32", "8", v8i8>;
5286def VREV32d16 : VREV32D<0b01, "vrev32", "16", v4i16>;
Bob Wilson8bb9e482009-07-26 00:39:34 +00005287
Evan Chengf81bf152009-11-23 21:57:23 +00005288def VREV32q8 : VREV32Q<0b00, "vrev32", "8", v16i8>;
5289def VREV32q16 : VREV32Q<0b01, "vrev32", "16", v8i16>;
Bob Wilson8bb9e482009-07-26 00:39:34 +00005290
5291// VREV16 : Vector Reverse elements within 16-bit halfwords
5292
Evan Chengf81bf152009-11-23 21:57:23 +00005293class VREV16D<bits<2> op19_18, string OpcodeStr, string Dt, ValueType Ty>
Owen Andersonaa545242010-11-21 06:47:06 +00005294 : N2V<0b11, 0b11, op19_18, 0b00, 0b00010, 0, 0, (outs DPR:$Vd),
5295 (ins DPR:$Vm), IIC_VMOVD,
5296 OpcodeStr, Dt, "$Vd, $Vm", "",
5297 [(set DPR:$Vd, (Ty (NEONvrev16 (Ty DPR:$Vm))))]>;
Evan Chengf81bf152009-11-23 21:57:23 +00005298class VREV16Q<bits<2> op19_18, string OpcodeStr, string Dt, ValueType Ty>
Owen Andersonaa545242010-11-21 06:47:06 +00005299 : N2V<0b11, 0b11, op19_18, 0b00, 0b00010, 1, 0, (outs QPR:$Vd),
5300 (ins QPR:$Vm), IIC_VMOVQ,
5301 OpcodeStr, Dt, "$Vd, $Vm", "",
5302 [(set QPR:$Vd, (Ty (NEONvrev16 (Ty QPR:$Vm))))]>;
Bob Wilson8bb9e482009-07-26 00:39:34 +00005303
Evan Chengf81bf152009-11-23 21:57:23 +00005304def VREV16d8 : VREV16D<0b00, "vrev16", "8", v8i8>;
5305def VREV16q8 : VREV16Q<0b00, "vrev16", "8", v16i8>;
Bob Wilson8bb9e482009-07-26 00:39:34 +00005306
Bob Wilsonde95c1b82009-08-19 17:03:43 +00005307// Other Vector Shuffles.
5308
Bob Wilson5e8b8332011-01-07 04:59:04 +00005309// Aligned extractions: really just dropping registers
5310
5311class AlignedVEXTq<ValueType DestTy, ValueType SrcTy, SDNodeXForm LaneCVT>
5312 : Pat<(DestTy (vector_extract_subvec (SrcTy QPR:$src), (i32 imm:$start))),
5313 (EXTRACT_SUBREG (SrcTy QPR:$src), (LaneCVT imm:$start))>;
5314
5315def : AlignedVEXTq<v8i8, v16i8, DSubReg_i8_reg>;
5316
5317def : AlignedVEXTq<v4i16, v8i16, DSubReg_i16_reg>;
5318
5319def : AlignedVEXTq<v2i32, v4i32, DSubReg_i32_reg>;
5320
5321def : AlignedVEXTq<v1i64, v2i64, DSubReg_f64_reg>;
5322
5323def : AlignedVEXTq<v2f32, v4f32, DSubReg_i32_reg>;
5324
5325
Bob Wilsonde95c1b82009-08-19 17:03:43 +00005326// VEXT : Vector Extract
5327
Jim Grosbach587f5062011-12-02 23:34:39 +00005328class VEXTd<string OpcodeStr, string Dt, ValueType Ty, Operand immTy>
Owen Andersonaa545242010-11-21 06:47:06 +00005329 : N3V<0,1,0b11,{?,?,?,?},0,0, (outs DPR:$Vd),
Jim Grosbach587f5062011-12-02 23:34:39 +00005330 (ins DPR:$Vn, DPR:$Vm, immTy:$index), NVExtFrm,
Owen Andersonaa545242010-11-21 06:47:06 +00005331 IIC_VEXTD, OpcodeStr, Dt, "$Vd, $Vn, $Vm, $index", "",
5332 [(set DPR:$Vd, (Ty (NEONvext (Ty DPR:$Vn),
Jim Grosbach587f5062011-12-02 23:34:39 +00005333 (Ty DPR:$Vm), imm:$index)))]> {
Owen Anderson3eff4af2010-10-27 23:56:39 +00005334 bits<4> index;
5335 let Inst{11-8} = index{3-0};
5336}
Anton Korobeynikov5da894f2009-08-21 12:40:21 +00005337
Jim Grosbach587f5062011-12-02 23:34:39 +00005338class VEXTq<string OpcodeStr, string Dt, ValueType Ty, Operand immTy>
Owen Andersonaa545242010-11-21 06:47:06 +00005339 : N3V<0,1,0b11,{?,?,?,?},1,0, (outs QPR:$Vd),
Jim Grosbache40ab242011-12-02 22:57:57 +00005340 (ins QPR:$Vn, QPR:$Vm, imm0_15:$index), NVExtFrm,
Owen Andersonaa545242010-11-21 06:47:06 +00005341 IIC_VEXTQ, OpcodeStr, Dt, "$Vd, $Vn, $Vm, $index", "",
5342 [(set QPR:$Vd, (Ty (NEONvext (Ty QPR:$Vn),
Jim Grosbach587f5062011-12-02 23:34:39 +00005343 (Ty QPR:$Vm), imm:$index)))]> {
Owen Anderson3eff4af2010-10-27 23:56:39 +00005344 bits<4> index;
5345 let Inst{11-8} = index{3-0};
5346}
Anton Korobeynikov5da894f2009-08-21 12:40:21 +00005347
Jim Grosbach587f5062011-12-02 23:34:39 +00005348def VEXTd8 : VEXTd<"vext", "8", v8i8, imm0_7> {
Owen Anderson7a258252010-11-03 18:16:27 +00005349 let Inst{11-8} = index{3-0};
5350}
Jim Grosbach587f5062011-12-02 23:34:39 +00005351def VEXTd16 : VEXTd<"vext", "16", v4i16, imm0_3> {
Owen Anderson7a258252010-11-03 18:16:27 +00005352 let Inst{11-9} = index{2-0};
5353 let Inst{8} = 0b0;
5354}
Jim Grosbach587f5062011-12-02 23:34:39 +00005355def VEXTd32 : VEXTd<"vext", "32", v2i32, imm0_1> {
Owen Anderson7a258252010-11-03 18:16:27 +00005356 let Inst{11-10} = index{1-0};
5357 let Inst{9-8} = 0b00;
5358}
Owen Anderson167eb1f2011-07-15 17:48:05 +00005359def : Pat<(v2f32 (NEONvext (v2f32 DPR:$Vn),
5360 (v2f32 DPR:$Vm),
5361 (i32 imm:$index))),
5362 (VEXTd32 DPR:$Vn, DPR:$Vm, imm:$index)>;
Anton Korobeynikov5da894f2009-08-21 12:40:21 +00005363
Jim Grosbach587f5062011-12-02 23:34:39 +00005364def VEXTq8 : VEXTq<"vext", "8", v16i8, imm0_15> {
Owen Anderson7a258252010-11-03 18:16:27 +00005365 let Inst{11-8} = index{3-0};
5366}
Jim Grosbach587f5062011-12-02 23:34:39 +00005367def VEXTq16 : VEXTq<"vext", "16", v8i16, imm0_7> {
Owen Anderson7a258252010-11-03 18:16:27 +00005368 let Inst{11-9} = index{2-0};
5369 let Inst{8} = 0b0;
5370}
Jim Grosbach587f5062011-12-02 23:34:39 +00005371def VEXTq32 : VEXTq<"vext", "32", v4i32, imm0_3> {
Owen Anderson7a258252010-11-03 18:16:27 +00005372 let Inst{11-10} = index{1-0};
5373 let Inst{9-8} = 0b00;
5374}
Jim Grosbach8759c3f2011-12-08 22:19:04 +00005375def VEXTq64 : VEXTq<"vext", "64", v2i64, imm0_1> {
Jim Grosbach587f5062011-12-02 23:34:39 +00005376 let Inst{11} = index{0};
5377 let Inst{10-8} = 0b000;
5378}
Owen Anderson167eb1f2011-07-15 17:48:05 +00005379def : Pat<(v4f32 (NEONvext (v4f32 QPR:$Vn),
5380 (v4f32 QPR:$Vm),
5381 (i32 imm:$index))),
5382 (VEXTq32 QPR:$Vn, QPR:$Vm, imm:$index)>;
Bob Wilsonde95c1b82009-08-19 17:03:43 +00005383
Bob Wilson64efd902009-08-08 05:53:00 +00005384// VTRN : Vector Transpose
5385
Evan Chengf81bf152009-11-23 21:57:23 +00005386def VTRNd8 : N2VDShuffle<0b00, 0b00001, "vtrn", "8">;
5387def VTRNd16 : N2VDShuffle<0b01, 0b00001, "vtrn", "16">;
5388def VTRNd32 : N2VDShuffle<0b10, 0b00001, "vtrn", "32">;
Bob Wilson64efd902009-08-08 05:53:00 +00005389
Evan Chengf81bf152009-11-23 21:57:23 +00005390def VTRNq8 : N2VQShuffle<0b00, 0b00001, IIC_VPERMQ, "vtrn", "8">;
5391def VTRNq16 : N2VQShuffle<0b01, 0b00001, IIC_VPERMQ, "vtrn", "16">;
5392def VTRNq32 : N2VQShuffle<0b10, 0b00001, IIC_VPERMQ, "vtrn", "32">;
Bob Wilson64efd902009-08-08 05:53:00 +00005393
Bob Wilsonb6ab51e2009-08-08 06:13:25 +00005394// VUZP : Vector Unzip (Deinterleave)
5395
Evan Chengf81bf152009-11-23 21:57:23 +00005396def VUZPd8 : N2VDShuffle<0b00, 0b00010, "vuzp", "8">;
5397def VUZPd16 : N2VDShuffle<0b01, 0b00010, "vuzp", "16">;
5398def VUZPd32 : N2VDShuffle<0b10, 0b00010, "vuzp", "32">;
Bob Wilsonb6ab51e2009-08-08 06:13:25 +00005399
Evan Chengf81bf152009-11-23 21:57:23 +00005400def VUZPq8 : N2VQShuffle<0b00, 0b00010, IIC_VPERMQ3, "vuzp", "8">;
5401def VUZPq16 : N2VQShuffle<0b01, 0b00010, IIC_VPERMQ3, "vuzp", "16">;
5402def VUZPq32 : N2VQShuffle<0b10, 0b00010, IIC_VPERMQ3, "vuzp", "32">;
Bob Wilsonb6ab51e2009-08-08 06:13:25 +00005403
5404// VZIP : Vector Zip (Interleave)
5405
Evan Chengf81bf152009-11-23 21:57:23 +00005406def VZIPd8 : N2VDShuffle<0b00, 0b00011, "vzip", "8">;
5407def VZIPd16 : N2VDShuffle<0b01, 0b00011, "vzip", "16">;
5408def VZIPd32 : N2VDShuffle<0b10, 0b00011, "vzip", "32">;
Bob Wilsonb6ab51e2009-08-08 06:13:25 +00005409
Evan Chengf81bf152009-11-23 21:57:23 +00005410def VZIPq8 : N2VQShuffle<0b00, 0b00011, IIC_VPERMQ3, "vzip", "8">;
5411def VZIPq16 : N2VQShuffle<0b01, 0b00011, IIC_VPERMQ3, "vzip", "16">;
5412def VZIPq32 : N2VQShuffle<0b10, 0b00011, IIC_VPERMQ3, "vzip", "32">;
Bob Wilson64efd902009-08-08 05:53:00 +00005413
Bob Wilson114a2662009-08-12 20:51:55 +00005414// Vector Table Lookup and Table Extension.
5415
5416// VTBL : Vector Table Lookup
Owen Anderson8d7d2e12011-08-09 20:55:18 +00005417let DecoderMethod = "DecodeTBLInstruction" in {
Bob Wilson114a2662009-08-12 20:51:55 +00005418def VTBL1
Owen Andersoncfd0e1f2010-10-28 00:18:46 +00005419 : N3V<1,1,0b11,0b1000,0,0, (outs DPR:$Vd),
Jim Grosbach862019c2011-10-18 23:02:30 +00005420 (ins VecListOneD:$Vn, DPR:$Vm), NVTBLFrm, IIC_VTB1,
5421 "vtbl", "8", "$Vd, $Vn, $Vm", "",
5422 [(set DPR:$Vd, (v8i8 (int_arm_neon_vtbl1 VecListOneD:$Vn, DPR:$Vm)))]>;
Evan Cheng0d92f5f2009-10-01 08:22:27 +00005423let hasExtraSrcRegAllocReq = 1 in {
Bob Wilson114a2662009-08-12 20:51:55 +00005424def VTBL2
Owen Andersoncfd0e1f2010-10-28 00:18:46 +00005425 : N3V<1,1,0b11,0b1001,0,0, (outs DPR:$Vd),
Jim Grosbach60d99a52011-12-15 22:27:11 +00005426 (ins VecListTwoD:$Vn, DPR:$Vm), NVTBLFrm, IIC_VTB2,
5427 "vtbl", "8", "$Vd, $Vn, $Vm", "", []>;
Bob Wilson114a2662009-08-12 20:51:55 +00005428def VTBL3
Owen Andersoncfd0e1f2010-10-28 00:18:46 +00005429 : N3V<1,1,0b11,0b1010,0,0, (outs DPR:$Vd),
Jim Grosbach60d99a52011-12-15 22:27:11 +00005430 (ins VecListThreeD:$Vn, DPR:$Vm), NVTBLFrm, IIC_VTB3,
5431 "vtbl", "8", "$Vd, $Vn, $Vm", "", []>;
Bob Wilson114a2662009-08-12 20:51:55 +00005432def VTBL4
Owen Andersoncfd0e1f2010-10-28 00:18:46 +00005433 : N3V<1,1,0b11,0b1011,0,0, (outs DPR:$Vd),
Jim Grosbach60d99a52011-12-15 22:27:11 +00005434 (ins VecListFourD:$Vn, DPR:$Vm),
Johnny Chen79c4d822010-03-29 01:14:22 +00005435 NVTBLFrm, IIC_VTB4,
Jim Grosbach60d99a52011-12-15 22:27:11 +00005436 "vtbl", "8", "$Vd, $Vn, $Vm", "", []>;
Evan Cheng0d92f5f2009-10-01 08:22:27 +00005437} // hasExtraSrcRegAllocReq = 1
Bob Wilson114a2662009-08-12 20:51:55 +00005438
Bob Wilsonbd916c52010-09-13 23:55:10 +00005439def VTBL2Pseudo
Jim Grosbach7cd27292010-10-06 20:36:55 +00005440 : PseudoNeonI<(outs DPR:$dst), (ins QPR:$tbl, DPR:$src), IIC_VTB2, "", []>;
Bob Wilsonbd916c52010-09-13 23:55:10 +00005441def VTBL3Pseudo
Jim Grosbach7cd27292010-10-06 20:36:55 +00005442 : PseudoNeonI<(outs DPR:$dst), (ins QQPR:$tbl, DPR:$src), IIC_VTB3, "", []>;
Bob Wilsonbd916c52010-09-13 23:55:10 +00005443def VTBL4Pseudo
Jim Grosbach7cd27292010-10-06 20:36:55 +00005444 : PseudoNeonI<(outs DPR:$dst), (ins QQPR:$tbl, DPR:$src), IIC_VTB4, "", []>;
Bob Wilsonbd916c52010-09-13 23:55:10 +00005445
Bob Wilson114a2662009-08-12 20:51:55 +00005446// VTBX : Vector Table Extension
5447def VTBX1
Owen Andersoncfd0e1f2010-10-28 00:18:46 +00005448 : N3V<1,1,0b11,0b1000,1,0, (outs DPR:$Vd),
Jim Grosbachd0b61472011-10-20 14:48:50 +00005449 (ins DPR:$orig, VecListOneD:$Vn, DPR:$Vm), NVTBLFrm, IIC_VTBX1,
5450 "vtbx", "8", "$Vd, $Vn, $Vm", "$orig = $Vd",
Owen Andersoncfd0e1f2010-10-28 00:18:46 +00005451 [(set DPR:$Vd, (v8i8 (int_arm_neon_vtbx1
Jim Grosbachd0b61472011-10-20 14:48:50 +00005452 DPR:$orig, VecListOneD:$Vn, DPR:$Vm)))]>;
Evan Cheng0d92f5f2009-10-01 08:22:27 +00005453let hasExtraSrcRegAllocReq = 1 in {
Bob Wilson114a2662009-08-12 20:51:55 +00005454def VTBX2
Owen Andersoncfd0e1f2010-10-28 00:18:46 +00005455 : N3V<1,1,0b11,0b1001,1,0, (outs DPR:$Vd),
Jim Grosbach60d99a52011-12-15 22:27:11 +00005456 (ins DPR:$orig, VecListTwoD:$Vn, DPR:$Vm), NVTBLFrm, IIC_VTBX2,
5457 "vtbx", "8", "$Vd, $Vn, $Vm", "$orig = $Vd", []>;
Bob Wilson114a2662009-08-12 20:51:55 +00005458def VTBX3
Owen Andersoncfd0e1f2010-10-28 00:18:46 +00005459 : N3V<1,1,0b11,0b1010,1,0, (outs DPR:$Vd),
Jim Grosbach60d99a52011-12-15 22:27:11 +00005460 (ins DPR:$orig, VecListThreeD:$Vn, DPR:$Vm),
Johnny Chen79c4d822010-03-29 01:14:22 +00005461 NVTBLFrm, IIC_VTBX3,
Jim Grosbach60d99a52011-12-15 22:27:11 +00005462 "vtbx", "8", "$Vd, $Vn, $Vm",
Owen Andersoncfd0e1f2010-10-28 00:18:46 +00005463 "$orig = $Vd", []>;
Bob Wilson114a2662009-08-12 20:51:55 +00005464def VTBX4
Jim Grosbach60d99a52011-12-15 22:27:11 +00005465 : N3V<1,1,0b11,0b1011,1,0, (outs DPR:$Vd),
5466 (ins DPR:$orig, VecListFourD:$Vn, DPR:$Vm), NVTBLFrm, IIC_VTBX4,
5467 "vtbx", "8", "$Vd, $Vn, $Vm",
Owen Andersoncfd0e1f2010-10-28 00:18:46 +00005468 "$orig = $Vd", []>;
Evan Cheng0d92f5f2009-10-01 08:22:27 +00005469} // hasExtraSrcRegAllocReq = 1
Bob Wilson114a2662009-08-12 20:51:55 +00005470
Bob Wilsonbd916c52010-09-13 23:55:10 +00005471def VTBX2Pseudo
5472 : PseudoNeonI<(outs DPR:$dst), (ins DPR:$orig, QPR:$tbl, DPR:$src),
Jim Grosbach7cd27292010-10-06 20:36:55 +00005473 IIC_VTBX2, "$orig = $dst", []>;
Bob Wilsonbd916c52010-09-13 23:55:10 +00005474def VTBX3Pseudo
5475 : PseudoNeonI<(outs DPR:$dst), (ins DPR:$orig, QQPR:$tbl, DPR:$src),
Jim Grosbach7cd27292010-10-06 20:36:55 +00005476 IIC_VTBX3, "$orig = $dst", []>;
Bob Wilsonbd916c52010-09-13 23:55:10 +00005477def VTBX4Pseudo
5478 : PseudoNeonI<(outs DPR:$dst), (ins DPR:$orig, QQPR:$tbl, DPR:$src),
Jim Grosbach7cd27292010-10-06 20:36:55 +00005479 IIC_VTBX4, "$orig = $dst", []>;
Owen Anderson8d7d2e12011-08-09 20:55:18 +00005480} // DecoderMethod = "DecodeTBLInstruction"
Bob Wilsonbd916c52010-09-13 23:55:10 +00005481
Bob Wilson5bafff32009-06-22 23:27:02 +00005482//===----------------------------------------------------------------------===//
Evan Cheng1d2426c2009-08-07 19:30:41 +00005483// NEON instructions for single-precision FP math
5484//===----------------------------------------------------------------------===//
5485
Bob Wilson0e6d5402010-12-13 23:02:31 +00005486class N2VSPat<SDNode OpNode, NeonI Inst>
5487 : NEONFPPat<(f32 (OpNode SPR:$a)),
Bob Wilson1e6f5962010-12-13 21:58:05 +00005488 (EXTRACT_SUBREG
Bob Wilson4711d5c2010-12-13 23:02:37 +00005489 (v2f32 (COPY_TO_REGCLASS (Inst
5490 (INSERT_SUBREG
Bob Wilson0e6d5402010-12-13 23:02:31 +00005491 (v2f32 (COPY_TO_REGCLASS (v2f32 (IMPLICIT_DEF)), DPR_VFP2)),
5492 SPR:$a, ssub_0)), DPR_VFP2)), ssub_0)>;
Bob Wilson3c0f96e2010-02-17 22:23:11 +00005493
5494class N3VSPat<SDNode OpNode, NeonI Inst>
5495 : NEONFPPat<(f32 (OpNode SPR:$a, SPR:$b)),
Bob Wilson4711d5c2010-12-13 23:02:37 +00005496 (EXTRACT_SUBREG
5497 (v2f32 (COPY_TO_REGCLASS (Inst
5498 (INSERT_SUBREG
5499 (v2f32 (COPY_TO_REGCLASS (v2f32 (IMPLICIT_DEF)), DPR_VFP2)),
5500 SPR:$a, ssub_0),
5501 (INSERT_SUBREG
5502 (v2f32 (COPY_TO_REGCLASS (v2f32 (IMPLICIT_DEF)), DPR_VFP2)),
5503 SPR:$b, ssub_0)), DPR_VFP2)), ssub_0)>;
Bob Wilson3c0f96e2010-02-17 22:23:11 +00005504
5505class N3VSMulOpPat<SDNode MulNode, SDNode OpNode, NeonI Inst>
5506 : NEONFPPat<(f32 (OpNode SPR:$acc, (f32 (MulNode SPR:$a, SPR:$b)))),
Bob Wilson4711d5c2010-12-13 23:02:37 +00005507 (EXTRACT_SUBREG
5508 (v2f32 (COPY_TO_REGCLASS (Inst
5509 (INSERT_SUBREG
5510 (v2f32 (COPY_TO_REGCLASS (v2f32 (IMPLICIT_DEF)), DPR_VFP2)),
5511 SPR:$acc, ssub_0),
5512 (INSERT_SUBREG
5513 (v2f32 (COPY_TO_REGCLASS (v2f32 (IMPLICIT_DEF)), DPR_VFP2)),
5514 SPR:$a, ssub_0),
5515 (INSERT_SUBREG
5516 (v2f32 (COPY_TO_REGCLASS (v2f32 (IMPLICIT_DEF)), DPR_VFP2)),
5517 SPR:$b, ssub_0)), DPR_VFP2)), ssub_0)>;
Bob Wilson3c0f96e2010-02-17 22:23:11 +00005518
Bob Wilson4711d5c2010-12-13 23:02:37 +00005519def : N3VSPat<fadd, VADDfd>;
5520def : N3VSPat<fsub, VSUBfd>;
5521def : N3VSPat<fmul, VMULfd>;
5522def : N3VSMulOpPat<fmul, fadd, VMLAfd>,
Anton Korobeynikov4b4e6222012-01-22 12:07:33 +00005523 Requires<[HasNEON, UseNEONForFP, UseFPVMLx, NoNEONVFP4]>;
Bob Wilson4711d5c2010-12-13 23:02:37 +00005524def : N3VSMulOpPat<fmul, fsub, VMLSfd>,
Anton Korobeynikov4b4e6222012-01-22 12:07:33 +00005525 Requires<[HasNEON, UseNEONForFP, UseFPVMLx, NoNEONVFP4]>;
5526def : N3VSMulOpPat<fmul, fadd, VFMAfd>,
5527 Requires<[HasNEONVFP4, UseNEONForFP]>;
5528def : N3VSMulOpPat<fmul, fsub, VFMSfd>,
5529 Requires<[HasNEONVFP4, UseNEONForFP]>;
Bob Wilson0e6d5402010-12-13 23:02:31 +00005530def : N2VSPat<fabs, VABSfd>;
Bob Wilson0e6d5402010-12-13 23:02:31 +00005531def : N2VSPat<fneg, VNEGfd>;
Bob Wilson4711d5c2010-12-13 23:02:37 +00005532def : N3VSPat<NEONfmax, VMAXfd>;
5533def : N3VSPat<NEONfmin, VMINfd>;
Bob Wilson0e6d5402010-12-13 23:02:31 +00005534def : N2VSPat<arm_ftosi, VCVTf2sd>;
5535def : N2VSPat<arm_ftoui, VCVTf2ud>;
5536def : N2VSPat<arm_sitof, VCVTs2fd>;
5537def : N2VSPat<arm_uitof, VCVTu2fd>;
David Goodwin338268c2009-08-10 22:17:39 +00005538
Evan Cheng1d2426c2009-08-07 19:30:41 +00005539//===----------------------------------------------------------------------===//
Bob Wilson5bafff32009-06-22 23:27:02 +00005540// Non-Instruction Patterns
5541//===----------------------------------------------------------------------===//
5542
5543// bit_convert
5544def : Pat<(v1i64 (bitconvert (v2i32 DPR:$src))), (v1i64 DPR:$src)>;
5545def : Pat<(v1i64 (bitconvert (v4i16 DPR:$src))), (v1i64 DPR:$src)>;
5546def : Pat<(v1i64 (bitconvert (v8i8 DPR:$src))), (v1i64 DPR:$src)>;
5547def : Pat<(v1i64 (bitconvert (f64 DPR:$src))), (v1i64 DPR:$src)>;
5548def : Pat<(v1i64 (bitconvert (v2f32 DPR:$src))), (v1i64 DPR:$src)>;
5549def : Pat<(v2i32 (bitconvert (v1i64 DPR:$src))), (v2i32 DPR:$src)>;
5550def : Pat<(v2i32 (bitconvert (v4i16 DPR:$src))), (v2i32 DPR:$src)>;
5551def : Pat<(v2i32 (bitconvert (v8i8 DPR:$src))), (v2i32 DPR:$src)>;
5552def : Pat<(v2i32 (bitconvert (f64 DPR:$src))), (v2i32 DPR:$src)>;
5553def : Pat<(v2i32 (bitconvert (v2f32 DPR:$src))), (v2i32 DPR:$src)>;
5554def : Pat<(v4i16 (bitconvert (v1i64 DPR:$src))), (v4i16 DPR:$src)>;
5555def : Pat<(v4i16 (bitconvert (v2i32 DPR:$src))), (v4i16 DPR:$src)>;
5556def : Pat<(v4i16 (bitconvert (v8i8 DPR:$src))), (v4i16 DPR:$src)>;
5557def : Pat<(v4i16 (bitconvert (f64 DPR:$src))), (v4i16 DPR:$src)>;
5558def : Pat<(v4i16 (bitconvert (v2f32 DPR:$src))), (v4i16 DPR:$src)>;
5559def : Pat<(v8i8 (bitconvert (v1i64 DPR:$src))), (v8i8 DPR:$src)>;
5560def : Pat<(v8i8 (bitconvert (v2i32 DPR:$src))), (v8i8 DPR:$src)>;
5561def : Pat<(v8i8 (bitconvert (v4i16 DPR:$src))), (v8i8 DPR:$src)>;
5562def : Pat<(v8i8 (bitconvert (f64 DPR:$src))), (v8i8 DPR:$src)>;
5563def : Pat<(v8i8 (bitconvert (v2f32 DPR:$src))), (v8i8 DPR:$src)>;
5564def : Pat<(f64 (bitconvert (v1i64 DPR:$src))), (f64 DPR:$src)>;
5565def : Pat<(f64 (bitconvert (v2i32 DPR:$src))), (f64 DPR:$src)>;
5566def : Pat<(f64 (bitconvert (v4i16 DPR:$src))), (f64 DPR:$src)>;
5567def : Pat<(f64 (bitconvert (v8i8 DPR:$src))), (f64 DPR:$src)>;
5568def : Pat<(f64 (bitconvert (v2f32 DPR:$src))), (f64 DPR:$src)>;
5569def : Pat<(v2f32 (bitconvert (f64 DPR:$src))), (v2f32 DPR:$src)>;
5570def : Pat<(v2f32 (bitconvert (v1i64 DPR:$src))), (v2f32 DPR:$src)>;
5571def : Pat<(v2f32 (bitconvert (v2i32 DPR:$src))), (v2f32 DPR:$src)>;
5572def : Pat<(v2f32 (bitconvert (v4i16 DPR:$src))), (v2f32 DPR:$src)>;
5573def : Pat<(v2f32 (bitconvert (v8i8 DPR:$src))), (v2f32 DPR:$src)>;
5574
5575def : Pat<(v2i64 (bitconvert (v4i32 QPR:$src))), (v2i64 QPR:$src)>;
5576def : Pat<(v2i64 (bitconvert (v8i16 QPR:$src))), (v2i64 QPR:$src)>;
5577def : Pat<(v2i64 (bitconvert (v16i8 QPR:$src))), (v2i64 QPR:$src)>;
5578def : Pat<(v2i64 (bitconvert (v2f64 QPR:$src))), (v2i64 QPR:$src)>;
5579def : Pat<(v2i64 (bitconvert (v4f32 QPR:$src))), (v2i64 QPR:$src)>;
5580def : Pat<(v4i32 (bitconvert (v2i64 QPR:$src))), (v4i32 QPR:$src)>;
5581def : Pat<(v4i32 (bitconvert (v8i16 QPR:$src))), (v4i32 QPR:$src)>;
5582def : Pat<(v4i32 (bitconvert (v16i8 QPR:$src))), (v4i32 QPR:$src)>;
5583def : Pat<(v4i32 (bitconvert (v2f64 QPR:$src))), (v4i32 QPR:$src)>;
5584def : Pat<(v4i32 (bitconvert (v4f32 QPR:$src))), (v4i32 QPR:$src)>;
5585def : Pat<(v8i16 (bitconvert (v2i64 QPR:$src))), (v8i16 QPR:$src)>;
5586def : Pat<(v8i16 (bitconvert (v4i32 QPR:$src))), (v8i16 QPR:$src)>;
5587def : Pat<(v8i16 (bitconvert (v16i8 QPR:$src))), (v8i16 QPR:$src)>;
5588def : Pat<(v8i16 (bitconvert (v2f64 QPR:$src))), (v8i16 QPR:$src)>;
5589def : Pat<(v8i16 (bitconvert (v4f32 QPR:$src))), (v8i16 QPR:$src)>;
5590def : Pat<(v16i8 (bitconvert (v2i64 QPR:$src))), (v16i8 QPR:$src)>;
5591def : Pat<(v16i8 (bitconvert (v4i32 QPR:$src))), (v16i8 QPR:$src)>;
5592def : Pat<(v16i8 (bitconvert (v8i16 QPR:$src))), (v16i8 QPR:$src)>;
5593def : Pat<(v16i8 (bitconvert (v2f64 QPR:$src))), (v16i8 QPR:$src)>;
5594def : Pat<(v16i8 (bitconvert (v4f32 QPR:$src))), (v16i8 QPR:$src)>;
5595def : Pat<(v4f32 (bitconvert (v2i64 QPR:$src))), (v4f32 QPR:$src)>;
5596def : Pat<(v4f32 (bitconvert (v4i32 QPR:$src))), (v4f32 QPR:$src)>;
5597def : Pat<(v4f32 (bitconvert (v8i16 QPR:$src))), (v4f32 QPR:$src)>;
5598def : Pat<(v4f32 (bitconvert (v16i8 QPR:$src))), (v4f32 QPR:$src)>;
5599def : Pat<(v4f32 (bitconvert (v2f64 QPR:$src))), (v4f32 QPR:$src)>;
5600def : Pat<(v2f64 (bitconvert (v2i64 QPR:$src))), (v2f64 QPR:$src)>;
5601def : Pat<(v2f64 (bitconvert (v4i32 QPR:$src))), (v2f64 QPR:$src)>;
5602def : Pat<(v2f64 (bitconvert (v8i16 QPR:$src))), (v2f64 QPR:$src)>;
5603def : Pat<(v2f64 (bitconvert (v16i8 QPR:$src))), (v2f64 QPR:$src)>;
5604def : Pat<(v2f64 (bitconvert (v4f32 QPR:$src))), (v2f64 QPR:$src)>;
Jim Grosbachef448762011-11-14 23:11:19 +00005605
5606
5607//===----------------------------------------------------------------------===//
5608// Assembler aliases
5609//
Jim Grosbach485d8bf2011-12-13 20:08:32 +00005610
Jim Grosbach21d7fb82011-12-09 23:34:09 +00005611def : VFP2InstAlias<"fmdhr${p} $Dd, $Rn",
5612 (VSETLNi32 DPR:$Dd, GPR:$Rn, 1, pred:$p)>;
5613def : VFP2InstAlias<"fmdlr${p} $Dd, $Rn",
5614 (VSETLNi32 DPR:$Dd, GPR:$Rn, 0, pred:$p)>;
5615
Jim Grosbachef448762011-11-14 23:11:19 +00005616
Jim Grosbachd9004412011-12-07 22:52:54 +00005617// VADD two-operand aliases.
5618def : NEONInstAlias<"vadd${p}.i8 $Vdn, $Vm",
5619 (VADDv16i8 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
5620def : NEONInstAlias<"vadd${p}.i16 $Vdn, $Vm",
5621 (VADDv8i16 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
5622def : NEONInstAlias<"vadd${p}.i32 $Vdn, $Vm",
5623 (VADDv4i32 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
5624def : NEONInstAlias<"vadd${p}.i64 $Vdn, $Vm",
5625 (VADDv2i64 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
5626
5627def : NEONInstAlias<"vadd${p}.i8 $Vdn, $Vm",
5628 (VADDv8i8 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
5629def : NEONInstAlias<"vadd${p}.i16 $Vdn, $Vm",
5630 (VADDv4i16 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
5631def : NEONInstAlias<"vadd${p}.i32 $Vdn, $Vm",
5632 (VADDv2i32 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
5633def : NEONInstAlias<"vadd${p}.i64 $Vdn, $Vm",
5634 (VADDv1i64 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
5635
5636def : NEONInstAlias<"vadd${p}.f32 $Vdn, $Vm",
5637 (VADDfd DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
5638def : NEONInstAlias<"vadd${p}.f32 $Vdn, $Vm",
5639 (VADDfq QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
5640
Jim Grosbach12031342011-12-08 20:56:26 +00005641// VSUB two-operand aliases.
5642def : NEONInstAlias<"vsub${p}.i8 $Vdn, $Vm",
5643 (VSUBv16i8 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
5644def : NEONInstAlias<"vsub${p}.i16 $Vdn, $Vm",
5645 (VSUBv8i16 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
5646def : NEONInstAlias<"vsub${p}.i32 $Vdn, $Vm",
5647 (VSUBv4i32 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
5648def : NEONInstAlias<"vsub${p}.i64 $Vdn, $Vm",
5649 (VSUBv2i64 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
5650
5651def : NEONInstAlias<"vsub${p}.i8 $Vdn, $Vm",
5652 (VSUBv8i8 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
5653def : NEONInstAlias<"vsub${p}.i16 $Vdn, $Vm",
5654 (VSUBv4i16 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
5655def : NEONInstAlias<"vsub${p}.i32 $Vdn, $Vm",
5656 (VSUBv2i32 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
5657def : NEONInstAlias<"vsub${p}.i64 $Vdn, $Vm",
5658 (VSUBv1i64 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
5659
5660def : NEONInstAlias<"vsub${p}.f32 $Vdn, $Vm",
5661 (VSUBfd DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
5662def : NEONInstAlias<"vsub${p}.f32 $Vdn, $Vm",
5663 (VSUBfq QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
5664
Jim Grosbach30a264e2011-12-07 23:01:10 +00005665// VADDW two-operand aliases.
5666def : NEONInstAlias<"vaddw${p}.s8 $Vdn, $Vm",
5667 (VADDWsv8i16 QPR:$Vdn, QPR:$Vdn, DPR:$Vm, pred:$p)>;
5668def : NEONInstAlias<"vaddw${p}.s16 $Vdn, $Vm",
5669 (VADDWsv4i32 QPR:$Vdn, QPR:$Vdn, DPR:$Vm, pred:$p)>;
5670def : NEONInstAlias<"vaddw${p}.s32 $Vdn, $Vm",
5671 (VADDWsv2i64 QPR:$Vdn, QPR:$Vdn, DPR:$Vm, pred:$p)>;
5672def : NEONInstAlias<"vaddw${p}.u8 $Vdn, $Vm",
5673 (VADDWuv8i16 QPR:$Vdn, QPR:$Vdn, DPR:$Vm, pred:$p)>;
5674def : NEONInstAlias<"vaddw${p}.u16 $Vdn, $Vm",
5675 (VADDWuv4i32 QPR:$Vdn, QPR:$Vdn, DPR:$Vm, pred:$p)>;
5676def : NEONInstAlias<"vaddw${p}.u32 $Vdn, $Vm",
5677 (VADDWuv2i64 QPR:$Vdn, QPR:$Vdn, DPR:$Vm, pred:$p)>;
5678
Jim Grosbach43329832011-12-09 21:46:04 +00005679// VAND/VBIC/VEOR/VORR accept but do not require a type suffix.
Jim Grosbach78d13e12012-01-24 17:23:29 +00005680defm : NEONDTAnyInstAlias<"vand${p}", "$Vd, $Vn, $Vm",
Jim Grosbachef448762011-11-14 23:11:19 +00005681 (VANDd DPR:$Vd, DPR:$Vn, DPR:$Vm, pred:$p)>;
Jim Grosbach78d13e12012-01-24 17:23:29 +00005682defm : NEONDTAnyInstAlias<"vand${p}", "$Vd, $Vn, $Vm",
Jim Grosbachef448762011-11-14 23:11:19 +00005683 (VANDq QPR:$Vd, QPR:$Vn, QPR:$Vm, pred:$p)>;
Jim Grosbach78d13e12012-01-24 17:23:29 +00005684defm : NEONDTAnyInstAlias<"vbic${p}", "$Vd, $Vn, $Vm",
Jim Grosbach43329832011-12-09 21:46:04 +00005685 (VBICd DPR:$Vd, DPR:$Vn, DPR:$Vm, pred:$p)>;
Jim Grosbach78d13e12012-01-24 17:23:29 +00005686defm : NEONDTAnyInstAlias<"vbic${p}", "$Vd, $Vn, $Vm",
Jim Grosbach43329832011-12-09 21:46:04 +00005687 (VBICq QPR:$Vd, QPR:$Vn, QPR:$Vm, pred:$p)>;
Jim Grosbach78d13e12012-01-24 17:23:29 +00005688defm : NEONDTAnyInstAlias<"veor${p}", "$Vd, $Vn, $Vm",
Jim Grosbachef448762011-11-14 23:11:19 +00005689 (VEORd DPR:$Vd, DPR:$Vn, DPR:$Vm, pred:$p)>;
Jim Grosbach78d13e12012-01-24 17:23:29 +00005690defm : NEONDTAnyInstAlias<"veor${p}", "$Vd, $Vn, $Vm",
Jim Grosbachef448762011-11-14 23:11:19 +00005691 (VEORq QPR:$Vd, QPR:$Vn, QPR:$Vm, pred:$p)>;
Jim Grosbach78d13e12012-01-24 17:23:29 +00005692defm : NEONDTAnyInstAlias<"vorr${p}", "$Vd, $Vn, $Vm",
Jim Grosbachef448762011-11-14 23:11:19 +00005693 (VORRd DPR:$Vd, DPR:$Vn, DPR:$Vm, pred:$p)>;
Jim Grosbach78d13e12012-01-24 17:23:29 +00005694defm : NEONDTAnyInstAlias<"vorr${p}", "$Vd, $Vn, $Vm",
Jim Grosbachef448762011-11-14 23:11:19 +00005695 (VORRq QPR:$Vd, QPR:$Vn, QPR:$Vm, pred:$p)>;
Jim Grosbach9fa0a742011-12-07 23:08:12 +00005696// ... two-operand aliases
5697def : NEONInstAlias<"vand${p} $Vdn, $Vm",
5698 (VANDd DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
5699def : NEONInstAlias<"vand${p} $Vdn, $Vm",
5700 (VANDq QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
Jim Grosbach43329832011-12-09 21:46:04 +00005701def : NEONInstAlias<"vbic${p} $Vdn, $Vm",
5702 (VBICd DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
5703def : NEONInstAlias<"vbic${p} $Vdn, $Vm",
5704 (VBICq QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
Jim Grosbach9fa0a742011-12-07 23:08:12 +00005705def : NEONInstAlias<"veor${p} $Vdn, $Vm",
5706 (VEORd DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
5707def : NEONInstAlias<"veor${p} $Vdn, $Vm",
5708 (VEORq QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
Jim Grosbach517a0132011-12-08 01:02:26 +00005709def : NEONInstAlias<"vorr${p} $Vdn, $Vm",
Jim Grosbach9fa0a742011-12-07 23:08:12 +00005710 (VORRd DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
Jim Grosbach517a0132011-12-08 01:02:26 +00005711def : NEONInstAlias<"vorr${p} $Vdn, $Vm",
Jim Grosbach9fa0a742011-12-07 23:08:12 +00005712 (VORRq QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
5713
Jim Grosbach78d13e12012-01-24 17:23:29 +00005714defm : NEONDTAnyInstAlias<"vand${p}", "$Vdn, $Vm",
Jim Grosbach9fa0a742011-12-07 23:08:12 +00005715 (VANDd DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
Jim Grosbach78d13e12012-01-24 17:23:29 +00005716defm : NEONDTAnyInstAlias<"vand${p}", "$Vdn, $Vm",
Jim Grosbach9fa0a742011-12-07 23:08:12 +00005717 (VANDq QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
Jim Grosbach78d13e12012-01-24 17:23:29 +00005718defm : NEONDTAnyInstAlias<"veor${p}", "$Vdn, $Vm",
Jim Grosbach9fa0a742011-12-07 23:08:12 +00005719 (VEORd DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
Jim Grosbach78d13e12012-01-24 17:23:29 +00005720defm : NEONDTAnyInstAlias<"veor${p}", "$Vdn, $Vm",
Jim Grosbach9fa0a742011-12-07 23:08:12 +00005721 (VEORq QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
Jim Grosbach78d13e12012-01-24 17:23:29 +00005722defm : NEONDTAnyInstAlias<"vorr${p}", "$Vdn, $Vm",
Jim Grosbach9fa0a742011-12-07 23:08:12 +00005723 (VORRd DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
Jim Grosbach78d13e12012-01-24 17:23:29 +00005724defm : NEONDTAnyInstAlias<"vorr${p}", "$Vdn, $Vm",
Jim Grosbach9fa0a742011-12-07 23:08:12 +00005725 (VORRq QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
Jim Grosbache052b9a2011-11-14 23:32:59 +00005726
Jim Grosbach253ef7a2011-12-05 20:29:59 +00005727// VMUL two-operand aliases.
Jim Grosbach1c2c8a92011-12-08 20:42:35 +00005728def : NEONInstAlias<"vmul${p}.p8 $Qdn, $Qm",
5729 (VMULpq QPR:$Qdn, QPR:$Qdn, QPR:$Qm, pred:$p)>;
5730def : NEONInstAlias<"vmul${p}.i8 $Qdn, $Qm",
5731 (VMULv16i8 QPR:$Qdn, QPR:$Qdn, QPR:$Qm, pred:$p)>;
5732def : NEONInstAlias<"vmul${p}.i16 $Qdn, $Qm",
5733 (VMULv8i16 QPR:$Qdn, QPR:$Qdn, QPR:$Qm, pred:$p)>;
5734def : NEONInstAlias<"vmul${p}.i32 $Qdn, $Qm",
5735 (VMULv4i32 QPR:$Qdn, QPR:$Qdn, QPR:$Qm, pred:$p)>;
5736
5737def : NEONInstAlias<"vmul${p}.p8 $Ddn, $Dm",
5738 (VMULpd DPR:$Ddn, DPR:$Ddn, DPR:$Dm, pred:$p)>;
5739def : NEONInstAlias<"vmul${p}.i8 $Ddn, $Dm",
5740 (VMULv8i8 DPR:$Ddn, DPR:$Ddn, DPR:$Dm, pred:$p)>;
5741def : NEONInstAlias<"vmul${p}.i16 $Ddn, $Dm",
5742 (VMULv4i16 DPR:$Ddn, DPR:$Ddn, DPR:$Dm, pred:$p)>;
5743def : NEONInstAlias<"vmul${p}.i32 $Ddn, $Dm",
5744 (VMULv2i32 DPR:$Ddn, DPR:$Ddn, DPR:$Dm, pred:$p)>;
5745
Jim Grosbach2b8810c2011-12-08 00:59:47 +00005746def : NEONInstAlias<"vmul${p}.f32 $Qdn, $Qm",
5747 (VMULfq QPR:$Qdn, QPR:$Qdn, QPR:$Qm, pred:$p)>;
5748def : NEONInstAlias<"vmul${p}.f32 $Ddn, $Dm",
5749 (VMULfd DPR:$Ddn, DPR:$Ddn, DPR:$Dm, pred:$p)>;
5750
Jim Grosbach253ef7a2011-12-05 20:29:59 +00005751def : NEONInstAlias<"vmul${p}.i16 $Ddn, $Dm$lane",
5752 (VMULslv4i16 DPR:$Ddn, DPR:$Ddn, DPR_8:$Dm,
5753 VectorIndex16:$lane, pred:$p)>;
5754def : NEONInstAlias<"vmul${p}.i16 $Qdn, $Dm$lane",
5755 (VMULslv8i16 QPR:$Qdn, QPR:$Qdn, DPR_8:$Dm,
5756 VectorIndex16:$lane, pred:$p)>;
Jim Grosbach253ef7a2011-12-05 20:29:59 +00005757
5758def : NEONInstAlias<"vmul${p}.i32 $Ddn, $Dm$lane",
5759 (VMULslv2i32 DPR:$Ddn, DPR:$Ddn, DPR_VFP2:$Dm,
5760 VectorIndex32:$lane, pred:$p)>;
5761def : NEONInstAlias<"vmul${p}.i32 $Qdn, $Dm$lane",
5762 (VMULslv4i32 QPR:$Qdn, QPR:$Qdn, DPR_VFP2:$Dm,
5763 VectorIndex32:$lane, pred:$p)>;
Jim Grosbach253ef7a2011-12-05 20:29:59 +00005764
5765def : NEONInstAlias<"vmul${p}.f32 $Ddn, $Dm$lane",
5766 (VMULslfd DPR:$Ddn, DPR:$Ddn, DPR_VFP2:$Dm,
5767 VectorIndex32:$lane, pred:$p)>;
5768def : NEONInstAlias<"vmul${p}.f32 $Qdn, $Dm$lane",
5769 (VMULslfq QPR:$Qdn, QPR:$Qdn, DPR_VFP2:$Dm,
5770 VectorIndex32:$lane, pred:$p)>;
5771
Jim Grosbach9e7b42a2011-12-08 20:49:43 +00005772// VQADD (register) two-operand aliases.
5773def : NEONInstAlias<"vqadd${p}.s8 $Vdn, $Vm",
5774 (VQADDsv8i8 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
5775def : NEONInstAlias<"vqadd${p}.s16 $Vdn, $Vm",
5776 (VQADDsv4i16 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
5777def : NEONInstAlias<"vqadd${p}.s32 $Vdn, $Vm",
5778 (VQADDsv2i32 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
5779def : NEONInstAlias<"vqadd${p}.s64 $Vdn, $Vm",
5780 (VQADDsv1i64 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
5781def : NEONInstAlias<"vqadd${p}.u8 $Vdn, $Vm",
5782 (VQADDuv8i8 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
5783def : NEONInstAlias<"vqadd${p}.u16 $Vdn, $Vm",
5784 (VQADDuv4i16 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
5785def : NEONInstAlias<"vqadd${p}.u32 $Vdn, $Vm",
5786 (VQADDuv2i32 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
5787def : NEONInstAlias<"vqadd${p}.u64 $Vdn, $Vm",
5788 (VQADDuv1i64 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
5789
5790def : NEONInstAlias<"vqadd${p}.s8 $Vdn, $Vm",
5791 (VQADDsv16i8 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
5792def : NEONInstAlias<"vqadd${p}.s16 $Vdn, $Vm",
5793 (VQADDsv8i16 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
5794def : NEONInstAlias<"vqadd${p}.s32 $Vdn, $Vm",
5795 (VQADDsv4i32 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
5796def : NEONInstAlias<"vqadd${p}.s64 $Vdn, $Vm",
5797 (VQADDsv2i64 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
5798def : NEONInstAlias<"vqadd${p}.u8 $Vdn, $Vm",
5799 (VQADDuv16i8 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
5800def : NEONInstAlias<"vqadd${p}.u16 $Vdn, $Vm",
5801 (VQADDuv8i16 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
5802def : NEONInstAlias<"vqadd${p}.u32 $Vdn, $Vm",
5803 (VQADDuv4i32 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
5804def : NEONInstAlias<"vqadd${p}.u64 $Vdn, $Vm",
5805 (VQADDuv2i64 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
5806
Jim Grosbach730fe6c2011-12-08 01:30:04 +00005807// VSHL (immediate) two-operand aliases.
5808def : NEONInstAlias<"vshl${p}.i8 $Vdn, $imm",
5809 (VSHLiv8i8 DPR:$Vdn, DPR:$Vdn, imm0_7:$imm, pred:$p)>;
5810def : NEONInstAlias<"vshl${p}.i16 $Vdn, $imm",
5811 (VSHLiv4i16 DPR:$Vdn, DPR:$Vdn, imm0_15:$imm, pred:$p)>;
5812def : NEONInstAlias<"vshl${p}.i32 $Vdn, $imm",
5813 (VSHLiv2i32 DPR:$Vdn, DPR:$Vdn, imm0_31:$imm, pred:$p)>;
5814def : NEONInstAlias<"vshl${p}.i64 $Vdn, $imm",
5815 (VSHLiv1i64 DPR:$Vdn, DPR:$Vdn, imm0_63:$imm, pred:$p)>;
5816
5817def : NEONInstAlias<"vshl${p}.i8 $Vdn, $imm",
5818 (VSHLiv16i8 QPR:$Vdn, QPR:$Vdn, imm0_7:$imm, pred:$p)>;
5819def : NEONInstAlias<"vshl${p}.i16 $Vdn, $imm",
5820 (VSHLiv8i16 QPR:$Vdn, QPR:$Vdn, imm0_15:$imm, pred:$p)>;
5821def : NEONInstAlias<"vshl${p}.i32 $Vdn, $imm",
5822 (VSHLiv4i32 QPR:$Vdn, QPR:$Vdn, imm0_31:$imm, pred:$p)>;
5823def : NEONInstAlias<"vshl${p}.i64 $Vdn, $imm",
5824 (VSHLiv2i64 QPR:$Vdn, QPR:$Vdn, imm0_63:$imm, pred:$p)>;
5825
Jim Grosbachff4cbb42011-12-08 01:12:35 +00005826// VSHL (register) two-operand aliases.
5827def : NEONInstAlias<"vshl${p}.s8 $Vdn, $Vm",
5828 (VSHLsv8i8 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
5829def : NEONInstAlias<"vshl${p}.s16 $Vdn, $Vm",
5830 (VSHLsv4i16 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
5831def : NEONInstAlias<"vshl${p}.s32 $Vdn, $Vm",
5832 (VSHLsv2i32 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
5833def : NEONInstAlias<"vshl${p}.s64 $Vdn, $Vm",
5834 (VSHLsv1i64 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
5835def : NEONInstAlias<"vshl${p}.u8 $Vdn, $Vm",
5836 (VSHLuv8i8 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
5837def : NEONInstAlias<"vshl${p}.u16 $Vdn, $Vm",
5838 (VSHLuv4i16 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
5839def : NEONInstAlias<"vshl${p}.u32 $Vdn, $Vm",
5840 (VSHLuv2i32 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
5841def : NEONInstAlias<"vshl${p}.u64 $Vdn, $Vm",
5842 (VSHLuv1i64 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
5843
5844def : NEONInstAlias<"vshl${p}.s8 $Vdn, $Vm",
5845 (VSHLsv16i8 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
5846def : NEONInstAlias<"vshl${p}.s16 $Vdn, $Vm",
5847 (VSHLsv8i16 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
5848def : NEONInstAlias<"vshl${p}.s32 $Vdn, $Vm",
5849 (VSHLsv4i32 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
5850def : NEONInstAlias<"vshl${p}.s64 $Vdn, $Vm",
5851 (VSHLsv2i64 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
5852def : NEONInstAlias<"vshl${p}.u8 $Vdn, $Vm",
5853 (VSHLuv16i8 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
5854def : NEONInstAlias<"vshl${p}.u16 $Vdn, $Vm",
5855 (VSHLuv8i16 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
5856def : NEONInstAlias<"vshl${p}.u32 $Vdn, $Vm",
5857 (VSHLuv4i32 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
5858def : NEONInstAlias<"vshl${p}.u64 $Vdn, $Vm",
5859 (VSHLuv2i64 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
5860
Jim Grosbach6b044c22011-12-08 22:06:06 +00005861// VSHL (immediate) two-operand aliases.
5862def : NEONInstAlias<"vshr${p}.s8 $Vdn, $imm",
5863 (VSHRsv8i8 DPR:$Vdn, DPR:$Vdn, shr_imm8:$imm, pred:$p)>;
5864def : NEONInstAlias<"vshr${p}.s16 $Vdn, $imm",
5865 (VSHRsv4i16 DPR:$Vdn, DPR:$Vdn, shr_imm16:$imm, pred:$p)>;
5866def : NEONInstAlias<"vshr${p}.s32 $Vdn, $imm",
5867 (VSHRsv2i32 DPR:$Vdn, DPR:$Vdn, shr_imm32:$imm, pred:$p)>;
5868def : NEONInstAlias<"vshr${p}.s64 $Vdn, $imm",
5869 (VSHRsv1i64 DPR:$Vdn, DPR:$Vdn, shr_imm64:$imm, pred:$p)>;
5870
5871def : NEONInstAlias<"vshr${p}.s8 $Vdn, $imm",
5872 (VSHRsv16i8 QPR:$Vdn, QPR:$Vdn, shr_imm8:$imm, pred:$p)>;
5873def : NEONInstAlias<"vshr${p}.s16 $Vdn, $imm",
5874 (VSHRsv8i16 QPR:$Vdn, QPR:$Vdn, shr_imm16:$imm, pred:$p)>;
5875def : NEONInstAlias<"vshr${p}.s32 $Vdn, $imm",
5876 (VSHRsv4i32 QPR:$Vdn, QPR:$Vdn, shr_imm32:$imm, pred:$p)>;
5877def : NEONInstAlias<"vshr${p}.s64 $Vdn, $imm",
5878 (VSHRsv2i64 QPR:$Vdn, QPR:$Vdn, shr_imm64:$imm, pred:$p)>;
5879
5880def : NEONInstAlias<"vshr${p}.u8 $Vdn, $imm",
5881 (VSHRuv8i8 DPR:$Vdn, DPR:$Vdn, shr_imm8:$imm, pred:$p)>;
5882def : NEONInstAlias<"vshr${p}.u16 $Vdn, $imm",
5883 (VSHRuv4i16 DPR:$Vdn, DPR:$Vdn, shr_imm16:$imm, pred:$p)>;
5884def : NEONInstAlias<"vshr${p}.u32 $Vdn, $imm",
5885 (VSHRuv2i32 DPR:$Vdn, DPR:$Vdn, shr_imm32:$imm, pred:$p)>;
5886def : NEONInstAlias<"vshr${p}.u64 $Vdn, $imm",
5887 (VSHRuv1i64 DPR:$Vdn, DPR:$Vdn, shr_imm64:$imm, pred:$p)>;
5888
5889def : NEONInstAlias<"vshr${p}.u8 $Vdn, $imm",
5890 (VSHRuv16i8 QPR:$Vdn, QPR:$Vdn, shr_imm8:$imm, pred:$p)>;
5891def : NEONInstAlias<"vshr${p}.u16 $Vdn, $imm",
5892 (VSHRuv8i16 QPR:$Vdn, QPR:$Vdn, shr_imm16:$imm, pred:$p)>;
5893def : NEONInstAlias<"vshr${p}.u32 $Vdn, $imm",
5894 (VSHRuv4i32 QPR:$Vdn, QPR:$Vdn, shr_imm32:$imm, pred:$p)>;
5895def : NEONInstAlias<"vshr${p}.u64 $Vdn, $imm",
5896 (VSHRuv2i64 QPR:$Vdn, QPR:$Vdn, shr_imm64:$imm, pred:$p)>;
5897
Jim Grosbach872eedb2011-12-02 22:01:52 +00005898// VLD1 single-lane pseudo-instructions. These need special handling for
5899// the lane index that an InstAlias can't handle, so we use these instead.
Jim Grosbach8b31f952012-01-23 19:39:08 +00005900def VLD1LNdAsm_8 : NEONDataTypeAsmPseudoInst<"vld1${p}", ".8", "$list, $addr",
Jim Grosbach799ca9d2011-12-14 23:35:06 +00005901 (ins VecListOneDByteIndexed:$list, addrmode6:$addr, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00005902def VLD1LNdAsm_16 : NEONDataTypeAsmPseudoInst<"vld1${p}", ".16", "$list, $addr",
Jim Grosbach799ca9d2011-12-14 23:35:06 +00005903 (ins VecListOneDHWordIndexed:$list, addrmode6:$addr, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00005904def VLD1LNdAsm_32 : NEONDataTypeAsmPseudoInst<"vld1${p}", ".32", "$list, $addr",
Jim Grosbach799ca9d2011-12-14 23:35:06 +00005905 (ins VecListOneDWordIndexed:$list, addrmode6:$addr, pred:$p)>;
Jim Grosbach872eedb2011-12-02 22:01:52 +00005906
Jim Grosbach8b31f952012-01-23 19:39:08 +00005907def VLD1LNdWB_fixed_Asm_8 :
5908 NEONDataTypeAsmPseudoInst<"vld1${p}", ".8", "$list, $addr!",
Jim Grosbach799ca9d2011-12-14 23:35:06 +00005909 (ins VecListOneDByteIndexed:$list, addrmode6:$addr, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00005910def VLD1LNdWB_fixed_Asm_16 :
5911 NEONDataTypeAsmPseudoInst<"vld1${p}", ".16", "$list, $addr!",
Jim Grosbach799ca9d2011-12-14 23:35:06 +00005912 (ins VecListOneDHWordIndexed:$list, addrmode6:$addr, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00005913def VLD1LNdWB_fixed_Asm_32 :
5914 NEONDataTypeAsmPseudoInst<"vld1${p}", ".32", "$list, $addr!",
Jim Grosbach799ca9d2011-12-14 23:35:06 +00005915 (ins VecListOneDWordIndexed:$list, addrmode6:$addr, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00005916def VLD1LNdWB_register_Asm_8 :
5917 NEONDataTypeAsmPseudoInst<"vld1${p}", ".8", "$list, $addr, $Rm",
Jim Grosbach872eedb2011-12-02 22:01:52 +00005918 (ins VecListOneDByteIndexed:$list, addrmode6:$addr,
5919 rGPR:$Rm, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00005920def VLD1LNdWB_register_Asm_16 :
5921 NEONDataTypeAsmPseudoInst<"vld1${p}", ".16", "$list, $addr, $Rm",
Jim Grosbach799ca9d2011-12-14 23:35:06 +00005922 (ins VecListOneDHWordIndexed:$list, addrmode6:$addr,
Jim Grosbach872eedb2011-12-02 22:01:52 +00005923 rGPR:$Rm, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00005924def VLD1LNdWB_register_Asm_32 :
5925 NEONDataTypeAsmPseudoInst<"vld1${p}", ".32", "$list, $addr, $Rm",
Jim Grosbach799ca9d2011-12-14 23:35:06 +00005926 (ins VecListOneDWordIndexed:$list, addrmode6:$addr,
Jim Grosbach872eedb2011-12-02 22:01:52 +00005927 rGPR:$Rm, pred:$p)>;
Jim Grosbach84defb52011-12-02 22:34:51 +00005928
5929
5930// VST1 single-lane pseudo-instructions. These need special handling for
5931// the lane index that an InstAlias can't handle, so we use these instead.
Jim Grosbach8b31f952012-01-23 19:39:08 +00005932def VST1LNdAsm_8 : NEONDataTypeAsmPseudoInst<"vst1${p}", ".8", "$list, $addr",
Jim Grosbach799ca9d2011-12-14 23:35:06 +00005933 (ins VecListOneDByteIndexed:$list, addrmode6:$addr, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00005934def VST1LNdAsm_16 : NEONDataTypeAsmPseudoInst<"vst1${p}", ".16", "$list, $addr",
Jim Grosbach799ca9d2011-12-14 23:35:06 +00005935 (ins VecListOneDHWordIndexed:$list, addrmode6:$addr, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00005936def VST1LNdAsm_32 : NEONDataTypeAsmPseudoInst<"vst1${p}", ".32", "$list, $addr",
Jim Grosbach799ca9d2011-12-14 23:35:06 +00005937 (ins VecListOneDWordIndexed:$list, addrmode6:$addr, pred:$p)>;
Jim Grosbach84defb52011-12-02 22:34:51 +00005938
Jim Grosbach8b31f952012-01-23 19:39:08 +00005939def VST1LNdWB_fixed_Asm_8 :
5940 NEONDataTypeAsmPseudoInst<"vst1${p}", ".8", "$list, $addr!",
Jim Grosbach799ca9d2011-12-14 23:35:06 +00005941 (ins VecListOneDByteIndexed:$list, addrmode6:$addr, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00005942def VST1LNdWB_fixed_Asm_16 :
5943 NEONDataTypeAsmPseudoInst<"vst1${p}", ".16", "$list, $addr!",
Jim Grosbach799ca9d2011-12-14 23:35:06 +00005944 (ins VecListOneDHWordIndexed:$list, addrmode6:$addr, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00005945def VST1LNdWB_fixed_Asm_32 :
5946 NEONDataTypeAsmPseudoInst<"vst1${p}", ".32", "$list, $addr!",
Jim Grosbach799ca9d2011-12-14 23:35:06 +00005947 (ins VecListOneDWordIndexed:$list, addrmode6:$addr, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00005948def VST1LNdWB_register_Asm_8 :
5949 NEONDataTypeAsmPseudoInst<"vst1${p}", ".8", "$list, $addr, $Rm",
Jim Grosbach84defb52011-12-02 22:34:51 +00005950 (ins VecListOneDByteIndexed:$list, addrmode6:$addr,
5951 rGPR:$Rm, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00005952def VST1LNdWB_register_Asm_16 :
5953 NEONDataTypeAsmPseudoInst<"vst1${p}", ".16", "$list, $addr, $Rm",
Jim Grosbach799ca9d2011-12-14 23:35:06 +00005954 (ins VecListOneDHWordIndexed:$list, addrmode6:$addr,
Jim Grosbach84defb52011-12-02 22:34:51 +00005955 rGPR:$Rm, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00005956def VST1LNdWB_register_Asm_32 :
5957 NEONDataTypeAsmPseudoInst<"vst1${p}", ".32", "$list, $addr, $Rm",
Jim Grosbach799ca9d2011-12-14 23:35:06 +00005958 (ins VecListOneDWordIndexed:$list, addrmode6:$addr,
Jim Grosbach84defb52011-12-02 22:34:51 +00005959 rGPR:$Rm, pred:$p)>;
Jim Grosbach1ceef1a2011-12-07 01:50:36 +00005960
Jim Grosbach9b1b3902011-12-14 23:25:46 +00005961// VLD2 single-lane pseudo-instructions. These need special handling for
5962// the lane index that an InstAlias can't handle, so we use these instead.
Jim Grosbach8b31f952012-01-23 19:39:08 +00005963def VLD2LNdAsm_8 : NEONDataTypeAsmPseudoInst<"vld2${p}", ".8", "$list, $addr",
Jim Grosbach799ca9d2011-12-14 23:35:06 +00005964 (ins VecListTwoDByteIndexed:$list, addrmode6:$addr, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00005965def VLD2LNdAsm_16 : NEONDataTypeAsmPseudoInst<"vld2${p}", ".16", "$list, $addr",
Jim Grosbach799ca9d2011-12-14 23:35:06 +00005966 (ins VecListTwoDHWordIndexed:$list, addrmode6:$addr, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00005967def VLD2LNdAsm_32 : NEONDataTypeAsmPseudoInst<"vld2${p}", ".32", "$list, $addr",
Jim Grosbach799ca9d2011-12-14 23:35:06 +00005968 (ins VecListTwoDWordIndexed:$list, addrmode6:$addr, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00005969def VLD2LNqAsm_16 : NEONDataTypeAsmPseudoInst<"vld2${p}", ".16", "$list, $addr",
Jim Grosbach95fad1c2011-12-20 19:21:26 +00005970 (ins VecListTwoQHWordIndexed:$list, addrmode6:$addr, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00005971def VLD2LNqAsm_32 : NEONDataTypeAsmPseudoInst<"vld2${p}", ".32", "$list, $addr",
Jim Grosbach95fad1c2011-12-20 19:21:26 +00005972 (ins VecListTwoQWordIndexed:$list, addrmode6:$addr, pred:$p)>;
Jim Grosbach9b1b3902011-12-14 23:25:46 +00005973
Jim Grosbach8b31f952012-01-23 19:39:08 +00005974def VLD2LNdWB_fixed_Asm_8 :
5975 NEONDataTypeAsmPseudoInst<"vld2${p}", ".8", "$list, $addr!",
Jim Grosbach799ca9d2011-12-14 23:35:06 +00005976 (ins VecListTwoDByteIndexed:$list, addrmode6:$addr, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00005977def VLD2LNdWB_fixed_Asm_16 :
5978 NEONDataTypeAsmPseudoInst<"vld2${p}", ".16", "$list, $addr!",
Jim Grosbach799ca9d2011-12-14 23:35:06 +00005979 (ins VecListTwoDHWordIndexed:$list, addrmode6:$addr, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00005980def VLD2LNdWB_fixed_Asm_32 :
5981 NEONDataTypeAsmPseudoInst<"vld2${p}", ".32", "$list, $addr!",
Jim Grosbach799ca9d2011-12-14 23:35:06 +00005982 (ins VecListTwoDWordIndexed:$list, addrmode6:$addr, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00005983def VLD2LNqWB_fixed_Asm_16 :
5984 NEONDataTypeAsmPseudoInst<"vld2${p}", ".16", "$list, $addr!",
Jim Grosbach95fad1c2011-12-20 19:21:26 +00005985 (ins VecListTwoQHWordIndexed:$list, addrmode6:$addr, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00005986def VLD2LNqWB_fixed_Asm_32 :
5987 NEONDataTypeAsmPseudoInst<"vld2${p}", ".32", "$list, $addr!",
Jim Grosbach95fad1c2011-12-20 19:21:26 +00005988 (ins VecListTwoQWordIndexed:$list, addrmode6:$addr, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00005989def VLD2LNdWB_register_Asm_8 :
5990 NEONDataTypeAsmPseudoInst<"vld2${p}", ".8", "$list, $addr, $Rm",
Jim Grosbach9b1b3902011-12-14 23:25:46 +00005991 (ins VecListTwoDByteIndexed:$list, addrmode6:$addr,
5992 rGPR:$Rm, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00005993def VLD2LNdWB_register_Asm_16 :
5994 NEONDataTypeAsmPseudoInst<"vld2${p}", ".16", "$list, $addr, $Rm",
Jim Grosbach799ca9d2011-12-14 23:35:06 +00005995 (ins VecListTwoDHWordIndexed:$list, addrmode6:$addr,
Jim Grosbach9b1b3902011-12-14 23:25:46 +00005996 rGPR:$Rm, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00005997def VLD2LNdWB_register_Asm_32 :
5998 NEONDataTypeAsmPseudoInst<"vld2${p}", ".32", "$list, $addr, $Rm",
Jim Grosbach799ca9d2011-12-14 23:35:06 +00005999 (ins VecListTwoDWordIndexed:$list, addrmode6:$addr,
Jim Grosbach9b1b3902011-12-14 23:25:46 +00006000 rGPR:$Rm, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00006001def VLD2LNqWB_register_Asm_16 :
6002 NEONDataTypeAsmPseudoInst<"vld2${p}", ".16", "$list, $addr, $Rm",
Jim Grosbach95fad1c2011-12-20 19:21:26 +00006003 (ins VecListTwoQHWordIndexed:$list, addrmode6:$addr,
6004 rGPR:$Rm, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00006005def VLD2LNqWB_register_Asm_32 :
6006 NEONDataTypeAsmPseudoInst<"vld2${p}", ".32", "$list, $addr, $Rm",
Jim Grosbach95fad1c2011-12-20 19:21:26 +00006007 (ins VecListTwoQWordIndexed:$list, addrmode6:$addr,
6008 rGPR:$Rm, pred:$p)>;
Jim Grosbach9b1b3902011-12-14 23:25:46 +00006009
6010
6011// VST2 single-lane pseudo-instructions. These need special handling for
6012// the lane index that an InstAlias can't handle, so we use these instead.
Jim Grosbach8b31f952012-01-23 19:39:08 +00006013def VST2LNdAsm_8 : NEONDataTypeAsmPseudoInst<"vst2${p}", ".8", "$list, $addr",
Jim Grosbach799ca9d2011-12-14 23:35:06 +00006014 (ins VecListTwoDByteIndexed:$list, addrmode6:$addr, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00006015def VST2LNdAsm_16 : NEONDataTypeAsmPseudoInst<"vst2${p}", ".16", "$list, $addr",
Jim Grosbach799ca9d2011-12-14 23:35:06 +00006016 (ins VecListTwoDHWordIndexed:$list, addrmode6:$addr, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00006017def VST2LNdAsm_32 : NEONDataTypeAsmPseudoInst<"vst2${p}", ".32", "$list, $addr",
Jim Grosbach799ca9d2011-12-14 23:35:06 +00006018 (ins VecListTwoDWordIndexed:$list, addrmode6:$addr, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00006019def VST2LNqAsm_16 : NEONDataTypeAsmPseudoInst<"vst2${p}", ".16", "$list, $addr",
Jim Grosbach5b484312011-12-20 20:46:29 +00006020 (ins VecListTwoQHWordIndexed:$list, addrmode6:$addr, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00006021def VST2LNqAsm_32 : NEONDataTypeAsmPseudoInst<"vst2${p}", ".32", "$list, $addr",
Jim Grosbach5b484312011-12-20 20:46:29 +00006022 (ins VecListTwoQWordIndexed:$list, addrmode6:$addr, pred:$p)>;
Jim Grosbach9b1b3902011-12-14 23:25:46 +00006023
Jim Grosbach8b31f952012-01-23 19:39:08 +00006024def VST2LNdWB_fixed_Asm_8 :
6025 NEONDataTypeAsmPseudoInst<"vst2${p}", ".8", "$list, $addr!",
Jim Grosbach799ca9d2011-12-14 23:35:06 +00006026 (ins VecListTwoDByteIndexed:$list, addrmode6:$addr, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00006027def VST2LNdWB_fixed_Asm_16 :
6028 NEONDataTypeAsmPseudoInst<"vst2${p}", ".16", "$list, $addr!",
Jim Grosbach799ca9d2011-12-14 23:35:06 +00006029 (ins VecListTwoDHWordIndexed:$list, addrmode6:$addr, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00006030def VST2LNdWB_fixed_Asm_32 :
6031 NEONDataTypeAsmPseudoInst<"vst2${p}", ".32", "$list, $addr!",
Jim Grosbach799ca9d2011-12-14 23:35:06 +00006032 (ins VecListTwoDWordIndexed:$list, addrmode6:$addr, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00006033def VST2LNqWB_fixed_Asm_16 :
6034 NEONDataTypeAsmPseudoInst<"vst2${p}", ".16", "$list, $addr!",
Jim Grosbach5b484312011-12-20 20:46:29 +00006035 (ins VecListTwoQHWordIndexed:$list, addrmode6:$addr, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00006036def VST2LNqWB_fixed_Asm_32 :
6037 NEONDataTypeAsmPseudoInst<"vst2${p}", ".32", "$list, $addr!",
Jim Grosbach5b484312011-12-20 20:46:29 +00006038 (ins VecListTwoQWordIndexed:$list, addrmode6:$addr, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00006039def VST2LNdWB_register_Asm_8 :
6040 NEONDataTypeAsmPseudoInst<"vst2${p}", ".8", "$list, $addr, $Rm",
Jim Grosbach9b1b3902011-12-14 23:25:46 +00006041 (ins VecListTwoDByteIndexed:$list, addrmode6:$addr,
6042 rGPR:$Rm, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00006043def VST2LNdWB_register_Asm_16 :
6044 NEONDataTypeAsmPseudoInst<"vst2${p}", ".16","$list, $addr, $Rm",
Jim Grosbach799ca9d2011-12-14 23:35:06 +00006045 (ins VecListTwoDHWordIndexed:$list, addrmode6:$addr,
Jim Grosbach9b1b3902011-12-14 23:25:46 +00006046 rGPR:$Rm, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00006047def VST2LNdWB_register_Asm_32 :
6048 NEONDataTypeAsmPseudoInst<"vst2${p}", ".32", "$list, $addr, $Rm",
Jim Grosbach799ca9d2011-12-14 23:35:06 +00006049 (ins VecListTwoDWordIndexed:$list, addrmode6:$addr,
Jim Grosbach9b1b3902011-12-14 23:25:46 +00006050 rGPR:$Rm, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00006051def VST2LNqWB_register_Asm_16 :
6052 NEONDataTypeAsmPseudoInst<"vst2${p}", ".16","$list, $addr, $Rm",
Jim Grosbach5b484312011-12-20 20:46:29 +00006053 (ins VecListTwoQHWordIndexed:$list, addrmode6:$addr,
6054 rGPR:$Rm, pred:$p)>;
Jim Grosbach8b31f952012-01-23 19:39:08 +00006055def VST2LNqWB_register_Asm_32 :
6056 NEONDataTypeAsmPseudoInst<"vst2${p}", ".32", "$list, $addr, $Rm",
Jim Grosbach5b484312011-12-20 20:46:29 +00006057 (ins VecListTwoQWordIndexed:$list, addrmode6:$addr,
6058 rGPR:$Rm, pred:$p)>;
Jim Grosbach9b1b3902011-12-14 23:25:46 +00006059
Jim Grosbach5e59f7e2012-01-24 23:47:04 +00006060// VLD3 all-lanes pseudo-instructions. These need special handling for
6061// the lane index that an InstAlias can't handle, so we use these instead.
6062def VLD3DUPdAsm_8 : NEONDataTypeAsmPseudoInst<"vld3${p}", ".8", "$list, $addr",
6063 (ins VecListThreeDAllLanes:$list, addrmode6:$addr, pred:$p)>;
6064def VLD3DUPdAsm_16 : NEONDataTypeAsmPseudoInst<"vld3${p}", ".16", "$list, $addr",
6065 (ins VecListThreeDAllLanes:$list, addrmode6:$addr, pred:$p)>;
6066def VLD3DUPdAsm_32 : NEONDataTypeAsmPseudoInst<"vld3${p}", ".32", "$list, $addr",
6067 (ins VecListThreeDAllLanes:$list, addrmode6:$addr, pred:$p)>;
6068def VLD3DUPqAsm_8 : NEONDataTypeAsmPseudoInst<"vld3${p}", ".8", "$list, $addr",
6069 (ins VecListThreeQAllLanes:$list, addrmode6:$addr, pred:$p)>;
6070def VLD3DUPqAsm_16 : NEONDataTypeAsmPseudoInst<"vld3${p}", ".16", "$list, $addr",
6071 (ins VecListThreeQAllLanes:$list, addrmode6:$addr, pred:$p)>;
6072def VLD3DUPqAsm_32 : NEONDataTypeAsmPseudoInst<"vld3${p}", ".32", "$list, $addr",
6073 (ins VecListThreeQAllLanes:$list, addrmode6:$addr, pred:$p)>;
6074
6075def VLD3DUPdWB_fixed_Asm_8 :
6076 NEONDataTypeAsmPseudoInst<"vld3${p}", ".8", "$list, $addr!",
6077 (ins VecListThreeDAllLanes:$list, addrmode6:$addr, pred:$p)>;
6078def VLD3DUPdWB_fixed_Asm_16 :
6079 NEONDataTypeAsmPseudoInst<"vld3${p}", ".16", "$list, $addr!",
6080 (ins VecListThreeDAllLanes:$list, addrmode6:$addr, pred:$p)>;
6081def VLD3DUPdWB_fixed_Asm_32 :
6082 NEONDataTypeAsmPseudoInst<"vld3${p}", ".32", "$list, $addr!",
6083 (ins VecListThreeDAllLanes:$list, addrmode6:$addr, pred:$p)>;
6084def VLD3DUPqWB_fixed_Asm_8 :
6085 NEONDataTypeAsmPseudoInst<"vld3${p}", ".8", "$list, $addr!",
6086 (ins VecListThreeQAllLanes:$list, addrmode6:$addr, pred:$p)>;
6087def VLD3DUPqWB_fixed_Asm_16 :
6088 NEONDataTypeAsmPseudoInst<"vld3${p}", ".16", "$list, $addr!",
6089 (ins VecListThreeQAllLanes:$list, addrmode6:$addr, pred:$p)>;
6090def VLD3DUPqWB_fixed_Asm_32 :
6091 NEONDataTypeAsmPseudoInst<"vld3${p}", ".32", "$list, $addr!",
6092 (ins VecListThreeQAllLanes:$list, addrmode6:$addr, pred:$p)>;
6093def VLD3DUPdWB_register_Asm_8 :
6094 NEONDataTypeAsmPseudoInst<"vld3${p}", ".8", "$list, $addr, $Rm",
6095 (ins VecListThreeDAllLanes:$list, addrmode6:$addr,
6096 rGPR:$Rm, pred:$p)>;
6097def VLD3DUPdWB_register_Asm_16 :
6098 NEONDataTypeAsmPseudoInst<"vld3${p}", ".16", "$list, $addr, $Rm",
6099 (ins VecListThreeDAllLanes:$list, addrmode6:$addr,
6100 rGPR:$Rm, pred:$p)>;
6101def VLD3DUPdWB_register_Asm_32 :
6102 NEONDataTypeAsmPseudoInst<"vld3${p}", ".32", "$list, $addr, $Rm",
6103 (ins VecListThreeDAllLanes:$list, addrmode6:$addr,
6104 rGPR:$Rm, pred:$p)>;
6105def VLD3DUPqWB_register_Asm_8 :
6106 NEONDataTypeAsmPseudoInst<"vld3${p}", ".8", "$list, $addr, $Rm",
6107 (ins VecListThreeQAllLanes:$list, addrmode6:$addr,
6108 rGPR:$Rm, pred:$p)>;
6109def VLD3DUPqWB_register_Asm_16 :
6110 NEONDataTypeAsmPseudoInst<"vld3${p}", ".16", "$list, $addr, $Rm",
6111 (ins VecListThreeQAllLanes:$list, addrmode6:$addr,
6112 rGPR:$Rm, pred:$p)>;
6113def VLD3DUPqWB_register_Asm_32 :
6114 NEONDataTypeAsmPseudoInst<"vld3${p}", ".32", "$list, $addr, $Rm",
6115 (ins VecListThreeQAllLanes:$list, addrmode6:$addr,
6116 rGPR:$Rm, pred:$p)>;
6117
Jim Grosbach8b31f952012-01-23 19:39:08 +00006118
Jim Grosbach3a678af2012-01-23 21:53:26 +00006119// VLD3 single-lane pseudo-instructions. These need special handling for
6120// the lane index that an InstAlias can't handle, so we use these instead.
6121def VLD3LNdAsm_8 : NEONDataTypeAsmPseudoInst<"vld3${p}", ".8", "$list, $addr",
6122 (ins VecListThreeDByteIndexed:$list, addrmode6:$addr, pred:$p)>;
6123def VLD3LNdAsm_16 : NEONDataTypeAsmPseudoInst<"vld3${p}", ".16", "$list, $addr",
6124 (ins VecListThreeDHWordIndexed:$list, addrmode6:$addr, pred:$p)>;
6125def VLD3LNdAsm_32 : NEONDataTypeAsmPseudoInst<"vld3${p}", ".32", "$list, $addr",
6126 (ins VecListThreeDWordIndexed:$list, addrmode6:$addr, pred:$p)>;
6127def VLD3LNqAsm_16 : NEONDataTypeAsmPseudoInst<"vld3${p}", ".16", "$list, $addr",
6128 (ins VecListThreeQHWordIndexed:$list, addrmode6:$addr, pred:$p)>;
6129def VLD3LNqAsm_32 : NEONDataTypeAsmPseudoInst<"vld3${p}", ".32", "$list, $addr",
6130 (ins VecListThreeQWordIndexed:$list, addrmode6:$addr, pred:$p)>;
6131
6132def VLD3LNdWB_fixed_Asm_8 :
6133 NEONDataTypeAsmPseudoInst<"vld3${p}", ".8", "$list, $addr!",
6134 (ins VecListThreeDByteIndexed:$list, addrmode6:$addr, pred:$p)>;
6135def VLD3LNdWB_fixed_Asm_16 :
6136 NEONDataTypeAsmPseudoInst<"vld3${p}", ".16", "$list, $addr!",
6137 (ins VecListThreeDHWordIndexed:$list, addrmode6:$addr, pred:$p)>;
6138def VLD3LNdWB_fixed_Asm_32 :
6139 NEONDataTypeAsmPseudoInst<"vld3${p}", ".32", "$list, $addr!",
6140 (ins VecListThreeDWordIndexed:$list, addrmode6:$addr, pred:$p)>;
6141def VLD3LNqWB_fixed_Asm_16 :
6142 NEONDataTypeAsmPseudoInst<"vld3${p}", ".16", "$list, $addr!",
6143 (ins VecListThreeQHWordIndexed:$list, addrmode6:$addr, pred:$p)>;
6144def VLD3LNqWB_fixed_Asm_32 :
6145 NEONDataTypeAsmPseudoInst<"vld3${p}", ".32", "$list, $addr!",
6146 (ins VecListThreeQWordIndexed:$list, addrmode6:$addr, pred:$p)>;
6147def VLD3LNdWB_register_Asm_8 :
6148 NEONDataTypeAsmPseudoInst<"vld3${p}", ".8", "$list, $addr, $Rm",
6149 (ins VecListThreeDByteIndexed:$list, addrmode6:$addr,
6150 rGPR:$Rm, pred:$p)>;
6151def VLD3LNdWB_register_Asm_16 :
6152 NEONDataTypeAsmPseudoInst<"vld3${p}", ".16", "$list, $addr, $Rm",
6153 (ins VecListThreeDHWordIndexed:$list, addrmode6:$addr,
6154 rGPR:$Rm, pred:$p)>;
6155def VLD3LNdWB_register_Asm_32 :
6156 NEONDataTypeAsmPseudoInst<"vld3${p}", ".32", "$list, $addr, $Rm",
6157 (ins VecListThreeDWordIndexed:$list, addrmode6:$addr,
6158 rGPR:$Rm, pred:$p)>;
6159def VLD3LNqWB_register_Asm_16 :
6160 NEONDataTypeAsmPseudoInst<"vld3${p}", ".16", "$list, $addr, $Rm",
6161 (ins VecListThreeQHWordIndexed:$list, addrmode6:$addr,
6162 rGPR:$Rm, pred:$p)>;
6163def VLD3LNqWB_register_Asm_32 :
6164 NEONDataTypeAsmPseudoInst<"vld3${p}", ".32", "$list, $addr, $Rm",
6165 (ins VecListThreeQWordIndexed:$list, addrmode6:$addr,
6166 rGPR:$Rm, pred:$p)>;
6167
Jim Grosbach7b426ce2012-01-24 00:12:39 +00006168// VLD3 multiple structure pseudo-instructions. These need special handling for
Jim Grosbachc387fc62012-01-23 23:20:46 +00006169// the vector operands that the normal instructions don't yet model.
6170// FIXME: Remove these when the register classes and instructions are updated.
6171def VLD3dAsm_8 : NEONDataTypeAsmPseudoInst<"vld3${p}", ".8", "$list, $addr",
6172 (ins VecListThreeD:$list, addrmode6:$addr, pred:$p)>;
6173def VLD3dAsm_16 : NEONDataTypeAsmPseudoInst<"vld3${p}", ".16", "$list, $addr",
6174 (ins VecListThreeD:$list, addrmode6:$addr, pred:$p)>;
6175def VLD3dAsm_32 : NEONDataTypeAsmPseudoInst<"vld3${p}", ".32", "$list, $addr",
6176 (ins VecListThreeD:$list, addrmode6:$addr, pred:$p)>;
6177def VLD3qAsm_8 : NEONDataTypeAsmPseudoInst<"vld3${p}", ".8", "$list, $addr",
6178 (ins VecListThreeQ:$list, addrmode6:$addr, pred:$p)>;
6179def VLD3qAsm_16 : NEONDataTypeAsmPseudoInst<"vld3${p}", ".16", "$list, $addr",
6180 (ins VecListThreeQ:$list, addrmode6:$addr, pred:$p)>;
6181def VLD3qAsm_32 : NEONDataTypeAsmPseudoInst<"vld3${p}", ".32", "$list, $addr",
6182 (ins VecListThreeQ:$list, addrmode6:$addr, pred:$p)>;
6183
6184def VLD3dWB_fixed_Asm_8 :
6185 NEONDataTypeAsmPseudoInst<"vld3${p}", ".8", "$list, $addr!",
6186 (ins VecListThreeD:$list, addrmode6:$addr, pred:$p)>;
6187def VLD3dWB_fixed_Asm_16 :
6188 NEONDataTypeAsmPseudoInst<"vld3${p}", ".16", "$list, $addr!",
6189 (ins VecListThreeD:$list, addrmode6:$addr, pred:$p)>;
6190def VLD3dWB_fixed_Asm_32 :
6191 NEONDataTypeAsmPseudoInst<"vld3${p}", ".32", "$list, $addr!",
6192 (ins VecListThreeD:$list, addrmode6:$addr, pred:$p)>;
6193def VLD3qWB_fixed_Asm_8 :
6194 NEONDataTypeAsmPseudoInst<"vld3${p}", ".8", "$list, $addr!",
6195 (ins VecListThreeQ:$list, addrmode6:$addr, pred:$p)>;
6196def VLD3qWB_fixed_Asm_16 :
6197 NEONDataTypeAsmPseudoInst<"vld3${p}", ".16", "$list, $addr!",
6198 (ins VecListThreeQ:$list, addrmode6:$addr, pred:$p)>;
6199def VLD3qWB_fixed_Asm_32 :
6200 NEONDataTypeAsmPseudoInst<"vld3${p}", ".32", "$list, $addr!",
6201 (ins VecListThreeQ:$list, addrmode6:$addr, pred:$p)>;
6202def VLD3dWB_register_Asm_8 :
6203 NEONDataTypeAsmPseudoInst<"vld3${p}", ".8", "$list, $addr, $Rm",
6204 (ins VecListThreeD:$list, addrmode6:$addr,
6205 rGPR:$Rm, pred:$p)>;
6206def VLD3dWB_register_Asm_16 :
6207 NEONDataTypeAsmPseudoInst<"vld3${p}", ".16", "$list, $addr, $Rm",
6208 (ins VecListThreeD:$list, addrmode6:$addr,
6209 rGPR:$Rm, pred:$p)>;
6210def VLD3dWB_register_Asm_32 :
6211 NEONDataTypeAsmPseudoInst<"vld3${p}", ".32", "$list, $addr, $Rm",
6212 (ins VecListThreeD:$list, addrmode6:$addr,
6213 rGPR:$Rm, pred:$p)>;
6214def VLD3qWB_register_Asm_8 :
6215 NEONDataTypeAsmPseudoInst<"vld3${p}", ".8", "$list, $addr, $Rm",
6216 (ins VecListThreeQ:$list, addrmode6:$addr,
6217 rGPR:$Rm, pred:$p)>;
6218def VLD3qWB_register_Asm_16 :
6219 NEONDataTypeAsmPseudoInst<"vld3${p}", ".16", "$list, $addr, $Rm",
6220 (ins VecListThreeQ:$list, addrmode6:$addr,
6221 rGPR:$Rm, pred:$p)>;
6222def VLD3qWB_register_Asm_32 :
6223 NEONDataTypeAsmPseudoInst<"vld3${p}", ".32", "$list, $addr, $Rm",
6224 (ins VecListThreeQ:$list, addrmode6:$addr,
6225 rGPR:$Rm, pred:$p)>;
6226
Jim Grosbach4adb1822012-01-24 00:07:41 +00006227// VST3 single-lane pseudo-instructions. These need special handling for
6228// the lane index that an InstAlias can't handle, so we use these instead.
6229def VST3LNdAsm_8 : NEONDataTypeAsmPseudoInst<"vst3${p}", ".8", "$list, $addr",
6230 (ins VecListThreeDByteIndexed:$list, addrmode6:$addr, pred:$p)>;
6231def VST3LNdAsm_16 : NEONDataTypeAsmPseudoInst<"vst3${p}", ".16", "$list, $addr",
6232 (ins VecListThreeDHWordIndexed:$list, addrmode6:$addr, pred:$p)>;
6233def VST3LNdAsm_32 : NEONDataTypeAsmPseudoInst<"vst3${p}", ".32", "$list, $addr",
6234 (ins VecListThreeDWordIndexed:$list, addrmode6:$addr, pred:$p)>;
6235def VST3LNqAsm_16 : NEONDataTypeAsmPseudoInst<"vst3${p}", ".16", "$list, $addr",
6236 (ins VecListThreeQHWordIndexed:$list, addrmode6:$addr, pred:$p)>;
6237def VST3LNqAsm_32 : NEONDataTypeAsmPseudoInst<"vst3${p}", ".32", "$list, $addr",
6238 (ins VecListThreeQWordIndexed:$list, addrmode6:$addr, pred:$p)>;
6239
6240def VST3LNdWB_fixed_Asm_8 :
6241 NEONDataTypeAsmPseudoInst<"vst3${p}", ".8", "$list, $addr!",
6242 (ins VecListThreeDByteIndexed:$list, addrmode6:$addr, pred:$p)>;
6243def VST3LNdWB_fixed_Asm_16 :
6244 NEONDataTypeAsmPseudoInst<"vst3${p}", ".16", "$list, $addr!",
6245 (ins VecListThreeDHWordIndexed:$list, addrmode6:$addr, pred:$p)>;
6246def VST3LNdWB_fixed_Asm_32 :
6247 NEONDataTypeAsmPseudoInst<"vst3${p}", ".32", "$list, $addr!",
6248 (ins VecListThreeDWordIndexed:$list, addrmode6:$addr, pred:$p)>;
6249def VST3LNqWB_fixed_Asm_16 :
6250 NEONDataTypeAsmPseudoInst<"vst3${p}", ".16", "$list, $addr!",
6251 (ins VecListThreeQHWordIndexed:$list, addrmode6:$addr, pred:$p)>;
6252def VST3LNqWB_fixed_Asm_32 :
6253 NEONDataTypeAsmPseudoInst<"vst3${p}", ".32", "$list, $addr!",
6254 (ins VecListThreeQWordIndexed:$list, addrmode6:$addr, pred:$p)>;
6255def VST3LNdWB_register_Asm_8 :
6256 NEONDataTypeAsmPseudoInst<"vst3${p}", ".8", "$list, $addr, $Rm",
6257 (ins VecListThreeDByteIndexed:$list, addrmode6:$addr,
6258 rGPR:$Rm, pred:$p)>;
6259def VST3LNdWB_register_Asm_16 :
6260 NEONDataTypeAsmPseudoInst<"vst3${p}", ".16", "$list, $addr, $Rm",
6261 (ins VecListThreeDHWordIndexed:$list, addrmode6:$addr,
6262 rGPR:$Rm, pred:$p)>;
6263def VST3LNdWB_register_Asm_32 :
6264 NEONDataTypeAsmPseudoInst<"vst3${p}", ".32", "$list, $addr, $Rm",
6265 (ins VecListThreeDWordIndexed:$list, addrmode6:$addr,
6266 rGPR:$Rm, pred:$p)>;
6267def VST3LNqWB_register_Asm_16 :
6268 NEONDataTypeAsmPseudoInst<"vst3${p}", ".16", "$list, $addr, $Rm",
6269 (ins VecListThreeQHWordIndexed:$list, addrmode6:$addr,
6270 rGPR:$Rm, pred:$p)>;
6271def VST3LNqWB_register_Asm_32 :
6272 NEONDataTypeAsmPseudoInst<"vst3${p}", ".32", "$list, $addr, $Rm",
6273 (ins VecListThreeQWordIndexed:$list, addrmode6:$addr,
6274 rGPR:$Rm, pred:$p)>;
6275
6276
Jim Grosbach7b426ce2012-01-24 00:12:39 +00006277// VST3 multiple structure pseudo-instructions. These need special handling for
Jim Grosbachd7433e22012-01-23 23:45:44 +00006278// the vector operands that the normal instructions don't yet model.
6279// FIXME: Remove these when the register classes and instructions are updated.
6280def VST3dAsm_8 : NEONDataTypeAsmPseudoInst<"vst3${p}", ".8", "$list, $addr",
6281 (ins VecListThreeD:$list, addrmode6:$addr, pred:$p)>;
6282def VST3dAsm_16 : NEONDataTypeAsmPseudoInst<"vst3${p}", ".16", "$list, $addr",
6283 (ins VecListThreeD:$list, addrmode6:$addr, pred:$p)>;
6284def VST3dAsm_32 : NEONDataTypeAsmPseudoInst<"vst3${p}", ".32", "$list, $addr",
6285 (ins VecListThreeD:$list, addrmode6:$addr, pred:$p)>;
6286def VST3qAsm_8 : NEONDataTypeAsmPseudoInst<"vst3${p}", ".8", "$list, $addr",
6287 (ins VecListThreeQ:$list, addrmode6:$addr, pred:$p)>;
6288def VST3qAsm_16 : NEONDataTypeAsmPseudoInst<"vst3${p}", ".16", "$list, $addr",
6289 (ins VecListThreeQ:$list, addrmode6:$addr, pred:$p)>;
6290def VST3qAsm_32 : NEONDataTypeAsmPseudoInst<"vst3${p}", ".32", "$list, $addr",
6291 (ins VecListThreeQ:$list, addrmode6:$addr, pred:$p)>;
6292
6293def VST3dWB_fixed_Asm_8 :
6294 NEONDataTypeAsmPseudoInst<"vst3${p}", ".8", "$list, $addr!",
6295 (ins VecListThreeD:$list, addrmode6:$addr, pred:$p)>;
6296def VST3dWB_fixed_Asm_16 :
6297 NEONDataTypeAsmPseudoInst<"vst3${p}", ".16", "$list, $addr!",
6298 (ins VecListThreeD:$list, addrmode6:$addr, pred:$p)>;
6299def VST3dWB_fixed_Asm_32 :
6300 NEONDataTypeAsmPseudoInst<"vst3${p}", ".32", "$list, $addr!",
6301 (ins VecListThreeD:$list, addrmode6:$addr, pred:$p)>;
6302def VST3qWB_fixed_Asm_8 :
6303 NEONDataTypeAsmPseudoInst<"vst3${p}", ".8", "$list, $addr!",
6304 (ins VecListThreeQ:$list, addrmode6:$addr, pred:$p)>;
6305def VST3qWB_fixed_Asm_16 :
6306 NEONDataTypeAsmPseudoInst<"vst3${p}", ".16", "$list, $addr!",
6307 (ins VecListThreeQ:$list, addrmode6:$addr, pred:$p)>;
6308def VST3qWB_fixed_Asm_32 :
6309 NEONDataTypeAsmPseudoInst<"vst3${p}", ".32", "$list, $addr!",
6310 (ins VecListThreeQ:$list, addrmode6:$addr, pred:$p)>;
6311def VST3dWB_register_Asm_8 :
6312 NEONDataTypeAsmPseudoInst<"vst3${p}", ".8", "$list, $addr, $Rm",
6313 (ins VecListThreeD:$list, addrmode6:$addr,
6314 rGPR:$Rm, pred:$p)>;
6315def VST3dWB_register_Asm_16 :
6316 NEONDataTypeAsmPseudoInst<"vst3${p}", ".16", "$list, $addr, $Rm",
6317 (ins VecListThreeD:$list, addrmode6:$addr,
6318 rGPR:$Rm, pred:$p)>;
6319def VST3dWB_register_Asm_32 :
6320 NEONDataTypeAsmPseudoInst<"vst3${p}", ".32", "$list, $addr, $Rm",
6321 (ins VecListThreeD:$list, addrmode6:$addr,
6322 rGPR:$Rm, pred:$p)>;
6323def VST3qWB_register_Asm_8 :
6324 NEONDataTypeAsmPseudoInst<"vst3${p}", ".8", "$list, $addr, $Rm",
6325 (ins VecListThreeQ:$list, addrmode6:$addr,
6326 rGPR:$Rm, pred:$p)>;
6327def VST3qWB_register_Asm_16 :
6328 NEONDataTypeAsmPseudoInst<"vst3${p}", ".16", "$list, $addr, $Rm",
6329 (ins VecListThreeQ:$list, addrmode6:$addr,
6330 rGPR:$Rm, pred:$p)>;
6331def VST3qWB_register_Asm_32 :
6332 NEONDataTypeAsmPseudoInst<"vst3${p}", ".32", "$list, $addr, $Rm",
6333 (ins VecListThreeQ:$list, addrmode6:$addr,
6334 rGPR:$Rm, pred:$p)>;
6335
Jim Grosbache983a132012-01-24 18:37:25 +00006336// VLD4 single-lane pseudo-instructions. These need special handling for
6337// the lane index that an InstAlias can't handle, so we use these instead.
6338def VLD4LNdAsm_8 : NEONDataTypeAsmPseudoInst<"vld4${p}", ".8", "$list, $addr",
6339 (ins VecListFourDByteIndexed:$list, addrmode6:$addr, pred:$p)>;
6340def VLD4LNdAsm_16 : NEONDataTypeAsmPseudoInst<"vld4${p}", ".16", "$list, $addr",
6341 (ins VecListFourDHWordIndexed:$list, addrmode6:$addr, pred:$p)>;
6342def VLD4LNdAsm_32 : NEONDataTypeAsmPseudoInst<"vld4${p}", ".32", "$list, $addr",
6343 (ins VecListFourDWordIndexed:$list, addrmode6:$addr, pred:$p)>;
6344def VLD4LNqAsm_16 : NEONDataTypeAsmPseudoInst<"vld4${p}", ".16", "$list, $addr",
6345 (ins VecListFourQHWordIndexed:$list, addrmode6:$addr, pred:$p)>;
6346def VLD4LNqAsm_32 : NEONDataTypeAsmPseudoInst<"vld4${p}", ".32", "$list, $addr",
6347 (ins VecListFourQWordIndexed:$list, addrmode6:$addr, pred:$p)>;
6348
6349def VLD4LNdWB_fixed_Asm_8 :
6350 NEONDataTypeAsmPseudoInst<"vld4${p}", ".8", "$list, $addr!",
6351 (ins VecListFourDByteIndexed:$list, addrmode6:$addr, pred:$p)>;
6352def VLD4LNdWB_fixed_Asm_16 :
6353 NEONDataTypeAsmPseudoInst<"vld4${p}", ".16", "$list, $addr!",
6354 (ins VecListFourDHWordIndexed:$list, addrmode6:$addr, pred:$p)>;
6355def VLD4LNdWB_fixed_Asm_32 :
6356 NEONDataTypeAsmPseudoInst<"vld4${p}", ".32", "$list, $addr!",
6357 (ins VecListFourDWordIndexed:$list, addrmode6:$addr, pred:$p)>;
6358def VLD4LNqWB_fixed_Asm_16 :
6359 NEONDataTypeAsmPseudoInst<"vld4${p}", ".16", "$list, $addr!",
6360 (ins VecListFourQHWordIndexed:$list, addrmode6:$addr, pred:$p)>;
6361def VLD4LNqWB_fixed_Asm_32 :
6362 NEONDataTypeAsmPseudoInst<"vld4${p}", ".32", "$list, $addr!",
6363 (ins VecListFourQWordIndexed:$list, addrmode6:$addr, pred:$p)>;
6364def VLD4LNdWB_register_Asm_8 :
6365 NEONDataTypeAsmPseudoInst<"vld4${p}", ".8", "$list, $addr, $Rm",
6366 (ins VecListFourDByteIndexed:$list, addrmode6:$addr,
6367 rGPR:$Rm, pred:$p)>;
6368def VLD4LNdWB_register_Asm_16 :
6369 NEONDataTypeAsmPseudoInst<"vld4${p}", ".16", "$list, $addr, $Rm",
6370 (ins VecListFourDHWordIndexed:$list, addrmode6:$addr,
6371 rGPR:$Rm, pred:$p)>;
6372def VLD4LNdWB_register_Asm_32 :
6373 NEONDataTypeAsmPseudoInst<"vld4${p}", ".32", "$list, $addr, $Rm",
6374 (ins VecListFourDWordIndexed:$list, addrmode6:$addr,
6375 rGPR:$Rm, pred:$p)>;
6376def VLD4LNqWB_register_Asm_16 :
6377 NEONDataTypeAsmPseudoInst<"vld4${p}", ".16", "$list, $addr, $Rm",
6378 (ins VecListFourQHWordIndexed:$list, addrmode6:$addr,
6379 rGPR:$Rm, pred:$p)>;
6380def VLD4LNqWB_register_Asm_32 :
6381 NEONDataTypeAsmPseudoInst<"vld4${p}", ".32", "$list, $addr, $Rm",
6382 (ins VecListFourQWordIndexed:$list, addrmode6:$addr,
6383 rGPR:$Rm, pred:$p)>;
6384
Jim Grosbachc387fc62012-01-23 23:20:46 +00006385
6386
Jim Grosbach8abe7e32012-01-24 00:43:17 +00006387// VLD4 multiple structure pseudo-instructions. These need special handling for
6388// the vector operands that the normal instructions don't yet model.
6389// FIXME: Remove these when the register classes and instructions are updated.
6390def VLD4dAsm_8 : NEONDataTypeAsmPseudoInst<"vld4${p}", ".8", "$list, $addr",
6391 (ins VecListFourD:$list, addrmode6:$addr, pred:$p)>;
6392def VLD4dAsm_16 : NEONDataTypeAsmPseudoInst<"vld4${p}", ".16", "$list, $addr",
6393 (ins VecListFourD:$list, addrmode6:$addr, pred:$p)>;
6394def VLD4dAsm_32 : NEONDataTypeAsmPseudoInst<"vld4${p}", ".32", "$list, $addr",
6395 (ins VecListFourD:$list, addrmode6:$addr, pred:$p)>;
6396def VLD4qAsm_8 : NEONDataTypeAsmPseudoInst<"vld4${p}", ".8", "$list, $addr",
6397 (ins VecListFourQ:$list, addrmode6:$addr, pred:$p)>;
6398def VLD4qAsm_16 : NEONDataTypeAsmPseudoInst<"vld4${p}", ".16", "$list, $addr",
6399 (ins VecListFourQ:$list, addrmode6:$addr, pred:$p)>;
6400def VLD4qAsm_32 : NEONDataTypeAsmPseudoInst<"vld4${p}", ".32", "$list, $addr",
6401 (ins VecListFourQ:$list, addrmode6:$addr, pred:$p)>;
6402
6403def VLD4dWB_fixed_Asm_8 :
6404 NEONDataTypeAsmPseudoInst<"vld4${p}", ".8", "$list, $addr!",
6405 (ins VecListFourD:$list, addrmode6:$addr, pred:$p)>;
6406def VLD4dWB_fixed_Asm_16 :
6407 NEONDataTypeAsmPseudoInst<"vld4${p}", ".16", "$list, $addr!",
6408 (ins VecListFourD:$list, addrmode6:$addr, pred:$p)>;
6409def VLD4dWB_fixed_Asm_32 :
6410 NEONDataTypeAsmPseudoInst<"vld4${p}", ".32", "$list, $addr!",
6411 (ins VecListFourD:$list, addrmode6:$addr, pred:$p)>;
6412def VLD4qWB_fixed_Asm_8 :
6413 NEONDataTypeAsmPseudoInst<"vld4${p}", ".8", "$list, $addr!",
6414 (ins VecListFourQ:$list, addrmode6:$addr, pred:$p)>;
6415def VLD4qWB_fixed_Asm_16 :
6416 NEONDataTypeAsmPseudoInst<"vld4${p}", ".16", "$list, $addr!",
6417 (ins VecListFourQ:$list, addrmode6:$addr, pred:$p)>;
6418def VLD4qWB_fixed_Asm_32 :
6419 NEONDataTypeAsmPseudoInst<"vld4${p}", ".32", "$list, $addr!",
6420 (ins VecListFourQ:$list, addrmode6:$addr, pred:$p)>;
6421def VLD4dWB_register_Asm_8 :
6422 NEONDataTypeAsmPseudoInst<"vld4${p}", ".8", "$list, $addr, $Rm",
6423 (ins VecListFourD:$list, addrmode6:$addr,
6424 rGPR:$Rm, pred:$p)>;
6425def VLD4dWB_register_Asm_16 :
6426 NEONDataTypeAsmPseudoInst<"vld4${p}", ".16", "$list, $addr, $Rm",
6427 (ins VecListFourD:$list, addrmode6:$addr,
6428 rGPR:$Rm, pred:$p)>;
6429def VLD4dWB_register_Asm_32 :
6430 NEONDataTypeAsmPseudoInst<"vld4${p}", ".32", "$list, $addr, $Rm",
6431 (ins VecListFourD:$list, addrmode6:$addr,
6432 rGPR:$Rm, pred:$p)>;
6433def VLD4qWB_register_Asm_8 :
6434 NEONDataTypeAsmPseudoInst<"vld4${p}", ".8", "$list, $addr, $Rm",
6435 (ins VecListFourQ:$list, addrmode6:$addr,
6436 rGPR:$Rm, pred:$p)>;
6437def VLD4qWB_register_Asm_16 :
6438 NEONDataTypeAsmPseudoInst<"vld4${p}", ".16", "$list, $addr, $Rm",
6439 (ins VecListFourQ:$list, addrmode6:$addr,
6440 rGPR:$Rm, pred:$p)>;
6441def VLD4qWB_register_Asm_32 :
6442 NEONDataTypeAsmPseudoInst<"vld4${p}", ".32", "$list, $addr, $Rm",
6443 (ins VecListFourQ:$list, addrmode6:$addr,
6444 rGPR:$Rm, pred:$p)>;
6445
Jim Grosbach88a54de2012-01-24 18:53:13 +00006446// VST4 single-lane pseudo-instructions. These need special handling for
6447// the lane index that an InstAlias can't handle, so we use these instead.
6448def VST4LNdAsm_8 : NEONDataTypeAsmPseudoInst<"vst4${p}", ".8", "$list, $addr",
6449 (ins VecListFourDByteIndexed:$list, addrmode6:$addr, pred:$p)>;
6450def VST4LNdAsm_16 : NEONDataTypeAsmPseudoInst<"vst4${p}", ".16", "$list, $addr",
6451 (ins VecListFourDHWordIndexed:$list, addrmode6:$addr, pred:$p)>;
6452def VST4LNdAsm_32 : NEONDataTypeAsmPseudoInst<"vst4${p}", ".32", "$list, $addr",
6453 (ins VecListFourDWordIndexed:$list, addrmode6:$addr, pred:$p)>;
6454def VST4LNqAsm_16 : NEONDataTypeAsmPseudoInst<"vst4${p}", ".16", "$list, $addr",
6455 (ins VecListFourQHWordIndexed:$list, addrmode6:$addr, pred:$p)>;
6456def VST4LNqAsm_32 : NEONDataTypeAsmPseudoInst<"vst4${p}", ".32", "$list, $addr",
6457 (ins VecListFourQWordIndexed:$list, addrmode6:$addr, pred:$p)>;
6458
6459def VST4LNdWB_fixed_Asm_8 :
6460 NEONDataTypeAsmPseudoInst<"vst4${p}", ".8", "$list, $addr!",
6461 (ins VecListFourDByteIndexed:$list, addrmode6:$addr, pred:$p)>;
6462def VST4LNdWB_fixed_Asm_16 :
6463 NEONDataTypeAsmPseudoInst<"vst4${p}", ".16", "$list, $addr!",
6464 (ins VecListFourDHWordIndexed:$list, addrmode6:$addr, pred:$p)>;
6465def VST4LNdWB_fixed_Asm_32 :
6466 NEONDataTypeAsmPseudoInst<"vst4${p}", ".32", "$list, $addr!",
6467 (ins VecListFourDWordIndexed:$list, addrmode6:$addr, pred:$p)>;
6468def VST4LNqWB_fixed_Asm_16 :
6469 NEONDataTypeAsmPseudoInst<"vst4${p}", ".16", "$list, $addr!",
6470 (ins VecListFourQHWordIndexed:$list, addrmode6:$addr, pred:$p)>;
6471def VST4LNqWB_fixed_Asm_32 :
6472 NEONDataTypeAsmPseudoInst<"vst4${p}", ".32", "$list, $addr!",
6473 (ins VecListFourQWordIndexed:$list, addrmode6:$addr, pred:$p)>;
6474def VST4LNdWB_register_Asm_8 :
6475 NEONDataTypeAsmPseudoInst<"vst4${p}", ".8", "$list, $addr, $Rm",
6476 (ins VecListFourDByteIndexed:$list, addrmode6:$addr,
6477 rGPR:$Rm, pred:$p)>;
6478def VST4LNdWB_register_Asm_16 :
6479 NEONDataTypeAsmPseudoInst<"vst4${p}", ".16", "$list, $addr, $Rm",
6480 (ins VecListFourDHWordIndexed:$list, addrmode6:$addr,
6481 rGPR:$Rm, pred:$p)>;
6482def VST4LNdWB_register_Asm_32 :
6483 NEONDataTypeAsmPseudoInst<"vst4${p}", ".32", "$list, $addr, $Rm",
6484 (ins VecListFourDWordIndexed:$list, addrmode6:$addr,
6485 rGPR:$Rm, pred:$p)>;
6486def VST4LNqWB_register_Asm_16 :
6487 NEONDataTypeAsmPseudoInst<"vst4${p}", ".16", "$list, $addr, $Rm",
6488 (ins VecListFourQHWordIndexed:$list, addrmode6:$addr,
6489 rGPR:$Rm, pred:$p)>;
6490def VST4LNqWB_register_Asm_32 :
6491 NEONDataTypeAsmPseudoInst<"vst4${p}", ".32", "$list, $addr, $Rm",
6492 (ins VecListFourQWordIndexed:$list, addrmode6:$addr,
6493 rGPR:$Rm, pred:$p)>;
6494
Jim Grosbach539aab72012-01-24 00:58:13 +00006495
6496// VST4 multiple structure pseudo-instructions. These need special handling for
6497// the vector operands that the normal instructions don't yet model.
6498// FIXME: Remove these when the register classes and instructions are updated.
6499def VST4dAsm_8 : NEONDataTypeAsmPseudoInst<"vst4${p}", ".8", "$list, $addr",
6500 (ins VecListFourD:$list, addrmode6:$addr, pred:$p)>;
6501def VST4dAsm_16 : NEONDataTypeAsmPseudoInst<"vst4${p}", ".16", "$list, $addr",
6502 (ins VecListFourD:$list, addrmode6:$addr, pred:$p)>;
6503def VST4dAsm_32 : NEONDataTypeAsmPseudoInst<"vst4${p}", ".32", "$list, $addr",
6504 (ins VecListFourD:$list, addrmode6:$addr, pred:$p)>;
6505def VST4qAsm_8 : NEONDataTypeAsmPseudoInst<"vst4${p}", ".8", "$list, $addr",
6506 (ins VecListFourQ:$list, addrmode6:$addr, pred:$p)>;
6507def VST4qAsm_16 : NEONDataTypeAsmPseudoInst<"vst4${p}", ".16", "$list, $addr",
6508 (ins VecListFourQ:$list, addrmode6:$addr, pred:$p)>;
6509def VST4qAsm_32 : NEONDataTypeAsmPseudoInst<"vst4${p}", ".32", "$list, $addr",
6510 (ins VecListFourQ:$list, addrmode6:$addr, pred:$p)>;
6511
6512def VST4dWB_fixed_Asm_8 :
6513 NEONDataTypeAsmPseudoInst<"vst4${p}", ".8", "$list, $addr!",
6514 (ins VecListFourD:$list, addrmode6:$addr, pred:$p)>;
6515def VST4dWB_fixed_Asm_16 :
6516 NEONDataTypeAsmPseudoInst<"vst4${p}", ".16", "$list, $addr!",
6517 (ins VecListFourD:$list, addrmode6:$addr, pred:$p)>;
6518def VST4dWB_fixed_Asm_32 :
6519 NEONDataTypeAsmPseudoInst<"vst4${p}", ".32", "$list, $addr!",
6520 (ins VecListFourD:$list, addrmode6:$addr, pred:$p)>;
6521def VST4qWB_fixed_Asm_8 :
6522 NEONDataTypeAsmPseudoInst<"vst4${p}", ".8", "$list, $addr!",
6523 (ins VecListFourQ:$list, addrmode6:$addr, pred:$p)>;
6524def VST4qWB_fixed_Asm_16 :
6525 NEONDataTypeAsmPseudoInst<"vst4${p}", ".16", "$list, $addr!",
6526 (ins VecListFourQ:$list, addrmode6:$addr, pred:$p)>;
6527def VST4qWB_fixed_Asm_32 :
6528 NEONDataTypeAsmPseudoInst<"vst4${p}", ".32", "$list, $addr!",
6529 (ins VecListFourQ:$list, addrmode6:$addr, pred:$p)>;
6530def VST4dWB_register_Asm_8 :
6531 NEONDataTypeAsmPseudoInst<"vst4${p}", ".8", "$list, $addr, $Rm",
6532 (ins VecListFourD:$list, addrmode6:$addr,
6533 rGPR:$Rm, pred:$p)>;
6534def VST4dWB_register_Asm_16 :
6535 NEONDataTypeAsmPseudoInst<"vst4${p}", ".16", "$list, $addr, $Rm",
6536 (ins VecListFourD:$list, addrmode6:$addr,
6537 rGPR:$Rm, pred:$p)>;
6538def VST4dWB_register_Asm_32 :
6539 NEONDataTypeAsmPseudoInst<"vst4${p}", ".32", "$list, $addr, $Rm",
6540 (ins VecListFourD:$list, addrmode6:$addr,
6541 rGPR:$Rm, pred:$p)>;
6542def VST4qWB_register_Asm_8 :
6543 NEONDataTypeAsmPseudoInst<"vst4${p}", ".8", "$list, $addr, $Rm",
6544 (ins VecListFourQ:$list, addrmode6:$addr,
6545 rGPR:$Rm, pred:$p)>;
6546def VST4qWB_register_Asm_16 :
6547 NEONDataTypeAsmPseudoInst<"vst4${p}", ".16", "$list, $addr, $Rm",
6548 (ins VecListFourQ:$list, addrmode6:$addr,
6549 rGPR:$Rm, pred:$p)>;
6550def VST4qWB_register_Asm_32 :
6551 NEONDataTypeAsmPseudoInst<"vst4${p}", ".32", "$list, $addr, $Rm",
6552 (ins VecListFourQ:$list, addrmode6:$addr,
6553 rGPR:$Rm, pred:$p)>;
6554
Jim Grosbach1ceef1a2011-12-07 01:50:36 +00006555// VMOV takes an optional datatype suffix
Jim Grosbach78d13e12012-01-24 17:23:29 +00006556defm : NEONDTAnyInstAlias<"vmov${p}", "$Vd, $Vm",
Jim Grosbach1ceef1a2011-12-07 01:50:36 +00006557 (VORRd DPR:$Vd, DPR:$Vm, DPR:$Vm, pred:$p)>;
Jim Grosbach78d13e12012-01-24 17:23:29 +00006558defm : NEONDTAnyInstAlias<"vmov${p}", "$Vd, $Vm",
Jim Grosbach1ceef1a2011-12-07 01:50:36 +00006559 (VORRq QPR:$Vd, QPR:$Vm, QPR:$Vm, pred:$p)>;
6560
Jim Grosbach470855b2011-12-07 17:51:15 +00006561// VCLT (register) is an assembler alias for VCGT w/ the operands reversed.
6562// D-register versions.
Jim Grosbacha738da72011-12-15 22:56:33 +00006563def : NEONInstAlias<"vcle${p}.s8 $Dd, $Dn, $Dm",
6564 (VCGEsv8i8 DPR:$Dd, DPR:$Dm, DPR:$Dn, pred:$p)>;
6565def : NEONInstAlias<"vcle${p}.s16 $Dd, $Dn, $Dm",
6566 (VCGEsv4i16 DPR:$Dd, DPR:$Dm, DPR:$Dn, pred:$p)>;
6567def : NEONInstAlias<"vcle${p}.s32 $Dd, $Dn, $Dm",
6568 (VCGEsv2i32 DPR:$Dd, DPR:$Dm, DPR:$Dn, pred:$p)>;
6569def : NEONInstAlias<"vcle${p}.u8 $Dd, $Dn, $Dm",
6570 (VCGEuv8i8 DPR:$Dd, DPR:$Dm, DPR:$Dn, pred:$p)>;
6571def : NEONInstAlias<"vcle${p}.u16 $Dd, $Dn, $Dm",
6572 (VCGEuv4i16 DPR:$Dd, DPR:$Dm, DPR:$Dn, pred:$p)>;
6573def : NEONInstAlias<"vcle${p}.u32 $Dd, $Dn, $Dm",
6574 (VCGEuv2i32 DPR:$Dd, DPR:$Dm, DPR:$Dn, pred:$p)>;
6575def : NEONInstAlias<"vcle${p}.f32 $Dd, $Dn, $Dm",
6576 (VCGEfd DPR:$Dd, DPR:$Dm, DPR:$Dn, pred:$p)>;
6577// Q-register versions.
6578def : NEONInstAlias<"vcle${p}.s8 $Qd, $Qn, $Qm",
6579 (VCGEsv16i8 QPR:$Qd, QPR:$Qm, QPR:$Qn, pred:$p)>;
6580def : NEONInstAlias<"vcle${p}.s16 $Qd, $Qn, $Qm",
6581 (VCGEsv8i16 QPR:$Qd, QPR:$Qm, QPR:$Qn, pred:$p)>;
6582def : NEONInstAlias<"vcle${p}.s32 $Qd, $Qn, $Qm",
6583 (VCGEsv4i32 QPR:$Qd, QPR:$Qm, QPR:$Qn, pred:$p)>;
6584def : NEONInstAlias<"vcle${p}.u8 $Qd, $Qn, $Qm",
6585 (VCGEuv16i8 QPR:$Qd, QPR:$Qm, QPR:$Qn, pred:$p)>;
6586def : NEONInstAlias<"vcle${p}.u16 $Qd, $Qn, $Qm",
6587 (VCGEuv8i16 QPR:$Qd, QPR:$Qm, QPR:$Qn, pred:$p)>;
6588def : NEONInstAlias<"vcle${p}.u32 $Qd, $Qn, $Qm",
6589 (VCGEuv4i32 QPR:$Qd, QPR:$Qm, QPR:$Qn, pred:$p)>;
6590def : NEONInstAlias<"vcle${p}.f32 $Qd, $Qn, $Qm",
6591 (VCGEfq QPR:$Qd, QPR:$Qm, QPR:$Qn, pred:$p)>;
6592
6593// VCLT (register) is an assembler alias for VCGT w/ the operands reversed.
6594// D-register versions.
Jim Grosbach470855b2011-12-07 17:51:15 +00006595def : NEONInstAlias<"vclt${p}.s8 $Dd, $Dn, $Dm",
6596 (VCGTsv8i8 DPR:$Dd, DPR:$Dm, DPR:$Dn, pred:$p)>;
6597def : NEONInstAlias<"vclt${p}.s16 $Dd, $Dn, $Dm",
6598 (VCGTsv4i16 DPR:$Dd, DPR:$Dm, DPR:$Dn, pred:$p)>;
6599def : NEONInstAlias<"vclt${p}.s32 $Dd, $Dn, $Dm",
6600 (VCGTsv2i32 DPR:$Dd, DPR:$Dm, DPR:$Dn, pred:$p)>;
6601def : NEONInstAlias<"vclt${p}.u8 $Dd, $Dn, $Dm",
6602 (VCGTuv8i8 DPR:$Dd, DPR:$Dm, DPR:$Dn, pred:$p)>;
6603def : NEONInstAlias<"vclt${p}.u16 $Dd, $Dn, $Dm",
6604 (VCGTuv4i16 DPR:$Dd, DPR:$Dm, DPR:$Dn, pred:$p)>;
6605def : NEONInstAlias<"vclt${p}.u32 $Dd, $Dn, $Dm",
6606 (VCGTuv2i32 DPR:$Dd, DPR:$Dm, DPR:$Dn, pred:$p)>;
6607def : NEONInstAlias<"vclt${p}.f32 $Dd, $Dn, $Dm",
6608 (VCGTfd DPR:$Dd, DPR:$Dm, DPR:$Dn, pred:$p)>;
6609// Q-register versions.
6610def : NEONInstAlias<"vclt${p}.s8 $Qd, $Qn, $Qm",
6611 (VCGTsv16i8 QPR:$Qd, QPR:$Qm, QPR:$Qn, pred:$p)>;
6612def : NEONInstAlias<"vclt${p}.s16 $Qd, $Qn, $Qm",
6613 (VCGTsv8i16 QPR:$Qd, QPR:$Qm, QPR:$Qn, pred:$p)>;
6614def : NEONInstAlias<"vclt${p}.s32 $Qd, $Qn, $Qm",
6615 (VCGTsv4i32 QPR:$Qd, QPR:$Qm, QPR:$Qn, pred:$p)>;
6616def : NEONInstAlias<"vclt${p}.u8 $Qd, $Qn, $Qm",
6617 (VCGTuv16i8 QPR:$Qd, QPR:$Qm, QPR:$Qn, pred:$p)>;
6618def : NEONInstAlias<"vclt${p}.u16 $Qd, $Qn, $Qm",
6619 (VCGTuv8i16 QPR:$Qd, QPR:$Qm, QPR:$Qn, pred:$p)>;
6620def : NEONInstAlias<"vclt${p}.u32 $Qd, $Qn, $Qm",
6621 (VCGTuv4i32 QPR:$Qd, QPR:$Qm, QPR:$Qn, pred:$p)>;
6622def : NEONInstAlias<"vclt${p}.f32 $Qd, $Qn, $Qm",
6623 (VCGTfq QPR:$Qd, QPR:$Qm, QPR:$Qn, pred:$p)>;
Jim Grosbacha44f2c42011-12-08 00:43:47 +00006624
6625// Two-operand variants for VEXT
6626def : NEONInstAlias<"vext${p}.8 $Vdn, $Vm, $imm",
6627 (VEXTd8 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, imm0_7:$imm, pred:$p)>;
6628def : NEONInstAlias<"vext${p}.16 $Vdn, $Vm, $imm",
6629 (VEXTd16 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, imm0_3:$imm, pred:$p)>;
6630def : NEONInstAlias<"vext${p}.32 $Vdn, $Vm, $imm",
6631 (VEXTd32 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, imm0_1:$imm, pred:$p)>;
6632
6633def : NEONInstAlias<"vext${p}.8 $Vdn, $Vm, $imm",
6634 (VEXTq8 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, imm0_15:$imm, pred:$p)>;
6635def : NEONInstAlias<"vext${p}.16 $Vdn, $Vm, $imm",
6636 (VEXTq16 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, imm0_7:$imm, pred:$p)>;
6637def : NEONInstAlias<"vext${p}.32 $Vdn, $Vm, $imm",
6638 (VEXTq32 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, imm0_3:$imm, pred:$p)>;
6639def : NEONInstAlias<"vext${p}.64 $Vdn, $Vm, $imm",
6640 (VEXTq64 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, imm0_1:$imm, pred:$p)>;
Jim Grosbach485d8bf2011-12-13 20:08:32 +00006641
Jim Grosbach0f293de2011-12-13 20:40:37 +00006642// Two-operand variants for VQDMULH
6643def : NEONInstAlias<"vqdmulh${p}.s16 $Vdn, $Vm",
6644 (VQDMULHv4i16 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
6645def : NEONInstAlias<"vqdmulh${p}.s32 $Vdn, $Vm",
6646 (VQDMULHv2i32 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
6647
6648def : NEONInstAlias<"vqdmulh${p}.s16 $Vdn, $Vm",
6649 (VQDMULHv8i16 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
6650def : NEONInstAlias<"vqdmulh${p}.s32 $Vdn, $Vm",
6651 (VQDMULHv4i32 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
6652
Jim Grosbach61b74b42011-12-19 18:57:38 +00006653// Two-operand variants for VMAX.
6654def : NEONInstAlias<"vmax${p}.s8 $Vdn, $Vm",
6655 (VMAXsv8i8 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
6656def : NEONInstAlias<"vmax${p}.s16 $Vdn, $Vm",
6657 (VMAXsv4i16 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
6658def : NEONInstAlias<"vmax${p}.s32 $Vdn, $Vm",
6659 (VMAXsv2i32 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
6660def : NEONInstAlias<"vmax${p}.u8 $Vdn, $Vm",
6661 (VMAXuv8i8 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
6662def : NEONInstAlias<"vmax${p}.u16 $Vdn, $Vm",
6663 (VMAXuv4i16 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
6664def : NEONInstAlias<"vmax${p}.u32 $Vdn, $Vm",
6665 (VMAXuv2i32 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
6666def : NEONInstAlias<"vmax${p}.f32 $Vdn, $Vm",
6667 (VMAXfd DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
6668
6669def : NEONInstAlias<"vmax${p}.s8 $Vdn, $Vm",
6670 (VMAXsv16i8 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
6671def : NEONInstAlias<"vmax${p}.s16 $Vdn, $Vm",
6672 (VMAXsv8i16 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
6673def : NEONInstAlias<"vmax${p}.s32 $Vdn, $Vm",
6674 (VMAXsv4i32 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
6675def : NEONInstAlias<"vmax${p}.u8 $Vdn, $Vm",
6676 (VMAXuv16i8 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
6677def : NEONInstAlias<"vmax${p}.u16 $Vdn, $Vm",
6678 (VMAXuv8i16 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
6679def : NEONInstAlias<"vmax${p}.u32 $Vdn, $Vm",
6680 (VMAXuv4i32 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
6681def : NEONInstAlias<"vmax${p}.f32 $Vdn, $Vm",
6682 (VMAXfq QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
6683
6684// Two-operand variants for VMIN.
6685def : NEONInstAlias<"vmin${p}.s8 $Vdn, $Vm",
6686 (VMINsv8i8 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
6687def : NEONInstAlias<"vmin${p}.s16 $Vdn, $Vm",
6688 (VMINsv4i16 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
6689def : NEONInstAlias<"vmin${p}.s32 $Vdn, $Vm",
6690 (VMINsv2i32 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
6691def : NEONInstAlias<"vmin${p}.u8 $Vdn, $Vm",
6692 (VMINuv8i8 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
6693def : NEONInstAlias<"vmin${p}.u16 $Vdn, $Vm",
6694 (VMINuv4i16 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
6695def : NEONInstAlias<"vmin${p}.u32 $Vdn, $Vm",
6696 (VMINuv2i32 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
6697def : NEONInstAlias<"vmin${p}.f32 $Vdn, $Vm",
6698 (VMINfd DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
6699
6700def : NEONInstAlias<"vmin${p}.s8 $Vdn, $Vm",
6701 (VMINsv16i8 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
6702def : NEONInstAlias<"vmin${p}.s16 $Vdn, $Vm",
6703 (VMINsv8i16 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
6704def : NEONInstAlias<"vmin${p}.s32 $Vdn, $Vm",
6705 (VMINsv4i32 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
6706def : NEONInstAlias<"vmin${p}.u8 $Vdn, $Vm",
6707 (VMINuv16i8 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
6708def : NEONInstAlias<"vmin${p}.u16 $Vdn, $Vm",
6709 (VMINuv8i16 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
6710def : NEONInstAlias<"vmin${p}.u32 $Vdn, $Vm",
6711 (VMINuv4i32 QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
6712def : NEONInstAlias<"vmin${p}.f32 $Vdn, $Vm",
6713 (VMINfq QPR:$Vdn, QPR:$Vdn, QPR:$Vm, pred:$p)>;
6714
Jim Grosbachd22170e2011-12-19 19:51:03 +00006715// Two-operand variants for VPADD.
6716def : NEONInstAlias<"vpadd${p}.i8 $Vdn, $Vm",
6717 (VPADDi8 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
6718def : NEONInstAlias<"vpadd${p}.i16 $Vdn, $Vm",
6719 (VPADDi16 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
6720def : NEONInstAlias<"vpadd${p}.i32 $Vdn, $Vm",
6721 (VPADDi32 DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
6722def : NEONInstAlias<"vpadd${p}.f32 $Vdn, $Vm",
6723 (VPADDf DPR:$Vdn, DPR:$Vdn, DPR:$Vm, pred:$p)>;
6724
Jim Grosbach1ac20602012-01-24 17:55:36 +00006725// Two-operand variants for VSRA.
6726 // Signed.
6727def : NEONInstAlias<"vsra${p}.s8 $Vdm, $imm",
6728 (VSRAsv8i8 DPR:$Vdm, DPR:$Vdm, shr_imm8:$imm, pred:$p)>;
6729def : NEONInstAlias<"vsra${p}.s16 $Vdm, $imm",
6730 (VSRAsv4i16 DPR:$Vdm, DPR:$Vdm, shr_imm16:$imm, pred:$p)>;
6731def : NEONInstAlias<"vsra${p}.s32 $Vdm, $imm",
6732 (VSRAsv2i32 DPR:$Vdm, DPR:$Vdm, shr_imm32:$imm, pred:$p)>;
6733def : NEONInstAlias<"vsra${p}.s64 $Vdm, $imm",
6734 (VSRAsv1i64 DPR:$Vdm, DPR:$Vdm, shr_imm64:$imm, pred:$p)>;
6735
6736def : NEONInstAlias<"vsra${p}.s8 $Vdm, $imm",
6737 (VSRAsv16i8 QPR:$Vdm, QPR:$Vdm, shr_imm8:$imm, pred:$p)>;
6738def : NEONInstAlias<"vsra${p}.s16 $Vdm, $imm",
6739 (VSRAsv8i16 QPR:$Vdm, QPR:$Vdm, shr_imm16:$imm, pred:$p)>;
6740def : NEONInstAlias<"vsra${p}.s32 $Vdm, $imm",
6741 (VSRAsv4i32 QPR:$Vdm, QPR:$Vdm, shr_imm32:$imm, pred:$p)>;
6742def : NEONInstAlias<"vsra${p}.s64 $Vdm, $imm",
6743 (VSRAsv2i64 QPR:$Vdm, QPR:$Vdm, shr_imm64:$imm, pred:$p)>;
6744
6745 // Unsigned.
6746def : NEONInstAlias<"vsra${p}.u8 $Vdm, $imm",
6747 (VSRAuv8i8 DPR:$Vdm, DPR:$Vdm, shr_imm8:$imm, pred:$p)>;
6748def : NEONInstAlias<"vsra${p}.u16 $Vdm, $imm",
6749 (VSRAuv4i16 DPR:$Vdm, DPR:$Vdm, shr_imm16:$imm, pred:$p)>;
6750def : NEONInstAlias<"vsra${p}.u32 $Vdm, $imm",
6751 (VSRAuv2i32 DPR:$Vdm, DPR:$Vdm, shr_imm32:$imm, pred:$p)>;
6752def : NEONInstAlias<"vsra${p}.u64 $Vdm, $imm",
6753 (VSRAuv1i64 DPR:$Vdm, DPR:$Vdm, shr_imm64:$imm, pred:$p)>;
6754
6755def : NEONInstAlias<"vsra${p}.u8 $Vdm, $imm",
6756 (VSRAuv16i8 QPR:$Vdm, QPR:$Vdm, shr_imm8:$imm, pred:$p)>;
6757def : NEONInstAlias<"vsra${p}.u16 $Vdm, $imm",
6758 (VSRAuv8i16 QPR:$Vdm, QPR:$Vdm, shr_imm16:$imm, pred:$p)>;
6759def : NEONInstAlias<"vsra${p}.u32 $Vdm, $imm",
6760 (VSRAuv4i32 QPR:$Vdm, QPR:$Vdm, shr_imm32:$imm, pred:$p)>;
6761def : NEONInstAlias<"vsra${p}.u64 $Vdm, $imm",
6762 (VSRAuv2i64 QPR:$Vdm, QPR:$Vdm, shr_imm64:$imm, pred:$p)>;
6763
Jim Grosbachd8ee0cc2012-01-24 17:46:58 +00006764// Two-operand variants for VSRI.
6765def : NEONInstAlias<"vsri${p}.8 $Vdm, $imm",
6766 (VSRIv8i8 DPR:$Vdm, DPR:$Vdm, shr_imm8:$imm, pred:$p)>;
6767def : NEONInstAlias<"vsri${p}.16 $Vdm, $imm",
6768 (VSRIv4i16 DPR:$Vdm, DPR:$Vdm, shr_imm16:$imm, pred:$p)>;
6769def : NEONInstAlias<"vsri${p}.32 $Vdm, $imm",
6770 (VSRIv2i32 DPR:$Vdm, DPR:$Vdm, shr_imm32:$imm, pred:$p)>;
6771def : NEONInstAlias<"vsri${p}.64 $Vdm, $imm",
6772 (VSRIv1i64 DPR:$Vdm, DPR:$Vdm, shr_imm64:$imm, pred:$p)>;
6773
6774def : NEONInstAlias<"vsri${p}.8 $Vdm, $imm",
6775 (VSRIv16i8 QPR:$Vdm, QPR:$Vdm, shr_imm8:$imm, pred:$p)>;
6776def : NEONInstAlias<"vsri${p}.16 $Vdm, $imm",
6777 (VSRIv8i16 QPR:$Vdm, QPR:$Vdm, shr_imm16:$imm, pred:$p)>;
6778def : NEONInstAlias<"vsri${p}.32 $Vdm, $imm",
6779 (VSRIv4i32 QPR:$Vdm, QPR:$Vdm, shr_imm32:$imm, pred:$p)>;
6780def : NEONInstAlias<"vsri${p}.64 $Vdm, $imm",
6781 (VSRIv2i64 QPR:$Vdm, QPR:$Vdm, shr_imm64:$imm, pred:$p)>;
6782
Jim Grosbach5e497d32012-01-24 17:49:15 +00006783// Two-operand variants for VSLI.
6784def : NEONInstAlias<"vsli${p}.8 $Vdm, $imm",
6785 (VSLIv8i8 DPR:$Vdm, DPR:$Vdm, shr_imm8:$imm, pred:$p)>;
6786def : NEONInstAlias<"vsli${p}.16 $Vdm, $imm",
6787 (VSLIv4i16 DPR:$Vdm, DPR:$Vdm, shr_imm16:$imm, pred:$p)>;
6788def : NEONInstAlias<"vsli${p}.32 $Vdm, $imm",
6789 (VSLIv2i32 DPR:$Vdm, DPR:$Vdm, shr_imm32:$imm, pred:$p)>;
6790def : NEONInstAlias<"vsli${p}.64 $Vdm, $imm",
6791 (VSLIv1i64 DPR:$Vdm, DPR:$Vdm, shr_imm64:$imm, pred:$p)>;
6792
6793def : NEONInstAlias<"vsli${p}.8 $Vdm, $imm",
6794 (VSLIv16i8 QPR:$Vdm, QPR:$Vdm, shr_imm8:$imm, pred:$p)>;
6795def : NEONInstAlias<"vsli${p}.16 $Vdm, $imm",
6796 (VSLIv8i16 QPR:$Vdm, QPR:$Vdm, shr_imm16:$imm, pred:$p)>;
6797def : NEONInstAlias<"vsli${p}.32 $Vdm, $imm",
6798 (VSLIv4i32 QPR:$Vdm, QPR:$Vdm, shr_imm32:$imm, pred:$p)>;
6799def : NEONInstAlias<"vsli${p}.64 $Vdm, $imm",
6800 (VSLIv2i64 QPR:$Vdm, QPR:$Vdm, shr_imm64:$imm, pred:$p)>;
6801
Jim Grosbach5f669fa2011-12-21 23:09:28 +00006802// VSWP allows, but does not require, a type suffix.
Jim Grosbach78d13e12012-01-24 17:23:29 +00006803defm : NEONDTAnyInstAlias<"vswp${p}", "$Vd, $Vm",
Jim Grosbach5f669fa2011-12-21 23:09:28 +00006804 (VSWPd DPR:$Vd, DPR:$Vm, pred:$p)>;
Jim Grosbach78d13e12012-01-24 17:23:29 +00006805defm : NEONDTAnyInstAlias<"vswp${p}", "$Vd, $Vm",
Jim Grosbach5f669fa2011-12-21 23:09:28 +00006806 (VSWPq QPR:$Vd, QPR:$Vm, pred:$p)>;
6807
Jim Grosbach9b087852011-12-19 23:51:07 +00006808// "vmov Rd, #-imm" can be handled via "vmvn".
6809def : NEONInstAlias<"vmov${p}.i32 $Vd, $imm",
6810 (VMVNv2i32 DPR:$Vd, nImmVMOVI32Neg:$imm, pred:$p)>;
6811def : NEONInstAlias<"vmov${p}.i32 $Vd, $imm",
6812 (VMVNv4i32 QPR:$Vd, nImmVMOVI32Neg:$imm, pred:$p)>;
6813def : NEONInstAlias<"vmvn${p}.i32 $Vd, $imm",
6814 (VMOVv2i32 DPR:$Vd, nImmVMOVI32Neg:$imm, pred:$p)>;
6815def : NEONInstAlias<"vmvn${p}.i32 $Vd, $imm",
6816 (VMOVv4i32 QPR:$Vd, nImmVMOVI32Neg:$imm, pred:$p)>;
6817
Jim Grosbach485d8bf2011-12-13 20:08:32 +00006818// 'gas' compatibility aliases for quad-word instructions. Strictly speaking,
6819// these should restrict to just the Q register variants, but the register
6820// classes are enough to match correctly regardless, so we keep it simple
6821// and just use MnemonicAlias.
6822def : NEONMnemonicAlias<"vbicq", "vbic">;
6823def : NEONMnemonicAlias<"vandq", "vand">;
6824def : NEONMnemonicAlias<"veorq", "veor">;
6825def : NEONMnemonicAlias<"vorrq", "vorr">;
6826
6827def : NEONMnemonicAlias<"vmovq", "vmov">;
6828def : NEONMnemonicAlias<"vmvnq", "vmvn">;
Jim Grosbachddecfe52011-12-16 00:12:22 +00006829// Explicit versions for floating point so that the FPImm variants get
6830// handled early. The parser gets confused otherwise.
6831def : NEONMnemonicAlias<"vmovq.f32", "vmov.f32">;
6832def : NEONMnemonicAlias<"vmovq.f64", "vmov.f64">;
Jim Grosbach485d8bf2011-12-13 20:08:32 +00006833
6834def : NEONMnemonicAlias<"vaddq", "vadd">;
6835def : NEONMnemonicAlias<"vsubq", "vsub">;
6836
6837def : NEONMnemonicAlias<"vminq", "vmin">;
6838def : NEONMnemonicAlias<"vmaxq", "vmax">;
6839
6840def : NEONMnemonicAlias<"vmulq", "vmul">;
6841
6842def : NEONMnemonicAlias<"vabsq", "vabs">;
6843
6844def : NEONMnemonicAlias<"vshlq", "vshl">;
6845def : NEONMnemonicAlias<"vshrq", "vshr">;
6846
6847def : NEONMnemonicAlias<"vcvtq", "vcvt">;
6848
6849def : NEONMnemonicAlias<"vcleq", "vcle">;
6850def : NEONMnemonicAlias<"vceqq", "vceq">;
Jim Grosbach4553fa32011-12-21 23:04:33 +00006851
6852def : NEONMnemonicAlias<"vzipq", "vzip">;
6853def : NEONMnemonicAlias<"vswpq", "vswp">;
Jim Grosbachf7c66fa2011-12-21 23:52:37 +00006854
6855def : NEONMnemonicAlias<"vrecpeq.f32", "vrecpe.f32">;
6856def : NEONMnemonicAlias<"vrecpeq.u32", "vrecpe.u32">;
Jim Grosbach51222d12012-01-20 18:09:51 +00006857
6858
6859// Alias for loading floating point immediates that aren't representable
6860// using the vmov.f32 encoding but the bitpattern is representable using
6861// the .i32 encoding.
6862def : NEONInstAlias<"vmov${p}.f32 $Vd, $imm",
6863 (VMOVv4i32 QPR:$Vd, nImmVMOVI32:$imm, pred:$p)>;
6864def : NEONInstAlias<"vmov${p}.f32 $Vd, $imm",
6865 (VMOVv2i32 DPR:$Vd, nImmVMOVI32:$imm, pred:$p)>;