SVEInstrFormats.td revision 360784
1//=-- SVEInstrFormats.td -  AArch64 SVE Instruction classes -*- tablegen -*--=//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// AArch64 Scalable Vector Extension (SVE) Instruction Class Definitions.
10//
11//===----------------------------------------------------------------------===//
12
13def SVEPatternOperand : AsmOperandClass {
14  let Name = "SVEPattern";
15  let ParserMethod = "tryParseSVEPattern";
16  let PredicateMethod = "isSVEPattern";
17  let RenderMethod = "addImmOperands";
18  let DiagnosticType = "InvalidSVEPattern";
19}
20
21def sve_pred_enum : Operand<i32>, TImmLeaf<i32, [{
22  return (((uint32_t)Imm) < 32);
23  }]> {
24
25  let PrintMethod = "printSVEPattern";
26  let ParserMatchClass = SVEPatternOperand;
27}
28
29def SVEPrefetchOperand : AsmOperandClass {
30  let Name = "SVEPrefetch";
31  let ParserMethod = "tryParsePrefetch<true>";
32  let PredicateMethod = "isPrefetch";
33  let RenderMethod = "addPrefetchOperands";
34}
35
36def sve_prfop : Operand<i32>, ImmLeaf<i32, [{
37    return (((uint32_t)Imm) <= 15);
38  }]> {
39  let PrintMethod = "printPrefetchOp<true>";
40  let ParserMatchClass = SVEPrefetchOperand;
41}
42
43class SVELogicalImmOperand<int Width> : AsmOperandClass {
44  let Name = "SVELogicalImm" # Width;
45  let DiagnosticType = "LogicalSecondSource";
46  let PredicateMethod = "isLogicalImm<int" # Width # "_t>";
47  let RenderMethod = "addLogicalImmOperands<int" # Width # "_t>";
48}
49
50def sve_logical_imm8 : Operand<i64> {
51  let ParserMatchClass = SVELogicalImmOperand<8>;
52  let PrintMethod = "printLogicalImm<int8_t>";
53
54  let MCOperandPredicate = [{
55    if (!MCOp.isImm())
56      return false;
57    int64_t Val = AArch64_AM::decodeLogicalImmediate(MCOp.getImm(), 64);
58    return AArch64_AM::isSVEMaskOfIdenticalElements<int8_t>(Val);
59  }];
60}
61
62def sve_logical_imm16 : Operand<i64> {
63  let ParserMatchClass = SVELogicalImmOperand<16>;
64  let PrintMethod = "printLogicalImm<int16_t>";
65
66  let MCOperandPredicate = [{
67    if (!MCOp.isImm())
68      return false;
69    int64_t Val = AArch64_AM::decodeLogicalImmediate(MCOp.getImm(), 64);
70    return AArch64_AM::isSVEMaskOfIdenticalElements<int16_t>(Val);
71  }];
72}
73
74def sve_logical_imm32 : Operand<i64> {
75  let ParserMatchClass = SVELogicalImmOperand<32>;
76  let PrintMethod = "printLogicalImm<int32_t>";
77
78  let MCOperandPredicate = [{
79    if (!MCOp.isImm())
80      return false;
81    int64_t Val = AArch64_AM::decodeLogicalImmediate(MCOp.getImm(), 64);
82    return AArch64_AM::isSVEMaskOfIdenticalElements<int32_t>(Val);
83  }];
84}
85
86class SVEPreferredLogicalImmOperand<int Width> : AsmOperandClass {
87  let Name = "SVEPreferredLogicalImm" # Width;
88  let PredicateMethod = "isSVEPreferredLogicalImm<int" # Width # "_t>";
89  let RenderMethod = "addLogicalImmOperands<int" # Width # "_t>";
90}
91
92def sve_preferred_logical_imm16 : Operand<i64> {
93  let ParserMatchClass = SVEPreferredLogicalImmOperand<16>;
94  let PrintMethod = "printSVELogicalImm<int16_t>";
95
96  let MCOperandPredicate = [{
97    if (!MCOp.isImm())
98      return false;
99    int64_t Val = AArch64_AM::decodeLogicalImmediate(MCOp.getImm(), 64);
100    return AArch64_AM::isSVEMaskOfIdenticalElements<int16_t>(Val) &&
101           AArch64_AM::isSVEMoveMaskPreferredLogicalImmediate(Val);
102  }];
103}
104
105def sve_preferred_logical_imm32 : Operand<i64> {
106  let ParserMatchClass =  SVEPreferredLogicalImmOperand<32>;
107  let PrintMethod = "printSVELogicalImm<int32_t>";
108
109  let MCOperandPredicate = [{
110    if (!MCOp.isImm())
111      return false;
112    int64_t Val = AArch64_AM::decodeLogicalImmediate(MCOp.getImm(), 64);
113    return AArch64_AM::isSVEMaskOfIdenticalElements<int32_t>(Val) &&
114           AArch64_AM::isSVEMoveMaskPreferredLogicalImmediate(Val);
115  }];
116}
117
118def sve_preferred_logical_imm64 : Operand<i64> {
119  let ParserMatchClass = SVEPreferredLogicalImmOperand<64>;
120  let PrintMethod = "printSVELogicalImm<int64_t>";
121
122  let MCOperandPredicate = [{
123    if (!MCOp.isImm())
124      return false;
125    int64_t Val = AArch64_AM::decodeLogicalImmediate(MCOp.getImm(), 64);
126    return AArch64_AM::isSVEMaskOfIdenticalElements<int64_t>(Val) &&
127           AArch64_AM::isSVEMoveMaskPreferredLogicalImmediate(Val);
128  }];
129}
130
131class SVELogicalImmNotOperand<int Width> : AsmOperandClass {
132  let Name = "SVELogicalImm" # Width # "Not";
133  let DiagnosticType = "LogicalSecondSource";
134  let PredicateMethod = "isLogicalImm<int" # Width # "_t>";
135  let RenderMethod = "addLogicalImmNotOperands<int" # Width # "_t>";
136}
137
138def sve_logical_imm8_not : Operand<i64> {
139  let ParserMatchClass = SVELogicalImmNotOperand<8>;
140}
141
142def sve_logical_imm16_not : Operand<i64> {
143  let ParserMatchClass = SVELogicalImmNotOperand<16>;
144}
145
146def sve_logical_imm32_not : Operand<i64> {
147  let ParserMatchClass = SVELogicalImmNotOperand<32>;
148}
149
150class SVEShiftedImmOperand<int ElementWidth, string Infix, string Predicate>
151    : AsmOperandClass {
152  let Name = "SVE" # Infix # "Imm" # ElementWidth;
153  let DiagnosticType = "Invalid" # Name;
154  let RenderMethod = "addImmWithOptionalShiftOperands<8>";
155  let ParserMethod = "tryParseImmWithOptionalShift";
156  let PredicateMethod = Predicate;
157}
158
159def SVECpyImmOperand8  : SVEShiftedImmOperand<8,  "Cpy", "isSVECpyImm<int8_t>">;
160def SVECpyImmOperand16 : SVEShiftedImmOperand<16, "Cpy", "isSVECpyImm<int16_t>">;
161def SVECpyImmOperand32 : SVEShiftedImmOperand<32, "Cpy", "isSVECpyImm<int32_t>">;
162def SVECpyImmOperand64 : SVEShiftedImmOperand<64, "Cpy", "isSVECpyImm<int64_t>">;
163
164def SVEAddSubImmOperand8  : SVEShiftedImmOperand<8,  "AddSub", "isSVEAddSubImm<int8_t>">;
165def SVEAddSubImmOperand16 : SVEShiftedImmOperand<16, "AddSub", "isSVEAddSubImm<int16_t>">;
166def SVEAddSubImmOperand32 : SVEShiftedImmOperand<32, "AddSub", "isSVEAddSubImm<int32_t>">;
167def SVEAddSubImmOperand64 : SVEShiftedImmOperand<64, "AddSub", "isSVEAddSubImm<int64_t>">;
168
169class imm8_opt_lsl<int ElementWidth, string printType,
170                   AsmOperandClass OpndClass, code Predicate>
171    : Operand<i32>, ImmLeaf<i32, Predicate> {
172  let EncoderMethod = "getImm8OptLsl";
173  let DecoderMethod = "DecodeImm8OptLsl<" # ElementWidth # ">";
174  let PrintMethod = "printImm8OptLsl<" # printType # ">";
175  let ParserMatchClass = OpndClass;
176  let MIOperandInfo = (ops i32imm, i32imm);
177}
178
179def cpy_imm8_opt_lsl_i8  : imm8_opt_lsl<8,  "int8_t",  SVECpyImmOperand8,  [{
180  return AArch64_AM::isSVECpyImm<int8_t>(Imm);
181}]>;
182def cpy_imm8_opt_lsl_i16 : imm8_opt_lsl<16, "int16_t", SVECpyImmOperand16, [{
183  return AArch64_AM::isSVECpyImm<int16_t>(Imm);
184}]>;
185def cpy_imm8_opt_lsl_i32 : imm8_opt_lsl<32, "int32_t", SVECpyImmOperand32, [{
186  return AArch64_AM::isSVECpyImm<int32_t>(Imm);
187}]>;
188def cpy_imm8_opt_lsl_i64 : imm8_opt_lsl<64, "int64_t", SVECpyImmOperand64, [{
189  return AArch64_AM::isSVECpyImm<int64_t>(Imm);
190}]>;
191
192def addsub_imm8_opt_lsl_i8  : imm8_opt_lsl<8,  "uint8_t",  SVEAddSubImmOperand8,  [{
193  return AArch64_AM::isSVEAddSubImm<int8_t>(Imm);
194}]>;
195def addsub_imm8_opt_lsl_i16 : imm8_opt_lsl<16, "uint16_t", SVEAddSubImmOperand16, [{
196  return AArch64_AM::isSVEAddSubImm<int16_t>(Imm);
197}]>;
198def addsub_imm8_opt_lsl_i32 : imm8_opt_lsl<32, "uint32_t", SVEAddSubImmOperand32, [{
199  return AArch64_AM::isSVEAddSubImm<int32_t>(Imm);
200}]>;
201def addsub_imm8_opt_lsl_i64 : imm8_opt_lsl<64, "uint64_t", SVEAddSubImmOperand64, [{
202  return AArch64_AM::isSVEAddSubImm<int64_t>(Imm);
203}]>;
204
205def SVEAddSubImm8Pat  : ComplexPattern<i32, 2, "SelectSVEAddSubImm<MVT::i8>", []>;
206def SVEAddSubImm16Pat : ComplexPattern<i32, 2, "SelectSVEAddSubImm<MVT::i16>", []>;
207def SVEAddSubImm32Pat : ComplexPattern<i32, 2, "SelectSVEAddSubImm<MVT::i32>", []>;
208def SVEAddSubImm64Pat : ComplexPattern<i32, 2, "SelectSVEAddSubImm<MVT::i64>", []>;
209
210def SVELogicalImm8Pat  : ComplexPattern<i64, 1, "SelectSVELogicalImm<MVT::i8>", []>;
211def SVELogicalImm16Pat : ComplexPattern<i64, 1, "SelectSVELogicalImm<MVT::i16>", []>;
212def SVELogicalImm32Pat : ComplexPattern<i64, 1, "SelectSVELogicalImm<MVT::i32>", []>;
213def SVELogicalImm64Pat : ComplexPattern<i64, 1, "SelectSVELogicalImm<MVT::i64>", []>;
214
215def SVEArithUImmPat  : ComplexPattern<i32, 1, "SelectSVEArithImm", []>;
216def SVEArithSImmPat  : ComplexPattern<i32, 1, "SelectSVESignedArithImm", []>;
217
218class SVEExactFPImm<string Suffix, string ValA, string ValB> : AsmOperandClass {
219  let Name = "SVEExactFPImmOperand" # Suffix;
220  let DiagnosticType = "Invalid" # Name;
221  let ParserMethod = "tryParseFPImm<false>";
222  let PredicateMethod = "isExactFPImm<" # ValA # ", " # ValB # ">";
223  let RenderMethod = "addExactFPImmOperands<" # ValA # ", " # ValB # ">";
224}
225
226class SVEExactFPImmOperand<string Suffix, string ValA, string ValB> : Operand<i32> {
227  let PrintMethod = "printExactFPImm<" # ValA # ", " # ValB # ">";
228  let ParserMatchClass = SVEExactFPImm<Suffix, ValA, ValB>;
229}
230
231def sve_fpimm_half_one
232    : SVEExactFPImmOperand<"HalfOne", "AArch64ExactFPImm::half",
233                           "AArch64ExactFPImm::one">;
234def sve_fpimm_half_two
235    : SVEExactFPImmOperand<"HalfTwo", "AArch64ExactFPImm::half",
236                           "AArch64ExactFPImm::two">;
237def sve_fpimm_zero_one
238    : SVEExactFPImmOperand<"ZeroOne", "AArch64ExactFPImm::zero",
239                           "AArch64ExactFPImm::one">;
240
241def sve_incdec_imm : Operand<i32>, TImmLeaf<i32, [{
242  return (((uint32_t)Imm) > 0) && (((uint32_t)Imm) < 17);
243}]> {
244  let ParserMatchClass = Imm1_16Operand;
245  let EncoderMethod = "getSVEIncDecImm";
246  let DecoderMethod = "DecodeSVEIncDecImm";
247}
248
249// This allows i32 immediate extraction from i64 based arithmetic.
250def sve_cnt_mul_imm : ComplexPattern<i32, 1, "SelectCntImm<1, 16, 1, false>">;
251def sve_cnt_shl_imm : ComplexPattern<i32, 1, "SelectCntImm<1, 16, 1, true>">;
252
253//===----------------------------------------------------------------------===//
254// SVE PTrue - These are used extensively throughout the pattern matching so
255//             it's important we define them first.
256//===----------------------------------------------------------------------===//
257
258class sve_int_ptrue<bits<2> sz8_64, bits<3> opc, string asm, PPRRegOp pprty,
259                    ValueType vt, SDPatternOperator op>
260: I<(outs pprty:$Pd), (ins sve_pred_enum:$pattern),
261  asm, "\t$Pd, $pattern",
262  "",
263  [(set (vt pprty:$Pd), (op sve_pred_enum:$pattern))]>, Sched<[]> {
264  bits<4> Pd;
265  bits<5> pattern;
266  let Inst{31-24} = 0b00100101;
267  let Inst{23-22} = sz8_64;
268  let Inst{21-19} = 0b011;
269  let Inst{18-17} = opc{2-1};
270  let Inst{16}    = opc{0};
271  let Inst{15-10} = 0b111000;
272  let Inst{9-5}   = pattern;
273  let Inst{4}     = 0b0;
274  let Inst{3-0}   = Pd;
275
276  let Defs = !if(!eq (opc{0}, 1), [NZCV], []);
277}
278
279multiclass sve_int_ptrue<bits<3> opc, string asm, SDPatternOperator op> {
280  def _B : sve_int_ptrue<0b00, opc, asm, PPR8, nxv16i1, op>;
281  def _H : sve_int_ptrue<0b01, opc, asm, PPR16, nxv8i1, op>;
282  def _S : sve_int_ptrue<0b10, opc, asm, PPR32, nxv4i1, op>;
283  def _D : sve_int_ptrue<0b11, opc, asm, PPR64, nxv2i1, op>;
284
285  def : InstAlias<asm # "\t$Pd",
286                  (!cast<Instruction>(NAME # _B) PPR8:$Pd, 0b11111), 1>;
287  def : InstAlias<asm # "\t$Pd",
288                  (!cast<Instruction>(NAME # _H) PPR16:$Pd, 0b11111), 1>;
289  def : InstAlias<asm # "\t$Pd",
290                  (!cast<Instruction>(NAME # _S) PPR32:$Pd, 0b11111), 1>;
291  def : InstAlias<asm # "\t$Pd",
292                  (!cast<Instruction>(NAME # _D) PPR64:$Pd, 0b11111), 1>;
293}
294
295def SDT_AArch64PTrue : SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisVT<1, i32>]>;
296def AArch64ptrue : SDNode<"AArch64ISD::PTRUE", SDT_AArch64PTrue>;
297
298let Predicates = [HasSVE] in {
299  defm PTRUE  : sve_int_ptrue<0b000, "ptrue", AArch64ptrue>;
300  defm PTRUES : sve_int_ptrue<0b001, "ptrues", null_frag>;
301}
302
303//===----------------------------------------------------------------------===//
304// SVE pattern match helpers.
305//===----------------------------------------------------------------------===//
306
307class SVE_1_Op_Pat<ValueType vtd, SDPatternOperator op, ValueType vt1,
308                   Instruction inst>
309: Pat<(vtd (op vt1:$Op1)),
310      (inst $Op1)>;
311
312class SVE_1_Op_Imm_OptLsl_Reverse_Pat<ValueType vt, SDPatternOperator op, ZPRRegOp zprty,
313                                      ValueType it, ComplexPattern cpx, Instruction inst>
314  : Pat<(vt (op (vt (AArch64dup (it (cpx i32:$imm, i32:$shift)))), (vt zprty:$Op1))),
315        (inst $Op1, i32:$imm, i32:$shift)>;
316
317class SVE_1_Op_Imm_OptLsl_Pat<ValueType vt, SDPatternOperator op, ZPRRegOp zprty,
318                              ValueType it, ComplexPattern cpx, Instruction inst>
319  : Pat<(vt (op (vt zprty:$Op1), (vt (AArch64dup (it (cpx i32:$imm, i32:$shift)))))),
320        (inst $Op1, i32:$imm, i32:$shift)>;
321
322class SVE_1_Op_Imm_Arith_Pat<ValueType vt, SDPatternOperator op, ZPRRegOp zprty,
323                             ValueType it, ComplexPattern cpx, Instruction inst>
324  : Pat<(vt (op (vt zprty:$Op1), (vt (AArch64dup (it (cpx i32:$imm)))))),
325        (inst $Op1, i32:$imm)>;
326
327class SVE_1_Op_Imm_Log_Pat<ValueType vt, SDPatternOperator op, ZPRRegOp zprty,
328                           ValueType it, ComplexPattern cpx, Instruction inst>
329  : Pat<(vt (op (vt zprty:$Op1), (vt (AArch64dup (it (cpx i64:$imm)))))),
330        (inst $Op1, i64:$imm)>;
331
332class SVE_2_Op_Pat<ValueType vtd, SDPatternOperator op, ValueType vt1,
333                   ValueType vt2, Instruction inst>
334: Pat<(vtd (op vt1:$Op1, vt2:$Op2)),
335      (inst $Op1, $Op2)>;
336
337class SVE_2_Op_Pat_Reduce_To_Neon<ValueType vtd, SDPatternOperator op, ValueType vt1,
338                   ValueType vt2, Instruction inst, SubRegIndex sub>
339: Pat<(vtd (op vt1:$Op1, vt2:$Op2)),
340      (INSERT_SUBREG (vtd (IMPLICIT_DEF)), (inst $Op1, $Op2), sub)>;
341
342class SVE_3_Op_Pat<ValueType vtd, SDPatternOperator op, ValueType vt1,
343                   ValueType vt2, ValueType vt3, Instruction inst>
344: Pat<(vtd (op vt1:$Op1, vt2:$Op2, vt3:$Op3)),
345      (inst $Op1, $Op2, $Op3)>;
346
347class SVE_4_Op_Pat<ValueType vtd, SDPatternOperator op, ValueType vt1,
348                   ValueType vt2, ValueType vt3, ValueType vt4,
349                   Instruction inst>
350: Pat<(vtd (op vt1:$Op1, vt2:$Op2, vt3:$Op3, vt4:$Op4)),
351      (inst $Op1, $Op2, $Op3, $Op4)>;
352
353class SVE_2_Op_Imm_Pat<ValueType vtd, SDPatternOperator op, ValueType vt1,
354                       ValueType vt2, Operand ImmTy, Instruction inst>
355: Pat<(vtd (op vt1:$Op1, (vt2 ImmTy:$Op2))),
356      (inst $Op1, ImmTy:$Op2)>;
357
358class SVE_3_Op_Imm_Pat<ValueType vtd, SDPatternOperator op, ValueType vt1,
359                       ValueType vt2, ValueType vt3, Operand ImmTy,
360                       Instruction inst>
361: Pat<(vtd (op vt1:$Op1, vt2:$Op2, (vt3 ImmTy:$Op3))),
362      (inst $Op1, $Op2, ImmTy:$Op3)>;
363
364class SVE_4_Op_Imm_Pat<ValueType vtd, SDPatternOperator op, ValueType vt1,
365                       ValueType vt2, ValueType vt3, ValueType vt4,
366                       Operand ImmTy, Instruction inst>
367: Pat<(vtd (op vt1:$Op1, vt2:$Op2, vt3:$Op3, (vt4 ImmTy:$Op4))),
368      (inst $Op1, $Op2, $Op3, ImmTy:$Op4)>;
369
370def SVEDup0Undef : ComplexPattern<i64, 0, "SelectDupZeroOrUndef", []>;
371
372//
373// Common but less generic patterns.
374//
375
376class SVE_1_Op_AllActive_Pat<ValueType vtd, SDPatternOperator op, ValueType vt1,
377                             Instruction inst, Instruction ptrue>
378: Pat<(vtd (op vt1:$Op1)),
379      (inst (IMPLICIT_DEF), (ptrue 31), $Op1)>;
380
381//===----------------------------------------------------------------------===//
382// SVE Predicate Misc Group
383//===----------------------------------------------------------------------===//
384
385class sve_int_pfalse<bits<6> opc, string asm>
386: I<(outs PPR8:$Pd), (ins),
387  asm, "\t$Pd",
388  "",
389  []>, Sched<[]> {
390  bits<4> Pd;
391  let Inst{31-24} = 0b00100101;
392  let Inst{23-22} = opc{5-4};
393  let Inst{21-19} = 0b011;
394  let Inst{18-16} = opc{3-1};
395  let Inst{15-10} = 0b111001;
396  let Inst{9}     = opc{0};
397  let Inst{8-4}   = 0b00000;
398  let Inst{3-0}   = Pd;
399}
400
401class sve_int_ptest<bits<6> opc, string asm>
402: I<(outs), (ins PPRAny:$Pg, PPR8:$Pn),
403  asm, "\t$Pg, $Pn",
404  "",
405  []>, Sched<[]> {
406  bits<4> Pg;
407  bits<4> Pn;
408  let Inst{31-24} = 0b00100101;
409  let Inst{23-22} = opc{5-4};
410  let Inst{21-19} = 0b010;
411  let Inst{18-16} = opc{3-1};
412  let Inst{15-14} = 0b11;
413  let Inst{13-10} = Pg;
414  let Inst{9}     = opc{0};
415  let Inst{8-5}   = Pn;
416  let Inst{4-0}   = 0b00000;
417
418  let Defs = [NZCV];
419}
420
421class sve_int_pfirst_next<bits<2> sz8_64, bits<5> opc, string asm,
422                          PPRRegOp pprty>
423: I<(outs pprty:$Pdn), (ins PPRAny:$Pg, pprty:$_Pdn),
424  asm, "\t$Pdn, $Pg, $_Pdn",
425  "",
426  []>, Sched<[]> {
427  bits<4> Pdn;
428  bits<4> Pg;
429  let Inst{31-24} = 0b00100101;
430  let Inst{23-22} = sz8_64;
431  let Inst{21-19} = 0b011;
432  let Inst{18-16} = opc{4-2};
433  let Inst{15-11} = 0b11000;
434  let Inst{10-9}  = opc{1-0};
435  let Inst{8-5}   = Pg;
436  let Inst{4}     = 0;
437  let Inst{3-0}   = Pdn;
438
439  let Constraints = "$Pdn = $_Pdn";
440  let Defs = [NZCV];
441}
442
443multiclass sve_int_pfirst<bits<5> opc, string asm, SDPatternOperator op> {
444  def _B : sve_int_pfirst_next<0b01, opc, asm, PPR8>;
445
446  def : SVE_2_Op_Pat<nxv16i1, op, nxv16i1, nxv16i1, !cast<Instruction>(NAME # _B)>;
447}
448
449multiclass sve_int_pnext<bits<5> opc, string asm, SDPatternOperator op> {
450  def _B : sve_int_pfirst_next<0b00, opc, asm, PPR8>;
451  def _H : sve_int_pfirst_next<0b01, opc, asm, PPR16>;
452  def _S : sve_int_pfirst_next<0b10, opc, asm, PPR32>;
453  def _D : sve_int_pfirst_next<0b11, opc, asm, PPR64>;
454
455  def : SVE_2_Op_Pat<nxv16i1, op, nxv16i1, nxv16i1, !cast<Instruction>(NAME # _B)>;
456  def : SVE_2_Op_Pat<nxv8i1, op, nxv8i1, nxv8i1, !cast<Instruction>(NAME # _H)>;
457  def : SVE_2_Op_Pat<nxv4i1, op, nxv4i1, nxv4i1, !cast<Instruction>(NAME # _S)>;
458  def : SVE_2_Op_Pat<nxv2i1, op, nxv2i1, nxv2i1, !cast<Instruction>(NAME # _D)>;
459}
460
461//===----------------------------------------------------------------------===//
462// SVE Predicate Count Group
463//===----------------------------------------------------------------------===//
464
465class sve_int_count_r<bits<2> sz8_64, bits<5> opc, string asm,
466                      RegisterOperand dty, PPRRegOp pprty, RegisterOperand sty>
467: I<(outs dty:$Rdn), (ins pprty:$Pg, sty:$_Rdn),
468  asm, "\t$Rdn, $Pg",
469  "",
470  []>, Sched<[]> {
471  bits<5> Rdn;
472  bits<4> Pg;
473  let Inst{31-24} = 0b00100101;
474  let Inst{23-22} = sz8_64;
475  let Inst{21-19} = 0b101;
476  let Inst{18-16} = opc{4-2};
477  let Inst{15-11} = 0b10001;
478  let Inst{10-9}  = opc{1-0};
479  let Inst{8-5}   = Pg;
480  let Inst{4-0}   = Rdn;
481
482  // Signed 32bit forms require their GPR operand printed.
483  let AsmString = !if(!eq(opc{4,2-0}, 0b0000),
484                      !strconcat(asm, "\t$Rdn, $Pg, $_Rdn"),
485                      !strconcat(asm, "\t$Rdn, $Pg"));
486  let Constraints = "$Rdn = $_Rdn";
487}
488
489multiclass sve_int_count_r_s32<bits<5> opc, string asm,
490                               SDPatternOperator op> {
491  def _B : sve_int_count_r<0b00, opc, asm, GPR64z, PPR8, GPR64as32>;
492  def _H : sve_int_count_r<0b01, opc, asm, GPR64z, PPR16, GPR64as32>;
493  def _S : sve_int_count_r<0b10, opc, asm, GPR64z, PPR32, GPR64as32>;
494  def _D : sve_int_count_r<0b11, opc, asm, GPR64z, PPR64, GPR64as32>;
495
496  def : Pat<(i32 (op GPR32:$Rn, (nxv16i1 PPRAny:$Pg))),
497            (EXTRACT_SUBREG (!cast<Instruction>(NAME # _B) PPRAny:$Pg, (INSERT_SUBREG (IMPLICIT_DEF), $Rn, sub_32)), sub_32)>;
498  def : Pat<(i64 (sext (i32 (op GPR32:$Rn, (nxv16i1 PPRAny:$Pg))))),
499            (!cast<Instruction>(NAME # _B) PPRAny:$Pg, (INSERT_SUBREG (IMPLICIT_DEF), $Rn, sub_32))>;
500
501  def : Pat<(i32 (op GPR32:$Rn, (nxv8i1 PPRAny:$Pg))),
502            (EXTRACT_SUBREG (!cast<Instruction>(NAME # _H) PPRAny:$Pg, (INSERT_SUBREG (IMPLICIT_DEF), $Rn, sub_32)), sub_32)>;
503  def : Pat<(i64 (sext (i32 (op GPR32:$Rn, (nxv8i1 PPRAny:$Pg))))),
504            (!cast<Instruction>(NAME # _H) PPRAny:$Pg, (INSERT_SUBREG (IMPLICIT_DEF), $Rn, sub_32))>;
505
506  def : Pat<(i32 (op GPR32:$Rn, (nxv4i1 PPRAny:$Pg))),
507            (EXTRACT_SUBREG (!cast<Instruction>(NAME # _S) PPRAny:$Pg, (INSERT_SUBREG (IMPLICIT_DEF), $Rn, sub_32)), sub_32)>;
508  def : Pat<(i64 (sext (i32 (op GPR32:$Rn, (nxv4i1 PPRAny:$Pg))))),
509            (!cast<Instruction>(NAME # _S) PPRAny:$Pg, (INSERT_SUBREG (IMPLICIT_DEF), $Rn, sub_32))>;
510
511  def : Pat<(i32 (op GPR32:$Rn, (nxv2i1 PPRAny:$Pg))),
512            (EXTRACT_SUBREG (!cast<Instruction>(NAME # _D) PPRAny:$Pg, (INSERT_SUBREG (IMPLICIT_DEF), $Rn, sub_32)), sub_32)>;
513  def : Pat<(i64 (sext (i32 (op GPR32:$Rn, (nxv2i1 PPRAny:$Pg))))),
514            (!cast<Instruction>(NAME # _D) PPRAny:$Pg, (INSERT_SUBREG (IMPLICIT_DEF), $Rn, sub_32))>;
515}
516
517multiclass sve_int_count_r_u32<bits<5> opc, string asm,
518                               SDPatternOperator op> {
519  def _B : sve_int_count_r<0b00, opc, asm, GPR32z, PPR8, GPR32z>;
520  def _H : sve_int_count_r<0b01, opc, asm, GPR32z, PPR16, GPR32z>;
521  def _S : sve_int_count_r<0b10, opc, asm, GPR32z, PPR32, GPR32z>;
522  def _D : sve_int_count_r<0b11, opc, asm, GPR32z, PPR64, GPR32z>;
523
524  def : Pat<(i32 (op GPR32:$Rn, (nxv16i1 PPRAny:$Pg))),
525            (!cast<Instruction>(NAME # _B) PPRAny:$Pg, $Rn)>;
526  def : Pat<(i32 (op GPR32:$Rn, (nxv8i1 PPRAny:$Pg))),
527            (!cast<Instruction>(NAME # _H) PPRAny:$Pg, $Rn)>;
528  def : Pat<(i32 (op GPR32:$Rn, (nxv4i1 PPRAny:$Pg))),
529            (!cast<Instruction>(NAME # _S) PPRAny:$Pg, $Rn)>;
530  def : Pat<(i32 (op GPR32:$Rn, (nxv2i1 PPRAny:$Pg))),
531            (!cast<Instruction>(NAME # _D) PPRAny:$Pg, $Rn)>;
532}
533
534multiclass sve_int_count_r_x64<bits<5> opc, string asm,
535                               SDPatternOperator op = null_frag> {
536  def _B : sve_int_count_r<0b00, opc, asm, GPR64z, PPR8, GPR64z>;
537  def _H : sve_int_count_r<0b01, opc, asm, GPR64z, PPR16, GPR64z>;
538  def _S : sve_int_count_r<0b10, opc, asm, GPR64z, PPR32, GPR64z>;
539  def _D : sve_int_count_r<0b11, opc, asm, GPR64z, PPR64, GPR64z>;
540
541  def : Pat<(i64 (op GPR64:$Rn, (nxv16i1 PPRAny:$Pg))),
542            (!cast<Instruction>(NAME # _B) PPRAny:$Pg, $Rn)>;
543  def : Pat<(i64 (op GPR64:$Rn, (nxv8i1 PPRAny:$Pg))),
544            (!cast<Instruction>(NAME # _H) PPRAny:$Pg, $Rn)>;
545  def : Pat<(i64 (op GPR64:$Rn, (nxv4i1 PPRAny:$Pg))),
546            (!cast<Instruction>(NAME # _S) PPRAny:$Pg, $Rn)>;
547  def : Pat<(i64 (op GPR64:$Rn, (nxv2i1 PPRAny:$Pg))),
548            (!cast<Instruction>(NAME # _D) PPRAny:$Pg, $Rn)>;
549}
550
551class sve_int_count_v<bits<2> sz8_64, bits<5> opc, string asm,
552                      ZPRRegOp zprty, PPRRegOp pprty>
553: I<(outs zprty:$Zdn), (ins zprty:$_Zdn, pprty:$Pm),
554  asm, "\t$Zdn, $Pm",
555  "",
556  []>, Sched<[]> {
557  bits<4> Pm;
558  bits<5> Zdn;
559  let Inst{31-24} = 0b00100101;
560  let Inst{23-22} = sz8_64;
561  let Inst{21-19} = 0b101;
562  let Inst{18-16} = opc{4-2};
563  let Inst{15-11} = 0b10000;
564  let Inst{10-9}  = opc{1-0};
565  let Inst{8-5}   = Pm;
566  let Inst{4-0}   = Zdn;
567
568  let Constraints = "$Zdn = $_Zdn";
569  let DestructiveInstType = Destructive;
570  let ElementSize = ElementSizeNone;
571}
572
573multiclass sve_int_count_v<bits<5> opc, string asm,
574                           SDPatternOperator op = null_frag> {
575  def _H : sve_int_count_v<0b01, opc, asm, ZPR16, PPR16>;
576  def _S : sve_int_count_v<0b10, opc, asm, ZPR32, PPR32>;
577  def _D : sve_int_count_v<0b11, opc, asm, ZPR64, PPR64>;
578
579  def : SVE_2_Op_Pat<nxv8i16, op, nxv8i16,  nxv8i1, !cast<Instruction>(NAME # _H)>;
580  def : SVE_2_Op_Pat<nxv4i32, op, nxv4i32,  nxv4i1, !cast<Instruction>(NAME # _S)>;
581  def : SVE_2_Op_Pat<nxv2i64, op, nxv2i64,  nxv2i1, !cast<Instruction>(NAME # _D)>;
582
583  def : InstAlias<asm # "\t$Zdn, $Pm",
584                 (!cast<Instruction>(NAME # "_H") ZPR16:$Zdn, PPRAny:$Pm), 0>;
585  def : InstAlias<asm # "\t$Zdn, $Pm",
586                 (!cast<Instruction>(NAME # "_S") ZPR32:$Zdn, PPRAny:$Pm), 0>;
587  def : InstAlias<asm # "\t$Zdn, $Pm",
588                  (!cast<Instruction>(NAME # "_D") ZPR64:$Zdn, PPRAny:$Pm), 0>;
589}
590
591class sve_int_pcount_pred<bits<2> sz8_64, bits<4> opc, string asm,
592                          PPRRegOp pprty>
593: I<(outs GPR64:$Rd), (ins PPRAny:$Pg, pprty:$Pn),
594  asm, "\t$Rd, $Pg, $Pn",
595  "",
596  []>, Sched<[]> {
597  bits<4> Pg;
598  bits<4> Pn;
599  bits<5> Rd;
600  let Inst{31-24} = 0b00100101;
601  let Inst{23-22} = sz8_64;
602  let Inst{21-19} = 0b100;
603  let Inst{18-16} = opc{3-1};
604  let Inst{15-14} = 0b10;
605  let Inst{13-10} = Pg;
606  let Inst{9}     = opc{0};
607  let Inst{8-5}   = Pn;
608  let Inst{4-0}   = Rd;
609}
610
611multiclass sve_int_pcount_pred<bits<4> opc, string asm,
612                               SDPatternOperator int_op> {
613  def _B : sve_int_pcount_pred<0b00, opc, asm, PPR8>;
614  def _H : sve_int_pcount_pred<0b01, opc, asm, PPR16>;
615  def _S : sve_int_pcount_pred<0b10, opc, asm, PPR32>;
616  def _D : sve_int_pcount_pred<0b11, opc, asm, PPR64>;
617
618  def : SVE_2_Op_Pat<i64, int_op, nxv16i1, nxv16i1, !cast<Instruction>(NAME # _B)>;
619  def : SVE_2_Op_Pat<i64, int_op, nxv8i1,  nxv8i1,  !cast<Instruction>(NAME # _H)>;
620  def : SVE_2_Op_Pat<i64, int_op, nxv4i1,  nxv4i1,  !cast<Instruction>(NAME # _S)>;
621  def : SVE_2_Op_Pat<i64, int_op, nxv2i1,  nxv2i1,  !cast<Instruction>(NAME # _D)>;
622}
623
624//===----------------------------------------------------------------------===//
625// SVE Element Count Group
626//===----------------------------------------------------------------------===//
627
628class sve_int_count<bits<3> opc, string asm>
629: I<(outs GPR64:$Rd), (ins sve_pred_enum:$pattern, sve_incdec_imm:$imm4),
630  asm, "\t$Rd, $pattern, mul $imm4",
631  "",
632  []>, Sched<[]> {
633  bits<5> Rd;
634  bits<4> imm4;
635  bits<5> pattern;
636  let Inst{31-24} = 0b00000100;
637  let Inst{23-22} = opc{2-1};
638  let Inst{21-20} = 0b10;
639  let Inst{19-16} = imm4;
640  let Inst{15-11} = 0b11100;
641  let Inst{10}    = opc{0};
642  let Inst{9-5}   = pattern;
643  let Inst{4-0}   = Rd;
644}
645
646multiclass sve_int_count<bits<3> opc, string asm, SDPatternOperator op> {
647  def NAME : sve_int_count<opc, asm>;
648
649  def : InstAlias<asm # "\t$Rd, $pattern",
650                  (!cast<Instruction>(NAME) GPR64:$Rd, sve_pred_enum:$pattern, 1), 1>;
651  def : InstAlias<asm # "\t$Rd",
652                  (!cast<Instruction>(NAME) GPR64:$Rd, 0b11111, 1), 2>;
653
654  def : Pat<(i64 (mul (op sve_pred_enum:$pattern), (sve_cnt_mul_imm i32:$imm))),
655            (!cast<Instruction>(NAME) sve_pred_enum:$pattern, sve_incdec_imm:$imm)>;
656
657  def : Pat<(i64 (shl (op sve_pred_enum:$pattern), (i64 (sve_cnt_shl_imm i32:$imm)))),
658            (!cast<Instruction>(NAME) sve_pred_enum:$pattern, sve_incdec_imm:$imm)>;
659
660  def : Pat<(i64 (op sve_pred_enum:$pattern)),
661            (!cast<Instruction>(NAME) sve_pred_enum:$pattern, 1)>;
662}
663
664class sve_int_countvlv<bits<5> opc, string asm, ZPRRegOp zprty>
665: I<(outs zprty:$Zdn), (ins zprty:$_Zdn, sve_pred_enum:$pattern, sve_incdec_imm:$imm4),
666  asm, "\t$Zdn, $pattern, mul $imm4",
667  "",
668  []>, Sched<[]> {
669  bits<5> Zdn;
670  bits<5> pattern;
671  bits<4> imm4;
672  let Inst{31-24} = 0b00000100;
673  let Inst{23-22} = opc{4-3};
674  let Inst{21}    = 0b1;
675  let Inst{20}    = opc{2};
676  let Inst{19-16} = imm4;
677  let Inst{15-12} = 0b1100;
678  let Inst{11-10} = opc{1-0};
679  let Inst{9-5}   = pattern;
680  let Inst{4-0}   = Zdn;
681
682  let Constraints = "$Zdn = $_Zdn";
683  let DestructiveInstType = Destructive;
684  let ElementSize = ElementSizeNone;
685}
686
687multiclass sve_int_countvlv<bits<5> opc, string asm, ZPRRegOp zprty,
688                            SDPatternOperator op = null_frag,
689                            ValueType vt = OtherVT> {
690  def NAME : sve_int_countvlv<opc, asm, zprty>;
691
692  def : InstAlias<asm # "\t$Zdn, $pattern",
693                  (!cast<Instruction>(NAME) zprty:$Zdn, sve_pred_enum:$pattern, 1), 1>;
694  def : InstAlias<asm # "\t$Zdn",
695                  (!cast<Instruction>(NAME) zprty:$Zdn, 0b11111, 1), 2>;
696
697  def : Pat<(vt (op (vt zprty:$Zn), (sve_pred_enum:$pattern), (sve_incdec_imm:$imm4))),
698            (!cast<Instruction>(NAME) $Zn, sve_pred_enum:$pattern, sve_incdec_imm:$imm4)>;
699}
700
701class sve_int_pred_pattern_a<bits<3> opc, string asm>
702: I<(outs GPR64:$Rdn), (ins GPR64:$_Rdn, sve_pred_enum:$pattern, sve_incdec_imm:$imm4),
703  asm, "\t$Rdn, $pattern, mul $imm4",
704  "",
705  []>, Sched<[]> {
706  bits<5> Rdn;
707  bits<5> pattern;
708  bits<4> imm4;
709  let Inst{31-24} = 0b00000100;
710  let Inst{23-22} = opc{2-1};
711  let Inst{21-20} = 0b11;
712  let Inst{19-16} = imm4;
713  let Inst{15-11} = 0b11100;
714  let Inst{10}    = opc{0};
715  let Inst{9-5}   = pattern;
716  let Inst{4-0}   = Rdn;
717
718  let Constraints = "$Rdn = $_Rdn";
719}
720
721multiclass sve_int_pred_pattern_a<bits<3> opc, string asm> {
722  def NAME : sve_int_pred_pattern_a<opc, asm>;
723
724  def : InstAlias<asm # "\t$Rdn, $pattern",
725                  (!cast<Instruction>(NAME) GPR64:$Rdn, sve_pred_enum:$pattern, 1), 1>;
726  def : InstAlias<asm # "\t$Rdn",
727                  (!cast<Instruction>(NAME) GPR64:$Rdn, 0b11111, 1), 2>;
728}
729
730class sve_int_pred_pattern_b<bits<5> opc, string asm, RegisterOperand dt,
731                             RegisterOperand st>
732: I<(outs dt:$Rdn), (ins st:$_Rdn, sve_pred_enum:$pattern, sve_incdec_imm:$imm4),
733  asm, "\t$Rdn, $pattern, mul $imm4",
734  "",
735  []>, Sched<[]> {
736  bits<5> Rdn;
737  bits<5> pattern;
738  bits<4> imm4;
739  let Inst{31-24} = 0b00000100;
740  let Inst{23-22} = opc{4-3};
741  let Inst{21}    = 0b1;
742  let Inst{20}    = opc{2};
743  let Inst{19-16} = imm4;
744  let Inst{15-12} = 0b1111;
745  let Inst{11-10} = opc{1-0};
746  let Inst{9-5}   = pattern;
747  let Inst{4-0}   = Rdn;
748
749  // Signed 32bit forms require their GPR operand printed.
750  let AsmString = !if(!eq(opc{2,0}, 0b00),
751                      !strconcat(asm, "\t$Rdn, $_Rdn, $pattern, mul $imm4"),
752                      !strconcat(asm, "\t$Rdn, $pattern, mul $imm4"));
753
754  let Constraints = "$Rdn = $_Rdn";
755}
756
757multiclass sve_int_pred_pattern_b_s32<bits<5> opc, string asm,
758                                      SDPatternOperator op> {
759  def NAME : sve_int_pred_pattern_b<opc, asm, GPR64z, GPR64as32>;
760
761  def : InstAlias<asm # "\t$Rd, $Rn, $pattern",
762                  (!cast<Instruction>(NAME) GPR64z:$Rd, GPR64as32:$Rn, sve_pred_enum:$pattern, 1), 1>;
763  def : InstAlias<asm # "\t$Rd, $Rn",
764                  (!cast<Instruction>(NAME) GPR64z:$Rd, GPR64as32:$Rn, 0b11111, 1), 2>;
765
766  // NOTE: Register allocation doesn't like tied operands of differing register
767  //       class, hence the extra INSERT_SUBREG complication.
768
769  def : Pat<(i32 (op GPR32:$Rn, (sve_pred_enum:$pattern), (sve_incdec_imm:$imm4))),
770            (EXTRACT_SUBREG (!cast<Instruction>(NAME) (INSERT_SUBREG (IMPLICIT_DEF), $Rn, sub_32), sve_pred_enum:$pattern, sve_incdec_imm:$imm4), sub_32)>;
771  def : Pat<(i64 (sext (i32 (op GPR32:$Rn, (sve_pred_enum:$pattern), (sve_incdec_imm:$imm4))))),
772            (!cast<Instruction>(NAME) (INSERT_SUBREG (IMPLICIT_DEF), $Rn, sub_32), sve_pred_enum:$pattern, sve_incdec_imm:$imm4)>;
773}
774
775multiclass sve_int_pred_pattern_b_u32<bits<5> opc, string asm,
776                                      SDPatternOperator op> {
777  def NAME : sve_int_pred_pattern_b<opc, asm, GPR32z, GPR32z>;
778
779  def : InstAlias<asm # "\t$Rdn, $pattern",
780                  (!cast<Instruction>(NAME) GPR32z:$Rdn, sve_pred_enum:$pattern, 1), 1>;
781  def : InstAlias<asm # "\t$Rdn",
782                  (!cast<Instruction>(NAME) GPR32z:$Rdn, 0b11111, 1), 2>;
783
784  def : Pat<(i32 (op GPR32:$Rn, (sve_pred_enum:$pattern), (sve_incdec_imm:$imm4))),
785            (!cast<Instruction>(NAME) $Rn, sve_pred_enum:$pattern, sve_incdec_imm:$imm4)>;
786}
787
788multiclass sve_int_pred_pattern_b_x64<bits<5> opc, string asm,
789                                      SDPatternOperator op> {
790  def NAME : sve_int_pred_pattern_b<opc, asm, GPR64z, GPR64z>;
791
792  def : InstAlias<asm # "\t$Rdn, $pattern",
793                  (!cast<Instruction>(NAME) GPR64z:$Rdn, sve_pred_enum:$pattern, 1), 1>;
794  def : InstAlias<asm # "\t$Rdn",
795                  (!cast<Instruction>(NAME) GPR64z:$Rdn, 0b11111, 1), 2>;
796
797  def : Pat<(i64 (op GPR64:$Rn, (sve_pred_enum:$pattern), (sve_incdec_imm:$imm4))),
798            (!cast<Instruction>(NAME) $Rn, sve_pred_enum:$pattern, sve_incdec_imm:$imm4)>;
799}
800
801
802//===----------------------------------------------------------------------===//
803// SVE Permute - Cross Lane Group
804//===----------------------------------------------------------------------===//
805
806class sve_int_perm_dup_r<bits<2> sz8_64, string asm, ZPRRegOp zprty,
807                         ValueType vt, RegisterClass srcRegType,
808                         SDPatternOperator op>
809: I<(outs zprty:$Zd), (ins srcRegType:$Rn),
810  asm, "\t$Zd, $Rn",
811  "",
812  [(set (vt zprty:$Zd), (op srcRegType:$Rn))]>, Sched<[]> {
813  bits<5> Rn;
814  bits<5> Zd;
815  let Inst{31-24} = 0b00000101;
816  let Inst{23-22} = sz8_64;
817  let Inst{21-10} = 0b100000001110;
818  let Inst{9-5}   = Rn;
819  let Inst{4-0}   = Zd;
820}
821
822multiclass sve_int_perm_dup_r<string asm, SDPatternOperator op> {
823  def _B : sve_int_perm_dup_r<0b00, asm, ZPR8, nxv16i8, GPR32sp, op>;
824  def _H : sve_int_perm_dup_r<0b01, asm, ZPR16, nxv8i16, GPR32sp, op>;
825  def _S : sve_int_perm_dup_r<0b10, asm, ZPR32, nxv4i32, GPR32sp, op>;
826  def _D : sve_int_perm_dup_r<0b11, asm, ZPR64, nxv2i64, GPR64sp, op>;
827
828  def : InstAlias<"mov $Zd, $Rn",
829                  (!cast<Instruction>(NAME # _B) ZPR8:$Zd, GPR32sp:$Rn), 1>;
830  def : InstAlias<"mov $Zd, $Rn",
831                  (!cast<Instruction>(NAME # _H) ZPR16:$Zd, GPR32sp:$Rn), 1>;
832  def : InstAlias<"mov $Zd, $Rn",
833                  (!cast<Instruction>(NAME # _S) ZPR32:$Zd, GPR32sp:$Rn), 1>;
834  def : InstAlias<"mov $Zd, $Rn",
835                  (!cast<Instruction>(NAME # _D) ZPR64:$Zd, GPR64sp:$Rn), 1>;
836}
837
838class sve_int_perm_dup_i<bits<5> tsz, Operand immtype, string asm,
839                         ZPRRegOp zprty>
840: I<(outs zprty:$Zd), (ins zprty:$Zn, immtype:$idx),
841  asm, "\t$Zd, $Zn$idx",
842  "",
843  []>, Sched<[]> {
844  bits<5> Zd;
845  bits<5> Zn;
846  bits<7> idx;
847  let Inst{31-24} = 0b00000101;
848  let Inst{23-22} = {?,?}; // imm3h
849  let Inst{21}    = 0b1;
850  let Inst{20-16} = tsz;
851  let Inst{15-10} = 0b001000;
852  let Inst{9-5}   = Zn;
853  let Inst{4-0}   = Zd;
854}
855
856multiclass sve_int_perm_dup_i<string asm> {
857  def _B : sve_int_perm_dup_i<{?,?,?,?,1}, sve_elm_idx_extdup_b, asm, ZPR8> {
858    let Inst{23-22} = idx{5-4};
859    let Inst{20-17} = idx{3-0};
860  }
861  def _H : sve_int_perm_dup_i<{?,?,?,1,0}, sve_elm_idx_extdup_h, asm, ZPR16> {
862    let Inst{23-22} = idx{4-3};
863    let Inst{20-18} = idx{2-0};
864  }
865  def _S : sve_int_perm_dup_i<{?,?,1,0,0}, sve_elm_idx_extdup_s, asm, ZPR32> {
866    let Inst{23-22} = idx{3-2};
867    let Inst{20-19}    = idx{1-0};
868  }
869  def _D : sve_int_perm_dup_i<{?,1,0,0,0}, sve_elm_idx_extdup_d, asm, ZPR64> {
870    let Inst{23-22} = idx{2-1};
871    let Inst{20}    = idx{0};
872  }
873  def _Q : sve_int_perm_dup_i<{1,0,0,0,0}, sve_elm_idx_extdup_q, asm, ZPR128> {
874    let Inst{23-22} = idx{1-0};
875  }
876
877  def : InstAlias<"mov $Zd, $Zn$idx",
878                  (!cast<Instruction>(NAME # _B) ZPR8:$Zd, ZPR8:$Zn, sve_elm_idx_extdup_b:$idx), 1>;
879  def : InstAlias<"mov $Zd, $Zn$idx",
880                  (!cast<Instruction>(NAME # _H) ZPR16:$Zd, ZPR16:$Zn, sve_elm_idx_extdup_h:$idx), 1>;
881  def : InstAlias<"mov $Zd, $Zn$idx",
882                  (!cast<Instruction>(NAME # _S) ZPR32:$Zd, ZPR32:$Zn, sve_elm_idx_extdup_s:$idx), 1>;
883  def : InstAlias<"mov $Zd, $Zn$idx",
884                  (!cast<Instruction>(NAME # _D) ZPR64:$Zd, ZPR64:$Zn, sve_elm_idx_extdup_d:$idx), 1>;
885  def : InstAlias<"mov $Zd, $Zn$idx",
886                  (!cast<Instruction>(NAME # _Q) ZPR128:$Zd, ZPR128:$Zn, sve_elm_idx_extdup_q:$idx), 1>;
887  def : InstAlias<"mov $Zd, $Bn",
888                  (!cast<Instruction>(NAME # _B) ZPR8:$Zd, FPR8asZPR:$Bn, 0), 2>;
889  def : InstAlias<"mov $Zd, $Hn",
890                  (!cast<Instruction>(NAME # _H) ZPR16:$Zd, FPR16asZPR:$Hn, 0), 2>;
891  def : InstAlias<"mov $Zd, $Sn",
892                  (!cast<Instruction>(NAME # _S) ZPR32:$Zd, FPR32asZPR:$Sn, 0), 2>;
893  def : InstAlias<"mov $Zd, $Dn",
894                  (!cast<Instruction>(NAME # _D) ZPR64:$Zd, FPR64asZPR:$Dn, 0), 2>;
895  def : InstAlias<"mov $Zd, $Qn",
896                  (!cast<Instruction>(NAME # _Q) ZPR128:$Zd, FPR128asZPR:$Qn, 0), 2>;
897}
898
899class sve_int_perm_tbl<bits<2> sz8_64, bits<2> opc, string asm,
900                       ZPRRegOp zprty, RegisterOperand VecList>
901: I<(outs zprty:$Zd), (ins VecList:$Zn, zprty:$Zm),
902  asm, "\t$Zd, $Zn, $Zm",
903  "",
904  []>, Sched<[]> {
905  bits<5> Zd;
906  bits<5> Zm;
907  bits<5> Zn;
908  let Inst{31-24} = 0b00000101;
909  let Inst{23-22} = sz8_64;
910  let Inst{21}    = 0b1;
911  let Inst{20-16} = Zm;
912  let Inst{15-13} = 0b001;
913  let Inst{12-11} = opc;
914  let Inst{10}    = 0b0;
915  let Inst{9-5}   = Zn;
916  let Inst{4-0}   = Zd;
917}
918
919multiclass sve_int_perm_tbl<string asm, SDPatternOperator op> {
920  def _B : sve_int_perm_tbl<0b00, 0b10, asm, ZPR8,  Z_b>;
921  def _H : sve_int_perm_tbl<0b01, 0b10, asm, ZPR16, Z_h>;
922  def _S : sve_int_perm_tbl<0b10, 0b10, asm, ZPR32, Z_s>;
923  def _D : sve_int_perm_tbl<0b11, 0b10, asm, ZPR64, Z_d>;
924
925  def : InstAlias<asm # "\t$Zd, $Zn, $Zm",
926                 (!cast<Instruction>(NAME # _B) ZPR8:$Zd, ZPR8:$Zn, ZPR8:$Zm), 0>;
927  def : InstAlias<asm # "\t$Zd, $Zn, $Zm",
928                 (!cast<Instruction>(NAME # _H) ZPR16:$Zd, ZPR16:$Zn, ZPR16:$Zm), 0>;
929  def : InstAlias<asm # "\t$Zd, $Zn, $Zm",
930                 (!cast<Instruction>(NAME # _S) ZPR32:$Zd, ZPR32:$Zn, ZPR32:$Zm), 0>;
931  def : InstAlias<asm # "\t$Zd, $Zn, $Zm",
932                 (!cast<Instruction>(NAME # _D) ZPR64:$Zd, ZPR64:$Zn, ZPR64:$Zm), 0>;
933
934  def : SVE_2_Op_Pat<nxv16i8, op, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
935  def : SVE_2_Op_Pat<nxv8i16, op, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
936  def : SVE_2_Op_Pat<nxv4i32, op, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
937  def : SVE_2_Op_Pat<nxv2i64, op, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
938
939  def : SVE_2_Op_Pat<nxv8f16, op, nxv8f16, nxv8i16, !cast<Instruction>(NAME # _H)>;
940  def : SVE_2_Op_Pat<nxv4f32, op, nxv4f32, nxv4i32, !cast<Instruction>(NAME # _S)>;
941  def : SVE_2_Op_Pat<nxv2f64, op, nxv2f64, nxv2i64, !cast<Instruction>(NAME # _D)>;
942}
943
944multiclass sve2_int_perm_tbl<string asm> {
945  def _B : sve_int_perm_tbl<0b00, 0b01, asm, ZPR8,  ZZ_b>;
946  def _H : sve_int_perm_tbl<0b01, 0b01, asm, ZPR16, ZZ_h>;
947  def _S : sve_int_perm_tbl<0b10, 0b01, asm, ZPR32, ZZ_s>;
948  def _D : sve_int_perm_tbl<0b11, 0b01, asm, ZPR64, ZZ_d>;
949}
950
951class sve2_int_perm_tbx<bits<2> sz8_64, string asm, ZPRRegOp zprty>
952: I<(outs zprty:$Zd), (ins zprty:$_Zd, zprty:$Zn, zprty:$Zm),
953  asm, "\t$Zd, $Zn, $Zm",
954  "",
955  []>, Sched<[]> {
956  bits<5> Zd;
957  bits<5> Zm;
958  bits<5> Zn;
959  let Inst{31-24} = 0b00000101;
960  let Inst{23-22} = sz8_64;
961  let Inst{21}    = 0b1;
962  let Inst{20-16} = Zm;
963  let Inst{15-10} = 0b001011;
964  let Inst{9-5}   = Zn;
965  let Inst{4-0}   = Zd;
966
967  let Constraints = "$Zd = $_Zd";
968}
969
970multiclass sve2_int_perm_tbx<string asm> {
971  def _B : sve2_int_perm_tbx<0b00, asm, ZPR8>;
972  def _H : sve2_int_perm_tbx<0b01, asm, ZPR16>;
973  def _S : sve2_int_perm_tbx<0b10, asm, ZPR32>;
974  def _D : sve2_int_perm_tbx<0b11, asm, ZPR64>;
975}
976
977class sve_int_perm_reverse_z<bits<2> sz8_64, string asm, ZPRRegOp zprty>
978: I<(outs zprty:$Zd), (ins zprty:$Zn),
979  asm, "\t$Zd, $Zn",
980  "",
981  []>, Sched<[]> {
982  bits<5> Zd;
983  bits<5> Zn;
984  let Inst{31-24} = 0b00000101;
985  let Inst{23-22} = sz8_64;
986  let Inst{21-10} = 0b111000001110;
987  let Inst{9-5}   = Zn;
988  let Inst{4-0}   = Zd;
989}
990
991multiclass sve_int_perm_reverse_z<string asm, SDPatternOperator op> {
992  def _B : sve_int_perm_reverse_z<0b00, asm, ZPR8>;
993  def _H : sve_int_perm_reverse_z<0b01, asm, ZPR16>;
994  def _S : sve_int_perm_reverse_z<0b10, asm, ZPR32>;
995  def _D : sve_int_perm_reverse_z<0b11, asm, ZPR64>;
996
997  def : SVE_1_Op_Pat<nxv16i8, op, nxv16i8, !cast<Instruction>(NAME # _B)>;
998  def : SVE_1_Op_Pat<nxv8i16, op, nxv8i16, !cast<Instruction>(NAME # _H)>;
999  def : SVE_1_Op_Pat<nxv4i32, op, nxv4i32, !cast<Instruction>(NAME # _S)>;
1000  def : SVE_1_Op_Pat<nxv2i64, op, nxv2i64, !cast<Instruction>(NAME # _D)>;
1001
1002  def : SVE_1_Op_Pat<nxv8f16, op, nxv8f16, !cast<Instruction>(NAME # _H)>;
1003  def : SVE_1_Op_Pat<nxv4f32, op, nxv4f32, !cast<Instruction>(NAME # _S)>;
1004  def : SVE_1_Op_Pat<nxv2f64, op, nxv2f64, !cast<Instruction>(NAME # _D)>;
1005}
1006
1007class sve_int_perm_reverse_p<bits<2> sz8_64, string asm, PPRRegOp pprty>
1008: I<(outs pprty:$Pd), (ins pprty:$Pn),
1009  asm, "\t$Pd, $Pn",
1010  "",
1011  []>, Sched<[]> {
1012  bits<4> Pd;
1013  bits<4> Pn;
1014  let Inst{31-24} = 0b00000101;
1015  let Inst{23-22} = sz8_64;
1016  let Inst{21-9}  = 0b1101000100000;
1017  let Inst{8-5}   = Pn;
1018  let Inst{4}     = 0b0;
1019  let Inst{3-0}   = Pd;
1020}
1021
1022multiclass sve_int_perm_reverse_p<string asm, SDPatternOperator op> {
1023  def _B : sve_int_perm_reverse_p<0b00, asm, PPR8>;
1024  def _H : sve_int_perm_reverse_p<0b01, asm, PPR16>;
1025  def _S : sve_int_perm_reverse_p<0b10, asm, PPR32>;
1026  def _D : sve_int_perm_reverse_p<0b11, asm, PPR64>;
1027
1028  def : SVE_1_Op_Pat<nxv16i1, op, nxv16i1, !cast<Instruction>(NAME # _B)>;
1029  def : SVE_1_Op_Pat<nxv8i1, op, nxv8i1, !cast<Instruction>(NAME # _H)>;
1030  def : SVE_1_Op_Pat<nxv4i1, op, nxv4i1, !cast<Instruction>(NAME # _S)>;
1031  def : SVE_1_Op_Pat<nxv2i1, op, nxv2i1, !cast<Instruction>(NAME # _D)>;
1032}
1033
1034class sve_int_perm_unpk<bits<2> sz16_64, bits<2> opc, string asm,
1035                        ZPRRegOp zprty1, ZPRRegOp zprty2>
1036: I<(outs zprty1:$Zd), (ins zprty2:$Zn),
1037  asm, "\t$Zd, $Zn",
1038  "", []>, Sched<[]> {
1039  bits<5> Zd;
1040  bits<5> Zn;
1041  let Inst{31-24} = 0b00000101;
1042  let Inst{23-22} = sz16_64;
1043  let Inst{21-18} = 0b1100;
1044  let Inst{17-16} = opc;
1045  let Inst{15-10} = 0b001110;
1046  let Inst{9-5}   = Zn;
1047  let Inst{4-0}   = Zd;
1048}
1049
1050multiclass sve_int_perm_unpk<bits<2> opc, string asm, SDPatternOperator op> {
1051  def _H : sve_int_perm_unpk<0b01, opc, asm, ZPR16, ZPR8>;
1052  def _S : sve_int_perm_unpk<0b10, opc, asm, ZPR32, ZPR16>;
1053  def _D : sve_int_perm_unpk<0b11, opc, asm, ZPR64, ZPR32>;
1054
1055  def : SVE_1_Op_Pat<nxv8i16, op, nxv16i8, !cast<Instruction>(NAME # _H)>;
1056  def : SVE_1_Op_Pat<nxv4i32, op, nxv8i16, !cast<Instruction>(NAME # _S)>;
1057  def : SVE_1_Op_Pat<nxv2i64, op, nxv4i32, !cast<Instruction>(NAME # _D)>;
1058}
1059
1060class sve_int_perm_insrs<bits<2> sz8_64, string asm, ZPRRegOp zprty,
1061                         RegisterClass srcRegType>
1062: I<(outs zprty:$Zdn), (ins zprty:$_Zdn, srcRegType:$Rm),
1063  asm, "\t$Zdn, $Rm",
1064  "",
1065  []>, Sched<[]> {
1066  bits<5> Rm;
1067  bits<5> Zdn;
1068  let Inst{31-24} = 0b00000101;
1069  let Inst{23-22} = sz8_64;
1070  let Inst{21-10} = 0b100100001110;
1071  let Inst{9-5}   = Rm;
1072  let Inst{4-0}   = Zdn;
1073
1074  let Constraints = "$Zdn = $_Zdn";
1075  let DestructiveInstType = Destructive;
1076}
1077
1078multiclass sve_int_perm_insrs<string asm, SDPatternOperator op> {
1079  def _B : sve_int_perm_insrs<0b00, asm, ZPR8, GPR32>;
1080  def _H : sve_int_perm_insrs<0b01, asm, ZPR16, GPR32>;
1081  def _S : sve_int_perm_insrs<0b10, asm, ZPR32, GPR32>;
1082  def _D : sve_int_perm_insrs<0b11, asm, ZPR64, GPR64>;
1083
1084  def : SVE_2_Op_Pat<nxv16i8, op, nxv16i8, i32, !cast<Instruction>(NAME # _B)>;
1085  def : SVE_2_Op_Pat<nxv8i16, op, nxv8i16, i32, !cast<Instruction>(NAME # _H)>;
1086  def : SVE_2_Op_Pat<nxv4i32, op, nxv4i32, i32, !cast<Instruction>(NAME # _S)>;
1087  def : SVE_2_Op_Pat<nxv2i64, op, nxv2i64, i64, !cast<Instruction>(NAME # _D)>;
1088}
1089
1090class sve_int_perm_insrv<bits<2> sz8_64, string asm, ZPRRegOp zprty,
1091                         RegisterClass srcRegType>
1092: I<(outs zprty:$Zdn), (ins zprty:$_Zdn, srcRegType:$Vm),
1093  asm, "\t$Zdn, $Vm",
1094  "",
1095  []>, Sched<[]> {
1096  bits<5> Vm;
1097  bits<5> Zdn;
1098  let Inst{31-24} = 0b00000101;
1099  let Inst{23-22} = sz8_64;
1100  let Inst{21-10} = 0b110100001110;
1101  let Inst{9-5}   = Vm;
1102  let Inst{4-0}   = Zdn;
1103
1104  let Constraints = "$Zdn = $_Zdn";
1105  let DestructiveInstType = Destructive;
1106}
1107
1108multiclass sve_int_perm_insrv<string asm, SDPatternOperator op> {
1109  def _B : sve_int_perm_insrv<0b00, asm, ZPR8, FPR8>;
1110  def _H : sve_int_perm_insrv<0b01, asm, ZPR16, FPR16>;
1111  def _S : sve_int_perm_insrv<0b10, asm, ZPR32, FPR32>;
1112  def _D : sve_int_perm_insrv<0b11, asm, ZPR64, FPR64>;
1113
1114  def : SVE_2_Op_Pat<nxv8f16, op, nxv8f16, f16, !cast<Instruction>(NAME # _H)>;
1115  def : SVE_2_Op_Pat<nxv4f32, op, nxv4f32, f32, !cast<Instruction>(NAME # _S)>;
1116  def : SVE_2_Op_Pat<nxv2f64, op, nxv2f64, f64, !cast<Instruction>(NAME # _D)>;
1117}
1118
1119//===----------------------------------------------------------------------===//
1120// SVE Permute - Extract Group
1121//===----------------------------------------------------------------------===//
1122
1123class sve_int_perm_extract_i<string asm>
1124: I<(outs ZPR8:$Zdn), (ins ZPR8:$_Zdn, ZPR8:$Zm, imm0_255:$imm8),
1125  asm, "\t$Zdn, $_Zdn, $Zm, $imm8",
1126  "", []>, Sched<[]> {
1127  bits<5> Zdn;
1128  bits<5> Zm;
1129  bits<8> imm8;
1130  let Inst{31-21} = 0b00000101001;
1131  let Inst{20-16} = imm8{7-3};
1132  let Inst{15-13} = 0b000;
1133  let Inst{12-10} = imm8{2-0};
1134  let Inst{9-5}   = Zm;
1135  let Inst{4-0}   = Zdn;
1136
1137  let Constraints = "$Zdn = $_Zdn";
1138  let DestructiveInstType = Destructive;
1139  let ElementSize = ElementSizeNone;
1140}
1141
1142multiclass sve_int_perm_extract_i<string asm, SDPatternOperator op> {
1143  def NAME : sve_int_perm_extract_i<asm>;
1144
1145  def : SVE_3_Op_Imm_Pat<nxv16i8, op, nxv16i8, nxv16i8, i32, imm0_255,
1146                         !cast<Instruction>(NAME)>;
1147}
1148
1149class sve2_int_perm_extract_i_cons<string asm>
1150: I<(outs ZPR8:$Zd), (ins ZZ_b:$Zn, imm0_255:$imm8),
1151  asm, "\t$Zd, $Zn, $imm8",
1152  "", []>, Sched<[]> {
1153  bits<5> Zd;
1154  bits<5> Zn;
1155  bits<8> imm8;
1156  let Inst{31-21} = 0b00000101011;
1157  let Inst{20-16} = imm8{7-3};
1158  let Inst{15-13} = 0b000;
1159  let Inst{12-10} = imm8{2-0};
1160  let Inst{9-5}   = Zn;
1161  let Inst{4-0}   = Zd;
1162}
1163
1164//===----------------------------------------------------------------------===//
1165// SVE Vector Select Group
1166//===----------------------------------------------------------------------===//
1167
1168class sve_int_sel_vvv<bits<2> sz8_64, string asm, ZPRRegOp zprty>
1169: I<(outs zprty:$Zd), (ins PPRAny:$Pg, zprty:$Zn, zprty:$Zm),
1170  asm, "\t$Zd, $Pg, $Zn, $Zm",
1171  "",
1172  []>, Sched<[]> {
1173  bits<4> Pg;
1174  bits<5> Zd;
1175  bits<5> Zm;
1176  bits<5> Zn;
1177  let Inst{31-24} = 0b00000101;
1178  let Inst{23-22} = sz8_64;
1179  let Inst{21}    = 0b1;
1180  let Inst{20-16} = Zm;
1181  let Inst{15-14} = 0b11;
1182  let Inst{13-10} = Pg;
1183  let Inst{9-5}   = Zn;
1184  let Inst{4-0}   = Zd;
1185}
1186
1187multiclass sve_int_sel_vvv<string asm, SDPatternOperator op> {
1188  def _B : sve_int_sel_vvv<0b00, asm, ZPR8>;
1189  def _H : sve_int_sel_vvv<0b01, asm, ZPR16>;
1190  def _S : sve_int_sel_vvv<0b10, asm, ZPR32>;
1191  def _D : sve_int_sel_vvv<0b11, asm, ZPR64>;
1192
1193  def : SVE_3_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
1194  def : SVE_3_Op_Pat<nxv8i16, op, nxv8i1,  nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
1195  def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1,  nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
1196  def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1,  nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
1197
1198  def : SVE_3_Op_Pat<nxv8f16, op, nxv8i1,  nxv8f16, nxv8f16, !cast<Instruction>(NAME # _H)>;
1199  def : SVE_3_Op_Pat<nxv4f32, op, nxv4i1,  nxv4f32, nxv4f32, !cast<Instruction>(NAME # _S)>;
1200  def : SVE_3_Op_Pat<nxv2f32, op, nxv2i1,  nxv2f32, nxv2f32, !cast<Instruction>(NAME # _D)>;
1201  def : SVE_3_Op_Pat<nxv2f64, op, nxv2i1,  nxv2f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
1202
1203  def : InstAlias<"mov $Zd, $Pg/m, $Zn",
1204                  (!cast<Instruction>(NAME # _B) ZPR8:$Zd, PPRAny:$Pg, ZPR8:$Zn, ZPR8:$Zd), 1>;
1205  def : InstAlias<"mov $Zd, $Pg/m, $Zn",
1206                  (!cast<Instruction>(NAME # _H) ZPR16:$Zd, PPRAny:$Pg, ZPR16:$Zn, ZPR16:$Zd), 1>;
1207  def : InstAlias<"mov $Zd, $Pg/m, $Zn",
1208                  (!cast<Instruction>(NAME # _S) ZPR32:$Zd, PPRAny:$Pg, ZPR32:$Zn, ZPR32:$Zd), 1>;
1209  def : InstAlias<"mov $Zd, $Pg/m, $Zn",
1210                  (!cast<Instruction>(NAME # _D) ZPR64:$Zd, PPRAny:$Pg, ZPR64:$Zn, ZPR64:$Zd), 1>;
1211}
1212
1213
1214//===----------------------------------------------------------------------===//
1215// SVE Predicate Logical Operations Group
1216//===----------------------------------------------------------------------===//
1217
1218class sve_int_pred_log<bits<4> opc, string asm>
1219: I<(outs PPR8:$Pd), (ins PPRAny:$Pg, PPR8:$Pn, PPR8:$Pm),
1220  asm, "\t$Pd, $Pg/z, $Pn, $Pm",
1221  "",
1222  []>, Sched<[]> {
1223  bits<4> Pd;
1224  bits<4> Pg;
1225  bits<4> Pm;
1226  bits<4> Pn;
1227  let Inst{31-24} = 0b00100101;
1228  let Inst{23-22} = opc{3-2};
1229  let Inst{21-20} = 0b00;
1230  let Inst{19-16} = Pm;
1231  let Inst{15-14} = 0b01;
1232  let Inst{13-10} = Pg;
1233  let Inst{9}     = opc{1};
1234  let Inst{8-5}   = Pn;
1235  let Inst{4}     = opc{0};
1236  let Inst{3-0}   = Pd;
1237
1238  // SEL has no predication qualifier.
1239  let AsmString = !if(!eq(opc, 0b0011),
1240                      !strconcat(asm, "\t$Pd, $Pg, $Pn, $Pm"),
1241                      !strconcat(asm, "\t$Pd, $Pg/z, $Pn, $Pm"));
1242
1243  let Defs = !if(!eq (opc{2}, 1), [NZCV], []);
1244
1245}
1246
1247multiclass sve_int_pred_log<bits<4> opc, string asm, SDPatternOperator op> {
1248  def NAME : sve_int_pred_log<opc, asm>;
1249
1250  def : SVE_3_Op_Pat<nxv16i1, op, nxv16i1, nxv16i1, nxv16i1, !cast<Instruction>(NAME)>;
1251  def : SVE_3_Op_Pat<nxv8i1, op, nxv8i1, nxv8i1, nxv8i1, !cast<Instruction>(NAME)>;
1252  def : SVE_3_Op_Pat<nxv4i1, op, nxv4i1, nxv4i1, nxv4i1, !cast<Instruction>(NAME)>;
1253  def : SVE_3_Op_Pat<nxv2i1, op, nxv2i1, nxv2i1, nxv2i1, !cast<Instruction>(NAME)>;
1254}
1255
1256
1257//===----------------------------------------------------------------------===//
1258// SVE Logical Mask Immediate Group
1259//===----------------------------------------------------------------------===//
1260
1261class sve_int_log_imm<bits<2> opc, string asm>
1262: I<(outs ZPR64:$Zdn), (ins ZPR64:$_Zdn, logical_imm64:$imms13),
1263  asm, "\t$Zdn, $_Zdn, $imms13",
1264  "", []>, Sched<[]> {
1265  bits<5> Zdn;
1266  bits<13> imms13;
1267  let Inst{31-24} = 0b00000101;
1268  let Inst{23-22} = opc;
1269  let Inst{21-18} = 0b0000;
1270  let Inst{17-5}  = imms13;
1271  let Inst{4-0}   = Zdn;
1272
1273  let Constraints = "$Zdn = $_Zdn";
1274  let DecoderMethod = "DecodeSVELogicalImmInstruction";
1275  let DestructiveInstType = Destructive;
1276  let ElementSize = ElementSizeNone;
1277}
1278
1279multiclass sve_int_log_imm<bits<2> opc, string asm, string alias, SDPatternOperator op> {
1280  def NAME : sve_int_log_imm<opc, asm>;
1281
1282  def : SVE_1_Op_Imm_Log_Pat<nxv16i8, op, ZPR8,  i32, SVELogicalImm8Pat,  !cast<Instruction>(NAME)>;
1283  def : SVE_1_Op_Imm_Log_Pat<nxv8i16, op, ZPR16, i32, SVELogicalImm16Pat, !cast<Instruction>(NAME)>;
1284  def : SVE_1_Op_Imm_Log_Pat<nxv4i32, op, ZPR32, i32, SVELogicalImm32Pat, !cast<Instruction>(NAME)>;
1285  def : SVE_1_Op_Imm_Log_Pat<nxv2i64, op, ZPR64, i64, SVELogicalImm64Pat, !cast<Instruction>(NAME)>;
1286
1287  def : InstAlias<asm # "\t$Zdn, $Zdn, $imm",
1288                  (!cast<Instruction>(NAME) ZPR8:$Zdn, sve_logical_imm8:$imm), 4>;
1289  def : InstAlias<asm # "\t$Zdn, $Zdn, $imm",
1290                  (!cast<Instruction>(NAME) ZPR16:$Zdn, sve_logical_imm16:$imm), 3>;
1291  def : InstAlias<asm # "\t$Zdn, $Zdn, $imm",
1292                  (!cast<Instruction>(NAME) ZPR32:$Zdn, sve_logical_imm32:$imm), 2>;
1293
1294  def : InstAlias<alias # "\t$Zdn, $Zdn, $imm",
1295                  (!cast<Instruction>(NAME) ZPR8:$Zdn, sve_logical_imm8_not:$imm), 0>;
1296  def : InstAlias<alias # "\t$Zdn, $Zdn, $imm",
1297                  (!cast<Instruction>(NAME) ZPR16:$Zdn, sve_logical_imm16_not:$imm), 0>;
1298  def : InstAlias<alias # "\t$Zdn, $Zdn, $imm",
1299                  (!cast<Instruction>(NAME) ZPR32:$Zdn, sve_logical_imm32_not:$imm), 0>;
1300  def : InstAlias<alias # "\t$Zdn, $Zdn, $imm",
1301                  (!cast<Instruction>(NAME) ZPR64:$Zdn, logical_imm64_not:$imm), 0>;
1302}
1303
1304class sve_int_dup_mask_imm<string asm>
1305: I<(outs ZPR64:$Zd), (ins logical_imm64:$imms),
1306  asm, "\t$Zd, $imms",
1307  "",
1308  []>, Sched<[]> {
1309  bits<5> Zd;
1310  bits<13> imms;
1311  let Inst{31-18} = 0b00000101110000;
1312  let Inst{17-5} = imms;
1313  let Inst{4-0} = Zd;
1314
1315  let isReMaterializable = 1;
1316  let DecoderMethod = "DecodeSVELogicalImmInstruction";
1317}
1318
1319multiclass sve_int_dup_mask_imm<string asm> {
1320  def NAME : sve_int_dup_mask_imm<asm>;
1321
1322  def : InstAlias<"dupm $Zd, $imm",
1323                  (!cast<Instruction>(NAME) ZPR8:$Zd, sve_logical_imm8:$imm), 4>;
1324  def : InstAlias<"dupm $Zd, $imm",
1325                  (!cast<Instruction>(NAME) ZPR16:$Zd, sve_logical_imm16:$imm), 3>;
1326  def : InstAlias<"dupm $Zd, $imm",
1327                  (!cast<Instruction>(NAME) ZPR32:$Zd, sve_logical_imm32:$imm), 2>;
1328
1329  // All Zd.b forms have a CPY/DUP equivalent, hence no byte alias here.
1330  def : InstAlias<"mov $Zd, $imm",
1331                  (!cast<Instruction>(NAME) ZPR16:$Zd, sve_preferred_logical_imm16:$imm), 7>;
1332  def : InstAlias<"mov $Zd, $imm",
1333                  (!cast<Instruction>(NAME) ZPR32:$Zd, sve_preferred_logical_imm32:$imm), 6>;
1334  def : InstAlias<"mov $Zd, $imm",
1335                  (!cast<Instruction>(NAME) ZPR64:$Zd, sve_preferred_logical_imm64:$imm), 5>;
1336}
1337
1338//===----------------------------------------------------------------------===//
1339// SVE Integer Arithmetic -  Unpredicated Group.
1340//===----------------------------------------------------------------------===//
1341
1342class sve_int_bin_cons_arit_0<bits<2> sz8_64, bits<3> opc, string asm,
1343                              ZPRRegOp zprty>
1344: I<(outs zprty:$Zd), (ins zprty:$Zn, zprty:$Zm),
1345  asm, "\t$Zd, $Zn, $Zm",
1346  "", []>, Sched<[]> {
1347  bits<5> Zd;
1348  bits<5> Zm;
1349  bits<5> Zn;
1350  let Inst{31-24} = 0b00000100;
1351  let Inst{23-22} = sz8_64;
1352  let Inst{21}    = 0b1;
1353  let Inst{20-16} = Zm;
1354  let Inst{15-13} = 0b000;
1355  let Inst{12-10} = opc;
1356  let Inst{9-5}   = Zn;
1357  let Inst{4-0}   = Zd;
1358}
1359
1360multiclass sve_int_bin_cons_arit_0<bits<3> opc, string asm, SDPatternOperator op> {
1361  def _B : sve_int_bin_cons_arit_0<0b00, opc, asm, ZPR8>;
1362  def _H : sve_int_bin_cons_arit_0<0b01, opc, asm, ZPR16>;
1363  def _S : sve_int_bin_cons_arit_0<0b10, opc, asm, ZPR32>;
1364  def _D : sve_int_bin_cons_arit_0<0b11, opc, asm, ZPR64>;
1365
1366  def : SVE_2_Op_Pat<nxv16i8, op, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
1367  def : SVE_2_Op_Pat<nxv8i16, op, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
1368  def : SVE_2_Op_Pat<nxv4i32, op, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
1369  def : SVE_2_Op_Pat<nxv2i64, op, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
1370}
1371
1372//===----------------------------------------------------------------------===//
1373// SVE Floating Point Arithmetic - Predicated Group
1374//===----------------------------------------------------------------------===//
1375
1376class sve_fp_2op_i_p_zds<bits<2> sz, bits<3> opc, string asm,
1377                         ZPRRegOp zprty,
1378                         Operand imm_ty>
1379: I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, imm_ty:$i1),
1380  asm, "\t$Zdn, $Pg/m, $_Zdn, $i1",
1381  "",
1382  []>, Sched<[]> {
1383  bits<3> Pg;
1384  bits<5> Zdn;
1385  bit i1;
1386  let Inst{31-24} = 0b01100101;
1387  let Inst{23-22} = sz;
1388  let Inst{21-19} = 0b011;
1389  let Inst{18-16} = opc;
1390  let Inst{15-13} = 0b100;
1391  let Inst{12-10} = Pg;
1392  let Inst{9-6}   = 0b0000;
1393  let Inst{5}     = i1;
1394  let Inst{4-0}   = Zdn;
1395
1396  let Constraints = "$Zdn = $_Zdn";
1397  let DestructiveInstType = Destructive;
1398  let ElementSize = zprty.ElementSize;
1399}
1400
1401multiclass sve_fp_2op_i_p_zds<bits<3> opc, string asm, Operand imm_ty> {
1402  def _H : sve_fp_2op_i_p_zds<0b01, opc, asm, ZPR16, imm_ty>;
1403  def _S : sve_fp_2op_i_p_zds<0b10, opc, asm, ZPR32, imm_ty>;
1404  def _D : sve_fp_2op_i_p_zds<0b11, opc, asm, ZPR64, imm_ty>;
1405}
1406
1407class sve_fp_2op_p_zds<bits<2> sz, bits<4> opc, string asm,
1408                       ZPRRegOp zprty>
1409: I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, zprty:$Zm),
1410  asm, "\t$Zdn, $Pg/m, $_Zdn, $Zm",
1411  "",
1412  []>, Sched<[]> {
1413  bits<3> Pg;
1414  bits<5> Zdn;
1415  bits<5> Zm;
1416  let Inst{31-24} = 0b01100101;
1417  let Inst{23-22} = sz;
1418  let Inst{21-20} = 0b00;
1419  let Inst{19-16} = opc;
1420  let Inst{15-13} = 0b100;
1421  let Inst{12-10} = Pg;
1422  let Inst{9-5}   = Zm;
1423  let Inst{4-0}   = Zdn;
1424
1425  let Constraints = "$Zdn = $_Zdn";
1426  let DestructiveInstType = Destructive;
1427  let ElementSize = zprty.ElementSize;
1428}
1429
1430multiclass sve_fp_2op_p_zds<bits<4> opc, string asm,
1431                            SDPatternOperator op> {
1432  def _H : sve_fp_2op_p_zds<0b01, opc, asm, ZPR16>;
1433  def _S : sve_fp_2op_p_zds<0b10, opc, asm, ZPR32>;
1434  def _D : sve_fp_2op_p_zds<0b11, opc, asm, ZPR64>;
1435
1436  def : SVE_3_Op_Pat<nxv8f16, op, nxv8i1, nxv8f16, nxv8f16, !cast<Instruction>(NAME # _H)>;
1437  def : SVE_3_Op_Pat<nxv4f32, op, nxv4i1, nxv4f32, nxv4f32, !cast<Instruction>(NAME # _S)>;
1438  def : SVE_3_Op_Pat<nxv2f64, op, nxv2i1, nxv2f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
1439}
1440
1441multiclass sve_fp_2op_p_zds_fscale<bits<4> opc, string asm,
1442                                   SDPatternOperator op> {
1443  def _H : sve_fp_2op_p_zds<0b01, opc, asm, ZPR16>;
1444  def _S : sve_fp_2op_p_zds<0b10, opc, asm, ZPR32>;
1445  def _D : sve_fp_2op_p_zds<0b11, opc, asm, ZPR64>;
1446
1447  def : SVE_3_Op_Pat<nxv8f16, op, nxv8i1, nxv8f16, nxv8i16, !cast<Instruction>(NAME # _H)>;
1448  def : SVE_3_Op_Pat<nxv4f32, op, nxv4i1, nxv4f32, nxv4i32, !cast<Instruction>(NAME # _S)>;
1449  def : SVE_3_Op_Pat<nxv2f64, op, nxv2i1, nxv2f64, nxv2i64, !cast<Instruction>(NAME # _D)>;
1450}
1451
1452class sve_fp_ftmad<bits<2> sz, string asm, ZPRRegOp zprty>
1453: I<(outs zprty:$Zdn), (ins zprty:$_Zdn, zprty:$Zm, imm32_0_7:$imm3),
1454  asm, "\t$Zdn, $_Zdn, $Zm, $imm3",
1455  "",
1456  []>, Sched<[]> {
1457  bits<5> Zdn;
1458  bits<5> Zm;
1459  bits<3> imm3;
1460  let Inst{31-24} = 0b01100101;
1461  let Inst{23-22} = sz;
1462  let Inst{21-19} = 0b010;
1463  let Inst{18-16} = imm3;
1464  let Inst{15-10} = 0b100000;
1465  let Inst{9-5}   = Zm;
1466  let Inst{4-0}   = Zdn;
1467
1468  let Constraints = "$Zdn = $_Zdn";
1469  let DestructiveInstType = Destructive;
1470  let ElementSize = ElementSizeNone;
1471}
1472
1473multiclass sve_fp_ftmad<string asm, SDPatternOperator op> {
1474  def _H : sve_fp_ftmad<0b01, asm, ZPR16>;
1475  def _S : sve_fp_ftmad<0b10, asm, ZPR32>;
1476  def _D : sve_fp_ftmad<0b11, asm, ZPR64>;
1477
1478  def : Pat<(nxv8f16 (op (nxv8f16 ZPR16:$Zn), (nxv8f16 ZPR16:$Zm), (i32 imm32_0_7:$imm))),
1479            (!cast<Instruction>(NAME # _H) ZPR16:$Zn, ZPR16:$Zm, imm32_0_7:$imm)>;
1480  def : Pat<(nxv4f32 (op (nxv4f32 ZPR32:$Zn), (nxv4f32 ZPR32:$Zm), (i32 imm32_0_7:$imm))),
1481            (!cast<Instruction>(NAME # _S) ZPR32:$Zn, ZPR32:$Zm, imm32_0_7:$imm)>;
1482  def : Pat<(nxv2f64 (op (nxv2f64 ZPR64:$Zn), (nxv2f64 ZPR64:$Zm), (i32 imm32_0_7:$imm))),
1483            (!cast<Instruction>(NAME # _D) ZPR64:$Zn, ZPR64:$Zm, imm32_0_7:$imm)>;
1484}
1485
1486
1487//===----------------------------------------------------------------------===//
1488// SVE Floating Point Arithmetic - Unpredicated Group
1489//===----------------------------------------------------------------------===//
1490
1491class sve_fp_3op_u_zd<bits<2> sz, bits<3> opc, string asm, ZPRRegOp zprty>
1492: I<(outs zprty:$Zd), (ins  zprty:$Zn, zprty:$Zm),
1493  asm, "\t$Zd, $Zn, $Zm",
1494  "",
1495  []>, Sched<[]> {
1496  bits<5> Zd;
1497  bits<5> Zm;
1498  bits<5> Zn;
1499  let Inst{31-24} = 0b01100101;
1500  let Inst{23-22} = sz;
1501  let Inst{21}    = 0b0;
1502  let Inst{20-16} = Zm;
1503  let Inst{15-13} = 0b000;
1504  let Inst{12-10} = opc;
1505  let Inst{9-5}   = Zn;
1506  let Inst{4-0}   = Zd;
1507}
1508
1509multiclass sve_fp_3op_u_zd<bits<3> opc, string asm, SDPatternOperator op> {
1510  def _H : sve_fp_3op_u_zd<0b01, opc, asm, ZPR16>;
1511  def _S : sve_fp_3op_u_zd<0b10, opc, asm, ZPR32>;
1512  def _D : sve_fp_3op_u_zd<0b11, opc, asm, ZPR64>;
1513
1514  def : SVE_2_Op_Pat<nxv8f16, op, nxv8f16, nxv8f16, !cast<Instruction>(NAME # _H)>;
1515  def : SVE_2_Op_Pat<nxv4f32, op, nxv4f32, nxv4f32, !cast<Instruction>(NAME # _S)>;
1516  def : SVE_2_Op_Pat<nxv2f64, op, nxv2f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
1517
1518}
1519
1520multiclass sve_fp_3op_u_zd_ftsmul<bits<3> opc, string asm, SDPatternOperator op> {
1521  def _H : sve_fp_3op_u_zd<0b01, opc, asm, ZPR16>;
1522  def _S : sve_fp_3op_u_zd<0b10, opc, asm, ZPR32>;
1523  def _D : sve_fp_3op_u_zd<0b11, opc, asm, ZPR64>;
1524
1525  def : SVE_2_Op_Pat<nxv8f16, op, nxv8f16, nxv8i16, !cast<Instruction>(NAME # _H)>;
1526  def : SVE_2_Op_Pat<nxv4f32, op, nxv4f32, nxv4i32, !cast<Instruction>(NAME # _S)>;
1527  def : SVE_2_Op_Pat<nxv2f64, op, nxv2f64, nxv2i64, !cast<Instruction>(NAME # _D)>;
1528}
1529
1530//===----------------------------------------------------------------------===//
1531// SVE Floating Point Fused Multiply-Add Group
1532//===----------------------------------------------------------------------===//
1533
1534class sve_fp_3op_p_zds_a<bits<2> sz, bits<2> opc, string asm, ZPRRegOp zprty>
1535: I<(outs zprty:$Zda), (ins PPR3bAny:$Pg, zprty:$_Zda, zprty:$Zn, zprty:$Zm),
1536  asm, "\t$Zda, $Pg/m, $Zn, $Zm",
1537  "",
1538  []>, Sched<[]> {
1539  bits<3> Pg;
1540  bits<5> Zda;
1541  bits<5> Zm;
1542  bits<5> Zn;
1543  let Inst{31-24} = 0b01100101;
1544  let Inst{23-22} = sz;
1545  let Inst{21}    = 0b1;
1546  let Inst{20-16} = Zm;
1547  let Inst{15}    = 0b0;
1548  let Inst{14-13} = opc;
1549  let Inst{12-10} = Pg;
1550  let Inst{9-5}   = Zn;
1551  let Inst{4-0}   = Zda;
1552
1553  let Constraints = "$Zda = $_Zda";
1554  let DestructiveInstType = Destructive;
1555  let ElementSize = zprty.ElementSize;
1556}
1557
1558multiclass sve_fp_3op_p_zds_a<bits<2> opc, string asm, SDPatternOperator op> {
1559  def _H : sve_fp_3op_p_zds_a<0b01, opc, asm, ZPR16>;
1560  def _S : sve_fp_3op_p_zds_a<0b10, opc, asm, ZPR32>;
1561  def _D : sve_fp_3op_p_zds_a<0b11, opc, asm, ZPR64>;
1562
1563  def : SVE_4_Op_Pat<nxv8f16, op, nxv8i1, nxv8f16, nxv8f16, nxv8f16, !cast<Instruction>(NAME # _H)>;
1564  def : SVE_4_Op_Pat<nxv4f32, op, nxv4i1, nxv4f32, nxv4f32, nxv4f32, !cast<Instruction>(NAME # _S)>;
1565  def : SVE_4_Op_Pat<nxv2f64, op, nxv2i1, nxv2f64, nxv2f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
1566}
1567
1568class sve_fp_3op_p_zds_b<bits<2> sz, bits<2> opc, string asm,
1569                         ZPRRegOp zprty>
1570: I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, zprty:$Zm, zprty:$Za),
1571  asm, "\t$Zdn, $Pg/m, $Zm, $Za",
1572  "",
1573  []>, Sched<[]> {
1574  bits<3> Pg;
1575  bits<5> Za;
1576  bits<5> Zdn;
1577  bits<5> Zm;
1578  let Inst{31-24} = 0b01100101;
1579  let Inst{23-22} = sz;
1580  let Inst{21}    = 0b1;
1581  let Inst{20-16} = Za;
1582  let Inst{15}    = 0b1;
1583  let Inst{14-13} = opc;
1584  let Inst{12-10} = Pg;
1585  let Inst{9-5}   = Zm;
1586  let Inst{4-0}   = Zdn;
1587
1588  let Constraints = "$Zdn = $_Zdn";
1589  let DestructiveInstType = Destructive;
1590  let ElementSize = zprty.ElementSize;
1591}
1592
1593multiclass sve_fp_3op_p_zds_b<bits<2> opc, string asm, SDPatternOperator op> {
1594  def _H : sve_fp_3op_p_zds_b<0b01, opc, asm, ZPR16>;
1595  def _S : sve_fp_3op_p_zds_b<0b10, opc, asm, ZPR32>;
1596  def _D : sve_fp_3op_p_zds_b<0b11, opc, asm, ZPR64>;
1597
1598  def : SVE_4_Op_Pat<nxv8f16, op, nxv8i1, nxv8f16, nxv8f16, nxv8f16, !cast<Instruction>(NAME # _H)>;
1599  def : SVE_4_Op_Pat<nxv4f32, op, nxv4i1, nxv4f32, nxv4f32, nxv4f32, !cast<Instruction>(NAME # _S)>;
1600  def : SVE_4_Op_Pat<nxv2f64, op, nxv2i1, nxv2f64, nxv2f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
1601}
1602
1603//===----------------------------------------------------------------------===//
1604// SVE Floating Point Multiply-Add - Indexed Group
1605//===----------------------------------------------------------------------===//
1606
1607class sve_fp_fma_by_indexed_elem<bits<2> sz, bit opc, string asm,
1608                                 ZPRRegOp zprty1,
1609                                 ZPRRegOp zprty2, Operand itype>
1610: I<(outs zprty1:$Zda), (ins zprty1:$_Zda, zprty1:$Zn, zprty2:$Zm, itype:$iop),
1611  asm, "\t$Zda, $Zn, $Zm$iop", "", []>, Sched<[]> {
1612  bits<5> Zda;
1613  bits<5> Zn;
1614  let Inst{31-24} = 0b01100100;
1615  let Inst{23-22} = sz;
1616  let Inst{21}    = 0b1;
1617  let Inst{15-11} = 0;
1618  let Inst{10}    = opc;
1619  let Inst{9-5}   = Zn;
1620  let Inst{4-0}   = Zda;
1621
1622  let Constraints = "$Zda = $_Zda";
1623  let DestructiveInstType = Destructive;
1624  let ElementSize = ElementSizeNone;
1625}
1626
1627multiclass sve_fp_fma_by_indexed_elem<bit opc, string asm,
1628                                      SDPatternOperator op> {
1629  def _H : sve_fp_fma_by_indexed_elem<{0, ?}, opc, asm, ZPR16, ZPR3b16, VectorIndexH32b> {
1630    bits<3> Zm;
1631    bits<3> iop;
1632    let Inst{22} = iop{2};
1633    let Inst{20-19} = iop{1-0};
1634    let Inst{18-16} = Zm;
1635  }
1636  def _S : sve_fp_fma_by_indexed_elem<0b10, opc, asm, ZPR32, ZPR3b32, VectorIndexS32b> {
1637    bits<3> Zm;
1638    bits<2> iop;
1639    let Inst{20-19} = iop;
1640    let Inst{18-16} = Zm;
1641  }
1642  def _D : sve_fp_fma_by_indexed_elem<0b11, opc, asm, ZPR64, ZPR4b64, VectorIndexD32b> {
1643    bits<4> Zm;
1644    bit iop;
1645    let Inst{20} = iop;
1646    let Inst{19-16} = Zm;
1647  }
1648
1649  def : Pat<(nxv8f16 (op nxv8f16:$Op1, nxv8f16:$Op2, nxv8f16:$Op3, (i32 VectorIndexH32b:$idx))),
1650            (!cast<Instruction>(NAME # _H) $Op1, $Op2, $Op3, VectorIndexH32b:$idx)>;
1651  def : Pat<(nxv4f32 (op nxv4f32:$Op1, nxv4f32:$Op2, nxv4f32:$Op3, (i32 VectorIndexS32b:$idx))),
1652            (!cast<Instruction>(NAME # _S) $Op1, $Op2, $Op3, VectorIndexS32b:$idx)>;
1653  def : Pat<(nxv2f64 (op nxv2f64:$Op1, nxv2f64:$Op2, nxv2f64:$Op3, (i32 VectorIndexD32b:$idx))),
1654            (!cast<Instruction>(NAME # _D) $Op1, $Op2, $Op3, VectorIndexD32b:$idx)>;
1655}
1656
1657
1658//===----------------------------------------------------------------------===//
1659// SVE Floating Point Multiply - Indexed Group
1660//===----------------------------------------------------------------------===//
1661
1662class sve_fp_fmul_by_indexed_elem<bits<2> sz, string asm, ZPRRegOp zprty,
1663                                      ZPRRegOp zprty2, Operand itype>
1664: I<(outs zprty:$Zd), (ins zprty:$Zn, zprty2:$Zm, itype:$iop),
1665  asm, "\t$Zd, $Zn, $Zm$iop", "", []>, Sched<[]> {
1666  bits<5> Zd;
1667  bits<5> Zn;
1668  let Inst{31-24} = 0b01100100;
1669  let Inst{23-22} = sz;
1670  let Inst{21}    = 0b1;
1671  let Inst{15-10} = 0b001000;
1672  let Inst{9-5}   = Zn;
1673  let Inst{4-0}   = Zd;
1674}
1675
1676multiclass sve_fp_fmul_by_indexed_elem<string asm, SDPatternOperator op> {
1677  def _H : sve_fp_fmul_by_indexed_elem<{0, ?}, asm, ZPR16, ZPR3b16, VectorIndexH32b> {
1678    bits<3> Zm;
1679    bits<3> iop;
1680    let Inst{22} = iop{2};
1681    let Inst{20-19} = iop{1-0};
1682    let Inst{18-16} = Zm;
1683  }
1684  def _S : sve_fp_fmul_by_indexed_elem<0b10, asm, ZPR32, ZPR3b32, VectorIndexS32b> {
1685    bits<3> Zm;
1686    bits<2> iop;
1687    let Inst{20-19} = iop;
1688    let Inst{18-16} = Zm;
1689  }
1690  def _D : sve_fp_fmul_by_indexed_elem<0b11, asm, ZPR64, ZPR4b64, VectorIndexD32b> {
1691    bits<4> Zm;
1692    bit iop;
1693    let Inst{20} = iop;
1694    let Inst{19-16} = Zm;
1695  }
1696
1697  def : Pat<(nxv8f16 (op nxv8f16:$Op1, nxv8f16:$Op2, (i32 VectorIndexH32b:$idx))),
1698            (!cast<Instruction>(NAME # _H) $Op1, $Op2, VectorIndexH32b:$idx)>;
1699  def : Pat<(nxv4f32 (op nxv4f32:$Op1, nxv4f32:$Op2, (i32 VectorIndexS32b:$idx))),
1700            (!cast<Instruction>(NAME # _S) $Op1, $Op2, VectorIndexS32b:$idx)>;
1701  def : Pat<(nxv2f64 (op nxv2f64:$Op1, nxv2f64:$Op2, (i32 VectorIndexD32b:$idx))),
1702            (!cast<Instruction>(NAME # _D) $Op1, $Op2, VectorIndexD32b:$idx)>;
1703}
1704
1705//===----------------------------------------------------------------------===//
1706// SVE Floating Point Complex Multiply-Add Group
1707//===----------------------------------------------------------------------===//
1708
1709class sve_fp_fcmla<bits<2> sz, string asm, ZPRRegOp zprty>
1710: I<(outs zprty:$Zda), (ins PPR3bAny:$Pg, zprty:$_Zda, zprty:$Zn, zprty:$Zm,
1711                        complexrotateop:$imm),
1712  asm, "\t$Zda, $Pg/m, $Zn, $Zm, $imm",
1713  "", []>, Sched<[]> {
1714  bits<5> Zda;
1715  bits<3> Pg;
1716  bits<5> Zn;
1717  bits<5> Zm;
1718  bits<2> imm;
1719  let Inst{31-24} = 0b01100100;
1720  let Inst{23-22} = sz;
1721  let Inst{21}    = 0;
1722  let Inst{20-16} = Zm;
1723  let Inst{15}    = 0;
1724  let Inst{14-13} = imm;
1725  let Inst{12-10} = Pg;
1726  let Inst{9-5}   = Zn;
1727  let Inst{4-0}   = Zda;
1728
1729  let Constraints = "$Zda = $_Zda";
1730  let DestructiveInstType = Destructive;
1731  let ElementSize = zprty.ElementSize;
1732}
1733
1734multiclass sve_fp_fcmla<string asm, SDPatternOperator op> {
1735  def _H : sve_fp_fcmla<0b01, asm, ZPR16>;
1736  def _S : sve_fp_fcmla<0b10, asm, ZPR32>;
1737  def _D : sve_fp_fcmla<0b11, asm, ZPR64>;
1738
1739  def : Pat<(nxv8f16 (op nxv8i1:$Op1, nxv8f16:$Op2, nxv8f16:$Op3, nxv8f16:$Op4, (i32 complexrotateop:$imm))),
1740            (!cast<Instruction>(NAME # _H) $Op1, $Op2, $Op3, $Op4, complexrotateop:$imm)>;
1741  def : Pat<(nxv4f32 (op nxv4i1:$Op1, nxv4f32:$Op2, nxv4f32:$Op3, nxv4f32:$Op4, (i32 complexrotateop:$imm))),
1742            (!cast<Instruction>(NAME # _S) $Op1, $Op2, $Op3, $Op4, complexrotateop:$imm)>;
1743  def : Pat<(nxv2f64 (op nxv2i1:$Op1, nxv2f64:$Op2, nxv2f64:$Op3, nxv2f64:$Op4, (i32 complexrotateop:$imm))),
1744            (!cast<Instruction>(NAME # _D) $Op1, $Op2, $Op3, $Op4, complexrotateop:$imm)>;
1745}
1746
1747//===----------------------------------------------------------------------===//
1748// SVE Floating Point Complex Multiply-Add - Indexed Group
1749//===----------------------------------------------------------------------===//
1750
1751class sve_fp_fcmla_by_indexed_elem<bits<2> sz, string asm,
1752                                   ZPRRegOp zprty,
1753                                   ZPRRegOp zprty2, Operand itype>
1754: I<(outs zprty:$Zda), (ins zprty:$_Zda, zprty:$Zn, zprty2:$Zm, itype:$iop,
1755                        complexrotateop:$imm),
1756  asm, "\t$Zda, $Zn, $Zm$iop, $imm",
1757  "", []>, Sched<[]> {
1758  bits<5> Zda;
1759  bits<5> Zn;
1760  bits<2> imm;
1761  let Inst{31-24} = 0b01100100;
1762  let Inst{23-22} = sz;
1763  let Inst{21}    = 0b1;
1764  let Inst{15-12} = 0b0001;
1765  let Inst{11-10} = imm;
1766  let Inst{9-5}   = Zn;
1767  let Inst{4-0}   = Zda;
1768
1769  let Constraints = "$Zda = $_Zda";
1770  let DestructiveInstType = Destructive;
1771  let ElementSize = ElementSizeNone;
1772}
1773
1774multiclass sve_fp_fcmla_by_indexed_elem<string asm, SDPatternOperator op> {
1775  def _H : sve_fp_fcmla_by_indexed_elem<0b10, asm, ZPR16, ZPR3b16, VectorIndexS32b> {
1776    bits<3> Zm;
1777    bits<2> iop;
1778    let Inst{20-19} = iop;
1779    let Inst{18-16} = Zm;
1780  }
1781  def _S : sve_fp_fcmla_by_indexed_elem<0b11, asm, ZPR32, ZPR4b32, VectorIndexD32b> {
1782    bits<4> Zm;
1783    bits<1> iop;
1784    let Inst{20} = iop;
1785    let Inst{19-16} = Zm;
1786  }
1787
1788  def : Pat<(nxv8f16 (op nxv8f16:$Op1, nxv8f16:$Op2, nxv8f16:$Op3, (i32 VectorIndexS32b:$idx), (i32 complexrotateop:$imm))),
1789            (!cast<Instruction>(NAME # _H) $Op1, $Op2, $Op3, VectorIndexS32b:$idx, complexrotateop:$imm)>;
1790  def : Pat<(nxv4f32 (op nxv4f32:$Op1, nxv4f32:$Op2, nxv4f32:$Op3, (i32 VectorIndexD32b:$idx), (i32 complexrotateop:$imm))),
1791            (!cast<Instruction>(NAME # _S) $Op1, $Op2, $Op3, VectorIndexD32b:$idx, complexrotateop:$imm)>;
1792}
1793
1794//===----------------------------------------------------------------------===//
1795// SVE Floating Point Complex Addition Group
1796//===----------------------------------------------------------------------===//
1797
1798class sve_fp_fcadd<bits<2> sz, string asm, ZPRRegOp zprty>
1799: I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, zprty:$Zm,
1800                        complexrotateopodd:$imm),
1801  asm, "\t$Zdn, $Pg/m, $_Zdn, $Zm, $imm",
1802  "",
1803  []>, Sched<[]> {
1804  bits<5> Zdn;
1805  bits<5> Zm;
1806  bits<3> Pg;
1807  bit imm;
1808  let Inst{31-24} = 0b01100100;
1809  let Inst{23-22} = sz;
1810  let Inst{21-17} = 0;
1811  let Inst{16}    = imm;
1812  let Inst{15-13} = 0b100;
1813  let Inst{12-10} = Pg;
1814  let Inst{9-5}   = Zm;
1815  let Inst{4-0}   = Zdn;
1816
1817  let Constraints = "$Zdn = $_Zdn";
1818  let DestructiveInstType = Destructive;
1819  let ElementSize = zprty.ElementSize;
1820}
1821
1822multiclass sve_fp_fcadd<string asm, SDPatternOperator op> {
1823  def _H : sve_fp_fcadd<0b01, asm, ZPR16>;
1824  def _S : sve_fp_fcadd<0b10, asm, ZPR32>;
1825  def _D : sve_fp_fcadd<0b11, asm, ZPR64>;
1826
1827  def : Pat<(nxv8f16 (op nxv8i1:$Op1, nxv8f16:$Op2, nxv8f16:$Op3, (i32 complexrotateopodd:$imm))),
1828            (!cast<Instruction>(NAME # _H) $Op1, $Op2, $Op3, complexrotateopodd:$imm)>;
1829  def : Pat<(nxv4f32 (op nxv4i1:$Op1, nxv4f32:$Op2, nxv4f32:$Op3, (i32 complexrotateopodd:$imm))),
1830            (!cast<Instruction>(NAME # _S) $Op1, $Op2, $Op3, complexrotateopodd:$imm)>;
1831  def : Pat<(nxv2f64 (op nxv2i1:$Op1, nxv2f64:$Op2, nxv2f64:$Op3, (i32 complexrotateopodd:$imm))),
1832            (!cast<Instruction>(NAME # _D) $Op1, $Op2, $Op3, complexrotateopodd:$imm)>;
1833}
1834
1835//===----------------------------------------------------------------------===//
1836// SVE2 Floating Point Convert Group
1837//===----------------------------------------------------------------------===//
1838
1839class sve2_fp_convert_precision<bits<4> opc, string asm,
1840                                ZPRRegOp zprty1, ZPRRegOp zprty2>
1841: I<(outs zprty1:$Zd), (ins zprty1:$_Zd, PPR3bAny:$Pg, zprty2:$Zn),
1842  asm, "\t$Zd, $Pg/m, $Zn",
1843  "",
1844  []>, Sched<[]> {
1845  bits<5> Zd;
1846  bits<5> Zn;
1847  bits<3> Pg;
1848  let Inst{31-24} = 0b01100100;
1849  let Inst{23-22} = opc{3-2};
1850  let Inst{21-18} = 0b0010;
1851  let Inst{17-16} = opc{1-0};
1852  let Inst{15-13} = 0b101;
1853  let Inst{12-10} = Pg;
1854  let Inst{9-5}   = Zn;
1855  let Inst{4-0}   = Zd;
1856
1857  let Constraints = "$Zd = $_Zd";
1858}
1859
1860multiclass sve2_fp_convert_down_narrow<string asm, string op> {
1861  def _StoH : sve2_fp_convert_precision<0b1000, asm, ZPR16, ZPR32>;
1862  def _DtoS : sve2_fp_convert_precision<0b1110, asm, ZPR32, ZPR64>;
1863
1864  def : SVE_3_Op_Pat<nxv8f16, !cast<SDPatternOperator>(op # _f16f32), nxv8f16, nxv16i1, nxv4f32, !cast<Instruction>(NAME # _StoH)>;
1865  def : SVE_3_Op_Pat<nxv4f32, !cast<SDPatternOperator>(op # _f32f64), nxv4f32, nxv16i1, nxv2f64, !cast<Instruction>(NAME # _DtoS)>;
1866}
1867
1868multiclass sve2_fp_convert_up_long<string asm, string op> {
1869  def _HtoS : sve2_fp_convert_precision<0b1001, asm, ZPR32, ZPR16>;
1870  def _StoD : sve2_fp_convert_precision<0b1111, asm, ZPR64, ZPR32>;
1871
1872  def : SVE_3_Op_Pat<nxv4f32, !cast<SDPatternOperator>(op # _f32f16), nxv4f32, nxv16i1, nxv8f16, !cast<Instruction>(NAME # _HtoS)>;
1873  def : SVE_3_Op_Pat<nxv2f64, !cast<SDPatternOperator>(op # _f64f32), nxv2f64, nxv16i1, nxv4f32, !cast<Instruction>(NAME # _StoD)>;
1874}
1875
1876multiclass sve2_fp_convert_down_odd_rounding_top<string asm, string op> {
1877  def _DtoS : sve2_fp_convert_precision<0b0010, asm, ZPR32, ZPR64>;
1878
1879  def : SVE_3_Op_Pat<nxv4f32, !cast<SDPatternOperator>(op # _f32f64), nxv4f32, nxv16i1, nxv2f64, !cast<Instruction>(NAME # _DtoS)>;
1880}
1881
1882//===----------------------------------------------------------------------===//
1883// SVE2 Floating Point Pairwise Group
1884//===----------------------------------------------------------------------===//
1885
1886class sve2_fp_pairwise_pred<bits<2> sz, bits<3> opc, string asm,
1887                            ZPRRegOp zprty>
1888: I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, zprty:$Zm),
1889  asm, "\t$Zdn, $Pg/m, $_Zdn, $Zm",
1890  "",
1891  []>, Sched<[]> {
1892  bits<3> Pg;
1893  bits<5> Zm;
1894  bits<5> Zdn;
1895  let Inst{31-24} = 0b01100100;
1896  let Inst{23-22} = sz;
1897  let Inst{21-19} = 0b010;
1898  let Inst{18-16} = opc;
1899  let Inst{15-13} = 0b100;
1900  let Inst{12-10} = Pg;
1901  let Inst{9-5}   = Zm;
1902  let Inst{4-0}   = Zdn;
1903
1904  let Constraints = "$Zdn = $_Zdn";
1905  let DestructiveInstType = Destructive;
1906  let ElementSize = zprty.ElementSize;
1907}
1908
1909multiclass sve2_fp_pairwise_pred<bits<3> opc, string asm, SDPatternOperator op> {
1910  def _H : sve2_fp_pairwise_pred<0b01, opc, asm, ZPR16>;
1911  def _S : sve2_fp_pairwise_pred<0b10, opc, asm, ZPR32>;
1912  def _D : sve2_fp_pairwise_pred<0b11, opc, asm, ZPR64>;
1913
1914  def : SVE_3_Op_Pat<nxv8f16, op, nxv8i1, nxv8f16, nxv8f16, !cast<Instruction>(NAME # _H)>;
1915  def : SVE_3_Op_Pat<nxv4f32, op, nxv4i1, nxv4f32, nxv4f32, !cast<Instruction>(NAME # _S)>;
1916  def : SVE_3_Op_Pat<nxv2f64, op, nxv2i1, nxv2f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
1917}
1918
1919//===----------------------------------------------------------------------===//
1920// SVE2 Floating Point Widening Multiply-Add - Indexed Group
1921//===----------------------------------------------------------------------===//
1922
1923class sve2_fp_mla_long_by_indexed_elem<bits<2> opc, string asm>
1924: I<(outs ZPR32:$Zda), (ins ZPR32:$_Zda, ZPR16:$Zn, ZPR3b16:$Zm,
1925                        VectorIndexH32b:$iop),
1926  asm, "\t$Zda, $Zn, $Zm$iop",
1927  "",
1928  []>, Sched<[]> {
1929  bits<5> Zda;
1930  bits<5> Zn;
1931  bits<3> Zm;
1932  bits<3> iop;
1933  let Inst{31-21} = 0b01100100101;
1934  let Inst{20-19} = iop{2-1};
1935  let Inst{18-16} = Zm;
1936  let Inst{15-14} = 0b01;
1937  let Inst{13}    = opc{1};
1938  let Inst{12}    = 0b0;
1939  let Inst{11}    = iop{0};
1940  let Inst{10}    = opc{0};
1941  let Inst{9-5}   = Zn;
1942  let Inst{4-0}   = Zda;
1943
1944  let Constraints = "$Zda = $_Zda";
1945  let DestructiveInstType = Destructive;
1946  let ElementSize = ElementSizeNone;
1947}
1948
1949multiclass sve2_fp_mla_long_by_indexed_elem<bits<2> opc, string asm,
1950                                            SDPatternOperator op> {
1951  def NAME : sve2_fp_mla_long_by_indexed_elem<opc, asm>;
1952  def : SVE_4_Op_Imm_Pat<nxv4f32, op, nxv4f32, nxv8f16, nxv8f16, i32, VectorIndexH32b, !cast<Instruction>(NAME)>;
1953}
1954
1955//===----------------------------------------------------------------------===//
1956// SVE2 Floating Point Widening Multiply-Add Group
1957//===----------------------------------------------------------------------===//
1958
1959class sve2_fp_mla_long<bits<2> opc, string asm>
1960: I<(outs ZPR32:$Zda), (ins ZPR32:$_Zda, ZPR16:$Zn, ZPR16:$Zm),
1961  asm, "\t$Zda, $Zn, $Zm",
1962  "",
1963  []>, Sched<[]> {
1964  bits<5> Zda;
1965  bits<5> Zn;
1966  bits<5> Zm;
1967  let Inst{31-21} = 0b01100100101;
1968  let Inst{20-16} = Zm;
1969  let Inst{15-14} = 0b10;
1970  let Inst{13}    = opc{1};
1971  let Inst{12-11} = 0b00;
1972  let Inst{10}    = opc{0};
1973  let Inst{9-5}   = Zn;
1974  let Inst{4-0}   = Zda;
1975
1976  let Constraints = "$Zda = $_Zda";
1977  let DestructiveInstType = Destructive;
1978  let ElementSize = ElementSizeNone;
1979}
1980
1981multiclass sve2_fp_mla_long<bits<2> opc, string asm, SDPatternOperator op> {
1982  def NAME : sve2_fp_mla_long<opc, asm>;
1983  def : SVE_3_Op_Pat<nxv4f32, op, nxv4f32, nxv8f16, nxv8f16, !cast<Instruction>(NAME)>;
1984}
1985
1986//===----------------------------------------------------------------------===//
1987// SVE Stack Allocation Group
1988//===----------------------------------------------------------------------===//
1989
1990class sve_int_arith_vl<bit opc, string asm>
1991: I<(outs GPR64sp:$Rd), (ins GPR64sp:$Rn, simm6_32b:$imm6),
1992  asm, "\t$Rd, $Rn, $imm6",
1993  "",
1994  []>, Sched<[]> {
1995  bits<5> Rd;
1996  bits<5> Rn;
1997  bits<6> imm6;
1998  let Inst{31-23} = 0b000001000;
1999  let Inst{22}    = opc;
2000  let Inst{21}    = 0b1;
2001  let Inst{20-16} = Rn;
2002  let Inst{15-11} = 0b01010;
2003  let Inst{10-5}  = imm6;
2004  let Inst{4-0}   = Rd;
2005}
2006
2007class sve_int_read_vl_a<bit op, bits<5> opc2, string asm>
2008: I<(outs GPR64:$Rd), (ins simm6_32b:$imm6),
2009  asm, "\t$Rd, $imm6",
2010  "",
2011  []>, Sched<[]> {
2012  bits<5> Rd;
2013  bits<6> imm6;
2014  let Inst{31-23} = 0b000001001;
2015  let Inst{22}    = op;
2016  let Inst{21}    = 0b1;
2017  let Inst{20-16} = opc2{4-0};
2018  let Inst{15-11} = 0b01010;
2019  let Inst{10-5}  = imm6;
2020  let Inst{4-0}   = Rd;
2021}
2022
2023//===----------------------------------------------------------------------===//
2024// SVE Permute - In Lane Group
2025//===----------------------------------------------------------------------===//
2026
2027class sve_int_perm_bin_perm_zz<bits<3> opc, bits<2> sz8_64, string asm,
2028                               ZPRRegOp zprty>
2029: I<(outs zprty:$Zd), (ins zprty:$Zn, zprty:$Zm),
2030  asm, "\t$Zd, $Zn, $Zm",
2031  "",
2032  []>, Sched<[]> {
2033  bits<5> Zd;
2034  bits<5> Zm;
2035  bits<5> Zn;
2036  let Inst{31-24} = 0b00000101;
2037  let Inst{23-22} = sz8_64;
2038  let Inst{21}    = 0b1;
2039  let Inst{20-16} = Zm;
2040  let Inst{15-13} = 0b011;
2041  let Inst{12-10} = opc;
2042  let Inst{9-5}   = Zn;
2043  let Inst{4-0}   = Zd;
2044}
2045
2046multiclass sve_int_perm_bin_perm_zz<bits<3> opc, string asm,
2047                                    SDPatternOperator op> {
2048  def _B : sve_int_perm_bin_perm_zz<opc, 0b00, asm, ZPR8>;
2049  def _H : sve_int_perm_bin_perm_zz<opc, 0b01, asm, ZPR16>;
2050  def _S : sve_int_perm_bin_perm_zz<opc, 0b10, asm, ZPR32>;
2051  def _D : sve_int_perm_bin_perm_zz<opc, 0b11, asm, ZPR64>;
2052
2053  def : SVE_2_Op_Pat<nxv16i8, op, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
2054  def : SVE_2_Op_Pat<nxv8i16, op, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
2055  def : SVE_2_Op_Pat<nxv4i32, op, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
2056  def : SVE_2_Op_Pat<nxv2i64, op, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
2057
2058  def : SVE_2_Op_Pat<nxv8f16, op, nxv8f16, nxv8f16, !cast<Instruction>(NAME # _H)>;
2059  def : SVE_2_Op_Pat<nxv4f16, op, nxv4f16, nxv4f16, !cast<Instruction>(NAME # _S)>;
2060  def : SVE_2_Op_Pat<nxv4f32, op, nxv4f32, nxv4f32, !cast<Instruction>(NAME # _S)>;
2061  def : SVE_2_Op_Pat<nxv2f64, op, nxv2f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
2062}
2063
2064//===----------------------------------------------------------------------===//
2065// SVE Floating Point Unary Operations Group
2066//===----------------------------------------------------------------------===//
2067
2068class sve_fp_2op_p_zd<bits<7> opc, string asm, RegisterOperand i_zprtype,
2069                      RegisterOperand o_zprtype, ElementSizeEnum size>
2070: I<(outs o_zprtype:$Zd), (ins i_zprtype:$_Zd, PPR3bAny:$Pg, i_zprtype:$Zn),
2071  asm, "\t$Zd, $Pg/m, $Zn",
2072  "",
2073  []>, Sched<[]> {
2074  bits<3> Pg;
2075  bits<5> Zd;
2076  bits<5> Zn;
2077  let Inst{31-24} = 0b01100101;
2078  let Inst{23-22} = opc{6-5};
2079  let Inst{21}    = 0b0;
2080  let Inst{20-16} = opc{4-0};
2081  let Inst{15-13} = 0b101;
2082  let Inst{12-10} = Pg;
2083  let Inst{9-5}   = Zn;
2084  let Inst{4-0}   = Zd;
2085
2086  let Constraints = "$Zd = $_Zd";
2087  let DestructiveInstType = Destructive;
2088  let ElementSize = size;
2089}
2090
2091multiclass sve_fp_2op_p_zd<bits<7> opc, string asm,
2092                           RegisterOperand i_zprtype,
2093                           RegisterOperand o_zprtype,
2094                           SDPatternOperator op, ValueType vt1,
2095                           ValueType vt2, ValueType vt3, ElementSizeEnum Sz> {
2096  def NAME : sve_fp_2op_p_zd<opc, asm, i_zprtype, o_zprtype, Sz>;
2097
2098  def : SVE_3_Op_Pat<vt1, op, vt1, vt2, vt3, !cast<Instruction>(NAME)>;
2099}
2100
2101multiclass sve_fp_2op_p_zd_HSD<bits<5> opc, string asm, SDPatternOperator op> {
2102  def _H : sve_fp_2op_p_zd<{ 0b01, opc }, asm, ZPR16, ZPR16, ElementSizeH>;
2103  def _S : sve_fp_2op_p_zd<{ 0b10, opc }, asm, ZPR32, ZPR32, ElementSizeS>;
2104  def _D : sve_fp_2op_p_zd<{ 0b11, opc }, asm, ZPR64, ZPR64, ElementSizeD>;
2105
2106  def : SVE_3_Op_Pat<nxv8f16, op, nxv8f16, nxv8i1, nxv8f16, !cast<Instruction>(NAME # _H)>;
2107  def : SVE_3_Op_Pat<nxv4f32, op, nxv4f32, nxv4i1, nxv4f32, !cast<Instruction>(NAME # _S)>;
2108  def : SVE_3_Op_Pat<nxv2f64, op, nxv2f64, nxv2i1, nxv2f64, !cast<Instruction>(NAME # _D)>;
2109}
2110
2111multiclass sve2_fp_flogb<string asm, SDPatternOperator op> {
2112  def _H : sve_fp_2op_p_zd<0b0011010, asm, ZPR16, ZPR16, ElementSizeH>;
2113  def _S : sve_fp_2op_p_zd<0b0011100, asm, ZPR32, ZPR32, ElementSizeS>;
2114  def _D : sve_fp_2op_p_zd<0b0011110, asm, ZPR64, ZPR64, ElementSizeD>;
2115
2116  def : SVE_3_Op_Pat<nxv8i16, op, nxv8i16, nxv8i1, nxv8f16, !cast<Instruction>(NAME # _H)>;
2117  def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv4i1, nxv4f32, !cast<Instruction>(NAME # _S)>;
2118  def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv2i1, nxv2f64, !cast<Instruction>(NAME # _D)>;
2119}
2120
2121multiclass sve2_fp_convert_down_odd_rounding<string asm, string op> {
2122  def _DtoS : sve_fp_2op_p_zd<0b0001010, asm, ZPR64, ZPR32, ElementSizeD>;
2123  def : SVE_3_Op_Pat<nxv4f32, !cast<SDPatternOperator>(op # _f32f64), nxv4f32, nxv16i1, nxv2f64, !cast<Instruction>(NAME # _DtoS)>;
2124}
2125
2126//===----------------------------------------------------------------------===//
2127// SVE Floating Point Unary Operations - Unpredicated Group
2128//===----------------------------------------------------------------------===//
2129
2130class sve_fp_2op_u_zd<bits<2> sz, bits<3> opc, string asm,
2131                      ZPRRegOp zprty>
2132: I<(outs zprty:$Zd), (ins zprty:$Zn),
2133  asm, "\t$Zd, $Zn",
2134  "",
2135  []>, Sched<[]> {
2136  bits<5> Zd;
2137  bits<5> Zn;
2138  let Inst{31-24} = 0b01100101;
2139  let Inst{23-22} = sz;
2140  let Inst{21-19} = 0b001;
2141  let Inst{18-16} = opc;
2142  let Inst{15-10} = 0b001100;
2143  let Inst{9-5}   = Zn;
2144  let Inst{4-0}   = Zd;
2145}
2146
2147multiclass sve_fp_2op_u_zd<bits<3> opc, string asm, SDPatternOperator op> {
2148  def _H : sve_fp_2op_u_zd<0b01, opc, asm, ZPR16>;
2149  def _S : sve_fp_2op_u_zd<0b10, opc, asm, ZPR32>;
2150  def _D : sve_fp_2op_u_zd<0b11, opc, asm, ZPR64>;
2151
2152  def : SVE_1_Op_Pat<nxv8f16, op, nxv8f16, !cast<Instruction>(NAME # _H)>;
2153  def : SVE_1_Op_Pat<nxv4f32, op, nxv4f32, !cast<Instruction>(NAME # _S)>;
2154  def : SVE_1_Op_Pat<nxv2f64, op, nxv2f64, !cast<Instruction>(NAME # _D)>;
2155}
2156
2157//===----------------------------------------------------------------------===//
2158// SVE Integer Arithmetic - Binary Predicated Group
2159//===----------------------------------------------------------------------===//
2160
2161class sve_int_bin_pred_arit_log<bits<2> sz8_64, bits<2> fmt, bits<3> opc,
2162                                string asm, ZPRRegOp zprty>
2163: I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, zprty:$Zm),
2164  asm, "\t$Zdn, $Pg/m, $_Zdn, $Zm", "", []>, Sched<[]> {
2165  bits<3> Pg;
2166  bits<5> Zdn;
2167  bits<5> Zm;
2168  let Inst{31-24} = 0b00000100;
2169  let Inst{23-22} = sz8_64;
2170  let Inst{21}    = 0b0;
2171  let Inst{20-19} = fmt;
2172  let Inst{18-16} = opc;
2173  let Inst{15-13} = 0b000;
2174  let Inst{12-10} = Pg;
2175  let Inst{9-5}   = Zm;
2176  let Inst{4-0}   = Zdn;
2177
2178  let Constraints = "$Zdn = $_Zdn";
2179  let DestructiveInstType = Destructive;
2180  let ElementSize = zprty.ElementSize;
2181}
2182
2183multiclass sve_int_bin_pred_log<bits<3> opc, string asm, SDPatternOperator op> {
2184  def _B : sve_int_bin_pred_arit_log<0b00, 0b11, opc, asm, ZPR8>;
2185  def _H : sve_int_bin_pred_arit_log<0b01, 0b11, opc, asm, ZPR16>;
2186  def _S : sve_int_bin_pred_arit_log<0b10, 0b11, opc, asm, ZPR32>;
2187  def _D : sve_int_bin_pred_arit_log<0b11, 0b11, opc, asm, ZPR64>;
2188
2189  def : SVE_3_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
2190  def : SVE_3_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
2191  def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
2192  def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
2193}
2194
2195multiclass sve_int_bin_pred_arit_0<bits<3> opc, string asm, SDPatternOperator op> {
2196  def _B : sve_int_bin_pred_arit_log<0b00, 0b00, opc, asm, ZPR8>;
2197  def _H : sve_int_bin_pred_arit_log<0b01, 0b00, opc, asm, ZPR16>;
2198  def _S : sve_int_bin_pred_arit_log<0b10, 0b00, opc, asm, ZPR32>;
2199  def _D : sve_int_bin_pred_arit_log<0b11, 0b00, opc, asm, ZPR64>;
2200
2201  def : SVE_3_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
2202  def : SVE_3_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
2203  def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
2204  def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
2205}
2206
2207multiclass sve_int_bin_pred_arit_1<bits<3> opc, string asm, SDPatternOperator op> {
2208  def _B : sve_int_bin_pred_arit_log<0b00, 0b01, opc, asm, ZPR8>;
2209  def _H : sve_int_bin_pred_arit_log<0b01, 0b01, opc, asm, ZPR16>;
2210  def _S : sve_int_bin_pred_arit_log<0b10, 0b01, opc, asm, ZPR32>;
2211  def _D : sve_int_bin_pred_arit_log<0b11, 0b01, opc, asm, ZPR64>;
2212
2213  def : SVE_3_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
2214  def : SVE_3_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
2215  def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
2216  def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
2217}
2218
2219multiclass sve_int_bin_pred_arit_2<bits<3> opc, string asm, SDPatternOperator op> {
2220  def _B : sve_int_bin_pred_arit_log<0b00, 0b10, opc, asm, ZPR8>;
2221  def _H : sve_int_bin_pred_arit_log<0b01, 0b10, opc, asm, ZPR16>;
2222  def _S : sve_int_bin_pred_arit_log<0b10, 0b10, opc, asm, ZPR32>;
2223  def _D : sve_int_bin_pred_arit_log<0b11, 0b10, opc, asm, ZPR64>;
2224
2225  def : SVE_3_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
2226  def : SVE_3_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
2227  def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
2228  def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
2229}
2230
2231// Special case for divides which are not defined for 8b/16b elements.
2232multiclass sve_int_bin_pred_arit_2_div<bits<3> opc, string asm, SDPatternOperator op> {
2233  def _S : sve_int_bin_pred_arit_log<0b10, 0b10, opc, asm, ZPR32>;
2234  def _D : sve_int_bin_pred_arit_log<0b11, 0b10, opc, asm, ZPR64>;
2235
2236  def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
2237  def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
2238}
2239
2240//===----------------------------------------------------------------------===//
2241// SVE Integer Multiply-Add Group
2242//===----------------------------------------------------------------------===//
2243
2244class sve_int_mladdsub_vvv_pred<bits<2> sz8_64, bits<1> opc, string asm,
2245                                ZPRRegOp zprty>
2246: I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, zprty:$Zm, zprty:$Za),
2247  asm, "\t$Zdn, $Pg/m, $Zm, $Za",
2248  "",
2249  []>, Sched<[]> {
2250  bits<3> Pg;
2251  bits<5> Zdn;
2252  bits<5> Za;
2253  bits<5> Zm;
2254  let Inst{31-24} = 0b00000100;
2255  let Inst{23-22} = sz8_64;
2256  let Inst{21}    = 0b0;
2257  let Inst{20-16} = Zm;
2258  let Inst{15-14} = 0b11;
2259  let Inst{13}    = opc;
2260  let Inst{12-10} = Pg;
2261  let Inst{9-5}   = Za;
2262  let Inst{4-0}   = Zdn;
2263
2264  let Constraints = "$Zdn = $_Zdn";
2265  let DestructiveInstType = Destructive;
2266  let ElementSize = zprty.ElementSize;
2267}
2268
2269multiclass sve_int_mladdsub_vvv_pred<bits<1> opc, string asm, SDPatternOperator op> {
2270  def _B : sve_int_mladdsub_vvv_pred<0b00, opc, asm, ZPR8>;
2271  def _H : sve_int_mladdsub_vvv_pred<0b01, opc, asm, ZPR16>;
2272  def _S : sve_int_mladdsub_vvv_pred<0b10, opc, asm, ZPR32>;
2273  def _D : sve_int_mladdsub_vvv_pred<0b11, opc, asm, ZPR64>;
2274
2275  def : SVE_4_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
2276  def : SVE_4_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
2277  def : SVE_4_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
2278  def : SVE_4_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
2279}
2280
2281class sve_int_mlas_vvv_pred<bits<2> sz8_64, bits<1> opc, string asm,
2282                            ZPRRegOp zprty>
2283: I<(outs zprty:$Zda), (ins PPR3bAny:$Pg, zprty:$_Zda, zprty:$Zn, zprty:$Zm),
2284  asm, "\t$Zda, $Pg/m, $Zn, $Zm",
2285  "",
2286  []>, Sched<[]> {
2287  bits<3> Pg;
2288  bits<5> Zda;
2289  bits<5> Zm;
2290  bits<5> Zn;
2291  let Inst{31-24} = 0b00000100;
2292  let Inst{23-22} = sz8_64;
2293  let Inst{21}    = 0b0;
2294  let Inst{20-16} = Zm;
2295  let Inst{15-14} = 0b01;
2296  let Inst{13}    = opc;
2297  let Inst{12-10} = Pg;
2298  let Inst{9-5}   = Zn;
2299  let Inst{4-0}   = Zda;
2300
2301  let Constraints = "$Zda = $_Zda";
2302  let DestructiveInstType = Destructive;
2303  let ElementSize = zprty.ElementSize;
2304}
2305
2306multiclass sve_int_mlas_vvv_pred<bits<1> opc, string asm, SDPatternOperator op> {
2307  def _B : sve_int_mlas_vvv_pred<0b00, opc, asm, ZPR8>;
2308  def _H : sve_int_mlas_vvv_pred<0b01, opc, asm, ZPR16>;
2309  def _S : sve_int_mlas_vvv_pred<0b10, opc, asm, ZPR32>;
2310  def _D : sve_int_mlas_vvv_pred<0b11, opc, asm, ZPR64>;
2311
2312  def : SVE_4_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
2313  def : SVE_4_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
2314  def : SVE_4_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
2315  def : SVE_4_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
2316}
2317
2318//===----------------------------------------------------------------------===//
2319// SVE2 Integer Multiply-Add - Unpredicated Group
2320//===----------------------------------------------------------------------===//
2321
2322class sve2_int_mla<bits<2> sz, bits<5> opc, string asm,
2323                   ZPRRegOp zprty1, ZPRRegOp zprty2>
2324: I<(outs zprty1:$Zda), (ins zprty1:$_Zda, zprty2:$Zn, zprty2:$Zm),
2325  asm, "\t$Zda, $Zn, $Zm", "", []>, Sched<[]> {
2326  bits<5> Zda;
2327  bits<5> Zn;
2328  bits<5> Zm;
2329  let Inst{31-24} = 0b01000100;
2330  let Inst{23-22} = sz;
2331  let Inst{21}    = 0b0;
2332  let Inst{20-16} = Zm;
2333  let Inst{15}    = 0b0;
2334  let Inst{14-10} = opc;
2335  let Inst{9-5}   = Zn;
2336  let Inst{4-0}   = Zda;
2337
2338  let Constraints = "$Zda = $_Zda";
2339  let DestructiveInstType = Destructive;
2340  let ElementSize = ElementSizeNone;
2341}
2342
2343multiclass sve2_int_mla<bit S, string asm> {
2344  def _B : sve2_int_mla<0b00, { 0b1110, S }, asm, ZPR8, ZPR8>;
2345  def _H : sve2_int_mla<0b01, { 0b1110, S }, asm, ZPR16, ZPR16>;
2346  def _S : sve2_int_mla<0b10, { 0b1110, S }, asm, ZPR32, ZPR32>;
2347  def _D : sve2_int_mla<0b11, { 0b1110, S }, asm, ZPR64, ZPR64>;
2348}
2349
2350multiclass sve2_int_mla_long<bits<5> opc, string asm> {
2351  def _H : sve2_int_mla<0b01, opc, asm, ZPR16, ZPR8>;
2352  def _S : sve2_int_mla<0b10, opc, asm, ZPR32, ZPR16>;
2353  def _D : sve2_int_mla<0b11, opc, asm, ZPR64, ZPR32>;
2354}
2355
2356//===----------------------------------------------------------------------===//
2357// SVE2 Integer Multiply-Add - Indexed Group
2358//===----------------------------------------------------------------------===//
2359
2360class sve2_int_mla_by_indexed_elem<bits<2> sz, bits<6> opc, string asm,
2361                                   ZPRRegOp zprty1, ZPRRegOp zprty2,
2362                                   ZPRRegOp zprty3, Operand itype>
2363: I<(outs zprty1:$Zda), (ins zprty1:$_Zda, zprty2:$Zn, zprty3:$Zm, itype:$iop),
2364  asm, "\t$Zda, $Zn, $Zm$iop", "", []>, Sched<[]> {
2365  bits<5> Zda;
2366  bits<5> Zn;
2367  let Inst{31-24} = 0b01000100;
2368  let Inst{23-22} = sz;
2369  let Inst{21}    = 0b1;
2370  let Inst{15-10} = opc;
2371  let Inst{9-5}   = Zn;
2372  let Inst{4-0}   = Zda;
2373
2374  let Constraints = "$Zda = $_Zda";
2375  let DestructiveInstType = Destructive;
2376  let ElementSize = ElementSizeNone;
2377}
2378
2379multiclass sve2_int_mla_by_indexed_elem<bits<2> opc, bit S, string asm> {
2380  def _H : sve2_int_mla_by_indexed_elem<{0, ?}, { 0b000, opc, S }, asm, ZPR16, ZPR16, ZPR3b16, VectorIndexH> {
2381    bits<3> Zm;
2382    bits<3> iop;
2383    let Inst{22} = iop{2};
2384    let Inst{20-19} = iop{1-0};
2385    let Inst{18-16} = Zm;
2386  }
2387  def _S : sve2_int_mla_by_indexed_elem<0b10, { 0b000, opc, S }, asm, ZPR32, ZPR32, ZPR3b32, VectorIndexS> {
2388    bits<3> Zm;
2389    bits<2> iop;
2390    let Inst{20-19} = iop;
2391    let Inst{18-16} = Zm;
2392  }
2393  def _D : sve2_int_mla_by_indexed_elem<0b11, { 0b000, opc, S }, asm, ZPR64, ZPR64, ZPR4b64, VectorIndexD> {
2394    bits<4> Zm;
2395    bit iop;
2396    let Inst{20} = iop;
2397    let Inst{19-16} = Zm;
2398  }
2399}
2400
2401//===----------------------------------------------------------------------===//
2402// SVE2 Integer Multiply-Add Long - Indexed Group
2403//===----------------------------------------------------------------------===//
2404
2405multiclass sve2_int_mla_long_by_indexed_elem<bits<4> opc, string asm> {
2406  def _S : sve2_int_mla_by_indexed_elem<0b10, { opc{3}, 0b0, opc{2-1}, ?, opc{0} },
2407                                        asm, ZPR32, ZPR16, ZPR3b16, VectorIndexH> {
2408    bits<3> Zm;
2409    bits<3> iop;
2410    let Inst{20-19} = iop{2-1};
2411    let Inst{18-16} = Zm;
2412    let Inst{11} = iop{0};
2413  }
2414  def _D : sve2_int_mla_by_indexed_elem<0b11, { opc{3}, 0b0, opc{2-1}, ?, opc{0} },
2415                                        asm, ZPR64, ZPR32, ZPR4b32, VectorIndexS> {
2416    bits<4> Zm;
2417    bits<2> iop;
2418    let Inst{20} = iop{1};
2419    let Inst{19-16} = Zm;
2420    let Inst{11} = iop{0};
2421  }
2422}
2423
2424//===----------------------------------------------------------------------===//
2425// SVE Integer Dot Product Group
2426//===----------------------------------------------------------------------===//
2427
2428class sve_intx_dot<bit sz, bit U, string asm, ZPRRegOp zprty1,
2429                   ZPRRegOp zprty2>
2430: I<(outs zprty1:$Zda), (ins zprty1:$_Zda, zprty2:$Zn, zprty2:$Zm), asm,
2431  "\t$Zda, $Zn, $Zm", "", []>, Sched<[]> {
2432  bits<5> Zda;
2433  bits<5> Zn;
2434  bits<5> Zm;
2435  let Inst{31-23} = 0b010001001;
2436  let Inst{22}    = sz;
2437  let Inst{21}    = 0;
2438  let Inst{20-16} = Zm;
2439  let Inst{15-11} = 0;
2440  let Inst{10}    = U;
2441  let Inst{9-5}   = Zn;
2442  let Inst{4-0}   = Zda;
2443
2444  let Constraints = "$Zda = $_Zda";
2445  let DestructiveInstType = Destructive;
2446}
2447
2448multiclass sve_intx_dot<bit opc, string asm, SDPatternOperator op> {
2449  def _S : sve_intx_dot<0b0, opc, asm, ZPR32, ZPR8>;
2450  def _D : sve_intx_dot<0b1, opc, asm, ZPR64, ZPR16>;
2451
2452  def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32,  nxv16i8, nxv16i8, !cast<Instruction>(NAME # _S)>;
2453  def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64,  nxv8i16, nxv8i16, !cast<Instruction>(NAME # _D)>;
2454}
2455
2456//===----------------------------------------------------------------------===//
2457// SVE Integer Dot Product Group - Indexed Group
2458//===----------------------------------------------------------------------===//
2459
2460class sve_intx_dot_by_indexed_elem<bit sz, bit U, string asm,
2461                                   ZPRRegOp zprty1, ZPRRegOp zprty2,
2462                                   ZPRRegOp zprty3, Operand itype>
2463: I<(outs zprty1:$Zda), (ins zprty1:$_Zda, zprty2:$Zn, zprty3:$Zm, itype:$iop),
2464  asm, "\t$Zda, $Zn, $Zm$iop",
2465  "", []>, Sched<[]> {
2466  bits<5> Zda;
2467  bits<5> Zn;
2468  let Inst{31-23} = 0b010001001;
2469  let Inst{22}    = sz;
2470  let Inst{21}    = 0b1;
2471  let Inst{15-11} = 0;
2472  let Inst{10}    = U;
2473  let Inst{9-5}   = Zn;
2474  let Inst{4-0}   = Zda;
2475
2476  let Constraints = "$Zda = $_Zda";
2477  let DestructiveInstType = Destructive;
2478}
2479
2480multiclass sve_intx_dot_by_indexed_elem<bit opc, string asm,
2481                                        SDPatternOperator op> {
2482  def _S : sve_intx_dot_by_indexed_elem<0b0, opc, asm, ZPR32, ZPR8, ZPR3b8, VectorIndexS32b> {
2483    bits<2> iop;
2484    bits<3> Zm;
2485    let Inst{20-19} = iop;
2486    let Inst{18-16} = Zm;
2487  }
2488  def _D : sve_intx_dot_by_indexed_elem<0b1, opc, asm, ZPR64, ZPR16, ZPR4b16, VectorIndexD32b> {
2489    bits<1> iop;
2490    bits<4> Zm;
2491    let Inst{20} = iop;
2492    let Inst{19-16} = Zm;
2493  }
2494
2495  def : Pat<(nxv4i32 (op nxv4i32:$Op1, nxv16i8:$Op2, nxv16i8:$Op3, (i32 VectorIndexS32b:$idx))),
2496            (!cast<Instruction>(NAME # _S) $Op1, $Op2, $Op3, VectorIndexS32b:$idx)>;
2497  def : Pat<(nxv2i64 (op nxv2i64:$Op1, nxv8i16:$Op2, nxv8i16:$Op3, (i32 VectorIndexD32b:$idx))),
2498            (!cast<Instruction>(NAME # _D) $Op1, $Op2, $Op3, VectorIndexD32b:$idx)>;
2499}
2500
2501//===----------------------------------------------------------------------===//
2502// SVE2 Complex Integer Dot Product Group
2503//===----------------------------------------------------------------------===//
2504
2505class sve2_complex_int_arith<bits<2> sz, bits<4> opc, string asm,
2506                             ZPRRegOp zprty1, ZPRRegOp zprty2>
2507: I<(outs zprty1:$Zda), (ins zprty1:$_Zda, zprty2:$Zn, zprty2:$Zm,
2508                         complexrotateop:$rot),
2509  asm, "\t$Zda, $Zn, $Zm, $rot", "", []>, Sched<[]> {
2510  bits<5> Zda;
2511  bits<5> Zn;
2512  bits<5> Zm;
2513  bits<2> rot;
2514  let Inst{31-24} = 0b01000100;
2515  let Inst{23-22} = sz;
2516  let Inst{21}    = 0b0;
2517  let Inst{20-16} = Zm;
2518  let Inst{15-12} = opc;
2519  let Inst{11-10} = rot;
2520  let Inst{9-5}   = Zn;
2521  let Inst{4-0}   = Zda;
2522
2523  let Constraints = "$Zda = $_Zda";
2524  let DestructiveInstType = Destructive;
2525  let ElementSize = ElementSizeNone;
2526}
2527
2528multiclass sve2_cintx_dot<string asm> {
2529  def _S : sve2_complex_int_arith<0b10, 0b0001, asm, ZPR32, ZPR8>;
2530  def _D : sve2_complex_int_arith<0b11, 0b0001, asm, ZPR64, ZPR16>;
2531}
2532
2533//===----------------------------------------------------------------------===//
2534// SVE2 Complex Multiply-Add Group
2535//===----------------------------------------------------------------------===//
2536
2537multiclass sve2_int_cmla<bit opc, string asm> {
2538  def _B : sve2_complex_int_arith<0b00, { 0b001, opc }, asm, ZPR8, ZPR8>;
2539  def _H : sve2_complex_int_arith<0b01, { 0b001, opc }, asm, ZPR16, ZPR16>;
2540  def _S : sve2_complex_int_arith<0b10, { 0b001, opc }, asm, ZPR32, ZPR32>;
2541  def _D : sve2_complex_int_arith<0b11, { 0b001, opc }, asm, ZPR64, ZPR64>;
2542}
2543
2544//===----------------------------------------------------------------------===//
2545// SVE2 Complex Integer Dot Product - Indexed Group
2546//===----------------------------------------------------------------------===//
2547
2548class sve2_complex_int_arith_indexed<bits<2> sz, bits<4> opc, string asm,
2549                                     ZPRRegOp zprty1, ZPRRegOp zprty2,
2550                                     ZPRRegOp zprty3, Operand itype>
2551: I<(outs zprty1:$Zda), (ins zprty1:$_Zda, zprty2:$Zn, zprty3:$Zm, itype:$iop,
2552                         complexrotateop:$rot),
2553  asm, "\t$Zda, $Zn, $Zm$iop, $rot", "", []>, Sched<[]> {
2554  bits<5> Zda;
2555  bits<5> Zn;
2556  bits<2> rot;
2557  let Inst{31-24} = 0b01000100;
2558  let Inst{23-22} = sz;
2559  let Inst{21}    = 0b1;
2560  let Inst{15-12} = opc;
2561  let Inst{11-10} = rot;
2562  let Inst{9-5}   = Zn;
2563  let Inst{4-0}   = Zda;
2564
2565  let Constraints = "$Zda = $_Zda";
2566  let DestructiveInstType = Destructive;
2567  let ElementSize = ElementSizeNone;
2568}
2569
2570multiclass sve2_cintx_dot_by_indexed_elem<string asm> {
2571  def _S : sve2_complex_int_arith_indexed<0b10, 0b0100, asm, ZPR32, ZPR8, ZPR3b8, VectorIndexS> {
2572    bits<2> iop;
2573    bits<3> Zm;
2574    let Inst{20-19} = iop;
2575    let Inst{18-16} = Zm;
2576  }
2577  def _D : sve2_complex_int_arith_indexed<0b11, 0b0100, asm, ZPR64, ZPR16, ZPR4b16, VectorIndexD> {
2578    bit iop;
2579    bits<4> Zm;
2580    let Inst{20} = iop;
2581    let Inst{19-16} = Zm;
2582  }
2583}
2584
2585//===----------------------------------------------------------------------===//
2586// SVE2 Complex Multiply-Add - Indexed Group
2587//===----------------------------------------------------------------------===//
2588
2589multiclass sve2_cmla_by_indexed_elem<bit opc, string asm> {
2590  def _H : sve2_complex_int_arith_indexed<0b10, { 0b011, opc }, asm, ZPR16, ZPR16, ZPR3b16, VectorIndexS> {
2591    bits<2> iop;
2592    bits<3> Zm;
2593    let Inst{20-19} = iop;
2594    let Inst{18-16} = Zm;
2595  }
2596  def _S : sve2_complex_int_arith_indexed<0b11, { 0b011, opc }, asm, ZPR32, ZPR32, ZPR4b32, VectorIndexD> {
2597    bit iop;
2598    bits<4> Zm;
2599    let Inst{20} = iop;
2600    let Inst{19-16} = Zm;
2601  }
2602}
2603
2604//===----------------------------------------------------------------------===//
2605// SVE2 Integer Multiply - Unpredicated Group
2606//===----------------------------------------------------------------------===//
2607
2608class sve2_int_mul<bits<2> sz, bits<3> opc, string asm, ZPRRegOp zprty>
2609: I<(outs zprty:$Zd), (ins zprty:$Zn, zprty:$Zm),
2610  asm, "\t$Zd, $Zn, $Zm", "", []>, Sched<[]> {
2611  bits<5> Zd;
2612  bits<5> Zm;
2613  bits<5> Zn;
2614  let Inst{31-24} = 0b00000100;
2615  let Inst{23-22} = sz;
2616  let Inst{21}    = 0b1;
2617  let Inst{20-16} = Zm;
2618  let Inst{15-13} = 0b011;
2619  let Inst{12-10} = opc;
2620  let Inst{9-5}   = Zn;
2621  let Inst{4-0}   = Zd;
2622}
2623
2624multiclass sve2_int_mul<bits<3> opc, string asm> {
2625  def _B : sve2_int_mul<0b00, opc, asm, ZPR8>;
2626  def _H : sve2_int_mul<0b01, opc, asm, ZPR16>;
2627  def _S : sve2_int_mul<0b10, opc, asm, ZPR32>;
2628  def _D : sve2_int_mul<0b11, opc, asm, ZPR64>;
2629}
2630
2631//===----------------------------------------------------------------------===//
2632// SVE2 Integer Multiply - Indexed Group
2633//===----------------------------------------------------------------------===//
2634
2635class sve2_int_mul_by_indexed_elem<bits<2> sz, bits<4> opc, string asm,
2636                                   ZPRRegOp zprty1, ZPRRegOp zprty2,
2637                                   ZPRRegOp zprty3, Operand itype>
2638: I<(outs zprty1:$Zd), (ins zprty2:$Zn, zprty3:$Zm, itype:$iop),
2639  asm, "\t$Zd, $Zn, $Zm$iop", "", []>, Sched<[]> {
2640  bits<5> Zd;
2641  bits<5> Zn;
2642  let Inst{31-24} = 0b01000100;
2643  let Inst{23-22} = sz;
2644  let Inst{21}    = 0b1;
2645  let Inst{15-14} = 0b11;
2646  let Inst{13-10} = opc;
2647  let Inst{9-5}   = Zn;
2648  let Inst{4-0}   = Zd;
2649}
2650
2651multiclass sve2_int_mul_by_indexed_elem<bits<4> opc, string asm> {
2652  def _H : sve2_int_mul_by_indexed_elem<{0, ?}, opc, asm, ZPR16, ZPR16, ZPR3b16, VectorIndexH> {
2653    bits<3> Zm;
2654    bits<3> iop;
2655    let Inst{22} = iop{2};
2656    let Inst{20-19} = iop{1-0};
2657    let Inst{18-16} = Zm;
2658  }
2659  def _S : sve2_int_mul_by_indexed_elem<0b10, opc, asm, ZPR32, ZPR32, ZPR3b32, VectorIndexS> {
2660    bits<3> Zm;
2661    bits<2> iop;
2662    let Inst{20-19} = iop;
2663    let Inst{18-16} = Zm;
2664  }
2665  def _D : sve2_int_mul_by_indexed_elem<0b11, opc, asm, ZPR64, ZPR64, ZPR4b64, VectorIndexD> {
2666    bits<4> Zm;
2667    bit iop;
2668    let Inst{20} = iop;
2669    let Inst{19-16} = Zm;
2670  }
2671}
2672
2673multiclass sve2_int_mul_long_by_indexed_elem<bits<3> opc, string asm> {
2674  def _S : sve2_int_mul_by_indexed_elem<0b10, { opc{2-1}, ?, opc{0} }, asm,
2675                                        ZPR32, ZPR16, ZPR3b16, VectorIndexH> {
2676    bits<3> Zm;
2677    bits<3> iop;
2678    let Inst{20-19} = iop{2-1};
2679    let Inst{18-16} = Zm;
2680    let Inst{11} = iop{0};
2681  }
2682  def _D : sve2_int_mul_by_indexed_elem<0b11, { opc{2-1}, ?, opc{0} }, asm,
2683                                        ZPR64, ZPR32, ZPR4b32, VectorIndexS> {
2684    bits<4> Zm;
2685    bits<2> iop;
2686    let Inst{20} = iop{1};
2687    let Inst{19-16} = Zm;
2688    let Inst{11} = iop{0};
2689  }
2690}
2691
2692//===----------------------------------------------------------------------===//
2693// SVE2 Integer - Predicated Group
2694//===----------------------------------------------------------------------===//
2695
2696class sve2_int_arith_pred<bits<2> sz, bits<6> opc, string asm,
2697                          ZPRRegOp zprty>
2698: I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, zprty:$Zm),
2699  asm, "\t$Zdn, $Pg/m, $_Zdn, $Zm", "", []>, Sched<[]> {
2700  bits<3> Pg;
2701  bits<5> Zm;
2702  bits<5> Zdn;
2703  let Inst{31-24} = 0b01000100;
2704  let Inst{23-22} = sz;
2705  let Inst{21}    = 0b0;
2706  let Inst{20-16} = opc{5-1};
2707  let Inst{15-14} = 0b10;
2708  let Inst{13}    = opc{0};
2709  let Inst{12-10} = Pg;
2710  let Inst{9-5}   = Zm;
2711  let Inst{4-0}   = Zdn;
2712
2713  let Constraints = "$Zdn = $_Zdn";
2714  let DestructiveInstType = Destructive;
2715  let ElementSize = zprty.ElementSize;
2716}
2717
2718multiclass sve2_int_arith_pred<bits<6> opc, string asm> {
2719  def _B : sve2_int_arith_pred<0b00, opc, asm, ZPR8>;
2720  def _H : sve2_int_arith_pred<0b01, opc, asm, ZPR16>;
2721  def _S : sve2_int_arith_pred<0b10, opc, asm, ZPR32>;
2722  def _D : sve2_int_arith_pred<0b11, opc, asm, ZPR64>;
2723}
2724
2725class sve2_int_sadd_long_accum_pairwise<bits<2> sz, bit U, string asm,
2726                                        ZPRRegOp zprty1, ZPRRegOp zprty2>
2727: I<(outs zprty1:$Zda), (ins PPR3bAny:$Pg, zprty1:$_Zda, zprty2:$Zn),
2728  asm, "\t$Zda, $Pg/m, $Zn", "", []>, Sched<[]> {
2729  bits<3> Pg;
2730  bits<5> Zn;
2731  bits<5> Zda;
2732  let Inst{31-24} = 0b01000100;
2733  let Inst{23-22} = sz;
2734  let Inst{21-17} = 0b00010;
2735  let Inst{16}    = U;
2736  let Inst{15-13} = 0b101;
2737  let Inst{12-10} = Pg;
2738  let Inst{9-5}   = Zn;
2739  let Inst{4-0}   = Zda;
2740
2741  let Constraints = "$Zda = $_Zda";
2742  let DestructiveInstType = Destructive;
2743  let ElementSize = zprty1.ElementSize;
2744}
2745
2746multiclass sve2_int_sadd_long_accum_pairwise<bit U, string asm> {
2747  def _H : sve2_int_sadd_long_accum_pairwise<0b01, U, asm, ZPR16, ZPR8>;
2748  def _S : sve2_int_sadd_long_accum_pairwise<0b10, U, asm, ZPR32, ZPR16>;
2749  def _D : sve2_int_sadd_long_accum_pairwise<0b11, U, asm, ZPR64, ZPR32>;
2750}
2751
2752class sve2_int_un_pred_arit<bits<2> sz, bit Q, bits<2> opc,
2753                            string asm, ZPRRegOp zprty>
2754: I<(outs zprty:$Zd), (ins zprty:$_Zd, PPR3bAny:$Pg, zprty:$Zn),
2755  asm, "\t$Zd, $Pg/m, $Zn",
2756  "",
2757  []>, Sched<[]> {
2758  bits<3> Pg;
2759  bits<5> Zd;
2760  bits<5> Zn;
2761  let Inst{31-24} = 0b01000100;
2762  let Inst{23-22} = sz;
2763  let Inst{21-20} = 0b00;
2764  let Inst{19}    = Q;
2765  let Inst{18}    = 0b0;
2766  let Inst{17-16} = opc;
2767  let Inst{15-13} = 0b101;
2768  let Inst{12-10} = Pg;
2769  let Inst{9-5}   = Zn;
2770  let Inst{4-0}   = Zd;
2771
2772  let Constraints = "$Zd = $_Zd";
2773  let DestructiveInstType = Destructive;
2774  let ElementSize = zprty.ElementSize;
2775}
2776
2777multiclass sve2_int_un_pred_arit_s<bits<3> opc, string asm> {
2778  def _S : sve2_int_un_pred_arit<0b10, opc{2}, opc{1-0}, asm, ZPR32>;
2779}
2780
2781multiclass sve2_int_un_pred_arit<bits<3> opc, string asm> {
2782  def _B : sve2_int_un_pred_arit<0b00, opc{2}, opc{1-0}, asm, ZPR8>;
2783  def _H : sve2_int_un_pred_arit<0b01, opc{2}, opc{1-0}, asm, ZPR16>;
2784  def _S : sve2_int_un_pred_arit<0b10, opc{2}, opc{1-0}, asm, ZPR32>;
2785  def _D : sve2_int_un_pred_arit<0b11, opc{2}, opc{1-0}, asm, ZPR64>;
2786}
2787
2788//===----------------------------------------------------------------------===//
2789// SVE2 Widening Integer Arithmetic Group
2790//===----------------------------------------------------------------------===//
2791
2792class sve2_wide_int_arith<bits<2> sz, bits<5> opc, string asm,
2793                          ZPRRegOp zprty1, ZPRRegOp zprty2, ZPRRegOp zprty3>
2794: I<(outs zprty1:$Zd), (ins zprty2:$Zn, zprty3:$Zm),
2795  asm, "\t$Zd, $Zn, $Zm", "", []>, Sched<[]> {
2796  bits<5> Zd;
2797  bits<5> Zn;
2798  bits<5> Zm;
2799  let Inst{31-24} = 0b01000101;
2800  let Inst{23-22} = sz;
2801  let Inst{21}    = 0b0;
2802  let Inst{20-16} = Zm;
2803  let Inst{15}    = 0b0;
2804  let Inst{14-10} = opc;
2805  let Inst{9-5}   = Zn;
2806  let Inst{4-0}   = Zd;
2807}
2808
2809multiclass sve2_wide_int_arith_long<bits<5> opc, string asm> {
2810  def _H : sve2_wide_int_arith<0b01, opc, asm, ZPR16, ZPR8, ZPR8>;
2811  def _S : sve2_wide_int_arith<0b10, opc, asm, ZPR32, ZPR16, ZPR16>;
2812  def _D : sve2_wide_int_arith<0b11, opc, asm, ZPR64, ZPR32, ZPR32>;
2813}
2814
2815multiclass sve2_wide_int_arith_wide<bits<3> opc, string asm> {
2816  def _H : sve2_wide_int_arith<0b01, { 0b10, opc }, asm, ZPR16, ZPR16, ZPR8>;
2817  def _S : sve2_wide_int_arith<0b10, { 0b10, opc }, asm, ZPR32, ZPR32, ZPR16>;
2818  def _D : sve2_wide_int_arith<0b11, { 0b10, opc }, asm, ZPR64, ZPR64, ZPR32>;
2819}
2820
2821multiclass sve2_pmul_long<bits<1> opc, string asm> {
2822  def _H : sve2_wide_int_arith<0b01, {0b1101, opc}, asm, ZPR16, ZPR8, ZPR8>;
2823  def _D : sve2_wide_int_arith<0b11, {0b1101, opc}, asm, ZPR64, ZPR32, ZPR32>;
2824}
2825
2826//===----------------------------------------------------------------------===//
2827// SVE2 Misc Group
2828//===----------------------------------------------------------------------===//
2829
2830class sve2_misc<bits<2> sz, bits<4> opc, string asm,
2831                ZPRRegOp zprty1, ZPRRegOp zprty2>
2832: I<(outs zprty1:$Zd), (ins zprty2:$Zn, zprty2:$Zm),
2833  asm, "\t$Zd, $Zn, $Zm", "", []>, Sched<[]> {
2834  bits<5> Zd;
2835  bits<5> Zn;
2836  bits<5> Zm;
2837  let Inst{31-24} = 0b01000101;
2838  let Inst{23-22} = sz;
2839  let Inst{21}    = 0b0;
2840  let Inst{20-16} = Zm;
2841  let Inst{15-14} = 0b10;
2842  let Inst{13-10} = opc;
2843  let Inst{9-5}   = Zn;
2844  let Inst{4-0}   = Zd;
2845}
2846
2847multiclass sve2_misc_bitwise<bits<4> opc, string asm> {
2848  def _B : sve2_misc<0b00, opc, asm, ZPR8, ZPR8>;
2849  def _H : sve2_misc<0b01, opc, asm, ZPR16, ZPR16>;
2850  def _S : sve2_misc<0b10, opc, asm, ZPR32, ZPR32>;
2851  def _D : sve2_misc<0b11, opc, asm, ZPR64, ZPR64>;
2852}
2853
2854multiclass sve2_misc_int_addsub_long_interleaved<bits<2> opc, string asm> {
2855  def _H : sve2_misc<0b01, { 0b00, opc }, asm, ZPR16, ZPR8>;
2856  def _S : sve2_misc<0b10, { 0b00, opc }, asm, ZPR32, ZPR16>;
2857  def _D : sve2_misc<0b11, { 0b00, opc }, asm, ZPR64, ZPR32>;
2858}
2859
2860class sve2_bitwise_xor_interleaved<bits<2> sz, bits<1> opc, string asm,
2861                                   ZPRRegOp zprty1, ZPRRegOp zprty2>
2862: I<(outs zprty1:$Zd), (ins zprty1:$_Zd, zprty2:$Zn, zprty2:$Zm),
2863  asm, "\t$Zd, $Zn, $Zm", "", []>, Sched<[]> {
2864  bits<5> Zd;
2865  bits<5> Zn;
2866  bits<5> Zm;
2867  let Inst{31-24} = 0b01000101;
2868  let Inst{23-22} = sz;
2869  let Inst{21}    = 0b0;
2870  let Inst{20-16} = Zm;
2871  let Inst{15-11} = 0b10010;
2872  let Inst{10}    = opc;
2873  let Inst{9-5}   = Zn;
2874  let Inst{4-0}   = Zd;
2875
2876  let Constraints = "$Zd = $_Zd";
2877  let DestructiveInstType = Destructive;
2878  let ElementSize = ElementSizeNone;
2879}
2880
2881multiclass sve2_bitwise_xor_interleaved<bit opc, string asm> {
2882  def _B : sve2_bitwise_xor_interleaved<0b00, opc, asm, ZPR8,  ZPR8>;
2883  def _H : sve2_bitwise_xor_interleaved<0b01, opc, asm, ZPR16, ZPR16>;
2884  def _S : sve2_bitwise_xor_interleaved<0b10, opc, asm, ZPR32, ZPR32>;
2885  def _D : sve2_bitwise_xor_interleaved<0b11, opc, asm, ZPR64, ZPR64>;
2886}
2887
2888class sve2_bitwise_shift_left_long<bits<3> tsz8_64, bits<2> opc, string asm,
2889                                   ZPRRegOp zprty1, ZPRRegOp zprty2,
2890                                   Operand immtype>
2891: I<(outs zprty1:$Zd), (ins zprty2:$Zn, immtype:$imm),
2892  asm, "\t$Zd, $Zn, $imm",
2893  "", []>, Sched<[]> {
2894  bits<5> Zd;
2895  bits<5> Zn;
2896  bits<5> imm;
2897  let Inst{31-23} = 0b010001010;
2898  let Inst{22}    = tsz8_64{2};
2899  let Inst{21}    = 0b0;
2900  let Inst{20-19} = tsz8_64{1-0};
2901  let Inst{18-16} = imm{2-0}; // imm3
2902  let Inst{15-12} = 0b1010;
2903  let Inst{11-10} = opc;
2904  let Inst{9-5}   = Zn;
2905  let Inst{4-0}   = Zd;
2906}
2907
2908multiclass sve2_bitwise_shift_left_long<bits<2> opc, string asm> {
2909  def _H : sve2_bitwise_shift_left_long<{0,0,1}, opc, asm,
2910                                        ZPR16, ZPR8, vecshiftL8>;
2911  def _S : sve2_bitwise_shift_left_long<{0,1,?}, opc, asm,
2912                                        ZPR32, ZPR16, vecshiftL16> {
2913    let Inst{19} = imm{3};
2914  }
2915  def _D : sve2_bitwise_shift_left_long<{1,?,?}, opc, asm,
2916                                        ZPR64, ZPR32, vecshiftL32> {
2917    let Inst{20-19} = imm{4-3};
2918  }
2919}
2920
2921//===----------------------------------------------------------------------===//
2922// SVE2 Accumulate Group
2923//===----------------------------------------------------------------------===//
2924
2925class sve2_int_bin_shift_imm<bits<4> tsz8_64, bit opc, string asm,
2926                             ZPRRegOp zprty, Operand immtype>
2927: I<(outs zprty:$Zd), (ins zprty:$_Zd, zprty:$Zn, immtype:$imm),
2928  asm, "\t$Zd, $Zn, $imm",
2929  "", []>, Sched<[]> {
2930  bits<5> Zd;
2931  bits<5> Zn;
2932  bits<6> imm;
2933  let Inst{31-24} = 0b01000101;
2934  let Inst{23-22} = tsz8_64{3-2};
2935  let Inst{21}    = 0b0;
2936  let Inst{20-19} = tsz8_64{1-0};
2937  let Inst{18-16} = imm{2-0}; // imm3
2938  let Inst{15-11} = 0b11110;
2939  let Inst{10}    = opc;
2940  let Inst{9-5}   = Zn;
2941  let Inst{4-0}   = Zd;
2942
2943  let Constraints = "$Zd = $_Zd";
2944}
2945
2946multiclass sve2_int_bin_shift_imm_left<bit opc, string asm> {
2947  def _B : sve2_int_bin_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftL8>;
2948  def _H : sve2_int_bin_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftL16> {
2949    let Inst{19} = imm{3};
2950  }
2951  def _S : sve2_int_bin_shift_imm<{0,1,?,?}, opc, asm, ZPR32, vecshiftL32> {
2952    let Inst{20-19} = imm{4-3};
2953  }
2954  def _D : sve2_int_bin_shift_imm<{1,?,?,?}, opc, asm, ZPR64, vecshiftL64> {
2955    let Inst{22}    = imm{5};
2956    let Inst{20-19} = imm{4-3};
2957  }
2958}
2959
2960multiclass sve2_int_bin_shift_imm_right<bit opc, string asm> {
2961  def _B : sve2_int_bin_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftR8>;
2962  def _H : sve2_int_bin_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftR16> {
2963    let Inst{19} = imm{3};
2964  }
2965  def _S : sve2_int_bin_shift_imm<{0,1,?,?}, opc, asm, ZPR32, vecshiftR32> {
2966    let Inst{20-19} = imm{4-3};
2967  }
2968  def _D : sve2_int_bin_shift_imm<{1,?,?,?}, opc, asm, ZPR64, vecshiftR64> {
2969    let Inst{22}    = imm{5};
2970    let Inst{20-19} = imm{4-3};
2971  }
2972}
2973
2974class sve2_int_bin_accum_shift_imm<bits<4> tsz8_64, bits<2> opc, string asm,
2975                                   ZPRRegOp zprty, Operand immtype>
2976: I<(outs zprty:$Zda), (ins zprty:$_Zda, zprty:$Zn, immtype:$imm),
2977  asm, "\t$Zda, $Zn, $imm",
2978  "", []>, Sched<[]> {
2979  bits<5> Zda;
2980  bits<5> Zn;
2981  bits<6> imm;
2982  let Inst{31-24} = 0b01000101;
2983  let Inst{23-22} = tsz8_64{3-2};
2984  let Inst{21}    = 0b0;
2985  let Inst{20-19} = tsz8_64{1-0};
2986  let Inst{18-16} = imm{2-0}; // imm3
2987  let Inst{15-12} = 0b1110;
2988  let Inst{11-10} = opc;
2989  let Inst{9-5}   = Zn;
2990  let Inst{4-0}   = Zda;
2991
2992  let Constraints = "$Zda = $_Zda";
2993  let DestructiveInstType = Destructive;
2994  let ElementSize = ElementSizeNone;
2995}
2996
2997multiclass sve2_int_bin_accum_shift_imm_right<bits<2> opc, string asm> {
2998  def _B : sve2_int_bin_accum_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftR8>;
2999  def _H : sve2_int_bin_accum_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftR16> {
3000    let Inst{19} = imm{3};
3001  }
3002  def _S : sve2_int_bin_accum_shift_imm<{0,1,?,?}, opc, asm, ZPR32, vecshiftR32> {
3003    let Inst{20-19} = imm{4-3};
3004  }
3005  def _D : sve2_int_bin_accum_shift_imm<{1,?,?,?}, opc, asm, ZPR64, vecshiftR64> {
3006    let Inst{22}    = imm{5};
3007    let Inst{20-19} = imm{4-3};
3008  }
3009}
3010
3011class sve2_int_cadd<bits<2> sz, bit opc, string asm, ZPRRegOp zprty>
3012: I<(outs zprty:$Zdn), (ins zprty:$_Zdn, zprty:$Zm, complexrotateopodd:$rot),
3013  asm, "\t$Zdn, $_Zdn, $Zm, $rot", "", []>, Sched<[]> {
3014  bits<5> Zdn;
3015  bits<5> Zm;
3016  bit rot;
3017  let Inst{31-24} = 0b01000101;
3018  let Inst{23-22} = sz;
3019  let Inst{21-17} = 0b00000;
3020  let Inst{16}    = opc;
3021  let Inst{15-11} = 0b11011;
3022  let Inst{10}    = rot;
3023  let Inst{9-5}   = Zm;
3024  let Inst{4-0}   = Zdn;
3025
3026  let Constraints = "$Zdn = $_Zdn";
3027  let DestructiveInstType = Destructive;
3028  let ElementSize = ElementSizeNone;
3029}
3030
3031multiclass sve2_int_cadd<bit opc, string asm> {
3032  def _B : sve2_int_cadd<0b00, opc, asm, ZPR8>;
3033  def _H : sve2_int_cadd<0b01, opc, asm, ZPR16>;
3034  def _S : sve2_int_cadd<0b10, opc, asm, ZPR32>;
3035  def _D : sve2_int_cadd<0b11, opc, asm, ZPR64>;
3036}
3037
3038class sve2_int_absdiff_accum<bits<2> sz, bits<4> opc, string asm,
3039                             ZPRRegOp zprty1, ZPRRegOp zprty2>
3040: I<(outs zprty1:$Zda), (ins zprty1:$_Zda, zprty2:$Zn, zprty2:$Zm),
3041  asm, "\t$Zda, $Zn, $Zm", "", []>, Sched<[]> {
3042  bits<5> Zda;
3043  bits<5> Zn;
3044  bits<5> Zm;
3045  let Inst{31-24} = 0b01000101;
3046  let Inst{23-22} = sz;
3047  let Inst{21}    = 0b0;
3048  let Inst{20-16} = Zm;
3049  let Inst{15-14} = 0b11;
3050  let Inst{13-10} = opc;
3051  let Inst{9-5}   = Zn;
3052  let Inst{4-0}   = Zda;
3053
3054  let Constraints = "$Zda = $_Zda";
3055  let DestructiveInstType = Destructive;
3056  let ElementSize = ElementSizeNone;
3057}
3058
3059multiclass sve2_int_absdiff_accum<bit opc, string asm> {
3060  def _B : sve2_int_absdiff_accum<0b00, { 0b111, opc }, asm, ZPR8, ZPR8>;
3061  def _H : sve2_int_absdiff_accum<0b01, { 0b111, opc }, asm, ZPR16, ZPR16>;
3062  def _S : sve2_int_absdiff_accum<0b10, { 0b111, opc }, asm, ZPR32, ZPR32>;
3063  def _D : sve2_int_absdiff_accum<0b11, { 0b111, opc }, asm, ZPR64, ZPR64>;
3064}
3065
3066multiclass sve2_int_absdiff_accum_long<bits<2> opc, string asm> {
3067  def _H : sve2_int_absdiff_accum<0b01, { 0b00, opc }, asm, ZPR16, ZPR8>;
3068  def _S : sve2_int_absdiff_accum<0b10, { 0b00, opc }, asm, ZPR32, ZPR16>;
3069  def _D : sve2_int_absdiff_accum<0b11, { 0b00, opc }, asm, ZPR64, ZPR32>;
3070}
3071
3072multiclass sve2_int_addsub_long_carry<bits<2> opc, string asm> {
3073  def _S : sve2_int_absdiff_accum<{ opc{1}, 0b0 }, { 0b010, opc{0} }, asm,
3074                                  ZPR32, ZPR32>;
3075  def _D : sve2_int_absdiff_accum<{ opc{1}, 0b1 }, { 0b010, opc{0} }, asm,
3076                                  ZPR64, ZPR64>;
3077}
3078
3079//===----------------------------------------------------------------------===//
3080// SVE2 Narrowing Group
3081//===----------------------------------------------------------------------===//
3082
3083class sve2_int_bin_shift_imm_narrow_bottom<bits<3> tsz8_64, bits<3> opc,
3084                                           string asm, ZPRRegOp zprty1,
3085                                           ZPRRegOp zprty2, Operand immtype>
3086: I<(outs zprty1:$Zd), (ins zprty2:$Zn, immtype:$imm),
3087  asm, "\t$Zd, $Zn, $imm",
3088  "", []>, Sched<[]> {
3089  bits<5> Zd;
3090  bits<5> Zn;
3091  bits<5> imm;
3092  let Inst{31-23} = 0b010001010;
3093  let Inst{22}    = tsz8_64{2};
3094  let Inst{21}    = 0b1;
3095  let Inst{20-19} = tsz8_64{1-0};
3096  let Inst{18-16} = imm{2-0}; // imm3
3097  let Inst{15-14} = 0b00;
3098  let Inst{13-11} = opc;
3099  let Inst{10}    = 0b0;
3100  let Inst{9-5}   = Zn;
3101  let Inst{4-0}   = Zd;
3102}
3103
3104multiclass sve2_int_bin_shift_imm_right_narrow_bottom<bits<3> opc, string asm,
3105                                                      SDPatternOperator op> {
3106  def _B : sve2_int_bin_shift_imm_narrow_bottom<{0,0,1}, opc, asm, ZPR8, ZPR16,
3107                                                tvecshiftR8>;
3108  def _H : sve2_int_bin_shift_imm_narrow_bottom<{0,1,?}, opc, asm, ZPR16, ZPR32,
3109                                                tvecshiftR16> {
3110    let Inst{19} = imm{3};
3111  }
3112  def _S : sve2_int_bin_shift_imm_narrow_bottom<{1,?,?}, opc, asm, ZPR32, ZPR64,
3113                                                vecshiftR32> {
3114    let Inst{20-19} = imm{4-3};
3115  }
3116  def : SVE_2_Op_Imm_Pat<nxv16i8, op, nxv8i16, i32, tvecshiftR8,  !cast<Instruction>(NAME # _B)>;
3117  def : SVE_2_Op_Imm_Pat<nxv8i16, op, nxv4i32, i32, tvecshiftR16, !cast<Instruction>(NAME # _H)>;
3118  def : SVE_2_Op_Imm_Pat<nxv4i32, op, nxv2i64, i32, tvecshiftR32, !cast<Instruction>(NAME # _S)>;
3119}
3120
3121class sve2_int_bin_shift_imm_narrow_top<bits<3> tsz8_64, bits<3> opc,
3122                                        string asm, ZPRRegOp zprty1,
3123                                        ZPRRegOp zprty2, Operand immtype>
3124: I<(outs zprty1:$Zd), (ins zprty1:$_Zd, zprty2:$Zn, immtype:$imm),
3125  asm, "\t$Zd, $Zn, $imm",
3126  "", []>, Sched<[]> {
3127  bits<5> Zd;
3128  bits<5> Zn;
3129  bits<5> imm;
3130  let Inst{31-23} = 0b010001010;
3131  let Inst{22}    = tsz8_64{2};
3132  let Inst{21}    = 0b1;
3133  let Inst{20-19} = tsz8_64{1-0};
3134  let Inst{18-16} = imm{2-0}; // imm3
3135  let Inst{15-14} = 0b00;
3136  let Inst{13-11} = opc;
3137  let Inst{10}    = 0b1;
3138  let Inst{9-5}   = Zn;
3139  let Inst{4-0}   = Zd;
3140
3141  let Constraints = "$Zd = $_Zd";
3142}
3143
3144multiclass sve2_int_bin_shift_imm_right_narrow_top<bits<3> opc, string asm,
3145                                                   SDPatternOperator op> {
3146  def _B : sve2_int_bin_shift_imm_narrow_top<{0,0,1}, opc, asm, ZPR8, ZPR16,
3147                                             tvecshiftR8>;
3148  def _H : sve2_int_bin_shift_imm_narrow_top<{0,1,?}, opc, asm, ZPR16, ZPR32,
3149                                             tvecshiftR16> {
3150    let Inst{19} = imm{3};
3151  }
3152  def _S : sve2_int_bin_shift_imm_narrow_top<{1,?,?}, opc, asm, ZPR32, ZPR64,
3153                                             vecshiftR32> {
3154    let Inst{20-19} = imm{4-3};
3155  }
3156  def : SVE_3_Op_Imm_Pat<nxv16i8, op, nxv16i8, nxv8i16, i32, tvecshiftR8,  !cast<Instruction>(NAME # _B)>;
3157  def : SVE_3_Op_Imm_Pat<nxv8i16, op, nxv8i16, nxv4i32, i32, tvecshiftR16, !cast<Instruction>(NAME # _H)>;
3158  def : SVE_3_Op_Imm_Pat<nxv4i32, op, nxv4i32, nxv2i64, i32, tvecshiftR32, !cast<Instruction>(NAME # _S)>;
3159}
3160
3161class sve2_int_addsub_narrow_high_bottom<bits<2> sz, bits<2> opc, string asm,
3162                                         ZPRRegOp zprty1, ZPRRegOp zprty2>
3163: I<(outs zprty1:$Zd), (ins zprty2:$Zn, zprty2:$Zm),
3164  asm, "\t$Zd, $Zn, $Zm", "", []>, Sched<[]> {
3165  bits<5> Zd;
3166  bits<5> Zn;
3167  bits<5> Zm;
3168  let Inst{31-24} = 0b01000101;
3169  let Inst{23-22} = sz;
3170  let Inst{21}    = 0b1;
3171  let Inst{20-16} = Zm;
3172  let Inst{15-13} = 0b011;
3173  let Inst{12-11} = opc; // S, R
3174  let Inst{10}    = 0b0; // Top
3175  let Inst{9-5}   = Zn;
3176  let Inst{4-0}   = Zd;
3177}
3178
3179multiclass sve2_int_addsub_narrow_high_bottom<bits<2> opc, string asm,
3180                                              SDPatternOperator op> {
3181  def _B : sve2_int_addsub_narrow_high_bottom<0b01, opc, asm, ZPR8, ZPR16>;
3182  def _H : sve2_int_addsub_narrow_high_bottom<0b10, opc, asm, ZPR16, ZPR32>;
3183  def _S : sve2_int_addsub_narrow_high_bottom<0b11, opc, asm, ZPR32, ZPR64>;
3184
3185  def : SVE_2_Op_Pat<nxv16i8, op, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _B)>;
3186  def : SVE_2_Op_Pat<nxv8i16, op, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _H)>;
3187  def : SVE_2_Op_Pat<nxv4i32, op, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _S)>;
3188}
3189
3190class sve2_int_addsub_narrow_high_top<bits<2> sz, bits<2> opc, string asm,
3191                                      ZPRRegOp zprty1, ZPRRegOp zprty2>
3192: I<(outs zprty1:$Zd), (ins zprty1:$_Zd, zprty2:$Zn, zprty2:$Zm),
3193  asm, "\t$Zd, $Zn, $Zm", "", []>, Sched<[]> {
3194  bits<5> Zd;
3195  bits<5> Zn;
3196  bits<5> Zm;
3197  let Inst{31-24} = 0b01000101;
3198  let Inst{23-22} = sz;
3199  let Inst{21}    = 0b1;
3200  let Inst{20-16} = Zm;
3201  let Inst{15-13} = 0b011;
3202  let Inst{12-11} = opc; // S, R
3203  let Inst{10}    = 0b1; // Top
3204  let Inst{9-5}   = Zn;
3205  let Inst{4-0}   = Zd;
3206
3207  let Constraints = "$Zd = $_Zd";
3208}
3209
3210multiclass sve2_int_addsub_narrow_high_top<bits<2> opc, string asm,
3211                                           SDPatternOperator op> {
3212  def _B : sve2_int_addsub_narrow_high_top<0b01, opc, asm, ZPR8, ZPR16>;
3213  def _H : sve2_int_addsub_narrow_high_top<0b10, opc, asm, ZPR16, ZPR32>;
3214  def _S : sve2_int_addsub_narrow_high_top<0b11, opc, asm, ZPR32, ZPR64>;
3215
3216  def : SVE_3_Op_Pat<nxv16i8, op, nxv16i8, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _B)>;
3217  def : SVE_3_Op_Pat<nxv8i16, op, nxv8i16, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _H)>;
3218  def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _S)>;
3219}
3220
3221class sve2_int_sat_extract_narrow_bottom<bits<3> tsz8_64, bits<2> opc, string asm,
3222                                         ZPRRegOp zprty1, ZPRRegOp zprty2>
3223: I<(outs zprty1:$Zd), (ins zprty2:$Zn),
3224  asm, "\t$Zd, $Zn", "", []>, Sched<[]> {
3225  bits<5> Zd;
3226  bits<5> Zn;
3227  let Inst{31-23} = 0b010001010;
3228  let Inst{22}    = tsz8_64{2};
3229  let Inst{21}    = 0b1;
3230  let Inst{20-19} = tsz8_64{1-0};
3231  let Inst{18-13} = 0b000010;
3232  let Inst{12-11} = opc;
3233  let Inst{10}    = 0b0;
3234  let Inst{9-5}   = Zn;
3235  let Inst{4-0}   = Zd;
3236}
3237
3238multiclass sve2_int_sat_extract_narrow_bottom<bits<2> opc, string asm,
3239                                              SDPatternOperator op> {
3240  def _B : sve2_int_sat_extract_narrow_bottom<0b001, opc, asm, ZPR8, ZPR16>;
3241  def _H : sve2_int_sat_extract_narrow_bottom<0b010, opc, asm, ZPR16, ZPR32>;
3242  def _S : sve2_int_sat_extract_narrow_bottom<0b100, opc, asm, ZPR32, ZPR64>;
3243
3244  def : SVE_1_Op_Pat<nxv16i8, op, nxv8i16, !cast<Instruction>(NAME # _B)>;
3245  def : SVE_1_Op_Pat<nxv8i16, op, nxv4i32, !cast<Instruction>(NAME # _H)>;
3246  def : SVE_1_Op_Pat<nxv4i32, op, nxv2i64, !cast<Instruction>(NAME # _S)>;
3247}
3248
3249class sve2_int_sat_extract_narrow_top<bits<3> tsz8_64, bits<2> opc, string asm,
3250                                      ZPRRegOp zprty1, ZPRRegOp zprty2>
3251: I<(outs zprty1:$Zd), (ins zprty1:$_Zd, zprty2:$Zn),
3252  asm, "\t$Zd, $Zn", "", []>, Sched<[]> {
3253  bits<5> Zd;
3254  bits<5> Zn;
3255  let Inst{31-23} = 0b010001010;
3256  let Inst{22}    = tsz8_64{2};
3257  let Inst{21}    = 0b1;
3258  let Inst{20-19} = tsz8_64{1-0};
3259  let Inst{18-13} = 0b000010;
3260  let Inst{12-11} = opc;
3261  let Inst{10}    = 0b1;
3262  let Inst{9-5}   = Zn;
3263  let Inst{4-0}   = Zd;
3264
3265  let Constraints = "$Zd = $_Zd";
3266}
3267
3268multiclass sve2_int_sat_extract_narrow_top<bits<2> opc, string asm,
3269                                           SDPatternOperator op> {
3270  def _B : sve2_int_sat_extract_narrow_top<0b001, opc, asm, ZPR8, ZPR16>;
3271  def _H : sve2_int_sat_extract_narrow_top<0b010, opc, asm, ZPR16, ZPR32>;
3272  def _S : sve2_int_sat_extract_narrow_top<0b100, opc, asm, ZPR32, ZPR64>;
3273
3274  def : SVE_2_Op_Pat<nxv16i8, op, nxv16i8, nxv8i16, !cast<Instruction>(NAME # _B)>;
3275  def : SVE_2_Op_Pat<nxv8i16, op, nxv8i16, nxv4i32, !cast<Instruction>(NAME # _H)>;
3276  def : SVE_2_Op_Pat<nxv4i32, op, nxv4i32, nxv2i64, !cast<Instruction>(NAME # _S)>;
3277}
3278
3279//===----------------------------------------------------------------------===//
3280// SVE Integer Arithmetic - Unary Predicated Group
3281//===----------------------------------------------------------------------===//
3282
3283class sve_int_un_pred_arit<bits<2> sz8_64, bits<4> opc,
3284                             string asm, ZPRRegOp zprty>
3285: I<(outs zprty:$Zd), (ins zprty:$_Zd, PPR3bAny:$Pg, zprty:$Zn),
3286  asm, "\t$Zd, $Pg/m, $Zn",
3287  "",
3288  []>, Sched<[]> {
3289  bits<3> Pg;
3290  bits<5> Zd;
3291  bits<5> Zn;
3292  let Inst{31-24} = 0b00000100;
3293  let Inst{23-22} = sz8_64;
3294  let Inst{21-20} = 0b01;
3295  let Inst{19}    = opc{0};
3296  let Inst{18-16} = opc{3-1};
3297  let Inst{15-13} = 0b101;
3298  let Inst{12-10} = Pg;
3299  let Inst{9-5}   = Zn;
3300  let Inst{4-0}   = Zd;
3301
3302  let Constraints = "$Zd = $_Zd";
3303  let DestructiveInstType = Destructive;
3304  let ElementSize = zprty.ElementSize;
3305}
3306
3307multiclass sve_int_un_pred_arit_0<bits<3> opc, string asm,
3308                                  SDPatternOperator op> {
3309  def _B : sve_int_un_pred_arit<0b00, { opc, 0b0 }, asm, ZPR8>;
3310  def _H : sve_int_un_pred_arit<0b01, { opc, 0b0 }, asm, ZPR16>;
3311  def _S : sve_int_un_pred_arit<0b10, { opc, 0b0 }, asm, ZPR32>;
3312  def _D : sve_int_un_pred_arit<0b11, { opc, 0b0 }, asm, ZPR64>;
3313
3314  def : SVE_3_Op_Pat<nxv16i8, op, nxv16i8, nxv16i1, nxv16i8, !cast<Instruction>(NAME # _B)>;
3315  def : SVE_3_Op_Pat<nxv8i16, op, nxv8i16, nxv8i1,  nxv8i16, !cast<Instruction>(NAME # _H)>;
3316  def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv4i1,  nxv4i32, !cast<Instruction>(NAME # _S)>;
3317  def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv2i1,  nxv2i64, !cast<Instruction>(NAME # _D)>;
3318}
3319
3320multiclass sve_int_un_pred_arit_0_h<bits<3> opc, string asm,
3321                                    SDPatternOperator op> {
3322  def _H : sve_int_un_pred_arit<0b01, { opc, 0b0 }, asm, ZPR16>;
3323  def _S : sve_int_un_pred_arit<0b10, { opc, 0b0 }, asm, ZPR32>;
3324  def _D : sve_int_un_pred_arit<0b11, { opc, 0b0 }, asm, ZPR64>;
3325
3326  def : SVE_3_Op_Pat<nxv8i16, op, nxv8i16, nxv8i1,  nxv8i16, !cast<Instruction>(NAME # _H)>;
3327  def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv4i1,  nxv4i32, !cast<Instruction>(NAME # _S)>;
3328  def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv2i1,  nxv2i64, !cast<Instruction>(NAME # _D)>;
3329}
3330
3331multiclass sve_int_un_pred_arit_0_w<bits<3> opc, string asm,
3332                                    SDPatternOperator op> {
3333  def _S : sve_int_un_pred_arit<0b10, { opc, 0b0 }, asm, ZPR32>;
3334  def _D : sve_int_un_pred_arit<0b11, { opc, 0b0 }, asm, ZPR64>;
3335
3336  def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv4i1,  nxv4i32, !cast<Instruction>(NAME # _S)>;
3337  def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv2i1,  nxv2i64, !cast<Instruction>(NAME # _D)>;
3338}
3339
3340multiclass sve_int_un_pred_arit_0_d<bits<3> opc, string asm,
3341                                    SDPatternOperator op> {
3342  def _D : sve_int_un_pred_arit<0b11, { opc, 0b0 }, asm, ZPR64>;
3343
3344  def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv2i1,  nxv2i64, !cast<Instruction>(NAME # _D)>;
3345}
3346
3347multiclass sve_int_un_pred_arit_1<bits<3> opc, string asm,
3348                                  SDPatternOperator op> {
3349  def _B : sve_int_un_pred_arit<0b00, { opc, 0b1 }, asm, ZPR8>;
3350  def _H : sve_int_un_pred_arit<0b01, { opc, 0b1 }, asm, ZPR16>;
3351  def _S : sve_int_un_pred_arit<0b10, { opc, 0b1 }, asm, ZPR32>;
3352  def _D : sve_int_un_pred_arit<0b11, { opc, 0b1 }, asm, ZPR64>;
3353
3354  def : SVE_3_Op_Pat<nxv16i8, op, nxv16i8, nxv16i1, nxv16i8, !cast<Instruction>(NAME # _B)>;
3355  def : SVE_3_Op_Pat<nxv8i16, op, nxv8i16, nxv8i1,  nxv8i16, !cast<Instruction>(NAME # _H)>;
3356  def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv4i1,  nxv4i32, !cast<Instruction>(NAME # _S)>;
3357  def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv2i1,  nxv2i64, !cast<Instruction>(NAME # _D)>;
3358
3359  def : SVE_3_Op_Pat<nxv8i16, op, nxv8i16, nxv8i1, nxv8f16, !cast<Instruction>(NAME # _H)>;
3360  def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv4i1, nxv4f32, !cast<Instruction>(NAME # _S)>;
3361  def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv2i1, nxv2f64, !cast<Instruction>(NAME # _D)>;
3362}
3363
3364multiclass sve_int_un_pred_arit_1_fp<bits<3> opc, string asm,
3365                                     SDPatternOperator op> {
3366  def _H : sve_int_un_pred_arit<0b01, { opc, 0b1 }, asm, ZPR16>;
3367  def _S : sve_int_un_pred_arit<0b10, { opc, 0b1 }, asm, ZPR32>;
3368  def _D : sve_int_un_pred_arit<0b11, { opc, 0b1 }, asm, ZPR64>;
3369
3370  def : SVE_3_Op_Pat<nxv8f16, op, nxv8f16, nxv8i1, nxv8f16, !cast<Instruction>(NAME # _H)>;
3371  def : SVE_3_Op_Pat<nxv4f32, op, nxv4f32, nxv4i1, nxv4f32, !cast<Instruction>(NAME # _S)>;
3372  def : SVE_3_Op_Pat<nxv2f64, op, nxv2f64, nxv2i1, nxv2f64, !cast<Instruction>(NAME # _D)>;
3373}
3374
3375//===----------------------------------------------------------------------===//
3376// SVE Integer Wide Immediate - Unpredicated Group
3377//===----------------------------------------------------------------------===//
3378class sve_int_dup_imm<bits<2> sz8_64, string asm,
3379                      ZPRRegOp zprty, Operand immtype>
3380: I<(outs zprty:$Zd), (ins immtype:$imm),
3381  asm, "\t$Zd, $imm",
3382  "",
3383  []>, Sched<[]> {
3384  bits<5> Zd;
3385  bits<9> imm;
3386  let Inst{31-24} = 0b00100101;
3387  let Inst{23-22} = sz8_64;
3388  let Inst{21-14} = 0b11100011;
3389  let Inst{13}    = imm{8};   // sh
3390  let Inst{12-5}  = imm{7-0}; // imm8
3391  let Inst{4-0}   = Zd;
3392
3393  let isReMaterializable = 1;
3394}
3395
3396multiclass sve_int_dup_imm<string asm> {
3397  def _B : sve_int_dup_imm<0b00, asm, ZPR8, cpy_imm8_opt_lsl_i8>;
3398  def _H : sve_int_dup_imm<0b01, asm, ZPR16, cpy_imm8_opt_lsl_i16>;
3399  def _S : sve_int_dup_imm<0b10, asm, ZPR32, cpy_imm8_opt_lsl_i32>;
3400  def _D : sve_int_dup_imm<0b11, asm, ZPR64, cpy_imm8_opt_lsl_i64>;
3401
3402  def : InstAlias<"mov $Zd, $imm",
3403                  (!cast<Instruction>(NAME # _B) ZPR8:$Zd, cpy_imm8_opt_lsl_i8:$imm), 1>;
3404  def : InstAlias<"mov $Zd, $imm",
3405                  (!cast<Instruction>(NAME # _H) ZPR16:$Zd, cpy_imm8_opt_lsl_i16:$imm), 1>;
3406  def : InstAlias<"mov $Zd, $imm",
3407                  (!cast<Instruction>(NAME # _S) ZPR32:$Zd, cpy_imm8_opt_lsl_i32:$imm), 1>;
3408  def : InstAlias<"mov $Zd, $imm",
3409                  (!cast<Instruction>(NAME # _D) ZPR64:$Zd, cpy_imm8_opt_lsl_i64:$imm), 1>;
3410
3411  def : InstAlias<"fmov $Zd, #0.0",
3412                  (!cast<Instruction>(NAME # _H) ZPR16:$Zd, 0, 0), 1>;
3413  def : InstAlias<"fmov $Zd, #0.0",
3414                  (!cast<Instruction>(NAME # _S) ZPR32:$Zd, 0, 0), 1>;
3415  def : InstAlias<"fmov $Zd, #0.0",
3416                  (!cast<Instruction>(NAME # _D) ZPR64:$Zd, 0, 0), 1>;
3417}
3418
3419class sve_int_dup_fpimm<bits<2> sz8_64, Operand fpimmtype,
3420                        string asm, ZPRRegOp zprty>
3421: I<(outs zprty:$Zd), (ins fpimmtype:$imm8),
3422  asm, "\t$Zd, $imm8",
3423  "",
3424  []>, Sched<[]> {
3425  bits<5> Zd;
3426  bits<8> imm8;
3427  let Inst{31-24} = 0b00100101;
3428  let Inst{23-22} = sz8_64;
3429  let Inst{21-14} = 0b11100111;
3430  let Inst{13}    = 0b0;
3431  let Inst{12-5}  = imm8;
3432  let Inst{4-0}   = Zd;
3433
3434  let isReMaterializable = 1;
3435}
3436
3437multiclass sve_int_dup_fpimm<string asm> {
3438  def _H : sve_int_dup_fpimm<0b01, fpimm16, asm, ZPR16>;
3439  def _S : sve_int_dup_fpimm<0b10, fpimm32, asm, ZPR32>;
3440  def _D : sve_int_dup_fpimm<0b11, fpimm64, asm, ZPR64>;
3441
3442  def : InstAlias<"fmov $Zd, $imm8",
3443                  (!cast<Instruction>(NAME # _H) ZPR16:$Zd, fpimm16:$imm8), 1>;
3444  def : InstAlias<"fmov $Zd, $imm8",
3445                  (!cast<Instruction>(NAME # _S) ZPR32:$Zd, fpimm32:$imm8), 1>;
3446  def : InstAlias<"fmov $Zd, $imm8",
3447                  (!cast<Instruction>(NAME # _D) ZPR64:$Zd, fpimm64:$imm8), 1>;
3448}
3449
3450class sve_int_arith_imm0<bits<2> sz8_64, bits<3> opc, string asm,
3451                         ZPRRegOp zprty, Operand immtype>
3452: I<(outs zprty:$Zdn), (ins zprty:$_Zdn, immtype:$imm),
3453  asm, "\t$Zdn, $_Zdn, $imm",
3454  "",
3455  []>, Sched<[]> {
3456  bits<5> Zdn;
3457  bits<9> imm;
3458  let Inst{31-24} = 0b00100101;
3459  let Inst{23-22} = sz8_64;
3460  let Inst{21-19} = 0b100;
3461  let Inst{18-16} = opc;
3462  let Inst{15-14} = 0b11;
3463  let Inst{13}    = imm{8};   // sh
3464  let Inst{12-5}  = imm{7-0}; // imm8
3465  let Inst{4-0}   = Zdn;
3466
3467  let Constraints = "$Zdn = $_Zdn";
3468  let DestructiveInstType = Destructive;
3469  let ElementSize = ElementSizeNone;
3470}
3471
3472multiclass sve_int_arith_imm0<bits<3> opc, string asm, SDPatternOperator op> {
3473  def _B : sve_int_arith_imm0<0b00, opc, asm, ZPR8,  addsub_imm8_opt_lsl_i8>;
3474  def _H : sve_int_arith_imm0<0b01, opc, asm, ZPR16, addsub_imm8_opt_lsl_i16>;
3475  def _S : sve_int_arith_imm0<0b10, opc, asm, ZPR32, addsub_imm8_opt_lsl_i32>;
3476  def _D : sve_int_arith_imm0<0b11, opc, asm, ZPR64, addsub_imm8_opt_lsl_i64>;
3477
3478  def : SVE_1_Op_Imm_OptLsl_Pat<nxv16i8, op, ZPR8,  i32, SVEAddSubImm8Pat,  !cast<Instruction>(NAME # _B)>;
3479  def : SVE_1_Op_Imm_OptLsl_Pat<nxv8i16, op, ZPR16, i32, SVEAddSubImm16Pat, !cast<Instruction>(NAME # _H)>;
3480  def : SVE_1_Op_Imm_OptLsl_Pat<nxv4i32, op, ZPR32, i32, SVEAddSubImm32Pat, !cast<Instruction>(NAME # _S)>;
3481  def : SVE_1_Op_Imm_OptLsl_Pat<nxv2i64, op, ZPR64, i64, SVEAddSubImm64Pat, !cast<Instruction>(NAME # _D)>;
3482}
3483
3484multiclass sve_int_arith_imm0_subr<bits<3> opc, string asm, SDPatternOperator op> {
3485  def _B : sve_int_arith_imm0<0b00, opc, asm, ZPR8,  addsub_imm8_opt_lsl_i8>;
3486  def _H : sve_int_arith_imm0<0b01, opc, asm, ZPR16, addsub_imm8_opt_lsl_i16>;
3487  def _S : sve_int_arith_imm0<0b10, opc, asm, ZPR32, addsub_imm8_opt_lsl_i32>;
3488  def _D : sve_int_arith_imm0<0b11, opc, asm, ZPR64, addsub_imm8_opt_lsl_i64>;
3489
3490  def : SVE_1_Op_Imm_OptLsl_Reverse_Pat<nxv16i8, op, ZPR8,  i32, SVEAddSubImm8Pat,  !cast<Instruction>(NAME # _B)>;
3491  def : SVE_1_Op_Imm_OptLsl_Reverse_Pat<nxv8i16, op, ZPR16, i32, SVEAddSubImm16Pat, !cast<Instruction>(NAME # _H)>;
3492  def : SVE_1_Op_Imm_OptLsl_Reverse_Pat<nxv4i32, op, ZPR32, i32, SVEAddSubImm32Pat, !cast<Instruction>(NAME # _S)>;
3493  def : SVE_1_Op_Imm_OptLsl_Reverse_Pat<nxv2i64, op, ZPR64, i64, SVEAddSubImm64Pat, !cast<Instruction>(NAME # _D)>;
3494}
3495
3496class sve_int_arith_imm<bits<2> sz8_64, bits<6> opc, string asm,
3497                        ZPRRegOp zprty, Operand immtype>
3498: I<(outs zprty:$Zdn), (ins zprty:$_Zdn, immtype:$imm),
3499  asm, "\t$Zdn, $_Zdn, $imm",
3500  "",
3501  []>, Sched<[]> {
3502  bits<5> Zdn;
3503  bits<8> imm;
3504  let Inst{31-24} = 0b00100101;
3505  let Inst{23-22} = sz8_64;
3506  let Inst{21-16} = opc;
3507  let Inst{15-13} = 0b110;
3508  let Inst{12-5} = imm;
3509  let Inst{4-0} = Zdn;
3510
3511  let Constraints = "$Zdn = $_Zdn";
3512  let DestructiveInstType = Destructive;
3513  let ElementSize = ElementSizeNone;
3514}
3515
3516multiclass sve_int_arith_imm1<bits<2> opc, string asm, SDPatternOperator op> {
3517  def _B : sve_int_arith_imm<0b00, { 0b1010, opc }, asm, ZPR8, simm8>;
3518  def _H : sve_int_arith_imm<0b01, { 0b1010, opc }, asm, ZPR16, simm8>;
3519  def _S : sve_int_arith_imm<0b10, { 0b1010, opc }, asm, ZPR32, simm8>;
3520  def _D : sve_int_arith_imm<0b11, { 0b1010, opc }, asm, ZPR64, simm8>;
3521
3522  def : SVE_1_Op_Imm_Arith_Pat<nxv16i8, op, ZPR8, i32, SVEArithSImmPat, !cast<Instruction>(NAME # _B)>;
3523  def : SVE_1_Op_Imm_Arith_Pat<nxv8i16, op, ZPR16, i32, SVEArithSImmPat, !cast<Instruction>(NAME # _H)>;
3524  def : SVE_1_Op_Imm_Arith_Pat<nxv4i32, op, ZPR32, i32, SVEArithSImmPat, !cast<Instruction>(NAME # _S)>;
3525  def : SVE_1_Op_Imm_Arith_Pat<nxv2i64, op, ZPR64, i64, SVEArithSImmPat, !cast<Instruction>(NAME # _D)>;
3526}
3527
3528multiclass sve_int_arith_imm1_unsigned<bits<2> opc, string asm, SDPatternOperator op> {
3529  def _B : sve_int_arith_imm<0b00, { 0b1010, opc }, asm, ZPR8, imm0_255>;
3530  def _H : sve_int_arith_imm<0b01, { 0b1010, opc }, asm, ZPR16, imm0_255>;
3531  def _S : sve_int_arith_imm<0b10, { 0b1010, opc }, asm, ZPR32, imm0_255>;
3532  def _D : sve_int_arith_imm<0b11, { 0b1010, opc }, asm, ZPR64, imm0_255>;
3533
3534  def : SVE_1_Op_Imm_Arith_Pat<nxv16i8, op, ZPR8, i32, SVEArithUImmPat, !cast<Instruction>(NAME # _B)>;
3535  def : SVE_1_Op_Imm_Arith_Pat<nxv8i16, op, ZPR16, i32, SVEArithUImmPat, !cast<Instruction>(NAME # _H)>;
3536  def : SVE_1_Op_Imm_Arith_Pat<nxv4i32, op, ZPR32, i32, SVEArithUImmPat, !cast<Instruction>(NAME # _S)>;
3537  def : SVE_1_Op_Imm_Arith_Pat<nxv2i64, op, ZPR64, i64, SVEArithUImmPat, !cast<Instruction>(NAME # _D)>;
3538}
3539
3540multiclass sve_int_arith_imm2<string asm, SDPatternOperator op> {
3541  def _B : sve_int_arith_imm<0b00, 0b110000, asm, ZPR8,  simm8>;
3542  def _H : sve_int_arith_imm<0b01, 0b110000, asm, ZPR16, simm8>;
3543  def _S : sve_int_arith_imm<0b10, 0b110000, asm, ZPR32, simm8>;
3544  def _D : sve_int_arith_imm<0b11, 0b110000, asm, ZPR64, simm8>;
3545
3546  def : SVE_1_Op_Imm_Arith_Pat<nxv16i8, op, ZPR8, i32, SVEArithSImmPat, !cast<Instruction>(NAME # _B)>;
3547  def : SVE_1_Op_Imm_Arith_Pat<nxv8i16, op, ZPR16, i32, SVEArithSImmPat, !cast<Instruction>(NAME # _H)>;
3548  def : SVE_1_Op_Imm_Arith_Pat<nxv4i32, op, ZPR32, i32, SVEArithSImmPat, !cast<Instruction>(NAME # _S)>;
3549  def : SVE_1_Op_Imm_Arith_Pat<nxv2i64, op, ZPR64, i64, SVEArithSImmPat, !cast<Instruction>(NAME # _D)>;
3550}
3551
3552//===----------------------------------------------------------------------===//
3553// SVE Bitwise Logical - Unpredicated Group
3554//===----------------------------------------------------------------------===//
3555
3556class sve_int_bin_cons_log<bits<2> opc, string asm>
3557: I<(outs ZPR64:$Zd), (ins ZPR64:$Zn, ZPR64:$Zm),
3558  asm, "\t$Zd, $Zn, $Zm",
3559  "",
3560  []>, Sched<[]> {
3561  bits<5> Zd;
3562  bits<5> Zm;
3563  bits<5> Zn;
3564  let Inst{31-24} = 0b00000100;
3565  let Inst{23-22} = opc{1-0};
3566  let Inst{21}    = 0b1;
3567  let Inst{20-16} = Zm;
3568  let Inst{15-10} = 0b001100;
3569  let Inst{9-5}   = Zn;
3570  let Inst{4-0}   = Zd;
3571}
3572
3573multiclass sve_int_bin_cons_log<bits<2> opc, string asm, SDPatternOperator op> {
3574  def NAME : sve_int_bin_cons_log<opc, asm>;
3575
3576  def : SVE_2_Op_Pat<nxv16i8, op, nxv16i8, nxv16i8, !cast<Instruction>(NAME)>;
3577  def : SVE_2_Op_Pat<nxv8i16, op, nxv8i16, nxv8i16, !cast<Instruction>(NAME)>;
3578  def : SVE_2_Op_Pat<nxv4i32, op, nxv4i32, nxv4i32, !cast<Instruction>(NAME)>;
3579  def : SVE_2_Op_Pat<nxv2i64, op, nxv2i64, nxv2i64, !cast<Instruction>(NAME)>;
3580
3581  def : InstAlias<asm # "\t$Zd, $Zn, $Zm",
3582                  (!cast<Instruction>(NAME) ZPR8:$Zd,  ZPR8:$Zn,  ZPR8:$Zm),  1>;
3583  def : InstAlias<asm # "\t$Zd, $Zn, $Zm",
3584                  (!cast<Instruction>(NAME) ZPR16:$Zd, ZPR16:$Zn, ZPR16:$Zm), 1>;
3585  def : InstAlias<asm # "\t$Zd, $Zn, $Zm",
3586                  (!cast<Instruction>(NAME) ZPR32:$Zd, ZPR32:$Zn, ZPR32:$Zm), 1>;
3587}
3588
3589class sve2_int_bitwise_ternary_op_d<bits<3> opc, string asm>
3590: I<(outs ZPR64:$Zdn), (ins ZPR64:$_Zdn, ZPR64:$Zm, ZPR64:$Zk),
3591  asm, "\t$Zdn, $_Zdn, $Zm, $Zk",
3592  "",
3593  []>, Sched<[]> {
3594  bits<5> Zdn;
3595  bits<5> Zk;
3596  bits<5> Zm;
3597  let Inst{31-24} = 0b00000100;
3598  let Inst{23-22} = opc{2-1};
3599  let Inst{21}    = 0b1;
3600  let Inst{20-16} = Zm;
3601  let Inst{15-11} = 0b00111;
3602  let Inst{10}    = opc{0};
3603  let Inst{9-5}   = Zk;
3604  let Inst{4-0}   = Zdn;
3605
3606  let Constraints = "$Zdn = $_Zdn";
3607  let DestructiveInstType = Destructive;
3608  let ElementSize = ElementSizeNone;
3609}
3610
3611multiclass sve2_int_bitwise_ternary_op<bits<3> opc, string asm> {
3612  def NAME : sve2_int_bitwise_ternary_op_d<opc, asm>;
3613
3614  def : InstAlias<asm # "\t$Zdn, $Zdn, $Zm, $Zk",
3615                  (!cast<Instruction>(NAME) ZPR8:$Zdn,  ZPR8:$Zm,  ZPR8:$Zk),  1>;
3616  def : InstAlias<asm # "\t$Zdn, $Zdn, $Zm, $Zk",
3617                  (!cast<Instruction>(NAME) ZPR16:$Zdn, ZPR16:$Zm, ZPR16:$Zk), 1>;
3618  def : InstAlias<asm # "\t$Zdn, $Zdn, $Zm, $Zk",
3619                  (!cast<Instruction>(NAME) ZPR32:$Zdn, ZPR32:$Zm, ZPR32:$Zk), 1>;
3620}
3621
3622class sve2_int_rotate_right_imm<bits<4> tsz8_64, string asm,
3623                                ZPRRegOp zprty, Operand immtype>
3624: I<(outs zprty:$Zdn), (ins zprty:$_Zdn, zprty:$Zm, immtype:$imm),
3625  asm, "\t$Zdn, $_Zdn, $Zm, $imm",
3626  "",
3627  []>, Sched<[]> {
3628  bits<5> Zdn;
3629  bits<5> Zm;
3630  bits<6> imm;
3631  let Inst{31-24} = 0b00000100;
3632  let Inst{23-22} = tsz8_64{3-2};
3633  let Inst{21}    = 0b1;
3634  let Inst{20-19} = tsz8_64{1-0};
3635  let Inst{18-16} = imm{2-0}; // imm3
3636  let Inst{15-10} = 0b001101;
3637  let Inst{9-5}   = Zm;
3638  let Inst{4-0}   = Zdn;
3639
3640  let Constraints = "$Zdn = $_Zdn";
3641  let DestructiveInstType = Destructive;
3642  let ElementSize = ElementSizeNone;
3643}
3644
3645multiclass sve2_int_rotate_right_imm<string asm> {
3646  def _B : sve2_int_rotate_right_imm<{0,0,0,1}, asm, ZPR8, vecshiftR8>;
3647  def _H : sve2_int_rotate_right_imm<{0,0,1,?}, asm, ZPR16, vecshiftR16> {
3648    let Inst{19} = imm{3};
3649  }
3650  def _S : sve2_int_rotate_right_imm<{0,1,?,?}, asm, ZPR32, vecshiftR32> {
3651    let Inst{20-19} = imm{4-3};
3652  }
3653  def _D : sve2_int_rotate_right_imm<{1,?,?,?}, asm, ZPR64, vecshiftR64> {
3654    let Inst{22}    = imm{5};
3655    let Inst{20-19} = imm{4-3};
3656  }
3657}
3658
3659//===----------------------------------------------------------------------===//
3660// SVE Integer Wide Immediate - Predicated Group
3661//===----------------------------------------------------------------------===//
3662
3663class sve_int_dup_fpimm_pred<bits<2> sz, Operand fpimmtype,
3664                             string asm, ZPRRegOp zprty>
3665: I<(outs zprty:$Zd), (ins zprty:$_Zd, PPRAny:$Pg, fpimmtype:$imm8),
3666  asm, "\t$Zd, $Pg/m, $imm8",
3667  "",
3668  []>, Sched<[]> {
3669  bits<4> Pg;
3670  bits<5> Zd;
3671  bits<8> imm8;
3672  let Inst{31-24} = 0b00000101;
3673  let Inst{23-22} = sz;
3674  let Inst{21-20} = 0b01;
3675  let Inst{19-16} = Pg;
3676  let Inst{15-13} = 0b110;
3677  let Inst{12-5}  = imm8;
3678  let Inst{4-0}   = Zd;
3679
3680  let Constraints = "$Zd = $_Zd";
3681  let DestructiveInstType = Destructive;
3682  let ElementSize = zprty.ElementSize;
3683}
3684
3685multiclass sve_int_dup_fpimm_pred<string asm> {
3686  def _H : sve_int_dup_fpimm_pred<0b01, fpimm16, asm, ZPR16>;
3687  def _S : sve_int_dup_fpimm_pred<0b10, fpimm32, asm, ZPR32>;
3688  def _D : sve_int_dup_fpimm_pred<0b11, fpimm64, asm, ZPR64>;
3689
3690  def : InstAlias<"fmov $Zd, $Pg/m, $imm8",
3691                  (!cast<Instruction>(NAME # _H) ZPR16:$Zd, PPRAny:$Pg, fpimm16:$imm8), 1>;
3692  def : InstAlias<"fmov $Zd, $Pg/m, $imm8",
3693                  (!cast<Instruction>(NAME # _S) ZPR32:$Zd, PPRAny:$Pg, fpimm32:$imm8), 1>;
3694  def : InstAlias<"fmov $Zd, $Pg/m, $imm8",
3695                  (!cast<Instruction>(NAME # _D) ZPR64:$Zd, PPRAny:$Pg, fpimm64:$imm8), 1>;
3696}
3697
3698class sve_int_dup_imm_pred<bits<2> sz8_64, bit m, string asm,
3699                           ZPRRegOp zprty, string pred_qual, dag iops>
3700: I<(outs zprty:$Zd), iops,
3701  asm, "\t$Zd, $Pg"#pred_qual#", $imm",
3702  "", []>, Sched<[]> {
3703  bits<5> Zd;
3704  bits<4> Pg;
3705  bits<9> imm;
3706  let Inst{31-24} = 0b00000101;
3707  let Inst{23-22} = sz8_64;
3708  let Inst{21-20} = 0b01;
3709  let Inst{19-16} = Pg;
3710  let Inst{15}    = 0b0;
3711  let Inst{14}    = m;
3712  let Inst{13}    = imm{8};   // sh
3713  let Inst{12-5}  = imm{7-0}; // imm8
3714  let Inst{4-0}   = Zd;
3715
3716  let DestructiveInstType = Destructive;
3717  let ElementSize = zprty.ElementSize;
3718}
3719
3720multiclass sve_int_dup_imm_pred_merge<string asm> {
3721  let Constraints = "$Zd = $_Zd" in {
3722  def _B : sve_int_dup_imm_pred<0b00, 1, asm, ZPR8,  "/m", (ins ZPR8:$_Zd,  PPRAny:$Pg, cpy_imm8_opt_lsl_i8:$imm)>;
3723  def _H : sve_int_dup_imm_pred<0b01, 1, asm, ZPR16, "/m", (ins ZPR16:$_Zd, PPRAny:$Pg, cpy_imm8_opt_lsl_i16:$imm)>;
3724  def _S : sve_int_dup_imm_pred<0b10, 1, asm, ZPR32, "/m", (ins ZPR32:$_Zd, PPRAny:$Pg, cpy_imm8_opt_lsl_i32:$imm)>;
3725  def _D : sve_int_dup_imm_pred<0b11, 1, asm, ZPR64, "/m", (ins ZPR64:$_Zd, PPRAny:$Pg, cpy_imm8_opt_lsl_i64:$imm)>;
3726  }
3727
3728  def : InstAlias<"mov $Zd, $Pg/m, $imm",
3729                  (!cast<Instruction>(NAME # _B) ZPR8:$Zd,  PPRAny:$Pg, cpy_imm8_opt_lsl_i8:$imm), 1>;
3730  def : InstAlias<"mov $Zd, $Pg/m, $imm",
3731                  (!cast<Instruction>(NAME # _H) ZPR16:$Zd, PPRAny:$Pg, cpy_imm8_opt_lsl_i16:$imm), 1>;
3732  def : InstAlias<"mov $Zd, $Pg/m, $imm",
3733                  (!cast<Instruction>(NAME # _S) ZPR32:$Zd, PPRAny:$Pg, cpy_imm8_opt_lsl_i32:$imm), 1>;
3734  def : InstAlias<"mov $Zd, $Pg/m, $imm",
3735                  (!cast<Instruction>(NAME # _D) ZPR64:$Zd, PPRAny:$Pg, cpy_imm8_opt_lsl_i64:$imm), 1>;
3736
3737  def : InstAlias<"fmov $Zd, $Pg/m, #0.0",
3738                  (!cast<Instruction>(NAME # _H) ZPR16:$Zd, PPRAny:$Pg, 0, 0), 0>;
3739  def : InstAlias<"fmov $Zd, $Pg/m, #0.0",
3740                  (!cast<Instruction>(NAME # _S) ZPR32:$Zd, PPRAny:$Pg, 0, 0), 0>;
3741  def : InstAlias<"fmov $Zd, $Pg/m, #0.0",
3742                  (!cast<Instruction>(NAME # _D) ZPR64:$Zd, PPRAny:$Pg, 0, 0), 0>;
3743}
3744
3745multiclass sve_int_dup_imm_pred_zero<string asm> {
3746  def _B : sve_int_dup_imm_pred<0b00, 0, asm, ZPR8,  "/z", (ins PPRAny:$Pg, cpy_imm8_opt_lsl_i8:$imm)>;
3747  def _H : sve_int_dup_imm_pred<0b01, 0, asm, ZPR16, "/z", (ins PPRAny:$Pg, cpy_imm8_opt_lsl_i16:$imm)>;
3748  def _S : sve_int_dup_imm_pred<0b10, 0, asm, ZPR32, "/z", (ins PPRAny:$Pg, cpy_imm8_opt_lsl_i32:$imm)>;
3749  def _D : sve_int_dup_imm_pred<0b11, 0, asm, ZPR64, "/z", (ins PPRAny:$Pg, cpy_imm8_opt_lsl_i64:$imm)>;
3750
3751  def : InstAlias<"mov $Zd, $Pg/z, $imm",
3752                  (!cast<Instruction>(NAME # _B) ZPR8:$Zd,  PPRAny:$Pg, cpy_imm8_opt_lsl_i8:$imm), 1>;
3753  def : InstAlias<"mov $Zd, $Pg/z, $imm",
3754                  (!cast<Instruction>(NAME # _H) ZPR16:$Zd, PPRAny:$Pg, cpy_imm8_opt_lsl_i16:$imm), 1>;
3755  def : InstAlias<"mov $Zd, $Pg/z, $imm",
3756                  (!cast<Instruction>(NAME # _S) ZPR32:$Zd, PPRAny:$Pg, cpy_imm8_opt_lsl_i32:$imm), 1>;
3757  def : InstAlias<"mov $Zd, $Pg/z, $imm",
3758                  (!cast<Instruction>(NAME # _D) ZPR64:$Zd, PPRAny:$Pg, cpy_imm8_opt_lsl_i64:$imm), 1>;
3759}
3760
3761//===----------------------------------------------------------------------===//
3762// SVE Integer Compare - Vectors Group
3763//===----------------------------------------------------------------------===//
3764
3765class sve_int_cmp<bit cmp_1, bits<2> sz8_64, bits<3> opc, string asm,
3766                  PPRRegOp pprty, ZPRRegOp zprty1, ZPRRegOp zprty2>
3767: I<(outs pprty:$Pd), (ins PPR3bAny:$Pg, zprty1:$Zn, zprty2:$Zm),
3768  asm, "\t$Pd, $Pg/z, $Zn, $Zm",
3769  "",
3770  []>, Sched<[]> {
3771  bits<4> Pd;
3772  bits<3> Pg;
3773  bits<5> Zm;
3774  bits<5> Zn;
3775  let Inst{31-24} = 0b00100100;
3776  let Inst{23-22} = sz8_64;
3777  let Inst{21}    = 0b0;
3778  let Inst{20-16} = Zm;
3779  let Inst{15}    = opc{2};
3780  let Inst{14}    = cmp_1;
3781  let Inst{13}    = opc{1};
3782  let Inst{12-10} = Pg;
3783  let Inst{9-5}   = Zn;
3784  let Inst{4}     = opc{0};
3785  let Inst{3-0}   = Pd;
3786
3787  let Defs = [NZCV];
3788}
3789
3790multiclass sve_int_cmp_0<bits<3> opc, string asm, SDPatternOperator op,
3791                         CondCode cc> {
3792  def _B : sve_int_cmp<0b0, 0b00, opc, asm, PPR8, ZPR8, ZPR8>;
3793  def _H : sve_int_cmp<0b0, 0b01, opc, asm, PPR16, ZPR16, ZPR16>;
3794  def _S : sve_int_cmp<0b0, 0b10, opc, asm, PPR32, ZPR32, ZPR32>;
3795  def _D : sve_int_cmp<0b0, 0b11, opc, asm, PPR64, ZPR64, ZPR64>;
3796
3797  def : SVE_3_Op_Pat<nxv16i1, op, nxv16i1, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
3798  def : SVE_3_Op_Pat<nxv8i1,  op, nxv8i1,  nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
3799  def : SVE_3_Op_Pat<nxv4i1,  op, nxv4i1,  nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
3800  def : SVE_3_Op_Pat<nxv2i1,  op, nxv2i1,  nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
3801}
3802
3803multiclass sve_int_cmp_0_wide<bits<3> opc, string asm, SDPatternOperator op> {
3804  def _B : sve_int_cmp<0b0, 0b00, opc, asm, PPR8, ZPR8, ZPR64>;
3805  def _H : sve_int_cmp<0b0, 0b01, opc, asm, PPR16, ZPR16, ZPR64>;
3806  def _S : sve_int_cmp<0b0, 0b10, opc, asm, PPR32, ZPR32, ZPR64>;
3807
3808  def : SVE_3_Op_Pat<nxv16i1, op, nxv16i1, nxv16i8, nxv2i64, !cast<Instruction>(NAME # _B)>;
3809  def : SVE_3_Op_Pat<nxv8i1,  op, nxv8i1,  nxv8i16, nxv2i64, !cast<Instruction>(NAME # _H)>;
3810  def : SVE_3_Op_Pat<nxv4i1,  op, nxv4i1,  nxv4i32, nxv2i64, !cast<Instruction>(NAME # _S)>;
3811}
3812
3813multiclass sve_int_cmp_1_wide<bits<3> opc, string asm, SDPatternOperator op> {
3814  def _B : sve_int_cmp<0b1, 0b00, opc, asm, PPR8, ZPR8, ZPR64>;
3815  def _H : sve_int_cmp<0b1, 0b01, opc, asm, PPR16, ZPR16, ZPR64>;
3816  def _S : sve_int_cmp<0b1, 0b10, opc, asm, PPR32, ZPR32, ZPR64>;
3817
3818  def : SVE_3_Op_Pat<nxv16i1, op, nxv16i1, nxv16i8, nxv2i64, !cast<Instruction>(NAME # _B)>;
3819  def : SVE_3_Op_Pat<nxv8i1,  op, nxv8i1,  nxv8i16, nxv2i64, !cast<Instruction>(NAME # _H)>;
3820  def : SVE_3_Op_Pat<nxv4i1,  op, nxv4i1,  nxv4i32, nxv2i64, !cast<Instruction>(NAME # _S)>;
3821}
3822
3823
3824//===----------------------------------------------------------------------===//
3825// SVE Integer Compare - Signed Immediate Group
3826//===----------------------------------------------------------------------===//
3827
3828class sve_int_scmp_vi<bits<2> sz8_64, bits<3> opc, string asm, PPRRegOp pprty,
3829                      ZPRRegOp zprty,
3830                      Operand immtype>
3831: I<(outs pprty:$Pd), (ins PPR3bAny:$Pg, zprty:$Zn, immtype:$imm5),
3832  asm, "\t$Pd, $Pg/z, $Zn, $imm5",
3833  "",
3834  []>, Sched<[]> {
3835  bits<4> Pd;
3836  bits<3> Pg;
3837  bits<5> Zn;
3838  bits<5> imm5;
3839  let Inst{31-24} = 0b00100101;
3840  let Inst{23-22} = sz8_64;
3841  let Inst{21}    = 0b0;
3842  let Inst{20-16} = imm5;
3843  let Inst{15}    = opc{2};
3844  let Inst{14}    = 0b0;
3845  let Inst{13}    = opc{1};
3846  let Inst{12-10} = Pg;
3847  let Inst{9-5}   = Zn;
3848  let Inst{4}     = opc{0};
3849  let Inst{3-0}   = Pd;
3850
3851  let Defs = [NZCV];
3852  let ElementSize = pprty.ElementSize;
3853}
3854
3855multiclass sve_int_scmp_vi<bits<3> opc, string asm, CondCode cc,
3856                           SDPatternOperator op = null_frag,
3857                           SDPatternOperator inv_op = null_frag> {
3858  def _B : sve_int_scmp_vi<0b00, opc, asm, PPR8, ZPR8, simm5_32b>;
3859  def _H : sve_int_scmp_vi<0b01, opc, asm, PPR16, ZPR16, simm5_32b>;
3860  def _S : sve_int_scmp_vi<0b10, opc, asm, PPR32, ZPR32, simm5_32b>;
3861  def _D : sve_int_scmp_vi<0b11, opc, asm, PPR64, ZPR64, simm5_64b>;
3862
3863  // IR version
3864  def : Pat<(nxv16i1 (setcc (nxv16i8 ZPR:$Zs1),
3865                             (nxv16i8 (AArch64dup (simm5_32b:$imm))),
3866                             cc)),
3867             (!cast<Instruction>(NAME # "_B") (PTRUE_B 31), ZPR:$Zs1, simm5_32b:$imm)>;
3868  def : Pat<(nxv8i1 (setcc (nxv8i16 ZPR:$Zs1),
3869                            (nxv8i16 (AArch64dup (simm5_32b:$imm))),
3870                            cc)),
3871             (!cast<Instruction>(NAME # "_H") (PTRUE_H 31), ZPR:$Zs1, simm5_32b:$imm)>;
3872  def : Pat<(nxv4i1 (setcc (nxv4i32 ZPR:$Zs1),
3873                            (nxv4i32 (AArch64dup (simm5_32b:$imm))),
3874                            cc)),
3875             (!cast<Instruction>(NAME # "_S") (PTRUE_S 31), ZPR:$Zs1, simm5_32b:$imm)>;
3876  def : Pat<(nxv2i1 (setcc (nxv2i64 ZPR:$Zs1),
3877                           (nxv2i64 (AArch64dup (simm5_64b:$imm))),
3878                           cc)),
3879            (!cast<Instruction>(NAME # "_D") (PTRUE_D 31), ZPR:$Zs1, simm5_64b:$imm)>;
3880
3881  // Intrinsic version
3882  def : Pat<(nxv16i1 (op (nxv16i1 PPR_3b:$Pg),
3883                         (nxv16i8 ZPR:$Zs1),
3884                         (nxv16i8 (AArch64dup (simm5_32b:$imm))))),
3885            (!cast<Instruction>(NAME # "_B") PPR_3b:$Pg, ZPR:$Zs1, simm5_32b:$imm)>;
3886  def : Pat<(nxv8i1 (op (nxv8i1 PPR_3b:$Pg),
3887                        (nxv8i16 ZPR:$Zs1),
3888                        (nxv8i16 (AArch64dup (simm5_32b:$imm))))),
3889            (!cast<Instruction>(NAME # "_H") PPR_3b:$Pg, ZPR:$Zs1, simm5_32b:$imm)>;
3890  def : Pat<(nxv4i1 (op (nxv4i1 PPR_3b:$Pg),
3891                        (nxv4i32 ZPR:$Zs1),
3892                        (nxv4i32 (AArch64dup (simm5_32b:$imm))))),
3893            (!cast<Instruction>(NAME # "_S") PPR_3b:$Pg, ZPR:$Zs1, simm5_32b:$imm)>;
3894  def : Pat<(nxv2i1 (op (nxv2i1 PPR_3b:$Pg),
3895                        (nxv2i64 ZPR:$Zs1),
3896                        (nxv2i64 (AArch64dup (simm5_64b:$imm))))),
3897            (!cast<Instruction>(NAME # "_D") PPR_3b:$Pg, ZPR:$Zs1, simm5_64b:$imm)>;
3898
3899  // Inverted intrinsic version
3900  def : Pat<(nxv16i1 (inv_op (nxv16i1 PPR_3b:$Pg),
3901                             (nxv16i8 (AArch64dup (simm5_32b:$imm))),
3902                             (nxv16i8 ZPR:$Zs1))),
3903            (!cast<Instruction>(NAME # "_B") PPR_3b:$Pg, ZPR:$Zs1, simm5_32b:$imm)>;
3904  def : Pat<(nxv8i1 (inv_op (nxv8i1 PPR_3b:$Pg),
3905                            (nxv8i16 (AArch64dup (simm5_32b:$imm))),
3906                            (nxv8i16 ZPR:$Zs1))),
3907            (!cast<Instruction>(NAME # "_H") PPR_3b:$Pg, ZPR:$Zs1, simm5_32b:$imm)>;
3908  def : Pat<(nxv4i1 (inv_op (nxv4i1 PPR_3b:$Pg),
3909                            (nxv4i32 (AArch64dup (simm5_32b:$imm))),
3910                            (nxv4i32 ZPR:$Zs1))),
3911            (!cast<Instruction>(NAME # "_S") PPR_3b:$Pg, ZPR:$Zs1, simm5_32b:$imm)>;
3912  def : Pat<(nxv2i1 (inv_op (nxv2i1 PPR_3b:$Pg),
3913                            (nxv2i64 (AArch64dup (simm5_64b:$imm))),
3914                            (nxv2i64 ZPR:$Zs1))),
3915            (!cast<Instruction>(NAME # "_D") PPR_3b:$Pg, ZPR:$Zs1, simm5_64b:$imm)>;
3916}
3917
3918
3919//===----------------------------------------------------------------------===//
3920// SVE Integer Compare - Unsigned Immediate Group
3921//===----------------------------------------------------------------------===//
3922
3923class sve_int_ucmp_vi<bits<2> sz8_64, bits<2> opc, string asm, PPRRegOp pprty,
3924                      ZPRRegOp zprty, Operand immtype>
3925: I<(outs pprty:$Pd), (ins PPR3bAny:$Pg, zprty:$Zn, immtype:$imm7),
3926  asm, "\t$Pd, $Pg/z, $Zn, $imm7",
3927  "",
3928  []>, Sched<[]> {
3929  bits<4> Pd;
3930  bits<3> Pg;
3931  bits<5> Zn;
3932  bits<7> imm7;
3933  let Inst{31-24} = 0b00100100;
3934  let Inst{23-22} = sz8_64;
3935  let Inst{21}    = 1;
3936  let Inst{20-14} = imm7;
3937  let Inst{13}    = opc{1};
3938  let Inst{12-10} = Pg;
3939  let Inst{9-5}   = Zn;
3940  let Inst{4}     = opc{0};
3941  let Inst{3-0}   = Pd;
3942
3943  let Defs = [NZCV];
3944}
3945
3946multiclass sve_int_ucmp_vi<bits<2> opc, string asm, CondCode cc,
3947                           SDPatternOperator op = null_frag,
3948                           SDPatternOperator inv_op = null_frag> {
3949  def _B : sve_int_ucmp_vi<0b00, opc, asm, PPR8, ZPR8, imm0_127>;
3950  def _H : sve_int_ucmp_vi<0b01, opc, asm, PPR16, ZPR16, imm0_127>;
3951  def _S : sve_int_ucmp_vi<0b10, opc, asm, PPR32, ZPR32, imm0_127>;
3952  def _D : sve_int_ucmp_vi<0b11, opc, asm, PPR64, ZPR64, imm0_127_64b>;
3953
3954  // IR version
3955  def : Pat<(nxv16i1 (setcc (nxv16i8 ZPR:$Zs1),
3956                            (nxv16i8 (AArch64dup (imm0_127:$imm))),
3957                            cc)),
3958            (!cast<Instruction>(NAME # "_B") (PTRUE_B 31), ZPR:$Zs1, imm0_127:$imm)>;
3959  def : Pat<(nxv8i1 (setcc (nxv8i16 ZPR:$Zs1),
3960                           (nxv8i16 (AArch64dup (imm0_127:$imm))),
3961                           cc)),
3962            (!cast<Instruction>(NAME # "_H") (PTRUE_H 31), ZPR:$Zs1, imm0_127:$imm)>;
3963  def : Pat<(nxv4i1 (setcc (nxv4i32 ZPR:$Zs1),
3964                           (nxv4i32 (AArch64dup (imm0_127:$imm))),
3965                           cc)),
3966            (!cast<Instruction>(NAME # "_S") (PTRUE_S 31), ZPR:$Zs1, imm0_127:$imm)>;
3967  def : Pat<(nxv2i1 (setcc (nxv2i64 ZPR:$Zs1),
3968                           (nxv2i64 (AArch64dup (imm0_127_64b:$imm))),
3969                           cc)),
3970            (!cast<Instruction>(NAME # "_D") (PTRUE_D 31), ZPR:$Zs1, imm0_127_64b:$imm)>;
3971
3972  // Intrinsic version
3973  def : Pat<(nxv16i1 (op (nxv16i1 PPR_3b:$Pg),
3974                         (nxv16i8 ZPR:$Zs1),
3975                         (nxv16i8 (AArch64dup (imm0_127:$imm))))),
3976            (!cast<Instruction>(NAME # "_B") PPR_3b:$Pg, ZPR:$Zs1, imm0_127:$imm)>;
3977  def : Pat<(nxv8i1 (op (nxv8i1 PPR_3b:$Pg),
3978                        (nxv8i16 ZPR:$Zs1),
3979                        (nxv8i16 (AArch64dup (imm0_127:$imm))))),
3980            (!cast<Instruction>(NAME # "_H") PPR_3b:$Pg, ZPR:$Zs1, imm0_127:$imm)>;
3981  def : Pat<(nxv4i1 (op (nxv4i1 PPR_3b:$Pg),
3982                        (nxv4i32 ZPR:$Zs1),
3983                        (nxv4i32 (AArch64dup (imm0_127:$imm))))),
3984            (!cast<Instruction>(NAME # "_S") PPR_3b:$Pg, ZPR:$Zs1, imm0_127:$imm)>;
3985  def : Pat<(nxv2i1 (op (nxv2i1 PPR_3b:$Pg),
3986                        (nxv2i64 ZPR:$Zs1),
3987                        (nxv2i64 (AArch64dup (imm0_127_64b:$imm))))),
3988            (!cast<Instruction>(NAME # "_D") PPR_3b:$Pg, ZPR:$Zs1, imm0_127_64b:$imm)>;
3989
3990  // Inverted intrinsic version
3991  def : Pat<(nxv16i1 (inv_op (nxv16i1 PPR_3b:$Pg),
3992                             (nxv16i8 (AArch64dup (imm0_127:$imm))),
3993                             (nxv16i8 ZPR:$Zs1))),
3994            (!cast<Instruction>(NAME # "_B") PPR_3b:$Pg, ZPR:$Zs1, imm0_127:$imm)>;
3995  def : Pat<(nxv8i1 (inv_op (nxv8i1 PPR_3b:$Pg),
3996                            (nxv8i16 (AArch64dup (imm0_127:$imm))),
3997                            (nxv8i16 ZPR:$Zs1))),
3998            (!cast<Instruction>(NAME # "_H") PPR_3b:$Pg, ZPR:$Zs1, imm0_127:$imm)>;
3999  def : Pat<(nxv4i1 (inv_op (nxv4i1 PPR_3b:$Pg),
4000                            (nxv4i32 (AArch64dup (imm0_127:$imm))),
4001                            (nxv4i32 ZPR:$Zs1))),
4002            (!cast<Instruction>(NAME # "_S") PPR_3b:$Pg, ZPR:$Zs1, imm0_127:$imm)>;
4003  def : Pat<(nxv2i1 (inv_op (nxv2i1 PPR_3b:$Pg),
4004                            (nxv2i64 (AArch64dup (imm0_127_64b:$imm))),
4005                            (nxv2i64 ZPR:$Zs1))),
4006            (!cast<Instruction>(NAME # "_D") PPR_3b:$Pg, ZPR:$Zs1, imm0_127_64b:$imm)>;
4007}
4008
4009
4010//===----------------------------------------------------------------------===//
4011// SVE Integer Compare - Scalars Group
4012//===----------------------------------------------------------------------===//
4013
4014class sve_int_cterm<bit sz, bit opc, string asm, RegisterClass rt>
4015: I<(outs), (ins rt:$Rn, rt:$Rm),
4016  asm, "\t$Rn, $Rm",
4017  "",
4018  []>, Sched<[]> {
4019  bits<5> Rm;
4020  bits<5> Rn;
4021  let Inst{31-23} = 0b001001011;
4022  let Inst{22}    = sz;
4023  let Inst{21}    = 0b1;
4024  let Inst{20-16} = Rm;
4025  let Inst{15-10} = 0b001000;
4026  let Inst{9-5}   = Rn;
4027  let Inst{4}     = opc;
4028  let Inst{3-0}   = 0b0000;
4029
4030  let Defs = [NZCV];
4031}
4032
4033class sve_int_while_rr<bits<2> sz8_64, bits<4> opc, string asm,
4034                       RegisterClass gprty, PPRRegOp pprty,
4035                       ValueType vt, SDPatternOperator op>
4036: I<(outs pprty:$Pd), (ins gprty:$Rn, gprty:$Rm),
4037  asm, "\t$Pd, $Rn, $Rm",
4038  "", []>, Sched<[]> {
4039  bits<4> Pd;
4040  bits<5> Rm;
4041  bits<5> Rn;
4042  let Inst{31-24} = 0b00100101;
4043  let Inst{23-22} = sz8_64;
4044  let Inst{21}    = 0b1;
4045  let Inst{20-16} = Rm;
4046  let Inst{15-13} = 0b000;
4047  let Inst{12-10} = opc{3-1};
4048  let Inst{9-5}   = Rn;
4049  let Inst{4}     = opc{0};
4050  let Inst{3-0}   = Pd;
4051
4052  let Defs = [NZCV];
4053}
4054
4055multiclass sve_int_while4_rr<bits<3> opc, string asm, SDPatternOperator op> {
4056  def _B : sve_int_while_rr<0b00, { 0, opc }, asm, GPR32, PPR8, nxv16i1, op>;
4057  def _H : sve_int_while_rr<0b01, { 0, opc }, asm, GPR32, PPR16, nxv8i1, op>;
4058  def _S : sve_int_while_rr<0b10, { 0, opc }, asm, GPR32, PPR32, nxv4i1, op>;
4059  def _D : sve_int_while_rr<0b11, { 0, opc }, asm, GPR32, PPR64, nxv2i1, op>;
4060
4061  def : SVE_2_Op_Pat<nxv16i1, op, i32, i32, !cast<Instruction>(NAME # _B)>;
4062  def : SVE_2_Op_Pat<nxv8i1, op, i32, i32, !cast<Instruction>(NAME # _H)>;
4063  def : SVE_2_Op_Pat<nxv4i1, op, i32, i32, !cast<Instruction>(NAME # _S)>;
4064  def : SVE_2_Op_Pat<nxv2i1, op, i32, i32, !cast<Instruction>(NAME # _D)>;
4065}
4066
4067multiclass sve_int_while8_rr<bits<3> opc, string asm, SDPatternOperator op> {
4068  def _B : sve_int_while_rr<0b00, { 1, opc }, asm, GPR64, PPR8, nxv16i1, op>;
4069  def _H : sve_int_while_rr<0b01, { 1, opc }, asm, GPR64, PPR16, nxv8i1, op>;
4070  def _S : sve_int_while_rr<0b10, { 1, opc }, asm, GPR64, PPR32, nxv4i1, op>;
4071  def _D : sve_int_while_rr<0b11, { 1, opc }, asm, GPR64, PPR64, nxv2i1, op>;
4072
4073  def : SVE_2_Op_Pat<nxv16i1, op, i64, i64, !cast<Instruction>(NAME # _B)>;
4074  def : SVE_2_Op_Pat<nxv8i1, op, i64, i64, !cast<Instruction>(NAME # _H)>;
4075  def : SVE_2_Op_Pat<nxv4i1, op, i64, i64, !cast<Instruction>(NAME # _S)>;
4076  def : SVE_2_Op_Pat<nxv2i1, op, i64, i64, !cast<Instruction>(NAME # _D)>;
4077}
4078
4079class sve2_int_while_rr<bits<2> sz8_64, bits<1> rw, string asm,
4080                        PPRRegOp pprty>
4081: I<(outs pprty:$Pd), (ins GPR64:$Rn, GPR64:$Rm),
4082  asm, "\t$Pd, $Rn, $Rm",
4083  "", []>, Sched<[]> {
4084  bits<4> Pd;
4085  bits<5> Rm;
4086  bits<5> Rn;
4087  let Inst{31-24} = 0b00100101;
4088  let Inst{23-22} = sz8_64;
4089  let Inst{21}    = 0b1;
4090  let Inst{20-16} = Rm;
4091  let Inst{15-10} = 0b001100;
4092  let Inst{9-5}   = Rn;
4093  let Inst{4}     = rw;
4094  let Inst{3-0}   = Pd;
4095
4096  let Defs = [NZCV];
4097}
4098
4099multiclass sve2_int_while_rr<bits<1> rw, string asm> {
4100  def _B : sve2_int_while_rr<0b00, rw, asm, PPR8>;
4101  def _H : sve2_int_while_rr<0b01, rw, asm, PPR16>;
4102  def _S : sve2_int_while_rr<0b10, rw, asm, PPR32>;
4103  def _D : sve2_int_while_rr<0b11, rw, asm, PPR64>;
4104}
4105
4106//===----------------------------------------------------------------------===//
4107// SVE Floating Point Fast Reduction Group
4108//===----------------------------------------------------------------------===//
4109
4110class sve_fp_fast_red<bits<2> sz, bits<3> opc, string asm,
4111                      ZPRRegOp zprty, RegisterClass dstRegClass>
4112: I<(outs dstRegClass:$Vd), (ins PPR3bAny:$Pg, zprty:$Zn),
4113  asm, "\t$Vd, $Pg, $Zn",
4114  "",
4115  []>, Sched<[]> {
4116  bits<5> Zn;
4117  bits<5> Vd;
4118  bits<3> Pg;
4119  let Inst{31-24} = 0b01100101;
4120  let Inst{23-22} = sz;
4121  let Inst{21-19} = 0b000;
4122  let Inst{18-16} = opc;
4123  let Inst{15-13} = 0b001;
4124  let Inst{12-10} = Pg;
4125  let Inst{9-5}   = Zn;
4126  let Inst{4-0}   = Vd;
4127}
4128
4129multiclass sve_fp_fast_red<bits<3> opc, string asm, SDPatternOperator op> {
4130  def _H : sve_fp_fast_red<0b01, opc, asm, ZPR16, FPR16>;
4131  def _S : sve_fp_fast_red<0b10, opc, asm, ZPR32, FPR32>;
4132  def _D : sve_fp_fast_red<0b11, opc, asm, ZPR64, FPR64>;
4133
4134  def : SVE_2_Op_Pat<f16, op, nxv8i1, nxv8f16, !cast<Instruction>(NAME # _H)>;
4135  def : SVE_2_Op_Pat<f32, op, nxv4i1, nxv4f32, !cast<Instruction>(NAME # _S)>;
4136  def : SVE_2_Op_Pat<f64, op, nxv2i1, nxv2f64, !cast<Instruction>(NAME # _D)>;
4137}
4138
4139
4140//===----------------------------------------------------------------------===//
4141// SVE Floating Point Accumulating Reduction Group
4142//===----------------------------------------------------------------------===//
4143
4144class sve_fp_2op_p_vd<bits<2> sz, bits<3> opc, string asm,
4145                      ZPRRegOp zprty, RegisterClass dstRegClass>
4146: I<(outs dstRegClass:$Vdn), (ins PPR3bAny:$Pg, dstRegClass:$_Vdn, zprty:$Zm),
4147  asm, "\t$Vdn, $Pg, $_Vdn, $Zm",
4148  "",
4149  []>,
4150  Sched<[]> {
4151  bits<3> Pg;
4152  bits<5> Vdn;
4153  bits<5> Zm;
4154  let Inst{31-24} = 0b01100101;
4155  let Inst{23-22} = sz;
4156  let Inst{21-19} = 0b011;
4157  let Inst{18-16} = opc;
4158  let Inst{15-13} = 0b001;
4159  let Inst{12-10} = Pg;
4160  let Inst{9-5}   = Zm;
4161  let Inst{4-0}   = Vdn;
4162
4163  let Constraints = "$Vdn = $_Vdn";
4164}
4165
4166multiclass sve_fp_2op_p_vd<bits<3> opc, string asm, SDPatternOperator op> {
4167  def _H : sve_fp_2op_p_vd<0b01, opc, asm, ZPR16, FPR16>;
4168  def _S : sve_fp_2op_p_vd<0b10, opc, asm, ZPR32, FPR32>;
4169  def _D : sve_fp_2op_p_vd<0b11, opc, asm, ZPR64, FPR64>;
4170
4171  def : SVE_3_Op_Pat<f16, op, nxv8i1, f16, nxv8f16, !cast<Instruction>(NAME # _H)>;
4172  def : SVE_3_Op_Pat<f32, op, nxv4i1, f32, nxv4f32, !cast<Instruction>(NAME # _S)>;
4173  def : SVE_3_Op_Pat<f64, op, nxv2i1, f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
4174}
4175
4176//===----------------------------------------------------------------------===//
4177// SVE Floating Point Compare - Vectors Group
4178//===----------------------------------------------------------------------===//
4179
4180class sve_fp_3op_p_pd<bits<2> sz, bits<3> opc, string asm, PPRRegOp pprty,
4181                      ZPRRegOp zprty>
4182: I<(outs pprty:$Pd), (ins PPR3bAny:$Pg, zprty:$Zn, zprty:$Zm),
4183  asm, "\t$Pd, $Pg/z, $Zn, $Zm",
4184  "",
4185  []>, Sched<[]> {
4186  bits<4> Pd;
4187  bits<3> Pg;
4188  bits<5> Zm;
4189  bits<5> Zn;
4190  let Inst{31-24} = 0b01100101;
4191  let Inst{23-22} = sz;
4192  let Inst{21}    = 0b0;
4193  let Inst{20-16} = Zm;
4194  let Inst{15}    = opc{2};
4195  let Inst{14}    = 0b1;
4196  let Inst{13}    = opc{1};
4197  let Inst{12-10} = Pg;
4198  let Inst{9-5}   = Zn;
4199  let Inst{4}     = opc{0};
4200  let Inst{3-0}   = Pd;
4201}
4202
4203multiclass sve_fp_3op_p_pd<bits<3> opc, string asm, SDPatternOperator op> {
4204  def _H : sve_fp_3op_p_pd<0b01, opc, asm, PPR16, ZPR16>;
4205  def _S : sve_fp_3op_p_pd<0b10, opc, asm, PPR32, ZPR32>;
4206  def _D : sve_fp_3op_p_pd<0b11, opc, asm, PPR64, ZPR64>;
4207
4208  def : SVE_3_Op_Pat<nxv8i1, op, nxv8i1, nxv8f16, nxv8f16, !cast<Instruction>(NAME # _H)>;
4209  def : SVE_3_Op_Pat<nxv4i1, op, nxv4i1, nxv4f32, nxv4f32, !cast<Instruction>(NAME # _S)>;
4210  def : SVE_3_Op_Pat<nxv2i1, op, nxv2i1, nxv2f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
4211}
4212
4213
4214//===----------------------------------------------------------------------===//
4215// SVE Floating Point Compare - with Zero Group
4216//===----------------------------------------------------------------------===//
4217
4218class sve_fp_2op_p_pd<bits<2> sz, bits<3> opc, string asm, PPRRegOp pprty,
4219                      ZPRRegOp zprty>
4220: I<(outs pprty:$Pd), (ins PPR3bAny:$Pg, zprty:$Zn),
4221  asm, "\t$Pd, $Pg/z, $Zn, #0.0",
4222  "",
4223  []>, Sched<[]> {
4224  bits<4> Pd;
4225  bits<3> Pg;
4226  bits<5> Zn;
4227  let Inst{31-24} = 0b01100101;
4228  let Inst{23-22} = sz;
4229  let Inst{21-18} = 0b0100;
4230  let Inst{17-16} = opc{2-1};
4231  let Inst{15-13} = 0b001;
4232  let Inst{12-10} = Pg;
4233  let Inst{9-5}   = Zn;
4234  let Inst{4}     = opc{0};
4235  let Inst{3-0}   = Pd;
4236}
4237
4238multiclass sve_fp_2op_p_pd<bits<3> opc, string asm> {
4239  def _H : sve_fp_2op_p_pd<0b01, opc, asm, PPR16, ZPR16>;
4240  def _S : sve_fp_2op_p_pd<0b10, opc, asm, PPR32, ZPR32>;
4241  def _D : sve_fp_2op_p_pd<0b11, opc, asm, PPR64, ZPR64>;
4242}
4243
4244
4245//===----------------------------------------------------------------------===//
4246//SVE Index Generation Group
4247//===----------------------------------------------------------------------===//
4248
4249class sve_int_index_ii<bits<2> sz8_64, string asm, ZPRRegOp zprty,
4250                       Operand imm_ty>
4251: I<(outs zprty:$Zd), (ins imm_ty:$imm5, imm_ty:$imm5b),
4252  asm, "\t$Zd, $imm5, $imm5b",
4253  "", []>, Sched<[]> {
4254  bits<5> Zd;
4255  bits<5> imm5;
4256  bits<5> imm5b;
4257  let Inst{31-24} = 0b00000100;
4258  let Inst{23-22} = sz8_64;
4259  let Inst{21}    = 0b1;
4260  let Inst{20-16} = imm5b;
4261  let Inst{15-10} = 0b010000;
4262  let Inst{9-5}   = imm5;
4263  let Inst{4-0}   = Zd;
4264}
4265
4266multiclass sve_int_index_ii<string asm> {
4267  def _B : sve_int_index_ii<0b00, asm, ZPR8, simm5_32b>;
4268  def _H : sve_int_index_ii<0b01, asm, ZPR16, simm5_32b>;
4269  def _S : sve_int_index_ii<0b10, asm, ZPR32, simm5_32b>;
4270  def _D : sve_int_index_ii<0b11, asm, ZPR64, simm5_64b>;
4271}
4272
4273class sve_int_index_ir<bits<2> sz8_64, string asm, ZPRRegOp zprty,
4274                       RegisterClass srcRegType, Operand imm_ty>
4275: I<(outs zprty:$Zd), (ins imm_ty:$imm5, srcRegType:$Rm),
4276  asm, "\t$Zd, $imm5, $Rm",
4277  "", []>, Sched<[]> {
4278  bits<5> Rm;
4279  bits<5> Zd;
4280  bits<5> imm5;
4281  let Inst{31-24} = 0b00000100;
4282  let Inst{23-22} = sz8_64;
4283  let Inst{21}    = 0b1;
4284  let Inst{20-16} = Rm;
4285  let Inst{15-10} = 0b010010;
4286  let Inst{9-5}   = imm5;
4287  let Inst{4-0}   = Zd;
4288}
4289
4290multiclass sve_int_index_ir<string asm> {
4291  def _B : sve_int_index_ir<0b00, asm, ZPR8, GPR32, simm5_32b>;
4292  def _H : sve_int_index_ir<0b01, asm, ZPR16, GPR32, simm5_32b>;
4293  def _S : sve_int_index_ir<0b10, asm, ZPR32, GPR32, simm5_32b>;
4294  def _D : sve_int_index_ir<0b11, asm, ZPR64, GPR64, simm5_64b>;
4295}
4296
4297class sve_int_index_ri<bits<2> sz8_64, string asm, ZPRRegOp zprty,
4298                       RegisterClass srcRegType, Operand imm_ty>
4299: I<(outs zprty:$Zd), (ins srcRegType:$Rn, imm_ty:$imm5),
4300  asm, "\t$Zd, $Rn, $imm5",
4301  "", []>, Sched<[]> {
4302  bits<5> Rn;
4303  bits<5> Zd;
4304  bits<5> imm5;
4305  let Inst{31-24} = 0b00000100;
4306  let Inst{23-22} = sz8_64;
4307  let Inst{21}    = 0b1;
4308  let Inst{20-16} = imm5;
4309  let Inst{15-10} = 0b010001;
4310  let Inst{9-5}   = Rn;
4311  let Inst{4-0}   = Zd;
4312}
4313
4314multiclass sve_int_index_ri<string asm> {
4315  def _B : sve_int_index_ri<0b00, asm, ZPR8, GPR32, simm5_32b>;
4316  def _H : sve_int_index_ri<0b01, asm, ZPR16, GPR32, simm5_32b>;
4317  def _S : sve_int_index_ri<0b10, asm, ZPR32, GPR32, simm5_32b>;
4318  def _D : sve_int_index_ri<0b11, asm, ZPR64, GPR64, simm5_64b>;
4319}
4320
4321class sve_int_index_rr<bits<2> sz8_64, string asm, ZPRRegOp zprty,
4322                       RegisterClass srcRegType>
4323: I<(outs zprty:$Zd), (ins srcRegType:$Rn, srcRegType:$Rm),
4324  asm, "\t$Zd, $Rn, $Rm",
4325  "", []>, Sched<[]> {
4326  bits<5> Zd;
4327  bits<5> Rm;
4328  bits<5> Rn;
4329  let Inst{31-24} = 0b00000100;
4330  let Inst{23-22} = sz8_64;
4331  let Inst{21}    = 0b1;
4332  let Inst{20-16} = Rm;
4333  let Inst{15-10} = 0b010011;
4334  let Inst{9-5}   = Rn;
4335  let Inst{4-0}   = Zd;
4336}
4337
4338multiclass sve_int_index_rr<string asm> {
4339  def _B : sve_int_index_rr<0b00, asm, ZPR8, GPR32>;
4340  def _H : sve_int_index_rr<0b01, asm, ZPR16, GPR32>;
4341  def _S : sve_int_index_rr<0b10, asm, ZPR32, GPR32>;
4342  def _D : sve_int_index_rr<0b11, asm, ZPR64, GPR64>;
4343}
4344//
4345//===----------------------------------------------------------------------===//
4346// SVE Bitwise Shift - Predicated Group
4347//===----------------------------------------------------------------------===//
4348class sve_int_bin_pred_shift_imm<bits<4> tsz8_64, bits<4> opc, string asm,
4349                                 ZPRRegOp zprty, Operand immtype,
4350                                 ElementSizeEnum size>
4351: I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, immtype:$imm),
4352  asm, "\t$Zdn, $Pg/m, $_Zdn, $imm",
4353  "",
4354  []>, Sched<[]> {
4355  bits<3> Pg;
4356  bits<5> Zdn;
4357  bits<6> imm;
4358  let Inst{31-24} = 0b00000100;
4359  let Inst{23-22} = tsz8_64{3-2};
4360  let Inst{21-20} = 0b00;
4361  let Inst{19-16} = opc;
4362  let Inst{15-13} = 0b100;
4363  let Inst{12-10} = Pg;
4364  let Inst{9-8}   = tsz8_64{1-0};
4365  let Inst{7-5}   = imm{2-0}; // imm3
4366  let Inst{4-0}   = Zdn;
4367
4368  let Constraints = "$Zdn = $_Zdn";
4369  let DestructiveInstType = Destructive;
4370  let ElementSize = size;
4371}
4372
4373multiclass sve_int_bin_pred_shift_imm_left<bits<4> opc, string asm> {
4374  def _B : sve_int_bin_pred_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftL8,
4375                                      ElementSizeB>;
4376  def _H : sve_int_bin_pred_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftL16,
4377                                      ElementSizeH> {
4378    let Inst{8} = imm{3};
4379  }
4380  def _S : sve_int_bin_pred_shift_imm<{0,1,?,?}, opc, asm, ZPR32, vecshiftL32,
4381                                      ElementSizeS> {
4382    let Inst{9-8} = imm{4-3};
4383  }
4384  def _D : sve_int_bin_pred_shift_imm<{1,?,?,?}, opc, asm, ZPR64, vecshiftL64,
4385                                      ElementSizeD> {
4386    let Inst{22}  = imm{5};
4387    let Inst{9-8} = imm{4-3};
4388  }
4389}
4390
4391multiclass sve_int_bin_pred_shift_imm_right<bits<4> opc, string asm,
4392                                            SDPatternOperator op = null_frag> {
4393  def _B : sve_int_bin_pred_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftR8,
4394                                      ElementSizeB>;
4395  def _H : sve_int_bin_pred_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftR16,
4396                                      ElementSizeH> {
4397    let Inst{8} = imm{3};
4398  }
4399  def _S : sve_int_bin_pred_shift_imm<{0,1,?,?}, opc, asm, ZPR32, vecshiftR32,
4400                                      ElementSizeS> {
4401    let Inst{9-8} = imm{4-3};
4402  }
4403  def _D : sve_int_bin_pred_shift_imm<{1,?,?,?}, opc, asm, ZPR64, vecshiftR64,
4404                                      ElementSizeD> {
4405    let Inst{22}  = imm{5};
4406    let Inst{9-8} = imm{4-3};
4407  }
4408
4409  def : SVE_3_Op_Imm_Pat<nxv16i8, op, nxv16i1, nxv16i8, i32, vecshiftR8,  !cast<Instruction>(NAME # _B)>;
4410  def : SVE_3_Op_Imm_Pat<nxv8i16, op, nxv8i1,  nxv8i16, i32, vecshiftR16, !cast<Instruction>(NAME # _H)>;
4411  def : SVE_3_Op_Imm_Pat<nxv4i32, op, nxv4i1,  nxv4i32, i32, vecshiftR32, !cast<Instruction>(NAME # _S)>;
4412  def : SVE_3_Op_Imm_Pat<nxv2i64, op, nxv2i1,  nxv2i64, i32, vecshiftR64, !cast<Instruction>(NAME # _D)>;
4413}
4414
4415class sve_int_bin_pred_shift<bits<2> sz8_64, bit wide, bits<3> opc,
4416                             string asm, ZPRRegOp zprty, ZPRRegOp zprty2>
4417: I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, zprty2:$Zm),
4418  asm, "\t$Zdn, $Pg/m, $_Zdn, $Zm",
4419  "",
4420  []>, Sched<[]> {
4421  bits<3> Pg;
4422  bits<5> Zdn;
4423  bits<5> Zm;
4424  let Inst{31-24} = 0b00000100;
4425  let Inst{23-22} = sz8_64;
4426  let Inst{21-20} = 0b01;
4427  let Inst{19}    = wide;
4428  let Inst{18-16} = opc;
4429  let Inst{15-13} = 0b100;
4430  let Inst{12-10} = Pg;
4431  let Inst{9-5}   = Zm;
4432  let Inst{4-0}   = Zdn;
4433
4434  let Constraints = "$Zdn = $_Zdn";
4435  let DestructiveInstType = Destructive;
4436  let ElementSize = zprty.ElementSize;
4437}
4438
4439multiclass sve_int_bin_pred_shift<bits<3> opc, string asm,
4440                                  SDPatternOperator op> {
4441  def _B : sve_int_bin_pred_shift<0b00, 0b0, opc, asm, ZPR8, ZPR8>;
4442  def _H : sve_int_bin_pred_shift<0b01, 0b0, opc, asm, ZPR16, ZPR16>;
4443  def _S : sve_int_bin_pred_shift<0b10, 0b0, opc, asm, ZPR32, ZPR32>;
4444  def _D : sve_int_bin_pred_shift<0b11, 0b0, opc, asm, ZPR64, ZPR64>;
4445
4446  def : SVE_3_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
4447  def : SVE_3_Op_Pat<nxv8i16, op, nxv8i1,  nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
4448  def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1,  nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
4449  def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1,  nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
4450}
4451
4452multiclass sve_int_bin_pred_shift_wide<bits<3> opc, string asm,
4453                                  SDPatternOperator op> {
4454  def _B : sve_int_bin_pred_shift<0b00, 0b1, opc, asm, ZPR8, ZPR64>;
4455  def _H : sve_int_bin_pred_shift<0b01, 0b1, opc, asm, ZPR16, ZPR64>;
4456  def _S : sve_int_bin_pred_shift<0b10, 0b1, opc, asm, ZPR32, ZPR64>;
4457
4458  def : SVE_3_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv2i64, !cast<Instruction>(NAME # _B)>;
4459  def : SVE_3_Op_Pat<nxv8i16, op, nxv8i1,  nxv8i16, nxv2i64, !cast<Instruction>(NAME # _H)>;
4460  def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1,  nxv4i32, nxv2i64, !cast<Instruction>(NAME # _S)>;
4461}
4462
4463//===----------------------------------------------------------------------===//
4464// SVE Shift - Unpredicated Group
4465//===----------------------------------------------------------------------===//
4466
4467class sve_int_bin_cons_shift_wide<bits<2> sz8_64, bits<2> opc, string asm,
4468                               ZPRRegOp zprty>
4469: I<(outs zprty:$Zd), (ins zprty:$Zn, ZPR64:$Zm),
4470  asm, "\t$Zd, $Zn, $Zm",
4471  "",
4472  []>, Sched<[]> {
4473  bits<5> Zd;
4474  bits<5> Zm;
4475  bits<5> Zn;
4476  let Inst{31-24} = 0b00000100;
4477  let Inst{23-22} = sz8_64;
4478  let Inst{21}    = 0b1;
4479  let Inst{20-16} = Zm;
4480  let Inst{15-12} = 0b1000;
4481  let Inst{11-10} = opc;
4482  let Inst{9-5}   = Zn;
4483  let Inst{4-0}   = Zd;
4484}
4485
4486multiclass sve_int_bin_cons_shift_wide<bits<2> opc, string asm> {
4487  def _B : sve_int_bin_cons_shift_wide<0b00, opc, asm, ZPR8>;
4488  def _H : sve_int_bin_cons_shift_wide<0b01, opc, asm, ZPR16>;
4489  def _S : sve_int_bin_cons_shift_wide<0b10, opc, asm, ZPR32>;
4490}
4491
4492class sve_int_bin_cons_shift_imm<bits<4> tsz8_64, bits<2> opc, string asm,
4493                               ZPRRegOp zprty, Operand immtype>
4494: I<(outs zprty:$Zd), (ins zprty:$Zn, immtype:$imm),
4495  asm, "\t$Zd, $Zn, $imm",
4496  "", []>, Sched<[]> {
4497  bits<5> Zd;
4498  bits<5> Zn;
4499  bits<6> imm;
4500  let Inst{31-24} = 0b00000100;
4501  let Inst{23-22} = tsz8_64{3-2};
4502  let Inst{21}    = 0b1;
4503  let Inst{20-19} = tsz8_64{1-0};
4504  let Inst{18-16} = imm{2-0}; // imm3
4505  let Inst{15-12} = 0b1001;
4506  let Inst{11-10} = opc;
4507  let Inst{9-5}   = Zn;
4508  let Inst{4-0}   = Zd;
4509}
4510
4511multiclass sve_int_bin_cons_shift_imm_left<bits<2> opc, string asm> {
4512  def _B : sve_int_bin_cons_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftL8>;
4513  def _H : sve_int_bin_cons_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftL16> {
4514    let Inst{19} = imm{3};
4515  }
4516  def _S : sve_int_bin_cons_shift_imm<{0,1,?,?}, opc, asm, ZPR32, vecshiftL32> {
4517    let Inst{20-19} = imm{4-3};
4518  }
4519  def _D : sve_int_bin_cons_shift_imm<{1,?,?,?}, opc, asm, ZPR64, vecshiftL64> {
4520    let Inst{22}    = imm{5};
4521    let Inst{20-19} = imm{4-3};
4522  }
4523}
4524
4525multiclass sve_int_bin_cons_shift_imm_right<bits<2> opc, string asm> {
4526  def _B : sve_int_bin_cons_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftR8>;
4527  def _H : sve_int_bin_cons_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftR16> {
4528    let Inst{19} = imm{3};
4529  }
4530  def _S : sve_int_bin_cons_shift_imm<{0,1,?,?}, opc, asm, ZPR32, vecshiftR32> {
4531    let Inst{20-19} = imm{4-3};
4532  }
4533  def _D : sve_int_bin_cons_shift_imm<{1,?,?,?}, opc, asm, ZPR64, vecshiftR64> {
4534    let Inst{22}    = imm{5};
4535    let Inst{20-19} = imm{4-3};
4536  }
4537}
4538//===----------------------------------------------------------------------===//
4539// SVE Memory - Store Group
4540//===----------------------------------------------------------------------===//
4541
4542class sve_mem_cst_si<bits<2> msz, bits<2> esz, string asm,
4543                     RegisterOperand VecList>
4544: I<(outs), (ins VecList:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, simm4s1:$imm4),
4545  asm, "\t$Zt, $Pg, [$Rn, $imm4, mul vl]",
4546  "",
4547  []>, Sched<[]> {
4548  bits<3> Pg;
4549  bits<5> Rn;
4550  bits<5> Zt;
4551  bits<4> imm4;
4552  let Inst{31-25} = 0b1110010;
4553  let Inst{24-23} = msz;
4554  let Inst{22-21} = esz;
4555  let Inst{20}    = 0;
4556  let Inst{19-16} = imm4;
4557  let Inst{15-13} = 0b111;
4558  let Inst{12-10} = Pg;
4559  let Inst{9-5}   = Rn;
4560  let Inst{4-0}   = Zt;
4561
4562  let mayStore = 1;
4563}
4564
4565multiclass sve_mem_cst_si<bits<2> msz, bits<2> esz, string asm,
4566                          RegisterOperand listty, ZPRRegOp zprty>
4567{
4568  def NAME : sve_mem_cst_si<msz, esz, asm, listty>;
4569
4570  def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $imm4, mul vl]",
4571                 (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, simm4s1:$imm4), 0>;
4572  def : InstAlias<asm # "\t$Zt, $Pg, [$Rn]",
4573                  (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 0>;
4574  def : InstAlias<asm # "\t$Zt, $Pg, [$Rn]",
4575                  (!cast<Instruction>(NAME) listty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
4576}
4577
4578class sve_mem_est_si<bits<2> sz, bits<2> nregs, RegisterOperand VecList,
4579                     string asm, Operand immtype>
4580: I<(outs), (ins VecList:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, immtype:$imm4),
4581  asm, "\t$Zt, $Pg, [$Rn, $imm4, mul vl]",
4582  "",
4583  []>, Sched<[]> {
4584  bits<3> Pg;
4585  bits<5> Rn;
4586  bits<5> Zt;
4587  bits<4> imm4;
4588  let Inst{31-25} = 0b1110010;
4589  let Inst{24-23} = sz;
4590  let Inst{22-21} = nregs;
4591  let Inst{20}    = 1;
4592  let Inst{19-16} = imm4;
4593  let Inst{15-13} = 0b111;
4594  let Inst{12-10} = Pg;
4595  let Inst{9-5}   = Rn;
4596  let Inst{4-0}   = Zt;
4597
4598  let mayStore = 1;
4599}
4600
4601multiclass sve_mem_est_si<bits<2> sz, bits<2> nregs, RegisterOperand VecList,
4602                          string asm, Operand immtype> {
4603  def NAME : sve_mem_est_si<sz, nregs, VecList, asm, immtype>;
4604
4605  def : InstAlias<asm # "\t$Zt, $Pg, [$Rn]",
4606                  (!cast<Instruction>(NAME) VecList:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
4607}
4608
4609class sve_mem_est_ss<bits<2> sz, bits<2> nregs, RegisterOperand VecList,
4610                     string asm, RegisterOperand gprty>
4611: I<(outs), (ins VecList:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
4612  asm, "\t$Zt, $Pg, [$Rn, $Rm]",
4613  "",
4614  []>, Sched<[]> {
4615  bits<3> Pg;
4616  bits<5> Rm;
4617  bits<5> Rn;
4618  bits<5> Zt;
4619  let Inst{31-25} = 0b1110010;
4620  let Inst{24-23} = sz;
4621  let Inst{22-21} = nregs;
4622  let Inst{20-16} = Rm;
4623  let Inst{15-13} = 0b011;
4624  let Inst{12-10} = Pg;
4625  let Inst{9-5}   = Rn;
4626  let Inst{4-0}   = Zt;
4627
4628  let mayStore = 1;
4629}
4630
4631class sve_mem_cst_ss_base<bits<4> dtype, string asm,
4632                          RegisterOperand listty, RegisterOperand gprty>
4633: I<(outs), (ins listty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
4634  asm, "\t$Zt, $Pg, [$Rn, $Rm]",
4635  "",
4636  []>, Sched<[]> {
4637  bits<3> Pg;
4638  bits<5> Rm;
4639  bits<5> Rn;
4640  bits<5> Zt;
4641  let Inst{31-25} = 0b1110010;
4642  let Inst{24-21} = dtype;
4643  let Inst{20-16} = Rm;
4644  let Inst{15-13} = 0b010;
4645  let Inst{12-10} = Pg;
4646  let Inst{9-5}   = Rn;
4647  let Inst{4-0}   = Zt;
4648
4649  let mayStore = 1;
4650}
4651
4652multiclass sve_mem_cst_ss<bits<4> dtype, string asm,
4653                          RegisterOperand listty, ZPRRegOp zprty,
4654                          RegisterOperand gprty> {
4655  def NAME : sve_mem_cst_ss_base<dtype, asm, listty, gprty>;
4656
4657  def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Rm]",
4658                  (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm), 0>;
4659}
4660
4661class sve_mem_cstnt_si<bits<2> msz, string asm, RegisterOperand VecList>
4662: I<(outs), (ins VecList:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, simm4s1:$imm4),
4663  asm, "\t$Zt, $Pg, [$Rn, $imm4, mul vl]",
4664  "",
4665  []>, Sched<[]> {
4666  bits<3> Pg;
4667  bits<5> Rn;
4668  bits<5> Zt;
4669  bits<4> imm4;
4670  let Inst{31-25} = 0b1110010;
4671  let Inst{24-23} = msz;
4672  let Inst{22-20} = 0b001;
4673  let Inst{19-16} = imm4;
4674  let Inst{15-13} = 0b111;
4675  let Inst{12-10} = Pg;
4676  let Inst{9-5}   = Rn;
4677  let Inst{4-0}   = Zt;
4678
4679  let mayStore = 1;
4680}
4681
4682multiclass sve_mem_cstnt_si<bits<2> msz, string asm, RegisterOperand listty,
4683                            ZPRRegOp zprty> {
4684  def NAME : sve_mem_cstnt_si<msz, asm, listty>;
4685
4686  def : InstAlias<asm # "\t$Zt, $Pg, [$Rn]",
4687                  (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 0>;
4688  def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $imm4, mul vl]",
4689                  (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, simm4s1:$imm4), 0>;
4690  def : InstAlias<asm # "\t$Zt, $Pg, [$Rn]",
4691                  (!cast<Instruction>(NAME) listty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
4692}
4693
4694class sve_mem_cstnt_ss_base<bits<2> msz, string asm, RegisterOperand listty,
4695                            RegisterOperand gprty>
4696: I<(outs), (ins listty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
4697  asm, "\t$Zt, $Pg, [$Rn, $Rm]",
4698  "",
4699  []>, Sched<[]> {
4700  bits<3> Pg;
4701  bits<5> Rm;
4702  bits<5> Rn;
4703  bits<5> Zt;
4704  let Inst{31-25} = 0b1110010;
4705  let Inst{24-23} = msz;
4706  let Inst{22-21} = 0b00;
4707  let Inst{20-16} = Rm;
4708  let Inst{15-13} = 0b011;
4709  let Inst{12-10} = Pg;
4710  let Inst{9-5}   = Rn;
4711  let Inst{4-0}   = Zt;
4712
4713  let mayStore = 1;
4714}
4715
4716multiclass sve_mem_cstnt_ss<bits<2> msz, string asm, RegisterOperand listty,
4717                            ZPRRegOp zprty, RegisterOperand gprty> {
4718  def NAME : sve_mem_cstnt_ss_base<msz, asm, listty, gprty>;
4719
4720  def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Rm]",
4721                 (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm), 0>;
4722}
4723
4724class sve2_mem_sstnt_vs_base<bits<3> opc, string asm,
4725                             RegisterOperand listty, ZPRRegOp zprty>
4726: I<(outs), (ins listty:$Zt, PPR3bAny:$Pg, zprty:$Zn, GPR64:$Rm),
4727  asm, "\t$Zt, $Pg, [$Zn, $Rm]",
4728  "",
4729  []>, Sched<[]> {
4730  bits<3> Pg;
4731  bits<5> Rm;
4732  bits<5> Zn;
4733  bits<5> Zt;
4734  let Inst{31-25} = 0b1110010;
4735  let Inst{24-22} = opc;
4736  let Inst{21}    = 0b0;
4737  let Inst{20-16} = Rm;
4738  let Inst{15-13} = 0b001;
4739  let Inst{12-10} = Pg;
4740  let Inst{9-5}   = Zn;
4741  let Inst{4-0}   = Zt;
4742
4743  let mayStore = 1;
4744}
4745
4746multiclass sve2_mem_sstnt_vs<bits<3> opc, string asm,
4747                             RegisterOperand listty, ZPRRegOp zprty> {
4748  def _REAL : sve2_mem_sstnt_vs_base<opc, asm, listty, zprty>;
4749
4750  def : InstAlias<asm # "\t$Zt, $Pg, [$Zn, $Rm]",
4751                 (!cast<Instruction>(NAME # _REAL) zprty:$Zt, PPR3bAny:$Pg, zprty:$Zn, GPR64:$Rm), 0>;
4752  def : InstAlias<asm # "\t$Zt, $Pg, [$Zn]",
4753                 (!cast<Instruction>(NAME # _REAL) zprty:$Zt, PPR3bAny:$Pg, zprty:$Zn, XZR), 0>;
4754  def : InstAlias<asm # "\t$Zt, $Pg, [$Zn]",
4755                 (!cast<Instruction>(NAME # _REAL) listty:$Zt, PPR3bAny:$Pg, zprty:$Zn, XZR), 1>;
4756}
4757
4758class sve_mem_sst_sv<bits<3> opc, bit xs, bit scaled, string asm,
4759                     RegisterOperand VecList, RegisterOperand zprext>
4760: I<(outs), (ins VecList:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, zprext:$Zm),
4761  asm, "\t$Zt, $Pg, [$Rn, $Zm]",
4762  "",
4763  []>, Sched<[]> {
4764  bits<3> Pg;
4765  bits<5> Rn;
4766  bits<5> Zm;
4767  bits<5> Zt;
4768  let Inst{31-25} = 0b1110010;
4769  let Inst{24-22} = opc;
4770  let Inst{21}    = scaled;
4771  let Inst{20-16} = Zm;
4772  let Inst{15}    = 0b1;
4773  let Inst{14}    = xs;
4774  let Inst{13}    = 0;
4775  let Inst{12-10} = Pg;
4776  let Inst{9-5}   = Rn;
4777  let Inst{4-0}   = Zt;
4778
4779  let mayStore = 1;
4780}
4781
4782multiclass sve_mem_32b_sst_sv_32_scaled<bits<3> opc, string asm,
4783                                    SDPatternOperator sxtw_op,
4784                                    SDPatternOperator uxtw_op,
4785                                    RegisterOperand sxtw_opnd,
4786                                    RegisterOperand uxtw_opnd,
4787                                    ValueType vt > {
4788  def _UXTW_SCALED : sve_mem_sst_sv<opc, 0, 1, asm, Z_s, uxtw_opnd>;
4789  def _SXTW_SCALED : sve_mem_sst_sv<opc, 1, 1, asm, Z_s, sxtw_opnd>;
4790
4791  def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Zm]",
4792                 (!cast<Instruction>(NAME # _UXTW_SCALED) ZPR32:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm), 0>;
4793  def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Zm]",
4794                 (!cast<Instruction>(NAME # _SXTW_SCALED) ZPR32:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm), 0>;
4795
4796  def : Pat<(uxtw_op (nxv4i32 ZPR:$data), (nxv4i1 PPR:$gp), GPR64sp:$base, (nxv4i32 ZPR:$offsets), vt),
4797            (!cast<Instruction>(NAME # _UXTW_SCALED) ZPR:$data, PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
4798  def : Pat<(sxtw_op (nxv4i32 ZPR:$data), (nxv4i1 PPR:$gp), GPR64sp:$base, (nxv4i32 ZPR:$offsets), vt),
4799            (!cast<Instruction>(NAME # _SXTW_SCALED) ZPR:$data, PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
4800}
4801
4802multiclass sve_mem_64b_sst_sv_32_scaled<bits<3> opc, string asm,
4803                                    SDPatternOperator sxtw_op,
4804                                    SDPatternOperator uxtw_op,
4805                                    RegisterOperand sxtw_opnd,
4806                                    RegisterOperand uxtw_opnd,
4807                                    ValueType vt > {
4808  def _UXTW_SCALED : sve_mem_sst_sv<opc, 0, 1, asm, Z_d, uxtw_opnd>;
4809  def _SXTW_SCALED : sve_mem_sst_sv<opc, 1, 1, asm, Z_d, sxtw_opnd>;
4810
4811  def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Zm]",
4812                 (!cast<Instruction>(NAME # _UXTW_SCALED) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm), 0>;
4813  def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Zm]",
4814                 (!cast<Instruction>(NAME # _SXTW_SCALED) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm), 0>;
4815
4816  def : Pat<(uxtw_op (nxv2i64 ZPR:$data), (nxv2i1 PPR:$gp), GPR64sp:$base, (nxv2i64 ZPR:$offsets), vt),
4817            (!cast<Instruction>(NAME # _UXTW_SCALED) ZPR:$data, PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
4818  def : Pat<(sxtw_op (nxv2i64 ZPR:$data), (nxv2i1 PPR:$gp), GPR64sp:$base, (nxv2i64 ZPR:$offsets), vt),
4819            (!cast<Instruction>(NAME # _SXTW_SCALED) ZPR:$data, PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
4820}
4821
4822multiclass sve_mem_64b_sst_sv_32_unscaled<bits<3> opc, string asm,
4823                                         SDPatternOperator sxtw_op,
4824                                         SDPatternOperator uxtw_op,
4825                                         RegisterOperand sxtw_opnd,
4826                                         RegisterOperand uxtw_opnd,
4827                                         ValueType vt> {
4828  def _UXTW : sve_mem_sst_sv<opc, 0, 0, asm, Z_d, uxtw_opnd>;
4829  def _SXTW : sve_mem_sst_sv<opc, 1, 0, asm, Z_d, sxtw_opnd>;
4830
4831  def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Zm]",
4832                 (!cast<Instruction>(NAME # _UXTW) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm), 0>;
4833  def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Zm]",
4834                 (!cast<Instruction>(NAME # _SXTW) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm), 0>;
4835
4836  def : Pat<(uxtw_op (nxv2i64 ZPR:$data), (nxv2i1 PPR:$gp), GPR64sp:$base, (nxv2i64 ZPR:$offsets), vt),
4837            (!cast<Instruction>(NAME # _UXTW) ZPR:$data, PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
4838  def : Pat<(sxtw_op (nxv2i64 ZPR:$data), (nxv2i1 PPR:$gp), GPR64sp:$base, (nxv2i64 ZPR:$offsets), vt),
4839            (!cast<Instruction>(NAME # _SXTW) ZPR:$data, PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
4840}
4841
4842multiclass sve_mem_32b_sst_sv_32_unscaled<bits<3> opc, string asm,
4843                                          SDPatternOperator sxtw_op,
4844                                          SDPatternOperator uxtw_op,
4845                                          RegisterOperand sxtw_opnd,
4846                                          RegisterOperand uxtw_opnd,
4847                                          ValueType vt> {
4848  def _UXTW : sve_mem_sst_sv<opc, 0, 0, asm, Z_s, uxtw_opnd>;
4849  def _SXTW : sve_mem_sst_sv<opc, 1, 0, asm, Z_s, sxtw_opnd>;
4850
4851  def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Zm]",
4852                 (!cast<Instruction>(NAME # _UXTW) ZPR32:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm), 0>;
4853  def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Zm]",
4854                 (!cast<Instruction>(NAME # _SXTW) ZPR32:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm), 0>;
4855
4856  def : Pat<(uxtw_op (nxv4i32 ZPR:$data), (nxv4i1 PPR:$gp), GPR64sp:$base, (nxv4i32 ZPR:$offsets), vt),
4857            (!cast<Instruction>(NAME # _UXTW) ZPR:$data, PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
4858  def : Pat<(sxtw_op (nxv4i32 ZPR:$data), (nxv4i1 PPR:$gp), GPR64sp:$base, (nxv4i32 ZPR:$offsets), vt),
4859            (!cast<Instruction>(NAME # _SXTW) ZPR:$data, PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
4860}
4861
4862class sve_mem_sst_sv2<bits<2> msz, bit scaled, string asm,
4863                      RegisterOperand zprext>
4864: I<(outs), (ins Z_d:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, zprext:$Zm),
4865  asm, "\t$Zt, $Pg, [$Rn, $Zm]",
4866  "",
4867  []>, Sched<[]> {
4868  bits<3> Pg;
4869  bits<5> Rn;
4870  bits<5> Zm;
4871  bits<5> Zt;
4872  let Inst{31-25} = 0b1110010;
4873  let Inst{24-23} = msz;
4874  let Inst{22}    = 0b0;
4875  let Inst{21}    = scaled;
4876  let Inst{20-16} = Zm;
4877  let Inst{15-13} = 0b101;
4878  let Inst{12-10} = Pg;
4879  let Inst{9-5}   = Rn;
4880  let Inst{4-0}   = Zt;
4881
4882  let mayStore = 1;
4883}
4884
4885multiclass sve_mem_sst_sv_64_scaled<bits<2> msz, string asm,
4886                                    SDPatternOperator op,
4887                                    RegisterOperand zprext,
4888                                    ValueType vt> {
4889  def _SCALED_REAL : sve_mem_sst_sv2<msz, 1, asm, zprext>;
4890
4891  def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Zm]",
4892                 (!cast<Instruction>(NAME # _SCALED_REAL) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, zprext:$Zm), 0>;
4893
4894  def : Pat<(op (nxv2i64 ZPR:$data), (nxv2i1 PPR:$gp), GPR64sp:$base, (nxv2i64 ZPR:$indices), vt),
4895            (!cast<Instruction>(NAME # _SCALED_REAL) ZPR:$data, PPR:$gp, GPR64sp:$base, ZPR:$indices)>;
4896}
4897
4898multiclass sve_mem_sst_sv_64_unscaled<bits<2> msz, string asm,
4899                                      SDPatternOperator op,
4900                                      ValueType vt> {
4901  def _REAL : sve_mem_sst_sv2<msz, 0, asm, ZPR64ExtLSL8>;
4902
4903  def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Zm]",
4904                 (!cast<Instruction>(NAME # _REAL) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, ZPR64ExtLSL8:$Zm), 0>;
4905
4906  def : Pat<(op (nxv2i64 ZPR:$data), (nxv2i1 PPR:$gp), GPR64sp:$base, (nxv2i64 ZPR:$offsets), vt),
4907            (!cast<Instruction>(NAME # _REAL) ZPR:$data, PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
4908}
4909
4910class sve_mem_sst_vi<bits<3> opc, string asm, ZPRRegOp zprty,
4911                     RegisterOperand VecList, Operand imm_ty>
4912: I<(outs), (ins VecList:$Zt, PPR3bAny:$Pg, zprty:$Zn, imm_ty:$imm5),
4913  asm, "\t$Zt, $Pg, [$Zn, $imm5]",
4914  "",
4915  []>, Sched<[]> {
4916  bits<3> Pg;
4917  bits<5> imm5;
4918  bits<5> Zn;
4919  bits<5> Zt;
4920  let Inst{31-25} = 0b1110010;
4921  let Inst{24-23} = opc{2-1};
4922  let Inst{22}    = 0b1;
4923  let Inst{21}    = opc{0};
4924  let Inst{20-16} = imm5;
4925  let Inst{15-13} = 0b101;
4926  let Inst{12-10} = Pg;
4927  let Inst{9-5}   = Zn;
4928  let Inst{4-0}   = Zt;
4929
4930  let mayStore = 1;
4931}
4932
4933multiclass sve_mem_32b_sst_vi_ptrs<bits<3> opc, string asm,
4934                                   Operand imm_ty,
4935                                   SDPatternOperator op,
4936                                   ValueType vt> {
4937  def _IMM : sve_mem_sst_vi<opc, asm, ZPR32, Z_s, imm_ty>;
4938
4939  def : InstAlias<asm # "\t$Zt, $Pg, [$Zn]",
4940                  (!cast<Instruction>(NAME # _IMM) ZPR32:$Zt, PPR3bAny:$Pg, ZPR32:$Zn, 0), 0>;
4941  def : InstAlias<asm # "\t$Zt, $Pg, [$Zn, $imm5]",
4942                  (!cast<Instruction>(NAME # _IMM) ZPR32:$Zt, PPR3bAny:$Pg, ZPR32:$Zn, imm_ty:$imm5), 0>;
4943  def : InstAlias<asm # "\t$Zt, $Pg, [$Zn]",
4944                  (!cast<Instruction>(NAME # _IMM) Z_s:$Zt, PPR3bAny:$Pg, ZPR32:$Zn, 0), 1>;
4945
4946  def : Pat<(op (nxv4i32 ZPR:$data), (nxv4i1 PPR:$gp), (nxv4i32 ZPR:$ptrs), imm_ty:$index, vt),
4947            (!cast<Instruction>(NAME # _IMM) ZPR:$data, PPR:$gp, ZPR:$ptrs, imm_ty:$index)>;
4948}
4949
4950multiclass sve_mem_64b_sst_vi_ptrs<bits<3> opc, string asm,
4951                                   Operand imm_ty,
4952                                   SDPatternOperator op,
4953                                   ValueType vt> {
4954  def _IMM : sve_mem_sst_vi<opc, asm, ZPR64, Z_d, imm_ty>;
4955
4956  def : InstAlias<asm # "\t$Zt, $Pg, [$Zn]",
4957                  (!cast<Instruction>(NAME # _IMM) ZPR64:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, 0), 0>;
4958  def : InstAlias<asm # "\t$Zt, $Pg, [$Zn, $imm5]",
4959                  (!cast<Instruction>(NAME # _IMM) ZPR64:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, imm_ty:$imm5), 0>;
4960  def : InstAlias<asm # "\t$Zt, $Pg, [$Zn]",
4961                  (!cast<Instruction>(NAME # _IMM) Z_s:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, 0), 1>;
4962
4963  def : Pat<(op (nxv2i64 ZPR:$data), (nxv2i1 PPR:$gp), (nxv2i64 ZPR:$ptrs), imm_ty:$index, vt),
4964            (!cast<Instruction>(NAME # _IMM) ZPR:$data, PPR:$gp, ZPR:$ptrs, imm_ty:$index)>;
4965}
4966
4967class sve_mem_z_spill<string asm>
4968: I<(outs), (ins ZPRAny:$Zt, GPR64sp:$Rn, simm9:$imm9),
4969  asm, "\t$Zt, [$Rn, $imm9, mul vl]",
4970  "",
4971  []>, Sched<[]> {
4972  bits<5> Rn;
4973  bits<5> Zt;
4974  bits<9> imm9;
4975  let Inst{31-22} = 0b1110010110;
4976  let Inst{21-16} = imm9{8-3};
4977  let Inst{15-13} = 0b010;
4978  let Inst{12-10} = imm9{2-0};
4979  let Inst{9-5}   = Rn;
4980  let Inst{4-0}   = Zt;
4981
4982  let mayStore = 1;
4983}
4984
4985multiclass sve_mem_z_spill<string asm> {
4986  def NAME : sve_mem_z_spill<asm>;
4987
4988  def : InstAlias<asm # "\t$Zt, [$Rn]",
4989                  (!cast<Instruction>(NAME) ZPRAny:$Zt, GPR64sp:$Rn, 0), 1>;
4990}
4991
4992class sve_mem_p_spill<string asm>
4993: I<(outs), (ins PPRAny:$Pt, GPR64sp:$Rn, simm9:$imm9),
4994  asm, "\t$Pt, [$Rn, $imm9, mul vl]",
4995  "",
4996  []>, Sched<[]> {
4997  bits<4> Pt;
4998  bits<5> Rn;
4999  bits<9> imm9;
5000  let Inst{31-22} = 0b1110010110;
5001  let Inst{21-16} = imm9{8-3};
5002  let Inst{15-13} = 0b000;
5003  let Inst{12-10} = imm9{2-0};
5004  let Inst{9-5}   = Rn;
5005  let Inst{4}     = 0b0;
5006  let Inst{3-0}   = Pt;
5007
5008  let mayStore = 1;
5009}
5010
5011multiclass sve_mem_p_spill<string asm> {
5012  def NAME : sve_mem_p_spill<asm>;
5013
5014  def : InstAlias<asm # "\t$Pt, [$Rn]",
5015                  (!cast<Instruction>(NAME) PPRAny:$Pt, GPR64sp:$Rn, 0), 1>;
5016}
5017
5018//===----------------------------------------------------------------------===//
5019// SVE Permute - Predicates Group
5020//===----------------------------------------------------------------------===//
5021
5022class sve_int_perm_bin_perm_pp<bits<3> opc, bits<2> sz8_64, string asm,
5023                               PPRRegOp pprty>
5024: I<(outs pprty:$Pd), (ins pprty:$Pn, pprty:$Pm),
5025  asm, "\t$Pd, $Pn, $Pm",
5026  "",
5027  []>, Sched<[]> {
5028  bits<4> Pd;
5029  bits<4> Pm;
5030  bits<4> Pn;
5031  let Inst{31-24} = 0b00000101;
5032  let Inst{23-22} = sz8_64;
5033  let Inst{21-20} = 0b10;
5034  let Inst{19-16} = Pm;
5035  let Inst{15-13} = 0b010;
5036  let Inst{12-10} = opc;
5037  let Inst{9}     = 0b0;
5038  let Inst{8-5}   = Pn;
5039  let Inst{4}     = 0b0;
5040  let Inst{3-0}   = Pd;
5041}
5042
5043multiclass sve_int_perm_bin_perm_pp<bits<3> opc, string asm,
5044                                    SDPatternOperator op> {
5045  def _B : sve_int_perm_bin_perm_pp<opc, 0b00, asm, PPR8>;
5046  def _H : sve_int_perm_bin_perm_pp<opc, 0b01, asm, PPR16>;
5047  def _S : sve_int_perm_bin_perm_pp<opc, 0b10, asm, PPR32>;
5048  def _D : sve_int_perm_bin_perm_pp<opc, 0b11, asm, PPR64>;
5049
5050  def : SVE_2_Op_Pat<nxv16i1, op, nxv16i1, nxv16i1, !cast<Instruction>(NAME # _B)>;
5051  def : SVE_2_Op_Pat<nxv8i1, op, nxv8i1,  nxv8i1,  !cast<Instruction>(NAME # _H)>;
5052  def : SVE_2_Op_Pat<nxv4i1, op, nxv4i1,  nxv4i1,  !cast<Instruction>(NAME # _S)>;
5053  def : SVE_2_Op_Pat<nxv2i1, op, nxv2i1,  nxv2i1,  !cast<Instruction>(NAME # _D)>;
5054}
5055
5056class sve_int_perm_punpk<bit opc, string asm>
5057: I<(outs PPR16:$Pd), (ins PPR8:$Pn),
5058  asm, "\t$Pd, $Pn",
5059  "",
5060  []>, Sched<[]> {
5061  bits<4> Pd;
5062  bits<4> Pn;
5063  let Inst{31-17} = 0b000001010011000;
5064  let Inst{16}    = opc;
5065  let Inst{15-9}  = 0b0100000;
5066  let Inst{8-5}   = Pn;
5067  let Inst{4}     = 0b0;
5068  let Inst{3-0}   = Pd;
5069}
5070
5071multiclass sve_int_perm_punpk<bit opc, string asm, SDPatternOperator op> {
5072  def NAME : sve_int_perm_punpk<opc, asm>;
5073
5074  def : SVE_1_Op_Pat<nxv8i1, op, nxv16i1, !cast<Instruction>(NAME)>;
5075  def : SVE_1_Op_Pat<nxv4i1, op, nxv8i1,  !cast<Instruction>(NAME)>;
5076  def : SVE_1_Op_Pat<nxv2i1, op, nxv4i1,  !cast<Instruction>(NAME)>;
5077}
5078
5079class sve_int_rdffr_pred<bit s, string asm>
5080: I<(outs PPR8:$Pd), (ins PPRAny:$Pg),
5081  asm, "\t$Pd, $Pg/z",
5082  "",
5083  []>, Sched<[]> {
5084  bits<4> Pd;
5085  bits<4> Pg;
5086  let Inst{31-23} = 0b001001010;
5087  let Inst{22}    = s;
5088  let Inst{21-9}  = 0b0110001111000;
5089  let Inst{8-5}   = Pg;
5090  let Inst{4}     = 0;
5091  let Inst{3-0}   = Pd;
5092
5093  let Defs = !if(!eq (s, 1), [NZCV], []);
5094  let Uses = [FFR];
5095}
5096
5097class sve_int_rdffr_unpred<string asm> : I<
5098  (outs PPR8:$Pd), (ins),
5099  asm, "\t$Pd",
5100  "",
5101  []>, Sched<[]> {
5102  bits<4> Pd;
5103  let Inst{31-4} = 0b0010010100011001111100000000;
5104  let Inst{3-0}   = Pd;
5105
5106  let Uses = [FFR];
5107}
5108
5109class sve_int_wrffr<string asm>
5110: I<(outs), (ins PPR8:$Pn),
5111  asm, "\t$Pn",
5112  "",
5113  []>, Sched<[]> {
5114  bits<4> Pn;
5115  let Inst{31-9} = 0b00100101001010001001000;
5116  let Inst{8-5}  = Pn;
5117  let Inst{4-0}  = 0b00000;
5118
5119  let hasSideEffects = 1;
5120  let Defs = [FFR];
5121}
5122
5123class sve_int_setffr<string asm>
5124: I<(outs), (ins),
5125  asm, "",
5126  "",
5127  []>, Sched<[]> {
5128  let Inst{31-0} = 0b00100101001011001001000000000000;
5129
5130  let hasSideEffects = 1;
5131  let Defs = [FFR];
5132}
5133
5134//===----------------------------------------------------------------------===//
5135// SVE Permute Vector - Predicated Group
5136//===----------------------------------------------------------------------===//
5137
5138class sve_int_perm_clast_rz<bits<2> sz8_64, bit ab, string asm,
5139                            ZPRRegOp zprty, RegisterClass rt>
5140: I<(outs rt:$Rdn), (ins PPR3bAny:$Pg, rt:$_Rdn, zprty:$Zm),
5141  asm, "\t$Rdn, $Pg, $_Rdn, $Zm",
5142  "",
5143  []>, Sched<[]> {
5144  bits<3> Pg;
5145  bits<5> Rdn;
5146  bits<5> Zm;
5147  let Inst{31-24} = 0b00000101;
5148  let Inst{23-22} = sz8_64;
5149  let Inst{21-17} = 0b11000;
5150  let Inst{16}    = ab;
5151  let Inst{15-13} = 0b101;
5152  let Inst{12-10} = Pg;
5153  let Inst{9-5}   = Zm;
5154  let Inst{4-0}   = Rdn;
5155
5156  let Constraints = "$Rdn = $_Rdn";
5157}
5158
5159multiclass sve_int_perm_clast_rz<bit ab, string asm, SDPatternOperator op> {
5160  def _B : sve_int_perm_clast_rz<0b00, ab, asm, ZPR8, GPR32>;
5161  def _H : sve_int_perm_clast_rz<0b01, ab, asm, ZPR16, GPR32>;
5162  def _S : sve_int_perm_clast_rz<0b10, ab, asm, ZPR32, GPR32>;
5163  def _D : sve_int_perm_clast_rz<0b11, ab, asm, ZPR64, GPR64>;
5164
5165  def : SVE_3_Op_Pat<i32, op, nxv16i1, i32, nxv16i8, !cast<Instruction>(NAME # _B)>;
5166  def : SVE_3_Op_Pat<i32, op, nxv8i1,  i32, nxv8i16, !cast<Instruction>(NAME # _H)>;
5167  def : SVE_3_Op_Pat<i32, op, nxv4i1,  i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
5168  def : SVE_3_Op_Pat<i64, op, nxv2i1,  i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
5169}
5170
5171class sve_int_perm_clast_vz<bits<2> sz8_64, bit ab, string asm,
5172                            ZPRRegOp zprty, RegisterClass rt>
5173: I<(outs rt:$Vdn), (ins PPR3bAny:$Pg, rt:$_Vdn, zprty:$Zm),
5174  asm, "\t$Vdn, $Pg, $_Vdn, $Zm",
5175  "",
5176  []>, Sched<[]> {
5177  bits<3> Pg;
5178  bits<5> Vdn;
5179  bits<5> Zm;
5180  let Inst{31-24} = 0b00000101;
5181  let Inst{23-22} = sz8_64;
5182  let Inst{21-17} = 0b10101;
5183  let Inst{16}    = ab;
5184  let Inst{15-13} = 0b100;
5185  let Inst{12-10} = Pg;
5186  let Inst{9-5}   = Zm;
5187  let Inst{4-0}   = Vdn;
5188
5189  let Constraints = "$Vdn = $_Vdn";
5190}
5191
5192multiclass sve_int_perm_clast_vz<bit ab, string asm, SDPatternOperator op> {
5193  def _B : sve_int_perm_clast_vz<0b00, ab, asm, ZPR8, FPR8>;
5194  def _H : sve_int_perm_clast_vz<0b01, ab, asm, ZPR16, FPR16>;
5195  def _S : sve_int_perm_clast_vz<0b10, ab, asm, ZPR32, FPR32>;
5196  def _D : sve_int_perm_clast_vz<0b11, ab, asm, ZPR64, FPR64>;
5197
5198  def : SVE_3_Op_Pat<f16, op, nxv8i1,  f16, nxv8f16, !cast<Instruction>(NAME # _H)>;
5199  def : SVE_3_Op_Pat<f32, op, nxv4i1,  f32, nxv4f32, !cast<Instruction>(NAME # _S)>;
5200  def : SVE_3_Op_Pat<f64, op, nxv2i1,  f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
5201}
5202
5203class sve_int_perm_clast_zz<bits<2> sz8_64, bit ab, string asm,
5204                            ZPRRegOp zprty>
5205: I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, zprty:$Zm),
5206  asm, "\t$Zdn, $Pg, $_Zdn, $Zm",
5207  "",
5208  []>, Sched<[]> {
5209  bits<3> Pg;
5210  bits<5> Zdn;
5211  bits<5> Zm;
5212  let Inst{31-24} = 0b00000101;
5213  let Inst{23-22} = sz8_64;
5214  let Inst{21-17} = 0b10100;
5215  let Inst{16}    = ab;
5216  let Inst{15-13} = 0b100;
5217  let Inst{12-10} = Pg;
5218  let Inst{9-5}   = Zm;
5219  let Inst{4-0}   = Zdn;
5220
5221  let Constraints = "$Zdn = $_Zdn";
5222  let DestructiveInstType = Destructive;
5223  let ElementSize = ElementSizeNone;
5224}
5225
5226multiclass sve_int_perm_clast_zz<bit ab, string asm, SDPatternOperator op> {
5227  def _B : sve_int_perm_clast_zz<0b00, ab, asm, ZPR8>;
5228  def _H : sve_int_perm_clast_zz<0b01, ab, asm, ZPR16>;
5229  def _S : sve_int_perm_clast_zz<0b10, ab, asm, ZPR32>;
5230  def _D : sve_int_perm_clast_zz<0b11, ab, asm, ZPR64>;
5231
5232  def : SVE_3_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
5233  def : SVE_3_Op_Pat<nxv8i16, op, nxv8i1,  nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
5234  def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1,  nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
5235  def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1,  nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
5236
5237  def : SVE_3_Op_Pat<nxv8f16, op, nxv8i1, nxv8f16, nxv8f16, !cast<Instruction>(NAME # _H)>;
5238  def : SVE_3_Op_Pat<nxv4f32, op, nxv4i1, nxv4f32, nxv4f32, !cast<Instruction>(NAME # _S)>;
5239  def : SVE_3_Op_Pat<nxv2f64, op, nxv2i1, nxv2f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
5240}
5241
5242class sve_int_perm_last_r<bits<2> sz8_64, bit ab, string asm,
5243                          ZPRRegOp zprty, RegisterClass resultRegType>
5244: I<(outs resultRegType:$Rd), (ins PPR3bAny:$Pg, zprty:$Zn),
5245  asm, "\t$Rd, $Pg, $Zn",
5246  "",
5247  []>, Sched<[]> {
5248  bits<3> Pg;
5249  bits<5> Rd;
5250  bits<5> Zn;
5251  let Inst{31-24} = 0b00000101;
5252  let Inst{23-22} = sz8_64;
5253  let Inst{21-17} = 0b10000;
5254  let Inst{16}    = ab;
5255  let Inst{15-13} = 0b101;
5256  let Inst{12-10} = Pg;
5257  let Inst{9-5}   = Zn;
5258  let Inst{4-0}   = Rd;
5259}
5260
5261multiclass sve_int_perm_last_r<bit ab, string asm, SDPatternOperator op> {
5262  def _B : sve_int_perm_last_r<0b00, ab, asm, ZPR8, GPR32>;
5263  def _H : sve_int_perm_last_r<0b01, ab, asm, ZPR16, GPR32>;
5264  def _S : sve_int_perm_last_r<0b10, ab, asm, ZPR32, GPR32>;
5265  def _D : sve_int_perm_last_r<0b11, ab, asm, ZPR64, GPR64>;
5266
5267  def : SVE_2_Op_Pat<i32, op, nxv16i1, nxv16i8, !cast<Instruction>(NAME # _B)>;
5268  def : SVE_2_Op_Pat<i32, op, nxv8i1,  nxv8i16, !cast<Instruction>(NAME # _H)>;
5269  def : SVE_2_Op_Pat<i32, op, nxv4i1,  nxv4i32, !cast<Instruction>(NAME # _S)>;
5270  def : SVE_2_Op_Pat<i64, op, nxv2i1,  nxv2i64, !cast<Instruction>(NAME # _D)>;
5271}
5272
5273class sve_int_perm_last_v<bits<2> sz8_64, bit ab, string asm,
5274                          ZPRRegOp zprty, RegisterClass dstRegtype>
5275: I<(outs dstRegtype:$Vd), (ins PPR3bAny:$Pg, zprty:$Zn),
5276  asm, "\t$Vd, $Pg, $Zn",
5277  "",
5278  []>, Sched<[]> {
5279  bits<3> Pg;
5280  bits<5> Vd;
5281  bits<5> Zn;
5282  let Inst{31-24} = 0b00000101;
5283  let Inst{23-22} = sz8_64;
5284  let Inst{21-17} = 0b10001;
5285  let Inst{16}    = ab;
5286  let Inst{15-13} = 0b100;
5287  let Inst{12-10} = Pg;
5288  let Inst{9-5}   = Zn;
5289  let Inst{4-0}   = Vd;
5290}
5291
5292multiclass sve_int_perm_last_v<bit ab, string asm, SDPatternOperator op> {
5293  def _B : sve_int_perm_last_v<0b00, ab, asm, ZPR8, FPR8>;
5294  def _H : sve_int_perm_last_v<0b01, ab, asm, ZPR16, FPR16>;
5295  def _S : sve_int_perm_last_v<0b10, ab, asm, ZPR32, FPR32>;
5296  def _D : sve_int_perm_last_v<0b11, ab, asm, ZPR64, FPR64>;
5297
5298  def : SVE_2_Op_Pat<f16, op, nxv8i1,  nxv8f16, !cast<Instruction>(NAME # _H)>;
5299  def : SVE_2_Op_Pat<f32, op, nxv4i1,  nxv4f32, !cast<Instruction>(NAME # _S)>;
5300  def : SVE_2_Op_Pat<f32, op, nxv2i1,  nxv2f32, !cast<Instruction>(NAME # _S)>;
5301  def : SVE_2_Op_Pat<f64, op, nxv2i1,  nxv2f64, !cast<Instruction>(NAME # _D)>;
5302}
5303
5304class sve_int_perm_splice<bits<2> sz8_64, string asm, ZPRRegOp zprty>
5305: I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, zprty:$Zm),
5306  asm, "\t$Zdn, $Pg, $_Zdn, $Zm",
5307  "",
5308  []>, Sched<[]> {
5309  bits<3> Pg;
5310  bits<5> Zdn;
5311  bits<5> Zm;
5312  let Inst{31-24} = 0b00000101;
5313  let Inst{23-22} = sz8_64;
5314  let Inst{21-13} = 0b101100100;
5315  let Inst{12-10} = Pg;
5316  let Inst{9-5}   = Zm;
5317  let Inst{4-0}   = Zdn;
5318
5319  let Constraints = "$Zdn = $_Zdn";
5320  let DestructiveInstType = Destructive;
5321  let ElementSize = ElementSizeNone;
5322}
5323
5324multiclass sve_int_perm_splice<string asm, SDPatternOperator op> {
5325  def _B : sve_int_perm_splice<0b00, asm, ZPR8>;
5326  def _H : sve_int_perm_splice<0b01, asm, ZPR16>;
5327  def _S : sve_int_perm_splice<0b10, asm, ZPR32>;
5328  def _D : sve_int_perm_splice<0b11, asm, ZPR64>;
5329
5330  def : SVE_3_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
5331  def : SVE_3_Op_Pat<nxv8i16, op, nxv8i1,  nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
5332  def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1,  nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
5333  def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1,  nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
5334
5335  def : SVE_3_Op_Pat<nxv8f16, op, nxv8i1, nxv8f16, nxv8f16, !cast<Instruction>(NAME # _H)>;
5336  def : SVE_3_Op_Pat<nxv4f32, op, nxv4i1, nxv4f32, nxv4f32, !cast<Instruction>(NAME # _S)>;
5337  def : SVE_3_Op_Pat<nxv2f64, op, nxv2i1, nxv2f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
5338}
5339
5340class sve2_int_perm_splice_cons<bits<2> sz8_64, string asm,
5341                               ZPRRegOp zprty, RegisterOperand VecList>
5342: I<(outs zprty:$Zd), (ins PPR3bAny:$Pg, VecList:$Zn),
5343  asm, "\t$Zd, $Pg, $Zn",
5344  "",
5345  []>, Sched<[]> {
5346  bits<3> Pg;
5347  bits<5> Zn;
5348  bits<5> Zd;
5349  let Inst{31-24} = 0b00000101;
5350  let Inst{23-22} = sz8_64;
5351  let Inst{21-13} = 0b101101100;
5352  let Inst{12-10} = Pg;
5353  let Inst{9-5}   = Zn;
5354  let Inst{4-0}   = Zd;
5355}
5356
5357multiclass sve2_int_perm_splice_cons<string asm> {
5358  def _B : sve2_int_perm_splice_cons<0b00, asm, ZPR8,  ZZ_b>;
5359  def _H : sve2_int_perm_splice_cons<0b01, asm, ZPR16, ZZ_h>;
5360  def _S : sve2_int_perm_splice_cons<0b10, asm, ZPR32, ZZ_s>;
5361  def _D : sve2_int_perm_splice_cons<0b11, asm, ZPR64, ZZ_d>;
5362}
5363
5364class sve_int_perm_rev<bits<2> sz8_64, bits<2> opc, string asm,
5365                       ZPRRegOp zprty>
5366: I<(outs zprty:$Zd), (ins zprty:$_Zd, PPR3bAny:$Pg, zprty:$Zn),
5367  asm, "\t$Zd, $Pg/m, $Zn",
5368  "",
5369  []>, Sched<[]> {
5370  bits<5> Zd;
5371  bits<3> Pg;
5372  bits<5> Zn;
5373  let Inst{31-24} = 0b00000101;
5374  let Inst{23-22} = sz8_64;
5375  let Inst{21-18} = 0b1001;
5376  let Inst{17-16} = opc;
5377  let Inst{15-13} = 0b100;
5378  let Inst{12-10} = Pg;
5379  let Inst{9-5}   = Zn;
5380  let Inst{4-0}   = Zd;
5381
5382  let Constraints = "$Zd = $_Zd";
5383  let DestructiveInstType = Destructive;
5384  let ElementSize = zprty.ElementSize;
5385}
5386
5387multiclass sve_int_perm_rev_rbit<string asm, SDPatternOperator op> {
5388  def _B : sve_int_perm_rev<0b00, 0b11, asm, ZPR8>;
5389  def _H : sve_int_perm_rev<0b01, 0b11, asm, ZPR16>;
5390  def _S : sve_int_perm_rev<0b10, 0b11, asm, ZPR32>;
5391  def _D : sve_int_perm_rev<0b11, 0b11, asm, ZPR64>;
5392
5393  def : SVE_3_Op_Pat<nxv16i8, op, nxv16i8, nxv16i1, nxv16i8, !cast<Instruction>(NAME # _B)>;
5394  def : SVE_3_Op_Pat<nxv8i16, op, nxv8i16, nxv8i1,  nxv8i16, !cast<Instruction>(NAME # _H)>;
5395  def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv4i1,  nxv4i32, !cast<Instruction>(NAME # _S)>;
5396  def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv2i1,  nxv2i64, !cast<Instruction>(NAME # _D)>;
5397}
5398
5399multiclass sve_int_perm_rev_revb<string asm,
5400                                 SDPatternOperator int_op,
5401                                 SDPatternOperator ir_op> {
5402  def _H : sve_int_perm_rev<0b01, 0b00, asm, ZPR16>;
5403  def _S : sve_int_perm_rev<0b10, 0b00, asm, ZPR32>;
5404  def _D : sve_int_perm_rev<0b11, 0b00, asm, ZPR64>;
5405
5406  def : SVE_3_Op_Pat<nxv8i16, int_op, nxv8i16, nxv8i1,  nxv8i16, !cast<Instruction>(NAME # _H)>;
5407  def : SVE_3_Op_Pat<nxv4i32, int_op, nxv4i32, nxv4i1,  nxv4i32, !cast<Instruction>(NAME # _S)>;
5408  def : SVE_3_Op_Pat<nxv2i64, int_op, nxv2i64, nxv2i1,  nxv2i64, !cast<Instruction>(NAME # _D)>;
5409
5410  def : SVE_1_Op_AllActive_Pat<nxv8i16, ir_op, nxv8i16, !cast<Instruction>(NAME # _H), PTRUE_H>;
5411  def : SVE_1_Op_AllActive_Pat<nxv4i32, ir_op, nxv4i32, !cast<Instruction>(NAME # _S), PTRUE_S>;
5412  def : SVE_1_Op_AllActive_Pat<nxv2i64, ir_op, nxv2i64, !cast<Instruction>(NAME # _D), PTRUE_D>;
5413}
5414
5415multiclass sve_int_perm_rev_revh<string asm, SDPatternOperator op> {
5416  def _S : sve_int_perm_rev<0b10, 0b01, asm, ZPR32>;
5417  def _D : sve_int_perm_rev<0b11, 0b01, asm, ZPR64>;
5418
5419  def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv4i1,  nxv4i32, !cast<Instruction>(NAME # _S)>;
5420  def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv2i1,  nxv2i64, !cast<Instruction>(NAME # _D)>;
5421}
5422
5423multiclass sve_int_perm_rev_revw<string asm, SDPatternOperator op> {
5424  def _D : sve_int_perm_rev<0b11, 0b10, asm, ZPR64>;
5425
5426  def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv2i1,  nxv2i64, !cast<Instruction>(NAME # _D)>;
5427}
5428
5429class sve_int_perm_cpy_r<bits<2> sz8_64, string asm, ZPRRegOp zprty,
5430                         RegisterClass srcRegType>
5431: I<(outs zprty:$Zd), (ins zprty:$_Zd, PPR3bAny:$Pg, srcRegType:$Rn),
5432  asm, "\t$Zd, $Pg/m, $Rn",
5433  "",
5434  []>, Sched<[]> {
5435  bits<3> Pg;
5436  bits<5> Rn;
5437  bits<5> Zd;
5438  let Inst{31-24} = 0b00000101;
5439  let Inst{23-22} = sz8_64;
5440  let Inst{21-13} = 0b101000101;
5441  let Inst{12-10} = Pg;
5442  let Inst{9-5}   = Rn;
5443  let Inst{4-0}   = Zd;
5444
5445  let Constraints = "$Zd = $_Zd";
5446  let DestructiveInstType = Destructive;
5447  let ElementSize = zprty.ElementSize;
5448}
5449
5450multiclass sve_int_perm_cpy_r<string asm> {
5451  def _B : sve_int_perm_cpy_r<0b00, asm, ZPR8, GPR32sp>;
5452  def _H : sve_int_perm_cpy_r<0b01, asm, ZPR16, GPR32sp>;
5453  def _S : sve_int_perm_cpy_r<0b10, asm, ZPR32, GPR32sp>;
5454  def _D : sve_int_perm_cpy_r<0b11, asm, ZPR64, GPR64sp>;
5455
5456  def : InstAlias<"mov $Zd, $Pg/m, $Rn",
5457                  (!cast<Instruction>(NAME # _B) ZPR8:$Zd, PPR3bAny:$Pg, GPR32sp:$Rn), 1>;
5458  def : InstAlias<"mov $Zd, $Pg/m, $Rn",
5459                  (!cast<Instruction>(NAME # _H) ZPR16:$Zd, PPR3bAny:$Pg, GPR32sp:$Rn), 1>;
5460  def : InstAlias<"mov $Zd, $Pg/m, $Rn",
5461                  (!cast<Instruction>(NAME # _S) ZPR32:$Zd, PPR3bAny:$Pg, GPR32sp:$Rn), 1>;
5462  def : InstAlias<"mov $Zd, $Pg/m, $Rn",
5463                  (!cast<Instruction>(NAME # _D) ZPR64:$Zd, PPR3bAny:$Pg, GPR64sp:$Rn), 1>;
5464}
5465
5466class sve_int_perm_cpy_v<bits<2> sz8_64, string asm, ZPRRegOp zprty,
5467                         RegisterClass srcRegtype>
5468: I<(outs zprty:$Zd), (ins zprty:$_Zd, PPR3bAny:$Pg, srcRegtype:$Vn),
5469  asm, "\t$Zd, $Pg/m, $Vn",
5470  "",
5471  []>, Sched<[]> {
5472  bits<3> Pg;
5473  bits<5> Vn;
5474  bits<5> Zd;
5475  let Inst{31-24} = 0b00000101;
5476  let Inst{23-22} = sz8_64;
5477  let Inst{21-13} = 0b100000100;
5478  let Inst{12-10} = Pg;
5479  let Inst{9-5}   = Vn;
5480  let Inst{4-0}   = Zd;
5481
5482  let Constraints = "$Zd = $_Zd";
5483  let DestructiveInstType = Destructive;
5484  let ElementSize = zprty.ElementSize;
5485}
5486
5487multiclass sve_int_perm_cpy_v<string asm> {
5488  def _B : sve_int_perm_cpy_v<0b00, asm, ZPR8, FPR8>;
5489  def _H : sve_int_perm_cpy_v<0b01, asm, ZPR16, FPR16>;
5490  def _S : sve_int_perm_cpy_v<0b10, asm, ZPR32, FPR32>;
5491  def _D : sve_int_perm_cpy_v<0b11, asm, ZPR64, FPR64>;
5492
5493  def : InstAlias<"mov $Zd, $Pg/m, $Vn",
5494                  (!cast<Instruction>(NAME # _B) ZPR8:$Zd, PPR3bAny:$Pg, FPR8:$Vn), 1>;
5495  def : InstAlias<"mov $Zd, $Pg/m, $Vn",
5496                  (!cast<Instruction>(NAME # _H) ZPR16:$Zd, PPR3bAny:$Pg, FPR16:$Vn), 1>;
5497  def : InstAlias<"mov $Zd, $Pg/m, $Vn",
5498                  (!cast<Instruction>(NAME # _S) ZPR32:$Zd, PPR3bAny:$Pg, FPR32:$Vn), 1>;
5499  def : InstAlias<"mov $Zd, $Pg/m, $Vn",
5500                  (!cast<Instruction>(NAME # _D) ZPR64:$Zd, PPR3bAny:$Pg, FPR64:$Vn), 1>;
5501}
5502
5503class sve_int_perm_compact<bit sz, string asm, ZPRRegOp zprty>
5504: I<(outs zprty:$Zd), (ins PPR3bAny:$Pg, zprty:$Zn),
5505  asm, "\t$Zd, $Pg, $Zn",
5506  "",
5507  []>, Sched<[]> {
5508  bits<3> Pg;
5509  bits<5> Zd;
5510  bits<5> Zn;
5511  let Inst{31-23} = 0b000001011;
5512  let Inst{22}    = sz;
5513  let Inst{21-13} = 0b100001100;
5514  let Inst{12-10} = Pg;
5515  let Inst{9-5}   = Zn;
5516  let Inst{4-0}   = Zd;
5517}
5518
5519multiclass sve_int_perm_compact<string asm, SDPatternOperator op> {
5520  def _S : sve_int_perm_compact<0b0, asm, ZPR32>;
5521  def _D : sve_int_perm_compact<0b1, asm, ZPR64>;
5522
5523  def : SVE_2_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, !cast<Instruction>(NAME # _S)>;
5524  def : SVE_2_Op_Pat<nxv4f32, op, nxv4i1, nxv4f32, !cast<Instruction>(NAME # _S)>;
5525  def : SVE_2_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, !cast<Instruction>(NAME # _D)>;
5526  def : SVE_2_Op_Pat<nxv2f64, op, nxv2i1, nxv2f64, !cast<Instruction>(NAME # _D)>;
5527}
5528
5529
5530//===----------------------------------------------------------------------===//
5531// SVE Memory - Contiguous Load Group
5532//===----------------------------------------------------------------------===//
5533
5534class sve_mem_cld_si_base<bits<4> dtype, bit nf, string asm,
5535                          RegisterOperand VecList>
5536: I<(outs VecList:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, simm4s1:$imm4),
5537  asm, "\t$Zt, $Pg/z, [$Rn, $imm4, mul vl]",
5538  "",
5539  []>, Sched<[]> {
5540  bits<3> Pg;
5541  bits<5> Rn;
5542  bits<5> Zt;
5543  bits<4> imm4;
5544  let Inst{31-25} = 0b1010010;
5545  let Inst{24-21} = dtype;
5546  let Inst{20}    = nf;
5547  let Inst{19-16} = imm4;
5548  let Inst{15-13} = 0b101;
5549  let Inst{12-10} = Pg;
5550  let Inst{9-5}   = Rn;
5551  let Inst{4-0}   = Zt;
5552
5553  let mayLoad = 1;
5554  let Uses = !if(!eq(nf, 1), [FFR], []);
5555  let Defs = !if(!eq(nf, 1), [FFR], []);
5556}
5557
5558multiclass sve_mem_cld_si_base<bits<4> dtype, bit nf, string asm,
5559                               RegisterOperand listty, ZPRRegOp zprty> {
5560  def "" : sve_mem_cld_si_base<dtype, nf, asm, listty>;
5561
5562  def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
5563                  (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 0>;
5564  def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $imm4, mul vl]",
5565                  (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, simm4s1:$imm4), 0>;
5566  def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
5567                  (!cast<Instruction>(NAME) listty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
5568}
5569
5570multiclass sve_mem_cld_si<bits<4> dtype, string asm, RegisterOperand listty,
5571                          ZPRRegOp zprty>
5572: sve_mem_cld_si_base<dtype, 0, asm, listty, zprty>;
5573
5574class sve_mem_cldnt_si_base<bits<2> msz, string asm, RegisterOperand VecList>
5575: I<(outs VecList:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, simm4s1:$imm4),
5576  asm, "\t$Zt, $Pg/z, [$Rn, $imm4, mul vl]",
5577  "",
5578  []>, Sched<[]> {
5579  bits<5> Zt;
5580  bits<3> Pg;
5581  bits<5> Rn;
5582  bits<4> imm4;
5583  let Inst{31-25} = 0b1010010;
5584  let Inst{24-23} = msz;
5585  let Inst{22-20} = 0b000;
5586  let Inst{19-16} = imm4;
5587  let Inst{15-13} = 0b111;
5588  let Inst{12-10} = Pg;
5589  let Inst{9-5}   = Rn;
5590  let Inst{4-0}   = Zt;
5591
5592  let mayLoad = 1;
5593}
5594
5595multiclass sve_mem_cldnt_si<bits<2> msz, string asm, RegisterOperand listty,
5596                            ZPRRegOp zprty> {
5597  def NAME : sve_mem_cldnt_si_base<msz, asm, listty>;
5598
5599  def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
5600                  (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 0>;
5601  def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $imm4, mul vl]",
5602                  (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, simm4s1:$imm4), 0>;
5603  def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
5604                  (!cast<Instruction>(NAME) listty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
5605}
5606
5607class sve_mem_cldnt_ss_base<bits<2> msz, string asm, RegisterOperand VecList,
5608                            RegisterOperand gprty>
5609: I<(outs VecList:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
5610  asm, "\t$Zt, $Pg/z, [$Rn, $Rm]",
5611  "",
5612  []>, Sched<[]> {
5613  bits<3> Pg;
5614  bits<5> Rm;
5615  bits<5> Rn;
5616  bits<5> Zt;
5617  let Inst{31-25} = 0b1010010;
5618  let Inst{24-23} = msz;
5619  let Inst{22-21} = 0b00;
5620  let Inst{20-16} = Rm;
5621  let Inst{15-13} = 0b110;
5622  let Inst{12-10} = Pg;
5623  let Inst{9-5}   = Rn;
5624  let Inst{4-0}   = Zt;
5625
5626  let mayLoad = 1;
5627}
5628
5629multiclass sve_mem_cldnt_ss<bits<2> msz, string asm, RegisterOperand listty,
5630                            ZPRRegOp zprty, RegisterOperand gprty> {
5631  def NAME : sve_mem_cldnt_ss_base<msz, asm, listty, gprty>;
5632
5633  def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Rm]",
5634                 (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm), 0>;
5635}
5636
5637class sve_mem_ldqr_si<bits<2> sz, string asm, RegisterOperand VecList>
5638: I<(outs VecList:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, simm4s16:$imm4),
5639  asm, "\t$Zt, $Pg/z, [$Rn, $imm4]", "", []>, Sched<[]> {
5640  bits<5> Zt;
5641  bits<5> Rn;
5642  bits<3> Pg;
5643  bits<4> imm4;
5644  let Inst{31-25} = 0b1010010;
5645  let Inst{24-23} = sz;
5646  let Inst{22-20} = 0;
5647  let Inst{19-16} = imm4;
5648  let Inst{15-13} = 0b001;
5649  let Inst{12-10} = Pg;
5650  let Inst{9-5}   = Rn;
5651  let Inst{4-0}   = Zt;
5652
5653  let mayLoad = 1;
5654}
5655
5656multiclass sve_mem_ldqr_si<bits<2> sz, string asm, RegisterOperand listty,
5657                           ZPRRegOp zprty> {
5658  def NAME : sve_mem_ldqr_si<sz, asm, listty>;
5659  def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
5660                  (!cast<Instruction>(NAME) listty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
5661  def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
5662                  (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 0>;
5663  def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $imm4]",
5664                  (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, simm4s16:$imm4), 0>;
5665}
5666
5667class sve_mem_ldqr_ss<bits<2> sz, string asm, RegisterOperand VecList,
5668                      RegisterOperand gprty>
5669: I<(outs VecList:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
5670  asm, "\t$Zt, $Pg/z, [$Rn, $Rm]", "", []>, Sched<[]> {
5671  bits<5> Zt;
5672  bits<3> Pg;
5673  bits<5> Rn;
5674  bits<5> Rm;
5675  let Inst{31-25} = 0b1010010;
5676  let Inst{24-23} = sz;
5677  let Inst{22-21} = 0;
5678  let Inst{20-16} = Rm;
5679  let Inst{15-13} = 0;
5680  let Inst{12-10} = Pg;
5681  let Inst{9-5}   = Rn;
5682  let Inst{4-0}   = Zt;
5683
5684  let mayLoad = 1;
5685}
5686
5687multiclass sve_mem_ldqr_ss<bits<2> sz, string asm, RegisterOperand listty,
5688                           ZPRRegOp zprty, RegisterOperand gprty> {
5689  def NAME : sve_mem_ldqr_ss<sz, asm, listty, gprty>;
5690
5691  def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Rm]",
5692                  (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm), 0>;
5693}
5694
5695class sve_mem_ld_dup<bits<2> dtypeh, bits<2> dtypel, string asm,
5696                     RegisterOperand VecList, Operand immtype>
5697: I<(outs VecList:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, immtype:$imm6),
5698  asm, "\t$Zt, $Pg/z, [$Rn, $imm6]",
5699  "",
5700  []>, Sched<[]> {
5701  bits<3> Pg;
5702  bits<5> Rn;
5703  bits<5> Zt;
5704  bits<6> imm6;
5705  let Inst{31-25} = 0b1000010;
5706  let Inst{24-23} = dtypeh;
5707  let Inst{22}    = 1;
5708  let Inst{21-16} = imm6;
5709  let Inst{15}    = 0b1;
5710  let Inst{14-13} = dtypel;
5711  let Inst{12-10} = Pg;
5712  let Inst{9-5}   = Rn;
5713  let Inst{4-0}   = Zt;
5714
5715  let mayLoad = 1;
5716}
5717
5718multiclass sve_mem_ld_dup<bits<2> dtypeh, bits<2> dtypel, string asm,
5719                          RegisterOperand zlistty, ZPRRegOp zprty, Operand immtype> {
5720  def NAME : sve_mem_ld_dup<dtypeh, dtypel, asm, zlistty, immtype>;
5721
5722  def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
5723                  (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 0>;
5724  def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $imm6]",
5725                  (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, immtype:$imm6), 0>;
5726  def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
5727                  (!cast<Instruction>(NAME) zlistty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
5728}
5729
5730class sve_mem_cld_ss_base<bits<4> dtype, bit ff, dag iops, string asm,
5731                          RegisterOperand VecList>
5732: I<(outs VecList:$Zt), iops,
5733  asm, "\t$Zt, $Pg/z, [$Rn, $Rm]",
5734  "",
5735  []>, Sched<[]> {
5736  bits<5> Zt;
5737  bits<3> Pg;
5738  bits<5> Rm;
5739  bits<5> Rn;
5740  let Inst{31-25} = 0b1010010;
5741  let Inst{24-21} = dtype;
5742  let Inst{20-16} = Rm;
5743  let Inst{15-14} = 0b01;
5744  let Inst{13}    = ff;
5745  let Inst{12-10} = Pg;
5746  let Inst{9-5}   = Rn;
5747  let Inst{4-0}   = Zt;
5748
5749  let mayLoad = 1;
5750  let Uses = !if(!eq(ff, 1), [FFR], []);
5751  let Defs = !if(!eq(ff, 1), [FFR], []);
5752}
5753
5754multiclass sve_mem_cld_ss<bits<4> dtype, string asm, RegisterOperand listty,
5755                          ZPRRegOp zprty, RegisterOperand gprty> {
5756  def "" : sve_mem_cld_ss_base<dtype, 0, (ins PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
5757                               asm, listty>;
5758
5759  def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Rm]",
5760                 (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm), 0>;
5761}
5762
5763multiclass sve_mem_cldff_ss<bits<4> dtype, string asm, RegisterOperand listty,
5764                            ZPRRegOp zprty, RegisterOperand gprty> {
5765  def _REAL : sve_mem_cld_ss_base<dtype, 1, (ins PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
5766                                  asm, listty>;
5767
5768  def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Rm]",
5769                 (!cast<Instruction>(NAME # _REAL) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm), 0>;
5770
5771  def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
5772                 (!cast<Instruction>(NAME # _REAL) listty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, XZR), 1>;
5773
5774  def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
5775                 (!cast<Instruction>(NAME # _REAL) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, XZR), 0>;
5776}
5777
5778multiclass sve_mem_cldnf_si<bits<4> dtype, string asm, RegisterOperand listty,
5779                            ZPRRegOp zprty>
5780: sve_mem_cld_si_base<dtype, 1, asm, listty, zprty>;
5781
5782class sve_mem_eld_si<bits<2> sz, bits<2> nregs, RegisterOperand VecList,
5783                     string asm, Operand immtype>
5784: I<(outs VecList:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, immtype:$imm4),
5785  asm, "\t$Zt, $Pg/z, [$Rn, $imm4, mul vl]",
5786  "",
5787  []>, Sched<[]> {
5788  bits<5> Zt;
5789  bits<3> Pg;
5790  bits<5> Rn;
5791  bits<4> imm4;
5792  let Inst{31-25} = 0b1010010;
5793  let Inst{24-23} = sz;
5794  let Inst{22-21} = nregs;
5795  let Inst{20}    = 0;
5796  let Inst{19-16} = imm4;
5797  let Inst{15-13} = 0b111;
5798  let Inst{12-10} = Pg;
5799  let Inst{9-5}   = Rn;
5800  let Inst{4-0}   = Zt;
5801
5802  let mayLoad = 1;
5803}
5804
5805multiclass sve_mem_eld_si<bits<2> sz, bits<2> nregs, RegisterOperand VecList,
5806                          string asm, Operand immtype> {
5807  def NAME : sve_mem_eld_si<sz, nregs, VecList, asm, immtype>;
5808
5809  def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
5810                  (!cast<Instruction>(NAME) VecList:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
5811}
5812
5813class sve_mem_eld_ss<bits<2> sz, bits<2> nregs, RegisterOperand VecList,
5814                     string asm, RegisterOperand gprty>
5815: I<(outs VecList:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
5816  asm, "\t$Zt, $Pg/z, [$Rn, $Rm]",
5817  "",
5818  []>, Sched<[]> {
5819  bits<3> Pg;
5820  bits<5> Rm;
5821  bits<5> Rn;
5822  bits<5> Zt;
5823  let Inst{31-25} = 0b1010010;
5824  let Inst{24-23} = sz;
5825  let Inst{22-21} = nregs;
5826  let Inst{20-16} = Rm;
5827  let Inst{15-13} = 0b110;
5828  let Inst{12-10} = Pg;
5829  let Inst{9-5}   = Rn;
5830  let Inst{4-0}   = Zt;
5831
5832  let mayLoad = 1;
5833}
5834
5835//===----------------------------------------------------------------------===//
5836// SVE Memory - 32-bit Gather and Unsized Contiguous Group
5837//===----------------------------------------------------------------------===//
5838
5839// bit xs      is '1' if offsets are signed
5840// bit scaled  is '1' if the offsets are scaled
5841class sve_mem_32b_gld_sv<bits<4> opc, bit xs, bit scaled, string asm,
5842                         RegisterOperand zprext>
5843: I<(outs Z_s:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, zprext:$Zm),
5844  asm, "\t$Zt, $Pg/z, [$Rn, $Zm]",
5845  "",
5846  []>, Sched<[]> {
5847  bits<3> Pg;
5848  bits<5> Rn;
5849  bits<5> Zm;
5850  bits<5> Zt;
5851  let Inst{31-25} = 0b1000010;
5852  let Inst{24-23} = opc{3-2};
5853  let Inst{22}    = xs;
5854  let Inst{21}    = scaled;
5855  let Inst{20-16} = Zm;
5856  let Inst{15}    = 0b0;
5857  let Inst{14-13} = opc{1-0};
5858  let Inst{12-10} = Pg;
5859  let Inst{9-5}   = Rn;
5860  let Inst{4-0}   = Zt;
5861
5862  let mayLoad = 1;
5863  let Defs = !if(!eq(opc{0}, 1), [FFR], []);
5864  let Uses = !if(!eq(opc{0}, 1), [FFR], []);
5865}
5866
5867multiclass sve_mem_32b_gld_sv_32_scaled<bits<4> opc, string asm,
5868                                        SDPatternOperator sxtw_op,
5869                                        SDPatternOperator uxtw_op,
5870                                        RegisterOperand sxtw_opnd,
5871                                        RegisterOperand uxtw_opnd,
5872                                        ValueType vt> {
5873  def _UXTW_SCALED_REAL : sve_mem_32b_gld_sv<opc, 0, 1, asm, uxtw_opnd>;
5874  def _SXTW_SCALED_REAL : sve_mem_32b_gld_sv<opc, 1, 1, asm, sxtw_opnd>;
5875
5876  def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
5877                  (!cast<Instruction>(NAME # _UXTW_SCALED_REAL) ZPR32:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm), 0>;
5878  def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
5879                  (!cast<Instruction>(NAME # _SXTW_SCALED_REAL) ZPR32:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm), 0>;
5880
5881  def : Pat<(nxv4i32 (uxtw_op (nxv4i1 PPR:$gp), GPR64sp:$base, (nxv4i32 ZPR:$indices), vt)),
5882            (!cast<Instruction>(NAME # _UXTW_SCALED_REAL) PPR:$gp, GPR64sp:$base, ZPR:$indices)>;
5883  def : Pat<(nxv4i32 (sxtw_op (nxv4i1 PPR:$gp), GPR64sp:$base, (nxv4i32 ZPR:$indices), vt)),
5884            (!cast<Instruction>(NAME # _SXTW_SCALED_REAL) PPR:$gp, GPR64sp:$base, ZPR:$indices)>;
5885}
5886
5887multiclass sve_mem_32b_gld_vs_32_unscaled<bits<4> opc, string asm,
5888                                          SDPatternOperator sxtw_op,
5889                                          SDPatternOperator uxtw_op,
5890                                          RegisterOperand sxtw_opnd,
5891                                          RegisterOperand uxtw_opnd,
5892                                          ValueType vt> {
5893  def _UXTW_REAL : sve_mem_32b_gld_sv<opc, 0, 0, asm, uxtw_opnd>;
5894  def _SXTW_REAL : sve_mem_32b_gld_sv<opc, 1, 0, asm, sxtw_opnd>;
5895
5896  def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
5897                  (!cast<Instruction>(NAME # _UXTW_REAL) ZPR32:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm), 0>;
5898  def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
5899                  (!cast<Instruction>(NAME # _SXTW_REAL) ZPR32:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm), 0>;
5900
5901  def : Pat<(nxv4i32 (uxtw_op (nxv4i1 PPR:$gp), GPR64sp:$base, (nxv4i32 ZPR:$offsets), vt)),
5902            (!cast<Instruction>(NAME # _UXTW_REAL) PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
5903  def : Pat<(nxv4i32 (sxtw_op (nxv4i1 PPR:$gp), GPR64sp:$base, (nxv4i32 ZPR:$offsets), vt)),
5904            (!cast<Instruction>(NAME # _SXTW_REAL) PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
5905}
5906
5907
5908class sve_mem_32b_gld_vi<bits<4> opc, string asm, Operand imm_ty>
5909: I<(outs Z_s:$Zt), (ins PPR3bAny:$Pg, ZPR32:$Zn, imm_ty:$imm5),
5910  asm, "\t$Zt, $Pg/z, [$Zn, $imm5]",
5911  "",
5912  []>, Sched<[]> {
5913  bits<3> Pg;
5914  bits<5> Zn;
5915  bits<5> Zt;
5916  bits<5> imm5;
5917  let Inst{31-25} = 0b1000010;
5918  let Inst{24-23} = opc{3-2};
5919  let Inst{22-21} = 0b01;
5920  let Inst{20-16} = imm5;
5921  let Inst{15}    = 0b1;
5922  let Inst{14-13} = opc{1-0};
5923  let Inst{12-10} = Pg;
5924  let Inst{9-5}   = Zn;
5925  let Inst{4-0}   = Zt;
5926
5927  let mayLoad = 1;
5928  let Defs = !if(!eq(opc{0}, 1), [FFR], []);
5929  let Uses = !if(!eq(opc{0}, 1), [FFR], []);
5930}
5931
5932multiclass sve_mem_32b_gld_vi_32_ptrs<bits<4> opc, string asm, Operand imm_ty,
5933                                      SDPatternOperator op, ValueType vt> {
5934  def _IMM_REAL : sve_mem_32b_gld_vi<opc, asm, imm_ty>;
5935
5936  def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn]",
5937                  (!cast<Instruction>(NAME # _IMM_REAL) ZPR32:$Zt, PPR3bAny:$Pg, ZPR32:$Zn, 0), 0>;
5938  def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn, $imm5]",
5939                  (!cast<Instruction>(NAME # _IMM_REAL) ZPR32:$Zt, PPR3bAny:$Pg, ZPR32:$Zn, imm_ty:$imm5), 0>;
5940  def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn]",
5941                  (!cast<Instruction>(NAME # _IMM_REAL) Z_s:$Zt, PPR3bAny:$Pg, ZPR32:$Zn, 0), 1>;
5942
5943  def : Pat<(nxv4i32 (op (nxv4i1 PPR:$gp), (nxv4i32 ZPR:$ptrs), imm_ty:$index, vt)),
5944            (!cast<Instruction>(NAME # _IMM_REAL) PPR:$gp, ZPR:$ptrs, imm_ty:$index)>;
5945}
5946
5947class sve_mem_prfm_si<bits<2> msz, string asm>
5948: I<(outs), (ins sve_prfop:$prfop, PPR3bAny:$Pg, GPR64sp:$Rn, simm6s1:$imm6),
5949  asm, "\t$prfop, $Pg, [$Rn, $imm6, mul vl]",
5950  "",
5951  []>, Sched<[]> {
5952  bits<5> Rn;
5953  bits<3> Pg;
5954  bits<6> imm6;
5955  bits<4> prfop;
5956  let Inst{31-22} = 0b1000010111;
5957  let Inst{21-16} = imm6;
5958  let Inst{15}    = 0b0;
5959  let Inst{14-13} = msz;
5960  let Inst{12-10} = Pg;
5961  let Inst{9-5}   = Rn;
5962  let Inst{4}     = 0b0;
5963  let Inst{3-0}   = prfop;
5964
5965  let hasSideEffects = 1;
5966}
5967
5968multiclass sve_mem_prfm_si<bits<2> msz, string asm> {
5969  def NAME : sve_mem_prfm_si<msz, asm>;
5970
5971  def : InstAlias<asm # "\t$prfop, $Pg, [$Rn]",
5972                  (!cast<Instruction>(NAME) sve_prfop:$prfop, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
5973}
5974
5975class sve_mem_prfm_ss<bits<3> opc, string asm, RegisterOperand gprty>
5976: I<(outs), (ins sve_prfop:$prfop, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
5977  asm, "\t$prfop, $Pg, [$Rn, $Rm]",
5978  "",
5979  []>, Sched<[]> {
5980  bits<5> Rm;
5981  bits<5> Rn;
5982  bits<3> Pg;
5983  bits<4> prfop;
5984  let Inst{31-25} = 0b1000010;
5985  let Inst{24-23} = opc{2-1};
5986  let Inst{22-21} = 0b00;
5987  let Inst{20-16} = Rm;
5988  let Inst{15}    = 0b1;
5989  let Inst{14}    = opc{0};
5990  let Inst{13}    = 0b0;
5991  let Inst{12-10} = Pg;
5992  let Inst{9-5}   = Rn;
5993  let Inst{4}     = 0b0;
5994  let Inst{3-0}   = prfop;
5995
5996  let hasSideEffects = 1;
5997}
5998
5999class sve_mem_32b_prfm_sv<bits<2> msz, bit xs, string asm,
6000                          RegisterOperand zprext>
6001: I<(outs), (ins sve_prfop:$prfop, PPR3bAny:$Pg, GPR64sp:$Rn, zprext:$Zm),
6002  asm, "\t$prfop, $Pg, [$Rn, $Zm]",
6003  "",
6004  []>, Sched<[]> {
6005  bits<3> Pg;
6006  bits<5> Rn;
6007  bits<5> Zm;
6008  bits<4> prfop;
6009  let Inst{31-23} = 0b100001000;
6010  let Inst{22}    = xs;
6011  let Inst{21}    = 0b1;
6012  let Inst{20-16} = Zm;
6013  let Inst{15}    = 0b0;
6014  let Inst{14-13} = msz;
6015  let Inst{12-10} = Pg;
6016  let Inst{9-5}   = Rn;
6017  let Inst{4}     = 0b0;
6018  let Inst{3-0}   = prfop;
6019
6020  let hasSideEffects = 1;
6021}
6022
6023multiclass sve_mem_32b_prfm_sv_scaled<bits<2> msz, string asm,
6024                                      RegisterOperand sxtw_opnd,
6025                                      RegisterOperand uxtw_opnd> {
6026  def _UXTW_SCALED : sve_mem_32b_prfm_sv<msz, 0, asm, uxtw_opnd>;
6027  def _SXTW_SCALED : sve_mem_32b_prfm_sv<msz, 1, asm, sxtw_opnd>;
6028}
6029
6030class sve_mem_32b_prfm_vi<bits<2> msz, string asm, Operand imm_ty>
6031: I<(outs), (ins sve_prfop:$prfop, PPR3bAny:$Pg, ZPR32:$Zn, imm_ty:$imm5),
6032  asm, "\t$prfop, $Pg, [$Zn, $imm5]",
6033  "",
6034  []>, Sched<[]> {
6035  bits<3> Pg;
6036  bits<5> Zn;
6037  bits<5> imm5;
6038  bits<4> prfop;
6039  let Inst{31-25} = 0b1000010;
6040  let Inst{24-23} = msz;
6041  let Inst{22-21} = 0b00;
6042  let Inst{20-16} = imm5;
6043  let Inst{15-13} = 0b111;
6044  let Inst{12-10} = Pg;
6045  let Inst{9-5}   = Zn;
6046  let Inst{4}     = 0b0;
6047  let Inst{3-0}   = prfop;
6048}
6049
6050multiclass sve_mem_32b_prfm_vi<bits<2> msz, string asm, Operand imm_ty> {
6051  def NAME : sve_mem_32b_prfm_vi<msz, asm, imm_ty>;
6052
6053  def : InstAlias<asm # "\t$prfop, $Pg, [$Zn]",
6054                  (!cast<Instruction>(NAME) sve_prfop:$prfop, PPR3bAny:$Pg, ZPR32:$Zn, 0), 1>;
6055}
6056
6057class sve_mem_z_fill<string asm>
6058: I<(outs ZPRAny:$Zt), (ins GPR64sp:$Rn, simm9:$imm9),
6059  asm, "\t$Zt, [$Rn, $imm9, mul vl]",
6060  "",
6061  []>, Sched<[]> {
6062  bits<5> Rn;
6063  bits<5> Zt;
6064  bits<9> imm9;
6065  let Inst{31-22} = 0b1000010110;
6066  let Inst{21-16} = imm9{8-3};
6067  let Inst{15-13} = 0b010;
6068  let Inst{12-10} = imm9{2-0};
6069  let Inst{9-5}   = Rn;
6070  let Inst{4-0}   = Zt;
6071
6072  let mayLoad = 1;
6073}
6074
6075multiclass sve_mem_z_fill<string asm> {
6076  def NAME : sve_mem_z_fill<asm>;
6077
6078  def : InstAlias<asm # "\t$Zt, [$Rn]",
6079                  (!cast<Instruction>(NAME) ZPRAny:$Zt, GPR64sp:$Rn, 0), 1>;
6080}
6081
6082class sve_mem_p_fill<string asm>
6083: I<(outs PPRAny:$Pt), (ins GPR64sp:$Rn, simm9:$imm9),
6084  asm, "\t$Pt, [$Rn, $imm9, mul vl]",
6085  "",
6086  []>, Sched<[]> {
6087  bits<4> Pt;
6088  bits<5> Rn;
6089  bits<9> imm9;
6090  let Inst{31-22} = 0b1000010110;
6091  let Inst{21-16} = imm9{8-3};
6092  let Inst{15-13} = 0b000;
6093  let Inst{12-10} = imm9{2-0};
6094  let Inst{9-5}   = Rn;
6095  let Inst{4}     = 0b0;
6096  let Inst{3-0}   = Pt;
6097
6098  let mayLoad = 1;
6099}
6100
6101multiclass sve_mem_p_fill<string asm> {
6102  def NAME : sve_mem_p_fill<asm>;
6103
6104  def : InstAlias<asm # "\t$Pt, [$Rn]",
6105                  (!cast<Instruction>(NAME) PPRAny:$Pt, GPR64sp:$Rn, 0), 1>;
6106}
6107
6108class sve2_mem_gldnt_vs_base<bits<5> opc, dag iops, string asm,
6109                             RegisterOperand VecList>
6110: I<(outs VecList:$Zt), iops,
6111  asm, "\t$Zt, $Pg/z, [$Zn, $Rm]",
6112  "",
6113  []>, Sched<[]> {
6114  bits<3> Pg;
6115  bits<5> Rm;
6116  bits<5> Zn;
6117  bits<5> Zt;
6118  let Inst{31}    = 0b1;
6119  let Inst{30}    = opc{4};
6120  let Inst{29-25} = 0b00010;
6121  let Inst{24-23} = opc{3-2};
6122  let Inst{22-21} = 0b00;
6123  let Inst{20-16} = Rm;
6124  let Inst{15}    = 0b1;
6125  let Inst{14-13} = opc{1-0};
6126  let Inst{12-10} = Pg;
6127  let Inst{9-5}   = Zn;
6128  let Inst{4-0}   = Zt;
6129
6130  let mayLoad = 1;
6131}
6132
6133multiclass sve2_mem_gldnt_vs<bits<5> opc, string asm,
6134                             RegisterOperand listty, ZPRRegOp zprty> {
6135  def _REAL : sve2_mem_gldnt_vs_base<opc, (ins PPR3bAny:$Pg, zprty:$Zn, GPR64:$Rm),
6136                                     asm, listty>;
6137
6138  def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn, $Rm]",
6139                 (!cast<Instruction>(NAME # _REAL) zprty:$Zt, PPR3bAny:$Pg, zprty:$Zn, GPR64:$Rm), 0>;
6140  def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn]",
6141                 (!cast<Instruction>(NAME # _REAL) zprty:$Zt, PPR3bAny:$Pg, zprty:$Zn, XZR), 0>;
6142  def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn]",
6143                 (!cast<Instruction>(NAME # _REAL) listty:$Zt, PPR3bAny:$Pg, zprty:$Zn, XZR), 1>;
6144}
6145
6146//===----------------------------------------------------------------------===//
6147// SVE Memory - 64-bit Gather Group
6148//===----------------------------------------------------------------------===//
6149
6150// bit xs      is '1' if offsets are signed
6151// bit scaled  is '1' if the offsets are scaled
6152// bit lsl     is '0' if the offsets are extended (uxtw/sxtw), '1' if shifted (lsl)
6153class sve_mem_64b_gld_sv<bits<4> opc, bit xs, bit scaled, bit lsl, string asm,
6154                         RegisterOperand zprext>
6155: I<(outs Z_d:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, zprext:$Zm),
6156  asm, "\t$Zt, $Pg/z, [$Rn, $Zm]",
6157  "",
6158  []>, Sched<[]> {
6159  bits<3> Pg;
6160  bits<5> Rn;
6161  bits<5> Zm;
6162  bits<5> Zt;
6163  let Inst{31-25} = 0b1100010;
6164  let Inst{24-23} = opc{3-2};
6165  let Inst{22}    = xs;
6166  let Inst{21}    = scaled;
6167  let Inst{20-16} = Zm;
6168  let Inst{15}    = lsl;
6169  let Inst{14-13} = opc{1-0};
6170  let Inst{12-10} = Pg;
6171  let Inst{9-5}   = Rn;
6172  let Inst{4-0}   = Zt;
6173
6174  let mayLoad = 1;
6175  let Defs = !if(!eq(opc{0}, 1), [FFR], []);
6176  let Uses = !if(!eq(opc{0}, 1), [FFR], []);
6177}
6178
6179multiclass sve_mem_64b_gld_sv_32_scaled<bits<4> opc, string asm,
6180                                        SDPatternOperator sxtw_op,
6181                                        SDPatternOperator uxtw_op,
6182                                        RegisterOperand sxtw_opnd,
6183                                        RegisterOperand uxtw_opnd,
6184                                        ValueType vt> {
6185  def _UXTW_SCALED_REAL : sve_mem_64b_gld_sv<opc, 0, 1, 0, asm, uxtw_opnd>;
6186  def _SXTW_SCALED_REAL : sve_mem_64b_gld_sv<opc, 1, 1, 0, asm, sxtw_opnd>;
6187
6188  def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
6189                  (!cast<Instruction>(NAME # _UXTW_SCALED_REAL) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm), 0>;
6190  def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
6191                  (!cast<Instruction>(NAME # _SXTW_SCALED_REAL) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm), 0>;
6192
6193  def : Pat<(nxv2i64 (uxtw_op (nxv2i1 PPR:$gp), GPR64sp:$base, (nxv2i64 ZPR:$indices), vt)),
6194            (!cast<Instruction>(NAME # _UXTW_SCALED_REAL) PPR:$gp, GPR64sp:$base, ZPR:$indices)>;
6195  def : Pat<(nxv2i64 (sxtw_op (nxv2i1 PPR:$gp), GPR64sp:$base, (nxv2i64 ZPR:$indices), vt)),
6196            (!cast<Instruction>(NAME # _SXTW_SCALED_REAL) PPR:$gp, GPR64sp:$base, ZPR:$indices)>;
6197}
6198
6199multiclass sve_mem_64b_gld_vs_32_unscaled<bits<4> opc, string asm,
6200                                          SDPatternOperator sxtw_op,
6201                                          SDPatternOperator uxtw_op,
6202                                          RegisterOperand sxtw_opnd,
6203                                          RegisterOperand uxtw_opnd,
6204                                          ValueType vt> {
6205  def _UXTW_REAL : sve_mem_64b_gld_sv<opc, 0, 0, 0, asm, uxtw_opnd>;
6206  def _SXTW_REAL : sve_mem_64b_gld_sv<opc, 1, 0, 0, asm, sxtw_opnd>;
6207
6208  def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
6209                  (!cast<Instruction>(NAME # _UXTW_REAL) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm), 0>;
6210  def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
6211                  (!cast<Instruction>(NAME # _SXTW_REAL) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm), 0>;
6212
6213  def : Pat<(nxv2i64 (uxtw_op (nxv2i1 PPR:$gp), GPR64sp:$base, (nxv2i64 ZPR:$offsets), vt)),
6214            (!cast<Instruction>(NAME # _UXTW_REAL) PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
6215  def : Pat<(nxv2i64 (sxtw_op (nxv2i1 PPR:$gp), GPR64sp:$base, (nxv2i64 ZPR:$offsets), vt)),
6216            (!cast<Instruction>(NAME # _SXTW_REAL) PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
6217}
6218
6219multiclass sve_mem_64b_gld_sv2_64_scaled<bits<4> opc, string asm,
6220                                         SDPatternOperator op,
6221                                         RegisterOperand zprext, ValueType vt> {
6222  def _SCALED_REAL : sve_mem_64b_gld_sv<opc, 1, 1, 1, asm, zprext>;
6223
6224  def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
6225                  (!cast<Instruction>(NAME # _SCALED_REAL) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, zprext:$Zm), 0>;
6226
6227  def : Pat<(nxv2i64 (op (nxv2i1 PPR:$gp), GPR64sp:$base, (nxv2i64 ZPR:$indices), vt)),
6228                     (!cast<Instruction>(NAME # _SCALED_REAL) PPR:$gp, GPR64sp:$base, ZPR:$indices)>;
6229}
6230
6231multiclass sve_mem_64b_gld_vs2_64_unscaled<bits<4> opc, string asm,
6232                                           SDPatternOperator op, ValueType vt> {
6233  def _REAL : sve_mem_64b_gld_sv<opc, 1, 0, 1, asm, ZPR64ExtLSL8>;
6234
6235  def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
6236                  (!cast<Instruction>(NAME # _REAL) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, ZPR64ExtLSL8:$Zm), 0>;
6237
6238  def : Pat<(nxv2i64 (op (nxv2i1 PPR:$gp), GPR64sp:$base, (nxv2i64 ZPR:$offsets), vt)),
6239            (!cast<Instruction>(NAME # _REAL) PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
6240}
6241
6242class sve_mem_64b_gld_vi<bits<4> opc, string asm, Operand imm_ty>
6243: I<(outs Z_d:$Zt), (ins PPR3bAny:$Pg, ZPR64:$Zn, imm_ty:$imm5),
6244  asm, "\t$Zt, $Pg/z, [$Zn, $imm5]",
6245  "",
6246  []>, Sched<[]> {
6247  bits<3> Pg;
6248  bits<5> Zn;
6249  bits<5> Zt;
6250  bits<5> imm5;
6251  let Inst{31-25} = 0b1100010;
6252  let Inst{24-23} = opc{3-2};
6253  let Inst{22-21} = 0b01;
6254  let Inst{20-16} = imm5;
6255  let Inst{15}    = 0b1;
6256  let Inst{14-13} = opc{1-0};
6257  let Inst{12-10} = Pg;
6258  let Inst{9-5}   = Zn;
6259  let Inst{4-0}   = Zt;
6260
6261  let mayLoad = 1;
6262  let Defs = !if(!eq(opc{0}, 1), [FFR], []);
6263  let Uses = !if(!eq(opc{0}, 1), [FFR], []);
6264}
6265
6266multiclass sve_mem_64b_gld_vi_64_ptrs<bits<4> opc, string asm, Operand imm_ty,
6267                                      SDPatternOperator op, ValueType vt> {
6268  def _IMM_REAL : sve_mem_64b_gld_vi<opc, asm, imm_ty>;
6269
6270  def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn]",
6271                  (!cast<Instruction>(NAME # _IMM_REAL) ZPR64:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, 0), 0>;
6272  def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn, $imm5]",
6273                 (!cast<Instruction>(NAME # _IMM_REAL) ZPR64:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, imm_ty:$imm5), 0>;
6274  def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn]",
6275                  (!cast<Instruction>(NAME # _IMM_REAL) Z_d:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, 0), 1>;
6276
6277  def : Pat<(nxv2i64 (op (nxv2i1 PPR:$gp), (nxv2i64 ZPR:$ptrs), imm_ty:$index, vt)),
6278            (!cast<Instruction>(NAME # _IMM_REAL) PPR:$gp, ZPR:$ptrs, imm_ty:$index)>;
6279}
6280
6281// bit lsl is '0' if the offsets are extended (uxtw/sxtw), '1' if shifted (lsl)
6282class sve_mem_64b_prfm_sv<bits<2> msz, bit xs, bit lsl, string asm,
6283                          RegisterOperand zprext>
6284: I<(outs), (ins sve_prfop:$prfop, PPR3bAny:$Pg, GPR64sp:$Rn, zprext:$Zm),
6285  asm, "\t$prfop, $Pg, [$Rn, $Zm]",
6286  "",
6287  []>, Sched<[]> {
6288  bits<3> Pg;
6289  bits<5> Rn;
6290  bits<5> Zm;
6291  bits<4> prfop;
6292  let Inst{31-23} = 0b110001000;
6293  let Inst{22}    = xs;
6294  let Inst{21}    = 0b1;
6295  let Inst{20-16} = Zm;
6296  let Inst{15}    = lsl;
6297  let Inst{14-13} = msz;
6298  let Inst{12-10} = Pg;
6299  let Inst{9-5}   = Rn;
6300  let Inst{4}     = 0b0;
6301  let Inst{3-0}   = prfop;
6302
6303  let hasSideEffects = 1;
6304}
6305
6306multiclass sve_mem_64b_prfm_sv_ext_scaled<bits<2> msz, string asm,
6307                                          RegisterOperand sxtw_opnd,
6308                                          RegisterOperand uxtw_opnd> {
6309  def _UXTW_SCALED : sve_mem_64b_prfm_sv<msz, 0, 0, asm, uxtw_opnd>;
6310  def _SXTW_SCALED : sve_mem_64b_prfm_sv<msz, 1, 0, asm, sxtw_opnd>;
6311}
6312
6313multiclass sve_mem_64b_prfm_sv_lsl_scaled<bits<2> msz, string asm,
6314                                          RegisterOperand zprext> {
6315  def NAME : sve_mem_64b_prfm_sv<msz, 1, 1, asm, zprext>;
6316}
6317
6318
6319class sve_mem_64b_prfm_vi<bits<2> msz, string asm, Operand imm_ty>
6320: I<(outs), (ins sve_prfop:$prfop, PPR3bAny:$Pg, ZPR64:$Zn, imm_ty:$imm5),
6321  asm, "\t$prfop, $Pg, [$Zn, $imm5]",
6322  "",
6323  []>, Sched<[]> {
6324  bits<3> Pg;
6325  bits<5> Zn;
6326  bits<5> imm5;
6327  bits<4> prfop;
6328  let Inst{31-25} = 0b1100010;
6329  let Inst{24-23} = msz;
6330  let Inst{22-21} = 0b00;
6331  let Inst{20-16} = imm5;
6332  let Inst{15-13} = 0b111;
6333  let Inst{12-10} = Pg;
6334  let Inst{9-5}   = Zn;
6335  let Inst{4}     = 0b0;
6336  let Inst{3-0}   = prfop;
6337
6338  let hasSideEffects = 1;
6339}
6340
6341multiclass sve_mem_64b_prfm_vi<bits<2> msz, string asm, Operand imm_ty> {
6342  def NAME : sve_mem_64b_prfm_vi<msz, asm, imm_ty>;
6343
6344  def : InstAlias<asm # "\t$prfop, $Pg, [$Zn]",
6345                  (!cast<Instruction>(NAME) sve_prfop:$prfop, PPR3bAny:$Pg, ZPR64:$Zn, 0), 1>;
6346}
6347
6348
6349//===----------------------------------------------------------------------===//
6350// SVE Compute Vector Address Group
6351//===----------------------------------------------------------------------===//
6352
6353class sve_int_bin_cons_misc_0_a<bits<2> opc, bits<2> msz, string asm,
6354                                ZPRRegOp zprty, RegisterOperand zprext>
6355: I<(outs zprty:$Zd), (ins zprty:$Zn, zprext:$Zm),
6356  asm, "\t$Zd, [$Zn, $Zm]",
6357  "",
6358  []>, Sched<[]> {
6359  bits<5> Zd;
6360  bits<5> Zn;
6361  bits<5> Zm;
6362  let Inst{31-24} = 0b00000100;
6363  let Inst{23-22} = opc;
6364  let Inst{21}    = 0b1;
6365  let Inst{20-16} = Zm;
6366  let Inst{15-12} = 0b1010;
6367  let Inst{11-10} = msz;
6368  let Inst{9-5}   = Zn;
6369  let Inst{4-0}   = Zd;
6370}
6371
6372multiclass sve_int_bin_cons_misc_0_a_uxtw<bits<2> opc, string asm> {
6373  def _0 : sve_int_bin_cons_misc_0_a<opc, 0b00, asm, ZPR64, ZPR64ExtUXTW8>;
6374  def _1 : sve_int_bin_cons_misc_0_a<opc, 0b01, asm, ZPR64, ZPR64ExtUXTW16>;
6375  def _2 : sve_int_bin_cons_misc_0_a<opc, 0b10, asm, ZPR64, ZPR64ExtUXTW32>;
6376  def _3 : sve_int_bin_cons_misc_0_a<opc, 0b11, asm, ZPR64, ZPR64ExtUXTW64>;
6377}
6378
6379multiclass sve_int_bin_cons_misc_0_a_sxtw<bits<2> opc, string asm> {
6380  def _0 : sve_int_bin_cons_misc_0_a<opc, 0b00, asm, ZPR64, ZPR64ExtSXTW8>;
6381  def _1 : sve_int_bin_cons_misc_0_a<opc, 0b01, asm, ZPR64, ZPR64ExtSXTW16>;
6382  def _2 : sve_int_bin_cons_misc_0_a<opc, 0b10, asm, ZPR64, ZPR64ExtSXTW32>;
6383  def _3 : sve_int_bin_cons_misc_0_a<opc, 0b11, asm, ZPR64, ZPR64ExtSXTW64>;
6384}
6385
6386multiclass sve_int_bin_cons_misc_0_a_32_lsl<bits<2> opc, string asm> {
6387  def _0 : sve_int_bin_cons_misc_0_a<opc, 0b00, asm, ZPR32, ZPR32ExtLSL8>;
6388  def _1 : sve_int_bin_cons_misc_0_a<opc, 0b01, asm, ZPR32, ZPR32ExtLSL16>;
6389  def _2 : sve_int_bin_cons_misc_0_a<opc, 0b10, asm, ZPR32, ZPR32ExtLSL32>;
6390  def _3 : sve_int_bin_cons_misc_0_a<opc, 0b11, asm, ZPR32, ZPR32ExtLSL64>;
6391}
6392
6393multiclass sve_int_bin_cons_misc_0_a_64_lsl<bits<2> opc, string asm> {
6394  def _0 : sve_int_bin_cons_misc_0_a<opc, 0b00, asm, ZPR64, ZPR64ExtLSL8>;
6395  def _1 : sve_int_bin_cons_misc_0_a<opc, 0b01, asm, ZPR64, ZPR64ExtLSL16>;
6396  def _2 : sve_int_bin_cons_misc_0_a<opc, 0b10, asm, ZPR64, ZPR64ExtLSL32>;
6397  def _3 : sve_int_bin_cons_misc_0_a<opc, 0b11, asm, ZPR64, ZPR64ExtLSL64>;
6398}
6399
6400
6401//===----------------------------------------------------------------------===//
6402// SVE Integer Misc - Unpredicated Group
6403//===----------------------------------------------------------------------===//
6404
6405class sve_int_bin_cons_misc_0_b<bits<2> sz, string asm, ZPRRegOp zprty>
6406: I<(outs zprty:$Zd), (ins zprty:$Zn, zprty:$Zm),
6407  asm, "\t$Zd, $Zn, $Zm",
6408  "",
6409  []>, Sched<[]> {
6410  bits<5> Zd;
6411  bits<5> Zm;
6412  bits<5> Zn;
6413  let Inst{31-24} = 0b00000100;
6414  let Inst{23-22} = sz;
6415  let Inst{21}    = 0b1;
6416  let Inst{20-16} = Zm;
6417  let Inst{15-10} = 0b101100;
6418  let Inst{9-5}   = Zn;
6419  let Inst{4-0}   = Zd;
6420}
6421
6422multiclass sve_int_bin_cons_misc_0_b<string asm, SDPatternOperator op> {
6423  def _H : sve_int_bin_cons_misc_0_b<0b01, asm, ZPR16>;
6424  def _S : sve_int_bin_cons_misc_0_b<0b10, asm, ZPR32>;
6425  def _D : sve_int_bin_cons_misc_0_b<0b11, asm, ZPR64>;
6426
6427  def : SVE_2_Op_Pat<nxv8f16, op, nxv8f16, nxv8i16, !cast<Instruction>(NAME # _H)>;
6428  def : SVE_2_Op_Pat<nxv4f32, op, nxv4f32, nxv4i32, !cast<Instruction>(NAME # _S)>;
6429  def : SVE_2_Op_Pat<nxv2f64, op, nxv2f64, nxv2i64, !cast<Instruction>(NAME # _D)>;
6430}
6431
6432class sve_int_bin_cons_misc_0_c<bits<8> opc, string asm, ZPRRegOp zprty>
6433: I<(outs zprty:$Zd), (ins zprty:$Zn),
6434  asm, "\t$Zd, $Zn",
6435  "",
6436  []>, Sched<[]> {
6437  bits<5> Zd;
6438  bits<5> Zn;
6439  let Inst{31-24} = 0b00000100;
6440  let Inst{23-22} = opc{7-6};
6441  let Inst{21}    = 0b1;
6442  let Inst{20-16} = opc{5-1};
6443  let Inst{15-11} = 0b10111;
6444  let Inst{10}    = opc{0};
6445  let Inst{9-5}   = Zn;
6446  let Inst{4-0}   = Zd;
6447}
6448
6449multiclass sve_int_bin_cons_misc_0_c_fexpa<string asm, SDPatternOperator op> {
6450  def _H : sve_int_bin_cons_misc_0_c<0b01000000, asm, ZPR16>;
6451  def _S : sve_int_bin_cons_misc_0_c<0b10000000, asm, ZPR32>;
6452  def _D : sve_int_bin_cons_misc_0_c<0b11000000, asm, ZPR64>;
6453
6454  def : SVE_1_Op_Pat<nxv8f16, op, nxv8i16, !cast<Instruction>(NAME # _H)>;
6455  def : SVE_1_Op_Pat<nxv4f32, op, nxv4i32, !cast<Instruction>(NAME # _S)>;
6456  def : SVE_1_Op_Pat<nxv2f64, op, nxv2i64, !cast<Instruction>(NAME # _D)>;
6457}
6458
6459//===----------------------------------------------------------------------===//
6460// SVE Integer Reduction Group
6461//===----------------------------------------------------------------------===//
6462
6463class sve_int_reduce<bits<2> sz8_32, bits<2> fmt, bits<3> opc, string asm,
6464                     ZPRRegOp zprty, RegisterClass regtype>
6465: I<(outs regtype:$Vd), (ins PPR3bAny:$Pg, zprty:$Zn),
6466  asm, "\t$Vd, $Pg, $Zn",
6467  "",
6468  []>, Sched<[]> {
6469  bits<3> Pg;
6470  bits<5> Vd;
6471  bits<5> Zn;
6472  let Inst{31-24} = 0b00000100;
6473  let Inst{23-22} = sz8_32;
6474  let Inst{21}    = 0b0;
6475  let Inst{20-19} = fmt;
6476  let Inst{18-16} = opc;
6477  let Inst{15-13} = 0b001;
6478  let Inst{12-10} = Pg;
6479  let Inst{9-5}   = Zn;
6480  let Inst{4-0}   = Vd;
6481}
6482
6483multiclass sve_int_reduce_0_saddv<bits<3> opc, string asm, SDPatternOperator op> {
6484  def _B : sve_int_reduce<0b00, 0b00, opc, asm, ZPR8, FPR64>;
6485  def _H : sve_int_reduce<0b01, 0b00, opc, asm, ZPR16, FPR64>;
6486  def _S : sve_int_reduce<0b10, 0b00, opc, asm, ZPR32, FPR64>;
6487
6488  def : SVE_2_Op_Pat<i64, op, nxv16i1, nxv16i8, !cast<Instruction>(NAME # _B)>;
6489  def : SVE_2_Op_Pat<i64, op, nxv8i1, nxv8i16, !cast<Instruction>(NAME # _H)>;
6490  def : SVE_2_Op_Pat<i64, op, nxv4i1, nxv4i32, !cast<Instruction>(NAME # _S)>;
6491}
6492
6493multiclass sve_int_reduce_0_uaddv<bits<3> opc, string asm, SDPatternOperator op, SDPatternOperator opSaddv> {
6494  def _B : sve_int_reduce<0b00, 0b00, opc, asm, ZPR8, FPR64>;
6495  def _H : sve_int_reduce<0b01, 0b00, opc, asm, ZPR16, FPR64>;
6496  def _S : sve_int_reduce<0b10, 0b00, opc, asm, ZPR32, FPR64>;
6497  def _D : sve_int_reduce<0b11, 0b00, opc, asm, ZPR64, FPR64>;
6498
6499  def : SVE_2_Op_Pat<i64, op, nxv16i1, nxv16i8, !cast<Instruction>(NAME # _B)>;
6500  def : SVE_2_Op_Pat<i64, op, nxv8i1, nxv8i16, !cast<Instruction>(NAME # _H)>;
6501  def : SVE_2_Op_Pat<i64, op, nxv4i1, nxv4i32, !cast<Instruction>(NAME # _S)>;
6502  def : SVE_2_Op_Pat<i64, op, nxv2i1, nxv2i64, !cast<Instruction>(NAME # _D)>;
6503  def : SVE_2_Op_Pat<i64, opSaddv, nxv2i1, nxv2i64, !cast<Instruction>(NAME # _D)>;
6504}
6505
6506multiclass sve_int_reduce_1<bits<3> opc, string asm, SDPatternOperator op> {
6507  def _B : sve_int_reduce<0b00, 0b01, opc, asm, ZPR8, FPR8>;
6508  def _H : sve_int_reduce<0b01, 0b01, opc, asm, ZPR16, FPR16>;
6509  def _S : sve_int_reduce<0b10, 0b01, opc, asm, ZPR32, FPR32>;
6510  def _D : sve_int_reduce<0b11, 0b01, opc, asm, ZPR64, FPR64>;
6511
6512  def : SVE_2_Op_Pat_Reduce_To_Neon<v16i8, op, nxv16i1, nxv16i8, !cast<Instruction>(NAME # _B), bsub>;
6513  def : SVE_2_Op_Pat_Reduce_To_Neon<v8i16, op, nxv8i1, nxv8i16, !cast<Instruction>(NAME # _H), hsub>;
6514  def : SVE_2_Op_Pat_Reduce_To_Neon<v4i32, op, nxv4i1, nxv4i32, !cast<Instruction>(NAME # _S), ssub>;
6515  def : SVE_2_Op_Pat_Reduce_To_Neon<v2i64, op, nxv2i1, nxv2i64, !cast<Instruction>(NAME # _D), dsub>;
6516}
6517
6518multiclass sve_int_reduce_2<bits<3> opc, string asm, SDPatternOperator op> {
6519  def _B : sve_int_reduce<0b00, 0b11, opc, asm, ZPR8, FPR8>;
6520  def _H : sve_int_reduce<0b01, 0b11, opc, asm, ZPR16, FPR16>;
6521  def _S : sve_int_reduce<0b10, 0b11, opc, asm, ZPR32, FPR32>;
6522  def _D : sve_int_reduce<0b11, 0b11, opc, asm, ZPR64, FPR64>;
6523
6524  def : SVE_2_Op_Pat_Reduce_To_Neon<v16i8, op, nxv16i1, nxv16i8, !cast<Instruction>(NAME # _B), bsub>;
6525  def : SVE_2_Op_Pat_Reduce_To_Neon<v8i16, op, nxv8i1, nxv8i16, !cast<Instruction>(NAME # _H), hsub>;
6526  def : SVE_2_Op_Pat_Reduce_To_Neon<v4i32, op, nxv4i1, nxv4i32, !cast<Instruction>(NAME # _S), ssub>;
6527  def : SVE_2_Op_Pat_Reduce_To_Neon<v2i64, op, nxv2i1, nxv2i64, !cast<Instruction>(NAME # _D), dsub>;
6528}
6529
6530class sve_int_movprfx_pred<bits<2> sz8_32, bits<3> opc, string asm,
6531                           ZPRRegOp zprty, string pg_suffix, dag iops>
6532: I<(outs zprty:$Zd), iops,
6533  asm, "\t$Zd, $Pg"#pg_suffix#", $Zn",
6534  "",
6535  []>, Sched<[]> {
6536  bits<3> Pg;
6537  bits<5> Zd;
6538  bits<5> Zn;
6539  let Inst{31-24} = 0b00000100;
6540  let Inst{23-22} = sz8_32;
6541  let Inst{21-19} = 0b010;
6542  let Inst{18-16} = opc;
6543  let Inst{15-13} = 0b001;
6544  let Inst{12-10} = Pg;
6545  let Inst{9-5}   = Zn;
6546  let Inst{4-0}   = Zd;
6547
6548  let ElementSize = zprty.ElementSize;
6549}
6550
6551multiclass sve_int_movprfx_pred_merge<bits<3> opc, string asm> {
6552let Constraints = "$Zd = $_Zd" in {
6553  def _B : sve_int_movprfx_pred<0b00, opc, asm, ZPR8, "/m",
6554                                (ins ZPR8:$_Zd, PPR3bAny:$Pg, ZPR8:$Zn)>;
6555  def _H : sve_int_movprfx_pred<0b01, opc, asm, ZPR16, "/m",
6556                                (ins ZPR16:$_Zd, PPR3bAny:$Pg, ZPR16:$Zn)>;
6557  def _S : sve_int_movprfx_pred<0b10, opc, asm, ZPR32, "/m",
6558                                (ins ZPR32:$_Zd, PPR3bAny:$Pg, ZPR32:$Zn)>;
6559  def _D : sve_int_movprfx_pred<0b11, opc, asm, ZPR64, "/m",
6560                                (ins ZPR64:$_Zd, PPR3bAny:$Pg, ZPR64:$Zn)>;
6561}
6562}
6563
6564multiclass sve_int_movprfx_pred_zero<bits<3> opc, string asm> {
6565  def _B : sve_int_movprfx_pred<0b00, opc, asm, ZPR8, "/z",
6566                                (ins PPR3bAny:$Pg, ZPR8:$Zn)>;
6567  def _H : sve_int_movprfx_pred<0b01, opc, asm, ZPR16, "/z",
6568                                (ins PPR3bAny:$Pg, ZPR16:$Zn)>;
6569  def _S : sve_int_movprfx_pred<0b10, opc, asm, ZPR32, "/z",
6570                                (ins PPR3bAny:$Pg, ZPR32:$Zn)>;
6571  def _D : sve_int_movprfx_pred<0b11, opc, asm, ZPR64, "/z",
6572                                (ins PPR3bAny:$Pg, ZPR64:$Zn)>;
6573}
6574
6575//===----------------------------------------------------------------------===//
6576// SVE Propagate Break Group
6577//===----------------------------------------------------------------------===//
6578
6579class sve_int_brkp<bits<2> opc, string asm>
6580: I<(outs PPR8:$Pd), (ins PPRAny:$Pg, PPR8:$Pn, PPR8:$Pm),
6581  asm, "\t$Pd, $Pg/z, $Pn, $Pm",
6582  "",
6583  []>, Sched<[]> {
6584  bits<4> Pd;
6585  bits<4> Pg;
6586  bits<4> Pm;
6587  bits<4> Pn;
6588  let Inst{31-24} = 0b00100101;
6589  let Inst{23}    = 0b0;
6590  let Inst{22}    = opc{1};
6591  let Inst{21-20} = 0b00;
6592  let Inst{19-16} = Pm;
6593  let Inst{15-14} = 0b11;
6594  let Inst{13-10} = Pg;
6595  let Inst{9}     = 0b0;
6596  let Inst{8-5}   = Pn;
6597  let Inst{4}     = opc{0};
6598  let Inst{3-0}   = Pd;
6599
6600  let Defs = !if(!eq (opc{1}, 1), [NZCV], []);
6601}
6602
6603
6604//===----------------------------------------------------------------------===//
6605// SVE Partition Break Group
6606//===----------------------------------------------------------------------===//
6607
6608class sve_int_brkn<bit S, string asm>
6609: I<(outs PPR8:$Pdm), (ins PPRAny:$Pg, PPR8:$Pn, PPR8:$_Pdm),
6610  asm, "\t$Pdm, $Pg/z, $Pn, $_Pdm",
6611  "",
6612  []>, Sched<[]> {
6613  bits<4> Pdm;
6614  bits<4> Pg;
6615  bits<4> Pn;
6616  let Inst{31-23} = 0b001001010;
6617  let Inst{22}    = S;
6618  let Inst{21-14} = 0b01100001;
6619  let Inst{13-10} = Pg;
6620  let Inst{9}     = 0b0;
6621  let Inst{8-5}   = Pn;
6622  let Inst{4}     = 0b0;
6623  let Inst{3-0}   = Pdm;
6624
6625  let Constraints = "$Pdm = $_Pdm";
6626  let Defs = !if(!eq (S, 0b1), [NZCV], []);
6627}
6628
6629class sve_int_break<bits<3> opc, string asm, string suffix, dag iops>
6630: I<(outs PPR8:$Pd), iops,
6631  asm, "\t$Pd, $Pg"#suffix#", $Pn",
6632  "",
6633  []>, Sched<[]> {
6634  bits<4> Pd;
6635  bits<4> Pg;
6636  bits<4> Pn;
6637  let Inst{31-24} = 0b00100101;
6638  let Inst{23-22} = opc{2-1};
6639  let Inst{21-14} = 0b01000001;
6640  let Inst{13-10} = Pg;
6641  let Inst{9}     = 0b0;
6642  let Inst{8-5}   = Pn;
6643  let Inst{4}     = opc{0};
6644  let Inst{3-0}   = Pd;
6645
6646  let Constraints = !if(!eq (opc{0}, 1), "$Pd = $_Pd", "");
6647  let Defs = !if(!eq (opc{1}, 1), [NZCV], []);
6648
6649}
6650
6651multiclass sve_int_break_m<bits<3> opc, string asm> {
6652  def NAME : sve_int_break<opc, asm, "/m", (ins PPR8:$_Pd, PPRAny:$Pg, PPR8:$Pn)>;
6653}
6654
6655multiclass sve_int_break_z<bits<3> opc, string asm> {
6656  def NAME : sve_int_break<opc, asm, "/z", (ins PPRAny:$Pg, PPR8:$Pn)>;
6657}
6658
6659//===----------------------------------------------------------------------===//
6660// SVE2 String Processing Group
6661//===----------------------------------------------------------------------===//
6662
6663class sve2_char_match<bit sz, bit opc, string asm,
6664                      PPRRegOp pprty, ZPRRegOp zprty>
6665: I<(outs pprty:$Pd), (ins PPR3bAny:$Pg, zprty:$Zn, zprty:$Zm),
6666  asm, "\t$Pd, $Pg/z, $Zn, $Zm",
6667  "",
6668  []>, Sched<[]> {
6669  bits<4> Pd;
6670  bits<3> Pg;
6671  bits<5> Zm;
6672  bits<5> Zn;
6673  let Inst{31-23} = 0b010001010;
6674  let Inst{22}    = sz;
6675  let Inst{21}    = 0b1;
6676  let Inst{20-16} = Zm;
6677  let Inst{15-13} = 0b100;
6678  let Inst{12-10} = Pg;
6679  let Inst{9-5}   = Zn;
6680  let Inst{4}     = opc;
6681  let Inst{3-0}   = Pd;
6682
6683  let Defs = [NZCV];
6684}
6685
6686multiclass sve2_char_match<bit opc, string asm> {
6687  def _B : sve2_char_match<0b0, opc, asm, PPR8, ZPR8>;
6688  def _H : sve2_char_match<0b1, opc, asm, PPR16, ZPR16>;
6689}
6690
6691//===----------------------------------------------------------------------===//
6692// SVE2 Histogram Computation - Segment Group
6693//===----------------------------------------------------------------------===//
6694
6695class sve2_hist_gen_segment<string asm>
6696: I<(outs ZPR8:$Zd), (ins ZPR8:$Zn, ZPR8:$Zm),
6697  asm, "\t$Zd, $Zn, $Zm",
6698  "",
6699  []>, Sched<[]> {
6700  bits<5> Zd;
6701  bits<5> Zn;
6702  bits<5> Zm;
6703  let Inst{31-21} = 0b01000101001;
6704  let Inst{20-16} = Zm;
6705  let Inst{15-10} = 0b101000;
6706  let Inst{9-5}   = Zn;
6707  let Inst{4-0}   = Zd;
6708}
6709
6710//===----------------------------------------------------------------------===//
6711// SVE2 Histogram Computation - Vector Group
6712//===----------------------------------------------------------------------===//
6713
6714class sve2_hist_gen_vector<bit sz, string asm, ZPRRegOp zprty>
6715: I<(outs zprty:$Zd), (ins PPR3bAny:$Pg, zprty:$Zn, zprty:$Zm),
6716  asm, "\t$Zd, $Pg/z, $Zn, $Zm",
6717  "",
6718  []>, Sched<[]> {
6719  bits<5> Zd;
6720  bits<5> Zn;
6721  bits<3> Pg;
6722  bits<5> Zm;
6723  let Inst{31-23} = 0b010001011;
6724  let Inst{22}    = sz;
6725  let Inst{21}    = 0b1;
6726  let Inst{20-16} = Zm;
6727  let Inst{15-13} = 0b110;
6728  let Inst{12-10} = Pg;
6729  let Inst{9-5}   = Zn;
6730  let Inst{4-0}   = Zd;
6731}
6732
6733multiclass sve2_hist_gen_vector<string asm> {
6734  def _S : sve2_hist_gen_vector<0b0, asm, ZPR32>;
6735  def _D : sve2_hist_gen_vector<0b1, asm, ZPR64>;
6736}
6737
6738//===----------------------------------------------------------------------===//
6739// SVE2 Crypto Extensions Group
6740//===----------------------------------------------------------------------===//
6741
6742class sve2_crypto_cons_bin_op<bit opc, string asm, ZPRRegOp zprty>
6743: I<(outs zprty:$Zd), (ins zprty:$Zn, zprty:$Zm),
6744  asm, "\t$Zd, $Zn, $Zm",
6745  "",
6746  []>, Sched<[]> {
6747  bits<5> Zd;
6748  bits<5> Zn;
6749  bits<5> Zm;
6750  let Inst{31-21} = 0b01000101001;
6751  let Inst{20-16} = Zm;
6752  let Inst{15-11} = 0b11110;
6753  let Inst{10}    = opc;
6754  let Inst{9-5}   = Zn;
6755  let Inst{4-0}   = Zd;
6756}
6757
6758class sve2_crypto_des_bin_op<bits<2> opc, string asm, ZPRRegOp zprty>
6759: I<(outs zprty:$Zdn), (ins zprty:$_Zdn, zprty:$Zm),
6760  asm, "\t$Zdn, $_Zdn, $Zm",
6761  "",
6762  []>, Sched<[]> {
6763  bits<5> Zdn;
6764  bits<5> Zm;
6765  let Inst{31-17} = 0b010001010010001;
6766  let Inst{16}    = opc{1};
6767  let Inst{15-11} = 0b11100;
6768  let Inst{10}    = opc{0};
6769  let Inst{9-5}   = Zm;
6770  let Inst{4-0}   = Zdn;
6771
6772  let Constraints = "$Zdn = $_Zdn";
6773}
6774
6775class sve2_crypto_unary_op<bit opc, string asm>
6776: I<(outs ZPR8:$Zdn), (ins ZPR8:$_Zdn),
6777  asm, "\t$Zdn, $_Zdn",
6778  "",
6779  []>, Sched<[]> {
6780  bits<5> Zdn;
6781  let Inst{31-11} = 0b010001010010000011100;
6782  let Inst{10}    = opc;
6783  let Inst{9-5}   = 0b00000;
6784  let Inst{4-0}   = Zdn;
6785
6786  let Constraints = "$Zdn = $_Zdn";
6787}
6788