blob: 977139ff9eed340a9d7b61e1967f59423305532b [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
14//===----------------------------------------------------------------------===//
15// NEON-specific DAG Nodes.
16//===----------------------------------------------------------------------===//
17
18def SDTARMVCMP : SDTypeProfile<1, 2, [SDTCisInt<0>, SDTCisSameAs<1, 2>]>;
Owen Andersonc24cb352010-11-08 23:21:22 +000019def SDTARMVCMPZ : SDTypeProfile<1, 1, []>;
Bob Wilson5bafff32009-06-22 23:27:02 +000020
21def NEONvceq : SDNode<"ARMISD::VCEQ", SDTARMVCMP>;
Owen Andersonc24cb352010-11-08 23:21:22 +000022def NEONvceqz : SDNode<"ARMISD::VCEQZ", SDTARMVCMPZ>;
Bob Wilson5bafff32009-06-22 23:27:02 +000023def NEONvcge : SDNode<"ARMISD::VCGE", SDTARMVCMP>;
Owen Andersonc24cb352010-11-08 23:21:22 +000024def NEONvcgez : SDNode<"ARMISD::VCGEZ", SDTARMVCMPZ>;
25def NEONvclez : SDNode<"ARMISD::VCLEZ", SDTARMVCMPZ>;
Bob Wilson5bafff32009-06-22 23:27:02 +000026def NEONvcgeu : SDNode<"ARMISD::VCGEU", SDTARMVCMP>;
27def NEONvcgt : SDNode<"ARMISD::VCGT", SDTARMVCMP>;
Owen Andersonc24cb352010-11-08 23:21:22 +000028def NEONvcgtz : SDNode<"ARMISD::VCGTZ", SDTARMVCMPZ>;
29def NEONvcltz : SDNode<"ARMISD::VCLTZ", SDTARMVCMPZ>;
Bob Wilson5bafff32009-06-22 23:27:02 +000030def NEONvcgtu : SDNode<"ARMISD::VCGTU", SDTARMVCMP>;
31def NEONvtst : SDNode<"ARMISD::VTST", SDTARMVCMP>;
32
33// Types for vector shift by immediates. The "SHX" version is for long and
34// narrow operations where the source and destination vectors have different
35// types. The "SHINS" version is for shift and insert operations.
36def SDTARMVSH : SDTypeProfile<1, 2, [SDTCisInt<0>, SDTCisSameAs<0, 1>,
37 SDTCisVT<2, i32>]>;
38def SDTARMVSHX : SDTypeProfile<1, 2, [SDTCisInt<0>, SDTCisInt<1>,
39 SDTCisVT<2, i32>]>;
40def SDTARMVSHINS : SDTypeProfile<1, 3, [SDTCisInt<0>, SDTCisSameAs<0, 1>,
41 SDTCisSameAs<0, 2>, SDTCisVT<3, i32>]>;
42
43def NEONvshl : SDNode<"ARMISD::VSHL", SDTARMVSH>;
44def NEONvshrs : SDNode<"ARMISD::VSHRs", SDTARMVSH>;
45def NEONvshru : SDNode<"ARMISD::VSHRu", SDTARMVSH>;
46def NEONvshlls : SDNode<"ARMISD::VSHLLs", SDTARMVSHX>;
47def NEONvshllu : SDNode<"ARMISD::VSHLLu", SDTARMVSHX>;
48def NEONvshlli : SDNode<"ARMISD::VSHLLi", SDTARMVSHX>;
49def NEONvshrn : SDNode<"ARMISD::VSHRN", SDTARMVSHX>;
50
51def NEONvrshrs : SDNode<"ARMISD::VRSHRs", SDTARMVSH>;
52def NEONvrshru : SDNode<"ARMISD::VRSHRu", SDTARMVSH>;
53def NEONvrshrn : SDNode<"ARMISD::VRSHRN", SDTARMVSHX>;
54
55def NEONvqshls : SDNode<"ARMISD::VQSHLs", SDTARMVSH>;
56def NEONvqshlu : SDNode<"ARMISD::VQSHLu", SDTARMVSH>;
57def NEONvqshlsu : SDNode<"ARMISD::VQSHLsu", SDTARMVSH>;
58def NEONvqshrns : SDNode<"ARMISD::VQSHRNs", SDTARMVSHX>;
59def NEONvqshrnu : SDNode<"ARMISD::VQSHRNu", SDTARMVSHX>;
60def NEONvqshrnsu : SDNode<"ARMISD::VQSHRNsu", SDTARMVSHX>;
61
62def NEONvqrshrns : SDNode<"ARMISD::VQRSHRNs", SDTARMVSHX>;
63def NEONvqrshrnu : SDNode<"ARMISD::VQRSHRNu", SDTARMVSHX>;
64def NEONvqrshrnsu : SDNode<"ARMISD::VQRSHRNsu", SDTARMVSHX>;
65
66def NEONvsli : SDNode<"ARMISD::VSLI", SDTARMVSHINS>;
67def NEONvsri : SDNode<"ARMISD::VSRI", SDTARMVSHINS>;
68
69def SDTARMVGETLN : SDTypeProfile<1, 2, [SDTCisVT<0, i32>, SDTCisInt<1>,
70 SDTCisVT<2, i32>]>;
71def NEONvgetlaneu : SDNode<"ARMISD::VGETLANEu", SDTARMVGETLN>;
72def NEONvgetlanes : SDNode<"ARMISD::VGETLANEs", SDTARMVGETLN>;
73
Bob Wilson7e3f0d22010-07-14 06:31:50 +000074def SDTARMVMOVIMM : SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisVT<1, i32>]>;
75def NEONvmovImm : SDNode<"ARMISD::VMOVIMM", SDTARMVMOVIMM>;
76def NEONvmvnImm : SDNode<"ARMISD::VMVNIMM", SDTARMVMOVIMM>;
77
Owen Andersond9668172010-11-03 22:44:51 +000078def SDTARMVORRIMM : SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0, 1>,
79 SDTCisVT<2, i32>]>;
80def NEONvorrImm : SDNode<"ARMISD::VORRIMM", SDTARMVORRIMM>;
Owen Anderson080c0922010-11-05 19:27:46 +000081def NEONvbicImm : SDNode<"ARMISD::VBICIMM", SDTARMVORRIMM>;
Owen Andersond9668172010-11-03 22:44:51 +000082
Cameron Zwarichc0e6d782011-03-30 23:01:21 +000083def NEONvbsl : SDNode<"ARMISD::VBSL",
84 SDTypeProfile<1, 3, [SDTCisVec<0>,
85 SDTCisSameAs<0, 1>,
86 SDTCisSameAs<0, 2>,
87 SDTCisSameAs<0, 3>]>>;
88
Bob Wilsonc1d287b2009-08-14 05:13:08 +000089def NEONvdup : SDNode<"ARMISD::VDUP", SDTypeProfile<1, 1, [SDTCisVec<0>]>>;
90
Bob Wilson0ce37102009-08-14 05:08:32 +000091// VDUPLANE can produce a quad-register result from a double-register source,
92// so the result is not constrained to match the source.
93def NEONvduplane : SDNode<"ARMISD::VDUPLANE",
94 SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisVec<1>,
95 SDTCisVT<2, i32>]>>;
Bob Wilson5bafff32009-06-22 23:27:02 +000096
Bob Wilsonde95c1b82009-08-19 17:03:43 +000097def SDTARMVEXT : SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisSameAs<0, 1>,
98 SDTCisSameAs<0, 2>, SDTCisVT<3, i32>]>;
99def NEONvext : SDNode<"ARMISD::VEXT", SDTARMVEXT>;
100
Bob Wilsond8e17572009-08-12 22:31:50 +0000101def SDTARMVSHUF : SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisSameAs<0, 1>]>;
102def NEONvrev64 : SDNode<"ARMISD::VREV64", SDTARMVSHUF>;
103def NEONvrev32 : SDNode<"ARMISD::VREV32", SDTARMVSHUF>;
104def NEONvrev16 : SDNode<"ARMISD::VREV16", SDTARMVSHUF>;
105
Anton Korobeynikov62e84f12009-08-21 12:40:50 +0000106def SDTARMVSHUF2 : SDTypeProfile<2, 2, [SDTCisVec<0>, SDTCisSameAs<0, 1>,
Bob Wilson9abe19d2010-02-17 00:31:29 +0000107 SDTCisSameAs<0, 2>,
108 SDTCisSameAs<0, 3>]>;
Anton Korobeynikov051cfd62009-08-21 12:41:42 +0000109def NEONzip : SDNode<"ARMISD::VZIP", SDTARMVSHUF2>;
110def NEONuzp : SDNode<"ARMISD::VUZP", SDTARMVSHUF2>;
111def NEONtrn : SDNode<"ARMISD::VTRN", SDTARMVSHUF2>;
Anton Korobeynikov62e84f12009-08-21 12:40:50 +0000112
Bob Wilsond0b69cf2010-09-01 23:50:19 +0000113def SDTARMVMULL : SDTypeProfile<1, 2, [SDTCisInt<0>, SDTCisInt<1>,
114 SDTCisSameAs<1, 2>]>;
115def NEONvmulls : SDNode<"ARMISD::VMULLs", SDTARMVMULL>;
116def NEONvmullu : SDNode<"ARMISD::VMULLu", SDTARMVMULL>;
117
Bob Wilson9f6c4c12010-02-18 06:05:53 +0000118def SDTARMFMAX : SDTypeProfile<1, 2, [SDTCisVT<0, f32>, SDTCisSameAs<0, 1>,
119 SDTCisSameAs<0, 2>]>;
120def NEONfmax : SDNode<"ARMISD::FMAX", SDTARMFMAX>;
121def NEONfmin : SDNode<"ARMISD::FMIN", SDTARMFMAX>;
122
Bob Wilsoncba270d2010-07-13 21:16:48 +0000123def NEONimmAllZerosV: PatLeaf<(NEONvmovImm (i32 timm)), [{
124 ConstantSDNode *ConstVal = cast<ConstantSDNode>(N->getOperand(0));
Daniel Dunbar425f6342010-07-31 21:08:54 +0000125 unsigned EltBits = 0;
Bob Wilsoncba270d2010-07-13 21:16:48 +0000126 uint64_t EltVal = ARM_AM::decodeNEONModImm(ConstVal->getZExtValue(), EltBits);
127 return (EltBits == 32 && EltVal == 0);
128}]>;
129
130def NEONimmAllOnesV: PatLeaf<(NEONvmovImm (i32 timm)), [{
131 ConstantSDNode *ConstVal = cast<ConstantSDNode>(N->getOperand(0));
Daniel Dunbar425f6342010-07-31 21:08:54 +0000132 unsigned EltBits = 0;
Bob Wilsoncba270d2010-07-13 21:16:48 +0000133 uint64_t EltVal = ARM_AM::decodeNEONModImm(ConstVal->getZExtValue(), EltBits);
134 return (EltBits == 8 && EltVal == 0xff);
135}]>;
136
Bob Wilson5bafff32009-06-22 23:27:02 +0000137//===----------------------------------------------------------------------===//
138// NEON operand definitions
139//===----------------------------------------------------------------------===//
140
Bob Wilson1a913ed2010-06-11 21:34:50 +0000141def nModImm : Operand<i32> {
142 let PrintMethod = "printNEONModImmOperand";
Bob Wilson54c78ef2009-11-06 23:33:28 +0000143}
144
Bob Wilson5bafff32009-06-22 23:27:02 +0000145//===----------------------------------------------------------------------===//
146// NEON load / store instructions
147//===----------------------------------------------------------------------===//
148
Bob Wilson9d4ebc02010-09-16 00:31:02 +0000149// Use VLDM to load a Q register as a D register pair.
150// This is a pseudo instruction that is expanded to VLDMD after reg alloc.
Bill Wendling73fe34a2010-11-16 01:16:36 +0000151def VLDMQIA
152 : PseudoVFPLdStM<(outs QPR:$dst), (ins GPR:$Rn),
153 IIC_fpLoad_m, "",
154 [(set QPR:$dst, (v2f64 (load GPR:$Rn)))]>;
Evan Cheng69b9f982010-05-13 01:12:06 +0000155
Bob Wilson9d4ebc02010-09-16 00:31:02 +0000156// Use VSTM to store a Q register as a D register pair.
157// This is a pseudo instruction that is expanded to VSTMD after reg alloc.
Bill Wendling73fe34a2010-11-16 01:16:36 +0000158def VSTMQIA
159 : PseudoVFPLdStM<(outs), (ins QPR:$src, GPR:$Rn),
160 IIC_fpStore_m, "",
161 [(store (v2f64 QPR:$src), GPR:$Rn)]>;
Evan Cheng69b9f982010-05-13 01:12:06 +0000162
Bob Wilsonffde0802010-09-02 16:00:54 +0000163// Classes for VLD* pseudo-instructions with multi-register operands.
164// These are expanded to real instructions after register allocation.
Bob Wilson9d84fb32010-09-14 20:59:49 +0000165class VLDQPseudo<InstrItinClass itin>
166 : PseudoNLdSt<(outs QPR:$dst), (ins addrmode6:$addr), itin, "">;
167class VLDQWBPseudo<InstrItinClass itin>
Bob Wilsonffde0802010-09-02 16:00:54 +0000168 : PseudoNLdSt<(outs QPR:$dst, GPR:$wb),
Bob Wilson9d84fb32010-09-14 20:59:49 +0000169 (ins addrmode6:$addr, am6offset:$offset), itin,
Bob Wilsonffde0802010-09-02 16:00:54 +0000170 "$addr.addr = $wb">;
Bob Wilson9d84fb32010-09-14 20:59:49 +0000171class VLDQQPseudo<InstrItinClass itin>
172 : PseudoNLdSt<(outs QQPR:$dst), (ins addrmode6:$addr), itin, "">;
173class VLDQQWBPseudo<InstrItinClass itin>
Bob Wilsonffde0802010-09-02 16:00:54 +0000174 : PseudoNLdSt<(outs QQPR:$dst, GPR:$wb),
Bob Wilson9d84fb32010-09-14 20:59:49 +0000175 (ins addrmode6:$addr, am6offset:$offset), itin,
Bob Wilsonffde0802010-09-02 16:00:54 +0000176 "$addr.addr = $wb">;
Bob Wilson7de68142011-02-07 17:43:15 +0000177class VLDQQQQPseudo<InstrItinClass itin>
Jim Grosbachf921c0fe2011-06-13 22:54:22 +0000178 : PseudoNLdSt<(outs QQQQPR:$dst), (ins addrmode6:$addr, QQQQPR:$src),itin,"">;
Bob Wilson9d84fb32010-09-14 20:59:49 +0000179class VLDQQQQWBPseudo<InstrItinClass itin>
Bob Wilsonf5721912010-09-03 18:16:02 +0000180 : PseudoNLdSt<(outs QQQQPR:$dst, GPR:$wb),
Bob Wilson9d84fb32010-09-14 20:59:49 +0000181 (ins addrmode6:$addr, am6offset:$offset, QQQQPR:$src), itin,
Bob Wilsonf5721912010-09-03 18:16:02 +0000182 "$addr.addr = $wb, $src = $dst">;
Bob Wilsonffde0802010-09-02 16:00:54 +0000183
Bob Wilson2a0e9742010-11-27 06:35:16 +0000184let mayLoad = 1, neverHasSideEffects = 1, hasExtraDefRegAllocReq = 1 in {
185
Bob Wilson205a5ca2009-07-08 18:11:30 +0000186// VLD1 : Vector Load (multiple single elements)
Bob Wilson621f1952010-03-23 05:25:43 +0000187class VLD1D<bits<4> op7_4, string Dt>
Owen Andersond9aa7d32010-11-02 00:05:05 +0000188 : NLdSt<0,0b10,0b0111,op7_4, (outs DPR:$Vd),
Owen Andersonf431eda2010-11-02 23:47:29 +0000189 (ins addrmode6:$Rn), IIC_VLD1,
190 "vld1", Dt, "\\{$Vd\\}, $Rn", "", []> {
191 let Rm = 0b1111;
192 let Inst{4} = Rn{4};
Owen Andersond9aa7d32010-11-02 00:05:05 +0000193}
Bob Wilson621f1952010-03-23 05:25:43 +0000194class VLD1Q<bits<4> op7_4, string Dt>
Owen Andersond9aa7d32010-11-02 00:05:05 +0000195 : NLdSt<0,0b10,0b1010,op7_4, (outs DPR:$Vd, DPR:$dst2),
Owen Andersonf431eda2010-11-02 23:47:29 +0000196 (ins addrmode6:$Rn), IIC_VLD1x2,
197 "vld1", Dt, "\\{$Vd, $dst2\\}, $Rn", "", []> {
198 let Rm = 0b1111;
199 let Inst{5-4} = Rn{5-4};
Owen Andersond9aa7d32010-11-02 00:05:05 +0000200}
Bob Wilson205a5ca2009-07-08 18:11:30 +0000201
Owen Andersond9aa7d32010-11-02 00:05:05 +0000202def VLD1d8 : VLD1D<{0,0,0,?}, "8">;
203def VLD1d16 : VLD1D<{0,1,0,?}, "16">;
204def VLD1d32 : VLD1D<{1,0,0,?}, "32">;
205def VLD1d64 : VLD1D<{1,1,0,?}, "64">;
Bob Wilson205a5ca2009-07-08 18:11:30 +0000206
Owen Andersond9aa7d32010-11-02 00:05:05 +0000207def VLD1q8 : VLD1Q<{0,0,?,?}, "8">;
208def VLD1q16 : VLD1Q<{0,1,?,?}, "16">;
209def VLD1q32 : VLD1Q<{1,0,?,?}, "32">;
210def VLD1q64 : VLD1Q<{1,1,?,?}, "64">;
Bob Wilson99493b22010-03-20 17:59:03 +0000211
Evan Chengd2ca8132010-10-09 01:03:04 +0000212def VLD1q8Pseudo : VLDQPseudo<IIC_VLD1x2>;
213def VLD1q16Pseudo : VLDQPseudo<IIC_VLD1x2>;
214def VLD1q32Pseudo : VLDQPseudo<IIC_VLD1x2>;
215def VLD1q64Pseudo : VLDQPseudo<IIC_VLD1x2>;
Bob Wilsonffde0802010-09-02 16:00:54 +0000216
Bob Wilson99493b22010-03-20 17:59:03 +0000217// ...with address register writeback:
218class VLD1DWB<bits<4> op7_4, string Dt>
Owen Andersone85bd772010-11-02 00:24:52 +0000219 : NLdSt<0,0b10,0b0111,op7_4, (outs DPR:$Vd, GPR:$wb),
Owen Andersonf431eda2010-11-02 23:47:29 +0000220 (ins addrmode6:$Rn, am6offset:$Rm), IIC_VLD1u,
221 "vld1", Dt, "\\{$Vd\\}, $Rn$Rm",
222 "$Rn.addr = $wb", []> {
Jim Grosbach1251e1a2010-11-18 01:39:50 +0000223 let Inst{4} = Rn{4};
Owen Andersone85bd772010-11-02 00:24:52 +0000224}
Bob Wilson99493b22010-03-20 17:59:03 +0000225class VLD1QWB<bits<4> op7_4, string Dt>
Owen Andersone85bd772010-11-02 00:24:52 +0000226 : NLdSt<0,0b10,0b1010,op7_4, (outs DPR:$Vd, DPR:$dst2, GPR:$wb),
Owen Andersonf431eda2010-11-02 23:47:29 +0000227 (ins addrmode6:$Rn, am6offset:$Rm), IIC_VLD1x2u,
228 "vld1", Dt, "\\{$Vd, $dst2\\}, $Rn$Rm",
229 "$Rn.addr = $wb", []> {
230 let Inst{5-4} = Rn{5-4};
Owen Andersone85bd772010-11-02 00:24:52 +0000231}
Bob Wilson99493b22010-03-20 17:59:03 +0000232
Owen Andersone85bd772010-11-02 00:24:52 +0000233def VLD1d8_UPD : VLD1DWB<{0,0,0,?}, "8">;
234def VLD1d16_UPD : VLD1DWB<{0,1,0,?}, "16">;
235def VLD1d32_UPD : VLD1DWB<{1,0,0,?}, "32">;
236def VLD1d64_UPD : VLD1DWB<{1,1,0,?}, "64">;
Bob Wilson99493b22010-03-20 17:59:03 +0000237
Owen Andersone85bd772010-11-02 00:24:52 +0000238def VLD1q8_UPD : VLD1QWB<{0,0,?,?}, "8">;
239def VLD1q16_UPD : VLD1QWB<{0,1,?,?}, "16">;
240def VLD1q32_UPD : VLD1QWB<{1,0,?,?}, "32">;
241def VLD1q64_UPD : VLD1QWB<{1,1,?,?}, "64">;
Bob Wilson99493b22010-03-20 17:59:03 +0000242
Evan Chengd2ca8132010-10-09 01:03:04 +0000243def VLD1q8Pseudo_UPD : VLDQWBPseudo<IIC_VLD1x2u>;
244def VLD1q16Pseudo_UPD : VLDQWBPseudo<IIC_VLD1x2u>;
245def VLD1q32Pseudo_UPD : VLDQWBPseudo<IIC_VLD1x2u>;
246def VLD1q64Pseudo_UPD : VLDQWBPseudo<IIC_VLD1x2u>;
Bob Wilsonffde0802010-09-02 16:00:54 +0000247
Bob Wilson052ba452010-03-22 18:22:06 +0000248// ...with 3 registers (some of these are only for the disassembler):
Bob Wilson95808322010-03-18 20:18:39 +0000249class VLD1D3<bits<4> op7_4, string Dt>
Owen Andersone85bd772010-11-02 00:24:52 +0000250 : NLdSt<0,0b10,0b0110,op7_4, (outs DPR:$Vd, DPR:$dst2, DPR:$dst3),
Owen Andersonf431eda2010-11-02 23:47:29 +0000251 (ins addrmode6:$Rn), IIC_VLD1x3, "vld1", Dt,
252 "\\{$Vd, $dst2, $dst3\\}, $Rn", "", []> {
253 let Rm = 0b1111;
254 let Inst{4} = Rn{4};
Owen Andersone85bd772010-11-02 00:24:52 +0000255}
Bob Wilson99493b22010-03-20 17:59:03 +0000256class VLD1D3WB<bits<4> op7_4, string Dt>
Owen Andersone85bd772010-11-02 00:24:52 +0000257 : NLdSt<0,0b10,0b0110,op7_4, (outs DPR:$Vd, DPR:$dst2, DPR:$dst3, GPR:$wb),
Owen Andersonf431eda2010-11-02 23:47:29 +0000258 (ins addrmode6:$Rn, am6offset:$Rm), IIC_VLD1x3u, "vld1", Dt,
259 "\\{$Vd, $dst2, $dst3\\}, $Rn$Rm", "$Rn.addr = $wb", []> {
260 let Inst{4} = Rn{4};
Owen Andersone85bd772010-11-02 00:24:52 +0000261}
Bob Wilson052ba452010-03-22 18:22:06 +0000262
Owen Andersone85bd772010-11-02 00:24:52 +0000263def VLD1d8T : VLD1D3<{0,0,0,?}, "8">;
264def VLD1d16T : VLD1D3<{0,1,0,?}, "16">;
265def VLD1d32T : VLD1D3<{1,0,0,?}, "32">;
266def VLD1d64T : VLD1D3<{1,1,0,?}, "64">;
Bob Wilson052ba452010-03-22 18:22:06 +0000267
Owen Andersone85bd772010-11-02 00:24:52 +0000268def VLD1d8T_UPD : VLD1D3WB<{0,0,0,?}, "8">;
269def VLD1d16T_UPD : VLD1D3WB<{0,1,0,?}, "16">;
270def VLD1d32T_UPD : VLD1D3WB<{1,0,0,?}, "32">;
271def VLD1d64T_UPD : VLD1D3WB<{1,1,0,?}, "64">;
Bob Wilson052ba452010-03-22 18:22:06 +0000272
Evan Chengd2ca8132010-10-09 01:03:04 +0000273def VLD1d64TPseudo : VLDQQPseudo<IIC_VLD1x3>;
274def VLD1d64TPseudo_UPD : VLDQQWBPseudo<IIC_VLD1x3u>;
Bob Wilsonffde0802010-09-02 16:00:54 +0000275
Bob Wilson052ba452010-03-22 18:22:06 +0000276// ...with 4 registers (some of these are only for the disassembler):
277class VLD1D4<bits<4> op7_4, string Dt>
Owen Andersone85bd772010-11-02 00:24:52 +0000278 : NLdSt<0,0b10,0b0010,op7_4,(outs DPR:$Vd, DPR:$dst2, DPR:$dst3, DPR:$dst4),
Owen Andersonf431eda2010-11-02 23:47:29 +0000279 (ins addrmode6:$Rn), IIC_VLD1x4, "vld1", Dt,
280 "\\{$Vd, $dst2, $dst3, $dst4\\}, $Rn", "", []> {
281 let Rm = 0b1111;
282 let Inst{5-4} = Rn{5-4};
Owen Andersone85bd772010-11-02 00:24:52 +0000283}
Bob Wilson99493b22010-03-20 17:59:03 +0000284class VLD1D4WB<bits<4> op7_4, string Dt>
285 : NLdSt<0,0b10,0b0010,op7_4,
Owen Andersone85bd772010-11-02 00:24:52 +0000286 (outs DPR:$Vd, DPR:$dst2, DPR:$dst3, DPR:$dst4, GPR:$wb),
Bob Wilson6eb08dd2011-02-07 17:43:12 +0000287 (ins addrmode6:$Rn, am6offset:$Rm), IIC_VLD1x4u, "vld1", Dt,
Owen Andersonf431eda2010-11-02 23:47:29 +0000288 "\\{$Vd, $dst2, $dst3, $dst4\\}, $Rn$Rm", "$Rn.addr = $wb",
Owen Andersone85bd772010-11-02 00:24:52 +0000289 []> {
Owen Andersonf431eda2010-11-02 23:47:29 +0000290 let Inst{5-4} = Rn{5-4};
Owen Andersone85bd772010-11-02 00:24:52 +0000291}
Johnny Chend7283d92010-02-23 20:51:23 +0000292
Owen Andersone85bd772010-11-02 00:24:52 +0000293def VLD1d8Q : VLD1D4<{0,0,?,?}, "8">;
294def VLD1d16Q : VLD1D4<{0,1,?,?}, "16">;
295def VLD1d32Q : VLD1D4<{1,0,?,?}, "32">;
296def VLD1d64Q : VLD1D4<{1,1,?,?}, "64">;
Bob Wilson99493b22010-03-20 17:59:03 +0000297
Owen Andersone85bd772010-11-02 00:24:52 +0000298def VLD1d8Q_UPD : VLD1D4WB<{0,0,?,?}, "8">;
299def VLD1d16Q_UPD : VLD1D4WB<{0,1,?,?}, "16">;
300def VLD1d32Q_UPD : VLD1D4WB<{1,0,?,?}, "32">;
301def VLD1d64Q_UPD : VLD1D4WB<{1,1,?,?}, "64">;
Bob Wilson9f7d60f2009-08-12 17:04:56 +0000302
Evan Chengd2ca8132010-10-09 01:03:04 +0000303def VLD1d64QPseudo : VLDQQPseudo<IIC_VLD1x4>;
304def VLD1d64QPseudo_UPD : VLDQQWBPseudo<IIC_VLD1x4u>;
Bob Wilsonffde0802010-09-02 16:00:54 +0000305
Bob Wilson4a3d35a2009-08-05 00:49:09 +0000306// VLD2 : Vector Load (multiple 2-element structures)
Bob Wilson00bf1d92010-03-20 18:14:26 +0000307class VLD2D<bits<4> op11_8, bits<4> op7_4, string Dt>
Owen Andersoncf667be2010-11-02 01:24:55 +0000308 : NLdSt<0, 0b10, op11_8, op7_4, (outs DPR:$Vd, DPR:$dst2),
Owen Andersonf431eda2010-11-02 23:47:29 +0000309 (ins addrmode6:$Rn), IIC_VLD2,
310 "vld2", Dt, "\\{$Vd, $dst2\\}, $Rn", "", []> {
311 let Rm = 0b1111;
312 let Inst{5-4} = Rn{5-4};
Owen Andersoncf667be2010-11-02 01:24:55 +0000313}
Bob Wilson95808322010-03-18 20:18:39 +0000314class VLD2Q<bits<4> op7_4, string Dt>
Bob Wilson00bf1d92010-03-20 18:14:26 +0000315 : NLdSt<0, 0b10, 0b0011, op7_4,
Owen Andersoncf667be2010-11-02 01:24:55 +0000316 (outs DPR:$Vd, DPR:$dst2, DPR:$dst3, DPR:$dst4),
Owen Andersonf431eda2010-11-02 23:47:29 +0000317 (ins addrmode6:$Rn), IIC_VLD2x2,
318 "vld2", Dt, "\\{$Vd, $dst2, $dst3, $dst4\\}, $Rn", "", []> {
319 let Rm = 0b1111;
320 let Inst{5-4} = Rn{5-4};
Owen Andersoncf667be2010-11-02 01:24:55 +0000321}
Bob Wilson4a3d35a2009-08-05 00:49:09 +0000322
Owen Andersoncf667be2010-11-02 01:24:55 +0000323def VLD2d8 : VLD2D<0b1000, {0,0,?,?}, "8">;
324def VLD2d16 : VLD2D<0b1000, {0,1,?,?}, "16">;
325def VLD2d32 : VLD2D<0b1000, {1,0,?,?}, "32">;
Bob Wilson4a3d35a2009-08-05 00:49:09 +0000326
Owen Andersoncf667be2010-11-02 01:24:55 +0000327def VLD2q8 : VLD2Q<{0,0,?,?}, "8">;
328def VLD2q16 : VLD2Q<{0,1,?,?}, "16">;
329def VLD2q32 : VLD2Q<{1,0,?,?}, "32">;
Bob Wilson3bf12ab2009-10-06 22:01:59 +0000330
Bob Wilson9d84fb32010-09-14 20:59:49 +0000331def VLD2d8Pseudo : VLDQPseudo<IIC_VLD2>;
332def VLD2d16Pseudo : VLDQPseudo<IIC_VLD2>;
333def VLD2d32Pseudo : VLDQPseudo<IIC_VLD2>;
Bob Wilsonffde0802010-09-02 16:00:54 +0000334
Evan Chengd2ca8132010-10-09 01:03:04 +0000335def VLD2q8Pseudo : VLDQQPseudo<IIC_VLD2x2>;
336def VLD2q16Pseudo : VLDQQPseudo<IIC_VLD2x2>;
337def VLD2q32Pseudo : VLDQQPseudo<IIC_VLD2x2>;
Bob Wilsonffde0802010-09-02 16:00:54 +0000338
Bob Wilson92cb9322010-03-20 20:10:51 +0000339// ...with address register writeback:
340class VLD2DWB<bits<4> op11_8, bits<4> op7_4, string Dt>
Owen Andersoncf667be2010-11-02 01:24:55 +0000341 : NLdSt<0, 0b10, op11_8, op7_4, (outs DPR:$Vd, DPR:$dst2, GPR:$wb),
Owen Andersonf431eda2010-11-02 23:47:29 +0000342 (ins addrmode6:$Rn, am6offset:$Rm), IIC_VLD2u,
343 "vld2", Dt, "\\{$Vd, $dst2\\}, $Rn$Rm",
344 "$Rn.addr = $wb", []> {
345 let Inst{5-4} = Rn{5-4};
Owen Andersoncf667be2010-11-02 01:24:55 +0000346}
Bob Wilson92cb9322010-03-20 20:10:51 +0000347class VLD2QWB<bits<4> op7_4, string Dt>
348 : NLdSt<0, 0b10, 0b0011, op7_4,
Owen Andersoncf667be2010-11-02 01:24:55 +0000349 (outs DPR:$Vd, DPR:$dst2, DPR:$dst3, DPR:$dst4, GPR:$wb),
Owen Andersonf431eda2010-11-02 23:47:29 +0000350 (ins addrmode6:$Rn, am6offset:$Rm), IIC_VLD2x2u,
351 "vld2", Dt, "\\{$Vd, $dst2, $dst3, $dst4\\}, $Rn$Rm",
352 "$Rn.addr = $wb", []> {
353 let Inst{5-4} = Rn{5-4};
Owen Andersoncf667be2010-11-02 01:24:55 +0000354}
Bob Wilson92cb9322010-03-20 20:10:51 +0000355
Owen Andersoncf667be2010-11-02 01:24:55 +0000356def VLD2d8_UPD : VLD2DWB<0b1000, {0,0,?,?}, "8">;
357def VLD2d16_UPD : VLD2DWB<0b1000, {0,1,?,?}, "16">;
358def VLD2d32_UPD : VLD2DWB<0b1000, {1,0,?,?}, "32">;
Bob Wilson92cb9322010-03-20 20:10:51 +0000359
Owen Andersoncf667be2010-11-02 01:24:55 +0000360def VLD2q8_UPD : VLD2QWB<{0,0,?,?}, "8">;
361def VLD2q16_UPD : VLD2QWB<{0,1,?,?}, "16">;
362def VLD2q32_UPD : VLD2QWB<{1,0,?,?}, "32">;
Bob Wilson92cb9322010-03-20 20:10:51 +0000363
Evan Chengd2ca8132010-10-09 01:03:04 +0000364def VLD2d8Pseudo_UPD : VLDQWBPseudo<IIC_VLD2u>;
365def VLD2d16Pseudo_UPD : VLDQWBPseudo<IIC_VLD2u>;
366def VLD2d32Pseudo_UPD : VLDQWBPseudo<IIC_VLD2u>;
Bob Wilsonffde0802010-09-02 16:00:54 +0000367
Evan Chengd2ca8132010-10-09 01:03:04 +0000368def VLD2q8Pseudo_UPD : VLDQQWBPseudo<IIC_VLD2x2u>;
369def VLD2q16Pseudo_UPD : VLDQQWBPseudo<IIC_VLD2x2u>;
370def VLD2q32Pseudo_UPD : VLDQQWBPseudo<IIC_VLD2x2u>;
Bob Wilsonffde0802010-09-02 16:00:54 +0000371
Bob Wilson00bf1d92010-03-20 18:14:26 +0000372// ...with double-spaced registers (for disassembly only):
Owen Andersoncf667be2010-11-02 01:24:55 +0000373def VLD2b8 : VLD2D<0b1001, {0,0,?,?}, "8">;
374def VLD2b16 : VLD2D<0b1001, {0,1,?,?}, "16">;
375def VLD2b32 : VLD2D<0b1001, {1,0,?,?}, "32">;
376def VLD2b8_UPD : VLD2DWB<0b1001, {0,0,?,?}, "8">;
377def VLD2b16_UPD : VLD2DWB<0b1001, {0,1,?,?}, "16">;
378def VLD2b32_UPD : VLD2DWB<0b1001, {1,0,?,?}, "32">;
Johnny Chend7283d92010-02-23 20:51:23 +0000379
Bob Wilson4a3d35a2009-08-05 00:49:09 +0000380// VLD3 : Vector Load (multiple 3-element structures)
Bob Wilson00bf1d92010-03-20 18:14:26 +0000381class VLD3D<bits<4> op11_8, bits<4> op7_4, string Dt>
Owen Andersoncf667be2010-11-02 01:24:55 +0000382 : NLdSt<0, 0b10, op11_8, op7_4, (outs DPR:$Vd, DPR:$dst2, DPR:$dst3),
Owen Andersonf431eda2010-11-02 23:47:29 +0000383 (ins addrmode6:$Rn), IIC_VLD3,
384 "vld3", Dt, "\\{$Vd, $dst2, $dst3\\}, $Rn", "", []> {
385 let Rm = 0b1111;
386 let Inst{4} = Rn{4};
Owen Andersoncf667be2010-11-02 01:24:55 +0000387}
Bob Wilson4a3d35a2009-08-05 00:49:09 +0000388
Owen Andersoncf667be2010-11-02 01:24:55 +0000389def VLD3d8 : VLD3D<0b0100, {0,0,0,?}, "8">;
390def VLD3d16 : VLD3D<0b0100, {0,1,0,?}, "16">;
391def VLD3d32 : VLD3D<0b0100, {1,0,0,?}, "32">;
Bob Wilson4a3d35a2009-08-05 00:49:09 +0000392
Bob Wilson9d84fb32010-09-14 20:59:49 +0000393def VLD3d8Pseudo : VLDQQPseudo<IIC_VLD3>;
394def VLD3d16Pseudo : VLDQQPseudo<IIC_VLD3>;
395def VLD3d32Pseudo : VLDQQPseudo<IIC_VLD3>;
Bob Wilsonf5721912010-09-03 18:16:02 +0000396
Bob Wilson92cb9322010-03-20 20:10:51 +0000397// ...with address register writeback:
398class VLD3DWB<bits<4> op11_8, bits<4> op7_4, string Dt>
399 : NLdSt<0, 0b10, op11_8, op7_4,
Owen Andersoncf667be2010-11-02 01:24:55 +0000400 (outs DPR:$Vd, DPR:$dst2, DPR:$dst3, GPR:$wb),
Owen Andersonf431eda2010-11-02 23:47:29 +0000401 (ins addrmode6:$Rn, am6offset:$Rm), IIC_VLD3u,
402 "vld3", Dt, "\\{$Vd, $dst2, $dst3\\}, $Rn$Rm",
403 "$Rn.addr = $wb", []> {
404 let Inst{4} = Rn{4};
Owen Andersoncf667be2010-11-02 01:24:55 +0000405}
Bob Wilson92cb9322010-03-20 20:10:51 +0000406
Owen Andersoncf667be2010-11-02 01:24:55 +0000407def VLD3d8_UPD : VLD3DWB<0b0100, {0,0,0,?}, "8">;
408def VLD3d16_UPD : VLD3DWB<0b0100, {0,1,0,?}, "16">;
409def VLD3d32_UPD : VLD3DWB<0b0100, {1,0,0,?}, "32">;
Bob Wilson92cb9322010-03-20 20:10:51 +0000410
Evan Cheng84f69e82010-10-09 01:45:34 +0000411def VLD3d8Pseudo_UPD : VLDQQWBPseudo<IIC_VLD3u>;
412def VLD3d16Pseudo_UPD : VLDQQWBPseudo<IIC_VLD3u>;
413def VLD3d32Pseudo_UPD : VLDQQWBPseudo<IIC_VLD3u>;
Bob Wilsonf5721912010-09-03 18:16:02 +0000414
Bob Wilson7de68142011-02-07 17:43:15 +0000415// ...with double-spaced registers:
Owen Andersoncf667be2010-11-02 01:24:55 +0000416def VLD3q8 : VLD3D<0b0101, {0,0,0,?}, "8">;
417def VLD3q16 : VLD3D<0b0101, {0,1,0,?}, "16">;
418def VLD3q32 : VLD3D<0b0101, {1,0,0,?}, "32">;
419def VLD3q8_UPD : VLD3DWB<0b0101, {0,0,0,?}, "8">;
420def VLD3q16_UPD : VLD3DWB<0b0101, {0,1,0,?}, "16">;
421def VLD3q32_UPD : VLD3DWB<0b0101, {1,0,0,?}, "32">;
Bob Wilson00bf1d92010-03-20 18:14:26 +0000422
Evan Cheng84f69e82010-10-09 01:45:34 +0000423def VLD3q8Pseudo_UPD : VLDQQQQWBPseudo<IIC_VLD3u>;
424def VLD3q16Pseudo_UPD : VLDQQQQWBPseudo<IIC_VLD3u>;
425def VLD3q32Pseudo_UPD : VLDQQQQWBPseudo<IIC_VLD3u>;
Bob Wilsonf5721912010-09-03 18:16:02 +0000426
Bob Wilson92cb9322010-03-20 20:10:51 +0000427// ...alternate versions to be allocated odd register numbers:
Bob Wilson7de68142011-02-07 17:43:15 +0000428def VLD3q8oddPseudo : VLDQQQQPseudo<IIC_VLD3>;
429def VLD3q16oddPseudo : VLDQQQQPseudo<IIC_VLD3>;
430def VLD3q32oddPseudo : VLDQQQQPseudo<IIC_VLD3>;
431
Evan Cheng84f69e82010-10-09 01:45:34 +0000432def VLD3q8oddPseudo_UPD : VLDQQQQWBPseudo<IIC_VLD3u>;
433def VLD3q16oddPseudo_UPD : VLDQQQQWBPseudo<IIC_VLD3u>;
434def VLD3q32oddPseudo_UPD : VLDQQQQWBPseudo<IIC_VLD3u>;
Bob Wilsonff8952e2009-10-07 17:24:55 +0000435
Bob Wilson4a3d35a2009-08-05 00:49:09 +0000436// VLD4 : Vector Load (multiple 4-element structures)
Bob Wilson00bf1d92010-03-20 18:14:26 +0000437class VLD4D<bits<4> op11_8, bits<4> op7_4, string Dt>
438 : NLdSt<0, 0b10, op11_8, op7_4,
Owen Andersoncf667be2010-11-02 01:24:55 +0000439 (outs DPR:$Vd, DPR:$dst2, DPR:$dst3, DPR:$dst4),
Owen Andersonf431eda2010-11-02 23:47:29 +0000440 (ins addrmode6:$Rn), IIC_VLD4,
441 "vld4", Dt, "\\{$Vd, $dst2, $dst3, $dst4\\}, $Rn", "", []> {
442 let Rm = 0b1111;
443 let Inst{5-4} = Rn{5-4};
Owen Andersoncf667be2010-11-02 01:24:55 +0000444}
Bob Wilson4a3d35a2009-08-05 00:49:09 +0000445
Owen Andersoncf667be2010-11-02 01:24:55 +0000446def VLD4d8 : VLD4D<0b0000, {0,0,?,?}, "8">;
447def VLD4d16 : VLD4D<0b0000, {0,1,?,?}, "16">;
448def VLD4d32 : VLD4D<0b0000, {1,0,?,?}, "32">;
Bob Wilson243fcc52009-09-01 04:26:28 +0000449
Bob Wilson9d84fb32010-09-14 20:59:49 +0000450def VLD4d8Pseudo : VLDQQPseudo<IIC_VLD4>;
451def VLD4d16Pseudo : VLDQQPseudo<IIC_VLD4>;
452def VLD4d32Pseudo : VLDQQPseudo<IIC_VLD4>;
Bob Wilsonf5721912010-09-03 18:16:02 +0000453
Bob Wilson92cb9322010-03-20 20:10:51 +0000454// ...with address register writeback:
455class VLD4DWB<bits<4> op11_8, bits<4> op7_4, string Dt>
456 : NLdSt<0, 0b10, op11_8, op7_4,
Owen Andersoncf667be2010-11-02 01:24:55 +0000457 (outs DPR:$Vd, DPR:$dst2, DPR:$dst3, DPR:$dst4, GPR:$wb),
Bob Wilson6eb08dd2011-02-07 17:43:12 +0000458 (ins addrmode6:$Rn, am6offset:$Rm), IIC_VLD4u,
Owen Andersonf431eda2010-11-02 23:47:29 +0000459 "vld4", Dt, "\\{$Vd, $dst2, $dst3, $dst4\\}, $Rn$Rm",
460 "$Rn.addr = $wb", []> {
461 let Inst{5-4} = Rn{5-4};
Owen Andersoncf667be2010-11-02 01:24:55 +0000462}
Bob Wilson92cb9322010-03-20 20:10:51 +0000463
Owen Andersoncf667be2010-11-02 01:24:55 +0000464def VLD4d8_UPD : VLD4DWB<0b0000, {0,0,?,?}, "8">;
465def VLD4d16_UPD : VLD4DWB<0b0000, {0,1,?,?}, "16">;
466def VLD4d32_UPD : VLD4DWB<0b0000, {1,0,?,?}, "32">;
Bob Wilson92cb9322010-03-20 20:10:51 +0000467
Bob Wilson6eb08dd2011-02-07 17:43:12 +0000468def VLD4d8Pseudo_UPD : VLDQQWBPseudo<IIC_VLD4u>;
469def VLD4d16Pseudo_UPD : VLDQQWBPseudo<IIC_VLD4u>;
470def VLD4d32Pseudo_UPD : VLDQQWBPseudo<IIC_VLD4u>;
Bob Wilsonf5721912010-09-03 18:16:02 +0000471
Bob Wilson7de68142011-02-07 17:43:15 +0000472// ...with double-spaced registers:
Owen Andersoncf667be2010-11-02 01:24:55 +0000473def VLD4q8 : VLD4D<0b0001, {0,0,?,?}, "8">;
474def VLD4q16 : VLD4D<0b0001, {0,1,?,?}, "16">;
475def VLD4q32 : VLD4D<0b0001, {1,0,?,?}, "32">;
476def VLD4q8_UPD : VLD4DWB<0b0001, {0,0,?,?}, "8">;
477def VLD4q16_UPD : VLD4DWB<0b0001, {0,1,?,?}, "16">;
478def VLD4q32_UPD : VLD4DWB<0b0001, {1,0,?,?}, "32">;
Bob Wilson00bf1d92010-03-20 18:14:26 +0000479
Bob Wilson6eb08dd2011-02-07 17:43:12 +0000480def VLD4q8Pseudo_UPD : VLDQQQQWBPseudo<IIC_VLD4u>;
481def VLD4q16Pseudo_UPD : VLDQQQQWBPseudo<IIC_VLD4u>;
482def VLD4q32Pseudo_UPD : VLDQQQQWBPseudo<IIC_VLD4u>;
Bob Wilsonf5721912010-09-03 18:16:02 +0000483
Bob Wilson92cb9322010-03-20 20:10:51 +0000484// ...alternate versions to be allocated odd register numbers:
Bob Wilson6eb08dd2011-02-07 17:43:12 +0000485def VLD4q8oddPseudo : VLDQQQQPseudo<IIC_VLD4>;
486def VLD4q16oddPseudo : VLDQQQQPseudo<IIC_VLD4>;
487def VLD4q32oddPseudo : VLDQQQQPseudo<IIC_VLD4>;
488
489def VLD4q8oddPseudo_UPD : VLDQQQQWBPseudo<IIC_VLD4u>;
490def VLD4q16oddPseudo_UPD : VLDQQQQWBPseudo<IIC_VLD4u>;
491def VLD4q32oddPseudo_UPD : VLDQQQQWBPseudo<IIC_VLD4u>;
Bob Wilsonb07c1712009-10-07 21:53:04 +0000492
Bob Wilsonb796bbb2010-11-01 22:04:05 +0000493} // mayLoad = 1, neverHasSideEffects = 1, hasExtraDefRegAllocReq = 1
494
Bob Wilson8466fa12010-09-13 23:01:35 +0000495// Classes for VLD*LN pseudo-instructions with multi-register operands.
496// These are expanded to real instructions after register allocation.
497class VLDQLNPseudo<InstrItinClass itin>
498 : PseudoNLdSt<(outs QPR:$dst),
499 (ins addrmode6:$addr, QPR:$src, nohash_imm:$lane),
500 itin, "$src = $dst">;
501class VLDQLNWBPseudo<InstrItinClass itin>
502 : PseudoNLdSt<(outs QPR:$dst, GPR:$wb),
503 (ins addrmode6:$addr, am6offset:$offset, QPR:$src,
504 nohash_imm:$lane), itin, "$addr.addr = $wb, $src = $dst">;
505class VLDQQLNPseudo<InstrItinClass itin>
506 : PseudoNLdSt<(outs QQPR:$dst),
507 (ins addrmode6:$addr, QQPR:$src, nohash_imm:$lane),
508 itin, "$src = $dst">;
509class VLDQQLNWBPseudo<InstrItinClass itin>
510 : PseudoNLdSt<(outs QQPR:$dst, GPR:$wb),
511 (ins addrmode6:$addr, am6offset:$offset, QQPR:$src,
512 nohash_imm:$lane), itin, "$addr.addr = $wb, $src = $dst">;
513class VLDQQQQLNPseudo<InstrItinClass itin>
514 : PseudoNLdSt<(outs QQQQPR:$dst),
515 (ins addrmode6:$addr, QQQQPR:$src, nohash_imm:$lane),
516 itin, "$src = $dst">;
517class VLDQQQQLNWBPseudo<InstrItinClass itin>
518 : PseudoNLdSt<(outs QQQQPR:$dst, GPR:$wb),
519 (ins addrmode6:$addr, am6offset:$offset, QQQQPR:$src,
520 nohash_imm:$lane), itin, "$addr.addr = $wb, $src = $dst">;
521
Bob Wilsonb07c1712009-10-07 21:53:04 +0000522// VLD1LN : Vector Load (single element to one lane)
Bob Wilsonb796bbb2010-11-01 22:04:05 +0000523class VLD1LN<bits<4> op11_8, bits<4> op7_4, string Dt, ValueType Ty,
524 PatFrag LoadOp>
Owen Andersond138d702010-11-02 20:47:39 +0000525 : NLdStLn<1, 0b10, op11_8, op7_4, (outs DPR:$Vd),
Owen Andersonf431eda2010-11-02 23:47:29 +0000526 (ins addrmode6:$Rn, DPR:$src, nohash_imm:$lane),
527 IIC_VLD1ln, "vld1", Dt, "\\{$Vd[$lane]\\}, $Rn",
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000528 "$src = $Vd",
529 [(set DPR:$Vd, (vector_insert (Ty DPR:$src),
Owen Andersonf431eda2010-11-02 23:47:29 +0000530 (i32 (LoadOp addrmode6:$Rn)),
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000531 imm:$lane))]> {
Owen Andersonf431eda2010-11-02 23:47:29 +0000532 let Rm = 0b1111;
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000533}
Mon P Wang183c6272011-05-09 17:47:27 +0000534class VLD1LN32<bits<4> op11_8, bits<4> op7_4, string Dt, ValueType Ty,
535 PatFrag LoadOp>
536 : NLdStLn<1, 0b10, op11_8, op7_4, (outs DPR:$Vd),
537 (ins addrmode6oneL32:$Rn, DPR:$src, nohash_imm:$lane),
538 IIC_VLD1ln, "vld1", Dt, "\\{$Vd[$lane]\\}, $Rn",
539 "$src = $Vd",
540 [(set DPR:$Vd, (vector_insert (Ty DPR:$src),
541 (i32 (LoadOp addrmode6oneL32:$Rn)),
542 imm:$lane))]> {
543 let Rm = 0b1111;
544}
Bob Wilsonb796bbb2010-11-01 22:04:05 +0000545class VLD1QLNPseudo<ValueType Ty, PatFrag LoadOp> : VLDQLNPseudo<IIC_VLD1ln> {
546 let Pattern = [(set QPR:$dst, (vector_insert (Ty QPR:$src),
547 (i32 (LoadOp addrmode6:$addr)),
548 imm:$lane))];
549}
550
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000551def VLD1LNd8 : VLD1LN<0b0000, {?,?,?,0}, "8", v8i8, extloadi8> {
552 let Inst{7-5} = lane{2-0};
553}
554def VLD1LNd16 : VLD1LN<0b0100, {?,?,0,?}, "16", v4i16, extloadi16> {
555 let Inst{7-6} = lane{1-0};
Owen Andersonf431eda2010-11-02 23:47:29 +0000556 let Inst{4} = Rn{4};
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000557}
Mon P Wang183c6272011-05-09 17:47:27 +0000558def VLD1LNd32 : VLD1LN32<0b1000, {?,0,?,?}, "32", v2i32, load> {
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000559 let Inst{7} = lane{0};
Owen Andersonf431eda2010-11-02 23:47:29 +0000560 let Inst{5} = Rn{4};
561 let Inst{4} = Rn{4};
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000562}
Bob Wilsonb796bbb2010-11-01 22:04:05 +0000563
564def VLD1LNq8Pseudo : VLD1QLNPseudo<v16i8, extloadi8>;
565def VLD1LNq16Pseudo : VLD1QLNPseudo<v8i16, extloadi16>;
566def VLD1LNq32Pseudo : VLD1QLNPseudo<v4i32, load>;
567
Bob Wilson746fa172010-12-10 22:13:32 +0000568def : Pat<(vector_insert (v2f32 DPR:$src),
569 (f32 (load addrmode6:$addr)), imm:$lane),
570 (VLD1LNd32 addrmode6:$addr, DPR:$src, imm:$lane)>;
571def : Pat<(vector_insert (v4f32 QPR:$src),
572 (f32 (load addrmode6:$addr)), imm:$lane),
573 (VLD1LNq32Pseudo addrmode6:$addr, QPR:$src, imm:$lane)>;
574
Bob Wilsonb796bbb2010-11-01 22:04:05 +0000575let mayLoad = 1, neverHasSideEffects = 1, hasExtraDefRegAllocReq = 1 in {
576
577// ...with address register writeback:
578class VLD1LNWB<bits<4> op11_8, bits<4> op7_4, string Dt>
Owen Andersond138d702010-11-02 20:47:39 +0000579 : NLdStLn<1, 0b10, op11_8, op7_4, (outs DPR:$Vd, GPR:$wb),
Owen Andersonf431eda2010-11-02 23:47:29 +0000580 (ins addrmode6:$Rn, am6offset:$Rm,
Bob Wilsonb796bbb2010-11-01 22:04:05 +0000581 DPR:$src, nohash_imm:$lane), IIC_VLD1lnu, "vld1", Dt,
Owen Andersonf431eda2010-11-02 23:47:29 +0000582 "\\{$Vd[$lane]\\}, $Rn$Rm",
583 "$src = $Vd, $Rn.addr = $wb", []>;
Bob Wilsonb796bbb2010-11-01 22:04:05 +0000584
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000585def VLD1LNd8_UPD : VLD1LNWB<0b0000, {?,?,?,0}, "8"> {
586 let Inst{7-5} = lane{2-0};
587}
588def VLD1LNd16_UPD : VLD1LNWB<0b0100, {?,?,0,?}, "16"> {
589 let Inst{7-6} = lane{1-0};
Owen Andersonf431eda2010-11-02 23:47:29 +0000590 let Inst{4} = Rn{4};
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000591}
592def VLD1LNd32_UPD : VLD1LNWB<0b1000, {?,0,?,?}, "32"> {
593 let Inst{7} = lane{0};
Owen Andersonf431eda2010-11-02 23:47:29 +0000594 let Inst{5} = Rn{4};
595 let Inst{4} = Rn{4};
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000596}
Bob Wilsonb796bbb2010-11-01 22:04:05 +0000597
598def VLD1LNq8Pseudo_UPD : VLDQLNWBPseudo<IIC_VLD1lnu>;
599def VLD1LNq16Pseudo_UPD : VLDQLNWBPseudo<IIC_VLD1lnu>;
600def VLD1LNq32Pseudo_UPD : VLDQLNWBPseudo<IIC_VLD1lnu>;
Bob Wilson7708c222009-10-07 18:09:32 +0000601
Bob Wilson243fcc52009-09-01 04:26:28 +0000602// VLD2LN : Vector Load (single 2-element structure to one lane)
Bob Wilson39842552010-03-22 16:43:10 +0000603class VLD2LN<bits<4> op11_8, bits<4> op7_4, string Dt>
Owen Andersond138d702010-11-02 20:47:39 +0000604 : NLdStLn<1, 0b10, op11_8, op7_4, (outs DPR:$Vd, DPR:$dst2),
Owen Andersonf431eda2010-11-02 23:47:29 +0000605 (ins addrmode6:$Rn, DPR:$src1, DPR:$src2, nohash_imm:$lane),
606 IIC_VLD2ln, "vld2", Dt, "\\{$Vd[$lane], $dst2[$lane]\\}, $Rn",
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000607 "$src1 = $Vd, $src2 = $dst2", []> {
Owen Andersonf431eda2010-11-02 23:47:29 +0000608 let Rm = 0b1111;
609 let Inst{4} = Rn{4};
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000610}
Bob Wilson243fcc52009-09-01 04:26:28 +0000611
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000612def VLD2LNd8 : VLD2LN<0b0001, {?,?,?,?}, "8"> {
613 let Inst{7-5} = lane{2-0};
614}
615def VLD2LNd16 : VLD2LN<0b0101, {?,?,0,?}, "16"> {
616 let Inst{7-6} = lane{1-0};
617}
618def VLD2LNd32 : VLD2LN<0b1001, {?,0,0,?}, "32"> {
619 let Inst{7} = lane{0};
620}
Bob Wilson30aea9d2009-10-08 18:56:10 +0000621
Evan Chengd2ca8132010-10-09 01:03:04 +0000622def VLD2LNd8Pseudo : VLDQLNPseudo<IIC_VLD2ln>;
623def VLD2LNd16Pseudo : VLDQLNPseudo<IIC_VLD2ln>;
624def VLD2LNd32Pseudo : VLDQLNPseudo<IIC_VLD2ln>;
Bob Wilson8466fa12010-09-13 23:01:35 +0000625
Bob Wilson41315282010-03-20 20:39:53 +0000626// ...with double-spaced registers:
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000627def VLD2LNq16 : VLD2LN<0b0101, {?,?,1,?}, "16"> {
628 let Inst{7-6} = lane{1-0};
629}
630def VLD2LNq32 : VLD2LN<0b1001, {?,1,0,?}, "32"> {
631 let Inst{7} = lane{0};
632}
Bob Wilson30aea9d2009-10-08 18:56:10 +0000633
Evan Chengd2ca8132010-10-09 01:03:04 +0000634def VLD2LNq16Pseudo : VLDQQLNPseudo<IIC_VLD2ln>;
635def VLD2LNq32Pseudo : VLDQQLNPseudo<IIC_VLD2ln>;
Bob Wilson243fcc52009-09-01 04:26:28 +0000636
Bob Wilsona1023642010-03-20 20:47:18 +0000637// ...with address register writeback:
Bob Wilson39842552010-03-22 16:43:10 +0000638class VLD2LNWB<bits<4> op11_8, bits<4> op7_4, string Dt>
Owen Andersond138d702010-11-02 20:47:39 +0000639 : NLdStLn<1, 0b10, op11_8, op7_4, (outs DPR:$Vd, DPR:$dst2, GPR:$wb),
Owen Andersonf431eda2010-11-02 23:47:29 +0000640 (ins addrmode6:$Rn, am6offset:$Rm,
Evan Chengd2ca8132010-10-09 01:03:04 +0000641 DPR:$src1, DPR:$src2, nohash_imm:$lane), IIC_VLD2lnu, "vld2", Dt,
Owen Andersonf431eda2010-11-02 23:47:29 +0000642 "\\{$Vd[$lane], $dst2[$lane]\\}, $Rn$Rm",
643 "$src1 = $Vd, $src2 = $dst2, $Rn.addr = $wb", []> {
644 let Inst{4} = Rn{4};
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000645}
Bob Wilsona1023642010-03-20 20:47:18 +0000646
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000647def VLD2LNd8_UPD : VLD2LNWB<0b0001, {?,?,?,?}, "8"> {
648 let Inst{7-5} = lane{2-0};
649}
650def VLD2LNd16_UPD : VLD2LNWB<0b0101, {?,?,0,?}, "16"> {
651 let Inst{7-6} = lane{1-0};
652}
653def VLD2LNd32_UPD : VLD2LNWB<0b1001, {?,0,0,?}, "32"> {
654 let Inst{7} = lane{0};
655}
Bob Wilsona1023642010-03-20 20:47:18 +0000656
Evan Chengd2ca8132010-10-09 01:03:04 +0000657def VLD2LNd8Pseudo_UPD : VLDQLNWBPseudo<IIC_VLD2lnu>;
658def VLD2LNd16Pseudo_UPD : VLDQLNWBPseudo<IIC_VLD2lnu>;
659def VLD2LNd32Pseudo_UPD : VLDQLNWBPseudo<IIC_VLD2lnu>;
Bob Wilson8466fa12010-09-13 23:01:35 +0000660
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000661def VLD2LNq16_UPD : VLD2LNWB<0b0101, {?,?,1,?}, "16"> {
662 let Inst{7-6} = lane{1-0};
663}
664def VLD2LNq32_UPD : VLD2LNWB<0b1001, {?,1,0,?}, "32"> {
665 let Inst{7} = lane{0};
666}
Bob Wilsona1023642010-03-20 20:47:18 +0000667
Evan Chengd2ca8132010-10-09 01:03:04 +0000668def VLD2LNq16Pseudo_UPD : VLDQQLNWBPseudo<IIC_VLD2lnu>;
669def VLD2LNq32Pseudo_UPD : VLDQQLNWBPseudo<IIC_VLD2lnu>;
Bob Wilson8466fa12010-09-13 23:01:35 +0000670
Bob Wilson243fcc52009-09-01 04:26:28 +0000671// VLD3LN : Vector Load (single 3-element structure to one lane)
Bob Wilson39842552010-03-22 16:43:10 +0000672class VLD3LN<bits<4> op11_8, bits<4> op7_4, string Dt>
Owen Andersond138d702010-11-02 20:47:39 +0000673 : NLdStLn<1, 0b10, op11_8, op7_4, (outs DPR:$Vd, DPR:$dst2, DPR:$dst3),
Owen Andersonf431eda2010-11-02 23:47:29 +0000674 (ins addrmode6:$Rn, DPR:$src1, DPR:$src2, DPR:$src3,
Evan Cheng84f69e82010-10-09 01:45:34 +0000675 nohash_imm:$lane), IIC_VLD3ln, "vld3", Dt,
Owen Andersonf431eda2010-11-02 23:47:29 +0000676 "\\{$Vd[$lane], $dst2[$lane], $dst3[$lane]\\}, $Rn",
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000677 "$src1 = $Vd, $src2 = $dst2, $src3 = $dst3", []> {
Owen Andersonf431eda2010-11-02 23:47:29 +0000678 let Rm = 0b1111;
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000679}
Bob Wilson243fcc52009-09-01 04:26:28 +0000680
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000681def VLD3LNd8 : VLD3LN<0b0010, {?,?,?,0}, "8"> {
682 let Inst{7-5} = lane{2-0};
683}
684def VLD3LNd16 : VLD3LN<0b0110, {?,?,0,0}, "16"> {
685 let Inst{7-6} = lane{1-0};
686}
687def VLD3LNd32 : VLD3LN<0b1010, {?,0,0,0}, "32"> {
688 let Inst{7} = lane{0};
689}
Bob Wilson0bf7d992009-10-08 22:27:33 +0000690
Evan Cheng84f69e82010-10-09 01:45:34 +0000691def VLD3LNd8Pseudo : VLDQQLNPseudo<IIC_VLD3ln>;
692def VLD3LNd16Pseudo : VLDQQLNPseudo<IIC_VLD3ln>;
693def VLD3LNd32Pseudo : VLDQQLNPseudo<IIC_VLD3ln>;
Bob Wilson8466fa12010-09-13 23:01:35 +0000694
Bob Wilson41315282010-03-20 20:39:53 +0000695// ...with double-spaced registers:
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000696def VLD3LNq16 : VLD3LN<0b0110, {?,?,1,0}, "16"> {
697 let Inst{7-6} = lane{1-0};
698}
699def VLD3LNq32 : VLD3LN<0b1010, {?,1,0,0}, "32"> {
700 let Inst{7} = lane{0};
701}
Bob Wilson0bf7d992009-10-08 22:27:33 +0000702
Evan Cheng84f69e82010-10-09 01:45:34 +0000703def VLD3LNq16Pseudo : VLDQQQQLNPseudo<IIC_VLD3ln>;
704def VLD3LNq32Pseudo : VLDQQQQLNPseudo<IIC_VLD3ln>;
Bob Wilson243fcc52009-09-01 04:26:28 +0000705
Bob Wilsona1023642010-03-20 20:47:18 +0000706// ...with address register writeback:
Bob Wilson39842552010-03-22 16:43:10 +0000707class VLD3LNWB<bits<4> op11_8, bits<4> op7_4, string Dt>
Owen Andersond138d702010-11-02 20:47:39 +0000708 : NLdStLn<1, 0b10, op11_8, op7_4,
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000709 (outs DPR:$Vd, DPR:$dst2, DPR:$dst3, GPR:$wb),
Owen Andersonf431eda2010-11-02 23:47:29 +0000710 (ins addrmode6:$Rn, am6offset:$Rm,
Bob Wilsona1023642010-03-20 20:47:18 +0000711 DPR:$src1, DPR:$src2, DPR:$src3, nohash_imm:$lane),
Evan Cheng84f69e82010-10-09 01:45:34 +0000712 IIC_VLD3lnu, "vld3", Dt,
Owen Andersonf431eda2010-11-02 23:47:29 +0000713 "\\{$Vd[$lane], $dst2[$lane], $dst3[$lane]\\}, $Rn$Rm",
714 "$src1 = $Vd, $src2 = $dst2, $src3 = $dst3, $Rn.addr = $wb",
Owen Andersond138d702010-11-02 20:47:39 +0000715 []>;
Bob Wilsona1023642010-03-20 20:47:18 +0000716
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000717def VLD3LNd8_UPD : VLD3LNWB<0b0010, {?,?,?,0}, "8"> {
718 let Inst{7-5} = lane{2-0};
719}
720def VLD3LNd16_UPD : VLD3LNWB<0b0110, {?,?,0,0}, "16"> {
721 let Inst{7-6} = lane{1-0};
722}
723def VLD3LNd32_UPD : VLD3LNWB<0b1010, {?,0,0,0}, "32"> {
724 let Inst{7} = lane{0};
725}
Bob Wilsona1023642010-03-20 20:47:18 +0000726
Evan Cheng84f69e82010-10-09 01:45:34 +0000727def VLD3LNd8Pseudo_UPD : VLDQQLNWBPseudo<IIC_VLD3lnu>;
728def VLD3LNd16Pseudo_UPD : VLDQQLNWBPseudo<IIC_VLD3lnu>;
729def VLD3LNd32Pseudo_UPD : VLDQQLNWBPseudo<IIC_VLD3lnu>;
Bob Wilson8466fa12010-09-13 23:01:35 +0000730
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000731def VLD3LNq16_UPD : VLD3LNWB<0b0110, {?,?,1,0}, "16"> {
732 let Inst{7-6} = lane{1-0};
733}
734def VLD3LNq32_UPD : VLD3LNWB<0b1010, {?,1,0,0}, "32"> {
735 let Inst{7} = lane{0};
736}
Bob Wilsona1023642010-03-20 20:47:18 +0000737
Evan Cheng84f69e82010-10-09 01:45:34 +0000738def VLD3LNq16Pseudo_UPD : VLDQQQQLNWBPseudo<IIC_VLD3lnu>;
739def VLD3LNq32Pseudo_UPD : VLDQQQQLNWBPseudo<IIC_VLD3lnu>;
Bob Wilson8466fa12010-09-13 23:01:35 +0000740
Bob Wilson243fcc52009-09-01 04:26:28 +0000741// VLD4LN : Vector Load (single 4-element structure to one lane)
Bob Wilson39842552010-03-22 16:43:10 +0000742class VLD4LN<bits<4> op11_8, bits<4> op7_4, string Dt>
Owen Andersond138d702010-11-02 20:47:39 +0000743 : NLdStLn<1, 0b10, op11_8, op7_4,
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000744 (outs DPR:$Vd, DPR:$dst2, DPR:$dst3, DPR:$dst4),
Owen Andersonf431eda2010-11-02 23:47:29 +0000745 (ins addrmode6:$Rn, DPR:$src1, DPR:$src2, DPR:$src3, DPR:$src4,
Evan Cheng10dc63f2010-10-09 04:07:58 +0000746 nohash_imm:$lane), IIC_VLD4ln, "vld4", Dt,
Owen Andersonf431eda2010-11-02 23:47:29 +0000747 "\\{$Vd[$lane], $dst2[$lane], $dst3[$lane], $dst4[$lane]\\}, $Rn",
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000748 "$src1 = $Vd, $src2 = $dst2, $src3 = $dst3, $src4 = $dst4", []> {
Owen Andersonf431eda2010-11-02 23:47:29 +0000749 let Rm = 0b1111;
750 let Inst{4} = Rn{4};
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000751}
Bob Wilson243fcc52009-09-01 04:26:28 +0000752
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000753def VLD4LNd8 : VLD4LN<0b0011, {?,?,?,?}, "8"> {
754 let Inst{7-5} = lane{2-0};
755}
756def VLD4LNd16 : VLD4LN<0b0111, {?,?,0,?}, "16"> {
757 let Inst{7-6} = lane{1-0};
758}
759def VLD4LNd32 : VLD4LN<0b1011, {?,0,?,?}, "32"> {
760 let Inst{7} = lane{0};
Owen Andersonf431eda2010-11-02 23:47:29 +0000761 let Inst{5} = Rn{5};
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000762}
Bob Wilson62e053e2009-10-08 22:53:57 +0000763
Evan Cheng10dc63f2010-10-09 04:07:58 +0000764def VLD4LNd8Pseudo : VLDQQLNPseudo<IIC_VLD4ln>;
765def VLD4LNd16Pseudo : VLDQQLNPseudo<IIC_VLD4ln>;
766def VLD4LNd32Pseudo : VLDQQLNPseudo<IIC_VLD4ln>;
Bob Wilson8466fa12010-09-13 23:01:35 +0000767
Bob Wilson41315282010-03-20 20:39:53 +0000768// ...with double-spaced registers:
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000769def VLD4LNq16 : VLD4LN<0b0111, {?,?,1,?}, "16"> {
770 let Inst{7-6} = lane{1-0};
771}
772def VLD4LNq32 : VLD4LN<0b1011, {?,1,?,?}, "32"> {
773 let Inst{7} = lane{0};
Owen Andersonf431eda2010-11-02 23:47:29 +0000774 let Inst{5} = Rn{5};
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000775}
Bob Wilson62e053e2009-10-08 22:53:57 +0000776
Evan Cheng10dc63f2010-10-09 04:07:58 +0000777def VLD4LNq16Pseudo : VLDQQQQLNPseudo<IIC_VLD4ln>;
778def VLD4LNq32Pseudo : VLDQQQQLNPseudo<IIC_VLD4ln>;
Bob Wilsonb07c1712009-10-07 21:53:04 +0000779
Bob Wilsona1023642010-03-20 20:47:18 +0000780// ...with address register writeback:
Bob Wilson39842552010-03-22 16:43:10 +0000781class VLD4LNWB<bits<4> op11_8, bits<4> op7_4, string Dt>
Owen Andersond138d702010-11-02 20:47:39 +0000782 : NLdStLn<1, 0b10, op11_8, op7_4,
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000783 (outs DPR:$Vd, DPR:$dst2, DPR:$dst3, DPR:$dst4, GPR:$wb),
Owen Andersonf431eda2010-11-02 23:47:29 +0000784 (ins addrmode6:$Rn, am6offset:$Rm,
Bob Wilsona1023642010-03-20 20:47:18 +0000785 DPR:$src1, DPR:$src2, DPR:$src3, DPR:$src4, nohash_imm:$lane),
Bob Wilson6eb08dd2011-02-07 17:43:12 +0000786 IIC_VLD4lnu, "vld4", Dt,
Owen Andersonf431eda2010-11-02 23:47:29 +0000787"\\{$Vd[$lane], $dst2[$lane], $dst3[$lane], $dst4[$lane]\\}, $Rn$Rm",
788"$src1 = $Vd, $src2 = $dst2, $src3 = $dst3, $src4 = $dst4, $Rn.addr = $wb",
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000789 []> {
Owen Andersonf431eda2010-11-02 23:47:29 +0000790 let Inst{4} = Rn{4};
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000791}
Bob Wilsona1023642010-03-20 20:47:18 +0000792
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000793def VLD4LNd8_UPD : VLD4LNWB<0b0011, {?,?,?,?}, "8"> {
794 let Inst{7-5} = lane{2-0};
795}
796def VLD4LNd16_UPD : VLD4LNWB<0b0111, {?,?,0,?}, "16"> {
797 let Inst{7-6} = lane{1-0};
798}
799def VLD4LNd32_UPD : VLD4LNWB<0b1011, {?,0,?,?}, "32"> {
800 let Inst{7} = lane{0};
Owen Andersonf431eda2010-11-02 23:47:29 +0000801 let Inst{5} = Rn{5};
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000802}
Bob Wilsona1023642010-03-20 20:47:18 +0000803
Evan Cheng10dc63f2010-10-09 04:07:58 +0000804def VLD4LNd8Pseudo_UPD : VLDQQLNWBPseudo<IIC_VLD4lnu>;
805def VLD4LNd16Pseudo_UPD : VLDQQLNWBPseudo<IIC_VLD4lnu>;
806def VLD4LNd32Pseudo_UPD : VLDQQLNWBPseudo<IIC_VLD4lnu>;
Bob Wilson8466fa12010-09-13 23:01:35 +0000807
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000808def VLD4LNq16_UPD : VLD4LNWB<0b0111, {?,?,1,?}, "16"> {
809 let Inst{7-6} = lane{1-0};
810}
811def VLD4LNq32_UPD : VLD4LNWB<0b1011, {?,1,?,?}, "32"> {
812 let Inst{7} = lane{0};
Owen Andersonf431eda2010-11-02 23:47:29 +0000813 let Inst{5} = Rn{5};
Owen Andersonf0ea0f22010-11-02 20:40:59 +0000814}
Bob Wilsona1023642010-03-20 20:47:18 +0000815
Evan Cheng10dc63f2010-10-09 04:07:58 +0000816def VLD4LNq16Pseudo_UPD : VLDQQQQLNWBPseudo<IIC_VLD4lnu>;
817def VLD4LNq32Pseudo_UPD : VLDQQQQLNWBPseudo<IIC_VLD4lnu>;
Bob Wilson8466fa12010-09-13 23:01:35 +0000818
Bob Wilson2a0e9742010-11-27 06:35:16 +0000819} // mayLoad = 1, neverHasSideEffects = 1, hasExtraDefRegAllocReq = 1
820
Bob Wilsonb07c1712009-10-07 21:53:04 +0000821// VLD1DUP : Vector Load (single element to all lanes)
Bob Wilsonf3d2f9d2010-11-28 06:51:15 +0000822class VLD1DUP<bits<4> op7_4, string Dt, ValueType Ty, PatFrag LoadOp>
Bob Wilson8e0c7b52010-11-30 00:00:42 +0000823 : NLdSt<1, 0b10, 0b1100, op7_4, (outs DPR:$Vd), (ins addrmode6dup:$Rn),
Bob Wilson2a0e9742010-11-27 06:35:16 +0000824 IIC_VLD1dup, "vld1", Dt, "\\{$Vd[]\\}, $Rn", "",
Bob Wilson8e0c7b52010-11-30 00:00:42 +0000825 [(set DPR:$Vd, (Ty (NEONvdup (i32 (LoadOp addrmode6dup:$Rn)))))]> {
Bob Wilson2a0e9742010-11-27 06:35:16 +0000826 let Rm = 0b1111;
Bob Wilsonbce55772010-11-27 07:12:02 +0000827 let Inst{4} = Rn{4};
Bob Wilson2a0e9742010-11-27 06:35:16 +0000828}
829class VLD1QDUPPseudo<ValueType Ty, PatFrag LoadOp> : VLDQPseudo<IIC_VLD1dup> {
830 let Pattern = [(set QPR:$dst,
Bob Wilson8e0c7b52010-11-30 00:00:42 +0000831 (Ty (NEONvdup (i32 (LoadOp addrmode6dup:$addr)))))];
Bob Wilson2a0e9742010-11-27 06:35:16 +0000832}
833
Bob Wilsonf3d2f9d2010-11-28 06:51:15 +0000834def VLD1DUPd8 : VLD1DUP<{0,0,0,?}, "8", v8i8, extloadi8>;
835def VLD1DUPd16 : VLD1DUP<{0,1,0,?}, "16", v4i16, extloadi16>;
836def VLD1DUPd32 : VLD1DUP<{1,0,0,?}, "32", v2i32, load>;
Bob Wilson2a0e9742010-11-27 06:35:16 +0000837
838def VLD1DUPq8Pseudo : VLD1QDUPPseudo<v16i8, extloadi8>;
839def VLD1DUPq16Pseudo : VLD1QDUPPseudo<v8i16, extloadi16>;
840def VLD1DUPq32Pseudo : VLD1QDUPPseudo<v4i32, load>;
841
Bob Wilson746fa172010-12-10 22:13:32 +0000842def : Pat<(v2f32 (NEONvdup (f32 (load addrmode6dup:$addr)))),
843 (VLD1DUPd32 addrmode6:$addr)>;
844def : Pat<(v4f32 (NEONvdup (f32 (load addrmode6dup:$addr)))),
845 (VLD1DUPq32Pseudo addrmode6:$addr)>;
846
Bob Wilson2a0e9742010-11-27 06:35:16 +0000847let mayLoad = 1, neverHasSideEffects = 1, hasExtraDefRegAllocReq = 1 in {
848
Bob Wilson20d55152010-12-10 22:13:24 +0000849class VLD1QDUP<bits<4> op7_4, string Dt>
Bob Wilsonf3d2f9d2010-11-28 06:51:15 +0000850 : NLdSt<1, 0b10, 0b1100, op7_4, (outs DPR:$Vd, DPR:$dst2),
Bob Wilson8e0c7b52010-11-30 00:00:42 +0000851 (ins addrmode6dup:$Rn), IIC_VLD1dup,
Bob Wilson2a0e9742010-11-27 06:35:16 +0000852 "vld1", Dt, "\\{$Vd[], $dst2[]\\}, $Rn", "", []> {
853 let Rm = 0b1111;
Bob Wilsonbce55772010-11-27 07:12:02 +0000854 let Inst{4} = Rn{4};
Bob Wilson2a0e9742010-11-27 06:35:16 +0000855}
856
Bob Wilson20d55152010-12-10 22:13:24 +0000857def VLD1DUPq8 : VLD1QDUP<{0,0,1,0}, "8">;
858def VLD1DUPq16 : VLD1QDUP<{0,1,1,?}, "16">;
859def VLD1DUPq32 : VLD1QDUP<{1,0,1,?}, "32">;
Bob Wilson2a0e9742010-11-27 06:35:16 +0000860
861// ...with address register writeback:
Bob Wilsonf3d2f9d2010-11-28 06:51:15 +0000862class VLD1DUPWB<bits<4> op7_4, string Dt>
863 : NLdSt<1, 0b10, 0b1100, op7_4, (outs DPR:$Vd, GPR:$wb),
Bob Wilson8e0c7b52010-11-30 00:00:42 +0000864 (ins addrmode6dup:$Rn, am6offset:$Rm), IIC_VLD1dupu,
Bob Wilsonbce55772010-11-27 07:12:02 +0000865 "vld1", Dt, "\\{$Vd[]\\}, $Rn$Rm", "$Rn.addr = $wb", []> {
866 let Inst{4} = Rn{4};
867}
Bob Wilsonf3d2f9d2010-11-28 06:51:15 +0000868class VLD1QDUPWB<bits<4> op7_4, string Dt>
869 : NLdSt<1, 0b10, 0b1100, op7_4, (outs DPR:$Vd, DPR:$dst2, GPR:$wb),
Bob Wilson8e0c7b52010-11-30 00:00:42 +0000870 (ins addrmode6dup:$Rn, am6offset:$Rm), IIC_VLD1dupu,
Bob Wilsonbce55772010-11-27 07:12:02 +0000871 "vld1", Dt, "\\{$Vd[], $dst2[]\\}, $Rn$Rm", "$Rn.addr = $wb", []> {
872 let Inst{4} = Rn{4};
873}
Bob Wilson2a0e9742010-11-27 06:35:16 +0000874
Bob Wilsonf3d2f9d2010-11-28 06:51:15 +0000875def VLD1DUPd8_UPD : VLD1DUPWB<{0,0,0,0}, "8">;
876def VLD1DUPd16_UPD : VLD1DUPWB<{0,1,0,?}, "16">;
877def VLD1DUPd32_UPD : VLD1DUPWB<{1,0,0,?}, "32">;
Bob Wilson2a0e9742010-11-27 06:35:16 +0000878
Bob Wilsonf3d2f9d2010-11-28 06:51:15 +0000879def VLD1DUPq8_UPD : VLD1QDUPWB<{0,0,1,0}, "8">;
880def VLD1DUPq16_UPD : VLD1QDUPWB<{0,1,1,?}, "16">;
881def VLD1DUPq32_UPD : VLD1QDUPWB<{1,0,1,?}, "32">;
Bob Wilson2a0e9742010-11-27 06:35:16 +0000882
883def VLD1DUPq8Pseudo_UPD : VLDQWBPseudo<IIC_VLD1dupu>;
884def VLD1DUPq16Pseudo_UPD : VLDQWBPseudo<IIC_VLD1dupu>;
885def VLD1DUPq32Pseudo_UPD : VLDQWBPseudo<IIC_VLD1dupu>;
886
Bob Wilsonb07c1712009-10-07 21:53:04 +0000887// VLD2DUP : Vector Load (single 2-element structure to all lanes)
Bob Wilsonb1dfa7a2010-11-28 06:51:26 +0000888class VLD2DUP<bits<4> op7_4, string Dt>
889 : NLdSt<1, 0b10, 0b1101, op7_4, (outs DPR:$Vd, DPR:$dst2),
Bob Wilson8e0c7b52010-11-30 00:00:42 +0000890 (ins addrmode6dup:$Rn), IIC_VLD2dup,
Bob Wilsonb1dfa7a2010-11-28 06:51:26 +0000891 "vld2", Dt, "\\{$Vd[], $dst2[]\\}, $Rn", "", []> {
892 let Rm = 0b1111;
893 let Inst{4} = Rn{4};
894}
895
896def VLD2DUPd8 : VLD2DUP<{0,0,0,?}, "8">;
897def VLD2DUPd16 : VLD2DUP<{0,1,0,?}, "16">;
898def VLD2DUPd32 : VLD2DUP<{1,0,0,?}, "32">;
899
900def VLD2DUPd8Pseudo : VLDQPseudo<IIC_VLD2dup>;
901def VLD2DUPd16Pseudo : VLDQPseudo<IIC_VLD2dup>;
902def VLD2DUPd32Pseudo : VLDQPseudo<IIC_VLD2dup>;
903
904// ...with double-spaced registers (not used for codegen):
Bob Wilson173fb142010-11-30 00:00:38 +0000905def VLD2DUPd8x2 : VLD2DUP<{0,0,1,?}, "8">;
906def VLD2DUPd16x2 : VLD2DUP<{0,1,1,?}, "16">;
907def VLD2DUPd32x2 : VLD2DUP<{1,0,1,?}, "32">;
Bob Wilsonb1dfa7a2010-11-28 06:51:26 +0000908
909// ...with address register writeback:
910class VLD2DUPWB<bits<4> op7_4, string Dt>
911 : NLdSt<1, 0b10, 0b1101, op7_4, (outs DPR:$Vd, DPR:$dst2, GPR:$wb),
Bob Wilson8e0c7b52010-11-30 00:00:42 +0000912 (ins addrmode6dup:$Rn, am6offset:$Rm), IIC_VLD2dupu,
Bob Wilsonb1dfa7a2010-11-28 06:51:26 +0000913 "vld2", Dt, "\\{$Vd[], $dst2[]\\}, $Rn$Rm", "$Rn.addr = $wb", []> {
914 let Inst{4} = Rn{4};
915}
916
917def VLD2DUPd8_UPD : VLD2DUPWB<{0,0,0,0}, "8">;
918def VLD2DUPd16_UPD : VLD2DUPWB<{0,1,0,?}, "16">;
919def VLD2DUPd32_UPD : VLD2DUPWB<{1,0,0,?}, "32">;
920
Bob Wilson173fb142010-11-30 00:00:38 +0000921def VLD2DUPd8x2_UPD : VLD2DUPWB<{0,0,1,0}, "8">;
922def VLD2DUPd16x2_UPD : VLD2DUPWB<{0,1,1,?}, "16">;
923def VLD2DUPd32x2_UPD : VLD2DUPWB<{1,0,1,?}, "32">;
Bob Wilsonb1dfa7a2010-11-28 06:51:26 +0000924
925def VLD2DUPd8Pseudo_UPD : VLDQWBPseudo<IIC_VLD2dupu>;
926def VLD2DUPd16Pseudo_UPD : VLDQWBPseudo<IIC_VLD2dupu>;
927def VLD2DUPd32Pseudo_UPD : VLDQWBPseudo<IIC_VLD2dupu>;
928
Bob Wilsonb07c1712009-10-07 21:53:04 +0000929// VLD3DUP : Vector Load (single 3-element structure to all lanes)
Bob Wilson86c6d802010-11-29 19:35:29 +0000930class VLD3DUP<bits<4> op7_4, string Dt>
931 : NLdSt<1, 0b10, 0b1110, op7_4, (outs DPR:$Vd, DPR:$dst2, DPR:$dst3),
Bob Wilson8e0c7b52010-11-30 00:00:42 +0000932 (ins addrmode6dup:$Rn), IIC_VLD3dup,
Bob Wilson86c6d802010-11-29 19:35:29 +0000933 "vld3", Dt, "\\{$Vd[], $dst2[], $dst3[]\\}, $Rn", "", []> {
934 let Rm = 0b1111;
935 let Inst{4} = Rn{4};
936}
937
938def VLD3DUPd8 : VLD3DUP<{0,0,0,?}, "8">;
939def VLD3DUPd16 : VLD3DUP<{0,1,0,?}, "16">;
940def VLD3DUPd32 : VLD3DUP<{1,0,0,?}, "32">;
941
942def VLD3DUPd8Pseudo : VLDQQPseudo<IIC_VLD3dup>;
943def VLD3DUPd16Pseudo : VLDQQPseudo<IIC_VLD3dup>;
944def VLD3DUPd32Pseudo : VLDQQPseudo<IIC_VLD3dup>;
945
946// ...with double-spaced registers (not used for codegen):
Bob Wilson173fb142010-11-30 00:00:38 +0000947def VLD3DUPd8x2 : VLD3DUP<{0,0,1,?}, "8">;
948def VLD3DUPd16x2 : VLD3DUP<{0,1,1,?}, "16">;
949def VLD3DUPd32x2 : VLD3DUP<{1,0,1,?}, "32">;
Bob Wilson86c6d802010-11-29 19:35:29 +0000950
951// ...with address register writeback:
952class VLD3DUPWB<bits<4> op7_4, string Dt>
953 : NLdSt<1, 0b10, 0b1110, op7_4, (outs DPR:$Vd, DPR:$dst2, DPR:$dst3, GPR:$wb),
Bob Wilson8e0c7b52010-11-30 00:00:42 +0000954 (ins addrmode6dup:$Rn, am6offset:$Rm), IIC_VLD3dupu,
Bob Wilson86c6d802010-11-29 19:35:29 +0000955 "vld3", Dt, "\\{$Vd[], $dst2[], $dst3[]\\}, $Rn$Rm",
956 "$Rn.addr = $wb", []> {
957 let Inst{4} = Rn{4};
958}
959
960def VLD3DUPd8_UPD : VLD3DUPWB<{0,0,0,0}, "8">;
961def VLD3DUPd16_UPD : VLD3DUPWB<{0,1,0,?}, "16">;
962def VLD3DUPd32_UPD : VLD3DUPWB<{1,0,0,?}, "32">;
963
Bob Wilson173fb142010-11-30 00:00:38 +0000964def VLD3DUPd8x2_UPD : VLD3DUPWB<{0,0,1,0}, "8">;
965def VLD3DUPd16x2_UPD : VLD3DUPWB<{0,1,1,?}, "16">;
966def VLD3DUPd32x2_UPD : VLD3DUPWB<{1,0,1,?}, "32">;
Bob Wilson86c6d802010-11-29 19:35:29 +0000967
968def VLD3DUPd8Pseudo_UPD : VLDQQWBPseudo<IIC_VLD3dupu>;
969def VLD3DUPd16Pseudo_UPD : VLDQQWBPseudo<IIC_VLD3dupu>;
970def VLD3DUPd32Pseudo_UPD : VLDQQWBPseudo<IIC_VLD3dupu>;
971
Bob Wilsonb07c1712009-10-07 21:53:04 +0000972// VLD4DUP : Vector Load (single 4-element structure to all lanes)
Bob Wilson6c4c9822010-11-30 00:00:35 +0000973class VLD4DUP<bits<4> op7_4, string Dt>
974 : NLdSt<1, 0b10, 0b1111, op7_4,
975 (outs DPR:$Vd, DPR:$dst2, DPR:$dst3, DPR:$dst4),
Bob Wilson8e0c7b52010-11-30 00:00:42 +0000976 (ins addrmode6dup:$Rn), IIC_VLD4dup,
Bob Wilson6c4c9822010-11-30 00:00:35 +0000977 "vld4", Dt, "\\{$Vd[], $dst2[], $dst3[], $dst4[]\\}, $Rn", "", []> {
978 let Rm = 0b1111;
Bob Wilson8e0c7b52010-11-30 00:00:42 +0000979 let Inst{4} = Rn{4};
Bob Wilson6c4c9822010-11-30 00:00:35 +0000980}
981
Bob Wilson8e0c7b52010-11-30 00:00:42 +0000982def VLD4DUPd8 : VLD4DUP<{0,0,0,?}, "8">;
983def VLD4DUPd16 : VLD4DUP<{0,1,0,?}, "16">;
984def VLD4DUPd32 : VLD4DUP<{1,?,0,?}, "32"> { let Inst{6} = Rn{5}; }
Bob Wilson6c4c9822010-11-30 00:00:35 +0000985
986def VLD4DUPd8Pseudo : VLDQQPseudo<IIC_VLD4dup>;
987def VLD4DUPd16Pseudo : VLDQQPseudo<IIC_VLD4dup>;
988def VLD4DUPd32Pseudo : VLDQQPseudo<IIC_VLD4dup>;
989
990// ...with double-spaced registers (not used for codegen):
Bob Wilson8e0c7b52010-11-30 00:00:42 +0000991def VLD4DUPd8x2 : VLD4DUP<{0,0,1,?}, "8">;
992def VLD4DUPd16x2 : VLD4DUP<{0,1,1,?}, "16">;
993def VLD4DUPd32x2 : VLD4DUP<{1,?,1,?}, "32"> { let Inst{6} = Rn{5}; }
Bob Wilson6c4c9822010-11-30 00:00:35 +0000994
995// ...with address register writeback:
996class VLD4DUPWB<bits<4> op7_4, string Dt>
997 : NLdSt<1, 0b10, 0b1111, op7_4,
998 (outs DPR:$Vd, DPR:$dst2, DPR:$dst3, DPR:$dst4, GPR:$wb),
Bob Wilson8e0c7b52010-11-30 00:00:42 +0000999 (ins addrmode6dup:$Rn, am6offset:$Rm), IIC_VLD4dupu,
Bob Wilson6c4c9822010-11-30 00:00:35 +00001000 "vld4", Dt, "\\{$Vd[], $dst2[], $dst3[], $dst4[]\\}, $Rn$Rm",
Bob Wilson8e0c7b52010-11-30 00:00:42 +00001001 "$Rn.addr = $wb", []> {
1002 let Inst{4} = Rn{4};
Bob Wilson6c4c9822010-11-30 00:00:35 +00001003}
1004
Bob Wilson8e0c7b52010-11-30 00:00:42 +00001005def VLD4DUPd8_UPD : VLD4DUPWB<{0,0,0,0}, "8">;
1006def VLD4DUPd16_UPD : VLD4DUPWB<{0,1,0,?}, "16">;
1007def VLD4DUPd32_UPD : VLD4DUPWB<{1,?,0,?}, "32"> { let Inst{6} = Rn{5}; }
1008
1009def VLD4DUPd8x2_UPD : VLD4DUPWB<{0,0,1,0}, "8">;
1010def VLD4DUPd16x2_UPD : VLD4DUPWB<{0,1,1,?}, "16">;
1011def VLD4DUPd32x2_UPD : VLD4DUPWB<{1,?,1,?}, "32"> { let Inst{6} = Rn{5}; }
Bob Wilson6c4c9822010-11-30 00:00:35 +00001012
1013def VLD4DUPd8Pseudo_UPD : VLDQQWBPseudo<IIC_VLD4dupu>;
1014def VLD4DUPd16Pseudo_UPD : VLDQQWBPseudo<IIC_VLD4dupu>;
1015def VLD4DUPd32Pseudo_UPD : VLDQQWBPseudo<IIC_VLD4dupu>;
1016
Evan Cheng5fd1c9b2010-05-19 06:07:03 +00001017} // mayLoad = 1, neverHasSideEffects = 1, hasExtraDefRegAllocReq = 1
Bob Wilsondbd3c0e2009-08-12 00:49:01 +00001018
Evan Cheng5fd1c9b2010-05-19 06:07:03 +00001019let mayStore = 1, neverHasSideEffects = 1, hasExtraSrcRegAllocReq = 1 in {
Bob Wilson25eb5012010-03-20 20:54:36 +00001020
Bob Wilson709d5922010-08-25 23:27:42 +00001021// Classes for VST* pseudo-instructions with multi-register operands.
1022// These are expanded to real instructions after register allocation.
Bob Wilson9d84fb32010-09-14 20:59:49 +00001023class VSTQPseudo<InstrItinClass itin>
1024 : PseudoNLdSt<(outs), (ins addrmode6:$addr, QPR:$src), itin, "">;
1025class VSTQWBPseudo<InstrItinClass itin>
Bob Wilsone5ce4f62010-08-28 05:12:57 +00001026 : PseudoNLdSt<(outs GPR:$wb),
Bob Wilson9d84fb32010-09-14 20:59:49 +00001027 (ins addrmode6:$addr, am6offset:$offset, QPR:$src), itin,
Bob Wilsone5ce4f62010-08-28 05:12:57 +00001028 "$addr.addr = $wb">;
Bob Wilson9d84fb32010-09-14 20:59:49 +00001029class VSTQQPseudo<InstrItinClass itin>
1030 : PseudoNLdSt<(outs), (ins addrmode6:$addr, QQPR:$src), itin, "">;
1031class VSTQQWBPseudo<InstrItinClass itin>
Bob Wilson709d5922010-08-25 23:27:42 +00001032 : PseudoNLdSt<(outs GPR:$wb),
Bob Wilson9d84fb32010-09-14 20:59:49 +00001033 (ins addrmode6:$addr, am6offset:$offset, QQPR:$src), itin,
Bob Wilson709d5922010-08-25 23:27:42 +00001034 "$addr.addr = $wb">;
Bob Wilson7de68142011-02-07 17:43:15 +00001035class VSTQQQQPseudo<InstrItinClass itin>
1036 : PseudoNLdSt<(outs), (ins addrmode6:$addr, QQQQPR:$src), itin, "">;
Bob Wilson9d84fb32010-09-14 20:59:49 +00001037class VSTQQQQWBPseudo<InstrItinClass itin>
Bob Wilson709d5922010-08-25 23:27:42 +00001038 : PseudoNLdSt<(outs GPR:$wb),
Evan Cheng60ff8792010-10-11 22:03:18 +00001039 (ins addrmode6:$addr, am6offset:$offset, QQQQPR:$src), itin,
Bob Wilson709d5922010-08-25 23:27:42 +00001040 "$addr.addr = $wb">;
1041
Bob Wilson11d98992010-03-23 06:20:33 +00001042// VST1 : Vector Store (multiple single elements)
1043class VST1D<bits<4> op7_4, string Dt>
Owen Andersonf431eda2010-11-02 23:47:29 +00001044 : NLdSt<0,0b00,0b0111,op7_4, (outs), (ins addrmode6:$Rn, DPR:$Vd),
1045 IIC_VST1, "vst1", Dt, "\\{$Vd\\}, $Rn", "", []> {
1046 let Rm = 0b1111;
1047 let Inst{4} = Rn{4};
Owen Andersoncfebe3a2010-11-02 21:06:06 +00001048}
Bob Wilson11d98992010-03-23 06:20:33 +00001049class VST1Q<bits<4> op7_4, string Dt>
1050 : NLdSt<0,0b00,0b1010,op7_4, (outs),
Owen Andersonf431eda2010-11-02 23:47:29 +00001051 (ins addrmode6:$Rn, DPR:$Vd, DPR:$src2), IIC_VST1x2,
1052 "vst1", Dt, "\\{$Vd, $src2\\}, $Rn", "", []> {
1053 let Rm = 0b1111;
1054 let Inst{5-4} = Rn{5-4};
Owen Andersoncfebe3a2010-11-02 21:06:06 +00001055}
Bob Wilson11d98992010-03-23 06:20:33 +00001056
Owen Andersoncfebe3a2010-11-02 21:06:06 +00001057def VST1d8 : VST1D<{0,0,0,?}, "8">;
1058def VST1d16 : VST1D<{0,1,0,?}, "16">;
1059def VST1d32 : VST1D<{1,0,0,?}, "32">;
1060def VST1d64 : VST1D<{1,1,0,?}, "64">;
Bob Wilson11d98992010-03-23 06:20:33 +00001061
Owen Andersoncfebe3a2010-11-02 21:06:06 +00001062def VST1q8 : VST1Q<{0,0,?,?}, "8">;
1063def VST1q16 : VST1Q<{0,1,?,?}, "16">;
1064def VST1q32 : VST1Q<{1,0,?,?}, "32">;
1065def VST1q64 : VST1Q<{1,1,?,?}, "64">;
Bob Wilson11d98992010-03-23 06:20:33 +00001066
Evan Cheng60ff8792010-10-11 22:03:18 +00001067def VST1q8Pseudo : VSTQPseudo<IIC_VST1x2>;
1068def VST1q16Pseudo : VSTQPseudo<IIC_VST1x2>;
1069def VST1q32Pseudo : VSTQPseudo<IIC_VST1x2>;
1070def VST1q64Pseudo : VSTQPseudo<IIC_VST1x2>;
Bob Wilsone5ce4f62010-08-28 05:12:57 +00001071
Bob Wilson25eb5012010-03-20 20:54:36 +00001072// ...with address register writeback:
1073class VST1DWB<bits<4> op7_4, string Dt>
1074 : NLdSt<0, 0b00, 0b0111, op7_4, (outs GPR:$wb),
Owen Andersonf431eda2010-11-02 23:47:29 +00001075 (ins addrmode6:$Rn, am6offset:$Rm, DPR:$Vd), IIC_VST1u,
1076 "vst1", Dt, "\\{$Vd\\}, $Rn$Rm", "$Rn.addr = $wb", []> {
1077 let Inst{4} = Rn{4};
Owen Andersoncfebe3a2010-11-02 21:06:06 +00001078}
Bob Wilson25eb5012010-03-20 20:54:36 +00001079class VST1QWB<bits<4> op7_4, string Dt>
1080 : NLdSt<0, 0b00, 0b1010, op7_4, (outs GPR:$wb),
Owen Andersonf431eda2010-11-02 23:47:29 +00001081 (ins addrmode6:$Rn, am6offset:$Rm, DPR:$Vd, DPR:$src2),
1082 IIC_VST1x2u, "vst1", Dt, "\\{$Vd, $src2\\}, $Rn$Rm",
1083 "$Rn.addr = $wb", []> {
1084 let Inst{5-4} = Rn{5-4};
Owen Andersoncfebe3a2010-11-02 21:06:06 +00001085}
Bob Wilson25eb5012010-03-20 20:54:36 +00001086
Owen Andersoncfebe3a2010-11-02 21:06:06 +00001087def VST1d8_UPD : VST1DWB<{0,0,0,?}, "8">;
1088def VST1d16_UPD : VST1DWB<{0,1,0,?}, "16">;
1089def VST1d32_UPD : VST1DWB<{1,0,0,?}, "32">;
1090def VST1d64_UPD : VST1DWB<{1,1,0,?}, "64">;
Bob Wilson25eb5012010-03-20 20:54:36 +00001091
Owen Andersoncfebe3a2010-11-02 21:06:06 +00001092def VST1q8_UPD : VST1QWB<{0,0,?,?}, "8">;
1093def VST1q16_UPD : VST1QWB<{0,1,?,?}, "16">;
1094def VST1q32_UPD : VST1QWB<{1,0,?,?}, "32">;
1095def VST1q64_UPD : VST1QWB<{1,1,?,?}, "64">;
Bob Wilson25eb5012010-03-20 20:54:36 +00001096
Evan Cheng60ff8792010-10-11 22:03:18 +00001097def VST1q8Pseudo_UPD : VSTQWBPseudo<IIC_VST1x2u>;
1098def VST1q16Pseudo_UPD : VSTQWBPseudo<IIC_VST1x2u>;
1099def VST1q32Pseudo_UPD : VSTQWBPseudo<IIC_VST1x2u>;
1100def VST1q64Pseudo_UPD : VSTQWBPseudo<IIC_VST1x2u>;
Bob Wilsone5ce4f62010-08-28 05:12:57 +00001101
Bob Wilson052ba452010-03-22 18:22:06 +00001102// ...with 3 registers (some of these are only for the disassembler):
Bob Wilson95808322010-03-18 20:18:39 +00001103class VST1D3<bits<4> op7_4, string Dt>
Johnny Chenf50e83f2010-02-24 02:57:20 +00001104 : NLdSt<0, 0b00, 0b0110, op7_4, (outs),
Owen Andersonf431eda2010-11-02 23:47:29 +00001105 (ins addrmode6:$Rn, DPR:$Vd, DPR:$src2, DPR:$src3),
1106 IIC_VST1x3, "vst1", Dt, "\\{$Vd, $src2, $src3\\}, $Rn", "", []> {
1107 let Rm = 0b1111;
1108 let Inst{4} = Rn{4};
Owen Andersoncfebe3a2010-11-02 21:06:06 +00001109}
Bob Wilson25eb5012010-03-20 20:54:36 +00001110class VST1D3WB<bits<4> op7_4, string Dt>
1111 : NLdSt<0, 0b00, 0b0110, op7_4, (outs GPR:$wb),
Owen Andersonf431eda2010-11-02 23:47:29 +00001112 (ins addrmode6:$Rn, am6offset:$Rm,
Owen Andersoncfebe3a2010-11-02 21:06:06 +00001113 DPR:$Vd, DPR:$src2, DPR:$src3),
Owen Andersonf431eda2010-11-02 23:47:29 +00001114 IIC_VST1x3u, "vst1", Dt, "\\{$Vd, $src2, $src3\\}, $Rn$Rm",
1115 "$Rn.addr = $wb", []> {
1116 let Inst{4} = Rn{4};
Owen Andersoncfebe3a2010-11-02 21:06:06 +00001117}
Bob Wilson052ba452010-03-22 18:22:06 +00001118
Owen Andersoncfebe3a2010-11-02 21:06:06 +00001119def VST1d8T : VST1D3<{0,0,0,?}, "8">;
1120def VST1d16T : VST1D3<{0,1,0,?}, "16">;
1121def VST1d32T : VST1D3<{1,0,0,?}, "32">;
1122def VST1d64T : VST1D3<{1,1,0,?}, "64">;
Bob Wilson052ba452010-03-22 18:22:06 +00001123
Owen Andersoncfebe3a2010-11-02 21:06:06 +00001124def VST1d8T_UPD : VST1D3WB<{0,0,0,?}, "8">;
1125def VST1d16T_UPD : VST1D3WB<{0,1,0,?}, "16">;
1126def VST1d32T_UPD : VST1D3WB<{1,0,0,?}, "32">;
1127def VST1d64T_UPD : VST1D3WB<{1,1,0,?}, "64">;
Bob Wilson052ba452010-03-22 18:22:06 +00001128
Evan Cheng60ff8792010-10-11 22:03:18 +00001129def VST1d64TPseudo : VSTQQPseudo<IIC_VST1x3>;
1130def VST1d64TPseudo_UPD : VSTQQWBPseudo<IIC_VST1x3u>;
Bob Wilson01ba4612010-08-26 18:51:29 +00001131
Bob Wilson052ba452010-03-22 18:22:06 +00001132// ...with 4 registers (some of these are only for the disassembler):
1133class VST1D4<bits<4> op7_4, string Dt>
1134 : NLdSt<0, 0b00, 0b0010, op7_4, (outs),
Owen Andersonf431eda2010-11-02 23:47:29 +00001135 (ins addrmode6:$Rn, DPR:$Vd, DPR:$src2, DPR:$src3, DPR:$src4),
1136 IIC_VST1x4, "vst1", Dt, "\\{$Vd, $src2, $src3, $src4\\}, $Rn", "",
Owen Andersoncfebe3a2010-11-02 21:06:06 +00001137 []> {
Owen Andersonf431eda2010-11-02 23:47:29 +00001138 let Rm = 0b1111;
1139 let Inst{5-4} = Rn{5-4};
Owen Andersoncfebe3a2010-11-02 21:06:06 +00001140}
Bob Wilson25eb5012010-03-20 20:54:36 +00001141class VST1D4WB<bits<4> op7_4, string Dt>
1142 : NLdSt<0, 0b00, 0b0010, op7_4, (outs GPR:$wb),
Owen Andersonf431eda2010-11-02 23:47:29 +00001143 (ins addrmode6:$Rn, am6offset:$Rm,
Owen Andersoncfebe3a2010-11-02 21:06:06 +00001144 DPR:$Vd, DPR:$src2, DPR:$src3, DPR:$src4), IIC_VST1x4u,
Owen Andersonf431eda2010-11-02 23:47:29 +00001145 "vst1", Dt, "\\{$Vd, $src2, $src3, $src4\\}, $Rn$Rm",
1146 "$Rn.addr = $wb", []> {
1147 let Inst{5-4} = Rn{5-4};
Owen Andersoncfebe3a2010-11-02 21:06:06 +00001148}
Bob Wilson25eb5012010-03-20 20:54:36 +00001149
Owen Andersoncfebe3a2010-11-02 21:06:06 +00001150def VST1d8Q : VST1D4<{0,0,?,?}, "8">;
1151def VST1d16Q : VST1D4<{0,1,?,?}, "16">;
1152def VST1d32Q : VST1D4<{1,0,?,?}, "32">;
1153def VST1d64Q : VST1D4<{1,1,?,?}, "64">;
Bob Wilson25eb5012010-03-20 20:54:36 +00001154
Owen Andersoncfebe3a2010-11-02 21:06:06 +00001155def VST1d8Q_UPD : VST1D4WB<{0,0,?,?}, "8">;
1156def VST1d16Q_UPD : VST1D4WB<{0,1,?,?}, "16">;
1157def VST1d32Q_UPD : VST1D4WB<{1,0,?,?}, "32">;
1158def VST1d64Q_UPD : VST1D4WB<{1,1,?,?}, "64">;
Bob Wilson9f7d60f2009-08-12 17:04:56 +00001159
Evan Cheng60ff8792010-10-11 22:03:18 +00001160def VST1d64QPseudo : VSTQQPseudo<IIC_VST1x4>;
1161def VST1d64QPseudo_UPD : VSTQQWBPseudo<IIC_VST1x4u>;
Bob Wilson70e48b22010-08-26 05:33:30 +00001162
Bob Wilsonb36ec862009-08-06 18:47:44 +00001163// VST2 : Vector Store (multiple 2-element structures)
Bob Wilson068b18b2010-03-20 21:15:48 +00001164class VST2D<bits<4> op11_8, bits<4> op7_4, string Dt>
1165 : NLdSt<0, 0b00, op11_8, op7_4, (outs),
Owen Andersonf431eda2010-11-02 23:47:29 +00001166 (ins addrmode6:$Rn, DPR:$Vd, DPR:$src2),
1167 IIC_VST2, "vst2", Dt, "\\{$Vd, $src2\\}, $Rn", "", []> {
1168 let Rm = 0b1111;
1169 let Inst{5-4} = Rn{5-4};
Owen Andersond2f37942010-11-02 21:16:58 +00001170}
Bob Wilson95808322010-03-18 20:18:39 +00001171class VST2Q<bits<4> op7_4, string Dt>
Bob Wilson068b18b2010-03-20 21:15:48 +00001172 : NLdSt<0, 0b00, 0b0011, op7_4, (outs),
Owen Andersonf431eda2010-11-02 23:47:29 +00001173 (ins addrmode6:$Rn, DPR:$Vd, DPR:$src2, DPR:$src3, DPR:$src4),
1174 IIC_VST2x2, "vst2", Dt, "\\{$Vd, $src2, $src3, $src4\\}, $Rn",
Owen Andersond2f37942010-11-02 21:16:58 +00001175 "", []> {
Owen Andersonf431eda2010-11-02 23:47:29 +00001176 let Rm = 0b1111;
1177 let Inst{5-4} = Rn{5-4};
Owen Andersond2f37942010-11-02 21:16:58 +00001178}
Bob Wilsonb36ec862009-08-06 18:47:44 +00001179
Owen Andersond2f37942010-11-02 21:16:58 +00001180def VST2d8 : VST2D<0b1000, {0,0,?,?}, "8">;
1181def VST2d16 : VST2D<0b1000, {0,1,?,?}, "16">;
1182def VST2d32 : VST2D<0b1000, {1,0,?,?}, "32">;
Bob Wilsonb36ec862009-08-06 18:47:44 +00001183
Owen Andersond2f37942010-11-02 21:16:58 +00001184def VST2q8 : VST2Q<{0,0,?,?}, "8">;
1185def VST2q16 : VST2Q<{0,1,?,?}, "16">;
1186def VST2q32 : VST2Q<{1,0,?,?}, "32">;
Bob Wilsond2855752009-10-07 18:47:39 +00001187
Evan Cheng60ff8792010-10-11 22:03:18 +00001188def VST2d8Pseudo : VSTQPseudo<IIC_VST2>;
1189def VST2d16Pseudo : VSTQPseudo<IIC_VST2>;
1190def VST2d32Pseudo : VSTQPseudo<IIC_VST2>;
Bob Wilsone5ce4f62010-08-28 05:12:57 +00001191
Evan Cheng60ff8792010-10-11 22:03:18 +00001192def VST2q8Pseudo : VSTQQPseudo<IIC_VST2x2>;
1193def VST2q16Pseudo : VSTQQPseudo<IIC_VST2x2>;
1194def VST2q32Pseudo : VSTQQPseudo<IIC_VST2x2>;
Bob Wilsone5ce4f62010-08-28 05:12:57 +00001195
Bob Wilson4f4f93f2010-03-20 21:45:18 +00001196// ...with address register writeback:
1197class VST2DWB<bits<4> op11_8, bits<4> op7_4, string Dt>
1198 : NLdSt<0, 0b00, op11_8, op7_4, (outs GPR:$wb),
Owen Andersonf431eda2010-11-02 23:47:29 +00001199 (ins addrmode6:$Rn, am6offset:$Rm, DPR:$Vd, DPR:$src2),
1200 IIC_VST2u, "vst2", Dt, "\\{$Vd, $src2\\}, $Rn$Rm",
1201 "$Rn.addr = $wb", []> {
1202 let Inst{5-4} = Rn{5-4};
Owen Andersond2f37942010-11-02 21:16:58 +00001203}
Bob Wilson4f4f93f2010-03-20 21:45:18 +00001204class VST2QWB<bits<4> op7_4, string Dt>
1205 : NLdSt<0, 0b00, 0b0011, op7_4, (outs GPR:$wb),
Owen Andersonf431eda2010-11-02 23:47:29 +00001206 (ins addrmode6:$Rn, am6offset:$Rm,
Owen Andersond2f37942010-11-02 21:16:58 +00001207 DPR:$Vd, DPR:$src2, DPR:$src3, DPR:$src4), IIC_VST2x2u,
Owen Andersonf431eda2010-11-02 23:47:29 +00001208 "vst2", Dt, "\\{$Vd, $src2, $src3, $src4\\}, $Rn$Rm",
1209 "$Rn.addr = $wb", []> {
1210 let Inst{5-4} = Rn{5-4};
Owen Andersond2f37942010-11-02 21:16:58 +00001211}
Bob Wilson4f4f93f2010-03-20 21:45:18 +00001212
Owen Andersond2f37942010-11-02 21:16:58 +00001213def VST2d8_UPD : VST2DWB<0b1000, {0,0,?,?}, "8">;
1214def VST2d16_UPD : VST2DWB<0b1000, {0,1,?,?}, "16">;
1215def VST2d32_UPD : VST2DWB<0b1000, {1,0,?,?}, "32">;
Bob Wilson4f4f93f2010-03-20 21:45:18 +00001216
Owen Andersond2f37942010-11-02 21:16:58 +00001217def VST2q8_UPD : VST2QWB<{0,0,?,?}, "8">;
1218def VST2q16_UPD : VST2QWB<{0,1,?,?}, "16">;
1219def VST2q32_UPD : VST2QWB<{1,0,?,?}, "32">;
Bob Wilson4f4f93f2010-03-20 21:45:18 +00001220
Evan Cheng60ff8792010-10-11 22:03:18 +00001221def VST2d8Pseudo_UPD : VSTQWBPseudo<IIC_VST2u>;
1222def VST2d16Pseudo_UPD : VSTQWBPseudo<IIC_VST2u>;
1223def VST2d32Pseudo_UPD : VSTQWBPseudo<IIC_VST2u>;
Bob Wilsone5ce4f62010-08-28 05:12:57 +00001224
Evan Cheng60ff8792010-10-11 22:03:18 +00001225def VST2q8Pseudo_UPD : VSTQQWBPseudo<IIC_VST2x2u>;
1226def VST2q16Pseudo_UPD : VSTQQWBPseudo<IIC_VST2x2u>;
1227def VST2q32Pseudo_UPD : VSTQQWBPseudo<IIC_VST2x2u>;
Bob Wilsone5ce4f62010-08-28 05:12:57 +00001228
Bob Wilson068b18b2010-03-20 21:15:48 +00001229// ...with double-spaced registers (for disassembly only):
Owen Andersond2f37942010-11-02 21:16:58 +00001230def VST2b8 : VST2D<0b1001, {0,0,?,?}, "8">;
1231def VST2b16 : VST2D<0b1001, {0,1,?,?}, "16">;
1232def VST2b32 : VST2D<0b1001, {1,0,?,?}, "32">;
1233def VST2b8_UPD : VST2DWB<0b1001, {0,0,?,?}, "8">;
1234def VST2b16_UPD : VST2DWB<0b1001, {0,1,?,?}, "16">;
1235def VST2b32_UPD : VST2DWB<0b1001, {1,0,?,?}, "32">;
Johnny Chenf50e83f2010-02-24 02:57:20 +00001236
Bob Wilsonb36ec862009-08-06 18:47:44 +00001237// VST3 : Vector Store (multiple 3-element structures)
Bob Wilson068b18b2010-03-20 21:15:48 +00001238class VST3D<bits<4> op11_8, bits<4> op7_4, string Dt>
1239 : NLdSt<0, 0b00, op11_8, op7_4, (outs),
Owen Andersonf431eda2010-11-02 23:47:29 +00001240 (ins addrmode6:$Rn, DPR:$Vd, DPR:$src2, DPR:$src3), IIC_VST3,
1241 "vst3", Dt, "\\{$Vd, $src2, $src3\\}, $Rn", "", []> {
1242 let Rm = 0b1111;
1243 let Inst{4} = Rn{4};
Owen Andersona1a45fd2010-11-02 21:47:03 +00001244}
Bob Wilsonb36ec862009-08-06 18:47:44 +00001245
Owen Andersona1a45fd2010-11-02 21:47:03 +00001246def VST3d8 : VST3D<0b0100, {0,0,0,?}, "8">;
1247def VST3d16 : VST3D<0b0100, {0,1,0,?}, "16">;
1248def VST3d32 : VST3D<0b0100, {1,0,0,?}, "32">;
Bob Wilsonb36ec862009-08-06 18:47:44 +00001249
Evan Cheng60ff8792010-10-11 22:03:18 +00001250def VST3d8Pseudo : VSTQQPseudo<IIC_VST3>;
1251def VST3d16Pseudo : VSTQQPseudo<IIC_VST3>;
1252def VST3d32Pseudo : VSTQQPseudo<IIC_VST3>;
Bob Wilson01ba4612010-08-26 18:51:29 +00001253
Bob Wilson4f4f93f2010-03-20 21:45:18 +00001254// ...with address register writeback:
1255class VST3DWB<bits<4> op11_8, bits<4> op7_4, string Dt>
1256 : NLdSt<0, 0b00, op11_8, op7_4, (outs GPR:$wb),
Owen Andersonf431eda2010-11-02 23:47:29 +00001257 (ins addrmode6:$Rn, am6offset:$Rm,
Owen Andersona1a45fd2010-11-02 21:47:03 +00001258 DPR:$Vd, DPR:$src2, DPR:$src3), IIC_VST3u,
Owen Andersonf431eda2010-11-02 23:47:29 +00001259 "vst3", Dt, "\\{$Vd, $src2, $src3\\}, $Rn$Rm",
1260 "$Rn.addr = $wb", []> {
1261 let Inst{4} = Rn{4};
Owen Andersona1a45fd2010-11-02 21:47:03 +00001262}
Bob Wilson4f4f93f2010-03-20 21:45:18 +00001263
Owen Andersona1a45fd2010-11-02 21:47:03 +00001264def VST3d8_UPD : VST3DWB<0b0100, {0,0,0,?}, "8">;
1265def VST3d16_UPD : VST3DWB<0b0100, {0,1,0,?}, "16">;
1266def VST3d32_UPD : VST3DWB<0b0100, {1,0,0,?}, "32">;
Bob Wilson4f4f93f2010-03-20 21:45:18 +00001267
Evan Cheng60ff8792010-10-11 22:03:18 +00001268def VST3d8Pseudo_UPD : VSTQQWBPseudo<IIC_VST3u>;
1269def VST3d16Pseudo_UPD : VSTQQWBPseudo<IIC_VST3u>;
1270def VST3d32Pseudo_UPD : VSTQQWBPseudo<IIC_VST3u>;
Bob Wilson01ba4612010-08-26 18:51:29 +00001271
Bob Wilson7de68142011-02-07 17:43:15 +00001272// ...with double-spaced registers:
Owen Andersona1a45fd2010-11-02 21:47:03 +00001273def VST3q8 : VST3D<0b0101, {0,0,0,?}, "8">;
1274def VST3q16 : VST3D<0b0101, {0,1,0,?}, "16">;
1275def VST3q32 : VST3D<0b0101, {1,0,0,?}, "32">;
1276def VST3q8_UPD : VST3DWB<0b0101, {0,0,0,?}, "8">;
1277def VST3q16_UPD : VST3DWB<0b0101, {0,1,0,?}, "16">;
1278def VST3q32_UPD : VST3DWB<0b0101, {1,0,0,?}, "32">;
Bob Wilson068b18b2010-03-20 21:15:48 +00001279
Evan Cheng60ff8792010-10-11 22:03:18 +00001280def VST3q8Pseudo_UPD : VSTQQQQWBPseudo<IIC_VST3u>;
1281def VST3q16Pseudo_UPD : VSTQQQQWBPseudo<IIC_VST3u>;
1282def VST3q32Pseudo_UPD : VSTQQQQWBPseudo<IIC_VST3u>;
Bob Wilson01ba4612010-08-26 18:51:29 +00001283
Bob Wilson4f4f93f2010-03-20 21:45:18 +00001284// ...alternate versions to be allocated odd register numbers:
Bob Wilson7de68142011-02-07 17:43:15 +00001285def VST3q8oddPseudo : VSTQQQQPseudo<IIC_VST3>;
1286def VST3q16oddPseudo : VSTQQQQPseudo<IIC_VST3>;
1287def VST3q32oddPseudo : VSTQQQQPseudo<IIC_VST3>;
1288
Evan Cheng60ff8792010-10-11 22:03:18 +00001289def VST3q8oddPseudo_UPD : VSTQQQQWBPseudo<IIC_VST3u>;
1290def VST3q16oddPseudo_UPD : VSTQQQQWBPseudo<IIC_VST3u>;
1291def VST3q32oddPseudo_UPD : VSTQQQQWBPseudo<IIC_VST3u>;
Bob Wilson66a70632009-10-07 20:30:08 +00001292
Bob Wilsonb36ec862009-08-06 18:47:44 +00001293// VST4 : Vector Store (multiple 4-element structures)
Bob Wilson068b18b2010-03-20 21:15:48 +00001294class VST4D<bits<4> op11_8, bits<4> op7_4, string Dt>
1295 : NLdSt<0, 0b00, op11_8, op7_4, (outs),
Owen Andersonf431eda2010-11-02 23:47:29 +00001296 (ins addrmode6:$Rn, DPR:$Vd, DPR:$src2, DPR:$src3, DPR:$src4),
1297 IIC_VST4, "vst4", Dt, "\\{$Vd, $src2, $src3, $src4\\}, $Rn",
Owen Andersona1a45fd2010-11-02 21:47:03 +00001298 "", []> {
Owen Andersonf431eda2010-11-02 23:47:29 +00001299 let Rm = 0b1111;
1300 let Inst{5-4} = Rn{5-4};
Owen Andersona1a45fd2010-11-02 21:47:03 +00001301}
Bob Wilsonb36ec862009-08-06 18:47:44 +00001302
Owen Andersona1a45fd2010-11-02 21:47:03 +00001303def VST4d8 : VST4D<0b0000, {0,0,?,?}, "8">;
1304def VST4d16 : VST4D<0b0000, {0,1,?,?}, "16">;
1305def VST4d32 : VST4D<0b0000, {1,0,?,?}, "32">;
Bob Wilson8a3198b2009-09-01 18:51:56 +00001306
Evan Cheng60ff8792010-10-11 22:03:18 +00001307def VST4d8Pseudo : VSTQQPseudo<IIC_VST4>;
1308def VST4d16Pseudo : VSTQQPseudo<IIC_VST4>;
1309def VST4d32Pseudo : VSTQQPseudo<IIC_VST4>;
Bob Wilson709d5922010-08-25 23:27:42 +00001310
Bob Wilson4f4f93f2010-03-20 21:45:18 +00001311// ...with address register writeback:
1312class VST4DWB<bits<4> op11_8, bits<4> op7_4, string Dt>
1313 : NLdSt<0, 0b00, op11_8, op7_4, (outs GPR:$wb),
Owen Andersonf431eda2010-11-02 23:47:29 +00001314 (ins addrmode6:$Rn, am6offset:$Rm,
Owen Andersona1a45fd2010-11-02 21:47:03 +00001315 DPR:$Vd, DPR:$src2, DPR:$src3, DPR:$src4), IIC_VST4u,
Owen Andersonf431eda2010-11-02 23:47:29 +00001316 "vst4", Dt, "\\{$Vd, $src2, $src3, $src4\\}, $Rn$Rm",
1317 "$Rn.addr = $wb", []> {
1318 let Inst{5-4} = Rn{5-4};
Owen Andersona1a45fd2010-11-02 21:47:03 +00001319}
Bob Wilson4f4f93f2010-03-20 21:45:18 +00001320
Owen Andersona1a45fd2010-11-02 21:47:03 +00001321def VST4d8_UPD : VST4DWB<0b0000, {0,0,?,?}, "8">;
1322def VST4d16_UPD : VST4DWB<0b0000, {0,1,?,?}, "16">;
1323def VST4d32_UPD : VST4DWB<0b0000, {1,0,?,?}, "32">;
Bob Wilson4f4f93f2010-03-20 21:45:18 +00001324
Evan Cheng60ff8792010-10-11 22:03:18 +00001325def VST4d8Pseudo_UPD : VSTQQWBPseudo<IIC_VST4u>;
1326def VST4d16Pseudo_UPD : VSTQQWBPseudo<IIC_VST4u>;
1327def VST4d32Pseudo_UPD : VSTQQWBPseudo<IIC_VST4u>;
Bob Wilson709d5922010-08-25 23:27:42 +00001328
Bob Wilson7de68142011-02-07 17:43:15 +00001329// ...with double-spaced registers:
Owen Andersona1a45fd2010-11-02 21:47:03 +00001330def VST4q8 : VST4D<0b0001, {0,0,?,?}, "8">;
1331def VST4q16 : VST4D<0b0001, {0,1,?,?}, "16">;
1332def VST4q32 : VST4D<0b0001, {1,0,?,?}, "32">;
1333def VST4q8_UPD : VST4DWB<0b0001, {0,0,?,?}, "8">;
1334def VST4q16_UPD : VST4DWB<0b0001, {0,1,?,?}, "16">;
1335def VST4q32_UPD : VST4DWB<0b0001, {1,0,?,?}, "32">;
Bob Wilson068b18b2010-03-20 21:15:48 +00001336
Evan Cheng60ff8792010-10-11 22:03:18 +00001337def VST4q8Pseudo_UPD : VSTQQQQWBPseudo<IIC_VST4u>;
1338def VST4q16Pseudo_UPD : VSTQQQQWBPseudo<IIC_VST4u>;
1339def VST4q32Pseudo_UPD : VSTQQQQWBPseudo<IIC_VST4u>;
Bob Wilson709d5922010-08-25 23:27:42 +00001340
Bob Wilson4f4f93f2010-03-20 21:45:18 +00001341// ...alternate versions to be allocated odd register numbers:
Bob Wilson7de68142011-02-07 17:43:15 +00001342def VST4q8oddPseudo : VSTQQQQPseudo<IIC_VST4>;
1343def VST4q16oddPseudo : VSTQQQQPseudo<IIC_VST4>;
1344def VST4q32oddPseudo : VSTQQQQPseudo<IIC_VST4>;
1345
Evan Cheng60ff8792010-10-11 22:03:18 +00001346def VST4q8oddPseudo_UPD : VSTQQQQWBPseudo<IIC_VST4u>;
1347def VST4q16oddPseudo_UPD : VSTQQQQWBPseudo<IIC_VST4u>;
1348def VST4q32oddPseudo_UPD : VSTQQQQWBPseudo<IIC_VST4u>;
Bob Wilsonb07c1712009-10-07 21:53:04 +00001349
Bob Wilsond0c6bc22010-11-02 21:18:25 +00001350} // mayStore = 1, neverHasSideEffects = 1, hasExtraSrcRegAllocReq = 1
1351
Bob Wilson8466fa12010-09-13 23:01:35 +00001352// Classes for VST*LN pseudo-instructions with multi-register operands.
1353// These are expanded to real instructions after register allocation.
1354class VSTQLNPseudo<InstrItinClass itin>
1355 : PseudoNLdSt<(outs), (ins addrmode6:$addr, QPR:$src, nohash_imm:$lane),
1356 itin, "">;
1357class VSTQLNWBPseudo<InstrItinClass itin>
1358 : PseudoNLdSt<(outs GPR:$wb),
1359 (ins addrmode6:$addr, am6offset:$offset, QPR:$src,
1360 nohash_imm:$lane), itin, "$addr.addr = $wb">;
1361class VSTQQLNPseudo<InstrItinClass itin>
1362 : PseudoNLdSt<(outs), (ins addrmode6:$addr, QQPR:$src, nohash_imm:$lane),
1363 itin, "">;
1364class VSTQQLNWBPseudo<InstrItinClass itin>
1365 : PseudoNLdSt<(outs GPR:$wb),
1366 (ins addrmode6:$addr, am6offset:$offset, QQPR:$src,
1367 nohash_imm:$lane), itin, "$addr.addr = $wb">;
1368class VSTQQQQLNPseudo<InstrItinClass itin>
1369 : PseudoNLdSt<(outs), (ins addrmode6:$addr, QQQQPR:$src, nohash_imm:$lane),
1370 itin, "">;
1371class VSTQQQQLNWBPseudo<InstrItinClass itin>
1372 : PseudoNLdSt<(outs GPR:$wb),
1373 (ins addrmode6:$addr, am6offset:$offset, QQQQPR:$src,
1374 nohash_imm:$lane), itin, "$addr.addr = $wb">;
1375
Bob Wilsonb07c1712009-10-07 21:53:04 +00001376// VST1LN : Vector Store (single element from one lane)
Bob Wilsond168cef2010-11-03 16:24:53 +00001377class VST1LN<bits<4> op11_8, bits<4> op7_4, string Dt, ValueType Ty,
1378 PatFrag StoreOp, SDNode ExtractOp>
Owen Andersone95c9462010-11-02 21:54:45 +00001379 : NLdStLn<1, 0b00, op11_8, op7_4, (outs),
Owen Andersonf431eda2010-11-02 23:47:29 +00001380 (ins addrmode6:$Rn, DPR:$Vd, nohash_imm:$lane),
Bob Wilsond168cef2010-11-03 16:24:53 +00001381 IIC_VST1ln, "vst1", Dt, "\\{$Vd[$lane]\\}, $Rn", "",
1382 [(StoreOp (ExtractOp (Ty DPR:$Vd), imm:$lane), addrmode6:$Rn)]> {
Owen Andersonf431eda2010-11-02 23:47:29 +00001383 let Rm = 0b1111;
Owen Andersone95c9462010-11-02 21:54:45 +00001384}
Mon P Wang183c6272011-05-09 17:47:27 +00001385class VST1LN32<bits<4> op11_8, bits<4> op7_4, string Dt, ValueType Ty,
1386 PatFrag StoreOp, SDNode ExtractOp>
1387 : NLdStLn<1, 0b00, op11_8, op7_4, (outs),
1388 (ins addrmode6oneL32:$Rn, DPR:$Vd, nohash_imm:$lane),
1389 IIC_VST1ln, "vst1", Dt, "\\{$Vd[$lane]\\}, $Rn", "",
Jim Grosbachf921c0fe2011-06-13 22:54:22 +00001390 [(StoreOp (ExtractOp (Ty DPR:$Vd), imm:$lane), addrmode6oneL32:$Rn)]>{
Mon P Wang183c6272011-05-09 17:47:27 +00001391 let Rm = 0b1111;
1392}
Bob Wilsond168cef2010-11-03 16:24:53 +00001393class VST1QLNPseudo<ValueType Ty, PatFrag StoreOp, SDNode ExtractOp>
1394 : VSTQLNPseudo<IIC_VST1ln> {
1395 let Pattern = [(StoreOp (ExtractOp (Ty QPR:$src), imm:$lane),
1396 addrmode6:$addr)];
1397}
Bob Wilsond0c6bc22010-11-02 21:18:25 +00001398
Bob Wilsond168cef2010-11-03 16:24:53 +00001399def VST1LNd8 : VST1LN<0b0000, {?,?,?,0}, "8", v8i8, truncstorei8,
1400 NEONvgetlaneu> {
Owen Andersone95c9462010-11-02 21:54:45 +00001401 let Inst{7-5} = lane{2-0};
1402}
Bob Wilsond168cef2010-11-03 16:24:53 +00001403def VST1LNd16 : VST1LN<0b0100, {?,?,0,?}, "16", v4i16, truncstorei16,
1404 NEONvgetlaneu> {
Owen Andersone95c9462010-11-02 21:54:45 +00001405 let Inst{7-6} = lane{1-0};
Owen Andersonf431eda2010-11-02 23:47:29 +00001406 let Inst{4} = Rn{5};
Owen Andersone95c9462010-11-02 21:54:45 +00001407}
Mon P Wang183c6272011-05-09 17:47:27 +00001408
1409def VST1LNd32 : VST1LN32<0b1000, {?,0,?,?}, "32", v2i32, store, extractelt> {
Owen Andersone95c9462010-11-02 21:54:45 +00001410 let Inst{7} = lane{0};
Owen Andersonf431eda2010-11-02 23:47:29 +00001411 let Inst{5-4} = Rn{5-4};
Owen Andersone95c9462010-11-02 21:54:45 +00001412}
Bob Wilsond0c6bc22010-11-02 21:18:25 +00001413
Bob Wilsond168cef2010-11-03 16:24:53 +00001414def VST1LNq8Pseudo : VST1QLNPseudo<v16i8, truncstorei8, NEONvgetlaneu>;
1415def VST1LNq16Pseudo : VST1QLNPseudo<v8i16, truncstorei16, NEONvgetlaneu>;
1416def VST1LNq32Pseudo : VST1QLNPseudo<v4i32, store, extractelt>;
Bob Wilsond0c6bc22010-11-02 21:18:25 +00001417
Bob Wilson746fa172010-12-10 22:13:32 +00001418def : Pat<(store (extractelt (v2f32 DPR:$src), imm:$lane), addrmode6:$addr),
1419 (VST1LNd32 addrmode6:$addr, DPR:$src, imm:$lane)>;
1420def : Pat<(store (extractelt (v4f32 QPR:$src), imm:$lane), addrmode6:$addr),
1421 (VST1LNq32Pseudo addrmode6:$addr, QPR:$src, imm:$lane)>;
1422
Bob Wilsond0c6bc22010-11-02 21:18:25 +00001423// ...with address register writeback:
Bob Wilsonda525062011-02-25 06:42:42 +00001424class VST1LNWB<bits<4> op11_8, bits<4> op7_4, string Dt, ValueType Ty,
1425 PatFrag StoreOp, SDNode ExtractOp>
Owen Andersone95c9462010-11-02 21:54:45 +00001426 : NLdStLn<1, 0b00, op11_8, op7_4, (outs GPR:$wb),
Owen Andersonf431eda2010-11-02 23:47:29 +00001427 (ins addrmode6:$Rn, am6offset:$Rm,
Owen Andersone95c9462010-11-02 21:54:45 +00001428 DPR:$Vd, nohash_imm:$lane), IIC_VST1lnu, "vst1", Dt,
Owen Andersonf431eda2010-11-02 23:47:29 +00001429 "\\{$Vd[$lane]\\}, $Rn$Rm",
Bob Wilsonda525062011-02-25 06:42:42 +00001430 "$Rn.addr = $wb",
1431 [(set GPR:$wb, (StoreOp (ExtractOp (Ty DPR:$Vd), imm:$lane),
1432 addrmode6:$Rn, am6offset:$Rm))]>;
1433class VST1QLNWBPseudo<ValueType Ty, PatFrag StoreOp, SDNode ExtractOp>
1434 : VSTQLNWBPseudo<IIC_VST1lnu> {
1435 let Pattern = [(set GPR:$wb, (StoreOp (ExtractOp (Ty QPR:$src), imm:$lane),
1436 addrmode6:$addr, am6offset:$offset))];
1437}
Bob Wilsond0c6bc22010-11-02 21:18:25 +00001438
Bob Wilsonda525062011-02-25 06:42:42 +00001439def VST1LNd8_UPD : VST1LNWB<0b0000, {?,?,?,0}, "8", v8i8, post_truncsti8,
1440 NEONvgetlaneu> {
Owen Andersone95c9462010-11-02 21:54:45 +00001441 let Inst{7-5} = lane{2-0};
1442}
Bob Wilsonda525062011-02-25 06:42:42 +00001443def VST1LNd16_UPD : VST1LNWB<0b0100, {?,?,0,?}, "16", v4i16, post_truncsti16,
1444 NEONvgetlaneu> {
Owen Andersone95c9462010-11-02 21:54:45 +00001445 let Inst{7-6} = lane{1-0};
Owen Andersonf431eda2010-11-02 23:47:29 +00001446 let Inst{4} = Rn{5};
Owen Andersone95c9462010-11-02 21:54:45 +00001447}
Bob Wilsonda525062011-02-25 06:42:42 +00001448def VST1LNd32_UPD : VST1LNWB<0b1000, {?,0,?,?}, "32", v2i32, post_store,
1449 extractelt> {
Owen Andersone95c9462010-11-02 21:54:45 +00001450 let Inst{7} = lane{0};
Owen Andersonf431eda2010-11-02 23:47:29 +00001451 let Inst{5-4} = Rn{5-4};
Owen Andersone95c9462010-11-02 21:54:45 +00001452}
Bob Wilsond0c6bc22010-11-02 21:18:25 +00001453
Bob Wilsonda525062011-02-25 06:42:42 +00001454def VST1LNq8Pseudo_UPD : VST1QLNWBPseudo<v16i8, post_truncsti8, NEONvgetlaneu>;
1455def VST1LNq16Pseudo_UPD : VST1QLNWBPseudo<v8i16, post_truncsti16,NEONvgetlaneu>;
1456def VST1LNq32Pseudo_UPD : VST1QLNWBPseudo<v4i32, post_store, extractelt>;
1457
1458let mayStore = 1, neverHasSideEffects = 1, hasExtraSrcRegAllocReq = 1 in {
Bob Wilson63c90632009-10-07 20:49:18 +00001459
Bob Wilson8a3198b2009-09-01 18:51:56 +00001460// VST2LN : Vector Store (single 2-element structure from one lane)
Bob Wilson39842552010-03-22 16:43:10 +00001461class VST2LN<bits<4> op11_8, bits<4> op7_4, string Dt>
Owen Andersonb20594f2010-11-02 22:18:18 +00001462 : NLdStLn<1, 0b00, op11_8, op7_4, (outs),
Owen Andersonf431eda2010-11-02 23:47:29 +00001463 (ins addrmode6:$Rn, DPR:$Vd, DPR:$src2, nohash_imm:$lane),
1464 IIC_VST2ln, "vst2", Dt, "\\{$Vd[$lane], $src2[$lane]\\}, $Rn",
Owen Andersonb20594f2010-11-02 22:18:18 +00001465 "", []> {
Owen Andersonf431eda2010-11-02 23:47:29 +00001466 let Rm = 0b1111;
1467 let Inst{4} = Rn{4};
Owen Andersonb20594f2010-11-02 22:18:18 +00001468}
Bob Wilson8a3198b2009-09-01 18:51:56 +00001469
Owen Andersonb20594f2010-11-02 22:18:18 +00001470def VST2LNd8 : VST2LN<0b0001, {?,?,?,?}, "8"> {
1471 let Inst{7-5} = lane{2-0};
1472}
1473def VST2LNd16 : VST2LN<0b0101, {?,?,0,?}, "16"> {
1474 let Inst{7-6} = lane{1-0};
1475}
1476def VST2LNd32 : VST2LN<0b1001, {?,0,0,?}, "32"> {
1477 let Inst{7} = lane{0};
1478}
Bob Wilsonc5c6edb2009-10-08 23:38:24 +00001479
Evan Cheng60ff8792010-10-11 22:03:18 +00001480def VST2LNd8Pseudo : VSTQLNPseudo<IIC_VST2ln>;
1481def VST2LNd16Pseudo : VSTQLNPseudo<IIC_VST2ln>;
1482def VST2LNd32Pseudo : VSTQLNPseudo<IIC_VST2ln>;
Bob Wilson8466fa12010-09-13 23:01:35 +00001483
Bob Wilson41315282010-03-20 20:39:53 +00001484// ...with double-spaced registers:
Owen Andersonb20594f2010-11-02 22:18:18 +00001485def VST2LNq16 : VST2LN<0b0101, {?,?,1,?}, "16"> {
1486 let Inst{7-6} = lane{1-0};
Owen Andersonf431eda2010-11-02 23:47:29 +00001487 let Inst{4} = Rn{4};
Owen Andersonb20594f2010-11-02 22:18:18 +00001488}
1489def VST2LNq32 : VST2LN<0b1001, {?,1,0,?}, "32"> {
1490 let Inst{7} = lane{0};
Owen Andersonf431eda2010-11-02 23:47:29 +00001491 let Inst{4} = Rn{4};
Owen Andersonb20594f2010-11-02 22:18:18 +00001492}
Bob Wilsonc5c6edb2009-10-08 23:38:24 +00001493
Evan Cheng60ff8792010-10-11 22:03:18 +00001494def VST2LNq16Pseudo : VSTQQLNPseudo<IIC_VST2ln>;
1495def VST2LNq32Pseudo : VSTQQLNPseudo<IIC_VST2ln>;
Bob Wilson8a3198b2009-09-01 18:51:56 +00001496
Bob Wilsond5fadaf2010-03-20 21:57:36 +00001497// ...with address register writeback:
Bob Wilson39842552010-03-22 16:43:10 +00001498class VST2LNWB<bits<4> op11_8, bits<4> op7_4, string Dt>
Owen Andersonb20594f2010-11-02 22:18:18 +00001499 : NLdStLn<1, 0b00, op11_8, op7_4, (outs GPR:$wb),
Bob Wilson226036e2010-03-20 22:13:40 +00001500 (ins addrmode6:$addr, am6offset:$offset,
Evan Cheng60ff8792010-10-11 22:03:18 +00001501 DPR:$src1, DPR:$src2, nohash_imm:$lane), IIC_VST2lnu, "vst2", Dt,
Bob Wilson226036e2010-03-20 22:13:40 +00001502 "\\{$src1[$lane], $src2[$lane]\\}, $addr$offset",
Owen Andersonb20594f2010-11-02 22:18:18 +00001503 "$addr.addr = $wb", []> {
Owen Andersonf431eda2010-11-02 23:47:29 +00001504 let Inst{4} = Rn{4};
Owen Andersonb20594f2010-11-02 22:18:18 +00001505}
Bob Wilsond5fadaf2010-03-20 21:57:36 +00001506
Owen Andersonb20594f2010-11-02 22:18:18 +00001507def VST2LNd8_UPD : VST2LNWB<0b0001, {?,?,?,?}, "8"> {
1508 let Inst{7-5} = lane{2-0};
1509}
1510def VST2LNd16_UPD : VST2LNWB<0b0101, {?,?,0,?}, "16"> {
1511 let Inst{7-6} = lane{1-0};
1512}
1513def VST2LNd32_UPD : VST2LNWB<0b1001, {?,0,0,?}, "32"> {
1514 let Inst{7} = lane{0};
1515}
Bob Wilsond5fadaf2010-03-20 21:57:36 +00001516
Evan Cheng60ff8792010-10-11 22:03:18 +00001517def VST2LNd8Pseudo_UPD : VSTQLNWBPseudo<IIC_VST2lnu>;
1518def VST2LNd16Pseudo_UPD : VSTQLNWBPseudo<IIC_VST2lnu>;
1519def VST2LNd32Pseudo_UPD : VSTQLNWBPseudo<IIC_VST2lnu>;
Bob Wilson8466fa12010-09-13 23:01:35 +00001520
Owen Andersonb20594f2010-11-02 22:18:18 +00001521def VST2LNq16_UPD : VST2LNWB<0b0101, {?,?,1,?}, "16"> {
1522 let Inst{7-6} = lane{1-0};
1523}
1524def VST2LNq32_UPD : VST2LNWB<0b1001, {?,1,0,?}, "32"> {
1525 let Inst{7} = lane{0};
1526}
Bob Wilsond5fadaf2010-03-20 21:57:36 +00001527
Evan Cheng60ff8792010-10-11 22:03:18 +00001528def VST2LNq16Pseudo_UPD : VSTQQLNWBPseudo<IIC_VST2lnu>;
1529def VST2LNq32Pseudo_UPD : VSTQQLNWBPseudo<IIC_VST2lnu>;
Bob Wilson8466fa12010-09-13 23:01:35 +00001530
Bob Wilson8a3198b2009-09-01 18:51:56 +00001531// VST3LN : Vector Store (single 3-element structure from one lane)
Bob Wilson39842552010-03-22 16:43:10 +00001532class VST3LN<bits<4> op11_8, bits<4> op7_4, string Dt>
Owen Andersonb20594f2010-11-02 22:18:18 +00001533 : NLdStLn<1, 0b00, op11_8, op7_4, (outs),
Owen Andersonf431eda2010-11-02 23:47:29 +00001534 (ins addrmode6:$Rn, DPR:$Vd, DPR:$src2, DPR:$src3,
Evan Cheng60ff8792010-10-11 22:03:18 +00001535 nohash_imm:$lane), IIC_VST3ln, "vst3", Dt,
Owen Andersonf431eda2010-11-02 23:47:29 +00001536 "\\{$Vd[$lane], $src2[$lane], $src3[$lane]\\}, $Rn", "", []> {
1537 let Rm = 0b1111;
Owen Andersonb20594f2010-11-02 22:18:18 +00001538}
Bob Wilson8a3198b2009-09-01 18:51:56 +00001539
Owen Andersonb20594f2010-11-02 22:18:18 +00001540def VST3LNd8 : VST3LN<0b0010, {?,?,?,0}, "8"> {
1541 let Inst{7-5} = lane{2-0};
1542}
1543def VST3LNd16 : VST3LN<0b0110, {?,?,0,0}, "16"> {
1544 let Inst{7-6} = lane{1-0};
1545}
1546def VST3LNd32 : VST3LN<0b1010, {?,0,0,0}, "32"> {
1547 let Inst{7} = lane{0};
1548}
Bob Wilson8cdb2692009-10-08 23:51:31 +00001549
Evan Cheng60ff8792010-10-11 22:03:18 +00001550def VST3LNd8Pseudo : VSTQQLNPseudo<IIC_VST3ln>;
1551def VST3LNd16Pseudo : VSTQQLNPseudo<IIC_VST3ln>;
1552def VST3LNd32Pseudo : VSTQQLNPseudo<IIC_VST3ln>;
Bob Wilson8466fa12010-09-13 23:01:35 +00001553
Bob Wilson41315282010-03-20 20:39:53 +00001554// ...with double-spaced registers:
Owen Andersonb20594f2010-11-02 22:18:18 +00001555def VST3LNq16 : VST3LN<0b0110, {?,?,1,0}, "16"> {
1556 let Inst{7-6} = lane{1-0};
1557}
1558def VST3LNq32 : VST3LN<0b1010, {?,1,0,0}, "32"> {
1559 let Inst{7} = lane{0};
1560}
Bob Wilson8cdb2692009-10-08 23:51:31 +00001561
Evan Cheng60ff8792010-10-11 22:03:18 +00001562def VST3LNq16Pseudo : VSTQQQQLNPseudo<IIC_VST3ln>;
1563def VST3LNq32Pseudo : VSTQQQQLNPseudo<IIC_VST3ln>;
Bob Wilson8a3198b2009-09-01 18:51:56 +00001564
Bob Wilsond5fadaf2010-03-20 21:57:36 +00001565// ...with address register writeback:
Bob Wilson39842552010-03-22 16:43:10 +00001566class VST3LNWB<bits<4> op11_8, bits<4> op7_4, string Dt>
Owen Andersonb20594f2010-11-02 22:18:18 +00001567 : NLdStLn<1, 0b00, op11_8, op7_4, (outs GPR:$wb),
Owen Andersonf431eda2010-11-02 23:47:29 +00001568 (ins addrmode6:$Rn, am6offset:$Rm,
Owen Andersonb20594f2010-11-02 22:18:18 +00001569 DPR:$Vd, DPR:$src2, DPR:$src3, nohash_imm:$lane),
Evan Cheng60ff8792010-10-11 22:03:18 +00001570 IIC_VST3lnu, "vst3", Dt,
Owen Andersonf431eda2010-11-02 23:47:29 +00001571 "\\{$Vd[$lane], $src2[$lane], $src3[$lane]\\}, $Rn$Rm",
1572 "$Rn.addr = $wb", []>;
Bob Wilsond5fadaf2010-03-20 21:57:36 +00001573
Owen Andersonb20594f2010-11-02 22:18:18 +00001574def VST3LNd8_UPD : VST3LNWB<0b0010, {?,?,?,0}, "8"> {
1575 let Inst{7-5} = lane{2-0};
1576}
1577def VST3LNd16_UPD : VST3LNWB<0b0110, {?,?,0,0}, "16"> {
1578 let Inst{7-6} = lane{1-0};
1579}
1580def VST3LNd32_UPD : VST3LNWB<0b1010, {?,0,0,0}, "32"> {
1581 let Inst{7} = lane{0};
1582}
Bob Wilsond5fadaf2010-03-20 21:57:36 +00001583
Evan Cheng60ff8792010-10-11 22:03:18 +00001584def VST3LNd8Pseudo_UPD : VSTQQLNWBPseudo<IIC_VST3lnu>;
1585def VST3LNd16Pseudo_UPD : VSTQQLNWBPseudo<IIC_VST3lnu>;
1586def VST3LNd32Pseudo_UPD : VSTQQLNWBPseudo<IIC_VST3lnu>;
Bob Wilson8466fa12010-09-13 23:01:35 +00001587
Owen Andersonb20594f2010-11-02 22:18:18 +00001588def VST3LNq16_UPD : VST3LNWB<0b0110, {?,?,1,0}, "16"> {
1589 let Inst{7-6} = lane{1-0};
1590}
1591def VST3LNq32_UPD : VST3LNWB<0b1010, {?,1,0,0}, "32"> {
1592 let Inst{7} = lane{0};
1593}
Bob Wilsond5fadaf2010-03-20 21:57:36 +00001594
Evan Cheng60ff8792010-10-11 22:03:18 +00001595def VST3LNq16Pseudo_UPD : VSTQQQQLNWBPseudo<IIC_VST3lnu>;
1596def VST3LNq32Pseudo_UPD : VSTQQQQLNWBPseudo<IIC_VST3lnu>;
Bob Wilson8466fa12010-09-13 23:01:35 +00001597
Bob Wilson8a3198b2009-09-01 18:51:56 +00001598// VST4LN : Vector Store (single 4-element structure from one lane)
Bob Wilson39842552010-03-22 16:43:10 +00001599class VST4LN<bits<4> op11_8, bits<4> op7_4, string Dt>
Owen Andersonb20594f2010-11-02 22:18:18 +00001600 : NLdStLn<1, 0b00, op11_8, op7_4, (outs),
Owen Andersonf431eda2010-11-02 23:47:29 +00001601 (ins addrmode6:$Rn, DPR:$Vd, DPR:$src2, DPR:$src3, DPR:$src4,
Evan Cheng60ff8792010-10-11 22:03:18 +00001602 nohash_imm:$lane), IIC_VST4ln, "vst4", Dt,
Owen Andersonf431eda2010-11-02 23:47:29 +00001603 "\\{$Vd[$lane], $src2[$lane], $src3[$lane], $src4[$lane]\\}, $Rn",
Owen Andersonb20594f2010-11-02 22:18:18 +00001604 "", []> {
Owen Andersonf431eda2010-11-02 23:47:29 +00001605 let Rm = 0b1111;
1606 let Inst{4} = Rn{4};
Owen Andersonb20594f2010-11-02 22:18:18 +00001607}
Bob Wilson8a3198b2009-09-01 18:51:56 +00001608
Owen Andersonb20594f2010-11-02 22:18:18 +00001609def VST4LNd8 : VST4LN<0b0011, {?,?,?,?}, "8"> {
1610 let Inst{7-5} = lane{2-0};
1611}
1612def VST4LNd16 : VST4LN<0b0111, {?,?,0,?}, "16"> {
1613 let Inst{7-6} = lane{1-0};
1614}
1615def VST4LNd32 : VST4LN<0b1011, {?,0,?,?}, "32"> {
1616 let Inst{7} = lane{0};
Owen Andersonf431eda2010-11-02 23:47:29 +00001617 let Inst{5} = Rn{5};
Owen Andersonb20594f2010-11-02 22:18:18 +00001618}
Bob Wilson56311392009-10-09 00:01:36 +00001619
Evan Cheng60ff8792010-10-11 22:03:18 +00001620def VST4LNd8Pseudo : VSTQQLNPseudo<IIC_VST4ln>;
1621def VST4LNd16Pseudo : VSTQQLNPseudo<IIC_VST4ln>;
1622def VST4LNd32Pseudo : VSTQQLNPseudo<IIC_VST4ln>;
Bob Wilson8466fa12010-09-13 23:01:35 +00001623
Bob Wilson41315282010-03-20 20:39:53 +00001624// ...with double-spaced registers:
Owen Andersonb20594f2010-11-02 22:18:18 +00001625def VST4LNq16 : VST4LN<0b0111, {?,?,1,?}, "16"> {
1626 let Inst{7-6} = lane{1-0};
1627}
1628def VST4LNq32 : VST4LN<0b1011, {?,1,?,?}, "32"> {
1629 let Inst{7} = lane{0};
Owen Andersonf431eda2010-11-02 23:47:29 +00001630 let Inst{5} = Rn{5};
Owen Andersonb20594f2010-11-02 22:18:18 +00001631}
Bob Wilson56311392009-10-09 00:01:36 +00001632
Evan Cheng60ff8792010-10-11 22:03:18 +00001633def VST4LNq16Pseudo : VSTQQQQLNPseudo<IIC_VST4ln>;
1634def VST4LNq32Pseudo : VSTQQQQLNPseudo<IIC_VST4ln>;
Bob Wilson56311392009-10-09 00:01:36 +00001635
Bob Wilsond5fadaf2010-03-20 21:57:36 +00001636// ...with address register writeback:
Bob Wilson39842552010-03-22 16:43:10 +00001637class VST4LNWB<bits<4> op11_8, bits<4> op7_4, string Dt>
Owen Andersonb20594f2010-11-02 22:18:18 +00001638 : NLdStLn<1, 0b00, op11_8, op7_4, (outs GPR:$wb),
Owen Andersonf431eda2010-11-02 23:47:29 +00001639 (ins addrmode6:$Rn, am6offset:$Rm,
Owen Andersonb20594f2010-11-02 22:18:18 +00001640 DPR:$Vd, DPR:$src2, DPR:$src3, DPR:$src4, nohash_imm:$lane),
Evan Cheng60ff8792010-10-11 22:03:18 +00001641 IIC_VST4lnu, "vst4", Dt,
Owen Andersonf431eda2010-11-02 23:47:29 +00001642 "\\{$Vd[$lane], $src2[$lane], $src3[$lane], $src4[$lane]\\}, $Rn$Rm",
1643 "$Rn.addr = $wb", []> {
1644 let Inst{4} = Rn{4};
Owen Andersonb20594f2010-11-02 22:18:18 +00001645}
Bob Wilsond5fadaf2010-03-20 21:57:36 +00001646
Owen Andersonb20594f2010-11-02 22:18:18 +00001647def VST4LNd8_UPD : VST4LNWB<0b0011, {?,?,?,?}, "8"> {
1648 let Inst{7-5} = lane{2-0};
1649}
1650def VST4LNd16_UPD : VST4LNWB<0b0111, {?,?,0,?}, "16"> {
1651 let Inst{7-6} = lane{1-0};
1652}
1653def VST4LNd32_UPD : VST4LNWB<0b1011, {?,0,?,?}, "32"> {
1654 let Inst{7} = lane{0};
Owen Andersonf431eda2010-11-02 23:47:29 +00001655 let Inst{5} = Rn{5};
Owen Andersonb20594f2010-11-02 22:18:18 +00001656}
Bob Wilsond5fadaf2010-03-20 21:57:36 +00001657
Evan Cheng60ff8792010-10-11 22:03:18 +00001658def VST4LNd8Pseudo_UPD : VSTQQLNWBPseudo<IIC_VST4lnu>;
1659def VST4LNd16Pseudo_UPD : VSTQQLNWBPseudo<IIC_VST4lnu>;
1660def VST4LNd32Pseudo_UPD : VSTQQLNWBPseudo<IIC_VST4lnu>;
Bob Wilson8466fa12010-09-13 23:01:35 +00001661
Owen Andersonb20594f2010-11-02 22:18:18 +00001662def VST4LNq16_UPD : VST4LNWB<0b0111, {?,?,1,?}, "16"> {
1663 let Inst{7-6} = lane{1-0};
1664}
1665def VST4LNq32_UPD : VST4LNWB<0b1011, {?,1,?,?}, "32"> {
1666 let Inst{7} = lane{0};
Owen Andersonf431eda2010-11-02 23:47:29 +00001667 let Inst{5} = Rn{5};
Owen Andersonb20594f2010-11-02 22:18:18 +00001668}
Bob Wilsond5fadaf2010-03-20 21:57:36 +00001669
Evan Cheng60ff8792010-10-11 22:03:18 +00001670def VST4LNq16Pseudo_UPD : VSTQQQQLNWBPseudo<IIC_VST4lnu>;
1671def VST4LNq32Pseudo_UPD : VSTQQQQLNWBPseudo<IIC_VST4lnu>;
Bob Wilson8466fa12010-09-13 23:01:35 +00001672
Evan Cheng5fd1c9b2010-05-19 06:07:03 +00001673} // mayStore = 1, neverHasSideEffects = 1, hasExtraSrcRegAllocReq = 1
Bob Wilsonb36ec862009-08-06 18:47:44 +00001674
Bob Wilson205a5ca2009-07-08 18:11:30 +00001675
Bob Wilson5bafff32009-06-22 23:27:02 +00001676//===----------------------------------------------------------------------===//
1677// NEON pattern fragments
1678//===----------------------------------------------------------------------===//
1679
1680// Extract D sub-registers of Q registers.
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00001681def DSubReg_i8_reg : SDNodeXForm<imm, [{
Jakob Stoklund Olesen7bb31e32010-05-24 17:13:28 +00001682 assert(ARM::dsub_7 == ARM::dsub_0+7 && "Unexpected subreg numbering");
1683 return CurDAG->getTargetConstant(ARM::dsub_0 + N->getZExtValue()/8, MVT::i32);
Bob Wilson5bafff32009-06-22 23:27:02 +00001684}]>;
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00001685def DSubReg_i16_reg : SDNodeXForm<imm, [{
Jakob Stoklund Olesen7bb31e32010-05-24 17:13:28 +00001686 assert(ARM::dsub_7 == ARM::dsub_0+7 && "Unexpected subreg numbering");
1687 return CurDAG->getTargetConstant(ARM::dsub_0 + N->getZExtValue()/4, MVT::i32);
Bob Wilson5bafff32009-06-22 23:27:02 +00001688}]>;
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00001689def DSubReg_i32_reg : SDNodeXForm<imm, [{
Jakob Stoklund Olesen7bb31e32010-05-24 17:13:28 +00001690 assert(ARM::dsub_7 == ARM::dsub_0+7 && "Unexpected subreg numbering");
1691 return CurDAG->getTargetConstant(ARM::dsub_0 + N->getZExtValue()/2, MVT::i32);
Bob Wilson5bafff32009-06-22 23:27:02 +00001692}]>;
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00001693def DSubReg_f64_reg : SDNodeXForm<imm, [{
Jakob Stoklund Olesen7bb31e32010-05-24 17:13:28 +00001694 assert(ARM::dsub_7 == ARM::dsub_0+7 && "Unexpected subreg numbering");
1695 return CurDAG->getTargetConstant(ARM::dsub_0 + N->getZExtValue(), MVT::i32);
Bob Wilson5bafff32009-06-22 23:27:02 +00001696}]>;
1697
Anton Korobeynikov2324bdc2009-08-28 23:41:26 +00001698// Extract S sub-registers of Q/D registers.
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00001699def SSubReg_f32_reg : SDNodeXForm<imm, [{
Jakob Stoklund Olesen7bb31e32010-05-24 17:13:28 +00001700 assert(ARM::ssub_3 == ARM::ssub_0+3 && "Unexpected subreg numbering");
1701 return CurDAG->getTargetConstant(ARM::ssub_0 + N->getZExtValue(), MVT::i32);
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00001702}]>;
1703
Bob Wilson5bafff32009-06-22 23:27:02 +00001704// Translate lane numbers from Q registers to D subregs.
1705def SubReg_i8_lane : SDNodeXForm<imm, [{
Owen Anderson825b72b2009-08-11 20:47:22 +00001706 return CurDAG->getTargetConstant(N->getZExtValue() & 7, MVT::i32);
Bob Wilson5bafff32009-06-22 23:27:02 +00001707}]>;
1708def SubReg_i16_lane : SDNodeXForm<imm, [{
Owen Anderson825b72b2009-08-11 20:47:22 +00001709 return CurDAG->getTargetConstant(N->getZExtValue() & 3, MVT::i32);
Bob Wilson5bafff32009-06-22 23:27:02 +00001710}]>;
1711def SubReg_i32_lane : SDNodeXForm<imm, [{
Owen Anderson825b72b2009-08-11 20:47:22 +00001712 return CurDAG->getTargetConstant(N->getZExtValue() & 1, MVT::i32);
Bob Wilson5bafff32009-06-22 23:27:02 +00001713}]>;
1714
1715//===----------------------------------------------------------------------===//
1716// Instruction Classes
1717//===----------------------------------------------------------------------===//
1718
Bob Wilson4711d5c2010-12-13 23:02:37 +00001719// Basic 2-register operations: double- and quad-register.
Bob Wilson5bafff32009-06-22 23:27:02 +00001720class N2VD<bits<2> op24_23, bits<2> op21_20, bits<2> op19_18,
Bob Wilson3c0f96e2010-02-17 22:23:11 +00001721 bits<2> op17_16, bits<5> op11_7, bit op4, string OpcodeStr,
1722 string Dt, ValueType ResTy, ValueType OpTy, SDNode OpNode>
Owen Andersonca6945e2010-12-01 00:28:25 +00001723 : N2V<op24_23, op21_20, op19_18, op17_16, op11_7, 0, op4, (outs DPR:$Vd),
1724 (ins DPR:$Vm), IIC_VUNAD, OpcodeStr, Dt,"$Vd, $Vm", "",
1725 [(set DPR:$Vd, (ResTy (OpNode (OpTy DPR:$Vm))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00001726class N2VQ<bits<2> op24_23, bits<2> op21_20, bits<2> op19_18,
Bob Wilson3c0f96e2010-02-17 22:23:11 +00001727 bits<2> op17_16, bits<5> op11_7, bit op4, string OpcodeStr,
1728 string Dt, ValueType ResTy, ValueType OpTy, SDNode OpNode>
Owen Andersonca6945e2010-12-01 00:28:25 +00001729 : N2V<op24_23, op21_20, op19_18, op17_16, op11_7, 1, op4, (outs QPR:$Vd),
1730 (ins QPR:$Vm), IIC_VUNAQ, OpcodeStr, Dt,"$Vd, $Vm", "",
1731 [(set QPR:$Vd, (ResTy (OpNode (OpTy QPR:$Vm))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00001732
Bob Wilson69bfbd62010-02-17 22:42:54 +00001733// Basic 2-register intrinsics, both double- and quad-register.
Bob Wilson5bafff32009-06-22 23:27:02 +00001734class N2VDInt<bits<2> op24_23, bits<2> op21_20, bits<2> op19_18,
Johnny Chenfa80bec2010-03-25 20:39:04 +00001735 bits<2> op17_16, bits<5> op11_7, bit op4,
Evan Chengf81bf152009-11-23 21:57:23 +00001736 InstrItinClass itin, string OpcodeStr, string Dt,
Bob Wilson5bafff32009-06-22 23:27:02 +00001737 ValueType ResTy, ValueType OpTy, Intrinsic IntOp>
Owen Andersonca6945e2010-12-01 00:28:25 +00001738 : N2V<op24_23, op21_20, op19_18, op17_16, op11_7, 0, op4, (outs DPR:$Vd),
1739 (ins DPR:$Vm), itin, OpcodeStr, Dt, "$Vd, $Vm", "",
1740 [(set DPR:$Vd, (ResTy (IntOp (OpTy DPR:$Vm))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00001741class N2VQInt<bits<2> op24_23, bits<2> op21_20, bits<2> op19_18,
David Goodwin127221f2009-09-23 21:38:08 +00001742 bits<2> op17_16, bits<5> op11_7, bit op4,
Evan Chengf81bf152009-11-23 21:57:23 +00001743 InstrItinClass itin, string OpcodeStr, string Dt,
Bob Wilson5bafff32009-06-22 23:27:02 +00001744 ValueType ResTy, ValueType OpTy, Intrinsic IntOp>
Owen Andersonca6945e2010-12-01 00:28:25 +00001745 : N2V<op24_23, op21_20, op19_18, op17_16, op11_7, 1, op4, (outs QPR:$Vd),
1746 (ins QPR:$Vm), itin, OpcodeStr, Dt, "$Vd, $Vm", "",
1747 [(set QPR:$Vd, (ResTy (IntOp (OpTy QPR:$Vm))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00001748
Bob Wilson973a0742010-08-30 20:02:30 +00001749// Narrow 2-register operations.
1750class N2VN<bits<2> op24_23, bits<2> op21_20, bits<2> op19_18,
1751 bits<2> op17_16, bits<5> op11_7, bit op6, bit op4,
1752 InstrItinClass itin, string OpcodeStr, string Dt,
1753 ValueType TyD, ValueType TyQ, SDNode OpNode>
Owen Andersonca6945e2010-12-01 00:28:25 +00001754 : N2V<op24_23, op21_20, op19_18, op17_16, op11_7, op6, op4, (outs DPR:$Vd),
1755 (ins QPR:$Vm), itin, OpcodeStr, Dt, "$Vd, $Vm", "",
1756 [(set DPR:$Vd, (TyD (OpNode (TyQ QPR:$Vm))))]>;
Bob Wilson973a0742010-08-30 20:02:30 +00001757
Bob Wilson5bafff32009-06-22 23:27:02 +00001758// Narrow 2-register intrinsics.
1759class N2VNInt<bits<2> op24_23, bits<2> op21_20, bits<2> op19_18,
1760 bits<2> op17_16, bits<5> op11_7, bit op6, bit op4,
Evan Chengf81bf152009-11-23 21:57:23 +00001761 InstrItinClass itin, string OpcodeStr, string Dt,
David Goodwin127221f2009-09-23 21:38:08 +00001762 ValueType TyD, ValueType TyQ, Intrinsic IntOp>
Owen Andersonca6945e2010-12-01 00:28:25 +00001763 : N2V<op24_23, op21_20, op19_18, op17_16, op11_7, op6, op4, (outs DPR:$Vd),
1764 (ins QPR:$Vm), itin, OpcodeStr, Dt, "$Vd, $Vm", "",
1765 [(set DPR:$Vd, (TyD (IntOp (TyQ QPR:$Vm))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00001766
Bob Wilsonb31a11b2010-08-20 04:54:02 +00001767// Long 2-register operations (currently only used for VMOVL).
1768class N2VL<bits<2> op24_23, bits<2> op21_20, bits<2> op19_18,
1769 bits<2> op17_16, bits<5> op11_7, bit op6, bit op4,
1770 InstrItinClass itin, string OpcodeStr, string Dt,
1771 ValueType TyQ, ValueType TyD, SDNode OpNode>
Owen Andersonca6945e2010-12-01 00:28:25 +00001772 : N2V<op24_23, op21_20, op19_18, op17_16, op11_7, op6, op4, (outs QPR:$Vd),
1773 (ins DPR:$Vm), itin, OpcodeStr, Dt, "$Vd, $Vm", "",
1774 [(set QPR:$Vd, (TyQ (OpNode (TyD DPR:$Vm))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00001775
Bob Wilson04063562010-12-15 22:14:12 +00001776// Long 2-register intrinsics.
1777class N2VLInt<bits<2> op24_23, bits<2> op21_20, bits<2> op19_18,
1778 bits<2> op17_16, bits<5> op11_7, bit op6, bit op4,
1779 InstrItinClass itin, string OpcodeStr, string Dt,
1780 ValueType TyQ, ValueType TyD, Intrinsic IntOp>
1781 : N2V<op24_23, op21_20, op19_18, op17_16, op11_7, op6, op4, (outs QPR:$Vd),
1782 (ins DPR:$Vm), itin, OpcodeStr, Dt, "$Vd, $Vm", "",
1783 [(set QPR:$Vd, (TyQ (IntOp (TyD DPR:$Vm))))]>;
1784
Bob Wilsonb6ab51e2009-08-08 06:13:25 +00001785// 2-register shuffles (VTRN/VZIP/VUZP), both double- and quad-register.
Evan Chengf81bf152009-11-23 21:57:23 +00001786class N2VDShuffle<bits<2> op19_18, bits<5> op11_7, string OpcodeStr, string Dt>
Owen Andersonca6945e2010-12-01 00:28:25 +00001787 : N2V<0b11, 0b11, op19_18, 0b10, op11_7, 0, 0, (outs DPR:$Vd, DPR:$Vm),
Jim Grosbach1251e1a2010-11-18 01:39:50 +00001788 (ins DPR:$src1, DPR:$src2), IIC_VPERMD,
Owen Andersonca6945e2010-12-01 00:28:25 +00001789 OpcodeStr, Dt, "$Vd, $Vm",
1790 "$src1 = $Vd, $src2 = $Vm", []>;
David Goodwin127221f2009-09-23 21:38:08 +00001791class N2VQShuffle<bits<2> op19_18, bits<5> op11_7,
Evan Chengf81bf152009-11-23 21:57:23 +00001792 InstrItinClass itin, string OpcodeStr, string Dt>
Owen Andersonca6945e2010-12-01 00:28:25 +00001793 : N2V<0b11, 0b11, op19_18, 0b10, op11_7, 1, 0, (outs QPR:$Vd, QPR:$Vm),
1794 (ins QPR:$src1, QPR:$src2), itin, OpcodeStr, Dt, "$Vd, $Vm",
1795 "$src1 = $Vd, $src2 = $Vm", []>;
Bob Wilsonb6ab51e2009-08-08 06:13:25 +00001796
Bob Wilson4711d5c2010-12-13 23:02:37 +00001797// Basic 3-register operations: double- and quad-register.
Bob Wilson5bafff32009-06-22 23:27:02 +00001798class N3VD<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
Evan Chengf81bf152009-11-23 21:57:23 +00001799 InstrItinClass itin, string OpcodeStr, string Dt,
Bob Wilson9abe19d2010-02-17 00:31:29 +00001800 ValueType ResTy, ValueType OpTy, SDNode OpNode, bit Commutable>
Bob Wilson5bafff32009-06-22 23:27:02 +00001801 : N3V<op24, op23, op21_20, op11_8, 0, op4,
Owen Andersond451f882010-10-21 20:21:49 +00001802 (outs DPR:$Vd), (ins DPR:$Vn, DPR:$Vm), N3RegFrm, itin,
1803 OpcodeStr, Dt, "$Vd, $Vn, $Vm", "",
1804 [(set DPR:$Vd, (ResTy (OpNode (OpTy DPR:$Vn), (OpTy DPR:$Vm))))]> {
Evan Chengf81bf152009-11-23 21:57:23 +00001805 let isCommutable = Commutable;
1806}
1807// Same as N3VD but no data type.
1808class N3VDX<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
1809 InstrItinClass itin, string OpcodeStr,
1810 ValueType ResTy, ValueType OpTy,
1811 SDNode OpNode, bit Commutable>
1812 : N3VX<op24, op23, op21_20, op11_8, 0, op4,
Jim Grosbachefaeb412010-11-19 22:36:02 +00001813 (outs DPR:$Vd), (ins DPR:$Vn, DPR:$Vm), N3RegFrm, itin,
1814 OpcodeStr, "$Vd, $Vn, $Vm", "",
1815 [(set DPR:$Vd, (ResTy (OpNode (OpTy DPR:$Vn), (OpTy DPR:$Vm))))]>{
Bob Wilson5bafff32009-06-22 23:27:02 +00001816 let isCommutable = Commutable;
1817}
Johnny Chen897dd0c2010-03-27 01:03:13 +00001818
Jim Grosbach1251e1a2010-11-18 01:39:50 +00001819class N3VDSL<bits<2> op21_20, bits<4> op11_8,
Evan Chengf81bf152009-11-23 21:57:23 +00001820 InstrItinClass itin, string OpcodeStr, string Dt,
1821 ValueType Ty, SDNode ShOp>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00001822 : N3VLane32<0, 1, op21_20, op11_8, 1, 0,
Owen Andersonca6945e2010-12-01 00:28:25 +00001823 (outs DPR:$Vd), (ins DPR:$Vn, DPR_VFP2:$Vm, nohash_imm:$lane),
1824 NVMulSLFrm, itin, OpcodeStr, Dt, "$Vd, $Vn, $Vm[$lane]", "",
1825 [(set (Ty DPR:$Vd),
1826 (Ty (ShOp (Ty DPR:$Vn),
1827 (Ty (NEONvduplane (Ty DPR_VFP2:$Vm),imm:$lane)))))]> {
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00001828 let isCommutable = 0;
1829}
Jim Grosbach1251e1a2010-11-18 01:39:50 +00001830class N3VDSL16<bits<2> op21_20, bits<4> op11_8,
Evan Chengf81bf152009-11-23 21:57:23 +00001831 string OpcodeStr, string Dt, ValueType Ty, SDNode ShOp>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00001832 : N3VLane16<0, 1, op21_20, op11_8, 1, 0,
Owen Andersonca6945e2010-12-01 00:28:25 +00001833 (outs DPR:$Vd), (ins DPR:$Vn, DPR_8:$Vm, nohash_imm:$lane),
1834 NVMulSLFrm, IIC_VMULi16D, OpcodeStr, Dt,"$Vd, $Vn, $Vm[$lane]","",
1835 [(set (Ty DPR:$Vd),
1836 (Ty (ShOp (Ty DPR:$Vn),
1837 (Ty (NEONvduplane (Ty DPR_8:$Vm), imm:$lane)))))]> {
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00001838 let isCommutable = 0;
1839}
1840
Bob Wilson5bafff32009-06-22 23:27:02 +00001841class N3VQ<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
Evan Chengf81bf152009-11-23 21:57:23 +00001842 InstrItinClass itin, string OpcodeStr, string Dt,
Bob Wilson9abe19d2010-02-17 00:31:29 +00001843 ValueType ResTy, ValueType OpTy, SDNode OpNode, bit Commutable>
Bob Wilson5bafff32009-06-22 23:27:02 +00001844 : N3V<op24, op23, op21_20, op11_8, 1, op4,
Owen Andersonca6945e2010-12-01 00:28:25 +00001845 (outs QPR:$Vd), (ins QPR:$Vn, QPR:$Vm), N3RegFrm, itin,
1846 OpcodeStr, Dt, "$Vd, $Vn, $Vm", "",
1847 [(set QPR:$Vd, (ResTy (OpNode (OpTy QPR:$Vn), (OpTy QPR:$Vm))))]> {
Evan Chengf81bf152009-11-23 21:57:23 +00001848 let isCommutable = Commutable;
1849}
1850class N3VQX<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
1851 InstrItinClass itin, string OpcodeStr,
Bob Wilson9abe19d2010-02-17 00:31:29 +00001852 ValueType ResTy, ValueType OpTy, SDNode OpNode, bit Commutable>
Evan Chengf81bf152009-11-23 21:57:23 +00001853 : N3VX<op24, op23, op21_20, op11_8, 1, op4,
Owen Andersonca6945e2010-12-01 00:28:25 +00001854 (outs QPR:$Vd), (ins QPR:$Vn, QPR:$Vm), N3RegFrm, itin,
1855 OpcodeStr, "$Vd, $Vn, $Vm", "",
1856 [(set QPR:$Vd, (ResTy (OpNode (OpTy QPR:$Vn), (OpTy QPR:$Vm))))]>{
Bob Wilson5bafff32009-06-22 23:27:02 +00001857 let isCommutable = Commutable;
1858}
Jim Grosbach1251e1a2010-11-18 01:39:50 +00001859class N3VQSL<bits<2> op21_20, bits<4> op11_8,
Evan Chengf81bf152009-11-23 21:57:23 +00001860 InstrItinClass itin, string OpcodeStr, string Dt,
David Goodwin658ea602009-09-25 18:38:29 +00001861 ValueType ResTy, ValueType OpTy, SDNode ShOp>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00001862 : N3VLane32<1, 1, op21_20, op11_8, 1, 0,
Owen Andersonca6945e2010-12-01 00:28:25 +00001863 (outs QPR:$Vd), (ins QPR:$Vn, DPR_VFP2:$Vm, nohash_imm:$lane),
1864 NVMulSLFrm, itin, OpcodeStr, Dt, "$Vd, $Vn, $Vm[$lane]", "",
1865 [(set (ResTy QPR:$Vd),
1866 (ResTy (ShOp (ResTy QPR:$Vn),
1867 (ResTy (NEONvduplane (OpTy DPR_VFP2:$Vm),
Bob Wilson10bc69c2010-03-27 03:56:52 +00001868 imm:$lane)))))]> {
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00001869 let isCommutable = 0;
1870}
Bob Wilson9abe19d2010-02-17 00:31:29 +00001871class N3VQSL16<bits<2> op21_20, bits<4> op11_8, string OpcodeStr, string Dt,
Evan Chengf81bf152009-11-23 21:57:23 +00001872 ValueType ResTy, ValueType OpTy, SDNode ShOp>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00001873 : N3VLane16<1, 1, op21_20, op11_8, 1, 0,
Owen Andersonca6945e2010-12-01 00:28:25 +00001874 (outs QPR:$Vd), (ins QPR:$Vn, DPR_8:$Vm, nohash_imm:$lane),
1875 NVMulSLFrm, IIC_VMULi16Q, OpcodeStr, Dt,"$Vd, $Vn, $Vm[$lane]","",
1876 [(set (ResTy QPR:$Vd),
1877 (ResTy (ShOp (ResTy QPR:$Vn),
1878 (ResTy (NEONvduplane (OpTy DPR_8:$Vm),
Bob Wilson10bc69c2010-03-27 03:56:52 +00001879 imm:$lane)))))]> {
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00001880 let isCommutable = 0;
1881}
Bob Wilson5bafff32009-06-22 23:27:02 +00001882
1883// Basic 3-register intrinsics, both double- and quad-register.
1884class N3VDInt<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00001885 Format f, InstrItinClass itin, string OpcodeStr, string Dt,
Bob Wilson9abe19d2010-02-17 00:31:29 +00001886 ValueType ResTy, ValueType OpTy, Intrinsic IntOp, bit Commutable>
Bob Wilson10bc69c2010-03-27 03:56:52 +00001887 : N3V<op24, op23, op21_20, op11_8, 0, op4,
Owen Andersond451f882010-10-21 20:21:49 +00001888 (outs DPR:$Vd), (ins DPR:$Vn, DPR:$Vm), f, itin,
1889 OpcodeStr, Dt, "$Vd, $Vn, $Vm", "",
1890 [(set DPR:$Vd, (ResTy (IntOp (OpTy DPR:$Vn), (OpTy DPR:$Vm))))]> {
Bob Wilson5bafff32009-06-22 23:27:02 +00001891 let isCommutable = Commutable;
1892}
Jim Grosbach1251e1a2010-11-18 01:39:50 +00001893class N3VDIntSL<bits<2> op21_20, bits<4> op11_8, InstrItinClass itin,
Evan Chengf81bf152009-11-23 21:57:23 +00001894 string OpcodeStr, string Dt, ValueType Ty, Intrinsic IntOp>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00001895 : N3VLane32<0, 1, op21_20, op11_8, 1, 0,
Owen Andersonca6945e2010-12-01 00:28:25 +00001896 (outs DPR:$Vd), (ins DPR:$Vn, DPR_VFP2:$Vm, nohash_imm:$lane),
1897 NVMulSLFrm, itin, OpcodeStr, Dt, "$Vd, $Vn, $Vm[$lane]", "",
1898 [(set (Ty DPR:$Vd),
1899 (Ty (IntOp (Ty DPR:$Vn),
1900 (Ty (NEONvduplane (Ty DPR_VFP2:$Vm),
Bob Wilson10bc69c2010-03-27 03:56:52 +00001901 imm:$lane)))))]> {
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00001902 let isCommutable = 0;
1903}
David Goodwin658ea602009-09-25 18:38:29 +00001904class N3VDIntSL16<bits<2> op21_20, bits<4> op11_8, InstrItinClass itin,
Evan Chengf81bf152009-11-23 21:57:23 +00001905 string OpcodeStr, string Dt, ValueType Ty, Intrinsic IntOp>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00001906 : N3VLane16<0, 1, op21_20, op11_8, 1, 0,
Owen Andersonca6945e2010-12-01 00:28:25 +00001907 (outs DPR:$Vd), (ins DPR:$Vn, DPR_8:$Vm, nohash_imm:$lane),
1908 NVMulSLFrm, itin, OpcodeStr, Dt, "$Vd, $Vn, $Vm[$lane]", "",
1909 [(set (Ty DPR:$Vd),
1910 (Ty (IntOp (Ty DPR:$Vn),
1911 (Ty (NEONvduplane (Ty DPR_8:$Vm), imm:$lane)))))]> {
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00001912 let isCommutable = 0;
1913}
Owen Anderson3557d002010-10-26 20:56:57 +00001914class N3VDIntSh<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
1915 Format f, InstrItinClass itin, string OpcodeStr, string Dt,
Owen Andersonac922622010-10-26 21:13:59 +00001916 ValueType ResTy, ValueType OpTy, Intrinsic IntOp>
Owen Anderson3557d002010-10-26 20:56:57 +00001917 : N3V<op24, op23, op21_20, op11_8, 0, op4,
1918 (outs DPR:$Vd), (ins DPR:$Vm, DPR:$Vn), f, itin,
1919 OpcodeStr, Dt, "$Vd, $Vm, $Vn", "",
1920 [(set DPR:$Vd, (ResTy (IntOp (OpTy DPR:$Vm), (OpTy DPR:$Vn))))]> {
Owen Andersonac922622010-10-26 21:13:59 +00001921 let isCommutable = 0;
Owen Anderson3557d002010-10-26 20:56:57 +00001922}
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00001923
Bob Wilson5bafff32009-06-22 23:27:02 +00001924class N3VQInt<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00001925 Format f, InstrItinClass itin, string OpcodeStr, string Dt,
Bob Wilson9abe19d2010-02-17 00:31:29 +00001926 ValueType ResTy, ValueType OpTy, Intrinsic IntOp, bit Commutable>
Bob Wilson10bc69c2010-03-27 03:56:52 +00001927 : N3V<op24, op23, op21_20, op11_8, 1, op4,
Owen Andersond451f882010-10-21 20:21:49 +00001928 (outs QPR:$Vd), (ins QPR:$Vn, QPR:$Vm), f, itin,
1929 OpcodeStr, Dt, "$Vd, $Vn, $Vm", "",
1930 [(set QPR:$Vd, (ResTy (IntOp (OpTy QPR:$Vn), (OpTy QPR:$Vm))))]> {
Bob Wilson5bafff32009-06-22 23:27:02 +00001931 let isCommutable = Commutable;
1932}
Jim Grosbach1251e1a2010-11-18 01:39:50 +00001933class N3VQIntSL<bits<2> op21_20, bits<4> op11_8, InstrItinClass itin,
Evan Chengf81bf152009-11-23 21:57:23 +00001934 string OpcodeStr, string Dt,
1935 ValueType ResTy, ValueType OpTy, Intrinsic IntOp>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00001936 : N3VLane32<1, 1, op21_20, op11_8, 1, 0,
Owen Andersonca6945e2010-12-01 00:28:25 +00001937 (outs QPR:$Vd), (ins QPR:$Vn, DPR_VFP2:$Vm, nohash_imm:$lane),
1938 NVMulSLFrm, itin, OpcodeStr, Dt, "$Vd, $Vn, $Vm[$lane]", "",
1939 [(set (ResTy QPR:$Vd),
1940 (ResTy (IntOp (ResTy QPR:$Vn),
1941 (ResTy (NEONvduplane (OpTy DPR_VFP2:$Vm),
Bob Wilson10bc69c2010-03-27 03:56:52 +00001942 imm:$lane)))))]> {
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00001943 let isCommutable = 0;
1944}
David Goodwin658ea602009-09-25 18:38:29 +00001945class N3VQIntSL16<bits<2> op21_20, bits<4> op11_8, InstrItinClass itin,
Evan Chengf81bf152009-11-23 21:57:23 +00001946 string OpcodeStr, string Dt,
1947 ValueType ResTy, ValueType OpTy, Intrinsic IntOp>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00001948 : N3VLane16<1, 1, op21_20, op11_8, 1, 0,
Owen Andersonca6945e2010-12-01 00:28:25 +00001949 (outs QPR:$Vd), (ins QPR:$Vn, DPR_8:$Vm, nohash_imm:$lane),
1950 NVMulSLFrm, itin, OpcodeStr, Dt, "$Vd, $Vn, $Vm[$lane]", "",
1951 [(set (ResTy QPR:$Vd),
1952 (ResTy (IntOp (ResTy QPR:$Vn),
1953 (ResTy (NEONvduplane (OpTy DPR_8:$Vm),
Bob Wilson10bc69c2010-03-27 03:56:52 +00001954 imm:$lane)))))]> {
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00001955 let isCommutable = 0;
1956}
Owen Anderson3557d002010-10-26 20:56:57 +00001957class N3VQIntSh<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
1958 Format f, InstrItinClass itin, string OpcodeStr, string Dt,
Owen Andersonac922622010-10-26 21:13:59 +00001959 ValueType ResTy, ValueType OpTy, Intrinsic IntOp>
Owen Anderson3557d002010-10-26 20:56:57 +00001960 : N3V<op24, op23, op21_20, op11_8, 1, op4,
1961 (outs QPR:$Vd), (ins QPR:$Vm, QPR:$Vn), f, itin,
1962 OpcodeStr, Dt, "$Vd, $Vm, $Vn", "",
1963 [(set QPR:$Vd, (ResTy (IntOp (OpTy QPR:$Vm), (OpTy QPR:$Vn))))]> {
Owen Andersonac922622010-10-26 21:13:59 +00001964 let isCommutable = 0;
Owen Anderson3557d002010-10-26 20:56:57 +00001965}
Bob Wilson5bafff32009-06-22 23:27:02 +00001966
Bob Wilson4711d5c2010-12-13 23:02:37 +00001967// Multiply-Add/Sub operations: double- and quad-register.
Bob Wilson5bafff32009-06-22 23:27:02 +00001968class N3VDMulOp<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
Evan Chengf81bf152009-11-23 21:57:23 +00001969 InstrItinClass itin, string OpcodeStr, string Dt,
Evan Cheng48575f62010-12-05 22:04:16 +00001970 ValueType Ty, SDPatternOperator MulOp, SDPatternOperator OpNode>
Bob Wilson5bafff32009-06-22 23:27:02 +00001971 : N3V<op24, op23, op21_20, op11_8, 0, op4,
Owen Anderson18341e92010-10-22 18:54:37 +00001972 (outs DPR:$Vd), (ins DPR:$src1, DPR:$Vn, DPR:$Vm), N3RegFrm, itin,
1973 OpcodeStr, Dt, "$Vd, $Vn, $Vm", "$src1 = $Vd",
1974 [(set DPR:$Vd, (Ty (OpNode DPR:$src1,
1975 (Ty (MulOp DPR:$Vn, DPR:$Vm)))))]>;
1976
David Goodwin658ea602009-09-25 18:38:29 +00001977class N3VDMulOpSL<bits<2> op21_20, bits<4> op11_8, InstrItinClass itin,
Evan Chengf81bf152009-11-23 21:57:23 +00001978 string OpcodeStr, string Dt,
Evan Cheng48575f62010-12-05 22:04:16 +00001979 ValueType Ty, SDPatternOperator MulOp, SDPatternOperator ShOp>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00001980 : N3VLane32<0, 1, op21_20, op11_8, 1, 0,
Owen Andersonca6945e2010-12-01 00:28:25 +00001981 (outs DPR:$Vd),
1982 (ins DPR:$src1, DPR:$Vn, DPR_VFP2:$Vm, nohash_imm:$lane),
Bob Wilson10bc69c2010-03-27 03:56:52 +00001983 NVMulSLFrm, itin,
Owen Andersonca6945e2010-12-01 00:28:25 +00001984 OpcodeStr, Dt, "$Vd, $Vn, $Vm[$lane]", "$src1 = $Vd",
1985 [(set (Ty DPR:$Vd),
Bob Wilson10bc69c2010-03-27 03:56:52 +00001986 (Ty (ShOp (Ty DPR:$src1),
Owen Andersonca6945e2010-12-01 00:28:25 +00001987 (Ty (MulOp DPR:$Vn,
1988 (Ty (NEONvduplane (Ty DPR_VFP2:$Vm),
Bob Wilson10bc69c2010-03-27 03:56:52 +00001989 imm:$lane)))))))]>;
David Goodwin658ea602009-09-25 18:38:29 +00001990class N3VDMulOpSL16<bits<2> op21_20, bits<4> op11_8, InstrItinClass itin,
Evan Chengf81bf152009-11-23 21:57:23 +00001991 string OpcodeStr, string Dt,
1992 ValueType Ty, SDNode MulOp, SDNode ShOp>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00001993 : N3VLane16<0, 1, op21_20, op11_8, 1, 0,
Owen Anderson18341e92010-10-22 18:54:37 +00001994 (outs DPR:$Vd),
1995 (ins DPR:$src1, DPR:$Vn, DPR_8:$Vm, nohash_imm:$lane),
Bob Wilson10bc69c2010-03-27 03:56:52 +00001996 NVMulSLFrm, itin,
Owen Anderson18341e92010-10-22 18:54:37 +00001997 OpcodeStr, Dt, "$Vd, $Vn, $Vm[$lane]", "$src1 = $Vd",
1998 [(set (Ty DPR:$Vd),
Bob Wilson10bc69c2010-03-27 03:56:52 +00001999 (Ty (ShOp (Ty DPR:$src1),
Owen Anderson18341e92010-10-22 18:54:37 +00002000 (Ty (MulOp DPR:$Vn,
2001 (Ty (NEONvduplane (Ty DPR_8:$Vm),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002002 imm:$lane)))))))]>;
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00002003
Bob Wilson5bafff32009-06-22 23:27:02 +00002004class N3VQMulOp<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
Evan Chengf81bf152009-11-23 21:57:23 +00002005 InstrItinClass itin, string OpcodeStr, string Dt, ValueType Ty,
Evan Cheng48575f62010-12-05 22:04:16 +00002006 SDPatternOperator MulOp, SDPatternOperator OpNode>
Bob Wilson5bafff32009-06-22 23:27:02 +00002007 : N3V<op24, op23, op21_20, op11_8, 1, op4,
Owen Anderson18341e92010-10-22 18:54:37 +00002008 (outs QPR:$Vd), (ins QPR:$src1, QPR:$Vn, QPR:$Vm), N3RegFrm, itin,
2009 OpcodeStr, Dt, "$Vd, $Vn, $Vm", "$src1 = $Vd",
2010 [(set QPR:$Vd, (Ty (OpNode QPR:$src1,
2011 (Ty (MulOp QPR:$Vn, QPR:$Vm)))))]>;
David Goodwin658ea602009-09-25 18:38:29 +00002012class N3VQMulOpSL<bits<2> op21_20, bits<4> op11_8, InstrItinClass itin,
Evan Chengf81bf152009-11-23 21:57:23 +00002013 string OpcodeStr, string Dt, ValueType ResTy, ValueType OpTy,
Evan Cheng48575f62010-12-05 22:04:16 +00002014 SDPatternOperator MulOp, SDPatternOperator ShOp>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00002015 : N3VLane32<1, 1, op21_20, op11_8, 1, 0,
Owen Andersonca6945e2010-12-01 00:28:25 +00002016 (outs QPR:$Vd),
2017 (ins QPR:$src1, QPR:$Vn, DPR_VFP2:$Vm, nohash_imm:$lane),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002018 NVMulSLFrm, itin,
Owen Andersonca6945e2010-12-01 00:28:25 +00002019 OpcodeStr, Dt, "$Vd, $Vn, $Vm[$lane]", "$src1 = $Vd",
2020 [(set (ResTy QPR:$Vd),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002021 (ResTy (ShOp (ResTy QPR:$src1),
Owen Andersonca6945e2010-12-01 00:28:25 +00002022 (ResTy (MulOp QPR:$Vn,
2023 (ResTy (NEONvduplane (OpTy DPR_VFP2:$Vm),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002024 imm:$lane)))))))]>;
David Goodwin658ea602009-09-25 18:38:29 +00002025class N3VQMulOpSL16<bits<2> op21_20, bits<4> op11_8, InstrItinClass itin,
Evan Chengf81bf152009-11-23 21:57:23 +00002026 string OpcodeStr, string Dt,
2027 ValueType ResTy, ValueType OpTy,
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00002028 SDNode MulOp, SDNode ShOp>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00002029 : N3VLane16<1, 1, op21_20, op11_8, 1, 0,
Owen Andersonca6945e2010-12-01 00:28:25 +00002030 (outs QPR:$Vd),
2031 (ins QPR:$src1, QPR:$Vn, DPR_8:$Vm, nohash_imm:$lane),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002032 NVMulSLFrm, itin,
Owen Andersonca6945e2010-12-01 00:28:25 +00002033 OpcodeStr, Dt, "$Vd, $Vn, $Vm[$lane]", "$src1 = $Vd",
2034 [(set (ResTy QPR:$Vd),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002035 (ResTy (ShOp (ResTy QPR:$src1),
Owen Andersonca6945e2010-12-01 00:28:25 +00002036 (ResTy (MulOp QPR:$Vn,
2037 (ResTy (NEONvduplane (OpTy DPR_8:$Vm),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002038 imm:$lane)))))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002039
Bob Wilsoneb0c3d32010-09-03 01:35:08 +00002040// Neon Intrinsic-Op instructions (VABA): double- and quad-register.
2041class N3VDIntOp<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
2042 InstrItinClass itin, string OpcodeStr, string Dt,
2043 ValueType Ty, Intrinsic IntOp, SDNode OpNode>
2044 : N3V<op24, op23, op21_20, op11_8, 0, op4,
Owen Anderson410aebc2010-10-25 20:52:57 +00002045 (outs DPR:$Vd), (ins DPR:$src1, DPR:$Vn, DPR:$Vm), N3RegFrm, itin,
2046 OpcodeStr, Dt, "$Vd, $Vn, $Vm", "$src1 = $Vd",
2047 [(set DPR:$Vd, (Ty (OpNode DPR:$src1,
2048 (Ty (IntOp (Ty DPR:$Vn), (Ty DPR:$Vm))))))]>;
Bob Wilsoneb0c3d32010-09-03 01:35:08 +00002049class N3VQIntOp<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
2050 InstrItinClass itin, string OpcodeStr, string Dt,
2051 ValueType Ty, Intrinsic IntOp, SDNode OpNode>
2052 : N3V<op24, op23, op21_20, op11_8, 1, op4,
Owen Anderson410aebc2010-10-25 20:52:57 +00002053 (outs QPR:$Vd), (ins QPR:$src1, QPR:$Vn, QPR:$Vm), N3RegFrm, itin,
2054 OpcodeStr, Dt, "$Vd, $Vn, $Vm", "$src1 = $Vd",
2055 [(set QPR:$Vd, (Ty (OpNode QPR:$src1,
2056 (Ty (IntOp (Ty QPR:$Vn), (Ty QPR:$Vm))))))]>;
Bob Wilsoneb0c3d32010-09-03 01:35:08 +00002057
Bob Wilson5bafff32009-06-22 23:27:02 +00002058// Neon 3-argument intrinsics, both double- and quad-register.
2059// The destination register is also used as the first source operand register.
2060class N3VDInt3<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
Evan Chengf81bf152009-11-23 21:57:23 +00002061 InstrItinClass itin, string OpcodeStr, string Dt,
David Goodwin658ea602009-09-25 18:38:29 +00002062 ValueType ResTy, ValueType OpTy, Intrinsic IntOp>
Bob Wilson5bafff32009-06-22 23:27:02 +00002063 : N3V<op24, op23, op21_20, op11_8, 0, op4,
Owen Andersonca6945e2010-12-01 00:28:25 +00002064 (outs DPR:$Vd), (ins DPR:$src1, DPR:$Vn, DPR:$Vm), N3RegFrm, itin,
2065 OpcodeStr, Dt, "$Vd, $Vn, $Vm", "$src1 = $Vd",
2066 [(set DPR:$Vd, (ResTy (IntOp (OpTy DPR:$src1),
2067 (OpTy DPR:$Vn), (OpTy DPR:$Vm))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002068class N3VQInt3<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
Evan Chengf81bf152009-11-23 21:57:23 +00002069 InstrItinClass itin, string OpcodeStr, string Dt,
David Goodwin658ea602009-09-25 18:38:29 +00002070 ValueType ResTy, ValueType OpTy, Intrinsic IntOp>
Bob Wilson5bafff32009-06-22 23:27:02 +00002071 : N3V<op24, op23, op21_20, op11_8, 1, op4,
Owen Andersonca6945e2010-12-01 00:28:25 +00002072 (outs QPR:$Vd), (ins QPR:$src1, QPR:$Vn, QPR:$Vm), N3RegFrm, itin,
2073 OpcodeStr, Dt, "$Vd, $Vn, $Vm", "$src1 = $Vd",
2074 [(set QPR:$Vd, (ResTy (IntOp (OpTy QPR:$src1),
2075 (OpTy QPR:$Vn), (OpTy QPR:$Vm))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002076
Bob Wilsond0b69cf2010-09-01 23:50:19 +00002077// Long Multiply-Add/Sub operations.
2078class N3VLMulOp<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
2079 InstrItinClass itin, string OpcodeStr, string Dt,
2080 ValueType TyQ, ValueType TyD, SDNode MulOp, SDNode OpNode>
2081 : N3V<op24, op23, op21_20, op11_8, 0, op4,
Owen Anderson92205842010-10-22 19:05:25 +00002082 (outs QPR:$Vd), (ins QPR:$src1, DPR:$Vn, DPR:$Vm), N3RegFrm, itin,
2083 OpcodeStr, Dt, "$Vd, $Vn, $Vm", "$src1 = $Vd",
2084 [(set QPR:$Vd, (OpNode (TyQ QPR:$src1),
2085 (TyQ (MulOp (TyD DPR:$Vn),
2086 (TyD DPR:$Vm)))))]>;
Bob Wilsond0b69cf2010-09-01 23:50:19 +00002087class N3VLMulOpSL<bit op24, bits<2> op21_20, bits<4> op11_8,
2088 InstrItinClass itin, string OpcodeStr, string Dt,
2089 ValueType TyQ, ValueType TyD, SDNode MulOp, SDNode OpNode>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00002090 : N3VLane32<op24, 1, op21_20, op11_8, 1, 0, (outs QPR:$Vd),
Owen Andersonca6945e2010-12-01 00:28:25 +00002091 (ins QPR:$src1, DPR:$Vn, DPR_VFP2:$Vm, nohash_imm:$lane),
Bob Wilsond0b69cf2010-09-01 23:50:19 +00002092 NVMulSLFrm, itin,
Owen Andersonca6945e2010-12-01 00:28:25 +00002093 OpcodeStr, Dt, "$Vd, $Vn, $Vm[$lane]", "$src1 = $Vd",
2094 [(set QPR:$Vd,
Bob Wilsond0b69cf2010-09-01 23:50:19 +00002095 (OpNode (TyQ QPR:$src1),
Owen Andersonca6945e2010-12-01 00:28:25 +00002096 (TyQ (MulOp (TyD DPR:$Vn),
2097 (TyD (NEONvduplane (TyD DPR_VFP2:$Vm),
Bob Wilsond0b69cf2010-09-01 23:50:19 +00002098 imm:$lane))))))]>;
2099class N3VLMulOpSL16<bit op24, bits<2> op21_20, bits<4> op11_8,
2100 InstrItinClass itin, string OpcodeStr, string Dt,
2101 ValueType TyQ, ValueType TyD, SDNode MulOp, SDNode OpNode>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00002102 : N3VLane16<op24, 1, op21_20, op11_8, 1, 0, (outs QPR:$Vd),
Owen Andersonca6945e2010-12-01 00:28:25 +00002103 (ins QPR:$src1, DPR:$Vn, DPR_8:$Vm, nohash_imm:$lane),
Bob Wilsond0b69cf2010-09-01 23:50:19 +00002104 NVMulSLFrm, itin,
Owen Andersonca6945e2010-12-01 00:28:25 +00002105 OpcodeStr, Dt, "$Vd, $Vn, $Vm[$lane]", "$src1 = $Vd",
2106 [(set QPR:$Vd,
Bob Wilsond0b69cf2010-09-01 23:50:19 +00002107 (OpNode (TyQ QPR:$src1),
Owen Andersonca6945e2010-12-01 00:28:25 +00002108 (TyQ (MulOp (TyD DPR:$Vn),
2109 (TyD (NEONvduplane (TyD DPR_8:$Vm),
Bob Wilsond0b69cf2010-09-01 23:50:19 +00002110 imm:$lane))))))]>;
2111
Bob Wilsoneb0c3d32010-09-03 01:35:08 +00002112// Long Intrinsic-Op vector operations with explicit extend (VABAL).
2113class N3VLIntExtOp<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
2114 InstrItinClass itin, string OpcodeStr, string Dt,
2115 ValueType TyQ, ValueType TyD, Intrinsic IntOp, SDNode ExtOp,
2116 SDNode OpNode>
2117 : N3V<op24, op23, op21_20, op11_8, 0, op4,
Owen Anderson5258b612010-10-25 21:29:04 +00002118 (outs QPR:$Vd), (ins QPR:$src1, DPR:$Vn, DPR:$Vm), N3RegFrm, itin,
2119 OpcodeStr, Dt, "$Vd, $Vn, $Vm", "$src1 = $Vd",
2120 [(set QPR:$Vd, (OpNode (TyQ QPR:$src1),
2121 (TyQ (ExtOp (TyD (IntOp (TyD DPR:$Vn),
2122 (TyD DPR:$Vm)))))))]>;
Bob Wilsond0b69cf2010-09-01 23:50:19 +00002123
Bob Wilson5bafff32009-06-22 23:27:02 +00002124// Neon Long 3-argument intrinsic. The destination register is
2125// a quad-register and is also used as the first source operand register.
2126class N3VLInt3<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
Evan Chengf81bf152009-11-23 21:57:23 +00002127 InstrItinClass itin, string OpcodeStr, string Dt,
David Goodwin658ea602009-09-25 18:38:29 +00002128 ValueType TyQ, ValueType TyD, Intrinsic IntOp>
Bob Wilson5bafff32009-06-22 23:27:02 +00002129 : N3V<op24, op23, op21_20, op11_8, 0, op4,
Owen Anderson9b264972010-10-22 19:35:48 +00002130 (outs QPR:$Vd), (ins QPR:$src1, DPR:$Vn, DPR:$Vm), N3RegFrm, itin,
2131 OpcodeStr, Dt, "$Vd, $Vn, $Vm", "$src1 = $Vd",
2132 [(set QPR:$Vd,
2133 (TyQ (IntOp (TyQ QPR:$src1), (TyD DPR:$Vn), (TyD DPR:$Vm))))]>;
David Goodwin658ea602009-09-25 18:38:29 +00002134class N3VLInt3SL<bit op24, bits<2> op21_20, bits<4> op11_8, InstrItinClass itin,
Evan Chengf81bf152009-11-23 21:57:23 +00002135 string OpcodeStr, string Dt,
2136 ValueType ResTy, ValueType OpTy, Intrinsic IntOp>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00002137 : N3VLane32<op24, 1, op21_20, op11_8, 1, 0,
Owen Andersonca6945e2010-12-01 00:28:25 +00002138 (outs QPR:$Vd),
2139 (ins QPR:$src1, DPR:$Vn, DPR_VFP2:$Vm, nohash_imm:$lane),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002140 NVMulSLFrm, itin,
Owen Andersonca6945e2010-12-01 00:28:25 +00002141 OpcodeStr, Dt, "$Vd, $Vn, $Vm[$lane]", "$src1 = $Vd",
2142 [(set (ResTy QPR:$Vd),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002143 (ResTy (IntOp (ResTy QPR:$src1),
Owen Andersonca6945e2010-12-01 00:28:25 +00002144 (OpTy DPR:$Vn),
2145 (OpTy (NEONvduplane (OpTy DPR_VFP2:$Vm),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002146 imm:$lane)))))]>;
Bob Wilson9abe19d2010-02-17 00:31:29 +00002147class N3VLInt3SL16<bit op24, bits<2> op21_20, bits<4> op11_8,
2148 InstrItinClass itin, string OpcodeStr, string Dt,
2149 ValueType ResTy, ValueType OpTy, Intrinsic IntOp>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00002150 : N3VLane16<op24, 1, op21_20, op11_8, 1, 0,
Owen Andersonca6945e2010-12-01 00:28:25 +00002151 (outs QPR:$Vd),
2152 (ins QPR:$src1, DPR:$Vn, DPR_8:$Vm, nohash_imm:$lane),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002153 NVMulSLFrm, itin,
Owen Andersonca6945e2010-12-01 00:28:25 +00002154 OpcodeStr, Dt, "$Vd, $Vn, $Vm[$lane]", "$src1 = $Vd",
2155 [(set (ResTy QPR:$Vd),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002156 (ResTy (IntOp (ResTy QPR:$src1),
Owen Andersonca6945e2010-12-01 00:28:25 +00002157 (OpTy DPR:$Vn),
2158 (OpTy (NEONvduplane (OpTy DPR_8:$Vm),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002159 imm:$lane)))))]>;
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00002160
Bob Wilson5bafff32009-06-22 23:27:02 +00002161// Narrowing 3-register intrinsics.
2162class N3VNInt<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
Evan Chengf81bf152009-11-23 21:57:23 +00002163 string OpcodeStr, string Dt, ValueType TyD, ValueType TyQ,
Bob Wilson5bafff32009-06-22 23:27:02 +00002164 Intrinsic IntOp, bit Commutable>
2165 : N3V<op24, op23, op21_20, op11_8, 0, op4,
Owen Andersonca6945e2010-12-01 00:28:25 +00002166 (outs DPR:$Vd), (ins QPR:$Vn, QPR:$Vm), N3RegFrm, IIC_VBINi4D,
2167 OpcodeStr, Dt, "$Vd, $Vn, $Vm", "",
2168 [(set DPR:$Vd, (TyD (IntOp (TyQ QPR:$Vn), (TyQ QPR:$Vm))))]> {
Bob Wilson5bafff32009-06-22 23:27:02 +00002169 let isCommutable = Commutable;
2170}
2171
Bob Wilson04d6c282010-08-29 05:57:34 +00002172// Long 3-register operations.
2173class N3VL<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
2174 InstrItinClass itin, string OpcodeStr, string Dt,
Bob Wilsond0b69cf2010-09-01 23:50:19 +00002175 ValueType TyQ, ValueType TyD, SDNode OpNode, bit Commutable>
2176 : N3V<op24, op23, op21_20, op11_8, 0, op4,
Owen Andersonca6945e2010-12-01 00:28:25 +00002177 (outs QPR:$Vd), (ins DPR:$Vn, DPR:$Vm), N3RegFrm, itin,
2178 OpcodeStr, Dt, "$Vd, $Vn, $Vm", "",
2179 [(set QPR:$Vd, (TyQ (OpNode (TyD DPR:$Vn), (TyD DPR:$Vm))))]> {
Bob Wilsond0b69cf2010-09-01 23:50:19 +00002180 let isCommutable = Commutable;
2181}
2182class N3VLSL<bit op24, bits<2> op21_20, bits<4> op11_8,
2183 InstrItinClass itin, string OpcodeStr, string Dt,
2184 ValueType TyQ, ValueType TyD, SDNode OpNode>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00002185 : N3VLane32<op24, 1, op21_20, op11_8, 1, 0,
Owen Andersonca6945e2010-12-01 00:28:25 +00002186 (outs QPR:$Vd), (ins DPR:$Vn, DPR_VFP2:$Vm, nohash_imm:$lane),
2187 NVMulSLFrm, itin, OpcodeStr, Dt, "$Vd, $Vn, $Vm[$lane]", "",
2188 [(set QPR:$Vd,
2189 (TyQ (OpNode (TyD DPR:$Vn),
2190 (TyD (NEONvduplane (TyD DPR_VFP2:$Vm),imm:$lane)))))]>;
Bob Wilsond0b69cf2010-09-01 23:50:19 +00002191class N3VLSL16<bit op24, bits<2> op21_20, bits<4> op11_8,
2192 InstrItinClass itin, string OpcodeStr, string Dt,
2193 ValueType TyQ, ValueType TyD, SDNode OpNode>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00002194 : N3VLane16<op24, 1, op21_20, op11_8, 1, 0,
Owen Andersonca6945e2010-12-01 00:28:25 +00002195 (outs QPR:$Vd), (ins DPR:$Vn, DPR_8:$Vm, nohash_imm:$lane),
2196 NVMulSLFrm, itin, OpcodeStr, Dt, "$Vd, $Vn, $Vm[$lane]", "",
2197 [(set QPR:$Vd,
2198 (TyQ (OpNode (TyD DPR:$Vn),
2199 (TyD (NEONvduplane (TyD DPR_8:$Vm), imm:$lane)))))]>;
Bob Wilsond0b69cf2010-09-01 23:50:19 +00002200
2201// Long 3-register operations with explicitly extended operands.
2202class N3VLExt<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
2203 InstrItinClass itin, string OpcodeStr, string Dt,
2204 ValueType TyQ, ValueType TyD, SDNode OpNode, SDNode ExtOp,
2205 bit Commutable>
Bob Wilson04d6c282010-08-29 05:57:34 +00002206 : N3V<op24, op23, op21_20, op11_8, 0, op4,
Owen Andersonca6945e2010-12-01 00:28:25 +00002207 (outs QPR:$Vd), (ins DPR:$Vn, DPR:$Vm), N3RegFrm, itin,
2208 OpcodeStr, Dt, "$Vd, $Vn, $Vm", "",
2209 [(set QPR:$Vd, (OpNode (TyQ (ExtOp (TyD DPR:$Vn))),
2210 (TyQ (ExtOp (TyD DPR:$Vm)))))]> {
Owen Andersone0e6dc32010-10-21 18:09:17 +00002211 let isCommutable = Commutable;
Bob Wilson04d6c282010-08-29 05:57:34 +00002212}
2213
Bob Wilsoneb0c3d32010-09-03 01:35:08 +00002214// Long 3-register intrinsics with explicit extend (VABDL).
2215class N3VLIntExt<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
2216 InstrItinClass itin, string OpcodeStr, string Dt,
2217 ValueType TyQ, ValueType TyD, Intrinsic IntOp, SDNode ExtOp,
2218 bit Commutable>
2219 : N3V<op24, op23, op21_20, op11_8, 0, op4,
Owen Andersonca6945e2010-12-01 00:28:25 +00002220 (outs QPR:$Vd), (ins DPR:$Vn, DPR:$Vm), N3RegFrm, itin,
2221 OpcodeStr, Dt, "$Vd, $Vn, $Vm", "",
2222 [(set QPR:$Vd, (TyQ (ExtOp (TyD (IntOp (TyD DPR:$Vn),
2223 (TyD DPR:$Vm))))))]> {
Bob Wilsoneb0c3d32010-09-03 01:35:08 +00002224 let isCommutable = Commutable;
2225}
2226
Bob Wilson5bafff32009-06-22 23:27:02 +00002227// Long 3-register intrinsics.
2228class N3VLInt<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
Evan Chengf81bf152009-11-23 21:57:23 +00002229 InstrItinClass itin, string OpcodeStr, string Dt,
2230 ValueType TyQ, ValueType TyD, Intrinsic IntOp, bit Commutable>
Bob Wilson5bafff32009-06-22 23:27:02 +00002231 : N3V<op24, op23, op21_20, op11_8, 0, op4,
Owen Andersonca6945e2010-12-01 00:28:25 +00002232 (outs QPR:$Vd), (ins DPR:$Vn, DPR:$Vm), N3RegFrm, itin,
2233 OpcodeStr, Dt, "$Vd, $Vn, $Vm", "",
2234 [(set QPR:$Vd, (TyQ (IntOp (TyD DPR:$Vn), (TyD DPR:$Vm))))]> {
Bob Wilson5bafff32009-06-22 23:27:02 +00002235 let isCommutable = Commutable;
2236}
David Goodwin658ea602009-09-25 18:38:29 +00002237class N3VLIntSL<bit op24, bits<2> op21_20, bits<4> op11_8, InstrItinClass itin,
Evan Chengf81bf152009-11-23 21:57:23 +00002238 string OpcodeStr, string Dt,
2239 ValueType ResTy, ValueType OpTy, Intrinsic IntOp>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00002240 : N3VLane32<op24, 1, op21_20, op11_8, 1, 0,
Owen Andersonca6945e2010-12-01 00:28:25 +00002241 (outs QPR:$Vd), (ins DPR:$Vn, DPR_VFP2:$Vm, nohash_imm:$lane),
2242 NVMulSLFrm, itin, OpcodeStr, Dt, "$Vd, $Vn, $Vm[$lane]", "",
2243 [(set (ResTy QPR:$Vd),
2244 (ResTy (IntOp (OpTy DPR:$Vn),
2245 (OpTy (NEONvduplane (OpTy DPR_VFP2:$Vm),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002246 imm:$lane)))))]>;
Bob Wilson9abe19d2010-02-17 00:31:29 +00002247class N3VLIntSL16<bit op24, bits<2> op21_20, bits<4> op11_8,
2248 InstrItinClass itin, string OpcodeStr, string Dt,
2249 ValueType ResTy, ValueType OpTy, Intrinsic IntOp>
Owen Anderson6a7d36a2011-03-30 23:45:29 +00002250 : N3VLane16<op24, 1, op21_20, op11_8, 1, 0,
Owen Andersonca6945e2010-12-01 00:28:25 +00002251 (outs QPR:$Vd), (ins DPR:$Vn, DPR_8:$Vm, nohash_imm:$lane),
2252 NVMulSLFrm, itin, OpcodeStr, Dt, "$Vd, $Vn, $Vm[$lane]", "",
2253 [(set (ResTy QPR:$Vd),
2254 (ResTy (IntOp (OpTy DPR:$Vn),
2255 (OpTy (NEONvduplane (OpTy DPR_8:$Vm),
Bob Wilson10bc69c2010-03-27 03:56:52 +00002256 imm:$lane)))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002257
Bob Wilson04d6c282010-08-29 05:57:34 +00002258// Wide 3-register operations.
2259class N3VW<bit op24, bit op23, bits<2> op21_20, bits<4> op11_8, bit op4,
2260 string OpcodeStr, string Dt, ValueType TyQ, ValueType TyD,
2261 SDNode OpNode, SDNode ExtOp, bit Commutable>
Bob Wilson5bafff32009-06-22 23:27:02 +00002262 : N3V<op24, op23, op21_20, op11_8, 0, op4,
Owen Andersonca6945e2010-12-01 00:28:25 +00002263 (outs QPR:$Vd), (ins QPR:$Vn, DPR:$Vm), N3RegFrm, IIC_VSUBiD,
2264 OpcodeStr, Dt, "$Vd, $Vn, $Vm", "",
2265 [(set QPR:$Vd, (OpNode (TyQ QPR:$Vn),
2266 (TyQ (ExtOp (TyD DPR:$Vm)))))]> {
Bob Wilson5bafff32009-06-22 23:27:02 +00002267 let isCommutable = Commutable;
2268}
2269
2270// Pairwise long 2-register intrinsics, both double- and quad-register.
2271class N2VDPLInt<bits<2> op24_23, bits<2> op21_20, bits<2> op19_18,
Evan Chengf81bf152009-11-23 21:57:23 +00002272 bits<2> op17_16, bits<5> op11_7, bit op4,
2273 string OpcodeStr, string Dt,
Bob Wilson5bafff32009-06-22 23:27:02 +00002274 ValueType ResTy, ValueType OpTy, Intrinsic IntOp>
Owen Andersonca6945e2010-12-01 00:28:25 +00002275 : N2V<op24_23, op21_20, op19_18, op17_16, op11_7, 0, op4, (outs DPR:$Vd),
2276 (ins DPR:$Vm), IIC_VSHLiD, OpcodeStr, Dt, "$Vd, $Vm", "",
2277 [(set DPR:$Vd, (ResTy (IntOp (OpTy DPR:$Vm))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002278class N2VQPLInt<bits<2> op24_23, bits<2> op21_20, bits<2> op19_18,
Evan Chengf81bf152009-11-23 21:57:23 +00002279 bits<2> op17_16, bits<5> op11_7, bit op4,
2280 string OpcodeStr, string Dt,
Bob Wilson5bafff32009-06-22 23:27:02 +00002281 ValueType ResTy, ValueType OpTy, Intrinsic IntOp>
Owen Andersonca6945e2010-12-01 00:28:25 +00002282 : N2V<op24_23, op21_20, op19_18, op17_16, op11_7, 1, op4, (outs QPR:$Vd),
2283 (ins QPR:$Vm), IIC_VSHLiD, OpcodeStr, Dt, "$Vd, $Vm", "",
2284 [(set QPR:$Vd, (ResTy (IntOp (OpTy QPR:$Vm))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002285
2286// Pairwise long 2-register accumulate intrinsics,
2287// both double- and quad-register.
2288// The destination register is also used as the first source operand register.
2289class N2VDPLInt2<bits<2> op24_23, bits<2> op21_20, bits<2> op19_18,
Evan Chengf81bf152009-11-23 21:57:23 +00002290 bits<2> op17_16, bits<5> op11_7, bit op4,
2291 string OpcodeStr, string Dt,
Bob Wilson5bafff32009-06-22 23:27:02 +00002292 ValueType ResTy, ValueType OpTy, Intrinsic IntOp>
2293 : N2V<op24_23, op21_20, op19_18, op17_16, op11_7, 0, op4,
Owen Andersonbc4118b2010-10-26 18:18:03 +00002294 (outs DPR:$Vd), (ins DPR:$src1, DPR:$Vm), IIC_VPALiD,
2295 OpcodeStr, Dt, "$Vd, $Vm", "$src1 = $Vd",
2296 [(set DPR:$Vd, (ResTy (IntOp (ResTy DPR:$src1), (OpTy DPR:$Vm))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002297class N2VQPLInt2<bits<2> op24_23, bits<2> op21_20, bits<2> op19_18,
Evan Chengf81bf152009-11-23 21:57:23 +00002298 bits<2> op17_16, bits<5> op11_7, bit op4,
2299 string OpcodeStr, string Dt,
Bob Wilson5bafff32009-06-22 23:27:02 +00002300 ValueType ResTy, ValueType OpTy, Intrinsic IntOp>
2301 : N2V<op24_23, op21_20, op19_18, op17_16, op11_7, 1, op4,
Owen Andersonbc4118b2010-10-26 18:18:03 +00002302 (outs QPR:$Vd), (ins QPR:$src1, QPR:$Vm), IIC_VPALiQ,
2303 OpcodeStr, Dt, "$Vd, $Vm", "$src1 = $Vd",
2304 [(set QPR:$Vd, (ResTy (IntOp (ResTy QPR:$src1), (OpTy QPR:$Vm))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002305
2306// Shift by immediate,
2307// both double- and quad-register.
Bob Wilson507df402009-10-21 02:15:46 +00002308class N2VDSh<bit op24, bit op23, bits<4> op11_8, bit op7, bit op4,
Bill Wendling7c6b6082011-03-08 23:48:09 +00002309 Format f, InstrItinClass itin, Operand ImmTy,
2310 string OpcodeStr, string Dt, ValueType Ty, SDNode OpNode>
Bob Wilson507df402009-10-21 02:15:46 +00002311 : N2VImm<op24, op23, op11_8, op7, 0, op4,
Bill Wendling7c6b6082011-03-08 23:48:09 +00002312 (outs DPR:$Vd), (ins DPR:$Vm, ImmTy:$SIMM), f, itin,
Owen Andersonca6945e2010-12-01 00:28:25 +00002313 OpcodeStr, Dt, "$Vd, $Vm, $SIMM", "",
2314 [(set DPR:$Vd, (Ty (OpNode (Ty DPR:$Vm), (i32 imm:$SIMM))))]>;
Bob Wilson507df402009-10-21 02:15:46 +00002315class N2VQSh<bit op24, bit op23, bits<4> op11_8, bit op7, bit op4,
Bill Wendling7c6b6082011-03-08 23:48:09 +00002316 Format f, InstrItinClass itin, Operand ImmTy,
2317 string OpcodeStr, string Dt, ValueType Ty, SDNode OpNode>
Bob Wilson507df402009-10-21 02:15:46 +00002318 : N2VImm<op24, op23, op11_8, op7, 1, op4,
Bill Wendling7c6b6082011-03-08 23:48:09 +00002319 (outs QPR:$Vd), (ins QPR:$Vm, ImmTy:$SIMM), f, itin,
Owen Andersonca6945e2010-12-01 00:28:25 +00002320 OpcodeStr, Dt, "$Vd, $Vm, $SIMM", "",
2321 [(set QPR:$Vd, (Ty (OpNode (Ty QPR:$Vm), (i32 imm:$SIMM))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002322
Johnny Chen6c8648b2010-03-17 23:26:50 +00002323// Long shift by immediate.
2324class N2VLSh<bit op24, bit op23, bits<4> op11_8, bit op7, bit op6, bit op4,
2325 string OpcodeStr, string Dt,
2326 ValueType ResTy, ValueType OpTy, SDNode OpNode>
2327 : N2VImm<op24, op23, op11_8, op7, op6, op4,
Owen Andersonca6945e2010-12-01 00:28:25 +00002328 (outs QPR:$Vd), (ins DPR:$Vm, i32imm:$SIMM), N2RegVShLFrm,
2329 IIC_VSHLiD, OpcodeStr, Dt, "$Vd, $Vm, $SIMM", "",
2330 [(set QPR:$Vd, (ResTy (OpNode (OpTy DPR:$Vm),
Johnny Chen6c8648b2010-03-17 23:26:50 +00002331 (i32 imm:$SIMM))))]>;
2332
Bob Wilson5bafff32009-06-22 23:27:02 +00002333// Narrow shift by immediate.
Bob Wilson507df402009-10-21 02:15:46 +00002334class N2VNSh<bit op24, bit op23, bits<4> op11_8, bit op7, bit op6, bit op4,
Evan Chengf81bf152009-11-23 21:57:23 +00002335 InstrItinClass itin, string OpcodeStr, string Dt,
Bill Wendlinga656b632011-03-01 01:00:59 +00002336 ValueType ResTy, ValueType OpTy, Operand ImmTy, SDNode OpNode>
Bob Wilson507df402009-10-21 02:15:46 +00002337 : N2VImm<op24, op23, op11_8, op7, op6, op4,
Bill Wendlinga656b632011-03-01 01:00:59 +00002338 (outs DPR:$Vd), (ins QPR:$Vm, ImmTy:$SIMM), N2RegVShRFrm, itin,
Owen Andersonca6945e2010-12-01 00:28:25 +00002339 OpcodeStr, Dt, "$Vd, $Vm, $SIMM", "",
2340 [(set DPR:$Vd, (ResTy (OpNode (OpTy QPR:$Vm),
Bob Wilson5bafff32009-06-22 23:27:02 +00002341 (i32 imm:$SIMM))))]>;
2342
2343// Shift right by immediate and accumulate,
2344// both double- and quad-register.
Bob Wilson507df402009-10-21 02:15:46 +00002345class N2VDShAdd<bit op24, bit op23, bits<4> op11_8, bit op7, bit op4,
Bill Wendlingc04a9de2011-03-09 00:00:35 +00002346 Operand ImmTy, string OpcodeStr, string Dt,
2347 ValueType Ty, SDNode ShOp>
Owen Andersondd31ed62010-10-27 17:29:29 +00002348 : N2VImm<op24, op23, op11_8, op7, 0, op4, (outs DPR:$Vd),
Bill Wendlingc04a9de2011-03-09 00:00:35 +00002349 (ins DPR:$src1, DPR:$Vm, ImmTy:$SIMM), N2RegVShRFrm, IIC_VPALiD,
Owen Andersondd31ed62010-10-27 17:29:29 +00002350 OpcodeStr, Dt, "$Vd, $Vm, $SIMM", "$src1 = $Vd",
2351 [(set DPR:$Vd, (Ty (add DPR:$src1,
2352 (Ty (ShOp DPR:$Vm, (i32 imm:$SIMM))))))]>;
Bob Wilson507df402009-10-21 02:15:46 +00002353class N2VQShAdd<bit op24, bit op23, bits<4> op11_8, bit op7, bit op4,
Bill Wendlingc04a9de2011-03-09 00:00:35 +00002354 Operand ImmTy, string OpcodeStr, string Dt,
2355 ValueType Ty, SDNode ShOp>
Owen Andersondd31ed62010-10-27 17:29:29 +00002356 : N2VImm<op24, op23, op11_8, op7, 1, op4, (outs QPR:$Vd),
Bill Wendlingc04a9de2011-03-09 00:00:35 +00002357 (ins QPR:$src1, QPR:$Vm, ImmTy:$SIMM), N2RegVShRFrm, IIC_VPALiD,
Owen Andersondd31ed62010-10-27 17:29:29 +00002358 OpcodeStr, Dt, "$Vd, $Vm, $SIMM", "$src1 = $Vd",
2359 [(set QPR:$Vd, (Ty (add QPR:$src1,
2360 (Ty (ShOp QPR:$Vm, (i32 imm:$SIMM))))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002361
2362// Shift by immediate and insert,
2363// both double- and quad-register.
Bob Wilson507df402009-10-21 02:15:46 +00002364class N2VDShIns<bit op24, bit op23, bits<4> op11_8, bit op7, bit op4,
Bill Wendling620d0cc2011-03-09 00:33:17 +00002365 Operand ImmTy, Format f, string OpcodeStr, string Dt,
2366 ValueType Ty,SDNode ShOp>
Owen Anderson0745c382010-10-27 17:40:08 +00002367 : N2VImm<op24, op23, op11_8, op7, 0, op4, (outs DPR:$Vd),
Bill Wendling620d0cc2011-03-09 00:33:17 +00002368 (ins DPR:$src1, DPR:$Vm, ImmTy:$SIMM), f, IIC_VSHLiD,
Owen Anderson0745c382010-10-27 17:40:08 +00002369 OpcodeStr, Dt, "$Vd, $Vm, $SIMM", "$src1 = $Vd",
2370 [(set DPR:$Vd, (Ty (ShOp DPR:$src1, DPR:$Vm, (i32 imm:$SIMM))))]>;
Bob Wilson507df402009-10-21 02:15:46 +00002371class N2VQShIns<bit op24, bit op23, bits<4> op11_8, bit op7, bit op4,
Bill Wendling620d0cc2011-03-09 00:33:17 +00002372 Operand ImmTy, Format f, string OpcodeStr, string Dt,
2373 ValueType Ty,SDNode ShOp>
Owen Anderson0745c382010-10-27 17:40:08 +00002374 : N2VImm<op24, op23, op11_8, op7, 1, op4, (outs QPR:$Vd),
Bill Wendling620d0cc2011-03-09 00:33:17 +00002375 (ins QPR:$src1, QPR:$Vm, ImmTy:$SIMM), f, IIC_VSHLiQ,
Owen Anderson0745c382010-10-27 17:40:08 +00002376 OpcodeStr, Dt, "$Vd, $Vm, $SIMM", "$src1 = $Vd",
2377 [(set QPR:$Vd, (Ty (ShOp QPR:$src1, QPR:$Vm, (i32 imm:$SIMM))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002378
2379// Convert, with fractional bits immediate,
2380// both double- and quad-register.
Bob Wilson507df402009-10-21 02:15:46 +00002381class N2VCvtD<bit op24, bit op23, bits<4> op11_8, bit op7, bit op4,
Evan Chengf81bf152009-11-23 21:57:23 +00002382 string OpcodeStr, string Dt, ValueType ResTy, ValueType OpTy,
Bob Wilson5bafff32009-06-22 23:27:02 +00002383 Intrinsic IntOp>
Bob Wilson507df402009-10-21 02:15:46 +00002384 : N2VImm<op24, op23, op11_8, op7, 0, op4,
Owen Anderson498ec202010-10-27 22:49:00 +00002385 (outs DPR:$Vd), (ins DPR:$Vm, neon_vcvt_imm32:$SIMM), NVCVTFrm,
2386 IIC_VUNAD, OpcodeStr, Dt, "$Vd, $Vm, $SIMM", "",
2387 [(set DPR:$Vd, (ResTy (IntOp (OpTy DPR:$Vm), (i32 imm:$SIMM))))]>;
Bob Wilson507df402009-10-21 02:15:46 +00002388class N2VCvtQ<bit op24, bit op23, bits<4> op11_8, bit op7, bit op4,
Evan Chengf81bf152009-11-23 21:57:23 +00002389 string OpcodeStr, string Dt, ValueType ResTy, ValueType OpTy,
Bob Wilson5bafff32009-06-22 23:27:02 +00002390 Intrinsic IntOp>
Bob Wilson507df402009-10-21 02:15:46 +00002391 : N2VImm<op24, op23, op11_8, op7, 1, op4,
Owen Anderson498ec202010-10-27 22:49:00 +00002392 (outs QPR:$Vd), (ins QPR:$Vm, neon_vcvt_imm32:$SIMM), NVCVTFrm,
2393 IIC_VUNAQ, OpcodeStr, Dt, "$Vd, $Vm, $SIMM", "",
2394 [(set QPR:$Vd, (ResTy (IntOp (OpTy QPR:$Vm), (i32 imm:$SIMM))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002395
2396//===----------------------------------------------------------------------===//
2397// Multiclasses
2398//===----------------------------------------------------------------------===//
2399
Bob Wilson916ac5b2009-10-03 04:44:16 +00002400// Abbreviations used in multiclass suffixes:
2401// Q = quarter int (8 bit) elements
2402// H = half int (16 bit) elements
2403// S = single int (32 bit) elements
2404// D = double int (64 bit) elements
2405
Bob Wilson094dd802010-12-18 00:42:58 +00002406// Neon 2-register vector operations and intrinsics.
Johnny Chenec5a4cd2010-02-23 00:33:12 +00002407
Bob Wilson094dd802010-12-18 00:42:58 +00002408// Neon 2-register comparisons.
2409// source operand element sizes of 8, 16 and 32 bits:
Johnny Chen363ac582010-02-23 01:42:58 +00002410multiclass N2V_QHS_cmp<bits<2> op24_23, bits<2> op21_20, bits<2> op17_16,
2411 bits<5> op11_7, bit op4, string opc, string Dt,
Owen Andersonc24cb352010-11-08 23:21:22 +00002412 string asm, SDNode OpNode> {
Johnny Chenec5a4cd2010-02-23 00:33:12 +00002413 // 64-bit vector types.
2414 def v8i8 : N2V<op24_23, op21_20, 0b00, op17_16, op11_7, 0, op4,
Owen Andersonca6945e2010-12-01 00:28:25 +00002415 (outs DPR:$Vd), (ins DPR:$Vm), NoItinerary,
Owen Andersonc24cb352010-11-08 23:21:22 +00002416 opc, !strconcat(Dt, "8"), asm, "",
Owen Andersonca6945e2010-12-01 00:28:25 +00002417 [(set DPR:$Vd, (v8i8 (OpNode (v8i8 DPR:$Vm))))]>;
Johnny Chenec5a4cd2010-02-23 00:33:12 +00002418 def v4i16 : N2V<op24_23, op21_20, 0b01, op17_16, op11_7, 0, op4,
Owen Andersonca6945e2010-12-01 00:28:25 +00002419 (outs DPR:$Vd), (ins DPR:$Vm), NoItinerary,
Owen Andersonc24cb352010-11-08 23:21:22 +00002420 opc, !strconcat(Dt, "16"), asm, "",
Owen Andersonca6945e2010-12-01 00:28:25 +00002421 [(set DPR:$Vd, (v4i16 (OpNode (v4i16 DPR:$Vm))))]>;
Johnny Chenec5a4cd2010-02-23 00:33:12 +00002422 def v2i32 : N2V<op24_23, op21_20, 0b10, op17_16, op11_7, 0, op4,
Owen Andersonca6945e2010-12-01 00:28:25 +00002423 (outs DPR:$Vd), (ins DPR:$Vm), NoItinerary,
Owen Andersonc24cb352010-11-08 23:21:22 +00002424 opc, !strconcat(Dt, "32"), asm, "",
Owen Andersonca6945e2010-12-01 00:28:25 +00002425 [(set DPR:$Vd, (v2i32 (OpNode (v2i32 DPR:$Vm))))]>;
Johnny Chenec5a4cd2010-02-23 00:33:12 +00002426 def v2f32 : N2V<op24_23, op21_20, 0b10, op17_16, op11_7, 0, op4,
Owen Andersonca6945e2010-12-01 00:28:25 +00002427 (outs DPR:$Vd), (ins DPR:$Vm), NoItinerary,
Owen Andersonc24cb352010-11-08 23:21:22 +00002428 opc, "f32", asm, "",
Bob Wilson3deb4512010-12-18 00:04:33 +00002429 [(set DPR:$Vd, (v2i32 (OpNode (v2f32 DPR:$Vm))))]> {
Johnny Chenec5a4cd2010-02-23 00:33:12 +00002430 let Inst{10} = 1; // overwrite F = 1
2431 }
2432
2433 // 128-bit vector types.
2434 def v16i8 : N2V<op24_23, op21_20, 0b00, op17_16, op11_7, 1, op4,
Owen Andersonca6945e2010-12-01 00:28:25 +00002435 (outs QPR:$Vd), (ins QPR:$Vm), NoItinerary,
Owen Andersonc24cb352010-11-08 23:21:22 +00002436 opc, !strconcat(Dt, "8"), asm, "",
Owen Andersonca6945e2010-12-01 00:28:25 +00002437 [(set QPR:$Vd, (v16i8 (OpNode (v16i8 QPR:$Vm))))]>;
Johnny Chenec5a4cd2010-02-23 00:33:12 +00002438 def v8i16 : N2V<op24_23, op21_20, 0b01, op17_16, op11_7, 1, op4,
Owen Andersonca6945e2010-12-01 00:28:25 +00002439 (outs QPR:$Vd), (ins QPR:$Vm), NoItinerary,
Owen Andersonc24cb352010-11-08 23:21:22 +00002440 opc, !strconcat(Dt, "16"), asm, "",
Owen Andersonca6945e2010-12-01 00:28:25 +00002441 [(set QPR:$Vd, (v8i16 (OpNode (v8i16 QPR:$Vm))))]>;
Johnny Chenec5a4cd2010-02-23 00:33:12 +00002442 def v4i32 : N2V<op24_23, op21_20, 0b10, op17_16, op11_7, 1, op4,
Owen Andersonca6945e2010-12-01 00:28:25 +00002443 (outs QPR:$Vd), (ins QPR:$Vm), NoItinerary,
Owen Andersonc24cb352010-11-08 23:21:22 +00002444 opc, !strconcat(Dt, "32"), asm, "",
Owen Andersonca6945e2010-12-01 00:28:25 +00002445 [(set QPR:$Vd, (v4i32 (OpNode (v4i32 QPR:$Vm))))]>;
Johnny Chenec5a4cd2010-02-23 00:33:12 +00002446 def v4f32 : N2V<op24_23, op21_20, 0b10, op17_16, op11_7, 1, op4,
Owen Andersonca6945e2010-12-01 00:28:25 +00002447 (outs QPR:$Vd), (ins QPR:$Vm), NoItinerary,
Owen Andersonc24cb352010-11-08 23:21:22 +00002448 opc, "f32", asm, "",
Bob Wilson3deb4512010-12-18 00:04:33 +00002449 [(set QPR:$Vd, (v4i32 (OpNode (v4f32 QPR:$Vm))))]> {
Johnny Chenec5a4cd2010-02-23 00:33:12 +00002450 let Inst{10} = 1; // overwrite F = 1
2451 }
2452}
2453
Bob Wilson094dd802010-12-18 00:42:58 +00002454
2455// Neon 2-register vector intrinsics,
2456// element sizes of 8, 16 and 32 bits:
2457multiclass N2VInt_QHS<bits<2> op24_23, bits<2> op21_20, bits<2> op17_16,
2458 bits<5> op11_7, bit op4,
2459 InstrItinClass itinD, InstrItinClass itinQ,
2460 string OpcodeStr, string Dt, Intrinsic IntOp> {
2461 // 64-bit vector types.
2462 def v8i8 : N2VDInt<op24_23, op21_20, 0b00, op17_16, op11_7, op4,
2463 itinD, OpcodeStr, !strconcat(Dt, "8"), v8i8, v8i8, IntOp>;
2464 def v4i16 : N2VDInt<op24_23, op21_20, 0b01, op17_16, op11_7, op4,
2465 itinD, OpcodeStr, !strconcat(Dt, "16"),v4i16,v4i16,IntOp>;
2466 def v2i32 : N2VDInt<op24_23, op21_20, 0b10, op17_16, op11_7, op4,
2467 itinD, OpcodeStr, !strconcat(Dt, "32"),v2i32,v2i32,IntOp>;
2468
2469 // 128-bit vector types.
2470 def v16i8 : N2VQInt<op24_23, op21_20, 0b00, op17_16, op11_7, op4,
2471 itinQ, OpcodeStr, !strconcat(Dt, "8"), v16i8,v16i8,IntOp>;
2472 def v8i16 : N2VQInt<op24_23, op21_20, 0b01, op17_16, op11_7, op4,
2473 itinQ, OpcodeStr, !strconcat(Dt, "16"),v8i16,v8i16,IntOp>;
2474 def v4i32 : N2VQInt<op24_23, op21_20, 0b10, op17_16, op11_7, op4,
2475 itinQ, OpcodeStr, !strconcat(Dt, "32"),v4i32,v4i32,IntOp>;
2476}
2477
2478
2479// Neon Narrowing 2-register vector operations,
2480// source operand element sizes of 16, 32 and 64 bits:
2481multiclass N2VN_HSD<bits<2> op24_23, bits<2> op21_20, bits<2> op17_16,
2482 bits<5> op11_7, bit op6, bit op4,
2483 InstrItinClass itin, string OpcodeStr, string Dt,
2484 SDNode OpNode> {
2485 def v8i8 : N2VN<op24_23, op21_20, 0b00, op17_16, op11_7, op6, op4,
2486 itin, OpcodeStr, !strconcat(Dt, "16"),
2487 v8i8, v8i16, OpNode>;
2488 def v4i16 : N2VN<op24_23, op21_20, 0b01, op17_16, op11_7, op6, op4,
2489 itin, OpcodeStr, !strconcat(Dt, "32"),
2490 v4i16, v4i32, OpNode>;
2491 def v2i32 : N2VN<op24_23, op21_20, 0b10, op17_16, op11_7, op6, op4,
2492 itin, OpcodeStr, !strconcat(Dt, "64"),
2493 v2i32, v2i64, OpNode>;
2494}
2495
2496// Neon Narrowing 2-register vector intrinsics,
2497// source operand element sizes of 16, 32 and 64 bits:
2498multiclass N2VNInt_HSD<bits<2> op24_23, bits<2> op21_20, bits<2> op17_16,
2499 bits<5> op11_7, bit op6, bit op4,
2500 InstrItinClass itin, string OpcodeStr, string Dt,
2501 Intrinsic IntOp> {
2502 def v8i8 : N2VNInt<op24_23, op21_20, 0b00, op17_16, op11_7, op6, op4,
2503 itin, OpcodeStr, !strconcat(Dt, "16"),
2504 v8i8, v8i16, IntOp>;
2505 def v4i16 : N2VNInt<op24_23, op21_20, 0b01, op17_16, op11_7, op6, op4,
2506 itin, OpcodeStr, !strconcat(Dt, "32"),
2507 v4i16, v4i32, IntOp>;
2508 def v2i32 : N2VNInt<op24_23, op21_20, 0b10, op17_16, op11_7, op6, op4,
2509 itin, OpcodeStr, !strconcat(Dt, "64"),
2510 v2i32, v2i64, IntOp>;
2511}
2512
2513
2514// Neon Lengthening 2-register vector intrinsic (currently specific to VMOVL).
2515// source operand element sizes of 16, 32 and 64 bits:
2516multiclass N2VL_QHS<bits<2> op24_23, bits<5> op11_7, bit op6, bit op4,
2517 string OpcodeStr, string Dt, SDNode OpNode> {
2518 def v8i16 : N2VL<op24_23, 0b00, 0b10, 0b00, op11_7, op6, op4, IIC_VQUNAiD,
2519 OpcodeStr, !strconcat(Dt, "8"), v8i16, v8i8, OpNode>;
2520 def v4i32 : N2VL<op24_23, 0b01, 0b00, 0b00, op11_7, op6, op4, IIC_VQUNAiD,
2521 OpcodeStr, !strconcat(Dt, "16"), v4i32, v4i16, OpNode>;
2522 def v2i64 : N2VL<op24_23, 0b10, 0b00, 0b00, op11_7, op6, op4, IIC_VQUNAiD,
2523 OpcodeStr, !strconcat(Dt, "32"), v2i64, v2i32, OpNode>;
2524}
2525
2526
Bob Wilson5bafff32009-06-22 23:27:02 +00002527// Neon 3-register vector operations.
2528
2529// First with only element sizes of 8, 16 and 32 bits:
2530multiclass N3V_QHS<bit op24, bit op23, bits<4> op11_8, bit op4,
David Goodwin127221f2009-09-23 21:38:08 +00002531 InstrItinClass itinD16, InstrItinClass itinD32,
2532 InstrItinClass itinQ16, InstrItinClass itinQ32,
Evan Chengf81bf152009-11-23 21:57:23 +00002533 string OpcodeStr, string Dt,
2534 SDNode OpNode, bit Commutable = 0> {
Bob Wilson5bafff32009-06-22 23:27:02 +00002535 // 64-bit vector types.
Jim Grosbach1251e1a2010-11-18 01:39:50 +00002536 def v8i8 : N3VD<op24, op23, 0b00, op11_8, op4, itinD16,
Evan Chengf81bf152009-11-23 21:57:23 +00002537 OpcodeStr, !strconcat(Dt, "8"),
2538 v8i8, v8i8, OpNode, Commutable>;
David Goodwin127221f2009-09-23 21:38:08 +00002539 def v4i16 : N3VD<op24, op23, 0b01, op11_8, op4, itinD16,
Bob Wilson9abe19d2010-02-17 00:31:29 +00002540 OpcodeStr, !strconcat(Dt, "16"),
2541 v4i16, v4i16, OpNode, Commutable>;
David Goodwin127221f2009-09-23 21:38:08 +00002542 def v2i32 : N3VD<op24, op23, 0b10, op11_8, op4, itinD32,
Bob Wilson9abe19d2010-02-17 00:31:29 +00002543 OpcodeStr, !strconcat(Dt, "32"),
2544 v2i32, v2i32, OpNode, Commutable>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002545
2546 // 128-bit vector types.
David Goodwin127221f2009-09-23 21:38:08 +00002547 def v16i8 : N3VQ<op24, op23, 0b00, op11_8, op4, itinQ16,
Bob Wilson9abe19d2010-02-17 00:31:29 +00002548 OpcodeStr, !strconcat(Dt, "8"),
2549 v16i8, v16i8, OpNode, Commutable>;
David Goodwin127221f2009-09-23 21:38:08 +00002550 def v8i16 : N3VQ<op24, op23, 0b01, op11_8, op4, itinQ16,
Bob Wilson9abe19d2010-02-17 00:31:29 +00002551 OpcodeStr, !strconcat(Dt, "16"),
2552 v8i16, v8i16, OpNode, Commutable>;
David Goodwin127221f2009-09-23 21:38:08 +00002553 def v4i32 : N3VQ<op24, op23, 0b10, op11_8, op4, itinQ32,
Bob Wilson9abe19d2010-02-17 00:31:29 +00002554 OpcodeStr, !strconcat(Dt, "32"),
2555 v4i32, v4i32, OpNode, Commutable>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002556}
2557
Evan Chengf81bf152009-11-23 21:57:23 +00002558multiclass N3VSL_HS<bits<4> op11_8, string OpcodeStr, string Dt, SDNode ShOp> {
2559 def v4i16 : N3VDSL16<0b01, op11_8, OpcodeStr, !strconcat(Dt, "16"),
2560 v4i16, ShOp>;
2561 def v2i32 : N3VDSL<0b10, op11_8, IIC_VMULi32D, OpcodeStr, !strconcat(Dt,"32"),
Evan Chengac0869d2009-11-21 06:21:52 +00002562 v2i32, ShOp>;
Evan Chengf81bf152009-11-23 21:57:23 +00002563 def v8i16 : N3VQSL16<0b01, op11_8, OpcodeStr, !strconcat(Dt, "16"),
Evan Chengac0869d2009-11-21 06:21:52 +00002564 v8i16, v4i16, ShOp>;
Evan Chengf81bf152009-11-23 21:57:23 +00002565 def v4i32 : N3VQSL<0b10, op11_8, IIC_VMULi32Q, OpcodeStr, !strconcat(Dt,"32"),
Evan Chengac0869d2009-11-21 06:21:52 +00002566 v4i32, v2i32, ShOp>;
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00002567}
2568
Bob Wilson5bafff32009-06-22 23:27:02 +00002569// ....then also with element size 64 bits:
2570multiclass N3V_QHSD<bit op24, bit op23, bits<4> op11_8, bit op4,
David Goodwin127221f2009-09-23 21:38:08 +00002571 InstrItinClass itinD, InstrItinClass itinQ,
Evan Chengf81bf152009-11-23 21:57:23 +00002572 string OpcodeStr, string Dt,
2573 SDNode OpNode, bit Commutable = 0>
David Goodwin127221f2009-09-23 21:38:08 +00002574 : N3V_QHS<op24, op23, op11_8, op4, itinD, itinD, itinQ, itinQ,
Evan Chengf81bf152009-11-23 21:57:23 +00002575 OpcodeStr, Dt, OpNode, Commutable> {
David Goodwin127221f2009-09-23 21:38:08 +00002576 def v1i64 : N3VD<op24, op23, 0b11, op11_8, op4, itinD,
Evan Chengf81bf152009-11-23 21:57:23 +00002577 OpcodeStr, !strconcat(Dt, "64"),
2578 v1i64, v1i64, OpNode, Commutable>;
David Goodwin127221f2009-09-23 21:38:08 +00002579 def v2i64 : N3VQ<op24, op23, 0b11, op11_8, op4, itinQ,
Evan Chengf81bf152009-11-23 21:57:23 +00002580 OpcodeStr, !strconcat(Dt, "64"),
2581 v2i64, v2i64, OpNode, Commutable>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002582}
2583
2584
Bob Wilson5bafff32009-06-22 23:27:02 +00002585// Neon 3-register vector intrinsics.
2586
2587// First with only element sizes of 16 and 32 bits:
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00002588multiclass N3VInt_HS<bit op24, bit op23, bits<4> op11_8, bit op4, Format f,
David Goodwin658ea602009-09-25 18:38:29 +00002589 InstrItinClass itinD16, InstrItinClass itinD32,
2590 InstrItinClass itinQ16, InstrItinClass itinQ32,
Evan Chengf81bf152009-11-23 21:57:23 +00002591 string OpcodeStr, string Dt,
2592 Intrinsic IntOp, bit Commutable = 0> {
Bob Wilson5bafff32009-06-22 23:27:02 +00002593 // 64-bit vector types.
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00002594 def v4i16 : N3VDInt<op24, op23, 0b01, op11_8, op4, f, itinD16,
Evan Chengf81bf152009-11-23 21:57:23 +00002595 OpcodeStr, !strconcat(Dt, "16"),
Bob Wilson5bafff32009-06-22 23:27:02 +00002596 v4i16, v4i16, IntOp, Commutable>;
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00002597 def v2i32 : N3VDInt<op24, op23, 0b10, op11_8, op4, f, itinD32,
Evan Chengf81bf152009-11-23 21:57:23 +00002598 OpcodeStr, !strconcat(Dt, "32"),
Bob Wilson5bafff32009-06-22 23:27:02 +00002599 v2i32, v2i32, IntOp, Commutable>;
2600
2601 // 128-bit vector types.
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00002602 def v8i16 : N3VQInt<op24, op23, 0b01, op11_8, op4, f, itinQ16,
Evan Chengf81bf152009-11-23 21:57:23 +00002603 OpcodeStr, !strconcat(Dt, "16"),
Bob Wilson5bafff32009-06-22 23:27:02 +00002604 v8i16, v8i16, IntOp, Commutable>;
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00002605 def v4i32 : N3VQInt<op24, op23, 0b10, op11_8, op4, f, itinQ32,
Evan Chengf81bf152009-11-23 21:57:23 +00002606 OpcodeStr, !strconcat(Dt, "32"),
Bob Wilson5bafff32009-06-22 23:27:02 +00002607 v4i32, v4i32, IntOp, Commutable>;
2608}
Owen Anderson3557d002010-10-26 20:56:57 +00002609multiclass N3VInt_HSSh<bit op24, bit op23, bits<4> op11_8, bit op4, Format f,
2610 InstrItinClass itinD16, InstrItinClass itinD32,
2611 InstrItinClass itinQ16, InstrItinClass itinQ32,
2612 string OpcodeStr, string Dt,
Owen Andersonac922622010-10-26 21:13:59 +00002613 Intrinsic IntOp> {
Owen Anderson3557d002010-10-26 20:56:57 +00002614 // 64-bit vector types.
2615 def v4i16 : N3VDIntSh<op24, op23, 0b01, op11_8, op4, f, itinD16,
2616 OpcodeStr, !strconcat(Dt, "16"),
Owen Andersonac922622010-10-26 21:13:59 +00002617 v4i16, v4i16, IntOp>;
Owen Anderson3557d002010-10-26 20:56:57 +00002618 def v2i32 : N3VDIntSh<op24, op23, 0b10, op11_8, op4, f, itinD32,
2619 OpcodeStr, !strconcat(Dt, "32"),
Owen Andersonac922622010-10-26 21:13:59 +00002620 v2i32, v2i32, IntOp>;
Owen Anderson3557d002010-10-26 20:56:57 +00002621
2622 // 128-bit vector types.
2623 def v8i16 : N3VQIntSh<op24, op23, 0b01, op11_8, op4, f, itinQ16,
2624 OpcodeStr, !strconcat(Dt, "16"),
Owen Andersonac922622010-10-26 21:13:59 +00002625 v8i16, v8i16, IntOp>;
Owen Anderson3557d002010-10-26 20:56:57 +00002626 def v4i32 : N3VQIntSh<op24, op23, 0b10, op11_8, op4, f, itinQ32,
2627 OpcodeStr, !strconcat(Dt, "32"),
Owen Andersonac922622010-10-26 21:13:59 +00002628 v4i32, v4i32, IntOp>;
Owen Anderson3557d002010-10-26 20:56:57 +00002629}
Bob Wilson5bafff32009-06-22 23:27:02 +00002630
Jim Grosbach1251e1a2010-11-18 01:39:50 +00002631multiclass N3VIntSL_HS<bits<4> op11_8,
David Goodwin658ea602009-09-25 18:38:29 +00002632 InstrItinClass itinD16, InstrItinClass itinD32,
2633 InstrItinClass itinQ16, InstrItinClass itinQ32,
Evan Chengf81bf152009-11-23 21:57:23 +00002634 string OpcodeStr, string Dt, Intrinsic IntOp> {
Evan Chengac0869d2009-11-21 06:21:52 +00002635 def v4i16 : N3VDIntSL16<0b01, op11_8, itinD16,
Evan Chengf81bf152009-11-23 21:57:23 +00002636 OpcodeStr, !strconcat(Dt, "16"), v4i16, IntOp>;
Evan Chengac0869d2009-11-21 06:21:52 +00002637 def v2i32 : N3VDIntSL<0b10, op11_8, itinD32,
Evan Chengf81bf152009-11-23 21:57:23 +00002638 OpcodeStr, !strconcat(Dt, "32"), v2i32, IntOp>;
Evan Chengac0869d2009-11-21 06:21:52 +00002639 def v8i16 : N3VQIntSL16<0b01, op11_8, itinQ16,
Bob Wilson9abe19d2010-02-17 00:31:29 +00002640 OpcodeStr, !strconcat(Dt, "16"), v8i16, v4i16, IntOp>;
Evan Chengac0869d2009-11-21 06:21:52 +00002641 def v4i32 : N3VQIntSL<0b10, op11_8, itinQ32,
Evan Chengf81bf152009-11-23 21:57:23 +00002642 OpcodeStr, !strconcat(Dt, "32"), v4i32, v2i32, IntOp>;
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00002643}
2644
Bob Wilson5bafff32009-06-22 23:27:02 +00002645// ....then also with element size of 8 bits:
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00002646multiclass N3VInt_QHS<bit op24, bit op23, bits<4> op11_8, bit op4, Format f,
David Goodwin658ea602009-09-25 18:38:29 +00002647 InstrItinClass itinD16, InstrItinClass itinD32,
2648 InstrItinClass itinQ16, InstrItinClass itinQ32,
Evan Chengf81bf152009-11-23 21:57:23 +00002649 string OpcodeStr, string Dt,
2650 Intrinsic IntOp, bit Commutable = 0>
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00002651 : N3VInt_HS<op24, op23, op11_8, op4, f, itinD16, itinD32, itinQ16, itinQ32,
Evan Chengf81bf152009-11-23 21:57:23 +00002652 OpcodeStr, Dt, IntOp, Commutable> {
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00002653 def v8i8 : N3VDInt<op24, op23, 0b00, op11_8, op4, f, itinD16,
Bob Wilson9abe19d2010-02-17 00:31:29 +00002654 OpcodeStr, !strconcat(Dt, "8"),
2655 v8i8, v8i8, IntOp, Commutable>;
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00002656 def v16i8 : N3VQInt<op24, op23, 0b00, op11_8, op4, f, itinQ16,
Evan Chengf81bf152009-11-23 21:57:23 +00002657 OpcodeStr, !strconcat(Dt, "8"),
2658 v16i8, v16i8, IntOp, Commutable>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002659}
Owen Anderson3557d002010-10-26 20:56:57 +00002660multiclass N3VInt_QHSSh<bit op24, bit op23, bits<4> op11_8, bit op4, Format f,
2661 InstrItinClass itinD16, InstrItinClass itinD32,
2662 InstrItinClass itinQ16, InstrItinClass itinQ32,
2663 string OpcodeStr, string Dt,
Owen Andersonac922622010-10-26 21:13:59 +00002664 Intrinsic IntOp>
Owen Anderson3557d002010-10-26 20:56:57 +00002665 : N3VInt_HSSh<op24, op23, op11_8, op4, f, itinD16, itinD32, itinQ16, itinQ32,
Owen Andersonac922622010-10-26 21:13:59 +00002666 OpcodeStr, Dt, IntOp> {
Owen Anderson3557d002010-10-26 20:56:57 +00002667 def v8i8 : N3VDIntSh<op24, op23, 0b00, op11_8, op4, f, itinD16,
2668 OpcodeStr, !strconcat(Dt, "8"),
Owen Andersonac922622010-10-26 21:13:59 +00002669 v8i8, v8i8, IntOp>;
Owen Anderson3557d002010-10-26 20:56:57 +00002670 def v16i8 : N3VQIntSh<op24, op23, 0b00, op11_8, op4, f, itinQ16,
2671 OpcodeStr, !strconcat(Dt, "8"),
Owen Andersonac922622010-10-26 21:13:59 +00002672 v16i8, v16i8, IntOp>;
Owen Anderson3557d002010-10-26 20:56:57 +00002673}
2674
Bob Wilson5bafff32009-06-22 23:27:02 +00002675
2676// ....then also with element size of 64 bits:
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00002677multiclass N3VInt_QHSD<bit op24, bit op23, bits<4> op11_8, bit op4, Format f,
David Goodwin658ea602009-09-25 18:38:29 +00002678 InstrItinClass itinD16, InstrItinClass itinD32,
2679 InstrItinClass itinQ16, InstrItinClass itinQ32,
Evan Chengf81bf152009-11-23 21:57:23 +00002680 string OpcodeStr, string Dt,
2681 Intrinsic IntOp, bit Commutable = 0>
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00002682 : N3VInt_QHS<op24, op23, op11_8, op4, f, itinD16, itinD32, itinQ16, itinQ32,
Evan Chengf81bf152009-11-23 21:57:23 +00002683 OpcodeStr, Dt, IntOp, Commutable> {
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00002684 def v1i64 : N3VDInt<op24, op23, 0b11, op11_8, op4, f, itinD32,
Bob Wilson9abe19d2010-02-17 00:31:29 +00002685 OpcodeStr, !strconcat(Dt, "64"),
2686 v1i64, v1i64, IntOp, Commutable>;
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00002687 def v2i64 : N3VQInt<op24, op23, 0b11, op11_8, op4, f, itinQ32,
Bob Wilson9abe19d2010-02-17 00:31:29 +00002688 OpcodeStr, !strconcat(Dt, "64"),
2689 v2i64, v2i64, IntOp, Commutable>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002690}
Owen Anderson3557d002010-10-26 20:56:57 +00002691multiclass N3VInt_QHSDSh<bit op24, bit op23, bits<4> op11_8, bit op4, Format f,
2692 InstrItinClass itinD16, InstrItinClass itinD32,
2693 InstrItinClass itinQ16, InstrItinClass itinQ32,
2694 string OpcodeStr, string Dt,
Owen Andersonac922622010-10-26 21:13:59 +00002695 Intrinsic IntOp>
Owen Anderson3557d002010-10-26 20:56:57 +00002696 : N3VInt_QHSSh<op24, op23, op11_8, op4, f, itinD16, itinD32, itinQ16, itinQ32,
Owen Andersonac922622010-10-26 21:13:59 +00002697 OpcodeStr, Dt, IntOp> {
Owen Anderson3557d002010-10-26 20:56:57 +00002698 def v1i64 : N3VDIntSh<op24, op23, 0b11, op11_8, op4, f, itinD32,
2699 OpcodeStr, !strconcat(Dt, "64"),
Owen Andersonac922622010-10-26 21:13:59 +00002700 v1i64, v1i64, IntOp>;
Owen Anderson3557d002010-10-26 20:56:57 +00002701 def v2i64 : N3VQIntSh<op24, op23, 0b11, op11_8, op4, f, itinQ32,
2702 OpcodeStr, !strconcat(Dt, "64"),
Owen Andersonac922622010-10-26 21:13:59 +00002703 v2i64, v2i64, IntOp>;
Owen Anderson3557d002010-10-26 20:56:57 +00002704}
Bob Wilson5bafff32009-06-22 23:27:02 +00002705
Bob Wilson5bafff32009-06-22 23:27:02 +00002706// Neon Narrowing 3-register vector intrinsics,
2707// source operand element sizes of 16, 32 and 64 bits:
2708multiclass N3VNInt_HSD<bit op24, bit op23, bits<4> op11_8, bit op4,
Evan Chengf81bf152009-11-23 21:57:23 +00002709 string OpcodeStr, string Dt,
2710 Intrinsic IntOp, bit Commutable = 0> {
2711 def v8i8 : N3VNInt<op24, op23, 0b00, op11_8, op4,
2712 OpcodeStr, !strconcat(Dt, "16"),
Bob Wilson5bafff32009-06-22 23:27:02 +00002713 v8i8, v8i16, IntOp, Commutable>;
Evan Chengf81bf152009-11-23 21:57:23 +00002714 def v4i16 : N3VNInt<op24, op23, 0b01, op11_8, op4,
2715 OpcodeStr, !strconcat(Dt, "32"),
Bob Wilson5bafff32009-06-22 23:27:02 +00002716 v4i16, v4i32, IntOp, Commutable>;
Evan Chengf81bf152009-11-23 21:57:23 +00002717 def v2i32 : N3VNInt<op24, op23, 0b10, op11_8, op4,
2718 OpcodeStr, !strconcat(Dt, "64"),
Bob Wilson5bafff32009-06-22 23:27:02 +00002719 v2i32, v2i64, IntOp, Commutable>;
2720}
2721
2722
Bob Wilson04d6c282010-08-29 05:57:34 +00002723// Neon Long 3-register vector operations.
2724
2725multiclass N3VL_QHS<bit op24, bit op23, bits<4> op11_8, bit op4,
2726 InstrItinClass itin16, InstrItinClass itin32,
2727 string OpcodeStr, string Dt,
Bob Wilsond0b69cf2010-09-01 23:50:19 +00002728 SDNode OpNode, bit Commutable = 0> {
Bob Wilson04d6c282010-08-29 05:57:34 +00002729 def v8i16 : N3VL<op24, op23, 0b00, op11_8, op4, itin16,
2730 OpcodeStr, !strconcat(Dt, "8"),
Bob Wilsond0b69cf2010-09-01 23:50:19 +00002731 v8i16, v8i8, OpNode, Commutable>;
Jim Grosbach1251e1a2010-11-18 01:39:50 +00002732 def v4i32 : N3VL<op24, op23, 0b01, op11_8, op4, itin16,
Bob Wilsond0b69cf2010-09-01 23:50:19 +00002733 OpcodeStr, !strconcat(Dt, "16"),
2734 v4i32, v4i16, OpNode, Commutable>;
2735 def v2i64 : N3VL<op24, op23, 0b10, op11_8, op4, itin32,
2736 OpcodeStr, !strconcat(Dt, "32"),
2737 v2i64, v2i32, OpNode, Commutable>;
2738}
2739
2740multiclass N3VLSL_HS<bit op24, bits<4> op11_8,
2741 InstrItinClass itin, string OpcodeStr, string Dt,
2742 SDNode OpNode> {
2743 def v4i16 : N3VLSL16<op24, 0b01, op11_8, itin, OpcodeStr,
2744 !strconcat(Dt, "16"), v4i32, v4i16, OpNode>;
2745 def v2i32 : N3VLSL<op24, 0b10, op11_8, itin, OpcodeStr,
2746 !strconcat(Dt, "32"), v2i64, v2i32, OpNode>;
2747}
2748
2749multiclass N3VLExt_QHS<bit op24, bit op23, bits<4> op11_8, bit op4,
2750 InstrItinClass itin16, InstrItinClass itin32,
2751 string OpcodeStr, string Dt,
2752 SDNode OpNode, SDNode ExtOp, bit Commutable = 0> {
2753 def v8i16 : N3VLExt<op24, op23, 0b00, op11_8, op4, itin16,
2754 OpcodeStr, !strconcat(Dt, "8"),
2755 v8i16, v8i8, OpNode, ExtOp, Commutable>;
Jim Grosbach1251e1a2010-11-18 01:39:50 +00002756 def v4i32 : N3VLExt<op24, op23, 0b01, op11_8, op4, itin16,
Bob Wilsond0b69cf2010-09-01 23:50:19 +00002757 OpcodeStr, !strconcat(Dt, "16"),
2758 v4i32, v4i16, OpNode, ExtOp, Commutable>;
2759 def v2i64 : N3VLExt<op24, op23, 0b10, op11_8, op4, itin32,
2760 OpcodeStr, !strconcat(Dt, "32"),
2761 v2i64, v2i32, OpNode, ExtOp, Commutable>;
Bob Wilson04d6c282010-08-29 05:57:34 +00002762}
2763
Bob Wilson5bafff32009-06-22 23:27:02 +00002764// Neon Long 3-register vector intrinsics.
2765
2766// First with only element sizes of 16 and 32 bits:
2767multiclass N3VLInt_HS<bit op24, bit op23, bits<4> op11_8, bit op4,
Anton Korobeynikovecc64062010-04-07 18:21:10 +00002768 InstrItinClass itin16, InstrItinClass itin32,
2769 string OpcodeStr, string Dt,
David Goodwin658ea602009-09-25 18:38:29 +00002770 Intrinsic IntOp, bit Commutable = 0> {
Jim Grosbach1251e1a2010-11-18 01:39:50 +00002771 def v4i32 : N3VLInt<op24, op23, 0b01, op11_8, op4, itin16,
Evan Chengf81bf152009-11-23 21:57:23 +00002772 OpcodeStr, !strconcat(Dt, "16"),
2773 v4i32, v4i16, IntOp, Commutable>;
Anton Korobeynikovecc64062010-04-07 18:21:10 +00002774 def v2i64 : N3VLInt<op24, op23, 0b10, op11_8, op4, itin32,
Evan Chengf81bf152009-11-23 21:57:23 +00002775 OpcodeStr, !strconcat(Dt, "32"),
2776 v2i64, v2i32, IntOp, Commutable>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002777}
2778
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00002779multiclass N3VLIntSL_HS<bit op24, bits<4> op11_8,
Evan Chengf81bf152009-11-23 21:57:23 +00002780 InstrItinClass itin, string OpcodeStr, string Dt,
2781 Intrinsic IntOp> {
Jim Grosbach1251e1a2010-11-18 01:39:50 +00002782 def v4i16 : N3VLIntSL16<op24, 0b01, op11_8, itin,
Evan Chengf81bf152009-11-23 21:57:23 +00002783 OpcodeStr, !strconcat(Dt, "16"), v4i32, v4i16, IntOp>;
David Goodwin658ea602009-09-25 18:38:29 +00002784 def v2i32 : N3VLIntSL<op24, 0b10, op11_8, itin,
Evan Chengf81bf152009-11-23 21:57:23 +00002785 OpcodeStr, !strconcat(Dt, "32"), v2i64, v2i32, IntOp>;
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00002786}
2787
Bob Wilson5bafff32009-06-22 23:27:02 +00002788// ....then also with element size of 8 bits:
2789multiclass N3VLInt_QHS<bit op24, bit op23, bits<4> op11_8, bit op4,
Anton Korobeynikovecc64062010-04-07 18:21:10 +00002790 InstrItinClass itin16, InstrItinClass itin32,
2791 string OpcodeStr, string Dt,
David Goodwin658ea602009-09-25 18:38:29 +00002792 Intrinsic IntOp, bit Commutable = 0>
Anton Korobeynikovecc64062010-04-07 18:21:10 +00002793 : N3VLInt_HS<op24, op23, op11_8, op4, itin16, itin32, OpcodeStr, Dt,
Evan Chengf81bf152009-11-23 21:57:23 +00002794 IntOp, Commutable> {
Anton Korobeynikovecc64062010-04-07 18:21:10 +00002795 def v8i16 : N3VLInt<op24, op23, 0b00, op11_8, op4, itin16,
Evan Chengf81bf152009-11-23 21:57:23 +00002796 OpcodeStr, !strconcat(Dt, "8"),
2797 v8i16, v8i8, IntOp, Commutable>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002798}
2799
Bob Wilsoneb0c3d32010-09-03 01:35:08 +00002800// ....with explicit extend (VABDL).
2801multiclass N3VLIntExt_QHS<bit op24, bit op23, bits<4> op11_8, bit op4,
2802 InstrItinClass itin, string OpcodeStr, string Dt,
2803 Intrinsic IntOp, SDNode ExtOp, bit Commutable = 0> {
2804 def v8i16 : N3VLIntExt<op24, op23, 0b00, op11_8, op4, itin,
2805 OpcodeStr, !strconcat(Dt, "8"),
2806 v8i16, v8i8, IntOp, ExtOp, Commutable>;
Jim Grosbach1251e1a2010-11-18 01:39:50 +00002807 def v4i32 : N3VLIntExt<op24, op23, 0b01, op11_8, op4, itin,
Bob Wilsoneb0c3d32010-09-03 01:35:08 +00002808 OpcodeStr, !strconcat(Dt, "16"),
2809 v4i32, v4i16, IntOp, ExtOp, Commutable>;
2810 def v2i64 : N3VLIntExt<op24, op23, 0b10, op11_8, op4, itin,
2811 OpcodeStr, !strconcat(Dt, "32"),
2812 v2i64, v2i32, IntOp, ExtOp, Commutable>;
2813}
2814
Bob Wilson5bafff32009-06-22 23:27:02 +00002815
2816// Neon Wide 3-register vector intrinsics,
2817// source operand element sizes of 8, 16 and 32 bits:
Bob Wilson04d6c282010-08-29 05:57:34 +00002818multiclass N3VW_QHS<bit op24, bit op23, bits<4> op11_8, bit op4,
2819 string OpcodeStr, string Dt,
2820 SDNode OpNode, SDNode ExtOp, bit Commutable = 0> {
2821 def v8i16 : N3VW<op24, op23, 0b00, op11_8, op4,
2822 OpcodeStr, !strconcat(Dt, "8"),
2823 v8i16, v8i8, OpNode, ExtOp, Commutable>;
2824 def v4i32 : N3VW<op24, op23, 0b01, op11_8, op4,
2825 OpcodeStr, !strconcat(Dt, "16"),
2826 v4i32, v4i16, OpNode, ExtOp, Commutable>;
2827 def v2i64 : N3VW<op24, op23, 0b10, op11_8, op4,
2828 OpcodeStr, !strconcat(Dt, "32"),
2829 v2i64, v2i32, OpNode, ExtOp, Commutable>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002830}
2831
2832
2833// Neon Multiply-Op vector operations,
2834// element sizes of 8, 16 and 32 bits:
2835multiclass N3VMulOp_QHS<bit op24, bit op23, bits<4> op11_8, bit op4,
David Goodwin658ea602009-09-25 18:38:29 +00002836 InstrItinClass itinD16, InstrItinClass itinD32,
2837 InstrItinClass itinQ16, InstrItinClass itinQ32,
Evan Chengf81bf152009-11-23 21:57:23 +00002838 string OpcodeStr, string Dt, SDNode OpNode> {
Bob Wilson5bafff32009-06-22 23:27:02 +00002839 // 64-bit vector types.
David Goodwin658ea602009-09-25 18:38:29 +00002840 def v8i8 : N3VDMulOp<op24, op23, 0b00, op11_8, op4, itinD16,
Evan Chengf81bf152009-11-23 21:57:23 +00002841 OpcodeStr, !strconcat(Dt, "8"), v8i8, mul, OpNode>;
David Goodwin658ea602009-09-25 18:38:29 +00002842 def v4i16 : N3VDMulOp<op24, op23, 0b01, op11_8, op4, itinD16,
Evan Chengf81bf152009-11-23 21:57:23 +00002843 OpcodeStr, !strconcat(Dt, "16"), v4i16, mul, OpNode>;
David Goodwin658ea602009-09-25 18:38:29 +00002844 def v2i32 : N3VDMulOp<op24, op23, 0b10, op11_8, op4, itinD32,
Evan Chengf81bf152009-11-23 21:57:23 +00002845 OpcodeStr, !strconcat(Dt, "32"), v2i32, mul, OpNode>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002846
2847 // 128-bit vector types.
David Goodwin658ea602009-09-25 18:38:29 +00002848 def v16i8 : N3VQMulOp<op24, op23, 0b00, op11_8, op4, itinQ16,
Evan Chengf81bf152009-11-23 21:57:23 +00002849 OpcodeStr, !strconcat(Dt, "8"), v16i8, mul, OpNode>;
David Goodwin658ea602009-09-25 18:38:29 +00002850 def v8i16 : N3VQMulOp<op24, op23, 0b01, op11_8, op4, itinQ16,
Evan Chengf81bf152009-11-23 21:57:23 +00002851 OpcodeStr, !strconcat(Dt, "16"), v8i16, mul, OpNode>;
David Goodwin658ea602009-09-25 18:38:29 +00002852 def v4i32 : N3VQMulOp<op24, op23, 0b10, op11_8, op4, itinQ32,
Evan Chengf81bf152009-11-23 21:57:23 +00002853 OpcodeStr, !strconcat(Dt, "32"), v4i32, mul, OpNode>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002854}
2855
Jim Grosbach1251e1a2010-11-18 01:39:50 +00002856multiclass N3VMulOpSL_HS<bits<4> op11_8,
David Goodwin658ea602009-09-25 18:38:29 +00002857 InstrItinClass itinD16, InstrItinClass itinD32,
2858 InstrItinClass itinQ16, InstrItinClass itinQ32,
Evan Chengf81bf152009-11-23 21:57:23 +00002859 string OpcodeStr, string Dt, SDNode ShOp> {
David Goodwin658ea602009-09-25 18:38:29 +00002860 def v4i16 : N3VDMulOpSL16<0b01, op11_8, itinD16,
Evan Chengf81bf152009-11-23 21:57:23 +00002861 OpcodeStr, !strconcat(Dt, "16"), v4i16, mul, ShOp>;
David Goodwin658ea602009-09-25 18:38:29 +00002862 def v2i32 : N3VDMulOpSL<0b10, op11_8, itinD32,
Evan Chengf81bf152009-11-23 21:57:23 +00002863 OpcodeStr, !strconcat(Dt, "32"), v2i32, mul, ShOp>;
David Goodwin658ea602009-09-25 18:38:29 +00002864 def v8i16 : N3VQMulOpSL16<0b01, op11_8, itinQ16,
Bob Wilson9abe19d2010-02-17 00:31:29 +00002865 OpcodeStr, !strconcat(Dt, "16"), v8i16, v4i16,
2866 mul, ShOp>;
David Goodwin658ea602009-09-25 18:38:29 +00002867 def v4i32 : N3VQMulOpSL<0b10, op11_8, itinQ32,
Bob Wilson9abe19d2010-02-17 00:31:29 +00002868 OpcodeStr, !strconcat(Dt, "32"), v4i32, v2i32,
2869 mul, ShOp>;
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00002870}
Bob Wilson5bafff32009-06-22 23:27:02 +00002871
Bob Wilsoneb0c3d32010-09-03 01:35:08 +00002872// Neon Intrinsic-Op vector operations,
2873// element sizes of 8, 16 and 32 bits:
2874multiclass N3VIntOp_QHS<bit op24, bit op23, bits<4> op11_8, bit op4,
2875 InstrItinClass itinD, InstrItinClass itinQ,
2876 string OpcodeStr, string Dt, Intrinsic IntOp,
2877 SDNode OpNode> {
2878 // 64-bit vector types.
2879 def v8i8 : N3VDIntOp<op24, op23, 0b00, op11_8, op4, itinD,
2880 OpcodeStr, !strconcat(Dt, "8"), v8i8, IntOp, OpNode>;
2881 def v4i16 : N3VDIntOp<op24, op23, 0b01, op11_8, op4, itinD,
2882 OpcodeStr, !strconcat(Dt, "16"), v4i16, IntOp, OpNode>;
2883 def v2i32 : N3VDIntOp<op24, op23, 0b10, op11_8, op4, itinD,
2884 OpcodeStr, !strconcat(Dt, "32"), v2i32, IntOp, OpNode>;
2885
2886 // 128-bit vector types.
2887 def v16i8 : N3VQIntOp<op24, op23, 0b00, op11_8, op4, itinQ,
2888 OpcodeStr, !strconcat(Dt, "8"), v16i8, IntOp, OpNode>;
2889 def v8i16 : N3VQIntOp<op24, op23, 0b01, op11_8, op4, itinQ,
2890 OpcodeStr, !strconcat(Dt, "16"), v8i16, IntOp, OpNode>;
2891 def v4i32 : N3VQIntOp<op24, op23, 0b10, op11_8, op4, itinQ,
2892 OpcodeStr, !strconcat(Dt, "32"), v4i32, IntOp, OpNode>;
2893}
2894
Bob Wilson5bafff32009-06-22 23:27:02 +00002895// Neon 3-argument intrinsics,
2896// element sizes of 8, 16 and 32 bits:
2897multiclass N3VInt3_QHS<bit op24, bit op23, bits<4> op11_8, bit op4,
Anton Korobeynikov0a3e2b52010-04-07 18:20:42 +00002898 InstrItinClass itinD, InstrItinClass itinQ,
Evan Chengf81bf152009-11-23 21:57:23 +00002899 string OpcodeStr, string Dt, Intrinsic IntOp> {
Bob Wilson5bafff32009-06-22 23:27:02 +00002900 // 64-bit vector types.
Anton Korobeynikov0a3e2b52010-04-07 18:20:42 +00002901 def v8i8 : N3VDInt3<op24, op23, 0b00, op11_8, op4, itinD,
Bob Wilson9abe19d2010-02-17 00:31:29 +00002902 OpcodeStr, !strconcat(Dt, "8"), v8i8, v8i8, IntOp>;
Anton Korobeynikov0a3e2b52010-04-07 18:20:42 +00002903 def v4i16 : N3VDInt3<op24, op23, 0b01, op11_8, op4, itinD,
Bob Wilson9abe19d2010-02-17 00:31:29 +00002904 OpcodeStr, !strconcat(Dt, "16"), v4i16, v4i16, IntOp>;
Anton Korobeynikov0a3e2b52010-04-07 18:20:42 +00002905 def v2i32 : N3VDInt3<op24, op23, 0b10, op11_8, op4, itinD,
Bob Wilson9abe19d2010-02-17 00:31:29 +00002906 OpcodeStr, !strconcat(Dt, "32"), v2i32, v2i32, IntOp>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002907
2908 // 128-bit vector types.
Anton Korobeynikov0a3e2b52010-04-07 18:20:42 +00002909 def v16i8 : N3VQInt3<op24, op23, 0b00, op11_8, op4, itinQ,
Bob Wilson9abe19d2010-02-17 00:31:29 +00002910 OpcodeStr, !strconcat(Dt, "8"), v16i8, v16i8, IntOp>;
Anton Korobeynikov0a3e2b52010-04-07 18:20:42 +00002911 def v8i16 : N3VQInt3<op24, op23, 0b01, op11_8, op4, itinQ,
Bob Wilson9abe19d2010-02-17 00:31:29 +00002912 OpcodeStr, !strconcat(Dt, "16"), v8i16, v8i16, IntOp>;
Anton Korobeynikov0a3e2b52010-04-07 18:20:42 +00002913 def v4i32 : N3VQInt3<op24, op23, 0b10, op11_8, op4, itinQ,
Bob Wilson9abe19d2010-02-17 00:31:29 +00002914 OpcodeStr, !strconcat(Dt, "32"), v4i32, v4i32, IntOp>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002915}
2916
2917
Bob Wilsond0b69cf2010-09-01 23:50:19 +00002918// Neon Long Multiply-Op vector operations,
2919// element sizes of 8, 16 and 32 bits:
2920multiclass N3VLMulOp_QHS<bit op24, bit op23, bits<4> op11_8, bit op4,
2921 InstrItinClass itin16, InstrItinClass itin32,
2922 string OpcodeStr, string Dt, SDNode MulOp,
2923 SDNode OpNode> {
2924 def v8i16 : N3VLMulOp<op24, op23, 0b00, op11_8, op4, itin16, OpcodeStr,
2925 !strconcat(Dt, "8"), v8i16, v8i8, MulOp, OpNode>;
2926 def v4i32 : N3VLMulOp<op24, op23, 0b01, op11_8, op4, itin16, OpcodeStr,
2927 !strconcat(Dt, "16"), v4i32, v4i16, MulOp, OpNode>;
2928 def v2i64 : N3VLMulOp<op24, op23, 0b10, op11_8, op4, itin32, OpcodeStr,
2929 !strconcat(Dt, "32"), v2i64, v2i32, MulOp, OpNode>;
2930}
2931
2932multiclass N3VLMulOpSL_HS<bit op24, bits<4> op11_8, string OpcodeStr,
2933 string Dt, SDNode MulOp, SDNode OpNode> {
2934 def v4i16 : N3VLMulOpSL16<op24, 0b01, op11_8, IIC_VMACi16D, OpcodeStr,
2935 !strconcat(Dt,"16"), v4i32, v4i16, MulOp, OpNode>;
2936 def v2i32 : N3VLMulOpSL<op24, 0b10, op11_8, IIC_VMACi32D, OpcodeStr,
2937 !strconcat(Dt, "32"), v2i64, v2i32, MulOp, OpNode>;
2938}
2939
2940
Bob Wilson5bafff32009-06-22 23:27:02 +00002941// Neon Long 3-argument intrinsics.
2942
2943// First with only element sizes of 16 and 32 bits:
2944multiclass N3VLInt3_HS<bit op24, bit op23, bits<4> op11_8, bit op4,
Anton Korobeynikov95102072010-04-07 18:21:04 +00002945 InstrItinClass itin16, InstrItinClass itin32,
Evan Chengf81bf152009-11-23 21:57:23 +00002946 string OpcodeStr, string Dt, Intrinsic IntOp> {
Anton Korobeynikov95102072010-04-07 18:21:04 +00002947 def v4i32 : N3VLInt3<op24, op23, 0b01, op11_8, op4, itin16,
Evan Chengf81bf152009-11-23 21:57:23 +00002948 OpcodeStr, !strconcat(Dt, "16"), v4i32, v4i16, IntOp>;
Anton Korobeynikov95102072010-04-07 18:21:04 +00002949 def v2i64 : N3VLInt3<op24, op23, 0b10, op11_8, op4, itin32,
Evan Chengf81bf152009-11-23 21:57:23 +00002950 OpcodeStr, !strconcat(Dt, "32"), v2i64, v2i32, IntOp>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002951}
2952
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00002953multiclass N3VLInt3SL_HS<bit op24, bits<4> op11_8,
Evan Chengf81bf152009-11-23 21:57:23 +00002954 string OpcodeStr, string Dt, Intrinsic IntOp> {
David Goodwin658ea602009-09-25 18:38:29 +00002955 def v4i16 : N3VLInt3SL16<op24, 0b01, op11_8, IIC_VMACi16D,
Evan Chengf81bf152009-11-23 21:57:23 +00002956 OpcodeStr, !strconcat(Dt,"16"), v4i32, v4i16, IntOp>;
David Goodwin658ea602009-09-25 18:38:29 +00002957 def v2i32 : N3VLInt3SL<op24, 0b10, op11_8, IIC_VMACi32D,
Evan Chengf81bf152009-11-23 21:57:23 +00002958 OpcodeStr, !strconcat(Dt, "32"), v2i64, v2i32, IntOp>;
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00002959}
2960
Bob Wilson5bafff32009-06-22 23:27:02 +00002961// ....then also with element size of 8 bits:
2962multiclass N3VLInt3_QHS<bit op24, bit op23, bits<4> op11_8, bit op4,
Anton Korobeynikov95102072010-04-07 18:21:04 +00002963 InstrItinClass itin16, InstrItinClass itin32,
Evan Chengf81bf152009-11-23 21:57:23 +00002964 string OpcodeStr, string Dt, Intrinsic IntOp>
Anton Korobeynikov95102072010-04-07 18:21:04 +00002965 : N3VLInt3_HS<op24, op23, op11_8, op4, itin16, itin32, OpcodeStr, Dt, IntOp> {
2966 def v8i16 : N3VLInt3<op24, op23, 0b00, op11_8, op4, itin16,
Evan Chengf81bf152009-11-23 21:57:23 +00002967 OpcodeStr, !strconcat(Dt, "8"), v8i16, v8i8, IntOp>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002968}
2969
Bob Wilsoneb0c3d32010-09-03 01:35:08 +00002970// ....with explicit extend (VABAL).
2971multiclass N3VLIntExtOp_QHS<bit op24, bit op23, bits<4> op11_8, bit op4,
2972 InstrItinClass itin, string OpcodeStr, string Dt,
2973 Intrinsic IntOp, SDNode ExtOp, SDNode OpNode> {
2974 def v8i16 : N3VLIntExtOp<op24, op23, 0b00, op11_8, op4, itin,
2975 OpcodeStr, !strconcat(Dt, "8"), v8i16, v8i8,
2976 IntOp, ExtOp, OpNode>;
2977 def v4i32 : N3VLIntExtOp<op24, op23, 0b01, op11_8, op4, itin,
2978 OpcodeStr, !strconcat(Dt, "16"), v4i32, v4i16,
2979 IntOp, ExtOp, OpNode>;
2980 def v2i64 : N3VLIntExtOp<op24, op23, 0b10, op11_8, op4, itin,
2981 OpcodeStr, !strconcat(Dt, "32"), v2i64, v2i32,
2982 IntOp, ExtOp, OpNode>;
2983}
2984
Bob Wilson5bafff32009-06-22 23:27:02 +00002985
Bob Wilson5bafff32009-06-22 23:27:02 +00002986// Neon Pairwise long 2-register intrinsics,
2987// element sizes of 8, 16 and 32 bits:
2988multiclass N2VPLInt_QHS<bits<2> op24_23, bits<2> op21_20, bits<2> op17_16,
2989 bits<5> op11_7, bit op4,
Evan Chengf81bf152009-11-23 21:57:23 +00002990 string OpcodeStr, string Dt, Intrinsic IntOp> {
Bob Wilson5bafff32009-06-22 23:27:02 +00002991 // 64-bit vector types.
2992 def v8i8 : N2VDPLInt<op24_23, op21_20, 0b00, op17_16, op11_7, op4,
Evan Chengf81bf152009-11-23 21:57:23 +00002993 OpcodeStr, !strconcat(Dt, "8"), v4i16, v8i8, IntOp>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002994 def v4i16 : N2VDPLInt<op24_23, op21_20, 0b01, op17_16, op11_7, op4,
Evan Chengf81bf152009-11-23 21:57:23 +00002995 OpcodeStr, !strconcat(Dt, "16"), v2i32, v4i16, IntOp>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002996 def v2i32 : N2VDPLInt<op24_23, op21_20, 0b10, op17_16, op11_7, op4,
Evan Chengf81bf152009-11-23 21:57:23 +00002997 OpcodeStr, !strconcat(Dt, "32"), v1i64, v2i32, IntOp>;
Bob Wilson5bafff32009-06-22 23:27:02 +00002998
2999 // 128-bit vector types.
3000 def v16i8 : N2VQPLInt<op24_23, op21_20, 0b00, op17_16, op11_7, op4,
Evan Chengf81bf152009-11-23 21:57:23 +00003001 OpcodeStr, !strconcat(Dt, "8"), v8i16, v16i8, IntOp>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003002 def v8i16 : N2VQPLInt<op24_23, op21_20, 0b01, op17_16, op11_7, op4,
Evan Chengf81bf152009-11-23 21:57:23 +00003003 OpcodeStr, !strconcat(Dt, "16"), v4i32, v8i16, IntOp>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003004 def v4i32 : N2VQPLInt<op24_23, op21_20, 0b10, op17_16, op11_7, op4,
Evan Chengf81bf152009-11-23 21:57:23 +00003005 OpcodeStr, !strconcat(Dt, "32"), v2i64, v4i32, IntOp>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003006}
3007
3008
3009// Neon Pairwise long 2-register accumulate intrinsics,
3010// element sizes of 8, 16 and 32 bits:
3011multiclass N2VPLInt2_QHS<bits<2> op24_23, bits<2> op21_20, bits<2> op17_16,
3012 bits<5> op11_7, bit op4,
Evan Chengf81bf152009-11-23 21:57:23 +00003013 string OpcodeStr, string Dt, Intrinsic IntOp> {
Bob Wilson5bafff32009-06-22 23:27:02 +00003014 // 64-bit vector types.
3015 def v8i8 : N2VDPLInt2<op24_23, op21_20, 0b00, op17_16, op11_7, op4,
Evan Chengf81bf152009-11-23 21:57:23 +00003016 OpcodeStr, !strconcat(Dt, "8"), v4i16, v8i8, IntOp>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003017 def v4i16 : N2VDPLInt2<op24_23, op21_20, 0b01, op17_16, op11_7, op4,
Evan Chengf81bf152009-11-23 21:57:23 +00003018 OpcodeStr, !strconcat(Dt, "16"), v2i32, v4i16, IntOp>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003019 def v2i32 : N2VDPLInt2<op24_23, op21_20, 0b10, op17_16, op11_7, op4,
Evan Chengf81bf152009-11-23 21:57:23 +00003020 OpcodeStr, !strconcat(Dt, "32"), v1i64, v2i32, IntOp>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003021
3022 // 128-bit vector types.
3023 def v16i8 : N2VQPLInt2<op24_23, op21_20, 0b00, op17_16, op11_7, op4,
Evan Chengf81bf152009-11-23 21:57:23 +00003024 OpcodeStr, !strconcat(Dt, "8"), v8i16, v16i8, IntOp>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003025 def v8i16 : N2VQPLInt2<op24_23, op21_20, 0b01, op17_16, op11_7, op4,
Evan Chengf81bf152009-11-23 21:57:23 +00003026 OpcodeStr, !strconcat(Dt, "16"), v4i32, v8i16, IntOp>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003027 def v4i32 : N2VQPLInt2<op24_23, op21_20, 0b10, op17_16, op11_7, op4,
Evan Chengf81bf152009-11-23 21:57:23 +00003028 OpcodeStr, !strconcat(Dt, "32"), v2i64, v4i32, IntOp>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003029}
3030
3031
3032// Neon 2-register vector shift by immediate,
Johnny Chen0a3dc102010-03-26 01:07:59 +00003033// with f of either N2RegVShLFrm or N2RegVShRFrm
Bob Wilson5bafff32009-06-22 23:27:02 +00003034// element sizes of 8, 16, 32 and 64 bits:
Bill Wendling7c6b6082011-03-08 23:48:09 +00003035multiclass N2VShL_QHSD<bit op24, bit op23, bits<4> op11_8, bit op4,
3036 InstrItinClass itin, string OpcodeStr, string Dt,
3037 SDNode OpNode> {
Bob Wilson5bafff32009-06-22 23:27:02 +00003038 // 64-bit vector types.
Bill Wendling7c6b6082011-03-08 23:48:09 +00003039 def v8i8 : N2VDSh<op24, op23, op11_8, 0, op4, N2RegVShLFrm, itin, i32imm,
Evan Chengf81bf152009-11-23 21:57:23 +00003040 OpcodeStr, !strconcat(Dt, "8"), v8i8, OpNode> {
Bob Wilson507df402009-10-21 02:15:46 +00003041 let Inst{21-19} = 0b001; // imm6 = 001xxx
3042 }
Bill Wendling7c6b6082011-03-08 23:48:09 +00003043 def v4i16 : N2VDSh<op24, op23, op11_8, 0, op4, N2RegVShLFrm, itin, i32imm,
Evan Chengf81bf152009-11-23 21:57:23 +00003044 OpcodeStr, !strconcat(Dt, "16"), v4i16, OpNode> {
Bob Wilson507df402009-10-21 02:15:46 +00003045 let Inst{21-20} = 0b01; // imm6 = 01xxxx
3046 }
Bill Wendling7c6b6082011-03-08 23:48:09 +00003047 def v2i32 : N2VDSh<op24, op23, op11_8, 0, op4, N2RegVShLFrm, itin, i32imm,
Evan Chengf81bf152009-11-23 21:57:23 +00003048 OpcodeStr, !strconcat(Dt, "32"), v2i32, OpNode> {
Bob Wilson507df402009-10-21 02:15:46 +00003049 let Inst{21} = 0b1; // imm6 = 1xxxxx
3050 }
Bill Wendling7c6b6082011-03-08 23:48:09 +00003051 def v1i64 : N2VDSh<op24, op23, op11_8, 1, op4, N2RegVShLFrm, itin, i32imm,
Evan Chengf81bf152009-11-23 21:57:23 +00003052 OpcodeStr, !strconcat(Dt, "64"), v1i64, OpNode>;
Bob Wilson507df402009-10-21 02:15:46 +00003053 // imm6 = xxxxxx
Bob Wilson5bafff32009-06-22 23:27:02 +00003054
3055 // 128-bit vector types.
Bill Wendling7c6b6082011-03-08 23:48:09 +00003056 def v16i8 : N2VQSh<op24, op23, op11_8, 0, op4, N2RegVShLFrm, itin, i32imm,
Evan Chengf81bf152009-11-23 21:57:23 +00003057 OpcodeStr, !strconcat(Dt, "8"), v16i8, OpNode> {
Bob Wilson507df402009-10-21 02:15:46 +00003058 let Inst{21-19} = 0b001; // imm6 = 001xxx
3059 }
Bill Wendling7c6b6082011-03-08 23:48:09 +00003060 def v8i16 : N2VQSh<op24, op23, op11_8, 0, op4, N2RegVShLFrm, itin, i32imm,
Evan Chengf81bf152009-11-23 21:57:23 +00003061 OpcodeStr, !strconcat(Dt, "16"), v8i16, OpNode> {
Bob Wilson507df402009-10-21 02:15:46 +00003062 let Inst{21-20} = 0b01; // imm6 = 01xxxx
3063 }
Bill Wendling7c6b6082011-03-08 23:48:09 +00003064 def v4i32 : N2VQSh<op24, op23, op11_8, 0, op4, N2RegVShLFrm, itin, i32imm,
Evan Chengf81bf152009-11-23 21:57:23 +00003065 OpcodeStr, !strconcat(Dt, "32"), v4i32, OpNode> {
Bob Wilson507df402009-10-21 02:15:46 +00003066 let Inst{21} = 0b1; // imm6 = 1xxxxx
3067 }
Bill Wendling7c6b6082011-03-08 23:48:09 +00003068 def v2i64 : N2VQSh<op24, op23, op11_8, 1, op4, N2RegVShLFrm, itin, i32imm,
3069 OpcodeStr, !strconcat(Dt, "64"), v2i64, OpNode>;
3070 // imm6 = xxxxxx
3071}
3072multiclass N2VShR_QHSD<bit op24, bit op23, bits<4> op11_8, bit op4,
3073 InstrItinClass itin, string OpcodeStr, string Dt,
3074 SDNode OpNode> {
3075 // 64-bit vector types.
3076 def v8i8 : N2VDSh<op24, op23, op11_8, 0, op4, N2RegVShRFrm, itin, shr_imm8,
3077 OpcodeStr, !strconcat(Dt, "8"), v8i8, OpNode> {
3078 let Inst{21-19} = 0b001; // imm6 = 001xxx
3079 }
3080 def v4i16 : N2VDSh<op24, op23, op11_8, 0, op4, N2RegVShRFrm, itin, shr_imm16,
3081 OpcodeStr, !strconcat(Dt, "16"), v4i16, OpNode> {
3082 let Inst{21-20} = 0b01; // imm6 = 01xxxx
3083 }
3084 def v2i32 : N2VDSh<op24, op23, op11_8, 0, op4, N2RegVShRFrm, itin, shr_imm32,
3085 OpcodeStr, !strconcat(Dt, "32"), v2i32, OpNode> {
3086 let Inst{21} = 0b1; // imm6 = 1xxxxx
3087 }
3088 def v1i64 : N2VDSh<op24, op23, op11_8, 1, op4, N2RegVShRFrm, itin, shr_imm64,
3089 OpcodeStr, !strconcat(Dt, "64"), v1i64, OpNode>;
3090 // imm6 = xxxxxx
3091
3092 // 128-bit vector types.
3093 def v16i8 : N2VQSh<op24, op23, op11_8, 0, op4, N2RegVShRFrm, itin, shr_imm8,
3094 OpcodeStr, !strconcat(Dt, "8"), v16i8, OpNode> {
3095 let Inst{21-19} = 0b001; // imm6 = 001xxx
3096 }
3097 def v8i16 : N2VQSh<op24, op23, op11_8, 0, op4, N2RegVShRFrm, itin, shr_imm16,
3098 OpcodeStr, !strconcat(Dt, "16"), v8i16, OpNode> {
3099 let Inst{21-20} = 0b01; // imm6 = 01xxxx
3100 }
3101 def v4i32 : N2VQSh<op24, op23, op11_8, 0, op4, N2RegVShRFrm, itin, shr_imm32,
3102 OpcodeStr, !strconcat(Dt, "32"), v4i32, OpNode> {
3103 let Inst{21} = 0b1; // imm6 = 1xxxxx
3104 }
3105 def v2i64 : N2VQSh<op24, op23, op11_8, 1, op4, N2RegVShRFrm, itin, shr_imm64,
Evan Chengf81bf152009-11-23 21:57:23 +00003106 OpcodeStr, !strconcat(Dt, "64"), v2i64, OpNode>;
Bob Wilson507df402009-10-21 02:15:46 +00003107 // imm6 = xxxxxx
Bob Wilson5bafff32009-06-22 23:27:02 +00003108}
3109
Bob Wilson5bafff32009-06-22 23:27:02 +00003110// Neon Shift-Accumulate vector operations,
3111// element sizes of 8, 16, 32 and 64 bits:
3112multiclass N2VShAdd_QHSD<bit op24, bit op23, bits<4> op11_8, bit op4,
Evan Chengf81bf152009-11-23 21:57:23 +00003113 string OpcodeStr, string Dt, SDNode ShOp> {
Bob Wilson5bafff32009-06-22 23:27:02 +00003114 // 64-bit vector types.
Bill Wendlingc04a9de2011-03-09 00:00:35 +00003115 def v8i8 : N2VDShAdd<op24, op23, op11_8, 0, op4, shr_imm8,
Evan Chengf81bf152009-11-23 21:57:23 +00003116 OpcodeStr, !strconcat(Dt, "8"), v8i8, ShOp> {
Bob Wilson507df402009-10-21 02:15:46 +00003117 let Inst{21-19} = 0b001; // imm6 = 001xxx
3118 }
Bill Wendlingc04a9de2011-03-09 00:00:35 +00003119 def v4i16 : N2VDShAdd<op24, op23, op11_8, 0, op4, shr_imm16,
Evan Chengf81bf152009-11-23 21:57:23 +00003120 OpcodeStr, !strconcat(Dt, "16"), v4i16, ShOp> {
Bob Wilson507df402009-10-21 02:15:46 +00003121 let Inst{21-20} = 0b01; // imm6 = 01xxxx
3122 }
Bill Wendlingc04a9de2011-03-09 00:00:35 +00003123 def v2i32 : N2VDShAdd<op24, op23, op11_8, 0, op4, shr_imm32,
Evan Chengf81bf152009-11-23 21:57:23 +00003124 OpcodeStr, !strconcat(Dt, "32"), v2i32, ShOp> {
Bob Wilson507df402009-10-21 02:15:46 +00003125 let Inst{21} = 0b1; // imm6 = 1xxxxx
3126 }
Bill Wendlingc04a9de2011-03-09 00:00:35 +00003127 def v1i64 : N2VDShAdd<op24, op23, op11_8, 1, op4, shr_imm64,
Evan Chengf81bf152009-11-23 21:57:23 +00003128 OpcodeStr, !strconcat(Dt, "64"), v1i64, ShOp>;
Bob Wilson507df402009-10-21 02:15:46 +00003129 // imm6 = xxxxxx
Bob Wilson5bafff32009-06-22 23:27:02 +00003130
3131 // 128-bit vector types.
Bill Wendlingc04a9de2011-03-09 00:00:35 +00003132 def v16i8 : N2VQShAdd<op24, op23, op11_8, 0, op4, shr_imm8,
Evan Chengf81bf152009-11-23 21:57:23 +00003133 OpcodeStr, !strconcat(Dt, "8"), v16i8, ShOp> {
Bob Wilson507df402009-10-21 02:15:46 +00003134 let Inst{21-19} = 0b001; // imm6 = 001xxx
3135 }
Bill Wendlingc04a9de2011-03-09 00:00:35 +00003136 def v8i16 : N2VQShAdd<op24, op23, op11_8, 0, op4, shr_imm16,
Evan Chengf81bf152009-11-23 21:57:23 +00003137 OpcodeStr, !strconcat(Dt, "16"), v8i16, ShOp> {
Bob Wilson507df402009-10-21 02:15:46 +00003138 let Inst{21-20} = 0b01; // imm6 = 01xxxx
3139 }
Bill Wendlingc04a9de2011-03-09 00:00:35 +00003140 def v4i32 : N2VQShAdd<op24, op23, op11_8, 0, op4, shr_imm32,
Evan Chengf81bf152009-11-23 21:57:23 +00003141 OpcodeStr, !strconcat(Dt, "32"), v4i32, ShOp> {
Bob Wilson507df402009-10-21 02:15:46 +00003142 let Inst{21} = 0b1; // imm6 = 1xxxxx
3143 }
Bill Wendlingc04a9de2011-03-09 00:00:35 +00003144 def v2i64 : N2VQShAdd<op24, op23, op11_8, 1, op4, shr_imm64,
Evan Chengf81bf152009-11-23 21:57:23 +00003145 OpcodeStr, !strconcat(Dt, "64"), v2i64, ShOp>;
Bob Wilson507df402009-10-21 02:15:46 +00003146 // imm6 = xxxxxx
Bob Wilson5bafff32009-06-22 23:27:02 +00003147}
3148
Bob Wilson5bafff32009-06-22 23:27:02 +00003149// Neon Shift-Insert vector operations,
Johnny Chen0a3dc102010-03-26 01:07:59 +00003150// with f of either N2RegVShLFrm or N2RegVShRFrm
Bob Wilson5bafff32009-06-22 23:27:02 +00003151// element sizes of 8, 16, 32 and 64 bits:
Bill Wendling620d0cc2011-03-09 00:33:17 +00003152multiclass N2VShInsL_QHSD<bit op24, bit op23, bits<4> op11_8, bit op4,
3153 string OpcodeStr> {
Bob Wilson5bafff32009-06-22 23:27:02 +00003154 // 64-bit vector types.
Bill Wendling620d0cc2011-03-09 00:33:17 +00003155 def v8i8 : N2VDShIns<op24, op23, op11_8, 0, op4, i32imm,
3156 N2RegVShLFrm, OpcodeStr, "8", v8i8, NEONvsli> {
Bob Wilson507df402009-10-21 02:15:46 +00003157 let Inst{21-19} = 0b001; // imm6 = 001xxx
3158 }
Bill Wendling620d0cc2011-03-09 00:33:17 +00003159 def v4i16 : N2VDShIns<op24, op23, op11_8, 0, op4, i32imm,
3160 N2RegVShLFrm, OpcodeStr, "16", v4i16, NEONvsli> {
Bob Wilson507df402009-10-21 02:15:46 +00003161 let Inst{21-20} = 0b01; // imm6 = 01xxxx
3162 }
Bill Wendling620d0cc2011-03-09 00:33:17 +00003163 def v2i32 : N2VDShIns<op24, op23, op11_8, 0, op4, i32imm,
3164 N2RegVShLFrm, OpcodeStr, "32", v2i32, NEONvsli> {
Bob Wilson507df402009-10-21 02:15:46 +00003165 let Inst{21} = 0b1; // imm6 = 1xxxxx
3166 }
Bill Wendling620d0cc2011-03-09 00:33:17 +00003167 def v1i64 : N2VDShIns<op24, op23, op11_8, 1, op4, i32imm,
3168 N2RegVShLFrm, OpcodeStr, "64", v1i64, NEONvsli>;
Bob Wilson507df402009-10-21 02:15:46 +00003169 // imm6 = xxxxxx
Bob Wilson5bafff32009-06-22 23:27:02 +00003170
3171 // 128-bit vector types.
Bill Wendling620d0cc2011-03-09 00:33:17 +00003172 def v16i8 : N2VQShIns<op24, op23, op11_8, 0, op4, i32imm,
3173 N2RegVShLFrm, OpcodeStr, "8", v16i8, NEONvsli> {
Bob Wilson507df402009-10-21 02:15:46 +00003174 let Inst{21-19} = 0b001; // imm6 = 001xxx
3175 }
Bill Wendling620d0cc2011-03-09 00:33:17 +00003176 def v8i16 : N2VQShIns<op24, op23, op11_8, 0, op4, i32imm,
3177 N2RegVShLFrm, OpcodeStr, "16", v8i16, NEONvsli> {
Bob Wilson507df402009-10-21 02:15:46 +00003178 let Inst{21-20} = 0b01; // imm6 = 01xxxx
3179 }
Bill Wendling620d0cc2011-03-09 00:33:17 +00003180 def v4i32 : N2VQShIns<op24, op23, op11_8, 0, op4, i32imm,
3181 N2RegVShLFrm, OpcodeStr, "32", v4i32, NEONvsli> {
Bob Wilson507df402009-10-21 02:15:46 +00003182 let Inst{21} = 0b1; // imm6 = 1xxxxx
3183 }
Bill Wendling620d0cc2011-03-09 00:33:17 +00003184 def v2i64 : N2VQShIns<op24, op23, op11_8, 1, op4, i32imm,
3185 N2RegVShLFrm, OpcodeStr, "64", v2i64, NEONvsli>;
3186 // imm6 = xxxxxx
3187}
3188multiclass N2VShInsR_QHSD<bit op24, bit op23, bits<4> op11_8, bit op4,
3189 string OpcodeStr> {
3190 // 64-bit vector types.
3191 def v8i8 : N2VDShIns<op24, op23, op11_8, 0, op4, shr_imm8,
3192 N2RegVShRFrm, OpcodeStr, "8", v8i8, NEONvsri> {
3193 let Inst{21-19} = 0b001; // imm6 = 001xxx
3194 }
3195 def v4i16 : N2VDShIns<op24, op23, op11_8, 0, op4, shr_imm16,
3196 N2RegVShRFrm, OpcodeStr, "16", v4i16, NEONvsri> {
3197 let Inst{21-20} = 0b01; // imm6 = 01xxxx
3198 }
3199 def v2i32 : N2VDShIns<op24, op23, op11_8, 0, op4, shr_imm32,
3200 N2RegVShRFrm, OpcodeStr, "32", v2i32, NEONvsri> {
3201 let Inst{21} = 0b1; // imm6 = 1xxxxx
3202 }
3203 def v1i64 : N2VDShIns<op24, op23, op11_8, 1, op4, shr_imm64,
3204 N2RegVShRFrm, OpcodeStr, "64", v1i64, NEONvsri>;
3205 // imm6 = xxxxxx
3206
3207 // 128-bit vector types.
3208 def v16i8 : N2VQShIns<op24, op23, op11_8, 0, op4, shr_imm8,
3209 N2RegVShRFrm, OpcodeStr, "8", v16i8, NEONvsri> {
3210 let Inst{21-19} = 0b001; // imm6 = 001xxx
3211 }
3212 def v8i16 : N2VQShIns<op24, op23, op11_8, 0, op4, shr_imm16,
3213 N2RegVShRFrm, OpcodeStr, "16", v8i16, NEONvsri> {
3214 let Inst{21-20} = 0b01; // imm6 = 01xxxx
3215 }
3216 def v4i32 : N2VQShIns<op24, op23, op11_8, 0, op4, shr_imm32,
3217 N2RegVShRFrm, OpcodeStr, "32", v4i32, NEONvsri> {
3218 let Inst{21} = 0b1; // imm6 = 1xxxxx
3219 }
3220 def v2i64 : N2VQShIns<op24, op23, op11_8, 1, op4, shr_imm64,
3221 N2RegVShRFrm, OpcodeStr, "64", v2i64, NEONvsri>;
Bob Wilson507df402009-10-21 02:15:46 +00003222 // imm6 = xxxxxx
3223}
3224
3225// Neon Shift Long operations,
3226// element sizes of 8, 16, 32 bits:
3227multiclass N2VLSh_QHS<bit op24, bit op23, bits<4> op11_8, bit op7, bit op6,
Evan Chengf81bf152009-11-23 21:57:23 +00003228 bit op4, string OpcodeStr, string Dt, SDNode OpNode> {
Bob Wilson507df402009-10-21 02:15:46 +00003229 def v8i16 : N2VLSh<op24, op23, op11_8, op7, op6, op4,
Evan Chengf81bf152009-11-23 21:57:23 +00003230 OpcodeStr, !strconcat(Dt, "8"), v8i16, v8i8, OpNode> {
Bob Wilson507df402009-10-21 02:15:46 +00003231 let Inst{21-19} = 0b001; // imm6 = 001xxx
3232 }
3233 def v4i32 : N2VLSh<op24, op23, op11_8, op7, op6, op4,
Evan Chengf81bf152009-11-23 21:57:23 +00003234 OpcodeStr, !strconcat(Dt, "16"), v4i32, v4i16, OpNode> {
Bob Wilson507df402009-10-21 02:15:46 +00003235 let Inst{21-20} = 0b01; // imm6 = 01xxxx
3236 }
3237 def v2i64 : N2VLSh<op24, op23, op11_8, op7, op6, op4,
Evan Chengf81bf152009-11-23 21:57:23 +00003238 OpcodeStr, !strconcat(Dt, "32"), v2i64, v2i32, OpNode> {
Bob Wilson507df402009-10-21 02:15:46 +00003239 let Inst{21} = 0b1; // imm6 = 1xxxxx
3240 }
3241}
3242
3243// Neon Shift Narrow operations,
3244// element sizes of 16, 32, 64 bits:
3245multiclass N2VNSh_HSD<bit op24, bit op23, bits<4> op11_8, bit op7, bit op6,
Evan Chengf81bf152009-11-23 21:57:23 +00003246 bit op4, InstrItinClass itin, string OpcodeStr, string Dt,
Bob Wilson507df402009-10-21 02:15:46 +00003247 SDNode OpNode> {
3248 def v8i8 : N2VNSh<op24, op23, op11_8, op7, op6, op4, itin,
Bill Wendlinga656b632011-03-01 01:00:59 +00003249 OpcodeStr, !strconcat(Dt, "16"),
Bill Wendling3116dce2011-03-07 23:38:41 +00003250 v8i8, v8i16, shr_imm8, OpNode> {
Bob Wilson507df402009-10-21 02:15:46 +00003251 let Inst{21-19} = 0b001; // imm6 = 001xxx
3252 }
3253 def v4i16 : N2VNSh<op24, op23, op11_8, op7, op6, op4, itin,
Bill Wendlinga656b632011-03-01 01:00:59 +00003254 OpcodeStr, !strconcat(Dt, "32"),
Bill Wendling3116dce2011-03-07 23:38:41 +00003255 v4i16, v4i32, shr_imm16, OpNode> {
Bob Wilson507df402009-10-21 02:15:46 +00003256 let Inst{21-20} = 0b01; // imm6 = 01xxxx
3257 }
3258 def v2i32 : N2VNSh<op24, op23, op11_8, op7, op6, op4, itin,
Bill Wendlinga656b632011-03-01 01:00:59 +00003259 OpcodeStr, !strconcat(Dt, "64"),
Bill Wendling3116dce2011-03-07 23:38:41 +00003260 v2i32, v2i64, shr_imm32, OpNode> {
Bob Wilson507df402009-10-21 02:15:46 +00003261 let Inst{21} = 0b1; // imm6 = 1xxxxx
3262 }
Bob Wilson5bafff32009-06-22 23:27:02 +00003263}
3264
3265//===----------------------------------------------------------------------===//
3266// Instruction Definitions.
3267//===----------------------------------------------------------------------===//
3268
3269// Vector Add Operations.
3270
3271// VADD : Vector Add (integer and floating-point)
Evan Chengf81bf152009-11-23 21:57:23 +00003272defm VADD : N3V_QHSD<0, 0, 0b1000, 0, IIC_VBINiD, IIC_VBINiQ, "vadd", "i",
Evan Chengac0869d2009-11-21 06:21:52 +00003273 add, 1>;
Evan Chengf81bf152009-11-23 21:57:23 +00003274def VADDfd : N3VD<0, 0, 0b00, 0b1101, 0, IIC_VBIND, "vadd", "f32",
Evan Chengac0869d2009-11-21 06:21:52 +00003275 v2f32, v2f32, fadd, 1>;
Evan Chengf81bf152009-11-23 21:57:23 +00003276def VADDfq : N3VQ<0, 0, 0b00, 0b1101, 0, IIC_VBINQ, "vadd", "f32",
Evan Chengac0869d2009-11-21 06:21:52 +00003277 v4f32, v4f32, fadd, 1>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003278// VADDL : Vector Add Long (Q = D + D)
Bob Wilsond0b69cf2010-09-01 23:50:19 +00003279defm VADDLs : N3VLExt_QHS<0,1,0b0000,0, IIC_VSHLiD, IIC_VSHLiD,
3280 "vaddl", "s", add, sext, 1>;
3281defm VADDLu : N3VLExt_QHS<1,1,0b0000,0, IIC_VSHLiD, IIC_VSHLiD,
3282 "vaddl", "u", add, zext, 1>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003283// VADDW : Vector Add Wide (Q = Q + D)
Bob Wilson04d6c282010-08-29 05:57:34 +00003284defm VADDWs : N3VW_QHS<0,1,0b0001,0, "vaddw", "s", add, sext, 0>;
3285defm VADDWu : N3VW_QHS<1,1,0b0001,0, "vaddw", "u", add, zext, 0>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003286// VHADD : Vector Halving Add
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003287defm VHADDs : N3VInt_QHS<0, 0, 0b0000, 0, N3RegFrm,
3288 IIC_VBINi4D, IIC_VBINi4D, IIC_VBINi4Q, IIC_VBINi4Q,
3289 "vhadd", "s", int_arm_neon_vhadds, 1>;
3290defm VHADDu : N3VInt_QHS<1, 0, 0b0000, 0, N3RegFrm,
3291 IIC_VBINi4D, IIC_VBINi4D, IIC_VBINi4Q, IIC_VBINi4Q,
3292 "vhadd", "u", int_arm_neon_vhaddu, 1>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003293// VRHADD : Vector Rounding Halving Add
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003294defm VRHADDs : N3VInt_QHS<0, 0, 0b0001, 0, N3RegFrm,
3295 IIC_VBINi4D, IIC_VBINi4D, IIC_VBINi4Q, IIC_VBINi4Q,
3296 "vrhadd", "s", int_arm_neon_vrhadds, 1>;
3297defm VRHADDu : N3VInt_QHS<1, 0, 0b0001, 0, N3RegFrm,
3298 IIC_VBINi4D, IIC_VBINi4D, IIC_VBINi4Q, IIC_VBINi4Q,
3299 "vrhadd", "u", int_arm_neon_vrhaddu, 1>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003300// VQADD : Vector Saturating Add
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003301defm VQADDs : N3VInt_QHSD<0, 0, 0b0000, 1, N3RegFrm,
3302 IIC_VBINi4D, IIC_VBINi4D, IIC_VBINi4Q, IIC_VBINi4Q,
3303 "vqadd", "s", int_arm_neon_vqadds, 1>;
3304defm VQADDu : N3VInt_QHSD<1, 0, 0b0000, 1, N3RegFrm,
3305 IIC_VBINi4D, IIC_VBINi4D, IIC_VBINi4Q, IIC_VBINi4Q,
3306 "vqadd", "u", int_arm_neon_vqaddu, 1>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003307// VADDHN : Vector Add and Narrow Returning High Half (D = Q + Q)
Evan Chengf81bf152009-11-23 21:57:23 +00003308defm VADDHN : N3VNInt_HSD<0,1,0b0100,0, "vaddhn", "i",
3309 int_arm_neon_vaddhn, 1>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003310// VRADDHN : Vector Rounding Add and Narrow Returning High Half (D = Q + Q)
Evan Chengf81bf152009-11-23 21:57:23 +00003311defm VRADDHN : N3VNInt_HSD<1,1,0b0100,0, "vraddhn", "i",
3312 int_arm_neon_vraddhn, 1>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003313
3314// Vector Multiply Operations.
3315
3316// VMUL : Vector Multiply (integer, polynomial and floating-point)
Evan Chengac0869d2009-11-21 06:21:52 +00003317defm VMUL : N3V_QHS<0, 0, 0b1001, 1, IIC_VMULi16D, IIC_VMULi32D,
Evan Chengf81bf152009-11-23 21:57:23 +00003318 IIC_VMULi16Q, IIC_VMULi32Q, "vmul", "i", mul, 1>;
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003319def VMULpd : N3VDInt<1, 0, 0b00, 0b1001, 1, N3RegFrm, IIC_VMULi16D, "vmul",
3320 "p8", v8i8, v8i8, int_arm_neon_vmulp, 1>;
3321def VMULpq : N3VQInt<1, 0, 0b00, 0b1001, 1, N3RegFrm, IIC_VMULi16Q, "vmul",
3322 "p8", v16i8, v16i8, int_arm_neon_vmulp, 1>;
Evan Cheng08cec1e2010-10-11 23:41:41 +00003323def VMULfd : N3VD<1, 0, 0b00, 0b1101, 1, IIC_VFMULD, "vmul", "f32",
Bob Wilson9abe19d2010-02-17 00:31:29 +00003324 v2f32, v2f32, fmul, 1>;
Evan Cheng08cec1e2010-10-11 23:41:41 +00003325def VMULfq : N3VQ<1, 0, 0b00, 0b1101, 1, IIC_VFMULQ, "vmul", "f32",
Bob Wilson9abe19d2010-02-17 00:31:29 +00003326 v4f32, v4f32, fmul, 1>;
3327defm VMULsl : N3VSL_HS<0b1000, "vmul", "i", mul>;
3328def VMULslfd : N3VDSL<0b10, 0b1001, IIC_VBIND, "vmul", "f32", v2f32, fmul>;
3329def VMULslfq : N3VQSL<0b10, 0b1001, IIC_VBINQ, "vmul", "f32", v4f32,
3330 v2f32, fmul>;
3331
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003332def : Pat<(v8i16 (mul (v8i16 QPR:$src1),
3333 (v8i16 (NEONvduplane (v8i16 QPR:$src2), imm:$lane)))),
3334 (v8i16 (VMULslv8i16 (v8i16 QPR:$src1),
3335 (v4i16 (EXTRACT_SUBREG QPR:$src2,
Bob Wilson9abe19d2010-02-17 00:31:29 +00003336 (DSubReg_i16_reg imm:$lane))),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003337 (SubReg_i16_lane imm:$lane)))>;
3338def : Pat<(v4i32 (mul (v4i32 QPR:$src1),
3339 (v4i32 (NEONvduplane (v4i32 QPR:$src2), imm:$lane)))),
3340 (v4i32 (VMULslv4i32 (v4i32 QPR:$src1),
3341 (v2i32 (EXTRACT_SUBREG QPR:$src2,
Bob Wilson9abe19d2010-02-17 00:31:29 +00003342 (DSubReg_i32_reg imm:$lane))),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003343 (SubReg_i32_lane imm:$lane)))>;
3344def : Pat<(v4f32 (fmul (v4f32 QPR:$src1),
3345 (v4f32 (NEONvduplane (v4f32 QPR:$src2), imm:$lane)))),
3346 (v4f32 (VMULslfq (v4f32 QPR:$src1),
3347 (v2f32 (EXTRACT_SUBREG QPR:$src2,
Bob Wilson9abe19d2010-02-17 00:31:29 +00003348 (DSubReg_i32_reg imm:$lane))),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003349 (SubReg_i32_lane imm:$lane)))>;
3350
Bob Wilson5bafff32009-06-22 23:27:02 +00003351// VQDMULH : Vector Saturating Doubling Multiply Returning High Half
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003352defm VQDMULH : N3VInt_HS<0, 0, 0b1011, 0, N3RegFrm, IIC_VMULi16D, IIC_VMULi32D,
Jim Grosbach1251e1a2010-11-18 01:39:50 +00003353 IIC_VMULi16Q, IIC_VMULi32Q,
Evan Chengf81bf152009-11-23 21:57:23 +00003354 "vqdmulh", "s", int_arm_neon_vqdmulh, 1>;
David Goodwin658ea602009-09-25 18:38:29 +00003355defm VQDMULHsl: N3VIntSL_HS<0b1100, IIC_VMULi16D, IIC_VMULi32D,
3356 IIC_VMULi16Q, IIC_VMULi32Q,
Evan Chengf81bf152009-11-23 21:57:23 +00003357 "vqdmulh", "s", int_arm_neon_vqdmulh>;
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003358def : Pat<(v8i16 (int_arm_neon_vqdmulh (v8i16 QPR:$src1),
Evan Chengac0869d2009-11-21 06:21:52 +00003359 (v8i16 (NEONvduplane (v8i16 QPR:$src2),
3360 imm:$lane)))),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003361 (v8i16 (VQDMULHslv8i16 (v8i16 QPR:$src1),
3362 (v4i16 (EXTRACT_SUBREG QPR:$src2,
Bob Wilson9abe19d2010-02-17 00:31:29 +00003363 (DSubReg_i16_reg imm:$lane))),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003364 (SubReg_i16_lane imm:$lane)))>;
3365def : Pat<(v4i32 (int_arm_neon_vqdmulh (v4i32 QPR:$src1),
Evan Chengac0869d2009-11-21 06:21:52 +00003366 (v4i32 (NEONvduplane (v4i32 QPR:$src2),
3367 imm:$lane)))),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003368 (v4i32 (VQDMULHslv4i32 (v4i32 QPR:$src1),
3369 (v2i32 (EXTRACT_SUBREG QPR:$src2,
Bob Wilson9abe19d2010-02-17 00:31:29 +00003370 (DSubReg_i32_reg imm:$lane))),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003371 (SubReg_i32_lane imm:$lane)))>;
3372
Bob Wilson5bafff32009-06-22 23:27:02 +00003373// VQRDMULH : Vector Rounding Saturating Doubling Multiply Returning High Half
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003374defm VQRDMULH : N3VInt_HS<1, 0, 0b1011, 0, N3RegFrm,
3375 IIC_VMULi16D,IIC_VMULi32D,IIC_VMULi16Q,IIC_VMULi32Q,
Evan Chengf81bf152009-11-23 21:57:23 +00003376 "vqrdmulh", "s", int_arm_neon_vqrdmulh, 1>;
David Goodwin658ea602009-09-25 18:38:29 +00003377defm VQRDMULHsl : N3VIntSL_HS<0b1101, IIC_VMULi16D, IIC_VMULi32D,
3378 IIC_VMULi16Q, IIC_VMULi32Q,
Evan Chengf81bf152009-11-23 21:57:23 +00003379 "vqrdmulh", "s", int_arm_neon_vqrdmulh>;
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003380def : Pat<(v8i16 (int_arm_neon_vqrdmulh (v8i16 QPR:$src1),
Evan Chengac0869d2009-11-21 06:21:52 +00003381 (v8i16 (NEONvduplane (v8i16 QPR:$src2),
3382 imm:$lane)))),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003383 (v8i16 (VQRDMULHslv8i16 (v8i16 QPR:$src1),
3384 (v4i16 (EXTRACT_SUBREG QPR:$src2,
Bob Wilson9abe19d2010-02-17 00:31:29 +00003385 (DSubReg_i16_reg imm:$lane))),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003386 (SubReg_i16_lane imm:$lane)))>;
3387def : Pat<(v4i32 (int_arm_neon_vqrdmulh (v4i32 QPR:$src1),
Evan Chengac0869d2009-11-21 06:21:52 +00003388 (v4i32 (NEONvduplane (v4i32 QPR:$src2),
3389 imm:$lane)))),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003390 (v4i32 (VQRDMULHslv4i32 (v4i32 QPR:$src1),
3391 (v2i32 (EXTRACT_SUBREG QPR:$src2,
Bob Wilson9abe19d2010-02-17 00:31:29 +00003392 (DSubReg_i32_reg imm:$lane))),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003393 (SubReg_i32_lane imm:$lane)))>;
3394
Bob Wilson5bafff32009-06-22 23:27:02 +00003395// VMULL : Vector Multiply Long (integer and polynomial) (Q = D * D)
Bob Wilsond0b69cf2010-09-01 23:50:19 +00003396defm VMULLs : N3VL_QHS<0,1,0b1100,0, IIC_VMULi16D, IIC_VMULi32D,
3397 "vmull", "s", NEONvmulls, 1>;
3398defm VMULLu : N3VL_QHS<1,1,0b1100,0, IIC_VMULi16D, IIC_VMULi32D,
3399 "vmull", "u", NEONvmullu, 1>;
Evan Chengf81bf152009-11-23 21:57:23 +00003400def VMULLp : N3VLInt<0, 1, 0b00, 0b1110, 0, IIC_VMULi16D, "vmull", "p8",
Evan Chengac0869d2009-11-21 06:21:52 +00003401 v8i16, v8i8, int_arm_neon_vmullp, 1>;
Bob Wilsond0b69cf2010-09-01 23:50:19 +00003402defm VMULLsls : N3VLSL_HS<0, 0b1010, IIC_VMULi16D, "vmull", "s", NEONvmulls>;
3403defm VMULLslu : N3VLSL_HS<1, 0b1010, IIC_VMULi16D, "vmull", "u", NEONvmullu>;
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003404
Bob Wilson5bafff32009-06-22 23:27:02 +00003405// VQDMULL : Vector Saturating Doubling Multiply Long (Q = D * D)
Anton Korobeynikovecc64062010-04-07 18:21:10 +00003406defm VQDMULL : N3VLInt_HS<0,1,0b1101,0, IIC_VMULi16D, IIC_VMULi32D,
3407 "vqdmull", "s", int_arm_neon_vqdmull, 1>;
3408defm VQDMULLsl: N3VLIntSL_HS<0, 0b1011, IIC_VMULi16D,
3409 "vqdmull", "s", int_arm_neon_vqdmull>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003410
3411// Vector Multiply-Accumulate and Multiply-Subtract Operations.
3412
3413// VMLA : Vector Multiply Accumulate (integer and floating-point)
David Goodwin658ea602009-09-25 18:38:29 +00003414defm VMLA : N3VMulOp_QHS<0, 0, 0b1001, 0, IIC_VMACi16D, IIC_VMACi32D,
Evan Chengf81bf152009-11-23 21:57:23 +00003415 IIC_VMACi16Q, IIC_VMACi32Q, "vmla", "i", add>;
3416def VMLAfd : N3VDMulOp<0, 0, 0b00, 0b1101, 1, IIC_VMACD, "vmla", "f32",
Evan Cheng48575f62010-12-05 22:04:16 +00003417 v2f32, fmul_su, fadd_mlx>,
3418 Requires<[HasNEON, UseFPVMLx]>;
Evan Chengf81bf152009-11-23 21:57:23 +00003419def VMLAfq : N3VQMulOp<0, 0, 0b00, 0b1101, 1, IIC_VMACQ, "vmla", "f32",
Evan Cheng48575f62010-12-05 22:04:16 +00003420 v4f32, fmul_su, fadd_mlx>,
3421 Requires<[HasNEON, UseFPVMLx]>;
David Goodwin658ea602009-09-25 18:38:29 +00003422defm VMLAsl : N3VMulOpSL_HS<0b0000, IIC_VMACi16D, IIC_VMACi32D,
Evan Chengf81bf152009-11-23 21:57:23 +00003423 IIC_VMACi16Q, IIC_VMACi32Q, "vmla", "i", add>;
3424def VMLAslfd : N3VDMulOpSL<0b10, 0b0001, IIC_VMACD, "vmla", "f32",
Evan Cheng48575f62010-12-05 22:04:16 +00003425 v2f32, fmul_su, fadd_mlx>,
3426 Requires<[HasNEON, UseFPVMLx]>;
Evan Chengf81bf152009-11-23 21:57:23 +00003427def VMLAslfq : N3VQMulOpSL<0b10, 0b0001, IIC_VMACQ, "vmla", "f32",
Evan Cheng48575f62010-12-05 22:04:16 +00003428 v4f32, v2f32, fmul_su, fadd_mlx>,
3429 Requires<[HasNEON, UseFPVMLx]>;
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003430
3431def : Pat<(v8i16 (add (v8i16 QPR:$src1),
Bob Wilson9abe19d2010-02-17 00:31:29 +00003432 (mul (v8i16 QPR:$src2),
3433 (v8i16 (NEONvduplane (v8i16 QPR:$src3), imm:$lane))))),
3434 (v8i16 (VMLAslv8i16 (v8i16 QPR:$src1), (v8i16 QPR:$src2),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003435 (v4i16 (EXTRACT_SUBREG QPR:$src3,
Bob Wilson9abe19d2010-02-17 00:31:29 +00003436 (DSubReg_i16_reg imm:$lane))),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003437 (SubReg_i16_lane imm:$lane)))>;
3438
3439def : Pat<(v4i32 (add (v4i32 QPR:$src1),
Bob Wilson9abe19d2010-02-17 00:31:29 +00003440 (mul (v4i32 QPR:$src2),
3441 (v4i32 (NEONvduplane (v4i32 QPR:$src3), imm:$lane))))),
3442 (v4i32 (VMLAslv4i32 (v4i32 QPR:$src1), (v4i32 QPR:$src2),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003443 (v2i32 (EXTRACT_SUBREG QPR:$src3,
Bob Wilson9abe19d2010-02-17 00:31:29 +00003444 (DSubReg_i32_reg imm:$lane))),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003445 (SubReg_i32_lane imm:$lane)))>;
3446
Evan Cheng48575f62010-12-05 22:04:16 +00003447def : Pat<(v4f32 (fadd_mlx (v4f32 QPR:$src1),
3448 (fmul_su (v4f32 QPR:$src2),
Bob Wilson9abe19d2010-02-17 00:31:29 +00003449 (v4f32 (NEONvduplane (v4f32 QPR:$src3), imm:$lane))))),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003450 (v4f32 (VMLAslfq (v4f32 QPR:$src1),
3451 (v4f32 QPR:$src2),
3452 (v2f32 (EXTRACT_SUBREG QPR:$src3,
Bob Wilson9abe19d2010-02-17 00:31:29 +00003453 (DSubReg_i32_reg imm:$lane))),
Evan Cheng48575f62010-12-05 22:04:16 +00003454 (SubReg_i32_lane imm:$lane)))>,
3455 Requires<[HasNEON, UseFPVMLx]>;
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003456
Bob Wilson5bafff32009-06-22 23:27:02 +00003457// VMLAL : Vector Multiply Accumulate Long (Q += D * D)
Bob Wilsond0b69cf2010-09-01 23:50:19 +00003458defm VMLALs : N3VLMulOp_QHS<0,1,0b1000,0, IIC_VMACi16D, IIC_VMACi32D,
3459 "vmlal", "s", NEONvmulls, add>;
3460defm VMLALu : N3VLMulOp_QHS<1,1,0b1000,0, IIC_VMACi16D, IIC_VMACi32D,
3461 "vmlal", "u", NEONvmullu, add>;
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003462
Bob Wilsond0b69cf2010-09-01 23:50:19 +00003463defm VMLALsls : N3VLMulOpSL_HS<0, 0b0010, "vmlal", "s", NEONvmulls, add>;
3464defm VMLALslu : N3VLMulOpSL_HS<1, 0b0010, "vmlal", "u", NEONvmullu, add>;
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003465
Bob Wilson5bafff32009-06-22 23:27:02 +00003466// VQDMLAL : Vector Saturating Doubling Multiply Accumulate Long (Q += D * D)
Anton Korobeynikov95102072010-04-07 18:21:04 +00003467defm VQDMLAL : N3VLInt3_HS<0, 1, 0b1001, 0, IIC_VMACi16D, IIC_VMACi32D,
Anton Korobeynikov0a3e2b52010-04-07 18:20:42 +00003468 "vqdmlal", "s", int_arm_neon_vqdmlal>;
Evan Chengf81bf152009-11-23 21:57:23 +00003469defm VQDMLALsl: N3VLInt3SL_HS<0, 0b0011, "vqdmlal", "s", int_arm_neon_vqdmlal>;
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003470
Bob Wilson5bafff32009-06-22 23:27:02 +00003471// VMLS : Vector Multiply Subtract (integer and floating-point)
Bob Wilson8f07b9e2009-10-03 04:41:21 +00003472defm VMLS : N3VMulOp_QHS<1, 0, 0b1001, 0, IIC_VMACi16D, IIC_VMACi32D,
Evan Chengf81bf152009-11-23 21:57:23 +00003473 IIC_VMACi16Q, IIC_VMACi32Q, "vmls", "i", sub>;
3474def VMLSfd : N3VDMulOp<0, 0, 0b10, 0b1101, 1, IIC_VMACD, "vmls", "f32",
Evan Cheng48575f62010-12-05 22:04:16 +00003475 v2f32, fmul_su, fsub_mlx>,
3476 Requires<[HasNEON, UseFPVMLx]>;
Evan Chengf81bf152009-11-23 21:57:23 +00003477def VMLSfq : N3VQMulOp<0, 0, 0b10, 0b1101, 1, IIC_VMACQ, "vmls", "f32",
Evan Cheng48575f62010-12-05 22:04:16 +00003478 v4f32, fmul_su, fsub_mlx>,
3479 Requires<[HasNEON, UseFPVMLx]>;
David Goodwin658ea602009-09-25 18:38:29 +00003480defm VMLSsl : N3VMulOpSL_HS<0b0100, IIC_VMACi16D, IIC_VMACi32D,
Evan Chengf81bf152009-11-23 21:57:23 +00003481 IIC_VMACi16Q, IIC_VMACi32Q, "vmls", "i", sub>;
3482def VMLSslfd : N3VDMulOpSL<0b10, 0b0101, IIC_VMACD, "vmls", "f32",
Evan Cheng48575f62010-12-05 22:04:16 +00003483 v2f32, fmul_su, fsub_mlx>,
3484 Requires<[HasNEON, UseFPVMLx]>;
Evan Chengf81bf152009-11-23 21:57:23 +00003485def VMLSslfq : N3VQMulOpSL<0b10, 0b0101, IIC_VMACQ, "vmls", "f32",
Evan Cheng48575f62010-12-05 22:04:16 +00003486 v4f32, v2f32, fmul_su, fsub_mlx>,
3487 Requires<[HasNEON, UseFPVMLx]>;
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003488
3489def : Pat<(v8i16 (sub (v8i16 QPR:$src1),
Bob Wilson9abe19d2010-02-17 00:31:29 +00003490 (mul (v8i16 QPR:$src2),
3491 (v8i16 (NEONvduplane (v8i16 QPR:$src3), imm:$lane))))),
3492 (v8i16 (VMLSslv8i16 (v8i16 QPR:$src1), (v8i16 QPR:$src2),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003493 (v4i16 (EXTRACT_SUBREG QPR:$src3,
Bob Wilson9abe19d2010-02-17 00:31:29 +00003494 (DSubReg_i16_reg imm:$lane))),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003495 (SubReg_i16_lane imm:$lane)))>;
3496
3497def : Pat<(v4i32 (sub (v4i32 QPR:$src1),
Bob Wilson9abe19d2010-02-17 00:31:29 +00003498 (mul (v4i32 QPR:$src2),
3499 (v4i32 (NEONvduplane (v4i32 QPR:$src3), imm:$lane))))),
3500 (v4i32 (VMLSslv4i32 (v4i32 QPR:$src1), (v4i32 QPR:$src2),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003501 (v2i32 (EXTRACT_SUBREG QPR:$src3,
Bob Wilson9abe19d2010-02-17 00:31:29 +00003502 (DSubReg_i32_reg imm:$lane))),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003503 (SubReg_i32_lane imm:$lane)))>;
3504
Evan Cheng48575f62010-12-05 22:04:16 +00003505def : Pat<(v4f32 (fsub_mlx (v4f32 QPR:$src1),
3506 (fmul_su (v4f32 QPR:$src2),
Bob Wilson9abe19d2010-02-17 00:31:29 +00003507 (v4f32 (NEONvduplane (v4f32 QPR:$src3), imm:$lane))))),
3508 (v4f32 (VMLSslfq (v4f32 QPR:$src1), (v4f32 QPR:$src2),
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003509 (v2f32 (EXTRACT_SUBREG QPR:$src3,
Bob Wilson9abe19d2010-02-17 00:31:29 +00003510 (DSubReg_i32_reg imm:$lane))),
Evan Cheng48575f62010-12-05 22:04:16 +00003511 (SubReg_i32_lane imm:$lane)))>,
3512 Requires<[HasNEON, UseFPVMLx]>;
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003513
Bob Wilson5bafff32009-06-22 23:27:02 +00003514// VMLSL : Vector Multiply Subtract Long (Q -= D * D)
Bob Wilsond0b69cf2010-09-01 23:50:19 +00003515defm VMLSLs : N3VLMulOp_QHS<0,1,0b1010,0, IIC_VMACi16D, IIC_VMACi32D,
3516 "vmlsl", "s", NEONvmulls, sub>;
3517defm VMLSLu : N3VLMulOp_QHS<1,1,0b1010,0, IIC_VMACi16D, IIC_VMACi32D,
3518 "vmlsl", "u", NEONvmullu, sub>;
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003519
Bob Wilsond0b69cf2010-09-01 23:50:19 +00003520defm VMLSLsls : N3VLMulOpSL_HS<0, 0b0110, "vmlsl", "s", NEONvmulls, sub>;
3521defm VMLSLslu : N3VLMulOpSL_HS<1, 0b0110, "vmlsl", "u", NEONvmullu, sub>;
Anton Korobeynikov6ca0b9e2009-09-08 15:22:32 +00003522
Bob Wilson5bafff32009-06-22 23:27:02 +00003523// VQDMLSL : Vector Saturating Doubling Multiply Subtract Long (Q -= D * D)
Anton Korobeynikov95102072010-04-07 18:21:04 +00003524defm VQDMLSL : N3VLInt3_HS<0, 1, 0b1011, 0, IIC_VMACi16D, IIC_VMACi32D,
Anton Korobeynikov0a3e2b52010-04-07 18:20:42 +00003525 "vqdmlsl", "s", int_arm_neon_vqdmlsl>;
Evan Chengf81bf152009-11-23 21:57:23 +00003526defm VQDMLSLsl: N3VLInt3SL_HS<0, 0b111, "vqdmlsl", "s", int_arm_neon_vqdmlsl>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003527
3528// Vector Subtract Operations.
3529
3530// VSUB : Vector Subtract (integer and floating-point)
Evan Chengac0869d2009-11-21 06:21:52 +00003531defm VSUB : N3V_QHSD<1, 0, 0b1000, 0, IIC_VSUBiD, IIC_VSUBiQ,
Evan Chengf81bf152009-11-23 21:57:23 +00003532 "vsub", "i", sub, 0>;
3533def VSUBfd : N3VD<0, 0, 0b10, 0b1101, 0, IIC_VBIND, "vsub", "f32",
Evan Chengac0869d2009-11-21 06:21:52 +00003534 v2f32, v2f32, fsub, 0>;
Evan Chengf81bf152009-11-23 21:57:23 +00003535def VSUBfq : N3VQ<0, 0, 0b10, 0b1101, 0, IIC_VBINQ, "vsub", "f32",
Evan Chengac0869d2009-11-21 06:21:52 +00003536 v4f32, v4f32, fsub, 0>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003537// VSUBL : Vector Subtract Long (Q = D - D)
Bob Wilsond0b69cf2010-09-01 23:50:19 +00003538defm VSUBLs : N3VLExt_QHS<0,1,0b0010,0, IIC_VSHLiD, IIC_VSHLiD,
3539 "vsubl", "s", sub, sext, 0>;
3540defm VSUBLu : N3VLExt_QHS<1,1,0b0010,0, IIC_VSHLiD, IIC_VSHLiD,
3541 "vsubl", "u", sub, zext, 0>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003542// VSUBW : Vector Subtract Wide (Q = Q - D)
Bob Wilson04d6c282010-08-29 05:57:34 +00003543defm VSUBWs : N3VW_QHS<0,1,0b0011,0, "vsubw", "s", sub, sext, 0>;
3544defm VSUBWu : N3VW_QHS<1,1,0b0011,0, "vsubw", "u", sub, zext, 0>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003545// VHSUB : Vector Halving Subtract
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003546defm VHSUBs : N3VInt_QHS<0, 0, 0b0010, 0, N3RegFrm,
Anton Korobeynikovf8b5c632010-04-07 18:20:13 +00003547 IIC_VSUBi4D, IIC_VSUBi4D, IIC_VSUBi4Q, IIC_VSUBi4Q,
Evan Chengf81bf152009-11-23 21:57:23 +00003548 "vhsub", "s", int_arm_neon_vhsubs, 0>;
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003549defm VHSUBu : N3VInt_QHS<1, 0, 0b0010, 0, N3RegFrm,
Anton Korobeynikovf8b5c632010-04-07 18:20:13 +00003550 IIC_VSUBi4D, IIC_VSUBi4D, IIC_VSUBi4Q, IIC_VSUBi4Q,
Evan Chengf81bf152009-11-23 21:57:23 +00003551 "vhsub", "u", int_arm_neon_vhsubu, 0>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003552// VQSUB : Vector Saturing Subtract
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003553defm VQSUBs : N3VInt_QHSD<0, 0, 0b0010, 1, N3RegFrm,
Anton Korobeynikovf8b5c632010-04-07 18:20:13 +00003554 IIC_VSUBi4D, IIC_VSUBi4D, IIC_VSUBi4Q, IIC_VSUBi4Q,
Evan Chengf81bf152009-11-23 21:57:23 +00003555 "vqsub", "s", int_arm_neon_vqsubs, 0>;
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003556defm VQSUBu : N3VInt_QHSD<1, 0, 0b0010, 1, N3RegFrm,
Anton Korobeynikovf8b5c632010-04-07 18:20:13 +00003557 IIC_VSUBi4D, IIC_VSUBi4D, IIC_VSUBi4Q, IIC_VSUBi4Q,
Evan Chengf81bf152009-11-23 21:57:23 +00003558 "vqsub", "u", int_arm_neon_vqsubu, 0>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003559// VSUBHN : Vector Subtract and Narrow Returning High Half (D = Q - Q)
Evan Chengf81bf152009-11-23 21:57:23 +00003560defm VSUBHN : N3VNInt_HSD<0,1,0b0110,0, "vsubhn", "i",
3561 int_arm_neon_vsubhn, 0>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003562// VRSUBHN : Vector Rounding Subtract and Narrow Returning High Half (D=Q-Q)
Evan Chengf81bf152009-11-23 21:57:23 +00003563defm VRSUBHN : N3VNInt_HSD<1,1,0b0110,0, "vrsubhn", "i",
3564 int_arm_neon_vrsubhn, 0>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003565
3566// Vector Comparisons.
3567
3568// VCEQ : Vector Compare Equal
Anton Korobeynikovf8b5c632010-04-07 18:20:13 +00003569defm VCEQ : N3V_QHS<1, 0, 0b1000, 1, IIC_VSUBi4D, IIC_VSUBi4D, IIC_VSUBi4Q,
3570 IIC_VSUBi4Q, "vceq", "i", NEONvceq, 1>;
Evan Chengf81bf152009-11-23 21:57:23 +00003571def VCEQfd : N3VD<0,0,0b00,0b1110,0, IIC_VBIND, "vceq", "f32", v2i32, v2f32,
Evan Chengac0869d2009-11-21 06:21:52 +00003572 NEONvceq, 1>;
Evan Chengf81bf152009-11-23 21:57:23 +00003573def VCEQfq : N3VQ<0,0,0b00,0b1110,0, IIC_VBINQ, "vceq", "f32", v4i32, v4f32,
Evan Chengac0869d2009-11-21 06:21:52 +00003574 NEONvceq, 1>;
Owen Andersonc24cb352010-11-08 23:21:22 +00003575
Johnny Chen363ac582010-02-23 01:42:58 +00003576defm VCEQz : N2V_QHS_cmp<0b11, 0b11, 0b01, 0b00010, 0, "vceq", "i",
Owen Andersonca6945e2010-12-01 00:28:25 +00003577 "$Vd, $Vm, #0", NEONvceqz>;
Johnny Chenec5a4cd2010-02-23 00:33:12 +00003578
Bob Wilson5bafff32009-06-22 23:27:02 +00003579// VCGE : Vector Compare Greater Than or Equal
Anton Korobeynikovf8b5c632010-04-07 18:20:13 +00003580defm VCGEs : N3V_QHS<0, 0, 0b0011, 1, IIC_VSUBi4D, IIC_VSUBi4D, IIC_VSUBi4Q,
3581 IIC_VSUBi4Q, "vcge", "s", NEONvcge, 0>;
Jim Grosbach1251e1a2010-11-18 01:39:50 +00003582defm VCGEu : N3V_QHS<1, 0, 0b0011, 1, IIC_VSUBi4D, IIC_VSUBi4D, IIC_VSUBi4Q,
Anton Korobeynikovf8b5c632010-04-07 18:20:13 +00003583 IIC_VSUBi4Q, "vcge", "u", NEONvcgeu, 0>;
Johnny Chen69631b12010-03-24 21:25:07 +00003584def VCGEfd : N3VD<1,0,0b00,0b1110,0, IIC_VBIND, "vcge", "f32", v2i32, v2f32,
3585 NEONvcge, 0>;
Evan Chengf81bf152009-11-23 21:57:23 +00003586def VCGEfq : N3VQ<1,0,0b00,0b1110,0, IIC_VBINQ, "vcge", "f32", v4i32, v4f32,
Evan Chengac0869d2009-11-21 06:21:52 +00003587 NEONvcge, 0>;
Owen Andersonc24cb352010-11-08 23:21:22 +00003588
Johnny Chen363ac582010-02-23 01:42:58 +00003589defm VCGEz : N2V_QHS_cmp<0b11, 0b11, 0b01, 0b00001, 0, "vcge", "s",
Owen Andersonca6945e2010-12-01 00:28:25 +00003590 "$Vd, $Vm, #0", NEONvcgez>;
Johnny Chen363ac582010-02-23 01:42:58 +00003591defm VCLEz : N2V_QHS_cmp<0b11, 0b11, 0b01, 0b00011, 0, "vcle", "s",
Owen Andersonca6945e2010-12-01 00:28:25 +00003592 "$Vd, $Vm, #0", NEONvclez>;
Johnny Chen363ac582010-02-23 01:42:58 +00003593
Bob Wilson5bafff32009-06-22 23:27:02 +00003594// VCGT : Vector Compare Greater Than
Anton Korobeynikovf8b5c632010-04-07 18:20:13 +00003595defm VCGTs : N3V_QHS<0, 0, 0b0011, 0, IIC_VSUBi4D, IIC_VSUBi4D, IIC_VSUBi4Q,
3596 IIC_VSUBi4Q, "vcgt", "s", NEONvcgt, 0>;
3597defm VCGTu : N3V_QHS<1, 0, 0b0011, 0, IIC_VSUBi4D, IIC_VSUBi4D, IIC_VSUBi4Q,
3598 IIC_VSUBi4Q, "vcgt", "u", NEONvcgtu, 0>;
Evan Chengf81bf152009-11-23 21:57:23 +00003599def VCGTfd : N3VD<1,0,0b10,0b1110,0, IIC_VBIND, "vcgt", "f32", v2i32, v2f32,
Evan Chengac0869d2009-11-21 06:21:52 +00003600 NEONvcgt, 0>;
Evan Chengf81bf152009-11-23 21:57:23 +00003601def VCGTfq : N3VQ<1,0,0b10,0b1110,0, IIC_VBINQ, "vcgt", "f32", v4i32, v4f32,
Evan Chengac0869d2009-11-21 06:21:52 +00003602 NEONvcgt, 0>;
Owen Andersonc24cb352010-11-08 23:21:22 +00003603
Johnny Chen363ac582010-02-23 01:42:58 +00003604defm VCGTz : N2V_QHS_cmp<0b11, 0b11, 0b01, 0b00000, 0, "vcgt", "s",
Owen Andersonca6945e2010-12-01 00:28:25 +00003605 "$Vd, $Vm, #0", NEONvcgtz>;
Johnny Chen363ac582010-02-23 01:42:58 +00003606defm VCLTz : N2V_QHS_cmp<0b11, 0b11, 0b01, 0b00100, 0, "vclt", "s",
Owen Andersonca6945e2010-12-01 00:28:25 +00003607 "$Vd, $Vm, #0", NEONvcltz>;
Johnny Chen363ac582010-02-23 01:42:58 +00003608
Bob Wilson5bafff32009-06-22 23:27:02 +00003609// VACGE : Vector Absolute Compare Greater Than or Equal (aka VCAGE)
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003610def VACGEd : N3VDInt<1, 0, 0b00, 0b1110, 1, N3RegFrm, IIC_VBIND, "vacge",
3611 "f32", v2i32, v2f32, int_arm_neon_vacged, 0>;
3612def VACGEq : N3VQInt<1, 0, 0b00, 0b1110, 1, N3RegFrm, IIC_VBINQ, "vacge",
3613 "f32", v4i32, v4f32, int_arm_neon_vacgeq, 0>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003614// VACGT : Vector Absolute Compare Greater Than (aka VCAGT)
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003615def VACGTd : N3VDInt<1, 0, 0b10, 0b1110, 1, N3RegFrm, IIC_VBIND, "vacgt",
3616 "f32", v2i32, v2f32, int_arm_neon_vacgtd, 0>;
3617def VACGTq : N3VQInt<1, 0, 0b10, 0b1110, 1, N3RegFrm, IIC_VBINQ, "vacgt",
3618 "f32", v4i32, v4f32, int_arm_neon_vacgtq, 0>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003619// VTST : Vector Test Bits
Jim Grosbach1251e1a2010-11-18 01:39:50 +00003620defm VTST : N3V_QHS<0, 0, 0b1000, 1, IIC_VBINi4D, IIC_VBINi4D, IIC_VBINi4Q,
Bob Wilson3a4a8322010-01-17 06:35:17 +00003621 IIC_VBINi4Q, "vtst", "", NEONvtst, 1>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003622
3623// Vector Bitwise Operations.
3624
Bob Wilsoncba270d2010-07-13 21:16:48 +00003625def vnotd : PatFrag<(ops node:$in),
3626 (xor node:$in, (bitconvert (v8i8 NEONimmAllOnesV)))>;
3627def vnotq : PatFrag<(ops node:$in),
3628 (xor node:$in, (bitconvert (v16i8 NEONimmAllOnesV)))>;
Chris Lattnerb26fdcb2010-03-28 08:08:07 +00003629
3630
Bob Wilson5bafff32009-06-22 23:27:02 +00003631// VAND : Vector Bitwise AND
Evan Chengf81bf152009-11-23 21:57:23 +00003632def VANDd : N3VDX<0, 0, 0b00, 0b0001, 1, IIC_VBINiD, "vand",
3633 v2i32, v2i32, and, 1>;
3634def VANDq : N3VQX<0, 0, 0b00, 0b0001, 1, IIC_VBINiQ, "vand",
3635 v4i32, v4i32, and, 1>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003636
3637// VEOR : Vector Bitwise Exclusive OR
Evan Chengf81bf152009-11-23 21:57:23 +00003638def VEORd : N3VDX<1, 0, 0b00, 0b0001, 1, IIC_VBINiD, "veor",
3639 v2i32, v2i32, xor, 1>;
3640def VEORq : N3VQX<1, 0, 0b00, 0b0001, 1, IIC_VBINiQ, "veor",
3641 v4i32, v4i32, xor, 1>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003642
3643// VORR : Vector Bitwise OR
Evan Chengf81bf152009-11-23 21:57:23 +00003644def VORRd : N3VDX<0, 0, 0b10, 0b0001, 1, IIC_VBINiD, "vorr",
3645 v2i32, v2i32, or, 1>;
3646def VORRq : N3VQX<0, 0, 0b10, 0b0001, 1, IIC_VBINiQ, "vorr",
3647 v4i32, v4i32, or, 1>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003648
Owen Andersond9668172010-11-03 22:44:51 +00003649def VORRiv4i16 : N1ModImm<1, 0b000, {1,0,?,1}, 0, 0, 0, 1,
3650 (outs DPR:$Vd), (ins nModImm:$SIMM, DPR:$src),
3651 IIC_VMOVImm,
3652 "vorr", "i16", "$Vd, $SIMM", "$src = $Vd",
3653 [(set DPR:$Vd,
3654 (v4i16 (NEONvorrImm DPR:$src, timm:$SIMM)))]> {
3655 let Inst{9} = SIMM{9};
3656}
3657
Owen Anderson080c0922010-11-05 19:27:46 +00003658def VORRiv2i32 : N1ModImm<1, 0b000, {0,?,?,1}, 0, 0, 0, 1,
Owen Andersond9668172010-11-03 22:44:51 +00003659 (outs DPR:$Vd), (ins nModImm:$SIMM, DPR:$src),
3660 IIC_VMOVImm,
3661 "vorr", "i32", "$Vd, $SIMM", "$src = $Vd",
3662 [(set DPR:$Vd,
3663 (v2i32 (NEONvorrImm DPR:$src, timm:$SIMM)))]> {
Owen Anderson080c0922010-11-05 19:27:46 +00003664 let Inst{10-9} = SIMM{10-9};
Owen Andersond9668172010-11-03 22:44:51 +00003665}
3666
3667def VORRiv8i16 : N1ModImm<1, 0b000, {1,0,?,1}, 0, 1, 0, 1,
3668 (outs QPR:$Vd), (ins nModImm:$SIMM, QPR:$src),
3669 IIC_VMOVImm,
3670 "vorr", "i16", "$Vd, $SIMM", "$src = $Vd",
3671 [(set QPR:$Vd,
3672 (v8i16 (NEONvorrImm QPR:$src, timm:$SIMM)))]> {
3673 let Inst{9} = SIMM{9};
3674}
3675
Owen Anderson080c0922010-11-05 19:27:46 +00003676def VORRiv4i32 : N1ModImm<1, 0b000, {0,?,?,1}, 0, 1, 0, 1,
Owen Andersond9668172010-11-03 22:44:51 +00003677 (outs QPR:$Vd), (ins nModImm:$SIMM, QPR:$src),
3678 IIC_VMOVImm,
3679 "vorr", "i32", "$Vd, $SIMM", "$src = $Vd",
3680 [(set QPR:$Vd,
3681 (v4i32 (NEONvorrImm QPR:$src, timm:$SIMM)))]> {
Owen Anderson080c0922010-11-05 19:27:46 +00003682 let Inst{10-9} = SIMM{10-9};
Owen Andersond9668172010-11-03 22:44:51 +00003683}
3684
3685
Bob Wilson5bafff32009-06-22 23:27:02 +00003686// VBIC : Vector Bitwise Bit Clear (AND NOT)
Owen Andersonca6945e2010-12-01 00:28:25 +00003687def VBICd : N3VX<0, 0, 0b01, 0b0001, 0, 1, (outs DPR:$Vd),
3688 (ins DPR:$Vn, DPR:$Vm), N3RegFrm, IIC_VBINiD,
3689 "vbic", "$Vd, $Vn, $Vm", "",
3690 [(set DPR:$Vd, (v2i32 (and DPR:$Vn,
3691 (vnotd DPR:$Vm))))]>;
3692def VBICq : N3VX<0, 0, 0b01, 0b0001, 1, 1, (outs QPR:$Vd),
3693 (ins QPR:$Vn, QPR:$Vm), N3RegFrm, IIC_VBINiQ,
3694 "vbic", "$Vd, $Vn, $Vm", "",
3695 [(set QPR:$Vd, (v4i32 (and QPR:$Vn,
3696 (vnotq QPR:$Vm))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003697
Owen Anderson080c0922010-11-05 19:27:46 +00003698def VBICiv4i16 : N1ModImm<1, 0b000, {1,0,?,1}, 0, 0, 1, 1,
3699 (outs DPR:$Vd), (ins nModImm:$SIMM, DPR:$src),
3700 IIC_VMOVImm,
3701 "vbic", "i16", "$Vd, $SIMM", "$src = $Vd",
3702 [(set DPR:$Vd,
3703 (v4i16 (NEONvbicImm DPR:$src, timm:$SIMM)))]> {
3704 let Inst{9} = SIMM{9};
3705}
3706
3707def VBICiv2i32 : N1ModImm<1, 0b000, {0,?,?,1}, 0, 0, 1, 1,
3708 (outs DPR:$Vd), (ins nModImm:$SIMM, DPR:$src),
3709 IIC_VMOVImm,
3710 "vbic", "i32", "$Vd, $SIMM", "$src = $Vd",
3711 [(set DPR:$Vd,
3712 (v2i32 (NEONvbicImm DPR:$src, timm:$SIMM)))]> {
3713 let Inst{10-9} = SIMM{10-9};
3714}
3715
3716def VBICiv8i16 : N1ModImm<1, 0b000, {1,0,?,1}, 0, 1, 1, 1,
3717 (outs QPR:$Vd), (ins nModImm:$SIMM, QPR:$src),
3718 IIC_VMOVImm,
3719 "vbic", "i16", "$Vd, $SIMM", "$src = $Vd",
3720 [(set QPR:$Vd,
3721 (v8i16 (NEONvbicImm QPR:$src, timm:$SIMM)))]> {
3722 let Inst{9} = SIMM{9};
3723}
3724
3725def VBICiv4i32 : N1ModImm<1, 0b000, {0,?,?,1}, 0, 1, 1, 1,
3726 (outs QPR:$Vd), (ins nModImm:$SIMM, QPR:$src),
3727 IIC_VMOVImm,
3728 "vbic", "i32", "$Vd, $SIMM", "$src = $Vd",
3729 [(set QPR:$Vd,
3730 (v4i32 (NEONvbicImm QPR:$src, timm:$SIMM)))]> {
3731 let Inst{10-9} = SIMM{10-9};
3732}
3733
Bob Wilson5bafff32009-06-22 23:27:02 +00003734// VORN : Vector Bitwise OR NOT
Owen Andersonca6945e2010-12-01 00:28:25 +00003735def VORNd : N3VX<0, 0, 0b11, 0b0001, 0, 1, (outs DPR:$Vd),
3736 (ins DPR:$Vn, DPR:$Vm), N3RegFrm, IIC_VBINiD,
3737 "vorn", "$Vd, $Vn, $Vm", "",
3738 [(set DPR:$Vd, (v2i32 (or DPR:$Vn,
3739 (vnotd DPR:$Vm))))]>;
3740def VORNq : N3VX<0, 0, 0b11, 0b0001, 1, 1, (outs QPR:$Vd),
3741 (ins QPR:$Vn, QPR:$Vm), N3RegFrm, IIC_VBINiQ,
3742 "vorn", "$Vd, $Vn, $Vm", "",
3743 [(set QPR:$Vd, (v4i32 (or QPR:$Vn,
3744 (vnotq QPR:$Vm))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003745
Bob Wilson7e3f0d22010-07-14 06:31:50 +00003746// VMVN : Vector Bitwise NOT (Immediate)
3747
3748let isReMaterializable = 1 in {
Owen Andersona88ea032010-10-26 17:40:54 +00003749
Owen Andersonca6945e2010-12-01 00:28:25 +00003750def VMVNv4i16 : N1ModImm<1, 0b000, {1,0,?,0}, 0, 0, 1, 1, (outs DPR:$Vd),
Bob Wilson7e3f0d22010-07-14 06:31:50 +00003751 (ins nModImm:$SIMM), IIC_VMOVImm,
Owen Andersonca6945e2010-12-01 00:28:25 +00003752 "vmvn", "i16", "$Vd, $SIMM", "",
3753 [(set DPR:$Vd, (v4i16 (NEONvmvnImm timm:$SIMM)))]> {
Owen Andersona88ea032010-10-26 17:40:54 +00003754 let Inst{9} = SIMM{9};
3755}
3756
Owen Andersonca6945e2010-12-01 00:28:25 +00003757def VMVNv8i16 : N1ModImm<1, 0b000, {1,0,?,0}, 0, 1, 1, 1, (outs QPR:$Vd),
Bob Wilson7e3f0d22010-07-14 06:31:50 +00003758 (ins nModImm:$SIMM), IIC_VMOVImm,
Owen Andersonca6945e2010-12-01 00:28:25 +00003759 "vmvn", "i16", "$Vd, $SIMM", "",
3760 [(set QPR:$Vd, (v8i16 (NEONvmvnImm timm:$SIMM)))]> {
Owen Andersona88ea032010-10-26 17:40:54 +00003761 let Inst{9} = SIMM{9};
3762}
3763
Owen Andersonca6945e2010-12-01 00:28:25 +00003764def VMVNv2i32 : N1ModImm<1, 0b000, {?,?,?,?}, 0, 0, 1, 1, (outs DPR:$Vd),
Bob Wilson7e3f0d22010-07-14 06:31:50 +00003765 (ins nModImm:$SIMM), IIC_VMOVImm,
Owen Andersonca6945e2010-12-01 00:28:25 +00003766 "vmvn", "i32", "$Vd, $SIMM", "",
3767 [(set DPR:$Vd, (v2i32 (NEONvmvnImm timm:$SIMM)))]> {
Owen Andersona88ea032010-10-26 17:40:54 +00003768 let Inst{11-8} = SIMM{11-8};
3769}
3770
Owen Andersonca6945e2010-12-01 00:28:25 +00003771def VMVNv4i32 : N1ModImm<1, 0b000, {?,?,?,?}, 0, 1, 1, 1, (outs QPR:$Vd),
Bob Wilson7e3f0d22010-07-14 06:31:50 +00003772 (ins nModImm:$SIMM), IIC_VMOVImm,
Owen Andersonca6945e2010-12-01 00:28:25 +00003773 "vmvn", "i32", "$Vd, $SIMM", "",
3774 [(set QPR:$Vd, (v4i32 (NEONvmvnImm timm:$SIMM)))]> {
Owen Andersona88ea032010-10-26 17:40:54 +00003775 let Inst{11-8} = SIMM{11-8};
3776}
Bob Wilson7e3f0d22010-07-14 06:31:50 +00003777}
3778
Bob Wilson5bafff32009-06-22 23:27:02 +00003779// VMVN : Vector Bitwise NOT
Evan Chengf81bf152009-11-23 21:57:23 +00003780def VMVNd : N2VX<0b11, 0b11, 0b00, 0b00, 0b01011, 0, 0,
Owen Andersonca6945e2010-12-01 00:28:25 +00003781 (outs DPR:$Vd), (ins DPR:$Vm), IIC_VSUBiD,
3782 "vmvn", "$Vd, $Vm", "",
3783 [(set DPR:$Vd, (v2i32 (vnotd DPR:$Vm)))]>;
Evan Chengf81bf152009-11-23 21:57:23 +00003784def VMVNq : N2VX<0b11, 0b11, 0b00, 0b00, 0b01011, 1, 0,
Owen Andersonca6945e2010-12-01 00:28:25 +00003785 (outs QPR:$Vd), (ins QPR:$Vm), IIC_VSUBiD,
3786 "vmvn", "$Vd, $Vm", "",
3787 [(set QPR:$Vd, (v4i32 (vnotq QPR:$Vm)))]>;
Bob Wilsoncba270d2010-07-13 21:16:48 +00003788def : Pat<(v2i32 (vnotd DPR:$src)), (VMVNd DPR:$src)>;
3789def : Pat<(v4i32 (vnotq QPR:$src)), (VMVNq QPR:$src)>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003790
3791// VBSL : Vector Bitwise Select
Owen Anderson4110b432010-10-25 20:13:13 +00003792def VBSLd : N3VX<1, 0, 0b01, 0b0001, 0, 1, (outs DPR:$Vd),
3793 (ins DPR:$src1, DPR:$Vn, DPR:$Vm),
Bob Wilson2cd1a122010-03-27 04:01:23 +00003794 N3RegFrm, IIC_VCNTiD,
Owen Anderson4110b432010-10-25 20:13:13 +00003795 "vbsl", "$Vd, $Vn, $Vm", "$src1 = $Vd",
Jim Grosbachf921c0fe2011-06-13 22:54:22 +00003796 [(set DPR:$Vd,
3797 (v2i32 (NEONvbsl DPR:$src1, DPR:$Vn, DPR:$Vm)))]>;
Cameron Zwarichc0e6d782011-03-30 23:01:21 +00003798
3799def : Pat<(v2i32 (or (and DPR:$Vn, DPR:$Vd),
3800 (and DPR:$Vm, (vnotd DPR:$Vd)))),
3801 (VBSLd DPR:$Vd, DPR:$Vn, DPR:$Vm)>;
3802
Owen Anderson4110b432010-10-25 20:13:13 +00003803def VBSLq : N3VX<1, 0, 0b01, 0b0001, 1, 1, (outs QPR:$Vd),
3804 (ins QPR:$src1, QPR:$Vn, QPR:$Vm),
Bob Wilson2cd1a122010-03-27 04:01:23 +00003805 N3RegFrm, IIC_VCNTiQ,
Owen Anderson4110b432010-10-25 20:13:13 +00003806 "vbsl", "$Vd, $Vn, $Vm", "$src1 = $Vd",
Jim Grosbachf921c0fe2011-06-13 22:54:22 +00003807 [(set QPR:$Vd,
3808 (v4i32 (NEONvbsl QPR:$src1, QPR:$Vn, QPR:$Vm)))]>;
Cameron Zwarichc0e6d782011-03-30 23:01:21 +00003809
3810def : Pat<(v4i32 (or (and QPR:$Vn, QPR:$Vd),
3811 (and QPR:$Vm, (vnotq QPR:$Vd)))),
3812 (VBSLq QPR:$Vd, QPR:$Vn, QPR:$Vm)>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003813
3814// VBIF : Vector Bitwise Insert if False
Evan Chengf81bf152009-11-23 21:57:23 +00003815// like VBSL but with: "vbif $dst, $src3, $src1", "$src2 = $dst",
Owen Anderson31e6ed82010-10-25 20:17:22 +00003816// FIXME: This instruction's encoding MAY NOT BE correct.
Johnny Chen4814e712010-02-09 23:05:23 +00003817def VBIFd : N3VX<1, 0, 0b11, 0b0001, 0, 1,
Owen Anderson31e6ed82010-10-25 20:17:22 +00003818 (outs DPR:$Vd), (ins DPR:$src1, DPR:$Vn, DPR:$Vm),
Bob Wilson10bc69c2010-03-27 03:56:52 +00003819 N3RegFrm, IIC_VBINiD,
Owen Anderson31e6ed82010-10-25 20:17:22 +00003820 "vbif", "$Vd, $Vn, $Vm", "$src1 = $Vd",
Johnny Chen4814e712010-02-09 23:05:23 +00003821 [/* For disassembly only; pattern left blank */]>;
3822def VBIFq : N3VX<1, 0, 0b11, 0b0001, 1, 1,
Owen Anderson31e6ed82010-10-25 20:17:22 +00003823 (outs QPR:$Vd), (ins QPR:$src1, QPR:$Vn, QPR:$Vm),
Bob Wilson10bc69c2010-03-27 03:56:52 +00003824 N3RegFrm, IIC_VBINiQ,
Owen Anderson31e6ed82010-10-25 20:17:22 +00003825 "vbif", "$Vd, $Vn, $Vm", "$src1 = $Vd",
Johnny Chen4814e712010-02-09 23:05:23 +00003826 [/* For disassembly only; pattern left blank */]>;
3827
Bob Wilson5bafff32009-06-22 23:27:02 +00003828// VBIT : Vector Bitwise Insert if True
Evan Chengf81bf152009-11-23 21:57:23 +00003829// like VBSL but with: "vbit $dst, $src2, $src1", "$src3 = $dst",
Owen Anderson31e6ed82010-10-25 20:17:22 +00003830// FIXME: This instruction's encoding MAY NOT BE correct.
Johnny Chen4814e712010-02-09 23:05:23 +00003831def VBITd : N3VX<1, 0, 0b10, 0b0001, 0, 1,
Owen Anderson31e6ed82010-10-25 20:17:22 +00003832 (outs DPR:$Vd), (ins DPR:$src1, DPR:$Vn, DPR:$Vm),
Bob Wilson10bc69c2010-03-27 03:56:52 +00003833 N3RegFrm, IIC_VBINiD,
Owen Anderson31e6ed82010-10-25 20:17:22 +00003834 "vbit", "$Vd, $Vn, $Vm", "$src1 = $Vd",
Johnny Chen4814e712010-02-09 23:05:23 +00003835 [/* For disassembly only; pattern left blank */]>;
3836def VBITq : N3VX<1, 0, 0b10, 0b0001, 1, 1,
Owen Anderson31e6ed82010-10-25 20:17:22 +00003837 (outs QPR:$Vd), (ins QPR:$src1, QPR:$Vn, QPR:$Vm),
Bob Wilson10bc69c2010-03-27 03:56:52 +00003838 N3RegFrm, IIC_VBINiQ,
Owen Anderson31e6ed82010-10-25 20:17:22 +00003839 "vbit", "$Vd, $Vn, $Vm", "$src1 = $Vd",
Johnny Chen4814e712010-02-09 23:05:23 +00003840 [/* For disassembly only; pattern left blank */]>;
3841
3842// VBIT/VBIF are not yet implemented. The TwoAddress pass will not go looking
Bob Wilson5bafff32009-06-22 23:27:02 +00003843// for equivalent operations with different register constraints; it just
3844// inserts copies.
3845
3846// Vector Absolute Differences.
3847
3848// VABD : Vector Absolute Difference
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003849defm VABDs : N3VInt_QHS<0, 0, 0b0111, 0, N3RegFrm,
Anton Korobeynikov4ac0af82010-04-07 18:20:18 +00003850 IIC_VSUBi4D, IIC_VSUBi4D, IIC_VSUBi4Q, IIC_VSUBi4Q,
Bob Wilsoneb0c3d32010-09-03 01:35:08 +00003851 "vabd", "s", int_arm_neon_vabds, 1>;
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003852defm VABDu : N3VInt_QHS<1, 0, 0b0111, 0, N3RegFrm,
Anton Korobeynikov4ac0af82010-04-07 18:20:18 +00003853 IIC_VSUBi4D, IIC_VSUBi4D, IIC_VSUBi4Q, IIC_VSUBi4Q,
Bob Wilsoneb0c3d32010-09-03 01:35:08 +00003854 "vabd", "u", int_arm_neon_vabdu, 1>;
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003855def VABDfd : N3VDInt<1, 0, 0b10, 0b1101, 0, N3RegFrm, IIC_VBIND,
Bob Wilsoneb0c3d32010-09-03 01:35:08 +00003856 "vabd", "f32", v2f32, v2f32, int_arm_neon_vabds, 1>;
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003857def VABDfq : N3VQInt<1, 0, 0b10, 0b1101, 0, N3RegFrm, IIC_VBINQ,
Bob Wilsoneb0c3d32010-09-03 01:35:08 +00003858 "vabd", "f32", v4f32, v4f32, int_arm_neon_vabds, 1>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003859
3860// VABDL : Vector Absolute Difference Long (Q = | D - D |)
Bob Wilsoneb0c3d32010-09-03 01:35:08 +00003861defm VABDLs : N3VLIntExt_QHS<0,1,0b0111,0, IIC_VSUBi4Q,
3862 "vabdl", "s", int_arm_neon_vabds, zext, 1>;
3863defm VABDLu : N3VLIntExt_QHS<1,1,0b0111,0, IIC_VSUBi4Q,
3864 "vabdl", "u", int_arm_neon_vabdu, zext, 1>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003865
3866// VABA : Vector Absolute Difference and Accumulate
Bob Wilsoneb0c3d32010-09-03 01:35:08 +00003867defm VABAs : N3VIntOp_QHS<0,0,0b0111,1, IIC_VABAD, IIC_VABAQ,
3868 "vaba", "s", int_arm_neon_vabds, add>;
3869defm VABAu : N3VIntOp_QHS<1,0,0b0111,1, IIC_VABAD, IIC_VABAQ,
3870 "vaba", "u", int_arm_neon_vabdu, add>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003871
3872// VABAL : Vector Absolute Difference and Accumulate Long (Q += | D - D |)
Bob Wilsoneb0c3d32010-09-03 01:35:08 +00003873defm VABALs : N3VLIntExtOp_QHS<0,1,0b0101,0, IIC_VABAD,
3874 "vabal", "s", int_arm_neon_vabds, zext, add>;
3875defm VABALu : N3VLIntExtOp_QHS<1,1,0b0101,0, IIC_VABAD,
3876 "vabal", "u", int_arm_neon_vabdu, zext, add>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003877
3878// Vector Maximum and Minimum.
3879
3880// VMAX : Vector Maximum
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003881defm VMAXs : N3VInt_QHS<0, 0, 0b0110, 0, N3RegFrm,
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00003882 IIC_VSUBi4D, IIC_VSUBi4D, IIC_VSUBi4Q, IIC_VSUBi4Q,
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003883 "vmax", "s", int_arm_neon_vmaxs, 1>;
3884defm VMAXu : N3VInt_QHS<1, 0, 0b0110, 0, N3RegFrm,
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00003885 IIC_VSUBi4D, IIC_VSUBi4D, IIC_VSUBi4Q, IIC_VSUBi4Q,
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003886 "vmax", "u", int_arm_neon_vmaxu, 1>;
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00003887def VMAXfd : N3VDInt<0, 0, 0b00, 0b1111, 0, N3RegFrm, IIC_VBIND,
3888 "vmax", "f32",
Anton Korobeynikovf8b5c632010-04-07 18:20:13 +00003889 v2f32, v2f32, int_arm_neon_vmaxs, 1>;
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00003890def VMAXfq : N3VQInt<0, 0, 0b00, 0b1111, 0, N3RegFrm, IIC_VBINQ,
3891 "vmax", "f32",
Anton Korobeynikovf8b5c632010-04-07 18:20:13 +00003892 v4f32, v4f32, int_arm_neon_vmaxs, 1>;
3893
3894// VMIN : Vector Minimum
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00003895defm VMINs : N3VInt_QHS<0, 0, 0b0110, 1, N3RegFrm,
3896 IIC_VSUBi4D, IIC_VSUBi4D, IIC_VSUBi4Q, IIC_VSUBi4Q,
3897 "vmin", "s", int_arm_neon_vmins, 1>;
3898defm VMINu : N3VInt_QHS<1, 0, 0b0110, 1, N3RegFrm,
3899 IIC_VSUBi4D, IIC_VSUBi4D, IIC_VSUBi4Q, IIC_VSUBi4Q,
3900 "vmin", "u", int_arm_neon_vminu, 1>;
3901def VMINfd : N3VDInt<0, 0, 0b10, 0b1111, 0, N3RegFrm, IIC_VBIND,
3902 "vmin", "f32",
Anton Korobeynikovf8b5c632010-04-07 18:20:13 +00003903 v2f32, v2f32, int_arm_neon_vmins, 1>;
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00003904def VMINfq : N3VQInt<0, 0, 0b10, 0b1111, 0, N3RegFrm, IIC_VBINQ,
3905 "vmin", "f32",
Anton Korobeynikovf8b5c632010-04-07 18:20:13 +00003906 v4f32, v4f32, int_arm_neon_vmins, 1>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003907
3908// Vector Pairwise Operations.
3909
3910// VPADD : Vector Pairwise Add
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00003911def VPADDi8 : N3VDInt<0, 0, 0b00, 0b1011, 1, N3RegFrm, IIC_VSHLiD,
3912 "vpadd", "i8",
3913 v8i8, v8i8, int_arm_neon_vpadd, 0>;
3914def VPADDi16 : N3VDInt<0, 0, 0b01, 0b1011, 1, N3RegFrm, IIC_VSHLiD,
3915 "vpadd", "i16",
3916 v4i16, v4i16, int_arm_neon_vpadd, 0>;
3917def VPADDi32 : N3VDInt<0, 0, 0b10, 0b1011, 1, N3RegFrm, IIC_VSHLiD,
3918 "vpadd", "i32",
3919 v2i32, v2i32, int_arm_neon_vpadd, 0>;
Jim Grosbach1251e1a2010-11-18 01:39:50 +00003920def VPADDf : N3VDInt<1, 0, 0b00, 0b1101, 0, N3RegFrm,
Evan Cheng08cec1e2010-10-11 23:41:41 +00003921 IIC_VPBIND, "vpadd", "f32",
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00003922 v2f32, v2f32, int_arm_neon_vpadd, 0>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003923
3924// VPADDL : Vector Pairwise Add Long
Evan Chengf81bf152009-11-23 21:57:23 +00003925defm VPADDLs : N2VPLInt_QHS<0b11, 0b11, 0b00, 0b00100, 0, "vpaddl", "s",
Bob Wilson5bafff32009-06-22 23:27:02 +00003926 int_arm_neon_vpaddls>;
Evan Chengf81bf152009-11-23 21:57:23 +00003927defm VPADDLu : N2VPLInt_QHS<0b11, 0b11, 0b00, 0b00101, 0, "vpaddl", "u",
Bob Wilson5bafff32009-06-22 23:27:02 +00003928 int_arm_neon_vpaddlu>;
3929
3930// VPADAL : Vector Pairwise Add and Accumulate Long
Evan Chengf81bf152009-11-23 21:57:23 +00003931defm VPADALs : N2VPLInt2_QHS<0b11, 0b11, 0b00, 0b01100, 0, "vpadal", "s",
Bob Wilson5bafff32009-06-22 23:27:02 +00003932 int_arm_neon_vpadals>;
Evan Chengf81bf152009-11-23 21:57:23 +00003933defm VPADALu : N2VPLInt2_QHS<0b11, 0b11, 0b00, 0b01101, 0, "vpadal", "u",
Bob Wilson5bafff32009-06-22 23:27:02 +00003934 int_arm_neon_vpadalu>;
3935
3936// VPMAX : Vector Pairwise Maximum
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00003937def VPMAXs8 : N3VDInt<0, 0, 0b00, 0b1010, 0, N3RegFrm, IIC_VSUBi4D, "vpmax",
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003938 "s8", v8i8, v8i8, int_arm_neon_vpmaxs, 0>;
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00003939def VPMAXs16 : N3VDInt<0, 0, 0b01, 0b1010, 0, N3RegFrm, IIC_VSUBi4D, "vpmax",
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003940 "s16", v4i16, v4i16, int_arm_neon_vpmaxs, 0>;
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00003941def VPMAXs32 : N3VDInt<0, 0, 0b10, 0b1010, 0, N3RegFrm, IIC_VSUBi4D, "vpmax",
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003942 "s32", v2i32, v2i32, int_arm_neon_vpmaxs, 0>;
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00003943def VPMAXu8 : N3VDInt<1, 0, 0b00, 0b1010, 0, N3RegFrm, IIC_VSUBi4D, "vpmax",
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003944 "u8", v8i8, v8i8, int_arm_neon_vpmaxu, 0>;
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00003945def VPMAXu16 : N3VDInt<1, 0, 0b01, 0b1010, 0, N3RegFrm, IIC_VSUBi4D, "vpmax",
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003946 "u16", v4i16, v4i16, int_arm_neon_vpmaxu, 0>;
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00003947def VPMAXu32 : N3VDInt<1, 0, 0b10, 0b1010, 0, N3RegFrm, IIC_VSUBi4D, "vpmax",
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003948 "u32", v2i32, v2i32, int_arm_neon_vpmaxu, 0>;
Evan Cheng08cec1e2010-10-11 23:41:41 +00003949def VPMAXf : N3VDInt<1, 0, 0b00, 0b1111, 0, N3RegFrm, IIC_VPBIND, "vpmax",
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003950 "f32", v2f32, v2f32, int_arm_neon_vpmaxs, 0>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003951
3952// VPMIN : Vector Pairwise Minimum
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00003953def VPMINs8 : N3VDInt<0, 0, 0b00, 0b1010, 1, N3RegFrm, IIC_VSUBi4D, "vpmin",
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003954 "s8", v8i8, v8i8, int_arm_neon_vpmins, 0>;
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00003955def VPMINs16 : N3VDInt<0, 0, 0b01, 0b1010, 1, N3RegFrm, IIC_VSUBi4D, "vpmin",
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003956 "s16", v4i16, v4i16, int_arm_neon_vpmins, 0>;
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00003957def VPMINs32 : N3VDInt<0, 0, 0b10, 0b1010, 1, N3RegFrm, IIC_VSUBi4D, "vpmin",
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003958 "s32", v2i32, v2i32, int_arm_neon_vpmins, 0>;
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00003959def VPMINu8 : N3VDInt<1, 0, 0b00, 0b1010, 1, N3RegFrm, IIC_VSUBi4D, "vpmin",
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003960 "u8", v8i8, v8i8, int_arm_neon_vpminu, 0>;
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00003961def VPMINu16 : N3VDInt<1, 0, 0b01, 0b1010, 1, N3RegFrm, IIC_VSUBi4D, "vpmin",
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003962 "u16", v4i16, v4i16, int_arm_neon_vpminu, 0>;
Anton Korobeynikov1c03f242010-04-07 18:20:24 +00003963def VPMINu32 : N3VDInt<1, 0, 0b10, 0b1010, 1, N3RegFrm, IIC_VSUBi4D, "vpmin",
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003964 "u32", v2i32, v2i32, int_arm_neon_vpminu, 0>;
Evan Cheng08cec1e2010-10-11 23:41:41 +00003965def VPMINf : N3VDInt<1, 0, 0b10, 0b1111, 0, N3RegFrm, IIC_VPBIND, "vpmin",
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003966 "f32", v2f32, v2f32, int_arm_neon_vpmins, 0>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003967
3968// Vector Reciprocal and Reciprocal Square Root Estimate and Step.
3969
3970// VRECPE : Vector Reciprocal Estimate
Jim Grosbach1251e1a2010-11-18 01:39:50 +00003971def VRECPEd : N2VDInt<0b11, 0b11, 0b10, 0b11, 0b01000, 0,
Evan Chengf81bf152009-11-23 21:57:23 +00003972 IIC_VUNAD, "vrecpe", "u32",
Bob Wilson5bafff32009-06-22 23:27:02 +00003973 v2i32, v2i32, int_arm_neon_vrecpe>;
Jim Grosbach1251e1a2010-11-18 01:39:50 +00003974def VRECPEq : N2VQInt<0b11, 0b11, 0b10, 0b11, 0b01000, 0,
Evan Chengf81bf152009-11-23 21:57:23 +00003975 IIC_VUNAQ, "vrecpe", "u32",
Bob Wilson5bafff32009-06-22 23:27:02 +00003976 v4i32, v4i32, int_arm_neon_vrecpe>;
David Goodwin127221f2009-09-23 21:38:08 +00003977def VRECPEfd : N2VDInt<0b11, 0b11, 0b10, 0b11, 0b01010, 0,
Evan Chengf81bf152009-11-23 21:57:23 +00003978 IIC_VUNAD, "vrecpe", "f32",
Bob Wilsonb0abb4d2009-08-11 05:39:44 +00003979 v2f32, v2f32, int_arm_neon_vrecpe>;
David Goodwin127221f2009-09-23 21:38:08 +00003980def VRECPEfq : N2VQInt<0b11, 0b11, 0b10, 0b11, 0b01010, 0,
Evan Chengf81bf152009-11-23 21:57:23 +00003981 IIC_VUNAQ, "vrecpe", "f32",
Bob Wilsonb0abb4d2009-08-11 05:39:44 +00003982 v4f32, v4f32, int_arm_neon_vrecpe>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003983
3984// VRECPS : Vector Reciprocal Step
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003985def VRECPSfd : N3VDInt<0, 0, 0b00, 0b1111, 1, N3RegFrm,
Evan Chengf81bf152009-11-23 21:57:23 +00003986 IIC_VRECSD, "vrecps", "f32",
3987 v2f32, v2f32, int_arm_neon_vrecps, 1>;
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00003988def VRECPSfq : N3VQInt<0, 0, 0b00, 0b1111, 1, N3RegFrm,
Evan Chengf81bf152009-11-23 21:57:23 +00003989 IIC_VRECSQ, "vrecps", "f32",
3990 v4f32, v4f32, int_arm_neon_vrecps, 1>;
Bob Wilson5bafff32009-06-22 23:27:02 +00003991
3992// VRSQRTE : Vector Reciprocal Square Root Estimate
David Goodwin127221f2009-09-23 21:38:08 +00003993def VRSQRTEd : N2VDInt<0b11, 0b11, 0b10, 0b11, 0b01001, 0,
Evan Chengf81bf152009-11-23 21:57:23 +00003994 IIC_VUNAD, "vrsqrte", "u32",
David Goodwin127221f2009-09-23 21:38:08 +00003995 v2i32, v2i32, int_arm_neon_vrsqrte>;
3996def VRSQRTEq : N2VQInt<0b11, 0b11, 0b10, 0b11, 0b01001, 0,
Evan Chengf81bf152009-11-23 21:57:23 +00003997 IIC_VUNAQ, "vrsqrte", "u32",
David Goodwin127221f2009-09-23 21:38:08 +00003998 v4i32, v4i32, int_arm_neon_vrsqrte>;
3999def VRSQRTEfd : N2VDInt<0b11, 0b11, 0b10, 0b11, 0b01011, 0,
Evan Chengf81bf152009-11-23 21:57:23 +00004000 IIC_VUNAD, "vrsqrte", "f32",
David Goodwin127221f2009-09-23 21:38:08 +00004001 v2f32, v2f32, int_arm_neon_vrsqrte>;
Jim Grosbach1251e1a2010-11-18 01:39:50 +00004002def VRSQRTEfq : N2VQInt<0b11, 0b11, 0b10, 0b11, 0b01011, 0,
Evan Chengf81bf152009-11-23 21:57:23 +00004003 IIC_VUNAQ, "vrsqrte", "f32",
David Goodwin127221f2009-09-23 21:38:08 +00004004 v4f32, v4f32, int_arm_neon_vrsqrte>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004005
4006// VRSQRTS : Vector Reciprocal Square Root Step
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004007def VRSQRTSfd : N3VDInt<0, 0, 0b10, 0b1111, 1, N3RegFrm,
Evan Chengf81bf152009-11-23 21:57:23 +00004008 IIC_VRECSD, "vrsqrts", "f32",
4009 v2f32, v2f32, int_arm_neon_vrsqrts, 1>;
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004010def VRSQRTSfq : N3VQInt<0, 0, 0b10, 0b1111, 1, N3RegFrm,
Evan Chengf81bf152009-11-23 21:57:23 +00004011 IIC_VRECSQ, "vrsqrts", "f32",
4012 v4f32, v4f32, int_arm_neon_vrsqrts, 1>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004013
4014// Vector Shifts.
4015
4016// VSHL : Vector Shift
Owen Anderson3557d002010-10-26 20:56:57 +00004017defm VSHLs : N3VInt_QHSDSh<0, 0, 0b0100, 0, N3RegVShFrm,
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004018 IIC_VSHLiD, IIC_VSHLiD, IIC_VSHLiQ, IIC_VSHLiQ,
Owen Andersonac922622010-10-26 21:13:59 +00004019 "vshl", "s", int_arm_neon_vshifts>;
Owen Anderson3557d002010-10-26 20:56:57 +00004020defm VSHLu : N3VInt_QHSDSh<1, 0, 0b0100, 0, N3RegVShFrm,
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004021 IIC_VSHLiD, IIC_VSHLiD, IIC_VSHLiQ, IIC_VSHLiQ,
Owen Andersonac922622010-10-26 21:13:59 +00004022 "vshl", "u", int_arm_neon_vshiftu>;
Bill Wendling7c6b6082011-03-08 23:48:09 +00004023
Bob Wilson5bafff32009-06-22 23:27:02 +00004024// VSHL : Vector Shift Left (Immediate)
Bill Wendling7c6b6082011-03-08 23:48:09 +00004025defm VSHLi : N2VShL_QHSD<0, 1, 0b0101, 1, IIC_VSHLiD, "vshl", "i", NEONvshl>;
4026
Bob Wilson5bafff32009-06-22 23:27:02 +00004027// VSHR : Vector Shift Right (Immediate)
Bill Wendling7c6b6082011-03-08 23:48:09 +00004028defm VSHRs : N2VShR_QHSD<0, 1, 0b0000, 1, IIC_VSHLiD, "vshr", "s",NEONvshrs>;
4029defm VSHRu : N2VShR_QHSD<1, 1, 0b0000, 1, IIC_VSHLiD, "vshr", "u",NEONvshru>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004030
4031// VSHLL : Vector Shift Left Long
Evan Chengf81bf152009-11-23 21:57:23 +00004032defm VSHLLs : N2VLSh_QHS<0, 1, 0b1010, 0, 0, 1, "vshll", "s", NEONvshlls>;
4033defm VSHLLu : N2VLSh_QHS<1, 1, 0b1010, 0, 0, 1, "vshll", "u", NEONvshllu>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004034
4035// VSHLL : Vector Shift Left Long (with maximum shift count)
Bob Wilson507df402009-10-21 02:15:46 +00004036class N2VLShMax<bit op24, bit op23, bits<6> op21_16, bits<4> op11_8, bit op7,
Evan Chengf81bf152009-11-23 21:57:23 +00004037 bit op6, bit op4, string OpcodeStr, string Dt, ValueType ResTy,
Bob Wilson507df402009-10-21 02:15:46 +00004038 ValueType OpTy, SDNode OpNode>
Evan Chengf81bf152009-11-23 21:57:23 +00004039 : N2VLSh<op24, op23, op11_8, op7, op6, op4, OpcodeStr, Dt,
4040 ResTy, OpTy, OpNode> {
Bob Wilson507df402009-10-21 02:15:46 +00004041 let Inst{21-16} = op21_16;
4042}
Evan Chengf81bf152009-11-23 21:57:23 +00004043def VSHLLi8 : N2VLShMax<1, 1, 0b110010, 0b0011, 0, 0, 0, "vshll", "i8",
Bob Wilson507df402009-10-21 02:15:46 +00004044 v8i16, v8i8, NEONvshlli>;
Evan Chengf81bf152009-11-23 21:57:23 +00004045def VSHLLi16 : N2VLShMax<1, 1, 0b110110, 0b0011, 0, 0, 0, "vshll", "i16",
Bob Wilson507df402009-10-21 02:15:46 +00004046 v4i32, v4i16, NEONvshlli>;
Evan Chengf81bf152009-11-23 21:57:23 +00004047def VSHLLi32 : N2VLShMax<1, 1, 0b111010, 0b0011, 0, 0, 0, "vshll", "i32",
Bob Wilson507df402009-10-21 02:15:46 +00004048 v2i64, v2i32, NEONvshlli>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004049
4050// VSHRN : Vector Shift Right and Narrow
Evan Chengef0ccad2010-10-01 21:48:06 +00004051defm VSHRN : N2VNSh_HSD<0,1,0b1000,0,0,1, IIC_VSHLiD, "vshrn", "i",
Bob Wilson9abe19d2010-02-17 00:31:29 +00004052 NEONvshrn>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004053
4054// VRSHL : Vector Rounding Shift
Owen Anderson632c2352010-10-26 21:58:41 +00004055defm VRSHLs : N3VInt_QHSDSh<0, 0, 0b0101, 0, N3RegVShFrm,
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004056 IIC_VSHLi4D, IIC_VSHLi4D, IIC_VSHLi4Q, IIC_VSHLi4Q,
Owen Anderson632c2352010-10-26 21:58:41 +00004057 "vrshl", "s", int_arm_neon_vrshifts>;
4058defm VRSHLu : N3VInt_QHSDSh<1, 0, 0b0101, 0, N3RegVShFrm,
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004059 IIC_VSHLi4D, IIC_VSHLi4D, IIC_VSHLi4Q, IIC_VSHLi4Q,
Owen Anderson632c2352010-10-26 21:58:41 +00004060 "vrshl", "u", int_arm_neon_vrshiftu>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004061// VRSHR : Vector Rounding Shift Right
Bill Wendling7c6b6082011-03-08 23:48:09 +00004062defm VRSHRs : N2VShR_QHSD<0,1,0b0010,1, IIC_VSHLi4D, "vrshr", "s",NEONvrshrs>;
4063defm VRSHRu : N2VShR_QHSD<1,1,0b0010,1, IIC_VSHLi4D, "vrshr", "u",NEONvrshru>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004064
4065// VRSHRN : Vector Rounding Shift Right and Narrow
Evan Chengf81bf152009-11-23 21:57:23 +00004066defm VRSHRN : N2VNSh_HSD<0, 1, 0b1000, 0, 1, 1, IIC_VSHLi4D, "vrshrn", "i",
Bob Wilson507df402009-10-21 02:15:46 +00004067 NEONvrshrn>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004068
4069// VQSHL : Vector Saturating Shift
Owen Anderson86ed2322010-10-26 22:50:46 +00004070defm VQSHLs : N3VInt_QHSDSh<0, 0, 0b0100, 1, N3RegVShFrm,
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004071 IIC_VSHLi4D, IIC_VSHLi4D, IIC_VSHLi4Q, IIC_VSHLi4Q,
Owen Anderson86ed2322010-10-26 22:50:46 +00004072 "vqshl", "s", int_arm_neon_vqshifts>;
4073defm VQSHLu : N3VInt_QHSDSh<1, 0, 0b0100, 1, N3RegVShFrm,
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004074 IIC_VSHLi4D, IIC_VSHLi4D, IIC_VSHLi4Q, IIC_VSHLi4Q,
Owen Anderson86ed2322010-10-26 22:50:46 +00004075 "vqshl", "u", int_arm_neon_vqshiftu>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004076// VQSHL : Vector Saturating Shift Left (Immediate)
Bill Wendling7c6b6082011-03-08 23:48:09 +00004077defm VQSHLsi : N2VShL_QHSD<0,1,0b0111,1, IIC_VSHLi4D, "vqshl", "s",NEONvqshls>;
4078defm VQSHLui : N2VShL_QHSD<1,1,0b0111,1, IIC_VSHLi4D, "vqshl", "u",NEONvqshlu>;
4079
Bob Wilson5bafff32009-06-22 23:27:02 +00004080// VQSHLU : Vector Saturating Shift Left (Immediate, Unsigned)
Bill Wendling7c6b6082011-03-08 23:48:09 +00004081defm VQSHLsu : N2VShL_QHSD<1,1,0b0110,1, IIC_VSHLi4D,"vqshlu","s",NEONvqshlsu>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004082
4083// VQSHRN : Vector Saturating Shift Right and Narrow
Evan Chengf81bf152009-11-23 21:57:23 +00004084defm VQSHRNs : N2VNSh_HSD<0, 1, 0b1001, 0, 0, 1, IIC_VSHLi4D, "vqshrn", "s",
Bob Wilson507df402009-10-21 02:15:46 +00004085 NEONvqshrns>;
Evan Chengf81bf152009-11-23 21:57:23 +00004086defm VQSHRNu : N2VNSh_HSD<1, 1, 0b1001, 0, 0, 1, IIC_VSHLi4D, "vqshrn", "u",
Bob Wilson507df402009-10-21 02:15:46 +00004087 NEONvqshrnu>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004088
4089// VQSHRUN : Vector Saturating Shift Right and Narrow (Unsigned)
Evan Chengf81bf152009-11-23 21:57:23 +00004090defm VQSHRUN : N2VNSh_HSD<1, 1, 0b1000, 0, 0, 1, IIC_VSHLi4D, "vqshrun", "s",
Bob Wilson507df402009-10-21 02:15:46 +00004091 NEONvqshrnsu>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004092
4093// VQRSHL : Vector Saturating Rounding Shift
Owen Anderson86ed2322010-10-26 22:50:46 +00004094defm VQRSHLs : N3VInt_QHSDSh<0, 0, 0b0101, 1, N3RegVShFrm,
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004095 IIC_VSHLi4D, IIC_VSHLi4D, IIC_VSHLi4Q, IIC_VSHLi4Q,
Owen Anderson86ed2322010-10-26 22:50:46 +00004096 "vqrshl", "s", int_arm_neon_vqrshifts>;
4097defm VQRSHLu : N3VInt_QHSDSh<1, 0, 0b0101, 1, N3RegVShFrm,
Johnny Chen9ee9d7d2010-03-26 23:49:07 +00004098 IIC_VSHLi4D, IIC_VSHLi4D, IIC_VSHLi4Q, IIC_VSHLi4Q,
Owen Anderson86ed2322010-10-26 22:50:46 +00004099 "vqrshl", "u", int_arm_neon_vqrshiftu>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004100
4101// VQRSHRN : Vector Saturating Rounding Shift Right and Narrow
Evan Chengf81bf152009-11-23 21:57:23 +00004102defm VQRSHRNs : N2VNSh_HSD<0, 1, 0b1001, 0, 1, 1, IIC_VSHLi4D, "vqrshrn", "s",
Bob Wilson507df402009-10-21 02:15:46 +00004103 NEONvqrshrns>;
Evan Chengf81bf152009-11-23 21:57:23 +00004104defm VQRSHRNu : N2VNSh_HSD<1, 1, 0b1001, 0, 1, 1, IIC_VSHLi4D, "vqrshrn", "u",
Bob Wilson507df402009-10-21 02:15:46 +00004105 NEONvqrshrnu>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004106
4107// VQRSHRUN : Vector Saturating Rounding Shift Right and Narrow (Unsigned)
Evan Chengf81bf152009-11-23 21:57:23 +00004108defm VQRSHRUN : N2VNSh_HSD<1, 1, 0b1000, 0, 1, 1, IIC_VSHLi4D, "vqrshrun", "s",
Bob Wilson507df402009-10-21 02:15:46 +00004109 NEONvqrshrnsu>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004110
4111// VSRA : Vector Shift Right and Accumulate
Evan Chengf81bf152009-11-23 21:57:23 +00004112defm VSRAs : N2VShAdd_QHSD<0, 1, 0b0001, 1, "vsra", "s", NEONvshrs>;
4113defm VSRAu : N2VShAdd_QHSD<1, 1, 0b0001, 1, "vsra", "u", NEONvshru>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004114// VRSRA : Vector Rounding Shift Right and Accumulate
Evan Chengf81bf152009-11-23 21:57:23 +00004115defm VRSRAs : N2VShAdd_QHSD<0, 1, 0b0011, 1, "vrsra", "s", NEONvrshrs>;
4116defm VRSRAu : N2VShAdd_QHSD<1, 1, 0b0011, 1, "vrsra", "u", NEONvrshru>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004117
4118// VSLI : Vector Shift Left and Insert
Bill Wendling620d0cc2011-03-09 00:33:17 +00004119defm VSLI : N2VShInsL_QHSD<1, 1, 0b0101, 1, "vsli">;
4120
Bob Wilson5bafff32009-06-22 23:27:02 +00004121// VSRI : Vector Shift Right and Insert
Bill Wendling620d0cc2011-03-09 00:33:17 +00004122defm VSRI : N2VShInsR_QHSD<1, 1, 0b0100, 1, "vsri">;
Bob Wilson5bafff32009-06-22 23:27:02 +00004123
4124// Vector Absolute and Saturating Absolute.
4125
4126// VABS : Vector Absolute Value
Jim Grosbach1251e1a2010-11-18 01:39:50 +00004127defm VABS : N2VInt_QHS<0b11, 0b11, 0b01, 0b00110, 0,
Evan Chengf81bf152009-11-23 21:57:23 +00004128 IIC_VUNAiD, IIC_VUNAiQ, "vabs", "s",
Bob Wilson5bafff32009-06-22 23:27:02 +00004129 int_arm_neon_vabs>;
David Goodwin127221f2009-09-23 21:38:08 +00004130def VABSfd : N2VDInt<0b11, 0b11, 0b10, 0b01, 0b01110, 0,
Evan Chengf81bf152009-11-23 21:57:23 +00004131 IIC_VUNAD, "vabs", "f32",
Bob Wilsonb0abb4d2009-08-11 05:39:44 +00004132 v2f32, v2f32, int_arm_neon_vabs>;
David Goodwin127221f2009-09-23 21:38:08 +00004133def VABSfq : N2VQInt<0b11, 0b11, 0b10, 0b01, 0b01110, 0,
Evan Chengf81bf152009-11-23 21:57:23 +00004134 IIC_VUNAQ, "vabs", "f32",
Bob Wilsonb0abb4d2009-08-11 05:39:44 +00004135 v4f32, v4f32, int_arm_neon_vabs>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004136
4137// VQABS : Vector Saturating Absolute Value
Jim Grosbach1251e1a2010-11-18 01:39:50 +00004138defm VQABS : N2VInt_QHS<0b11, 0b11, 0b00, 0b01110, 0,
Evan Chengf81bf152009-11-23 21:57:23 +00004139 IIC_VQUNAiD, IIC_VQUNAiQ, "vqabs", "s",
Bob Wilson5bafff32009-06-22 23:27:02 +00004140 int_arm_neon_vqabs>;
4141
4142// Vector Negate.
4143
Bob Wilsoncba270d2010-07-13 21:16:48 +00004144def vnegd : PatFrag<(ops node:$in),
4145 (sub (bitconvert (v2i32 NEONimmAllZerosV)), node:$in)>;
4146def vnegq : PatFrag<(ops node:$in),
4147 (sub (bitconvert (v4i32 NEONimmAllZerosV)), node:$in)>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004148
Evan Chengf81bf152009-11-23 21:57:23 +00004149class VNEGD<bits<2> size, string OpcodeStr, string Dt, ValueType Ty>
Owen Andersonca6945e2010-12-01 00:28:25 +00004150 : N2V<0b11, 0b11, size, 0b01, 0b00111, 0, 0, (outs DPR:$Vd), (ins DPR:$Vm),
4151 IIC_VSHLiD, OpcodeStr, Dt, "$Vd, $Vm", "",
4152 [(set DPR:$Vd, (Ty (vnegd DPR:$Vm)))]>;
Evan Chengf81bf152009-11-23 21:57:23 +00004153class VNEGQ<bits<2> size, string OpcodeStr, string Dt, ValueType Ty>
Owen Andersonca6945e2010-12-01 00:28:25 +00004154 : N2V<0b11, 0b11, size, 0b01, 0b00111, 1, 0, (outs QPR:$Vd), (ins QPR:$Vm),
4155 IIC_VSHLiQ, OpcodeStr, Dt, "$Vd, $Vm", "",
4156 [(set QPR:$Vd, (Ty (vnegq QPR:$Vm)))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004157
Chris Lattner0a00ed92010-03-28 08:39:10 +00004158// VNEG : Vector Negate (integer)
Evan Chengf81bf152009-11-23 21:57:23 +00004159def VNEGs8d : VNEGD<0b00, "vneg", "s8", v8i8>;
4160def VNEGs16d : VNEGD<0b01, "vneg", "s16", v4i16>;
4161def VNEGs32d : VNEGD<0b10, "vneg", "s32", v2i32>;
4162def VNEGs8q : VNEGQ<0b00, "vneg", "s8", v16i8>;
4163def VNEGs16q : VNEGQ<0b01, "vneg", "s16", v8i16>;
4164def VNEGs32q : VNEGQ<0b10, "vneg", "s32", v4i32>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004165
4166// VNEG : Vector Negate (floating-point)
Bob Wilson3c0f96e2010-02-17 22:23:11 +00004167def VNEGfd : N2V<0b11, 0b11, 0b10, 0b01, 0b01111, 0, 0,
Owen Andersonca6945e2010-12-01 00:28:25 +00004168 (outs DPR:$Vd), (ins DPR:$Vm), IIC_VUNAD,
4169 "vneg", "f32", "$Vd, $Vm", "",
4170 [(set DPR:$Vd, (v2f32 (fneg DPR:$Vm)))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004171def VNEGf32q : N2V<0b11, 0b11, 0b10, 0b01, 0b01111, 1, 0,
Owen Andersonca6945e2010-12-01 00:28:25 +00004172 (outs QPR:$Vd), (ins QPR:$Vm), IIC_VUNAQ,
4173 "vneg", "f32", "$Vd, $Vm", "",
4174 [(set QPR:$Vd, (v4f32 (fneg QPR:$Vm)))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004175
Bob Wilsoncba270d2010-07-13 21:16:48 +00004176def : Pat<(v8i8 (vnegd DPR:$src)), (VNEGs8d DPR:$src)>;
4177def : Pat<(v4i16 (vnegd DPR:$src)), (VNEGs16d DPR:$src)>;
4178def : Pat<(v2i32 (vnegd DPR:$src)), (VNEGs32d DPR:$src)>;
4179def : Pat<(v16i8 (vnegq QPR:$src)), (VNEGs8q QPR:$src)>;
4180def : Pat<(v8i16 (vnegq QPR:$src)), (VNEGs16q QPR:$src)>;
4181def : Pat<(v4i32 (vnegq QPR:$src)), (VNEGs32q QPR:$src)>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004182
4183// VQNEG : Vector Saturating Negate
Jim Grosbach1251e1a2010-11-18 01:39:50 +00004184defm VQNEG : N2VInt_QHS<0b11, 0b11, 0b00, 0b01111, 0,
Evan Chengf81bf152009-11-23 21:57:23 +00004185 IIC_VQUNAiD, IIC_VQUNAiQ, "vqneg", "s",
Bob Wilson5bafff32009-06-22 23:27:02 +00004186 int_arm_neon_vqneg>;
4187
4188// Vector Bit Counting Operations.
4189
4190// VCLS : Vector Count Leading Sign Bits
Jim Grosbach1251e1a2010-11-18 01:39:50 +00004191defm VCLS : N2VInt_QHS<0b11, 0b11, 0b00, 0b01000, 0,
Evan Chengf81bf152009-11-23 21:57:23 +00004192 IIC_VCNTiD, IIC_VCNTiQ, "vcls", "s",
Bob Wilson5bafff32009-06-22 23:27:02 +00004193 int_arm_neon_vcls>;
4194// VCLZ : Vector Count Leading Zeros
Jim Grosbach1251e1a2010-11-18 01:39:50 +00004195defm VCLZ : N2VInt_QHS<0b11, 0b11, 0b00, 0b01001, 0,
Evan Chengf81bf152009-11-23 21:57:23 +00004196 IIC_VCNTiD, IIC_VCNTiQ, "vclz", "i",
Bob Wilson5bafff32009-06-22 23:27:02 +00004197 int_arm_neon_vclz>;
4198// VCNT : Vector Count One Bits
Jim Grosbach1251e1a2010-11-18 01:39:50 +00004199def VCNTd : N2VDInt<0b11, 0b11, 0b00, 0b00, 0b01010, 0,
Evan Chengf81bf152009-11-23 21:57:23 +00004200 IIC_VCNTiD, "vcnt", "8",
Bob Wilson5bafff32009-06-22 23:27:02 +00004201 v8i8, v8i8, int_arm_neon_vcnt>;
David Goodwin127221f2009-09-23 21:38:08 +00004202def VCNTq : N2VQInt<0b11, 0b11, 0b00, 0b00, 0b01010, 0,
Evan Chengf81bf152009-11-23 21:57:23 +00004203 IIC_VCNTiQ, "vcnt", "8",
Bob Wilson5bafff32009-06-22 23:27:02 +00004204 v16i8, v16i8, int_arm_neon_vcnt>;
4205
Johnny Chend8836042010-02-24 20:06:07 +00004206// Vector Swap -- for disassembly only.
4207def VSWPd : N2VX<0b11, 0b11, 0b00, 0b10, 0b00000, 0, 0,
Owen Andersonca6945e2010-12-01 00:28:25 +00004208 (outs DPR:$Vd), (ins DPR:$Vm), NoItinerary,
4209 "vswp", "$Vd, $Vm", "", []>;
Johnny Chend8836042010-02-24 20:06:07 +00004210def VSWPq : N2VX<0b11, 0b11, 0b00, 0b10, 0b00000, 1, 0,
Owen Andersonca6945e2010-12-01 00:28:25 +00004211 (outs QPR:$Vd), (ins QPR:$Vm), NoItinerary,
4212 "vswp", "$Vd, $Vm", "", []>;
Johnny Chend8836042010-02-24 20:06:07 +00004213
Bob Wilson5bafff32009-06-22 23:27:02 +00004214// Vector Move Operations.
4215
4216// VMOV : Vector Move (Register)
4217
Evan Cheng020cc1b2010-05-13 00:16:46 +00004218let neverHasSideEffects = 1 in {
Jim Grosbach7b6ab402010-11-19 22:43:08 +00004219def VMOVDneon: N3VX<0, 0, 0b10, 0b0001, 0, 1, (outs DPR:$Vd), (ins DPR:$Vm),
Owen Andersonb1692692010-11-19 23:12:43 +00004220 N3RegFrm, IIC_VMOV, "vmov", "$Vd, $Vm", "", []> {
4221 let Vn{4-0} = Vm{4-0};
4222}
Jim Grosbach7b6ab402010-11-19 22:43:08 +00004223def VMOVQ : N3VX<0, 0, 0b10, 0b0001, 1, 1, (outs QPR:$Vd), (ins QPR:$Vm),
Owen Andersonb1692692010-11-19 23:12:43 +00004224 N3RegFrm, IIC_VMOV, "vmov", "$Vd, $Vm", "", []> {
4225 let Vn{4-0} = Vm{4-0};
4226}
Bob Wilson5bafff32009-06-22 23:27:02 +00004227
Evan Cheng22c687b2010-05-14 02:13:41 +00004228// Pseudo vector move instructions for QQ and QQQQ registers. This should
Evan Chengb63387a2010-05-06 06:36:08 +00004229// be expanded after register allocation is completed.
4230def VMOVQQ : PseudoInst<(outs QQPR:$dst), (ins QQPR:$src),
Jim Grosbach99594eb2010-11-18 01:38:26 +00004231 NoItinerary, []>;
Evan Cheng22c687b2010-05-14 02:13:41 +00004232
4233def VMOVQQQQ : PseudoInst<(outs QQQQPR:$dst), (ins QQQQPR:$src),
Jim Grosbach99594eb2010-11-18 01:38:26 +00004234 NoItinerary, []>;
Evan Cheng020cc1b2010-05-13 00:16:46 +00004235} // neverHasSideEffects
Evan Chengb63387a2010-05-06 06:36:08 +00004236
Bob Wilson5bafff32009-06-22 23:27:02 +00004237// VMOV : Vector Move (Immediate)
4238
Evan Cheng47006be2010-05-17 21:54:50 +00004239let isReMaterializable = 1 in {
Owen Andersonca6945e2010-12-01 00:28:25 +00004240def VMOVv8i8 : N1ModImm<1, 0b000, 0b1110, 0, 0, 0, 1, (outs DPR:$Vd),
Bob Wilson1a913ed2010-06-11 21:34:50 +00004241 (ins nModImm:$SIMM), IIC_VMOVImm,
Owen Andersonca6945e2010-12-01 00:28:25 +00004242 "vmov", "i8", "$Vd, $SIMM", "",
4243 [(set DPR:$Vd, (v8i8 (NEONvmovImm timm:$SIMM)))]>;
4244def VMOVv16i8 : N1ModImm<1, 0b000, 0b1110, 0, 1, 0, 1, (outs QPR:$Vd),
Bob Wilson1a913ed2010-06-11 21:34:50 +00004245 (ins nModImm:$SIMM), IIC_VMOVImm,
Owen Andersonca6945e2010-12-01 00:28:25 +00004246 "vmov", "i8", "$Vd, $SIMM", "",
4247 [(set QPR:$Vd, (v16i8 (NEONvmovImm timm:$SIMM)))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004248
Owen Andersonca6945e2010-12-01 00:28:25 +00004249def VMOVv4i16 : N1ModImm<1, 0b000, {1,0,?,0}, 0, 0, 0, 1, (outs DPR:$Vd),
Bob Wilson1a913ed2010-06-11 21:34:50 +00004250 (ins nModImm:$SIMM), IIC_VMOVImm,
Owen Andersonca6945e2010-12-01 00:28:25 +00004251 "vmov", "i16", "$Vd, $SIMM", "",
4252 [(set DPR:$Vd, (v4i16 (NEONvmovImm timm:$SIMM)))]> {
Jim Grosbach1251e1a2010-11-18 01:39:50 +00004253 let Inst{9} = SIMM{9};
Owen Andersona88ea032010-10-26 17:40:54 +00004254}
4255
Owen Andersonca6945e2010-12-01 00:28:25 +00004256def VMOVv8i16 : N1ModImm<1, 0b000, {1,0,?,0}, 0, 1, 0, 1, (outs QPR:$Vd),
Bob Wilson1a913ed2010-06-11 21:34:50 +00004257 (ins nModImm:$SIMM), IIC_VMOVImm,
Owen Andersonca6945e2010-12-01 00:28:25 +00004258 "vmov", "i16", "$Vd, $SIMM", "",
4259 [(set QPR:$Vd, (v8i16 (NEONvmovImm timm:$SIMM)))]> {
Owen Andersona88ea032010-10-26 17:40:54 +00004260 let Inst{9} = SIMM{9};
4261}
Bob Wilson5bafff32009-06-22 23:27:02 +00004262
Owen Andersonca6945e2010-12-01 00:28:25 +00004263def VMOVv2i32 : N1ModImm<1, 0b000, {?,?,?,?}, 0, 0, 0, 1, (outs DPR:$Vd),
Bob Wilson1a913ed2010-06-11 21:34:50 +00004264 (ins nModImm:$SIMM), IIC_VMOVImm,
Owen Andersonca6945e2010-12-01 00:28:25 +00004265 "vmov", "i32", "$Vd, $SIMM", "",
4266 [(set DPR:$Vd, (v2i32 (NEONvmovImm timm:$SIMM)))]> {
Owen Andersona88ea032010-10-26 17:40:54 +00004267 let Inst{11-8} = SIMM{11-8};
4268}
4269
Owen Andersonca6945e2010-12-01 00:28:25 +00004270def VMOVv4i32 : N1ModImm<1, 0b000, {?,?,?,?}, 0, 1, 0, 1, (outs QPR:$Vd),
Bob Wilson1a913ed2010-06-11 21:34:50 +00004271 (ins nModImm:$SIMM), IIC_VMOVImm,
Owen Andersonca6945e2010-12-01 00:28:25 +00004272 "vmov", "i32", "$Vd, $SIMM", "",
4273 [(set QPR:$Vd, (v4i32 (NEONvmovImm timm:$SIMM)))]> {
Owen Andersona88ea032010-10-26 17:40:54 +00004274 let Inst{11-8} = SIMM{11-8};
4275}
Bob Wilson5bafff32009-06-22 23:27:02 +00004276
Owen Andersonca6945e2010-12-01 00:28:25 +00004277def VMOVv1i64 : N1ModImm<1, 0b000, 0b1110, 0, 0, 1, 1, (outs DPR:$Vd),
Bob Wilson1a913ed2010-06-11 21:34:50 +00004278 (ins nModImm:$SIMM), IIC_VMOVImm,
Owen Andersonca6945e2010-12-01 00:28:25 +00004279 "vmov", "i64", "$Vd, $SIMM", "",
4280 [(set DPR:$Vd, (v1i64 (NEONvmovImm timm:$SIMM)))]>;
4281def VMOVv2i64 : N1ModImm<1, 0b000, 0b1110, 0, 1, 1, 1, (outs QPR:$Vd),
Bob Wilson1a913ed2010-06-11 21:34:50 +00004282 (ins nModImm:$SIMM), IIC_VMOVImm,
Owen Andersonca6945e2010-12-01 00:28:25 +00004283 "vmov", "i64", "$Vd, $SIMM", "",
4284 [(set QPR:$Vd, (v2i64 (NEONvmovImm timm:$SIMM)))]>;
Evan Cheng47006be2010-05-17 21:54:50 +00004285} // isReMaterializable
Bob Wilson5bafff32009-06-22 23:27:02 +00004286
4287// VMOV : Vector Get Lane (move scalar to ARM core register)
4288
Johnny Chen131c4a52009-11-23 17:48:17 +00004289def VGETLNs8 : NVGetLane<{1,1,1,0,0,1,?,1}, 0b1011, {?,?},
Owen Andersond2fbdb72010-10-27 21:28:09 +00004290 (outs GPR:$R), (ins DPR:$V, nohash_imm:$lane),
4291 IIC_VMOVSI, "vmov", "s8", "$R, $V[$lane]",
4292 [(set GPR:$R, (NEONvgetlanes (v8i8 DPR:$V),
4293 imm:$lane))]> {
4294 let Inst{21} = lane{2};
4295 let Inst{6-5} = lane{1-0};
4296}
Johnny Chen131c4a52009-11-23 17:48:17 +00004297def VGETLNs16 : NVGetLane<{1,1,1,0,0,0,?,1}, 0b1011, {?,1},
Owen Andersond2fbdb72010-10-27 21:28:09 +00004298 (outs GPR:$R), (ins DPR:$V, nohash_imm:$lane),
4299 IIC_VMOVSI, "vmov", "s16", "$R, $V[$lane]",
4300 [(set GPR:$R, (NEONvgetlanes (v4i16 DPR:$V),
4301 imm:$lane))]> {
4302 let Inst{21} = lane{1};
4303 let Inst{6} = lane{0};
4304}
Johnny Chen131c4a52009-11-23 17:48:17 +00004305def VGETLNu8 : NVGetLane<{1,1,1,0,1,1,?,1}, 0b1011, {?,?},
Owen Andersond2fbdb72010-10-27 21:28:09 +00004306 (outs GPR:$R), (ins DPR:$V, nohash_imm:$lane),
4307 IIC_VMOVSI, "vmov", "u8", "$R, $V[$lane]",
4308 [(set GPR:$R, (NEONvgetlaneu (v8i8 DPR:$V),
4309 imm:$lane))]> {
4310 let Inst{21} = lane{2};
4311 let Inst{6-5} = lane{1-0};
4312}
Johnny Chen131c4a52009-11-23 17:48:17 +00004313def VGETLNu16 : NVGetLane<{1,1,1,0,1,0,?,1}, 0b1011, {?,1},
Owen Andersond2fbdb72010-10-27 21:28:09 +00004314 (outs GPR:$R), (ins DPR:$V, nohash_imm:$lane),
4315 IIC_VMOVSI, "vmov", "u16", "$R, $V[$lane]",
4316 [(set GPR:$R, (NEONvgetlaneu (v4i16 DPR:$V),
4317 imm:$lane))]> {
4318 let Inst{21} = lane{1};
4319 let Inst{6} = lane{0};
4320}
Johnny Chen131c4a52009-11-23 17:48:17 +00004321def VGETLNi32 : NVGetLane<{1,1,1,0,0,0,?,1}, 0b1011, 0b00,
Owen Andersond2fbdb72010-10-27 21:28:09 +00004322 (outs GPR:$R), (ins DPR:$V, nohash_imm:$lane),
4323 IIC_VMOVSI, "vmov", "32", "$R, $V[$lane]",
4324 [(set GPR:$R, (extractelt (v2i32 DPR:$V),
4325 imm:$lane))]> {
4326 let Inst{21} = lane{0};
4327}
Bob Wilson5bafff32009-06-22 23:27:02 +00004328// def VGETLNf32: see FMRDH and FMRDL in ARMInstrVFP.td
4329def : Pat<(NEONvgetlanes (v16i8 QPR:$src), imm:$lane),
4330 (VGETLNs8 (v8i8 (EXTRACT_SUBREG QPR:$src,
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00004331 (DSubReg_i8_reg imm:$lane))),
Bob Wilson5bafff32009-06-22 23:27:02 +00004332 (SubReg_i8_lane imm:$lane))>;
4333def : Pat<(NEONvgetlanes (v8i16 QPR:$src), imm:$lane),
4334 (VGETLNs16 (v4i16 (EXTRACT_SUBREG QPR:$src,
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00004335 (DSubReg_i16_reg imm:$lane))),
Bob Wilson5bafff32009-06-22 23:27:02 +00004336 (SubReg_i16_lane imm:$lane))>;
4337def : Pat<(NEONvgetlaneu (v16i8 QPR:$src), imm:$lane),
4338 (VGETLNu8 (v8i8 (EXTRACT_SUBREG QPR:$src,
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00004339 (DSubReg_i8_reg imm:$lane))),
Bob Wilson5bafff32009-06-22 23:27:02 +00004340 (SubReg_i8_lane imm:$lane))>;
4341def : Pat<(NEONvgetlaneu (v8i16 QPR:$src), imm:$lane),
4342 (VGETLNu16 (v4i16 (EXTRACT_SUBREG QPR:$src,
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00004343 (DSubReg_i16_reg imm:$lane))),
Bob Wilson5bafff32009-06-22 23:27:02 +00004344 (SubReg_i16_lane imm:$lane))>;
4345def : Pat<(extractelt (v4i32 QPR:$src), imm:$lane),
4346 (VGETLNi32 (v2i32 (EXTRACT_SUBREG QPR:$src,
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00004347 (DSubReg_i32_reg imm:$lane))),
Bob Wilson5bafff32009-06-22 23:27:02 +00004348 (SubReg_i32_lane imm:$lane))>;
Anton Korobeynikov2324bdc2009-08-28 23:41:26 +00004349def : Pat<(extractelt (v2f32 DPR:$src1), imm:$src2),
Bob Wilson9abe19d2010-02-17 00:31:29 +00004350 (EXTRACT_SUBREG (v2f32 (COPY_TO_REGCLASS (v2f32 DPR:$src1),DPR_VFP2)),
Anton Korobeynikove56f9082009-09-12 22:21:08 +00004351 (SSubReg_f32_reg imm:$src2))>;
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00004352def : Pat<(extractelt (v4f32 QPR:$src1), imm:$src2),
Bob Wilson9abe19d2010-02-17 00:31:29 +00004353 (EXTRACT_SUBREG (v4f32 (COPY_TO_REGCLASS (v4f32 QPR:$src1),QPR_VFP2)),
Anton Korobeynikove56f9082009-09-12 22:21:08 +00004354 (SSubReg_f32_reg imm:$src2))>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004355//def : Pat<(extractelt (v2i64 QPR:$src1), imm:$src2),
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00004356// (EXTRACT_SUBREG QPR:$src1, (DSubReg_f64_reg imm:$src2))>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004357def : Pat<(extractelt (v2f64 QPR:$src1), imm:$src2),
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00004358 (EXTRACT_SUBREG QPR:$src1, (DSubReg_f64_reg imm:$src2))>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004359
4360
4361// VMOV : Vector Set Lane (move ARM core register to scalar)
4362
Owen Andersond2fbdb72010-10-27 21:28:09 +00004363let Constraints = "$src1 = $V" in {
4364def VSETLNi8 : NVSetLane<{1,1,1,0,0,1,?,0}, 0b1011, {?,?}, (outs DPR:$V),
4365 (ins DPR:$src1, GPR:$R, nohash_imm:$lane),
4366 IIC_VMOVISL, "vmov", "8", "$V[$lane], $R",
4367 [(set DPR:$V, (vector_insert (v8i8 DPR:$src1),
4368 GPR:$R, imm:$lane))]> {
4369 let Inst{21} = lane{2};
4370 let Inst{6-5} = lane{1-0};
4371}
4372def VSETLNi16 : NVSetLane<{1,1,1,0,0,0,?,0}, 0b1011, {?,1}, (outs DPR:$V),
4373 (ins DPR:$src1, GPR:$R, nohash_imm:$lane),
4374 IIC_VMOVISL, "vmov", "16", "$V[$lane], $R",
4375 [(set DPR:$V, (vector_insert (v4i16 DPR:$src1),
4376 GPR:$R, imm:$lane))]> {
4377 let Inst{21} = lane{1};
4378 let Inst{6} = lane{0};
4379}
4380def VSETLNi32 : NVSetLane<{1,1,1,0,0,0,?,0}, 0b1011, 0b00, (outs DPR:$V),
4381 (ins DPR:$src1, GPR:$R, nohash_imm:$lane),
4382 IIC_VMOVISL, "vmov", "32", "$V[$lane], $R",
4383 [(set DPR:$V, (insertelt (v2i32 DPR:$src1),
4384 GPR:$R, imm:$lane))]> {
4385 let Inst{21} = lane{0};
4386}
Bob Wilson5bafff32009-06-22 23:27:02 +00004387}
4388def : Pat<(vector_insert (v16i8 QPR:$src1), GPR:$src2, imm:$lane),
Jim Grosbach1251e1a2010-11-18 01:39:50 +00004389 (v16i8 (INSERT_SUBREG QPR:$src1,
Chris Lattnerd10a53d2010-03-08 18:51:21 +00004390 (v8i8 (VSETLNi8 (v8i8 (EXTRACT_SUBREG QPR:$src1,
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00004391 (DSubReg_i8_reg imm:$lane))),
Chris Lattnerd10a53d2010-03-08 18:51:21 +00004392 GPR:$src2, (SubReg_i8_lane imm:$lane))),
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00004393 (DSubReg_i8_reg imm:$lane)))>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004394def : Pat<(vector_insert (v8i16 QPR:$src1), GPR:$src2, imm:$lane),
Jim Grosbach1251e1a2010-11-18 01:39:50 +00004395 (v8i16 (INSERT_SUBREG QPR:$src1,
Chris Lattnerd10a53d2010-03-08 18:51:21 +00004396 (v4i16 (VSETLNi16 (v4i16 (EXTRACT_SUBREG QPR:$src1,
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00004397 (DSubReg_i16_reg imm:$lane))),
Chris Lattnerd10a53d2010-03-08 18:51:21 +00004398 GPR:$src2, (SubReg_i16_lane imm:$lane))),
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00004399 (DSubReg_i16_reg imm:$lane)))>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004400def : Pat<(insertelt (v4i32 QPR:$src1), GPR:$src2, imm:$lane),
Jim Grosbach1251e1a2010-11-18 01:39:50 +00004401 (v4i32 (INSERT_SUBREG QPR:$src1,
Chris Lattnerd10a53d2010-03-08 18:51:21 +00004402 (v2i32 (VSETLNi32 (v2i32 (EXTRACT_SUBREG QPR:$src1,
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00004403 (DSubReg_i32_reg imm:$lane))),
Chris Lattnerd10a53d2010-03-08 18:51:21 +00004404 GPR:$src2, (SubReg_i32_lane imm:$lane))),
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00004405 (DSubReg_i32_reg imm:$lane)))>;
4406
Anton Korobeynikovd91aafd2009-08-30 19:06:39 +00004407def : Pat<(v2f32 (insertelt DPR:$src1, SPR:$src2, imm:$src3)),
Anton Korobeynikov3a639a02009-11-02 00:11:39 +00004408 (INSERT_SUBREG (v2f32 (COPY_TO_REGCLASS DPR:$src1, DPR_VFP2)),
4409 SPR:$src2, (SSubReg_f32_reg imm:$src3))>;
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00004410def : Pat<(v4f32 (insertelt QPR:$src1, SPR:$src2, imm:$src3)),
Anton Korobeynikov3a639a02009-11-02 00:11:39 +00004411 (INSERT_SUBREG (v4f32 (COPY_TO_REGCLASS QPR:$src1, QPR_VFP2)),
4412 SPR:$src2, (SSubReg_f32_reg imm:$src3))>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004413
4414//def : Pat<(v2i64 (insertelt QPR:$src1, DPR:$src2, imm:$src3)),
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00004415// (INSERT_SUBREG QPR:$src1, DPR:$src2, (DSubReg_f64_reg imm:$src3))>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004416def : Pat<(v2f64 (insertelt QPR:$src1, DPR:$src2, imm:$src3)),
Anton Korobeynikov06af2ba2009-08-08 14:06:07 +00004417 (INSERT_SUBREG QPR:$src1, DPR:$src2, (DSubReg_f64_reg imm:$src3))>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004418
Anton Korobeynikovfdf189a2009-08-27 14:38:44 +00004419def : Pat<(v2f32 (scalar_to_vector SPR:$src)),
Jakob Stoklund Olesen558661d2010-05-24 16:54:32 +00004420 (INSERT_SUBREG (v2f32 (IMPLICIT_DEF)), SPR:$src, ssub_0)>;
Chris Lattner77144e72010-03-15 00:52:43 +00004421def : Pat<(v2f64 (scalar_to_vector (f64 DPR:$src))),
Jakob Stoklund Olesen558661d2010-05-24 16:54:32 +00004422 (INSERT_SUBREG (v2f64 (IMPLICIT_DEF)), DPR:$src, dsub_0)>;
Anton Korobeynikovfdf189a2009-08-27 14:38:44 +00004423def : Pat<(v4f32 (scalar_to_vector SPR:$src)),
Jakob Stoklund Olesen558661d2010-05-24 16:54:32 +00004424 (INSERT_SUBREG (v4f32 (IMPLICIT_DEF)), SPR:$src, ssub_0)>;
Anton Korobeynikovfdf189a2009-08-27 14:38:44 +00004425
Anton Korobeynikovb5cdf872009-08-27 16:10:17 +00004426def : Pat<(v8i8 (scalar_to_vector GPR:$src)),
4427 (VSETLNi8 (v8i8 (IMPLICIT_DEF)), GPR:$src, (i32 0))>;
4428def : Pat<(v4i16 (scalar_to_vector GPR:$src)),
4429 (VSETLNi16 (v4i16 (IMPLICIT_DEF)), GPR:$src, (i32 0))>;
4430def : Pat<(v2i32 (scalar_to_vector GPR:$src)),
4431 (VSETLNi32 (v2i32 (IMPLICIT_DEF)), GPR:$src, (i32 0))>;
4432
4433def : Pat<(v16i8 (scalar_to_vector GPR:$src)),
4434 (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
4435 (VSETLNi8 (v8i8 (IMPLICIT_DEF)), GPR:$src, (i32 0)),
Jakob Stoklund Olesen558661d2010-05-24 16:54:32 +00004436 dsub_0)>;
Anton Korobeynikovb5cdf872009-08-27 16:10:17 +00004437def : Pat<(v8i16 (scalar_to_vector GPR:$src)),
4438 (INSERT_SUBREG (v8i16 (IMPLICIT_DEF)),
4439 (VSETLNi16 (v4i16 (IMPLICIT_DEF)), GPR:$src, (i32 0)),
Jakob Stoklund Olesen558661d2010-05-24 16:54:32 +00004440 dsub_0)>;
Anton Korobeynikovb5cdf872009-08-27 16:10:17 +00004441def : Pat<(v4i32 (scalar_to_vector GPR:$src)),
4442 (INSERT_SUBREG (v4i32 (IMPLICIT_DEF)),
4443 (VSETLNi32 (v2i32 (IMPLICIT_DEF)), GPR:$src, (i32 0)),
Jakob Stoklund Olesen558661d2010-05-24 16:54:32 +00004444 dsub_0)>;
Anton Korobeynikovb5cdf872009-08-27 16:10:17 +00004445
Bob Wilson5bafff32009-06-22 23:27:02 +00004446// VDUP : Vector Duplicate (from ARM core register to all elements)
4447
Evan Chengf81bf152009-11-23 21:57:23 +00004448class VDUPD<bits<8> opcod1, bits<2> opcod3, string Dt, ValueType Ty>
Owen Andersonca6945e2010-12-01 00:28:25 +00004449 : NVDup<opcod1, 0b1011, opcod3, (outs DPR:$V), (ins GPR:$R),
4450 IIC_VMOVIS, "vdup", Dt, "$V, $R",
4451 [(set DPR:$V, (Ty (NEONvdup (i32 GPR:$R))))]>;
Evan Chengf81bf152009-11-23 21:57:23 +00004452class VDUPQ<bits<8> opcod1, bits<2> opcod3, string Dt, ValueType Ty>
Owen Andersonca6945e2010-12-01 00:28:25 +00004453 : NVDup<opcod1, 0b1011, opcod3, (outs QPR:$V), (ins GPR:$R),
4454 IIC_VMOVIS, "vdup", Dt, "$V, $R",
4455 [(set QPR:$V, (Ty (NEONvdup (i32 GPR:$R))))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004456
Evan Chengf81bf152009-11-23 21:57:23 +00004457def VDUP8d : VDUPD<0b11101100, 0b00, "8", v8i8>;
4458def VDUP16d : VDUPD<0b11101000, 0b01, "16", v4i16>;
4459def VDUP32d : VDUPD<0b11101000, 0b00, "32", v2i32>;
4460def VDUP8q : VDUPQ<0b11101110, 0b00, "8", v16i8>;
4461def VDUP16q : VDUPQ<0b11101010, 0b01, "16", v8i16>;
4462def VDUP32q : VDUPQ<0b11101010, 0b00, "32", v4i32>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004463
Jim Grosbach958108a2011-03-11 20:44:08 +00004464def : Pat<(v2f32 (NEONvdup (f32 (bitconvert GPR:$R)))), (VDUP32d GPR:$R)>;
4465def : Pat<(v4f32 (NEONvdup (f32 (bitconvert GPR:$R)))), (VDUP32q GPR:$R)>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004466
4467// VDUP : Vector Duplicate Lane (from scalar to all elements)
4468
Johnny Chene4614f72010-03-25 17:01:27 +00004469class VDUPLND<bits<4> op19_16, string OpcodeStr, string Dt,
4470 ValueType Ty>
Owen Andersonca6945e2010-12-01 00:28:25 +00004471 : NVDupLane<op19_16, 0, (outs DPR:$Vd), (ins DPR:$Vm, nohash_imm:$lane),
4472 IIC_VMOVD, OpcodeStr, Dt, "$Vd, $Vm[$lane]",
4473 [(set DPR:$Vd, (Ty (NEONvduplane (Ty DPR:$Vm), imm:$lane)))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004474
Johnny Chene4614f72010-03-25 17:01:27 +00004475class VDUPLNQ<bits<4> op19_16, string OpcodeStr, string Dt,
Johnny Chenda1aea42009-11-23 21:00:43 +00004476 ValueType ResTy, ValueType OpTy>
Owen Andersonca6945e2010-12-01 00:28:25 +00004477 : NVDupLane<op19_16, 1, (outs QPR:$Vd), (ins DPR:$Vm, nohash_imm:$lane),
4478 IIC_VMOVQ, OpcodeStr, Dt, "$Vd, $Vm[$lane]",
4479 [(set QPR:$Vd, (ResTy (NEONvduplane (OpTy DPR:$Vm),
Johnny Chene4614f72010-03-25 17:01:27 +00004480 imm:$lane)))]>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004481
Bob Wilson507df402009-10-21 02:15:46 +00004482// Inst{19-16} is partially specified depending on the element size.
4483
Owen Andersonf587a932010-10-27 19:25:54 +00004484def VDUPLN8d : VDUPLND<{?,?,?,1}, "vdup", "8", v8i8> {
4485 let Inst{19-17} = lane{2-0};
4486}
4487def VDUPLN16d : VDUPLND<{?,?,1,0}, "vdup", "16", v4i16> {
4488 let Inst{19-18} = lane{1-0};
4489}
4490def VDUPLN32d : VDUPLND<{?,1,0,0}, "vdup", "32", v2i32> {
4491 let Inst{19} = lane{0};
4492}
Owen Andersonf587a932010-10-27 19:25:54 +00004493def VDUPLN8q : VDUPLNQ<{?,?,?,1}, "vdup", "8", v16i8, v8i8> {
4494 let Inst{19-17} = lane{2-0};
4495}
4496def VDUPLN16q : VDUPLNQ<{?,?,1,0}, "vdup", "16", v8i16, v4i16> {
4497 let Inst{19-18} = lane{1-0};
4498}
4499def VDUPLN32q : VDUPLNQ<{?,1,0,0}, "vdup", "32", v4i32, v2i32> {
4500 let Inst{19} = lane{0};
4501}
Jim Grosbach8b8515c2011-03-11 20:31:17 +00004502
4503def : Pat<(v2f32 (NEONvduplane (v2f32 DPR:$Vm), imm:$lane)),
4504 (VDUPLN32d DPR:$Vm, imm:$lane)>;
4505
4506def : Pat<(v4f32 (NEONvduplane (v2f32 DPR:$Vm), imm:$lane)),
4507 (VDUPLN32q DPR:$Vm, imm:$lane)>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004508
Bob Wilson0ce37102009-08-14 05:08:32 +00004509def : Pat<(v16i8 (NEONvduplane (v16i8 QPR:$src), imm:$lane)),
4510 (v16i8 (VDUPLN8q (v8i8 (EXTRACT_SUBREG QPR:$src,
4511 (DSubReg_i8_reg imm:$lane))),
4512 (SubReg_i8_lane imm:$lane)))>;
4513def : Pat<(v8i16 (NEONvduplane (v8i16 QPR:$src), imm:$lane)),
4514 (v8i16 (VDUPLN16q (v4i16 (EXTRACT_SUBREG QPR:$src,
4515 (DSubReg_i16_reg imm:$lane))),
4516 (SubReg_i16_lane imm:$lane)))>;
4517def : Pat<(v4i32 (NEONvduplane (v4i32 QPR:$src), imm:$lane)),
4518 (v4i32 (VDUPLN32q (v2i32 (EXTRACT_SUBREG QPR:$src,
4519 (DSubReg_i32_reg imm:$lane))),
4520 (SubReg_i32_lane imm:$lane)))>;
4521def : Pat<(v4f32 (NEONvduplane (v4f32 QPR:$src), imm:$lane)),
Jim Grosbach8b8515c2011-03-11 20:31:17 +00004522 (v4f32 (VDUPLN32q (v2f32 (EXTRACT_SUBREG QPR:$src,
Bob Wilson0ce37102009-08-14 05:08:32 +00004523 (DSubReg_i32_reg imm:$lane))),
4524 (SubReg_i32_lane imm:$lane)))>;
4525
Jim Grosbach65dc3032010-10-06 21:16:16 +00004526def VDUPfdf : PseudoNeonI<(outs DPR:$dst), (ins SPR:$src), IIC_VMOVD, "",
Johnny Chenda1aea42009-11-23 21:00:43 +00004527 [(set DPR:$dst, (v2f32 (NEONvdup (f32 SPR:$src))))]>;
Jim Grosbach65dc3032010-10-06 21:16:16 +00004528def VDUPfqf : PseudoNeonI<(outs QPR:$dst), (ins SPR:$src), IIC_VMOVD, "",
Johnny Chenda1aea42009-11-23 21:00:43 +00004529 [(set QPR:$dst, (v4f32 (NEONvdup (f32 SPR:$src))))]>;
Anton Korobeynikov32a1b252009-08-07 22:36:50 +00004530
Bob Wilson5bafff32009-06-22 23:27:02 +00004531// VMOVN : Vector Narrowing Move
Evan Chengcae6a122010-10-01 20:50:58 +00004532defm VMOVN : N2VN_HSD<0b11,0b11,0b10,0b00100,0,0, IIC_VMOVN,
Bob Wilson973a0742010-08-30 20:02:30 +00004533 "vmovn", "i", trunc>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004534// VQMOVN : Vector Saturating Narrowing Move
Evan Chengf81bf152009-11-23 21:57:23 +00004535defm VQMOVNs : N2VNInt_HSD<0b11,0b11,0b10,0b00101,0,0, IIC_VQUNAiD,
4536 "vqmovn", "s", int_arm_neon_vqmovns>;
4537defm VQMOVNu : N2VNInt_HSD<0b11,0b11,0b10,0b00101,1,0, IIC_VQUNAiD,
4538 "vqmovn", "u", int_arm_neon_vqmovnu>;
4539defm VQMOVNsu : N2VNInt_HSD<0b11,0b11,0b10,0b00100,1,0, IIC_VQUNAiD,
4540 "vqmovun", "s", int_arm_neon_vqmovnsu>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004541// VMOVL : Vector Lengthening Move
Bob Wilsonb31a11b2010-08-20 04:54:02 +00004542defm VMOVLs : N2VL_QHS<0b01,0b10100,0,1, "vmovl", "s", sext>;
4543defm VMOVLu : N2VL_QHS<0b11,0b10100,0,1, "vmovl", "u", zext>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004544
4545// Vector Conversions.
4546
Johnny Chen9e088762010-03-17 17:52:21 +00004547// VCVT : Vector Convert Between Floating-Point and Integers
Johnny Chen6c8648b2010-03-17 23:26:50 +00004548def VCVTf2sd : N2VD<0b11, 0b11, 0b10, 0b11, 0b01110, 0, "vcvt", "s32.f32",
4549 v2i32, v2f32, fp_to_sint>;
4550def VCVTf2ud : N2VD<0b11, 0b11, 0b10, 0b11, 0b01111, 0, "vcvt", "u32.f32",
4551 v2i32, v2f32, fp_to_uint>;
4552def VCVTs2fd : N2VD<0b11, 0b11, 0b10, 0b11, 0b01100, 0, "vcvt", "f32.s32",
4553 v2f32, v2i32, sint_to_fp>;
4554def VCVTu2fd : N2VD<0b11, 0b11, 0b10, 0b11, 0b01101, 0, "vcvt", "f32.u32",
4555 v2f32, v2i32, uint_to_fp>;
Johnny Chen9e088762010-03-17 17:52:21 +00004556
Johnny Chen6c8648b2010-03-17 23:26:50 +00004557def VCVTf2sq : N2VQ<0b11, 0b11, 0b10, 0b11, 0b01110, 0, "vcvt", "s32.f32",
4558 v4i32, v4f32, fp_to_sint>;
4559def VCVTf2uq : N2VQ<0b11, 0b11, 0b10, 0b11, 0b01111, 0, "vcvt", "u32.f32",
4560 v4i32, v4f32, fp_to_uint>;
4561def VCVTs2fq : N2VQ<0b11, 0b11, 0b10, 0b11, 0b01100, 0, "vcvt", "f32.s32",
4562 v4f32, v4i32, sint_to_fp>;
4563def VCVTu2fq : N2VQ<0b11, 0b11, 0b10, 0b11, 0b01101, 0, "vcvt", "f32.u32",
4564 v4f32, v4i32, uint_to_fp>;
Bob Wilson5bafff32009-06-22 23:27:02 +00004565
4566// VCVT : Vector Convert Between Floating-Point and Fixed-Point.
Evan Chengf81bf152009-11-23 21:57:23 +00004567def VCVTf2xsd : N2VCvtD<0, 1, 0b1111, 0, 1, "vcvt", "s32.f32",
Bob Wilson5bafff32009-06-22 23:27:02 +00004568 v2i32, v2f32, int_arm_neon_vcvtfp2fxs>;
Evan Chengf81bf152009-11-23 21:57:23 +00004569def VCVTf2xud : N2VCvtD<1, 1, 0b1111, 0, 1, "vcvt", "u32.f32",
Bob Wilson5bafff32009-06-22 23:27:02 +00004570 v2i32, v2f32, int_arm_neon_vcvtfp2fxu>;
Evan Chengf81bf152009-11-23 21:57:23 +00004571def VCVTxs2fd : N2VCvtD<0, 1, 0b1110, 0, 1, "vcvt", "f32.s32",
Bob Wilson5bafff32009-06-22 23:27:02 +00004572 v2f32, v2i32, int_arm_neon_vcvtfxs2fp>;
Evan Chengf81bf152009-11-23 21:57:23 +00004573def VCVTxu2fd : N2VCvtD<1, 1, 0b1110, 0, 1, "vcvt", "f32.u32",
Bob Wilson5bafff32009-06-22 23:27:02 +00004574 v2f32, v2i32, int_arm_neon_vcvtfxu2fp>;
4575
Evan Chengf81bf152009-11-23 21:57:23 +00004576def VCVTf2xsq : N2VCvtQ<0, 1, 0b1111, 0, 1, "vcvt", "s32.f32",
Bob Wilson5bafff32009-06-22 23:27:02 +00004577 v4i32, v4f32, int_arm_neon_vcvtfp2fxs>;
Evan Chengf81bf152009-11-23 21:57:23 +00004578def VCVTf2xuq : N2VCvtQ<1, 1, 0b1111, 0, 1, "vcvt", "u32.f32",
Bob Wilson5bafff32009-06-22 23:27:02 +00004579 v4i32, v4f32, int_arm_neon_vcvtfp2fxu>;
Evan Chengf81bf152009-11-23 21:57:23 +00004580def VCVTxs2fq : N2VCvtQ<0, 1, 0b1110, 0, 1, "vcvt", "f32.s32",
Bob Wilson5bafff32009-06-22 23:27:02 +00004581 v4f32, v4i32, int_arm_neon_vcvtfxs2fp>;
Evan Chengf81bf152009-11-23 21:57:23 +00004582def VCVTxu2fq : N2VCvtQ<1, 1, 0b1110, 0, 1, "vcvt", "f32.u32",
Bob Wilson5bafff32009-06-22 23:27:02 +00004583 v4f32, v4i32, int_arm_neon_vcvtfxu2fp>;
4584
Bob Wilson04063562010-12-15 22:14:12 +00004585// VCVT : Vector Convert Between Half-Precision and Single-Precision.
4586def VCVTf2h : N2VNInt<0b11, 0b11, 0b01, 0b10, 0b01100, 0, 0,
4587 IIC_VUNAQ, "vcvt", "f16.f32",
4588 v4i16, v4f32, int_arm_neon_vcvtfp2hf>,
4589 Requires<[HasNEON, HasFP16]>;
4590def VCVTh2f : N2VLInt<0b11, 0b11, 0b01, 0b10, 0b01110, 0, 0,
4591 IIC_VUNAQ, "vcvt", "f32.f16",
4592 v4f32, v4i16, int_arm_neon_vcvthf2fp>,
4593 Requires<[HasNEON, HasFP16]>;
4594
Bob Wilsond8e17572009-08-12 22:31:50 +00004595// Vector Reverse.
Bob Wilson8bb9e482009-07-26 00:39:34 +00004596
4597// VREV64 : Vector Reverse elements within 64-bit doublewords
4598
Evan Chengf81bf152009-11-23 21:57:23 +00004599class VREV64D<bits<2> op19_18, string OpcodeStr, string Dt, ValueType Ty>
Owen Andersonaa545242010-11-21 06:47:06 +00004600 : N2V<0b11, 0b11, op19_18, 0b00, 0b00000, 0, 0, (outs DPR:$Vd),
4601 (ins DPR:$Vm), IIC_VMOVD,
4602 OpcodeStr, Dt, "$Vd, $Vm", "",
4603 [(set DPR:$Vd, (Ty (NEONvrev64 (Ty DPR:$Vm))))]>;
Evan Chengf81bf152009-11-23 21:57:23 +00004604class VREV64Q<bits<2> op19_18, string OpcodeStr, string Dt, ValueType Ty>
Owen Andersonaa545242010-11-21 06:47:06 +00004605 : N2V<0b11, 0b11, op19_18, 0b00, 0b00000, 1, 0, (outs QPR:$Vd),
4606 (ins QPR:$Vm), IIC_VMOVQ,
4607 OpcodeStr, Dt, "$Vd, $Vm", "",
4608 [(set QPR:$Vd, (Ty (NEONvrev64 (Ty QPR:$Vm))))]>;
Bob Wilson8bb9e482009-07-26 00:39:34 +00004609
Evan Chengf81bf152009-11-23 21:57:23 +00004610def VREV64d8 : VREV64D<0b00, "vrev64", "8", v8i8>;
4611def VREV64d16 : VREV64D<0b01, "vrev64", "16", v4i16>;
4612def VREV64d32 : VREV64D<0b10, "vrev64", "32", v2i32>;
Jim Grosbach1558df72011-03-11 20:18:05 +00004613def : Pat<(v2f32 (NEONvrev64 (v2f32 DPR:$Vm))), (VREV64d32 DPR:$Vm)>;
Bob Wilson8bb9e482009-07-26 00:39:34 +00004614
Evan Chengf81bf152009-11-23 21:57:23 +00004615def VREV64q8 : VREV64Q<0b00, "vrev64", "8", v16i8>;
4616def VREV64q16 : VREV64Q<0b01, "vrev64", "16", v8i16>;
4617def VREV64q32 : VREV64Q<0b10, "vrev64", "32", v4i32>;
Jim Grosbach1558df72011-03-11 20:18:05 +00004618def : Pat<(v4f32 (NEONvrev64 (v4f32 QPR:$Vm))), (VREV64q32 QPR:$Vm)>;
Bob Wilson8bb9e482009-07-26 00:39:34 +00004619
4620// VREV32 : Vector Reverse elements within 32-bit words
4621
Evan Chengf81bf152009-11-23 21:57:23 +00004622class VREV32D<bits<2> op19_18, string OpcodeStr, string Dt, ValueType Ty>
Owen Andersonaa545242010-11-21 06:47:06 +00004623 : N2V<0b11, 0b11, op19_18, 0b00, 0b00001, 0, 0, (outs DPR:$Vd),
4624 (ins DPR:$Vm), IIC_VMOVD,
4625 OpcodeStr, Dt, "$Vd, $Vm", "",
4626 [(set DPR:$Vd, (Ty (NEONvrev32 (Ty DPR:$Vm))))]>;
Evan Chengf81bf152009-11-23 21:57:23 +00004627class VREV32Q<bits<2> op19_18, string OpcodeStr, string Dt, ValueType Ty>
Owen Andersonaa545242010-11-21 06:47:06 +00004628 : N2V<0b11, 0b11, op19_18, 0b00, 0b00001, 1, 0, (outs QPR:$Vd),
4629 (ins QPR:$Vm), IIC_VMOVQ,
4630 OpcodeStr, Dt, "$Vd, $Vm", "",
4631 [(set QPR:$Vd, (Ty (NEONvrev32 (Ty QPR:$Vm))))]>;
Bob Wilson8bb9e482009-07-26 00:39:34 +00004632
Evan Chengf81bf152009-11-23 21:57:23 +00004633def VREV32d8 : VREV32D<0b00, "vrev32", "8", v8i8>;
4634def VREV32d16 : VREV32D<0b01, "vrev32", "16", v4i16>;
Bob Wilson8bb9e482009-07-26 00:39:34 +00004635
Evan Chengf81bf152009-11-23 21:57:23 +00004636def VREV32q8 : VREV32Q<0b00, "vrev32", "8", v16i8>;
4637def VREV32q16 : VREV32Q<0b01, "vrev32", "16", v8i16>;
Bob Wilson8bb9e482009-07-26 00:39:34 +00004638
4639// VREV16 : Vector Reverse elements within 16-bit halfwords
4640
Evan Chengf81bf152009-11-23 21:57:23 +00004641class VREV16D<bits<2> op19_18, string OpcodeStr, string Dt, ValueType Ty>
Owen Andersonaa545242010-11-21 06:47:06 +00004642 : N2V<0b11, 0b11, op19_18, 0b00, 0b00010, 0, 0, (outs DPR:$Vd),
4643 (ins DPR:$Vm), IIC_VMOVD,
4644 OpcodeStr, Dt, "$Vd, $Vm", "",
4645 [(set DPR:$Vd, (Ty (NEONvrev16 (Ty DPR:$Vm))))]>;
Evan Chengf81bf152009-11-23 21:57:23 +00004646class VREV16Q<bits<2> op19_18, string OpcodeStr, string Dt, ValueType Ty>
Owen Andersonaa545242010-11-21 06:47:06 +00004647 : N2V<0b11, 0b11, op19_18, 0b00, 0b00010, 1, 0, (outs QPR:$Vd),
4648 (ins QPR:$Vm), IIC_VMOVQ,
4649 OpcodeStr, Dt, "$Vd, $Vm", "",
4650 [(set QPR:$Vd, (Ty (NEONvrev16 (Ty QPR:$Vm))))]>;
Bob Wilson8bb9e482009-07-26 00:39:34 +00004651
Evan Chengf81bf152009-11-23 21:57:23 +00004652def VREV16d8 : VREV16D<0b00, "vrev16", "8", v8i8>;
4653def VREV16q8 : VREV16Q<0b00, "vrev16", "8", v16i8>;
Bob Wilson8bb9e482009-07-26 00:39:34 +00004654
Bob Wilsonde95c1b82009-08-19 17:03:43 +00004655// Other Vector Shuffles.
4656
Bob Wilson5e8b8332011-01-07 04:59:04 +00004657// Aligned extractions: really just dropping registers
4658
4659class AlignedVEXTq<ValueType DestTy, ValueType SrcTy, SDNodeXForm LaneCVT>
4660 : Pat<(DestTy (vector_extract_subvec (SrcTy QPR:$src), (i32 imm:$start))),
4661 (EXTRACT_SUBREG (SrcTy QPR:$src), (LaneCVT imm:$start))>;
4662
4663def : AlignedVEXTq<v8i8, v16i8, DSubReg_i8_reg>;
4664
4665def : AlignedVEXTq<v4i16, v8i16, DSubReg_i16_reg>;
4666
4667def : AlignedVEXTq<v2i32, v4i32, DSubReg_i32_reg>;
4668
4669def : AlignedVEXTq<v1i64, v2i64, DSubReg_f64_reg>;
4670
4671def : AlignedVEXTq<v2f32, v4f32, DSubReg_i32_reg>;
4672
4673
Bob Wilsonde95c1b82009-08-19 17:03:43 +00004674// VEXT : Vector Extract
4675
Evan Chengf81bf152009-11-23 21:57:23 +00004676class VEXTd<string OpcodeStr, string Dt, ValueType Ty>
Owen Andersonaa545242010-11-21 06:47:06 +00004677 : N3V<0,1,0b11,{?,?,?,?},0,0, (outs DPR:$Vd),
4678 (ins DPR:$Vn, DPR:$Vm, i32imm:$index), NVExtFrm,
4679 IIC_VEXTD, OpcodeStr, Dt, "$Vd, $Vn, $Vm, $index", "",
4680 [(set DPR:$Vd, (Ty (NEONvext (Ty DPR:$Vn),
4681 (Ty DPR:$Vm), imm:$index)))]> {
Owen Anderson3eff4af2010-10-27 23:56:39 +00004682 bits<4> index;
4683 let Inst{11-8} = index{3-0};
4684}
Anton Korobeynikov5da894f2009-08-21 12:40:21 +00004685
Evan Chengf81bf152009-11-23 21:57:23 +00004686class VEXTq<string OpcodeStr, string Dt, ValueType Ty>
Owen Andersonaa545242010-11-21 06:47:06 +00004687 : N3V<0,1,0b11,{?,?,?,?},1,0, (outs QPR:$Vd),
4688 (ins QPR:$Vn, QPR:$Vm, i32imm:$index), NVExtFrm,
4689 IIC_VEXTQ, OpcodeStr, Dt, "$Vd, $Vn, $Vm, $index", "",
4690 [(set QPR:$Vd, (Ty (NEONvext (Ty QPR:$Vn),
4691 (Ty QPR:$Vm), imm:$index)))]> {
Owen Anderson3eff4af2010-10-27 23:56:39 +00004692 bits<4> index;
4693 let Inst{11-8} = index{3-0};
4694}
Anton Korobeynikov5da894f2009-08-21 12:40:21 +00004695
Owen Anderson7a258252010-11-03 18:16:27 +00004696def VEXTd8 : VEXTd<"vext", "8", v8i8> {
4697 let Inst{11-8} = index{3-0};
4698}
4699def VEXTd16 : VEXTd<"vext", "16", v4i16> {
4700 let Inst{11-9} = index{2-0};
4701 let Inst{8} = 0b0;
4702}
4703def VEXTd32 : VEXTd<"vext", "32", v2i32> {
4704 let Inst{11-10} = index{1-0};
4705 let Inst{9-8} = 0b00;
4706}
4707def VEXTdf : VEXTd<"vext", "32", v2f32> {
Tanya Lattner201cfcd2011-06-02 21:25:24 +00004708 let Inst{11-10} = index{1-0};
4709 let Inst{9-8} = 0b00;
4710
Owen Anderson7a258252010-11-03 18:16:27 +00004711}
Anton Korobeynikov5da894f2009-08-21 12:40:21 +00004712
Owen Anderson7a258252010-11-03 18:16:27 +00004713def VEXTq8 : VEXTq<"vext", "8", v16i8> {
4714 let Inst{11-8} = index{3-0};
4715}
4716def VEXTq16 : VEXTq<"vext", "16", v8i16> {
4717 let Inst{11-9} = index{2-0};
4718 let Inst{8} = 0b0;
4719}
4720def VEXTq32 : VEXTq<"vext", "32", v4i32> {
4721 let Inst{11-10} = index{1-0};
4722 let Inst{9-8} = 0b00;
4723}
4724def VEXTqf : VEXTq<"vext", "32", v4f32> {
Mon P Wange32cdef2011-04-07 19:56:12 +00004725 let Inst{11-10} = index{1-0};
4726 let Inst{9-8} = 0b00;
Owen Anderson7a258252010-11-03 18:16:27 +00004727}
Bob Wilsonde95c1b82009-08-19 17:03:43 +00004728
Bob Wilson64efd902009-08-08 05:53:00 +00004729// VTRN : Vector Transpose
4730
Evan Chengf81bf152009-11-23 21:57:23 +00004731def VTRNd8 : N2VDShuffle<0b00, 0b00001, "vtrn", "8">;
4732def VTRNd16 : N2VDShuffle<0b01, 0b00001, "vtrn", "16">;
4733def VTRNd32 : N2VDShuffle<0b10, 0b00001, "vtrn", "32">;
Bob Wilson64efd902009-08-08 05:53:00 +00004734
Evan Chengf81bf152009-11-23 21:57:23 +00004735def VTRNq8 : N2VQShuffle<0b00, 0b00001, IIC_VPERMQ, "vtrn", "8">;
4736def VTRNq16 : N2VQShuffle<0b01, 0b00001, IIC_VPERMQ, "vtrn", "16">;
4737def VTRNq32 : N2VQShuffle<0b10, 0b00001, IIC_VPERMQ, "vtrn", "32">;
Bob Wilson64efd902009-08-08 05:53:00 +00004738
Bob Wilsonb6ab51e2009-08-08 06:13:25 +00004739// VUZP : Vector Unzip (Deinterleave)
4740
Evan Chengf81bf152009-11-23 21:57:23 +00004741def VUZPd8 : N2VDShuffle<0b00, 0b00010, "vuzp", "8">;
4742def VUZPd16 : N2VDShuffle<0b01, 0b00010, "vuzp", "16">;
4743def VUZPd32 : N2VDShuffle<0b10, 0b00010, "vuzp", "32">;
Bob Wilsonb6ab51e2009-08-08 06:13:25 +00004744
Evan Chengf81bf152009-11-23 21:57:23 +00004745def VUZPq8 : N2VQShuffle<0b00, 0b00010, IIC_VPERMQ3, "vuzp", "8">;
4746def VUZPq16 : N2VQShuffle<0b01, 0b00010, IIC_VPERMQ3, "vuzp", "16">;
4747def VUZPq32 : N2VQShuffle<0b10, 0b00010, IIC_VPERMQ3, "vuzp", "32">;
Bob Wilsonb6ab51e2009-08-08 06:13:25 +00004748
4749// VZIP : Vector Zip (Interleave)
4750
Evan Chengf81bf152009-11-23 21:57:23 +00004751def VZIPd8 : N2VDShuffle<0b00, 0b00011, "vzip", "8">;
4752def VZIPd16 : N2VDShuffle<0b01, 0b00011, "vzip", "16">;
4753def VZIPd32 : N2VDShuffle<0b10, 0b00011, "vzip", "32">;
Bob Wilsonb6ab51e2009-08-08 06:13:25 +00004754
Evan Chengf81bf152009-11-23 21:57:23 +00004755def VZIPq8 : N2VQShuffle<0b00, 0b00011, IIC_VPERMQ3, "vzip", "8">;
4756def VZIPq16 : N2VQShuffle<0b01, 0b00011, IIC_VPERMQ3, "vzip", "16">;
4757def VZIPq32 : N2VQShuffle<0b10, 0b00011, IIC_VPERMQ3, "vzip", "32">;
Bob Wilson64efd902009-08-08 05:53:00 +00004758
Bob Wilson114a2662009-08-12 20:51:55 +00004759// Vector Table Lookup and Table Extension.
4760
4761// VTBL : Vector Table Lookup
4762def VTBL1
Owen Andersoncfd0e1f2010-10-28 00:18:46 +00004763 : N3V<1,1,0b11,0b1000,0,0, (outs DPR:$Vd),
4764 (ins DPR:$Vn, DPR:$Vm), NVTBLFrm, IIC_VTB1,
4765 "vtbl", "8", "$Vd, \\{$Vn\\}, $Vm", "",
4766 [(set DPR:$Vd, (v8i8 (int_arm_neon_vtbl1 DPR:$Vn, DPR:$Vm)))]>;
Evan Cheng0d92f5f2009-10-01 08:22:27 +00004767let hasExtraSrcRegAllocReq = 1 in {
Bob Wilson114a2662009-08-12 20:51:55 +00004768def VTBL2
Owen Andersoncfd0e1f2010-10-28 00:18:46 +00004769 : N3V<1,1,0b11,0b1001,0,0, (outs DPR:$Vd),
4770 (ins DPR:$Vn, DPR:$tbl2, DPR:$Vm), NVTBLFrm, IIC_VTB2,
4771 "vtbl", "8", "$Vd, \\{$Vn, $tbl2\\}, $Vm", "", []>;
Bob Wilson114a2662009-08-12 20:51:55 +00004772def VTBL3
Owen Andersoncfd0e1f2010-10-28 00:18:46 +00004773 : N3V<1,1,0b11,0b1010,0,0, (outs DPR:$Vd),
4774 (ins DPR:$Vn, DPR:$tbl2, DPR:$tbl3, DPR:$Vm), NVTBLFrm, IIC_VTB3,
4775 "vtbl", "8", "$Vd, \\{$Vn, $tbl2, $tbl3\\}, $Vm", "", []>;
Bob Wilson114a2662009-08-12 20:51:55 +00004776def VTBL4
Owen Andersoncfd0e1f2010-10-28 00:18:46 +00004777 : N3V<1,1,0b11,0b1011,0,0, (outs DPR:$Vd),
4778 (ins DPR:$Vn, DPR:$tbl2, DPR:$tbl3, DPR:$tbl4, DPR:$Vm),
Johnny Chen79c4d822010-03-29 01:14:22 +00004779 NVTBLFrm, IIC_VTB4,
Owen Andersoncfd0e1f2010-10-28 00:18:46 +00004780 "vtbl", "8", "$Vd, \\{$Vn, $tbl2, $tbl3, $tbl4\\}, $Vm", "", []>;
Evan Cheng0d92f5f2009-10-01 08:22:27 +00004781} // hasExtraSrcRegAllocReq = 1
Bob Wilson114a2662009-08-12 20:51:55 +00004782
Bob Wilsonbd916c52010-09-13 23:55:10 +00004783def VTBL2Pseudo
Jim Grosbach7cd27292010-10-06 20:36:55 +00004784 : PseudoNeonI<(outs DPR:$dst), (ins QPR:$tbl, DPR:$src), IIC_VTB2, "", []>;
Bob Wilsonbd916c52010-09-13 23:55:10 +00004785def VTBL3Pseudo
Jim Grosbach7cd27292010-10-06 20:36:55 +00004786 : PseudoNeonI<(outs DPR:$dst), (ins QQPR:$tbl, DPR:$src), IIC_VTB3, "", []>;
Bob Wilsonbd916c52010-09-13 23:55:10 +00004787def VTBL4Pseudo
Jim Grosbach7cd27292010-10-06 20:36:55 +00004788 : PseudoNeonI<(outs DPR:$dst), (ins QQPR:$tbl, DPR:$src), IIC_VTB4, "", []>;
Bob Wilsonbd916c52010-09-13 23:55:10 +00004789
Bob Wilson114a2662009-08-12 20:51:55 +00004790// VTBX : Vector Table Extension
4791def VTBX1
Owen Andersoncfd0e1f2010-10-28 00:18:46 +00004792 : N3V<1,1,0b11,0b1000,1,0, (outs DPR:$Vd),
4793 (ins DPR:$orig, DPR:$Vn, DPR:$Vm), NVTBLFrm, IIC_VTBX1,
4794 "vtbx", "8", "$Vd, \\{$Vn\\}, $Vm", "$orig = $Vd",
4795 [(set DPR:$Vd, (v8i8 (int_arm_neon_vtbx1
4796 DPR:$orig, DPR:$Vn, DPR:$Vm)))]>;
Evan Cheng0d92f5f2009-10-01 08:22:27 +00004797let hasExtraSrcRegAllocReq = 1 in {
Bob Wilson114a2662009-08-12 20:51:55 +00004798def VTBX2
Owen Andersoncfd0e1f2010-10-28 00:18:46 +00004799 : N3V<1,1,0b11,0b1001,1,0, (outs DPR:$Vd),
4800 (ins DPR:$orig, DPR:$Vn, DPR:$tbl2, DPR:$Vm), NVTBLFrm, IIC_VTBX2,
4801 "vtbx", "8", "$Vd, \\{$Vn, $tbl2\\}, $Vm", "$orig = $Vd", []>;
Bob Wilson114a2662009-08-12 20:51:55 +00004802def VTBX3
Owen Andersoncfd0e1f2010-10-28 00:18:46 +00004803 : N3V<1,1,0b11,0b1010,1,0, (outs DPR:$Vd),
4804 (ins DPR:$orig, DPR:$Vn, DPR:$tbl2, DPR:$tbl3, DPR:$Vm),
Johnny Chen79c4d822010-03-29 01:14:22 +00004805 NVTBLFrm, IIC_VTBX3,
Owen Andersoncfd0e1f2010-10-28 00:18:46 +00004806 "vtbx", "8", "$Vd, \\{$Vn, $tbl2, $tbl3\\}, $Vm",
4807 "$orig = $Vd", []>;
Bob Wilson114a2662009-08-12 20:51:55 +00004808def VTBX4
Owen Andersoncfd0e1f2010-10-28 00:18:46 +00004809 : N3V<1,1,0b11,0b1011,1,0, (outs DPR:$Vd), (ins DPR:$orig, DPR:$Vn,
4810 DPR:$tbl2, DPR:$tbl3, DPR:$tbl4, DPR:$Vm), NVTBLFrm, IIC_VTBX4,
4811 "vtbx", "8", "$Vd, \\{$Vn, $tbl2, $tbl3, $tbl4\\}, $Vm",
4812 "$orig = $Vd", []>;
Evan Cheng0d92f5f2009-10-01 08:22:27 +00004813} // hasExtraSrcRegAllocReq = 1
Bob Wilson114a2662009-08-12 20:51:55 +00004814
Bob Wilsonbd916c52010-09-13 23:55:10 +00004815def VTBX2Pseudo
4816 : PseudoNeonI<(outs DPR:$dst), (ins DPR:$orig, QPR:$tbl, DPR:$src),
Jim Grosbach7cd27292010-10-06 20:36:55 +00004817 IIC_VTBX2, "$orig = $dst", []>;
Bob Wilsonbd916c52010-09-13 23:55:10 +00004818def VTBX3Pseudo
4819 : PseudoNeonI<(outs DPR:$dst), (ins DPR:$orig, QQPR:$tbl, DPR:$src),
Jim Grosbach7cd27292010-10-06 20:36:55 +00004820 IIC_VTBX3, "$orig = $dst", []>;
Bob Wilsonbd916c52010-09-13 23:55:10 +00004821def VTBX4Pseudo
4822 : PseudoNeonI<(outs DPR:$dst), (ins DPR:$orig, QQPR:$tbl, DPR:$src),
Jim Grosbach7cd27292010-10-06 20:36:55 +00004823 IIC_VTBX4, "$orig = $dst", []>;
Bob Wilsonbd916c52010-09-13 23:55:10 +00004824
Bob Wilson5bafff32009-06-22 23:27:02 +00004825//===----------------------------------------------------------------------===//
Evan Cheng1d2426c2009-08-07 19:30:41 +00004826// NEON instructions for single-precision FP math
4827//===----------------------------------------------------------------------===//
4828
Bob Wilson0e6d5402010-12-13 23:02:31 +00004829class N2VSPat<SDNode OpNode, NeonI Inst>
4830 : NEONFPPat<(f32 (OpNode SPR:$a)),
Bob Wilson1e6f5962010-12-13 21:58:05 +00004831 (EXTRACT_SUBREG
Bob Wilson4711d5c2010-12-13 23:02:37 +00004832 (v2f32 (COPY_TO_REGCLASS (Inst
4833 (INSERT_SUBREG
Bob Wilson0e6d5402010-12-13 23:02:31 +00004834 (v2f32 (COPY_TO_REGCLASS (v2f32 (IMPLICIT_DEF)), DPR_VFP2)),
4835 SPR:$a, ssub_0)), DPR_VFP2)), ssub_0)>;
Bob Wilson3c0f96e2010-02-17 22:23:11 +00004836
4837class N3VSPat<SDNode OpNode, NeonI Inst>
4838 : NEONFPPat<(f32 (OpNode SPR:$a, SPR:$b)),
Bob Wilson4711d5c2010-12-13 23:02:37 +00004839 (EXTRACT_SUBREG
4840 (v2f32 (COPY_TO_REGCLASS (Inst
4841 (INSERT_SUBREG
4842 (v2f32 (COPY_TO_REGCLASS (v2f32 (IMPLICIT_DEF)), DPR_VFP2)),
4843 SPR:$a, ssub_0),
4844 (INSERT_SUBREG
4845 (v2f32 (COPY_TO_REGCLASS (v2f32 (IMPLICIT_DEF)), DPR_VFP2)),
4846 SPR:$b, ssub_0)), DPR_VFP2)), ssub_0)>;
Bob Wilson3c0f96e2010-02-17 22:23:11 +00004847
4848class N3VSMulOpPat<SDNode MulNode, SDNode OpNode, NeonI Inst>
4849 : NEONFPPat<(f32 (OpNode SPR:$acc, (f32 (MulNode SPR:$a, SPR:$b)))),
Bob Wilson4711d5c2010-12-13 23:02:37 +00004850 (EXTRACT_SUBREG
4851 (v2f32 (COPY_TO_REGCLASS (Inst
4852 (INSERT_SUBREG
4853 (v2f32 (COPY_TO_REGCLASS (v2f32 (IMPLICIT_DEF)), DPR_VFP2)),
4854 SPR:$acc, ssub_0),
4855 (INSERT_SUBREG
4856 (v2f32 (COPY_TO_REGCLASS (v2f32 (IMPLICIT_DEF)), DPR_VFP2)),
4857 SPR:$a, ssub_0),
4858 (INSERT_SUBREG
4859 (v2f32 (COPY_TO_REGCLASS (v2f32 (IMPLICIT_DEF)), DPR_VFP2)),
4860 SPR:$b, ssub_0)), DPR_VFP2)), ssub_0)>;
Bob Wilson3c0f96e2010-02-17 22:23:11 +00004861
Bob Wilson4711d5c2010-12-13 23:02:37 +00004862def : N3VSPat<fadd, VADDfd>;
4863def : N3VSPat<fsub, VSUBfd>;
4864def : N3VSPat<fmul, VMULfd>;
4865def : N3VSMulOpPat<fmul, fadd, VMLAfd>,
Evan Cheng48575f62010-12-05 22:04:16 +00004866 Requires<[HasNEON, UseNEONForFP, UseFPVMLx]>;
Bob Wilson4711d5c2010-12-13 23:02:37 +00004867def : N3VSMulOpPat<fmul, fsub, VMLSfd>,
Evan Cheng48575f62010-12-05 22:04:16 +00004868 Requires<[HasNEON, UseNEONForFP, UseFPVMLx]>;
Bob Wilson0e6d5402010-12-13 23:02:31 +00004869def : N2VSPat<fabs, VABSfd>;
Bob Wilson0e6d5402010-12-13 23:02:31 +00004870def : N2VSPat<fneg, VNEGfd>;
Bob Wilson4711d5c2010-12-13 23:02:37 +00004871def : N3VSPat<NEONfmax, VMAXfd>;
4872def : N3VSPat<NEONfmin, VMINfd>;
Bob Wilson0e6d5402010-12-13 23:02:31 +00004873def : N2VSPat<arm_ftosi, VCVTf2sd>;
4874def : N2VSPat<arm_ftoui, VCVTf2ud>;
4875def : N2VSPat<arm_sitof, VCVTs2fd>;
4876def : N2VSPat<arm_uitof, VCVTu2fd>;
David Goodwin338268c2009-08-10 22:17:39 +00004877
Evan Cheng1d2426c2009-08-07 19:30:41 +00004878//===----------------------------------------------------------------------===//
Bob Wilson5bafff32009-06-22 23:27:02 +00004879// Non-Instruction Patterns
4880//===----------------------------------------------------------------------===//
4881
4882// bit_convert
4883def : Pat<(v1i64 (bitconvert (v2i32 DPR:$src))), (v1i64 DPR:$src)>;
4884def : Pat<(v1i64 (bitconvert (v4i16 DPR:$src))), (v1i64 DPR:$src)>;
4885def : Pat<(v1i64 (bitconvert (v8i8 DPR:$src))), (v1i64 DPR:$src)>;
4886def : Pat<(v1i64 (bitconvert (f64 DPR:$src))), (v1i64 DPR:$src)>;
4887def : Pat<(v1i64 (bitconvert (v2f32 DPR:$src))), (v1i64 DPR:$src)>;
4888def : Pat<(v2i32 (bitconvert (v1i64 DPR:$src))), (v2i32 DPR:$src)>;
4889def : Pat<(v2i32 (bitconvert (v4i16 DPR:$src))), (v2i32 DPR:$src)>;
4890def : Pat<(v2i32 (bitconvert (v8i8 DPR:$src))), (v2i32 DPR:$src)>;
4891def : Pat<(v2i32 (bitconvert (f64 DPR:$src))), (v2i32 DPR:$src)>;
4892def : Pat<(v2i32 (bitconvert (v2f32 DPR:$src))), (v2i32 DPR:$src)>;
4893def : Pat<(v4i16 (bitconvert (v1i64 DPR:$src))), (v4i16 DPR:$src)>;
4894def : Pat<(v4i16 (bitconvert (v2i32 DPR:$src))), (v4i16 DPR:$src)>;
4895def : Pat<(v4i16 (bitconvert (v8i8 DPR:$src))), (v4i16 DPR:$src)>;
4896def : Pat<(v4i16 (bitconvert (f64 DPR:$src))), (v4i16 DPR:$src)>;
4897def : Pat<(v4i16 (bitconvert (v2f32 DPR:$src))), (v4i16 DPR:$src)>;
4898def : Pat<(v8i8 (bitconvert (v1i64 DPR:$src))), (v8i8 DPR:$src)>;
4899def : Pat<(v8i8 (bitconvert (v2i32 DPR:$src))), (v8i8 DPR:$src)>;
4900def : Pat<(v8i8 (bitconvert (v4i16 DPR:$src))), (v8i8 DPR:$src)>;
4901def : Pat<(v8i8 (bitconvert (f64 DPR:$src))), (v8i8 DPR:$src)>;
4902def : Pat<(v8i8 (bitconvert (v2f32 DPR:$src))), (v8i8 DPR:$src)>;
4903def : Pat<(f64 (bitconvert (v1i64 DPR:$src))), (f64 DPR:$src)>;
4904def : Pat<(f64 (bitconvert (v2i32 DPR:$src))), (f64 DPR:$src)>;
4905def : Pat<(f64 (bitconvert (v4i16 DPR:$src))), (f64 DPR:$src)>;
4906def : Pat<(f64 (bitconvert (v8i8 DPR:$src))), (f64 DPR:$src)>;
4907def : Pat<(f64 (bitconvert (v2f32 DPR:$src))), (f64 DPR:$src)>;
4908def : Pat<(v2f32 (bitconvert (f64 DPR:$src))), (v2f32 DPR:$src)>;
4909def : Pat<(v2f32 (bitconvert (v1i64 DPR:$src))), (v2f32 DPR:$src)>;
4910def : Pat<(v2f32 (bitconvert (v2i32 DPR:$src))), (v2f32 DPR:$src)>;
4911def : Pat<(v2f32 (bitconvert (v4i16 DPR:$src))), (v2f32 DPR:$src)>;
4912def : Pat<(v2f32 (bitconvert (v8i8 DPR:$src))), (v2f32 DPR:$src)>;
4913
4914def : Pat<(v2i64 (bitconvert (v4i32 QPR:$src))), (v2i64 QPR:$src)>;
4915def : Pat<(v2i64 (bitconvert (v8i16 QPR:$src))), (v2i64 QPR:$src)>;
4916def : Pat<(v2i64 (bitconvert (v16i8 QPR:$src))), (v2i64 QPR:$src)>;
4917def : Pat<(v2i64 (bitconvert (v2f64 QPR:$src))), (v2i64 QPR:$src)>;
4918def : Pat<(v2i64 (bitconvert (v4f32 QPR:$src))), (v2i64 QPR:$src)>;
4919def : Pat<(v4i32 (bitconvert (v2i64 QPR:$src))), (v4i32 QPR:$src)>;
4920def : Pat<(v4i32 (bitconvert (v8i16 QPR:$src))), (v4i32 QPR:$src)>;
4921def : Pat<(v4i32 (bitconvert (v16i8 QPR:$src))), (v4i32 QPR:$src)>;
4922def : Pat<(v4i32 (bitconvert (v2f64 QPR:$src))), (v4i32 QPR:$src)>;
4923def : Pat<(v4i32 (bitconvert (v4f32 QPR:$src))), (v4i32 QPR:$src)>;
4924def : Pat<(v8i16 (bitconvert (v2i64 QPR:$src))), (v8i16 QPR:$src)>;
4925def : Pat<(v8i16 (bitconvert (v4i32 QPR:$src))), (v8i16 QPR:$src)>;
4926def : Pat<(v8i16 (bitconvert (v16i8 QPR:$src))), (v8i16 QPR:$src)>;
4927def : Pat<(v8i16 (bitconvert (v2f64 QPR:$src))), (v8i16 QPR:$src)>;
4928def : Pat<(v8i16 (bitconvert (v4f32 QPR:$src))), (v8i16 QPR:$src)>;
4929def : Pat<(v16i8 (bitconvert (v2i64 QPR:$src))), (v16i8 QPR:$src)>;
4930def : Pat<(v16i8 (bitconvert (v4i32 QPR:$src))), (v16i8 QPR:$src)>;
4931def : Pat<(v16i8 (bitconvert (v8i16 QPR:$src))), (v16i8 QPR:$src)>;
4932def : Pat<(v16i8 (bitconvert (v2f64 QPR:$src))), (v16i8 QPR:$src)>;
4933def : Pat<(v16i8 (bitconvert (v4f32 QPR:$src))), (v16i8 QPR:$src)>;
4934def : Pat<(v4f32 (bitconvert (v2i64 QPR:$src))), (v4f32 QPR:$src)>;
4935def : Pat<(v4f32 (bitconvert (v4i32 QPR:$src))), (v4f32 QPR:$src)>;
4936def : Pat<(v4f32 (bitconvert (v8i16 QPR:$src))), (v4f32 QPR:$src)>;
4937def : Pat<(v4f32 (bitconvert (v16i8 QPR:$src))), (v4f32 QPR:$src)>;
4938def : Pat<(v4f32 (bitconvert (v2f64 QPR:$src))), (v4f32 QPR:$src)>;
4939def : Pat<(v2f64 (bitconvert (v2i64 QPR:$src))), (v2f64 QPR:$src)>;
4940def : Pat<(v2f64 (bitconvert (v4i32 QPR:$src))), (v2f64 QPR:$src)>;
4941def : Pat<(v2f64 (bitconvert (v8i16 QPR:$src))), (v2f64 QPR:$src)>;
4942def : Pat<(v2f64 (bitconvert (v16i8 QPR:$src))), (v2f64 QPR:$src)>;
4943def : Pat<(v2f64 (bitconvert (v4f32 QPR:$src))), (v2f64 QPR:$src)>;