]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/lib/Target/AArch64/SVEInstrFormats.td
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[FreeBSD/FreeBSD.git] / contrib / llvm / lib / Target / AArch64 / SVEInstrFormats.td
1 //=-- SVEInstrFormats.td -  AArch64 SVE Instruction classes -*- tablegen -*--=//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // AArch64 Scalable Vector Extension (SVE) Instruction Class Definitions.
11 //
12 //===----------------------------------------------------------------------===//
13
14 def SVEPatternOperand : AsmOperandClass {
15   let Name = "SVEPattern";
16   let ParserMethod = "tryParseSVEPattern";
17   let PredicateMethod = "isSVEPattern";
18   let RenderMethod = "addImmOperands";
19   let DiagnosticType = "InvalidSVEPattern";
20 }
21
22 def sve_pred_enum : Operand<i32>, ImmLeaf<i32, [{
23   return (((uint32_t)Imm) < 32);
24   }]> {
25
26   let PrintMethod = "printSVEPattern";
27   let ParserMatchClass = SVEPatternOperand;
28 }
29
30 def SVEPrefetchOperand : AsmOperandClass {
31   let Name = "SVEPrefetch";
32   let ParserMethod = "tryParsePrefetch<true>";
33   let PredicateMethod = "isPrefetch";
34   let RenderMethod = "addPrefetchOperands";
35 }
36
37 def sve_prfop : Operand<i32>, ImmLeaf<i32, [{
38     return (((uint32_t)Imm) <= 15);
39   }]> {
40   let PrintMethod = "printPrefetchOp<true>";
41   let ParserMatchClass = SVEPrefetchOperand;
42 }
43
44 class SVELogicalImmOperand<int Width> : AsmOperandClass {
45   let Name = "SVELogicalImm" # Width;
46   let DiagnosticType = "LogicalSecondSource";
47   let PredicateMethod = "isLogicalImm<int" # Width # "_t>";
48   let RenderMethod = "addLogicalImmOperands<int" # Width # "_t>";
49 }
50
51 def sve_logical_imm8 : Operand<i64> {
52   let ParserMatchClass = SVELogicalImmOperand<8>;
53   let PrintMethod = "printLogicalImm<int8_t>";
54
55   let MCOperandPredicate = [{
56     if (!MCOp.isImm())
57       return false;
58     int64_t Val = AArch64_AM::decodeLogicalImmediate(MCOp.getImm(), 64);
59     return AArch64_AM::isSVEMaskOfIdenticalElements<int8_t>(Val);
60   }];
61 }
62
63 def sve_logical_imm16 : Operand<i64> {
64   let ParserMatchClass = SVELogicalImmOperand<16>;
65   let PrintMethod = "printLogicalImm<int16_t>";
66
67   let MCOperandPredicate = [{
68     if (!MCOp.isImm())
69       return false;
70     int64_t Val = AArch64_AM::decodeLogicalImmediate(MCOp.getImm(), 64);
71     return AArch64_AM::isSVEMaskOfIdenticalElements<int16_t>(Val);
72   }];
73 }
74
75 def sve_logical_imm32 : Operand<i64> {
76   let ParserMatchClass = SVELogicalImmOperand<32>;
77   let PrintMethod = "printLogicalImm<int32_t>";
78
79   let MCOperandPredicate = [{
80     if (!MCOp.isImm())
81       return false;
82     int64_t Val = AArch64_AM::decodeLogicalImmediate(MCOp.getImm(), 64);
83     return AArch64_AM::isSVEMaskOfIdenticalElements<int32_t>(Val);
84   }];
85 }
86
87 class SVEPreferredLogicalImmOperand<int Width> : AsmOperandClass {
88   let Name = "SVEPreferredLogicalImm" # Width;
89   let PredicateMethod = "isSVEPreferredLogicalImm<int" # Width # "_t>";
90   let RenderMethod = "addLogicalImmOperands<int" # Width # "_t>";
91 }
92
93 def sve_preferred_logical_imm16 : Operand<i64> {
94   let ParserMatchClass = SVEPreferredLogicalImmOperand<16>;
95   let PrintMethod = "printSVELogicalImm<int16_t>";
96
97   let MCOperandPredicate = [{
98     if (!MCOp.isImm())
99       return false;
100     int64_t Val = AArch64_AM::decodeLogicalImmediate(MCOp.getImm(), 64);
101     return AArch64_AM::isSVEMaskOfIdenticalElements<int16_t>(Val) &&
102            AArch64_AM::isSVEMoveMaskPreferredLogicalImmediate(Val);
103   }];
104 }
105
106 def sve_preferred_logical_imm32 : Operand<i64> {
107   let ParserMatchClass =  SVEPreferredLogicalImmOperand<32>;
108   let PrintMethod = "printSVELogicalImm<int32_t>";
109
110   let MCOperandPredicate = [{
111     if (!MCOp.isImm())
112       return false;
113     int64_t Val = AArch64_AM::decodeLogicalImmediate(MCOp.getImm(), 64);
114     return AArch64_AM::isSVEMaskOfIdenticalElements<int32_t>(Val) &&
115            AArch64_AM::isSVEMoveMaskPreferredLogicalImmediate(Val);
116   }];
117 }
118
119 def sve_preferred_logical_imm64 : Operand<i64> {
120   let ParserMatchClass = SVEPreferredLogicalImmOperand<64>;
121   let PrintMethod = "printSVELogicalImm<int64_t>";
122
123   let MCOperandPredicate = [{
124     if (!MCOp.isImm())
125       return false;
126     int64_t Val = AArch64_AM::decodeLogicalImmediate(MCOp.getImm(), 64);
127     return AArch64_AM::isSVEMaskOfIdenticalElements<int64_t>(Val) &&
128            AArch64_AM::isSVEMoveMaskPreferredLogicalImmediate(Val);
129   }];
130 }
131
132 class SVELogicalImmNotOperand<int Width> : AsmOperandClass {
133   let Name = "SVELogicalImm" # Width # "Not";
134   let DiagnosticType = "LogicalSecondSource";
135   let PredicateMethod = "isLogicalImm<int" # Width # "_t>";
136   let RenderMethod = "addLogicalImmNotOperands<int" # Width # "_t>";
137 }
138
139 def sve_logical_imm8_not : Operand<i64> {
140   let ParserMatchClass = SVELogicalImmNotOperand<8>;
141 }
142
143 def sve_logical_imm16_not : Operand<i64> {
144   let ParserMatchClass = SVELogicalImmNotOperand<16>;
145 }
146
147 def sve_logical_imm32_not : Operand<i64> {
148   let ParserMatchClass = SVELogicalImmNotOperand<32>;
149 }
150
151 class SVEShiftedImmOperand<int ElementWidth, string Infix, string Predicate>
152     : AsmOperandClass {
153   let Name = "SVE" # Infix # "Imm" # ElementWidth;
154   let DiagnosticType = "Invalid" # Name;
155   let RenderMethod = "addImmWithOptionalShiftOperands<8>";
156   let ParserMethod = "tryParseImmWithOptionalShift";
157   let PredicateMethod = Predicate;
158 }
159
160 def SVECpyImmOperand8  : SVEShiftedImmOperand<8,  "Cpy", "isSVECpyImm<int8_t>">;
161 def SVECpyImmOperand16 : SVEShiftedImmOperand<16, "Cpy", "isSVECpyImm<int16_t>">;
162 def SVECpyImmOperand32 : SVEShiftedImmOperand<32, "Cpy", "isSVECpyImm<int32_t>">;
163 def SVECpyImmOperand64 : SVEShiftedImmOperand<64, "Cpy", "isSVECpyImm<int64_t>">;
164
165 def SVEAddSubImmOperand8  : SVEShiftedImmOperand<8,  "AddSub", "isSVEAddSubImm<int8_t>">;
166 def SVEAddSubImmOperand16 : SVEShiftedImmOperand<16, "AddSub", "isSVEAddSubImm<int16_t>">;
167 def SVEAddSubImmOperand32 : SVEShiftedImmOperand<32, "AddSub", "isSVEAddSubImm<int32_t>">;
168 def SVEAddSubImmOperand64 : SVEShiftedImmOperand<64, "AddSub", "isSVEAddSubImm<int64_t>">;
169
170 class imm8_opt_lsl<int ElementWidth, string printType,
171                    AsmOperandClass OpndClass, code Predicate>
172     : Operand<i32>, ImmLeaf<i32, Predicate> {
173   let EncoderMethod = "getImm8OptLsl";
174   let DecoderMethod = "DecodeImm8OptLsl<" # ElementWidth # ">";
175   let PrintMethod = "printImm8OptLsl<" # printType # ">";
176   let ParserMatchClass = OpndClass;
177   let MIOperandInfo = (ops i32imm, i32imm);
178 }
179
180 def cpy_imm8_opt_lsl_i8  : imm8_opt_lsl<8,  "int8_t",  SVECpyImmOperand8,  [{
181   return AArch64_AM::isSVECpyImm<int8_t>(Imm);
182 }]>;
183 def cpy_imm8_opt_lsl_i16 : imm8_opt_lsl<16, "int16_t", SVECpyImmOperand16, [{
184   return AArch64_AM::isSVECpyImm<int16_t>(Imm);
185 }]>;
186 def cpy_imm8_opt_lsl_i32 : imm8_opt_lsl<32, "int32_t", SVECpyImmOperand32, [{
187   return AArch64_AM::isSVECpyImm<int32_t>(Imm);
188 }]>;
189 def cpy_imm8_opt_lsl_i64 : imm8_opt_lsl<64, "int64_t", SVECpyImmOperand64, [{
190   return AArch64_AM::isSVECpyImm<int64_t>(Imm);
191 }]>;
192
193 def addsub_imm8_opt_lsl_i8  : imm8_opt_lsl<8,  "uint8_t",  SVEAddSubImmOperand8,  [{
194   return AArch64_AM::isSVEAddSubImm<int8_t>(Imm);
195 }]>;
196 def addsub_imm8_opt_lsl_i16 : imm8_opt_lsl<16, "uint16_t", SVEAddSubImmOperand16, [{
197   return AArch64_AM::isSVEAddSubImm<int16_t>(Imm);
198 }]>;
199 def addsub_imm8_opt_lsl_i32 : imm8_opt_lsl<32, "uint32_t", SVEAddSubImmOperand32, [{
200   return AArch64_AM::isSVEAddSubImm<int32_t>(Imm);
201 }]>;
202 def addsub_imm8_opt_lsl_i64 : imm8_opt_lsl<64, "uint64_t", SVEAddSubImmOperand64, [{
203   return AArch64_AM::isSVEAddSubImm<int64_t>(Imm);
204 }]>;
205
206 class SVEExactFPImm<string Suffix, string ValA, string ValB> : AsmOperandClass {
207   let Name = "SVEExactFPImmOperand" # Suffix;
208   let DiagnosticType = "Invalid" # Name;
209   let ParserMethod = "tryParseFPImm<false>";
210   let PredicateMethod = "isExactFPImm<" # ValA # ", " # ValB # ">";
211   let RenderMethod = "addExactFPImmOperands<" # ValA # ", " # ValB # ">";
212 }
213
214 class SVEExactFPImmOperand<string Suffix, string ValA, string ValB> : Operand<i32> {
215   let PrintMethod = "printExactFPImm<" # ValA # ", " # ValB # ">";
216   let ParserMatchClass = SVEExactFPImm<Suffix, ValA, ValB>;
217 }
218
219 def sve_fpimm_half_one
220     : SVEExactFPImmOperand<"HalfOne", "AArch64ExactFPImm::half",
221                            "AArch64ExactFPImm::one">;
222 def sve_fpimm_half_two
223     : SVEExactFPImmOperand<"HalfTwo", "AArch64ExactFPImm::half",
224                            "AArch64ExactFPImm::two">;
225 def sve_fpimm_zero_one
226     : SVEExactFPImmOperand<"ZeroOne", "AArch64ExactFPImm::zero",
227                            "AArch64ExactFPImm::one">;
228
229 def sve_incdec_imm : Operand<i32>, ImmLeaf<i32, [{
230   return (((uint32_t)Imm) > 0) && (((uint32_t)Imm) < 17);
231 }]> {
232   let ParserMatchClass = Imm1_16Operand;
233   let EncoderMethod = "getSVEIncDecImm";
234   let DecoderMethod = "DecodeSVEIncDecImm";
235 }
236
237 //===----------------------------------------------------------------------===//
238 // SVE PTrue - These are used extensively throughout the pattern matching so
239 //             it's important we define them first.
240 //===----------------------------------------------------------------------===//
241
242 class sve_int_ptrue<bits<2> sz8_64, bits<3> opc, string asm, PPRRegOp pprty>
243 : I<(outs pprty:$Pd), (ins sve_pred_enum:$pattern),
244   asm, "\t$Pd, $pattern",
245   "",
246   []>, Sched<[]> {
247   bits<4> Pd;
248   bits<5> pattern;
249   let Inst{31-24} = 0b00100101;
250   let Inst{23-22} = sz8_64;
251   let Inst{21-19} = 0b011;
252   let Inst{18-17} = opc{2-1};
253   let Inst{16}    = opc{0};
254   let Inst{15-10} = 0b111000;
255   let Inst{9-5}   = pattern;
256   let Inst{4}     = 0b0;
257   let Inst{3-0}   = Pd;
258
259   let Defs = !if(!eq (opc{0}, 1), [NZCV], []);
260 }
261
262 multiclass sve_int_ptrue<bits<3> opc, string asm> {
263   def _B : sve_int_ptrue<0b00, opc, asm, PPR8>;
264   def _H : sve_int_ptrue<0b01, opc, asm, PPR16>;
265   def _S : sve_int_ptrue<0b10, opc, asm, PPR32>;
266   def _D : sve_int_ptrue<0b11, opc, asm, PPR64>;
267
268   def : InstAlias<asm # "\t$Pd",
269                   (!cast<Instruction>(NAME # _B) PPR8:$Pd, 0b11111), 1>;
270   def : InstAlias<asm # "\t$Pd",
271                   (!cast<Instruction>(NAME # _H) PPR16:$Pd, 0b11111), 1>;
272   def : InstAlias<asm # "\t$Pd",
273                   (!cast<Instruction>(NAME # _S) PPR32:$Pd, 0b11111), 1>;
274   def : InstAlias<asm # "\t$Pd",
275                   (!cast<Instruction>(NAME # _D) PPR64:$Pd, 0b11111), 1>;
276 }
277
278 let Predicates = [HasSVE] in {
279   defm PTRUE  : sve_int_ptrue<0b000, "ptrue">;
280   defm PTRUES : sve_int_ptrue<0b001, "ptrues">;
281 }
282
283
284 //===----------------------------------------------------------------------===//
285 // SVE Predicate Misc Group
286 //===----------------------------------------------------------------------===//
287
288 class sve_int_pfalse<bits<6> opc, string asm>
289 : I<(outs PPR8:$Pd), (ins),
290   asm, "\t$Pd",
291   "",
292   []>, Sched<[]> {
293   bits<4> Pd;
294   let Inst{31-24} = 0b00100101;
295   let Inst{23-22} = opc{5-4};
296   let Inst{21-19} = 0b011;
297   let Inst{18-16} = opc{3-1};
298   let Inst{15-10} = 0b111001;
299   let Inst{9}     = opc{0};
300   let Inst{8-4}   = 0b00000;
301   let Inst{3-0}   = Pd;
302 }
303
304 class sve_int_ptest<bits<6> opc, string asm>
305 : I<(outs), (ins PPRAny:$Pg, PPR8:$Pn),
306   asm, "\t$Pg, $Pn",
307   "",
308   []>, Sched<[]> {
309   bits<4> Pg;
310   bits<4> Pn;
311   let Inst{31-24} = 0b00100101;
312   let Inst{23-22} = opc{5-4};
313   let Inst{21-19} = 0b010;
314   let Inst{18-16} = opc{3-1};
315   let Inst{15-14} = 0b11;
316   let Inst{13-10} = Pg;
317   let Inst{9}     = opc{0};
318   let Inst{8-5}   = Pn;
319   let Inst{4-0}   = 0b00000;
320
321   let Defs = [NZCV];
322 }
323
324 class sve_int_pfirst_next<bits<2> sz8_64, bits<5> opc, string asm,
325                           PPRRegOp pprty>
326 : I<(outs pprty:$Pdn), (ins PPRAny:$Pg, pprty:$_Pdn),
327   asm, "\t$Pdn, $Pg, $_Pdn",
328   "",
329   []>, Sched<[]> {
330   bits<4> Pdn;
331   bits<4> Pg;
332   let Inst{31-24} = 0b00100101;
333   let Inst{23-22} = sz8_64;
334   let Inst{21-19} = 0b011;
335   let Inst{18-16} = opc{4-2};
336   let Inst{15-11} = 0b11000;
337   let Inst{10-9}  = opc{1-0};
338   let Inst{8-5}   = Pg;
339   let Inst{4}     = 0;
340   let Inst{3-0}   = Pdn;
341
342   let Constraints = "$Pdn = $_Pdn";
343   let Defs = [NZCV];
344 }
345
346 multiclass sve_int_pfirst<bits<5> opc, string asm> {
347   def : sve_int_pfirst_next<0b01, opc, asm, PPR8>;
348 }
349
350 multiclass sve_int_pnext<bits<5> opc, string asm> {
351   def _B : sve_int_pfirst_next<0b00, opc, asm, PPR8>;
352   def _H : sve_int_pfirst_next<0b01, opc, asm, PPR16>;
353   def _S : sve_int_pfirst_next<0b10, opc, asm, PPR32>;
354   def _D : sve_int_pfirst_next<0b11, opc, asm, PPR64>;
355 }
356
357 //===----------------------------------------------------------------------===//
358 // SVE Predicate Count Group
359 //===----------------------------------------------------------------------===//
360
361 class sve_int_count_r<bits<2> sz8_64, bits<5> opc, string asm,
362                       RegisterOperand dty, PPRRegOp pprty, RegisterOperand sty>
363 : I<(outs dty:$Rdn), (ins pprty:$Pg, sty:$_Rdn),
364   asm, "\t$Rdn, $Pg",
365   "",
366   []>, Sched<[]> {
367   bits<5> Rdn;
368   bits<4> Pg;
369   let Inst{31-24} = 0b00100101;
370   let Inst{23-22} = sz8_64;
371   let Inst{21-19} = 0b101;
372   let Inst{18-16} = opc{4-2};
373   let Inst{15-11} = 0b10001;
374   let Inst{10-9}  = opc{1-0};
375   let Inst{8-5}   = Pg;
376   let Inst{4-0}   = Rdn;
377
378   // Signed 32bit forms require their GPR operand printed.
379   let AsmString = !if(!eq(opc{4,2-0}, 0b0000),
380                       !strconcat(asm, "\t$Rdn, $Pg, $_Rdn"),
381                       !strconcat(asm, "\t$Rdn, $Pg"));
382   let Constraints = "$Rdn = $_Rdn";
383 }
384
385 multiclass sve_int_count_r_s32<bits<5> opc, string asm> {
386   def _B : sve_int_count_r<0b00, opc, asm, GPR64z, PPR8, GPR64as32>;
387   def _H : sve_int_count_r<0b01, opc, asm, GPR64z, PPR16, GPR64as32>;
388   def _S : sve_int_count_r<0b10, opc, asm, GPR64z, PPR32, GPR64as32>;
389   def _D : sve_int_count_r<0b11, opc, asm, GPR64z, PPR64, GPR64as32>;
390 }
391
392 multiclass sve_int_count_r_u32<bits<5> opc, string asm> {
393   def _B : sve_int_count_r<0b00, opc, asm, GPR32z, PPR8, GPR32z>;
394   def _H : sve_int_count_r<0b01, opc, asm, GPR32z, PPR16, GPR32z>;
395   def _S : sve_int_count_r<0b10, opc, asm, GPR32z, PPR32, GPR32z>;
396   def _D : sve_int_count_r<0b11, opc, asm, GPR32z, PPR64, GPR32z>;
397 }
398
399 multiclass sve_int_count_r_x64<bits<5> opc, string asm> {
400   def _B : sve_int_count_r<0b00, opc, asm, GPR64z, PPR8, GPR64z>;
401   def _H : sve_int_count_r<0b01, opc, asm, GPR64z, PPR16, GPR64z>;
402   def _S : sve_int_count_r<0b10, opc, asm, GPR64z, PPR32, GPR64z>;
403   def _D : sve_int_count_r<0b11, opc, asm, GPR64z, PPR64, GPR64z>;
404 }
405
406 class sve_int_count_v<bits<2> sz8_64, bits<5> opc, string asm,
407                       ZPRRegOp zprty>
408 : I<(outs zprty:$Zdn), (ins zprty:$_Zdn, PPRAny:$Pg),
409   asm, "\t$Zdn, $Pg",
410   "",
411   []>, Sched<[]> {
412   bits<4> Pg;
413   bits<5> Zdn;
414   let Inst{31-24} = 0b00100101;
415   let Inst{23-22} = sz8_64;
416   let Inst{21-19} = 0b101;
417   let Inst{18-16} = opc{4-2};
418   let Inst{15-11} = 0b10000;
419   let Inst{10-9}  = opc{1-0};
420   let Inst{8-5}   = Pg;
421   let Inst{4-0}   = Zdn;
422
423   let Constraints = "$Zdn = $_Zdn";
424   let DestructiveInstType = Destructive;
425   let ElementSize = ElementSizeNone;
426 }
427
428 multiclass sve_int_count_v<bits<5> opc, string asm> {
429   def _H : sve_int_count_v<0b01, opc, asm, ZPR16>;
430   def _S : sve_int_count_v<0b10, opc, asm, ZPR32>;
431   def _D : sve_int_count_v<0b11, opc, asm, ZPR64>;
432 }
433
434 class sve_int_pcount_pred<bits<2> sz8_64, bits<4> opc, string asm,
435                           PPRRegOp pprty>
436 : I<(outs GPR64:$Rd), (ins PPRAny:$Pg, pprty:$Pn),
437   asm, "\t$Rd, $Pg, $Pn",
438   "",
439   []>, Sched<[]> {
440   bits<4> Pg;
441   bits<4> Pn;
442   bits<5> Rd;
443   let Inst{31-24} = 0b00100101;
444   let Inst{23-22} = sz8_64;
445   let Inst{21-19} = 0b100;
446   let Inst{18-16} = opc{3-1};
447   let Inst{15-14} = 0b10;
448   let Inst{13-10} = Pg;
449   let Inst{9}     = opc{0};
450   let Inst{8-5}   = Pn;
451   let Inst{4-0}   = Rd;
452 }
453
454 multiclass sve_int_pcount_pred<bits<4> opc, string asm> {
455   def _B : sve_int_pcount_pred<0b00, opc, asm, PPR8>;
456   def _H : sve_int_pcount_pred<0b01, opc, asm, PPR16>;
457   def _S : sve_int_pcount_pred<0b10, opc, asm, PPR32>;
458   def _D : sve_int_pcount_pred<0b11, opc, asm, PPR64>;
459 }
460
461 //===----------------------------------------------------------------------===//
462 // SVE Element Count Group
463 //===----------------------------------------------------------------------===//
464
465 class sve_int_count<bits<3> opc, string asm>
466 : I<(outs GPR64:$Rd), (ins sve_pred_enum:$pattern, sve_incdec_imm:$imm4),
467   asm, "\t$Rd, $pattern, mul $imm4",
468   "",
469   []>, Sched<[]> {
470   bits<5> Rd;
471   bits<4> imm4;
472   bits<5> pattern;
473   let Inst{31-24} = 0b00000100;
474   let Inst{23-22} = opc{2-1};
475   let Inst{21-20} = 0b10;
476   let Inst{19-16} = imm4;
477   let Inst{15-11} = 0b11100;
478   let Inst{10}    = opc{0};
479   let Inst{9-5}   = pattern;
480   let Inst{4-0}   = Rd;
481 }
482
483 multiclass sve_int_count<bits<3> opc, string asm> {
484   def NAME : sve_int_count<opc, asm>;
485
486   def : InstAlias<asm # "\t$Rd, $pattern",
487                   (!cast<Instruction>(NAME) GPR64:$Rd, sve_pred_enum:$pattern, 1), 1>;
488   def : InstAlias<asm # "\t$Rd",
489                   (!cast<Instruction>(NAME) GPR64:$Rd, 0b11111, 1), 2>;
490 }
491
492 class sve_int_countvlv<bits<5> opc, string asm, ZPRRegOp zprty>
493 : I<(outs zprty:$Zdn), (ins zprty:$_Zdn, sve_pred_enum:$pattern, sve_incdec_imm:$imm4),
494   asm, "\t$Zdn, $pattern, mul $imm4",
495   "",
496   []>, Sched<[]> {
497   bits<5> Zdn;
498   bits<5> pattern;
499   bits<4> imm4;
500   let Inst{31-24} = 0b00000100;
501   let Inst{23-22} = opc{4-3};
502   let Inst{21}    = 0b1;
503   let Inst{20}    = opc{2};
504   let Inst{19-16} = imm4;
505   let Inst{15-12} = 0b1100;
506   let Inst{11-10} = opc{1-0};
507   let Inst{9-5}   = pattern;
508   let Inst{4-0}   = Zdn;
509
510   let Constraints = "$Zdn = $_Zdn";
511   let DestructiveInstType = Destructive;
512   let ElementSize = ElementSizeNone;
513 }
514
515 multiclass sve_int_countvlv<bits<5> opc, string asm, ZPRRegOp zprty> {
516   def NAME : sve_int_countvlv<opc, asm, zprty>;
517
518   def : InstAlias<asm # "\t$Zdn, $pattern",
519                   (!cast<Instruction>(NAME) zprty:$Zdn, sve_pred_enum:$pattern, 1), 1>;
520   def : InstAlias<asm # "\t$Zdn",
521                   (!cast<Instruction>(NAME) zprty:$Zdn, 0b11111, 1), 2>;
522 }
523
524 class sve_int_pred_pattern_a<bits<3> opc, string asm>
525 : I<(outs GPR64:$Rdn), (ins GPR64:$_Rdn, sve_pred_enum:$pattern, sve_incdec_imm:$imm4),
526   asm, "\t$Rdn, $pattern, mul $imm4",
527   "",
528   []>, Sched<[]> {
529   bits<5> Rdn;
530   bits<5> pattern;
531   bits<4> imm4;
532   let Inst{31-24} = 0b00000100;
533   let Inst{23-22} = opc{2-1};
534   let Inst{21-20} = 0b11;
535   let Inst{19-16} = imm4;
536   let Inst{15-11} = 0b11100;
537   let Inst{10}    = opc{0};
538   let Inst{9-5}   = pattern;
539   let Inst{4-0}   = Rdn;
540
541   let Constraints = "$Rdn = $_Rdn";
542 }
543
544 multiclass sve_int_pred_pattern_a<bits<3> opc, string asm> {
545   def NAME : sve_int_pred_pattern_a<opc, asm>;
546
547   def : InstAlias<asm # "\t$Rdn, $pattern",
548                   (!cast<Instruction>(NAME) GPR64:$Rdn, sve_pred_enum:$pattern, 1), 1>;
549   def : InstAlias<asm # "\t$Rdn",
550                   (!cast<Instruction>(NAME) GPR64:$Rdn, 0b11111, 1), 2>;
551 }
552
553 class sve_int_pred_pattern_b<bits<5> opc, string asm, RegisterOperand dt,
554                              RegisterOperand st>
555 : I<(outs dt:$Rdn), (ins st:$_Rdn, sve_pred_enum:$pattern, sve_incdec_imm:$imm4),
556   asm, "\t$Rdn, $pattern, mul $imm4",
557   "",
558   []>, Sched<[]> {
559   bits<5> Rdn;
560   bits<5> pattern;
561   bits<4> imm4;
562   let Inst{31-24} = 0b00000100;
563   let Inst{23-22} = opc{4-3};
564   let Inst{21}    = 0b1;
565   let Inst{20}    = opc{2};
566   let Inst{19-16} = imm4;
567   let Inst{15-12} = 0b1111;
568   let Inst{11-10} = opc{1-0};
569   let Inst{9-5}   = pattern;
570   let Inst{4-0}   = Rdn;
571
572   // Signed 32bit forms require their GPR operand printed.
573   let AsmString = !if(!eq(opc{2,0}, 0b00),
574                       !strconcat(asm, "\t$Rdn, $_Rdn, $pattern, mul $imm4"),
575                       !strconcat(asm, "\t$Rdn, $pattern, mul $imm4"));
576
577   let Constraints = "$Rdn = $_Rdn";
578 }
579
580 multiclass sve_int_pred_pattern_b_s32<bits<5> opc, string asm> {
581   def NAME : sve_int_pred_pattern_b<opc, asm, GPR64z, GPR64as32>;
582
583   def : InstAlias<asm # "\t$Rd, $Rn, $pattern",
584                   (!cast<Instruction>(NAME) GPR64z:$Rd, GPR64as32:$Rn, sve_pred_enum:$pattern, 1), 1>;
585   def : InstAlias<asm # "\t$Rd, $Rn",
586                   (!cast<Instruction>(NAME) GPR64z:$Rd, GPR64as32:$Rn, 0b11111, 1), 2>;
587 }
588
589 multiclass sve_int_pred_pattern_b_u32<bits<5> opc, string asm> {
590   def NAME : sve_int_pred_pattern_b<opc, asm, GPR32z, GPR32z>;
591
592   def : InstAlias<asm # "\t$Rdn, $pattern",
593                   (!cast<Instruction>(NAME) GPR32z:$Rdn, sve_pred_enum:$pattern, 1), 1>;
594   def : InstAlias<asm # "\t$Rdn",
595                   (!cast<Instruction>(NAME) GPR32z:$Rdn, 0b11111, 1), 2>;
596 }
597
598 multiclass sve_int_pred_pattern_b_x64<bits<5> opc, string asm> {
599   def NAME : sve_int_pred_pattern_b<opc, asm, GPR64z, GPR64z>;
600
601   def : InstAlias<asm # "\t$Rdn, $pattern",
602                   (!cast<Instruction>(NAME) GPR64z:$Rdn, sve_pred_enum:$pattern, 1), 1>;
603   def : InstAlias<asm # "\t$Rdn",
604                   (!cast<Instruction>(NAME) GPR64z:$Rdn, 0b11111, 1), 2>;
605 }
606
607
608 //===----------------------------------------------------------------------===//
609 // SVE Permute - Cross Lane Group
610 //===----------------------------------------------------------------------===//
611
612 class sve_int_perm_dup_r<bits<2> sz8_64, string asm, ZPRRegOp zprty,
613                          RegisterClass srcRegType>
614 : I<(outs zprty:$Zd), (ins srcRegType:$Rn),
615   asm, "\t$Zd, $Rn",
616   "",
617   []>, Sched<[]> {
618   bits<5> Rn;
619   bits<5> Zd;
620   let Inst{31-24} = 0b00000101;
621   let Inst{23-22} = sz8_64;
622   let Inst{21-10} = 0b100000001110;
623   let Inst{9-5}   = Rn;
624   let Inst{4-0}   = Zd;
625 }
626
627 multiclass sve_int_perm_dup_r<string asm> {
628   def _B : sve_int_perm_dup_r<0b00, asm, ZPR8, GPR32sp>;
629   def _H : sve_int_perm_dup_r<0b01, asm, ZPR16, GPR32sp>;
630   def _S : sve_int_perm_dup_r<0b10, asm, ZPR32, GPR32sp>;
631   def _D : sve_int_perm_dup_r<0b11, asm, ZPR64, GPR64sp>;
632
633   def : InstAlias<"mov $Zd, $Rn",
634                   (!cast<Instruction>(NAME # _B) ZPR8:$Zd, GPR32sp:$Rn), 1>;
635   def : InstAlias<"mov $Zd, $Rn",
636                   (!cast<Instruction>(NAME # _H) ZPR16:$Zd, GPR32sp:$Rn), 1>;
637   def : InstAlias<"mov $Zd, $Rn",
638                   (!cast<Instruction>(NAME # _S) ZPR32:$Zd, GPR32sp:$Rn), 1>;
639   def : InstAlias<"mov $Zd, $Rn",
640                   (!cast<Instruction>(NAME # _D) ZPR64:$Zd, GPR64sp:$Rn), 1>;
641 }
642
643 class sve_int_perm_dup_i<bits<5> tsz, Operand immtype, string asm,
644                          ZPRRegOp zprty>
645 : I<(outs zprty:$Zd), (ins zprty:$Zn, immtype:$idx),
646   asm, "\t$Zd, $Zn$idx",
647   "",
648   []>, Sched<[]> {
649   bits<5> Zd;
650   bits<5> Zn;
651   bits<7> idx;
652   let Inst{31-24} = 0b00000101;
653   let Inst{23-22} = {?,?}; // imm3h
654   let Inst{21}    = 0b1;
655   let Inst{20-16} = tsz;
656   let Inst{15-10} = 0b001000;
657   let Inst{9-5}   = Zn;
658   let Inst{4-0}   = Zd;
659 }
660
661 multiclass sve_int_perm_dup_i<string asm> {
662   def _B : sve_int_perm_dup_i<{?,?,?,?,1}, sve_elm_idx_extdup_b, asm, ZPR8> {
663     let Inst{23-22} = idx{5-4};
664     let Inst{20-17} = idx{3-0};
665   }
666   def _H : sve_int_perm_dup_i<{?,?,?,1,0}, sve_elm_idx_extdup_h, asm, ZPR16> {
667     let Inst{23-22} = idx{4-3};
668     let Inst{20-18} = idx{2-0};
669   }
670   def _S : sve_int_perm_dup_i<{?,?,1,0,0}, sve_elm_idx_extdup_s, asm, ZPR32> {
671     let Inst{23-22} = idx{3-2};
672     let Inst{20-19}    = idx{1-0};
673   }
674   def _D : sve_int_perm_dup_i<{?,1,0,0,0}, sve_elm_idx_extdup_d, asm, ZPR64> {
675     let Inst{23-22} = idx{2-1};
676     let Inst{20}    = idx{0};
677   }
678   def _Q : sve_int_perm_dup_i<{1,0,0,0,0}, sve_elm_idx_extdup_q, asm, ZPR128> {
679     let Inst{23-22} = idx{1-0};
680   }
681
682   def : InstAlias<"mov $Zd, $Zn$idx",
683                   (!cast<Instruction>(NAME # _B) ZPR8:$Zd, ZPR8:$Zn, sve_elm_idx_extdup_b:$idx), 1>;
684   def : InstAlias<"mov $Zd, $Zn$idx",
685                   (!cast<Instruction>(NAME # _H) ZPR16:$Zd, ZPR16:$Zn, sve_elm_idx_extdup_h:$idx), 1>;
686   def : InstAlias<"mov $Zd, $Zn$idx",
687                   (!cast<Instruction>(NAME # _S) ZPR32:$Zd, ZPR32:$Zn, sve_elm_idx_extdup_s:$idx), 1>;
688   def : InstAlias<"mov $Zd, $Zn$idx",
689                   (!cast<Instruction>(NAME # _D) ZPR64:$Zd, ZPR64:$Zn, sve_elm_idx_extdup_d:$idx), 1>;
690   def : InstAlias<"mov $Zd, $Zn$idx",
691                   (!cast<Instruction>(NAME # _Q) ZPR128:$Zd, ZPR128:$Zn, sve_elm_idx_extdup_q:$idx), 1>;
692   def : InstAlias<"mov $Zd, $Bn",
693                   (!cast<Instruction>(NAME # _B) ZPR8:$Zd, FPR8asZPR:$Bn, 0), 2>;
694   def : InstAlias<"mov $Zd, $Hn",
695                   (!cast<Instruction>(NAME # _H) ZPR16:$Zd, FPR16asZPR:$Hn, 0), 2>;
696   def : InstAlias<"mov $Zd, $Sn",
697                   (!cast<Instruction>(NAME # _S) ZPR32:$Zd, FPR32asZPR:$Sn, 0), 2>;
698   def : InstAlias<"mov $Zd, $Dn",
699                   (!cast<Instruction>(NAME # _D) ZPR64:$Zd, FPR64asZPR:$Dn, 0), 2>;
700   def : InstAlias<"mov $Zd, $Qn",
701                   (!cast<Instruction>(NAME # _Q) ZPR128:$Zd, FPR128asZPR:$Qn, 0), 2>;
702 }
703
704 class sve_int_perm_tbl<bits<2> sz8_64, string asm, ZPRRegOp zprty,
705                        RegisterOperand VecList>
706 : I<(outs zprty:$Zd), (ins VecList:$Zn, zprty:$Zm),
707   asm, "\t$Zd, $Zn, $Zm",
708   "",
709   []>, Sched<[]> {
710   bits<5> Zd;
711   bits<5> Zm;
712   bits<5> Zn;
713   let Inst{31-24} = 0b00000101;
714   let Inst{23-22} = sz8_64;
715   let Inst{21}    = 0b1;
716   let Inst{20-16} = Zm;
717   let Inst{15-10} = 0b001100;
718   let Inst{9-5}   = Zn;
719   let Inst{4-0}   = Zd;
720 }
721
722 multiclass sve_int_perm_tbl<string asm> {
723   def _B : sve_int_perm_tbl<0b00, asm, ZPR8, Z_b>;
724   def _H : sve_int_perm_tbl<0b01, asm, ZPR16, Z_h>;
725   def _S : sve_int_perm_tbl<0b10, asm, ZPR32, Z_s>;
726   def _D : sve_int_perm_tbl<0b11, asm, ZPR64, Z_d>;
727
728   def : InstAlias<asm # "\t$Zd, $Zn, $Zm",
729                  (!cast<Instruction>(NAME # _B) ZPR8:$Zd, ZPR8:$Zn, ZPR8:$Zm), 0>;
730   def : InstAlias<asm # "\t$Zd, $Zn, $Zm",
731                  (!cast<Instruction>(NAME # _H) ZPR16:$Zd, ZPR16:$Zn, ZPR16:$Zm), 0>;
732   def : InstAlias<asm # "\t$Zd, $Zn, $Zm",
733                  (!cast<Instruction>(NAME # _S) ZPR32:$Zd, ZPR32:$Zn, ZPR32:$Zm), 0>;
734   def : InstAlias<asm # "\t$Zd, $Zn, $Zm",
735                  (!cast<Instruction>(NAME # _D) ZPR64:$Zd, ZPR64:$Zn, ZPR64:$Zm), 0>;
736 }
737
738 class sve_int_perm_reverse_z<bits<2> sz8_64, string asm, ZPRRegOp zprty>
739 : I<(outs zprty:$Zd), (ins zprty:$Zn),
740   asm, "\t$Zd, $Zn",
741   "",
742   []>, Sched<[]> {
743   bits<5> Zd;
744   bits<5> Zn;
745   let Inst{31-24} = 0b00000101;
746   let Inst{23-22} = sz8_64;
747   let Inst{21-10} = 0b111000001110;
748   let Inst{9-5}   = Zn;
749   let Inst{4-0}   = Zd;
750 }
751
752 multiclass sve_int_perm_reverse_z<string asm> {
753   def _B : sve_int_perm_reverse_z<0b00, asm, ZPR8>;
754   def _H : sve_int_perm_reverse_z<0b01, asm, ZPR16>;
755   def _S : sve_int_perm_reverse_z<0b10, asm, ZPR32>;
756   def _D : sve_int_perm_reverse_z<0b11, asm, ZPR64>;
757 }
758
759 class sve_int_perm_reverse_p<bits<2> sz8_64, string asm, PPRRegOp pprty>
760 : I<(outs pprty:$Pd), (ins pprty:$Pn),
761   asm, "\t$Pd, $Pn",
762   "",
763   []>, Sched<[]> {
764   bits<4> Pd;
765   bits<4> Pn;
766   let Inst{31-24} = 0b00000101;
767   let Inst{23-22} = sz8_64;
768   let Inst{21-9}  = 0b1101000100000;
769   let Inst{8-5}   = Pn;
770   let Inst{4}     = 0b0;
771   let Inst{3-0}   = Pd;
772 }
773
774 multiclass sve_int_perm_reverse_p<string asm> {
775   def _B : sve_int_perm_reverse_p<0b00, asm, PPR8>;
776   def _H : sve_int_perm_reverse_p<0b01, asm, PPR16>;
777   def _S : sve_int_perm_reverse_p<0b10, asm, PPR32>;
778   def _D : sve_int_perm_reverse_p<0b11, asm, PPR64>;
779 }
780
781 class sve_int_perm_unpk<bits<2> sz16_64, bits<2> opc, string asm,
782                         ZPRRegOp zprty1, ZPRRegOp zprty2>
783 : I<(outs zprty1:$Zd), (ins zprty2:$Zn),
784   asm, "\t$Zd, $Zn",
785   "", []>, Sched<[]> {
786   bits<5> Zd;
787   bits<5> Zn;
788   let Inst{31-24} = 0b00000101;
789   let Inst{23-22} = sz16_64;
790   let Inst{21-18} = 0b1100;
791   let Inst{17-16} = opc;
792   let Inst{15-10} = 0b001110;
793   let Inst{9-5}   = Zn;
794   let Inst{4-0}   = Zd;
795 }
796
797 multiclass sve_int_perm_unpk<bits<2> opc, string asm> {
798   def _H : sve_int_perm_unpk<0b01, opc, asm, ZPR16, ZPR8>;
799   def _S : sve_int_perm_unpk<0b10, opc, asm, ZPR32, ZPR16>;
800   def _D : sve_int_perm_unpk<0b11, opc, asm, ZPR64, ZPR32>;
801 }
802
803 class sve_int_perm_insrs<bits<2> sz8_64, string asm, ZPRRegOp zprty,
804                          RegisterClass srcRegType>
805 : I<(outs zprty:$Zdn), (ins zprty:$_Zdn, srcRegType:$Rm),
806   asm, "\t$Zdn, $Rm",
807   "",
808   []>, Sched<[]> {
809   bits<5> Rm;
810   bits<5> Zdn;
811   let Inst{31-24} = 0b00000101;
812   let Inst{23-22} = sz8_64;
813   let Inst{21-10} = 0b100100001110;
814   let Inst{9-5}   = Rm;
815   let Inst{4-0}   = Zdn;
816
817   let Constraints = "$Zdn = $_Zdn";
818   let DestructiveInstType = Destructive;
819   let ElementSize = ElementSizeNone;
820 }
821
822 multiclass sve_int_perm_insrs<string asm> {
823   def _B : sve_int_perm_insrs<0b00, asm, ZPR8, GPR32>;
824   def _H : sve_int_perm_insrs<0b01, asm, ZPR16, GPR32>;
825   def _S : sve_int_perm_insrs<0b10, asm, ZPR32, GPR32>;
826   def _D : sve_int_perm_insrs<0b11, asm, ZPR64, GPR64>;
827 }
828
829 class sve_int_perm_insrv<bits<2> sz8_64, string asm, ZPRRegOp zprty,
830                          RegisterClass srcRegType>
831 : I<(outs zprty:$Zdn), (ins zprty:$_Zdn, srcRegType:$Vm),
832   asm, "\t$Zdn, $Vm",
833   "",
834   []>, Sched<[]> {
835   bits<5> Vm;
836   bits<5> Zdn;
837   let Inst{31-24} = 0b00000101;
838   let Inst{23-22} = sz8_64;
839   let Inst{21-10} = 0b110100001110;
840   let Inst{9-5}   = Vm;
841   let Inst{4-0}   = Zdn;
842
843   let Constraints = "$Zdn = $_Zdn";
844   let DestructiveInstType = Destructive;
845   let ElementSize = ElementSizeNone;
846 }
847
848 multiclass sve_int_perm_insrv<string asm> {
849   def _B : sve_int_perm_insrv<0b00, asm, ZPR8, FPR8>;
850   def _H : sve_int_perm_insrv<0b01, asm, ZPR16, FPR16>;
851   def _S : sve_int_perm_insrv<0b10, asm, ZPR32, FPR32>;
852   def _D : sve_int_perm_insrv<0b11, asm, ZPR64, FPR64>;
853 }
854
855 //===----------------------------------------------------------------------===//
856 // SVE Permute - Extract Group
857 //===----------------------------------------------------------------------===//
858
859 class sve_int_perm_extract_i<string asm>
860 : I<(outs ZPR8:$Zdn), (ins ZPR8:$_Zdn, ZPR8:$Zm, imm0_255:$imm8),
861   asm, "\t$Zdn, $_Zdn, $Zm, $imm8",
862   "", []>, Sched<[]> {
863   bits<5> Zdn;
864   bits<5> Zm;
865   bits<8> imm8;
866   let Inst{31-21} = 0b00000101001;
867   let Inst{20-16} = imm8{7-3};
868   let Inst{15-13} = 0b000;
869   let Inst{12-10} = imm8{2-0};
870   let Inst{9-5}   = Zm;
871   let Inst{4-0}   = Zdn;
872
873   let Constraints = "$Zdn = $_Zdn";
874   let DestructiveInstType = Destructive;
875   let ElementSize = ElementSizeNone;
876 }
877
878 //===----------------------------------------------------------------------===//
879 // SVE Vector Select Group
880 //===----------------------------------------------------------------------===//
881
882 class sve_int_sel_vvv<bits<2> sz8_64, string asm, ZPRRegOp zprty>
883 : I<(outs zprty:$Zd), (ins PPRAny:$Pg, zprty:$Zn, zprty:$Zm),
884   asm, "\t$Zd, $Pg, $Zn, $Zm",
885   "",
886   []>, Sched<[]> {
887   bits<4> Pg;
888   bits<5> Zd;
889   bits<5> Zm;
890   bits<5> Zn;
891   let Inst{31-24} = 0b00000101;
892   let Inst{23-22} = sz8_64;
893   let Inst{21}    = 0b1;
894   let Inst{20-16} = Zm;
895   let Inst{15-14} = 0b11;
896   let Inst{13-10} = Pg;
897   let Inst{9-5}   = Zn;
898   let Inst{4-0}   = Zd;
899 }
900
901 multiclass sve_int_sel_vvv<string asm> {
902   def _B : sve_int_sel_vvv<0b00, asm, ZPR8>;
903   def _H : sve_int_sel_vvv<0b01, asm, ZPR16>;
904   def _S : sve_int_sel_vvv<0b10, asm, ZPR32>;
905   def _D : sve_int_sel_vvv<0b11, asm, ZPR64>;
906
907   def : InstAlias<"mov $Zd, $Pg/m, $Zn",
908                   (!cast<Instruction>(NAME # _B) ZPR8:$Zd, PPRAny:$Pg, ZPR8:$Zn, ZPR8:$Zd), 1>;
909   def : InstAlias<"mov $Zd, $Pg/m, $Zn",
910                   (!cast<Instruction>(NAME # _H) ZPR16:$Zd, PPRAny:$Pg, ZPR16:$Zn, ZPR16:$Zd), 1>;
911   def : InstAlias<"mov $Zd, $Pg/m, $Zn",
912                   (!cast<Instruction>(NAME # _S) ZPR32:$Zd, PPRAny:$Pg, ZPR32:$Zn, ZPR32:$Zd), 1>;
913   def : InstAlias<"mov $Zd, $Pg/m, $Zn",
914                   (!cast<Instruction>(NAME # _D) ZPR64:$Zd, PPRAny:$Pg, ZPR64:$Zn, ZPR64:$Zd), 1>;
915 }
916
917
918 //===----------------------------------------------------------------------===//
919 // SVE Predicate Logical Operations Group
920 //===----------------------------------------------------------------------===//
921
922 class sve_int_pred_log<bits<4> opc, string asm>
923 : I<(outs PPR8:$Pd), (ins PPRAny:$Pg, PPR8:$Pn, PPR8:$Pm),
924   asm, "\t$Pd, $Pg/z, $Pn, $Pm",
925   "",
926   []>, Sched<[]> {
927   bits<4> Pd;
928   bits<4> Pg;
929   bits<4> Pm;
930   bits<4> Pn;
931   let Inst{31-24} = 0b00100101;
932   let Inst{23-22} = opc{3-2};
933   let Inst{21-20} = 0b00;
934   let Inst{19-16} = Pm;
935   let Inst{15-14} = 0b01;
936   let Inst{13-10} = Pg;
937   let Inst{9}     = opc{1};
938   let Inst{8-5}   = Pn;
939   let Inst{4}     = opc{0};
940   let Inst{3-0}   = Pd;
941
942   // SEL has no predication qualifier.
943   let AsmString = !if(!eq(opc, 0b0011),
944                       !strconcat(asm, "\t$Pd, $Pg, $Pn, $Pm"),
945                       !strconcat(asm, "\t$Pd, $Pg/z, $Pn, $Pm"));
946
947   let Defs = !if(!eq (opc{2}, 1), [NZCV], []);
948 }
949
950
951 //===----------------------------------------------------------------------===//
952 // SVE Logical Mask Immediate Group
953 //===----------------------------------------------------------------------===//
954
955 class sve_int_log_imm<bits<2> opc, string asm>
956 : I<(outs ZPR64:$Zdn), (ins ZPR64:$_Zdn, logical_imm64:$imms13),
957   asm, "\t$Zdn, $_Zdn, $imms13",
958   "", []>, Sched<[]> {
959   bits<5> Zdn;
960   bits<13> imms13;
961   let Inst{31-24} = 0b00000101;
962   let Inst{23-22} = opc;
963   let Inst{21-18} = 0b0000;
964   let Inst{17-5}  = imms13;
965   let Inst{4-0}   = Zdn;
966
967   let Constraints = "$Zdn = $_Zdn";
968   let DecoderMethod = "DecodeSVELogicalImmInstruction";
969   let DestructiveInstType = Destructive;
970   let ElementSize = ElementSizeNone;
971 }
972
973 multiclass sve_int_log_imm<bits<2> opc, string asm, string alias> {
974   def NAME : sve_int_log_imm<opc, asm>;
975
976   def : InstAlias<asm # "\t$Zdn, $Zdn, $imm",
977                   (!cast<Instruction>(NAME) ZPR8:$Zdn, sve_logical_imm8:$imm), 4>;
978   def : InstAlias<asm # "\t$Zdn, $Zdn, $imm",
979                   (!cast<Instruction>(NAME) ZPR16:$Zdn, sve_logical_imm16:$imm), 3>;
980   def : InstAlias<asm # "\t$Zdn, $Zdn, $imm",
981                   (!cast<Instruction>(NAME) ZPR32:$Zdn, sve_logical_imm32:$imm), 2>;
982
983   def : InstAlias<alias # "\t$Zdn, $Zdn, $imm",
984                   (!cast<Instruction>(NAME) ZPR8:$Zdn, sve_logical_imm8_not:$imm), 0>;
985   def : InstAlias<alias # "\t$Zdn, $Zdn, $imm",
986                   (!cast<Instruction>(NAME) ZPR16:$Zdn, sve_logical_imm16_not:$imm), 0>;
987   def : InstAlias<alias # "\t$Zdn, $Zdn, $imm",
988                   (!cast<Instruction>(NAME) ZPR32:$Zdn, sve_logical_imm32_not:$imm), 0>;
989   def : InstAlias<alias # "\t$Zdn, $Zdn, $imm",
990                   (!cast<Instruction>(NAME) ZPR64:$Zdn, logical_imm64_not:$imm), 0>;
991 }
992
993 class sve_int_dup_mask_imm<string asm>
994 : I<(outs ZPR64:$Zd), (ins logical_imm64:$imms),
995   asm, "\t$Zd, $imms",
996   "",
997   []>, Sched<[]> {
998   bits<5> Zd;
999   bits<13> imms;
1000   let Inst{31-18} = 0b00000101110000;
1001   let Inst{17-5} = imms;
1002   let Inst{4-0} = Zd;
1003
1004   let isReMaterializable = 1;
1005   let DecoderMethod = "DecodeSVELogicalImmInstruction";
1006 }
1007
1008 multiclass sve_int_dup_mask_imm<string asm> {
1009   def NAME : sve_int_dup_mask_imm<asm>;
1010
1011   def : InstAlias<"dupm $Zd, $imm",
1012                   (!cast<Instruction>(NAME) ZPR8:$Zd, sve_logical_imm8:$imm), 4>;
1013   def : InstAlias<"dupm $Zd, $imm",
1014                   (!cast<Instruction>(NAME) ZPR16:$Zd, sve_logical_imm16:$imm), 3>;
1015   def : InstAlias<"dupm $Zd, $imm",
1016                   (!cast<Instruction>(NAME) ZPR32:$Zd, sve_logical_imm32:$imm), 2>;
1017
1018   // All Zd.b forms have a CPY/DUP equivalent, hence no byte alias here.
1019   def : InstAlias<"mov $Zd, $imm",
1020                   (!cast<Instruction>(NAME) ZPR16:$Zd, sve_preferred_logical_imm16:$imm), 7>;
1021   def : InstAlias<"mov $Zd, $imm",
1022                   (!cast<Instruction>(NAME) ZPR32:$Zd, sve_preferred_logical_imm32:$imm), 6>;
1023   def : InstAlias<"mov $Zd, $imm",
1024                   (!cast<Instruction>(NAME) ZPR64:$Zd, sve_preferred_logical_imm64:$imm), 5>;
1025 }
1026
1027 //===----------------------------------------------------------------------===//
1028 // SVE Integer Arithmetic -  Unpredicated Group.
1029 //===----------------------------------------------------------------------===//
1030
1031 class sve_int_bin_cons_arit_0<bits<2> sz8_64, bits<3> opc, string asm,
1032                               ZPRRegOp zprty>
1033 : I<(outs zprty:$Zd), (ins zprty:$Zn, zprty:$Zm),
1034   asm, "\t$Zd, $Zn, $Zm",
1035   "", []>, Sched<[]> {
1036   bits<5> Zd;
1037   bits<5> Zm;
1038   bits<5> Zn;
1039   let Inst{31-24} = 0b00000100;
1040   let Inst{23-22} = sz8_64;
1041   let Inst{21}    = 0b1;
1042   let Inst{20-16} = Zm;
1043   let Inst{15-13} = 0b000;
1044   let Inst{12-10} = opc;
1045   let Inst{9-5}   = Zn;
1046   let Inst{4-0}   = Zd;
1047 }
1048
1049 multiclass sve_int_bin_cons_arit_0<bits<3> opc, string asm> {
1050   def _B : sve_int_bin_cons_arit_0<0b00, opc, asm, ZPR8>;
1051   def _H : sve_int_bin_cons_arit_0<0b01, opc, asm, ZPR16>;
1052   def _S : sve_int_bin_cons_arit_0<0b10, opc, asm, ZPR32>;
1053   def _D : sve_int_bin_cons_arit_0<0b11, opc, asm, ZPR64>;
1054 }
1055
1056 //===----------------------------------------------------------------------===//
1057 // SVE Floating Point Arithmetic - Predicated Group
1058 //===----------------------------------------------------------------------===//
1059
1060 class sve_fp_2op_i_p_zds<bits<2> sz, bits<3> opc, string asm,
1061                          ZPRRegOp zprty,
1062                          Operand imm_ty>
1063 : I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, imm_ty:$i1),
1064   asm, "\t$Zdn, $Pg/m, $_Zdn, $i1",
1065   "",
1066   []>, Sched<[]> {
1067   bits<3> Pg;
1068   bits<5> Zdn;
1069   bit i1;
1070   let Inst{31-24} = 0b01100101;
1071   let Inst{23-22} = sz;
1072   let Inst{21-19} = 0b011;
1073   let Inst{18-16} = opc;
1074   let Inst{15-13} = 0b100;
1075   let Inst{12-10} = Pg;
1076   let Inst{9-6}   = 0b0000;
1077   let Inst{5}     = i1;
1078   let Inst{4-0}   = Zdn;
1079
1080   let Constraints = "$Zdn = $_Zdn";
1081   let DestructiveInstType = Destructive;
1082   let ElementSize = zprty.ElementSize;
1083 }
1084
1085 multiclass sve_fp_2op_i_p_zds<bits<3> opc, string asm, Operand imm_ty> {
1086   def _H : sve_fp_2op_i_p_zds<0b01, opc, asm, ZPR16, imm_ty>;
1087   def _S : sve_fp_2op_i_p_zds<0b10, opc, asm, ZPR32, imm_ty>;
1088   def _D : sve_fp_2op_i_p_zds<0b11, opc, asm, ZPR64, imm_ty>;
1089 }
1090
1091 class sve_fp_2op_p_zds<bits<2> sz, bits<4> opc, string asm,
1092                        ZPRRegOp zprty>
1093 : I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, zprty:$Zm),
1094   asm, "\t$Zdn, $Pg/m, $_Zdn, $Zm",
1095   "",
1096   []>, Sched<[]> {
1097   bits<3> Pg;
1098   bits<5> Zdn;
1099   bits<5> Zm;
1100   let Inst{31-24} = 0b01100101;
1101   let Inst{23-22} = sz;
1102   let Inst{21-20} = 0b00;
1103   let Inst{19-16} = opc;
1104   let Inst{15-13} = 0b100;
1105   let Inst{12-10} = Pg;
1106   let Inst{9-5}   = Zm;
1107   let Inst{4-0}   = Zdn;
1108
1109   let Constraints = "$Zdn = $_Zdn";
1110   let DestructiveInstType = Destructive;
1111   let ElementSize = zprty.ElementSize;
1112 }
1113
1114 multiclass sve_fp_2op_p_zds<bits<4> opc, string asm> {
1115   def _H : sve_fp_2op_p_zds<0b01, opc, asm, ZPR16>;
1116   def _S : sve_fp_2op_p_zds<0b10, opc, asm, ZPR32>;
1117   def _D : sve_fp_2op_p_zds<0b11, opc, asm, ZPR64>;
1118 }
1119
1120 class sve_fp_ftmad<bits<2> sz, string asm, ZPRRegOp zprty>
1121 : I<(outs zprty:$Zdn), (ins zprty:$_Zdn, zprty:$Zm, imm0_7:$imm3),
1122   asm, "\t$Zdn, $_Zdn, $Zm, $imm3",
1123   "",
1124   []>, Sched<[]> {
1125   bits<5> Zdn;
1126   bits<5> Zm;
1127   bits<3> imm3;
1128   let Inst{31-24} = 0b01100101;
1129   let Inst{23-22} = sz;
1130   let Inst{21-19} = 0b010;
1131   let Inst{18-16} = imm3;
1132   let Inst{15-10} = 0b100000;
1133   let Inst{9-5}   = Zm;
1134   let Inst{4-0}   = Zdn;
1135
1136   let Constraints = "$Zdn = $_Zdn";
1137   let DestructiveInstType = Destructive;
1138   let ElementSize = ElementSizeNone;
1139 }
1140
1141 multiclass sve_fp_ftmad<string asm> {
1142   def _H : sve_fp_ftmad<0b01, asm, ZPR16>;
1143   def _S : sve_fp_ftmad<0b10, asm, ZPR32>;
1144   def _D : sve_fp_ftmad<0b11, asm, ZPR64>;
1145 }
1146
1147
1148 //===----------------------------------------------------------------------===//
1149 // SVE Floating Point Arithmetic - Unpredicated Group
1150 //===----------------------------------------------------------------------===//
1151
1152 class sve_fp_3op_u_zd<bits<2> sz, bits<3> opc, string asm,
1153                       ZPRRegOp zprty>
1154 : I<(outs zprty:$Zd), (ins  zprty:$Zn, zprty:$Zm),
1155   asm, "\t$Zd, $Zn, $Zm",
1156   "", []>, Sched<[]> {
1157   bits<5> Zd;
1158   bits<5> Zm;
1159   bits<5> Zn;
1160   let Inst{31-24} = 0b01100101;
1161   let Inst{23-22} = sz;
1162   let Inst{21}    = 0b0;
1163   let Inst{20-16} = Zm;
1164   let Inst{15-13} = 0b000;
1165   let Inst{12-10} = opc;
1166   let Inst{9-5}   = Zn;
1167   let Inst{4-0}   = Zd;
1168 }
1169
1170 multiclass sve_fp_3op_u_zd<bits<3> opc, string asm> {
1171   def _H : sve_fp_3op_u_zd<0b01, opc, asm, ZPR16>;
1172   def _S : sve_fp_3op_u_zd<0b10, opc, asm, ZPR32>;
1173   def _D : sve_fp_3op_u_zd<0b11, opc, asm, ZPR64>;
1174 }
1175
1176 //===----------------------------------------------------------------------===//
1177 // SVE Floating Point Fused Multiply-Add Group
1178 //===----------------------------------------------------------------------===//
1179
1180 class sve_fp_3op_p_zds_a<bits<2> sz, bits<2> opc, string asm, ZPRRegOp zprty>
1181 : I<(outs zprty:$Zda), (ins PPR3bAny:$Pg, zprty:$_Zda, zprty:$Zn, zprty:$Zm),
1182   asm, "\t$Zda, $Pg/m, $Zn, $Zm",
1183   "",
1184   []>, Sched<[]> {
1185   bits<3> Pg;
1186   bits<5> Zda;
1187   bits<5> Zm;
1188   bits<5> Zn;
1189   let Inst{31-24} = 0b01100101;
1190   let Inst{23-22} = sz;
1191   let Inst{21}    = 0b1;
1192   let Inst{20-16} = Zm;
1193   let Inst{15}    = 0b0;
1194   let Inst{14-13} = opc;
1195   let Inst{12-10} = Pg;
1196   let Inst{9-5}   = Zn;
1197   let Inst{4-0}   = Zda;
1198
1199   let Constraints = "$Zda = $_Zda";
1200   let DestructiveInstType = Destructive;
1201   let ElementSize = zprty.ElementSize;
1202 }
1203
1204 multiclass sve_fp_3op_p_zds_a<bits<2> opc, string asm> {
1205   def _H : sve_fp_3op_p_zds_a<0b01, opc, asm, ZPR16>;
1206   def _S : sve_fp_3op_p_zds_a<0b10, opc, asm, ZPR32>;
1207   def _D : sve_fp_3op_p_zds_a<0b11, opc, asm, ZPR64>;
1208 }
1209
1210 class sve_fp_3op_p_zds_b<bits<2> sz, bits<2> opc, string asm,
1211                          ZPRRegOp zprty>
1212 : I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, zprty:$Zm, zprty:$Za),
1213   asm, "\t$Zdn, $Pg/m, $Zm, $Za",
1214   "",
1215   []>, Sched<[]> {
1216   bits<3> Pg;
1217   bits<5> Za;
1218   bits<5> Zdn;
1219   bits<5> Zm;
1220   let Inst{31-24} = 0b01100101;
1221   let Inst{23-22} = sz;
1222   let Inst{21}    = 0b1;
1223   let Inst{20-16} = Za;
1224   let Inst{15}    = 0b1;
1225   let Inst{14-13} = opc;
1226   let Inst{12-10} = Pg;
1227   let Inst{9-5}   = Zm;
1228   let Inst{4-0}   = Zdn;
1229
1230   let Constraints = "$Zdn = $_Zdn";
1231   let DestructiveInstType = Destructive;
1232   let ElementSize = zprty.ElementSize;
1233 }
1234
1235 multiclass sve_fp_3op_p_zds_b<bits<2> opc, string asm> {
1236   def _H : sve_fp_3op_p_zds_b<0b01, opc, asm, ZPR16>;
1237   def _S : sve_fp_3op_p_zds_b<0b10, opc, asm, ZPR32>;
1238   def _D : sve_fp_3op_p_zds_b<0b11, opc, asm, ZPR64>;
1239 }
1240
1241 //===----------------------------------------------------------------------===//
1242 // SVE Floating Point Multiply-Add - Indexed Group
1243 //===----------------------------------------------------------------------===//
1244
1245 class sve_fp_fma_by_indexed_elem<bits<2> sz, bit opc, string asm,
1246                                  ZPRRegOp zprty1,
1247                                  ZPRRegOp zprty2, Operand itype>
1248 : I<(outs zprty1:$Zda), (ins zprty1:$_Zda, zprty1:$Zn, zprty2:$Zm, itype:$iop),
1249   asm, "\t$Zda, $Zn, $Zm$iop", "", []>, Sched<[]> {
1250   bits<5> Zda;
1251   bits<5> Zn;
1252   let Inst{31-24} = 0b01100100;
1253   let Inst{23-22} = sz;
1254   let Inst{21}    = 0b1;
1255   let Inst{15-11} = 0;
1256   let Inst{10}    = opc;
1257   let Inst{9-5}   = Zn;
1258   let Inst{4-0}   = Zda;
1259
1260   let Constraints = "$Zda = $_Zda";
1261   let DestructiveInstType = Destructive;
1262   let ElementSize = ElementSizeNone;
1263 }
1264
1265 multiclass sve_fp_fma_by_indexed_elem<bit opc, string asm> {
1266   def _H : sve_fp_fma_by_indexed_elem<{0, ?}, opc, asm, ZPR16, ZPR3b16, VectorIndexH> {
1267     bits<3> Zm;
1268     bits<3> iop;
1269     let Inst{22} = iop{2};
1270     let Inst{20-19} = iop{1-0};
1271     let Inst{18-16} = Zm;
1272   }
1273   def _S : sve_fp_fma_by_indexed_elem<0b10, opc, asm, ZPR32, ZPR3b32, VectorIndexS> {
1274     bits<3> Zm;
1275     bits<2> iop;
1276     let Inst{20-19} = iop;
1277     let Inst{18-16} = Zm;
1278   }
1279   def _D : sve_fp_fma_by_indexed_elem<0b11, opc, asm, ZPR64, ZPR4b64, VectorIndexD> {
1280     bits<4> Zm;
1281     bit iop;
1282     let Inst{20} = iop;
1283     let Inst{19-16} = Zm;
1284   }
1285 }
1286
1287
1288 //===----------------------------------------------------------------------===//
1289 // SVE Floating Point Multiply - Indexed Group
1290 //===----------------------------------------------------------------------===//
1291
1292 class sve_fp_fmul_by_indexed_elem<bits<2> sz, string asm, ZPRRegOp zprty,
1293                                       ZPRRegOp zprty2, Operand itype>
1294 : I<(outs zprty:$Zd), (ins zprty:$Zn, zprty2:$Zm, itype:$iop),
1295   asm, "\t$Zd, $Zn, $Zm$iop", "", []>, Sched<[]> {
1296   bits<5> Zd;
1297   bits<5> Zn;
1298   let Inst{31-24} = 0b01100100;
1299   let Inst{23-22} = sz;
1300   let Inst{21}    = 0b1;
1301   let Inst{15-10} = 0b001000;
1302   let Inst{9-5}   = Zn;
1303   let Inst{4-0}   = Zd;
1304 }
1305
1306 multiclass sve_fp_fmul_by_indexed_elem<string asm> {
1307   def _H : sve_fp_fmul_by_indexed_elem<{0, ?}, asm, ZPR16, ZPR3b16, VectorIndexH> {
1308     bits<3> Zm;
1309     bits<3> iop;
1310     let Inst{22} = iop{2};
1311     let Inst{20-19} = iop{1-0};
1312     let Inst{18-16} = Zm;
1313   }
1314   def _S : sve_fp_fmul_by_indexed_elem<0b10, asm, ZPR32, ZPR3b32, VectorIndexS> {
1315     bits<3> Zm;
1316     bits<2> iop;
1317     let Inst{20-19} = iop;
1318     let Inst{18-16} = Zm;
1319   }
1320   def _D : sve_fp_fmul_by_indexed_elem<0b11, asm, ZPR64, ZPR4b64, VectorIndexD> {
1321     bits<4> Zm;
1322     bit iop;
1323     let Inst{20} = iop;
1324     let Inst{19-16} = Zm;
1325   }
1326 }
1327
1328 //===----------------------------------------------------------------------===//
1329 // SVE Floating Point Complex Multiply-Add Group
1330 //===----------------------------------------------------------------------===//
1331
1332 class sve_fp_fcmla<bits<2> sz, string asm, ZPRRegOp zprty>
1333 : I<(outs zprty:$Zda), (ins PPR3bAny:$Pg, zprty:$_Zda, zprty:$Zn, zprty:$Zm,
1334                         complexrotateop:$imm),
1335   asm, "\t$Zda, $Pg/m, $Zn, $Zm, $imm",
1336   "", []>, Sched<[]> {
1337   bits<5> Zda;
1338   bits<3> Pg;
1339   bits<5> Zn;
1340   bits<5> Zm;
1341   bits<2> imm;
1342   let Inst{31-24} = 0b01100100;
1343   let Inst{23-22} = sz;
1344   let Inst{21}    = 0;
1345   let Inst{20-16} = Zm;
1346   let Inst{15}    = 0;
1347   let Inst{14-13} = imm;
1348   let Inst{12-10} = Pg;
1349   let Inst{9-5}   = Zn;
1350   let Inst{4-0}   = Zda;
1351
1352   let Constraints = "$Zda = $_Zda";
1353   let DestructiveInstType = Destructive;
1354   let ElementSize = zprty.ElementSize;
1355 }
1356
1357 multiclass sve_fp_fcmla<string asm> {
1358   def _H : sve_fp_fcmla<0b01, asm, ZPR16>;
1359   def _S : sve_fp_fcmla<0b10, asm, ZPR32>;
1360   def _D : sve_fp_fcmla<0b11, asm, ZPR64>;
1361 }
1362
1363 //===----------------------------------------------------------------------===//
1364 // SVE Floating Point Complex Multiply-Add - Indexed Group
1365 //===----------------------------------------------------------------------===//
1366
1367 class sve_fp_fcmla_by_indexed_elem<bits<2> sz, string asm,
1368                                    ZPRRegOp zprty,
1369                                    ZPRRegOp zprty2, Operand itype>
1370 : I<(outs zprty:$Zda), (ins zprty:$_Zda, zprty:$Zn, zprty2:$Zm, itype:$iop,
1371                         complexrotateop:$imm),
1372   asm, "\t$Zda, $Zn, $Zm$iop, $imm",
1373   "", []>, Sched<[]> {
1374   bits<5> Zda;
1375   bits<5> Zn;
1376   bits<2> imm;
1377   let Inst{31-24} = 0b01100100;
1378   let Inst{23-22} = sz;
1379   let Inst{21}    = 0b1;
1380   let Inst{15-12} = 0b0001;
1381   let Inst{11-10} = imm;
1382   let Inst{9-5}   = Zn;
1383   let Inst{4-0}   = Zda;
1384
1385   let Constraints = "$Zda = $_Zda";
1386   let DestructiveInstType = Destructive;
1387   let ElementSize = ElementSizeNone;
1388 }
1389
1390 multiclass sve_fp_fcmla_by_indexed_elem<string asm> {
1391   def _H : sve_fp_fcmla_by_indexed_elem<0b10, asm, ZPR16, ZPR3b16, VectorIndexS> {
1392     bits<3> Zm;
1393     bits<2> iop;
1394     let Inst{20-19} = iop;
1395     let Inst{18-16} = Zm;
1396   }
1397   def _S : sve_fp_fcmla_by_indexed_elem<0b11, asm, ZPR32, ZPR4b32, VectorIndexD> {
1398     bits<4> Zm;
1399     bits<1> iop;
1400     let Inst{20} = iop;
1401     let Inst{19-16} = Zm;
1402   }
1403 }
1404
1405 //===----------------------------------------------------------------------===//
1406 // SVE Floating Point Complex Addition Group
1407 //===----------------------------------------------------------------------===//
1408
1409 class sve_fp_fcadd<bits<2> sz, string asm, ZPRRegOp zprty>
1410 : I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, zprty:$Zm,
1411                         complexrotateopodd:$imm),
1412   asm, "\t$Zdn, $Pg/m, $_Zdn, $Zm, $imm",
1413   "",
1414   []>, Sched<[]> {
1415   bits<5> Zdn;
1416   bits<5> Zm;
1417   bits<3> Pg;
1418   bit imm;
1419   let Inst{31-24} = 0b01100100;
1420   let Inst{23-22} = sz;
1421   let Inst{21-17} = 0;
1422   let Inst{16}    = imm;
1423   let Inst{15-13} = 0b100;
1424   let Inst{12-10} = Pg;
1425   let Inst{9-5}   = Zm;
1426   let Inst{4-0}   = Zdn;
1427
1428   let Constraints = "$Zdn = $_Zdn";
1429   let DestructiveInstType = Destructive;
1430   let ElementSize = zprty.ElementSize;
1431 }
1432
1433 multiclass sve_fp_fcadd<string asm> {
1434   def _H : sve_fp_fcadd<0b01, asm, ZPR16>;
1435   def _S : sve_fp_fcadd<0b10, asm, ZPR32>;
1436   def _D : sve_fp_fcadd<0b11, asm, ZPR64>;
1437 }
1438
1439 //===----------------------------------------------------------------------===//
1440 // SVE Stack Allocation Group
1441 //===----------------------------------------------------------------------===//
1442
1443 class sve_int_arith_vl<bit opc, string asm>
1444 : I<(outs GPR64sp:$Rd), (ins GPR64sp:$Rn, simm6_32b:$imm6),
1445   asm, "\t$Rd, $Rn, $imm6",
1446   "",
1447   []>, Sched<[]> {
1448   bits<5> Rd;
1449   bits<5> Rn;
1450   bits<6> imm6;
1451   let Inst{31-23} = 0b000001000;
1452   let Inst{22}    = opc;
1453   let Inst{21}    = 0b1;
1454   let Inst{20-16} = Rn;
1455   let Inst{15-11} = 0b01010;
1456   let Inst{10-5}  = imm6;
1457   let Inst{4-0}   = Rd;
1458 }
1459
1460 class sve_int_read_vl_a<bit op, bits<5> opc2, string asm>
1461 : I<(outs GPR64:$Rd), (ins simm6_32b:$imm6),
1462   asm, "\t$Rd, $imm6",
1463   "",
1464   []>, Sched<[]> {
1465   bits<5> Rd;
1466   bits<6> imm6;
1467   let Inst{31-23} = 0b000001001;
1468   let Inst{22}    = op;
1469   let Inst{21}    = 0b1;
1470   let Inst{20-16} = opc2{4-0};
1471   let Inst{15-11} = 0b01010;
1472   let Inst{10-5}  = imm6;
1473   let Inst{4-0}   = Rd;
1474 }
1475
1476 //===----------------------------------------------------------------------===//
1477 // SVE Permute - In Lane Group
1478 //===----------------------------------------------------------------------===//
1479
1480 class sve_int_perm_bin_perm_zz<bits<3> opc, bits<2> sz8_64, string asm,
1481                                ZPRRegOp zprty>
1482 : I<(outs zprty:$Zd), (ins zprty:$Zn, zprty:$Zm),
1483   asm, "\t$Zd, $Zn, $Zm",
1484   "",
1485   []>, Sched<[]> {
1486   bits<5> Zd;
1487   bits<5> Zm;
1488   bits<5> Zn;
1489   let Inst{31-24} = 0b00000101;
1490   let Inst{23-22} = sz8_64;
1491   let Inst{21}    = 0b1;
1492   let Inst{20-16} = Zm;
1493   let Inst{15-13} = 0b011;
1494   let Inst{12-10} = opc;
1495   let Inst{9-5}   = Zn;
1496   let Inst{4-0}   = Zd;
1497 }
1498
1499 multiclass sve_int_perm_bin_perm_zz<bits<3> opc, string asm> {
1500   def _B : sve_int_perm_bin_perm_zz<opc, 0b00, asm, ZPR8>;
1501   def _H : sve_int_perm_bin_perm_zz<opc, 0b01, asm, ZPR16>;
1502   def _S : sve_int_perm_bin_perm_zz<opc, 0b10, asm, ZPR32>;
1503   def _D : sve_int_perm_bin_perm_zz<opc, 0b11, asm, ZPR64>;
1504 }
1505
1506 //===----------------------------------------------------------------------===//
1507 // SVE Floating Point Unary Operations Group
1508 //===----------------------------------------------------------------------===//
1509
1510 class sve_fp_2op_p_zd<bits<7> opc, string asm, RegisterOperand i_zprtype,
1511                       RegisterOperand o_zprtype, ElementSizeEnum size>
1512 : I<(outs o_zprtype:$Zd), (ins i_zprtype:$_Zd, PPR3bAny:$Pg, i_zprtype:$Zn),
1513   asm, "\t$Zd, $Pg/m, $Zn",
1514   "",
1515   []>, Sched<[]> {
1516   bits<3> Pg;
1517   bits<5> Zd;
1518   bits<5> Zn;
1519   let Inst{31-24} = 0b01100101;
1520   let Inst{23-22} = opc{6-5};
1521   let Inst{21}    = 0b0;
1522   let Inst{20-16} = opc{4-0};
1523   let Inst{15-13} = 0b101;
1524   let Inst{12-10} = Pg;
1525   let Inst{9-5}   = Zn;
1526   let Inst{4-0}   = Zd;
1527
1528   let Constraints = "$Zd = $_Zd";
1529   let DestructiveInstType = Destructive;
1530   let ElementSize = size;
1531 }
1532
1533 multiclass sve_fp_2op_p_zd_HSD<bits<5> opc, string asm> {
1534   def _H : sve_fp_2op_p_zd<{ 0b01, opc }, asm, ZPR16, ZPR16, ElementSizeH>;
1535   def _S : sve_fp_2op_p_zd<{ 0b10, opc }, asm, ZPR32, ZPR32, ElementSizeS>;
1536   def _D : sve_fp_2op_p_zd<{ 0b11, opc }, asm, ZPR64, ZPR64, ElementSizeD>;
1537 }
1538
1539 //===----------------------------------------------------------------------===//
1540 // SVE Floating Point Unary Operations - Unpredicated Group
1541 //===----------------------------------------------------------------------===//
1542
1543 class sve_fp_2op_u_zd<bits<2> sz, bits<3> opc, string asm,
1544                       ZPRRegOp zprty>
1545 : I<(outs zprty:$Zd), (ins zprty:$Zn),
1546   asm, "\t$Zd, $Zn",
1547   "",
1548   []>, Sched<[]> {
1549   bits<5> Zd;
1550   bits<5> Zn;
1551   let Inst{31-24} = 0b01100101;
1552   let Inst{23-22} = sz;
1553   let Inst{21-19} = 0b001;
1554   let Inst{18-16} = opc;
1555   let Inst{15-10} = 0b001100;
1556   let Inst{9-5}   = Zn;
1557   let Inst{4-0}   = Zd;
1558 }
1559
1560 multiclass sve_fp_2op_u_zd<bits<3> opc, string asm> {
1561   def _H : sve_fp_2op_u_zd<0b01, opc, asm, ZPR16>;
1562   def _S : sve_fp_2op_u_zd<0b10, opc, asm, ZPR32>;
1563   def _D : sve_fp_2op_u_zd<0b11, opc, asm, ZPR64>;
1564 }
1565
1566 //===----------------------------------------------------------------------===//
1567 // SVE Integer Arithmetic - Binary Predicated Group
1568 //===----------------------------------------------------------------------===//
1569
1570 class sve_int_bin_pred_arit_log<bits<2> sz8_64, bits<2> fmt, bits<3> opc,
1571                                 string asm, ZPRRegOp zprty>
1572 : I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, zprty:$Zm),
1573   asm, "\t$Zdn, $Pg/m, $_Zdn, $Zm", "", []>, Sched<[]> {
1574   bits<3> Pg;
1575   bits<5> Zdn;
1576   bits<5> Zm;
1577   let Inst{31-24} = 0b00000100;
1578   let Inst{23-22} = sz8_64;
1579   let Inst{21}    = 0b0;
1580   let Inst{20-19} = fmt;
1581   let Inst{18-16} = opc;
1582   let Inst{15-13} = 0b000;
1583   let Inst{12-10} = Pg;
1584   let Inst{9-5}   = Zm;
1585   let Inst{4-0}   = Zdn;
1586
1587   let Constraints = "$Zdn = $_Zdn";
1588   let DestructiveInstType = Destructive;
1589   let ElementSize = zprty.ElementSize;
1590 }
1591
1592 multiclass sve_int_bin_pred_log<bits<3> opc, string asm> {
1593   def _B : sve_int_bin_pred_arit_log<0b00, 0b11, opc, asm, ZPR8>;
1594   def _H : sve_int_bin_pred_arit_log<0b01, 0b11, opc, asm, ZPR16>;
1595   def _S : sve_int_bin_pred_arit_log<0b10, 0b11, opc, asm, ZPR32>;
1596   def _D : sve_int_bin_pred_arit_log<0b11, 0b11, opc, asm, ZPR64>;
1597 }
1598
1599 multiclass sve_int_bin_pred_arit_0<bits<3> opc, string asm> {
1600   def _B : sve_int_bin_pred_arit_log<0b00, 0b00, opc, asm, ZPR8>;
1601   def _H : sve_int_bin_pred_arit_log<0b01, 0b00, opc, asm, ZPR16>;
1602   def _S : sve_int_bin_pred_arit_log<0b10, 0b00, opc, asm, ZPR32>;
1603   def _D : sve_int_bin_pred_arit_log<0b11, 0b00, opc, asm, ZPR64>;
1604 }
1605
1606 multiclass sve_int_bin_pred_arit_1<bits<3> opc, string asm> {
1607   def _B : sve_int_bin_pred_arit_log<0b00, 0b01, opc, asm, ZPR8>;
1608   def _H : sve_int_bin_pred_arit_log<0b01, 0b01, opc, asm, ZPR16>;
1609   def _S : sve_int_bin_pred_arit_log<0b10, 0b01, opc, asm, ZPR32>;
1610   def _D : sve_int_bin_pred_arit_log<0b11, 0b01, opc, asm, ZPR64>;
1611 }
1612
1613 multiclass sve_int_bin_pred_arit_2<bits<3> opc, string asm> {
1614   def _B : sve_int_bin_pred_arit_log<0b00, 0b10, opc, asm, ZPR8>;
1615   def _H : sve_int_bin_pred_arit_log<0b01, 0b10, opc, asm, ZPR16>;
1616   def _S : sve_int_bin_pred_arit_log<0b10, 0b10, opc, asm, ZPR32>;
1617   def _D : sve_int_bin_pred_arit_log<0b11, 0b10, opc, asm, ZPR64>;
1618 }
1619
1620 // Special case for divides which are not defined for 8b/16b elements.
1621 multiclass sve_int_bin_pred_arit_2_div<bits<3> opc, string asm> {
1622   def _S : sve_int_bin_pred_arit_log<0b10, 0b10, opc, asm, ZPR32>;
1623   def _D : sve_int_bin_pred_arit_log<0b11, 0b10, opc, asm, ZPR64>;
1624 }
1625
1626 //===----------------------------------------------------------------------===//
1627 // SVE Integer Multiply-Add Group
1628 //===----------------------------------------------------------------------===//
1629
1630 class sve_int_mladdsub_vvv_pred<bits<2> sz8_64, bits<1> opc, string asm,
1631                                 ZPRRegOp zprty>
1632 : I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, zprty:$Zm, zprty:$Za),
1633   asm, "\t$Zdn, $Pg/m, $Zm, $Za",
1634   "",
1635   []>, Sched<[]> {
1636   bits<3> Pg;
1637   bits<5> Zdn;
1638   bits<5> Za;
1639   bits<5> Zm;
1640   let Inst{31-24} = 0b00000100;
1641   let Inst{23-22} = sz8_64;
1642   let Inst{21}    = 0b0;
1643   let Inst{20-16} = Zm;
1644   let Inst{15-14} = 0b11;
1645   let Inst{13}    = opc;
1646   let Inst{12-10} = Pg;
1647   let Inst{9-5}   = Za;
1648   let Inst{4-0}   = Zdn;
1649
1650   let Constraints = "$Zdn = $_Zdn";
1651   let DestructiveInstType = Destructive;
1652   let ElementSize = zprty.ElementSize;
1653 }
1654
1655 multiclass sve_int_mladdsub_vvv_pred<bits<1> opc, string asm> {
1656   def _B : sve_int_mladdsub_vvv_pred<0b00, opc, asm, ZPR8>;
1657   def _H : sve_int_mladdsub_vvv_pred<0b01, opc, asm, ZPR16>;
1658   def _S : sve_int_mladdsub_vvv_pred<0b10, opc, asm, ZPR32>;
1659   def _D : sve_int_mladdsub_vvv_pred<0b11, opc, asm, ZPR64>;
1660 }
1661
1662 class sve_int_mlas_vvv_pred<bits<2> sz8_64, bits<1> opc, string asm,
1663                             ZPRRegOp zprty>
1664 : I<(outs zprty:$Zda), (ins PPR3bAny:$Pg, zprty:$_Zda, zprty:$Zn, zprty:$Zm),
1665   asm, "\t$Zda, $Pg/m, $Zn, $Zm",
1666   "",
1667   []>, Sched<[]> {
1668   bits<3> Pg;
1669   bits<5> Zda;
1670   bits<5> Zm;
1671   bits<5> Zn;
1672   let Inst{31-24} = 0b00000100;
1673   let Inst{23-22} = sz8_64;
1674   let Inst{21}    = 0b0;
1675   let Inst{20-16} = Zm;
1676   let Inst{15-14} = 0b01;
1677   let Inst{13}    = opc;
1678   let Inst{12-10} = Pg;
1679   let Inst{9-5}   = Zn;
1680   let Inst{4-0}   = Zda;
1681
1682   let Constraints = "$Zda = $_Zda";
1683   let DestructiveInstType = Destructive;
1684   let ElementSize = zprty.ElementSize;
1685 }
1686
1687 multiclass sve_int_mlas_vvv_pred<bits<1> opc, string asm> {
1688   def _B : sve_int_mlas_vvv_pred<0b00, opc, asm, ZPR8>;
1689   def _H : sve_int_mlas_vvv_pred<0b01, opc, asm, ZPR16>;
1690   def _S : sve_int_mlas_vvv_pred<0b10, opc, asm, ZPR32>;
1691   def _D : sve_int_mlas_vvv_pred<0b11, opc, asm, ZPR64>;
1692 }
1693
1694 //===----------------------------------------------------------------------===//
1695 // SVE Integer Dot Product Group
1696 //===----------------------------------------------------------------------===//
1697
1698 class sve_intx_dot<bit sz, bit U, string asm, ZPRRegOp zprty1,
1699                    ZPRRegOp zprty2>
1700 : I<(outs zprty1:$Zda), (ins zprty1:$_Zda, zprty2:$Zn, zprty2:$Zm), asm,
1701   "\t$Zda, $Zn, $Zm", "", []>, Sched<[]> {
1702   bits<5> Zda;
1703   bits<5> Zn;
1704   bits<5> Zm;
1705   let Inst{31-23} = 0b010001001;
1706   let Inst{22}    = sz;
1707   let Inst{21}    = 0;
1708   let Inst{20-16} = Zm;
1709   let Inst{15-11} = 0;
1710   let Inst{10}    = U;
1711   let Inst{9-5}   = Zn;
1712   let Inst{4-0}   = Zda;
1713
1714   let Constraints = "$Zda = $_Zda";
1715   let DestructiveInstType = Destructive;
1716   let ElementSize = zprty1.ElementSize;
1717 }
1718
1719 multiclass sve_intx_dot<bit opc, string asm> {
1720   def _S : sve_intx_dot<0b0, opc, asm, ZPR32, ZPR8>;
1721   def _D : sve_intx_dot<0b1, opc, asm, ZPR64, ZPR16>;
1722 }
1723
1724 //===----------------------------------------------------------------------===//
1725 // SVE Integer Dot Product Group - Indexed Group
1726 //===----------------------------------------------------------------------===//
1727
1728 class sve_intx_dot_by_indexed_elem<bit sz, bit U, string asm,
1729                                    ZPRRegOp zprty1, ZPRRegOp zprty2,
1730                                    ZPRRegOp zprty3, Operand itype>
1731 : I<(outs zprty1:$Zda), (ins zprty1:$_Zda, zprty2:$Zn, zprty3:$Zm, itype:$iop),
1732   asm, "\t$Zda, $Zn, $Zm$iop",
1733   "", []>, Sched<[]> {
1734   bits<5> Zda;
1735   bits<5> Zn;
1736   let Inst{31-23} = 0b010001001;
1737   let Inst{22}    = sz;
1738   let Inst{21}    = 0b1;
1739   let Inst{15-11} = 0;
1740   let Inst{10}    = U;
1741   let Inst{9-5}   = Zn;
1742   let Inst{4-0}   = Zda;
1743
1744   let Constraints = "$Zda = $_Zda";
1745   let DestructiveInstType = Destructive;
1746   let ElementSize = ElementSizeNone;
1747 }
1748
1749 multiclass sve_intx_dot_by_indexed_elem<bit opc, string asm> {
1750   def _S : sve_intx_dot_by_indexed_elem<0b0, opc, asm, ZPR32, ZPR8, ZPR3b8, VectorIndexS> {
1751     bits<2> iop;
1752     bits<3> Zm;
1753     let Inst{20-19} = iop;
1754     let Inst{18-16} = Zm;
1755   }
1756   def _D : sve_intx_dot_by_indexed_elem<0b1, opc, asm, ZPR64, ZPR16, ZPR4b16, VectorIndexD> {
1757     bits<1> iop;
1758     bits<4> Zm;
1759     let Inst{20} = iop;
1760     let Inst{19-16} = Zm;
1761   }
1762 }
1763
1764 //===----------------------------------------------------------------------===//
1765 // SVE Integer Arithmetic - Unary Predicated Group
1766 //===----------------------------------------------------------------------===//
1767
1768 class sve_int_un_pred_arit<bits<2> sz8_64, bits<4> opc,
1769                              string asm, ZPRRegOp zprty>
1770 : I<(outs zprty:$Zd), (ins zprty:$_Zd, PPR3bAny:$Pg, zprty:$Zn),
1771   asm, "\t$Zd, $Pg/m, $Zn",
1772   "",
1773   []>, Sched<[]> {
1774   bits<3> Pg;
1775   bits<5> Zd;
1776   bits<5> Zn;
1777   let Inst{31-24} = 0b00000100;
1778   let Inst{23-22} = sz8_64;
1779   let Inst{21-20} = 0b01;
1780   let Inst{19}    = opc{0};
1781   let Inst{18-16} = opc{3-1};
1782   let Inst{15-13} = 0b101;
1783   let Inst{12-10} = Pg;
1784   let Inst{9-5}   = Zn;
1785   let Inst{4-0}   = Zd;
1786
1787   let Constraints = "$Zd = $_Zd";
1788   let DestructiveInstType = Destructive;
1789   let ElementSize = zprty.ElementSize;
1790 }
1791
1792 multiclass sve_int_un_pred_arit_0<bits<3> opc, string asm> {
1793   def _B : sve_int_un_pred_arit<0b00, { opc, 0b0 }, asm, ZPR8>;
1794   def _H : sve_int_un_pred_arit<0b01, { opc, 0b0 }, asm, ZPR16>;
1795   def _S : sve_int_un_pred_arit<0b10, { opc, 0b0 }, asm, ZPR32>;
1796   def _D : sve_int_un_pred_arit<0b11, { opc, 0b0 }, asm, ZPR64>;
1797 }
1798
1799 multiclass sve_int_un_pred_arit_0_h<bits<3> opc, string asm> {
1800   def _H : sve_int_un_pred_arit<0b01, { opc, 0b0 }, asm, ZPR16>;
1801   def _S : sve_int_un_pred_arit<0b10, { opc, 0b0 }, asm, ZPR32>;
1802   def _D : sve_int_un_pred_arit<0b11, { opc, 0b0 }, asm, ZPR64>;
1803 }
1804
1805 multiclass sve_int_un_pred_arit_0_w<bits<3> opc, string asm> {
1806   def _S : sve_int_un_pred_arit<0b10, { opc, 0b0 }, asm, ZPR32>;
1807   def _D : sve_int_un_pred_arit<0b11, { opc, 0b0 }, asm, ZPR64>;
1808 }
1809
1810 multiclass sve_int_un_pred_arit_0_d<bits<3> opc, string asm> {
1811   def _D : sve_int_un_pred_arit<0b11, { opc, 0b0 }, asm, ZPR64>;
1812 }
1813
1814 multiclass sve_int_un_pred_arit_1<bits<3> opc, string asm> {
1815   def _B : sve_int_un_pred_arit<0b00, { opc, 0b1 }, asm, ZPR8>;
1816   def _H : sve_int_un_pred_arit<0b01, { opc, 0b1 }, asm, ZPR16>;
1817   def _S : sve_int_un_pred_arit<0b10, { opc, 0b1 }, asm, ZPR32>;
1818   def _D : sve_int_un_pred_arit<0b11, { opc, 0b1 }, asm, ZPR64>;
1819 }
1820
1821 multiclass sve_int_un_pred_arit_1_fp<bits<3> opc, string asm> {
1822   def _H : sve_int_un_pred_arit<0b01, { opc, 0b1 }, asm, ZPR16>;
1823   def _S : sve_int_un_pred_arit<0b10, { opc, 0b1 }, asm, ZPR32>;
1824   def _D : sve_int_un_pred_arit<0b11, { opc, 0b1 }, asm, ZPR64>;
1825 }
1826
1827 //===----------------------------------------------------------------------===//
1828 // SVE Integer Wide Immediate - Unpredicated Group
1829 //===----------------------------------------------------------------------===//
1830 class sve_int_dup_imm<bits<2> sz8_64, string asm,
1831                       ZPRRegOp zprty, Operand immtype>
1832 : I<(outs zprty:$Zd), (ins immtype:$imm),
1833   asm, "\t$Zd, $imm",
1834   "",
1835   []>, Sched<[]> {
1836   bits<5> Zd;
1837   bits<9> imm;
1838   let Inst{31-24} = 0b00100101;
1839   let Inst{23-22} = sz8_64;
1840   let Inst{21-14} = 0b11100011;
1841   let Inst{13}    = imm{8};   // sh
1842   let Inst{12-5}  = imm{7-0}; // imm8
1843   let Inst{4-0}   = Zd;
1844
1845   let isReMaterializable = 1;
1846 }
1847
1848 multiclass sve_int_dup_imm<string asm> {
1849   def _B : sve_int_dup_imm<0b00, asm, ZPR8, cpy_imm8_opt_lsl_i8>;
1850   def _H : sve_int_dup_imm<0b01, asm, ZPR16, cpy_imm8_opt_lsl_i16>;
1851   def _S : sve_int_dup_imm<0b10, asm, ZPR32, cpy_imm8_opt_lsl_i32>;
1852   def _D : sve_int_dup_imm<0b11, asm, ZPR64, cpy_imm8_opt_lsl_i64>;
1853
1854   def : InstAlias<"mov $Zd, $imm",
1855                   (!cast<Instruction>(NAME # _B) ZPR8:$Zd, cpy_imm8_opt_lsl_i8:$imm), 1>;
1856   def : InstAlias<"mov $Zd, $imm",
1857                   (!cast<Instruction>(NAME # _H) ZPR16:$Zd, cpy_imm8_opt_lsl_i16:$imm), 1>;
1858   def : InstAlias<"mov $Zd, $imm",
1859                   (!cast<Instruction>(NAME # _S) ZPR32:$Zd, cpy_imm8_opt_lsl_i32:$imm), 1>;
1860   def : InstAlias<"mov $Zd, $imm",
1861                   (!cast<Instruction>(NAME # _D) ZPR64:$Zd, cpy_imm8_opt_lsl_i64:$imm), 1>;
1862
1863   def : InstAlias<"fmov $Zd, #0.0",
1864                   (!cast<Instruction>(NAME # _H) ZPR16:$Zd, 0, 0), 1>;
1865   def : InstAlias<"fmov $Zd, #0.0",
1866                   (!cast<Instruction>(NAME # _S) ZPR32:$Zd, 0, 0), 1>;
1867   def : InstAlias<"fmov $Zd, #0.0",
1868                   (!cast<Instruction>(NAME # _D) ZPR64:$Zd, 0, 0), 1>;
1869 }
1870
1871 class sve_int_dup_fpimm<bits<2> sz8_64, Operand fpimmtype,
1872                         string asm, ZPRRegOp zprty>
1873 : I<(outs zprty:$Zd), (ins fpimmtype:$imm8),
1874   asm, "\t$Zd, $imm8",
1875   "",
1876   []>, Sched<[]> {
1877   bits<5> Zd;
1878   bits<8> imm8;
1879   let Inst{31-24} = 0b00100101;
1880   let Inst{23-22} = sz8_64;
1881   let Inst{21-14} = 0b11100111;
1882   let Inst{13}    = 0b0;
1883   let Inst{12-5}  = imm8;
1884   let Inst{4-0}   = Zd;
1885
1886   let isReMaterializable = 1;
1887 }
1888
1889 multiclass sve_int_dup_fpimm<string asm> {
1890   def _H : sve_int_dup_fpimm<0b01, fpimm16, asm, ZPR16>;
1891   def _S : sve_int_dup_fpimm<0b10, fpimm32, asm, ZPR32>;
1892   def _D : sve_int_dup_fpimm<0b11, fpimm64, asm, ZPR64>;
1893
1894   def : InstAlias<"fmov $Zd, $imm8",
1895                   (!cast<Instruction>(NAME # _H) ZPR16:$Zd, fpimm16:$imm8), 1>;
1896   def : InstAlias<"fmov $Zd, $imm8",
1897                   (!cast<Instruction>(NAME # _S) ZPR32:$Zd, fpimm32:$imm8), 1>;
1898   def : InstAlias<"fmov $Zd, $imm8",
1899                   (!cast<Instruction>(NAME # _D) ZPR64:$Zd, fpimm64:$imm8), 1>;
1900 }
1901
1902 class sve_int_arith_imm0<bits<2> sz8_64, bits<3> opc, string asm,
1903                          ZPRRegOp zprty, Operand immtype>
1904 : I<(outs zprty:$Zdn), (ins zprty:$_Zdn, immtype:$imm),
1905   asm, "\t$Zdn, $_Zdn, $imm",
1906   "",
1907   []>, Sched<[]> {
1908   bits<5> Zdn;
1909   bits<9> imm;
1910   let Inst{31-24} = 0b00100101;
1911   let Inst{23-22} = sz8_64;
1912   let Inst{21-19} = 0b100;
1913   let Inst{18-16} = opc;
1914   let Inst{15-14} = 0b11;
1915   let Inst{13}    = imm{8};   // sh
1916   let Inst{12-5}  = imm{7-0}; // imm8
1917   let Inst{4-0}   = Zdn;
1918
1919   let Constraints = "$Zdn = $_Zdn";
1920   let DestructiveInstType = Destructive;
1921   let ElementSize = ElementSizeNone;
1922 }
1923
1924 multiclass sve_int_arith_imm0<bits<3> opc, string asm> {
1925   def _B : sve_int_arith_imm0<0b00, opc, asm, ZPR8, addsub_imm8_opt_lsl_i8>;
1926   def _H : sve_int_arith_imm0<0b01, opc, asm, ZPR16, addsub_imm8_opt_lsl_i16>;
1927   def _S : sve_int_arith_imm0<0b10, opc, asm, ZPR32, addsub_imm8_opt_lsl_i32>;
1928   def _D : sve_int_arith_imm0<0b11, opc, asm, ZPR64, addsub_imm8_opt_lsl_i64>;
1929 }
1930
1931 class sve_int_arith_imm<bits<2> sz8_64, bits<6> opc, string asm,
1932                         ZPRRegOp zprty, Operand immtype>
1933 : I<(outs zprty:$Zdn), (ins zprty:$_Zdn, immtype:$imm),
1934   asm, "\t$Zdn, $_Zdn, $imm",
1935   "",
1936   []>, Sched<[]> {
1937   bits<5> Zdn;
1938   bits<8> imm;
1939   let Inst{31-24} = 0b00100101;
1940   let Inst{23-22} = sz8_64;
1941   let Inst{21-16} = opc;
1942   let Inst{15-13} = 0b110;
1943   let Inst{12-5} = imm;
1944   let Inst{4-0} = Zdn;
1945
1946   let Constraints = "$Zdn = $_Zdn";
1947   let DestructiveInstType = Destructive;
1948   let ElementSize = ElementSizeNone;
1949 }
1950
1951 multiclass sve_int_arith_imm1<bits<2> opc, string asm, Operand immtype> {
1952   def _B : sve_int_arith_imm<0b00, { 0b1010, opc }, asm, ZPR8, immtype>;
1953   def _H : sve_int_arith_imm<0b01, { 0b1010, opc }, asm, ZPR16, immtype>;
1954   def _S : sve_int_arith_imm<0b10, { 0b1010, opc }, asm, ZPR32, immtype>;
1955   def _D : sve_int_arith_imm<0b11, { 0b1010, opc }, asm, ZPR64, immtype>;
1956 }
1957
1958 multiclass sve_int_arith_imm2<string asm> {
1959   def _B : sve_int_arith_imm<0b00, 0b110000, asm, ZPR8,  simm8>;
1960   def _H : sve_int_arith_imm<0b01, 0b110000, asm, ZPR16, simm8>;
1961   def _S : sve_int_arith_imm<0b10, 0b110000, asm, ZPR32, simm8>;
1962   def _D : sve_int_arith_imm<0b11, 0b110000, asm, ZPR64, simm8>;
1963 }
1964
1965 //===----------------------------------------------------------------------===//
1966 // SVE Bitwise Logical - Unpredicated Group
1967 //===----------------------------------------------------------------------===//
1968
1969 class sve_int_bin_cons_log<bits<2> opc, string asm>
1970 : I<(outs ZPR64:$Zd), (ins ZPR64:$Zn, ZPR64:$Zm),
1971   asm, "\t$Zd, $Zn, $Zm",
1972   "",
1973   []>, Sched<[]> {
1974   bits<5> Zd;
1975   bits<5> Zm;
1976   bits<5> Zn;
1977   let Inst{31-24} = 0b00000100;
1978   let Inst{23-22} = opc{1-0};
1979   let Inst{21}    = 0b1;
1980   let Inst{20-16} = Zm;
1981   let Inst{15-10} = 0b001100;
1982   let Inst{9-5}   = Zn;
1983   let Inst{4-0}   = Zd;
1984 }
1985
1986
1987 //===----------------------------------------------------------------------===//
1988 // SVE Integer Wide Immediate - Predicated Group
1989 //===----------------------------------------------------------------------===//
1990
1991 class sve_int_dup_fpimm_pred<bits<2> sz, Operand fpimmtype,
1992                              string asm, ZPRRegOp zprty>
1993 : I<(outs zprty:$Zd), (ins zprty:$_Zd, PPRAny:$Pg, fpimmtype:$imm8),
1994   asm, "\t$Zd, $Pg/m, $imm8",
1995   "",
1996   []>, Sched<[]> {
1997   bits<4> Pg;
1998   bits<5> Zd;
1999   bits<8> imm8;
2000   let Inst{31-24} = 0b00000101;
2001   let Inst{23-22} = sz;
2002   let Inst{21-20} = 0b01;
2003   let Inst{19-16} = Pg;
2004   let Inst{15-13} = 0b110;
2005   let Inst{12-5}  = imm8;
2006   let Inst{4-0}   = Zd;
2007
2008   let Constraints = "$Zd = $_Zd";
2009   let DestructiveInstType = Destructive;
2010   let ElementSize = zprty.ElementSize;
2011 }
2012
2013 multiclass sve_int_dup_fpimm_pred<string asm> {
2014   def _H : sve_int_dup_fpimm_pred<0b01, fpimm16, asm, ZPR16>;
2015   def _S : sve_int_dup_fpimm_pred<0b10, fpimm32, asm, ZPR32>;
2016   def _D : sve_int_dup_fpimm_pred<0b11, fpimm64, asm, ZPR64>;
2017
2018   def : InstAlias<"fmov $Zd, $Pg/m, $imm8",
2019                   (!cast<Instruction>(NAME # _H) ZPR16:$Zd, PPRAny:$Pg, fpimm16:$imm8), 1>;
2020   def : InstAlias<"fmov $Zd, $Pg/m, $imm8",
2021                   (!cast<Instruction>(NAME # _S) ZPR32:$Zd, PPRAny:$Pg, fpimm32:$imm8), 1>;
2022   def : InstAlias<"fmov $Zd, $Pg/m, $imm8",
2023                   (!cast<Instruction>(NAME # _D) ZPR64:$Zd, PPRAny:$Pg, fpimm64:$imm8), 1>;
2024 }
2025
2026 class sve_int_dup_imm_pred<bits<2> sz8_64, bit m, string asm,
2027                            ZPRRegOp zprty, string pred_qual, dag iops>
2028 : I<(outs zprty:$Zd), iops,
2029   asm, "\t$Zd, $Pg"#pred_qual#", $imm",
2030   "", []>, Sched<[]> {
2031   bits<5> Zd;
2032   bits<4> Pg;
2033   bits<9> imm;
2034   let Inst{31-24} = 0b00000101;
2035   let Inst{23-22} = sz8_64;
2036   let Inst{21-20} = 0b01;
2037   let Inst{19-16} = Pg;
2038   let Inst{15}    = 0b0;
2039   let Inst{14}    = m;
2040   let Inst{13}    = imm{8};   // sh
2041   let Inst{12-5}  = imm{7-0}; // imm8
2042   let Inst{4-0}   = Zd;
2043
2044   let DestructiveInstType = Destructive;
2045   let ElementSize = zprty.ElementSize;
2046 }
2047
2048 multiclass sve_int_dup_imm_pred_merge<string asm> {
2049   let Constraints = "$Zd = $_Zd" in {
2050   def _B : sve_int_dup_imm_pred<0b00, 1, asm, ZPR8,  "/m", (ins ZPR8:$_Zd,  PPRAny:$Pg, cpy_imm8_opt_lsl_i8:$imm)>;
2051   def _H : sve_int_dup_imm_pred<0b01, 1, asm, ZPR16, "/m", (ins ZPR16:$_Zd, PPRAny:$Pg, cpy_imm8_opt_lsl_i16:$imm)>;
2052   def _S : sve_int_dup_imm_pred<0b10, 1, asm, ZPR32, "/m", (ins ZPR32:$_Zd, PPRAny:$Pg, cpy_imm8_opt_lsl_i32:$imm)>;
2053   def _D : sve_int_dup_imm_pred<0b11, 1, asm, ZPR64, "/m", (ins ZPR64:$_Zd, PPRAny:$Pg, cpy_imm8_opt_lsl_i64:$imm)>;
2054   }
2055
2056   def : InstAlias<"mov $Zd, $Pg/m, $imm",
2057                   (!cast<Instruction>(NAME # _B) ZPR8:$Zd,  PPRAny:$Pg, cpy_imm8_opt_lsl_i8:$imm), 1>;
2058   def : InstAlias<"mov $Zd, $Pg/m, $imm",
2059                   (!cast<Instruction>(NAME # _H) ZPR16:$Zd, PPRAny:$Pg, cpy_imm8_opt_lsl_i16:$imm), 1>;
2060   def : InstAlias<"mov $Zd, $Pg/m, $imm",
2061                   (!cast<Instruction>(NAME # _S) ZPR32:$Zd, PPRAny:$Pg, cpy_imm8_opt_lsl_i32:$imm), 1>;
2062   def : InstAlias<"mov $Zd, $Pg/m, $imm",
2063                   (!cast<Instruction>(NAME # _D) ZPR64:$Zd, PPRAny:$Pg, cpy_imm8_opt_lsl_i64:$imm), 1>;
2064
2065   def : InstAlias<"fmov $Zd, $Pg/m, #0.0",
2066                   (!cast<Instruction>(NAME # _H) ZPR16:$Zd, PPRAny:$Pg, 0, 0), 0>;
2067   def : InstAlias<"fmov $Zd, $Pg/m, #0.0",
2068                   (!cast<Instruction>(NAME # _S) ZPR32:$Zd, PPRAny:$Pg, 0, 0), 0>;
2069   def : InstAlias<"fmov $Zd, $Pg/m, #0.0",
2070                   (!cast<Instruction>(NAME # _D) ZPR64:$Zd, PPRAny:$Pg, 0, 0), 0>;
2071 }
2072
2073 multiclass sve_int_dup_imm_pred_zero<string asm> {
2074   def _B : sve_int_dup_imm_pred<0b00, 0, asm, ZPR8,  "/z", (ins PPRAny:$Pg, cpy_imm8_opt_lsl_i8:$imm)>;
2075   def _H : sve_int_dup_imm_pred<0b01, 0, asm, ZPR16, "/z", (ins PPRAny:$Pg, cpy_imm8_opt_lsl_i16:$imm)>;
2076   def _S : sve_int_dup_imm_pred<0b10, 0, asm, ZPR32, "/z", (ins PPRAny:$Pg, cpy_imm8_opt_lsl_i32:$imm)>;
2077   def _D : sve_int_dup_imm_pred<0b11, 0, asm, ZPR64, "/z", (ins PPRAny:$Pg, cpy_imm8_opt_lsl_i64:$imm)>;
2078
2079   def : InstAlias<"mov $Zd, $Pg/z, $imm",
2080                   (!cast<Instruction>(NAME # _B) ZPR8:$Zd,  PPRAny:$Pg, cpy_imm8_opt_lsl_i8:$imm), 1>;
2081   def : InstAlias<"mov $Zd, $Pg/z, $imm",
2082                   (!cast<Instruction>(NAME # _H) ZPR16:$Zd, PPRAny:$Pg, cpy_imm8_opt_lsl_i16:$imm), 1>;
2083   def : InstAlias<"mov $Zd, $Pg/z, $imm",
2084                   (!cast<Instruction>(NAME # _S) ZPR32:$Zd, PPRAny:$Pg, cpy_imm8_opt_lsl_i32:$imm), 1>;
2085   def : InstAlias<"mov $Zd, $Pg/z, $imm",
2086                   (!cast<Instruction>(NAME # _D) ZPR64:$Zd, PPRAny:$Pg, cpy_imm8_opt_lsl_i64:$imm), 1>;
2087 }
2088
2089 //===----------------------------------------------------------------------===//
2090 // SVE Integer Compare - Vectors Group
2091 //===----------------------------------------------------------------------===//
2092
2093 class sve_int_cmp<bit cmp_1, bits<2> sz8_64, bits<3> opc, string asm,
2094                   PPRRegOp pprty, ZPRRegOp zprty1, ZPRRegOp zprty2>
2095 : I<(outs pprty:$Pd), (ins PPR3bAny:$Pg, zprty1:$Zn, zprty2:$Zm),
2096   asm, "\t$Pd, $Pg/z, $Zn, $Zm",
2097   "",
2098   []>, Sched<[]> {
2099   bits<4> Pd;
2100   bits<3> Pg;
2101   bits<5> Zm;
2102   bits<5> Zn;
2103   let Inst{31-24} = 0b00100100;
2104   let Inst{23-22} = sz8_64;
2105   let Inst{21}    = 0b0;
2106   let Inst{20-16} = Zm;
2107   let Inst{15}    = opc{2};
2108   let Inst{14}    = cmp_1;
2109   let Inst{13}    = opc{1};
2110   let Inst{12-10} = Pg;
2111   let Inst{9-5}   = Zn;
2112   let Inst{4}     = opc{0};
2113   let Inst{3-0}   = Pd;
2114
2115   let Defs = [NZCV];
2116 }
2117
2118 multiclass sve_int_cmp_0<bits<3> opc, string asm> {
2119   def _B : sve_int_cmp<0b0, 0b00, opc, asm, PPR8, ZPR8, ZPR8>;
2120   def _H : sve_int_cmp<0b0, 0b01, opc, asm, PPR16, ZPR16, ZPR16>;
2121   def _S : sve_int_cmp<0b0, 0b10, opc, asm, PPR32, ZPR32, ZPR32>;
2122   def _D : sve_int_cmp<0b0, 0b11, opc, asm, PPR64, ZPR64, ZPR64>;
2123 }
2124
2125 multiclass sve_int_cmp_0_wide<bits<3> opc, string asm> {
2126   def _B : sve_int_cmp<0b0, 0b00, opc, asm, PPR8, ZPR8, ZPR64>;
2127   def _H : sve_int_cmp<0b0, 0b01, opc, asm, PPR16, ZPR16, ZPR64>;
2128   def _S : sve_int_cmp<0b0, 0b10, opc, asm, PPR32, ZPR32, ZPR64>;
2129 }
2130
2131 multiclass sve_int_cmp_1_wide<bits<3> opc, string asm> {
2132   def _B : sve_int_cmp<0b1, 0b00, opc, asm, PPR8, ZPR8, ZPR64>;
2133   def _H : sve_int_cmp<0b1, 0b01, opc, asm, PPR16, ZPR16, ZPR64>;
2134   def _S : sve_int_cmp<0b1, 0b10, opc, asm, PPR32, ZPR32, ZPR64>;
2135 }
2136
2137
2138 //===----------------------------------------------------------------------===//
2139 // SVE Integer Compare - Signed Immediate Group
2140 //===----------------------------------------------------------------------===//
2141
2142 class sve_int_scmp_vi<bits<2> sz8_64, bits<3> opc, string asm, PPRRegOp pprty,
2143                       ZPRRegOp zprty,
2144                       Operand immtype>
2145 : I<(outs pprty:$Pd), (ins PPR3bAny:$Pg, zprty:$Zn, immtype:$imm5),
2146   asm, "\t$Pd, $Pg/z, $Zn, $imm5",
2147   "",
2148   []>, Sched<[]> {
2149   bits<4> Pd;
2150   bits<3> Pg;
2151   bits<5> Zn;
2152   bits<5> imm5;
2153   let Inst{31-24} = 0b00100101;
2154   let Inst{23-22} = sz8_64;
2155   let Inst{21}    = 0b0;
2156   let Inst{20-16} = imm5;
2157   let Inst{15}    = opc{2};
2158   let Inst{14}    = 0b0;
2159   let Inst{13}    = opc{1};
2160   let Inst{12-10} = Pg;
2161   let Inst{9-5}   = Zn;
2162   let Inst{4}     = opc{0};
2163   let Inst{3-0}   = Pd;
2164
2165   let Defs = [NZCV];
2166 }
2167
2168 multiclass sve_int_scmp_vi<bits<3> opc, string asm> {
2169   def _B : sve_int_scmp_vi<0b00, opc, asm, PPR8, ZPR8, simm5_32b>;
2170   def _H : sve_int_scmp_vi<0b01, opc, asm, PPR16, ZPR16, simm5_32b>;
2171   def _S : sve_int_scmp_vi<0b10, opc, asm, PPR32, ZPR32, simm5_32b>;
2172   def _D : sve_int_scmp_vi<0b11, opc, asm, PPR64, ZPR64, simm5_64b>;
2173 }
2174
2175
2176 //===----------------------------------------------------------------------===//
2177 // SVE Integer Compare - Unsigned Immediate Group
2178 //===----------------------------------------------------------------------===//
2179
2180 class sve_int_ucmp_vi<bits<2> sz8_64, bits<2> opc, string asm, PPRRegOp pprty,
2181                       ZPRRegOp zprty, Operand immtype>
2182 : I<(outs pprty:$Pd), (ins PPR3bAny:$Pg, zprty:$Zn, immtype:$imm7),
2183   asm, "\t$Pd, $Pg/z, $Zn, $imm7",
2184   "",
2185   []>, Sched<[]> {
2186   bits<4> Pd;
2187   bits<3> Pg;
2188   bits<5> Zn;
2189   bits<7> imm7;
2190   let Inst{31-24} = 0b00100100;
2191   let Inst{23-22} = sz8_64;
2192   let Inst{21}    = 1;
2193   let Inst{20-14} = imm7;
2194   let Inst{13}    = opc{1};
2195   let Inst{12-10} = Pg;
2196   let Inst{9-5}   = Zn;
2197   let Inst{4}     = opc{0};
2198   let Inst{3-0}   = Pd;
2199
2200   let Defs = [NZCV];
2201 }
2202
2203 multiclass sve_int_ucmp_vi<bits<2> opc, string asm> {
2204   def _B : sve_int_ucmp_vi<0b00, opc, asm, PPR8, ZPR8, imm0_127>;
2205   def _H : sve_int_ucmp_vi<0b01, opc, asm, PPR16, ZPR16, imm0_127>;
2206   def _S : sve_int_ucmp_vi<0b10, opc, asm, PPR32, ZPR32, imm0_127>;
2207   def _D : sve_int_ucmp_vi<0b11, opc, asm, PPR64, ZPR64, imm0_127>;
2208 }
2209
2210
2211 //===----------------------------------------------------------------------===//
2212 // SVE Integer Compare - Scalars Group
2213 //===----------------------------------------------------------------------===//
2214
2215 class sve_int_cterm<bit sz, bit opc, string asm, RegisterClass rt>
2216 : I<(outs), (ins rt:$Rn, rt:$Rm),
2217   asm, "\t$Rn, $Rm",
2218   "",
2219   []>, Sched<[]> {
2220   bits<5> Rm;
2221   bits<5> Rn;
2222   let Inst{31-23} = 0b001001011;
2223   let Inst{22}    = sz;
2224   let Inst{21}    = 0b1;
2225   let Inst{20-16} = Rm;
2226   let Inst{15-10} = 0b001000;
2227   let Inst{9-5}   = Rn;
2228   let Inst{4}     = opc;
2229   let Inst{3-0}   = 0b0000;
2230
2231   let Defs = [NZCV];
2232 }
2233
2234 class sve_int_while_rr<bits<2> sz8_64, bits<4> opc, string asm,
2235                        RegisterClass gprty, PPRRegOp pprty>
2236 : I<(outs pprty:$Pd), (ins gprty:$Rn, gprty:$Rm),
2237   asm, "\t$Pd, $Rn, $Rm",
2238   "", []>, Sched<[]> {
2239   bits<4> Pd;
2240   bits<5> Rm;
2241   bits<5> Rn;
2242   let Inst{31-24} = 0b00100101;
2243   let Inst{23-22} = sz8_64;
2244   let Inst{21}    = 0b1;
2245   let Inst{20-16} = Rm;
2246   let Inst{15-13} = 0b000;
2247   let Inst{12-10} = opc{3-1};
2248   let Inst{9-5}   = Rn;
2249   let Inst{4}     = opc{0};
2250   let Inst{3-0}   = Pd;
2251
2252   let Defs = [NZCV];
2253 }
2254
2255 multiclass sve_int_while4_rr<bits<3> opc, string asm> {
2256   def _B : sve_int_while_rr<0b00, { 0, opc }, asm, GPR32, PPR8>;
2257   def _H : sve_int_while_rr<0b01, { 0, opc }, asm, GPR32, PPR16>;
2258   def _S : sve_int_while_rr<0b10, { 0, opc }, asm, GPR32, PPR32>;
2259   def _D : sve_int_while_rr<0b11, { 0, opc }, asm, GPR32, PPR64>;
2260 }
2261
2262 multiclass sve_int_while8_rr<bits<3> opc, string asm> {
2263   def _B : sve_int_while_rr<0b00, { 1, opc }, asm, GPR64, PPR8>;
2264   def _H : sve_int_while_rr<0b01, { 1, opc }, asm, GPR64, PPR16>;
2265   def _S : sve_int_while_rr<0b10, { 1, opc }, asm, GPR64, PPR32>;
2266   def _D : sve_int_while_rr<0b11, { 1, opc }, asm, GPR64, PPR64>;
2267 }
2268
2269
2270 //===----------------------------------------------------------------------===//
2271 // SVE Floating Point Fast Reduction Group
2272 //===----------------------------------------------------------------------===//
2273
2274 class sve_fp_fast_red<bits<2> sz, bits<3> opc, string asm,
2275                       ZPRRegOp zprty, RegisterClass dstRegClass>
2276 : I<(outs dstRegClass:$Vd), (ins PPR3bAny:$Pg, zprty:$Zn),
2277   asm, "\t$Vd, $Pg, $Zn",
2278   "",
2279   []>, Sched<[]> {
2280   bits<5> Zn;
2281   bits<5> Vd;
2282   bits<3> Pg;
2283   let Inst{31-24} = 0b01100101;
2284   let Inst{23-22} = sz;
2285   let Inst{21-19} = 0b000;
2286   let Inst{18-16} = opc;
2287   let Inst{15-13} = 0b001;
2288   let Inst{12-10} = Pg;
2289   let Inst{9-5}   = Zn;
2290   let Inst{4-0}   = Vd;
2291 }
2292
2293 multiclass sve_fp_fast_red<bits<3> opc, string asm> {
2294   def _H : sve_fp_fast_red<0b01, opc, asm, ZPR16, FPR16>;
2295   def _S : sve_fp_fast_red<0b10, opc, asm, ZPR32, FPR32>;
2296   def _D : sve_fp_fast_red<0b11, opc, asm, ZPR64, FPR64>;
2297 }
2298
2299
2300 //===----------------------------------------------------------------------===//
2301 // SVE Floating Point Accumulating Reduction Group
2302 //===----------------------------------------------------------------------===//
2303
2304 class sve_fp_2op_p_vd<bits<2> sz, bits<3> opc, string asm,
2305                       ZPRRegOp zprty, RegisterClass dstRegClass>
2306 : I<(outs dstRegClass:$Vdn), (ins PPR3bAny:$Pg, dstRegClass:$_Vdn, zprty:$Zm),
2307   asm, "\t$Vdn, $Pg, $_Vdn, $Zm",
2308   "",
2309   []>,
2310   Sched<[]> {
2311   bits<3> Pg;
2312   bits<5> Vdn;
2313   bits<5> Zm;
2314   let Inst{31-24} = 0b01100101;
2315   let Inst{23-22} = sz;
2316   let Inst{21-19} = 0b011;
2317   let Inst{18-16} = opc;
2318   let Inst{15-13} = 0b001;
2319   let Inst{12-10} = Pg;
2320   let Inst{9-5}   = Zm;
2321   let Inst{4-0}   = Vdn;
2322
2323   let Constraints = "$Vdn = $_Vdn";
2324 }
2325
2326 multiclass sve_fp_2op_p_vd<bits<3> opc, string asm> {
2327   def _H : sve_fp_2op_p_vd<0b01, opc, asm, ZPR16, FPR16>;
2328   def _S : sve_fp_2op_p_vd<0b10, opc, asm, ZPR32, FPR32>;
2329   def _D : sve_fp_2op_p_vd<0b11, opc, asm, ZPR64, FPR64>;
2330 }
2331
2332 //===----------------------------------------------------------------------===//
2333 // SVE Floating Point Compare - Vectors Group
2334 //===----------------------------------------------------------------------===//
2335
2336 class sve_fp_3op_p_pd<bits<2> sz, bits<3> opc, string asm, PPRRegOp pprty,
2337                       ZPRRegOp zprty>
2338 : I<(outs pprty:$Pd), (ins PPR3bAny:$Pg, zprty:$Zn, zprty:$Zm),
2339   asm, "\t$Pd, $Pg/z, $Zn, $Zm",
2340   "",
2341   []>, Sched<[]> {
2342   bits<4> Pd;
2343   bits<3> Pg;
2344   bits<5> Zm;
2345   bits<5> Zn;
2346   let Inst{31-24} = 0b01100101;
2347   let Inst{23-22} = sz;
2348   let Inst{21}    = 0b0;
2349   let Inst{20-16} = Zm;
2350   let Inst{15}    = opc{2};
2351   let Inst{14}    = 0b1;
2352   let Inst{13}    = opc{1};
2353   let Inst{12-10} = Pg;
2354   let Inst{9-5}   = Zn;
2355   let Inst{4}     = opc{0};
2356   let Inst{3-0}   = Pd;
2357 }
2358
2359 multiclass sve_fp_3op_p_pd<bits<3> opc, string asm> {
2360   def _H : sve_fp_3op_p_pd<0b01, opc, asm, PPR16, ZPR16>;
2361   def _S : sve_fp_3op_p_pd<0b10, opc, asm, PPR32, ZPR32>;
2362   def _D : sve_fp_3op_p_pd<0b11, opc, asm, PPR64, ZPR64>;
2363 }
2364
2365
2366 //===----------------------------------------------------------------------===//
2367 // SVE Floating Point Compare - with Zero Group
2368 //===----------------------------------------------------------------------===//
2369
2370 class sve_fp_2op_p_pd<bits<2> sz, bits<3> opc, string asm, PPRRegOp pprty,
2371                       ZPRRegOp zprty>
2372 : I<(outs pprty:$Pd), (ins PPR3bAny:$Pg, zprty:$Zn),
2373   asm, "\t$Pd, $Pg/z, $Zn, #0.0",
2374   "",
2375   []>, Sched<[]> {
2376   bits<4> Pd;
2377   bits<3> Pg;
2378   bits<5> Zn;
2379   let Inst{31-24} = 0b01100101;
2380   let Inst{23-22} = sz;
2381   let Inst{21-18} = 0b0100;
2382   let Inst{17-16} = opc{2-1};
2383   let Inst{15-13} = 0b001;
2384   let Inst{12-10} = Pg;
2385   let Inst{9-5}   = Zn;
2386   let Inst{4}     = opc{0};
2387   let Inst{3-0}   = Pd;
2388 }
2389
2390 multiclass sve_fp_2op_p_pd<bits<3> opc, string asm> {
2391   def _H : sve_fp_2op_p_pd<0b01, opc, asm, PPR16, ZPR16>;
2392   def _S : sve_fp_2op_p_pd<0b10, opc, asm, PPR32, ZPR32>;
2393   def _D : sve_fp_2op_p_pd<0b11, opc, asm, PPR64, ZPR64>;
2394 }
2395
2396
2397 //===----------------------------------------------------------------------===//
2398 //SVE Index Generation Group
2399 //===----------------------------------------------------------------------===//
2400
2401 class sve_int_index_ii<bits<2> sz8_64, string asm, ZPRRegOp zprty,
2402                        Operand imm_ty>
2403 : I<(outs zprty:$Zd), (ins imm_ty:$imm5, imm_ty:$imm5b),
2404   asm, "\t$Zd, $imm5, $imm5b",
2405   "", []>, Sched<[]> {
2406   bits<5> Zd;
2407   bits<5> imm5;
2408   bits<5> imm5b;
2409   let Inst{31-24} = 0b00000100;
2410   let Inst{23-22} = sz8_64;
2411   let Inst{21}    = 0b1;
2412   let Inst{20-16} = imm5b;
2413   let Inst{15-10} = 0b010000;
2414   let Inst{9-5}   = imm5;
2415   let Inst{4-0}   = Zd;
2416 }
2417
2418 multiclass sve_int_index_ii<string asm> {
2419   def _B : sve_int_index_ii<0b00, asm, ZPR8, simm5_32b>;
2420   def _H : sve_int_index_ii<0b01, asm, ZPR16, simm5_32b>;
2421   def _S : sve_int_index_ii<0b10, asm, ZPR32, simm5_32b>;
2422   def _D : sve_int_index_ii<0b11, asm, ZPR64, simm5_64b>;
2423 }
2424
2425 class sve_int_index_ir<bits<2> sz8_64, string asm, ZPRRegOp zprty,
2426                        RegisterClass srcRegType, Operand imm_ty>
2427 : I<(outs zprty:$Zd), (ins imm_ty:$imm5, srcRegType:$Rm),
2428   asm, "\t$Zd, $imm5, $Rm",
2429   "", []>, Sched<[]> {
2430   bits<5> Rm;
2431   bits<5> Zd;
2432   bits<5> imm5;
2433   let Inst{31-24} = 0b00000100;
2434   let Inst{23-22} = sz8_64;
2435   let Inst{21}    = 0b1;
2436   let Inst{20-16} = Rm;
2437   let Inst{15-10} = 0b010010;
2438   let Inst{9-5}   = imm5;
2439   let Inst{4-0}   = Zd;
2440 }
2441
2442 multiclass sve_int_index_ir<string asm> {
2443   def _B : sve_int_index_ir<0b00, asm, ZPR8, GPR32, simm5_32b>;
2444   def _H : sve_int_index_ir<0b01, asm, ZPR16, GPR32, simm5_32b>;
2445   def _S : sve_int_index_ir<0b10, asm, ZPR32, GPR32, simm5_32b>;
2446   def _D : sve_int_index_ir<0b11, asm, ZPR64, GPR64, simm5_64b>;
2447 }
2448
2449 class sve_int_index_ri<bits<2> sz8_64, string asm, ZPRRegOp zprty,
2450                        RegisterClass srcRegType, Operand imm_ty>
2451 : I<(outs zprty:$Zd), (ins srcRegType:$Rn, imm_ty:$imm5),
2452   asm, "\t$Zd, $Rn, $imm5",
2453   "", []>, Sched<[]> {
2454   bits<5> Rn;
2455   bits<5> Zd;
2456   bits<5> imm5;
2457   let Inst{31-24} = 0b00000100;
2458   let Inst{23-22} = sz8_64;
2459   let Inst{21}    = 0b1;
2460   let Inst{20-16} = imm5;
2461   let Inst{15-10} = 0b010001;
2462   let Inst{9-5}   = Rn;
2463   let Inst{4-0}   = Zd;
2464 }
2465
2466 multiclass sve_int_index_ri<string asm> {
2467   def _B : sve_int_index_ri<0b00, asm, ZPR8, GPR32, simm5_32b>;
2468   def _H : sve_int_index_ri<0b01, asm, ZPR16, GPR32, simm5_32b>;
2469   def _S : sve_int_index_ri<0b10, asm, ZPR32, GPR32, simm5_32b>;
2470   def _D : sve_int_index_ri<0b11, asm, ZPR64, GPR64, simm5_64b>;
2471 }
2472
2473 class sve_int_index_rr<bits<2> sz8_64, string asm, ZPRRegOp zprty,
2474                        RegisterClass srcRegType>
2475 : I<(outs zprty:$Zd), (ins srcRegType:$Rn, srcRegType:$Rm),
2476   asm, "\t$Zd, $Rn, $Rm",
2477   "", []>, Sched<[]> {
2478   bits<5> Zd;
2479   bits<5> Rm;
2480   bits<5> Rn;
2481   let Inst{31-24} = 0b00000100;
2482   let Inst{23-22} = sz8_64;
2483   let Inst{21}    = 0b1;
2484   let Inst{20-16} = Rm;
2485   let Inst{15-10} = 0b010011;
2486   let Inst{9-5}   = Rn;
2487   let Inst{4-0}   = Zd;
2488 }
2489
2490 multiclass sve_int_index_rr<string asm> {
2491   def _B : sve_int_index_rr<0b00, asm, ZPR8, GPR32>;
2492   def _H : sve_int_index_rr<0b01, asm, ZPR16, GPR32>;
2493   def _S : sve_int_index_rr<0b10, asm, ZPR32, GPR32>;
2494   def _D : sve_int_index_rr<0b11, asm, ZPR64, GPR64>;
2495 }
2496 //
2497 //===----------------------------------------------------------------------===//
2498 // SVE Bitwise Shift - Predicated Group
2499 //===----------------------------------------------------------------------===//
2500 class sve_int_bin_pred_shift_imm<bits<4> tsz8_64, bits<3> opc, string asm,
2501                                ZPRRegOp zprty, Operand immtype,
2502                                ElementSizeEnum size>
2503 : I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, immtype:$imm),
2504   asm, "\t$Zdn, $Pg/m, $_Zdn, $imm",
2505   "",
2506   []>, Sched<[]> {
2507   bits<3> Pg;
2508   bits<5> Zdn;
2509   bits<6> imm;
2510   let Inst{31-24} = 0b00000100;
2511   let Inst{23-22} = tsz8_64{3-2};
2512   let Inst{21-19} = 0b000;
2513   let Inst{18-16} = opc;
2514   let Inst{15-13} = 0b100;
2515   let Inst{12-10} = Pg;
2516   let Inst{9-8}   = tsz8_64{1-0};
2517   let Inst{7-5}   = imm{2-0}; // imm3
2518   let Inst{4-0}   = Zdn;
2519
2520   let Constraints = "$Zdn = $_Zdn";
2521   let DestructiveInstType = Destructive;
2522   let ElementSize = size;
2523 }
2524
2525 multiclass sve_int_bin_pred_shift_imm_left<bits<3> opc, string asm> {
2526   def _B : sve_int_bin_pred_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftL8,
2527                                       ElementSizeB>;
2528   def _H : sve_int_bin_pred_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftL16,
2529                                       ElementSizeH> {
2530     let Inst{8} = imm{3};
2531   }
2532   def _S : sve_int_bin_pred_shift_imm<{0,1,?,?}, opc, asm, ZPR32, vecshiftL32,
2533                                       ElementSizeS> {
2534     let Inst{9-8} = imm{4-3};
2535   }
2536   def _D : sve_int_bin_pred_shift_imm<{1,?,?,?}, opc, asm, ZPR64, vecshiftL64,
2537                                       ElementSizeD> {
2538     let Inst{22}  = imm{5};
2539     let Inst{9-8} = imm{4-3};
2540   }
2541 }
2542
2543 multiclass sve_int_bin_pred_shift_imm_right<bits<3> opc, string asm> {
2544   def _B : sve_int_bin_pred_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftR8,
2545                                       ElementSizeB>;
2546   def _H : sve_int_bin_pred_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftR16,
2547                                       ElementSizeH> {
2548     let Inst{8} = imm{3};
2549   }
2550   def _S : sve_int_bin_pred_shift_imm<{0,1,?,?}, opc, asm, ZPR32, vecshiftR32,
2551                                       ElementSizeS> {
2552     let Inst{9-8} = imm{4-3};
2553   }
2554   def _D : sve_int_bin_pred_shift_imm<{1,?,?,?}, opc, asm, ZPR64, vecshiftR64,
2555                                       ElementSizeD> {
2556     let Inst{22}  = imm{5};
2557     let Inst{9-8} = imm{4-3};
2558   }
2559 }
2560
2561 class sve_int_bin_pred_shift<bits<2> sz8_64, bit wide, bits<3> opc,
2562                              string asm, ZPRRegOp zprty, ZPRRegOp zprty2>
2563 : I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, zprty2:$Zm),
2564   asm, "\t$Zdn, $Pg/m, $_Zdn, $Zm",
2565   "",
2566   []>, Sched<[]> {
2567   bits<3> Pg;
2568   bits<5> Zdn;
2569   bits<5> Zm;
2570   let Inst{31-24} = 0b00000100;
2571   let Inst{23-22} = sz8_64;
2572   let Inst{21-20} = 0b01;
2573   let Inst{19}    = wide;
2574   let Inst{18-16} = opc;
2575   let Inst{15-13} = 0b100;
2576   let Inst{12-10} = Pg;
2577   let Inst{9-5}   = Zm;
2578   let Inst{4-0}   = Zdn;
2579
2580   let Constraints = "$Zdn = $_Zdn";
2581   let DestructiveInstType = Destructive;
2582   let ElementSize = zprty.ElementSize;
2583 }
2584
2585 multiclass sve_int_bin_pred_shift<bits<3> opc, string asm> {
2586   def _B : sve_int_bin_pred_shift<0b00, 0b0, opc, asm, ZPR8, ZPR8>;
2587   def _H : sve_int_bin_pred_shift<0b01, 0b0, opc, asm, ZPR16, ZPR16>;
2588   def _S : sve_int_bin_pred_shift<0b10, 0b0, opc, asm, ZPR32, ZPR32>;
2589   def _D : sve_int_bin_pred_shift<0b11, 0b0, opc, asm, ZPR64, ZPR64>;
2590 }
2591
2592 multiclass sve_int_bin_pred_shift_wide<bits<3> opc, string asm> {
2593   def _B : sve_int_bin_pred_shift<0b00, 0b1, opc, asm, ZPR8, ZPR64>;
2594   def _H : sve_int_bin_pred_shift<0b01, 0b1, opc, asm, ZPR16, ZPR64>;
2595   def _S : sve_int_bin_pred_shift<0b10, 0b1, opc, asm, ZPR32, ZPR64>;
2596 }
2597
2598 //===----------------------------------------------------------------------===//
2599 // SVE Shift - Unpredicated Group
2600 //===----------------------------------------------------------------------===//
2601
2602 class sve_int_bin_cons_shift_wide<bits<2> sz8_64, bits<2> opc, string asm,
2603                                ZPRRegOp zprty>
2604 : I<(outs zprty:$Zd), (ins zprty:$Zn, ZPR64:$Zm),
2605   asm, "\t$Zd, $Zn, $Zm",
2606   "",
2607   []>, Sched<[]> {
2608   bits<5> Zd;
2609   bits<5> Zm;
2610   bits<5> Zn;
2611   let Inst{31-24} = 0b00000100;
2612   let Inst{23-22} = sz8_64;
2613   let Inst{21}    = 0b1;
2614   let Inst{20-16} = Zm;
2615   let Inst{15-12} = 0b1000;
2616   let Inst{11-10} = opc;
2617   let Inst{9-5}   = Zn;
2618   let Inst{4-0}   = Zd;
2619 }
2620
2621 multiclass sve_int_bin_cons_shift_wide<bits<2> opc, string asm> {
2622   def _B : sve_int_bin_cons_shift_wide<0b00, opc, asm, ZPR8>;
2623   def _H : sve_int_bin_cons_shift_wide<0b01, opc, asm, ZPR16>;
2624   def _S : sve_int_bin_cons_shift_wide<0b10, opc, asm, ZPR32>;
2625 }
2626
2627 class sve_int_bin_cons_shift_imm<bits<4> tsz8_64, bits<2> opc, string asm,
2628                                ZPRRegOp zprty, Operand immtype>
2629 : I<(outs zprty:$Zd), (ins zprty:$Zn, immtype:$imm),
2630   asm, "\t$Zd, $Zn, $imm",
2631   "", []>, Sched<[]> {
2632   bits<5> Zd;
2633   bits<5> Zn;
2634   bits<6> imm;
2635   let Inst{31-24} = 0b00000100;
2636   let Inst{23-22} = tsz8_64{3-2};
2637   let Inst{21}    = 0b1;
2638   let Inst{20-19} = tsz8_64{1-0};
2639   let Inst{18-16} = imm{2-0}; // imm3
2640   let Inst{15-12} = 0b1001;
2641   let Inst{11-10} = opc;
2642   let Inst{9-5}   = Zn;
2643   let Inst{4-0}   = Zd;
2644 }
2645
2646 multiclass sve_int_bin_cons_shift_imm_left<bits<2> opc, string asm> {
2647   def _B : sve_int_bin_cons_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftL8>;
2648   def _H : sve_int_bin_cons_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftL16> {
2649     let Inst{19} = imm{3};
2650   }
2651   def _S : sve_int_bin_cons_shift_imm<{0,1,?,?}, opc, asm, ZPR32, vecshiftL32> {
2652     let Inst{20-19} = imm{4-3};
2653   }
2654   def _D : sve_int_bin_cons_shift_imm<{1,?,?,?}, opc, asm, ZPR64, vecshiftL64> {
2655     let Inst{22}    = imm{5};
2656     let Inst{20-19} = imm{4-3};
2657   }
2658 }
2659
2660 multiclass sve_int_bin_cons_shift_imm_right<bits<2> opc, string asm> {
2661   def _B : sve_int_bin_cons_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftR8>;
2662   def _H : sve_int_bin_cons_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftR16> {
2663     let Inst{19} = imm{3};
2664   }
2665   def _S : sve_int_bin_cons_shift_imm<{0,1,?,?}, opc, asm, ZPR32, vecshiftR32> {
2666     let Inst{20-19} = imm{4-3};
2667   }
2668   def _D : sve_int_bin_cons_shift_imm<{1,?,?,?}, opc, asm, ZPR64, vecshiftR64> {
2669     let Inst{22}    = imm{5};
2670     let Inst{20-19} = imm{4-3};
2671   }
2672 }
2673 //===----------------------------------------------------------------------===//
2674 // SVE Memory - Store Group
2675 //===----------------------------------------------------------------------===//
2676
2677 class sve_mem_cst_si<bits<2> msz, bits<2> esz, string asm,
2678                      RegisterOperand VecList>
2679 : I<(outs), (ins VecList:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, simm4s1:$imm4),
2680   asm, "\t$Zt, $Pg, [$Rn, $imm4, mul vl]",
2681   "",
2682   []>, Sched<[]> {
2683   bits<3> Pg;
2684   bits<5> Rn;
2685   bits<5> Zt;
2686   bits<4> imm4;
2687   let Inst{31-25} = 0b1110010;
2688   let Inst{24-23} = msz;
2689   let Inst{22-21} = esz;
2690   let Inst{20}    = 0;
2691   let Inst{19-16} = imm4;
2692   let Inst{15-13} = 0b111;
2693   let Inst{12-10} = Pg;
2694   let Inst{9-5}   = Rn;
2695   let Inst{4-0}   = Zt;
2696
2697   let mayStore = 1;
2698 }
2699
2700 multiclass sve_mem_cst_si<bits<2> msz, bits<2> esz, string asm,
2701                           RegisterOperand listty, ZPRRegOp zprty>
2702 {
2703   def NAME : sve_mem_cst_si<msz, esz, asm, listty>;
2704
2705   def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $imm4, mul vl]",
2706                  (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, simm4s1:$imm4), 0>;
2707   def : InstAlias<asm # "\t$Zt, $Pg, [$Rn]",
2708                   (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 0>;
2709   def : InstAlias<asm # "\t$Zt, $Pg, [$Rn]",
2710                   (!cast<Instruction>(NAME) listty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
2711 }
2712
2713 class sve_mem_est_si<bits<2> sz, bits<2> nregs, RegisterOperand VecList,
2714                      string asm, Operand immtype>
2715 : I<(outs), (ins VecList:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, immtype:$imm4),
2716   asm, "\t$Zt, $Pg, [$Rn, $imm4, mul vl]",
2717   "",
2718   []>, Sched<[]> {
2719   bits<3> Pg;
2720   bits<5> Rn;
2721   bits<5> Zt;
2722   bits<4> imm4;
2723   let Inst{31-25} = 0b1110010;
2724   let Inst{24-23} = sz;
2725   let Inst{22-21} = nregs;
2726   let Inst{20}    = 1;
2727   let Inst{19-16} = imm4;
2728   let Inst{15-13} = 0b111;
2729   let Inst{12-10} = Pg;
2730   let Inst{9-5}   = Rn;
2731   let Inst{4-0}   = Zt;
2732
2733   let mayStore = 1;
2734 }
2735
2736 multiclass sve_mem_est_si<bits<2> sz, bits<2> nregs, RegisterOperand VecList,
2737                           string asm, Operand immtype> {
2738   def NAME : sve_mem_est_si<sz, nregs, VecList, asm, immtype>;
2739
2740   def : InstAlias<asm # "\t$Zt, $Pg, [$Rn]",
2741                   (!cast<Instruction>(NAME) VecList:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
2742 }
2743
2744 class sve_mem_est_ss<bits<2> sz, bits<2> nregs, RegisterOperand VecList,
2745                      string asm, RegisterOperand gprty>
2746 : I<(outs), (ins VecList:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
2747   asm, "\t$Zt, $Pg, [$Rn, $Rm]",
2748   "",
2749   []>, Sched<[]> {
2750   bits<3> Pg;
2751   bits<5> Rm;
2752   bits<5> Rn;
2753   bits<5> Zt;
2754   let Inst{31-25} = 0b1110010;
2755   let Inst{24-23} = sz;
2756   let Inst{22-21} = nregs;
2757   let Inst{20-16} = Rm;
2758   let Inst{15-13} = 0b011;
2759   let Inst{12-10} = Pg;
2760   let Inst{9-5}   = Rn;
2761   let Inst{4-0}   = Zt;
2762
2763   let mayStore = 1;
2764 }
2765
2766 class sve_mem_cst_ss_base<bits<4> dtype, string asm,
2767                           RegisterOperand listty, RegisterOperand gprty>
2768 : I<(outs), (ins listty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
2769   asm, "\t$Zt, $Pg, [$Rn, $Rm]",
2770   "",
2771   []>, Sched<[]> {
2772   bits<3> Pg;
2773   bits<5> Rm;
2774   bits<5> Rn;
2775   bits<5> Zt;
2776   let Inst{31-25} = 0b1110010;
2777   let Inst{24-21} = dtype;
2778   let Inst{20-16} = Rm;
2779   let Inst{15-13} = 0b010;
2780   let Inst{12-10} = Pg;
2781   let Inst{9-5}   = Rn;
2782   let Inst{4-0}   = Zt;
2783
2784   let mayStore = 1;
2785 }
2786
2787 multiclass sve_mem_cst_ss<bits<4> dtype, string asm,
2788                           RegisterOperand listty, ZPRRegOp zprty,
2789                           RegisterOperand gprty> {
2790   def NAME : sve_mem_cst_ss_base<dtype, asm, listty, gprty>;
2791
2792   def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Rm]",
2793                   (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm), 0>;
2794 }
2795
2796 class sve_mem_cstnt_si<bits<2> msz, string asm, RegisterOperand VecList>
2797 : I<(outs), (ins VecList:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, simm4s1:$imm4),
2798   asm, "\t$Zt, $Pg, [$Rn, $imm4, mul vl]",
2799   "",
2800   []>, Sched<[]> {
2801   bits<3> Pg;
2802   bits<5> Rn;
2803   bits<5> Zt;
2804   bits<4> imm4;
2805   let Inst{31-25} = 0b1110010;
2806   let Inst{24-23} = msz;
2807   let Inst{22-20} = 0b001;
2808   let Inst{19-16} = imm4;
2809   let Inst{15-13} = 0b111;
2810   let Inst{12-10} = Pg;
2811   let Inst{9-5}   = Rn;
2812   let Inst{4-0}   = Zt;
2813
2814   let mayStore = 1;
2815 }
2816
2817 multiclass sve_mem_cstnt_si<bits<2> msz, string asm, RegisterOperand listty,
2818                             ZPRRegOp zprty> {
2819   def NAME : sve_mem_cstnt_si<msz, asm, listty>;
2820
2821   def : InstAlias<asm # "\t$Zt, $Pg, [$Rn]",
2822                   (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 0>;
2823   def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $imm4, mul vl]",
2824                   (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, simm4s1:$imm4), 0>;
2825   def : InstAlias<asm # "\t$Zt, $Pg, [$Rn]",
2826                   (!cast<Instruction>(NAME) listty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
2827 }
2828
2829 class sve_mem_cstnt_ss_base<bits<2> msz, string asm, RegisterOperand listty,
2830                             RegisterOperand gprty>
2831 : I<(outs), (ins listty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
2832   asm, "\t$Zt, $Pg, [$Rn, $Rm]",
2833   "",
2834   []>, Sched<[]> {
2835   bits<3> Pg;
2836   bits<5> Rm;
2837   bits<5> Rn;
2838   bits<5> Zt;
2839   let Inst{31-25} = 0b1110010;
2840   let Inst{24-23} = msz;
2841   let Inst{22-21} = 0b00;
2842   let Inst{20-16} = Rm;
2843   let Inst{15-13} = 0b011;
2844   let Inst{12-10} = Pg;
2845   let Inst{9-5}   = Rn;
2846   let Inst{4-0}   = Zt;
2847
2848   let mayStore = 1;
2849 }
2850
2851 multiclass sve_mem_cstnt_ss<bits<2> msz, string asm, RegisterOperand listty,
2852                             ZPRRegOp zprty, RegisterOperand gprty> {
2853   def NAME : sve_mem_cstnt_ss_base<msz, asm, listty, gprty>;
2854
2855   def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Rm]",
2856                  (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm), 0>;
2857 }
2858
2859 class sve_mem_sst_sv<bits<3> opc, bit xs, bit scaled, string asm,
2860                      RegisterOperand VecList, RegisterOperand zprext>
2861 : I<(outs), (ins VecList:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, zprext:$Zm),
2862   asm, "\t$Zt, $Pg, [$Rn, $Zm]",
2863   "",
2864   []>, Sched<[]> {
2865   bits<3> Pg;
2866   bits<5> Rn;
2867   bits<5> Zm;
2868   bits<5> Zt;
2869   let Inst{31-25} = 0b1110010;
2870   let Inst{24-22} = opc;
2871   let Inst{21}    = scaled;
2872   let Inst{20-16} = Zm;
2873   let Inst{15}    = 0b1;
2874   let Inst{14}    = xs;
2875   let Inst{13}    = 0;
2876   let Inst{12-10} = Pg;
2877   let Inst{9-5}   = Rn;
2878   let Inst{4-0}   = Zt;
2879
2880   let mayStore = 1;
2881 }
2882
2883 multiclass sve_mem_sst_sv_32_scaled<bits<3> opc, string asm,
2884                                     RegisterOperand listty,
2885                                     ZPRRegOp zprty,
2886                                     RegisterOperand sxtw_opnd,
2887                                     RegisterOperand uxtw_opnd > {
2888   def _UXTW_SCALED : sve_mem_sst_sv<opc, 0, 1, asm, listty, uxtw_opnd>;
2889   def _SXTW_SCALED : sve_mem_sst_sv<opc, 1, 1, asm, listty, sxtw_opnd>;
2890
2891   def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Zm]",
2892                  (!cast<Instruction>(NAME # _UXTW_SCALED) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm), 0>;
2893   def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Zm]",
2894                  (!cast<Instruction>(NAME # _SXTW_SCALED) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm), 0>;
2895 }
2896
2897 multiclass sve_mem_sst_sv_32_unscaled<bits<3> opc, string asm,
2898                                       RegisterOperand listty,
2899                                       ZPRRegOp zprty,
2900                                       RegisterOperand sxtw_opnd,
2901                                       RegisterOperand uxtw_opnd> {
2902   def _UXTW : sve_mem_sst_sv<opc, 0, 0, asm, listty, uxtw_opnd>;
2903   def _SXTW : sve_mem_sst_sv<opc, 1, 0, asm, listty, sxtw_opnd>;
2904
2905   def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Zm]",
2906                  (!cast<Instruction>(NAME # _UXTW) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm), 0>;
2907   def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Zm]",
2908                  (!cast<Instruction>(NAME # _SXTW) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm), 0>;
2909 }
2910
2911 class sve_mem_sst_sv2<bits<2> msz, bit scaled, string asm,
2912                       RegisterOperand zprext>
2913 : I<(outs), (ins Z_d:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, zprext:$Zm),
2914   asm, "\t$Zt, $Pg, [$Rn, $Zm]",
2915   "",
2916   []>, Sched<[]> {
2917   bits<3> Pg;
2918   bits<5> Rn;
2919   bits<5> Zm;
2920   bits<5> Zt;
2921   let Inst{31-25} = 0b1110010;
2922   let Inst{24-23} = msz;
2923   let Inst{22}    = 0b0;
2924   let Inst{21}    = scaled;
2925   let Inst{20-16} = Zm;
2926   let Inst{15-13} = 0b101;
2927   let Inst{12-10} = Pg;
2928   let Inst{9-5}   = Rn;
2929   let Inst{4-0}   = Zt;
2930
2931   let mayStore = 1;
2932 }
2933
2934 multiclass sve_mem_sst_sv_64_scaled<bits<2> msz, string asm,
2935                                     RegisterOperand zprext> {
2936   def "" : sve_mem_sst_sv2<msz, 1, asm, zprext>;
2937
2938   def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Zm]",
2939                  (!cast<Instruction>(NAME) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, zprext:$Zm), 0>;
2940
2941 }
2942
2943 multiclass sve_mem_sst_sv_64_unscaled<bits<2> msz, string asm> {
2944   def "" : sve_mem_sst_sv2<msz, 0, asm, ZPR64ExtLSL8>;
2945
2946   def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Zm]",
2947                  (!cast<Instruction>(NAME) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, ZPR64ExtLSL8:$Zm), 0>;
2948 }
2949
2950 class sve_mem_sst_vi<bits<3> opc, string asm, ZPRRegOp zprty,
2951                      RegisterOperand VecList, Operand imm_ty>
2952 : I<(outs), (ins VecList:$Zt, PPR3bAny:$Pg, zprty:$Zn, imm_ty:$imm5),
2953   asm, "\t$Zt, $Pg, [$Zn, $imm5]",
2954   "",
2955   []>, Sched<[]> {
2956   bits<3> Pg;
2957   bits<5> imm5;
2958   bits<5> Zn;
2959   bits<5> Zt;
2960   let Inst{31-25} = 0b1110010;
2961   let Inst{24-23} = opc{2-1};
2962   let Inst{22}    = 0b1;
2963   let Inst{21}    = opc{0};
2964   let Inst{20-16} = imm5;
2965   let Inst{15-13} = 0b101;
2966   let Inst{12-10} = Pg;
2967   let Inst{9-5}   = Zn;
2968   let Inst{4-0}   = Zt;
2969
2970   let mayStore = 1;
2971 }
2972
2973 multiclass sve_mem_sst_vi_ptrs<bits<3> opc, string asm, RegisterOperand listty,
2974                                ZPRRegOp zprty, Operand imm_ty> {
2975   def _IMM : sve_mem_sst_vi<opc, asm, zprty, listty, imm_ty>;
2976
2977   def : InstAlias<asm # "\t$Zt, $Pg, [$Zn]",
2978                   (!cast<Instruction>(NAME # _IMM) zprty:$Zt, PPR3bAny:$Pg, zprty:$Zn, 0), 0>;
2979   def : InstAlias<asm # "\t$Zt, $Pg, [$Zn, $imm5]",
2980                   (!cast<Instruction>(NAME # _IMM) zprty:$Zt, PPR3bAny:$Pg, zprty:$Zn, imm_ty:$imm5), 0>;
2981   def : InstAlias<asm # "\t$Zt, $Pg, [$Zn]",
2982                   (!cast<Instruction>(NAME # _IMM) listty:$Zt, PPR3bAny:$Pg, zprty:$Zn, 0), 1>;
2983 }
2984
2985 class sve_mem_z_spill<string asm>
2986 : I<(outs), (ins ZPRAny:$Zt, GPR64sp:$Rn, simm9:$imm9),
2987   asm, "\t$Zt, [$Rn, $imm9, mul vl]",
2988   "",
2989   []>, Sched<[]> {
2990   bits<5> Rn;
2991   bits<5> Zt;
2992   bits<9> imm9;
2993   let Inst{31-22} = 0b1110010110;
2994   let Inst{21-16} = imm9{8-3};
2995   let Inst{15-13} = 0b010;
2996   let Inst{12-10} = imm9{2-0};
2997   let Inst{9-5}   = Rn;
2998   let Inst{4-0}   = Zt;
2999
3000   let mayStore = 1;
3001 }
3002
3003 multiclass sve_mem_z_spill<string asm> {
3004   def NAME : sve_mem_z_spill<asm>;
3005
3006   def : InstAlias<asm # "\t$Zt, [$Rn]",
3007                   (!cast<Instruction>(NAME) ZPRAny:$Zt, GPR64sp:$Rn, 0), 1>;
3008 }
3009
3010 class sve_mem_p_spill<string asm>
3011 : I<(outs), (ins PPRAny:$Pt, GPR64sp:$Rn, simm9:$imm9),
3012   asm, "\t$Pt, [$Rn, $imm9, mul vl]",
3013   "",
3014   []>, Sched<[]> {
3015   bits<4> Pt;
3016   bits<5> Rn;
3017   bits<9> imm9;
3018   let Inst{31-22} = 0b1110010110;
3019   let Inst{21-16} = imm9{8-3};
3020   let Inst{15-13} = 0b000;
3021   let Inst{12-10} = imm9{2-0};
3022   let Inst{9-5}   = Rn;
3023   let Inst{4}     = 0b0;
3024   let Inst{3-0}   = Pt;
3025
3026   let mayStore = 1;
3027 }
3028
3029 multiclass sve_mem_p_spill<string asm> {
3030   def NAME : sve_mem_p_spill<asm>;
3031
3032   def : InstAlias<asm # "\t$Pt, [$Rn]",
3033                   (!cast<Instruction>(NAME) PPRAny:$Pt, GPR64sp:$Rn, 0), 1>;
3034 }
3035
3036 //===----------------------------------------------------------------------===//
3037 // SVE Permute - Predicates Group
3038 //===----------------------------------------------------------------------===//
3039
3040 class sve_int_perm_bin_perm_pp<bits<3> opc, bits<2> sz8_64, string asm,
3041                                PPRRegOp pprty>
3042 : I<(outs pprty:$Pd), (ins pprty:$Pn, pprty:$Pm),
3043   asm, "\t$Pd, $Pn, $Pm",
3044   "",
3045   []>, Sched<[]> {
3046   bits<4> Pd;
3047   bits<4> Pm;
3048   bits<4> Pn;
3049   let Inst{31-24} = 0b00000101;
3050   let Inst{23-22} = sz8_64;
3051   let Inst{21-20} = 0b10;
3052   let Inst{19-16} = Pm;
3053   let Inst{15-13} = 0b010;
3054   let Inst{12-10} = opc;
3055   let Inst{9}     = 0b0;
3056   let Inst{8-5}   = Pn;
3057   let Inst{4}     = 0b0;
3058   let Inst{3-0}   = Pd;
3059 }
3060
3061 multiclass sve_int_perm_bin_perm_pp<bits<3> opc, string asm> {
3062   def _B : sve_int_perm_bin_perm_pp<opc, 0b00, asm, PPR8>;
3063   def _H : sve_int_perm_bin_perm_pp<opc, 0b01, asm, PPR16>;
3064   def _S : sve_int_perm_bin_perm_pp<opc, 0b10, asm, PPR32>;
3065   def _D : sve_int_perm_bin_perm_pp<opc, 0b11, asm, PPR64>;
3066 }
3067
3068 class sve_int_perm_punpk<bit opc, string asm>
3069 : I<(outs PPR16:$Pd), (ins PPR8:$Pn),
3070   asm, "\t$Pd, $Pn",
3071   "",
3072   []>, Sched<[]> {
3073   bits<4> Pd;
3074   bits<4> Pn;
3075   let Inst{31-17} = 0b000001010011000;
3076   let Inst{16}    = opc;
3077   let Inst{15-9}  = 0b0100000;
3078   let Inst{8-5}   = Pn;
3079   let Inst{4}     = 0b0;
3080   let Inst{3-0}   = Pd;
3081 }
3082
3083 class sve_int_rdffr_pred<bit s, string asm>
3084 : I<(outs PPR8:$Pd), (ins PPRAny:$Pg),
3085   asm, "\t$Pd, $Pg/z",
3086   "",
3087   []>, Sched<[]> {
3088   bits<4> Pd;
3089   bits<4> Pg;
3090   let Inst{31-23} = 0b001001010;
3091   let Inst{22}    = s;
3092   let Inst{21-9}  = 0b0110001111000;
3093   let Inst{8-5}   = Pg;
3094   let Inst{4}     = 0;
3095   let Inst{3-0}   = Pd;
3096
3097   let Defs = !if(!eq (s, 1), [NZCV], []);
3098   let Uses = [FFR];
3099 }
3100
3101 class sve_int_rdffr_unpred<string asm> : I<
3102   (outs PPR8:$Pd), (ins),
3103   asm, "\t$Pd",
3104   "",
3105   []>, Sched<[]> {
3106   bits<4> Pd;
3107   let Inst{31-4} = 0b0010010100011001111100000000;
3108   let Inst{3-0}   = Pd;
3109
3110   let Uses = [FFR];
3111 }
3112
3113 class sve_int_wrffr<string asm>
3114 : I<(outs), (ins PPR8:$Pn),
3115   asm, "\t$Pn",
3116   "",
3117   []>, Sched<[]> {
3118   bits<4> Pn;
3119   let Inst{31-9} = 0b00100101001010001001000;
3120   let Inst{8-5}  = Pn;
3121   let Inst{4-0}  = 0b00000;
3122
3123   let hasSideEffects = 1;
3124   let Defs = [FFR];
3125 }
3126
3127 class sve_int_setffr<string asm>
3128 : I<(outs), (ins),
3129   asm, "",
3130   "",
3131   []>, Sched<[]> {
3132   let Inst{31-0} = 0b00100101001011001001000000000000;
3133
3134   let hasSideEffects = 1;
3135   let Defs = [FFR];
3136 }
3137
3138 //===----------------------------------------------------------------------===//
3139 // SVE Permute Vector - Predicated Group
3140 //===----------------------------------------------------------------------===//
3141
3142 class sve_int_perm_clast_rz<bits<2> sz8_64, bit ab, string asm,
3143                             ZPRRegOp zprty, RegisterClass rt>
3144 : I<(outs rt:$Rdn), (ins PPR3bAny:$Pg, rt:$_Rdn, zprty:$Zm),
3145   asm, "\t$Rdn, $Pg, $_Rdn, $Zm",
3146   "",
3147   []>, Sched<[]> {
3148   bits<3> Pg;
3149   bits<5> Rdn;
3150   bits<5> Zm;
3151   let Inst{31-24} = 0b00000101;
3152   let Inst{23-22} = sz8_64;
3153   let Inst{21-17} = 0b11000;
3154   let Inst{16}    = ab;
3155   let Inst{15-13} = 0b101;
3156   let Inst{12-10} = Pg;
3157   let Inst{9-5}   = Zm;
3158   let Inst{4-0}   = Rdn;
3159
3160   let Constraints = "$Rdn = $_Rdn";
3161 }
3162
3163 multiclass sve_int_perm_clast_rz<bit ab, string asm> {
3164   def _B : sve_int_perm_clast_rz<0b00, ab, asm, ZPR8, GPR32>;
3165   def _H : sve_int_perm_clast_rz<0b01, ab, asm, ZPR16, GPR32>;
3166   def _S : sve_int_perm_clast_rz<0b10, ab, asm, ZPR32, GPR32>;
3167   def _D : sve_int_perm_clast_rz<0b11, ab, asm, ZPR64, GPR64>;
3168 }
3169
3170 class sve_int_perm_clast_vz<bits<2> sz8_64, bit ab, string asm,
3171                             ZPRRegOp zprty, RegisterClass rt>
3172 : I<(outs rt:$Vdn), (ins PPR3bAny:$Pg, rt:$_Vdn, zprty:$Zm),
3173   asm, "\t$Vdn, $Pg, $_Vdn, $Zm",
3174   "",
3175   []>, Sched<[]> {
3176   bits<3> Pg;
3177   bits<5> Vdn;
3178   bits<5> Zm;
3179   let Inst{31-24} = 0b00000101;
3180   let Inst{23-22} = sz8_64;
3181   let Inst{21-17} = 0b10101;
3182   let Inst{16}    = ab;
3183   let Inst{15-13} = 0b100;
3184   let Inst{12-10} = Pg;
3185   let Inst{9-5}   = Zm;
3186   let Inst{4-0}   = Vdn;
3187
3188   let Constraints = "$Vdn = $_Vdn";
3189 }
3190
3191 multiclass sve_int_perm_clast_vz<bit ab, string asm> {
3192   def _B : sve_int_perm_clast_vz<0b00, ab, asm, ZPR8, FPR8>;
3193   def _H : sve_int_perm_clast_vz<0b01, ab, asm, ZPR16, FPR16>;
3194   def _S : sve_int_perm_clast_vz<0b10, ab, asm, ZPR32, FPR32>;
3195   def _D : sve_int_perm_clast_vz<0b11, ab, asm, ZPR64, FPR64>;
3196 }
3197
3198 class sve_int_perm_clast_zz<bits<2> sz8_64, bit ab, string asm,
3199                             ZPRRegOp zprty>
3200 : I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, zprty:$Zm),
3201   asm, "\t$Zdn, $Pg, $_Zdn, $Zm",
3202   "",
3203   []>, Sched<[]> {
3204   bits<3> Pg;
3205   bits<5> Zdn;
3206   bits<5> Zm;
3207   let Inst{31-24} = 0b00000101;
3208   let Inst{23-22} = sz8_64;
3209   let Inst{21-17} = 0b10100;
3210   let Inst{16}    = ab;
3211   let Inst{15-13} = 0b100;
3212   let Inst{12-10} = Pg;
3213   let Inst{9-5}   = Zm;
3214   let Inst{4-0}   = Zdn;
3215
3216   let Constraints = "$Zdn = $_Zdn";
3217   let DestructiveInstType = Destructive;
3218   let ElementSize = ElementSizeNone;
3219 }
3220
3221 multiclass sve_int_perm_clast_zz<bit ab, string asm> {
3222   def _B : sve_int_perm_clast_zz<0b00, ab, asm, ZPR8>;
3223   def _H : sve_int_perm_clast_zz<0b01, ab, asm, ZPR16>;
3224   def _S : sve_int_perm_clast_zz<0b10, ab, asm, ZPR32>;
3225   def _D : sve_int_perm_clast_zz<0b11, ab, asm, ZPR64>;
3226 }
3227
3228 class sve_int_perm_last_r<bits<2> sz8_64, bit ab, string asm,
3229                           ZPRRegOp zprty, RegisterClass resultRegType>
3230 : I<(outs resultRegType:$Rd), (ins PPR3bAny:$Pg, zprty:$Zn),
3231   asm, "\t$Rd, $Pg, $Zn",
3232   "",
3233   []>, Sched<[]> {
3234   bits<3> Pg;
3235   bits<5> Rd;
3236   bits<5> Zn;
3237   let Inst{31-24} = 0b00000101;
3238   let Inst{23-22} = sz8_64;
3239   let Inst{21-17} = 0b10000;
3240   let Inst{16}    = ab;
3241   let Inst{15-13} = 0b101;
3242   let Inst{12-10} = Pg;
3243   let Inst{9-5}   = Zn;
3244   let Inst{4-0}   = Rd;
3245 }
3246
3247 multiclass sve_int_perm_last_r<bit ab, string asm> {
3248   def _B : sve_int_perm_last_r<0b00, ab, asm, ZPR8, GPR32>;
3249   def _H : sve_int_perm_last_r<0b01, ab, asm, ZPR16, GPR32>;
3250   def _S : sve_int_perm_last_r<0b10, ab, asm, ZPR32, GPR32>;
3251   def _D : sve_int_perm_last_r<0b11, ab, asm, ZPR64, GPR64>;
3252 }
3253
3254 class sve_int_perm_last_v<bits<2> sz8_64, bit ab, string asm,
3255                           ZPRRegOp zprty, RegisterClass dstRegtype>
3256 : I<(outs dstRegtype:$Vd), (ins PPR3bAny:$Pg, zprty:$Zn),
3257   asm, "\t$Vd, $Pg, $Zn",
3258   "",
3259   []>, Sched<[]> {
3260   bits<3> Pg;
3261   bits<5> Vd;
3262   bits<5> Zn;
3263   let Inst{31-24} = 0b00000101;
3264   let Inst{23-22} = sz8_64;
3265   let Inst{21-17} = 0b10001;
3266   let Inst{16}    = ab;
3267   let Inst{15-13} = 0b100;
3268   let Inst{12-10} = Pg;
3269   let Inst{9-5}   = Zn;
3270   let Inst{4-0}   = Vd;
3271 }
3272
3273 multiclass sve_int_perm_last_v<bit ab, string asm> {
3274   def _B : sve_int_perm_last_v<0b00, ab, asm, ZPR8, FPR8>;
3275   def _H : sve_int_perm_last_v<0b01, ab, asm, ZPR16, FPR16>;
3276   def _S : sve_int_perm_last_v<0b10, ab, asm, ZPR32, FPR32>;
3277   def _D : sve_int_perm_last_v<0b11, ab, asm, ZPR64, FPR64>;
3278 }
3279
3280 class sve_int_perm_splice<bits<2> sz8_64, string asm, ZPRRegOp zprty>
3281 : I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, zprty:$Zm),
3282   asm, "\t$Zdn, $Pg, $_Zdn, $Zm",
3283   "",
3284   []>, Sched<[]> {
3285   bits<3> Pg;
3286   bits<5> Zdn;
3287   bits<5> Zm;
3288   let Inst{31-24} = 0b00000101;
3289   let Inst{23-22} = sz8_64;
3290   let Inst{21-13} = 0b101100100;
3291   let Inst{12-10} = Pg;
3292   let Inst{9-5}   = Zm;
3293   let Inst{4-0}   = Zdn;
3294
3295   let Constraints = "$Zdn = $_Zdn";
3296   let DestructiveInstType = Destructive;
3297   let ElementSize = ElementSizeNone;
3298 }
3299
3300 multiclass sve_int_perm_splice<string asm> {
3301   def _B : sve_int_perm_splice<0b00, asm, ZPR8>;
3302   def _H : sve_int_perm_splice<0b01, asm, ZPR16>;
3303   def _S : sve_int_perm_splice<0b10, asm, ZPR32>;
3304   def _D : sve_int_perm_splice<0b11, asm, ZPR64>;
3305 }
3306
3307 class sve_int_perm_rev<bits<2> sz8_64, bits<2> opc, string asm,
3308                        ZPRRegOp zprty>
3309 : I<(outs zprty:$Zd), (ins zprty:$_Zd, PPR3bAny:$Pg, zprty:$Zn),
3310   asm, "\t$Zd, $Pg/m, $Zn",
3311   "",
3312   []>, Sched<[]> {
3313   bits<5> Zd;
3314   bits<3> Pg;
3315   bits<5> Zn;
3316   let Inst{31-24} = 0b00000101;
3317   let Inst{23-22} = sz8_64;
3318   let Inst{21-18} = 0b1001;
3319   let Inst{17-16} = opc;
3320   let Inst{15-13} = 0b100;
3321   let Inst{12-10} = Pg;
3322   let Inst{9-5}   = Zn;
3323   let Inst{4-0}   = Zd;
3324
3325   let Constraints = "$Zd = $_Zd";
3326   let DestructiveInstType = Destructive;
3327   let ElementSize = zprty.ElementSize;
3328 }
3329
3330 multiclass sve_int_perm_rev_rbit<string asm> {
3331   def _B : sve_int_perm_rev<0b00, 0b11, asm, ZPR8>;
3332   def _H : sve_int_perm_rev<0b01, 0b11, asm, ZPR16>;
3333   def _S : sve_int_perm_rev<0b10, 0b11, asm, ZPR32>;
3334   def _D : sve_int_perm_rev<0b11, 0b11, asm, ZPR64>;
3335 }
3336
3337 multiclass sve_int_perm_rev_revb<string asm> {
3338   def _H : sve_int_perm_rev<0b01, 0b00, asm, ZPR16>;
3339   def _S : sve_int_perm_rev<0b10, 0b00, asm, ZPR32>;
3340   def _D : sve_int_perm_rev<0b11, 0b00, asm, ZPR64>;
3341 }
3342
3343 multiclass sve_int_perm_rev_revh<string asm> {
3344   def _S : sve_int_perm_rev<0b10, 0b01, asm, ZPR32>;
3345   def _D : sve_int_perm_rev<0b11, 0b01, asm, ZPR64>;
3346 }
3347
3348 multiclass sve_int_perm_rev_revw<string asm> {
3349   def _D : sve_int_perm_rev<0b11, 0b10, asm, ZPR64>;
3350 }
3351
3352 class sve_int_perm_cpy_r<bits<2> sz8_64, string asm, ZPRRegOp zprty,
3353                          RegisterClass srcRegType>
3354 : I<(outs zprty:$Zd), (ins zprty:$_Zd, PPR3bAny:$Pg, srcRegType:$Rn),
3355   asm, "\t$Zd, $Pg/m, $Rn",
3356   "",
3357   []>, Sched<[]> {
3358   bits<3> Pg;
3359   bits<5> Rn;
3360   bits<5> Zd;
3361   let Inst{31-24} = 0b00000101;
3362   let Inst{23-22} = sz8_64;
3363   let Inst{21-13} = 0b101000101;
3364   let Inst{12-10} = Pg;
3365   let Inst{9-5}   = Rn;
3366   let Inst{4-0}   = Zd;
3367
3368   let Constraints = "$Zd = $_Zd";
3369   let DestructiveInstType = Destructive;
3370   let ElementSize = zprty.ElementSize;
3371 }
3372
3373 multiclass sve_int_perm_cpy_r<string asm> {
3374   def _B : sve_int_perm_cpy_r<0b00, asm, ZPR8, GPR32sp>;
3375   def _H : sve_int_perm_cpy_r<0b01, asm, ZPR16, GPR32sp>;
3376   def _S : sve_int_perm_cpy_r<0b10, asm, ZPR32, GPR32sp>;
3377   def _D : sve_int_perm_cpy_r<0b11, asm, ZPR64, GPR64sp>;
3378
3379   def : InstAlias<"mov $Zd, $Pg/m, $Rn",
3380                   (!cast<Instruction>(NAME # _B) ZPR8:$Zd, PPR3bAny:$Pg, GPR32sp:$Rn), 1>;
3381   def : InstAlias<"mov $Zd, $Pg/m, $Rn",
3382                   (!cast<Instruction>(NAME # _H) ZPR16:$Zd, PPR3bAny:$Pg, GPR32sp:$Rn), 1>;
3383   def : InstAlias<"mov $Zd, $Pg/m, $Rn",
3384                   (!cast<Instruction>(NAME # _S) ZPR32:$Zd, PPR3bAny:$Pg, GPR32sp:$Rn), 1>;
3385   def : InstAlias<"mov $Zd, $Pg/m, $Rn",
3386                   (!cast<Instruction>(NAME # _D) ZPR64:$Zd, PPR3bAny:$Pg, GPR64sp:$Rn), 1>;
3387 }
3388
3389 class sve_int_perm_cpy_v<bits<2> sz8_64, string asm, ZPRRegOp zprty,
3390                          RegisterClass srcRegtype>
3391 : I<(outs zprty:$Zd), (ins zprty:$_Zd, PPR3bAny:$Pg, srcRegtype:$Vn),
3392   asm, "\t$Zd, $Pg/m, $Vn",
3393   "",
3394   []>, Sched<[]> {
3395   bits<3> Pg;
3396   bits<5> Vn;
3397   bits<5> Zd;
3398   let Inst{31-24} = 0b00000101;
3399   let Inst{23-22} = sz8_64;
3400   let Inst{21-13} = 0b100000100;
3401   let Inst{12-10} = Pg;
3402   let Inst{9-5}   = Vn;
3403   let Inst{4-0}   = Zd;
3404
3405   let Constraints = "$Zd = $_Zd";
3406   let DestructiveInstType = Destructive;
3407   let ElementSize = zprty.ElementSize;
3408 }
3409
3410 multiclass sve_int_perm_cpy_v<string asm> {
3411   def _B : sve_int_perm_cpy_v<0b00, asm, ZPR8, FPR8>;
3412   def _H : sve_int_perm_cpy_v<0b01, asm, ZPR16, FPR16>;
3413   def _S : sve_int_perm_cpy_v<0b10, asm, ZPR32, FPR32>;
3414   def _D : sve_int_perm_cpy_v<0b11, asm, ZPR64, FPR64>;
3415
3416   def : InstAlias<"mov $Zd, $Pg/m, $Vn",
3417                   (!cast<Instruction>(NAME # _B) ZPR8:$Zd, PPR3bAny:$Pg, FPR8:$Vn), 1>;
3418   def : InstAlias<"mov $Zd, $Pg/m, $Vn",
3419                   (!cast<Instruction>(NAME # _H) ZPR16:$Zd, PPR3bAny:$Pg, FPR16:$Vn), 1>;
3420   def : InstAlias<"mov $Zd, $Pg/m, $Vn",
3421                   (!cast<Instruction>(NAME # _S) ZPR32:$Zd, PPR3bAny:$Pg, FPR32:$Vn), 1>;
3422   def : InstAlias<"mov $Zd, $Pg/m, $Vn",
3423                   (!cast<Instruction>(NAME # _D) ZPR64:$Zd, PPR3bAny:$Pg, FPR64:$Vn), 1>;
3424 }
3425
3426 class sve_int_perm_compact<bit sz, string asm, ZPRRegOp zprty>
3427 : I<(outs zprty:$Zd), (ins PPR3bAny:$Pg, zprty:$Zn),
3428   asm, "\t$Zd, $Pg, $Zn",
3429   "",
3430   []>, Sched<[]> {
3431   bits<3> Pg;
3432   bits<5> Zd;
3433   bits<5> Zn;
3434   let Inst{31-23} = 0b000001011;
3435   let Inst{22}    = sz;
3436   let Inst{21-13} = 0b100001100;
3437   let Inst{12-10} = Pg;
3438   let Inst{9-5}   = Zn;
3439   let Inst{4-0}   = Zd;
3440 }
3441
3442 multiclass sve_int_perm_compact<string asm> {
3443   def _S : sve_int_perm_compact<0b0, asm, ZPR32>;
3444   def _D : sve_int_perm_compact<0b1, asm, ZPR64>;
3445 }
3446
3447
3448 //===----------------------------------------------------------------------===//
3449 // SVE Memory - Contiguous Load Group
3450 //===----------------------------------------------------------------------===//
3451
3452 class sve_mem_cld_si_base<bits<4> dtype, bit nf, string asm,
3453                           RegisterOperand VecList>
3454 : I<(outs VecList:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, simm4s1:$imm4),
3455   asm, "\t$Zt, $Pg/z, [$Rn, $imm4, mul vl]",
3456   "",
3457   []>, Sched<[]> {
3458   bits<3> Pg;
3459   bits<5> Rn;
3460   bits<5> Zt;
3461   bits<4> imm4;
3462   let Inst{31-25} = 0b1010010;
3463   let Inst{24-21} = dtype;
3464   let Inst{20}    = nf;
3465   let Inst{19-16} = imm4;
3466   let Inst{15-13} = 0b101;
3467   let Inst{12-10} = Pg;
3468   let Inst{9-5}   = Rn;
3469   let Inst{4-0}   = Zt;
3470
3471   let mayLoad = 1;
3472   let Uses = !if(!eq(nf, 1), [FFR], []);
3473   let Defs = !if(!eq(nf, 1), [FFR], []);
3474 }
3475
3476 multiclass sve_mem_cld_si_base<bits<4> dtype, bit nf, string asm,
3477                                RegisterOperand listty, ZPRRegOp zprty> {
3478   def _REAL : sve_mem_cld_si_base<dtype, nf, asm, listty>;
3479
3480   def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
3481                   (!cast<Instruction>(NAME # _REAL) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 0>;
3482   def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $imm4, mul vl]",
3483                   (!cast<Instruction>(NAME # _REAL) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, simm4s1:$imm4), 0>;
3484   def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
3485                   (!cast<Instruction>(NAME # _REAL) listty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
3486 }
3487
3488 multiclass sve_mem_cld_si<bits<4> dtype, string asm, RegisterOperand listty,
3489                           ZPRRegOp zprty>
3490 : sve_mem_cld_si_base<dtype, 0, asm, listty, zprty>;
3491
3492 class sve_mem_cldnt_si_base<bits<2> msz, string asm, RegisterOperand VecList>
3493 : I<(outs VecList:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, simm4s1:$imm4),
3494   asm, "\t$Zt, $Pg/z, [$Rn, $imm4, mul vl]",
3495   "",
3496   []>, Sched<[]> {
3497   bits<5> Zt;
3498   bits<3> Pg;
3499   bits<5> Rn;
3500   bits<4> imm4;
3501   let Inst{31-25} = 0b1010010;
3502   let Inst{24-23} = msz;
3503   let Inst{22-20} = 0b000;
3504   let Inst{19-16} = imm4;
3505   let Inst{15-13} = 0b111;
3506   let Inst{12-10} = Pg;
3507   let Inst{9-5}   = Rn;
3508   let Inst{4-0}   = Zt;
3509
3510   let mayLoad = 1;
3511 }
3512
3513 multiclass sve_mem_cldnt_si<bits<2> msz, string asm, RegisterOperand listty,
3514                             ZPRRegOp zprty> {
3515   def NAME : sve_mem_cldnt_si_base<msz, asm, listty>;
3516
3517   def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
3518                   (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 0>;
3519   def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $imm4, mul vl]",
3520                   (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, simm4s1:$imm4), 0>;
3521   def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
3522                   (!cast<Instruction>(NAME) listty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
3523 }
3524
3525 class sve_mem_cldnt_ss_base<bits<2> msz, string asm, RegisterOperand VecList,
3526                             RegisterOperand gprty>
3527 : I<(outs VecList:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
3528   asm, "\t$Zt, $Pg/z, [$Rn, $Rm]",
3529   "",
3530   []>, Sched<[]> {
3531   bits<3> Pg;
3532   bits<5> Rm;
3533   bits<5> Rn;
3534   bits<5> Zt;
3535   let Inst{31-25} = 0b1010010;
3536   let Inst{24-23} = msz;
3537   let Inst{22-21} = 0b00;
3538   let Inst{20-16} = Rm;
3539   let Inst{15-13} = 0b110;
3540   let Inst{12-10} = Pg;
3541   let Inst{9-5}   = Rn;
3542   let Inst{4-0}   = Zt;
3543
3544   let mayLoad = 1;
3545 }
3546
3547 multiclass sve_mem_cldnt_ss<bits<2> msz, string asm, RegisterOperand listty,
3548                             ZPRRegOp zprty, RegisterOperand gprty> {
3549   def NAME : sve_mem_cldnt_ss_base<msz, asm, listty, gprty>;
3550
3551   def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Rm]",
3552                  (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm), 0>;
3553 }
3554
3555 class sve_mem_ldqr_si<bits<2> sz, string asm, RegisterOperand VecList>
3556 : I<(outs VecList:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, simm4s16:$imm4),
3557   asm, "\t$Zt, $Pg/z, [$Rn, $imm4]", "", []>, Sched<[]> {
3558   bits<5> Zt;
3559   bits<5> Rn;
3560   bits<3> Pg;
3561   bits<4> imm4;
3562   let Inst{31-25} = 0b1010010;
3563   let Inst{24-23} = sz;
3564   let Inst{22-20} = 0;
3565   let Inst{19-16} = imm4;
3566   let Inst{15-13} = 0b001;
3567   let Inst{12-10} = Pg;
3568   let Inst{9-5}   = Rn;
3569   let Inst{4-0}   = Zt;
3570
3571   let mayLoad = 1;
3572 }
3573
3574 multiclass sve_mem_ldqr_si<bits<2> sz, string asm, RegisterOperand listty,
3575                            ZPRRegOp zprty> {
3576   def NAME : sve_mem_ldqr_si<sz, asm, listty>;
3577   def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
3578                   (!cast<Instruction>(NAME) listty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
3579   def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
3580                   (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 0>;
3581   def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $imm4]",
3582                   (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, simm4s16:$imm4), 0>;
3583 }
3584
3585 class sve_mem_ldqr_ss<bits<2> sz, string asm, RegisterOperand VecList,
3586                       RegisterOperand gprty>
3587 : I<(outs VecList:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
3588   asm, "\t$Zt, $Pg/z, [$Rn, $Rm]", "", []>, Sched<[]> {
3589   bits<5> Zt;
3590   bits<3> Pg;
3591   bits<5> Rn;
3592   bits<5> Rm;
3593   let Inst{31-25} = 0b1010010;
3594   let Inst{24-23} = sz;
3595   let Inst{22-21} = 0;
3596   let Inst{20-16} = Rm;
3597   let Inst{15-13} = 0;
3598   let Inst{12-10} = Pg;
3599   let Inst{9-5}   = Rn;
3600   let Inst{4-0}   = Zt;
3601
3602   let mayLoad = 1;
3603 }
3604
3605 multiclass sve_mem_ldqr_ss<bits<2> sz, string asm, RegisterOperand listty,
3606                            ZPRRegOp zprty, RegisterOperand gprty> {
3607   def NAME : sve_mem_ldqr_ss<sz, asm, listty, gprty>;
3608
3609   def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Rm]",
3610                   (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm), 0>;
3611 }
3612
3613 class sve_mem_ld_dup<bits<2> dtypeh, bits<2> dtypel, string asm,
3614                      RegisterOperand VecList, Operand immtype>
3615 : I<(outs VecList:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, immtype:$imm6),
3616   asm, "\t$Zt, $Pg/z, [$Rn, $imm6]",
3617   "",
3618   []>, Sched<[]> {
3619   bits<3> Pg;
3620   bits<5> Rn;
3621   bits<5> Zt;
3622   bits<6> imm6;
3623   let Inst{31-25} = 0b1000010;
3624   let Inst{24-23} = dtypeh;
3625   let Inst{22}    = 1;
3626   let Inst{21-16} = imm6;
3627   let Inst{15}    = 0b1;
3628   let Inst{14-13} = dtypel;
3629   let Inst{12-10} = Pg;
3630   let Inst{9-5}   = Rn;
3631   let Inst{4-0}   = Zt;
3632
3633   let mayLoad = 1;
3634 }
3635
3636 multiclass sve_mem_ld_dup<bits<2> dtypeh, bits<2> dtypel, string asm,
3637                           RegisterOperand zlistty, ZPRRegOp zprty, Operand immtype> {
3638   def NAME : sve_mem_ld_dup<dtypeh, dtypel, asm, zlistty, immtype>;
3639
3640   def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
3641                   (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 0>;
3642   def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $imm6]",
3643                   (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, immtype:$imm6), 0>;
3644   def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
3645                   (!cast<Instruction>(NAME) zlistty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
3646 }
3647
3648 class sve_mem_cld_ss_base<bits<4> dtype, bit ff, dag iops, string asm,
3649                           RegisterOperand VecList>
3650 : I<(outs VecList:$Zt), iops,
3651   asm, "\t$Zt, $Pg/z, [$Rn, $Rm]",
3652   "",
3653   []>, Sched<[]> {
3654   bits<5> Zt;
3655   bits<3> Pg;
3656   bits<5> Rm;
3657   bits<5> Rn;
3658   let Inst{31-25} = 0b1010010;
3659   let Inst{24-21} = dtype;
3660   let Inst{20-16} = Rm;
3661   let Inst{15-14} = 0b01;
3662   let Inst{13}    = ff;
3663   let Inst{12-10} = Pg;
3664   let Inst{9-5}   = Rn;
3665   let Inst{4-0}   = Zt;
3666
3667   let mayLoad = 1;
3668   let Uses = !if(!eq(ff, 1), [FFR], []);
3669   let Defs = !if(!eq(ff, 1), [FFR], []);
3670 }
3671
3672 multiclass sve_mem_cld_ss<bits<4> dtype, string asm, RegisterOperand listty,
3673                           ZPRRegOp zprty, RegisterOperand gprty> {
3674   def "" : sve_mem_cld_ss_base<dtype, 0, (ins PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
3675                                asm, listty>;
3676
3677   def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Rm]",
3678                  (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm), 0>;
3679 }
3680
3681 multiclass sve_mem_cldff_ss<bits<4> dtype, string asm, RegisterOperand listty,
3682                             ZPRRegOp zprty, RegisterOperand gprty> {
3683   def _REAL : sve_mem_cld_ss_base<dtype, 1, (ins PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
3684                                   asm, listty>;
3685
3686   def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Rm]",
3687                  (!cast<Instruction>(NAME # _REAL) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm), 0>;
3688
3689   def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
3690                  (!cast<Instruction>(NAME # _REAL) listty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, XZR), 1>;
3691
3692   def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
3693                  (!cast<Instruction>(NAME # _REAL) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, XZR), 0>;
3694 }
3695
3696 multiclass sve_mem_cldnf_si<bits<4> dtype, string asm, RegisterOperand listty,
3697                             ZPRRegOp zprty>
3698 : sve_mem_cld_si_base<dtype, 1, asm, listty, zprty>;
3699
3700 class sve_mem_eld_si<bits<2> sz, bits<2> nregs, RegisterOperand VecList,
3701                      string asm, Operand immtype>
3702 : I<(outs VecList:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, immtype:$imm4),
3703   asm, "\t$Zt, $Pg/z, [$Rn, $imm4, mul vl]",
3704   "",
3705   []>, Sched<[]> {
3706   bits<5> Zt;
3707   bits<3> Pg;
3708   bits<5> Rn;
3709   bits<4> imm4;
3710   let Inst{31-25} = 0b1010010;
3711   let Inst{24-23} = sz;
3712   let Inst{22-21} = nregs;
3713   let Inst{20}    = 0;
3714   let Inst{19-16} = imm4;
3715   let Inst{15-13} = 0b111;
3716   let Inst{12-10} = Pg;
3717   let Inst{9-5}   = Rn;
3718   let Inst{4-0}   = Zt;
3719
3720   let mayLoad = 1;
3721 }
3722
3723 multiclass sve_mem_eld_si<bits<2> sz, bits<2> nregs, RegisterOperand VecList,
3724                           string asm, Operand immtype> {
3725   def NAME : sve_mem_eld_si<sz, nregs, VecList, asm, immtype>;
3726
3727   def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
3728                   (!cast<Instruction>(NAME) VecList:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
3729 }
3730
3731 class sve_mem_eld_ss<bits<2> sz, bits<2> nregs, RegisterOperand VecList,
3732                      string asm, RegisterOperand gprty>
3733 : I<(outs VecList:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
3734   asm, "\t$Zt, $Pg/z, [$Rn, $Rm]",
3735   "",
3736   []>, Sched<[]> {
3737   bits<3> Pg;
3738   bits<5> Rm;
3739   bits<5> Rn;
3740   bits<5> Zt;
3741   let Inst{31-25} = 0b1010010;
3742   let Inst{24-23} = sz;
3743   let Inst{22-21} = nregs;
3744   let Inst{20-16} = Rm;
3745   let Inst{15-13} = 0b110;
3746   let Inst{12-10} = Pg;
3747   let Inst{9-5}   = Rn;
3748   let Inst{4-0}   = Zt;
3749
3750   let mayLoad = 1;
3751 }
3752
3753 //===----------------------------------------------------------------------===//
3754 // SVE Memory - 32-bit Gather and Unsized Contiguous Group
3755 //===----------------------------------------------------------------------===//
3756
3757 // bit xs      is '1' if offsets are signed
3758 // bit scaled  is '1' if the offsets are scaled
3759 class sve_mem_32b_gld_sv<bits<4> opc, bit xs, bit scaled, string asm,
3760                          RegisterOperand zprext>
3761 : I<(outs Z_s:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, zprext:$Zm),
3762   asm, "\t$Zt, $Pg/z, [$Rn, $Zm]",
3763   "",
3764   []>, Sched<[]> {
3765   bits<3> Pg;
3766   bits<5> Rn;
3767   bits<5> Zm;
3768   bits<5> Zt;
3769   let Inst{31-25} = 0b1000010;
3770   let Inst{24-23} = opc{3-2};
3771   let Inst{22}    = xs;
3772   let Inst{21}    = scaled;
3773   let Inst{20-16} = Zm;
3774   let Inst{15}    = 0b0;
3775   let Inst{14-13} = opc{1-0};
3776   let Inst{12-10} = Pg;
3777   let Inst{9-5}   = Rn;
3778   let Inst{4-0}   = Zt;
3779
3780   let mayLoad = 1;
3781   let Defs = !if(!eq(opc{0}, 1), [FFR], []);
3782   let Uses = !if(!eq(opc{0}, 1), [FFR], []);
3783 }
3784
3785 multiclass sve_mem_32b_gld_sv_32_scaled<bits<4> opc, string asm,
3786                                         RegisterOperand sxtw_opnd,
3787                                         RegisterOperand uxtw_opnd> {
3788   def _UXTW_SCALED_REAL : sve_mem_32b_gld_sv<opc, 0, 1, asm, uxtw_opnd>;
3789   def _SXTW_SCALED_REAL : sve_mem_32b_gld_sv<opc, 1, 1, asm, sxtw_opnd>;
3790
3791   def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
3792                   (!cast<Instruction>(NAME # _UXTW_SCALED_REAL) ZPR32:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm), 0>;
3793   def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
3794                   (!cast<Instruction>(NAME # _SXTW_SCALED_REAL) ZPR32:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm), 0>;
3795 }
3796
3797 multiclass sve_mem_32b_gld_vs_32_unscaled<bits<4> opc, string asm,
3798                                           RegisterOperand sxtw_opnd,
3799                                           RegisterOperand uxtw_opnd> {
3800   def _UXTW_REAL : sve_mem_32b_gld_sv<opc, 0, 0, asm, uxtw_opnd>;
3801   def _SXTW_REAL : sve_mem_32b_gld_sv<opc, 1, 0, asm, sxtw_opnd>;
3802
3803   def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
3804                   (!cast<Instruction>(NAME # _UXTW_REAL) ZPR32:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm), 0>;
3805   def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
3806                   (!cast<Instruction>(NAME # _SXTW_REAL) ZPR32:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm), 0>;
3807 }
3808
3809
3810 class sve_mem_32b_gld_vi<bits<4> opc, string asm, Operand imm_ty>
3811 : I<(outs Z_s:$Zt), (ins PPR3bAny:$Pg, ZPR32:$Zn, imm_ty:$imm5),
3812   asm, "\t$Zt, $Pg/z, [$Zn, $imm5]",
3813   "",
3814   []>, Sched<[]> {
3815   bits<3> Pg;
3816   bits<5> Zn;
3817   bits<5> Zt;
3818   bits<5> imm5;
3819   let Inst{31-25} = 0b1000010;
3820   let Inst{24-23} = opc{3-2};
3821   let Inst{22-21} = 0b01;
3822   let Inst{20-16} = imm5;
3823   let Inst{15}    = 0b1;
3824   let Inst{14-13} = opc{1-0};
3825   let Inst{12-10} = Pg;
3826   let Inst{9-5}   = Zn;
3827   let Inst{4-0}   = Zt;
3828
3829   let mayLoad = 1;
3830   let Defs = !if(!eq(opc{0}, 1), [FFR], []);
3831   let Uses = !if(!eq(opc{0}, 1), [FFR], []);
3832 }
3833
3834 multiclass sve_mem_32b_gld_vi_32_ptrs<bits<4> opc, string asm, Operand imm_ty> {
3835   def _IMM_REAL : sve_mem_32b_gld_vi<opc, asm, imm_ty>;
3836
3837   def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn]",
3838                   (!cast<Instruction>(NAME # _IMM_REAL) ZPR32:$Zt, PPR3bAny:$Pg, ZPR32:$Zn, 0), 0>;
3839   def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn, $imm5]",
3840                   (!cast<Instruction>(NAME # _IMM_REAL) ZPR32:$Zt, PPR3bAny:$Pg, ZPR32:$Zn, imm_ty:$imm5), 0>;
3841   def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn]",
3842                   (!cast<Instruction>(NAME # _IMM_REAL) Z_s:$Zt, PPR3bAny:$Pg, ZPR32:$Zn, 0), 1>;
3843 }
3844
3845 class sve_mem_prfm_si<bits<2> msz, string asm>
3846 : I<(outs), (ins sve_prfop:$prfop, PPR3bAny:$Pg, GPR64sp:$Rn, simm6s1:$imm6),
3847   asm, "\t$prfop, $Pg, [$Rn, $imm6, mul vl]",
3848   "",
3849   []>, Sched<[]> {
3850   bits<5> Rn;
3851   bits<3> Pg;
3852   bits<6> imm6;
3853   bits<4> prfop;
3854   let Inst{31-22} = 0b1000010111;
3855   let Inst{21-16} = imm6;
3856   let Inst{15}    = 0b0;
3857   let Inst{14-13} = msz;
3858   let Inst{12-10} = Pg;
3859   let Inst{9-5}   = Rn;
3860   let Inst{4}     = 0b0;
3861   let Inst{3-0}   = prfop;
3862
3863   let hasSideEffects = 1;
3864 }
3865
3866 multiclass sve_mem_prfm_si<bits<2> msz, string asm> {
3867   def NAME : sve_mem_prfm_si<msz, asm>;
3868
3869   def : InstAlias<asm # "\t$prfop, $Pg, [$Rn]",
3870                   (!cast<Instruction>(NAME) sve_prfop:$prfop, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
3871 }
3872
3873 class sve_mem_prfm_ss<bits<3> opc, string asm, RegisterOperand gprty>
3874 : I<(outs), (ins sve_prfop:$prfop, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
3875   asm, "\t$prfop, $Pg, [$Rn, $Rm]",
3876   "",
3877   []>, Sched<[]> {
3878   bits<5> Rm;
3879   bits<5> Rn;
3880   bits<3> Pg;
3881   bits<4> prfop;
3882   let Inst{31-25} = 0b1000010;
3883   let Inst{24-23} = opc{2-1};
3884   let Inst{22-21} = 0b00;
3885   let Inst{20-16} = Rm;
3886   let Inst{15}    = 0b1;
3887   let Inst{14}    = opc{0};
3888   let Inst{13}    = 0b0;
3889   let Inst{12-10} = Pg;
3890   let Inst{9-5}   = Rn;
3891   let Inst{4}     = 0b0;
3892   let Inst{3-0}   = prfop;
3893
3894   let hasSideEffects = 1;
3895 }
3896
3897 class sve_mem_32b_prfm_sv<bits<2> msz, bit xs, string asm,
3898                           RegisterOperand zprext>
3899 : I<(outs), (ins sve_prfop:$prfop, PPR3bAny:$Pg, GPR64sp:$Rn, zprext:$Zm),
3900   asm, "\t$prfop, $Pg, [$Rn, $Zm]",
3901   "",
3902   []>, Sched<[]> {
3903   bits<3> Pg;
3904   bits<5> Rn;
3905   bits<5> Zm;
3906   bits<4> prfop;
3907   let Inst{31-23} = 0b100001000;
3908   let Inst{22}    = xs;
3909   let Inst{21}    = 0b1;
3910   let Inst{20-16} = Zm;
3911   let Inst{15}    = 0b0;
3912   let Inst{14-13} = msz;
3913   let Inst{12-10} = Pg;
3914   let Inst{9-5}   = Rn;
3915   let Inst{4}     = 0b0;
3916   let Inst{3-0}   = prfop;
3917
3918   let hasSideEffects = 1;
3919 }
3920
3921 multiclass sve_mem_32b_prfm_sv_scaled<bits<2> msz, string asm,
3922                                       RegisterOperand sxtw_opnd,
3923                                       RegisterOperand uxtw_opnd> {
3924   def _UXTW_SCALED : sve_mem_32b_prfm_sv<msz, 0, asm, uxtw_opnd>;
3925   def _SXTW_SCALED : sve_mem_32b_prfm_sv<msz, 1, asm, sxtw_opnd>;
3926 }
3927
3928 class sve_mem_32b_prfm_vi<bits<2> msz, string asm, Operand imm_ty>
3929 : I<(outs), (ins sve_prfop:$prfop, PPR3bAny:$Pg, ZPR32:$Zn, imm_ty:$imm5),
3930   asm, "\t$prfop, $Pg, [$Zn, $imm5]",
3931   "",
3932   []>, Sched<[]> {
3933   bits<3> Pg;
3934   bits<5> Zn;
3935   bits<5> imm5;
3936   bits<4> prfop;
3937   let Inst{31-25} = 0b1000010;
3938   let Inst{24-23} = msz;
3939   let Inst{22-21} = 0b00;
3940   let Inst{20-16} = imm5;
3941   let Inst{15-13} = 0b111;
3942   let Inst{12-10} = Pg;
3943   let Inst{9-5}   = Zn;
3944   let Inst{4}     = 0b0;
3945   let Inst{3-0}   = prfop;
3946 }
3947
3948 multiclass sve_mem_32b_prfm_vi<bits<2> msz, string asm, Operand imm_ty> {
3949   def NAME : sve_mem_32b_prfm_vi<msz, asm, imm_ty>;
3950
3951   def : InstAlias<asm # "\t$prfop, $Pg, [$Zn]",
3952                   (!cast<Instruction>(NAME) sve_prfop:$prfop, PPR3bAny:$Pg, ZPR32:$Zn, 0), 1>;
3953 }
3954
3955 class sve_mem_z_fill<string asm>
3956 : I<(outs ZPRAny:$Zt), (ins GPR64sp:$Rn, simm9:$imm9),
3957   asm, "\t$Zt, [$Rn, $imm9, mul vl]",
3958   "",
3959   []>, Sched<[]> {
3960   bits<5> Rn;
3961   bits<5> Zt;
3962   bits<9> imm9;
3963   let Inst{31-22} = 0b1000010110;
3964   let Inst{21-16} = imm9{8-3};
3965   let Inst{15-13} = 0b010;
3966   let Inst{12-10} = imm9{2-0};
3967   let Inst{9-5}   = Rn;
3968   let Inst{4-0}   = Zt;
3969
3970   let mayLoad = 1;
3971 }
3972
3973 multiclass sve_mem_z_fill<string asm> {
3974   def NAME : sve_mem_z_fill<asm>;
3975
3976   def : InstAlias<asm # "\t$Zt, [$Rn]",
3977                   (!cast<Instruction>(NAME) ZPRAny:$Zt, GPR64sp:$Rn, 0), 1>;
3978 }
3979
3980 class sve_mem_p_fill<string asm>
3981 : I<(outs PPRAny:$Pt), (ins GPR64sp:$Rn, simm9:$imm9),
3982   asm, "\t$Pt, [$Rn, $imm9, mul vl]",
3983   "",
3984   []>, Sched<[]> {
3985   bits<4> Pt;
3986   bits<5> Rn;
3987   bits<9> imm9;
3988   let Inst{31-22} = 0b1000010110;
3989   let Inst{21-16} = imm9{8-3};
3990   let Inst{15-13} = 0b000;
3991   let Inst{12-10} = imm9{2-0};
3992   let Inst{9-5}   = Rn;
3993   let Inst{4}     = 0b0;
3994   let Inst{3-0}   = Pt;
3995
3996   let mayLoad = 1;
3997 }
3998
3999 multiclass sve_mem_p_fill<string asm> {
4000   def NAME : sve_mem_p_fill<asm>;
4001
4002   def : InstAlias<asm # "\t$Pt, [$Rn]",
4003                   (!cast<Instruction>(NAME) PPRAny:$Pt, GPR64sp:$Rn, 0), 1>;
4004 }
4005
4006 //===----------------------------------------------------------------------===//
4007 // SVE Memory - 64-bit Gather Group
4008 //===----------------------------------------------------------------------===//
4009
4010 // bit xs      is '1' if offsets are signed
4011 // bit scaled  is '1' if the offsets are scaled
4012 // bit lsl     is '0' if the offsets are extended (uxtw/sxtw), '1' if shifted (lsl)
4013 class sve_mem_64b_gld_sv<bits<4> opc, bit xs, bit scaled, bit lsl, string asm,
4014                          RegisterOperand zprext>
4015 : I<(outs Z_d:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, zprext:$Zm),
4016   asm, "\t$Zt, $Pg/z, [$Rn, $Zm]",
4017   "",
4018   []>, Sched<[]> {
4019   bits<3> Pg;
4020   bits<5> Rn;
4021   bits<5> Zm;
4022   bits<5> Zt;
4023   let Inst{31-25} = 0b1100010;
4024   let Inst{24-23} = opc{3-2};
4025   let Inst{22}    = xs;
4026   let Inst{21}    = scaled;
4027   let Inst{20-16} = Zm;
4028   let Inst{15}    = lsl;
4029   let Inst{14-13} = opc{1-0};
4030   let Inst{12-10} = Pg;
4031   let Inst{9-5}   = Rn;
4032   let Inst{4-0}   = Zt;
4033
4034   let mayLoad = 1;
4035   let Defs = !if(!eq(opc{0}, 1), [FFR], []);
4036   let Uses = !if(!eq(opc{0}, 1), [FFR], []);
4037 }
4038
4039 multiclass sve_mem_64b_gld_sv_32_scaled<bits<4> opc, string asm,
4040                                         RegisterOperand sxtw_opnd,
4041                                         RegisterOperand uxtw_opnd> {
4042   def _UXTW_SCALED_REAL : sve_mem_64b_gld_sv<opc, 0, 1, 0, asm, uxtw_opnd>;
4043   def _SXTW_SCALED_REAL : sve_mem_64b_gld_sv<opc, 1, 1, 0, asm, sxtw_opnd>;
4044
4045   def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
4046                   (!cast<Instruction>(NAME # _UXTW_SCALED_REAL) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm), 0>;
4047   def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
4048                   (!cast<Instruction>(NAME # _SXTW_SCALED_REAL) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm), 0>;
4049 }
4050
4051 multiclass sve_mem_64b_gld_vs_32_unscaled<bits<4> opc, string asm,
4052                                           RegisterOperand sxtw_opnd,
4053                                           RegisterOperand uxtw_opnd> {
4054   def _UXTW_REAL : sve_mem_64b_gld_sv<opc, 0, 0, 0, asm, uxtw_opnd>;
4055   def _SXTW_REAL : sve_mem_64b_gld_sv<opc, 1, 0, 0, asm, sxtw_opnd>;
4056
4057   def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
4058                   (!cast<Instruction>(NAME # _UXTW_REAL) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm), 0>;
4059   def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
4060                   (!cast<Instruction>(NAME # _SXTW_REAL) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm), 0>;
4061 }
4062
4063 multiclass sve_mem_64b_gld_sv2_64_scaled<bits<4> opc, string asm,
4064                                          RegisterOperand zprext> {
4065   def _SCALED_REAL : sve_mem_64b_gld_sv<opc, 1, 1, 1, asm, zprext>;
4066
4067   def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
4068                   (!cast<Instruction>(NAME # _SCALED_REAL) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, zprext:$Zm), 0>;
4069 }
4070
4071 multiclass sve_mem_64b_gld_vs2_64_unscaled<bits<4> opc, string asm> {
4072   def _REAL : sve_mem_64b_gld_sv<opc, 1, 0, 1, asm, ZPR64ExtLSL8>;
4073
4074   def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
4075                   (!cast<Instruction>(NAME # _REAL) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, ZPR64ExtLSL8:$Zm), 0>;
4076 }
4077
4078 class sve_mem_64b_gld_vi<bits<4> opc, string asm, Operand imm_ty>
4079 : I<(outs Z_d:$Zt), (ins PPR3bAny:$Pg, ZPR64:$Zn, imm_ty:$imm5),
4080   asm, "\t$Zt, $Pg/z, [$Zn, $imm5]",
4081   "",
4082   []>, Sched<[]> {
4083   bits<3> Pg;
4084   bits<5> Zn;
4085   bits<5> Zt;
4086   bits<5> imm5;
4087   let Inst{31-25} = 0b1100010;
4088   let Inst{24-23} = opc{3-2};
4089   let Inst{22-21} = 0b01;
4090   let Inst{20-16} = imm5;
4091   let Inst{15}    = 0b1;
4092   let Inst{14-13} = opc{1-0};
4093   let Inst{12-10} = Pg;
4094   let Inst{9-5}   = Zn;
4095   let Inst{4-0}   = Zt;
4096
4097   let mayLoad = 1;
4098   let Defs = !if(!eq(opc{0}, 1), [FFR], []);
4099   let Uses = !if(!eq(opc{0}, 1), [FFR], []);
4100 }
4101
4102 multiclass sve_mem_64b_gld_vi_64_ptrs<bits<4> opc, string asm, Operand imm_ty> {
4103   def _IMM_REAL : sve_mem_64b_gld_vi<opc, asm, imm_ty>;
4104
4105   def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn]",
4106                   (!cast<Instruction>(NAME # _IMM_REAL) ZPR64:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, 0), 0>;
4107   def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn, $imm5]",
4108                  (!cast<Instruction>(NAME # _IMM_REAL) ZPR64:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, imm_ty:$imm5), 0>;
4109   def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn]",
4110                   (!cast<Instruction>(NAME # _IMM_REAL) Z_d:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, 0), 1>;
4111 }
4112
4113 // bit lsl is '0' if the offsets are extended (uxtw/sxtw), '1' if shifted (lsl)
4114 class sve_mem_64b_prfm_sv<bits<2> msz, bit xs, bit lsl, string asm,
4115                           RegisterOperand zprext>
4116 : I<(outs), (ins sve_prfop:$prfop, PPR3bAny:$Pg, GPR64sp:$Rn, zprext:$Zm),
4117   asm, "\t$prfop, $Pg, [$Rn, $Zm]",
4118   "",
4119   []>, Sched<[]> {
4120   bits<3> Pg;
4121   bits<5> Rn;
4122   bits<5> Zm;
4123   bits<4> prfop;
4124   let Inst{31-23} = 0b110001000;
4125   let Inst{22}    = xs;
4126   let Inst{21}    = 0b1;
4127   let Inst{20-16} = Zm;
4128   let Inst{15}    = lsl;
4129   let Inst{14-13} = msz;
4130   let Inst{12-10} = Pg;
4131   let Inst{9-5}   = Rn;
4132   let Inst{4}     = 0b0;
4133   let Inst{3-0}   = prfop;
4134
4135   let hasSideEffects = 1;
4136 }
4137
4138 multiclass sve_mem_64b_prfm_sv_ext_scaled<bits<2> msz, string asm,
4139                                           RegisterOperand sxtw_opnd,
4140                                           RegisterOperand uxtw_opnd> {
4141   def _UXTW_SCALED : sve_mem_64b_prfm_sv<msz, 0, 0, asm, uxtw_opnd>;
4142   def _SXTW_SCALED : sve_mem_64b_prfm_sv<msz, 1, 0, asm, sxtw_opnd>;
4143 }
4144
4145 multiclass sve_mem_64b_prfm_sv_lsl_scaled<bits<2> msz, string asm,
4146                                           RegisterOperand zprext> {
4147   def NAME : sve_mem_64b_prfm_sv<msz, 1, 1, asm, zprext>;
4148 }
4149
4150
4151 class sve_mem_64b_prfm_vi<bits<2> msz, string asm, Operand imm_ty>
4152 : I<(outs), (ins sve_prfop:$prfop, PPR3bAny:$Pg, ZPR64:$Zn, imm_ty:$imm5),
4153   asm, "\t$prfop, $Pg, [$Zn, $imm5]",
4154   "",
4155   []>, Sched<[]> {
4156   bits<3> Pg;
4157   bits<5> Zn;
4158   bits<5> imm5;
4159   bits<4> prfop;
4160   let Inst{31-25} = 0b1100010;
4161   let Inst{24-23} = msz;
4162   let Inst{22-21} = 0b00;
4163   let Inst{20-16} = imm5;
4164   let Inst{15-13} = 0b111;
4165   let Inst{12-10} = Pg;
4166   let Inst{9-5}   = Zn;
4167   let Inst{4}     = 0b0;
4168   let Inst{3-0}   = prfop;
4169
4170   let hasSideEffects = 1;
4171 }
4172
4173 multiclass sve_mem_64b_prfm_vi<bits<2> msz, string asm, Operand imm_ty> {
4174   def NAME : sve_mem_64b_prfm_vi<msz, asm, imm_ty>;
4175
4176   def : InstAlias<asm # "\t$prfop, $Pg, [$Zn]",
4177                   (!cast<Instruction>(NAME) sve_prfop:$prfop, PPR3bAny:$Pg, ZPR64:$Zn, 0), 1>;
4178 }
4179
4180
4181 //===----------------------------------------------------------------------===//
4182 // SVE Compute Vector Address Group
4183 //===----------------------------------------------------------------------===//
4184
4185 class sve_int_bin_cons_misc_0_a<bits<2> opc, bits<2> msz, string asm,
4186                                 ZPRRegOp zprty, RegisterOperand zprext>
4187 : I<(outs zprty:$Zd), (ins zprty:$Zn, zprext:$Zm),
4188   asm, "\t$Zd, [$Zn, $Zm]",
4189   "",
4190   []>, Sched<[]> {
4191   bits<5> Zd;
4192   bits<5> Zn;
4193   bits<5> Zm;
4194   let Inst{31-24} = 0b00000100;
4195   let Inst{23-22} = opc;
4196   let Inst{21}    = 0b1;
4197   let Inst{20-16} = Zm;
4198   let Inst{15-12} = 0b1010;
4199   let Inst{11-10} = msz;
4200   let Inst{9-5}   = Zn;
4201   let Inst{4-0}   = Zd;
4202 }
4203
4204 multiclass sve_int_bin_cons_misc_0_a_uxtw<bits<2> opc, string asm> {
4205   def _0 : sve_int_bin_cons_misc_0_a<opc, 0b00, asm, ZPR64, ZPR64ExtUXTW8>;
4206   def _1 : sve_int_bin_cons_misc_0_a<opc, 0b01, asm, ZPR64, ZPR64ExtUXTW16>;
4207   def _2 : sve_int_bin_cons_misc_0_a<opc, 0b10, asm, ZPR64, ZPR64ExtUXTW32>;
4208   def _3 : sve_int_bin_cons_misc_0_a<opc, 0b11, asm, ZPR64, ZPR64ExtUXTW64>;
4209 }
4210
4211 multiclass sve_int_bin_cons_misc_0_a_sxtw<bits<2> opc, string asm> {
4212   def _0 : sve_int_bin_cons_misc_0_a<opc, 0b00, asm, ZPR64, ZPR64ExtSXTW8>;
4213   def _1 : sve_int_bin_cons_misc_0_a<opc, 0b01, asm, ZPR64, ZPR64ExtSXTW16>;
4214   def _2 : sve_int_bin_cons_misc_0_a<opc, 0b10, asm, ZPR64, ZPR64ExtSXTW32>;
4215   def _3 : sve_int_bin_cons_misc_0_a<opc, 0b11, asm, ZPR64, ZPR64ExtSXTW64>;
4216 }
4217
4218 multiclass sve_int_bin_cons_misc_0_a_32_lsl<bits<2> opc, string asm> {
4219   def _0 : sve_int_bin_cons_misc_0_a<opc, 0b00, asm, ZPR32, ZPR32ExtLSL8>;
4220   def _1 : sve_int_bin_cons_misc_0_a<opc, 0b01, asm, ZPR32, ZPR32ExtLSL16>;
4221   def _2 : sve_int_bin_cons_misc_0_a<opc, 0b10, asm, ZPR32, ZPR32ExtLSL32>;
4222   def _3 : sve_int_bin_cons_misc_0_a<opc, 0b11, asm, ZPR32, ZPR32ExtLSL64>;
4223 }
4224
4225 multiclass sve_int_bin_cons_misc_0_a_64_lsl<bits<2> opc, string asm> {
4226   def _0 : sve_int_bin_cons_misc_0_a<opc, 0b00, asm, ZPR64, ZPR64ExtLSL8>;
4227   def _1 : sve_int_bin_cons_misc_0_a<opc, 0b01, asm, ZPR64, ZPR64ExtLSL16>;
4228   def _2 : sve_int_bin_cons_misc_0_a<opc, 0b10, asm, ZPR64, ZPR64ExtLSL32>;
4229   def _3 : sve_int_bin_cons_misc_0_a<opc, 0b11, asm, ZPR64, ZPR64ExtLSL64>;
4230 }
4231
4232
4233 //===----------------------------------------------------------------------===//
4234 // SVE Integer Misc - Unpredicated Group
4235 //===----------------------------------------------------------------------===//
4236
4237 class sve_int_bin_cons_misc_0_b<bits<2> sz, string asm, ZPRRegOp zprty>
4238 : I<(outs zprty:$Zd), (ins zprty:$Zn, zprty:$Zm),
4239   asm, "\t$Zd, $Zn, $Zm",
4240   "",
4241   []>, Sched<[]> {
4242   bits<5> Zd;
4243   bits<5> Zm;
4244   bits<5> Zn;
4245   let Inst{31-24} = 0b00000100;
4246   let Inst{23-22} = sz;
4247   let Inst{21}    = 0b1;
4248   let Inst{20-16} = Zm;
4249   let Inst{15-10} = 0b101100;
4250   let Inst{9-5}   = Zn;
4251   let Inst{4-0}   = Zd;
4252 }
4253
4254 multiclass sve_int_bin_cons_misc_0_b<string asm> {
4255   def _H : sve_int_bin_cons_misc_0_b<0b01, asm, ZPR16>;
4256   def _S : sve_int_bin_cons_misc_0_b<0b10, asm, ZPR32>;
4257   def _D : sve_int_bin_cons_misc_0_b<0b11, asm, ZPR64>;
4258 }
4259
4260 class sve_int_bin_cons_misc_0_c<bits<8> opc, string asm, ZPRRegOp zprty>
4261 : I<(outs zprty:$Zd), (ins zprty:$Zn),
4262   asm, "\t$Zd, $Zn",
4263   "",
4264   []>, Sched<[]> {
4265   bits<5> Zd;
4266   bits<5> Zn;
4267   let Inst{31-24} = 0b00000100;
4268   let Inst{23-22} = opc{7-6};
4269   let Inst{21}    = 0b1;
4270   let Inst{20-16} = opc{5-1};
4271   let Inst{15-11} = 0b10111;
4272   let Inst{10}    = opc{0};
4273   let Inst{9-5}   = Zn;
4274   let Inst{4-0}   = Zd;
4275 }
4276
4277 //===----------------------------------------------------------------------===//
4278 // SVE Integer Reduction Group
4279 //===----------------------------------------------------------------------===//
4280
4281 class sve_int_reduce<bits<2> sz8_32, bits<2> fmt, bits<3> opc, string asm,
4282                      ZPRRegOp zprty, RegisterClass regtype>
4283 : I<(outs regtype:$Vd), (ins PPR3bAny:$Pg, zprty:$Zn),
4284   asm, "\t$Vd, $Pg, $Zn",
4285   "",
4286   []>, Sched<[]> {
4287   bits<3> Pg;
4288   bits<5> Vd;
4289   bits<5> Zn;
4290   let Inst{31-24} = 0b00000100;
4291   let Inst{23-22} = sz8_32;
4292   let Inst{21}    = 0b0;
4293   let Inst{20-19} = fmt;
4294   let Inst{18-16} = opc;
4295   let Inst{15-13} = 0b001;
4296   let Inst{12-10} = Pg;
4297   let Inst{9-5}   = Zn;
4298   let Inst{4-0}   = Vd;
4299 }
4300
4301 multiclass sve_int_reduce_0_saddv<bits<3> opc, string asm> {
4302   def _B : sve_int_reduce<0b00, 0b00, opc, asm, ZPR8, FPR64>;
4303   def _H : sve_int_reduce<0b01, 0b00, opc, asm, ZPR16, FPR64>;
4304   def _S : sve_int_reduce<0b10, 0b00, opc, asm, ZPR32, FPR64>;
4305 }
4306
4307 multiclass sve_int_reduce_0_uaddv<bits<3> opc, string asm> {
4308   def _B : sve_int_reduce<0b00, 0b00, opc, asm, ZPR8, FPR64>;
4309   def _H : sve_int_reduce<0b01, 0b00, opc, asm, ZPR16, FPR64>;
4310   def _S : sve_int_reduce<0b10, 0b00, opc, asm, ZPR32, FPR64>;
4311   def _D : sve_int_reduce<0b11, 0b00, opc, asm, ZPR64, FPR64>;
4312 }
4313
4314 multiclass sve_int_reduce_1<bits<3> opc, string asm> {
4315   def _B : sve_int_reduce<0b00, 0b01, opc, asm, ZPR8, FPR8>;
4316   def _H : sve_int_reduce<0b01, 0b01, opc, asm, ZPR16, FPR16>;
4317   def _S : sve_int_reduce<0b10, 0b01, opc, asm, ZPR32, FPR32>;
4318   def _D : sve_int_reduce<0b11, 0b01, opc, asm, ZPR64, FPR64>;
4319 }
4320
4321 multiclass sve_int_reduce_2<bits<3> opc, string asm> {
4322   def _B : sve_int_reduce<0b00, 0b11, opc, asm, ZPR8, FPR8>;
4323   def _H : sve_int_reduce<0b01, 0b11, opc, asm, ZPR16, FPR16>;
4324   def _S : sve_int_reduce<0b10, 0b11, opc, asm, ZPR32, FPR32>;
4325   def _D : sve_int_reduce<0b11, 0b11, opc, asm, ZPR64, FPR64>;
4326 }
4327
4328 class sve_int_movprfx_pred<bits<2> sz8_32, bits<3> opc, string asm,
4329                            ZPRRegOp zprty, string pg_suffix, dag iops>
4330 : I<(outs zprty:$Zd), iops,
4331   asm, "\t$Zd, $Pg"#pg_suffix#", $Zn",
4332   "",
4333   []>, Sched<[]> {
4334   bits<3> Pg;
4335   bits<5> Zd;
4336   bits<5> Zn;
4337   let Inst{31-24} = 0b00000100;
4338   let Inst{23-22} = sz8_32;
4339   let Inst{21-19} = 0b010;
4340   let Inst{18-16} = opc;
4341   let Inst{15-13} = 0b001;
4342   let Inst{12-10} = Pg;
4343   let Inst{9-5}   = Zn;
4344   let Inst{4-0}   = Zd;
4345
4346   let ElementSize = zprty.ElementSize;
4347 }
4348
4349 multiclass sve_int_movprfx_pred_merge<bits<3> opc, string asm> {
4350 let Constraints = "$Zd = $_Zd" in {
4351   def _B : sve_int_movprfx_pred<0b00, opc, asm, ZPR8, "/m",
4352                                 (ins ZPR8:$_Zd, PPR3bAny:$Pg, ZPR8:$Zn)>;
4353   def _H : sve_int_movprfx_pred<0b01, opc, asm, ZPR16, "/m",
4354                                 (ins ZPR16:$_Zd, PPR3bAny:$Pg, ZPR16:$Zn)>;
4355   def _S : sve_int_movprfx_pred<0b10, opc, asm, ZPR32, "/m",
4356                                 (ins ZPR32:$_Zd, PPR3bAny:$Pg, ZPR32:$Zn)>;
4357   def _D : sve_int_movprfx_pred<0b11, opc, asm, ZPR64, "/m",
4358                                 (ins ZPR64:$_Zd, PPR3bAny:$Pg, ZPR64:$Zn)>;
4359 }
4360 }
4361
4362 multiclass sve_int_movprfx_pred_zero<bits<3> opc, string asm> {
4363   def _B : sve_int_movprfx_pred<0b00, opc, asm, ZPR8, "/z",
4364                                 (ins PPR3bAny:$Pg, ZPR8:$Zn)>;
4365   def _H : sve_int_movprfx_pred<0b01, opc, asm, ZPR16, "/z",
4366                                 (ins PPR3bAny:$Pg, ZPR16:$Zn)>;
4367   def _S : sve_int_movprfx_pred<0b10, opc, asm, ZPR32, "/z",
4368                                 (ins PPR3bAny:$Pg, ZPR32:$Zn)>;
4369   def _D : sve_int_movprfx_pred<0b11, opc, asm, ZPR64, "/z",
4370                                 (ins PPR3bAny:$Pg, ZPR64:$Zn)>;
4371 }
4372
4373 //===----------------------------------------------------------------------===//
4374 // SVE Propagate Break Group
4375 //===----------------------------------------------------------------------===//
4376
4377 class sve_int_brkp<bits<2> opc, string asm>
4378 : I<(outs PPR8:$Pd), (ins PPRAny:$Pg, PPR8:$Pn, PPR8:$Pm),
4379   asm, "\t$Pd, $Pg/z, $Pn, $Pm",
4380   "",
4381   []>, Sched<[]> {
4382   bits<4> Pd;
4383   bits<4> Pg;
4384   bits<4> Pm;
4385   bits<4> Pn;
4386   let Inst{31-24} = 0b00100101;
4387   let Inst{23}    = 0b0;
4388   let Inst{22}    = opc{1};
4389   let Inst{21-20} = 0b00;
4390   let Inst{19-16} = Pm;
4391   let Inst{15-14} = 0b11;
4392   let Inst{13-10} = Pg;
4393   let Inst{9}     = 0b0;
4394   let Inst{8-5}   = Pn;
4395   let Inst{4}     = opc{0};
4396   let Inst{3-0}   = Pd;
4397
4398   let Defs = !if(!eq (opc{1}, 1), [NZCV], []);
4399 }
4400
4401
4402 //===----------------------------------------------------------------------===//
4403 // SVE Partition Break Group
4404 //===----------------------------------------------------------------------===//
4405
4406 class sve_int_brkn<bit S, string asm>
4407 : I<(outs PPR8:$Pdm), (ins PPRAny:$Pg, PPR8:$Pn, PPR8:$_Pdm),
4408   asm, "\t$Pdm, $Pg/z, $Pn, $_Pdm",
4409   "",
4410   []>, Sched<[]> {
4411   bits<4> Pdm;
4412   bits<4> Pg;
4413   bits<4> Pn;
4414   let Inst{31-23} = 0b001001010;
4415   let Inst{22}    = S;
4416   let Inst{21-14} = 0b01100001;
4417   let Inst{13-10} = Pg;
4418   let Inst{9}     = 0b0;
4419   let Inst{8-5}   = Pn;
4420   let Inst{4}     = 0b0;
4421   let Inst{3-0}   = Pdm;
4422
4423   let Constraints = "$Pdm = $_Pdm";
4424   let Defs = !if(!eq (S, 0b1), [NZCV], []);
4425 }
4426
4427 class sve_int_break<bits<3> opc, string asm, string suffix, dag iops>
4428 : I<(outs PPR8:$Pd), iops,
4429   asm, "\t$Pd, $Pg"#suffix#", $Pn",
4430   "",
4431   []>, Sched<[]> {
4432   bits<4> Pd;
4433   bits<4> Pg;
4434   bits<4> Pn;
4435   let Inst{31-24} = 0b00100101;
4436   let Inst{23-22} = opc{2-1};
4437   let Inst{21-14} = 0b01000001;
4438   let Inst{13-10} = Pg;
4439   let Inst{9}     = 0b0;
4440   let Inst{8-5}   = Pn;
4441   let Inst{4}     = opc{0};
4442   let Inst{3-0}   = Pd;
4443
4444   let Constraints = !if(!eq (opc{0}, 1), "$Pd = $_Pd", "");
4445   let Defs = !if(!eq (opc{1}, 1), [NZCV], []);
4446
4447 }
4448
4449 multiclass sve_int_break_m<bits<3> opc, string asm> {
4450   def NAME : sve_int_break<opc, asm, "/m", (ins PPR8:$_Pd, PPRAny:$Pg, PPR8:$Pn)>;
4451 }
4452
4453 multiclass sve_int_break_z<bits<3> opc, string asm> {
4454   def NAME : sve_int_break<opc, asm, "/z", (ins PPRAny:$Pg, PPR8:$Pn)>;
4455 }
4456