xref: /freebsd/contrib/llvm-project/llvm/lib/Target/AArch64/AArch64InstrGISel.td (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
15ffd83dbSDimitry Andric//=----- AArch64InstrGISel.td - AArch64 GISel target pseudos -*- tablegen -*-=//
25ffd83dbSDimitry Andric//
35ffd83dbSDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45ffd83dbSDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
55ffd83dbSDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65ffd83dbSDimitry Andric//
75ffd83dbSDimitry Andric//===----------------------------------------------------------------------===//
85ffd83dbSDimitry Andric//
95ffd83dbSDimitry Andric// AArch64 GlobalISel target pseudo instruction definitions. This is kept
105ffd83dbSDimitry Andric// separately from the other tablegen files for organizational purposes, but
115ffd83dbSDimitry Andric// share the same infrastructure.
125ffd83dbSDimitry Andric//
135ffd83dbSDimitry Andric//===----------------------------------------------------------------------===//
145ffd83dbSDimitry Andric
155ffd83dbSDimitry Andric
165ffd83dbSDimitry Andricclass AArch64GenericInstruction : GenericInstruction {
175ffd83dbSDimitry Andric  let Namespace = "AArch64";
185ffd83dbSDimitry Andric}
195ffd83dbSDimitry Andric
205ffd83dbSDimitry Andric// A pseudo to represent a relocatable add instruction as part of address
215ffd83dbSDimitry Andric// computation.
225ffd83dbSDimitry Andricdef G_ADD_LOW : AArch64GenericInstruction {
235ffd83dbSDimitry Andric  let OutOperandList = (outs type0:$dst);
245ffd83dbSDimitry Andric  let InOperandList = (ins type1:$src, type2:$imm);
255ffd83dbSDimitry Andric  let hasSideEffects = 0;
265ffd83dbSDimitry Andric}
275ffd83dbSDimitry Andric
285ffd83dbSDimitry Andric// Pseudo for a rev16 instruction. Produced post-legalization from
295ffd83dbSDimitry Andric// G_SHUFFLE_VECTORs with appropriate masks.
305ffd83dbSDimitry Andricdef G_REV16 : AArch64GenericInstruction {
315ffd83dbSDimitry Andric  let OutOperandList = (outs type0:$dst);
325ffd83dbSDimitry Andric  let InOperandList = (ins type0:$src);
335ffd83dbSDimitry Andric  let hasSideEffects = 0;
345ffd83dbSDimitry Andric}
355ffd83dbSDimitry Andric
365ffd83dbSDimitry Andric// Pseudo for a rev32 instruction. Produced post-legalization from
375ffd83dbSDimitry Andric// G_SHUFFLE_VECTORs with appropriate masks.
385ffd83dbSDimitry Andricdef G_REV32 : AArch64GenericInstruction {
395ffd83dbSDimitry Andric  let OutOperandList = (outs type0:$dst);
405ffd83dbSDimitry Andric  let InOperandList = (ins type0:$src);
415ffd83dbSDimitry Andric  let hasSideEffects = 0;
425ffd83dbSDimitry Andric}
435ffd83dbSDimitry Andric
445ffd83dbSDimitry Andric// Pseudo for a rev64 instruction. Produced post-legalization from
455ffd83dbSDimitry Andric// G_SHUFFLE_VECTORs with appropriate masks.
465ffd83dbSDimitry Andricdef G_REV64 : AArch64GenericInstruction {
475ffd83dbSDimitry Andric  let OutOperandList = (outs type0:$dst);
485ffd83dbSDimitry Andric  let InOperandList = (ins type0:$src);
495ffd83dbSDimitry Andric  let hasSideEffects = 0;
505ffd83dbSDimitry Andric}
515ffd83dbSDimitry Andric
525ffd83dbSDimitry Andric// Represents an uzp1 instruction. Produced post-legalization from
535ffd83dbSDimitry Andric// G_SHUFFLE_VECTORs with appropriate masks.
545ffd83dbSDimitry Andricdef G_UZP1 : AArch64GenericInstruction {
555ffd83dbSDimitry Andric  let OutOperandList = (outs type0:$dst);
565ffd83dbSDimitry Andric  let InOperandList = (ins type0:$v1, type0:$v2);
575ffd83dbSDimitry Andric  let hasSideEffects = 0;
585ffd83dbSDimitry Andric}
595ffd83dbSDimitry Andric
605ffd83dbSDimitry Andric// Represents an uzp2 instruction. Produced post-legalization from
615ffd83dbSDimitry Andric// G_SHUFFLE_VECTORs with appropriate masks.
625ffd83dbSDimitry Andricdef G_UZP2 : AArch64GenericInstruction {
635ffd83dbSDimitry Andric  let OutOperandList = (outs type0:$dst);
645ffd83dbSDimitry Andric  let InOperandList = (ins type0:$v1, type0:$v2);
655ffd83dbSDimitry Andric  let hasSideEffects = 0;
665ffd83dbSDimitry Andric}
675ffd83dbSDimitry Andric
685ffd83dbSDimitry Andric// Represents a zip1 instruction. Produced post-legalization from
695ffd83dbSDimitry Andric// G_SHUFFLE_VECTORs with appropriate masks.
705ffd83dbSDimitry Andricdef G_ZIP1 : AArch64GenericInstruction {
715ffd83dbSDimitry Andric  let OutOperandList = (outs type0:$dst);
725ffd83dbSDimitry Andric  let InOperandList = (ins type0:$v1, type0:$v2);
735ffd83dbSDimitry Andric  let hasSideEffects = 0;
745ffd83dbSDimitry Andric}
755ffd83dbSDimitry Andric
765ffd83dbSDimitry Andric// Represents a zip2 instruction. Produced post-legalization from
775ffd83dbSDimitry Andric// G_SHUFFLE_VECTORs with appropriate masks.
785ffd83dbSDimitry Andricdef G_ZIP2 : AArch64GenericInstruction {
795ffd83dbSDimitry Andric  let OutOperandList = (outs type0:$dst);
805ffd83dbSDimitry Andric  let InOperandList = (ins type0:$v1, type0:$v2);
815ffd83dbSDimitry Andric  let hasSideEffects = 0;
825ffd83dbSDimitry Andric}
835ffd83dbSDimitry Andric
845ffd83dbSDimitry Andric// Represents a dup instruction. Produced post-legalization from
855ffd83dbSDimitry Andric// G_SHUFFLE_VECTORs with appropriate masks.
865ffd83dbSDimitry Andricdef G_DUP: AArch64GenericInstruction {
875ffd83dbSDimitry Andric  let OutOperandList = (outs type0:$dst);
885ffd83dbSDimitry Andric  let InOperandList = (ins type1:$lane);
895ffd83dbSDimitry Andric  let hasSideEffects = 0;
905ffd83dbSDimitry Andric}
91e8d8bef9SDimitry Andric
92e8d8bef9SDimitry Andric// Represents a lane duplicate operation.
93e8d8bef9SDimitry Andricdef G_DUPLANE8 : AArch64GenericInstruction {
94e8d8bef9SDimitry Andric  let OutOperandList = (outs type0:$dst);
95e8d8bef9SDimitry Andric  let InOperandList = (ins type0:$src, type1:$lane);
96e8d8bef9SDimitry Andric  let hasSideEffects = 0;
97e8d8bef9SDimitry Andric}
98e8d8bef9SDimitry Andricdef G_DUPLANE16 : AArch64GenericInstruction {
99e8d8bef9SDimitry Andric  let OutOperandList = (outs type0:$dst);
100e8d8bef9SDimitry Andric  let InOperandList = (ins type0:$src, type1:$lane);
101e8d8bef9SDimitry Andric  let hasSideEffects = 0;
102e8d8bef9SDimitry Andric}
103e8d8bef9SDimitry Andricdef G_DUPLANE32 : AArch64GenericInstruction {
104e8d8bef9SDimitry Andric  let OutOperandList = (outs type0:$dst);
105e8d8bef9SDimitry Andric  let InOperandList = (ins type0:$src, type1:$lane);
106e8d8bef9SDimitry Andric  let hasSideEffects = 0;
107e8d8bef9SDimitry Andric}
108e8d8bef9SDimitry Andricdef G_DUPLANE64 : AArch64GenericInstruction {
109e8d8bef9SDimitry Andric  let OutOperandList = (outs type0:$dst);
110e8d8bef9SDimitry Andric  let InOperandList = (ins type0:$src, type1:$lane);
111e8d8bef9SDimitry Andric  let hasSideEffects = 0;
112e8d8bef9SDimitry Andric}
113e8d8bef9SDimitry Andric
1145ffd83dbSDimitry Andric// Represents a trn1 instruction. Produced post-legalization from
1155ffd83dbSDimitry Andric// G_SHUFFLE_VECTORs with appropriate masks.
1165ffd83dbSDimitry Andricdef G_TRN1 : AArch64GenericInstruction {
1175ffd83dbSDimitry Andric  let OutOperandList = (outs type0:$dst);
1185ffd83dbSDimitry Andric  let InOperandList = (ins type0:$v1, type0:$v2);
1195ffd83dbSDimitry Andric  let hasSideEffects = 0;
1205ffd83dbSDimitry Andric}
1215ffd83dbSDimitry Andric
1225ffd83dbSDimitry Andric// Represents a trn2 instruction. Produced post-legalization from
1235ffd83dbSDimitry Andric// G_SHUFFLE_VECTORs with appropriate masks.
1245ffd83dbSDimitry Andricdef G_TRN2 : AArch64GenericInstruction {
1255ffd83dbSDimitry Andric  let OutOperandList = (outs type0:$dst);
1265ffd83dbSDimitry Andric  let InOperandList = (ins type0:$v1, type0:$v2);
1275ffd83dbSDimitry Andric  let hasSideEffects = 0;
1285ffd83dbSDimitry Andric}
1295ffd83dbSDimitry Andric
1305ffd83dbSDimitry Andric// Represents an ext instruction. Produced post-legalization from
1315ffd83dbSDimitry Andric// G_SHUFFLE_VECTORs with appropriate masks.
1325ffd83dbSDimitry Andricdef G_EXT: AArch64GenericInstruction {
1335ffd83dbSDimitry Andric  let OutOperandList = (outs type0:$dst);
1345ffd83dbSDimitry Andric  let InOperandList = (ins type0:$v1, type0:$v2, untyped_imm_0:$imm);
135fe6060f1SDimitry Andric  let hasSideEffects = 0;
1365ffd83dbSDimitry Andric}
1375ffd83dbSDimitry Andric
138e8d8bef9SDimitry Andric// Represents a vector G_ASHR with an immediate.
139e8d8bef9SDimitry Andricdef G_VASHR : AArch64GenericInstruction {
140e8d8bef9SDimitry Andric  let OutOperandList = (outs type0:$dst);
141e8d8bef9SDimitry Andric  let InOperandList = (ins type0:$src1, untyped_imm_0:$imm);
142fe6060f1SDimitry Andric  let hasSideEffects = 0;
143e8d8bef9SDimitry Andric}
144e8d8bef9SDimitry Andric
145e8d8bef9SDimitry Andric// Represents a vector G_LSHR with an immediate.
146e8d8bef9SDimitry Andricdef G_VLSHR : AArch64GenericInstruction {
147e8d8bef9SDimitry Andric  let OutOperandList = (outs type0:$dst);
148e8d8bef9SDimitry Andric  let InOperandList = (ins type0:$src1, untyped_imm_0:$imm);
149fe6060f1SDimitry Andric  let hasSideEffects = 0;
150e8d8bef9SDimitry Andric}
151e8d8bef9SDimitry Andric
152e8d8bef9SDimitry Andric// Represents an integer to FP conversion on the FPR bank.
153e8d8bef9SDimitry Andricdef G_SITOF : AArch64GenericInstruction {
154e8d8bef9SDimitry Andric  let OutOperandList = (outs type0:$dst);
155e8d8bef9SDimitry Andric  let InOperandList = (ins type0:$src);
156fe6060f1SDimitry Andric  let hasSideEffects = 0;
157e8d8bef9SDimitry Andric}
158e8d8bef9SDimitry Andricdef G_UITOF : AArch64GenericInstruction {
159e8d8bef9SDimitry Andric  let OutOperandList = (outs type0:$dst);
160e8d8bef9SDimitry Andric  let InOperandList = (ins type0:$src);
161fe6060f1SDimitry Andric  let hasSideEffects = 0;
162fe6060f1SDimitry Andric}
163fe6060f1SDimitry Andric
164fe6060f1SDimitry Andricdef G_FCMEQ : AArch64GenericInstruction {
165fe6060f1SDimitry Andric  let OutOperandList = (outs type0:$dst);
166fe6060f1SDimitry Andric  let InOperandList = (ins type0:$src1, type1:$src2);
167fe6060f1SDimitry Andric  let hasSideEffects = 0;
168fe6060f1SDimitry Andric}
169fe6060f1SDimitry Andric
170fe6060f1SDimitry Andricdef G_FCMGE : AArch64GenericInstruction {
171fe6060f1SDimitry Andric  let OutOperandList = (outs type0:$dst);
172fe6060f1SDimitry Andric  let InOperandList = (ins type0:$src1, type1:$src2);
173fe6060f1SDimitry Andric  let hasSideEffects = 0;
174fe6060f1SDimitry Andric}
175fe6060f1SDimitry Andric
176fe6060f1SDimitry Andricdef G_FCMGT : AArch64GenericInstruction {
177fe6060f1SDimitry Andric  let OutOperandList = (outs type0:$dst);
178fe6060f1SDimitry Andric  let InOperandList = (ins type0:$src1, type1:$src2);
179fe6060f1SDimitry Andric  let hasSideEffects = 0;
180fe6060f1SDimitry Andric}
181fe6060f1SDimitry Andric
182fe6060f1SDimitry Andricdef G_FCMEQZ : AArch64GenericInstruction {
183fe6060f1SDimitry Andric  let OutOperandList = (outs type0:$dst);
184fe6060f1SDimitry Andric  let InOperandList = (ins type0:$src);
185fe6060f1SDimitry Andric  let hasSideEffects = 0;
186fe6060f1SDimitry Andric}
187fe6060f1SDimitry Andric
188fe6060f1SDimitry Andricdef G_FCMGEZ : AArch64GenericInstruction {
189fe6060f1SDimitry Andric  let OutOperandList = (outs type0:$dst);
190fe6060f1SDimitry Andric  let InOperandList = (ins type0:$src);
191fe6060f1SDimitry Andric  let hasSideEffects = 0;
192fe6060f1SDimitry Andric}
193fe6060f1SDimitry Andric
194fe6060f1SDimitry Andricdef G_FCMGTZ : AArch64GenericInstruction {
195fe6060f1SDimitry Andric  let OutOperandList = (outs type0:$dst);
196fe6060f1SDimitry Andric  let InOperandList = (ins type0:$src);
197fe6060f1SDimitry Andric  let hasSideEffects = 0;
198fe6060f1SDimitry Andric}
199fe6060f1SDimitry Andric
200fe6060f1SDimitry Andricdef G_FCMLEZ : AArch64GenericInstruction {
201fe6060f1SDimitry Andric  let OutOperandList = (outs type0:$dst);
202fe6060f1SDimitry Andric  let InOperandList = (ins type0:$src);
203fe6060f1SDimitry Andric  let hasSideEffects = 0;
204fe6060f1SDimitry Andric}
205fe6060f1SDimitry Andric
206fe6060f1SDimitry Andricdef G_FCMLTZ : AArch64GenericInstruction {
207fe6060f1SDimitry Andric  let OutOperandList = (outs type0:$dst);
208fe6060f1SDimitry Andric  let InOperandList = (ins type0:$src);
209fe6060f1SDimitry Andric  let hasSideEffects = 0;
210e8d8bef9SDimitry Andric}
211e8d8bef9SDimitry Andric
2125f757f3fSDimitry Andricdef G_AARCH64_PREFETCH : AArch64GenericInstruction {
213bdd1243dSDimitry Andric  let OutOperandList = (outs);
214bdd1243dSDimitry Andric  let InOperandList = (ins type0:$imm, ptype0:$src1);
215bdd1243dSDimitry Andric  let hasSideEffects = 1;
216bdd1243dSDimitry Andric}
217bdd1243dSDimitry Andric
2185f757f3fSDimitry Andricdef G_UMULL : AArch64GenericInstruction {
2195f757f3fSDimitry Andric  let OutOperandList = (outs type0:$dst);
2205f757f3fSDimitry Andric  let InOperandList = (ins type0:$src1, type0:$src2);
2215f757f3fSDimitry Andric  let hasSideEffects = 0;
2225f757f3fSDimitry Andric}
2235f757f3fSDimitry Andric
2245f757f3fSDimitry Andricdef G_SMULL : AArch64GenericInstruction {
2255f757f3fSDimitry Andric  let OutOperandList = (outs type0:$dst);
2265f757f3fSDimitry Andric  let InOperandList = (ins type0:$src1, type0:$src2);
2275f757f3fSDimitry Andric  let hasSideEffects = 0;
2285f757f3fSDimitry Andric}
2295f757f3fSDimitry Andric
2307a6dacacSDimitry Andricdef G_UADDLP : AArch64GenericInstruction {
2317a6dacacSDimitry Andric  let OutOperandList = (outs type0:$dst);
2327a6dacacSDimitry Andric  let InOperandList = (ins type0:$src1);
2337a6dacacSDimitry Andric  let hasSideEffects = 0;
2347a6dacacSDimitry Andric}
2357a6dacacSDimitry Andric
2367a6dacacSDimitry Andricdef G_SADDLP : AArch64GenericInstruction {
2377a6dacacSDimitry Andric  let OutOperandList = (outs type0:$dst);
2387a6dacacSDimitry Andric  let InOperandList = (ins type0:$src1);
2397a6dacacSDimitry Andric  let hasSideEffects = 0;
2407a6dacacSDimitry Andric}
2417a6dacacSDimitry Andric
2427a6dacacSDimitry Andricdef G_UADDLV : AArch64GenericInstruction {
2437a6dacacSDimitry Andric  let OutOperandList = (outs type0:$dst);
2447a6dacacSDimitry Andric  let InOperandList = (ins type0:$src1);
2457a6dacacSDimitry Andric  let hasSideEffects = 0;
2467a6dacacSDimitry Andric}
2477a6dacacSDimitry Andric
2487a6dacacSDimitry Andricdef G_SADDLV : AArch64GenericInstruction {
2497a6dacacSDimitry Andric  let OutOperandList = (outs type0:$dst);
2507a6dacacSDimitry Andric  let InOperandList = (ins type0:$src1);
2517a6dacacSDimitry Andric  let hasSideEffects = 0;
2527a6dacacSDimitry Andric}
2537a6dacacSDimitry Andric
2545f757f3fSDimitry Andricdef G_UDOT : AArch64GenericInstruction {
2555f757f3fSDimitry Andric  let OutOperandList = (outs type0:$dst);
2565f757f3fSDimitry Andric  let InOperandList = (ins type0:$src1, type0:$src2, type0:$src3);
2575f757f3fSDimitry Andric  let hasSideEffects = 0;
2585f757f3fSDimitry Andric}
2595f757f3fSDimitry Andric
2605f757f3fSDimitry Andricdef G_SDOT : AArch64GenericInstruction {
2615f757f3fSDimitry Andric  let OutOperandList = (outs type0:$dst);
2625f757f3fSDimitry Andric  let InOperandList = (ins type0:$src1, type0:$src2, type0:$src3);
2635f757f3fSDimitry Andric  let hasSideEffects = 0;
2645f757f3fSDimitry Andric}
2655f757f3fSDimitry Andric
2665f757f3fSDimitry Andric// Generic instruction for the BSP pseudo. It is expanded into BSP, which
2675f757f3fSDimitry Andric// expands into BSL/BIT/BIF after register allocation.
2685f757f3fSDimitry Andricdef G_BSP : AArch64GenericInstruction {
269bdd1243dSDimitry Andric  let OutOperandList = (outs type0:$dst);
270bdd1243dSDimitry Andric  let InOperandList = (ins type0:$src1, type0:$src2, type0:$src3);
271bdd1243dSDimitry Andric  let hasSideEffects = 0;
272bdd1243dSDimitry Andric}
273bdd1243dSDimitry Andric
2745ffd83dbSDimitry Andricdef : GINodeEquiv<G_REV16, AArch64rev16>;
2755ffd83dbSDimitry Andricdef : GINodeEquiv<G_REV32, AArch64rev32>;
2765ffd83dbSDimitry Andricdef : GINodeEquiv<G_REV64, AArch64rev64>;
2775ffd83dbSDimitry Andricdef : GINodeEquiv<G_UZP1, AArch64uzp1>;
2785ffd83dbSDimitry Andricdef : GINodeEquiv<G_UZP2, AArch64uzp2>;
2795ffd83dbSDimitry Andricdef : GINodeEquiv<G_ZIP1, AArch64zip1>;
2805ffd83dbSDimitry Andricdef : GINodeEquiv<G_ZIP2, AArch64zip2>;
2815ffd83dbSDimitry Andricdef : GINodeEquiv<G_DUP, AArch64dup>;
282e8d8bef9SDimitry Andricdef : GINodeEquiv<G_DUPLANE8, AArch64duplane8>;
283e8d8bef9SDimitry Andricdef : GINodeEquiv<G_DUPLANE16, AArch64duplane16>;
284e8d8bef9SDimitry Andricdef : GINodeEquiv<G_DUPLANE32, AArch64duplane32>;
285e8d8bef9SDimitry Andricdef : GINodeEquiv<G_DUPLANE64, AArch64duplane64>;
2865ffd83dbSDimitry Andricdef : GINodeEquiv<G_TRN1, AArch64trn1>;
2875ffd83dbSDimitry Andricdef : GINodeEquiv<G_TRN2, AArch64trn2>;
2885ffd83dbSDimitry Andricdef : GINodeEquiv<G_EXT, AArch64ext>;
289e8d8bef9SDimitry Andricdef : GINodeEquiv<G_VASHR, AArch64vashr>;
290e8d8bef9SDimitry Andricdef : GINodeEquiv<G_VLSHR, AArch64vlshr>;
291e8d8bef9SDimitry Andricdef : GINodeEquiv<G_SITOF, AArch64sitof>;
292e8d8bef9SDimitry Andricdef : GINodeEquiv<G_UITOF, AArch64uitof>;
293e8d8bef9SDimitry Andric
294fe6060f1SDimitry Andricdef : GINodeEquiv<G_FCMEQ, AArch64fcmeq>;
295fe6060f1SDimitry Andricdef : GINodeEquiv<G_FCMGE, AArch64fcmge>;
296fe6060f1SDimitry Andricdef : GINodeEquiv<G_FCMGT, AArch64fcmgt>;
297fe6060f1SDimitry Andric
298fe6060f1SDimitry Andricdef : GINodeEquiv<G_FCMEQZ, AArch64fcmeqz>;
299fe6060f1SDimitry Andricdef : GINodeEquiv<G_FCMGEZ, AArch64fcmgez>;
300fe6060f1SDimitry Andricdef : GINodeEquiv<G_FCMGTZ, AArch64fcmgtz>;
301fe6060f1SDimitry Andricdef : GINodeEquiv<G_FCMLEZ, AArch64fcmlez>;
302fe6060f1SDimitry Andricdef : GINodeEquiv<G_FCMLTZ, AArch64fcmltz>;
303fe6060f1SDimitry Andric
3045f757f3fSDimitry Andricdef : GINodeEquiv<G_BSP, AArch64bsp>;
3055f757f3fSDimitry Andric
3065f757f3fSDimitry Andricdef : GINodeEquiv<G_UMULL, AArch64umull>;
3075f757f3fSDimitry Andricdef : GINodeEquiv<G_SMULL, AArch64smull>;
3085f757f3fSDimitry Andric
3097a6dacacSDimitry Andricdef : GINodeEquiv<G_SADDLP, AArch64saddlp_n>;
3107a6dacacSDimitry Andricdef : GINodeEquiv<G_UADDLP, AArch64uaddlp_n>;
3117a6dacacSDimitry Andric
3127a6dacacSDimitry Andricdef : GINodeEquiv<G_SADDLV, AArch64saddlv>;
3137a6dacacSDimitry Andricdef : GINodeEquiv<G_UADDLV, AArch64uaddlv>;
3147a6dacacSDimitry Andric
3155f757f3fSDimitry Andricdef : GINodeEquiv<G_UDOT, AArch64udot>;
3165f757f3fSDimitry Andricdef : GINodeEquiv<G_SDOT, AArch64sdot>;
317bdd1243dSDimitry Andric
318e8d8bef9SDimitry Andricdef : GINodeEquiv<G_EXTRACT_VECTOR_ELT, vector_extract>;
319e8d8bef9SDimitry Andric
3205f757f3fSDimitry Andricdef : GINodeEquiv<G_AARCH64_PREFETCH, AArch64Prefetch>;
321bdd1243dSDimitry Andric
322e8d8bef9SDimitry Andric// These are patterns that we only use for GlobalISel via the importer.
323e8d8bef9SDimitry Andricdef : Pat<(f32 (fadd (vector_extract (v2f32 FPR64:$Rn), (i64 0)),
324e8d8bef9SDimitry Andric                     (vector_extract (v2f32 FPR64:$Rn), (i64 1)))),
325e8d8bef9SDimitry Andric           (f32 (FADDPv2i32p (v2f32 FPR64:$Rn)))>;
326fe6060f1SDimitry Andric
327fe6060f1SDimitry Andriclet Predicates = [HasNEON] in {
328fe6060f1SDimitry Andric  def : Pat<(v2f64 (sint_to_fp v2i32:$src)),
329fe6060f1SDimitry Andric            (SCVTFv2f64 (SSHLLv2i32_shift V64:$src, 0))>;
330fe6060f1SDimitry Andric  def : Pat<(v2f64 (uint_to_fp v2i32:$src)),
331fe6060f1SDimitry Andric            (UCVTFv2f64 (USHLLv2i32_shift V64:$src, 0))>;
332fe6060f1SDimitry Andric  def : Pat<(v2f32 (sint_to_fp v2i64:$src)),
333fe6060f1SDimitry Andric            (FCVTNv2i32 (SCVTFv2f64 V128:$src))>;
334fe6060f1SDimitry Andric  def : Pat<(v2f32 (uint_to_fp v2i64:$src)),
335fe6060f1SDimitry Andric            (FCVTNv2i32 (UCVTFv2f64 V128:$src))>;
336fe6060f1SDimitry Andric
337fe6060f1SDimitry Andric  def : Pat<(v2i64 (fp_to_sint v2f32:$src)),
338fe6060f1SDimitry Andric            (FCVTZSv2f64 (FCVTLv2i32 V64:$src))>;
339fe6060f1SDimitry Andric  def : Pat<(v2i64 (fp_to_uint v2f32:$src)),
340fe6060f1SDimitry Andric            (FCVTZUv2f64 (FCVTLv2i32 V64:$src))>;
341fe6060f1SDimitry Andric  def : Pat<(v2i32 (fp_to_sint v2f64:$src)),
342fe6060f1SDimitry Andric            (XTNv2i32 (FCVTZSv2f64 V128:$src))>;
343fe6060f1SDimitry Andric  def : Pat<(v2i32 (fp_to_uint v2f64:$src)),
344fe6060f1SDimitry Andric            (XTNv2i32 (FCVTZUv2f64 V128:$src))>;
345fe6060f1SDimitry Andric
346fe6060f1SDimitry Andric}
347fe6060f1SDimitry Andric
348fe6060f1SDimitry Andriclet Predicates = [HasNoLSE] in {
349*0fca6ea1SDimitry Andricdef : Pat<(atomic_cmp_swap_i8 GPR64:$addr, GPR32:$desired, GPR32:$new),
350fe6060f1SDimitry Andric          (CMP_SWAP_8 GPR64:$addr, GPR32:$desired, GPR32:$new)>;
351fe6060f1SDimitry Andric
352*0fca6ea1SDimitry Andricdef : Pat<(atomic_cmp_swap_i16 GPR64:$addr, GPR32:$desired, GPR32:$new),
353fe6060f1SDimitry Andric          (CMP_SWAP_16 GPR64:$addr, GPR32:$desired, GPR32:$new)>;
354fe6060f1SDimitry Andric
355*0fca6ea1SDimitry Andricdef : Pat<(atomic_cmp_swap_i32 GPR64:$addr, GPR32:$desired, GPR32:$new),
356fe6060f1SDimitry Andric          (CMP_SWAP_32 GPR64:$addr, GPR32:$desired, GPR32:$new)>;
357fe6060f1SDimitry Andric
358*0fca6ea1SDimitry Andricdef : Pat<(atomic_cmp_swap_i64 GPR64:$addr, GPR64:$desired, GPR64:$new),
359fe6060f1SDimitry Andric          (CMP_SWAP_64 GPR64:$addr, GPR64:$desired, GPR64:$new)>;
360fe6060f1SDimitry Andric}
361fe6060f1SDimitry Andric
362fe6060f1SDimitry Andricdef : Pat<(int_aarch64_stlxp GPR64:$lo, GPR64:$hi, GPR64:$addr),
363fe6060f1SDimitry Andric          (STLXPX GPR64:$lo, GPR64:$hi, GPR64:$addr)>;
364fe6060f1SDimitry Andricdef : Pat<(int_aarch64_stxp GPR64:$lo, GPR64:$hi, GPR64:$addr),
365fe6060f1SDimitry Andric          (STXPX GPR64:$lo, GPR64:$hi, GPR64:$addr)>;
36606c3fb27SDimitry Andric
3675f757f3fSDimitry Andriclet GIIgnoreCopies = 1 in
3685f757f3fSDimitry Andricclass PatIgnoreCopies<dag pattern, dag result> : Pat<pattern, result>, GISelFlags;
3695f757f3fSDimitry Andric
37006c3fb27SDimitry Andricmulticlass SIMDAcrossLanesSignedIntrinsicBHS<string baseOpc, Intrinsic intOp> {
3715f757f3fSDimitry Andric  def : PatIgnoreCopies<(i32 (sext (i8 (intOp (v8i8 V64:$Rn))))),
37206c3fb27SDimitry Andric        (i32 (SMOVvi8to32
37306c3fb27SDimitry Andric          (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
37406c3fb27SDimitry Andric           (!cast<Instruction>(!strconcat(baseOpc, "v8i8v")) V64:$Rn), bsub),
37506c3fb27SDimitry Andric          (i64 0)))>;
3765f757f3fSDimitry Andric  def : Pat<(i8 (intOp (v8i8 V64:$Rn))),
3775f757f3fSDimitry Andric        (!cast<Instruction>(!strconcat(baseOpc, "v8i8v")) V64:$Rn)>;
3785f757f3fSDimitry Andric
3795f757f3fSDimitry Andric  def : PatIgnoreCopies<(i32 (sext (i8 (intOp (v16i8 V128:$Rn))))),
38006c3fb27SDimitry Andric        (i32 (SMOVvi8to32
38106c3fb27SDimitry Andric          (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
38206c3fb27SDimitry Andric           (!cast<Instruction>(!strconcat(baseOpc, "v16i8v")) V128:$Rn), bsub),
38306c3fb27SDimitry Andric          (i64 0)))>;
3845f757f3fSDimitry Andric  def : Pat<(i8 (intOp (v16i8 V128:$Rn))),
3855f757f3fSDimitry Andric        (!cast<Instruction>(!strconcat(baseOpc, "v16i8v")) V128:$Rn)>;
38606c3fb27SDimitry Andric
3875f757f3fSDimitry Andric  def : PatIgnoreCopies<(i32 (sext (i16 (intOp (v4i16 V64:$Rn))))),
38806c3fb27SDimitry Andric        (i32 (SMOVvi16to32
38906c3fb27SDimitry Andric          (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
39006c3fb27SDimitry Andric           (!cast<Instruction>(!strconcat(baseOpc, "v4i16v")) V64:$Rn), hsub),
39106c3fb27SDimitry Andric          (i64 0)))>;
3925f757f3fSDimitry Andric  def : Pat<(i16 (intOp (v4i16 V64:$Rn))),
3935f757f3fSDimitry Andric        (!cast<Instruction>(!strconcat(baseOpc, "v4i16v")) V64:$Rn)>;
3945f757f3fSDimitry Andric
3955f757f3fSDimitry Andric  def : PatIgnoreCopies<(i32 (sext (i16 (intOp (v8i16 V128:$Rn))))),
39606c3fb27SDimitry Andric        (i32 (SMOVvi16to32
39706c3fb27SDimitry Andric          (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
39806c3fb27SDimitry Andric           (!cast<Instruction>(!strconcat(baseOpc, "v8i16v")) V128:$Rn), hsub),
39906c3fb27SDimitry Andric          (i64 0)))>;
4005f757f3fSDimitry Andric  def : Pat<(i16 (intOp (v8i16 V128:$Rn))),
4015f757f3fSDimitry Andric        (!cast<Instruction>(!strconcat(baseOpc, "v8i16v")) V128:$Rn)>;
40206c3fb27SDimitry Andric
4035f757f3fSDimitry Andric  def : PatIgnoreCopies<(i32 (intOp (v4i32 V128:$Rn))),
40406c3fb27SDimitry Andric        (i32 (EXTRACT_SUBREG
40506c3fb27SDimitry Andric          (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
40606c3fb27SDimitry Andric           (!cast<Instruction>(!strconcat(baseOpc, "v4i32v")) V128:$Rn), ssub),
40706c3fb27SDimitry Andric          ssub))>;
40806c3fb27SDimitry Andric}
40906c3fb27SDimitry Andric
41006c3fb27SDimitry Andricmulticlass SIMDAcrossLanesUnsignedIntrinsicBHS<string baseOpc,
41106c3fb27SDimitry Andric                                                Intrinsic intOp> {
4125f757f3fSDimitry Andric  def : PatIgnoreCopies<(i32 (zext (i8 (intOp (v8i8 V64:$Rn))))),
4135f757f3fSDimitry Andric        (COPY_TO_REGCLASS
41406c3fb27SDimitry Andric          (i32 (EXTRACT_SUBREG
41506c3fb27SDimitry Andric            (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
41606c3fb27SDimitry Andric              (!cast<Instruction>(!strconcat(baseOpc, "v8i8v")) V64:$Rn), bsub),
4175f757f3fSDimitry Andric            ssub)),
4185f757f3fSDimitry Andric          GPR32)>;
4195f757f3fSDimitry Andric  def : Pat<(i8 (intOp (v8i8 V64:$Rn))),
4205f757f3fSDimitry Andric        (!cast<Instruction>(!strconcat(baseOpc, "v8i8v")) V64:$Rn)>;
4215f757f3fSDimitry Andric
4225f757f3fSDimitry Andric  def : PatIgnoreCopies<(i32 (zext (i8 (intOp (v16i8 V128:$Rn))))),
4235f757f3fSDimitry Andric        (COPY_TO_REGCLASS
42406c3fb27SDimitry Andric          (i32 (EXTRACT_SUBREG
42506c3fb27SDimitry Andric            (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
42606c3fb27SDimitry Andric              (!cast<Instruction>(!strconcat(baseOpc, "v16i8v")) V128:$Rn), bsub),
4275f757f3fSDimitry Andric            ssub)),
4285f757f3fSDimitry Andric        GPR32)>;
4295f757f3fSDimitry Andric  def : Pat<(i8 (intOp (v16i8 V128:$Rn))),
4305f757f3fSDimitry Andric        (!cast<Instruction>(!strconcat(baseOpc, "v16i8v")) V128:$Rn)>;
43106c3fb27SDimitry Andric
4325f757f3fSDimitry Andric
4335f757f3fSDimitry Andric  def : PatIgnoreCopies<(i32 (zext (i16 (intOp (v4i16 V64:$Rn))))),
4345f757f3fSDimitry Andric        (COPY_TO_REGCLASS
43506c3fb27SDimitry Andric          (i32 (EXTRACT_SUBREG
43606c3fb27SDimitry Andric            (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
43706c3fb27SDimitry Andric              (!cast<Instruction>(!strconcat(baseOpc, "v4i16v")) V64:$Rn), hsub),
4385f757f3fSDimitry Andric            ssub)),
4395f757f3fSDimitry Andric          GPR32)>;
4405f757f3fSDimitry Andric  def : Pat<(i16 (intOp (v4i16 V64:$Rn))),
4415f757f3fSDimitry Andric        (!cast<Instruction>(!strconcat(baseOpc, "v4i16v")) V64:$Rn)>;
4425f757f3fSDimitry Andric
4435f757f3fSDimitry Andric  def : PatIgnoreCopies<(i32 (zext (i16 (intOp (v8i16 V128:$Rn))))),
4445f757f3fSDimitry Andric        (COPY_TO_REGCLASS
44506c3fb27SDimitry Andric          (i32 (EXTRACT_SUBREG
44606c3fb27SDimitry Andric            (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
44706c3fb27SDimitry Andric              (!cast<Instruction>(!strconcat(baseOpc, "v8i16v")) V128:$Rn), hsub),
4485f757f3fSDimitry Andric            ssub)),
4495f757f3fSDimitry Andric        GPR32)>;
4505f757f3fSDimitry Andric  def : Pat<(i16 (intOp (v8i16 V128:$Rn))),
4515f757f3fSDimitry Andric        (!cast<Instruction>(!strconcat(baseOpc, "v8i16v")) V128:$Rn)>;
45206c3fb27SDimitry Andric
4535f757f3fSDimitry Andric  def : PatIgnoreCopies<(i32 (intOp (v4i32 V128:$Rn))),
45406c3fb27SDimitry Andric        (i32 (EXTRACT_SUBREG
45506c3fb27SDimitry Andric          (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
45606c3fb27SDimitry Andric            (!cast<Instruction>(!strconcat(baseOpc, "v4i32v")) V128:$Rn), ssub),
45706c3fb27SDimitry Andric          ssub))>;
45806c3fb27SDimitry Andric}
45906c3fb27SDimitry Andric
46006c3fb27SDimitry Andric
46106c3fb27SDimitry Andricdefm : SIMDAcrossLanesSignedIntrinsicBHS<"ADDV", int_aarch64_neon_saddv>;
46206c3fb27SDimitry Andric// vaddv_[su]32 is special; -> ADDP Vd.2S,Vn.2S,Vm.2S; return Vd.s[0];Vn==Vm
46306c3fb27SDimitry Andricdef : Pat<(i32 (int_aarch64_neon_saddv (v2i32 V64:$Rn))),
46406c3fb27SDimitry Andric          (i32 (EXTRACT_SUBREG
46506c3fb27SDimitry Andric            (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
46606c3fb27SDimitry Andric              (ADDPv2i32 V64:$Rn, V64:$Rn), dsub),
46706c3fb27SDimitry Andric            ssub))>;
46806c3fb27SDimitry Andric
4695f757f3fSDimitry Andricdef : Pat<(i64 (int_aarch64_neon_saddv (v2i64 V128:$Rn))),
4705f757f3fSDimitry Andric          (i64 (EXTRACT_SUBREG
4715f757f3fSDimitry Andric          (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)),
4725f757f3fSDimitry Andric              (ADDPv2i64p V128:$Rn), dsub),
4735f757f3fSDimitry Andric            dsub))>;
4745f757f3fSDimitry Andric
47506c3fb27SDimitry Andricdefm : SIMDAcrossLanesUnsignedIntrinsicBHS<"ADDV", int_aarch64_neon_uaddv>;
47606c3fb27SDimitry Andricdef : Pat<(i32 (int_aarch64_neon_uaddv (v2i32 V64:$Rn))),
47706c3fb27SDimitry Andric          (i32 (EXTRACT_SUBREG
47806c3fb27SDimitry Andric            (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
47906c3fb27SDimitry Andric              (ADDPv2i32 V64:$Rn, V64:$Rn), dsub),
48006c3fb27SDimitry Andric            ssub))>;
4815f757f3fSDimitry Andricdef : Pat<(i64 (int_aarch64_neon_uaddv (v2i64 V128:$Rn))),
4825f757f3fSDimitry Andric          (i64 (EXTRACT_SUBREG
4835f757f3fSDimitry Andric          (INSERT_SUBREG (v2i64 (IMPLICIT_DEF)),
4845f757f3fSDimitry Andric              (ADDPv2i64p V128:$Rn), dsub),
4855f757f3fSDimitry Andric            dsub))>;
48606c3fb27SDimitry Andric
48706c3fb27SDimitry Andricdefm : SIMDAcrossLanesSignedIntrinsicBHS<"SMAXV", int_aarch64_neon_smaxv>;
48806c3fb27SDimitry Andricdef : Pat<(i32 (int_aarch64_neon_smaxv (v2i32 V64:$Rn))),
48906c3fb27SDimitry Andric          (i32 (EXTRACT_SUBREG
49006c3fb27SDimitry Andric            (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
49106c3fb27SDimitry Andric              (SMAXPv2i32 V64:$Rn, V64:$Rn), dsub),
49206c3fb27SDimitry Andric            ssub))>;
49306c3fb27SDimitry Andric
49406c3fb27SDimitry Andricdefm : SIMDAcrossLanesSignedIntrinsicBHS<"SMINV", int_aarch64_neon_sminv>;
49506c3fb27SDimitry Andricdef : Pat<(i32 (int_aarch64_neon_sminv (v2i32 V64:$Rn))),
49606c3fb27SDimitry Andric          (i32 (EXTRACT_SUBREG
49706c3fb27SDimitry Andric            (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
49806c3fb27SDimitry Andric              (SMINPv2i32 V64:$Rn, V64:$Rn), dsub),
49906c3fb27SDimitry Andric            ssub))>;
50006c3fb27SDimitry Andric
50106c3fb27SDimitry Andricdefm : SIMDAcrossLanesUnsignedIntrinsicBHS<"UMAXV", int_aarch64_neon_umaxv>;
50206c3fb27SDimitry Andricdef : Pat<(i32 (int_aarch64_neon_umaxv (v2i32 V64:$Rn))),
50306c3fb27SDimitry Andric          (i32 (EXTRACT_SUBREG
50406c3fb27SDimitry Andric            (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
50506c3fb27SDimitry Andric              (UMAXPv2i32 V64:$Rn, V64:$Rn), dsub),
50606c3fb27SDimitry Andric            ssub))>;
50706c3fb27SDimitry Andric
50806c3fb27SDimitry Andricdefm : SIMDAcrossLanesUnsignedIntrinsicBHS<"UMINV", int_aarch64_neon_uminv>;
50906c3fb27SDimitry Andricdef : Pat<(i32 (int_aarch64_neon_uminv (v2i32 V64:$Rn))),
51006c3fb27SDimitry Andric          (i32 (EXTRACT_SUBREG
51106c3fb27SDimitry Andric            (INSERT_SUBREG (v16i8 (IMPLICIT_DEF)),
51206c3fb27SDimitry Andric              (UMINPv2i32 V64:$Rn, V64:$Rn), dsub),
51306c3fb27SDimitry Andric            ssub))>;
5145f757f3fSDimitry Andric
5155f757f3fSDimitry Andric// Match stores from lane 0 to the appropriate subreg's store.
5165f757f3fSDimitry Andricmulticlass VecStoreLane64_0Pat<ComplexPattern UIAddrMode, SDPatternOperator storeop,
5175f757f3fSDimitry Andric                            ValueType VTy, ValueType STy,
5185f757f3fSDimitry Andric                            SubRegIndex SubRegIdx, Operand IndexType,
5195f757f3fSDimitry Andric                            Instruction STR> {
5205f757f3fSDimitry Andric  def : Pat<(storeop (STy (vector_extract (VTy VecListOne64:$Vt), (i64 0))),
5215f757f3fSDimitry Andric                     (UIAddrMode GPR64sp:$Rn, IndexType:$offset)),
5225f757f3fSDimitry Andric            (STR (EXTRACT_SUBREG VecListOne64:$Vt, SubRegIdx),
5235f757f3fSDimitry Andric                 GPR64sp:$Rn, IndexType:$offset)>;
5245f757f3fSDimitry Andric}
5255f757f3fSDimitry Andricmulticlass VecStoreULane64_0Pat<SDPatternOperator StoreOp,
5265f757f3fSDimitry Andric                             ValueType VTy, ValueType STy,
5275f757f3fSDimitry Andric                             SubRegIndex SubRegIdx, Instruction STR> {
5285f757f3fSDimitry Andric  defm : VecStoreLane64_0Pat<am_unscaled64, StoreOp, VTy, STy, SubRegIdx, simm9, STR>;
5295f757f3fSDimitry Andric}
5305f757f3fSDimitry Andric
5315f757f3fSDimitry Andricmulticlass VecROStoreLane64_0Pat<ROAddrMode ro, SDPatternOperator storeop,
5325f757f3fSDimitry Andric                              ValueType VecTy, ValueType STy,
5335f757f3fSDimitry Andric                              SubRegIndex SubRegIdx,
5345f757f3fSDimitry Andric                              Instruction STRW, Instruction STRX> {
5355f757f3fSDimitry Andric
5365f757f3fSDimitry Andric  def : Pat<(storeop (STy (vector_extract (VecTy VecListOne64:$Vt), (i64 0))),
5375f757f3fSDimitry Andric                     (ro.Wpat GPR64sp:$Rn, GPR32:$Rm, ro.Wext:$extend)),
5385f757f3fSDimitry Andric            (STRW (EXTRACT_SUBREG VecListOne64:$Vt, SubRegIdx),
5395f757f3fSDimitry Andric                  GPR64sp:$Rn, GPR32:$Rm, ro.Wext:$extend)>;
5405f757f3fSDimitry Andric
5415f757f3fSDimitry Andric  def : Pat<(storeop (STy (vector_extract (VecTy VecListOne64:$Vt), (i64 0))),
5425f757f3fSDimitry Andric                     (ro.Xpat GPR64sp:$Rn, GPR64:$Rm, ro.Xext:$extend)),
5435f757f3fSDimitry Andric            (STRX (EXTRACT_SUBREG VecListOne64:$Vt, SubRegIdx),
5445f757f3fSDimitry Andric                  GPR64sp:$Rn, GPR64:$Rm, ro.Xext:$extend)>;
5455f757f3fSDimitry Andric}
5465f757f3fSDimitry Andric
5475f757f3fSDimitry Andriclet AddedComplexity = 19 in {
5485f757f3fSDimitry Andric  def : St1Lane128Pat<store, VectorIndexB, v16i8, i8,  ST1i8>;
5495f757f3fSDimitry Andric  def : St1Lane64Pat<store, VectorIndexB, v8i8,  i8,  ST1i8>;
5505f757f3fSDimitry Andric
5515f757f3fSDimitry Andric  defm : VecStoreLane64_0Pat<am_indexed16, store, v4i16, i16, hsub, uimm12s2, STRHui>;
5525f757f3fSDimitry Andric  defm : VecStoreLane64_0Pat<am_indexed32, store, v2i32, i32, ssub, uimm12s4, STRSui>;
5535f757f3fSDimitry Andric
5545f757f3fSDimitry Andric  defm : VecStoreULane64_0Pat<store, v4i16, i16, hsub, STURHi>;
5555f757f3fSDimitry Andric  defm : VecStoreULane64_0Pat<store, v2i32, i32, ssub, STURSi>;
5565f757f3fSDimitry Andric  defm : VecROStoreLane64_0Pat<ro16, store, v4i16, i16, hsub, STRHroW, STRHroX>;
5575f757f3fSDimitry Andric  defm : VecROStoreLane64_0Pat<ro32, store, v2i32, i32, ssub, STRSroW, STRSroX>;
5585f757f3fSDimitry Andric}
5595f757f3fSDimitry Andric
5605f757f3fSDimitry Andricdef : Pat<(v8i8 (AArch64dup (i8 (load (am_indexed8 GPR64sp:$Rn))))),
5615f757f3fSDimitry Andric          (LD1Rv8b GPR64sp:$Rn)>;
5625f757f3fSDimitry Andricdef : Pat<(v16i8 (AArch64dup (i8 (load GPR64sp:$Rn)))),
5635f757f3fSDimitry Andric          (LD1Rv16b GPR64sp:$Rn)>;
5645f757f3fSDimitry Andricdef : Pat<(v4i16 (AArch64dup (i16 (load GPR64sp:$Rn)))),
5655f757f3fSDimitry Andric          (LD1Rv4h GPR64sp:$Rn)>;
5665f757f3fSDimitry Andricdef : Pat<(v8i16 (AArch64dup (i16 (load GPR64sp:$Rn)))),
5675f757f3fSDimitry Andric          (LD1Rv8h GPR64sp:$Rn)>;
5685f757f3fSDimitry Andricdef : Pat<(v2i32 (AArch64dup (i32 (load GPR64sp:$Rn)))),
5695f757f3fSDimitry Andric          (LD1Rv2s GPR64sp:$Rn)>;
5705f757f3fSDimitry Andricdef : Pat<(v4i32 (AArch64dup (i32 (load GPR64sp:$Rn)))),
5715f757f3fSDimitry Andric          (LD1Rv4s GPR64sp:$Rn)>;
5725f757f3fSDimitry Andricdef : Pat<(v2i64 (AArch64dup (i64 (load GPR64sp:$Rn)))),
5735f757f3fSDimitry Andric          (LD1Rv2d GPR64sp:$Rn)>;
5745f757f3fSDimitry Andricdef : Pat<(v1i64 (AArch64dup (i64 (load GPR64sp:$Rn)))),
5755f757f3fSDimitry Andric          (LD1Rv1d GPR64sp:$Rn)>;
576