1 //=-- SVEInstrFormats.td - AArch64 SVE Instruction classes -*- tablegen -*--=//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // AArch64 Scalable Vector Extension (SVE) Instruction Class Definitions.
11 //===----------------------------------------------------------------------===//
13 def SDT_AArch64Setcc : SDTypeProfile<1, 4, [
14 SDTCisVec<0>, SDTCisVec<1>, SDTCisVec<2>, SDTCisVec<3>,
15 SDTCVecEltisVT<0, i1>, SDTCVecEltisVT<1, i1>, SDTCisSameAs<2, 3>,
19 def AArch64setcc_z : SDNode<"AArch64ISD::SETCC_MERGE_ZERO", SDT_AArch64Setcc>;
21 def SVEPatternOperand : AsmOperandClass {
22 let Name = "SVEPattern";
23 let ParserMethod = "tryParseSVEPattern";
24 let PredicateMethod = "isSVEPattern";
25 let RenderMethod = "addImmOperands";
26 let DiagnosticType = "InvalidSVEPattern";
29 def sve_pred_enum : Operand<i32>, TImmLeaf<i32, [{
30 return (((uint32_t)Imm) < 32);
33 let PrintMethod = "printSVEPattern";
34 let ParserMatchClass = SVEPatternOperand;
37 def SVEPrefetchOperand : AsmOperandClass {
38 let Name = "SVEPrefetch";
39 let ParserMethod = "tryParsePrefetch<true>";
40 let PredicateMethod = "isPrefetch";
41 let RenderMethod = "addPrefetchOperands";
44 def sve_prfop : Operand<i32>, TImmLeaf<i32, [{
45 return (((uint32_t)Imm) <= 15);
47 let PrintMethod = "printPrefetchOp<true>";
48 let ParserMatchClass = SVEPrefetchOperand;
51 class SVELogicalImmOperand<int Width> : AsmOperandClass {
52 let Name = "SVELogicalImm" # Width;
53 let DiagnosticType = "LogicalSecondSource";
54 let PredicateMethod = "isLogicalImm<int" # Width # "_t>";
55 let RenderMethod = "addLogicalImmOperands<int" # Width # "_t>";
58 def sve_logical_imm8 : Operand<i64> {
59 let ParserMatchClass = SVELogicalImmOperand<8>;
60 let PrintMethod = "printLogicalImm<int8_t>";
62 let MCOperandPredicate = [{
65 int64_t Val = AArch64_AM::decodeLogicalImmediate(MCOp.getImm(), 64);
66 return AArch64_AM::isSVEMaskOfIdenticalElements<int8_t>(Val);
70 def sve_logical_imm16 : Operand<i64> {
71 let ParserMatchClass = SVELogicalImmOperand<16>;
72 let PrintMethod = "printLogicalImm<int16_t>";
74 let MCOperandPredicate = [{
77 int64_t Val = AArch64_AM::decodeLogicalImmediate(MCOp.getImm(), 64);
78 return AArch64_AM::isSVEMaskOfIdenticalElements<int16_t>(Val);
82 def sve_logical_imm32 : Operand<i64> {
83 let ParserMatchClass = SVELogicalImmOperand<32>;
84 let PrintMethod = "printLogicalImm<int32_t>";
86 let MCOperandPredicate = [{
89 int64_t Val = AArch64_AM::decodeLogicalImmediate(MCOp.getImm(), 64);
90 return AArch64_AM::isSVEMaskOfIdenticalElements<int32_t>(Val);
94 class SVEPreferredLogicalImmOperand<int Width> : AsmOperandClass {
95 let Name = "SVEPreferredLogicalImm" # Width;
96 let PredicateMethod = "isSVEPreferredLogicalImm<int" # Width # "_t>";
97 let RenderMethod = "addLogicalImmOperands<int" # Width # "_t>";
100 def sve_preferred_logical_imm16 : Operand<i64> {
101 let ParserMatchClass = SVEPreferredLogicalImmOperand<16>;
102 let PrintMethod = "printSVELogicalImm<int16_t>";
104 let MCOperandPredicate = [{
107 int64_t Val = AArch64_AM::decodeLogicalImmediate(MCOp.getImm(), 64);
108 return AArch64_AM::isSVEMaskOfIdenticalElements<int16_t>(Val) &&
109 AArch64_AM::isSVEMoveMaskPreferredLogicalImmediate(Val);
113 def sve_preferred_logical_imm32 : Operand<i64> {
114 let ParserMatchClass = SVEPreferredLogicalImmOperand<32>;
115 let PrintMethod = "printSVELogicalImm<int32_t>";
117 let MCOperandPredicate = [{
120 int64_t Val = AArch64_AM::decodeLogicalImmediate(MCOp.getImm(), 64);
121 return AArch64_AM::isSVEMaskOfIdenticalElements<int32_t>(Val) &&
122 AArch64_AM::isSVEMoveMaskPreferredLogicalImmediate(Val);
126 def sve_preferred_logical_imm64 : Operand<i64> {
127 let ParserMatchClass = SVEPreferredLogicalImmOperand<64>;
128 let PrintMethod = "printSVELogicalImm<int64_t>";
130 let MCOperandPredicate = [{
133 int64_t Val = AArch64_AM::decodeLogicalImmediate(MCOp.getImm(), 64);
134 return AArch64_AM::isSVEMaskOfIdenticalElements<int64_t>(Val) &&
135 AArch64_AM::isSVEMoveMaskPreferredLogicalImmediate(Val);
139 class SVELogicalImmNotOperand<int Width> : AsmOperandClass {
140 let Name = "SVELogicalImm" # Width # "Not";
141 let DiagnosticType = "LogicalSecondSource";
142 let PredicateMethod = "isLogicalImm<int" # Width # "_t>";
143 let RenderMethod = "addLogicalImmNotOperands<int" # Width # "_t>";
146 def sve_logical_imm8_not : Operand<i64> {
147 let ParserMatchClass = SVELogicalImmNotOperand<8>;
150 def sve_logical_imm16_not : Operand<i64> {
151 let ParserMatchClass = SVELogicalImmNotOperand<16>;
154 def sve_logical_imm32_not : Operand<i64> {
155 let ParserMatchClass = SVELogicalImmNotOperand<32>;
158 class SVEShiftedImmOperand<int ElementWidth, string Infix, string Predicate>
160 let Name = "SVE" # Infix # "Imm" # ElementWidth;
161 let DiagnosticType = "Invalid" # Name;
162 let RenderMethod = "addImmWithOptionalShiftOperands<8>";
163 let ParserMethod = "tryParseImmWithOptionalShift";
164 let PredicateMethod = Predicate;
167 def SVECpyImmOperand8 : SVEShiftedImmOperand<8, "Cpy", "isSVECpyImm<int8_t>">;
168 def SVECpyImmOperand16 : SVEShiftedImmOperand<16, "Cpy", "isSVECpyImm<int16_t>">;
169 def SVECpyImmOperand32 : SVEShiftedImmOperand<32, "Cpy", "isSVECpyImm<int32_t>">;
170 def SVECpyImmOperand64 : SVEShiftedImmOperand<64, "Cpy", "isSVECpyImm<int64_t>">;
172 def SVEAddSubImmOperand8 : SVEShiftedImmOperand<8, "AddSub", "isSVEAddSubImm<int8_t>">;
173 def SVEAddSubImmOperand16 : SVEShiftedImmOperand<16, "AddSub", "isSVEAddSubImm<int16_t>">;
174 def SVEAddSubImmOperand32 : SVEShiftedImmOperand<32, "AddSub", "isSVEAddSubImm<int32_t>">;
175 def SVEAddSubImmOperand64 : SVEShiftedImmOperand<64, "AddSub", "isSVEAddSubImm<int64_t>">;
177 class imm8_opt_lsl<int ElementWidth, string printType,
178 AsmOperandClass OpndClass>
180 let EncoderMethod = "getImm8OptLsl";
181 let DecoderMethod = "DecodeImm8OptLsl<" # ElementWidth # ">";
182 let PrintMethod = "printImm8OptLsl<" # printType # ">";
183 let ParserMatchClass = OpndClass;
184 let MIOperandInfo = (ops i32imm, i32imm);
187 def cpy_imm8_opt_lsl_i8 : imm8_opt_lsl<8, "int8_t", SVECpyImmOperand8>;
188 def cpy_imm8_opt_lsl_i16 : imm8_opt_lsl<16, "int16_t", SVECpyImmOperand16>;
189 def cpy_imm8_opt_lsl_i32 : imm8_opt_lsl<32, "int32_t", SVECpyImmOperand32>;
190 def cpy_imm8_opt_lsl_i64 : imm8_opt_lsl<64, "int64_t", SVECpyImmOperand64>;
192 def addsub_imm8_opt_lsl_i8 : imm8_opt_lsl<8, "uint8_t", SVEAddSubImmOperand8>;
193 def addsub_imm8_opt_lsl_i16 : imm8_opt_lsl<16, "uint16_t", SVEAddSubImmOperand16>;
194 def addsub_imm8_opt_lsl_i32 : imm8_opt_lsl<32, "uint32_t", SVEAddSubImmOperand32>;
195 def addsub_imm8_opt_lsl_i64 : imm8_opt_lsl<64, "uint64_t", SVEAddSubImmOperand64>;
197 def SVEAddSubImm8Pat : ComplexPattern<i32, 2, "SelectSVEAddSubImm<MVT::i8>", []>;
198 def SVEAddSubImm16Pat : ComplexPattern<i32, 2, "SelectSVEAddSubImm<MVT::i16>", []>;
199 def SVEAddSubImm32Pat : ComplexPattern<i32, 2, "SelectSVEAddSubImm<MVT::i32>", []>;
200 def SVEAddSubImm64Pat : ComplexPattern<i32, 2, "SelectSVEAddSubImm<MVT::i64>", []>;
202 def SVELogicalImm8Pat : ComplexPattern<i64, 1, "SelectSVELogicalImm<MVT::i8>", []>;
203 def SVELogicalImm16Pat : ComplexPattern<i64, 1, "SelectSVELogicalImm<MVT::i16>", []>;
204 def SVELogicalImm32Pat : ComplexPattern<i64, 1, "SelectSVELogicalImm<MVT::i32>", []>;
205 def SVELogicalImm64Pat : ComplexPattern<i64, 1, "SelectSVELogicalImm<MVT::i64>", []>;
207 def SVE8BitLslImm : ComplexPattern<i32, 2, "SelectSVE8BitLslImm", [imm]>;
209 def SVEArithUImmPat : ComplexPattern<i32, 1, "SelectSVEArithImm", []>;
210 def SVEArithSImmPat : ComplexPattern<i32, 1, "SelectSVESignedArithImm", []>;
212 def SVEShiftImm64 : ComplexPattern<i32, 1, "SelectSVEShiftImm64<0, 64>", []>;
214 class SVEExactFPImm<string Suffix, string ValA, string ValB> : AsmOperandClass {
215 let Name = "SVEExactFPImmOperand" # Suffix;
216 let DiagnosticType = "Invalid" # Name;
217 let ParserMethod = "tryParseFPImm<false>";
218 let PredicateMethod = "isExactFPImm<" # ValA # ", " # ValB # ">";
219 let RenderMethod = "addExactFPImmOperands<" # ValA # ", " # ValB # ">";
222 class SVEExactFPImmOperand<string Suffix, string ValA, string ValB> : Operand<i32> {
223 let PrintMethod = "printExactFPImm<" # ValA # ", " # ValB # ">";
224 let ParserMatchClass = SVEExactFPImm<Suffix, ValA, ValB>;
227 def sve_fpimm_half_one
228 : SVEExactFPImmOperand<"HalfOne", "AArch64ExactFPImm::half",
229 "AArch64ExactFPImm::one">;
230 def sve_fpimm_half_two
231 : SVEExactFPImmOperand<"HalfTwo", "AArch64ExactFPImm::half",
232 "AArch64ExactFPImm::two">;
233 def sve_fpimm_zero_one
234 : SVEExactFPImmOperand<"ZeroOne", "AArch64ExactFPImm::zero",
235 "AArch64ExactFPImm::one">;
237 def sve_incdec_imm : Operand<i32>, TImmLeaf<i32, [{
238 return (((uint32_t)Imm) > 0) && (((uint32_t)Imm) < 17);
240 let ParserMatchClass = Imm1_16Operand;
241 let EncoderMethod = "getSVEIncDecImm";
242 let DecoderMethod = "DecodeSVEIncDecImm";
245 // This allows i32 immediate extraction from i64 based arithmetic.
246 def sve_cnt_mul_imm : ComplexPattern<i32, 1, "SelectCntImm<1, 16, 1, false>">;
247 def sve_cnt_shl_imm : ComplexPattern<i32, 1, "SelectCntImm<1, 16, 1, true>">;
249 //===----------------------------------------------------------------------===//
250 // SVE PTrue - These are used extensively throughout the pattern matching so
251 // it's important we define them first.
252 //===----------------------------------------------------------------------===//
254 class sve_int_ptrue<bits<2> sz8_64, bits<3> opc, string asm, PPRRegOp pprty,
255 ValueType vt, SDPatternOperator op>
256 : I<(outs pprty:$Pd), (ins sve_pred_enum:$pattern),
257 asm, "\t$Pd, $pattern",
259 [(set (vt pprty:$Pd), (op sve_pred_enum:$pattern))]>, Sched<[]> {
262 let Inst{31-24} = 0b00100101;
263 let Inst{23-22} = sz8_64;
264 let Inst{21-19} = 0b011;
265 let Inst{18-17} = opc{2-1};
266 let Inst{16} = opc{0};
267 let Inst{15-10} = 0b111000;
268 let Inst{9-5} = pattern;
272 let Defs = !if(!eq (opc{0}, 1), [NZCV], []);
275 multiclass sve_int_ptrue<bits<3> opc, string asm, SDPatternOperator op> {
276 def _B : sve_int_ptrue<0b00, opc, asm, PPR8, nxv16i1, op>;
277 def _H : sve_int_ptrue<0b01, opc, asm, PPR16, nxv8i1, op>;
278 def _S : sve_int_ptrue<0b10, opc, asm, PPR32, nxv4i1, op>;
279 def _D : sve_int_ptrue<0b11, opc, asm, PPR64, nxv2i1, op>;
281 def : InstAlias<asm # "\t$Pd",
282 (!cast<Instruction>(NAME # _B) PPR8:$Pd, 0b11111), 1>;
283 def : InstAlias<asm # "\t$Pd",
284 (!cast<Instruction>(NAME # _H) PPR16:$Pd, 0b11111), 1>;
285 def : InstAlias<asm # "\t$Pd",
286 (!cast<Instruction>(NAME # _S) PPR32:$Pd, 0b11111), 1>;
287 def : InstAlias<asm # "\t$Pd",
288 (!cast<Instruction>(NAME # _D) PPR64:$Pd, 0b11111), 1>;
291 def SDT_AArch64PTrue : SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisVT<1, i32>]>;
292 def AArch64ptrue : SDNode<"AArch64ISD::PTRUE", SDT_AArch64PTrue>;
294 let Predicates = [HasSVE] in {
295 defm PTRUE : sve_int_ptrue<0b000, "ptrue", AArch64ptrue>;
296 defm PTRUES : sve_int_ptrue<0b001, "ptrues", null_frag>;
299 //===----------------------------------------------------------------------===//
300 // SVE pattern match helpers.
301 //===----------------------------------------------------------------------===//
303 class SVE_1_Op_Pat<ValueType vtd, SDPatternOperator op, ValueType vt1,
305 : Pat<(vtd (op vt1:$Op1)),
308 class SVE_1_Op_Imm_OptLsl_Reverse_Pat<ValueType vt, SDPatternOperator op, ZPRRegOp zprty,
309 ValueType it, ComplexPattern cpx, Instruction inst>
310 : Pat<(vt (op (vt (AArch64dup (it (cpx i32:$imm, i32:$shift)))), (vt zprty:$Op1))),
311 (inst $Op1, i32:$imm, i32:$shift)>;
313 class SVE_1_Op_Imm_OptLsl_Pat<ValueType vt, SDPatternOperator op, ZPRRegOp zprty,
314 ValueType it, ComplexPattern cpx, Instruction inst>
315 : Pat<(vt (op (vt zprty:$Op1), (vt (AArch64dup (it (cpx i32:$imm, i32:$shift)))))),
316 (inst $Op1, i32:$imm, i32:$shift)>;
318 class SVE_1_Op_Imm_Arith_Pat<ValueType vt, SDPatternOperator op, ZPRRegOp zprty,
319 ValueType it, ComplexPattern cpx, Instruction inst>
320 : Pat<(vt (op (vt zprty:$Op1), (vt (AArch64dup (it (cpx i32:$imm)))))),
321 (inst $Op1, i32:$imm)>;
323 class SVE_1_Op_Imm_Shift_Pred_Pat<ValueType vt, ValueType pt, SDPatternOperator op,
324 ZPRRegOp zprty, Operand ImmTy, Instruction inst>
325 : Pat<(vt (op (pt (AArch64ptrue 31)), (vt zprty:$Op1), (vt (AArch64dup (ImmTy:$imm))))),
326 (inst $Op1, ImmTy:$imm)>;
328 class SVE_1_Op_Imm_Arith_Pred_Pat<ValueType vt, ValueType pt, SDPatternOperator op,
329 ZPRRegOp zprty, ValueType it, ComplexPattern cpx, Instruction inst>
330 : Pat<(vt (op (pt (AArch64ptrue 31)), (vt zprty:$Op1), (vt (AArch64dup (it (cpx i32:$imm)))))),
331 (inst $Op1, i32:$imm)>;
333 class SVE_1_Op_Imm_Log_Pat<ValueType vt, SDPatternOperator op, ZPRRegOp zprty,
334 ValueType it, ComplexPattern cpx, Instruction inst>
335 : Pat<(vt (op (vt zprty:$Op1), (vt (AArch64dup (it (cpx i64:$imm)))))),
336 (inst $Op1, i64:$imm)>;
338 class SVE_2_Op_Pat<ValueType vtd, SDPatternOperator op, ValueType vt1,
339 ValueType vt2, Instruction inst>
340 : Pat<(vtd (op vt1:$Op1, vt2:$Op2)),
343 class SVE_2_Op_Pat_Reduce_To_Neon<ValueType vtd, SDPatternOperator op, ValueType vt1,
344 ValueType vt2, Instruction inst, SubRegIndex sub>
345 : Pat<(vtd (op vt1:$Op1, vt2:$Op2)),
346 (INSERT_SUBREG (vtd (IMPLICIT_DEF)), (inst $Op1, $Op2), sub)>;
348 class SVE_3_Op_Pat<ValueType vtd, SDPatternOperator op, ValueType vt1,
349 ValueType vt2, ValueType vt3, Instruction inst>
350 : Pat<(vtd (op vt1:$Op1, vt2:$Op2, vt3:$Op3)),
351 (inst $Op1, $Op2, $Op3)>;
353 class SVE_4_Op_Pat<ValueType vtd, SDPatternOperator op, ValueType vt1,
354 ValueType vt2, ValueType vt3, ValueType vt4,
356 : Pat<(vtd (op vt1:$Op1, vt2:$Op2, vt3:$Op3, vt4:$Op4)),
357 (inst $Op1, $Op2, $Op3, $Op4)>;
359 class SVE_2_Op_Imm_Pat<ValueType vtd, SDPatternOperator op, ValueType vt1,
360 ValueType vt2, Operand ImmTy, Instruction inst>
361 : Pat<(vtd (op vt1:$Op1, (vt2 ImmTy:$Op2))),
362 (inst $Op1, ImmTy:$Op2)>;
364 class SVE_3_Op_Imm_Pat<ValueType vtd, SDPatternOperator op, ValueType vt1,
365 ValueType vt2, ValueType vt3, Operand ImmTy,
367 : Pat<(vtd (op vt1:$Op1, vt2:$Op2, (vt3 ImmTy:$Op3))),
368 (inst $Op1, $Op2, ImmTy:$Op3)>;
370 class SVE_4_Op_Imm_Pat<ValueType vtd, SDPatternOperator op, ValueType vt1,
371 ValueType vt2, ValueType vt3, ValueType vt4,
372 Operand ImmTy, Instruction inst>
373 : Pat<(vtd (op vt1:$Op1, vt2:$Op2, vt3:$Op3, (vt4 ImmTy:$Op4))),
374 (inst $Op1, $Op2, $Op3, ImmTy:$Op4)>;
376 def SVEDup0 : ComplexPattern<i64, 0, "SelectDupZero", []>;
377 def SVEDup0Undef : ComplexPattern<i64, 0, "SelectDupZeroOrUndef", []>;
379 let AddedComplexity = 1 in {
380 class SVE_3_Op_Pat_SelZero<ValueType vtd, SDPatternOperator op, ValueType vt1,
381 ValueType vt2, ValueType vt3, Instruction inst>
382 : Pat<(vtd (vtd (op vt1:$Op1, (vselect vt1:$Op1, vt2:$Op2, (SVEDup0)), vt3:$Op3))),
383 (inst $Op1, $Op2, $Op3)>;
385 class SVE_3_Op_Pat_Shift_Imm_SelZero<ValueType vtd, SDPatternOperator op,
386 ValueType vt1, ValueType vt2,
387 Operand vt3, Instruction inst>
388 : Pat<(vtd (op vt1:$Op1, (vselect vt1:$Op1, vt2:$Op2, (SVEDup0)), (i32 (vt3:$Op3)))),
389 (inst $Op1, $Op2, vt3:$Op3)>;
393 // Common but less generic patterns.
396 class SVE_1_Op_AllActive_Pat<ValueType vtd, SDPatternOperator op, ValueType vt1,
397 Instruction inst, Instruction ptrue>
398 : Pat<(vtd (op vt1:$Op1)),
399 (inst (IMPLICIT_DEF), (ptrue 31), $Op1)>;
401 class SVE_2_Op_AllActive_Pat<ValueType vtd, SDPatternOperator op, ValueType vt1,
402 ValueType vt2, Instruction inst, Instruction ptrue>
403 : Pat<(vtd (op vt1:$Op1, vt2:$Op2)),
404 (inst (ptrue 31), $Op1, $Op2)>;
407 // Pseudo -> Instruction mappings
409 def getSVEPseudoMap : InstrMapping {
410 let FilterClass = "SVEPseudo2Instr";
411 let RowFields = ["PseudoName"];
412 let ColFields = ["IsInstr"];
414 let ValueCols = [["1"]];
417 class SVEPseudo2Instr<string name, bit instr> {
418 string PseudoName = name;
422 // Lookup e.g. DIV -> DIVR
423 def getSVERevInstr : InstrMapping {
424 let FilterClass = "SVEInstr2Rev";
425 let RowFields = ["InstrName"];
426 let ColFields = ["isReverseInstr"];
428 let ValueCols = [["1"]];
431 // Lookup e.g. DIVR -> DIV
432 def getSVENonRevInstr : InstrMapping {
433 let FilterClass = "SVEInstr2Rev";
434 let RowFields = ["InstrName"];
435 let ColFields = ["isReverseInstr"];
437 let ValueCols = [["0"]];
440 class SVEInstr2Rev<string name1, string name2, bit name1IsReverseInstr> {
441 string InstrName = !if(name1IsReverseInstr, name1, name2);
442 bit isReverseInstr = name1IsReverseInstr;
446 // Pseudos for destructive operands
448 let hasNoSchedulingInfo = 1 in {
449 class PredTwoOpPseudo<string name, ZPRRegOp zprty,
450 FalseLanesEnum flags = FalseLanesNone>
451 : SVEPseudo2Instr<name, 0>,
452 Pseudo<(outs zprty:$Zd), (ins PPR3bAny:$Pg, zprty:$Zs1, zprty:$Zs2), []> {
453 let FalseLanes = flags;
456 class PredTwoOpImmPseudo<string name, ZPRRegOp zprty, Operand immty,
457 FalseLanesEnum flags = FalseLanesNone>
458 : SVEPseudo2Instr<name, 0>,
459 Pseudo<(outs zprty:$Zd), (ins PPR3bAny:$Pg, zprty:$Zs1, immty:$imm), []> {
460 let FalseLanes = flags;
464 //===----------------------------------------------------------------------===//
465 // SVE Predicate Misc Group
466 //===----------------------------------------------------------------------===//
468 class sve_int_pfalse<bits<6> opc, string asm>
469 : I<(outs PPR8:$Pd), (ins),
474 let Inst{31-24} = 0b00100101;
475 let Inst{23-22} = opc{5-4};
476 let Inst{21-19} = 0b011;
477 let Inst{18-16} = opc{3-1};
478 let Inst{15-10} = 0b111001;
479 let Inst{9} = opc{0};
480 let Inst{8-4} = 0b00000;
484 class sve_int_ptest<bits<6> opc, string asm>
485 : I<(outs), (ins PPRAny:$Pg, PPR8:$Pn),
491 let Inst{31-24} = 0b00100101;
492 let Inst{23-22} = opc{5-4};
493 let Inst{21-19} = 0b010;
494 let Inst{18-16} = opc{3-1};
495 let Inst{15-14} = 0b11;
496 let Inst{13-10} = Pg;
497 let Inst{9} = opc{0};
499 let Inst{4-0} = 0b00000;
504 class sve_int_pfirst_next<bits<2> sz8_64, bits<5> opc, string asm,
506 : I<(outs pprty:$Pdn), (ins PPRAny:$Pg, pprty:$_Pdn),
507 asm, "\t$Pdn, $Pg, $_Pdn",
512 let Inst{31-24} = 0b00100101;
513 let Inst{23-22} = sz8_64;
514 let Inst{21-19} = 0b011;
515 let Inst{18-16} = opc{4-2};
516 let Inst{15-11} = 0b11000;
517 let Inst{10-9} = opc{1-0};
522 let Constraints = "$Pdn = $_Pdn";
526 multiclass sve_int_pfirst<bits<5> opc, string asm, SDPatternOperator op> {
527 def _B : sve_int_pfirst_next<0b01, opc, asm, PPR8>;
529 def : SVE_2_Op_Pat<nxv16i1, op, nxv16i1, nxv16i1, !cast<Instruction>(NAME # _B)>;
532 multiclass sve_int_pnext<bits<5> opc, string asm, SDPatternOperator op> {
533 def _B : sve_int_pfirst_next<0b00, opc, asm, PPR8>;
534 def _H : sve_int_pfirst_next<0b01, opc, asm, PPR16>;
535 def _S : sve_int_pfirst_next<0b10, opc, asm, PPR32>;
536 def _D : sve_int_pfirst_next<0b11, opc, asm, PPR64>;
538 def : SVE_2_Op_Pat<nxv16i1, op, nxv16i1, nxv16i1, !cast<Instruction>(NAME # _B)>;
539 def : SVE_2_Op_Pat<nxv8i1, op, nxv8i1, nxv8i1, !cast<Instruction>(NAME # _H)>;
540 def : SVE_2_Op_Pat<nxv4i1, op, nxv4i1, nxv4i1, !cast<Instruction>(NAME # _S)>;
541 def : SVE_2_Op_Pat<nxv2i1, op, nxv2i1, nxv2i1, !cast<Instruction>(NAME # _D)>;
544 //===----------------------------------------------------------------------===//
545 // SVE Predicate Count Group
546 //===----------------------------------------------------------------------===//
548 class sve_int_count_r<bits<2> sz8_64, bits<5> opc, string asm,
549 RegisterOperand dty, PPRRegOp pprty, RegisterOperand sty>
550 : I<(outs dty:$Rdn), (ins pprty:$Pg, sty:$_Rdn),
556 let Inst{31-24} = 0b00100101;
557 let Inst{23-22} = sz8_64;
558 let Inst{21-19} = 0b101;
559 let Inst{18-16} = opc{4-2};
560 let Inst{15-11} = 0b10001;
561 let Inst{10-9} = opc{1-0};
565 // Signed 32bit forms require their GPR operand printed.
566 let AsmString = !if(!eq(opc{4,2-0}, 0b0000),
567 !strconcat(asm, "\t$Rdn, $Pg, $_Rdn"),
568 !strconcat(asm, "\t$Rdn, $Pg"));
569 let Constraints = "$Rdn = $_Rdn";
572 multiclass sve_int_count_r_s32<bits<5> opc, string asm,
573 SDPatternOperator op> {
574 def _B : sve_int_count_r<0b00, opc, asm, GPR64z, PPR8, GPR64as32>;
575 def _H : sve_int_count_r<0b01, opc, asm, GPR64z, PPR16, GPR64as32>;
576 def _S : sve_int_count_r<0b10, opc, asm, GPR64z, PPR32, GPR64as32>;
577 def _D : sve_int_count_r<0b11, opc, asm, GPR64z, PPR64, GPR64as32>;
579 def : Pat<(i32 (op GPR32:$Rn, (nxv16i1 PPRAny:$Pg))),
580 (EXTRACT_SUBREG (!cast<Instruction>(NAME # _B) PPRAny:$Pg, (INSERT_SUBREG (IMPLICIT_DEF), $Rn, sub_32)), sub_32)>;
581 def : Pat<(i64 (sext (i32 (op GPR32:$Rn, (nxv16i1 PPRAny:$Pg))))),
582 (!cast<Instruction>(NAME # _B) PPRAny:$Pg, (INSERT_SUBREG (IMPLICIT_DEF), $Rn, sub_32))>;
584 def : Pat<(i32 (op GPR32:$Rn, (nxv8i1 PPRAny:$Pg))),
585 (EXTRACT_SUBREG (!cast<Instruction>(NAME # _H) PPRAny:$Pg, (INSERT_SUBREG (IMPLICIT_DEF), $Rn, sub_32)), sub_32)>;
586 def : Pat<(i64 (sext (i32 (op GPR32:$Rn, (nxv8i1 PPRAny:$Pg))))),
587 (!cast<Instruction>(NAME # _H) PPRAny:$Pg, (INSERT_SUBREG (IMPLICIT_DEF), $Rn, sub_32))>;
589 def : Pat<(i32 (op GPR32:$Rn, (nxv4i1 PPRAny:$Pg))),
590 (EXTRACT_SUBREG (!cast<Instruction>(NAME # _S) PPRAny:$Pg, (INSERT_SUBREG (IMPLICIT_DEF), $Rn, sub_32)), sub_32)>;
591 def : Pat<(i64 (sext (i32 (op GPR32:$Rn, (nxv4i1 PPRAny:$Pg))))),
592 (!cast<Instruction>(NAME # _S) PPRAny:$Pg, (INSERT_SUBREG (IMPLICIT_DEF), $Rn, sub_32))>;
594 def : Pat<(i32 (op GPR32:$Rn, (nxv2i1 PPRAny:$Pg))),
595 (EXTRACT_SUBREG (!cast<Instruction>(NAME # _D) PPRAny:$Pg, (INSERT_SUBREG (IMPLICIT_DEF), $Rn, sub_32)), sub_32)>;
596 def : Pat<(i64 (sext (i32 (op GPR32:$Rn, (nxv2i1 PPRAny:$Pg))))),
597 (!cast<Instruction>(NAME # _D) PPRAny:$Pg, (INSERT_SUBREG (IMPLICIT_DEF), $Rn, sub_32))>;
600 multiclass sve_int_count_r_u32<bits<5> opc, string asm,
601 SDPatternOperator op> {
602 def _B : sve_int_count_r<0b00, opc, asm, GPR32z, PPR8, GPR32z>;
603 def _H : sve_int_count_r<0b01, opc, asm, GPR32z, PPR16, GPR32z>;
604 def _S : sve_int_count_r<0b10, opc, asm, GPR32z, PPR32, GPR32z>;
605 def _D : sve_int_count_r<0b11, opc, asm, GPR32z, PPR64, GPR32z>;
607 def : Pat<(i32 (op GPR32:$Rn, (nxv16i1 PPRAny:$Pg))),
608 (!cast<Instruction>(NAME # _B) PPRAny:$Pg, $Rn)>;
609 def : Pat<(i32 (op GPR32:$Rn, (nxv8i1 PPRAny:$Pg))),
610 (!cast<Instruction>(NAME # _H) PPRAny:$Pg, $Rn)>;
611 def : Pat<(i32 (op GPR32:$Rn, (nxv4i1 PPRAny:$Pg))),
612 (!cast<Instruction>(NAME # _S) PPRAny:$Pg, $Rn)>;
613 def : Pat<(i32 (op GPR32:$Rn, (nxv2i1 PPRAny:$Pg))),
614 (!cast<Instruction>(NAME # _D) PPRAny:$Pg, $Rn)>;
617 multiclass sve_int_count_r_x64<bits<5> opc, string asm,
618 SDPatternOperator op = null_frag> {
619 def _B : sve_int_count_r<0b00, opc, asm, GPR64z, PPR8, GPR64z>;
620 def _H : sve_int_count_r<0b01, opc, asm, GPR64z, PPR16, GPR64z>;
621 def _S : sve_int_count_r<0b10, opc, asm, GPR64z, PPR32, GPR64z>;
622 def _D : sve_int_count_r<0b11, opc, asm, GPR64z, PPR64, GPR64z>;
624 def : Pat<(i64 (op GPR64:$Rn, (nxv16i1 PPRAny:$Pg))),
625 (!cast<Instruction>(NAME # _B) PPRAny:$Pg, $Rn)>;
626 def : Pat<(i64 (op GPR64:$Rn, (nxv8i1 PPRAny:$Pg))),
627 (!cast<Instruction>(NAME # _H) PPRAny:$Pg, $Rn)>;
628 def : Pat<(i64 (op GPR64:$Rn, (nxv4i1 PPRAny:$Pg))),
629 (!cast<Instruction>(NAME # _S) PPRAny:$Pg, $Rn)>;
630 def : Pat<(i64 (op GPR64:$Rn, (nxv2i1 PPRAny:$Pg))),
631 (!cast<Instruction>(NAME # _D) PPRAny:$Pg, $Rn)>;
634 class sve_int_count_v<bits<2> sz8_64, bits<5> opc, string asm,
635 ZPRRegOp zprty, PPRRegOp pprty>
636 : I<(outs zprty:$Zdn), (ins zprty:$_Zdn, pprty:$Pm),
642 let Inst{31-24} = 0b00100101;
643 let Inst{23-22} = sz8_64;
644 let Inst{21-19} = 0b101;
645 let Inst{18-16} = opc{4-2};
646 let Inst{15-11} = 0b10000;
647 let Inst{10-9} = opc{1-0};
651 let Constraints = "$Zdn = $_Zdn";
652 let DestructiveInstType = DestructiveOther;
653 let ElementSize = ElementSizeNone;
656 multiclass sve_int_count_v<bits<5> opc, string asm,
657 SDPatternOperator op = null_frag> {
658 def _H : sve_int_count_v<0b01, opc, asm, ZPR16, PPR16>;
659 def _S : sve_int_count_v<0b10, opc, asm, ZPR32, PPR32>;
660 def _D : sve_int_count_v<0b11, opc, asm, ZPR64, PPR64>;
662 def : SVE_2_Op_Pat<nxv8i16, op, nxv8i16, nxv8i1, !cast<Instruction>(NAME # _H)>;
663 def : SVE_2_Op_Pat<nxv4i32, op, nxv4i32, nxv4i1, !cast<Instruction>(NAME # _S)>;
664 def : SVE_2_Op_Pat<nxv2i64, op, nxv2i64, nxv2i1, !cast<Instruction>(NAME # _D)>;
666 def : InstAlias<asm # "\t$Zdn, $Pm",
667 (!cast<Instruction>(NAME # "_H") ZPR16:$Zdn, PPRAny:$Pm), 0>;
668 def : InstAlias<asm # "\t$Zdn, $Pm",
669 (!cast<Instruction>(NAME # "_S") ZPR32:$Zdn, PPRAny:$Pm), 0>;
670 def : InstAlias<asm # "\t$Zdn, $Pm",
671 (!cast<Instruction>(NAME # "_D") ZPR64:$Zdn, PPRAny:$Pm), 0>;
674 class sve_int_pcount_pred<bits<2> sz8_64, bits<4> opc, string asm,
676 : I<(outs GPR64:$Rd), (ins PPRAny:$Pg, pprty:$Pn),
677 asm, "\t$Rd, $Pg, $Pn",
683 let Inst{31-24} = 0b00100101;
684 let Inst{23-22} = sz8_64;
685 let Inst{21-19} = 0b100;
686 let Inst{18-16} = opc{3-1};
687 let Inst{15-14} = 0b10;
688 let Inst{13-10} = Pg;
689 let Inst{9} = opc{0};
694 multiclass sve_int_pcount_pred<bits<4> opc, string asm,
695 SDPatternOperator int_op> {
696 def _B : sve_int_pcount_pred<0b00, opc, asm, PPR8>;
697 def _H : sve_int_pcount_pred<0b01, opc, asm, PPR16>;
698 def _S : sve_int_pcount_pred<0b10, opc, asm, PPR32>;
699 def _D : sve_int_pcount_pred<0b11, opc, asm, PPR64>;
701 def : SVE_2_Op_Pat<i64, int_op, nxv16i1, nxv16i1, !cast<Instruction>(NAME # _B)>;
702 def : SVE_2_Op_Pat<i64, int_op, nxv8i1, nxv8i1, !cast<Instruction>(NAME # _H)>;
703 def : SVE_2_Op_Pat<i64, int_op, nxv4i1, nxv4i1, !cast<Instruction>(NAME # _S)>;
704 def : SVE_2_Op_Pat<i64, int_op, nxv2i1, nxv2i1, !cast<Instruction>(NAME # _D)>;
707 //===----------------------------------------------------------------------===//
708 // SVE Element Count Group
709 //===----------------------------------------------------------------------===//
711 class sve_int_count<bits<3> opc, string asm>
712 : I<(outs GPR64:$Rd), (ins sve_pred_enum:$pattern, sve_incdec_imm:$imm4),
713 asm, "\t$Rd, $pattern, mul $imm4",
719 let Inst{31-24} = 0b00000100;
720 let Inst{23-22} = opc{2-1};
721 let Inst{21-20} = 0b10;
722 let Inst{19-16} = imm4;
723 let Inst{15-11} = 0b11100;
724 let Inst{10} = opc{0};
725 let Inst{9-5} = pattern;
729 multiclass sve_int_count<bits<3> opc, string asm, SDPatternOperator op> {
730 def NAME : sve_int_count<opc, asm>;
732 def : InstAlias<asm # "\t$Rd, $pattern",
733 (!cast<Instruction>(NAME) GPR64:$Rd, sve_pred_enum:$pattern, 1), 1>;
734 def : InstAlias<asm # "\t$Rd",
735 (!cast<Instruction>(NAME) GPR64:$Rd, 0b11111, 1), 2>;
737 def : Pat<(i64 (mul (op sve_pred_enum:$pattern), (sve_cnt_mul_imm i32:$imm))),
738 (!cast<Instruction>(NAME) sve_pred_enum:$pattern, sve_incdec_imm:$imm)>;
740 def : Pat<(i64 (shl (op sve_pred_enum:$pattern), (i64 (sve_cnt_shl_imm i32:$imm)))),
741 (!cast<Instruction>(NAME) sve_pred_enum:$pattern, sve_incdec_imm:$imm)>;
743 def : Pat<(i64 (op sve_pred_enum:$pattern)),
744 (!cast<Instruction>(NAME) sve_pred_enum:$pattern, 1)>;
747 class sve_int_countvlv<bits<5> opc, string asm, ZPRRegOp zprty>
748 : I<(outs zprty:$Zdn), (ins zprty:$_Zdn, sve_pred_enum:$pattern, sve_incdec_imm:$imm4),
749 asm, "\t$Zdn, $pattern, mul $imm4",
755 let Inst{31-24} = 0b00000100;
756 let Inst{23-22} = opc{4-3};
758 let Inst{20} = opc{2};
759 let Inst{19-16} = imm4;
760 let Inst{15-12} = 0b1100;
761 let Inst{11-10} = opc{1-0};
762 let Inst{9-5} = pattern;
765 let Constraints = "$Zdn = $_Zdn";
766 let DestructiveInstType = DestructiveOther;
767 let ElementSize = ElementSizeNone;
770 multiclass sve_int_countvlv<bits<5> opc, string asm, ZPRRegOp zprty,
771 SDPatternOperator op = null_frag,
772 ValueType vt = OtherVT> {
773 def NAME : sve_int_countvlv<opc, asm, zprty>;
775 def : InstAlias<asm # "\t$Zdn, $pattern",
776 (!cast<Instruction>(NAME) zprty:$Zdn, sve_pred_enum:$pattern, 1), 1>;
777 def : InstAlias<asm # "\t$Zdn",
778 (!cast<Instruction>(NAME) zprty:$Zdn, 0b11111, 1), 2>;
780 def : Pat<(vt (op (vt zprty:$Zn), (sve_pred_enum:$pattern), (sve_incdec_imm:$imm4))),
781 (!cast<Instruction>(NAME) $Zn, sve_pred_enum:$pattern, sve_incdec_imm:$imm4)>;
784 class sve_int_pred_pattern_a<bits<3> opc, string asm>
785 : I<(outs GPR64:$Rdn), (ins GPR64:$_Rdn, sve_pred_enum:$pattern, sve_incdec_imm:$imm4),
786 asm, "\t$Rdn, $pattern, mul $imm4",
792 let Inst{31-24} = 0b00000100;
793 let Inst{23-22} = opc{2-1};
794 let Inst{21-20} = 0b11;
795 let Inst{19-16} = imm4;
796 let Inst{15-11} = 0b11100;
797 let Inst{10} = opc{0};
798 let Inst{9-5} = pattern;
801 let Constraints = "$Rdn = $_Rdn";
804 multiclass sve_int_pred_pattern_a<bits<3> opc, string asm> {
805 def NAME : sve_int_pred_pattern_a<opc, asm>;
807 def : InstAlias<asm # "\t$Rdn, $pattern",
808 (!cast<Instruction>(NAME) GPR64:$Rdn, sve_pred_enum:$pattern, 1), 1>;
809 def : InstAlias<asm # "\t$Rdn",
810 (!cast<Instruction>(NAME) GPR64:$Rdn, 0b11111, 1), 2>;
813 class sve_int_pred_pattern_b<bits<5> opc, string asm, RegisterOperand dt,
815 : I<(outs dt:$Rdn), (ins st:$_Rdn, sve_pred_enum:$pattern, sve_incdec_imm:$imm4),
816 asm, "\t$Rdn, $pattern, mul $imm4",
822 let Inst{31-24} = 0b00000100;
823 let Inst{23-22} = opc{4-3};
825 let Inst{20} = opc{2};
826 let Inst{19-16} = imm4;
827 let Inst{15-12} = 0b1111;
828 let Inst{11-10} = opc{1-0};
829 let Inst{9-5} = pattern;
832 // Signed 32bit forms require their GPR operand printed.
833 let AsmString = !if(!eq(opc{2,0}, 0b00),
834 !strconcat(asm, "\t$Rdn, $_Rdn, $pattern, mul $imm4"),
835 !strconcat(asm, "\t$Rdn, $pattern, mul $imm4"));
837 let Constraints = "$Rdn = $_Rdn";
840 multiclass sve_int_pred_pattern_b_s32<bits<5> opc, string asm,
841 SDPatternOperator op> {
842 def NAME : sve_int_pred_pattern_b<opc, asm, GPR64z, GPR64as32>;
844 def : InstAlias<asm # "\t$Rd, $Rn, $pattern",
845 (!cast<Instruction>(NAME) GPR64z:$Rd, GPR64as32:$Rn, sve_pred_enum:$pattern, 1), 1>;
846 def : InstAlias<asm # "\t$Rd, $Rn",
847 (!cast<Instruction>(NAME) GPR64z:$Rd, GPR64as32:$Rn, 0b11111, 1), 2>;
849 // NOTE: Register allocation doesn't like tied operands of differing register
850 // class, hence the extra INSERT_SUBREG complication.
852 def : Pat<(i32 (op GPR32:$Rn, (sve_pred_enum:$pattern), (sve_incdec_imm:$imm4))),
853 (EXTRACT_SUBREG (!cast<Instruction>(NAME) (INSERT_SUBREG (IMPLICIT_DEF), $Rn, sub_32), sve_pred_enum:$pattern, sve_incdec_imm:$imm4), sub_32)>;
854 def : Pat<(i64 (sext (i32 (op GPR32:$Rn, (sve_pred_enum:$pattern), (sve_incdec_imm:$imm4))))),
855 (!cast<Instruction>(NAME) (INSERT_SUBREG (IMPLICIT_DEF), $Rn, sub_32), sve_pred_enum:$pattern, sve_incdec_imm:$imm4)>;
858 multiclass sve_int_pred_pattern_b_u32<bits<5> opc, string asm,
859 SDPatternOperator op> {
860 def NAME : sve_int_pred_pattern_b<opc, asm, GPR32z, GPR32z>;
862 def : InstAlias<asm # "\t$Rdn, $pattern",
863 (!cast<Instruction>(NAME) GPR32z:$Rdn, sve_pred_enum:$pattern, 1), 1>;
864 def : InstAlias<asm # "\t$Rdn",
865 (!cast<Instruction>(NAME) GPR32z:$Rdn, 0b11111, 1), 2>;
867 def : Pat<(i32 (op GPR32:$Rn, (sve_pred_enum:$pattern), (sve_incdec_imm:$imm4))),
868 (!cast<Instruction>(NAME) $Rn, sve_pred_enum:$pattern, sve_incdec_imm:$imm4)>;
871 multiclass sve_int_pred_pattern_b_x64<bits<5> opc, string asm,
872 SDPatternOperator op> {
873 def NAME : sve_int_pred_pattern_b<opc, asm, GPR64z, GPR64z>;
875 def : InstAlias<asm # "\t$Rdn, $pattern",
876 (!cast<Instruction>(NAME) GPR64z:$Rdn, sve_pred_enum:$pattern, 1), 1>;
877 def : InstAlias<asm # "\t$Rdn",
878 (!cast<Instruction>(NAME) GPR64z:$Rdn, 0b11111, 1), 2>;
880 def : Pat<(i64 (op GPR64:$Rn, (sve_pred_enum:$pattern), (sve_incdec_imm:$imm4))),
881 (!cast<Instruction>(NAME) $Rn, sve_pred_enum:$pattern, sve_incdec_imm:$imm4)>;
885 //===----------------------------------------------------------------------===//
886 // SVE Permute - Cross Lane Group
887 //===----------------------------------------------------------------------===//
889 class sve_int_perm_dup_r<bits<2> sz8_64, string asm, ZPRRegOp zprty,
890 ValueType vt, RegisterClass srcRegType,
891 SDPatternOperator op>
892 : I<(outs zprty:$Zd), (ins srcRegType:$Rn),
895 [(set (vt zprty:$Zd), (op srcRegType:$Rn))]>, Sched<[]> {
898 let Inst{31-24} = 0b00000101;
899 let Inst{23-22} = sz8_64;
900 let Inst{21-10} = 0b100000001110;
905 multiclass sve_int_perm_dup_r<string asm, SDPatternOperator op> {
906 def _B : sve_int_perm_dup_r<0b00, asm, ZPR8, nxv16i8, GPR32sp, op>;
907 def _H : sve_int_perm_dup_r<0b01, asm, ZPR16, nxv8i16, GPR32sp, op>;
908 def _S : sve_int_perm_dup_r<0b10, asm, ZPR32, nxv4i32, GPR32sp, op>;
909 def _D : sve_int_perm_dup_r<0b11, asm, ZPR64, nxv2i64, GPR64sp, op>;
911 def : InstAlias<"mov $Zd, $Rn",
912 (!cast<Instruction>(NAME # _B) ZPR8:$Zd, GPR32sp:$Rn), 1>;
913 def : InstAlias<"mov $Zd, $Rn",
914 (!cast<Instruction>(NAME # _H) ZPR16:$Zd, GPR32sp:$Rn), 1>;
915 def : InstAlias<"mov $Zd, $Rn",
916 (!cast<Instruction>(NAME # _S) ZPR32:$Zd, GPR32sp:$Rn), 1>;
917 def : InstAlias<"mov $Zd, $Rn",
918 (!cast<Instruction>(NAME # _D) ZPR64:$Zd, GPR64sp:$Rn), 1>;
921 class sve_int_perm_dup_i<bits<5> tsz, Operand immtype, string asm,
923 : I<(outs zprty:$Zd), (ins zprty:$Zn, immtype:$idx),
924 asm, "\t$Zd, $Zn$idx",
930 let Inst{31-24} = 0b00000101;
931 let Inst{23-22} = {?,?}; // imm3h
933 let Inst{20-16} = tsz;
934 let Inst{15-10} = 0b001000;
939 multiclass sve_int_perm_dup_i<string asm> {
940 def _B : sve_int_perm_dup_i<{?,?,?,?,1}, sve_elm_idx_extdup_b, asm, ZPR8> {
941 let Inst{23-22} = idx{5-4};
942 let Inst{20-17} = idx{3-0};
944 def _H : sve_int_perm_dup_i<{?,?,?,1,0}, sve_elm_idx_extdup_h, asm, ZPR16> {
945 let Inst{23-22} = idx{4-3};
946 let Inst{20-18} = idx{2-0};
948 def _S : sve_int_perm_dup_i<{?,?,1,0,0}, sve_elm_idx_extdup_s, asm, ZPR32> {
949 let Inst{23-22} = idx{3-2};
950 let Inst{20-19} = idx{1-0};
952 def _D : sve_int_perm_dup_i<{?,1,0,0,0}, sve_elm_idx_extdup_d, asm, ZPR64> {
953 let Inst{23-22} = idx{2-1};
954 let Inst{20} = idx{0};
956 def _Q : sve_int_perm_dup_i<{1,0,0,0,0}, sve_elm_idx_extdup_q, asm, ZPR128> {
957 let Inst{23-22} = idx{1-0};
960 def : InstAlias<"mov $Zd, $Zn$idx",
961 (!cast<Instruction>(NAME # _B) ZPR8:$Zd, ZPR8:$Zn, sve_elm_idx_extdup_b:$idx), 1>;
962 def : InstAlias<"mov $Zd, $Zn$idx",
963 (!cast<Instruction>(NAME # _H) ZPR16:$Zd, ZPR16:$Zn, sve_elm_idx_extdup_h:$idx), 1>;
964 def : InstAlias<"mov $Zd, $Zn$idx",
965 (!cast<Instruction>(NAME # _S) ZPR32:$Zd, ZPR32:$Zn, sve_elm_idx_extdup_s:$idx), 1>;
966 def : InstAlias<"mov $Zd, $Zn$idx",
967 (!cast<Instruction>(NAME # _D) ZPR64:$Zd, ZPR64:$Zn, sve_elm_idx_extdup_d:$idx), 1>;
968 def : InstAlias<"mov $Zd, $Zn$idx",
969 (!cast<Instruction>(NAME # _Q) ZPR128:$Zd, ZPR128:$Zn, sve_elm_idx_extdup_q:$idx), 1>;
970 def : InstAlias<"mov $Zd, $Bn",
971 (!cast<Instruction>(NAME # _B) ZPR8:$Zd, FPR8asZPR:$Bn, 0), 2>;
972 def : InstAlias<"mov $Zd, $Hn",
973 (!cast<Instruction>(NAME # _H) ZPR16:$Zd, FPR16asZPR:$Hn, 0), 2>;
974 def : InstAlias<"mov $Zd, $Sn",
975 (!cast<Instruction>(NAME # _S) ZPR32:$Zd, FPR32asZPR:$Sn, 0), 2>;
976 def : InstAlias<"mov $Zd, $Dn",
977 (!cast<Instruction>(NAME # _D) ZPR64:$Zd, FPR64asZPR:$Dn, 0), 2>;
978 def : InstAlias<"mov $Zd, $Qn",
979 (!cast<Instruction>(NAME # _Q) ZPR128:$Zd, FPR128asZPR:$Qn, 0), 2>;
982 class sve_int_perm_tbl<bits<2> sz8_64, bits<2> opc, string asm,
983 ZPRRegOp zprty, RegisterOperand VecList>
984 : I<(outs zprty:$Zd), (ins VecList:$Zn, zprty:$Zm),
985 asm, "\t$Zd, $Zn, $Zm",
991 let Inst{31-24} = 0b00000101;
992 let Inst{23-22} = sz8_64;
994 let Inst{20-16} = Zm;
995 let Inst{15-13} = 0b001;
996 let Inst{12-11} = opc;
1002 multiclass sve_int_perm_tbl<string asm, SDPatternOperator op> {
1003 def _B : sve_int_perm_tbl<0b00, 0b10, asm, ZPR8, Z_b>;
1004 def _H : sve_int_perm_tbl<0b01, 0b10, asm, ZPR16, Z_h>;
1005 def _S : sve_int_perm_tbl<0b10, 0b10, asm, ZPR32, Z_s>;
1006 def _D : sve_int_perm_tbl<0b11, 0b10, asm, ZPR64, Z_d>;
1008 def : InstAlias<asm # "\t$Zd, $Zn, $Zm",
1009 (!cast<Instruction>(NAME # _B) ZPR8:$Zd, ZPR8:$Zn, ZPR8:$Zm), 0>;
1010 def : InstAlias<asm # "\t$Zd, $Zn, $Zm",
1011 (!cast<Instruction>(NAME # _H) ZPR16:$Zd, ZPR16:$Zn, ZPR16:$Zm), 0>;
1012 def : InstAlias<asm # "\t$Zd, $Zn, $Zm",
1013 (!cast<Instruction>(NAME # _S) ZPR32:$Zd, ZPR32:$Zn, ZPR32:$Zm), 0>;
1014 def : InstAlias<asm # "\t$Zd, $Zn, $Zm",
1015 (!cast<Instruction>(NAME # _D) ZPR64:$Zd, ZPR64:$Zn, ZPR64:$Zm), 0>;
1017 def : SVE_2_Op_Pat<nxv16i8, op, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
1018 def : SVE_2_Op_Pat<nxv8i16, op, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
1019 def : SVE_2_Op_Pat<nxv4i32, op, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
1020 def : SVE_2_Op_Pat<nxv2i64, op, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
1022 def : SVE_2_Op_Pat<nxv8f16, op, nxv8f16, nxv8i16, !cast<Instruction>(NAME # _H)>;
1023 def : SVE_2_Op_Pat<nxv4f32, op, nxv4f32, nxv4i32, !cast<Instruction>(NAME # _S)>;
1024 def : SVE_2_Op_Pat<nxv2f64, op, nxv2f64, nxv2i64, !cast<Instruction>(NAME # _D)>;
1027 multiclass sve2_int_perm_tbl<string asm, SDPatternOperator op> {
1028 def _B : sve_int_perm_tbl<0b00, 0b01, asm, ZPR8, ZZ_b>;
1029 def _H : sve_int_perm_tbl<0b01, 0b01, asm, ZPR16, ZZ_h>;
1030 def _S : sve_int_perm_tbl<0b10, 0b01, asm, ZPR32, ZZ_s>;
1031 def _D : sve_int_perm_tbl<0b11, 0b01, asm, ZPR64, ZZ_d>;
1033 def : Pat<(nxv16i8 (op nxv16i8:$Op1, nxv16i8:$Op2, nxv16i8:$Op3)),
1034 (nxv16i8 (!cast<Instruction>(NAME # _B) (REG_SEQUENCE ZPR2, nxv16i8:$Op1, zsub0,
1035 nxv16i8:$Op2, zsub1),
1038 def : Pat<(nxv8i16 (op nxv8i16:$Op1, nxv8i16:$Op2, nxv8i16:$Op3)),
1039 (nxv8i16 (!cast<Instruction>(NAME # _H) (REG_SEQUENCE ZPR2, nxv8i16:$Op1, zsub0,
1040 nxv8i16:$Op2, zsub1),
1043 def : Pat<(nxv4i32 (op nxv4i32:$Op1, nxv4i32:$Op2, nxv4i32:$Op3)),
1044 (nxv4i32 (!cast<Instruction>(NAME # _S) (REG_SEQUENCE ZPR2, nxv4i32:$Op1, zsub0,
1045 nxv4i32:$Op2, zsub1),
1048 def : Pat<(nxv2i64 (op nxv2i64:$Op1, nxv2i64:$Op2, nxv2i64:$Op3)),
1049 (nxv2i64 (!cast<Instruction>(NAME # _D) (REG_SEQUENCE ZPR2, nxv2i64:$Op1, zsub0,
1050 nxv2i64:$Op2, zsub1),
1053 def : Pat<(nxv8f16 (op nxv8f16:$Op1, nxv8f16:$Op2, nxv8i16:$Op3)),
1054 (nxv8f16 (!cast<Instruction>(NAME # _H) (REG_SEQUENCE ZPR2, nxv8f16:$Op1, zsub0,
1055 nxv8f16:$Op2, zsub1),
1058 def : Pat<(nxv4f32 (op nxv4f32:$Op1, nxv4f32:$Op2, nxv4i32:$Op3)),
1059 (nxv4f32 (!cast<Instruction>(NAME # _S) (REG_SEQUENCE ZPR2, nxv4f32:$Op1, zsub0,
1060 nxv4f32:$Op2, zsub1),
1063 def : Pat<(nxv2f64 (op nxv2f64:$Op1, nxv2f64:$Op2, nxv2i64:$Op3)),
1064 (nxv2f64 (!cast<Instruction>(NAME # _D) (REG_SEQUENCE ZPR2, nxv2f64:$Op1, zsub0,
1065 nxv2f64:$Op2, zsub1),
1069 class sve2_int_perm_tbx<bits<2> sz8_64, string asm, ZPRRegOp zprty>
1070 : I<(outs zprty:$Zd), (ins zprty:$_Zd, zprty:$Zn, zprty:$Zm),
1071 asm, "\t$Zd, $Zn, $Zm",
1077 let Inst{31-24} = 0b00000101;
1078 let Inst{23-22} = sz8_64;
1080 let Inst{20-16} = Zm;
1081 let Inst{15-10} = 0b001011;
1085 let Constraints = "$Zd = $_Zd";
1088 multiclass sve2_int_perm_tbx<string asm, SDPatternOperator op> {
1089 def _B : sve2_int_perm_tbx<0b00, asm, ZPR8>;
1090 def _H : sve2_int_perm_tbx<0b01, asm, ZPR16>;
1091 def _S : sve2_int_perm_tbx<0b10, asm, ZPR32>;
1092 def _D : sve2_int_perm_tbx<0b11, asm, ZPR64>;
1094 def : SVE_3_Op_Pat<nxv16i8, op, nxv16i8, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
1095 def : SVE_3_Op_Pat<nxv8i16, op, nxv8i16, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
1096 def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
1097 def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
1099 def : SVE_3_Op_Pat<nxv8f16, op, nxv8f16, nxv8f16, nxv8i16, !cast<Instruction>(NAME # _H)>;
1100 def : SVE_3_Op_Pat<nxv4f32, op, nxv4f32, nxv4f32, nxv4i32, !cast<Instruction>(NAME # _S)>;
1101 def : SVE_3_Op_Pat<nxv2f64, op, nxv2f64, nxv2f64, nxv2i64, !cast<Instruction>(NAME # _D)>;
1104 class sve_int_perm_reverse_z<bits<2> sz8_64, string asm, ZPRRegOp zprty>
1105 : I<(outs zprty:$Zd), (ins zprty:$Zn),
1111 let Inst{31-24} = 0b00000101;
1112 let Inst{23-22} = sz8_64;
1113 let Inst{21-10} = 0b111000001110;
1118 multiclass sve_int_perm_reverse_z<string asm, SDPatternOperator op> {
1119 def _B : sve_int_perm_reverse_z<0b00, asm, ZPR8>;
1120 def _H : sve_int_perm_reverse_z<0b01, asm, ZPR16>;
1121 def _S : sve_int_perm_reverse_z<0b10, asm, ZPR32>;
1122 def _D : sve_int_perm_reverse_z<0b11, asm, ZPR64>;
1124 def : SVE_1_Op_Pat<nxv16i8, op, nxv16i8, !cast<Instruction>(NAME # _B)>;
1125 def : SVE_1_Op_Pat<nxv8i16, op, nxv8i16, !cast<Instruction>(NAME # _H)>;
1126 def : SVE_1_Op_Pat<nxv4i32, op, nxv4i32, !cast<Instruction>(NAME # _S)>;
1127 def : SVE_1_Op_Pat<nxv2i64, op, nxv2i64, !cast<Instruction>(NAME # _D)>;
1129 def : SVE_1_Op_Pat<nxv8f16, op, nxv8f16, !cast<Instruction>(NAME # _H)>;
1130 def : SVE_1_Op_Pat<nxv4f32, op, nxv4f32, !cast<Instruction>(NAME # _S)>;
1131 def : SVE_1_Op_Pat<nxv2f64, op, nxv2f64, !cast<Instruction>(NAME # _D)>;
1134 class sve_int_perm_reverse_p<bits<2> sz8_64, string asm, PPRRegOp pprty>
1135 : I<(outs pprty:$Pd), (ins pprty:$Pn),
1141 let Inst{31-24} = 0b00000101;
1142 let Inst{23-22} = sz8_64;
1143 let Inst{21-9} = 0b1101000100000;
1149 multiclass sve_int_perm_reverse_p<string asm, SDPatternOperator op> {
1150 def _B : sve_int_perm_reverse_p<0b00, asm, PPR8>;
1151 def _H : sve_int_perm_reverse_p<0b01, asm, PPR16>;
1152 def _S : sve_int_perm_reverse_p<0b10, asm, PPR32>;
1153 def _D : sve_int_perm_reverse_p<0b11, asm, PPR64>;
1155 def : SVE_1_Op_Pat<nxv16i1, op, nxv16i1, !cast<Instruction>(NAME # _B)>;
1156 def : SVE_1_Op_Pat<nxv8i1, op, nxv8i1, !cast<Instruction>(NAME # _H)>;
1157 def : SVE_1_Op_Pat<nxv4i1, op, nxv4i1, !cast<Instruction>(NAME # _S)>;
1158 def : SVE_1_Op_Pat<nxv2i1, op, nxv2i1, !cast<Instruction>(NAME # _D)>;
1161 class sve_int_perm_unpk<bits<2> sz16_64, bits<2> opc, string asm,
1162 ZPRRegOp zprty1, ZPRRegOp zprty2>
1163 : I<(outs zprty1:$Zd), (ins zprty2:$Zn),
1165 "", []>, Sched<[]> {
1168 let Inst{31-24} = 0b00000101;
1169 let Inst{23-22} = sz16_64;
1170 let Inst{21-18} = 0b1100;
1171 let Inst{17-16} = opc;
1172 let Inst{15-10} = 0b001110;
1177 multiclass sve_int_perm_unpk<bits<2> opc, string asm, SDPatternOperator op> {
1178 def _H : sve_int_perm_unpk<0b01, opc, asm, ZPR16, ZPR8>;
1179 def _S : sve_int_perm_unpk<0b10, opc, asm, ZPR32, ZPR16>;
1180 def _D : sve_int_perm_unpk<0b11, opc, asm, ZPR64, ZPR32>;
1182 def : SVE_1_Op_Pat<nxv8i16, op, nxv16i8, !cast<Instruction>(NAME # _H)>;
1183 def : SVE_1_Op_Pat<nxv4i32, op, nxv8i16, !cast<Instruction>(NAME # _S)>;
1184 def : SVE_1_Op_Pat<nxv2i64, op, nxv4i32, !cast<Instruction>(NAME # _D)>;
1187 class sve_int_perm_insrs<bits<2> sz8_64, string asm, ZPRRegOp zprty,
1188 RegisterClass srcRegType>
1189 : I<(outs zprty:$Zdn), (ins zprty:$_Zdn, srcRegType:$Rm),
1195 let Inst{31-24} = 0b00000101;
1196 let Inst{23-22} = sz8_64;
1197 let Inst{21-10} = 0b100100001110;
1199 let Inst{4-0} = Zdn;
1201 let Constraints = "$Zdn = $_Zdn";
1202 let DestructiveInstType = DestructiveOther;
1205 multiclass sve_int_perm_insrs<string asm, SDPatternOperator op> {
1206 def _B : sve_int_perm_insrs<0b00, asm, ZPR8, GPR32>;
1207 def _H : sve_int_perm_insrs<0b01, asm, ZPR16, GPR32>;
1208 def _S : sve_int_perm_insrs<0b10, asm, ZPR32, GPR32>;
1209 def _D : sve_int_perm_insrs<0b11, asm, ZPR64, GPR64>;
1211 def : SVE_2_Op_Pat<nxv16i8, op, nxv16i8, i32, !cast<Instruction>(NAME # _B)>;
1212 def : SVE_2_Op_Pat<nxv8i16, op, nxv8i16, i32, !cast<Instruction>(NAME # _H)>;
1213 def : SVE_2_Op_Pat<nxv4i32, op, nxv4i32, i32, !cast<Instruction>(NAME # _S)>;
1214 def : SVE_2_Op_Pat<nxv2i64, op, nxv2i64, i64, !cast<Instruction>(NAME # _D)>;
1217 class sve_int_perm_insrv<bits<2> sz8_64, string asm, ZPRRegOp zprty,
1218 RegisterClass srcRegType>
1219 : I<(outs zprty:$Zdn), (ins zprty:$_Zdn, srcRegType:$Vm),
1225 let Inst{31-24} = 0b00000101;
1226 let Inst{23-22} = sz8_64;
1227 let Inst{21-10} = 0b110100001110;
1229 let Inst{4-0} = Zdn;
1231 let Constraints = "$Zdn = $_Zdn";
1232 let DestructiveInstType = DestructiveOther;
1235 multiclass sve_int_perm_insrv<string asm, SDPatternOperator op> {
1236 def _B : sve_int_perm_insrv<0b00, asm, ZPR8, FPR8>;
1237 def _H : sve_int_perm_insrv<0b01, asm, ZPR16, FPR16>;
1238 def _S : sve_int_perm_insrv<0b10, asm, ZPR32, FPR32>;
1239 def _D : sve_int_perm_insrv<0b11, asm, ZPR64, FPR64>;
1241 def : SVE_2_Op_Pat<nxv8f16, op, nxv8f16, f16, !cast<Instruction>(NAME # _H)>;
1242 def : SVE_2_Op_Pat<nxv4f32, op, nxv4f32, f32, !cast<Instruction>(NAME # _S)>;
1243 def : SVE_2_Op_Pat<nxv2f64, op, nxv2f64, f64, !cast<Instruction>(NAME # _D)>;
1246 //===----------------------------------------------------------------------===//
1247 // SVE Permute - Extract Group
1248 //===----------------------------------------------------------------------===//
1250 class sve_int_perm_extract_i<string asm>
1251 : I<(outs ZPR8:$Zdn), (ins ZPR8:$_Zdn, ZPR8:$Zm, imm0_255:$imm8),
1252 asm, "\t$Zdn, $_Zdn, $Zm, $imm8",
1253 "", []>, Sched<[]> {
1257 let Inst{31-21} = 0b00000101001;
1258 let Inst{20-16} = imm8{7-3};
1259 let Inst{15-13} = 0b000;
1260 let Inst{12-10} = imm8{2-0};
1262 let Inst{4-0} = Zdn;
1264 let Constraints = "$Zdn = $_Zdn";
1265 let DestructiveInstType = DestructiveOther;
1266 let ElementSize = ElementSizeNone;
1269 multiclass sve_int_perm_extract_i<string asm, SDPatternOperator op> {
1270 def NAME : sve_int_perm_extract_i<asm>;
1272 def : SVE_3_Op_Imm_Pat<nxv16i8, op, nxv16i8, nxv16i8, i32, imm0_255,
1273 !cast<Instruction>(NAME)>;
1276 class sve2_int_perm_extract_i_cons<string asm>
1277 : I<(outs ZPR8:$Zd), (ins ZZ_b:$Zn, imm0_255:$imm8),
1278 asm, "\t$Zd, $Zn, $imm8",
1279 "", []>, Sched<[]> {
1283 let Inst{31-21} = 0b00000101011;
1284 let Inst{20-16} = imm8{7-3};
1285 let Inst{15-13} = 0b000;
1286 let Inst{12-10} = imm8{2-0};
1291 //===----------------------------------------------------------------------===//
1292 // SVE Vector Select Group
1293 //===----------------------------------------------------------------------===//
1295 class sve_int_sel_vvv<bits<2> sz8_64, string asm, ZPRRegOp zprty>
1296 : I<(outs zprty:$Zd), (ins PPRAny:$Pg, zprty:$Zn, zprty:$Zm),
1297 asm, "\t$Zd, $Pg, $Zn, $Zm",
1304 let Inst{31-24} = 0b00000101;
1305 let Inst{23-22} = sz8_64;
1307 let Inst{20-16} = Zm;
1308 let Inst{15-14} = 0b11;
1309 let Inst{13-10} = Pg;
1314 multiclass sve_int_sel_vvv<string asm, SDPatternOperator op> {
1315 def _B : sve_int_sel_vvv<0b00, asm, ZPR8>;
1316 def _H : sve_int_sel_vvv<0b01, asm, ZPR16>;
1317 def _S : sve_int_sel_vvv<0b10, asm, ZPR32>;
1318 def _D : sve_int_sel_vvv<0b11, asm, ZPR64>;
1320 def : SVE_3_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
1321 def : SVE_3_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
1322 def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
1323 def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
1325 def : SVE_3_Op_Pat<nxv8f16, op, nxv8i1, nxv8f16, nxv8f16, !cast<Instruction>(NAME # _H)>;
1326 def : SVE_3_Op_Pat<nxv4f32, op, nxv4i1, nxv4f32, nxv4f32, !cast<Instruction>(NAME # _S)>;
1327 def : SVE_3_Op_Pat<nxv2f32, op, nxv2i1, nxv2f32, nxv2f32, !cast<Instruction>(NAME # _D)>;
1328 def : SVE_3_Op_Pat<nxv2f64, op, nxv2i1, nxv2f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
1330 def : InstAlias<"mov $Zd, $Pg/m, $Zn",
1331 (!cast<Instruction>(NAME # _B) ZPR8:$Zd, PPRAny:$Pg, ZPR8:$Zn, ZPR8:$Zd), 1>;
1332 def : InstAlias<"mov $Zd, $Pg/m, $Zn",
1333 (!cast<Instruction>(NAME # _H) ZPR16:$Zd, PPRAny:$Pg, ZPR16:$Zn, ZPR16:$Zd), 1>;
1334 def : InstAlias<"mov $Zd, $Pg/m, $Zn",
1335 (!cast<Instruction>(NAME # _S) ZPR32:$Zd, PPRAny:$Pg, ZPR32:$Zn, ZPR32:$Zd), 1>;
1336 def : InstAlias<"mov $Zd, $Pg/m, $Zn",
1337 (!cast<Instruction>(NAME # _D) ZPR64:$Zd, PPRAny:$Pg, ZPR64:$Zn, ZPR64:$Zd), 1>;
1341 //===----------------------------------------------------------------------===//
1342 // SVE Predicate Logical Operations Group
1343 //===----------------------------------------------------------------------===//
1345 class sve_int_pred_log<bits<4> opc, string asm>
1346 : I<(outs PPR8:$Pd), (ins PPRAny:$Pg, PPR8:$Pn, PPR8:$Pm),
1347 asm, "\t$Pd, $Pg/z, $Pn, $Pm",
1354 let Inst{31-24} = 0b00100101;
1355 let Inst{23-22} = opc{3-2};
1356 let Inst{21-20} = 0b00;
1357 let Inst{19-16} = Pm;
1358 let Inst{15-14} = 0b01;
1359 let Inst{13-10} = Pg;
1360 let Inst{9} = opc{1};
1362 let Inst{4} = opc{0};
1365 // SEL has no predication qualifier.
1366 let AsmString = !if(!eq(opc, 0b0011),
1367 !strconcat(asm, "\t$Pd, $Pg, $Pn, $Pm"),
1368 !strconcat(asm, "\t$Pd, $Pg/z, $Pn, $Pm"));
1370 let Defs = !if(!eq (opc{2}, 1), [NZCV], []);
1374 multiclass sve_int_pred_log<bits<4> opc, string asm, SDPatternOperator op,
1375 SDPatternOperator op_nopred = null_frag> {
1376 def NAME : sve_int_pred_log<opc, asm>;
1378 def : SVE_3_Op_Pat<nxv16i1, op, nxv16i1, nxv16i1, nxv16i1, !cast<Instruction>(NAME)>;
1379 def : SVE_3_Op_Pat<nxv8i1, op, nxv8i1, nxv8i1, nxv8i1, !cast<Instruction>(NAME)>;
1380 def : SVE_3_Op_Pat<nxv4i1, op, nxv4i1, nxv4i1, nxv4i1, !cast<Instruction>(NAME)>;
1381 def : SVE_3_Op_Pat<nxv2i1, op, nxv2i1, nxv2i1, nxv2i1, !cast<Instruction>(NAME)>;
1382 def : SVE_2_Op_AllActive_Pat<nxv16i1, op_nopred, nxv16i1, nxv16i1,
1383 !cast<Instruction>(NAME), PTRUE_B>;
1384 def : SVE_2_Op_AllActive_Pat<nxv8i1, op_nopred, nxv8i1, nxv8i1,
1385 !cast<Instruction>(NAME), PTRUE_H>;
1386 def : SVE_2_Op_AllActive_Pat<nxv4i1, op_nopred, nxv4i1, nxv4i1,
1387 !cast<Instruction>(NAME), PTRUE_S>;
1388 def : SVE_2_Op_AllActive_Pat<nxv2i1, op_nopred, nxv2i1, nxv2i1,
1389 !cast<Instruction>(NAME), PTRUE_D>;
1393 //===----------------------------------------------------------------------===//
1394 // SVE Logical Mask Immediate Group
1395 //===----------------------------------------------------------------------===//
1397 class sve_int_log_imm<bits<2> opc, string asm>
1398 : I<(outs ZPR64:$Zdn), (ins ZPR64:$_Zdn, logical_imm64:$imms13),
1399 asm, "\t$Zdn, $_Zdn, $imms13",
1400 "", []>, Sched<[]> {
1403 let Inst{31-24} = 0b00000101;
1404 let Inst{23-22} = opc;
1405 let Inst{21-18} = 0b0000;
1406 let Inst{17-5} = imms13;
1407 let Inst{4-0} = Zdn;
1409 let Constraints = "$Zdn = $_Zdn";
1410 let DecoderMethod = "DecodeSVELogicalImmInstruction";
1411 let DestructiveInstType = DestructiveOther;
1412 let ElementSize = ElementSizeNone;
1415 multiclass sve_int_log_imm<bits<2> opc, string asm, string alias, SDPatternOperator op> {
1416 def NAME : sve_int_log_imm<opc, asm>;
1418 def : SVE_1_Op_Imm_Log_Pat<nxv16i8, op, ZPR8, i32, SVELogicalImm8Pat, !cast<Instruction>(NAME)>;
1419 def : SVE_1_Op_Imm_Log_Pat<nxv8i16, op, ZPR16, i32, SVELogicalImm16Pat, !cast<Instruction>(NAME)>;
1420 def : SVE_1_Op_Imm_Log_Pat<nxv4i32, op, ZPR32, i32, SVELogicalImm32Pat, !cast<Instruction>(NAME)>;
1421 def : SVE_1_Op_Imm_Log_Pat<nxv2i64, op, ZPR64, i64, SVELogicalImm64Pat, !cast<Instruction>(NAME)>;
1423 def : InstAlias<asm # "\t$Zdn, $Zdn, $imm",
1424 (!cast<Instruction>(NAME) ZPR8:$Zdn, sve_logical_imm8:$imm), 4>;
1425 def : InstAlias<asm # "\t$Zdn, $Zdn, $imm",
1426 (!cast<Instruction>(NAME) ZPR16:$Zdn, sve_logical_imm16:$imm), 3>;
1427 def : InstAlias<asm # "\t$Zdn, $Zdn, $imm",
1428 (!cast<Instruction>(NAME) ZPR32:$Zdn, sve_logical_imm32:$imm), 2>;
1430 def : InstAlias<alias # "\t$Zdn, $Zdn, $imm",
1431 (!cast<Instruction>(NAME) ZPR8:$Zdn, sve_logical_imm8_not:$imm), 0>;
1432 def : InstAlias<alias # "\t$Zdn, $Zdn, $imm",
1433 (!cast<Instruction>(NAME) ZPR16:$Zdn, sve_logical_imm16_not:$imm), 0>;
1434 def : InstAlias<alias # "\t$Zdn, $Zdn, $imm",
1435 (!cast<Instruction>(NAME) ZPR32:$Zdn, sve_logical_imm32_not:$imm), 0>;
1436 def : InstAlias<alias # "\t$Zdn, $Zdn, $imm",
1437 (!cast<Instruction>(NAME) ZPR64:$Zdn, logical_imm64_not:$imm), 0>;
1440 class sve_int_dup_mask_imm<string asm>
1441 : I<(outs ZPR64:$Zd), (ins logical_imm64:$imms),
1442 asm, "\t$Zd, $imms",
1447 let Inst{31-18} = 0b00000101110000;
1448 let Inst{17-5} = imms;
1451 let isReMaterializable = 1;
1452 let DecoderMethod = "DecodeSVELogicalImmInstruction";
1455 multiclass sve_int_dup_mask_imm<string asm> {
1456 def NAME : sve_int_dup_mask_imm<asm>;
1458 def : InstAlias<"dupm $Zd, $imm",
1459 (!cast<Instruction>(NAME) ZPR8:$Zd, sve_logical_imm8:$imm), 4>;
1460 def : InstAlias<"dupm $Zd, $imm",
1461 (!cast<Instruction>(NAME) ZPR16:$Zd, sve_logical_imm16:$imm), 3>;
1462 def : InstAlias<"dupm $Zd, $imm",
1463 (!cast<Instruction>(NAME) ZPR32:$Zd, sve_logical_imm32:$imm), 2>;
1465 // All Zd.b forms have a CPY/DUP equivalent, hence no byte alias here.
1466 def : InstAlias<"mov $Zd, $imm",
1467 (!cast<Instruction>(NAME) ZPR16:$Zd, sve_preferred_logical_imm16:$imm), 7>;
1468 def : InstAlias<"mov $Zd, $imm",
1469 (!cast<Instruction>(NAME) ZPR32:$Zd, sve_preferred_logical_imm32:$imm), 6>;
1470 def : InstAlias<"mov $Zd, $imm",
1471 (!cast<Instruction>(NAME) ZPR64:$Zd, sve_preferred_logical_imm64:$imm), 5>;
1474 //===----------------------------------------------------------------------===//
1475 // SVE Integer Arithmetic - Unpredicated Group.
1476 //===----------------------------------------------------------------------===//
1478 class sve_int_bin_cons_arit_0<bits<2> sz8_64, bits<3> opc, string asm,
1480 : I<(outs zprty:$Zd), (ins zprty:$Zn, zprty:$Zm),
1481 asm, "\t$Zd, $Zn, $Zm",
1482 "", []>, Sched<[]> {
1486 let Inst{31-24} = 0b00000100;
1487 let Inst{23-22} = sz8_64;
1489 let Inst{20-16} = Zm;
1490 let Inst{15-13} = 0b000;
1491 let Inst{12-10} = opc;
1496 multiclass sve_int_bin_cons_arit_0<bits<3> opc, string asm,
1497 SDPatternOperator op, SDPatternOperator int_op> {
1498 def _B : sve_int_bin_cons_arit_0<0b00, opc, asm, ZPR8>;
1499 def _H : sve_int_bin_cons_arit_0<0b01, opc, asm, ZPR16>;
1500 def _S : sve_int_bin_cons_arit_0<0b10, opc, asm, ZPR32>;
1501 def _D : sve_int_bin_cons_arit_0<0b11, opc, asm, ZPR64>;
1503 def : SVE_2_Op_Pat<nxv16i8, op, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
1504 def : SVE_2_Op_Pat<nxv8i16, op, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
1505 def : SVE_2_Op_Pat<nxv4i32, op, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
1506 def : SVE_2_Op_Pat<nxv2i64, op, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
1508 // Intrinsic version
1509 def : SVE_2_Op_Pat<nxv16i8, int_op, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
1510 def : SVE_2_Op_Pat<nxv8i16, int_op, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
1511 def : SVE_2_Op_Pat<nxv4i32, int_op, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
1512 def : SVE_2_Op_Pat<nxv2i64, int_op, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
1515 //===----------------------------------------------------------------------===//
1516 // SVE Floating Point Arithmetic - Predicated Group
1517 //===----------------------------------------------------------------------===//
1519 class sve_fp_2op_i_p_zds<bits<2> sz, bits<3> opc, string asm,
1522 : I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, imm_ty:$i1),
1523 asm, "\t$Zdn, $Pg/m, $_Zdn, $i1",
1529 let Inst{31-24} = 0b01100101;
1530 let Inst{23-22} = sz;
1531 let Inst{21-19} = 0b011;
1532 let Inst{18-16} = opc;
1533 let Inst{15-13} = 0b100;
1534 let Inst{12-10} = Pg;
1535 let Inst{9-6} = 0b0000;
1537 let Inst{4-0} = Zdn;
1539 let Constraints = "$Zdn = $_Zdn";
1540 let DestructiveInstType = DestructiveOther;
1541 let ElementSize = zprty.ElementSize;
1544 multiclass sve_fp_2op_i_p_zds<bits<3> opc, string asm, Operand imm_ty> {
1545 def _H : sve_fp_2op_i_p_zds<0b01, opc, asm, ZPR16, imm_ty>;
1546 def _S : sve_fp_2op_i_p_zds<0b10, opc, asm, ZPR32, imm_ty>;
1547 def _D : sve_fp_2op_i_p_zds<0b11, opc, asm, ZPR64, imm_ty>;
1550 class sve_fp_2op_p_zds<bits<2> sz, bits<4> opc, string asm,
1552 : I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, zprty:$Zm),
1553 asm, "\t$Zdn, $Pg/m, $_Zdn, $Zm",
1559 let Inst{31-24} = 0b01100101;
1560 let Inst{23-22} = sz;
1561 let Inst{21-20} = 0b00;
1562 let Inst{19-16} = opc;
1563 let Inst{15-13} = 0b100;
1564 let Inst{12-10} = Pg;
1566 let Inst{4-0} = Zdn;
1568 let Constraints = "$Zdn = $_Zdn";
1569 let DestructiveInstType = DestructiveOther;
1570 let ElementSize = zprty.ElementSize;
1573 multiclass sve_fp_2op_p_zds<bits<4> opc, string asm, string Ps,
1574 SDPatternOperator op, DestructiveInstTypeEnum flags,
1575 string revname="", bit isReverseInstr=0> {
1576 let DestructiveInstType = flags in {
1577 def _H : sve_fp_2op_p_zds<0b01, opc, asm, ZPR16>,
1578 SVEPseudo2Instr<Ps # _H, 1>, SVEInstr2Rev<NAME # _H, revname # _H, isReverseInstr>;
1579 def _S : sve_fp_2op_p_zds<0b10, opc, asm, ZPR32>,
1580 SVEPseudo2Instr<Ps # _S, 1>, SVEInstr2Rev<NAME # _S, revname # _S, isReverseInstr>;
1581 def _D : sve_fp_2op_p_zds<0b11, opc, asm, ZPR64>,
1582 SVEPseudo2Instr<Ps # _D, 1>, SVEInstr2Rev<NAME # _D, revname # _D, isReverseInstr>;
1585 def : SVE_3_Op_Pat<nxv8f16, op, nxv8i1, nxv8f16, nxv8f16, !cast<Instruction>(NAME # _H)>;
1586 def : SVE_3_Op_Pat<nxv4f32, op, nxv4i1, nxv4f32, nxv4f32, !cast<Instruction>(NAME # _S)>;
1587 def : SVE_3_Op_Pat<nxv2f64, op, nxv2i1, nxv2f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
1590 multiclass sve_fp_2op_p_zds_fscale<bits<4> opc, string asm,
1591 SDPatternOperator op> {
1592 def _H : sve_fp_2op_p_zds<0b01, opc, asm, ZPR16>;
1593 def _S : sve_fp_2op_p_zds<0b10, opc, asm, ZPR32>;
1594 def _D : sve_fp_2op_p_zds<0b11, opc, asm, ZPR64>;
1596 def : SVE_3_Op_Pat<nxv8f16, op, nxv8i1, nxv8f16, nxv8i16, !cast<Instruction>(NAME # _H)>;
1597 def : SVE_3_Op_Pat<nxv4f32, op, nxv4i1, nxv4f32, nxv4i32, !cast<Instruction>(NAME # _S)>;
1598 def : SVE_3_Op_Pat<nxv2f64, op, nxv2i1, nxv2f64, nxv2i64, !cast<Instruction>(NAME # _D)>;
1601 multiclass sve_fp_2op_p_zds_zeroing_hsd<SDPatternOperator op> {
1602 def _ZERO_H : PredTwoOpPseudo<NAME # _H, ZPR16, FalseLanesZero>;
1603 def _ZERO_S : PredTwoOpPseudo<NAME # _S, ZPR32, FalseLanesZero>;
1604 def _ZERO_D : PredTwoOpPseudo<NAME # _D, ZPR64, FalseLanesZero>;
1606 def : SVE_3_Op_Pat_SelZero<nxv8f16, op, nxv8i1, nxv8f16, nxv8f16, !cast<Pseudo>(NAME # _ZERO_H)>;
1607 def : SVE_3_Op_Pat_SelZero<nxv4f32, op, nxv4i1, nxv4f32, nxv4f32, !cast<Pseudo>(NAME # _ZERO_S)>;
1608 def : SVE_3_Op_Pat_SelZero<nxv2f64, op, nxv2i1, nxv2f64, nxv2f64, !cast<Pseudo>(NAME # _ZERO_D)>;
1611 class sve_fp_ftmad<bits<2> sz, string asm, ZPRRegOp zprty>
1612 : I<(outs zprty:$Zdn), (ins zprty:$_Zdn, zprty:$Zm, imm32_0_7:$imm3),
1613 asm, "\t$Zdn, $_Zdn, $Zm, $imm3",
1619 let Inst{31-24} = 0b01100101;
1620 let Inst{23-22} = sz;
1621 let Inst{21-19} = 0b010;
1622 let Inst{18-16} = imm3;
1623 let Inst{15-10} = 0b100000;
1625 let Inst{4-0} = Zdn;
1627 let Constraints = "$Zdn = $_Zdn";
1628 let DestructiveInstType = DestructiveOther;
1629 let ElementSize = ElementSizeNone;
1632 multiclass sve_fp_ftmad<string asm, SDPatternOperator op> {
1633 def _H : sve_fp_ftmad<0b01, asm, ZPR16>;
1634 def _S : sve_fp_ftmad<0b10, asm, ZPR32>;
1635 def _D : sve_fp_ftmad<0b11, asm, ZPR64>;
1637 def : Pat<(nxv8f16 (op (nxv8f16 ZPR16:$Zn), (nxv8f16 ZPR16:$Zm), (i32 imm32_0_7:$imm))),
1638 (!cast<Instruction>(NAME # _H) ZPR16:$Zn, ZPR16:$Zm, imm32_0_7:$imm)>;
1639 def : Pat<(nxv4f32 (op (nxv4f32 ZPR32:$Zn), (nxv4f32 ZPR32:$Zm), (i32 imm32_0_7:$imm))),
1640 (!cast<Instruction>(NAME # _S) ZPR32:$Zn, ZPR32:$Zm, imm32_0_7:$imm)>;
1641 def : Pat<(nxv2f64 (op (nxv2f64 ZPR64:$Zn), (nxv2f64 ZPR64:$Zm), (i32 imm32_0_7:$imm))),
1642 (!cast<Instruction>(NAME # _D) ZPR64:$Zn, ZPR64:$Zm, imm32_0_7:$imm)>;
1646 //===----------------------------------------------------------------------===//
1647 // SVE Floating Point Arithmetic - Unpredicated Group
1648 //===----------------------------------------------------------------------===//
1650 class sve_fp_3op_u_zd<bits<2> sz, bits<3> opc, string asm, ZPRRegOp zprty>
1651 : I<(outs zprty:$Zd), (ins zprty:$Zn, zprty:$Zm),
1652 asm, "\t$Zd, $Zn, $Zm",
1658 let Inst{31-24} = 0b01100101;
1659 let Inst{23-22} = sz;
1661 let Inst{20-16} = Zm;
1662 let Inst{15-13} = 0b000;
1663 let Inst{12-10} = opc;
1668 multiclass sve_fp_3op_u_zd<bits<3> opc, string asm, SDPatternOperator op> {
1669 def _H : sve_fp_3op_u_zd<0b01, opc, asm, ZPR16>;
1670 def _S : sve_fp_3op_u_zd<0b10, opc, asm, ZPR32>;
1671 def _D : sve_fp_3op_u_zd<0b11, opc, asm, ZPR64>;
1673 def : SVE_2_Op_Pat<nxv8f16, op, nxv8f16, nxv8f16, !cast<Instruction>(NAME # _H)>;
1674 def : SVE_2_Op_Pat<nxv4f32, op, nxv4f32, nxv4f32, !cast<Instruction>(NAME # _S)>;
1675 def : SVE_2_Op_Pat<nxv2f64, op, nxv2f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
1679 multiclass sve_fp_3op_u_zd_ftsmul<bits<3> opc, string asm, SDPatternOperator op> {
1680 def _H : sve_fp_3op_u_zd<0b01, opc, asm, ZPR16>;
1681 def _S : sve_fp_3op_u_zd<0b10, opc, asm, ZPR32>;
1682 def _D : sve_fp_3op_u_zd<0b11, opc, asm, ZPR64>;
1684 def : SVE_2_Op_Pat<nxv8f16, op, nxv8f16, nxv8i16, !cast<Instruction>(NAME # _H)>;
1685 def : SVE_2_Op_Pat<nxv4f32, op, nxv4f32, nxv4i32, !cast<Instruction>(NAME # _S)>;
1686 def : SVE_2_Op_Pat<nxv2f64, op, nxv2f64, nxv2i64, !cast<Instruction>(NAME # _D)>;
1689 //===----------------------------------------------------------------------===//
1690 // SVE Floating Point Fused Multiply-Add Group
1691 //===----------------------------------------------------------------------===//
1693 class sve_fp_3op_p_zds_a<bits<2> sz, bits<2> opc, string asm, ZPRRegOp zprty>
1694 : I<(outs zprty:$Zda), (ins PPR3bAny:$Pg, zprty:$_Zda, zprty:$Zn, zprty:$Zm),
1695 asm, "\t$Zda, $Pg/m, $Zn, $Zm",
1702 let Inst{31-24} = 0b01100101;
1703 let Inst{23-22} = sz;
1705 let Inst{20-16} = Zm;
1707 let Inst{14-13} = opc;
1708 let Inst{12-10} = Pg;
1710 let Inst{4-0} = Zda;
1712 let Constraints = "$Zda = $_Zda";
1713 let DestructiveInstType = DestructiveOther;
1714 let ElementSize = zprty.ElementSize;
1717 multiclass sve_fp_3op_p_zds_a<bits<2> opc, string asm, SDPatternOperator op> {
1718 def _H : sve_fp_3op_p_zds_a<0b01, opc, asm, ZPR16>;
1719 def _S : sve_fp_3op_p_zds_a<0b10, opc, asm, ZPR32>;
1720 def _D : sve_fp_3op_p_zds_a<0b11, opc, asm, ZPR64>;
1722 def : SVE_4_Op_Pat<nxv8f16, op, nxv8i1, nxv8f16, nxv8f16, nxv8f16, !cast<Instruction>(NAME # _H)>;
1723 def : SVE_4_Op_Pat<nxv4f32, op, nxv4i1, nxv4f32, nxv4f32, nxv4f32, !cast<Instruction>(NAME # _S)>;
1724 def : SVE_4_Op_Pat<nxv2f64, op, nxv2i1, nxv2f64, nxv2f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
1727 class sve_fp_3op_p_zds_b<bits<2> sz, bits<2> opc, string asm,
1729 : I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, zprty:$Zm, zprty:$Za),
1730 asm, "\t$Zdn, $Pg/m, $Zm, $Za",
1737 let Inst{31-24} = 0b01100101;
1738 let Inst{23-22} = sz;
1740 let Inst{20-16} = Za;
1742 let Inst{14-13} = opc;
1743 let Inst{12-10} = Pg;
1745 let Inst{4-0} = Zdn;
1747 let Constraints = "$Zdn = $_Zdn";
1748 let DestructiveInstType = DestructiveOther;
1749 let ElementSize = zprty.ElementSize;
1752 multiclass sve_fp_3op_p_zds_b<bits<2> opc, string asm, SDPatternOperator op> {
1753 def _H : sve_fp_3op_p_zds_b<0b01, opc, asm, ZPR16>;
1754 def _S : sve_fp_3op_p_zds_b<0b10, opc, asm, ZPR32>;
1755 def _D : sve_fp_3op_p_zds_b<0b11, opc, asm, ZPR64>;
1757 def : SVE_4_Op_Pat<nxv8f16, op, nxv8i1, nxv8f16, nxv8f16, nxv8f16, !cast<Instruction>(NAME # _H)>;
1758 def : SVE_4_Op_Pat<nxv4f32, op, nxv4i1, nxv4f32, nxv4f32, nxv4f32, !cast<Instruction>(NAME # _S)>;
1759 def : SVE_4_Op_Pat<nxv2f64, op, nxv2i1, nxv2f64, nxv2f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
1762 //===----------------------------------------------------------------------===//
1763 // SVE Floating Point Multiply-Add - Indexed Group
1764 //===----------------------------------------------------------------------===//
1766 class sve_fp_fma_by_indexed_elem<bits<2> sz, bit opc, string asm,
1768 ZPRRegOp zprty2, Operand itype>
1769 : I<(outs zprty1:$Zda), (ins zprty1:$_Zda, zprty1:$Zn, zprty2:$Zm, itype:$iop),
1770 asm, "\t$Zda, $Zn, $Zm$iop", "", []>, Sched<[]> {
1773 let Inst{31-24} = 0b01100100;
1774 let Inst{23-22} = sz;
1776 let Inst{15-11} = 0;
1779 let Inst{4-0} = Zda;
1781 let Constraints = "$Zda = $_Zda";
1782 let DestructiveInstType = DestructiveOther;
1783 let ElementSize = ElementSizeNone;
1786 multiclass sve_fp_fma_by_indexed_elem<bit opc, string asm,
1787 SDPatternOperator op> {
1788 def _H : sve_fp_fma_by_indexed_elem<{0, ?}, opc, asm, ZPR16, ZPR3b16, VectorIndexH32b> {
1791 let Inst{22} = iop{2};
1792 let Inst{20-19} = iop{1-0};
1793 let Inst{18-16} = Zm;
1795 def _S : sve_fp_fma_by_indexed_elem<0b10, opc, asm, ZPR32, ZPR3b32, VectorIndexS32b> {
1798 let Inst{20-19} = iop;
1799 let Inst{18-16} = Zm;
1801 def _D : sve_fp_fma_by_indexed_elem<0b11, opc, asm, ZPR64, ZPR4b64, VectorIndexD32b> {
1805 let Inst{19-16} = Zm;
1808 def : Pat<(nxv8f16 (op nxv8f16:$Op1, nxv8f16:$Op2, nxv8f16:$Op3, (i32 VectorIndexH32b_timm:$idx))),
1809 (!cast<Instruction>(NAME # _H) $Op1, $Op2, $Op3, VectorIndexH32b_timm:$idx)>;
1810 def : Pat<(nxv4f32 (op nxv4f32:$Op1, nxv4f32:$Op2, nxv4f32:$Op3, (i32 VectorIndexS32b_timm:$idx))),
1811 (!cast<Instruction>(NAME # _S) $Op1, $Op2, $Op3, VectorIndexS32b_timm:$idx)>;
1812 def : Pat<(nxv2f64 (op nxv2f64:$Op1, nxv2f64:$Op2, nxv2f64:$Op3, (i32 VectorIndexD32b_timm:$idx))),
1813 (!cast<Instruction>(NAME # _D) $Op1, $Op2, $Op3, VectorIndexD32b_timm:$idx)>;
1817 //===----------------------------------------------------------------------===//
1818 // SVE Floating Point Multiply - Indexed Group
1819 //===----------------------------------------------------------------------===//
1821 class sve_fp_fmul_by_indexed_elem<bits<2> sz, string asm, ZPRRegOp zprty,
1822 ZPRRegOp zprty2, Operand itype>
1823 : I<(outs zprty:$Zd), (ins zprty:$Zn, zprty2:$Zm, itype:$iop),
1824 asm, "\t$Zd, $Zn, $Zm$iop", "", []>, Sched<[]> {
1827 let Inst{31-24} = 0b01100100;
1828 let Inst{23-22} = sz;
1830 let Inst{15-10} = 0b001000;
1835 multiclass sve_fp_fmul_by_indexed_elem<string asm, SDPatternOperator op> {
1836 def _H : sve_fp_fmul_by_indexed_elem<{0, ?}, asm, ZPR16, ZPR3b16, VectorIndexH32b> {
1839 let Inst{22} = iop{2};
1840 let Inst{20-19} = iop{1-0};
1841 let Inst{18-16} = Zm;
1843 def _S : sve_fp_fmul_by_indexed_elem<0b10, asm, ZPR32, ZPR3b32, VectorIndexS32b> {
1846 let Inst{20-19} = iop;
1847 let Inst{18-16} = Zm;
1849 def _D : sve_fp_fmul_by_indexed_elem<0b11, asm, ZPR64, ZPR4b64, VectorIndexD32b> {
1853 let Inst{19-16} = Zm;
1856 def : Pat<(nxv8f16 (op nxv8f16:$Op1, nxv8f16:$Op2, (i32 VectorIndexH32b_timm:$idx))),
1857 (!cast<Instruction>(NAME # _H) $Op1, $Op2, VectorIndexH32b_timm:$idx)>;
1858 def : Pat<(nxv4f32 (op nxv4f32:$Op1, nxv4f32:$Op2, (i32 VectorIndexS32b_timm:$idx))),
1859 (!cast<Instruction>(NAME # _S) $Op1, $Op2, VectorIndexS32b_timm:$idx)>;
1860 def : Pat<(nxv2f64 (op nxv2f64:$Op1, nxv2f64:$Op2, (i32 VectorIndexD32b_timm:$idx))),
1861 (!cast<Instruction>(NAME # _D) $Op1, $Op2, VectorIndexD32b_timm:$idx)>;
1864 //===----------------------------------------------------------------------===//
1865 // SVE Floating Point Complex Multiply-Add Group
1866 //===----------------------------------------------------------------------===//
1868 class sve_fp_fcmla<bits<2> sz, string asm, ZPRRegOp zprty>
1869 : I<(outs zprty:$Zda), (ins PPR3bAny:$Pg, zprty:$_Zda, zprty:$Zn, zprty:$Zm,
1870 complexrotateop:$imm),
1871 asm, "\t$Zda, $Pg/m, $Zn, $Zm, $imm",
1872 "", []>, Sched<[]> {
1878 let Inst{31-24} = 0b01100100;
1879 let Inst{23-22} = sz;
1881 let Inst{20-16} = Zm;
1883 let Inst{14-13} = imm;
1884 let Inst{12-10} = Pg;
1886 let Inst{4-0} = Zda;
1888 let Constraints = "$Zda = $_Zda";
1889 let DestructiveInstType = DestructiveOther;
1890 let ElementSize = zprty.ElementSize;
1893 multiclass sve_fp_fcmla<string asm, SDPatternOperator op> {
1894 def _H : sve_fp_fcmla<0b01, asm, ZPR16>;
1895 def _S : sve_fp_fcmla<0b10, asm, ZPR32>;
1896 def _D : sve_fp_fcmla<0b11, asm, ZPR64>;
1898 def : Pat<(nxv8f16 (op nxv8i1:$Op1, nxv8f16:$Op2, nxv8f16:$Op3, nxv8f16:$Op4, (i32 complexrotateop:$imm))),
1899 (!cast<Instruction>(NAME # _H) $Op1, $Op2, $Op3, $Op4, complexrotateop:$imm)>;
1900 def : Pat<(nxv4f32 (op nxv4i1:$Op1, nxv4f32:$Op2, nxv4f32:$Op3, nxv4f32:$Op4, (i32 complexrotateop:$imm))),
1901 (!cast<Instruction>(NAME # _S) $Op1, $Op2, $Op3, $Op4, complexrotateop:$imm)>;
1902 def : Pat<(nxv2f64 (op nxv2i1:$Op1, nxv2f64:$Op2, nxv2f64:$Op3, nxv2f64:$Op4, (i32 complexrotateop:$imm))),
1903 (!cast<Instruction>(NAME # _D) $Op1, $Op2, $Op3, $Op4, complexrotateop:$imm)>;
1906 //===----------------------------------------------------------------------===//
1907 // SVE Floating Point Complex Multiply-Add - Indexed Group
1908 //===----------------------------------------------------------------------===//
1910 class sve_fp_fcmla_by_indexed_elem<bits<2> sz, string asm,
1912 ZPRRegOp zprty2, Operand itype>
1913 : I<(outs zprty:$Zda), (ins zprty:$_Zda, zprty:$Zn, zprty2:$Zm, itype:$iop,
1914 complexrotateop:$imm),
1915 asm, "\t$Zda, $Zn, $Zm$iop, $imm",
1916 "", []>, Sched<[]> {
1920 let Inst{31-24} = 0b01100100;
1921 let Inst{23-22} = sz;
1923 let Inst{15-12} = 0b0001;
1924 let Inst{11-10} = imm;
1926 let Inst{4-0} = Zda;
1928 let Constraints = "$Zda = $_Zda";
1929 let DestructiveInstType = DestructiveOther;
1930 let ElementSize = ElementSizeNone;
1933 multiclass sve_fp_fcmla_by_indexed_elem<string asm, SDPatternOperator op> {
1934 def _H : sve_fp_fcmla_by_indexed_elem<0b10, asm, ZPR16, ZPR3b16, VectorIndexS32b> {
1937 let Inst{20-19} = iop;
1938 let Inst{18-16} = Zm;
1940 def _S : sve_fp_fcmla_by_indexed_elem<0b11, asm, ZPR32, ZPR4b32, VectorIndexD32b> {
1944 let Inst{19-16} = Zm;
1947 def : Pat<(nxv8f16 (op nxv8f16:$Op1, nxv8f16:$Op2, nxv8f16:$Op3, (i32 VectorIndexS32b_timm:$idx), (i32 complexrotateop:$imm))),
1948 (!cast<Instruction>(NAME # _H) $Op1, $Op2, $Op3, VectorIndexS32b_timm:$idx, complexrotateop:$imm)>;
1949 def : Pat<(nxv4f32 (op nxv4f32:$Op1, nxv4f32:$Op2, nxv4f32:$Op3, (i32 VectorIndexD32b_timm:$idx), (i32 complexrotateop:$imm))),
1950 (!cast<Instruction>(NAME # _S) $Op1, $Op2, $Op3, VectorIndexD32b_timm:$idx, complexrotateop:$imm)>;
1953 //===----------------------------------------------------------------------===//
1954 // SVE Floating Point Complex Addition Group
1955 //===----------------------------------------------------------------------===//
1957 class sve_fp_fcadd<bits<2> sz, string asm, ZPRRegOp zprty>
1958 : I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, zprty:$Zm,
1959 complexrotateopodd:$imm),
1960 asm, "\t$Zdn, $Pg/m, $_Zdn, $Zm, $imm",
1967 let Inst{31-24} = 0b01100100;
1968 let Inst{23-22} = sz;
1969 let Inst{21-17} = 0;
1971 let Inst{15-13} = 0b100;
1972 let Inst{12-10} = Pg;
1974 let Inst{4-0} = Zdn;
1976 let Constraints = "$Zdn = $_Zdn";
1977 let DestructiveInstType = DestructiveOther;
1978 let ElementSize = zprty.ElementSize;
1981 multiclass sve_fp_fcadd<string asm, SDPatternOperator op> {
1982 def _H : sve_fp_fcadd<0b01, asm, ZPR16>;
1983 def _S : sve_fp_fcadd<0b10, asm, ZPR32>;
1984 def _D : sve_fp_fcadd<0b11, asm, ZPR64>;
1986 def : Pat<(nxv8f16 (op nxv8i1:$Op1, nxv8f16:$Op2, nxv8f16:$Op3, (i32 complexrotateopodd:$imm))),
1987 (!cast<Instruction>(NAME # _H) $Op1, $Op2, $Op3, complexrotateopodd:$imm)>;
1988 def : Pat<(nxv4f32 (op nxv4i1:$Op1, nxv4f32:$Op2, nxv4f32:$Op3, (i32 complexrotateopodd:$imm))),
1989 (!cast<Instruction>(NAME # _S) $Op1, $Op2, $Op3, complexrotateopodd:$imm)>;
1990 def : Pat<(nxv2f64 (op nxv2i1:$Op1, nxv2f64:$Op2, nxv2f64:$Op3, (i32 complexrotateopodd:$imm))),
1991 (!cast<Instruction>(NAME # _D) $Op1, $Op2, $Op3, complexrotateopodd:$imm)>;
1994 //===----------------------------------------------------------------------===//
1995 // SVE2 Floating Point Convert Group
1996 //===----------------------------------------------------------------------===//
1998 class sve2_fp_convert_precision<bits<4> opc, string asm,
1999 ZPRRegOp zprty1, ZPRRegOp zprty2>
2000 : I<(outs zprty1:$Zd), (ins zprty1:$_Zd, PPR3bAny:$Pg, zprty2:$Zn),
2001 asm, "\t$Zd, $Pg/m, $Zn",
2007 let Inst{31-24} = 0b01100100;
2008 let Inst{23-22} = opc{3-2};
2009 let Inst{21-18} = 0b0010;
2010 let Inst{17-16} = opc{1-0};
2011 let Inst{15-13} = 0b101;
2012 let Inst{12-10} = Pg;
2016 let Constraints = "$Zd = $_Zd";
2019 multiclass sve2_fp_convert_down_narrow<string asm, string op> {
2020 def _StoH : sve2_fp_convert_precision<0b1000, asm, ZPR16, ZPR32>;
2021 def _DtoS : sve2_fp_convert_precision<0b1110, asm, ZPR32, ZPR64>;
2023 def : SVE_3_Op_Pat<nxv8f16, !cast<SDPatternOperator>(op # _f16f32), nxv8f16, nxv4i1, nxv4f32, !cast<Instruction>(NAME # _StoH)>;
2024 def : SVE_3_Op_Pat<nxv4f32, !cast<SDPatternOperator>(op # _f32f64), nxv4f32, nxv2i1, nxv2f64, !cast<Instruction>(NAME # _DtoS)>;
2027 multiclass sve2_fp_convert_up_long<string asm, string op> {
2028 def _HtoS : sve2_fp_convert_precision<0b1001, asm, ZPR32, ZPR16>;
2029 def _StoD : sve2_fp_convert_precision<0b1111, asm, ZPR64, ZPR32>;
2031 def : SVE_3_Op_Pat<nxv4f32, !cast<SDPatternOperator>(op # _f32f16), nxv4f32, nxv4i1, nxv8f16, !cast<Instruction>(NAME # _HtoS)>;
2032 def : SVE_3_Op_Pat<nxv2f64, !cast<SDPatternOperator>(op # _f64f32), nxv2f64, nxv2i1, nxv4f32, !cast<Instruction>(NAME # _StoD)>;
2035 multiclass sve2_fp_convert_down_odd_rounding_top<string asm, string op> {
2036 def _DtoS : sve2_fp_convert_precision<0b0010, asm, ZPR32, ZPR64>;
2038 def : SVE_3_Op_Pat<nxv4f32, !cast<SDPatternOperator>(op # _f32f64), nxv4f32, nxv2i1, nxv2f64, !cast<Instruction>(NAME # _DtoS)>;
2041 //===----------------------------------------------------------------------===//
2042 // SVE2 Floating Point Pairwise Group
2043 //===----------------------------------------------------------------------===//
2045 class sve2_fp_pairwise_pred<bits<2> sz, bits<3> opc, string asm,
2047 : I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, zprty:$Zm),
2048 asm, "\t$Zdn, $Pg/m, $_Zdn, $Zm",
2054 let Inst{31-24} = 0b01100100;
2055 let Inst{23-22} = sz;
2056 let Inst{21-19} = 0b010;
2057 let Inst{18-16} = opc;
2058 let Inst{15-13} = 0b100;
2059 let Inst{12-10} = Pg;
2061 let Inst{4-0} = Zdn;
2063 let Constraints = "$Zdn = $_Zdn";
2064 let DestructiveInstType = DestructiveOther;
2065 let ElementSize = zprty.ElementSize;
2068 multiclass sve2_fp_pairwise_pred<bits<3> opc, string asm, SDPatternOperator op> {
2069 def _H : sve2_fp_pairwise_pred<0b01, opc, asm, ZPR16>;
2070 def _S : sve2_fp_pairwise_pred<0b10, opc, asm, ZPR32>;
2071 def _D : sve2_fp_pairwise_pred<0b11, opc, asm, ZPR64>;
2073 def : SVE_3_Op_Pat<nxv8f16, op, nxv8i1, nxv8f16, nxv8f16, !cast<Instruction>(NAME # _H)>;
2074 def : SVE_3_Op_Pat<nxv4f32, op, nxv4i1, nxv4f32, nxv4f32, !cast<Instruction>(NAME # _S)>;
2075 def : SVE_3_Op_Pat<nxv2f64, op, nxv2i1, nxv2f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
2078 //===----------------------------------------------------------------------===//
2079 // SVE2 Floating Point Widening Multiply-Add - Indexed Group
2080 //===----------------------------------------------------------------------===//
2082 class sve2_fp_mla_long_by_indexed_elem<bits<2> opc, string asm>
2083 : I<(outs ZPR32:$Zda), (ins ZPR32:$_Zda, ZPR16:$Zn, ZPR3b16:$Zm,
2084 VectorIndexH32b:$iop),
2085 asm, "\t$Zda, $Zn, $Zm$iop",
2092 let Inst{31-21} = 0b01100100101;
2093 let Inst{20-19} = iop{2-1};
2094 let Inst{18-16} = Zm;
2095 let Inst{15-14} = 0b01;
2096 let Inst{13} = opc{1};
2098 let Inst{11} = iop{0};
2099 let Inst{10} = opc{0};
2101 let Inst{4-0} = Zda;
2103 let Constraints = "$Zda = $_Zda";
2104 let DestructiveInstType = DestructiveOther;
2105 let ElementSize = ElementSizeNone;
2108 multiclass sve2_fp_mla_long_by_indexed_elem<bits<2> opc, string asm,
2109 SDPatternOperator op> {
2110 def NAME : sve2_fp_mla_long_by_indexed_elem<opc, asm>;
2111 def : SVE_4_Op_Imm_Pat<nxv4f32, op, nxv4f32, nxv8f16, nxv8f16, i32, VectorIndexH32b_timm, !cast<Instruction>(NAME)>;
2114 //===----------------------------------------------------------------------===//
2115 // SVE2 Floating Point Widening Multiply-Add Group
2116 //===----------------------------------------------------------------------===//
2118 class sve2_fp_mla_long<bits<2> opc, string asm>
2119 : I<(outs ZPR32:$Zda), (ins ZPR32:$_Zda, ZPR16:$Zn, ZPR16:$Zm),
2120 asm, "\t$Zda, $Zn, $Zm",
2126 let Inst{31-21} = 0b01100100101;
2127 let Inst{20-16} = Zm;
2128 let Inst{15-14} = 0b10;
2129 let Inst{13} = opc{1};
2130 let Inst{12-11} = 0b00;
2131 let Inst{10} = opc{0};
2133 let Inst{4-0} = Zda;
2135 let Constraints = "$Zda = $_Zda";
2136 let DestructiveInstType = DestructiveOther;
2137 let ElementSize = ElementSizeNone;
2140 multiclass sve2_fp_mla_long<bits<2> opc, string asm, SDPatternOperator op> {
2141 def NAME : sve2_fp_mla_long<opc, asm>;
2142 def : SVE_3_Op_Pat<nxv4f32, op, nxv4f32, nxv8f16, nxv8f16, !cast<Instruction>(NAME)>;
2145 //===----------------------------------------------------------------------===//
2146 // SVE Stack Allocation Group
2147 //===----------------------------------------------------------------------===//
2149 class sve_int_arith_vl<bit opc, string asm>
2150 : I<(outs GPR64sp:$Rd), (ins GPR64sp:$Rn, simm6_32b:$imm6),
2151 asm, "\t$Rd, $Rn, $imm6",
2157 let Inst{31-23} = 0b000001000;
2160 let Inst{20-16} = Rn;
2161 let Inst{15-11} = 0b01010;
2162 let Inst{10-5} = imm6;
2166 class sve_int_read_vl_a<bit op, bits<5> opc2, string asm>
2167 : I<(outs GPR64:$Rd), (ins simm6_32b:$imm6),
2168 asm, "\t$Rd, $imm6",
2173 let Inst{31-23} = 0b000001001;
2176 let Inst{20-16} = opc2{4-0};
2177 let Inst{15-11} = 0b01010;
2178 let Inst{10-5} = imm6;
2182 //===----------------------------------------------------------------------===//
2183 // SVE Permute - In Lane Group
2184 //===----------------------------------------------------------------------===//
2186 class sve_int_perm_bin_perm_zz<bits<3> opc, bits<2> sz8_64, string asm,
2188 : I<(outs zprty:$Zd), (ins zprty:$Zn, zprty:$Zm),
2189 asm, "\t$Zd, $Zn, $Zm",
2195 let Inst{31-24} = 0b00000101;
2196 let Inst{23-22} = sz8_64;
2198 let Inst{20-16} = Zm;
2199 let Inst{15-13} = 0b011;
2200 let Inst{12-10} = opc;
2205 multiclass sve_int_perm_bin_perm_zz<bits<3> opc, string asm,
2206 SDPatternOperator op> {
2207 def _B : sve_int_perm_bin_perm_zz<opc, 0b00, asm, ZPR8>;
2208 def _H : sve_int_perm_bin_perm_zz<opc, 0b01, asm, ZPR16>;
2209 def _S : sve_int_perm_bin_perm_zz<opc, 0b10, asm, ZPR32>;
2210 def _D : sve_int_perm_bin_perm_zz<opc, 0b11, asm, ZPR64>;
2212 def : SVE_2_Op_Pat<nxv16i8, op, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
2213 def : SVE_2_Op_Pat<nxv8i16, op, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
2214 def : SVE_2_Op_Pat<nxv4i32, op, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
2215 def : SVE_2_Op_Pat<nxv2i64, op, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
2217 def : SVE_2_Op_Pat<nxv8f16, op, nxv8f16, nxv8f16, !cast<Instruction>(NAME # _H)>;
2218 def : SVE_2_Op_Pat<nxv4f16, op, nxv4f16, nxv4f16, !cast<Instruction>(NAME # _S)>;
2219 def : SVE_2_Op_Pat<nxv4f32, op, nxv4f32, nxv4f32, !cast<Instruction>(NAME # _S)>;
2220 def : SVE_2_Op_Pat<nxv2f64, op, nxv2f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
2223 //===----------------------------------------------------------------------===//
2224 // SVE Floating Point Unary Operations Group
2225 //===----------------------------------------------------------------------===//
2227 class sve_fp_2op_p_zd<bits<7> opc, string asm, RegisterOperand i_zprtype,
2228 RegisterOperand o_zprtype, ElementSizeEnum size>
2229 : I<(outs o_zprtype:$Zd), (ins i_zprtype:$_Zd, PPR3bAny:$Pg, i_zprtype:$Zn),
2230 asm, "\t$Zd, $Pg/m, $Zn",
2236 let Inst{31-24} = 0b01100101;
2237 let Inst{23-22} = opc{6-5};
2239 let Inst{20-16} = opc{4-0};
2240 let Inst{15-13} = 0b101;
2241 let Inst{12-10} = Pg;
2245 let Constraints = "$Zd = $_Zd";
2246 let DestructiveInstType = DestructiveOther;
2247 let ElementSize = size;
2250 multiclass sve_fp_2op_p_zd<bits<7> opc, string asm,
2251 RegisterOperand i_zprtype,
2252 RegisterOperand o_zprtype,
2253 SDPatternOperator op, ValueType vt1,
2254 ValueType vt2, ValueType vt3, ElementSizeEnum Sz> {
2255 def NAME : sve_fp_2op_p_zd<opc, asm, i_zprtype, o_zprtype, Sz>;
2257 def : SVE_3_Op_Pat<vt1, op, vt1, vt2, vt3, !cast<Instruction>(NAME)>;
2260 multiclass sve_fp_2op_p_zd_HSD<bits<5> opc, string asm, SDPatternOperator op> {
2261 def _H : sve_fp_2op_p_zd<{ 0b01, opc }, asm, ZPR16, ZPR16, ElementSizeH>;
2262 def _S : sve_fp_2op_p_zd<{ 0b10, opc }, asm, ZPR32, ZPR32, ElementSizeS>;
2263 def _D : sve_fp_2op_p_zd<{ 0b11, opc }, asm, ZPR64, ZPR64, ElementSizeD>;
2265 def : SVE_3_Op_Pat<nxv8f16, op, nxv8f16, nxv8i1, nxv8f16, !cast<Instruction>(NAME # _H)>;
2266 def : SVE_3_Op_Pat<nxv4f32, op, nxv4f32, nxv4i1, nxv4f32, !cast<Instruction>(NAME # _S)>;
2267 def : SVE_3_Op_Pat<nxv2f64, op, nxv2f64, nxv2i1, nxv2f64, !cast<Instruction>(NAME # _D)>;
2270 multiclass sve2_fp_flogb<string asm, SDPatternOperator op> {
2271 def _H : sve_fp_2op_p_zd<0b0011010, asm, ZPR16, ZPR16, ElementSizeH>;
2272 def _S : sve_fp_2op_p_zd<0b0011100, asm, ZPR32, ZPR32, ElementSizeS>;
2273 def _D : sve_fp_2op_p_zd<0b0011110, asm, ZPR64, ZPR64, ElementSizeD>;
2275 def : SVE_3_Op_Pat<nxv8i16, op, nxv8i16, nxv8i1, nxv8f16, !cast<Instruction>(NAME # _H)>;
2276 def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv4i1, nxv4f32, !cast<Instruction>(NAME # _S)>;
2277 def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv2i1, nxv2f64, !cast<Instruction>(NAME # _D)>;
2280 multiclass sve2_fp_convert_down_odd_rounding<string asm, string op> {
2281 def _DtoS : sve_fp_2op_p_zd<0b0001010, asm, ZPR64, ZPR32, ElementSizeD>;
2282 def : SVE_3_Op_Pat<nxv4f32, !cast<SDPatternOperator>(op # _f32f64), nxv4f32, nxv2i1, nxv2f64, !cast<Instruction>(NAME # _DtoS)>;
2285 //===----------------------------------------------------------------------===//
2286 // SVE Floating Point Unary Operations - Unpredicated Group
2287 //===----------------------------------------------------------------------===//
2289 class sve_fp_2op_u_zd<bits<2> sz, bits<3> opc, string asm,
2291 : I<(outs zprty:$Zd), (ins zprty:$Zn),
2297 let Inst{31-24} = 0b01100101;
2298 let Inst{23-22} = sz;
2299 let Inst{21-19} = 0b001;
2300 let Inst{18-16} = opc;
2301 let Inst{15-10} = 0b001100;
2306 multiclass sve_fp_2op_u_zd<bits<3> opc, string asm, SDPatternOperator op> {
2307 def _H : sve_fp_2op_u_zd<0b01, opc, asm, ZPR16>;
2308 def _S : sve_fp_2op_u_zd<0b10, opc, asm, ZPR32>;
2309 def _D : sve_fp_2op_u_zd<0b11, opc, asm, ZPR64>;
2311 def : SVE_1_Op_Pat<nxv8f16, op, nxv8f16, !cast<Instruction>(NAME # _H)>;
2312 def : SVE_1_Op_Pat<nxv4f32, op, nxv4f32, !cast<Instruction>(NAME # _S)>;
2313 def : SVE_1_Op_Pat<nxv2f64, op, nxv2f64, !cast<Instruction>(NAME # _D)>;
2316 //===----------------------------------------------------------------------===//
2317 // SVE Integer Arithmetic - Binary Predicated Group
2318 //===----------------------------------------------------------------------===//
2320 class sve_int_bin_pred_arit_log<bits<2> sz8_64, bits<2> fmt, bits<3> opc,
2321 string asm, ZPRRegOp zprty>
2322 : I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, zprty:$Zm),
2323 asm, "\t$Zdn, $Pg/m, $_Zdn, $Zm", "", []>, Sched<[]> {
2327 let Inst{31-24} = 0b00000100;
2328 let Inst{23-22} = sz8_64;
2330 let Inst{20-19} = fmt;
2331 let Inst{18-16} = opc;
2332 let Inst{15-13} = 0b000;
2333 let Inst{12-10} = Pg;
2335 let Inst{4-0} = Zdn;
2337 let Constraints = "$Zdn = $_Zdn";
2338 let DestructiveInstType = DestructiveOther;
2339 let ElementSize = zprty.ElementSize;
2342 multiclass sve_int_bin_pred_log<bits<3> opc, string asm, SDPatternOperator op> {
2343 def _B : sve_int_bin_pred_arit_log<0b00, 0b11, opc, asm, ZPR8>;
2344 def _H : sve_int_bin_pred_arit_log<0b01, 0b11, opc, asm, ZPR16>;
2345 def _S : sve_int_bin_pred_arit_log<0b10, 0b11, opc, asm, ZPR32>;
2346 def _D : sve_int_bin_pred_arit_log<0b11, 0b11, opc, asm, ZPR64>;
2348 def : SVE_3_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
2349 def : SVE_3_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
2350 def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
2351 def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
2354 multiclass sve_int_bin_pred_arit_0<bits<3> opc, string asm, string Ps,
2355 SDPatternOperator op,
2356 DestructiveInstTypeEnum flags,
2357 string revname="", bit isReverseInstr=0> {
2358 let DestructiveInstType = flags in {
2359 def _B : sve_int_bin_pred_arit_log<0b00, 0b00, opc, asm, ZPR8>,
2360 SVEPseudo2Instr<Ps # _B, 1>, SVEInstr2Rev<NAME # _B, revname # _B, isReverseInstr>;
2361 def _H : sve_int_bin_pred_arit_log<0b01, 0b00, opc, asm, ZPR16>,
2362 SVEPseudo2Instr<Ps # _H, 1>, SVEInstr2Rev<NAME # _H, revname # _H, isReverseInstr>;
2363 def _S : sve_int_bin_pred_arit_log<0b10, 0b00, opc, asm, ZPR32>,
2364 SVEPseudo2Instr<Ps # _S, 1>, SVEInstr2Rev<NAME # _S, revname # _S, isReverseInstr>;
2365 def _D : sve_int_bin_pred_arit_log<0b11, 0b00, opc, asm, ZPR64>,
2366 SVEPseudo2Instr<Ps # _D, 1>, SVEInstr2Rev<NAME # _D, revname # _D, isReverseInstr>;
2369 def : SVE_3_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
2370 def : SVE_3_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
2371 def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
2372 def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
2375 multiclass sve_int_bin_pred_arit_1<bits<3> opc, string asm, SDPatternOperator op> {
2376 def _B : sve_int_bin_pred_arit_log<0b00, 0b01, opc, asm, ZPR8>;
2377 def _H : sve_int_bin_pred_arit_log<0b01, 0b01, opc, asm, ZPR16>;
2378 def _S : sve_int_bin_pred_arit_log<0b10, 0b01, opc, asm, ZPR32>;
2379 def _D : sve_int_bin_pred_arit_log<0b11, 0b01, opc, asm, ZPR64>;
2381 def : SVE_3_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
2382 def : SVE_3_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
2383 def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
2384 def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
2387 multiclass sve_int_bin_pred_arit_2<bits<3> opc, string asm, SDPatternOperator op> {
2388 def _B : sve_int_bin_pred_arit_log<0b00, 0b10, opc, asm, ZPR8>;
2389 def _H : sve_int_bin_pred_arit_log<0b01, 0b10, opc, asm, ZPR16>;
2390 def _S : sve_int_bin_pred_arit_log<0b10, 0b10, opc, asm, ZPR32>;
2391 def _D : sve_int_bin_pred_arit_log<0b11, 0b10, opc, asm, ZPR64>;
2393 def : SVE_3_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
2394 def : SVE_3_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
2395 def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
2396 def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
2399 // Special case for divides which are not defined for 8b/16b elements.
2400 multiclass sve_int_bin_pred_arit_2_div<bits<3> opc, string asm, string Ps,
2401 SDPatternOperator op,
2402 DestructiveInstTypeEnum flags,
2403 string revname="", bit isReverseInstr=0> {
2404 let DestructiveInstType = flags in {
2405 def _S : sve_int_bin_pred_arit_log<0b10, 0b10, opc, asm, ZPR32>,
2406 SVEPseudo2Instr<Ps # _S, 1>, SVEInstr2Rev<NAME # _S, revname # _S, isReverseInstr>;
2407 def _D : sve_int_bin_pred_arit_log<0b11, 0b10, opc, asm, ZPR64>,
2408 SVEPseudo2Instr<Ps # _D, 1>, SVEInstr2Rev<NAME # _D, revname # _D, isReverseInstr>;
2411 def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
2412 def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
2415 //===----------------------------------------------------------------------===//
2416 // SVE Integer Multiply-Add Group
2417 //===----------------------------------------------------------------------===//
2419 class sve_int_mladdsub_vvv_pred<bits<2> sz8_64, bits<1> opc, string asm,
2421 : I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, zprty:$Zm, zprty:$Za),
2422 asm, "\t$Zdn, $Pg/m, $Zm, $Za",
2429 let Inst{31-24} = 0b00000100;
2430 let Inst{23-22} = sz8_64;
2432 let Inst{20-16} = Zm;
2433 let Inst{15-14} = 0b11;
2435 let Inst{12-10} = Pg;
2437 let Inst{4-0} = Zdn;
2439 let Constraints = "$Zdn = $_Zdn";
2440 let DestructiveInstType = DestructiveOther;
2441 let ElementSize = zprty.ElementSize;
2444 multiclass sve_int_mladdsub_vvv_pred<bits<1> opc, string asm, SDPatternOperator op> {
2445 def _B : sve_int_mladdsub_vvv_pred<0b00, opc, asm, ZPR8>;
2446 def _H : sve_int_mladdsub_vvv_pred<0b01, opc, asm, ZPR16>;
2447 def _S : sve_int_mladdsub_vvv_pred<0b10, opc, asm, ZPR32>;
2448 def _D : sve_int_mladdsub_vvv_pred<0b11, opc, asm, ZPR64>;
2450 def : SVE_4_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
2451 def : SVE_4_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
2452 def : SVE_4_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
2453 def : SVE_4_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
2456 class sve_int_mlas_vvv_pred<bits<2> sz8_64, bits<1> opc, string asm,
2458 : I<(outs zprty:$Zda), (ins PPR3bAny:$Pg, zprty:$_Zda, zprty:$Zn, zprty:$Zm),
2459 asm, "\t$Zda, $Pg/m, $Zn, $Zm",
2466 let Inst{31-24} = 0b00000100;
2467 let Inst{23-22} = sz8_64;
2469 let Inst{20-16} = Zm;
2470 let Inst{15-14} = 0b01;
2472 let Inst{12-10} = Pg;
2474 let Inst{4-0} = Zda;
2476 let Constraints = "$Zda = $_Zda";
2477 let DestructiveInstType = DestructiveOther;
2478 let ElementSize = zprty.ElementSize;
2481 multiclass sve_int_mlas_vvv_pred<bits<1> opc, string asm, SDPatternOperator op> {
2482 def _B : sve_int_mlas_vvv_pred<0b00, opc, asm, ZPR8>;
2483 def _H : sve_int_mlas_vvv_pred<0b01, opc, asm, ZPR16>;
2484 def _S : sve_int_mlas_vvv_pred<0b10, opc, asm, ZPR32>;
2485 def _D : sve_int_mlas_vvv_pred<0b11, opc, asm, ZPR64>;
2487 def : SVE_4_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
2488 def : SVE_4_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
2489 def : SVE_4_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
2490 def : SVE_4_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
2493 //===----------------------------------------------------------------------===//
2494 // SVE2 Integer Multiply-Add - Unpredicated Group
2495 //===----------------------------------------------------------------------===//
2497 class sve2_int_mla<bits<2> sz, bits<5> opc, string asm,
2498 ZPRRegOp zprty1, ZPRRegOp zprty2>
2499 : I<(outs zprty1:$Zda), (ins zprty1:$_Zda, zprty2:$Zn, zprty2:$Zm),
2500 asm, "\t$Zda, $Zn, $Zm", "", []>, Sched<[]> {
2504 let Inst{31-24} = 0b01000100;
2505 let Inst{23-22} = sz;
2507 let Inst{20-16} = Zm;
2509 let Inst{14-10} = opc;
2511 let Inst{4-0} = Zda;
2513 let Constraints = "$Zda = $_Zda";
2514 let DestructiveInstType = DestructiveOther;
2515 let ElementSize = ElementSizeNone;
2518 multiclass sve2_int_mla<bit S, string asm, SDPatternOperator op> {
2519 def _B : sve2_int_mla<0b00, { 0b1110, S }, asm, ZPR8, ZPR8>;
2520 def _H : sve2_int_mla<0b01, { 0b1110, S }, asm, ZPR16, ZPR16>;
2521 def _S : sve2_int_mla<0b10, { 0b1110, S }, asm, ZPR32, ZPR32>;
2522 def _D : sve2_int_mla<0b11, { 0b1110, S }, asm, ZPR64, ZPR64>;
2524 def : SVE_3_Op_Pat<nxv16i8, op, nxv16i8, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
2525 def : SVE_3_Op_Pat<nxv8i16, op, nxv8i16, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
2526 def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
2527 def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
2530 multiclass sve2_int_mla_long<bits<5> opc, string asm, SDPatternOperator op> {
2531 def _H : sve2_int_mla<0b01, opc, asm, ZPR16, ZPR8>;
2532 def _S : sve2_int_mla<0b10, opc, asm, ZPR32, ZPR16>;
2533 def _D : sve2_int_mla<0b11, opc, asm, ZPR64, ZPR32>;
2535 def : SVE_3_Op_Pat<nxv8i16, op, nxv8i16, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _H)>;
2536 def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _S)>;
2537 def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _D)>;
2540 //===----------------------------------------------------------------------===//
2541 // SVE2 Integer Multiply-Add - Indexed Group
2542 //===----------------------------------------------------------------------===//
2544 class sve2_int_mla_by_indexed_elem<bits<2> sz, bits<6> opc, string asm,
2545 ZPRRegOp zprty1, ZPRRegOp zprty2,
2546 ZPRRegOp zprty3, Operand itype>
2547 : I<(outs zprty1:$Zda), (ins zprty1:$_Zda, zprty2:$Zn, zprty3:$Zm, itype:$iop),
2548 asm, "\t$Zda, $Zn, $Zm$iop", "", []>, Sched<[]> {
2551 let Inst{31-24} = 0b01000100;
2552 let Inst{23-22} = sz;
2554 let Inst{15-10} = opc;
2556 let Inst{4-0} = Zda;
2558 let Constraints = "$Zda = $_Zda";
2559 let DestructiveInstType = DestructiveOther;
2560 let ElementSize = ElementSizeNone;
2563 multiclass sve2_int_mla_by_indexed_elem<bits<2> opc, bit S, string asm,
2564 SDPatternOperator op> {
2565 def _H : sve2_int_mla_by_indexed_elem<{0, ?}, { 0b000, opc, S }, asm, ZPR16, ZPR16, ZPR3b16, VectorIndexH32b> {
2568 let Inst{22} = iop{2};
2569 let Inst{20-19} = iop{1-0};
2570 let Inst{18-16} = Zm;
2572 def _S : sve2_int_mla_by_indexed_elem<0b10, { 0b000, opc, S }, asm, ZPR32, ZPR32, ZPR3b32, VectorIndexS32b> {
2575 let Inst{20-19} = iop;
2576 let Inst{18-16} = Zm;
2578 def _D : sve2_int_mla_by_indexed_elem<0b11, { 0b000, opc, S }, asm, ZPR64, ZPR64, ZPR4b64, VectorIndexD32b> {
2582 let Inst{19-16} = Zm;
2585 def : SVE_4_Op_Imm_Pat<nxv8i16, op, nxv8i16, nxv8i16, nxv8i16, i32, VectorIndexH32b_timm, !cast<Instruction>(NAME # _H)>;
2586 def : SVE_4_Op_Imm_Pat<nxv4i32, op, nxv4i32, nxv4i32, nxv4i32, i32, VectorIndexS32b_timm, !cast<Instruction>(NAME # _S)>;
2587 def : SVE_4_Op_Imm_Pat<nxv2i64, op, nxv2i64, nxv2i64, nxv2i64, i32, VectorIndexD32b_timm, !cast<Instruction>(NAME # _D)>;
2590 //===----------------------------------------------------------------------===//
2591 // SVE2 Integer Multiply-Add Long - Indexed Group
2592 //===----------------------------------------------------------------------===//
2594 multiclass sve2_int_mla_long_by_indexed_elem<bits<4> opc, string asm, SDPatternOperator op> {
2595 def _S : sve2_int_mla_by_indexed_elem<0b10, { opc{3}, 0b0, opc{2-1}, ?, opc{0} },
2596 asm, ZPR32, ZPR16, ZPR3b16, VectorIndexH32b> {
2599 let Inst{20-19} = iop{2-1};
2600 let Inst{18-16} = Zm;
2601 let Inst{11} = iop{0};
2603 def _D : sve2_int_mla_by_indexed_elem<0b11, { opc{3}, 0b0, opc{2-1}, ?, opc{0} },
2604 asm, ZPR64, ZPR32, ZPR4b32, VectorIndexS32b> {
2607 let Inst{20} = iop{1};
2608 let Inst{19-16} = Zm;
2609 let Inst{11} = iop{0};
2612 def : SVE_4_Op_Imm_Pat<nxv4i32, op, nxv4i32, nxv8i16, nxv8i16, i32, VectorIndexH32b_timm, !cast<Instruction>(NAME # _S)>;
2613 def : SVE_4_Op_Imm_Pat<nxv2i64, op, nxv2i64, nxv4i32, nxv4i32, i32, VectorIndexS32b_timm, !cast<Instruction>(NAME # _D)>;
2616 //===----------------------------------------------------------------------===//
2617 // SVE Integer Dot Product Group
2618 //===----------------------------------------------------------------------===//
2620 class sve_intx_dot<bit sz, bit U, string asm, ZPRRegOp zprty1,
2622 : I<(outs zprty1:$Zda), (ins zprty1:$_Zda, zprty2:$Zn, zprty2:$Zm), asm,
2623 "\t$Zda, $Zn, $Zm", "", []>, Sched<[]> {
2627 let Inst{31-23} = 0b010001001;
2630 let Inst{20-16} = Zm;
2631 let Inst{15-11} = 0;
2634 let Inst{4-0} = Zda;
2636 let Constraints = "$Zda = $_Zda";
2637 let DestructiveInstType = DestructiveOther;
2640 multiclass sve_intx_dot<bit opc, string asm, SDPatternOperator op> {
2641 def _S : sve_intx_dot<0b0, opc, asm, ZPR32, ZPR8>;
2642 def _D : sve_intx_dot<0b1, opc, asm, ZPR64, ZPR16>;
2644 def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _S)>;
2645 def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _D)>;
2648 //===----------------------------------------------------------------------===//
2649 // SVE Integer Dot Product Group - Indexed Group
2650 //===----------------------------------------------------------------------===//
2652 class sve_intx_dot_by_indexed_elem<bit sz, bit U, string asm,
2653 ZPRRegOp zprty1, ZPRRegOp zprty2,
2654 ZPRRegOp zprty3, Operand itype>
2655 : I<(outs zprty1:$Zda), (ins zprty1:$_Zda, zprty2:$Zn, zprty3:$Zm, itype:$iop),
2656 asm, "\t$Zda, $Zn, $Zm$iop",
2657 "", []>, Sched<[]> {
2660 let Inst{31-23} = 0b010001001;
2663 let Inst{15-11} = 0;
2666 let Inst{4-0} = Zda;
2668 let Constraints = "$Zda = $_Zda";
2669 let DestructiveInstType = DestructiveOther;
2672 multiclass sve_intx_dot_by_indexed_elem<bit opc, string asm,
2673 SDPatternOperator op> {
2674 def _S : sve_intx_dot_by_indexed_elem<0b0, opc, asm, ZPR32, ZPR8, ZPR3b8, VectorIndexS32b_timm> {
2677 let Inst{20-19} = iop;
2678 let Inst{18-16} = Zm;
2680 def _D : sve_intx_dot_by_indexed_elem<0b1, opc, asm, ZPR64, ZPR16, ZPR4b16, VectorIndexD32b_timm> {
2684 let Inst{19-16} = Zm;
2687 def : Pat<(nxv4i32 (op nxv4i32:$Op1, nxv16i8:$Op2, nxv16i8:$Op3, (i32 VectorIndexS32b_timm:$idx))),
2688 (!cast<Instruction>(NAME # _S) $Op1, $Op2, $Op3, VectorIndexS32b_timm:$idx)>;
2689 def : Pat<(nxv2i64 (op nxv2i64:$Op1, nxv8i16:$Op2, nxv8i16:$Op3, (i32 VectorIndexD32b_timm:$idx))),
2690 (!cast<Instruction>(NAME # _D) $Op1, $Op2, $Op3, VectorIndexD32b_timm:$idx)>;
2693 //===----------------------------------------------------------------------===//
2694 // SVE2 Complex Integer Dot Product Group
2695 //===----------------------------------------------------------------------===//
2697 class sve2_complex_int_arith<bits<2> sz, bits<4> opc, string asm,
2698 ZPRRegOp zprty1, ZPRRegOp zprty2>
2699 : I<(outs zprty1:$Zda), (ins zprty1:$_Zda, zprty2:$Zn, zprty2:$Zm,
2700 complexrotateop:$rot),
2701 asm, "\t$Zda, $Zn, $Zm, $rot", "", []>, Sched<[]> {
2706 let Inst{31-24} = 0b01000100;
2707 let Inst{23-22} = sz;
2709 let Inst{20-16} = Zm;
2710 let Inst{15-12} = opc;
2711 let Inst{11-10} = rot;
2713 let Inst{4-0} = Zda;
2715 let Constraints = "$Zda = $_Zda";
2716 let DestructiveInstType = DestructiveOther;
2717 let ElementSize = ElementSizeNone;
2720 multiclass sve2_cintx_dot<string asm, SDPatternOperator op> {
2721 def _S : sve2_complex_int_arith<0b10, 0b0001, asm, ZPR32, ZPR8>;
2722 def _D : sve2_complex_int_arith<0b11, 0b0001, asm, ZPR64, ZPR16>;
2724 def : Pat<(nxv4i32 (op (nxv4i32 ZPR32:$Op1), (nxv16i8 ZPR8:$Op2), (nxv16i8 ZPR8:$Op3),
2725 (i32 complexrotateop:$imm))),
2726 (!cast<Instruction>(NAME # "_S") ZPR32:$Op1, ZPR8:$Op2, ZPR8:$Op3, complexrotateop:$imm)>;
2727 def : Pat<(nxv2i64 (op (nxv2i64 ZPR64:$Op1), (nxv8i16 ZPR16:$Op2), (nxv8i16 ZPR16:$Op3),
2728 (i32 complexrotateop:$imm))),
2729 (!cast<Instruction>(NAME # "_D") ZPR64:$Op1, ZPR16:$Op2, ZPR16:$Op3, complexrotateop:$imm)>;
2732 //===----------------------------------------------------------------------===//
2733 // SVE2 Complex Multiply-Add Group
2734 //===----------------------------------------------------------------------===//
2736 multiclass sve2_int_cmla<bit opc, string asm, SDPatternOperator op> {
2737 def _B : sve2_complex_int_arith<0b00, { 0b001, opc }, asm, ZPR8, ZPR8>;
2738 def _H : sve2_complex_int_arith<0b01, { 0b001, opc }, asm, ZPR16, ZPR16>;
2739 def _S : sve2_complex_int_arith<0b10, { 0b001, opc }, asm, ZPR32, ZPR32>;
2740 def _D : sve2_complex_int_arith<0b11, { 0b001, opc }, asm, ZPR64, ZPR64>;
2742 def : SVE_4_Op_Imm_Pat<nxv16i8, op, nxv16i8, nxv16i8, nxv16i8, i32, complexrotateop, !cast<Instruction>(NAME # _B)>;
2743 def : SVE_4_Op_Imm_Pat<nxv8i16, op, nxv8i16, nxv8i16, nxv8i16, i32, complexrotateop, !cast<Instruction>(NAME # _H)>;
2744 def : SVE_4_Op_Imm_Pat<nxv4i32, op, nxv4i32, nxv4i32, nxv4i32, i32, complexrotateop, !cast<Instruction>(NAME # _S)>;
2745 def : SVE_4_Op_Imm_Pat<nxv2i64, op, nxv2i64, nxv2i64, nxv2i64, i32, complexrotateop, !cast<Instruction>(NAME # _D)>;
2748 //===----------------------------------------------------------------------===//
2749 // SVE2 Complex Integer Dot Product - Indexed Group
2750 //===----------------------------------------------------------------------===//
2752 class sve2_complex_int_arith_indexed<bits<2> sz, bits<4> opc, string asm,
2753 ZPRRegOp zprty1, ZPRRegOp zprty2,
2754 ZPRRegOp zprty3, Operand itype>
2755 : I<(outs zprty1:$Zda), (ins zprty1:$_Zda, zprty2:$Zn, zprty3:$Zm, itype:$iop,
2756 complexrotateop:$rot),
2757 asm, "\t$Zda, $Zn, $Zm$iop, $rot", "", []>, Sched<[]> {
2761 let Inst{31-24} = 0b01000100;
2762 let Inst{23-22} = sz;
2764 let Inst{15-12} = opc;
2765 let Inst{11-10} = rot;
2767 let Inst{4-0} = Zda;
2769 let Constraints = "$Zda = $_Zda";
2770 let DestructiveInstType = DestructiveOther;
2771 let ElementSize = ElementSizeNone;
2774 multiclass sve2_cintx_dot_by_indexed_elem<string asm, SDPatternOperator op> {
2775 def _S : sve2_complex_int_arith_indexed<0b10, 0b0100, asm, ZPR32, ZPR8, ZPR3b8, VectorIndexS32b> {
2778 let Inst{20-19} = iop;
2779 let Inst{18-16} = Zm;
2781 def _D : sve2_complex_int_arith_indexed<0b11, 0b0100, asm, ZPR64, ZPR16, ZPR4b16, VectorIndexD32b> {
2785 let Inst{19-16} = Zm;
2788 def : Pat<(nxv4i32 (op (nxv4i32 ZPR32:$Op1), (nxv16i8 ZPR8:$Op2), (nxv16i8 ZPR8:$Op3),
2789 (i32 VectorIndexS32b_timm:$idx), (i32 complexrotateop:$imm))),
2790 (!cast<Instruction>(NAME # "_S") ZPR32:$Op1, ZPR8:$Op2, ZPR8:$Op3, VectorIndexS32b_timm:$idx, complexrotateop:$imm)>;
2791 def : Pat<(nxv2i64 (op (nxv2i64 ZPR64:$Op1), (nxv8i16 ZPR16:$Op2), (nxv8i16 ZPR16:$Op3),
2792 (i32 VectorIndexD32b_timm:$idx), (i32 complexrotateop:$imm))),
2793 (!cast<Instruction>(NAME # "_D") ZPR64:$Op1, ZPR16:$Op2, ZPR16:$Op3, VectorIndexD32b_timm:$idx, complexrotateop:$imm)>;
2796 //===----------------------------------------------------------------------===//
2797 // SVE2 Complex Multiply-Add - Indexed Group
2798 //===----------------------------------------------------------------------===//
2800 multiclass sve2_cmla_by_indexed_elem<bit opc, string asm,
2801 SDPatternOperator op> {
2802 def _H : sve2_complex_int_arith_indexed<0b10, { 0b011, opc }, asm, ZPR16, ZPR16, ZPR3b16, VectorIndexS32b> {
2805 let Inst{20-19} = iop;
2806 let Inst{18-16} = Zm;
2808 def _S : sve2_complex_int_arith_indexed<0b11, { 0b011, opc }, asm, ZPR32, ZPR32, ZPR4b32, VectorIndexD32b> {
2812 let Inst{19-16} = Zm;
2815 def : Pat<(nxv8i16 (op (nxv8i16 ZPR16:$Op1), (nxv8i16 ZPR16:$Op2), (nxv8i16 ZPR16:$Op3),
2816 (i32 VectorIndexS32b_timm:$idx), (i32 complexrotateop:$imm))),
2817 (!cast<Instruction>(NAME # "_H") ZPR16:$Op1, ZPR16:$Op2, ZPR16:$Op3, VectorIndexS32b_timm:$idx, complexrotateop:$imm)>;
2819 def : Pat<(nxv4i32 (op (nxv4i32 ZPR32:$Op1), (nxv4i32 ZPR32:$Op2), (nxv4i32 ZPR32:$Op3),
2820 (i32 VectorIndexD32b_timm:$idx), (i32 complexrotateop:$imm))),
2821 (!cast<Instruction>(NAME # "_S") ZPR32:$Op1, ZPR32:$Op2, ZPR32:$Op3, VectorIndexD32b_timm:$idx, complexrotateop:$imm)>;
2824 //===----------------------------------------------------------------------===//
2825 // SVE2 Integer Multiply - Unpredicated Group
2826 //===----------------------------------------------------------------------===//
2828 class sve2_int_mul<bits<2> sz, bits<3> opc, string asm, ZPRRegOp zprty>
2829 : I<(outs zprty:$Zd), (ins zprty:$Zn, zprty:$Zm),
2830 asm, "\t$Zd, $Zn, $Zm", "", []>, Sched<[]> {
2834 let Inst{31-24} = 0b00000100;
2835 let Inst{23-22} = sz;
2837 let Inst{20-16} = Zm;
2838 let Inst{15-13} = 0b011;
2839 let Inst{12-10} = opc;
2844 multiclass sve2_int_mul<bits<3> opc, string asm, SDPatternOperator op> {
2845 def _B : sve2_int_mul<0b00, opc, asm, ZPR8>;
2846 def _H : sve2_int_mul<0b01, opc, asm, ZPR16>;
2847 def _S : sve2_int_mul<0b10, opc, asm, ZPR32>;
2848 def _D : sve2_int_mul<0b11, opc, asm, ZPR64>;
2850 def : SVE_2_Op_Pat<nxv16i8, op, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
2851 def : SVE_2_Op_Pat<nxv8i16, op, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
2852 def : SVE_2_Op_Pat<nxv4i32, op, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
2853 def : SVE_2_Op_Pat<nxv2i64, op, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
2856 multiclass sve2_int_mul_single<bits<3> opc, string asm, SDPatternOperator op> {
2857 def _B : sve2_int_mul<0b00, opc, asm, ZPR8>;
2859 def : SVE_2_Op_Pat<nxv16i8, op, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
2862 //===----------------------------------------------------------------------===//
2863 // SVE2 Integer Multiply - Indexed Group
2864 //===----------------------------------------------------------------------===//
2866 class sve2_int_mul_by_indexed_elem<bits<2> sz, bits<4> opc, string asm,
2867 ZPRRegOp zprty1, ZPRRegOp zprty2,
2868 ZPRRegOp zprty3, Operand itype>
2869 : I<(outs zprty1:$Zd), (ins zprty2:$Zn, zprty3:$Zm, itype:$iop),
2870 asm, "\t$Zd, $Zn, $Zm$iop", "", []>, Sched<[]> {
2873 let Inst{31-24} = 0b01000100;
2874 let Inst{23-22} = sz;
2876 let Inst{15-14} = 0b11;
2877 let Inst{13-10} = opc;
2882 multiclass sve2_int_mul_by_indexed_elem<bits<4> opc, string asm,
2883 SDPatternOperator op> {
2884 def _H : sve2_int_mul_by_indexed_elem<{0, ?}, opc, asm, ZPR16, ZPR16, ZPR3b16, VectorIndexH32b> {
2887 let Inst{22} = iop{2};
2888 let Inst{20-19} = iop{1-0};
2889 let Inst{18-16} = Zm;
2891 def _S : sve2_int_mul_by_indexed_elem<0b10, opc, asm, ZPR32, ZPR32, ZPR3b32, VectorIndexS32b> {
2894 let Inst{20-19} = iop;
2895 let Inst{18-16} = Zm;
2897 def _D : sve2_int_mul_by_indexed_elem<0b11, opc, asm, ZPR64, ZPR64, ZPR4b64, VectorIndexD32b> {
2901 let Inst{19-16} = Zm;
2904 def : SVE_3_Op_Imm_Pat<nxv8i16, op, nxv8i16, nxv8i16, i32, VectorIndexH32b_timm, !cast<Instruction>(NAME # _H)>;
2905 def : SVE_3_Op_Imm_Pat<nxv4i32, op, nxv4i32, nxv4i32, i32, VectorIndexS32b_timm, !cast<Instruction>(NAME # _S)>;
2906 def : SVE_3_Op_Imm_Pat<nxv2i64, op, nxv2i64, nxv2i64, i32, VectorIndexD32b_timm, !cast<Instruction>(NAME # _D)>;
2909 multiclass sve2_int_mul_long_by_indexed_elem<bits<3> opc, string asm,
2910 SDPatternOperator op> {
2911 def _S : sve2_int_mul_by_indexed_elem<0b10, { opc{2-1}, ?, opc{0} }, asm,
2912 ZPR32, ZPR16, ZPR3b16, VectorIndexH32b> {
2915 let Inst{20-19} = iop{2-1};
2916 let Inst{18-16} = Zm;
2917 let Inst{11} = iop{0};
2919 def _D : sve2_int_mul_by_indexed_elem<0b11, { opc{2-1}, ?, opc{0} }, asm,
2920 ZPR64, ZPR32, ZPR4b32, VectorIndexS32b> {
2923 let Inst{20} = iop{1};
2924 let Inst{19-16} = Zm;
2925 let Inst{11} = iop{0};
2928 def : SVE_3_Op_Imm_Pat<nxv4i32, op, nxv8i16, nxv8i16, i32, VectorIndexH32b_timm, !cast<Instruction>(NAME # _S)>;
2929 def : SVE_3_Op_Imm_Pat<nxv2i64, op, nxv4i32, nxv4i32, i32, VectorIndexS32b_timm, !cast<Instruction>(NAME # _D)>;
2932 //===----------------------------------------------------------------------===//
2933 // SVE2 Integer - Predicated Group
2934 //===----------------------------------------------------------------------===//
2936 class sve2_int_arith_pred<bits<2> sz, bits<6> opc, string asm,
2938 : I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, zprty:$Zm),
2939 asm, "\t$Zdn, $Pg/m, $_Zdn, $Zm", "", []>, Sched<[]> {
2943 let Inst{31-24} = 0b01000100;
2944 let Inst{23-22} = sz;
2945 let Inst{21-20} = 0b01;
2946 let Inst{20-16} = opc{5-1};
2947 let Inst{15-14} = 0b10;
2948 let Inst{13} = opc{0};
2949 let Inst{12-10} = Pg;
2951 let Inst{4-0} = Zdn;
2953 let Constraints = "$Zdn = $_Zdn";
2954 let DestructiveInstType = DestructiveOther;
2955 let ElementSize = zprty.ElementSize;
2958 multiclass sve2_int_arith_pred<bits<6> opc, string asm, SDPatternOperator op> {
2959 def _B : sve2_int_arith_pred<0b00, opc, asm, ZPR8>;
2960 def _H : sve2_int_arith_pred<0b01, opc, asm, ZPR16>;
2961 def _S : sve2_int_arith_pred<0b10, opc, asm, ZPR32>;
2962 def _D : sve2_int_arith_pred<0b11, opc, asm, ZPR64>;
2964 def : SVE_3_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
2965 def : SVE_3_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
2966 def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
2967 def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
2970 class sve2_int_sadd_long_accum_pairwise<bits<2> sz, bit U, string asm,
2971 ZPRRegOp zprty1, ZPRRegOp zprty2>
2972 : I<(outs zprty1:$Zda), (ins PPR3bAny:$Pg, zprty1:$_Zda, zprty2:$Zn),
2973 asm, "\t$Zda, $Pg/m, $Zn", "", []>, Sched<[]> {
2977 let Inst{31-24} = 0b01000100;
2978 let Inst{23-22} = sz;
2979 let Inst{21-17} = 0b00010;
2981 let Inst{15-13} = 0b101;
2982 let Inst{12-10} = Pg;
2984 let Inst{4-0} = Zda;
2986 let Constraints = "$Zda = $_Zda";
2987 let DestructiveInstType = DestructiveOther;
2988 let ElementSize = zprty1.ElementSize;
2991 multiclass sve2_int_sadd_long_accum_pairwise<bit U, string asm, SDPatternOperator op> {
2992 def _H : sve2_int_sadd_long_accum_pairwise<0b01, U, asm, ZPR16, ZPR8>;
2993 def _S : sve2_int_sadd_long_accum_pairwise<0b10, U, asm, ZPR32, ZPR16>;
2994 def _D : sve2_int_sadd_long_accum_pairwise<0b11, U, asm, ZPR64, ZPR32>;
2996 def : SVE_3_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, nxv16i8, !cast<Instruction>(NAME # _H)>;
2997 def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv8i16, !cast<Instruction>(NAME # _S)>;
2998 def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv4i32, !cast<Instruction>(NAME # _D)>;
3001 class sve2_int_un_pred_arit<bits<2> sz, bit Q, bits<2> opc,
3002 string asm, ZPRRegOp zprty>
3003 : I<(outs zprty:$Zd), (ins zprty:$_Zd, PPR3bAny:$Pg, zprty:$Zn),
3004 asm, "\t$Zd, $Pg/m, $Zn",
3010 let Inst{31-24} = 0b01000100;
3011 let Inst{23-22} = sz;
3012 let Inst{21-20} = 0b00;
3015 let Inst{17-16} = opc;
3016 let Inst{15-13} = 0b101;
3017 let Inst{12-10} = Pg;
3021 let Constraints = "$Zd = $_Zd";
3022 let DestructiveInstType = DestructiveOther;
3023 let ElementSize = zprty.ElementSize;
3026 multiclass sve2_int_un_pred_arit_s<bits<3> opc, string asm,
3027 SDPatternOperator op> {
3028 def _S : sve2_int_un_pred_arit<0b10, opc{2}, opc{1-0}, asm, ZPR32>;
3029 def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv4i1, nxv4i32, !cast<Instruction>(NAME # _S)>;
3032 multiclass sve2_int_un_pred_arit<bits<3> opc, string asm, SDPatternOperator op> {
3033 def _B : sve2_int_un_pred_arit<0b00, opc{2}, opc{1-0}, asm, ZPR8>;
3034 def _H : sve2_int_un_pred_arit<0b01, opc{2}, opc{1-0}, asm, ZPR16>;
3035 def _S : sve2_int_un_pred_arit<0b10, opc{2}, opc{1-0}, asm, ZPR32>;
3036 def _D : sve2_int_un_pred_arit<0b11, opc{2}, opc{1-0}, asm, ZPR64>;
3038 def : SVE_3_Op_Pat<nxv16i8, op, nxv16i8, nxv16i1, nxv16i8, !cast<Instruction>(NAME # _B)>;
3039 def : SVE_3_Op_Pat<nxv8i16, op, nxv8i16, nxv8i1, nxv8i16, !cast<Instruction>(NAME # _H)>;
3040 def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv4i1, nxv4i32, !cast<Instruction>(NAME # _S)>;
3041 def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv2i1, nxv2i64, !cast<Instruction>(NAME # _D)>;
3044 //===----------------------------------------------------------------------===//
3045 // SVE2 Widening Integer Arithmetic Group
3046 //===----------------------------------------------------------------------===//
3048 class sve2_wide_int_arith<bits<2> sz, bits<5> opc, string asm,
3049 ZPRRegOp zprty1, ZPRRegOp zprty2, ZPRRegOp zprty3>
3050 : I<(outs zprty1:$Zd), (ins zprty2:$Zn, zprty3:$Zm),
3051 asm, "\t$Zd, $Zn, $Zm", "", []>, Sched<[]> {
3055 let Inst{31-24} = 0b01000101;
3056 let Inst{23-22} = sz;
3058 let Inst{20-16} = Zm;
3060 let Inst{14-10} = opc;
3065 multiclass sve2_wide_int_arith_long<bits<5> opc, string asm,
3066 SDPatternOperator op> {
3067 def _H : sve2_wide_int_arith<0b01, opc, asm, ZPR16, ZPR8, ZPR8>;
3068 def _S : sve2_wide_int_arith<0b10, opc, asm, ZPR32, ZPR16, ZPR16>;
3069 def _D : sve2_wide_int_arith<0b11, opc, asm, ZPR64, ZPR32, ZPR32>;
3071 def : SVE_2_Op_Pat<nxv8i16, op, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _H)>;
3072 def : SVE_2_Op_Pat<nxv4i32, op, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _S)>;
3073 def : SVE_2_Op_Pat<nxv2i64, op, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _D)>;
3076 multiclass sve2_wide_int_arith_wide<bits<3> opc, string asm,
3077 SDPatternOperator op> {
3078 def _H : sve2_wide_int_arith<0b01, { 0b10, opc }, asm, ZPR16, ZPR16, ZPR8>;
3079 def _S : sve2_wide_int_arith<0b10, { 0b10, opc }, asm, ZPR32, ZPR32, ZPR16>;
3080 def _D : sve2_wide_int_arith<0b11, { 0b10, opc }, asm, ZPR64, ZPR64, ZPR32>;
3082 def : SVE_2_Op_Pat<nxv8i16, op, nxv8i16, nxv16i8, !cast<Instruction>(NAME # _H)>;
3083 def : SVE_2_Op_Pat<nxv4i32, op, nxv4i32, nxv8i16, !cast<Instruction>(NAME # _S)>;
3084 def : SVE_2_Op_Pat<nxv2i64, op, nxv2i64, nxv4i32, !cast<Instruction>(NAME # _D)>;
3087 multiclass sve2_wide_int_arith_pmul<bits<2> sz, bits<5> opc, string asm,
3088 SDPatternOperator op> {
3089 def NAME : sve2_wide_int_arith<sz, opc, asm, ZPR128, ZPR64, ZPR64>;
3091 // To avoid using 128 bit elements in the IR, the pattern below works with
3092 // llvm intrinsics with the _pair suffix, to reflect that
3093 // _Q is implemented as a pair of _D.
3094 def : SVE_2_Op_Pat<nxv2i64, op, nxv2i64, nxv2i64, !cast<Instruction>(NAME)>;
3097 multiclass sve2_pmul_long<bits<1> opc, string asm, SDPatternOperator op> {
3098 def _H : sve2_wide_int_arith<0b01, {0b1101, opc}, asm, ZPR16, ZPR8, ZPR8>;
3099 def _D : sve2_wide_int_arith<0b11, {0b1101, opc}, asm, ZPR64, ZPR32, ZPR32>;
3101 // To avoid using 128 bit elements in the IR, the patterns below work with
3102 // llvm intrinsics with the _pair suffix, to reflect that
3103 // _H is implemented as a pair of _B and _D is implemented as a pair of _S.
3104 def : SVE_2_Op_Pat<nxv16i8, op, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _H)>;
3105 def : SVE_2_Op_Pat<nxv4i32, op, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _D)>;
3108 //===----------------------------------------------------------------------===//
3110 //===----------------------------------------------------------------------===//
3112 class sve2_misc<bits<2> sz, bits<4> opc, string asm,
3113 ZPRRegOp zprty1, ZPRRegOp zprty2>
3114 : I<(outs zprty1:$Zd), (ins zprty2:$Zn, zprty2:$Zm),
3115 asm, "\t$Zd, $Zn, $Zm", "", []>, Sched<[]> {
3119 let Inst{31-24} = 0b01000101;
3120 let Inst{23-22} = sz;
3122 let Inst{20-16} = Zm;
3123 let Inst{15-14} = 0b10;
3124 let Inst{13-10} = opc;
3129 multiclass sve2_misc_bitwise<bits<4> opc, string asm, SDPatternOperator op> {
3130 def _B : sve2_misc<0b00, opc, asm, ZPR8, ZPR8>;
3131 def _H : sve2_misc<0b01, opc, asm, ZPR16, ZPR16>;
3132 def _S : sve2_misc<0b10, opc, asm, ZPR32, ZPR32>;
3133 def _D : sve2_misc<0b11, opc, asm, ZPR64, ZPR64>;
3135 def : SVE_2_Op_Pat<nxv16i8, op, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
3136 def : SVE_2_Op_Pat<nxv8i16, op, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
3137 def : SVE_2_Op_Pat<nxv4i32, op, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
3138 def : SVE_2_Op_Pat<nxv2i64, op, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
3141 multiclass sve2_misc_int_addsub_long_interleaved<bits<2> opc, string asm,
3142 SDPatternOperator op> {
3143 def _H : sve2_misc<0b01, { 0b00, opc }, asm, ZPR16, ZPR8>;
3144 def _S : sve2_misc<0b10, { 0b00, opc }, asm, ZPR32, ZPR16>;
3145 def _D : sve2_misc<0b11, { 0b00, opc }, asm, ZPR64, ZPR32>;
3147 def : SVE_2_Op_Pat<nxv8i16, op, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _H)>;
3148 def : SVE_2_Op_Pat<nxv4i32, op, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _S)>;
3149 def : SVE_2_Op_Pat<nxv2i64, op, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _D)>;
3152 class sve2_bitwise_xor_interleaved<bits<2> sz, bits<1> opc, string asm,
3153 ZPRRegOp zprty1, ZPRRegOp zprty2>
3154 : I<(outs zprty1:$Zd), (ins zprty1:$_Zd, zprty2:$Zn, zprty2:$Zm),
3155 asm, "\t$Zd, $Zn, $Zm", "", []>, Sched<[]> {
3159 let Inst{31-24} = 0b01000101;
3160 let Inst{23-22} = sz;
3162 let Inst{20-16} = Zm;
3163 let Inst{15-11} = 0b10010;
3168 let Constraints = "$Zd = $_Zd";
3169 let DestructiveInstType = DestructiveOther;
3170 let ElementSize = ElementSizeNone;
3173 multiclass sve2_bitwise_xor_interleaved<bit opc, string asm,
3174 SDPatternOperator op> {
3175 def _B : sve2_bitwise_xor_interleaved<0b00, opc, asm, ZPR8, ZPR8>;
3176 def _H : sve2_bitwise_xor_interleaved<0b01, opc, asm, ZPR16, ZPR16>;
3177 def _S : sve2_bitwise_xor_interleaved<0b10, opc, asm, ZPR32, ZPR32>;
3178 def _D : sve2_bitwise_xor_interleaved<0b11, opc, asm, ZPR64, ZPR64>;
3180 def : SVE_3_Op_Pat<nxv16i8, op, nxv16i8, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
3181 def : SVE_3_Op_Pat<nxv8i16, op, nxv8i16, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
3182 def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
3183 def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
3186 class sve2_bitwise_shift_left_long<bits<3> tsz8_64, bits<2> opc, string asm,
3187 ZPRRegOp zprty1, ZPRRegOp zprty2,
3189 : I<(outs zprty1:$Zd), (ins zprty2:$Zn, immtype:$imm),
3190 asm, "\t$Zd, $Zn, $imm",
3191 "", []>, Sched<[]> {
3195 let Inst{31-23} = 0b010001010;
3196 let Inst{22} = tsz8_64{2};
3198 let Inst{20-19} = tsz8_64{1-0};
3199 let Inst{18-16} = imm{2-0}; // imm3
3200 let Inst{15-12} = 0b1010;
3201 let Inst{11-10} = opc;
3206 multiclass sve2_bitwise_shift_left_long<bits<2> opc, string asm,
3207 SDPatternOperator op> {
3208 def _H : sve2_bitwise_shift_left_long<{0,0,1}, opc, asm,
3209 ZPR16, ZPR8, vecshiftL8>;
3210 def _S : sve2_bitwise_shift_left_long<{0,1,?}, opc, asm,
3211 ZPR32, ZPR16, vecshiftL16> {
3212 let Inst{19} = imm{3};
3214 def _D : sve2_bitwise_shift_left_long<{1,?,?}, opc, asm,
3215 ZPR64, ZPR32, vecshiftL32> {
3216 let Inst{20-19} = imm{4-3};
3218 def : SVE_2_Op_Imm_Pat<nxv8i16, op, nxv16i8, i32, tvecshiftL8, !cast<Instruction>(NAME # _H)>;
3219 def : SVE_2_Op_Imm_Pat<nxv4i32, op, nxv8i16, i32, tvecshiftL16, !cast<Instruction>(NAME # _S)>;
3220 def : SVE_2_Op_Imm_Pat<nxv2i64, op, nxv4i32, i32, tvecshiftL32, !cast<Instruction>(NAME # _D)>;
3223 //===----------------------------------------------------------------------===//
3224 // SVE2 Accumulate Group
3225 //===----------------------------------------------------------------------===//
3227 class sve2_int_bin_shift_imm<bits<4> tsz8_64, bit opc, string asm,
3228 ZPRRegOp zprty, Operand immtype>
3229 : I<(outs zprty:$Zd), (ins zprty:$_Zd, zprty:$Zn, immtype:$imm),
3230 asm, "\t$Zd, $Zn, $imm",
3231 "", []>, Sched<[]> {
3235 let Inst{31-24} = 0b01000101;
3236 let Inst{23-22} = tsz8_64{3-2};
3238 let Inst{20-19} = tsz8_64{1-0};
3239 let Inst{18-16} = imm{2-0}; // imm3
3240 let Inst{15-11} = 0b11110;
3245 let Constraints = "$Zd = $_Zd";
3248 multiclass sve2_int_bin_shift_imm_left<bit opc, string asm,
3249 SDPatternOperator op> {
3250 def _B : sve2_int_bin_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftL8>;
3251 def _H : sve2_int_bin_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftL16> {
3252 let Inst{19} = imm{3};
3254 def _S : sve2_int_bin_shift_imm<{0,1,?,?}, opc, asm, ZPR32, vecshiftL32> {
3255 let Inst{20-19} = imm{4-3};
3257 def _D : sve2_int_bin_shift_imm<{1,?,?,?}, opc, asm, ZPR64, vecshiftL64> {
3258 let Inst{22} = imm{5};
3259 let Inst{20-19} = imm{4-3};
3262 def : SVE_3_Op_Imm_Pat<nxv16i8, op, nxv16i8, nxv16i8, i32, tvecshiftL8, !cast<Instruction>(NAME # _B)>;
3263 def : SVE_3_Op_Imm_Pat<nxv8i16, op, nxv8i16, nxv8i16, i32, tvecshiftL16, !cast<Instruction>(NAME # _H)>;
3264 def : SVE_3_Op_Imm_Pat<nxv4i32, op, nxv4i32, nxv4i32, i32, tvecshiftL32, !cast<Instruction>(NAME # _S)>;
3265 def : SVE_3_Op_Imm_Pat<nxv2i64, op, nxv2i64, nxv2i64, i32, tvecshiftL64, !cast<Instruction>(NAME # _D)>;
3268 multiclass sve2_int_bin_shift_imm_right<bit opc, string asm,
3269 SDPatternOperator op> {
3270 def _B : sve2_int_bin_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftR8>;
3271 def _H : sve2_int_bin_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftR16> {
3272 let Inst{19} = imm{3};
3274 def _S : sve2_int_bin_shift_imm<{0,1,?,?}, opc, asm, ZPR32, vecshiftR32> {
3275 let Inst{20-19} = imm{4-3};
3277 def _D : sve2_int_bin_shift_imm<{1,?,?,?}, opc, asm, ZPR64, vecshiftR64> {
3278 let Inst{22} = imm{5};
3279 let Inst{20-19} = imm{4-3};
3282 def : SVE_3_Op_Imm_Pat<nxv16i8, op, nxv16i8, nxv16i8, i32, tvecshiftR8, !cast<Instruction>(NAME # _B)>;
3283 def : SVE_3_Op_Imm_Pat<nxv8i16, op, nxv8i16, nxv8i16, i32, tvecshiftR16, !cast<Instruction>(NAME # _H)>;
3284 def : SVE_3_Op_Imm_Pat<nxv4i32, op, nxv4i32, nxv4i32, i32, tvecshiftR32, !cast<Instruction>(NAME # _S)>;
3285 def : SVE_3_Op_Imm_Pat<nxv2i64, op, nxv2i64, nxv2i64, i32, tvecshiftR64, !cast<Instruction>(NAME # _D)>;
3288 class sve2_int_bin_accum_shift_imm<bits<4> tsz8_64, bits<2> opc, string asm,
3289 ZPRRegOp zprty, Operand immtype>
3290 : I<(outs zprty:$Zda), (ins zprty:$_Zda, zprty:$Zn, immtype:$imm),
3291 asm, "\t$Zda, $Zn, $imm",
3292 "", []>, Sched<[]> {
3296 let Inst{31-24} = 0b01000101;
3297 let Inst{23-22} = tsz8_64{3-2};
3299 let Inst{20-19} = tsz8_64{1-0};
3300 let Inst{18-16} = imm{2-0}; // imm3
3301 let Inst{15-12} = 0b1110;
3302 let Inst{11-10} = opc;
3304 let Inst{4-0} = Zda;
3306 let Constraints = "$Zda = $_Zda";
3307 let DestructiveInstType = DestructiveOther;
3308 let ElementSize = ElementSizeNone;
3311 multiclass sve2_int_bin_accum_shift_imm_right<bits<2> opc, string asm,
3312 SDPatternOperator op> {
3313 def _B : sve2_int_bin_accum_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftR8>;
3314 def _H : sve2_int_bin_accum_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftR16> {
3315 let Inst{19} = imm{3};
3317 def _S : sve2_int_bin_accum_shift_imm<{0,1,?,?}, opc, asm, ZPR32, vecshiftR32> {
3318 let Inst{20-19} = imm{4-3};
3320 def _D : sve2_int_bin_accum_shift_imm<{1,?,?,?}, opc, asm, ZPR64, vecshiftR64> {
3321 let Inst{22} = imm{5};
3322 let Inst{20-19} = imm{4-3};
3325 def : SVE_3_Op_Imm_Pat<nxv16i8, op, nxv16i8, nxv16i8, i32, tvecshiftR8, !cast<Instruction>(NAME # _B)>;
3326 def : SVE_3_Op_Imm_Pat<nxv8i16, op, nxv8i16, nxv8i16, i32, tvecshiftR16, !cast<Instruction>(NAME # _H)>;
3327 def : SVE_3_Op_Imm_Pat<nxv4i32, op, nxv4i32, nxv4i32, i32, tvecshiftR32, !cast<Instruction>(NAME # _S)>;
3328 def : SVE_3_Op_Imm_Pat<nxv2i64, op, nxv2i64, nxv2i64, i32, tvecshiftR64, !cast<Instruction>(NAME # _D)>;
3331 class sve2_int_cadd<bits<2> sz, bit opc, string asm, ZPRRegOp zprty>
3332 : I<(outs zprty:$Zdn), (ins zprty:$_Zdn, zprty:$Zm, complexrotateopodd:$rot),
3333 asm, "\t$Zdn, $_Zdn, $Zm, $rot", "", []>, Sched<[]> {
3337 let Inst{31-24} = 0b01000101;
3338 let Inst{23-22} = sz;
3339 let Inst{21-17} = 0b00000;
3341 let Inst{15-11} = 0b11011;
3344 let Inst{4-0} = Zdn;
3346 let Constraints = "$Zdn = $_Zdn";
3347 let DestructiveInstType = DestructiveOther;
3348 let ElementSize = ElementSizeNone;
3351 multiclass sve2_int_cadd<bit opc, string asm, SDPatternOperator op> {
3352 def _B : sve2_int_cadd<0b00, opc, asm, ZPR8>;
3353 def _H : sve2_int_cadd<0b01, opc, asm, ZPR16>;
3354 def _S : sve2_int_cadd<0b10, opc, asm, ZPR32>;
3355 def _D : sve2_int_cadd<0b11, opc, asm, ZPR64>;
3357 def : SVE_3_Op_Imm_Pat<nxv16i8, op, nxv16i8, nxv16i8, i32, complexrotateopodd, !cast<Instruction>(NAME # _B)>;
3358 def : SVE_3_Op_Imm_Pat<nxv8i16, op, nxv8i16, nxv8i16, i32, complexrotateopodd, !cast<Instruction>(NAME # _H)>;
3359 def : SVE_3_Op_Imm_Pat<nxv4i32, op, nxv4i32, nxv4i32, i32, complexrotateopodd, !cast<Instruction>(NAME # _S)>;
3360 def : SVE_3_Op_Imm_Pat<nxv2i64, op, nxv2i64, nxv2i64, i32, complexrotateopodd, !cast<Instruction>(NAME # _D)>;
3363 class sve2_int_absdiff_accum<bits<2> sz, bits<4> opc, string asm,
3364 ZPRRegOp zprty1, ZPRRegOp zprty2>
3365 : I<(outs zprty1:$Zda), (ins zprty1:$_Zda, zprty2:$Zn, zprty2:$Zm),
3366 asm, "\t$Zda, $Zn, $Zm", "", []>, Sched<[]> {
3370 let Inst{31-24} = 0b01000101;
3371 let Inst{23-22} = sz;
3373 let Inst{20-16} = Zm;
3374 let Inst{15-14} = 0b11;
3375 let Inst{13-10} = opc;
3377 let Inst{4-0} = Zda;
3379 let Constraints = "$Zda = $_Zda";
3380 let DestructiveInstType = DestructiveOther;
3381 let ElementSize = ElementSizeNone;
3384 multiclass sve2_int_absdiff_accum<bit opc, string asm, SDPatternOperator op> {
3385 def _B : sve2_int_absdiff_accum<0b00, { 0b111, opc }, asm, ZPR8, ZPR8>;
3386 def _H : sve2_int_absdiff_accum<0b01, { 0b111, opc }, asm, ZPR16, ZPR16>;
3387 def _S : sve2_int_absdiff_accum<0b10, { 0b111, opc }, asm, ZPR32, ZPR32>;
3388 def _D : sve2_int_absdiff_accum<0b11, { 0b111, opc }, asm, ZPR64, ZPR64>;
3390 def : SVE_3_Op_Pat<nxv16i8, op, nxv16i8, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
3391 def : SVE_3_Op_Pat<nxv8i16, op, nxv8i16, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
3392 def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
3393 def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
3396 multiclass sve2_int_absdiff_accum_long<bits<2> opc, string asm,
3397 SDPatternOperator op> {
3398 def _H : sve2_int_absdiff_accum<0b01, { 0b00, opc }, asm, ZPR16, ZPR8>;
3399 def _S : sve2_int_absdiff_accum<0b10, { 0b00, opc }, asm, ZPR32, ZPR16>;
3400 def _D : sve2_int_absdiff_accum<0b11, { 0b00, opc }, asm, ZPR64, ZPR32>;
3402 def : SVE_3_Op_Pat<nxv8i16, op, nxv8i16, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _H)>;
3403 def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _S)>;
3404 def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _D)>;
3407 multiclass sve2_int_addsub_long_carry<bits<2> opc, string asm, SDPatternOperator op> {
3408 def _S : sve2_int_absdiff_accum<{ opc{1}, 0b0 }, { 0b010, opc{0} }, asm,
3410 def _D : sve2_int_absdiff_accum<{ opc{1}, 0b1 }, { 0b010, opc{0} }, asm,
3413 def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
3414 def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
3417 //===----------------------------------------------------------------------===//
3418 // SVE2 Narrowing Group
3419 //===----------------------------------------------------------------------===//
3421 class sve2_int_bin_shift_imm_narrow_bottom<bits<3> tsz8_64, bits<3> opc,
3422 string asm, ZPRRegOp zprty1,
3423 ZPRRegOp zprty2, Operand immtype>
3424 : I<(outs zprty1:$Zd), (ins zprty2:$Zn, immtype:$imm),
3425 asm, "\t$Zd, $Zn, $imm",
3426 "", []>, Sched<[]> {
3430 let Inst{31-23} = 0b010001010;
3431 let Inst{22} = tsz8_64{2};
3433 let Inst{20-19} = tsz8_64{1-0};
3434 let Inst{18-16} = imm{2-0}; // imm3
3435 let Inst{15-14} = 0b00;
3436 let Inst{13-11} = opc;
3442 multiclass sve2_int_bin_shift_imm_right_narrow_bottom<bits<3> opc, string asm,
3443 SDPatternOperator op> {
3444 def _B : sve2_int_bin_shift_imm_narrow_bottom<{0,0,1}, opc, asm, ZPR8, ZPR16,
3446 def _H : sve2_int_bin_shift_imm_narrow_bottom<{0,1,?}, opc, asm, ZPR16, ZPR32,
3448 let Inst{19} = imm{3};
3450 def _S : sve2_int_bin_shift_imm_narrow_bottom<{1,?,?}, opc, asm, ZPR32, ZPR64,
3452 let Inst{20-19} = imm{4-3};
3454 def : SVE_2_Op_Imm_Pat<nxv16i8, op, nxv8i16, i32, tvecshiftR8, !cast<Instruction>(NAME # _B)>;
3455 def : SVE_2_Op_Imm_Pat<nxv8i16, op, nxv4i32, i32, tvecshiftR16, !cast<Instruction>(NAME # _H)>;
3456 def : SVE_2_Op_Imm_Pat<nxv4i32, op, nxv2i64, i32, tvecshiftR32, !cast<Instruction>(NAME # _S)>;
3459 class sve2_int_bin_shift_imm_narrow_top<bits<3> tsz8_64, bits<3> opc,
3460 string asm, ZPRRegOp zprty1,
3461 ZPRRegOp zprty2, Operand immtype>
3462 : I<(outs zprty1:$Zd), (ins zprty1:$_Zd, zprty2:$Zn, immtype:$imm),
3463 asm, "\t$Zd, $Zn, $imm",
3464 "", []>, Sched<[]> {
3468 let Inst{31-23} = 0b010001010;
3469 let Inst{22} = tsz8_64{2};
3471 let Inst{20-19} = tsz8_64{1-0};
3472 let Inst{18-16} = imm{2-0}; // imm3
3473 let Inst{15-14} = 0b00;
3474 let Inst{13-11} = opc;
3479 let Constraints = "$Zd = $_Zd";
3482 multiclass sve2_int_bin_shift_imm_right_narrow_top<bits<3> opc, string asm,
3483 SDPatternOperator op> {
3484 def _B : sve2_int_bin_shift_imm_narrow_top<{0,0,1}, opc, asm, ZPR8, ZPR16,
3486 def _H : sve2_int_bin_shift_imm_narrow_top<{0,1,?}, opc, asm, ZPR16, ZPR32,
3488 let Inst{19} = imm{3};
3490 def _S : sve2_int_bin_shift_imm_narrow_top<{1,?,?}, opc, asm, ZPR32, ZPR64,
3492 let Inst{20-19} = imm{4-3};
3494 def : SVE_3_Op_Imm_Pat<nxv16i8, op, nxv16i8, nxv8i16, i32, tvecshiftR8, !cast<Instruction>(NAME # _B)>;
3495 def : SVE_3_Op_Imm_Pat<nxv8i16, op, nxv8i16, nxv4i32, i32, tvecshiftR16, !cast<Instruction>(NAME # _H)>;
3496 def : SVE_3_Op_Imm_Pat<nxv4i32, op, nxv4i32, nxv2i64, i32, tvecshiftR32, !cast<Instruction>(NAME # _S)>;
3499 class sve2_int_addsub_narrow_high_bottom<bits<2> sz, bits<2> opc, string asm,
3500 ZPRRegOp zprty1, ZPRRegOp zprty2>
3501 : I<(outs zprty1:$Zd), (ins zprty2:$Zn, zprty2:$Zm),
3502 asm, "\t$Zd, $Zn, $Zm", "", []>, Sched<[]> {
3506 let Inst{31-24} = 0b01000101;
3507 let Inst{23-22} = sz;
3509 let Inst{20-16} = Zm;
3510 let Inst{15-13} = 0b011;
3511 let Inst{12-11} = opc; // S, R
3512 let Inst{10} = 0b0; // Top
3517 multiclass sve2_int_addsub_narrow_high_bottom<bits<2> opc, string asm,
3518 SDPatternOperator op> {
3519 def _B : sve2_int_addsub_narrow_high_bottom<0b01, opc, asm, ZPR8, ZPR16>;
3520 def _H : sve2_int_addsub_narrow_high_bottom<0b10, opc, asm, ZPR16, ZPR32>;
3521 def _S : sve2_int_addsub_narrow_high_bottom<0b11, opc, asm, ZPR32, ZPR64>;
3523 def : SVE_2_Op_Pat<nxv16i8, op, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _B)>;
3524 def : SVE_2_Op_Pat<nxv8i16, op, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _H)>;
3525 def : SVE_2_Op_Pat<nxv4i32, op, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _S)>;
3528 class sve2_int_addsub_narrow_high_top<bits<2> sz, bits<2> opc, string asm,
3529 ZPRRegOp zprty1, ZPRRegOp zprty2>
3530 : I<(outs zprty1:$Zd), (ins zprty1:$_Zd, zprty2:$Zn, zprty2:$Zm),
3531 asm, "\t$Zd, $Zn, $Zm", "", []>, Sched<[]> {
3535 let Inst{31-24} = 0b01000101;
3536 let Inst{23-22} = sz;
3538 let Inst{20-16} = Zm;
3539 let Inst{15-13} = 0b011;
3540 let Inst{12-11} = opc; // S, R
3541 let Inst{10} = 0b1; // Top
3545 let Constraints = "$Zd = $_Zd";
3548 multiclass sve2_int_addsub_narrow_high_top<bits<2> opc, string asm,
3549 SDPatternOperator op> {
3550 def _B : sve2_int_addsub_narrow_high_top<0b01, opc, asm, ZPR8, ZPR16>;
3551 def _H : sve2_int_addsub_narrow_high_top<0b10, opc, asm, ZPR16, ZPR32>;
3552 def _S : sve2_int_addsub_narrow_high_top<0b11, opc, asm, ZPR32, ZPR64>;
3554 def : SVE_3_Op_Pat<nxv16i8, op, nxv16i8, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _B)>;
3555 def : SVE_3_Op_Pat<nxv8i16, op, nxv8i16, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _H)>;
3556 def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _S)>;
3559 class sve2_int_sat_extract_narrow_bottom<bits<3> tsz8_64, bits<2> opc, string asm,
3560 ZPRRegOp zprty1, ZPRRegOp zprty2>
3561 : I<(outs zprty1:$Zd), (ins zprty2:$Zn),
3562 asm, "\t$Zd, $Zn", "", []>, Sched<[]> {
3565 let Inst{31-23} = 0b010001010;
3566 let Inst{22} = tsz8_64{2};
3568 let Inst{20-19} = tsz8_64{1-0};
3569 let Inst{18-13} = 0b000010;
3570 let Inst{12-11} = opc;
3576 multiclass sve2_int_sat_extract_narrow_bottom<bits<2> opc, string asm,
3577 SDPatternOperator op> {
3578 def _B : sve2_int_sat_extract_narrow_bottom<0b001, opc, asm, ZPR8, ZPR16>;
3579 def _H : sve2_int_sat_extract_narrow_bottom<0b010, opc, asm, ZPR16, ZPR32>;
3580 def _S : sve2_int_sat_extract_narrow_bottom<0b100, opc, asm, ZPR32, ZPR64>;
3582 def : SVE_1_Op_Pat<nxv16i8, op, nxv8i16, !cast<Instruction>(NAME # _B)>;
3583 def : SVE_1_Op_Pat<nxv8i16, op, nxv4i32, !cast<Instruction>(NAME # _H)>;
3584 def : SVE_1_Op_Pat<nxv4i32, op, nxv2i64, !cast<Instruction>(NAME # _S)>;
3587 class sve2_int_sat_extract_narrow_top<bits<3> tsz8_64, bits<2> opc, string asm,
3588 ZPRRegOp zprty1, ZPRRegOp zprty2>
3589 : I<(outs zprty1:$Zd), (ins zprty1:$_Zd, zprty2:$Zn),
3590 asm, "\t$Zd, $Zn", "", []>, Sched<[]> {
3593 let Inst{31-23} = 0b010001010;
3594 let Inst{22} = tsz8_64{2};
3596 let Inst{20-19} = tsz8_64{1-0};
3597 let Inst{18-13} = 0b000010;
3598 let Inst{12-11} = opc;
3603 let Constraints = "$Zd = $_Zd";
3606 multiclass sve2_int_sat_extract_narrow_top<bits<2> opc, string asm,
3607 SDPatternOperator op> {
3608 def _B : sve2_int_sat_extract_narrow_top<0b001, opc, asm, ZPR8, ZPR16>;
3609 def _H : sve2_int_sat_extract_narrow_top<0b010, opc, asm, ZPR16, ZPR32>;
3610 def _S : sve2_int_sat_extract_narrow_top<0b100, opc, asm, ZPR32, ZPR64>;
3612 def : SVE_2_Op_Pat<nxv16i8, op, nxv16i8, nxv8i16, !cast<Instruction>(NAME # _B)>;
3613 def : SVE_2_Op_Pat<nxv8i16, op, nxv8i16, nxv4i32, !cast<Instruction>(NAME # _H)>;
3614 def : SVE_2_Op_Pat<nxv4i32, op, nxv4i32, nxv2i64, !cast<Instruction>(NAME # _S)>;
3617 //===----------------------------------------------------------------------===//
3618 // SVE Integer Arithmetic - Unary Predicated Group
3619 //===----------------------------------------------------------------------===//
3621 class sve_int_un_pred_arit<bits<2> sz8_64, bits<4> opc,
3622 string asm, ZPRRegOp zprty>
3623 : I<(outs zprty:$Zd), (ins zprty:$_Zd, PPR3bAny:$Pg, zprty:$Zn),
3624 asm, "\t$Zd, $Pg/m, $Zn",
3630 let Inst{31-24} = 0b00000100;
3631 let Inst{23-22} = sz8_64;
3632 let Inst{21-20} = 0b01;
3633 let Inst{19} = opc{0};
3634 let Inst{18-16} = opc{3-1};
3635 let Inst{15-13} = 0b101;
3636 let Inst{12-10} = Pg;
3640 let Constraints = "$Zd = $_Zd";
3641 let DestructiveInstType = DestructiveOther;
3642 let ElementSize = zprty.ElementSize;
3645 multiclass sve_int_un_pred_arit_0<bits<3> opc, string asm,
3646 SDPatternOperator op> {
3647 def _B : sve_int_un_pred_arit<0b00, { opc, 0b0 }, asm, ZPR8>;
3648 def _H : sve_int_un_pred_arit<0b01, { opc, 0b0 }, asm, ZPR16>;
3649 def _S : sve_int_un_pred_arit<0b10, { opc, 0b0 }, asm, ZPR32>;
3650 def _D : sve_int_un_pred_arit<0b11, { opc, 0b0 }, asm, ZPR64>;
3652 def : SVE_3_Op_Pat<nxv16i8, op, nxv16i8, nxv16i1, nxv16i8, !cast<Instruction>(NAME # _B)>;
3653 def : SVE_3_Op_Pat<nxv8i16, op, nxv8i16, nxv8i1, nxv8i16, !cast<Instruction>(NAME # _H)>;
3654 def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv4i1, nxv4i32, !cast<Instruction>(NAME # _S)>;
3655 def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv2i1, nxv2i64, !cast<Instruction>(NAME # _D)>;
3658 multiclass sve_int_un_pred_arit_0_h<bits<3> opc, string asm,
3659 SDPatternOperator op> {
3660 def _H : sve_int_un_pred_arit<0b01, { opc, 0b0 }, asm, ZPR16>;
3661 def _S : sve_int_un_pred_arit<0b10, { opc, 0b0 }, asm, ZPR32>;
3662 def _D : sve_int_un_pred_arit<0b11, { opc, 0b0 }, asm, ZPR64>;
3664 def : SVE_3_Op_Pat<nxv8i16, op, nxv8i16, nxv8i1, nxv8i16, !cast<Instruction>(NAME # _H)>;
3665 def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv4i1, nxv4i32, !cast<Instruction>(NAME # _S)>;
3666 def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv2i1, nxv2i64, !cast<Instruction>(NAME # _D)>;
3669 multiclass sve_int_un_pred_arit_0_w<bits<3> opc, string asm,
3670 SDPatternOperator op> {
3671 def _S : sve_int_un_pred_arit<0b10, { opc, 0b0 }, asm, ZPR32>;
3672 def _D : sve_int_un_pred_arit<0b11, { opc, 0b0 }, asm, ZPR64>;
3674 def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv4i1, nxv4i32, !cast<Instruction>(NAME # _S)>;
3675 def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv2i1, nxv2i64, !cast<Instruction>(NAME # _D)>;
3678 multiclass sve_int_un_pred_arit_0_d<bits<3> opc, string asm,
3679 SDPatternOperator op> {
3680 def _D : sve_int_un_pred_arit<0b11, { opc, 0b0 }, asm, ZPR64>;
3682 def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv2i1, nxv2i64, !cast<Instruction>(NAME # _D)>;
3685 multiclass sve_int_un_pred_arit_1<bits<3> opc, string asm,
3686 SDPatternOperator op> {
3687 def _B : sve_int_un_pred_arit<0b00, { opc, 0b1 }, asm, ZPR8>;
3688 def _H : sve_int_un_pred_arit<0b01, { opc, 0b1 }, asm, ZPR16>;
3689 def _S : sve_int_un_pred_arit<0b10, { opc, 0b1 }, asm, ZPR32>;
3690 def _D : sve_int_un_pred_arit<0b11, { opc, 0b1 }, asm, ZPR64>;
3692 def : SVE_3_Op_Pat<nxv16i8, op, nxv16i8, nxv16i1, nxv16i8, !cast<Instruction>(NAME # _B)>;
3693 def : SVE_3_Op_Pat<nxv8i16, op, nxv8i16, nxv8i1, nxv8i16, !cast<Instruction>(NAME # _H)>;
3694 def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv4i1, nxv4i32, !cast<Instruction>(NAME # _S)>;
3695 def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv2i1, nxv2i64, !cast<Instruction>(NAME # _D)>;
3697 def : SVE_3_Op_Pat<nxv8i16, op, nxv8i16, nxv8i1, nxv8f16, !cast<Instruction>(NAME # _H)>;
3698 def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv4i1, nxv4f32, !cast<Instruction>(NAME # _S)>;
3699 def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv2i1, nxv2f64, !cast<Instruction>(NAME # _D)>;
3702 multiclass sve_int_un_pred_arit_1_fp<bits<3> opc, string asm,
3703 SDPatternOperator op> {
3704 def _H : sve_int_un_pred_arit<0b01, { opc, 0b1 }, asm, ZPR16>;
3705 def _S : sve_int_un_pred_arit<0b10, { opc, 0b1 }, asm, ZPR32>;
3706 def _D : sve_int_un_pred_arit<0b11, { opc, 0b1 }, asm, ZPR64>;
3708 def : SVE_3_Op_Pat<nxv8f16, op, nxv8f16, nxv8i1, nxv8f16, !cast<Instruction>(NAME # _H)>;
3709 def : SVE_3_Op_Pat<nxv4f32, op, nxv4f32, nxv4i1, nxv4f32, !cast<Instruction>(NAME # _S)>;
3710 def : SVE_3_Op_Pat<nxv2f64, op, nxv2f64, nxv2i1, nxv2f64, !cast<Instruction>(NAME # _D)>;
3713 //===----------------------------------------------------------------------===//
3714 // SVE Integer Wide Immediate - Unpredicated Group
3715 //===----------------------------------------------------------------------===//
3716 class sve_int_dup_imm<bits<2> sz8_64, string asm,
3717 ZPRRegOp zprty, Operand immtype>
3718 : I<(outs zprty:$Zd), (ins immtype:$imm),
3724 let Inst{31-24} = 0b00100101;
3725 let Inst{23-22} = sz8_64;
3726 let Inst{21-14} = 0b11100011;
3727 let Inst{13} = imm{8}; // sh
3728 let Inst{12-5} = imm{7-0}; // imm8
3731 let isReMaterializable = 1;
3734 multiclass sve_int_dup_imm<string asm> {
3735 def _B : sve_int_dup_imm<0b00, asm, ZPR8, cpy_imm8_opt_lsl_i8>;
3736 def _H : sve_int_dup_imm<0b01, asm, ZPR16, cpy_imm8_opt_lsl_i16>;
3737 def _S : sve_int_dup_imm<0b10, asm, ZPR32, cpy_imm8_opt_lsl_i32>;
3738 def _D : sve_int_dup_imm<0b11, asm, ZPR64, cpy_imm8_opt_lsl_i64>;
3740 def : InstAlias<"mov $Zd, $imm",
3741 (!cast<Instruction>(NAME # _B) ZPR8:$Zd, cpy_imm8_opt_lsl_i8:$imm), 1>;
3742 def : InstAlias<"mov $Zd, $imm",
3743 (!cast<Instruction>(NAME # _H) ZPR16:$Zd, cpy_imm8_opt_lsl_i16:$imm), 1>;
3744 def : InstAlias<"mov $Zd, $imm",
3745 (!cast<Instruction>(NAME # _S) ZPR32:$Zd, cpy_imm8_opt_lsl_i32:$imm), 1>;
3746 def : InstAlias<"mov $Zd, $imm",
3747 (!cast<Instruction>(NAME # _D) ZPR64:$Zd, cpy_imm8_opt_lsl_i64:$imm), 1>;
3749 def : InstAlias<"fmov $Zd, #0.0",
3750 (!cast<Instruction>(NAME # _H) ZPR16:$Zd, 0, 0), 1>;
3751 def : InstAlias<"fmov $Zd, #0.0",
3752 (!cast<Instruction>(NAME # _S) ZPR32:$Zd, 0, 0), 1>;
3753 def : InstAlias<"fmov $Zd, #0.0",
3754 (!cast<Instruction>(NAME # _D) ZPR64:$Zd, 0, 0), 1>;
3757 class sve_int_dup_fpimm<bits<2> sz8_64, Operand fpimmtype,
3758 string asm, ZPRRegOp zprty>
3759 : I<(outs zprty:$Zd), (ins fpimmtype:$imm8),
3760 asm, "\t$Zd, $imm8",
3765 let Inst{31-24} = 0b00100101;
3766 let Inst{23-22} = sz8_64;
3767 let Inst{21-14} = 0b11100111;
3769 let Inst{12-5} = imm8;
3772 let isReMaterializable = 1;
3775 multiclass sve_int_dup_fpimm<string asm> {
3776 def _H : sve_int_dup_fpimm<0b01, fpimm16, asm, ZPR16>;
3777 def _S : sve_int_dup_fpimm<0b10, fpimm32, asm, ZPR32>;
3778 def _D : sve_int_dup_fpimm<0b11, fpimm64, asm, ZPR64>;
3780 def : InstAlias<"fmov $Zd, $imm8",
3781 (!cast<Instruction>(NAME # _H) ZPR16:$Zd, fpimm16:$imm8), 1>;
3782 def : InstAlias<"fmov $Zd, $imm8",
3783 (!cast<Instruction>(NAME # _S) ZPR32:$Zd, fpimm32:$imm8), 1>;
3784 def : InstAlias<"fmov $Zd, $imm8",
3785 (!cast<Instruction>(NAME # _D) ZPR64:$Zd, fpimm64:$imm8), 1>;
3788 class sve_int_arith_imm0<bits<2> sz8_64, bits<3> opc, string asm,
3789 ZPRRegOp zprty, Operand immtype>
3790 : I<(outs zprty:$Zdn), (ins zprty:$_Zdn, immtype:$imm),
3791 asm, "\t$Zdn, $_Zdn, $imm",
3796 let Inst{31-24} = 0b00100101;
3797 let Inst{23-22} = sz8_64;
3798 let Inst{21-19} = 0b100;
3799 let Inst{18-16} = opc;
3800 let Inst{15-14} = 0b11;
3801 let Inst{13} = imm{8}; // sh
3802 let Inst{12-5} = imm{7-0}; // imm8
3803 let Inst{4-0} = Zdn;
3805 let Constraints = "$Zdn = $_Zdn";
3806 let DestructiveInstType = DestructiveOther;
3807 let ElementSize = ElementSizeNone;
3810 multiclass sve_int_arith_imm0<bits<3> opc, string asm,
3811 SDPatternOperator op, SDPatternOperator int_op> {
3812 def _B : sve_int_arith_imm0<0b00, opc, asm, ZPR8, addsub_imm8_opt_lsl_i8>;
3813 def _H : sve_int_arith_imm0<0b01, opc, asm, ZPR16, addsub_imm8_opt_lsl_i16>;
3814 def _S : sve_int_arith_imm0<0b10, opc, asm, ZPR32, addsub_imm8_opt_lsl_i32>;
3815 def _D : sve_int_arith_imm0<0b11, opc, asm, ZPR64, addsub_imm8_opt_lsl_i64>;
3817 def : SVE_1_Op_Imm_OptLsl_Pat<nxv16i8, op, ZPR8, i32, SVEAddSubImm8Pat, !cast<Instruction>(NAME # _B)>;
3818 def : SVE_1_Op_Imm_OptLsl_Pat<nxv8i16, op, ZPR16, i32, SVEAddSubImm16Pat, !cast<Instruction>(NAME # _H)>;
3819 def : SVE_1_Op_Imm_OptLsl_Pat<nxv4i32, op, ZPR32, i32, SVEAddSubImm32Pat, !cast<Instruction>(NAME # _S)>;
3820 def : SVE_1_Op_Imm_OptLsl_Pat<nxv2i64, op, ZPR64, i64, SVEAddSubImm64Pat, !cast<Instruction>(NAME # _D)>;
3822 // Intrinsic version
3823 def : SVE_1_Op_Imm_OptLsl_Pat<nxv16i8, int_op, ZPR8, i32, SVEAddSubImm8Pat, !cast<Instruction>(NAME # _B)>;
3824 def : SVE_1_Op_Imm_OptLsl_Pat<nxv8i16, int_op, ZPR16, i32, SVEAddSubImm16Pat, !cast<Instruction>(NAME # _H)>;
3825 def : SVE_1_Op_Imm_OptLsl_Pat<nxv4i32, int_op, ZPR32, i32, SVEAddSubImm32Pat, !cast<Instruction>(NAME # _S)>;
3826 def : SVE_1_Op_Imm_OptLsl_Pat<nxv2i64, int_op, ZPR64, i64, SVEAddSubImm64Pat, !cast<Instruction>(NAME # _D)>;
3829 multiclass sve_int_arith_imm0_subr<bits<3> opc, string asm, SDPatternOperator op> {
3830 def _B : sve_int_arith_imm0<0b00, opc, asm, ZPR8, addsub_imm8_opt_lsl_i8>;
3831 def _H : sve_int_arith_imm0<0b01, opc, asm, ZPR16, addsub_imm8_opt_lsl_i16>;
3832 def _S : sve_int_arith_imm0<0b10, opc, asm, ZPR32, addsub_imm8_opt_lsl_i32>;
3833 def _D : sve_int_arith_imm0<0b11, opc, asm, ZPR64, addsub_imm8_opt_lsl_i64>;
3835 def : SVE_1_Op_Imm_OptLsl_Reverse_Pat<nxv16i8, op, ZPR8, i32, SVEAddSubImm8Pat, !cast<Instruction>(NAME # _B)>;
3836 def : SVE_1_Op_Imm_OptLsl_Reverse_Pat<nxv8i16, op, ZPR16, i32, SVEAddSubImm16Pat, !cast<Instruction>(NAME # _H)>;
3837 def : SVE_1_Op_Imm_OptLsl_Reverse_Pat<nxv4i32, op, ZPR32, i32, SVEAddSubImm32Pat, !cast<Instruction>(NAME # _S)>;
3838 def : SVE_1_Op_Imm_OptLsl_Reverse_Pat<nxv2i64, op, ZPR64, i64, SVEAddSubImm64Pat, !cast<Instruction>(NAME # _D)>;
3841 class sve_int_arith_imm<bits<2> sz8_64, bits<6> opc, string asm,
3842 ZPRRegOp zprty, Operand immtype>
3843 : I<(outs zprty:$Zdn), (ins zprty:$_Zdn, immtype:$imm),
3844 asm, "\t$Zdn, $_Zdn, $imm",
3849 let Inst{31-24} = 0b00100101;
3850 let Inst{23-22} = sz8_64;
3851 let Inst{21-16} = opc;
3852 let Inst{15-13} = 0b110;
3853 let Inst{12-5} = imm;
3854 let Inst{4-0} = Zdn;
3856 let Constraints = "$Zdn = $_Zdn";
3857 let DestructiveInstType = DestructiveOther;
3858 let ElementSize = ElementSizeNone;
3861 multiclass sve_int_arith_imm1<bits<2> opc, string asm, SDPatternOperator op> {
3862 def _B : sve_int_arith_imm<0b00, { 0b1010, opc }, asm, ZPR8, simm8>;
3863 def _H : sve_int_arith_imm<0b01, { 0b1010, opc }, asm, ZPR16, simm8>;
3864 def _S : sve_int_arith_imm<0b10, { 0b1010, opc }, asm, ZPR32, simm8>;
3865 def _D : sve_int_arith_imm<0b11, { 0b1010, opc }, asm, ZPR64, simm8>;
3867 def : SVE_1_Op_Imm_Arith_Pred_Pat<nxv16i8, nxv16i1, op, ZPR8, i32, SVEArithSImmPat, !cast<Instruction>(NAME # _B)>;
3868 def : SVE_1_Op_Imm_Arith_Pred_Pat<nxv8i16, nxv8i1, op, ZPR16, i32, SVEArithSImmPat, !cast<Instruction>(NAME # _H)>;
3869 def : SVE_1_Op_Imm_Arith_Pred_Pat<nxv4i32, nxv4i1, op, ZPR32, i32, SVEArithSImmPat, !cast<Instruction>(NAME # _S)>;
3870 def : SVE_1_Op_Imm_Arith_Pred_Pat<nxv2i64, nxv2i1, op, ZPR64, i64, SVEArithSImmPat, !cast<Instruction>(NAME # _D)>;
3873 multiclass sve_int_arith_imm1_unsigned<bits<2> opc, string asm, SDPatternOperator op> {
3874 def _B : sve_int_arith_imm<0b00, { 0b1010, opc }, asm, ZPR8, imm0_255>;
3875 def _H : sve_int_arith_imm<0b01, { 0b1010, opc }, asm, ZPR16, imm0_255>;
3876 def _S : sve_int_arith_imm<0b10, { 0b1010, opc }, asm, ZPR32, imm0_255>;
3877 def _D : sve_int_arith_imm<0b11, { 0b1010, opc }, asm, ZPR64, imm0_255>;
3879 def : SVE_1_Op_Imm_Arith_Pred_Pat<nxv16i8, nxv16i1, op, ZPR8, i32, SVEArithUImmPat, !cast<Instruction>(NAME # _B)>;
3880 def : SVE_1_Op_Imm_Arith_Pred_Pat<nxv8i16, nxv8i1, op, ZPR16, i32, SVEArithUImmPat, !cast<Instruction>(NAME # _H)>;
3881 def : SVE_1_Op_Imm_Arith_Pred_Pat<nxv4i32, nxv4i1, op, ZPR32, i32, SVEArithUImmPat, !cast<Instruction>(NAME # _S)>;
3882 def : SVE_1_Op_Imm_Arith_Pred_Pat<nxv2i64, nxv2i1, op, ZPR64, i64, SVEArithUImmPat, !cast<Instruction>(NAME # _D)>;
3885 multiclass sve_int_arith_imm2<string asm, SDPatternOperator op> {
3886 def _B : sve_int_arith_imm<0b00, 0b110000, asm, ZPR8, simm8>;
3887 def _H : sve_int_arith_imm<0b01, 0b110000, asm, ZPR16, simm8>;
3888 def _S : sve_int_arith_imm<0b10, 0b110000, asm, ZPR32, simm8>;
3889 def _D : sve_int_arith_imm<0b11, 0b110000, asm, ZPR64, simm8>;
3891 def : SVE_1_Op_Imm_Arith_Pat<nxv16i8, op, ZPR8, i32, SVEArithSImmPat, !cast<Instruction>(NAME # _B)>;
3892 def : SVE_1_Op_Imm_Arith_Pat<nxv8i16, op, ZPR16, i32, SVEArithSImmPat, !cast<Instruction>(NAME # _H)>;
3893 def : SVE_1_Op_Imm_Arith_Pat<nxv4i32, op, ZPR32, i32, SVEArithSImmPat, !cast<Instruction>(NAME # _S)>;
3894 def : SVE_1_Op_Imm_Arith_Pat<nxv2i64, op, ZPR64, i64, SVEArithSImmPat, !cast<Instruction>(NAME # _D)>;
3897 //===----------------------------------------------------------------------===//
3898 // SVE Bitwise Logical - Unpredicated Group
3899 //===----------------------------------------------------------------------===//
3901 class sve_int_bin_cons_log<bits<2> opc, string asm>
3902 : I<(outs ZPR64:$Zd), (ins ZPR64:$Zn, ZPR64:$Zm),
3903 asm, "\t$Zd, $Zn, $Zm",
3909 let Inst{31-24} = 0b00000100;
3910 let Inst{23-22} = opc{1-0};
3912 let Inst{20-16} = Zm;
3913 let Inst{15-10} = 0b001100;
3918 multiclass sve_int_bin_cons_log<bits<2> opc, string asm, SDPatternOperator op> {
3919 def NAME : sve_int_bin_cons_log<opc, asm>;
3921 def : SVE_2_Op_Pat<nxv16i8, op, nxv16i8, nxv16i8, !cast<Instruction>(NAME)>;
3922 def : SVE_2_Op_Pat<nxv8i16, op, nxv8i16, nxv8i16, !cast<Instruction>(NAME)>;
3923 def : SVE_2_Op_Pat<nxv4i32, op, nxv4i32, nxv4i32, !cast<Instruction>(NAME)>;
3924 def : SVE_2_Op_Pat<nxv2i64, op, nxv2i64, nxv2i64, !cast<Instruction>(NAME)>;
3926 def : InstAlias<asm # "\t$Zd, $Zn, $Zm",
3927 (!cast<Instruction>(NAME) ZPR8:$Zd, ZPR8:$Zn, ZPR8:$Zm), 1>;
3928 def : InstAlias<asm # "\t$Zd, $Zn, $Zm",
3929 (!cast<Instruction>(NAME) ZPR16:$Zd, ZPR16:$Zn, ZPR16:$Zm), 1>;
3930 def : InstAlias<asm # "\t$Zd, $Zn, $Zm",
3931 (!cast<Instruction>(NAME) ZPR32:$Zd, ZPR32:$Zn, ZPR32:$Zm), 1>;
3934 class sve2_int_bitwise_ternary_op_d<bits<3> opc, string asm>
3935 : I<(outs ZPR64:$Zdn), (ins ZPR64:$_Zdn, ZPR64:$Zm, ZPR64:$Zk),
3936 asm, "\t$Zdn, $_Zdn, $Zm, $Zk",
3942 let Inst{31-24} = 0b00000100;
3943 let Inst{23-22} = opc{2-1};
3945 let Inst{20-16} = Zm;
3946 let Inst{15-11} = 0b00111;
3947 let Inst{10} = opc{0};
3949 let Inst{4-0} = Zdn;
3951 let Constraints = "$Zdn = $_Zdn";
3952 let DestructiveInstType = DestructiveOther;
3953 let ElementSize = ElementSizeNone;
3956 multiclass sve2_int_bitwise_ternary_op<bits<3> opc, string asm, SDPatternOperator op> {
3957 def NAME : sve2_int_bitwise_ternary_op_d<opc, asm>;
3959 def : InstAlias<asm # "\t$Zdn, $Zdn, $Zm, $Zk",
3960 (!cast<Instruction>(NAME) ZPR8:$Zdn, ZPR8:$Zm, ZPR8:$Zk), 1>;
3961 def : InstAlias<asm # "\t$Zdn, $Zdn, $Zm, $Zk",
3962 (!cast<Instruction>(NAME) ZPR16:$Zdn, ZPR16:$Zm, ZPR16:$Zk), 1>;
3963 def : InstAlias<asm # "\t$Zdn, $Zdn, $Zm, $Zk",
3964 (!cast<Instruction>(NAME) ZPR32:$Zdn, ZPR32:$Zm, ZPR32:$Zk), 1>;
3966 def : SVE_3_Op_Pat<nxv16i8, op, nxv16i8, nxv16i8, nxv16i8, !cast<Instruction>(NAME)>;
3967 def : SVE_3_Op_Pat<nxv8i16, op, nxv8i16, nxv8i16, nxv8i16, !cast<Instruction>(NAME)>;
3968 def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv4i32, nxv4i32, !cast<Instruction>(NAME)>;
3969 def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv2i64, nxv2i64, !cast<Instruction>(NAME)>;
3972 class sve2_int_rotate_right_imm<bits<4> tsz8_64, string asm,
3973 ZPRRegOp zprty, Operand immtype>
3974 : I<(outs zprty:$Zdn), (ins zprty:$_Zdn, zprty:$Zm, immtype:$imm),
3975 asm, "\t$Zdn, $_Zdn, $Zm, $imm",
3981 let Inst{31-24} = 0b00000100;
3982 let Inst{23-22} = tsz8_64{3-2};
3984 let Inst{20-19} = tsz8_64{1-0};
3985 let Inst{18-16} = imm{2-0}; // imm3
3986 let Inst{15-10} = 0b001101;
3988 let Inst{4-0} = Zdn;
3990 let Constraints = "$Zdn = $_Zdn";
3991 let DestructiveInstType = DestructiveOther;
3992 let ElementSize = ElementSizeNone;
3995 multiclass sve2_int_rotate_right_imm<string asm, SDPatternOperator op> {
3996 def _B : sve2_int_rotate_right_imm<{0,0,0,1}, asm, ZPR8, vecshiftR8>;
3997 def _H : sve2_int_rotate_right_imm<{0,0,1,?}, asm, ZPR16, vecshiftR16> {
3998 let Inst{19} = imm{3};
4000 def _S : sve2_int_rotate_right_imm<{0,1,?,?}, asm, ZPR32, vecshiftR32> {
4001 let Inst{20-19} = imm{4-3};
4003 def _D : sve2_int_rotate_right_imm<{1,?,?,?}, asm, ZPR64, vecshiftR64> {
4004 let Inst{22} = imm{5};
4005 let Inst{20-19} = imm{4-3};
4007 def : SVE_3_Op_Imm_Pat<nxv16i8, op, nxv16i8, nxv16i8, i32, tvecshiftR8, !cast<Instruction>(NAME # _B)>;
4008 def : SVE_3_Op_Imm_Pat<nxv8i16, op, nxv8i16, nxv8i16, i32, tvecshiftR16, !cast<Instruction>(NAME # _H)>;
4009 def : SVE_3_Op_Imm_Pat<nxv4i32, op, nxv4i32, nxv4i32, i32, tvecshiftR32, !cast<Instruction>(NAME # _S)>;
4010 def : SVE_3_Op_Imm_Pat<nxv2i64, op, nxv2i64, nxv2i64, i32, tvecshiftR64, !cast<Instruction>(NAME # _D)>;
4013 //===----------------------------------------------------------------------===//
4014 // SVE Integer Wide Immediate - Predicated Group
4015 //===----------------------------------------------------------------------===//
4017 class sve_int_dup_fpimm_pred<bits<2> sz, Operand fpimmtype,
4018 string asm, ZPRRegOp zprty>
4019 : I<(outs zprty:$Zd), (ins zprty:$_Zd, PPRAny:$Pg, fpimmtype:$imm8),
4020 asm, "\t$Zd, $Pg/m, $imm8",
4026 let Inst{31-24} = 0b00000101;
4027 let Inst{23-22} = sz;
4028 let Inst{21-20} = 0b01;
4029 let Inst{19-16} = Pg;
4030 let Inst{15-13} = 0b110;
4031 let Inst{12-5} = imm8;
4034 let Constraints = "$Zd = $_Zd";
4035 let DestructiveInstType = DestructiveOther;
4036 let ElementSize = zprty.ElementSize;
4039 multiclass sve_int_dup_fpimm_pred<string asm> {
4040 def _H : sve_int_dup_fpimm_pred<0b01, fpimm16, asm, ZPR16>;
4041 def _S : sve_int_dup_fpimm_pred<0b10, fpimm32, asm, ZPR32>;
4042 def _D : sve_int_dup_fpimm_pred<0b11, fpimm64, asm, ZPR64>;
4044 def : InstAlias<"fmov $Zd, $Pg/m, $imm8",
4045 (!cast<Instruction>(NAME # _H) ZPR16:$Zd, PPRAny:$Pg, fpimm16:$imm8), 1>;
4046 def : InstAlias<"fmov $Zd, $Pg/m, $imm8",
4047 (!cast<Instruction>(NAME # _S) ZPR32:$Zd, PPRAny:$Pg, fpimm32:$imm8), 1>;
4048 def : InstAlias<"fmov $Zd, $Pg/m, $imm8",
4049 (!cast<Instruction>(NAME # _D) ZPR64:$Zd, PPRAny:$Pg, fpimm64:$imm8), 1>;
4052 class sve_int_dup_imm_pred<bits<2> sz8_64, bit m, string asm,
4053 ZPRRegOp zprty, string pred_qual, dag iops>
4054 : I<(outs zprty:$Zd), iops,
4055 asm, "\t$Zd, $Pg"#pred_qual#", $imm",
4056 "", []>, Sched<[]> {
4060 let Inst{31-24} = 0b00000101;
4061 let Inst{23-22} = sz8_64;
4062 let Inst{21-20} = 0b01;
4063 let Inst{19-16} = Pg;
4066 let Inst{13} = imm{8}; // sh
4067 let Inst{12-5} = imm{7-0}; // imm8
4070 let DestructiveInstType = DestructiveOther;
4071 let ElementSize = zprty.ElementSize;
4074 multiclass sve_int_dup_imm_pred_merge_inst<
4075 bits<2> sz8_64, string asm, ZPRRegOp zprty, ValueType intty,
4076 ValueType predty, ValueType scalarty, imm8_opt_lsl cpyimm> {
4077 let Constraints = "$Zd = $_Zd" in
4078 def NAME : sve_int_dup_imm_pred<sz8_64, 1, asm, zprty, "/m",
4079 (ins zprty:$_Zd, PPRAny:$Pg, cpyimm:$imm)>;
4080 def : InstAlias<"mov $Zd, $Pg/m, $imm",
4081 (!cast<Instruction>(NAME) zprty:$Zd, PPRAny:$Pg, cpyimm:$imm), 1>;
4083 (vselect predty:$Pg,
4084 (intty (AArch64dup (scalarty (SVE8BitLslImm i32:$imm, i32:$shift)))),
4086 (!cast<Instruction>(NAME) zprty:$Zd, $Pg, i32:$imm, i32:$shift)>;
4089 multiclass sve_int_dup_imm_pred_merge<string asm> {
4090 defm _B : sve_int_dup_imm_pred_merge_inst<0b00, asm, ZPR8, nxv16i8, nxv16i1,
4091 i32, cpy_imm8_opt_lsl_i8>;
4092 defm _H : sve_int_dup_imm_pred_merge_inst<0b01, asm, ZPR16, nxv8i16, nxv8i1,
4093 i32, cpy_imm8_opt_lsl_i16>;
4094 defm _S : sve_int_dup_imm_pred_merge_inst<0b10, asm, ZPR32, nxv4i32, nxv4i1,
4095 i32, cpy_imm8_opt_lsl_i32>;
4096 defm _D : sve_int_dup_imm_pred_merge_inst<0b11, asm, ZPR64, nxv2i64, nxv2i1,
4097 i64, cpy_imm8_opt_lsl_i64>;
4099 def : InstAlias<"fmov $Zd, $Pg/m, #0.0",
4100 (!cast<Instruction>(NAME # _H) ZPR16:$Zd, PPRAny:$Pg, 0, 0), 0>;
4101 def : InstAlias<"fmov $Zd, $Pg/m, #0.0",
4102 (!cast<Instruction>(NAME # _S) ZPR32:$Zd, PPRAny:$Pg, 0, 0), 0>;
4103 def : InstAlias<"fmov $Zd, $Pg/m, #0.0",
4104 (!cast<Instruction>(NAME # _D) ZPR64:$Zd, PPRAny:$Pg, 0, 0), 0>;
4107 multiclass sve_int_dup_imm_pred_zero_inst<
4108 bits<2> sz8_64, string asm, ZPRRegOp zprty, ValueType intty,
4109 ValueType predty, ValueType scalarty, imm8_opt_lsl cpyimm> {
4110 def NAME : sve_int_dup_imm_pred<sz8_64, 0, asm, zprty, "/z",
4111 (ins PPRAny:$Pg, cpyimm:$imm)>;
4112 def : InstAlias<"mov $Zd, $Pg/z, $imm",
4113 (!cast<Instruction>(NAME) zprty:$Zd, PPRAny:$Pg, cpyimm:$imm), 1>;
4114 def : Pat<(intty (zext (predty PPRAny:$Ps1))),
4115 (!cast<Instruction>(NAME) PPRAny:$Ps1, 1, 0)>;
4116 def : Pat<(intty (sext (predty PPRAny:$Ps1))),
4117 (!cast<Instruction>(NAME) PPRAny:$Ps1, -1, 0)>;
4118 def : Pat<(intty (anyext (predty PPRAny:$Ps1))),
4119 (!cast<Instruction>(NAME) PPRAny:$Ps1, 1, 0)>;
4121 (vselect predty:$Pg,
4122 (intty (AArch64dup (scalarty (SVE8BitLslImm i32:$imm, i32:$shift)))),
4123 (intty (AArch64dup (scalarty 0))))),
4124 (!cast<Instruction>(NAME) $Pg, i32:$imm, i32:$shift)>;
4127 multiclass sve_int_dup_imm_pred_zero<string asm> {
4128 defm _B : sve_int_dup_imm_pred_zero_inst<0b00, asm, ZPR8, nxv16i8, nxv16i1,
4129 i32, cpy_imm8_opt_lsl_i8>;
4130 defm _H : sve_int_dup_imm_pred_zero_inst<0b01, asm, ZPR16, nxv8i16, nxv8i1,
4131 i32, cpy_imm8_opt_lsl_i16>;
4132 defm _S : sve_int_dup_imm_pred_zero_inst<0b10, asm, ZPR32, nxv4i32, nxv4i1,
4133 i32, cpy_imm8_opt_lsl_i32>;
4134 defm _D : sve_int_dup_imm_pred_zero_inst<0b11, asm, ZPR64, nxv2i64, nxv2i1,
4135 i64, cpy_imm8_opt_lsl_i64>;
4138 //===----------------------------------------------------------------------===//
4139 // SVE Integer Compare - Vectors Group
4140 //===----------------------------------------------------------------------===//
4142 class sve_int_cmp<bit cmp_1, bits<2> sz8_64, bits<3> opc, string asm,
4143 PPRRegOp pprty, ZPRRegOp zprty1, ZPRRegOp zprty2>
4144 : I<(outs pprty:$Pd), (ins PPR3bAny:$Pg, zprty1:$Zn, zprty2:$Zm),
4145 asm, "\t$Pd, $Pg/z, $Zn, $Zm",
4152 let Inst{31-24} = 0b00100100;
4153 let Inst{23-22} = sz8_64;
4155 let Inst{20-16} = Zm;
4156 let Inst{15} = opc{2};
4157 let Inst{14} = cmp_1;
4158 let Inst{13} = opc{1};
4159 let Inst{12-10} = Pg;
4161 let Inst{4} = opc{0};
4167 multiclass SVE_SETCC_Pat<CondCode cc, CondCode invcc, ValueType predvt,
4168 ValueType intvt, sve_int_cmp cmp> {
4169 def : Pat<(predvt (AArch64setcc_z predvt:$Op1, intvt:$Op2, intvt:$Op3, cc)),
4170 (cmp $Op1, $Op2, $Op3)>;
4171 def : Pat<(predvt (AArch64setcc_z predvt:$Op1, intvt:$Op2, intvt:$Op3, invcc)),
4172 (cmp $Op1, $Op3, $Op2)>;
4175 multiclass sve_int_cmp_0<bits<3> opc, string asm, CondCode cc, CondCode invcc> {
4176 def _B : sve_int_cmp<0b0, 0b00, opc, asm, PPR8, ZPR8, ZPR8>;
4177 def _H : sve_int_cmp<0b0, 0b01, opc, asm, PPR16, ZPR16, ZPR16>;
4178 def _S : sve_int_cmp<0b0, 0b10, opc, asm, PPR32, ZPR32, ZPR32>;
4179 def _D : sve_int_cmp<0b0, 0b11, opc, asm, PPR64, ZPR64, ZPR64>;
4181 defm : SVE_SETCC_Pat<cc, invcc, nxv16i1, nxv16i8, !cast<Instruction>(NAME # _B)>;
4182 defm : SVE_SETCC_Pat<cc, invcc, nxv8i1, nxv8i16, !cast<Instruction>(NAME # _H)>;
4183 defm : SVE_SETCC_Pat<cc, invcc, nxv4i1, nxv4i32, !cast<Instruction>(NAME # _S)>;
4184 defm : SVE_SETCC_Pat<cc, invcc, nxv2i1, nxv2i64, !cast<Instruction>(NAME # _D)>;
4187 multiclass sve_int_cmp_0_wide<bits<3> opc, string asm, SDPatternOperator op> {
4188 def _B : sve_int_cmp<0b0, 0b00, opc, asm, PPR8, ZPR8, ZPR64>;
4189 def _H : sve_int_cmp<0b0, 0b01, opc, asm, PPR16, ZPR16, ZPR64>;
4190 def _S : sve_int_cmp<0b0, 0b10, opc, asm, PPR32, ZPR32, ZPR64>;
4192 def : SVE_3_Op_Pat<nxv16i1, op, nxv16i1, nxv16i8, nxv2i64, !cast<Instruction>(NAME # _B)>;
4193 def : SVE_3_Op_Pat<nxv8i1, op, nxv8i1, nxv8i16, nxv2i64, !cast<Instruction>(NAME # _H)>;
4194 def : SVE_3_Op_Pat<nxv4i1, op, nxv4i1, nxv4i32, nxv2i64, !cast<Instruction>(NAME # _S)>;
4197 multiclass sve_int_cmp_1_wide<bits<3> opc, string asm, SDPatternOperator op> {
4198 def _B : sve_int_cmp<0b1, 0b00, opc, asm, PPR8, ZPR8, ZPR64>;
4199 def _H : sve_int_cmp<0b1, 0b01, opc, asm, PPR16, ZPR16, ZPR64>;
4200 def _S : sve_int_cmp<0b1, 0b10, opc, asm, PPR32, ZPR32, ZPR64>;
4202 def : SVE_3_Op_Pat<nxv16i1, op, nxv16i1, nxv16i8, nxv2i64, !cast<Instruction>(NAME # _B)>;
4203 def : SVE_3_Op_Pat<nxv8i1, op, nxv8i1, nxv8i16, nxv2i64, !cast<Instruction>(NAME # _H)>;
4204 def : SVE_3_Op_Pat<nxv4i1, op, nxv4i1, nxv4i32, nxv2i64, !cast<Instruction>(NAME # _S)>;
4208 //===----------------------------------------------------------------------===//
4209 // SVE Integer Compare - Signed Immediate Group
4210 //===----------------------------------------------------------------------===//
4212 class sve_int_scmp_vi<bits<2> sz8_64, bits<3> opc, string asm, PPRRegOp pprty,
4215 : I<(outs pprty:$Pd), (ins PPR3bAny:$Pg, zprty:$Zn, immtype:$imm5),
4216 asm, "\t$Pd, $Pg/z, $Zn, $imm5",
4223 let Inst{31-24} = 0b00100101;
4224 let Inst{23-22} = sz8_64;
4226 let Inst{20-16} = imm5;
4227 let Inst{15} = opc{2};
4229 let Inst{13} = opc{1};
4230 let Inst{12-10} = Pg;
4232 let Inst{4} = opc{0};
4236 let ElementSize = pprty.ElementSize;
4239 multiclass SVE_SETCC_Imm_Pat<CondCode cc, CondCode commuted_cc,
4240 ValueType predvt, ValueType intvt,
4241 Operand immtype, Instruction cmp> {
4242 def : Pat<(predvt (AArch64setcc_z (predvt PPR_3b:$Pg),
4244 (intvt (AArch64dup (immtype:$imm))),
4246 (cmp $Pg, $Zs1, immtype:$imm)>;
4247 def : Pat<(predvt (AArch64setcc_z (predvt PPR_3b:$Pg),
4248 (intvt (AArch64dup (immtype:$imm))),
4251 (cmp $Pg, $Zs1, immtype:$imm)>;
4254 multiclass sve_int_scmp_vi<bits<3> opc, string asm, CondCode cc, CondCode commuted_cc> {
4255 def _B : sve_int_scmp_vi<0b00, opc, asm, PPR8, ZPR8, simm5_32b>;
4256 def _H : sve_int_scmp_vi<0b01, opc, asm, PPR16, ZPR16, simm5_32b>;
4257 def _S : sve_int_scmp_vi<0b10, opc, asm, PPR32, ZPR32, simm5_32b>;
4258 def _D : sve_int_scmp_vi<0b11, opc, asm, PPR64, ZPR64, simm5_64b>;
4260 defm : SVE_SETCC_Imm_Pat<cc, commuted_cc, nxv16i1, nxv16i8, simm5_32b,
4261 !cast<Instruction>(NAME # _B)>;
4262 defm : SVE_SETCC_Imm_Pat<cc, commuted_cc, nxv8i1, nxv8i16, simm5_32b,
4263 !cast<Instruction>(NAME # _H)>;
4264 defm : SVE_SETCC_Imm_Pat<cc, commuted_cc, nxv4i1, nxv4i32, simm5_32b,
4265 !cast<Instruction>(NAME # _S)>;
4266 defm : SVE_SETCC_Imm_Pat<cc, commuted_cc, nxv2i1, nxv2i64, simm5_64b,
4267 !cast<Instruction>(NAME # _D)>;
4271 //===----------------------------------------------------------------------===//
4272 // SVE Integer Compare - Unsigned Immediate Group
4273 //===----------------------------------------------------------------------===//
4275 class sve_int_ucmp_vi<bits<2> sz8_64, bits<2> opc, string asm, PPRRegOp pprty,
4276 ZPRRegOp zprty, Operand immtype>
4277 : I<(outs pprty:$Pd), (ins PPR3bAny:$Pg, zprty:$Zn, immtype:$imm7),
4278 asm, "\t$Pd, $Pg/z, $Zn, $imm7",
4285 let Inst{31-24} = 0b00100100;
4286 let Inst{23-22} = sz8_64;
4288 let Inst{20-14} = imm7;
4289 let Inst{13} = opc{1};
4290 let Inst{12-10} = Pg;
4292 let Inst{4} = opc{0};
4298 multiclass sve_int_ucmp_vi<bits<2> opc, string asm, CondCode cc,
4299 CondCode commuted_cc> {
4300 def _B : sve_int_ucmp_vi<0b00, opc, asm, PPR8, ZPR8, imm0_127>;
4301 def _H : sve_int_ucmp_vi<0b01, opc, asm, PPR16, ZPR16, imm0_127>;
4302 def _S : sve_int_ucmp_vi<0b10, opc, asm, PPR32, ZPR32, imm0_127>;
4303 def _D : sve_int_ucmp_vi<0b11, opc, asm, PPR64, ZPR64, imm0_127_64b>;
4305 defm : SVE_SETCC_Imm_Pat<cc, commuted_cc, nxv16i1, nxv16i8, imm0_127,
4306 !cast<Instruction>(NAME # _B)>;
4307 defm : SVE_SETCC_Imm_Pat<cc, commuted_cc, nxv8i1, nxv8i16, imm0_127,
4308 !cast<Instruction>(NAME # _H)>;
4309 defm : SVE_SETCC_Imm_Pat<cc, commuted_cc, nxv4i1, nxv4i32, imm0_127,
4310 !cast<Instruction>(NAME # _S)>;
4311 defm : SVE_SETCC_Imm_Pat<cc, commuted_cc, nxv2i1, nxv2i64, imm0_127_64b,
4312 !cast<Instruction>(NAME # _D)>;
4316 //===----------------------------------------------------------------------===//
4317 // SVE Integer Compare - Scalars Group
4318 //===----------------------------------------------------------------------===//
4320 class sve_int_cterm<bit sz, bit opc, string asm, RegisterClass rt>
4321 : I<(outs), (ins rt:$Rn, rt:$Rm),
4327 let Inst{31-23} = 0b001001011;
4330 let Inst{20-16} = Rm;
4331 let Inst{15-10} = 0b001000;
4334 let Inst{3-0} = 0b0000;
4339 class sve_int_while_rr<bits<2> sz8_64, bits<4> opc, string asm,
4340 RegisterClass gprty, PPRRegOp pprty,
4341 ValueType vt, SDPatternOperator op>
4342 : I<(outs pprty:$Pd), (ins gprty:$Rn, gprty:$Rm),
4343 asm, "\t$Pd, $Rn, $Rm",
4344 "", []>, Sched<[]> {
4348 let Inst{31-24} = 0b00100101;
4349 let Inst{23-22} = sz8_64;
4351 let Inst{20-16} = Rm;
4352 let Inst{15-13} = 0b000;
4353 let Inst{12-10} = opc{3-1};
4355 let Inst{4} = opc{0};
4361 multiclass sve_int_while4_rr<bits<3> opc, string asm, SDPatternOperator op> {
4362 def _B : sve_int_while_rr<0b00, { 0, opc }, asm, GPR32, PPR8, nxv16i1, op>;
4363 def _H : sve_int_while_rr<0b01, { 0, opc }, asm, GPR32, PPR16, nxv8i1, op>;
4364 def _S : sve_int_while_rr<0b10, { 0, opc }, asm, GPR32, PPR32, nxv4i1, op>;
4365 def _D : sve_int_while_rr<0b11, { 0, opc }, asm, GPR32, PPR64, nxv2i1, op>;
4367 def : SVE_2_Op_Pat<nxv16i1, op, i32, i32, !cast<Instruction>(NAME # _B)>;
4368 def : SVE_2_Op_Pat<nxv8i1, op, i32, i32, !cast<Instruction>(NAME # _H)>;
4369 def : SVE_2_Op_Pat<nxv4i1, op, i32, i32, !cast<Instruction>(NAME # _S)>;
4370 def : SVE_2_Op_Pat<nxv2i1, op, i32, i32, !cast<Instruction>(NAME # _D)>;
4373 multiclass sve_int_while8_rr<bits<3> opc, string asm, SDPatternOperator op> {
4374 def _B : sve_int_while_rr<0b00, { 1, opc }, asm, GPR64, PPR8, nxv16i1, op>;
4375 def _H : sve_int_while_rr<0b01, { 1, opc }, asm, GPR64, PPR16, nxv8i1, op>;
4376 def _S : sve_int_while_rr<0b10, { 1, opc }, asm, GPR64, PPR32, nxv4i1, op>;
4377 def _D : sve_int_while_rr<0b11, { 1, opc }, asm, GPR64, PPR64, nxv2i1, op>;
4379 def : SVE_2_Op_Pat<nxv16i1, op, i64, i64, !cast<Instruction>(NAME # _B)>;
4380 def : SVE_2_Op_Pat<nxv8i1, op, i64, i64, !cast<Instruction>(NAME # _H)>;
4381 def : SVE_2_Op_Pat<nxv4i1, op, i64, i64, !cast<Instruction>(NAME # _S)>;
4382 def : SVE_2_Op_Pat<nxv2i1, op, i64, i64, !cast<Instruction>(NAME # _D)>;
4385 class sve2_int_while_rr<bits<2> sz8_64, bits<1> rw, string asm,
4387 : I<(outs pprty:$Pd), (ins GPR64:$Rn, GPR64:$Rm),
4388 asm, "\t$Pd, $Rn, $Rm",
4389 "", []>, Sched<[]> {
4393 let Inst{31-24} = 0b00100101;
4394 let Inst{23-22} = sz8_64;
4396 let Inst{20-16} = Rm;
4397 let Inst{15-10} = 0b001100;
4405 multiclass sve2_int_while_rr<bits<1> rw, string asm, string op> {
4406 def _B : sve2_int_while_rr<0b00, rw, asm, PPR8>;
4407 def _H : sve2_int_while_rr<0b01, rw, asm, PPR16>;
4408 def _S : sve2_int_while_rr<0b10, rw, asm, PPR32>;
4409 def _D : sve2_int_while_rr<0b11, rw, asm, PPR64>;
4411 def : SVE_2_Op_Pat<nxv16i1, !cast<SDPatternOperator>(op # _b), i64, i64, !cast<Instruction>(NAME # _B)>;
4412 def : SVE_2_Op_Pat<nxv8i1, !cast<SDPatternOperator>(op # _h), i64, i64, !cast<Instruction>(NAME # _H)>;
4413 def : SVE_2_Op_Pat<nxv4i1, !cast<SDPatternOperator>(op # _s), i64, i64, !cast<Instruction>(NAME # _S)>;
4414 def : SVE_2_Op_Pat<nxv2i1, !cast<SDPatternOperator>(op # _d), i64, i64, !cast<Instruction>(NAME # _D)>;
4418 //===----------------------------------------------------------------------===//
4419 // SVE Floating Point Fast Reduction Group
4420 //===----------------------------------------------------------------------===//
4422 class sve_fp_fast_red<bits<2> sz, bits<3> opc, string asm,
4423 ZPRRegOp zprty, FPRasZPROperand dstOpType>
4424 : I<(outs dstOpType:$Vd), (ins PPR3bAny:$Pg, zprty:$Zn),
4425 asm, "\t$Vd, $Pg, $Zn",
4431 let Inst{31-24} = 0b01100101;
4432 let Inst{23-22} = sz;
4433 let Inst{21-19} = 0b000;
4434 let Inst{18-16} = opc;
4435 let Inst{15-13} = 0b001;
4436 let Inst{12-10} = Pg;
4441 multiclass sve_fp_fast_red<bits<3> opc, string asm, SDPatternOperator op> {
4442 def _H : sve_fp_fast_red<0b01, opc, asm, ZPR16, FPR16asZPR>;
4443 def _S : sve_fp_fast_red<0b10, opc, asm, ZPR32, FPR32asZPR>;
4444 def _D : sve_fp_fast_red<0b11, opc, asm, ZPR64, FPR64asZPR>;
4446 def : SVE_2_Op_Pat<nxv8f16, op, nxv8i1, nxv8f16, !cast<Instruction>(NAME # _H)>;
4447 def : SVE_2_Op_Pat<nxv4f32, op, nxv4i1, nxv4f32, !cast<Instruction>(NAME # _S)>;
4448 def : SVE_2_Op_Pat<nxv2f64, op, nxv2i1, nxv2f64, !cast<Instruction>(NAME # _D)>;
4452 //===----------------------------------------------------------------------===//
4453 // SVE Floating Point Accumulating Reduction Group
4454 //===----------------------------------------------------------------------===//
4456 class sve_fp_2op_p_vd<bits<2> sz, bits<3> opc, string asm,
4457 ZPRRegOp zprty, FPRasZPROperand dstOpType>
4458 : I<(outs dstOpType:$Vdn), (ins PPR3bAny:$Pg, dstOpType:$_Vdn, zprty:$Zm),
4459 asm, "\t$Vdn, $Pg, $_Vdn, $Zm",
4466 let Inst{31-24} = 0b01100101;
4467 let Inst{23-22} = sz;
4468 let Inst{21-19} = 0b011;
4469 let Inst{18-16} = opc;
4470 let Inst{15-13} = 0b001;
4471 let Inst{12-10} = Pg;
4473 let Inst{4-0} = Vdn;
4475 let Constraints = "$Vdn = $_Vdn";
4478 multiclass sve_fp_2op_p_vd<bits<3> opc, string asm, SDPatternOperator op> {
4479 def _H : sve_fp_2op_p_vd<0b01, opc, asm, ZPR16, FPR16asZPR>;
4480 def _S : sve_fp_2op_p_vd<0b10, opc, asm, ZPR32, FPR32asZPR>;
4481 def _D : sve_fp_2op_p_vd<0b11, opc, asm, ZPR64, FPR64asZPR>;
4483 def : SVE_3_Op_Pat<nxv8f16, op, nxv8i1, nxv8f16, nxv8f16, !cast<Instruction>(NAME # _H)>;
4484 def : SVE_3_Op_Pat<nxv4f32, op, nxv4i1, nxv4f32, nxv4f32, !cast<Instruction>(NAME # _S)>;
4485 def : SVE_3_Op_Pat<nxv2f64, op, nxv2i1, nxv2f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
4488 //===----------------------------------------------------------------------===//
4489 // SVE Floating Point Compare - Vectors Group
4490 //===----------------------------------------------------------------------===//
4492 class sve_fp_3op_p_pd<bits<2> sz, bits<3> opc, string asm, PPRRegOp pprty,
4494 : I<(outs pprty:$Pd), (ins PPR3bAny:$Pg, zprty:$Zn, zprty:$Zm),
4495 asm, "\t$Pd, $Pg/z, $Zn, $Zm",
4502 let Inst{31-24} = 0b01100101;
4503 let Inst{23-22} = sz;
4505 let Inst{20-16} = Zm;
4506 let Inst{15} = opc{2};
4508 let Inst{13} = opc{1};
4509 let Inst{12-10} = Pg;
4511 let Inst{4} = opc{0};
4515 multiclass sve_fp_3op_p_pd<bits<3> opc, string asm, SDPatternOperator op> {
4516 def _H : sve_fp_3op_p_pd<0b01, opc, asm, PPR16, ZPR16>;
4517 def _S : sve_fp_3op_p_pd<0b10, opc, asm, PPR32, ZPR32>;
4518 def _D : sve_fp_3op_p_pd<0b11, opc, asm, PPR64, ZPR64>;
4520 def : SVE_3_Op_Pat<nxv8i1, op, nxv8i1, nxv8f16, nxv8f16, !cast<Instruction>(NAME # _H)>;
4521 def : SVE_3_Op_Pat<nxv4i1, op, nxv4i1, nxv4f32, nxv4f32, !cast<Instruction>(NAME # _S)>;
4522 def : SVE_3_Op_Pat<nxv2i1, op, nxv2i1, nxv2f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
4525 multiclass sve_fp_3op_p_pd_cc<bits<3> opc, string asm, SDPatternOperator op,
4526 SDPatternOperator op_nopred>
4527 : sve_fp_3op_p_pd<opc, asm, op> {
4528 def : SVE_2_Op_AllActive_Pat<nxv8i1, op_nopred, nxv8f16, nxv8f16,
4529 !cast<Instruction>(NAME # _H), PTRUE_H>;
4530 def : SVE_2_Op_AllActive_Pat<nxv4i1, op_nopred, nxv4f16, nxv4f16,
4531 !cast<Instruction>(NAME # _H), PTRUE_S>;
4532 def : SVE_2_Op_AllActive_Pat<nxv2i1, op_nopred, nxv2f16, nxv2f16,
4533 !cast<Instruction>(NAME # _H), PTRUE_D>;
4534 def : SVE_2_Op_AllActive_Pat<nxv4i1, op_nopred, nxv4f32, nxv4f32,
4535 !cast<Instruction>(NAME # _S), PTRUE_S>;
4536 def : SVE_2_Op_AllActive_Pat<nxv2i1, op_nopred, nxv2f32, nxv2f32,
4537 !cast<Instruction>(NAME # _S), PTRUE_D>;
4538 def : SVE_2_Op_AllActive_Pat<nxv2i1, op_nopred, nxv2f64, nxv2f64,
4539 !cast<Instruction>(NAME # _D), PTRUE_D>;
4542 //===----------------------------------------------------------------------===//
4543 // SVE Floating Point Compare - with Zero Group
4544 //===----------------------------------------------------------------------===//
4546 class sve_fp_2op_p_pd<bits<2> sz, bits<3> opc, string asm, PPRRegOp pprty,
4548 : I<(outs pprty:$Pd), (ins PPR3bAny:$Pg, zprty:$Zn),
4549 asm, "\t$Pd, $Pg/z, $Zn, #0.0",
4555 let Inst{31-24} = 0b01100101;
4556 let Inst{23-22} = sz;
4557 let Inst{21-18} = 0b0100;
4558 let Inst{17-16} = opc{2-1};
4559 let Inst{15-13} = 0b001;
4560 let Inst{12-10} = Pg;
4562 let Inst{4} = opc{0};
4566 multiclass sve_fp_2op_p_pd<bits<3> opc, string asm> {
4567 def _H : sve_fp_2op_p_pd<0b01, opc, asm, PPR16, ZPR16>;
4568 def _S : sve_fp_2op_p_pd<0b10, opc, asm, PPR32, ZPR32>;
4569 def _D : sve_fp_2op_p_pd<0b11, opc, asm, PPR64, ZPR64>;
4573 //===----------------------------------------------------------------------===//
4574 //SVE Index Generation Group
4575 //===----------------------------------------------------------------------===//
4577 class sve_int_index_ii<bits<2> sz8_64, string asm, ZPRRegOp zprty,
4579 : I<(outs zprty:$Zd), (ins imm_ty:$imm5, imm_ty:$imm5b),
4580 asm, "\t$Zd, $imm5, $imm5b",
4581 "", []>, Sched<[]> {
4585 let Inst{31-24} = 0b00000100;
4586 let Inst{23-22} = sz8_64;
4588 let Inst{20-16} = imm5b;
4589 let Inst{15-10} = 0b010000;
4590 let Inst{9-5} = imm5;
4594 multiclass sve_int_index_ii<string asm, SDPatternOperator op> {
4595 def _B : sve_int_index_ii<0b00, asm, ZPR8, simm5_8b>;
4596 def _H : sve_int_index_ii<0b01, asm, ZPR16, simm5_16b>;
4597 def _S : sve_int_index_ii<0b10, asm, ZPR32, simm5_32b>;
4598 def _D : sve_int_index_ii<0b11, asm, ZPR64, simm5_64b>;
4600 def : Pat<(nxv16i8 (op simm5_8b:$imm5, simm5_8b:$imm5b)),
4601 (!cast<Instruction>(NAME # "_B") simm5_8b:$imm5, simm5_8b:$imm5b)>;
4602 def : Pat<(nxv8i16 (op simm5_16b:$imm5, simm5_16b:$imm5b)),
4603 (!cast<Instruction>(NAME # "_H") simm5_16b:$imm5, simm5_16b:$imm5b)>;
4604 def : Pat<(nxv4i32 (op simm5_32b:$imm5, simm5_32b:$imm5b)),
4605 (!cast<Instruction>(NAME # "_S") simm5_32b:$imm5, simm5_32b:$imm5b)>;
4606 def : Pat<(nxv2i64 (op simm5_64b:$imm5, simm5_64b:$imm5b)),
4607 (!cast<Instruction>(NAME # "_D") simm5_64b:$imm5, simm5_64b:$imm5b)>;
4610 class sve_int_index_ir<bits<2> sz8_64, string asm, ZPRRegOp zprty,
4611 RegisterClass srcRegType, Operand imm_ty>
4612 : I<(outs zprty:$Zd), (ins imm_ty:$imm5, srcRegType:$Rm),
4613 asm, "\t$Zd, $imm5, $Rm",
4614 "", []>, Sched<[]> {
4618 let Inst{31-24} = 0b00000100;
4619 let Inst{23-22} = sz8_64;
4621 let Inst{20-16} = Rm;
4622 let Inst{15-10} = 0b010010;
4623 let Inst{9-5} = imm5;
4627 multiclass sve_int_index_ir<string asm, SDPatternOperator op> {
4628 def _B : sve_int_index_ir<0b00, asm, ZPR8, GPR32, simm5_8b>;
4629 def _H : sve_int_index_ir<0b01, asm, ZPR16, GPR32, simm5_16b>;
4630 def _S : sve_int_index_ir<0b10, asm, ZPR32, GPR32, simm5_32b>;
4631 def _D : sve_int_index_ir<0b11, asm, ZPR64, GPR64, simm5_64b>;
4633 def : Pat<(nxv16i8 (op simm5_8b:$imm5, GPR32:$Rm)),
4634 (!cast<Instruction>(NAME # "_B") simm5_8b:$imm5, GPR32:$Rm)>;
4635 def : Pat<(nxv8i16 (op simm5_16b:$imm5, GPR32:$Rm)),
4636 (!cast<Instruction>(NAME # "_H") simm5_16b:$imm5, GPR32:$Rm)>;
4637 def : Pat<(nxv4i32 (op simm5_32b:$imm5, GPR32:$Rm)),
4638 (!cast<Instruction>(NAME # "_S") simm5_32b:$imm5, GPR32:$Rm)>;
4639 def : Pat<(nxv2i64 (op simm5_64b:$imm5, GPR64:$Rm)),
4640 (!cast<Instruction>(NAME # "_D") simm5_64b:$imm5, GPR64:$Rm)>;
4643 class sve_int_index_ri<bits<2> sz8_64, string asm, ZPRRegOp zprty,
4644 RegisterClass srcRegType, Operand imm_ty>
4645 : I<(outs zprty:$Zd), (ins srcRegType:$Rn, imm_ty:$imm5),
4646 asm, "\t$Zd, $Rn, $imm5",
4647 "", []>, Sched<[]> {
4651 let Inst{31-24} = 0b00000100;
4652 let Inst{23-22} = sz8_64;
4654 let Inst{20-16} = imm5;
4655 let Inst{15-10} = 0b010001;
4660 multiclass sve_int_index_ri<string asm, SDPatternOperator op> {
4661 def _B : sve_int_index_ri<0b00, asm, ZPR8, GPR32, simm5_8b>;
4662 def _H : sve_int_index_ri<0b01, asm, ZPR16, GPR32, simm5_16b>;
4663 def _S : sve_int_index_ri<0b10, asm, ZPR32, GPR32, simm5_32b>;
4664 def _D : sve_int_index_ri<0b11, asm, ZPR64, GPR64, simm5_64b>;
4666 def : Pat<(nxv16i8 (op GPR32:$Rm, simm5_8b:$imm5)),
4667 (!cast<Instruction>(NAME # "_B") GPR32:$Rm, simm5_8b:$imm5)>;
4668 def : Pat<(nxv8i16 (op GPR32:$Rm, simm5_16b:$imm5)),
4669 (!cast<Instruction>(NAME # "_H") GPR32:$Rm, simm5_16b:$imm5)>;
4670 def : Pat<(nxv4i32 (op GPR32:$Rm, simm5_32b:$imm5)),
4671 (!cast<Instruction>(NAME # "_S") GPR32:$Rm, simm5_32b:$imm5)>;
4672 def : Pat<(nxv2i64 (op GPR64:$Rm, simm5_64b:$imm5)),
4673 (!cast<Instruction>(NAME # "_D") GPR64:$Rm, simm5_64b:$imm5)>;
4676 class sve_int_index_rr<bits<2> sz8_64, string asm, ZPRRegOp zprty,
4677 RegisterClass srcRegType>
4678 : I<(outs zprty:$Zd), (ins srcRegType:$Rn, srcRegType:$Rm),
4679 asm, "\t$Zd, $Rn, $Rm",
4680 "", []>, Sched<[]> {
4684 let Inst{31-24} = 0b00000100;
4685 let Inst{23-22} = sz8_64;
4687 let Inst{20-16} = Rm;
4688 let Inst{15-10} = 0b010011;
4693 multiclass sve_int_index_rr<string asm, SDPatternOperator op> {
4694 def _B : sve_int_index_rr<0b00, asm, ZPR8, GPR32>;
4695 def _H : sve_int_index_rr<0b01, asm, ZPR16, GPR32>;
4696 def _S : sve_int_index_rr<0b10, asm, ZPR32, GPR32>;
4697 def _D : sve_int_index_rr<0b11, asm, ZPR64, GPR64>;
4699 def : SVE_2_Op_Pat<nxv16i8, op, i32, i32, !cast<Instruction>(NAME # _B)>;
4700 def : SVE_2_Op_Pat<nxv8i16, op, i32, i32, !cast<Instruction>(NAME # _H)>;
4701 def : SVE_2_Op_Pat<nxv4i32, op, i32, i32, !cast<Instruction>(NAME # _S)>;
4702 def : SVE_2_Op_Pat<nxv2i64, op, i64, i64, !cast<Instruction>(NAME # _D)>;
4705 //===----------------------------------------------------------------------===//
4706 // SVE Bitwise Shift - Predicated Group
4707 //===----------------------------------------------------------------------===//
4708 class sve_int_bin_pred_shift_imm<bits<4> tsz8_64, bits<4> opc, string asm,
4709 ZPRRegOp zprty, Operand immtype>
4710 : I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, immtype:$imm),
4711 asm, "\t$Zdn, $Pg/m, $_Zdn, $imm",
4717 let Inst{31-24} = 0b00000100;
4718 let Inst{23-22} = tsz8_64{3-2};
4719 let Inst{21-20} = 0b00;
4720 let Inst{19-16} = opc;
4721 let Inst{15-13} = 0b100;
4722 let Inst{12-10} = Pg;
4723 let Inst{9-8} = tsz8_64{1-0};
4724 let Inst{7-5} = imm{2-0}; // imm3
4725 let Inst{4-0} = Zdn;
4727 let Constraints = "$Zdn = $_Zdn";
4728 let DestructiveInstType = DestructiveBinaryImm;
4729 let ElementSize = zprty.ElementSize;
4732 multiclass sve_int_bin_pred_shift_imm_left<bits<4> opc, string asm, string psName=""> {
4733 def _B : SVEPseudo2Instr<psName # _B, 1>,
4734 sve_int_bin_pred_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftL8>;
4735 def _H : SVEPseudo2Instr<psName # _H, 1>,
4736 sve_int_bin_pred_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftL16> {
4737 let Inst{8} = imm{3};
4739 def _S : SVEPseudo2Instr<psName # _S, 1>,
4740 sve_int_bin_pred_shift_imm<{0,1,?,?}, opc, asm, ZPR32, vecshiftL32> {
4741 let Inst{9-8} = imm{4-3};
4743 def _D : SVEPseudo2Instr<psName # _D, 1>,
4744 sve_int_bin_pred_shift_imm<{1,?,?,?}, opc, asm, ZPR64, vecshiftL64> {
4745 let Inst{22} = imm{5};
4746 let Inst{9-8} = imm{4-3};
4750 multiclass sve2_int_bin_pred_shift_imm_left<bits<4> opc, string asm,
4752 SDPatternOperator op> {
4754 def _B : SVEPseudo2Instr<psName # _B, 1>, sve_int_bin_pred_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftL8>;
4755 def _H : SVEPseudo2Instr<psName # _H, 1>,
4756 sve_int_bin_pred_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftL16> {
4757 let Inst{8} = imm{3};
4759 def _S : SVEPseudo2Instr<psName # _S, 1>,
4760 sve_int_bin_pred_shift_imm<{0,1,?,?}, opc, asm, ZPR32, vecshiftL32> {
4761 let Inst{9-8} = imm{4-3};
4763 def _D : SVEPseudo2Instr<psName # _D, 1>,
4764 sve_int_bin_pred_shift_imm<{1,?,?,?}, opc, asm, ZPR64, vecshiftL64> {
4765 let Inst{22} = imm{5};
4766 let Inst{9-8} = imm{4-3};
4769 def : SVE_3_Op_Imm_Pat<nxv16i8, op, nxv16i1, nxv16i8, i32, tvecshiftL8, !cast<Instruction>(NAME # _B)>;
4770 def : SVE_3_Op_Imm_Pat<nxv8i16, op, nxv8i1, nxv8i16, i32, tvecshiftL16, !cast<Instruction>(NAME # _H)>;
4771 def : SVE_3_Op_Imm_Pat<nxv4i32, op, nxv4i1, nxv4i32, i32, tvecshiftL32, !cast<Instruction>(NAME # _S)>;
4772 def : SVE_3_Op_Imm_Pat<nxv2i64, op, nxv2i1, nxv2i64, i32, tvecshiftL64, !cast<Instruction>(NAME # _D)>;
4775 multiclass sve_int_bin_pred_shift_imm_left_zeroing_bhsd<SDPatternOperator op> {
4776 def _ZERO_B : PredTwoOpImmPseudo<NAME # _B, ZPR8, tvecshiftL8, FalseLanesZero>;
4777 def _ZERO_H : PredTwoOpImmPseudo<NAME # _H, ZPR16, tvecshiftL16, FalseLanesZero>;
4778 def _ZERO_S : PredTwoOpImmPseudo<NAME # _S, ZPR32, tvecshiftL32, FalseLanesZero>;
4779 def _ZERO_D : PredTwoOpImmPseudo<NAME # _D, ZPR64, tvecshiftL64, FalseLanesZero>;
4781 def : SVE_3_Op_Pat_Shift_Imm_SelZero<nxv16i8, op, nxv16i1, nxv16i8, tvecshiftL8, !cast<Pseudo>(NAME # _ZERO_B)>;
4782 def : SVE_3_Op_Pat_Shift_Imm_SelZero<nxv8i16, op, nxv8i1, nxv8i16, tvecshiftL16, !cast<Pseudo>(NAME # _ZERO_H)>;
4783 def : SVE_3_Op_Pat_Shift_Imm_SelZero<nxv4i32, op, nxv4i1, nxv4i32, tvecshiftL32, !cast<Pseudo>(NAME # _ZERO_S)>;
4784 def : SVE_3_Op_Pat_Shift_Imm_SelZero<nxv2i64, op, nxv2i1, nxv2i64, tvecshiftL64, !cast<Pseudo>(NAME # _ZERO_D)>;
4787 multiclass sve_int_bin_pred_shift_imm_right<bits<4> opc, string asm, string Ps,
4788 SDPatternOperator op = null_frag> {
4789 def _B : SVEPseudo2Instr<Ps # _B, 1>,
4790 sve_int_bin_pred_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftR8>;
4791 def _H : SVEPseudo2Instr<Ps # _H, 1>,
4792 sve_int_bin_pred_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftR16> {
4793 let Inst{8} = imm{3};
4795 def _S : SVEPseudo2Instr<Ps # _S, 1>,
4796 sve_int_bin_pred_shift_imm<{0,1,?,?}, opc, asm, ZPR32, vecshiftR32> {
4797 let Inst{9-8} = imm{4-3};
4799 def _D : SVEPseudo2Instr<Ps # _D, 1>,
4800 sve_int_bin_pred_shift_imm<{1,?,?,?}, opc, asm, ZPR64, vecshiftR64> {
4801 let Inst{22} = imm{5};
4802 let Inst{9-8} = imm{4-3};
4805 def : SVE_3_Op_Imm_Pat<nxv16i8, op, nxv16i1, nxv16i8, i32, tvecshiftR8, !cast<Instruction>(NAME # _B)>;
4806 def : SVE_3_Op_Imm_Pat<nxv8i16, op, nxv8i1, nxv8i16, i32, tvecshiftR16, !cast<Instruction>(NAME # _H)>;
4807 def : SVE_3_Op_Imm_Pat<nxv4i32, op, nxv4i1, nxv4i32, i32, tvecshiftR32, !cast<Instruction>(NAME # _S)>;
4808 def : SVE_3_Op_Imm_Pat<nxv2i64, op, nxv2i1, nxv2i64, i32, tvecshiftR64, !cast<Instruction>(NAME # _D)>;
4811 multiclass sve_int_bin_pred_shift_imm_right_zeroing_bhsd<SDPatternOperator op = null_frag> {
4812 def _ZERO_B : PredTwoOpImmPseudo<NAME # _B, ZPR8, vecshiftR8, FalseLanesZero>;
4813 def _ZERO_H : PredTwoOpImmPseudo<NAME # _H, ZPR16, vecshiftR16, FalseLanesZero>;
4814 def _ZERO_S : PredTwoOpImmPseudo<NAME # _S, ZPR32, vecshiftR32, FalseLanesZero>;
4815 def _ZERO_D : PredTwoOpImmPseudo<NAME # _D, ZPR64, vecshiftR64, FalseLanesZero>;
4817 def : SVE_3_Op_Pat_Shift_Imm_SelZero<nxv16i8, op, nxv16i1, nxv16i8, tvecshiftR8, !cast<Pseudo>(NAME # _ZERO_B)>;
4818 def : SVE_3_Op_Pat_Shift_Imm_SelZero<nxv8i16, op, nxv8i1, nxv8i16, tvecshiftR16, !cast<Pseudo>(NAME # _ZERO_H)>;
4819 def : SVE_3_Op_Pat_Shift_Imm_SelZero<nxv4i32, op, nxv4i1, nxv4i32, tvecshiftR32, !cast<Pseudo>(NAME # _ZERO_S)>;
4820 def : SVE_3_Op_Pat_Shift_Imm_SelZero<nxv2i64, op, nxv2i1, nxv2i64, tvecshiftR64, !cast<Pseudo>(NAME # _ZERO_D)>;
4823 class sve_int_bin_pred_shift<bits<2> sz8_64, bit wide, bits<3> opc,
4824 string asm, ZPRRegOp zprty, ZPRRegOp zprty2>
4825 : I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, zprty2:$Zm),
4826 asm, "\t$Zdn, $Pg/m, $_Zdn, $Zm",
4832 let Inst{31-24} = 0b00000100;
4833 let Inst{23-22} = sz8_64;
4834 let Inst{21-20} = 0b01;
4835 let Inst{19} = wide;
4836 let Inst{18-16} = opc;
4837 let Inst{15-13} = 0b100;
4838 let Inst{12-10} = Pg;
4840 let Inst{4-0} = Zdn;
4842 let Constraints = "$Zdn = $_Zdn";
4843 let DestructiveInstType = DestructiveOther;
4844 let ElementSize = zprty.ElementSize;
4847 multiclass sve_int_bin_pred_shift<bits<3> opc, string asm, string Ps,
4848 SDPatternOperator op, string revname, bit isReverseInstr = 0> {
4849 let DestructiveInstType = DestructiveBinaryCommWithRev in {
4850 def _B : sve_int_bin_pred_shift<0b00, 0b0, opc, asm, ZPR8, ZPR8>,
4851 SVEPseudo2Instr<Ps # _B, 1>, SVEInstr2Rev<NAME # _B, revname # _B, isReverseInstr>;
4852 def _H : sve_int_bin_pred_shift<0b01, 0b0, opc, asm, ZPR16, ZPR16>,
4853 SVEPseudo2Instr<Ps # _H, 1>, SVEInstr2Rev<NAME # _H, revname # _H, isReverseInstr>;
4854 def _S : sve_int_bin_pred_shift<0b10, 0b0, opc, asm, ZPR32, ZPR32>,
4855 SVEPseudo2Instr<Ps # _S, 1>, SVEInstr2Rev<NAME # _S, revname # _S, isReverseInstr>;
4856 def _D : sve_int_bin_pred_shift<0b11, 0b0, opc, asm, ZPR64, ZPR64>,
4857 SVEPseudo2Instr<Ps # _D, 1>, SVEInstr2Rev<NAME # _D, revname # _D, isReverseInstr>;
4859 def : SVE_3_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
4860 def : SVE_3_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
4861 def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
4862 def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
4865 multiclass sve_int_bin_pred_zeroing_bhsd<SDPatternOperator op> {
4866 def _ZERO_B : PredTwoOpPseudo<NAME # _B, ZPR8, FalseLanesZero>;
4867 def _ZERO_H : PredTwoOpPseudo<NAME # _H, ZPR16, FalseLanesZero>;
4868 def _ZERO_S : PredTwoOpPseudo<NAME # _S, ZPR32, FalseLanesZero>;
4869 def _ZERO_D : PredTwoOpPseudo<NAME # _D, ZPR64, FalseLanesZero>;
4871 def : SVE_3_Op_Pat_SelZero<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, !cast<Pseudo>(NAME # _ZERO_B)>;
4872 def : SVE_3_Op_Pat_SelZero<nxv8i16, op, nxv8i1, nxv8i16, nxv8i16, !cast<Pseudo>(NAME # _ZERO_H)>;
4873 def : SVE_3_Op_Pat_SelZero<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Pseudo>(NAME # _ZERO_S)>;
4874 def : SVE_3_Op_Pat_SelZero<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Pseudo>(NAME # _ZERO_D)>;
4877 multiclass sve_int_bin_pred_shift_wide<bits<3> opc, string asm,
4878 SDPatternOperator op> {
4879 def _B : sve_int_bin_pred_shift<0b00, 0b1, opc, asm, ZPR8, ZPR64>;
4880 def _H : sve_int_bin_pred_shift<0b01, 0b1, opc, asm, ZPR16, ZPR64>;
4881 def _S : sve_int_bin_pred_shift<0b10, 0b1, opc, asm, ZPR32, ZPR64>;
4883 def : SVE_3_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv2i64, !cast<Instruction>(NAME # _B)>;
4884 def : SVE_3_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, nxv2i64, !cast<Instruction>(NAME # _H)>;
4885 def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv2i64, !cast<Instruction>(NAME # _S)>;
4888 //===----------------------------------------------------------------------===//
4889 // SVE Shift - Unpredicated Group
4890 //===----------------------------------------------------------------------===//
4892 class sve_int_bin_cons_shift_wide<bits<2> sz8_64, bits<2> opc, string asm,
4894 : I<(outs zprty:$Zd), (ins zprty:$Zn, ZPR64:$Zm),
4895 asm, "\t$Zd, $Zn, $Zm",
4901 let Inst{31-24} = 0b00000100;
4902 let Inst{23-22} = sz8_64;
4904 let Inst{20-16} = Zm;
4905 let Inst{15-12} = 0b1000;
4906 let Inst{11-10} = opc;
4911 multiclass sve_int_bin_cons_shift_wide<bits<2> opc, string asm> {
4912 def _B : sve_int_bin_cons_shift_wide<0b00, opc, asm, ZPR8>;
4913 def _H : sve_int_bin_cons_shift_wide<0b01, opc, asm, ZPR16>;
4914 def _S : sve_int_bin_cons_shift_wide<0b10, opc, asm, ZPR32>;
4917 class sve_int_bin_cons_shift_imm<bits<4> tsz8_64, bits<2> opc, string asm,
4918 ZPRRegOp zprty, Operand immtype>
4919 : I<(outs zprty:$Zd), (ins zprty:$Zn, immtype:$imm),
4920 asm, "\t$Zd, $Zn, $imm",
4926 let Inst{31-24} = 0b00000100;
4927 let Inst{23-22} = tsz8_64{3-2};
4929 let Inst{20-19} = tsz8_64{1-0};
4930 let Inst{18-16} = imm{2-0}; // imm3
4931 let Inst{15-12} = 0b1001;
4932 let Inst{11-10} = opc;
4937 multiclass sve_int_bin_cons_shift_imm_left<bits<2> opc, string asm,
4938 SDPatternOperator op> {
4939 def _B : sve_int_bin_cons_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftL8>;
4940 def _H : sve_int_bin_cons_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftL16> {
4941 let Inst{19} = imm{3};
4943 def _S : sve_int_bin_cons_shift_imm<{0,1,?,?}, opc, asm, ZPR32, vecshiftL32> {
4944 let Inst{20-19} = imm{4-3};
4946 def _D : sve_int_bin_cons_shift_imm<{1,?,?,?}, opc, asm, ZPR64, vecshiftL64> {
4947 let Inst{22} = imm{5};
4948 let Inst{20-19} = imm{4-3};
4951 def : SVE_1_Op_Imm_Shift_Pred_Pat<nxv16i8, nxv16i1, op, ZPR8, vecshiftL8, !cast<Instruction>(NAME # _B)>;
4952 def : SVE_1_Op_Imm_Shift_Pred_Pat<nxv8i16, nxv8i1, op, ZPR16, vecshiftL16, !cast<Instruction>(NAME # _H)>;
4953 def : SVE_1_Op_Imm_Shift_Pred_Pat<nxv4i32, nxv4i1, op, ZPR32, vecshiftL32, !cast<Instruction>(NAME # _S)>;
4954 def : SVE_1_Op_Imm_Arith_Pred_Pat<nxv2i64, nxv2i1, op, ZPR64, i64, SVEShiftImm64, !cast<Instruction>(NAME # _D)>;
4957 multiclass sve_int_bin_cons_shift_imm_right<bits<2> opc, string asm,
4958 SDPatternOperator op> {
4959 def _B : sve_int_bin_cons_shift_imm<{0,0,0,1}, opc, asm, ZPR8, vecshiftR8>;
4960 def _H : sve_int_bin_cons_shift_imm<{0,0,1,?}, opc, asm, ZPR16, vecshiftR16> {
4961 let Inst{19} = imm{3};
4963 def _S : sve_int_bin_cons_shift_imm<{0,1,?,?}, opc, asm, ZPR32, vecshiftR32> {
4964 let Inst{20-19} = imm{4-3};
4966 def _D : sve_int_bin_cons_shift_imm<{1,?,?,?}, opc, asm, ZPR64, vecshiftR64> {
4967 let Inst{22} = imm{5};
4968 let Inst{20-19} = imm{4-3};
4971 def : SVE_1_Op_Imm_Shift_Pred_Pat<nxv16i8, nxv16i1, op, ZPR8, vecshiftR8, !cast<Instruction>(NAME # _B)>;
4972 def : SVE_1_Op_Imm_Shift_Pred_Pat<nxv8i16, nxv8i1, op, ZPR16, vecshiftR16, !cast<Instruction>(NAME # _H)>;
4973 def : SVE_1_Op_Imm_Shift_Pred_Pat<nxv4i32, nxv4i1, op, ZPR32, vecshiftR32, !cast<Instruction>(NAME # _S)>;
4974 def : SVE_1_Op_Imm_Arith_Pred_Pat<nxv2i64, nxv2i1, op, ZPR64, i64, SVEShiftImm64, !cast<Instruction>(NAME # _D)>;
4976 //===----------------------------------------------------------------------===//
4977 // SVE Memory - Store Group
4978 //===----------------------------------------------------------------------===//
4980 class sve_mem_cst_si<bits<2> msz, bits<2> esz, string asm,
4981 RegisterOperand VecList>
4982 : I<(outs), (ins VecList:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, simm4s1:$imm4),
4983 asm, "\t$Zt, $Pg, [$Rn, $imm4, mul vl]",
4990 let Inst{31-25} = 0b1110010;
4991 let Inst{24-23} = msz;
4992 let Inst{22-21} = esz;
4994 let Inst{19-16} = imm4;
4995 let Inst{15-13} = 0b111;
4996 let Inst{12-10} = Pg;
5003 multiclass sve_mem_cst_si<bits<2> msz, bits<2> esz, string asm,
5004 RegisterOperand listty, ZPRRegOp zprty>
5006 def NAME : sve_mem_cst_si<msz, esz, asm, listty>;
5008 def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $imm4, mul vl]",
5009 (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, simm4s1:$imm4), 0>;
5010 def : InstAlias<asm # "\t$Zt, $Pg, [$Rn]",
5011 (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 0>;
5012 def : InstAlias<asm # "\t$Zt, $Pg, [$Rn]",
5013 (!cast<Instruction>(NAME) listty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
5016 class sve_mem_est_si<bits<2> sz, bits<2> nregs, RegisterOperand VecList,
5017 string asm, Operand immtype>
5018 : I<(outs), (ins VecList:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, immtype:$imm4),
5019 asm, "\t$Zt, $Pg, [$Rn, $imm4, mul vl]",
5026 let Inst{31-25} = 0b1110010;
5027 let Inst{24-23} = sz;
5028 let Inst{22-21} = nregs;
5030 let Inst{19-16} = imm4;
5031 let Inst{15-13} = 0b111;
5032 let Inst{12-10} = Pg;
5039 multiclass sve_mem_est_si<bits<2> sz, bits<2> nregs, RegisterOperand VecList,
5040 string asm, Operand immtype> {
5041 def NAME : sve_mem_est_si<sz, nregs, VecList, asm, immtype>;
5043 def : InstAlias<asm # "\t$Zt, $Pg, [$Rn]",
5044 (!cast<Instruction>(NAME) VecList:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
5047 class sve_mem_est_ss<bits<2> sz, bits<2> nregs, RegisterOperand VecList,
5048 string asm, RegisterOperand gprty>
5049 : I<(outs), (ins VecList:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
5050 asm, "\t$Zt, $Pg, [$Rn, $Rm]",
5057 let Inst{31-25} = 0b1110010;
5058 let Inst{24-23} = sz;
5059 let Inst{22-21} = nregs;
5060 let Inst{20-16} = Rm;
5061 let Inst{15-13} = 0b011;
5062 let Inst{12-10} = Pg;
5069 class sve_mem_cst_ss_base<bits<4> dtype, string asm,
5070 RegisterOperand listty, RegisterOperand gprty>
5071 : I<(outs), (ins listty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
5072 asm, "\t$Zt, $Pg, [$Rn, $Rm]",
5079 let Inst{31-25} = 0b1110010;
5080 let Inst{24-21} = dtype;
5081 let Inst{20-16} = Rm;
5082 let Inst{15-13} = 0b010;
5083 let Inst{12-10} = Pg;
5090 multiclass sve_mem_cst_ss<bits<4> dtype, string asm,
5091 RegisterOperand listty, ZPRRegOp zprty,
5092 RegisterOperand gprty> {
5093 def NAME : sve_mem_cst_ss_base<dtype, asm, listty, gprty>;
5095 def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Rm]",
5096 (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm), 0>;
5099 class sve_mem_cstnt_si<bits<2> msz, string asm, RegisterOperand VecList>
5100 : I<(outs), (ins VecList:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, simm4s1:$imm4),
5101 asm, "\t$Zt, $Pg, [$Rn, $imm4, mul vl]",
5108 let Inst{31-25} = 0b1110010;
5109 let Inst{24-23} = msz;
5110 let Inst{22-20} = 0b001;
5111 let Inst{19-16} = imm4;
5112 let Inst{15-13} = 0b111;
5113 let Inst{12-10} = Pg;
5120 multiclass sve_mem_cstnt_si<bits<2> msz, string asm, RegisterOperand listty,
5122 def NAME : sve_mem_cstnt_si<msz, asm, listty>;
5124 def : InstAlias<asm # "\t$Zt, $Pg, [$Rn]",
5125 (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 0>;
5126 def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $imm4, mul vl]",
5127 (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, simm4s1:$imm4), 0>;
5128 def : InstAlias<asm # "\t$Zt, $Pg, [$Rn]",
5129 (!cast<Instruction>(NAME) listty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
5132 class sve_mem_cstnt_ss_base<bits<2> msz, string asm, RegisterOperand listty,
5133 RegisterOperand gprty>
5134 : I<(outs), (ins listty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
5135 asm, "\t$Zt, $Pg, [$Rn, $Rm]",
5142 let Inst{31-25} = 0b1110010;
5143 let Inst{24-23} = msz;
5144 let Inst{22-21} = 0b00;
5145 let Inst{20-16} = Rm;
5146 let Inst{15-13} = 0b011;
5147 let Inst{12-10} = Pg;
5154 multiclass sve_mem_cstnt_ss<bits<2> msz, string asm, RegisterOperand listty,
5155 ZPRRegOp zprty, RegisterOperand gprty> {
5156 def NAME : sve_mem_cstnt_ss_base<msz, asm, listty, gprty>;
5158 def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Rm]",
5159 (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm), 0>;
5162 class sve2_mem_sstnt_vs_base<bits<3> opc, string asm,
5163 RegisterOperand listty, ZPRRegOp zprty>
5164 : I<(outs), (ins listty:$Zt, PPR3bAny:$Pg, zprty:$Zn, GPR64:$Rm),
5165 asm, "\t$Zt, $Pg, [$Zn, $Rm]",
5172 let Inst{31-25} = 0b1110010;
5173 let Inst{24-22} = opc;
5175 let Inst{20-16} = Rm;
5176 let Inst{15-13} = 0b001;
5177 let Inst{12-10} = Pg;
5184 multiclass sve2_mem_sstnt_vs_32_ptrs<bits<3> opc, string asm,
5185 SDPatternOperator op,
5187 def _REAL : sve2_mem_sstnt_vs_base<opc, asm, Z_s, ZPR32>;
5189 def : InstAlias<asm # "\t$Zt, $Pg, [$Zn, $Rm]",
5190 (!cast<Instruction>(NAME # _REAL) ZPR32:$Zt, PPR3bAny:$Pg, ZPR32:$Zn, GPR64:$Rm), 0>;
5191 def : InstAlias<asm # "\t$Zt, $Pg, [$Zn]",
5192 (!cast<Instruction>(NAME # _REAL) ZPR32:$Zt, PPR3bAny:$Pg, ZPR32:$Zn, XZR), 0>;
5193 def : InstAlias<asm # "\t$Zt, $Pg, [$Zn]",
5194 (!cast<Instruction>(NAME # _REAL) Z_s:$Zt, PPR3bAny:$Pg, ZPR32:$Zn, XZR), 1>;
5196 def : Pat <(op (nxv4i32 ZPR32:$Zt), (nxv4i1 PPR3bAny:$Pg), (nxv4i32 ZPR32:$Zn), (i64 GPR64:$Rm), vt),
5197 (!cast<Instruction>(NAME # _REAL) ZPR32:$Zt, PPR3bAny:$Pg, ZPR32:$Zn, GPR64:$Rm)>;
5200 multiclass sve2_mem_sstnt_vs_64_ptrs<bits<3> opc, string asm,
5201 SDPatternOperator op,
5203 def _REAL : sve2_mem_sstnt_vs_base<opc, asm, Z_d, ZPR64>;
5205 def : InstAlias<asm # "\t$Zt, $Pg, [$Zn, $Rm]",
5206 (!cast<Instruction>(NAME # _REAL) ZPR64:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, GPR64:$Rm), 0>;
5207 def : InstAlias<asm # "\t$Zt, $Pg, [$Zn]",
5208 (!cast<Instruction>(NAME # _REAL) ZPR64:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, XZR), 0>;
5209 def : InstAlias<asm # "\t$Zt, $Pg, [$Zn]",
5210 (!cast<Instruction>(NAME # _REAL) Z_d:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, XZR), 1>;
5212 def : Pat <(op (nxv2i64 ZPR64:$Zt), (nxv2i1 PPR3bAny:$Pg), (nxv2i64 ZPR64:$Zn), (i64 GPR64:$Rm), vt),
5213 (!cast<Instruction>(NAME # _REAL) ZPR64:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, GPR64:$Rm)>;
5216 class sve_mem_sst_sv<bits<3> opc, bit xs, bit scaled, string asm,
5217 RegisterOperand VecList, RegisterOperand zprext>
5218 : I<(outs), (ins VecList:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, zprext:$Zm),
5219 asm, "\t$Zt, $Pg, [$Rn, $Zm]",
5226 let Inst{31-25} = 0b1110010;
5227 let Inst{24-22} = opc;
5228 let Inst{21} = scaled;
5229 let Inst{20-16} = Zm;
5233 let Inst{12-10} = Pg;
5240 multiclass sve_mem_32b_sst_sv_32_scaled<bits<3> opc, string asm,
5241 SDPatternOperator sxtw_op,
5242 SDPatternOperator uxtw_op,
5243 RegisterOperand sxtw_opnd,
5244 RegisterOperand uxtw_opnd,
5246 def _UXTW_SCALED : sve_mem_sst_sv<opc, 0, 1, asm, Z_s, uxtw_opnd>;
5247 def _SXTW_SCALED : sve_mem_sst_sv<opc, 1, 1, asm, Z_s, sxtw_opnd>;
5249 def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Zm]",
5250 (!cast<Instruction>(NAME # _UXTW_SCALED) ZPR32:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm), 0>;
5251 def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Zm]",
5252 (!cast<Instruction>(NAME # _SXTW_SCALED) ZPR32:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm), 0>;
5254 def : Pat<(uxtw_op (nxv4i32 ZPR:$data), (nxv4i1 PPR:$gp), GPR64sp:$base, (nxv4i32 ZPR:$offsets), vt),
5255 (!cast<Instruction>(NAME # _UXTW_SCALED) ZPR:$data, PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
5256 def : Pat<(sxtw_op (nxv4i32 ZPR:$data), (nxv4i1 PPR:$gp), GPR64sp:$base, (nxv4i32 ZPR:$offsets), vt),
5257 (!cast<Instruction>(NAME # _SXTW_SCALED) ZPR:$data, PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
5260 multiclass sve_mem_64b_sst_sv_32_scaled<bits<3> opc, string asm,
5261 SDPatternOperator sxtw_op,
5262 SDPatternOperator uxtw_op,
5263 RegisterOperand sxtw_opnd,
5264 RegisterOperand uxtw_opnd,
5266 def _UXTW_SCALED : sve_mem_sst_sv<opc, 0, 1, asm, Z_d, uxtw_opnd>;
5267 def _SXTW_SCALED : sve_mem_sst_sv<opc, 1, 1, asm, Z_d, sxtw_opnd>;
5269 def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Zm]",
5270 (!cast<Instruction>(NAME # _UXTW_SCALED) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm), 0>;
5271 def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Zm]",
5272 (!cast<Instruction>(NAME # _SXTW_SCALED) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm), 0>;
5274 def : Pat<(uxtw_op (nxv2i64 ZPR:$data), (nxv2i1 PPR:$gp), GPR64sp:$base, (nxv2i64 ZPR:$offsets), vt),
5275 (!cast<Instruction>(NAME # _UXTW_SCALED) ZPR:$data, PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
5276 def : Pat<(sxtw_op (nxv2i64 ZPR:$data), (nxv2i1 PPR:$gp), GPR64sp:$base, (nxv2i64 ZPR:$offsets), vt),
5277 (!cast<Instruction>(NAME # _SXTW_SCALED) ZPR:$data, PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
5280 multiclass sve_mem_64b_sst_sv_32_unscaled<bits<3> opc, string asm,
5281 SDPatternOperator sxtw_op,
5282 SDPatternOperator uxtw_op,
5283 RegisterOperand sxtw_opnd,
5284 RegisterOperand uxtw_opnd,
5286 def _UXTW : sve_mem_sst_sv<opc, 0, 0, asm, Z_d, uxtw_opnd>;
5287 def _SXTW : sve_mem_sst_sv<opc, 1, 0, asm, Z_d, sxtw_opnd>;
5289 def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Zm]",
5290 (!cast<Instruction>(NAME # _UXTW) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm), 0>;
5291 def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Zm]",
5292 (!cast<Instruction>(NAME # _SXTW) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm), 0>;
5294 def : Pat<(uxtw_op (nxv2i64 ZPR:$data), (nxv2i1 PPR:$gp), GPR64sp:$base, (nxv2i64 ZPR:$offsets), vt),
5295 (!cast<Instruction>(NAME # _UXTW) ZPR:$data, PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
5296 def : Pat<(sxtw_op (nxv2i64 ZPR:$data), (nxv2i1 PPR:$gp), GPR64sp:$base, (nxv2i64 ZPR:$offsets), vt),
5297 (!cast<Instruction>(NAME # _SXTW) ZPR:$data, PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
5300 multiclass sve_mem_32b_sst_sv_32_unscaled<bits<3> opc, string asm,
5301 SDPatternOperator sxtw_op,
5302 SDPatternOperator uxtw_op,
5303 RegisterOperand sxtw_opnd,
5304 RegisterOperand uxtw_opnd,
5306 def _UXTW : sve_mem_sst_sv<opc, 0, 0, asm, Z_s, uxtw_opnd>;
5307 def _SXTW : sve_mem_sst_sv<opc, 1, 0, asm, Z_s, sxtw_opnd>;
5309 def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Zm]",
5310 (!cast<Instruction>(NAME # _UXTW) ZPR32:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm), 0>;
5311 def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Zm]",
5312 (!cast<Instruction>(NAME # _SXTW) ZPR32:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm), 0>;
5314 def : Pat<(uxtw_op (nxv4i32 ZPR:$data), (nxv4i1 PPR:$gp), GPR64sp:$base, (nxv4i32 ZPR:$offsets), vt),
5315 (!cast<Instruction>(NAME # _UXTW) ZPR:$data, PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
5316 def : Pat<(sxtw_op (nxv4i32 ZPR:$data), (nxv4i1 PPR:$gp), GPR64sp:$base, (nxv4i32 ZPR:$offsets), vt),
5317 (!cast<Instruction>(NAME # _SXTW) ZPR:$data, PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
5320 class sve_mem_sst_sv2<bits<2> msz, bit scaled, string asm,
5321 RegisterOperand zprext>
5322 : I<(outs), (ins Z_d:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, zprext:$Zm),
5323 asm, "\t$Zt, $Pg, [$Rn, $Zm]",
5330 let Inst{31-25} = 0b1110010;
5331 let Inst{24-23} = msz;
5333 let Inst{21} = scaled;
5334 let Inst{20-16} = Zm;
5335 let Inst{15-13} = 0b101;
5336 let Inst{12-10} = Pg;
5343 multiclass sve_mem_sst_sv_64_scaled<bits<2> msz, string asm,
5344 SDPatternOperator op,
5345 RegisterOperand zprext,
5347 def _SCALED_REAL : sve_mem_sst_sv2<msz, 1, asm, zprext>;
5349 def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Zm]",
5350 (!cast<Instruction>(NAME # _SCALED_REAL) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, zprext:$Zm), 0>;
5352 def : Pat<(op (nxv2i64 ZPR:$data), (nxv2i1 PPR:$gp), GPR64sp:$base, (nxv2i64 ZPR:$indices), vt),
5353 (!cast<Instruction>(NAME # _SCALED_REAL) ZPR:$data, PPR:$gp, GPR64sp:$base, ZPR:$indices)>;
5356 multiclass sve_mem_sst_sv_64_unscaled<bits<2> msz, string asm,
5357 SDPatternOperator op,
5359 def _REAL : sve_mem_sst_sv2<msz, 0, asm, ZPR64ExtLSL8>;
5361 def : InstAlias<asm # "\t$Zt, $Pg, [$Rn, $Zm]",
5362 (!cast<Instruction>(NAME # _REAL) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, ZPR64ExtLSL8:$Zm), 0>;
5364 def : Pat<(op (nxv2i64 ZPR:$data), (nxv2i1 PPR:$gp), GPR64sp:$base, (nxv2i64 ZPR:$offsets), vt),
5365 (!cast<Instruction>(NAME # _REAL) ZPR:$data, PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
5368 class sve_mem_sst_vi<bits<3> opc, string asm, ZPRRegOp zprty,
5369 RegisterOperand VecList, Operand imm_ty>
5370 : I<(outs), (ins VecList:$Zt, PPR3bAny:$Pg, zprty:$Zn, imm_ty:$imm5),
5371 asm, "\t$Zt, $Pg, [$Zn, $imm5]",
5378 let Inst{31-25} = 0b1110010;
5379 let Inst{24-23} = opc{2-1};
5381 let Inst{21} = opc{0};
5382 let Inst{20-16} = imm5;
5383 let Inst{15-13} = 0b101;
5384 let Inst{12-10} = Pg;
5391 multiclass sve_mem_32b_sst_vi_ptrs<bits<3> opc, string asm,
5393 SDPatternOperator op,
5395 def _IMM : sve_mem_sst_vi<opc, asm, ZPR32, Z_s, imm_ty>;
5397 def : InstAlias<asm # "\t$Zt, $Pg, [$Zn]",
5398 (!cast<Instruction>(NAME # _IMM) ZPR32:$Zt, PPR3bAny:$Pg, ZPR32:$Zn, 0), 0>;
5399 def : InstAlias<asm # "\t$Zt, $Pg, [$Zn, $imm5]",
5400 (!cast<Instruction>(NAME # _IMM) ZPR32:$Zt, PPR3bAny:$Pg, ZPR32:$Zn, imm_ty:$imm5), 0>;
5401 def : InstAlias<asm # "\t$Zt, $Pg, [$Zn]",
5402 (!cast<Instruction>(NAME # _IMM) Z_s:$Zt, PPR3bAny:$Pg, ZPR32:$Zn, 0), 1>;
5404 def : Pat<(op (nxv4i32 ZPR:$data), (nxv4i1 PPR:$gp), (nxv4i32 ZPR:$ptrs), imm_ty:$index, vt),
5405 (!cast<Instruction>(NAME # _IMM) ZPR:$data, PPR:$gp, ZPR:$ptrs, imm_ty:$index)>;
5408 multiclass sve_mem_64b_sst_vi_ptrs<bits<3> opc, string asm,
5410 SDPatternOperator op,
5412 def _IMM : sve_mem_sst_vi<opc, asm, ZPR64, Z_d, imm_ty>;
5414 def : InstAlias<asm # "\t$Zt, $Pg, [$Zn]",
5415 (!cast<Instruction>(NAME # _IMM) ZPR64:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, 0), 0>;
5416 def : InstAlias<asm # "\t$Zt, $Pg, [$Zn, $imm5]",
5417 (!cast<Instruction>(NAME # _IMM) ZPR64:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, imm_ty:$imm5), 0>;
5418 def : InstAlias<asm # "\t$Zt, $Pg, [$Zn]",
5419 (!cast<Instruction>(NAME # _IMM) Z_s:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, 0), 1>;
5421 def : Pat<(op (nxv2i64 ZPR:$data), (nxv2i1 PPR:$gp), (nxv2i64 ZPR:$ptrs), imm_ty:$index, vt),
5422 (!cast<Instruction>(NAME # _IMM) ZPR:$data, PPR:$gp, ZPR:$ptrs, imm_ty:$index)>;
5425 class sve_mem_z_spill<string asm>
5426 : I<(outs), (ins ZPRAny:$Zt, GPR64sp:$Rn, simm9:$imm9),
5427 asm, "\t$Zt, [$Rn, $imm9, mul vl]",
5433 let Inst{31-22} = 0b1110010110;
5434 let Inst{21-16} = imm9{8-3};
5435 let Inst{15-13} = 0b010;
5436 let Inst{12-10} = imm9{2-0};
5443 multiclass sve_mem_z_spill<string asm> {
5444 def NAME : sve_mem_z_spill<asm>;
5446 def : InstAlias<asm # "\t$Zt, [$Rn]",
5447 (!cast<Instruction>(NAME) ZPRAny:$Zt, GPR64sp:$Rn, 0), 1>;
5450 class sve_mem_p_spill<string asm>
5451 : I<(outs), (ins PPRAny:$Pt, GPR64sp:$Rn, simm9:$imm9),
5452 asm, "\t$Pt, [$Rn, $imm9, mul vl]",
5458 let Inst{31-22} = 0b1110010110;
5459 let Inst{21-16} = imm9{8-3};
5460 let Inst{15-13} = 0b000;
5461 let Inst{12-10} = imm9{2-0};
5469 multiclass sve_mem_p_spill<string asm> {
5470 def NAME : sve_mem_p_spill<asm>;
5472 def : InstAlias<asm # "\t$Pt, [$Rn]",
5473 (!cast<Instruction>(NAME) PPRAny:$Pt, GPR64sp:$Rn, 0), 1>;
5476 //===----------------------------------------------------------------------===//
5477 // SVE Permute - Predicates Group
5478 //===----------------------------------------------------------------------===//
5480 class sve_int_perm_bin_perm_pp<bits<3> opc, bits<2> sz8_64, string asm,
5482 : I<(outs pprty:$Pd), (ins pprty:$Pn, pprty:$Pm),
5483 asm, "\t$Pd, $Pn, $Pm",
5489 let Inst{31-24} = 0b00000101;
5490 let Inst{23-22} = sz8_64;
5491 let Inst{21-20} = 0b10;
5492 let Inst{19-16} = Pm;
5493 let Inst{15-13} = 0b010;
5494 let Inst{12-10} = opc;
5501 multiclass sve_int_perm_bin_perm_pp<bits<3> opc, string asm,
5502 SDPatternOperator op> {
5503 def _B : sve_int_perm_bin_perm_pp<opc, 0b00, asm, PPR8>;
5504 def _H : sve_int_perm_bin_perm_pp<opc, 0b01, asm, PPR16>;
5505 def _S : sve_int_perm_bin_perm_pp<opc, 0b10, asm, PPR32>;
5506 def _D : sve_int_perm_bin_perm_pp<opc, 0b11, asm, PPR64>;
5508 def : SVE_2_Op_Pat<nxv16i1, op, nxv16i1, nxv16i1, !cast<Instruction>(NAME # _B)>;
5509 def : SVE_2_Op_Pat<nxv8i1, op, nxv8i1, nxv8i1, !cast<Instruction>(NAME # _H)>;
5510 def : SVE_2_Op_Pat<nxv4i1, op, nxv4i1, nxv4i1, !cast<Instruction>(NAME # _S)>;
5511 def : SVE_2_Op_Pat<nxv2i1, op, nxv2i1, nxv2i1, !cast<Instruction>(NAME # _D)>;
5514 class sve_int_perm_punpk<bit opc, string asm>
5515 : I<(outs PPR16:$Pd), (ins PPR8:$Pn),
5521 let Inst{31-17} = 0b000001010011000;
5523 let Inst{15-9} = 0b0100000;
5529 multiclass sve_int_perm_punpk<bit opc, string asm, SDPatternOperator op> {
5530 def NAME : sve_int_perm_punpk<opc, asm>;
5532 def : SVE_1_Op_Pat<nxv8i1, op, nxv16i1, !cast<Instruction>(NAME)>;
5533 def : SVE_1_Op_Pat<nxv4i1, op, nxv8i1, !cast<Instruction>(NAME)>;
5534 def : SVE_1_Op_Pat<nxv2i1, op, nxv4i1, !cast<Instruction>(NAME)>;
5537 class sve_int_rdffr_pred<bit s, string asm>
5538 : I<(outs PPR8:$Pd), (ins PPRAny:$Pg),
5539 asm, "\t$Pd, $Pg/z",
5544 let Inst{31-23} = 0b001001010;
5546 let Inst{21-9} = 0b0110001111000;
5551 let Defs = !if(!eq (s, 1), [NZCV], []);
5555 multiclass sve_int_rdffr_pred<bit s, string asm, SDPatternOperator op> {
5556 def _REAL : sve_int_rdffr_pred<s, asm>;
5558 // We need a layer of indirection because early machine code passes balk at
5559 // physical register (i.e. FFR) uses that have no previous definition.
5560 let hasSideEffects = 1, hasNoSchedulingInfo = 1 in {
5561 def "" : Pseudo<(outs PPR8:$Pd), (ins PPRAny:$Pg), [(set (nxv16i1 PPR8:$Pd), (op (nxv16i1 PPRAny:$Pg)))]>,
5562 PseudoInstExpansion<(!cast<Instruction>(NAME # _REAL) PPR8:$Pd, PPRAny:$Pg)>;
5566 class sve_int_rdffr_unpred<string asm> : I<
5567 (outs PPR8:$Pd), (ins),
5572 let Inst{31-4} = 0b0010010100011001111100000000;
5578 multiclass sve_int_rdffr_unpred<string asm, SDPatternOperator op> {
5579 def _REAL : sve_int_rdffr_unpred<asm>;
5581 // We need a layer of indirection because early machine code passes balk at
5582 // physical register (i.e. FFR) uses that have no previous definition.
5583 let hasSideEffects = 1, hasNoSchedulingInfo = 1 in {
5584 def "" : Pseudo<(outs PPR8:$Pd), (ins), [(set (nxv16i1 PPR8:$Pd), (op))]>,
5585 PseudoInstExpansion<(!cast<Instruction>(NAME # _REAL) PPR8:$Pd)>;
5589 class sve_int_wrffr<string asm, SDPatternOperator op>
5590 : I<(outs), (ins PPR8:$Pn),
5593 [(op (nxv16i1 PPR8:$Pn))]>, Sched<[]> {
5595 let Inst{31-9} = 0b00100101001010001001000;
5597 let Inst{4-0} = 0b00000;
5599 let hasSideEffects = 1;
5603 class sve_int_setffr<string asm, SDPatternOperator op>
5607 [(op)]>, Sched<[]> {
5608 let Inst{31-0} = 0b00100101001011001001000000000000;
5610 let hasSideEffects = 1;
5614 //===----------------------------------------------------------------------===//
5615 // SVE Permute Vector - Predicated Group
5616 //===----------------------------------------------------------------------===//
5618 class sve_int_perm_clast_rz<bits<2> sz8_64, bit ab, string asm,
5619 ZPRRegOp zprty, RegisterClass rt>
5620 : I<(outs rt:$Rdn), (ins PPR3bAny:$Pg, rt:$_Rdn, zprty:$Zm),
5621 asm, "\t$Rdn, $Pg, $_Rdn, $Zm",
5627 let Inst{31-24} = 0b00000101;
5628 let Inst{23-22} = sz8_64;
5629 let Inst{21-17} = 0b11000;
5631 let Inst{15-13} = 0b101;
5632 let Inst{12-10} = Pg;
5634 let Inst{4-0} = Rdn;
5636 let Constraints = "$Rdn = $_Rdn";
5639 multiclass sve_int_perm_clast_rz<bit ab, string asm, SDPatternOperator op> {
5640 def _B : sve_int_perm_clast_rz<0b00, ab, asm, ZPR8, GPR32>;
5641 def _H : sve_int_perm_clast_rz<0b01, ab, asm, ZPR16, GPR32>;
5642 def _S : sve_int_perm_clast_rz<0b10, ab, asm, ZPR32, GPR32>;
5643 def _D : sve_int_perm_clast_rz<0b11, ab, asm, ZPR64, GPR64>;
5645 def : SVE_3_Op_Pat<i32, op, nxv16i1, i32, nxv16i8, !cast<Instruction>(NAME # _B)>;
5646 def : SVE_3_Op_Pat<i32, op, nxv8i1, i32, nxv8i16, !cast<Instruction>(NAME # _H)>;
5647 def : SVE_3_Op_Pat<i32, op, nxv4i1, i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
5648 def : SVE_3_Op_Pat<i64, op, nxv2i1, i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
5651 class sve_int_perm_clast_vz<bits<2> sz8_64, bit ab, string asm,
5652 ZPRRegOp zprty, RegisterClass rt>
5653 : I<(outs rt:$Vdn), (ins PPR3bAny:$Pg, rt:$_Vdn, zprty:$Zm),
5654 asm, "\t$Vdn, $Pg, $_Vdn, $Zm",
5660 let Inst{31-24} = 0b00000101;
5661 let Inst{23-22} = sz8_64;
5662 let Inst{21-17} = 0b10101;
5664 let Inst{15-13} = 0b100;
5665 let Inst{12-10} = Pg;
5667 let Inst{4-0} = Vdn;
5669 let Constraints = "$Vdn = $_Vdn";
5672 multiclass sve_int_perm_clast_vz<bit ab, string asm, SDPatternOperator op> {
5673 def _B : sve_int_perm_clast_vz<0b00, ab, asm, ZPR8, FPR8>;
5674 def _H : sve_int_perm_clast_vz<0b01, ab, asm, ZPR16, FPR16>;
5675 def _S : sve_int_perm_clast_vz<0b10, ab, asm, ZPR32, FPR32>;
5676 def _D : sve_int_perm_clast_vz<0b11, ab, asm, ZPR64, FPR64>;
5678 def : SVE_3_Op_Pat<f16, op, nxv8i1, f16, nxv8f16, !cast<Instruction>(NAME # _H)>;
5679 def : SVE_3_Op_Pat<f32, op, nxv4i1, f32, nxv4f32, !cast<Instruction>(NAME # _S)>;
5680 def : SVE_3_Op_Pat<f64, op, nxv2i1, f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
5683 class sve_int_perm_clast_zz<bits<2> sz8_64, bit ab, string asm,
5685 : I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, zprty:$Zm),
5686 asm, "\t$Zdn, $Pg, $_Zdn, $Zm",
5692 let Inst{31-24} = 0b00000101;
5693 let Inst{23-22} = sz8_64;
5694 let Inst{21-17} = 0b10100;
5696 let Inst{15-13} = 0b100;
5697 let Inst{12-10} = Pg;
5699 let Inst{4-0} = Zdn;
5701 let Constraints = "$Zdn = $_Zdn";
5702 let DestructiveInstType = DestructiveOther;
5703 let ElementSize = ElementSizeNone;
5706 multiclass sve_int_perm_clast_zz<bit ab, string asm, SDPatternOperator op> {
5707 def _B : sve_int_perm_clast_zz<0b00, ab, asm, ZPR8>;
5708 def _H : sve_int_perm_clast_zz<0b01, ab, asm, ZPR16>;
5709 def _S : sve_int_perm_clast_zz<0b10, ab, asm, ZPR32>;
5710 def _D : sve_int_perm_clast_zz<0b11, ab, asm, ZPR64>;
5712 def : SVE_3_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
5713 def : SVE_3_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
5714 def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
5715 def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
5717 def : SVE_3_Op_Pat<nxv8f16, op, nxv8i1, nxv8f16, nxv8f16, !cast<Instruction>(NAME # _H)>;
5718 def : SVE_3_Op_Pat<nxv4f32, op, nxv4i1, nxv4f32, nxv4f32, !cast<Instruction>(NAME # _S)>;
5719 def : SVE_3_Op_Pat<nxv2f64, op, nxv2i1, nxv2f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
5722 class sve_int_perm_last_r<bits<2> sz8_64, bit ab, string asm,
5723 ZPRRegOp zprty, RegisterClass resultRegType>
5724 : I<(outs resultRegType:$Rd), (ins PPR3bAny:$Pg, zprty:$Zn),
5725 asm, "\t$Rd, $Pg, $Zn",
5731 let Inst{31-24} = 0b00000101;
5732 let Inst{23-22} = sz8_64;
5733 let Inst{21-17} = 0b10000;
5735 let Inst{15-13} = 0b101;
5736 let Inst{12-10} = Pg;
5741 multiclass sve_int_perm_last_r<bit ab, string asm, SDPatternOperator op> {
5742 def _B : sve_int_perm_last_r<0b00, ab, asm, ZPR8, GPR32>;
5743 def _H : sve_int_perm_last_r<0b01, ab, asm, ZPR16, GPR32>;
5744 def _S : sve_int_perm_last_r<0b10, ab, asm, ZPR32, GPR32>;
5745 def _D : sve_int_perm_last_r<0b11, ab, asm, ZPR64, GPR64>;
5747 def : SVE_2_Op_Pat<i32, op, nxv16i1, nxv16i8, !cast<Instruction>(NAME # _B)>;
5748 def : SVE_2_Op_Pat<i32, op, nxv8i1, nxv8i16, !cast<Instruction>(NAME # _H)>;
5749 def : SVE_2_Op_Pat<i32, op, nxv4i1, nxv4i32, !cast<Instruction>(NAME # _S)>;
5750 def : SVE_2_Op_Pat<i64, op, nxv2i1, nxv2i64, !cast<Instruction>(NAME # _D)>;
5753 class sve_int_perm_last_v<bits<2> sz8_64, bit ab, string asm,
5754 ZPRRegOp zprty, RegisterClass dstRegtype>
5755 : I<(outs dstRegtype:$Vd), (ins PPR3bAny:$Pg, zprty:$Zn),
5756 asm, "\t$Vd, $Pg, $Zn",
5762 let Inst{31-24} = 0b00000101;
5763 let Inst{23-22} = sz8_64;
5764 let Inst{21-17} = 0b10001;
5766 let Inst{15-13} = 0b100;
5767 let Inst{12-10} = Pg;
5772 multiclass sve_int_perm_last_v<bit ab, string asm, SDPatternOperator op> {
5773 def _B : sve_int_perm_last_v<0b00, ab, asm, ZPR8, FPR8>;
5774 def _H : sve_int_perm_last_v<0b01, ab, asm, ZPR16, FPR16>;
5775 def _S : sve_int_perm_last_v<0b10, ab, asm, ZPR32, FPR32>;
5776 def _D : sve_int_perm_last_v<0b11, ab, asm, ZPR64, FPR64>;
5778 def : SVE_2_Op_Pat<f16, op, nxv8i1, nxv8f16, !cast<Instruction>(NAME # _H)>;
5779 def : SVE_2_Op_Pat<f32, op, nxv4i1, nxv4f32, !cast<Instruction>(NAME # _S)>;
5780 def : SVE_2_Op_Pat<f32, op, nxv2i1, nxv2f32, !cast<Instruction>(NAME # _S)>;
5781 def : SVE_2_Op_Pat<f64, op, nxv2i1, nxv2f64, !cast<Instruction>(NAME # _D)>;
5784 class sve_int_perm_splice<bits<2> sz8_64, string asm, ZPRRegOp zprty>
5785 : I<(outs zprty:$Zdn), (ins PPR3bAny:$Pg, zprty:$_Zdn, zprty:$Zm),
5786 asm, "\t$Zdn, $Pg, $_Zdn, $Zm",
5792 let Inst{31-24} = 0b00000101;
5793 let Inst{23-22} = sz8_64;
5794 let Inst{21-13} = 0b101100100;
5795 let Inst{12-10} = Pg;
5797 let Inst{4-0} = Zdn;
5799 let Constraints = "$Zdn = $_Zdn";
5800 let DestructiveInstType = DestructiveOther;
5801 let ElementSize = ElementSizeNone;
5804 multiclass sve_int_perm_splice<string asm, SDPatternOperator op> {
5805 def _B : sve_int_perm_splice<0b00, asm, ZPR8>;
5806 def _H : sve_int_perm_splice<0b01, asm, ZPR16>;
5807 def _S : sve_int_perm_splice<0b10, asm, ZPR32>;
5808 def _D : sve_int_perm_splice<0b11, asm, ZPR64>;
5810 def : SVE_3_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
5811 def : SVE_3_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
5812 def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
5813 def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
5815 def : SVE_3_Op_Pat<nxv8f16, op, nxv8i1, nxv8f16, nxv8f16, !cast<Instruction>(NAME # _H)>;
5816 def : SVE_3_Op_Pat<nxv4f32, op, nxv4i1, nxv4f32, nxv4f32, !cast<Instruction>(NAME # _S)>;
5817 def : SVE_3_Op_Pat<nxv2f64, op, nxv2i1, nxv2f64, nxv2f64, !cast<Instruction>(NAME # _D)>;
5820 class sve2_int_perm_splice_cons<bits<2> sz8_64, string asm,
5821 ZPRRegOp zprty, RegisterOperand VecList>
5822 : I<(outs zprty:$Zd), (ins PPR3bAny:$Pg, VecList:$Zn),
5823 asm, "\t$Zd, $Pg, $Zn",
5829 let Inst{31-24} = 0b00000101;
5830 let Inst{23-22} = sz8_64;
5831 let Inst{21-13} = 0b101101100;
5832 let Inst{12-10} = Pg;
5837 multiclass sve2_int_perm_splice_cons<string asm> {
5838 def _B : sve2_int_perm_splice_cons<0b00, asm, ZPR8, ZZ_b>;
5839 def _H : sve2_int_perm_splice_cons<0b01, asm, ZPR16, ZZ_h>;
5840 def _S : sve2_int_perm_splice_cons<0b10, asm, ZPR32, ZZ_s>;
5841 def _D : sve2_int_perm_splice_cons<0b11, asm, ZPR64, ZZ_d>;
5844 class sve_int_perm_rev<bits<2> sz8_64, bits<2> opc, string asm,
5846 : I<(outs zprty:$Zd), (ins zprty:$_Zd, PPR3bAny:$Pg, zprty:$Zn),
5847 asm, "\t$Zd, $Pg/m, $Zn",
5853 let Inst{31-24} = 0b00000101;
5854 let Inst{23-22} = sz8_64;
5855 let Inst{21-18} = 0b1001;
5856 let Inst{17-16} = opc;
5857 let Inst{15-13} = 0b100;
5858 let Inst{12-10} = Pg;
5862 let Constraints = "$Zd = $_Zd";
5863 let DestructiveInstType = DestructiveOther;
5864 let ElementSize = zprty.ElementSize;
5867 multiclass sve_int_perm_rev_rbit<string asm, SDPatternOperator op> {
5868 def _B : sve_int_perm_rev<0b00, 0b11, asm, ZPR8>;
5869 def _H : sve_int_perm_rev<0b01, 0b11, asm, ZPR16>;
5870 def _S : sve_int_perm_rev<0b10, 0b11, asm, ZPR32>;
5871 def _D : sve_int_perm_rev<0b11, 0b11, asm, ZPR64>;
5873 def : SVE_3_Op_Pat<nxv16i8, op, nxv16i8, nxv16i1, nxv16i8, !cast<Instruction>(NAME # _B)>;
5874 def : SVE_3_Op_Pat<nxv8i16, op, nxv8i16, nxv8i1, nxv8i16, !cast<Instruction>(NAME # _H)>;
5875 def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv4i1, nxv4i32, !cast<Instruction>(NAME # _S)>;
5876 def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv2i1, nxv2i64, !cast<Instruction>(NAME # _D)>;
5879 multiclass sve_int_perm_rev_revb<string asm,
5880 SDPatternOperator int_op,
5881 SDPatternOperator ir_op> {
5882 def _H : sve_int_perm_rev<0b01, 0b00, asm, ZPR16>;
5883 def _S : sve_int_perm_rev<0b10, 0b00, asm, ZPR32>;
5884 def _D : sve_int_perm_rev<0b11, 0b00, asm, ZPR64>;
5886 def : SVE_3_Op_Pat<nxv8i16, int_op, nxv8i16, nxv8i1, nxv8i16, !cast<Instruction>(NAME # _H)>;
5887 def : SVE_3_Op_Pat<nxv4i32, int_op, nxv4i32, nxv4i1, nxv4i32, !cast<Instruction>(NAME # _S)>;
5888 def : SVE_3_Op_Pat<nxv2i64, int_op, nxv2i64, nxv2i1, nxv2i64, !cast<Instruction>(NAME # _D)>;
5890 def : SVE_1_Op_AllActive_Pat<nxv8i16, ir_op, nxv8i16, !cast<Instruction>(NAME # _H), PTRUE_H>;
5891 def : SVE_1_Op_AllActive_Pat<nxv4i32, ir_op, nxv4i32, !cast<Instruction>(NAME # _S), PTRUE_S>;
5892 def : SVE_1_Op_AllActive_Pat<nxv2i64, ir_op, nxv2i64, !cast<Instruction>(NAME # _D), PTRUE_D>;
5895 multiclass sve_int_perm_rev_revh<string asm, SDPatternOperator op> {
5896 def _S : sve_int_perm_rev<0b10, 0b01, asm, ZPR32>;
5897 def _D : sve_int_perm_rev<0b11, 0b01, asm, ZPR64>;
5899 def : SVE_3_Op_Pat<nxv4i32, op, nxv4i32, nxv4i1, nxv4i32, !cast<Instruction>(NAME # _S)>;
5900 def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv2i1, nxv2i64, !cast<Instruction>(NAME # _D)>;
5903 multiclass sve_int_perm_rev_revw<string asm, SDPatternOperator op> {
5904 def _D : sve_int_perm_rev<0b11, 0b10, asm, ZPR64>;
5906 def : SVE_3_Op_Pat<nxv2i64, op, nxv2i64, nxv2i1, nxv2i64, !cast<Instruction>(NAME # _D)>;
5909 class sve_int_perm_cpy_r<bits<2> sz8_64, string asm, ZPRRegOp zprty,
5910 RegisterClass srcRegType>
5911 : I<(outs zprty:$Zd), (ins zprty:$_Zd, PPR3bAny:$Pg, srcRegType:$Rn),
5912 asm, "\t$Zd, $Pg/m, $Rn",
5918 let Inst{31-24} = 0b00000101;
5919 let Inst{23-22} = sz8_64;
5920 let Inst{21-13} = 0b101000101;
5921 let Inst{12-10} = Pg;
5925 let Constraints = "$Zd = $_Zd";
5926 let DestructiveInstType = DestructiveOther;
5927 let ElementSize = zprty.ElementSize;
5930 multiclass sve_int_perm_cpy_r<string asm, SDPatternOperator op> {
5931 def _B : sve_int_perm_cpy_r<0b00, asm, ZPR8, GPR32sp>;
5932 def _H : sve_int_perm_cpy_r<0b01, asm, ZPR16, GPR32sp>;
5933 def _S : sve_int_perm_cpy_r<0b10, asm, ZPR32, GPR32sp>;
5934 def _D : sve_int_perm_cpy_r<0b11, asm, ZPR64, GPR64sp>;
5936 def : InstAlias<"mov $Zd, $Pg/m, $Rn",
5937 (!cast<Instruction>(NAME # _B) ZPR8:$Zd, PPR3bAny:$Pg, GPR32sp:$Rn), 1>;
5938 def : InstAlias<"mov $Zd, $Pg/m, $Rn",
5939 (!cast<Instruction>(NAME # _H) ZPR16:$Zd, PPR3bAny:$Pg, GPR32sp:$Rn), 1>;
5940 def : InstAlias<"mov $Zd, $Pg/m, $Rn",
5941 (!cast<Instruction>(NAME # _S) ZPR32:$Zd, PPR3bAny:$Pg, GPR32sp:$Rn), 1>;
5942 def : InstAlias<"mov $Zd, $Pg/m, $Rn",
5943 (!cast<Instruction>(NAME # _D) ZPR64:$Zd, PPR3bAny:$Pg, GPR64sp:$Rn), 1>;
5945 def : Pat<(nxv16i8 (op nxv16i1:$pg, i32:$splat, nxv16i8:$passthru)),
5946 (!cast<Instruction>(NAME # _B) $passthru, $pg, $splat)>;
5947 def : Pat<(nxv8i16 (op nxv8i1:$pg, i32:$splat, nxv8i16:$passthru)),
5948 (!cast<Instruction>(NAME # _H) $passthru, $pg, $splat)>;
5949 def : Pat<(nxv4i32 (op nxv4i1:$pg, i32:$splat, nxv4i32:$passthru)),
5950 (!cast<Instruction>(NAME # _S) $passthru, $pg, $splat)>;
5951 def : Pat<(nxv2i64 (op nxv2i1:$pg, i64:$splat, nxv2i64:$passthru)),
5952 (!cast<Instruction>(NAME # _D) $passthru, $pg, $splat)>;
5955 class sve_int_perm_cpy_v<bits<2> sz8_64, string asm, ZPRRegOp zprty,
5956 RegisterClass srcRegtype>
5957 : I<(outs zprty:$Zd), (ins zprty:$_Zd, PPR3bAny:$Pg, srcRegtype:$Vn),
5958 asm, "\t$Zd, $Pg/m, $Vn",
5964 let Inst{31-24} = 0b00000101;
5965 let Inst{23-22} = sz8_64;
5966 let Inst{21-13} = 0b100000100;
5967 let Inst{12-10} = Pg;
5971 let Constraints = "$Zd = $_Zd";
5972 let DestructiveInstType = DestructiveOther;
5973 let ElementSize = zprty.ElementSize;
5976 multiclass sve_int_perm_cpy_v<string asm, SDPatternOperator op> {
5977 def _B : sve_int_perm_cpy_v<0b00, asm, ZPR8, FPR8>;
5978 def _H : sve_int_perm_cpy_v<0b01, asm, ZPR16, FPR16>;
5979 def _S : sve_int_perm_cpy_v<0b10, asm, ZPR32, FPR32>;
5980 def _D : sve_int_perm_cpy_v<0b11, asm, ZPR64, FPR64>;
5982 def : InstAlias<"mov $Zd, $Pg/m, $Vn",
5983 (!cast<Instruction>(NAME # _B) ZPR8:$Zd, PPR3bAny:$Pg, FPR8:$Vn), 1>;
5984 def : InstAlias<"mov $Zd, $Pg/m, $Vn",
5985 (!cast<Instruction>(NAME # _H) ZPR16:$Zd, PPR3bAny:$Pg, FPR16:$Vn), 1>;
5986 def : InstAlias<"mov $Zd, $Pg/m, $Vn",
5987 (!cast<Instruction>(NAME # _S) ZPR32:$Zd, PPR3bAny:$Pg, FPR32:$Vn), 1>;
5988 def : InstAlias<"mov $Zd, $Pg/m, $Vn",
5989 (!cast<Instruction>(NAME # _D) ZPR64:$Zd, PPR3bAny:$Pg, FPR64:$Vn), 1>;
5992 def : Pat<(nxv8f16 (op nxv8i1:$pg, f16:$splat, nxv8f16:$passthru)),
5993 (!cast<Instruction>(NAME # _H) $passthru, $pg, $splat)>;
5994 def : Pat<(nxv2f32 (op nxv2i1:$pg, f32:$splat, nxv2f32:$passthru)),
5995 (!cast<Instruction>(NAME # _S) $passthru, $pg, $splat)>;
5996 def : Pat<(nxv4f32 (op nxv4i1:$pg, f32:$splat, nxv4f32:$passthru)),
5997 (!cast<Instruction>(NAME # _S) $passthru, $pg, $splat)>;
5998 def : Pat<(nxv2f64 (op nxv2i1:$pg, f64:$splat, nxv2f64:$passthru)),
5999 (!cast<Instruction>(NAME # _D) $passthru, $pg, $splat)>;
6002 class sve_int_perm_compact<bit sz, string asm, ZPRRegOp zprty>
6003 : I<(outs zprty:$Zd), (ins PPR3bAny:$Pg, zprty:$Zn),
6004 asm, "\t$Zd, $Pg, $Zn",
6010 let Inst{31-23} = 0b000001011;
6012 let Inst{21-13} = 0b100001100;
6013 let Inst{12-10} = Pg;
6018 multiclass sve_int_perm_compact<string asm, SDPatternOperator op> {
6019 def _S : sve_int_perm_compact<0b0, asm, ZPR32>;
6020 def _D : sve_int_perm_compact<0b1, asm, ZPR64>;
6022 def : SVE_2_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, !cast<Instruction>(NAME # _S)>;
6023 def : SVE_2_Op_Pat<nxv4f32, op, nxv4i1, nxv4f32, !cast<Instruction>(NAME # _S)>;
6024 def : SVE_2_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, !cast<Instruction>(NAME # _D)>;
6025 def : SVE_2_Op_Pat<nxv2f64, op, nxv2i1, nxv2f64, !cast<Instruction>(NAME # _D)>;
6029 //===----------------------------------------------------------------------===//
6030 // SVE Memory - Contiguous Load Group
6031 //===----------------------------------------------------------------------===//
6033 class sve_mem_cld_si_base<bits<4> dtype, bit nf, string asm,
6034 RegisterOperand VecList>
6035 : I<(outs VecList:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, simm4s1:$imm4),
6036 asm, "\t$Zt, $Pg/z, [$Rn, $imm4, mul vl]",
6043 let Inst{31-25} = 0b1010010;
6044 let Inst{24-21} = dtype;
6046 let Inst{19-16} = imm4;
6047 let Inst{15-13} = 0b101;
6048 let Inst{12-10} = Pg;
6053 let Uses = !if(!eq(nf, 1), [FFR], []);
6054 let Defs = !if(!eq(nf, 1), [FFR], []);
6057 multiclass sve_mem_cld_si_base<bits<4> dtype, bit nf, string asm,
6058 RegisterOperand listty, ZPRRegOp zprty> {
6059 def _REAL : sve_mem_cld_si_base<dtype, nf, asm, listty>;
6061 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
6062 (!cast<Instruction>(NAME # _REAL) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 0>;
6063 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $imm4, mul vl]",
6064 (!cast<Instruction>(NAME # _REAL) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, simm4s1:$imm4), 0>;
6065 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
6066 (!cast<Instruction>(NAME # _REAL) listty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
6068 // We need a layer of indirection because early machine code passes balk at
6069 // physical register (i.e. FFR) uses that have no previous definition.
6070 let hasSideEffects = 1, hasNoSchedulingInfo = 1, mayLoad = 1 in {
6071 def "" : Pseudo<(outs listty:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, simm4s1:$imm4), []>,
6072 PseudoInstExpansion<(!cast<Instruction>(NAME # _REAL) listty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, simm4s1:$imm4)>;
6076 multiclass sve_mem_cld_si<bits<4> dtype, string asm, RegisterOperand listty,
6078 : sve_mem_cld_si_base<dtype, 0, asm, listty, zprty>;
6080 class sve_mem_cldnt_si_base<bits<2> msz, string asm, RegisterOperand VecList>
6081 : I<(outs VecList:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, simm4s1:$imm4),
6082 asm, "\t$Zt, $Pg/z, [$Rn, $imm4, mul vl]",
6089 let Inst{31-25} = 0b1010010;
6090 let Inst{24-23} = msz;
6091 let Inst{22-20} = 0b000;
6092 let Inst{19-16} = imm4;
6093 let Inst{15-13} = 0b111;
6094 let Inst{12-10} = Pg;
6101 multiclass sve_mem_cldnt_si<bits<2> msz, string asm, RegisterOperand listty,
6103 def NAME : sve_mem_cldnt_si_base<msz, asm, listty>;
6105 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
6106 (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 0>;
6107 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $imm4, mul vl]",
6108 (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, simm4s1:$imm4), 0>;
6109 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
6110 (!cast<Instruction>(NAME) listty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
6113 class sve_mem_cldnt_ss_base<bits<2> msz, string asm, RegisterOperand VecList,
6114 RegisterOperand gprty>
6115 : I<(outs VecList:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
6116 asm, "\t$Zt, $Pg/z, [$Rn, $Rm]",
6123 let Inst{31-25} = 0b1010010;
6124 let Inst{24-23} = msz;
6125 let Inst{22-21} = 0b00;
6126 let Inst{20-16} = Rm;
6127 let Inst{15-13} = 0b110;
6128 let Inst{12-10} = Pg;
6135 multiclass sve_mem_cldnt_ss<bits<2> msz, string asm, RegisterOperand listty,
6136 ZPRRegOp zprty, RegisterOperand gprty> {
6137 def NAME : sve_mem_cldnt_ss_base<msz, asm, listty, gprty>;
6139 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Rm]",
6140 (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm), 0>;
6143 class sve_mem_ldqr_si<bits<2> sz, string asm, RegisterOperand VecList>
6144 : I<(outs VecList:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, simm4s16:$imm4),
6145 asm, "\t$Zt, $Pg/z, [$Rn, $imm4]", "", []>, Sched<[]> {
6150 let Inst{31-25} = 0b1010010;
6151 let Inst{24-23} = sz;
6152 let Inst{22-20} = 0;
6153 let Inst{19-16} = imm4;
6154 let Inst{15-13} = 0b001;
6155 let Inst{12-10} = Pg;
6162 multiclass sve_mem_ldqr_si<bits<2> sz, string asm, RegisterOperand listty,
6164 def NAME : sve_mem_ldqr_si<sz, asm, listty>;
6165 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
6166 (!cast<Instruction>(NAME) listty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
6167 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
6168 (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 0>;
6169 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $imm4]",
6170 (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, simm4s16:$imm4), 0>;
6173 class sve_mem_ldqr_ss<bits<2> sz, string asm, RegisterOperand VecList,
6174 RegisterOperand gprty>
6175 : I<(outs VecList:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
6176 asm, "\t$Zt, $Pg/z, [$Rn, $Rm]", "", []>, Sched<[]> {
6181 let Inst{31-25} = 0b1010010;
6182 let Inst{24-23} = sz;
6183 let Inst{22-21} = 0;
6184 let Inst{20-16} = Rm;
6185 let Inst{15-13} = 0;
6186 let Inst{12-10} = Pg;
6193 multiclass sve_mem_ldqr_ss<bits<2> sz, string asm, RegisterOperand listty,
6194 ZPRRegOp zprty, RegisterOperand gprty> {
6195 def NAME : sve_mem_ldqr_ss<sz, asm, listty, gprty>;
6197 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Rm]",
6198 (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm), 0>;
6201 class sve_mem_ld_dup<bits<2> dtypeh, bits<2> dtypel, string asm,
6202 RegisterOperand VecList, Operand immtype>
6203 : I<(outs VecList:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, immtype:$imm6),
6204 asm, "\t$Zt, $Pg/z, [$Rn, $imm6]",
6211 let Inst{31-25} = 0b1000010;
6212 let Inst{24-23} = dtypeh;
6214 let Inst{21-16} = imm6;
6216 let Inst{14-13} = dtypel;
6217 let Inst{12-10} = Pg;
6224 multiclass sve_mem_ld_dup<bits<2> dtypeh, bits<2> dtypel, string asm,
6225 RegisterOperand zlistty, ZPRRegOp zprty, Operand immtype> {
6226 def NAME : sve_mem_ld_dup<dtypeh, dtypel, asm, zlistty, immtype>;
6228 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
6229 (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 0>;
6230 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $imm6]",
6231 (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, immtype:$imm6), 0>;
6232 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
6233 (!cast<Instruction>(NAME) zlistty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
6236 class sve_mem_cld_ss_base<bits<4> dtype, bit ff, dag iops, string asm,
6237 RegisterOperand VecList>
6238 : I<(outs VecList:$Zt), iops,
6239 asm, "\t$Zt, $Pg/z, [$Rn, $Rm]",
6246 let Inst{31-25} = 0b1010010;
6247 let Inst{24-21} = dtype;
6248 let Inst{20-16} = Rm;
6249 let Inst{15-14} = 0b01;
6251 let Inst{12-10} = Pg;
6256 let Uses = !if(!eq(ff, 1), [FFR], []);
6257 let Defs = !if(!eq(ff, 1), [FFR], []);
6260 multiclass sve_mem_cld_ss<bits<4> dtype, string asm, RegisterOperand listty,
6261 ZPRRegOp zprty, RegisterOperand gprty> {
6262 def "" : sve_mem_cld_ss_base<dtype, 0, (ins PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
6265 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Rm]",
6266 (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm), 0>;
6269 multiclass sve_mem_cldff_ss<bits<4> dtype, string asm, RegisterOperand listty,
6270 ZPRRegOp zprty, RegisterOperand gprty> {
6271 def _REAL : sve_mem_cld_ss_base<dtype, 1, (ins PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
6274 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Rm]",
6275 (!cast<Instruction>(NAME # _REAL) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm), 0>;
6277 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
6278 (!cast<Instruction>(NAME # _REAL) listty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, XZR), 1>;
6280 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
6281 (!cast<Instruction>(NAME # _REAL) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, XZR), 0>;
6283 // We need a layer of indirection because early machine code passes balk at
6284 // physical register (i.e. FFR) uses that have no previous definition.
6285 let hasSideEffects = 1, hasNoSchedulingInfo = 1 in {
6286 def "" : Pseudo<(outs listty:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm), []>,
6287 PseudoInstExpansion<(!cast<Instruction>(NAME # _REAL) listty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm)>;
6291 multiclass sve_mem_cldnf_si<bits<4> dtype, string asm, RegisterOperand listty,
6293 : sve_mem_cld_si_base<dtype, 1, asm, listty, zprty>;
6295 class sve_mem_eld_si<bits<2> sz, bits<2> nregs, RegisterOperand VecList,
6296 string asm, Operand immtype>
6297 : I<(outs VecList:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, immtype:$imm4),
6298 asm, "\t$Zt, $Pg/z, [$Rn, $imm4, mul vl]",
6305 let Inst{31-25} = 0b1010010;
6306 let Inst{24-23} = sz;
6307 let Inst{22-21} = nregs;
6309 let Inst{19-16} = imm4;
6310 let Inst{15-13} = 0b111;
6311 let Inst{12-10} = Pg;
6318 multiclass sve_mem_eld_si<bits<2> sz, bits<2> nregs, RegisterOperand VecList,
6319 string asm, Operand immtype> {
6320 def NAME : sve_mem_eld_si<sz, nregs, VecList, asm, immtype>;
6322 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
6323 (!cast<Instruction>(NAME) VecList:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
6326 class sve_mem_eld_ss<bits<2> sz, bits<2> nregs, RegisterOperand VecList,
6327 string asm, RegisterOperand gprty>
6328 : I<(outs VecList:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
6329 asm, "\t$Zt, $Pg/z, [$Rn, $Rm]",
6336 let Inst{31-25} = 0b1010010;
6337 let Inst{24-23} = sz;
6338 let Inst{22-21} = nregs;
6339 let Inst{20-16} = Rm;
6340 let Inst{15-13} = 0b110;
6341 let Inst{12-10} = Pg;
6348 //===----------------------------------------------------------------------===//
6349 // SVE Memory - 32-bit Gather and Unsized Contiguous Group
6350 //===----------------------------------------------------------------------===//
6352 // bit xs is '1' if offsets are signed
6353 // bit scaled is '1' if the offsets are scaled
6354 class sve_mem_32b_gld_sv<bits<4> opc, bit xs, bit scaled, string asm,
6355 RegisterOperand zprext>
6356 : I<(outs Z_s:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, zprext:$Zm),
6357 asm, "\t$Zt, $Pg/z, [$Rn, $Zm]",
6364 let Inst{31-25} = 0b1000010;
6365 let Inst{24-23} = opc{3-2};
6367 let Inst{21} = scaled;
6368 let Inst{20-16} = Zm;
6370 let Inst{14-13} = opc{1-0};
6371 let Inst{12-10} = Pg;
6376 let Defs = !if(!eq(opc{0}, 1), [FFR], []);
6377 let Uses = !if(!eq(opc{0}, 1), [FFR], []);
6380 multiclass sve_mem_32b_gld_sv_32_scaled<bits<4> opc, string asm,
6381 SDPatternOperator sxtw_op,
6382 SDPatternOperator uxtw_op,
6383 RegisterOperand sxtw_opnd,
6384 RegisterOperand uxtw_opnd,
6386 def _UXTW_SCALED_REAL : sve_mem_32b_gld_sv<opc, 0, 1, asm, uxtw_opnd>;
6387 def _SXTW_SCALED_REAL : sve_mem_32b_gld_sv<opc, 1, 1, asm, sxtw_opnd>;
6389 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
6390 (!cast<Instruction>(NAME # _UXTW_SCALED_REAL) ZPR32:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm), 0>;
6391 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
6392 (!cast<Instruction>(NAME # _SXTW_SCALED_REAL) ZPR32:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm), 0>;
6394 // We need a layer of indirection because early machine code passes balk at
6395 // physical register (i.e. FFR) uses that have no previous definition.
6396 let hasSideEffects = 1, hasNoSchedulingInfo = 1 in {
6397 def _UXTW_SCALED : Pseudo<(outs Z_s:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm), []>,
6398 PseudoInstExpansion<(!cast<Instruction>(NAME # _UXTW_SCALED_REAL) Z_s:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm)>;
6399 def _SXTW_SCALED : Pseudo<(outs Z_s:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm), []>,
6400 PseudoInstExpansion<(!cast<Instruction>(NAME # _SXTW_SCALED_REAL) Z_s:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm)>;
6403 def : Pat<(nxv4i32 (uxtw_op (nxv4i1 PPR:$gp), GPR64sp:$base, (nxv4i32 ZPR:$indices), vt)),
6404 (!cast<Instruction>(NAME # _UXTW_SCALED) PPR:$gp, GPR64sp:$base, ZPR:$indices)>;
6405 def : Pat<(nxv4i32 (sxtw_op (nxv4i1 PPR:$gp), GPR64sp:$base, (nxv4i32 ZPR:$indices), vt)),
6406 (!cast<Instruction>(NAME # _SXTW_SCALED) PPR:$gp, GPR64sp:$base, ZPR:$indices)>;
6409 multiclass sve_mem_32b_gld_vs_32_unscaled<bits<4> opc, string asm,
6410 SDPatternOperator sxtw_op,
6411 SDPatternOperator uxtw_op,
6412 RegisterOperand sxtw_opnd,
6413 RegisterOperand uxtw_opnd,
6415 def _UXTW_REAL : sve_mem_32b_gld_sv<opc, 0, 0, asm, uxtw_opnd>;
6416 def _SXTW_REAL : sve_mem_32b_gld_sv<opc, 1, 0, asm, sxtw_opnd>;
6418 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
6419 (!cast<Instruction>(NAME # _UXTW_REAL) ZPR32:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm), 0>;
6420 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
6421 (!cast<Instruction>(NAME # _SXTW_REAL) ZPR32:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm), 0>;
6423 // We need a layer of indirection because early machine code passes balk at
6424 // physical register (i.e. FFR) uses that have no previous definition.
6425 let hasSideEffects = 1, hasNoSchedulingInfo = 1 in {
6426 def _UXTW : Pseudo<(outs Z_s:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm), []>,
6427 PseudoInstExpansion<(!cast<Instruction>(NAME # _UXTW_REAL) Z_s:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm)>;
6428 def _SXTW : Pseudo<(outs Z_s:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm), []>,
6429 PseudoInstExpansion<(!cast<Instruction>(NAME # _SXTW_REAL) Z_s:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm)>;
6432 def : Pat<(nxv4i32 (uxtw_op (nxv4i1 PPR:$gp), GPR64sp:$base, (nxv4i32 ZPR:$offsets), vt)),
6433 (!cast<Instruction>(NAME # _UXTW) PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
6434 def : Pat<(nxv4i32 (sxtw_op (nxv4i1 PPR:$gp), GPR64sp:$base, (nxv4i32 ZPR:$offsets), vt)),
6435 (!cast<Instruction>(NAME # _SXTW) PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
6439 class sve_mem_32b_gld_vi<bits<4> opc, string asm, Operand imm_ty>
6440 : I<(outs Z_s:$Zt), (ins PPR3bAny:$Pg, ZPR32:$Zn, imm_ty:$imm5),
6441 asm, "\t$Zt, $Pg/z, [$Zn, $imm5]",
6448 let Inst{31-25} = 0b1000010;
6449 let Inst{24-23} = opc{3-2};
6450 let Inst{22-21} = 0b01;
6451 let Inst{20-16} = imm5;
6453 let Inst{14-13} = opc{1-0};
6454 let Inst{12-10} = Pg;
6459 let Defs = !if(!eq(opc{0}, 1), [FFR], []);
6460 let Uses = !if(!eq(opc{0}, 1), [FFR], []);
6463 multiclass sve_mem_32b_gld_vi_32_ptrs<bits<4> opc, string asm, Operand imm_ty,
6464 SDPatternOperator op, ValueType vt> {
6465 def _IMM_REAL : sve_mem_32b_gld_vi<opc, asm, imm_ty>;
6467 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn]",
6468 (!cast<Instruction>(NAME # _IMM_REAL) ZPR32:$Zt, PPR3bAny:$Pg, ZPR32:$Zn, 0), 0>;
6469 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn, $imm5]",
6470 (!cast<Instruction>(NAME # _IMM_REAL) ZPR32:$Zt, PPR3bAny:$Pg, ZPR32:$Zn, imm_ty:$imm5), 0>;
6471 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn]",
6472 (!cast<Instruction>(NAME # _IMM_REAL) Z_s:$Zt, PPR3bAny:$Pg, ZPR32:$Zn, 0), 1>;
6474 // We need a layer of indirection because early machine code passes balk at
6475 // physical register (i.e. FFR) uses that have no previous definition.
6476 let hasSideEffects = 1, hasNoSchedulingInfo = 1 in {
6477 def _IMM : Pseudo<(outs Z_s:$Zt), (ins PPR3bAny:$Pg, ZPR32:$Zn, imm_ty:$imm5), []>,
6478 PseudoInstExpansion<(!cast<Instruction>(NAME # _IMM_REAL) Z_s:$Zt, PPR3bAny:$Pg, ZPR32:$Zn, imm_ty:$imm5)>;
6481 def : Pat<(nxv4i32 (op (nxv4i1 PPR:$gp), (nxv4i32 ZPR:$ptrs), imm_ty:$index, vt)),
6482 (!cast<Instruction>(NAME # _IMM) PPR:$gp, ZPR:$ptrs, imm_ty:$index)>;
6485 class sve_mem_prfm_si<bits<2> msz, string asm>
6486 : I<(outs), (ins sve_prfop:$prfop, PPR3bAny:$Pg, GPR64sp:$Rn, simm6s1:$imm6),
6487 asm, "\t$prfop, $Pg, [$Rn, $imm6, mul vl]",
6494 let Inst{31-22} = 0b1000010111;
6495 let Inst{21-16} = imm6;
6497 let Inst{14-13} = msz;
6498 let Inst{12-10} = Pg;
6501 let Inst{3-0} = prfop;
6503 let hasSideEffects = 1;
6506 multiclass sve_mem_prfm_si<bits<2> msz, string asm> {
6507 def NAME : sve_mem_prfm_si<msz, asm>;
6509 def : InstAlias<asm # "\t$prfop, $Pg, [$Rn]",
6510 (!cast<Instruction>(NAME) sve_prfop:$prfop, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
6513 class sve_mem_prfm_ss<bits<3> opc, string asm, RegisterOperand gprty>
6514 : I<(outs), (ins sve_prfop:$prfop, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
6515 asm, "\t$prfop, $Pg, [$Rn, $Rm]",
6522 let Inst{31-25} = 0b1000010;
6523 let Inst{24-23} = opc{2-1};
6524 let Inst{22-21} = 0b00;
6525 let Inst{20-16} = Rm;
6527 let Inst{14} = opc{0};
6529 let Inst{12-10} = Pg;
6532 let Inst{3-0} = prfop;
6534 let hasSideEffects = 1;
6537 class sve_mem_32b_prfm_sv<bits<2> msz, bit xs, string asm,
6538 RegisterOperand zprext>
6539 : I<(outs), (ins sve_prfop:$prfop, PPR3bAny:$Pg, GPR64sp:$Rn, zprext:$Zm),
6540 asm, "\t$prfop, $Pg, [$Rn, $Zm]",
6547 let Inst{31-23} = 0b100001000;
6550 let Inst{20-16} = Zm;
6552 let Inst{14-13} = msz;
6553 let Inst{12-10} = Pg;
6556 let Inst{3-0} = prfop;
6558 let hasSideEffects = 1;
6561 multiclass sve_mem_32b_prfm_sv_scaled<bits<2> msz, string asm,
6562 RegisterOperand sxtw_opnd,
6563 RegisterOperand uxtw_opnd,
6566 def _UXTW_SCALED : sve_mem_32b_prfm_sv<msz, 0, asm, uxtw_opnd>;
6567 def _SXTW_SCALED : sve_mem_32b_prfm_sv<msz, 1, asm, sxtw_opnd>;
6569 def : Pat<(op_uxtw (nxv4i1 PPR3bAny:$Pg), (i64 GPR64sp:$Rn), (nxv4i32 uxtw_opnd:$Zm), (i32 sve_prfop:$prfop)),
6570 (!cast<Instruction>(NAME # _UXTW_SCALED) sve_prfop:$prfop, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm)>;
6572 def : Pat<(op_sxtw (nxv4i1 PPR3bAny:$Pg), (i64 GPR64sp:$Rn), (nxv4i32 sxtw_opnd:$Zm), (i32 sve_prfop:$prfop)),
6573 (!cast<Instruction>(NAME # _SXTW_SCALED) sve_prfop:$prfop, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm)>;
6576 class sve_mem_32b_prfm_vi<bits<2> msz, string asm, Operand imm_ty>
6577 : I<(outs), (ins sve_prfop:$prfop, PPR3bAny:$Pg, ZPR32:$Zn, imm_ty:$imm5),
6578 asm, "\t$prfop, $Pg, [$Zn, $imm5]",
6585 let Inst{31-25} = 0b1000010;
6586 let Inst{24-23} = msz;
6587 let Inst{22-21} = 0b00;
6588 let Inst{20-16} = imm5;
6589 let Inst{15-13} = 0b111;
6590 let Inst{12-10} = Pg;
6593 let Inst{3-0} = prfop;
6596 multiclass sve_mem_32b_prfm_vi<bits<2> msz, string asm, Operand imm_ty, SDPatternOperator op> {
6597 def NAME : sve_mem_32b_prfm_vi<msz, asm, imm_ty>;
6599 def : InstAlias<asm # "\t$prfop, $Pg, [$Zn]",
6600 (!cast<Instruction>(NAME) sve_prfop:$prfop, PPR3bAny:$Pg, ZPR32:$Zn, 0), 1>;
6602 def : Pat<(op (nxv4i1 PPR_3b:$Pg), (nxv4i32 ZPR32:$Zn), (i64 imm_ty:$imm), (i32 sve_prfop:$prfop)),
6603 (!cast<Instruction>(NAME) sve_prfop:$prfop, PPR_3b:$Pg, ZPR32:$Zn, imm_ty:$imm)>;
6606 class sve_mem_z_fill<string asm>
6607 : I<(outs ZPRAny:$Zt), (ins GPR64sp:$Rn, simm9:$imm9),
6608 asm, "\t$Zt, [$Rn, $imm9, mul vl]",
6614 let Inst{31-22} = 0b1000010110;
6615 let Inst{21-16} = imm9{8-3};
6616 let Inst{15-13} = 0b010;
6617 let Inst{12-10} = imm9{2-0};
6624 multiclass sve_mem_z_fill<string asm> {
6625 def NAME : sve_mem_z_fill<asm>;
6627 def : InstAlias<asm # "\t$Zt, [$Rn]",
6628 (!cast<Instruction>(NAME) ZPRAny:$Zt, GPR64sp:$Rn, 0), 1>;
6631 class sve_mem_p_fill<string asm>
6632 : I<(outs PPRAny:$Pt), (ins GPR64sp:$Rn, simm9:$imm9),
6633 asm, "\t$Pt, [$Rn, $imm9, mul vl]",
6639 let Inst{31-22} = 0b1000010110;
6640 let Inst{21-16} = imm9{8-3};
6641 let Inst{15-13} = 0b000;
6642 let Inst{12-10} = imm9{2-0};
6650 multiclass sve_mem_p_fill<string asm> {
6651 def NAME : sve_mem_p_fill<asm>;
6653 def : InstAlias<asm # "\t$Pt, [$Rn]",
6654 (!cast<Instruction>(NAME) PPRAny:$Pt, GPR64sp:$Rn, 0), 1>;
6657 class sve2_mem_gldnt_vs_base<bits<5> opc, dag iops, string asm,
6658 RegisterOperand VecList>
6659 : I<(outs VecList:$Zt), iops,
6660 asm, "\t$Zt, $Pg/z, [$Zn, $Rm]",
6668 let Inst{30} = opc{4};
6669 let Inst{29-25} = 0b00010;
6670 let Inst{24-23} = opc{3-2};
6671 let Inst{22-21} = 0b00;
6672 let Inst{20-16} = Rm;
6674 let Inst{14-13} = opc{1-0};
6675 let Inst{12-10} = Pg;
6682 multiclass sve2_mem_gldnt_vs_32_ptrs<bits<5> opc, string asm,
6683 SDPatternOperator op,
6685 def _REAL : sve2_mem_gldnt_vs_base<opc, (ins PPR3bAny:$Pg, ZPR32:$Zn, GPR64:$Rm),
6688 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn, $Rm]",
6689 (!cast<Instruction>(NAME # _REAL) ZPR32:$Zt, PPR3bAny:$Pg, ZPR32:$Zn, GPR64:$Rm), 0>;
6690 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn]",
6691 (!cast<Instruction>(NAME # _REAL) ZPR32:$Zt, PPR3bAny:$Pg, ZPR32:$Zn, XZR), 0>;
6692 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn]",
6693 (!cast<Instruction>(NAME # _REAL) Z_s:$Zt, PPR3bAny:$Pg, ZPR32:$Zn, XZR), 1>;
6695 def : Pat <(nxv4i32 (op (nxv4i1 PPR3bAny:$Pg), (nxv4i32 ZPR32:$Zd), (i64 GPR64:$Rm), vt)),
6696 (!cast<Instruction>(NAME # _REAL) PPR3bAny:$Pg, ZPR32:$Zd, GPR64:$Rm)>;
6699 multiclass sve2_mem_gldnt_vs_64_ptrs<bits<5> opc, string asm,
6700 SDPatternOperator op,
6702 def _REAL : sve2_mem_gldnt_vs_base<opc, (ins PPR3bAny:$Pg, ZPR64:$Zn, GPR64:$Rm),
6705 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn, $Rm]",
6706 (!cast<Instruction>(NAME # _REAL) ZPR64:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, GPR64:$Rm), 0>;
6707 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn]",
6708 (!cast<Instruction>(NAME # _REAL) ZPR64:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, XZR), 0>;
6709 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn]",
6710 (!cast<Instruction>(NAME # _REAL) Z_d:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, XZR), 1>;
6712 def : Pat <(nxv2i64 (op (nxv2i1 PPR3bAny:$Pg), (nxv2i64 ZPR64:$Zd), (i64 GPR64:$Rm), vt)),
6713 (!cast<Instruction>(NAME # _REAL) PPR3bAny:$Pg, ZPR64:$Zd, GPR64:$Rm)>;
6716 //===----------------------------------------------------------------------===//
6717 // SVE Memory - 64-bit Gather Group
6718 //===----------------------------------------------------------------------===//
6720 // bit xs is '1' if offsets are signed
6721 // bit scaled is '1' if the offsets are scaled
6722 // bit lsl is '0' if the offsets are extended (uxtw/sxtw), '1' if shifted (lsl)
6723 class sve_mem_64b_gld_sv<bits<4> opc, bit xs, bit scaled, bit lsl, string asm,
6724 RegisterOperand zprext>
6725 : I<(outs Z_d:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, zprext:$Zm),
6726 asm, "\t$Zt, $Pg/z, [$Rn, $Zm]",
6733 let Inst{31-25} = 0b1100010;
6734 let Inst{24-23} = opc{3-2};
6736 let Inst{21} = scaled;
6737 let Inst{20-16} = Zm;
6739 let Inst{14-13} = opc{1-0};
6740 let Inst{12-10} = Pg;
6745 let Defs = !if(!eq(opc{0}, 1), [FFR], []);
6746 let Uses = !if(!eq(opc{0}, 1), [FFR], []);
6749 multiclass sve_mem_64b_gld_sv_32_scaled<bits<4> opc, string asm,
6750 SDPatternOperator sxtw_op,
6751 SDPatternOperator uxtw_op,
6752 RegisterOperand sxtw_opnd,
6753 RegisterOperand uxtw_opnd,
6755 def _UXTW_SCALED_REAL : sve_mem_64b_gld_sv<opc, 0, 1, 0, asm, uxtw_opnd>;
6756 def _SXTW_SCALED_REAL : sve_mem_64b_gld_sv<opc, 1, 1, 0, asm, sxtw_opnd>;
6758 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
6759 (!cast<Instruction>(NAME # _UXTW_SCALED_REAL) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm), 0>;
6760 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
6761 (!cast<Instruction>(NAME # _SXTW_SCALED_REAL) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm), 0>;
6763 // We need a layer of indirection because early machine code passes balk at
6764 // physical register (i.e. FFR) uses that have no previous definition.
6765 let hasSideEffects = 1, hasNoSchedulingInfo = 1 in {
6766 def _UXTW_SCALED : Pseudo<(outs Z_d:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm), []>,
6767 PseudoInstExpansion<(!cast<Instruction>(NAME # _UXTW_SCALED_REAL) Z_d:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm)>;
6768 def _SXTW_SCALED : Pseudo<(outs Z_d:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm), []>,
6769 PseudoInstExpansion<(!cast<Instruction>(NAME # _SXTW_SCALED_REAL) Z_d:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm)>;
6772 def : Pat<(nxv2i64 (uxtw_op (nxv2i1 PPR:$gp), GPR64sp:$base, (nxv2i64 ZPR:$indices), vt)),
6773 (!cast<Instruction>(NAME # _UXTW_SCALED) PPR:$gp, GPR64sp:$base, ZPR:$indices)>;
6774 def : Pat<(nxv2i64 (sxtw_op (nxv2i1 PPR:$gp), GPR64sp:$base, (nxv2i64 ZPR:$indices), vt)),
6775 (!cast<Instruction>(NAME # _SXTW_SCALED) PPR:$gp, GPR64sp:$base, ZPR:$indices)>;
6778 multiclass sve_mem_64b_gld_vs_32_unscaled<bits<4> opc, string asm,
6779 SDPatternOperator sxtw_op,
6780 SDPatternOperator uxtw_op,
6781 RegisterOperand sxtw_opnd,
6782 RegisterOperand uxtw_opnd,
6784 def _UXTW_REAL : sve_mem_64b_gld_sv<opc, 0, 0, 0, asm, uxtw_opnd>;
6785 def _SXTW_REAL : sve_mem_64b_gld_sv<opc, 1, 0, 0, asm, sxtw_opnd>;
6787 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
6788 (!cast<Instruction>(NAME # _UXTW_REAL) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm), 0>;
6789 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
6790 (!cast<Instruction>(NAME # _SXTW_REAL) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm), 0>;
6792 // We need a layer of indirection because early machine code passes balk at
6793 // physical register (i.e. FFR) uses that have no previous definition.
6794 let hasSideEffects = 1, hasNoSchedulingInfo = 1 in {
6795 def _UXTW : Pseudo<(outs Z_d:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm), []>,
6796 PseudoInstExpansion<(!cast<Instruction>(NAME # _UXTW_REAL) Z_d:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm)>;
6797 def _SXTW : Pseudo<(outs Z_d:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm), []>,
6798 PseudoInstExpansion<(!cast<Instruction>(NAME # _SXTW_REAL) Z_d:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm)>;
6801 def : Pat<(nxv2i64 (uxtw_op (nxv2i1 PPR:$gp), GPR64sp:$base, (nxv2i64 ZPR:$offsets), vt)),
6802 (!cast<Instruction>(NAME # _UXTW) PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
6803 def : Pat<(nxv2i64 (sxtw_op (nxv2i1 PPR:$gp), GPR64sp:$base, (nxv2i64 ZPR:$offsets), vt)),
6804 (!cast<Instruction>(NAME # _SXTW) PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
6807 multiclass sve_mem_64b_gld_sv2_64_scaled<bits<4> opc, string asm,
6808 SDPatternOperator op,
6809 RegisterOperand zprext, ValueType vt> {
6810 def _SCALED_REAL : sve_mem_64b_gld_sv<opc, 1, 1, 1, asm, zprext>;
6812 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
6813 (!cast<Instruction>(NAME # _SCALED_REAL) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, zprext:$Zm), 0>;
6815 // We need a layer of indirection because early machine code passes balk at
6816 // physical register (i.e. FFR) uses that have no previous definition.
6817 let hasSideEffects = 1, hasNoSchedulingInfo = 1 in {
6818 def _SCALED : Pseudo<(outs Z_d:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, zprext:$Zm), []>,
6819 PseudoInstExpansion<(!cast<Instruction>(NAME # _SCALED_REAL) Z_d:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, zprext:$Zm)>;
6822 def : Pat<(nxv2i64 (op (nxv2i1 PPR:$gp), GPR64sp:$base, (nxv2i64 ZPR:$indices), vt)),
6823 (!cast<Instruction>(NAME # _SCALED) PPR:$gp, GPR64sp:$base, ZPR:$indices)>;
6826 multiclass sve_mem_64b_gld_vs2_64_unscaled<bits<4> opc, string asm,
6827 SDPatternOperator op, ValueType vt> {
6828 def _REAL : sve_mem_64b_gld_sv<opc, 1, 0, 1, asm, ZPR64ExtLSL8>;
6830 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Zm]",
6831 (!cast<Instruction>(NAME # _REAL) ZPR64:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, ZPR64ExtLSL8:$Zm), 0>;
6833 // We need a layer of indirection because early machine code passes balk at
6834 // physical register (i.e. FFR) uses that have no previous definition.
6835 let hasSideEffects = 1, hasNoSchedulingInfo = 1 in {
6836 def "" : Pseudo<(outs Z_d:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, ZPR64ExtLSL8:$Zm), []>,
6837 PseudoInstExpansion<(!cast<Instruction>(NAME # _REAL) Z_d:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, ZPR64ExtLSL8:$Zm)>;
6840 def : Pat<(nxv2i64 (op (nxv2i1 PPR:$gp), GPR64sp:$base, (nxv2i64 ZPR:$offsets), vt)),
6841 (!cast<Instruction>(NAME) PPR:$gp, GPR64sp:$base, ZPR:$offsets)>;
6844 class sve_mem_64b_gld_vi<bits<4> opc, string asm, Operand imm_ty>
6845 : I<(outs Z_d:$Zt), (ins PPR3bAny:$Pg, ZPR64:$Zn, imm_ty:$imm5),
6846 asm, "\t$Zt, $Pg/z, [$Zn, $imm5]",
6853 let Inst{31-25} = 0b1100010;
6854 let Inst{24-23} = opc{3-2};
6855 let Inst{22-21} = 0b01;
6856 let Inst{20-16} = imm5;
6858 let Inst{14-13} = opc{1-0};
6859 let Inst{12-10} = Pg;
6864 let Defs = !if(!eq(opc{0}, 1), [FFR], []);
6865 let Uses = !if(!eq(opc{0}, 1), [FFR], []);
6868 multiclass sve_mem_64b_gld_vi_64_ptrs<bits<4> opc, string asm, Operand imm_ty,
6869 SDPatternOperator op, ValueType vt> {
6870 def _IMM_REAL : sve_mem_64b_gld_vi<opc, asm, imm_ty>;
6872 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn]",
6873 (!cast<Instruction>(NAME # _IMM_REAL) ZPR64:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, 0), 0>;
6874 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn, $imm5]",
6875 (!cast<Instruction>(NAME # _IMM_REAL) ZPR64:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, imm_ty:$imm5), 0>;
6876 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Zn]",
6877 (!cast<Instruction>(NAME # _IMM_REAL) Z_d:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, 0), 1>;
6879 // We need a layer of indirection because early machine code passes balk at
6880 // physical register (i.e. FFR) uses that have no previous definition.
6881 let hasSideEffects = 1, hasNoSchedulingInfo = 1 in {
6882 def _IMM : Pseudo<(outs Z_d:$Zt), (ins PPR3bAny:$Pg, ZPR64:$Zn, imm_ty:$imm5), []>,
6883 PseudoInstExpansion<(!cast<Instruction>(NAME # _IMM_REAL) Z_d:$Zt, PPR3bAny:$Pg, ZPR64:$Zn, imm_ty:$imm5)>;
6886 def : Pat<(nxv2i64 (op (nxv2i1 PPR:$gp), (nxv2i64 ZPR:$ptrs), imm_ty:$index, vt)),
6887 (!cast<Instruction>(NAME # _IMM) PPR:$gp, ZPR:$ptrs, imm_ty:$index)>;
6890 // bit lsl is '0' if the offsets are extended (uxtw/sxtw), '1' if shifted (lsl)
6891 class sve_mem_64b_prfm_sv<bits<2> msz, bit xs, bit lsl, string asm,
6892 RegisterOperand zprext>
6893 : I<(outs), (ins sve_prfop:$prfop, PPR3bAny:$Pg, GPR64sp:$Rn, zprext:$Zm),
6894 asm, "\t$prfop, $Pg, [$Rn, $Zm]",
6901 let Inst{31-23} = 0b110001000;
6904 let Inst{20-16} = Zm;
6906 let Inst{14-13} = msz;
6907 let Inst{12-10} = Pg;
6910 let Inst{3-0} = prfop;
6912 let hasSideEffects = 1;
6915 multiclass sve_mem_64b_prfm_sv_ext_scaled<bits<2> msz, string asm,
6916 RegisterOperand sxtw_opnd,
6917 RegisterOperand uxtw_opnd,
6920 def _UXTW_SCALED : sve_mem_64b_prfm_sv<msz, 0, 0, asm, uxtw_opnd>;
6921 def _SXTW_SCALED : sve_mem_64b_prfm_sv<msz, 1, 0, asm, sxtw_opnd>;
6923 def : Pat<(op_uxtw (nxv2i1 PPR3bAny:$Pg), (i64 GPR64sp:$Rn), (nxv2i64 uxtw_opnd:$Zm), (i32 sve_prfop:$prfop)),
6924 (!cast<Instruction>(NAME # _UXTW_SCALED) sve_prfop:$prfop, PPR3bAny:$Pg, GPR64sp:$Rn, uxtw_opnd:$Zm)>;
6926 def : Pat<(op_sxtw (nxv2i1 PPR3bAny:$Pg), (i64 GPR64sp:$Rn), (nxv2i64 sxtw_opnd:$Zm), (i32 sve_prfop:$prfop)),
6927 (!cast<Instruction>(NAME # _SXTW_SCALED) sve_prfop:$prfop, PPR3bAny:$Pg, GPR64sp:$Rn, sxtw_opnd:$Zm)>;
6931 multiclass sve_mem_64b_prfm_sv_lsl_scaled<bits<2> msz, string asm,
6932 RegisterOperand zprext, PatFrag frag> {
6933 def NAME : sve_mem_64b_prfm_sv<msz, 1, 1, asm, zprext>;
6935 def : Pat<(frag (nxv2i1 PPR3bAny:$Pg), (i64 GPR64sp:$Rn), (nxv2i64 zprext:$Zm), (i32 sve_prfop:$prfop)),
6936 (!cast<Instruction>(NAME) sve_prfop:$prfop, PPR3bAny:$Pg, GPR64sp:$Rn, zprext:$Zm)>;
6941 class sve_mem_64b_prfm_vi<bits<2> msz, string asm, Operand imm_ty>
6942 : I<(outs), (ins sve_prfop:$prfop, PPR3bAny:$Pg, ZPR64:$Zn, imm_ty:$imm5),
6943 asm, "\t$prfop, $Pg, [$Zn, $imm5]",
6950 let Inst{31-25} = 0b1100010;
6951 let Inst{24-23} = msz;
6952 let Inst{22-21} = 0b00;
6953 let Inst{20-16} = imm5;
6954 let Inst{15-13} = 0b111;
6955 let Inst{12-10} = Pg;
6958 let Inst{3-0} = prfop;
6960 let hasSideEffects = 1;
6963 multiclass sve_mem_64b_prfm_vi<bits<2> msz, string asm, Operand imm_ty, SDPatternOperator op> {
6964 def NAME : sve_mem_64b_prfm_vi<msz, asm, imm_ty>;
6966 def : InstAlias<asm # "\t$prfop, $Pg, [$Zn]",
6967 (!cast<Instruction>(NAME) sve_prfop:$prfop, PPR3bAny:$Pg, ZPR64:$Zn, 0), 1>;
6969 def : Pat<(op (nxv2i1 PPR_3b:$Pg), (nxv2i64 ZPR32:$Zn), (i64 imm_ty:$imm), (i32 sve_prfop:$prfop)),
6970 (!cast<Instruction>(NAME) sve_prfop:$prfop, PPR_3b:$Pg, ZPR32:$Zn, imm_ty:$imm)>;
6973 //===----------------------------------------------------------------------===//
6974 // SVE Compute Vector Address Group
6975 //===----------------------------------------------------------------------===//
6977 class sve_int_bin_cons_misc_0_a<bits<2> opc, bits<2> msz, string asm,
6978 ZPRRegOp zprty, RegisterOperand zprext>
6979 : I<(outs zprty:$Zd), (ins zprty:$Zn, zprext:$Zm),
6980 asm, "\t$Zd, [$Zn, $Zm]",
6986 let Inst{31-24} = 0b00000100;
6987 let Inst{23-22} = opc;
6989 let Inst{20-16} = Zm;
6990 let Inst{15-12} = 0b1010;
6991 let Inst{11-10} = msz;
6996 multiclass sve_int_bin_cons_misc_0_a_uxtw<bits<2> opc, string asm> {
6997 def _0 : sve_int_bin_cons_misc_0_a<opc, 0b00, asm, ZPR64, ZPR64ExtUXTW8>;
6998 def _1 : sve_int_bin_cons_misc_0_a<opc, 0b01, asm, ZPR64, ZPR64ExtUXTW16>;
6999 def _2 : sve_int_bin_cons_misc_0_a<opc, 0b10, asm, ZPR64, ZPR64ExtUXTW32>;
7000 def _3 : sve_int_bin_cons_misc_0_a<opc, 0b11, asm, ZPR64, ZPR64ExtUXTW64>;
7003 multiclass sve_int_bin_cons_misc_0_a_sxtw<bits<2> opc, string asm> {
7004 def _0 : sve_int_bin_cons_misc_0_a<opc, 0b00, asm, ZPR64, ZPR64ExtSXTW8>;
7005 def _1 : sve_int_bin_cons_misc_0_a<opc, 0b01, asm, ZPR64, ZPR64ExtSXTW16>;
7006 def _2 : sve_int_bin_cons_misc_0_a<opc, 0b10, asm, ZPR64, ZPR64ExtSXTW32>;
7007 def _3 : sve_int_bin_cons_misc_0_a<opc, 0b11, asm, ZPR64, ZPR64ExtSXTW64>;
7010 multiclass sve_int_bin_cons_misc_0_a_32_lsl<bits<2> opc, string asm> {
7011 def _0 : sve_int_bin_cons_misc_0_a<opc, 0b00, asm, ZPR32, ZPR32ExtLSL8>;
7012 def _1 : sve_int_bin_cons_misc_0_a<opc, 0b01, asm, ZPR32, ZPR32ExtLSL16>;
7013 def _2 : sve_int_bin_cons_misc_0_a<opc, 0b10, asm, ZPR32, ZPR32ExtLSL32>;
7014 def _3 : sve_int_bin_cons_misc_0_a<opc, 0b11, asm, ZPR32, ZPR32ExtLSL64>;
7017 multiclass sve_int_bin_cons_misc_0_a_64_lsl<bits<2> opc, string asm> {
7018 def _0 : sve_int_bin_cons_misc_0_a<opc, 0b00, asm, ZPR64, ZPR64ExtLSL8>;
7019 def _1 : sve_int_bin_cons_misc_0_a<opc, 0b01, asm, ZPR64, ZPR64ExtLSL16>;
7020 def _2 : sve_int_bin_cons_misc_0_a<opc, 0b10, asm, ZPR64, ZPR64ExtLSL32>;
7021 def _3 : sve_int_bin_cons_misc_0_a<opc, 0b11, asm, ZPR64, ZPR64ExtLSL64>;
7025 //===----------------------------------------------------------------------===//
7026 // SVE Integer Misc - Unpredicated Group
7027 //===----------------------------------------------------------------------===//
7029 class sve_int_bin_cons_misc_0_b<bits<2> sz, string asm, ZPRRegOp zprty>
7030 : I<(outs zprty:$Zd), (ins zprty:$Zn, zprty:$Zm),
7031 asm, "\t$Zd, $Zn, $Zm",
7037 let Inst{31-24} = 0b00000100;
7038 let Inst{23-22} = sz;
7040 let Inst{20-16} = Zm;
7041 let Inst{15-10} = 0b101100;
7046 multiclass sve_int_bin_cons_misc_0_b<string asm, SDPatternOperator op> {
7047 def _H : sve_int_bin_cons_misc_0_b<0b01, asm, ZPR16>;
7048 def _S : sve_int_bin_cons_misc_0_b<0b10, asm, ZPR32>;
7049 def _D : sve_int_bin_cons_misc_0_b<0b11, asm, ZPR64>;
7051 def : SVE_2_Op_Pat<nxv8f16, op, nxv8f16, nxv8i16, !cast<Instruction>(NAME # _H)>;
7052 def : SVE_2_Op_Pat<nxv4f32, op, nxv4f32, nxv4i32, !cast<Instruction>(NAME # _S)>;
7053 def : SVE_2_Op_Pat<nxv2f64, op, nxv2f64, nxv2i64, !cast<Instruction>(NAME # _D)>;
7056 class sve_int_bin_cons_misc_0_c<bits<8> opc, string asm, ZPRRegOp zprty>
7057 : I<(outs zprty:$Zd), (ins zprty:$Zn),
7063 let Inst{31-24} = 0b00000100;
7064 let Inst{23-22} = opc{7-6};
7066 let Inst{20-16} = opc{5-1};
7067 let Inst{15-11} = 0b10111;
7068 let Inst{10} = opc{0};
7073 multiclass sve_int_bin_cons_misc_0_c_fexpa<string asm, SDPatternOperator op> {
7074 def _H : sve_int_bin_cons_misc_0_c<0b01000000, asm, ZPR16>;
7075 def _S : sve_int_bin_cons_misc_0_c<0b10000000, asm, ZPR32>;
7076 def _D : sve_int_bin_cons_misc_0_c<0b11000000, asm, ZPR64>;
7078 def : SVE_1_Op_Pat<nxv8f16, op, nxv8i16, !cast<Instruction>(NAME # _H)>;
7079 def : SVE_1_Op_Pat<nxv4f32, op, nxv4i32, !cast<Instruction>(NAME # _S)>;
7080 def : SVE_1_Op_Pat<nxv2f64, op, nxv2i64, !cast<Instruction>(NAME # _D)>;
7083 //===----------------------------------------------------------------------===//
7084 // SVE Integer Reduction Group
7085 //===----------------------------------------------------------------------===//
7087 class sve_int_reduce<bits<2> sz8_32, bits<2> fmt, bits<3> opc, string asm,
7088 ZPRRegOp zprty, RegisterClass regtype>
7089 : I<(outs regtype:$Vd), (ins PPR3bAny:$Pg, zprty:$Zn),
7090 asm, "\t$Vd, $Pg, $Zn",
7096 let Inst{31-24} = 0b00000100;
7097 let Inst{23-22} = sz8_32;
7099 let Inst{20-19} = fmt;
7100 let Inst{18-16} = opc;
7101 let Inst{15-13} = 0b001;
7102 let Inst{12-10} = Pg;
7107 multiclass sve_int_reduce_0_saddv<bits<3> opc, string asm, SDPatternOperator op> {
7108 def _B : sve_int_reduce<0b00, 0b00, opc, asm, ZPR8, FPR64>;
7109 def _H : sve_int_reduce<0b01, 0b00, opc, asm, ZPR16, FPR64>;
7110 def _S : sve_int_reduce<0b10, 0b00, opc, asm, ZPR32, FPR64>;
7112 def : SVE_2_Op_Pat<i64, op, nxv16i1, nxv16i8, !cast<Instruction>(NAME # _B)>;
7113 def : SVE_2_Op_Pat<i64, op, nxv8i1, nxv8i16, !cast<Instruction>(NAME # _H)>;
7114 def : SVE_2_Op_Pat<i64, op, nxv4i1, nxv4i32, !cast<Instruction>(NAME # _S)>;
7117 multiclass sve_int_reduce_0_uaddv<bits<3> opc, string asm, SDPatternOperator op, SDPatternOperator opSaddv> {
7118 def _B : sve_int_reduce<0b00, 0b00, opc, asm, ZPR8, FPR64>;
7119 def _H : sve_int_reduce<0b01, 0b00, opc, asm, ZPR16, FPR64>;
7120 def _S : sve_int_reduce<0b10, 0b00, opc, asm, ZPR32, FPR64>;
7121 def _D : sve_int_reduce<0b11, 0b00, opc, asm, ZPR64, FPR64>;
7123 def : SVE_2_Op_Pat<i64, op, nxv16i1, nxv16i8, !cast<Instruction>(NAME # _B)>;
7124 def : SVE_2_Op_Pat<i64, op, nxv8i1, nxv8i16, !cast<Instruction>(NAME # _H)>;
7125 def : SVE_2_Op_Pat<i64, op, nxv4i1, nxv4i32, !cast<Instruction>(NAME # _S)>;
7126 def : SVE_2_Op_Pat<i64, op, nxv2i1, nxv2i64, !cast<Instruction>(NAME # _D)>;
7127 def : SVE_2_Op_Pat<i64, opSaddv, nxv2i1, nxv2i64, !cast<Instruction>(NAME # _D)>;
7130 multiclass sve_int_reduce_1<bits<3> opc, string asm, SDPatternOperator op> {
7131 def _B : sve_int_reduce<0b00, 0b01, opc, asm, ZPR8, FPR8>;
7132 def _H : sve_int_reduce<0b01, 0b01, opc, asm, ZPR16, FPR16>;
7133 def _S : sve_int_reduce<0b10, 0b01, opc, asm, ZPR32, FPR32>;
7134 def _D : sve_int_reduce<0b11, 0b01, opc, asm, ZPR64, FPR64>;
7136 def : SVE_2_Op_Pat_Reduce_To_Neon<v16i8, op, nxv16i1, nxv16i8, !cast<Instruction>(NAME # _B), bsub>;
7137 def : SVE_2_Op_Pat_Reduce_To_Neon<v8i16, op, nxv8i1, nxv8i16, !cast<Instruction>(NAME # _H), hsub>;
7138 def : SVE_2_Op_Pat_Reduce_To_Neon<v4i32, op, nxv4i1, nxv4i32, !cast<Instruction>(NAME # _S), ssub>;
7139 def : SVE_2_Op_Pat_Reduce_To_Neon<v2i64, op, nxv2i1, nxv2i64, !cast<Instruction>(NAME # _D), dsub>;
7142 multiclass sve_int_reduce_2<bits<3> opc, string asm, SDPatternOperator op> {
7143 def _B : sve_int_reduce<0b00, 0b11, opc, asm, ZPR8, FPR8>;
7144 def _H : sve_int_reduce<0b01, 0b11, opc, asm, ZPR16, FPR16>;
7145 def _S : sve_int_reduce<0b10, 0b11, opc, asm, ZPR32, FPR32>;
7146 def _D : sve_int_reduce<0b11, 0b11, opc, asm, ZPR64, FPR64>;
7148 def : SVE_2_Op_Pat_Reduce_To_Neon<v16i8, op, nxv16i1, nxv16i8, !cast<Instruction>(NAME # _B), bsub>;
7149 def : SVE_2_Op_Pat_Reduce_To_Neon<v8i16, op, nxv8i1, nxv8i16, !cast<Instruction>(NAME # _H), hsub>;
7150 def : SVE_2_Op_Pat_Reduce_To_Neon<v4i32, op, nxv4i1, nxv4i32, !cast<Instruction>(NAME # _S), ssub>;
7151 def : SVE_2_Op_Pat_Reduce_To_Neon<v2i64, op, nxv2i1, nxv2i64, !cast<Instruction>(NAME # _D), dsub>;
7154 class sve_int_movprfx_pred<bits<2> sz8_32, bits<3> opc, string asm,
7155 ZPRRegOp zprty, string pg_suffix, dag iops>
7156 : I<(outs zprty:$Zd), iops,
7157 asm, "\t$Zd, $Pg"#pg_suffix#", $Zn",
7163 let Inst{31-24} = 0b00000100;
7164 let Inst{23-22} = sz8_32;
7165 let Inst{21-19} = 0b010;
7166 let Inst{18-16} = opc;
7167 let Inst{15-13} = 0b001;
7168 let Inst{12-10} = Pg;
7172 let ElementSize = zprty.ElementSize;
7175 multiclass sve_int_movprfx_pred_merge<bits<3> opc, string asm> {
7176 let Constraints = "$Zd = $_Zd" in {
7177 def _B : sve_int_movprfx_pred<0b00, opc, asm, ZPR8, "/m",
7178 (ins ZPR8:$_Zd, PPR3bAny:$Pg, ZPR8:$Zn)>;
7179 def _H : sve_int_movprfx_pred<0b01, opc, asm, ZPR16, "/m",
7180 (ins ZPR16:$_Zd, PPR3bAny:$Pg, ZPR16:$Zn)>;
7181 def _S : sve_int_movprfx_pred<0b10, opc, asm, ZPR32, "/m",
7182 (ins ZPR32:$_Zd, PPR3bAny:$Pg, ZPR32:$Zn)>;
7183 def _D : sve_int_movprfx_pred<0b11, opc, asm, ZPR64, "/m",
7184 (ins ZPR64:$_Zd, PPR3bAny:$Pg, ZPR64:$Zn)>;
7188 multiclass sve_int_movprfx_pred_zero<bits<3> opc, string asm> {
7189 def _B : sve_int_movprfx_pred<0b00, opc, asm, ZPR8, "/z",
7190 (ins PPR3bAny:$Pg, ZPR8:$Zn)>;
7191 def _H : sve_int_movprfx_pred<0b01, opc, asm, ZPR16, "/z",
7192 (ins PPR3bAny:$Pg, ZPR16:$Zn)>;
7193 def _S : sve_int_movprfx_pred<0b10, opc, asm, ZPR32, "/z",
7194 (ins PPR3bAny:$Pg, ZPR32:$Zn)>;
7195 def _D : sve_int_movprfx_pred<0b11, opc, asm, ZPR64, "/z",
7196 (ins PPR3bAny:$Pg, ZPR64:$Zn)>;
7199 //===----------------------------------------------------------------------===//
7200 // SVE Propagate Break Group
7201 //===----------------------------------------------------------------------===//
7203 class sve_int_brkp<bits<2> opc, string asm>
7204 : I<(outs PPR8:$Pd), (ins PPRAny:$Pg, PPR8:$Pn, PPR8:$Pm),
7205 asm, "\t$Pd, $Pg/z, $Pn, $Pm",
7212 let Inst{31-24} = 0b00100101;
7214 let Inst{22} = opc{1};
7215 let Inst{21-20} = 0b00;
7216 let Inst{19-16} = Pm;
7217 let Inst{15-14} = 0b11;
7218 let Inst{13-10} = Pg;
7221 let Inst{4} = opc{0};
7224 let Defs = !if(!eq (opc{1}, 1), [NZCV], []);
7227 multiclass sve_int_brkp<bits<2> opc, string asm, SDPatternOperator op> {
7228 def NAME : sve_int_brkp<opc, asm>;
7230 def : SVE_3_Op_Pat<nxv16i1, op, nxv16i1, nxv16i1, nxv16i1, !cast<Instruction>(NAME)>;
7234 //===----------------------------------------------------------------------===//
7235 // SVE Partition Break Group
7236 //===----------------------------------------------------------------------===//
7238 class sve_int_brkn<bit S, string asm>
7239 : I<(outs PPR8:$Pdm), (ins PPRAny:$Pg, PPR8:$Pn, PPR8:$_Pdm),
7240 asm, "\t$Pdm, $Pg/z, $Pn, $_Pdm",
7246 let Inst{31-23} = 0b001001010;
7248 let Inst{21-14} = 0b01100001;
7249 let Inst{13-10} = Pg;
7253 let Inst{3-0} = Pdm;
7255 let Constraints = "$Pdm = $_Pdm";
7256 let Defs = !if(!eq (S, 0b1), [NZCV], []);
7259 multiclass sve_int_brkn<bits<1> opc, string asm, SDPatternOperator op> {
7260 def NAME : sve_int_brkn<opc, asm>;
7262 def : SVE_3_Op_Pat<nxv16i1, op, nxv16i1, nxv16i1, nxv16i1, !cast<Instruction>(NAME)>;
7265 class sve_int_break<bits<3> opc, string asm, string suffix, dag iops>
7266 : I<(outs PPR8:$Pd), iops,
7267 asm, "\t$Pd, $Pg"#suffix#", $Pn",
7273 let Inst{31-24} = 0b00100101;
7274 let Inst{23-22} = opc{2-1};
7275 let Inst{21-14} = 0b01000001;
7276 let Inst{13-10} = Pg;
7279 let Inst{4} = opc{0};
7282 let Constraints = !if(!eq (opc{0}, 1), "$Pd = $_Pd", "");
7283 let Defs = !if(!eq (opc{1}, 1), [NZCV], []);
7287 multiclass sve_int_break_m<bits<3> opc, string asm, SDPatternOperator op> {
7288 def NAME : sve_int_break<opc, asm, "/m", (ins PPR8:$_Pd, PPRAny:$Pg, PPR8:$Pn)>;
7290 def : SVE_3_Op_Pat<nxv16i1, op, nxv16i1, nxv16i1, nxv16i1, !cast<Instruction>(NAME)>;
7293 multiclass sve_int_break_z<bits<3> opc, string asm, SDPatternOperator op> {
7294 def NAME : sve_int_break<opc, asm, "/z", (ins PPRAny:$Pg, PPR8:$Pn)>;
7296 def : SVE_2_Op_Pat<nxv16i1, op, nxv16i1, nxv16i1, !cast<Instruction>(NAME)>;
7299 //===----------------------------------------------------------------------===//
7300 // SVE2 String Processing Group
7301 //===----------------------------------------------------------------------===//
7303 class sve2_char_match<bit sz, bit opc, string asm,
7304 PPRRegOp pprty, ZPRRegOp zprty>
7305 : I<(outs pprty:$Pd), (ins PPR3bAny:$Pg, zprty:$Zn, zprty:$Zm),
7306 asm, "\t$Pd, $Pg/z, $Zn, $Zm",
7313 let Inst{31-23} = 0b010001010;
7316 let Inst{20-16} = Zm;
7317 let Inst{15-13} = 0b100;
7318 let Inst{12-10} = Pg;
7326 multiclass sve2_char_match<bit opc, string asm, SDPatternOperator op> {
7327 def _B : sve2_char_match<0b0, opc, asm, PPR8, ZPR8>;
7328 def _H : sve2_char_match<0b1, opc, asm, PPR16, ZPR16>;
7330 def : SVE_3_Op_Pat<nxv16i1, op, nxv16i1, nxv16i8, nxv16i8, !cast<Instruction>(NAME # _B)>;
7331 def : SVE_3_Op_Pat<nxv8i1, op, nxv8i1, nxv8i16, nxv8i16, !cast<Instruction>(NAME # _H)>;
7334 //===----------------------------------------------------------------------===//
7335 // SVE2 Histogram Computation - Segment Group
7336 //===----------------------------------------------------------------------===//
7338 class sve2_hist_gen_segment<string asm, SDPatternOperator op>
7339 : I<(outs ZPR8:$Zd), (ins ZPR8:$Zn, ZPR8:$Zm),
7340 asm, "\t$Zd, $Zn, $Zm",
7342 [(set nxv16i8:$Zd, (op nxv16i8:$Zn, nxv16i8:$Zm))]>, Sched<[]> {
7346 let Inst{31-21} = 0b01000101001;
7347 let Inst{20-16} = Zm;
7348 let Inst{15-10} = 0b101000;
7353 //===----------------------------------------------------------------------===//
7354 // SVE2 Histogram Computation - Vector Group
7355 //===----------------------------------------------------------------------===//
7357 class sve2_hist_gen_vector<bit sz, string asm, ZPRRegOp zprty>
7358 : I<(outs zprty:$Zd), (ins PPR3bAny:$Pg, zprty:$Zn, zprty:$Zm),
7359 asm, "\t$Zd, $Pg/z, $Zn, $Zm",
7366 let Inst{31-23} = 0b010001011;
7369 let Inst{20-16} = Zm;
7370 let Inst{15-13} = 0b110;
7371 let Inst{12-10} = Pg;
7376 multiclass sve2_hist_gen_vector<string asm, SDPatternOperator op> {
7377 def _S : sve2_hist_gen_vector<0b0, asm, ZPR32>;
7378 def _D : sve2_hist_gen_vector<0b1, asm, ZPR64>;
7380 def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Instruction>(NAME # _S)>;
7381 def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Instruction>(NAME # _D)>;
7384 //===----------------------------------------------------------------------===//
7385 // SVE2 Crypto Extensions Group
7386 //===----------------------------------------------------------------------===//
7388 class sve2_crypto_cons_bin_op<bit opc, string asm, ZPRRegOp zprty>
7389 : I<(outs zprty:$Zd), (ins zprty:$Zn, zprty:$Zm),
7390 asm, "\t$Zd, $Zn, $Zm",
7396 let Inst{31-21} = 0b01000101001;
7397 let Inst{20-16} = Zm;
7398 let Inst{15-11} = 0b11110;
7404 multiclass sve2_crypto_cons_bin_op<bit opc, string asm, ZPRRegOp zprty,
7405 SDPatternOperator op, ValueType vt> {
7406 def NAME : sve2_crypto_cons_bin_op<opc, asm, zprty>;
7407 def : SVE_2_Op_Pat<vt, op, vt, vt, !cast<Instruction>(NAME)>;
7410 class sve2_crypto_des_bin_op<bits<2> opc, string asm, ZPRRegOp zprty>
7411 : I<(outs zprty:$Zdn), (ins zprty:$_Zdn, zprty:$Zm),
7412 asm, "\t$Zdn, $_Zdn, $Zm",
7417 let Inst{31-17} = 0b010001010010001;
7418 let Inst{16} = opc{1};
7419 let Inst{15-11} = 0b11100;
7420 let Inst{10} = opc{0};
7422 let Inst{4-0} = Zdn;
7424 let Constraints = "$Zdn = $_Zdn";
7427 multiclass sve2_crypto_des_bin_op<bits<2> opc, string asm, ZPRRegOp zprty,
7428 SDPatternOperator op, ValueType vt> {
7429 def NAME : sve2_crypto_des_bin_op<opc, asm, zprty>;
7430 def : SVE_2_Op_Pat<vt, op, vt, vt, !cast<Instruction>(NAME)>;
7433 class sve2_crypto_unary_op<bit opc, string asm, ZPRRegOp zprty>
7434 : I<(outs zprty:$Zdn), (ins zprty:$_Zdn),
7435 asm, "\t$Zdn, $_Zdn",
7439 let Inst{31-11} = 0b010001010010000011100;
7441 let Inst{9-5} = 0b00000;
7442 let Inst{4-0} = Zdn;
7444 let Constraints = "$Zdn = $_Zdn";
7447 multiclass sve2_crypto_unary_op<bit opc, string asm, SDPatternOperator op> {
7448 def NAME : sve2_crypto_unary_op<opc, asm, ZPR8>;
7449 def : SVE_1_Op_Pat<nxv16i8, op, nxv16i8, !cast<Instruction>(NAME)>;
7452 //===----------------------------------------------------------------------===//
7453 // SVE BFloat16 Group
7454 //===----------------------------------------------------------------------===//
7456 class sve_bfloat_dot_base<bits<2> opc, string asm, string ops, dag iops>
7457 : I<(outs ZPR32:$Zda), iops, asm, ops, "", []>, Sched<[]> {
7460 let Inst{31-21} = 0b01100100011;
7461 let Inst{15-14} = opc;
7462 let Inst{13-10} = 0b0000;
7464 let Inst{4-0} = Zda;
7466 let Constraints = "$Zda = $_Zda";
7467 let DestructiveInstType = DestructiveOther;
7468 let ElementSize = ElementSizeH;
7471 class sve_bfloat_dot<string asm>
7472 : sve_bfloat_dot_base<0b10, asm, "\t$Zda, $Zn, $Zm",
7473 (ins ZPR32:$_Zda, ZPR16:$Zn, ZPR16:$Zm)> {
7475 let Inst{20-16} = Zm;
7478 multiclass sve_bfloat_dot<string asm, SDPatternOperator op> {
7479 def NAME : sve_bfloat_dot<asm>;
7480 def : SVE_3_Op_Pat<nxv4f32, op, nxv4f32, nxv8bf16, nxv8bf16 ,!cast<Instruction>(NAME)>;
7483 class sve_bfloat_dot_indexed<string asm>
7484 : sve_bfloat_dot_base<0b01, asm, "\t$Zda, $Zn, $Zm$iop",
7485 (ins ZPR32:$_Zda, ZPR16:$Zn, ZPR3b16:$Zm, VectorIndexS:$iop)> {
7488 let Inst{20-19} = iop;
7489 let Inst{18-16} = Zm;
7492 multiclass sve_bfloat_dot_indexed<string asm, SDPatternOperator op> {
7493 def NAME : sve_bfloat_dot_indexed<asm>;
7494 def : SVE_4_Op_Imm_Pat<nxv4f32, op, nxv4f32, nxv8bf16, nxv8bf16, i64, VectorIndexS_timm, !cast<Instruction>(NAME)>;
7497 class sve_bfloat_matmul<string asm>
7498 : I<(outs ZPR32:$Zda), (ins ZPR32:$_Zda, ZPR16:$Zn, ZPR16:$Zm),
7499 asm, "\t$Zda, $Zn, $Zm", "", []>, Sched<[]> {
7503 let Inst{31-21} = 0b01100100011;
7504 let Inst{20-16} = Zm;
7505 let Inst{15-10} = 0b111001;
7507 let Inst{4-0} = Zda;
7509 let Constraints = "$Zda = $_Zda";
7510 let DestructiveInstType = DestructiveOther;
7511 let ElementSize = ElementSizeH;
7514 multiclass sve_bfloat_matmul<string asm, SDPatternOperator op> {
7515 def NAME : sve_bfloat_matmul<asm>;
7516 def : SVE_3_Op_Pat<nxv4f32, op, nxv4f32, nxv8bf16, nxv8bf16 ,!cast<Instruction>(NAME)>;
7519 class sve_bfloat_matmul_longvecl<bit BT, string asm>
7520 : sve_bfloat_matmul<asm> {
7522 let Inst{14-13} = 0b00;
7526 multiclass sve_bfloat_matmul_longvecl<bit BT, string asm, SDPatternOperator op> {
7527 def NAME : sve_bfloat_matmul_longvecl<BT, asm>;
7528 def : SVE_3_Op_Pat<nxv4f32, op, nxv4f32, nxv8bf16, nxv8bf16 ,!cast<Instruction>(NAME)>;
7531 class sve_bfloat_matmul_longvecl_idx<bit BT, string asm>
7532 : sve_bfloat_dot_base<0b01, asm, "\t$Zda, $Zn, $Zm$iop",
7533 (ins ZPR32:$_Zda, ZPR16:$Zn, ZPR3b16:$Zm, VectorIndexH:$iop)> {
7537 let Inst{20-19} = iop{2-1};
7538 let Inst{18-16} = Zm;
7539 let Inst{11} = iop{0};
7543 multiclass sve_bfloat_matmul_longvecl_idx<bit BT, string asm, SDPatternOperator op> {
7544 def NAME : sve_bfloat_matmul_longvecl_idx<BT, asm>;
7545 def : SVE_4_Op_Imm_Pat<nxv4f32, op, nxv4f32, nxv8bf16, nxv8bf16, i64, VectorIndexH_timm, !cast<Instruction>(NAME)>;
7548 class sve_bfloat_convert<bit N, string asm>
7549 : I<(outs ZPR16:$Zd), (ins ZPR16:$_Zd, PPR3bAny:$Pg, ZPR32:$Zn),
7550 asm, "\t$Zd, $Pg/m, $Zn", "", []>, Sched<[]> {
7554 let Inst{31-25} = 0b0110010;
7556 let Inst{23-13} = 0b10001010101;
7557 let Inst{12-10} = Pg;
7561 let Constraints = "$Zd = $_Zd";
7562 let DestructiveInstType = DestructiveOther;
7563 let hasSideEffects = 1;
7564 let ElementSize = ElementSizeS;
7567 multiclass sve_bfloat_convert<bit N, string asm, SDPatternOperator op> {
7568 def NAME : sve_bfloat_convert<N, asm>;
7569 def : SVE_3_Op_Pat<nxv8bf16, op, nxv8bf16, nxv8i1, nxv4f32, !cast<Instruction>(NAME)>;
7572 //===----------------------------------------------------------------------===//
7573 // SVE Integer Matrix Multiply Group
7574 //===----------------------------------------------------------------------===//
7576 class sve_int_matmul<bits<2> uns, string asm>
7577 : I<(outs ZPR32:$Zda), (ins ZPR32:$_Zda, ZPR8:$Zn, ZPR8:$Zm), asm,
7578 "\t$Zda, $Zn, $Zm", "", []>, Sched<[]> {
7582 let Inst{31-24} = 0b01000101;
7583 let Inst{23-22} = uns;
7585 let Inst{20-16} = Zm;
7586 let Inst{15-10} = 0b100110;
7588 let Inst{4-0} = Zda;
7590 let Constraints = "$Zda = $_Zda";
7591 let DestructiveInstType = DestructiveOther;
7592 let ElementSize = ZPR32.ElementSize;
7595 multiclass sve_int_matmul<bits<2> uns, string asm, SDPatternOperator op> {
7596 def NAME : sve_int_matmul<uns, asm>;
7598 def : SVE_3_Op_Pat<nxv4i32, op , nxv4i32, nxv16i8, nxv16i8, !cast<Instruction>(NAME)>;
7601 //===----------------------------------------------------------------------===//
7602 // SVE Integer Dot Product Mixed Sign Group
7603 //===----------------------------------------------------------------------===//
7605 class sve_int_dot_mixed<string asm>
7606 : I<(outs ZPR32:$Zda), (ins ZPR32:$_Zda, ZPR8:$Zn, ZPR8:$Zm), asm,
7607 "\t$Zda, $Zn, $Zm", "", []>, Sched<[]> {
7611 let Inst{31-21} = 0b01000100100;
7612 let Inst{20-16} = Zm;
7613 let Inst{15-10} = 0b011110;
7615 let Inst{4-0} = Zda;
7617 let Constraints = "$Zda = $_Zda";
7618 let DestructiveInstType = DestructiveOther;
7619 let ElementSize = ZPR32.ElementSize;
7622 multiclass sve_int_dot_mixed<string asm, SDPatternOperator op> {
7623 def NAME : sve_int_dot_mixed<asm>;
7625 def : SVE_3_Op_Pat<nxv4i32, op , nxv4i32, nxv16i8, nxv16i8, !cast<Instruction>(NAME)>;
7628 //===----------------------------------------------------------------------===//
7629 // SVE Integer Dot Product Mixed Sign - Indexed Group
7630 //===----------------------------------------------------------------------===//
7632 class sve_int_dot_mixed_indexed<bit U, string asm>
7633 : I<(outs ZPR32:$Zda), (ins ZPR32:$_Zda, ZPR8:$Zn, ZPR3b8:$Zm, VectorIndexS32b:$idx),
7634 asm, "\t$Zda, $Zn, $Zm$idx", "", []>, Sched<[]> {
7639 let Inst{31-21} = 0b01000100101;
7640 let Inst{20-19} = idx;
7641 let Inst{18-16} = Zm;
7642 let Inst{15-11} = 0b00011;
7645 let Inst{4-0} = Zda;
7647 let Constraints = "$Zda = $_Zda";
7648 let DestructiveInstType = DestructiveOther;
7649 let ElementSize = ZPR32.ElementSize;
7652 multiclass sve_int_dot_mixed_indexed<bit U, string asm, SDPatternOperator op> {
7653 def NAME : sve_int_dot_mixed_indexed<U, asm>;
7655 def : SVE_4_Op_Imm_Pat<nxv4i32, op, nxv4i32, nxv16i8, nxv16i8, i32, VectorIndexS32b_timm, !cast<Instruction>(NAME)>;
7658 //===----------------------------------------------------------------------===//
7659 // SVE Floating Point Matrix Multiply Accumulate Group
7660 //===----------------------------------------------------------------------===//
7662 class sve_fp_matrix_mla<bit sz, string asm, ZPRRegOp zprty>
7663 : I<(outs zprty:$Zda), (ins zprty:$_Zda, zprty:$Zn, zprty:$Zm),
7664 asm, "\t$Zda, $Zn, $Zm", "", []>, Sched<[]> {
7668 let Inst{31-23} = 0b011001001;
7671 let Inst{20-16} = Zm;
7672 let Inst{15-10} = 0b111001;
7674 let Inst{4-0} = Zda;
7676 let Constraints = "$Zda = $_Zda";
7677 let DestructiveInstType = DestructiveOther;
7678 let ElementSize = zprty.ElementSize;
7681 multiclass sve_fp_matrix_mla<bit sz, string asm, ZPRRegOp zprty, SDPatternOperator op, ValueType vt> {
7682 def NAME : sve_fp_matrix_mla<sz, asm, zprty>;
7684 def : SVE_3_Op_Pat<vt, op , vt, vt, vt, !cast<Instruction>(NAME)>;
7687 //===----------------------------------------------------------------------===//
7688 // SVE Memory - Contiguous Load And Replicate 256-bit Group
7689 //===----------------------------------------------------------------------===//
7691 class sve_mem_ldor_si<bits<2> sz, string asm, RegisterOperand VecList>
7692 : I<(outs VecList:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, simm4s32:$imm4),
7693 asm, "\t$Zt, $Pg/z, [$Rn, $imm4]", "", []>, Sched<[]> {
7698 let Inst{31-25} = 0b1010010;
7699 let Inst{24-23} = sz;
7700 let Inst{22-20} = 0b010;
7701 let Inst{19-16} = imm4;
7702 let Inst{15-13} = 0b001;
7703 let Inst{12-10} = Pg;
7710 multiclass sve_mem_ldor_si<bits<2> sz, string asm, RegisterOperand listty,
7711 ZPRRegOp zprty, ValueType Ty, ValueType PredTy, SDNode Ld1ro> {
7712 def NAME : sve_mem_ldor_si<sz, asm, listty>;
7713 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
7714 (!cast<Instruction>(NAME) listty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 1>;
7715 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn]",
7716 (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, 0), 0>;
7717 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $imm4]",
7718 (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, simm4s32:$imm4), 0>;
7720 // Base addressing mode
7721 def : Pat<(Ty (Ld1ro (PredTy PPR3bAny:$Pg), GPR64sp:$base)),
7722 (!cast<Instruction>(NAME) PPR3bAny:$Pg, GPR64sp:$base, (i64 0))>;
7723 let AddedComplexity = 2 in {
7724 // Reg + Imm addressing mode
7725 def : Pat<(Ty (Ld1ro (PredTy PPR3bAny:$Pg), (add GPR64:$base, (i64 simm4s32:$imm)))),
7726 (!cast<Instruction>(NAME) $Pg, $base, simm4s32:$imm)>;
7730 class sve_mem_ldor_ss<bits<2> sz, string asm, RegisterOperand VecList,
7731 RegisterOperand gprty>
7732 : I<(outs VecList:$Zt), (ins PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm),
7733 asm, "\t$Zt, $Pg/z, [$Rn, $Rm]", "", []>, Sched<[]> {
7738 let Inst{31-25} = 0b1010010;
7739 let Inst{24-23} = sz;
7740 let Inst{22-21} = 0b01;
7741 let Inst{20-16} = Rm;
7742 let Inst{15-13} = 0;
7743 let Inst{12-10} = Pg;
7750 multiclass sve_mem_ldor_ss<bits<2> sz, string asm, RegisterOperand listty,
7751 ZPRRegOp zprty, RegisterOperand gprty, ValueType Ty,
7752 ValueType PredTy, SDNode Ld1ro, ComplexPattern AddrCP> {
7753 def NAME : sve_mem_ldor_ss<sz, asm, listty, gprty>;
7755 def : InstAlias<asm # "\t$Zt, $Pg/z, [$Rn, $Rm]",
7756 (!cast<Instruction>(NAME) zprty:$Zt, PPR3bAny:$Pg, GPR64sp:$Rn, gprty:$Rm), 0>;
7758 def : Pat<(Ty (Ld1ro (PredTy PPR3bAny:$gp), (AddrCP GPR64sp:$base, gprty:$offset))),
7759 (!cast<Instruction>(NAME) PPR3bAny:$gp, GPR64sp:$base, gprty:$offset)>;
7762 //===----------------------------------------------------------------------===//
7763 // SVE Interleave 128-bit Elements Group
7764 //===----------------------------------------------------------------------===//
7766 class sve_int_perm_bin_perm_128_zz<bits<2> opc, bit P, string asm>
7767 : I<(outs ZPR128:$Zd), (ins ZPR128:$Zn, ZPR128:$Zm),
7768 asm, "\t$Zd, $Zn, $Zm",
7774 let Inst{31-21} = 0b00000101101;
7775 let Inst{20-16} = Zm;
7776 let Inst{15-13} = 0b000;
7777 let Inst{12-11} = opc;
7783 multiclass sve_int_perm_bin_perm_128_zz<bits<2> opc, bit P, string asm, SDPatternOperator op> {
7784 def NAME : sve_int_perm_bin_perm_128_zz<opc, P, asm>;
7786 def : SVE_2_Op_Pat<nxv16i8, op, nxv16i8, nxv16i8, !cast<Instruction>(NAME)>;
7787 def : SVE_2_Op_Pat<nxv8i16, op, nxv8i16, nxv8i16, !cast<Instruction>(NAME)>;
7788 def : SVE_2_Op_Pat<nxv8f16, op, nxv8f16, nxv8f16, !cast<Instruction>(NAME)>;
7789 def : SVE_2_Op_Pat<nxv4i32, op, nxv4i32, nxv4i32, !cast<Instruction>(NAME)>;
7790 def : SVE_2_Op_Pat<nxv4f32, op, nxv4f32, nxv4f32, !cast<Instruction>(NAME)>;
7791 def : SVE_2_Op_Pat<nxv2i64, op, nxv2i64, nxv2i64, !cast<Instruction>(NAME)>;
7792 def : SVE_2_Op_Pat<nxv2f64, op, nxv2f64, nxv2f64, !cast<Instruction>(NAME)>;
7795 /// Addressing modes
7796 def am_sve_indexed_s4 :ComplexPattern<i64, 2, "SelectAddrModeIndexedSVE<-8,7>", [], [SDNPWantRoot]>;
7797 def am_sve_indexed_s6 :ComplexPattern<i64, 2, "SelectAddrModeIndexedSVE<-32,31>", [], [SDNPWantRoot]>;
7799 def am_sve_regreg_lsl0 : ComplexPattern<i64, 2, "SelectSVERegRegAddrMode<0>", []>;
7800 def am_sve_regreg_lsl1 : ComplexPattern<i64, 2, "SelectSVERegRegAddrMode<1>", []>;
7801 def am_sve_regreg_lsl2 : ComplexPattern<i64, 2, "SelectSVERegRegAddrMode<2>", []>;
7802 def am_sve_regreg_lsl3 : ComplexPattern<i64, 2, "SelectSVERegRegAddrMode<3>", []>;
7804 // Predicated pseudo floating point two operand instructions.
7805 multiclass sve_fp_bin_pred_hfd<SDPatternOperator op> {
7806 def _UNDEF_H : PredTwoOpPseudo<NAME # _H, ZPR16, FalseLanesUndef>;
7807 def _UNDEF_S : PredTwoOpPseudo<NAME # _S, ZPR32, FalseLanesUndef>;
7808 def _UNDEF_D : PredTwoOpPseudo<NAME # _D, ZPR64, FalseLanesUndef>;
7810 def : SVE_3_Op_Pat<nxv8f16, op, nxv8i1, nxv8f16, nxv8f16, !cast<Pseudo>(NAME # _UNDEF_H)>;
7811 def : SVE_3_Op_Pat<nxv4f32, op, nxv4i1, nxv4f32, nxv4f32, !cast<Pseudo>(NAME # _UNDEF_S)>;
7812 def : SVE_3_Op_Pat<nxv2f64, op, nxv2i1, nxv2f64, nxv2f64, !cast<Pseudo>(NAME # _UNDEF_D)>;
7815 // Predicated pseudo integer two operand instructions.
7816 multiclass sve_int_bin_pred_bhsd<SDPatternOperator op> {
7817 def _UNDEF_B : PredTwoOpPseudo<NAME # _B, ZPR8, FalseLanesUndef>;
7818 def _UNDEF_H : PredTwoOpPseudo<NAME # _H, ZPR16, FalseLanesUndef>;
7819 def _UNDEF_S : PredTwoOpPseudo<NAME # _S, ZPR32, FalseLanesUndef>;
7820 def _UNDEF_D : PredTwoOpPseudo<NAME # _D, ZPR64, FalseLanesUndef>;
7822 def : SVE_3_Op_Pat<nxv16i8, op, nxv16i1, nxv16i8, nxv16i8, !cast<Pseudo>(NAME # _UNDEF_B)>;
7823 def : SVE_3_Op_Pat<nxv8i16, op, nxv8i1, nxv8i16, nxv8i16, !cast<Pseudo>(NAME # _UNDEF_H)>;
7824 def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Pseudo>(NAME # _UNDEF_S)>;
7825 def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Pseudo>(NAME # _UNDEF_D)>;
7828 // As sve_int_bin_pred but when only i32 and i64 vector types are required.
7829 multiclass sve_int_bin_pred_sd<SDPatternOperator op> {
7830 def _UNDEF_S : PredTwoOpPseudo<NAME # _S, ZPR32, FalseLanesUndef>;
7831 def _UNDEF_D : PredTwoOpPseudo<NAME # _D, ZPR64, FalseLanesUndef>;
7833 def : SVE_3_Op_Pat<nxv4i32, op, nxv4i1, nxv4i32, nxv4i32, !cast<Pseudo>(NAME # _UNDEF_S)>;
7834 def : SVE_3_Op_Pat<nxv2i64, op, nxv2i1, nxv2i64, nxv2i64, !cast<Pseudo>(NAME # _UNDEF_D)>;