brintos

brintos / llvm-project-archived public Read only

0
0
Text · 87.8 KiB · cd94a25 Raw
2015 lines · plain
1//=- AArch64RegisterInfo.td - Describe the AArch64 Registers -*- tablegen -*-=//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9//10//===----------------------------------------------------------------------===//11 12 13class AArch64Reg<bits<16> enc, string n, list<Register> subregs = [],14               list<string> altNames = []>15        : Register<n, altNames> {16  let HWEncoding = enc;17  let Namespace = "AArch64";18  let SubRegs = subregs;19}20 21let Namespace = "AArch64" in {22  // SubRegIndexes for GPR registers23  def sub_32   : SubRegIndex<32>;24  def sube64   : SubRegIndex<64>;25  def subo64   : SubRegIndex<64>;26  def sube32   : SubRegIndex<32>;27  def subo32   : SubRegIndex<32>;28 29  // SubRegIndexes for FPR/Vector registers30  def bsub    : SubRegIndex<8, 0>;31  def hsub    : SubRegIndex<16, 0>;32  def ssub    : SubRegIndex<32, 0>;33  def dsub    : SubRegIndex<64, 0>;34  def zsub    : SubRegIndex<128, 0>;35 36  // The _hi SubRegIndexes describe the high bits of a register which are not37  // separately addressable. They need to be described so that partially38  // overlapping registers end up with a different lane mask. This is required39  // to enable subreg liveness tracking.40  //41  // For example: 8-bit B0 is a sub-register of 16-bit H0.42  // * B0 is described with 'bsub'.43  // * H0 is described with 'bsub + bsub_hi' == 'hsub'.44  def bsub_hi   : SubRegIndex<8, 8>;45  def hsub_hi   : SubRegIndex<16, 16>;46  def ssub_hi   : SubRegIndex<32, 32>;47  def dsub_hi   : SubRegIndex<64, 64>;48  def zsub_hi   : SubRegIndex<-1, 128>;49  // sub_32_hi describes the top 32 bits in e.g. X050  def sub_32_hi : SubRegIndex<32, 32>;51  // Note: Code depends on these having consecutive numbers52  def zsub0 : SubRegIndex<-1>;53  def zsub1 : SubRegIndex<-1>;54  def zsub2 : SubRegIndex<-1>;55  def zsub3 : SubRegIndex<-1>;56  // Note: Code depends on these having consecutive numbers57  def qsub0 : SubRegIndex<128>;58  def qsub1 : ComposedSubRegIndex<zsub1, zsub>;59  def qsub2 : ComposedSubRegIndex<zsub2, zsub>;60  def qsub3 : ComposedSubRegIndex<zsub3, zsub>;61  // Note: Code depends on these having consecutive numbers62  def dsub0 : SubRegIndex<64>;63  def dsub1 : ComposedSubRegIndex<qsub1, dsub>;64  def dsub2 : ComposedSubRegIndex<qsub2, dsub>;65  def dsub3 : ComposedSubRegIndex<qsub3, dsub>;66 67  // SubRegIndexes for SME Matrix tiles68  def zasubb  : SubRegIndex<2048>; // (16 x 16)/1 bytes  = 2048 bits69  def zasubh0 : SubRegIndex<1024>; // (16 x 16)/2 bytes  = 1024 bits70  def zasubh1 : SubRegIndex<1024>; // (16 x 16)/2 bytes  = 1024 bits71  def zasubs0 : SubRegIndex<512>;  // (16 x 16)/4 bytes  = 512 bits72  def zasubs1 : SubRegIndex<512>;  // (16 x 16)/4 bytes  = 512 bits73  def zasubd0 : SubRegIndex<256>;  // (16 x 16)/8 bytes  = 256 bits74  def zasubd1 : SubRegIndex<256>;  // (16 x 16)/8 bytes  = 256 bits75  def zasubq0 : SubRegIndex<128>;  // (16 x 16)/16 bytes = 128 bits76  def zasubq1 : SubRegIndex<128>;  // (16 x 16)/16 bytes = 128 bits77 78  // SubRegIndexes for SVE Predicates79  def psub  : SubRegIndex<-1>;80  // Note: Code depends on these having consecutive numbers81  def psub0 : SubRegIndex<-1>;82  def psub1 : SubRegIndex<-1>;83}84 85let Namespace = "AArch64" in {86  def vreg : RegAltNameIndex;87  def vlist1 : RegAltNameIndex;88}89 90//===----------------------------------------------------------------------===//91// Registers92//===----------------------------------------------------------------------===//93 94foreach i = 0-30 in {95  // Define W0_HI, W1_HI, .. W30_HI96  def W#i#_HI : AArch64Reg<-1,  "w"#i#"_hi"> { let isArtificial = 1; }97}98def WSP_HI : AArch64Reg<-1,  "wsp_hi"> { let isArtificial = 1; }99def WZR_HI : AArch64Reg<-1,  "wzr_hi"> { let isArtificial = 1; }100 101def W0    : AArch64Reg<0,   "w0" >, DwarfRegNum<[0]>;102def W1    : AArch64Reg<1,   "w1" >, DwarfRegNum<[1]>;103def W2    : AArch64Reg<2,   "w2" >, DwarfRegNum<[2]>;104def W3    : AArch64Reg<3,   "w3" >, DwarfRegNum<[3]>;105def W4    : AArch64Reg<4,   "w4" >, DwarfRegNum<[4]>;106def W5    : AArch64Reg<5,   "w5" >, DwarfRegNum<[5]>;107def W6    : AArch64Reg<6,   "w6" >, DwarfRegNum<[6]>;108def W7    : AArch64Reg<7,   "w7" >, DwarfRegNum<[7]>;109def W8    : AArch64Reg<8,   "w8" >, DwarfRegNum<[8]>;110def W9    : AArch64Reg<9,   "w9" >, DwarfRegNum<[9]>;111def W10   : AArch64Reg<10, "w10">, DwarfRegNum<[10]>;112def W11   : AArch64Reg<11, "w11">, DwarfRegNum<[11]>;113def W12   : AArch64Reg<12, "w12">, DwarfRegNum<[12]>;114def W13   : AArch64Reg<13, "w13">, DwarfRegNum<[13]>;115def W14   : AArch64Reg<14, "w14">, DwarfRegNum<[14]>;116def W15   : AArch64Reg<15, "w15">, DwarfRegNum<[15]>;117def W16   : AArch64Reg<16, "w16">, DwarfRegNum<[16]>;118def W17   : AArch64Reg<17, "w17">, DwarfRegNum<[17]>;119def W18   : AArch64Reg<18, "w18">, DwarfRegNum<[18]>;120def W19   : AArch64Reg<19, "w19">, DwarfRegNum<[19]>;121def W20   : AArch64Reg<20, "w20">, DwarfRegNum<[20]>;122def W21   : AArch64Reg<21, "w21">, DwarfRegNum<[21]>;123def W22   : AArch64Reg<22, "w22">, DwarfRegNum<[22]>;124def W23   : AArch64Reg<23, "w23">, DwarfRegNum<[23]>;125def W24   : AArch64Reg<24, "w24">, DwarfRegNum<[24]>;126def W25   : AArch64Reg<25, "w25">, DwarfRegNum<[25]>;127def W26   : AArch64Reg<26, "w26">, DwarfRegNum<[26]>;128def W27   : AArch64Reg<27, "w27">, DwarfRegNum<[27]>;129def W28   : AArch64Reg<28, "w28">, DwarfRegNum<[28]>;130def W29   : AArch64Reg<29, "w29">, DwarfRegNum<[29]>;131def W30   : AArch64Reg<30, "w30">, DwarfRegNum<[30]>;132def WSP   : AArch64Reg<31, "wsp">, DwarfRegNum<[31]>;133def WZR   : AArch64Reg<31, "wzr">, DwarfRegAlias<WSP> { let isConstant = true; }134 135let SubRegIndices = [sub_32, sub_32_hi], CoveredBySubRegs = 1 in {136def X0    : AArch64Reg<0,   "x0",  [W0,  W0_HI]>, DwarfRegAlias<W0>;137def X1    : AArch64Reg<1,   "x1",  [W1,  W1_HI]>, DwarfRegAlias<W1>;138def X2    : AArch64Reg<2,   "x2",  [W2,  W2_HI]>, DwarfRegAlias<W2>;139def X3    : AArch64Reg<3,   "x3",  [W3,  W3_HI]>, DwarfRegAlias<W3>;140def X4    : AArch64Reg<4,   "x4",  [W4,  W4_HI]>, DwarfRegAlias<W4>;141def X5    : AArch64Reg<5,   "x5",  [W5,  W5_HI]>, DwarfRegAlias<W5>;142def X6    : AArch64Reg<6,   "x6",  [W6,  W6_HI]>, DwarfRegAlias<W6>;143def X7    : AArch64Reg<7,   "x7",  [W7,  W7_HI]>, DwarfRegAlias<W7>;144def X8    : AArch64Reg<8,   "x8",  [W8,  W8_HI]>, DwarfRegAlias<W8>;145def X9    : AArch64Reg<9,   "x9",  [W9,  W9_HI]>, DwarfRegAlias<W9>;146def X10   : AArch64Reg<10, "x10", [W10, W10_HI]>, DwarfRegAlias<W10>;147def X11   : AArch64Reg<11, "x11", [W11, W11_HI]>, DwarfRegAlias<W11>;148def X12   : AArch64Reg<12, "x12", [W12, W12_HI]>, DwarfRegAlias<W12>;149def X13   : AArch64Reg<13, "x13", [W13, W13_HI]>, DwarfRegAlias<W13>;150def X14   : AArch64Reg<14, "x14", [W14, W14_HI]>, DwarfRegAlias<W14>;151def X15   : AArch64Reg<15, "x15", [W15, W15_HI]>, DwarfRegAlias<W15>;152def X16   : AArch64Reg<16, "x16", [W16, W16_HI]>, DwarfRegAlias<W16>;153def X17   : AArch64Reg<17, "x17", [W17, W17_HI]>, DwarfRegAlias<W17>;154def X18   : AArch64Reg<18, "x18", [W18, W18_HI]>, DwarfRegAlias<W18>;155def X19   : AArch64Reg<19, "x19", [W19, W19_HI]>, DwarfRegAlias<W19>;156def X20   : AArch64Reg<20, "x20", [W20, W20_HI]>, DwarfRegAlias<W20>;157def X21   : AArch64Reg<21, "x21", [W21, W21_HI]>, DwarfRegAlias<W21>;158def X22   : AArch64Reg<22, "x22", [W22, W22_HI]>, DwarfRegAlias<W22>;159def X23   : AArch64Reg<23, "x23", [W23, W23_HI]>, DwarfRegAlias<W23>;160def X24   : AArch64Reg<24, "x24", [W24, W24_HI]>, DwarfRegAlias<W24>;161def X25   : AArch64Reg<25, "x25", [W25, W25_HI]>, DwarfRegAlias<W25>;162def X26   : AArch64Reg<26, "x26", [W26, W26_HI]>, DwarfRegAlias<W26>;163def X27   : AArch64Reg<27, "x27", [W27, W27_HI]>, DwarfRegAlias<W27>;164def X28   : AArch64Reg<28, "x28", [W28, W28_HI]>, DwarfRegAlias<W28>;165def FP    : AArch64Reg<29, "x29", [W29, W29_HI]>, DwarfRegAlias<W29>;166def LR    : AArch64Reg<30, "x30", [W30, W30_HI]>, DwarfRegAlias<W30>;167def SP    : AArch64Reg<31, "sp",  [WSP, WSP_HI]>, DwarfRegAlias<WSP>;168def XZR   : AArch64Reg<31, "xzr", [WZR, WZR_HI]>, DwarfRegAlias<WSP> { let isConstant = true; }169}170 171// Condition code register.172def NZCV  : AArch64Reg<0, "nzcv">;173 174// First fault status register175def FFR : AArch64Reg<0, "ffr">, DwarfRegNum<[47]>;176 177// Purely virtual Vector Granule (VG) Dwarf register178def VG : AArch64Reg<0, "vg">, DwarfRegNum<[46]>;179 180// Floating-point control register181def FPCR : AArch64Reg<0, "fpcr">;182 183// Floating-point Mode Register184def FPMR : AArch64Reg<0, "fpmr">;185 186// Floating-point status register.187def FPSR : AArch64Reg<0, "fpsr">;188 189// GPR register classes with the intersections of GPR32/GPR32sp and190// GPR64/GPR64sp for use by the coalescer.191def GPR32common : RegisterClass<"AArch64", [i32], 32, (sequence "W%u", 0, 30)> {192  let AltOrders = [(rotl GPR32common, 8)];193  let AltOrderSelect = [{ return 1; }];194}195def GPR64common : RegisterClass<"AArch64", [i64], 64,196                                (add (sequence "X%u", 0, 28), FP, LR)> {197  let AltOrders = [(rotl GPR64common, 8)];198  let AltOrderSelect = [{ return 1; }];199  let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::GPR64commonRegClassID, 0, 31>";200}201// GPR register classes which exclude SP/WSP.202def GPR32 : RegisterClass<"AArch64", [i32], 32, (add GPR32common, WZR)> {203  let AltOrders = [(rotl GPR32, 8)];204  let AltOrderSelect = [{ return 1; }];205  let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::GPR32RegClassID, 0, 32>";206}207def GPR64 : RegisterClass<"AArch64", [i64], 64, (add GPR64common, XZR)> {208  let AltOrders = [(rotl GPR64, 8)];209  let AltOrderSelect = [{ return 1; }];210  let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::GPR64RegClassID, 0, 32>";211}212 213// GPR register classes which include SP/WSP.214def GPR32sp : RegisterClass<"AArch64", [i32], 32, (add GPR32common, WSP)> {215  let AltOrders = [(rotl GPR32sp, 8)];216  let AltOrderSelect = [{ return 1; }];217  let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::GPR32spRegClassID, 0, 32>";218}219def GPR64sp : RegisterClass<"AArch64", [i64], 64, (add GPR64common, SP)> {220  let AltOrders = [(rotl GPR64sp, 8)];221  let AltOrderSelect = [{ return 1; }];222  let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::GPR64spRegClassID,0, 32>";223}224 225def GPR32sponly : RegisterClass<"AArch64", [i32], 32, (add WSP)>;226def GPR64sponly : RegisterClass<"AArch64", [i64], 64, (add SP)>;227 228def GPR64spPlus0Operand : AsmOperandClass {229  let Name = "GPR64sp0";230  let RenderMethod = "addRegOperands";231  let PredicateMethod = "isGPR64<AArch64::GPR64spRegClassID>";232  let ParserMethod = "tryParseGPR64sp0Operand";233}234 235def GPR64sp0 : RegisterOperand<GPR64sp> {236  let ParserMatchClass = GPR64spPlus0Operand;237}238 239// GPR32/GPR64 but with zero-register substitution enabled.240// TODO: Roll this out to GPR32/GPR64/GPR32all/GPR64all.241def GPR32z : RegisterOperand<GPR32> {242  let GIZeroRegister = WZR;243}244def GPR64z : RegisterOperand<GPR64> {245  let GIZeroRegister = XZR;246}247 248// GPR argument registers.249def GPR32arg : RegisterClass<"AArch64", [i32], 32, (sequence "W%u", 0, 7)>;250def GPR64arg : RegisterClass<"AArch64", [i64], 64, (sequence "X%u", 0, 7)>;251 252// GPR register classes which include WZR/XZR AND SP/WSP. This is not a253// constraint used by any instructions, it is used as a common super-class.254def GPR32all : RegisterClass<"AArch64", [i32], 32, (add GPR32common, WZR, WSP)>;255def GPR64all : RegisterClass<"AArch64", [i64], 64, (add GPR64common, XZR, SP)>;256 257// For tail calls, we can't use callee-saved registers, as they are restored258// to the saved value before the tail call, which would clobber a call address.259// This is for indirect tail calls to store the address of the destination.260def tcGPR64 : RegisterClass<"AArch64", [i64], 64, (sub GPR64common, X19, X20, X21,261                                                     X22, X23, X24, X25, X26,262                                                     X27, X28, FP, LR)>;263 264// Restricted sets of tail call registers, for use when branch target265// enforcement or PAuthLR are enabled.266// For BTI, x16 and x17 are the only registers which can be used to indirectly267// branch (not call) to the "BTI c" instruction at the start of a BTI-protected268// function.269// For PAuthLR, x16 must be used in the function epilogue for other purposes,270// so cannot hold the function pointer.271def tcGPRx17 : RegisterClass<"AArch64", [i64], 64, (add X17)>;272def tcGPRx16x17 : RegisterClass<"AArch64", [i64], 64, (add X16, X17)>;273def tcGPRnotx16 : RegisterClass<"AArch64", [i64], 64, (sub tcGPR64, X16)>;274// LR checking code expects either x16 or x17 to be available as a scratch275// register - for that reason restrict one of two register operands of276// AUTH_TCRETURN* pseudos.277def tcGPRnotx16x17 : RegisterClass<"AArch64", [i64], 64, (sub tcGPR64, X16, X17)>;278 279// Register set that excludes registers that are reserved for procedure calls.280// This is used for pseudo-instructions that are actually implemented using a281// procedure call.282def GPR64noip : RegisterClass<"AArch64", [i64], 64, (sub GPR64, X16, X17, LR)> {283  let AltOrders = [(rotl GPR64noip, 8)];284  let AltOrderSelect = [{ return 1; }];285}286 287// GPR register classes for post increment amount of vector load/store that288// has alternate printing when Rm=31 and prints a constant immediate value289// equal to the total number of bytes transferred.290 291// FIXME: TableGen *should* be able to do these itself now. There appears to be292// a bug in counting how many operands a Post-indexed MCInst should have which293// means the aliases don't trigger.294def GPR64pi1  : RegisterOperand<GPR64, "printPostIncOperand<1>">;295def GPR64pi2  : RegisterOperand<GPR64, "printPostIncOperand<2>">;296def GPR64pi3  : RegisterOperand<GPR64, "printPostIncOperand<3>">;297def GPR64pi4  : RegisterOperand<GPR64, "printPostIncOperand<4>">;298def GPR64pi6  : RegisterOperand<GPR64, "printPostIncOperand<6>">;299def GPR64pi8  : RegisterOperand<GPR64, "printPostIncOperand<8>">;300def GPR64pi12 : RegisterOperand<GPR64, "printPostIncOperand<12>">;301def GPR64pi16 : RegisterOperand<GPR64, "printPostIncOperand<16>">;302def GPR64pi24 : RegisterOperand<GPR64, "printPostIncOperand<24>">;303def GPR64pi32 : RegisterOperand<GPR64, "printPostIncOperand<32>">;304def GPR64pi48 : RegisterOperand<GPR64, "printPostIncOperand<48>">;305def GPR64pi64 : RegisterOperand<GPR64, "printPostIncOperand<64>">;306 307// Condition code regclass.308defvar FlagsVT = i32;309def CCR : RegisterClass<"AArch64", [FlagsVT], 32, (add NZCV)> {310  let CopyCost = -1;  // Don't allow copying of status registers.311 312  // CCR is not allocatable.313  let isAllocatable = 0;314}315 316//===----------------------------------------------------------------------===//317// Floating Point Scalar Registers318//===----------------------------------------------------------------------===//319 320foreach i = 0-31 in {321  def B#i#_HI : AArch64Reg<-1,  "b"#i#"_hi"> { let isArtificial = 1; }322  def H#i#_HI : AArch64Reg<-1,  "h"#i#"_hi"> { let isArtificial = 1; }323  def S#i#_HI : AArch64Reg<-1,  "s"#i#"_hi"> { let isArtificial = 1; }324  def D#i#_HI : AArch64Reg<-1,  "d"#i#"_hi"> { let isArtificial = 1; }325  def Q#i#_HI : AArch64Reg<-1,  "q"#i#"_hi"> { let isArtificial = 1; }326}327 328def B0    : AArch64Reg<0,   "b0">, DwarfRegNum<[64]>;329def B1    : AArch64Reg<1,   "b1">, DwarfRegNum<[65]>;330def B2    : AArch64Reg<2,   "b2">, DwarfRegNum<[66]>;331def B3    : AArch64Reg<3,   "b3">, DwarfRegNum<[67]>;332def B4    : AArch64Reg<4,   "b4">, DwarfRegNum<[68]>;333def B5    : AArch64Reg<5,   "b5">, DwarfRegNum<[69]>;334def B6    : AArch64Reg<6,   "b6">, DwarfRegNum<[70]>;335def B7    : AArch64Reg<7,   "b7">, DwarfRegNum<[71]>;336def B8    : AArch64Reg<8,   "b8">, DwarfRegNum<[72]>;337def B9    : AArch64Reg<9,   "b9">, DwarfRegNum<[73]>;338def B10   : AArch64Reg<10, "b10">, DwarfRegNum<[74]>;339def B11   : AArch64Reg<11, "b11">, DwarfRegNum<[75]>;340def B12   : AArch64Reg<12, "b12">, DwarfRegNum<[76]>;341def B13   : AArch64Reg<13, "b13">, DwarfRegNum<[77]>;342def B14   : AArch64Reg<14, "b14">, DwarfRegNum<[78]>;343def B15   : AArch64Reg<15, "b15">, DwarfRegNum<[79]>;344def B16   : AArch64Reg<16, "b16">, DwarfRegNum<[80]>;345def B17   : AArch64Reg<17, "b17">, DwarfRegNum<[81]>;346def B18   : AArch64Reg<18, "b18">, DwarfRegNum<[82]>;347def B19   : AArch64Reg<19, "b19">, DwarfRegNum<[83]>;348def B20   : AArch64Reg<20, "b20">, DwarfRegNum<[84]>;349def B21   : AArch64Reg<21, "b21">, DwarfRegNum<[85]>;350def B22   : AArch64Reg<22, "b22">, DwarfRegNum<[86]>;351def B23   : AArch64Reg<23, "b23">, DwarfRegNum<[87]>;352def B24   : AArch64Reg<24, "b24">, DwarfRegNum<[88]>;353def B25   : AArch64Reg<25, "b25">, DwarfRegNum<[89]>;354def B26   : AArch64Reg<26, "b26">, DwarfRegNum<[90]>;355def B27   : AArch64Reg<27, "b27">, DwarfRegNum<[91]>;356def B28   : AArch64Reg<28, "b28">, DwarfRegNum<[92]>;357def B29   : AArch64Reg<29, "b29">, DwarfRegNum<[93]>;358def B30   : AArch64Reg<30, "b30">, DwarfRegNum<[94]>;359def B31   : AArch64Reg<31, "b31">, DwarfRegNum<[95]>;360 361let SubRegIndices = [bsub, bsub_hi] in {362def H0    : AArch64Reg<0,   "h0", [B0, B0_HI]>, DwarfRegAlias<B0>;363def H1    : AArch64Reg<1,   "h1", [B1, B1_HI]>, DwarfRegAlias<B1>;364def H2    : AArch64Reg<2,   "h2", [B2, B2_HI]>, DwarfRegAlias<B2>;365def H3    : AArch64Reg<3,   "h3", [B3, B3_HI]>, DwarfRegAlias<B3>;366def H4    : AArch64Reg<4,   "h4", [B4, B4_HI]>, DwarfRegAlias<B4>;367def H5    : AArch64Reg<5,   "h5", [B5, B5_HI]>, DwarfRegAlias<B5>;368def H6    : AArch64Reg<6,   "h6", [B6, B6_HI]>, DwarfRegAlias<B6>;369def H7    : AArch64Reg<7,   "h7", [B7, B7_HI]>, DwarfRegAlias<B7>;370def H8    : AArch64Reg<8,   "h8", [B8, B8_HI]>, DwarfRegAlias<B8>;371def H9    : AArch64Reg<9,   "h9", [B9, B9_HI]>, DwarfRegAlias<B9>;372def H10   : AArch64Reg<10, "h10", [B10, B10_HI]>, DwarfRegAlias<B10>;373def H11   : AArch64Reg<11, "h11", [B11, B11_HI]>, DwarfRegAlias<B11>;374def H12   : AArch64Reg<12, "h12", [B12, B12_HI]>, DwarfRegAlias<B12>;375def H13   : AArch64Reg<13, "h13", [B13, B13_HI]>, DwarfRegAlias<B13>;376def H14   : AArch64Reg<14, "h14", [B14, B14_HI]>, DwarfRegAlias<B14>;377def H15   : AArch64Reg<15, "h15", [B15, B15_HI]>, DwarfRegAlias<B15>;378def H16   : AArch64Reg<16, "h16", [B16, B16_HI]>, DwarfRegAlias<B16>;379def H17   : AArch64Reg<17, "h17", [B17, B17_HI]>, DwarfRegAlias<B17>;380def H18   : AArch64Reg<18, "h18", [B18, B18_HI]>, DwarfRegAlias<B18>;381def H19   : AArch64Reg<19, "h19", [B19, B19_HI]>, DwarfRegAlias<B19>;382def H20   : AArch64Reg<20, "h20", [B20, B20_HI]>, DwarfRegAlias<B20>;383def H21   : AArch64Reg<21, "h21", [B21, B21_HI]>, DwarfRegAlias<B21>;384def H22   : AArch64Reg<22, "h22", [B22, B22_HI]>, DwarfRegAlias<B22>;385def H23   : AArch64Reg<23, "h23", [B23, B23_HI]>, DwarfRegAlias<B23>;386def H24   : AArch64Reg<24, "h24", [B24, B24_HI]>, DwarfRegAlias<B24>;387def H25   : AArch64Reg<25, "h25", [B25, B25_HI]>, DwarfRegAlias<B25>;388def H26   : AArch64Reg<26, "h26", [B26, B26_HI]>, DwarfRegAlias<B26>;389def H27   : AArch64Reg<27, "h27", [B27, B27_HI]>, DwarfRegAlias<B27>;390def H28   : AArch64Reg<28, "h28", [B28, B28_HI]>, DwarfRegAlias<B28>;391def H29   : AArch64Reg<29, "h29", [B29, B29_HI]>, DwarfRegAlias<B29>;392def H30   : AArch64Reg<30, "h30", [B30, B30_HI]>, DwarfRegAlias<B30>;393def H31   : AArch64Reg<31, "h31", [B31, B31_HI]>, DwarfRegAlias<B31>;394}395 396let SubRegIndices = [hsub, hsub_hi] in {397def S0    : AArch64Reg<0,   "s0", [H0, H0_HI]>, DwarfRegAlias<B0>;398def S1    : AArch64Reg<1,   "s1", [H1, H1_HI]>, DwarfRegAlias<B1>;399def S2    : AArch64Reg<2,   "s2", [H2, H2_HI]>, DwarfRegAlias<B2>;400def S3    : AArch64Reg<3,   "s3", [H3, H3_HI]>, DwarfRegAlias<B3>;401def S4    : AArch64Reg<4,   "s4", [H4, H4_HI]>, DwarfRegAlias<B4>;402def S5    : AArch64Reg<5,   "s5", [H5, H5_HI]>, DwarfRegAlias<B5>;403def S6    : AArch64Reg<6,   "s6", [H6, H6_HI]>, DwarfRegAlias<B6>;404def S7    : AArch64Reg<7,   "s7", [H7, H7_HI]>, DwarfRegAlias<B7>;405def S8    : AArch64Reg<8,   "s8", [H8, H8_HI]>, DwarfRegAlias<B8>;406def S9    : AArch64Reg<9,   "s9", [H9, H9_HI]>, DwarfRegAlias<B9>;407def S10   : AArch64Reg<10, "s10", [H10, H10_HI]>, DwarfRegAlias<B10>;408def S11   : AArch64Reg<11, "s11", [H11, H11_HI]>, DwarfRegAlias<B11>;409def S12   : AArch64Reg<12, "s12", [H12, H12_HI]>, DwarfRegAlias<B12>;410def S13   : AArch64Reg<13, "s13", [H13, H13_HI]>, DwarfRegAlias<B13>;411def S14   : AArch64Reg<14, "s14", [H14, H14_HI]>, DwarfRegAlias<B14>;412def S15   : AArch64Reg<15, "s15", [H15, H15_HI]>, DwarfRegAlias<B15>;413def S16   : AArch64Reg<16, "s16", [H16, H16_HI]>, DwarfRegAlias<B16>;414def S17   : AArch64Reg<17, "s17", [H17, H17_HI]>, DwarfRegAlias<B17>;415def S18   : AArch64Reg<18, "s18", [H18, H18_HI]>, DwarfRegAlias<B18>;416def S19   : AArch64Reg<19, "s19", [H19, H19_HI]>, DwarfRegAlias<B19>;417def S20   : AArch64Reg<20, "s20", [H20, H20_HI]>, DwarfRegAlias<B20>;418def S21   : AArch64Reg<21, "s21", [H21, H21_HI]>, DwarfRegAlias<B21>;419def S22   : AArch64Reg<22, "s22", [H22, H22_HI]>, DwarfRegAlias<B22>;420def S23   : AArch64Reg<23, "s23", [H23, H23_HI]>, DwarfRegAlias<B23>;421def S24   : AArch64Reg<24, "s24", [H24, H24_HI]>, DwarfRegAlias<B24>;422def S25   : AArch64Reg<25, "s25", [H25, H25_HI]>, DwarfRegAlias<B25>;423def S26   : AArch64Reg<26, "s26", [H26, H26_HI]>, DwarfRegAlias<B26>;424def S27   : AArch64Reg<27, "s27", [H27, H27_HI]>, DwarfRegAlias<B27>;425def S28   : AArch64Reg<28, "s28", [H28, H28_HI]>, DwarfRegAlias<B28>;426def S29   : AArch64Reg<29, "s29", [H29, H29_HI]>, DwarfRegAlias<B29>;427def S30   : AArch64Reg<30, "s30", [H30, H30_HI]>, DwarfRegAlias<B30>;428def S31   : AArch64Reg<31, "s31", [H31, H31_HI]>, DwarfRegAlias<B31>;429}430 431let SubRegIndices = [ssub, ssub_hi], RegAltNameIndices = [vreg, vlist1] in {432def D0    : AArch64Reg<0,   "d0", [S0, S0_HI], ["v0", ""]>, DwarfRegAlias<B0>;433def D1    : AArch64Reg<1,   "d1", [S1, S1_HI], ["v1", ""]>, DwarfRegAlias<B1>;434def D2    : AArch64Reg<2,   "d2", [S2, S2_HI], ["v2", ""]>, DwarfRegAlias<B2>;435def D3    : AArch64Reg<3,   "d3", [S3, S3_HI], ["v3", ""]>, DwarfRegAlias<B3>;436def D4    : AArch64Reg<4,   "d4", [S4, S4_HI], ["v4", ""]>, DwarfRegAlias<B4>;437def D5    : AArch64Reg<5,   "d5", [S5, S5_HI], ["v5", ""]>, DwarfRegAlias<B5>;438def D6    : AArch64Reg<6,   "d6", [S6, S6_HI], ["v6", ""]>, DwarfRegAlias<B6>;439def D7    : AArch64Reg<7,   "d7", [S7, S7_HI], ["v7", ""]>, DwarfRegAlias<B7>;440def D8    : AArch64Reg<8,   "d8", [S8, S8_HI], ["v8", ""]>, DwarfRegAlias<B8>;441def D9    : AArch64Reg<9,   "d9", [S9, S9_HI], ["v9", ""]>, DwarfRegAlias<B9>;442def D10   : AArch64Reg<10, "d10", [S10, S10_HI], ["v10", ""]>, DwarfRegAlias<B10>;443def D11   : AArch64Reg<11, "d11", [S11, S11_HI], ["v11", ""]>, DwarfRegAlias<B11>;444def D12   : AArch64Reg<12, "d12", [S12, S12_HI], ["v12", ""]>, DwarfRegAlias<B12>;445def D13   : AArch64Reg<13, "d13", [S13, S13_HI], ["v13", ""]>, DwarfRegAlias<B13>;446def D14   : AArch64Reg<14, "d14", [S14, S14_HI], ["v14", ""]>, DwarfRegAlias<B14>;447def D15   : AArch64Reg<15, "d15", [S15, S15_HI], ["v15", ""]>, DwarfRegAlias<B15>;448def D16   : AArch64Reg<16, "d16", [S16, S16_HI], ["v16", ""]>, DwarfRegAlias<B16>;449def D17   : AArch64Reg<17, "d17", [S17, S17_HI], ["v17", ""]>, DwarfRegAlias<B17>;450def D18   : AArch64Reg<18, "d18", [S18, S18_HI], ["v18", ""]>, DwarfRegAlias<B18>;451def D19   : AArch64Reg<19, "d19", [S19, S19_HI], ["v19", ""]>, DwarfRegAlias<B19>;452def D20   : AArch64Reg<20, "d20", [S20, S20_HI], ["v20", ""]>, DwarfRegAlias<B20>;453def D21   : AArch64Reg<21, "d21", [S21, S21_HI], ["v21", ""]>, DwarfRegAlias<B21>;454def D22   : AArch64Reg<22, "d22", [S22, S22_HI], ["v22", ""]>, DwarfRegAlias<B22>;455def D23   : AArch64Reg<23, "d23", [S23, S23_HI], ["v23", ""]>, DwarfRegAlias<B23>;456def D24   : AArch64Reg<24, "d24", [S24, S24_HI], ["v24", ""]>, DwarfRegAlias<B24>;457def D25   : AArch64Reg<25, "d25", [S25, S25_HI], ["v25", ""]>, DwarfRegAlias<B25>;458def D26   : AArch64Reg<26, "d26", [S26, S26_HI], ["v26", ""]>, DwarfRegAlias<B26>;459def D27   : AArch64Reg<27, "d27", [S27, S27_HI], ["v27", ""]>, DwarfRegAlias<B27>;460def D28   : AArch64Reg<28, "d28", [S28, S28_HI], ["v28", ""]>, DwarfRegAlias<B28>;461def D29   : AArch64Reg<29, "d29", [S29, S29_HI], ["v29", ""]>, DwarfRegAlias<B29>;462def D30   : AArch64Reg<30, "d30", [S30, S30_HI], ["v30", ""]>, DwarfRegAlias<B30>;463def D31   : AArch64Reg<31, "d31", [S31, S31_HI], ["v31", ""]>, DwarfRegAlias<B31>;464}465 466let SubRegIndices = [dsub, dsub_hi], RegAltNameIndices = [vreg, vlist1] in {467def Q0    : AArch64Reg<0,   "q0", [D0, D0_HI], ["v0", ""]>, DwarfRegAlias<B0>;468def Q1    : AArch64Reg<1,   "q1", [D1, D1_HI], ["v1", ""]>, DwarfRegAlias<B1>;469def Q2    : AArch64Reg<2,   "q2", [D2, D2_HI], ["v2", ""]>, DwarfRegAlias<B2>;470def Q3    : AArch64Reg<3,   "q3", [D3, D3_HI], ["v3", ""]>, DwarfRegAlias<B3>;471def Q4    : AArch64Reg<4,   "q4", [D4, D4_HI], ["v4", ""]>, DwarfRegAlias<B4>;472def Q5    : AArch64Reg<5,   "q5", [D5, D5_HI], ["v5", ""]>, DwarfRegAlias<B5>;473def Q6    : AArch64Reg<6,   "q6", [D6, D6_HI], ["v6", ""]>, DwarfRegAlias<B6>;474def Q7    : AArch64Reg<7,   "q7", [D7, D7_HI], ["v7", ""]>, DwarfRegAlias<B7>;475def Q8    : AArch64Reg<8,   "q8", [D8, D8_HI], ["v8", ""]>, DwarfRegAlias<B8>;476def Q9    : AArch64Reg<9,   "q9", [D9, D9_HI], ["v9", ""]>, DwarfRegAlias<B9>;477def Q10   : AArch64Reg<10, "q10", [D10, D10_HI], ["v10", ""]>, DwarfRegAlias<B10>;478def Q11   : AArch64Reg<11, "q11", [D11, D11_HI], ["v11", ""]>, DwarfRegAlias<B11>;479def Q12   : AArch64Reg<12, "q12", [D12, D12_HI], ["v12", ""]>, DwarfRegAlias<B12>;480def Q13   : AArch64Reg<13, "q13", [D13, D13_HI], ["v13", ""]>, DwarfRegAlias<B13>;481def Q14   : AArch64Reg<14, "q14", [D14, D14_HI], ["v14", ""]>, DwarfRegAlias<B14>;482def Q15   : AArch64Reg<15, "q15", [D15, D15_HI], ["v15", ""]>, DwarfRegAlias<B15>;483def Q16   : AArch64Reg<16, "q16", [D16, D16_HI], ["v16", ""]>, DwarfRegAlias<B16>;484def Q17   : AArch64Reg<17, "q17", [D17, D17_HI], ["v17", ""]>, DwarfRegAlias<B17>;485def Q18   : AArch64Reg<18, "q18", [D18, D18_HI], ["v18", ""]>, DwarfRegAlias<B18>;486def Q19   : AArch64Reg<19, "q19", [D19, D19_HI], ["v19", ""]>, DwarfRegAlias<B19>;487def Q20   : AArch64Reg<20, "q20", [D20, D20_HI], ["v20", ""]>, DwarfRegAlias<B20>;488def Q21   : AArch64Reg<21, "q21", [D21, D21_HI], ["v21", ""]>, DwarfRegAlias<B21>;489def Q22   : AArch64Reg<22, "q22", [D22, D22_HI], ["v22", ""]>, DwarfRegAlias<B22>;490def Q23   : AArch64Reg<23, "q23", [D23, D23_HI], ["v23", ""]>, DwarfRegAlias<B23>;491def Q24   : AArch64Reg<24, "q24", [D24, D24_HI], ["v24", ""]>, DwarfRegAlias<B24>;492def Q25   : AArch64Reg<25, "q25", [D25, D25_HI], ["v25", ""]>, DwarfRegAlias<B25>;493def Q26   : AArch64Reg<26, "q26", [D26, D26_HI], ["v26", ""]>, DwarfRegAlias<B26>;494def Q27   : AArch64Reg<27, "q27", [D27, D27_HI], ["v27", ""]>, DwarfRegAlias<B27>;495def Q28   : AArch64Reg<28, "q28", [D28, D28_HI], ["v28", ""]>, DwarfRegAlias<B28>;496def Q29   : AArch64Reg<29, "q29", [D29, D29_HI], ["v29", ""]>, DwarfRegAlias<B29>;497def Q30   : AArch64Reg<30, "q30", [D30, D30_HI], ["v30", ""]>, DwarfRegAlias<B30>;498def Q31   : AArch64Reg<31, "q31", [D31, D31_HI], ["v31", ""]>, DwarfRegAlias<B31>;499}500 501def FPR8  : RegisterClass<"AArch64", [i8, aarch64mfp8], 8, (sequence "B%u", 0, 31)> {502  let Size = 8;503  let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::FPR8RegClassID, 0, 32>";504}505def FPR16 : RegisterClass<"AArch64", [f16, bf16, i16], 16, (sequence "H%u", 0, 31)> {506  let Size = 16;507  let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::FPR16RegClassID, 0, 32>";508}509 510def FPR16_lo : RegisterClass<"AArch64", [f16], 16, (trunc FPR16, 16)> {511  let Size = 16;512}513def FPR32 : RegisterClass<"AArch64", [f32, i32], 32,(sequence "S%u", 0, 31)> {514  let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::FPR32RegClassID, 0, 32>";515}516def FPR64 : RegisterClass<"AArch64", [f64, i64, v2f32, v1f64, v8i8, v4i16, v2i32,517                                      v1i64, v4f16, v4bf16],518                                     64, (sequence "D%u", 0, 31)> {519  let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::FPR64RegClassID, 0, 32>";520}521def FPR64_lo : RegisterClass<"AArch64",522                             [v8i8, v4i16, v2i32, v1i64, v4f16, v4bf16, v2f32,523                              v1f64],524                             64, (trunc FPR64, 16)>;525 526// We don't (yet) have an f128 legal type, so don't use that here. We527// normalize 128-bit vectors to v2f64 for arg passing and such, so use528// that here.529def FPR128 : RegisterClass<"AArch64",530                           [v16i8, v8i16, v4i32, v2i64, v4f32, v2f64, f128,531                            v8f16, v8bf16],532                           128, (sequence "Q%u", 0, 31)> {533  let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::FPR128RegClassID, 0, 32>";534}535 536// The lower 16 vector registers.  Some instructions can only take registers537// in this range.538def FPR128_lo : RegisterClass<"AArch64",539                              [v16i8, v8i16, v4i32, v2i64, v4f32, v2f64, v8f16,540                               v8bf16],541                              128, (trunc FPR128, 16)> {542  let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::FPR128RegClassID, 0, 16>";543}544 545// The lower 8 vector registers.  Some instructions can only take registers546// in this range.547def FPR128_0to7 : RegisterClass<"AArch64",548                                [v16i8, v8i16, v4i32, v2i64, v4f32, v2f64, v8f16,549                                 v8bf16],550                                128, (trunc FPR128, 8)> {551  let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::FPR128RegClassID, 0, 8>";552}553 554// Pairs, triples, and quads of 64-bit vector registers.555def DSeqPairs : RegisterTuples<[dsub0, dsub1], [(rotl FPR64, 0), (rotl FPR64, 1)]>;556def DSeqTriples : RegisterTuples<[dsub0, dsub1, dsub2],557                                 [(rotl FPR64, 0), (rotl FPR64, 1),558                                  (rotl FPR64, 2)]>;559def DSeqQuads : RegisterTuples<[dsub0, dsub1, dsub2, dsub3],560                               [(rotl FPR64, 0), (rotl FPR64, 1),561                                (rotl FPR64, 2), (rotl FPR64, 3)]>;562def DD   : RegisterClass<"AArch64", [untyped], 64, (add DSeqPairs)> {563  let Size = 128;564  let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::DDRegClassID, 0, 32>";565}566def DDD  : RegisterClass<"AArch64", [untyped], 64, (add DSeqTriples)> {567  let Size = 192;568  let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::DDDRegClassID, 0, 32>";569}570def DDDD : RegisterClass<"AArch64", [untyped], 64, (add DSeqQuads)> {571  let Size = 256;572  let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::DDDDRegClassID, 0, 32>";573}574 575// Pairs, triples, and quads of 128-bit vector registers.576def QSeqPairs : RegisterTuples<[qsub0, qsub1], [(rotl FPR128, 0), (rotl FPR128, 1)]>;577def QSeqTriples : RegisterTuples<[qsub0, qsub1, qsub2],578                                 [(rotl FPR128, 0), (rotl FPR128, 1),579                                  (rotl FPR128, 2)]>;580def QSeqQuads : RegisterTuples<[qsub0, qsub1, qsub2, qsub3],581                               [(rotl FPR128, 0), (rotl FPR128, 1),582                                (rotl FPR128, 2), (rotl FPR128, 3)]>;583def QQ   : RegisterClass<"AArch64", [untyped], 128, (add QSeqPairs)> {584  let Size = 256;585  let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::QQRegClassID, 0, 32>";586}587def QQQ  : RegisterClass<"AArch64", [untyped], 128, (add QSeqTriples)> {588  let Size = 384;589  let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::QQQRegClassID, 0, 32>";590}591def QQQQ : RegisterClass<"AArch64", [untyped], 128, (add QSeqQuads)> {592  let Size = 512;593  let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::QQQQRegClassID, 0, 32>";594}595 596 597// Vector operand versions of the FP registers. Alternate name printing and598// assembler matching.599def VectorReg64AsmOperand : AsmOperandClass {600  let Name = "VectorReg64";601  let PredicateMethod = "isNeonVectorReg";602}603def VectorReg128AsmOperand : AsmOperandClass {604  let Name = "VectorReg128";605  let PredicateMethod = "isNeonVectorReg";606}607 608def V64  : RegisterOperand<FPR64, "printVRegOperand"> {609  let ParserMatchClass = VectorReg64AsmOperand;610}611 612def V128 : RegisterOperand<FPR128, "printVRegOperand"> {613  let ParserMatchClass = VectorReg128AsmOperand;614}615 616def VectorRegLoAsmOperand : AsmOperandClass {617  let Name = "VectorRegLo";618  let PredicateMethod = "isNeonVectorRegLo";619}620def V64_lo : RegisterOperand<FPR64_lo, "printVRegOperand"> {621  let ParserMatchClass = VectorRegLoAsmOperand;622}623def V128_lo : RegisterOperand<FPR128_lo, "printVRegOperand"> {624  let ParserMatchClass = VectorRegLoAsmOperand;625}626 627def VectorReg0to7AsmOperand : AsmOperandClass {628  let Name = "VectorReg0to7";629  let PredicateMethod = "isNeonVectorReg0to7";630}631 632def V128_0to7 : RegisterOperand<FPR128_0to7, "printVRegOperand"> {633  let ParserMatchClass = VectorReg0to7AsmOperand;634}635 636class TypedVecListAsmOperand<int count, string vecty, int lanes, int eltsize>637    : AsmOperandClass {638  let Name = "TypedVectorList" # count # "_" # lanes # eltsize;639 640  let PredicateMethod641      = "isTypedVectorList<RegKind::NeonVector, " # count # ", " # lanes # ", " # eltsize # ">";642  let RenderMethod = "addVectorListOperands<" # vecty  # ", "  # count # ">";643}644 645class TypedVecListRegOperand<RegisterClass Reg, int lanes, string eltsize>646    : RegisterOperand<Reg, "printTypedVectorList<" # lanes # ", '"647                                                   # eltsize # "'>">;648 649multiclass VectorList<int count, RegisterClass Reg64, RegisterClass Reg128> {650  // With implicit types (probably on instruction instead). E.g. { v0, v1 } or {v0, v2, v4}.651  def _64AsmOperand : AsmOperandClass {652    let Name = NAME # "64";653    let PredicateMethod = "isImplicitlyTypedVectorList<RegKind::NeonVector, " # count # ">";654    let RenderMethod = "addVectorListOperands<AArch64Operand::VecListIdx_DReg, " # count # ">";655  }656 657  def "64" : RegisterOperand<Reg64, "printImplicitlyTypedVectorList"> {658    let ParserMatchClass = !cast<AsmOperandClass>(NAME # "_64AsmOperand");659  }660 661  def _128AsmOperand : AsmOperandClass {662    let Name = NAME # "128";663    let PredicateMethod = "isImplicitlyTypedVectorList<RegKind::NeonVector, " # count # ">";664    let RenderMethod = "addVectorListOperands<AArch64Operand::VecListIdx_QReg, " # count # ">";665  }666 667  def "128" : RegisterOperand<Reg128, "printImplicitlyTypedVectorList"> {668    let ParserMatchClass = !cast<AsmOperandClass>(NAME # "_128AsmOperand");669  }670 671  // With implicit types (probably on instruction instead), consecutive registers. E.g. { v0, v1, v2 }672  def _Consecutive128AsmOperand : AsmOperandClass {673    let Name = NAME # "Consecutive128";674    let PredicateMethod = "isImplicitlyTypedVectorList<RegKind::NeonVector, " # count # ", true>";675    let RenderMethod = "addVectorListOperands<AArch64Operand::VecListIdx_QReg, " # count # ", true>";676  }677 678  def "Consecutive128" : RegisterOperand<Reg128, "printImplicitlyTypedVectorList"> {679    let ParserMatchClass = !cast<AsmOperandClass>(NAME # "_Consecutive128AsmOperand");680  }681 682  // 64-bit register lists with explicit type.683 684  // { v0.8b, v1.8b }685  def _8bAsmOperand : TypedVecListAsmOperand<count, "AArch64Operand::VecListIdx_DReg", 8, 8>;686  def "8b" : TypedVecListRegOperand<Reg64, 8, "b"> {687    let ParserMatchClass = !cast<AsmOperandClass>(NAME # "_8bAsmOperand");688  }689 690  // { v0.4h, v1.4h }691  def _4hAsmOperand : TypedVecListAsmOperand<count, "AArch64Operand::VecListIdx_DReg", 4, 16>;692  def "4h" : TypedVecListRegOperand<Reg64, 4, "h"> {693    let ParserMatchClass = !cast<AsmOperandClass>(NAME # "_4hAsmOperand");694  }695 696  // { v0.2s, v1.2s }697  def _2sAsmOperand : TypedVecListAsmOperand<count, "AArch64Operand::VecListIdx_DReg", 2, 32>;698  def "2s" : TypedVecListRegOperand<Reg64, 2, "s"> {699    let ParserMatchClass = !cast<AsmOperandClass>(NAME # "_2sAsmOperand");700  }701 702  // { v0.1d, v1.1d }703  def _1dAsmOperand : TypedVecListAsmOperand<count, "AArch64Operand::VecListIdx_DReg", 1, 64>;704  def "1d" : TypedVecListRegOperand<Reg64, 1, "d"> {705    let ParserMatchClass = !cast<AsmOperandClass>(NAME # "_1dAsmOperand");706  }707 708  // 128-bit register lists with explicit type709 710  // { v0.16b, v1.16b }711  def _16bAsmOperand : TypedVecListAsmOperand<count, "AArch64Operand::VecListIdx_QReg", 16, 8>;712  def "16b" : TypedVecListRegOperand<Reg128, 16, "b"> {713    let ParserMatchClass = !cast<AsmOperandClass>(NAME # "_16bAsmOperand");714  }715 716  // { v0.8h, v1.8h }717  def _8hAsmOperand : TypedVecListAsmOperand<count, "AArch64Operand::VecListIdx_QReg", 8, 16>;718  def "8h" : TypedVecListRegOperand<Reg128, 8, "h"> {719    let ParserMatchClass = !cast<AsmOperandClass>(NAME # "_8hAsmOperand");720  }721 722  // { v0.4s, v1.4s }723  def _4sAsmOperand : TypedVecListAsmOperand<count, "AArch64Operand::VecListIdx_QReg", 4, 32>;724  def "4s" : TypedVecListRegOperand<Reg128, 4, "s"> {725    let ParserMatchClass = !cast<AsmOperandClass>(NAME # "_4sAsmOperand");726  }727 728  // { v0.2d, v1.2d }729  def _2dAsmOperand : TypedVecListAsmOperand<count, "AArch64Operand::VecListIdx_QReg", 2, 64>;730  def "2d" : TypedVecListRegOperand<Reg128, 2, "d"> {731    let ParserMatchClass = !cast<AsmOperandClass>(NAME # "_2dAsmOperand");732  }733 734  // { v0.b, v1.b }735  def _bAsmOperand : TypedVecListAsmOperand<count, "AArch64Operand::VecListIdx_QReg", 0, 8>;736  def "b" : TypedVecListRegOperand<Reg128, 0, "b"> {737    let ParserMatchClass = !cast<AsmOperandClass>(NAME # "_bAsmOperand");738  }739 740  // { v0.h, v1.h }741  def _hAsmOperand : TypedVecListAsmOperand<count, "AArch64Operand::VecListIdx_QReg", 0, 16>;742  def "h" : TypedVecListRegOperand<Reg128, 0, "h"> {743    let ParserMatchClass = !cast<AsmOperandClass>(NAME # "_hAsmOperand");744  }745 746  // { v0.s, v1.s }747  def _sAsmOperand : TypedVecListAsmOperand<count, "AArch64Operand::VecListIdx_QReg", 0, 32>;748  def "s" : TypedVecListRegOperand<Reg128, 0, "s"> {749    let ParserMatchClass = !cast<AsmOperandClass>(NAME # "_sAsmOperand");750  }751 752  // { v0.d, v1.d }753  def _dAsmOperand : TypedVecListAsmOperand<count, "AArch64Operand::VecListIdx_QReg", 0, 64>;754  def "d" : TypedVecListRegOperand<Reg128, 0, "d"> {755    let ParserMatchClass = !cast<AsmOperandClass>(NAME # "_dAsmOperand");756  }757 758 759}760 761defm VecListOne   : VectorList<1, FPR64, FPR128>;762defm VecListTwo   : VectorList<2, DD,    QQ>;763defm VecListThree : VectorList<3, DDD,   QQQ>;764defm VecListFour  : VectorList<4, DDDD,  QQQQ>;765 766class FPRAsmOperand<string RC> : AsmOperandClass {767  let Name = "FPRAsmOperand" # RC;768  let PredicateMethod = "isGPR64<AArch64::" # RC # "RegClassID>";769  let RenderMethod = "addRegOperands";770}771 772// Register operand versions of the scalar FP registers.773def FPR8Op  : RegisterOperand<FPR8, "printOperand"> {774  let ParserMatchClass = FPRAsmOperand<"FPR8">;775}776 777def FPR16Op  : RegisterOperand<FPR16, "printOperand"> {778  let ParserMatchClass = FPRAsmOperand<"FPR16">;779}780 781def FPR16Op_lo  : RegisterOperand<FPR16_lo, "printOperand"> {782  let ParserMatchClass = FPRAsmOperand<"FPR16_lo">;783}784 785def FPR32Op  : RegisterOperand<FPR32, "printOperand"> {786  let ParserMatchClass = FPRAsmOperand<"FPR32">;787}788 789def FPR64Op  : RegisterOperand<FPR64, "printOperand"> {790  let ParserMatchClass = FPRAsmOperand<"FPR64">;791}792 793def FPR128Op : RegisterOperand<FPR128, "printOperand"> {794  let ParserMatchClass = FPRAsmOperand<"FPR128">;795}796 797//===----------------------------------------------------------------------===//798// ARMv8.1a atomic CASP register operands799 800 801def WSeqPairs : RegisterTuples<[sube32, subo32],802                               [(decimate (rotl GPR32, 0), 2),803                                (decimate (rotl GPR32, 1), 2)]>;804def XSeqPairs : RegisterTuples<[sube64, subo64],805                               [(decimate (rotl GPR64, 0), 2),806                                (decimate (rotl GPR64, 1), 2)]>;807 808def WSeqPairsClass   : RegisterClass<"AArch64", [untyped], 32,809                                     (add WSeqPairs)>{810  let Size = 64;811}812def XSeqPairsClass   : RegisterClass<"AArch64", [untyped], 64,813                                     (add XSeqPairs)>{814  let Size = 128;815}816 817 818let RenderMethod = "addRegOperands", ParserMethod="tryParseGPRSeqPair" in {819  def WSeqPairsAsmOperandClass : AsmOperandClass { let Name = "WSeqPair"; }820  def XSeqPairsAsmOperandClass : AsmOperandClass { let Name = "XSeqPair"; }821}822 823def WSeqPairClassOperand :824    RegisterOperand<WSeqPairsClass, "printGPRSeqPairsClassOperand<32>"> {825  let ParserMatchClass = WSeqPairsAsmOperandClass;826}827def XSeqPairClassOperand :828    RegisterOperand<XSeqPairsClass, "printGPRSeqPairsClassOperand<64>"> {829  let ParserMatchClass = XSeqPairsAsmOperandClass;830}831// Reuse the parsing and register numbers from XSeqPairs, but encoding is different.832def MrrsMssrPairClassOperand :833    RegisterOperand<XSeqPairsClass, "printGPRSeqPairsClassOperand<64>"> {834  let ParserMatchClass = XSeqPairsAsmOperandClass;835}836def SyspXzrPairOperandMatcherClass : AsmOperandClass {837  let Name = "SyspXzrPair";838  let RenderMethod = "addSyspXzrPairOperand";839  let ParserMethod = "tryParseSyspXzrPair";840}841def SyspXzrPairOperand :842    RegisterOperand<GPR64, "printSyspXzrPair"> { // needed to allow alias with XZR operand843  let ParserMatchClass = SyspXzrPairOperandMatcherClass;844}845 846 847 848//===----- END: v8.1a atomic CASP register operands -----------------------===//849 850//===----------------------------------------------------------------------===//851// Armv8.7a accelerator extension register operands: 8 consecutive GPRs852// starting with an even one853 854let Namespace = "AArch64" in {855  foreach i = 0-7 in856    def "x8sub_"#i : SubRegIndex<64, !mul(64, i)>;857}858 859def Tuples8X : RegisterTuples<860  !foreach(i, [0,1,2,3,4,5,6,7], !cast<SubRegIndex>("x8sub_"#i)),861  !foreach(i, [0,1,2,3,4,5,6,7], (trunc (decimate (rotl GPR64, i), 2), 12))>;862 863def GPR64x8Class : RegisterClass<"AArch64", [i64x8], 512, (trunc Tuples8X, 12)> {864  let Size = 512;865}866def GPR64x8AsmOp : AsmOperandClass {867  let Name = "GPR64x8";868  let ParserMethod = "tryParseGPR64x8";869  let RenderMethod = "addRegOperands";870}871def GPR64x8 : RegisterOperand<GPR64x8Class, "printGPR64x8"> {872  let ParserMatchClass = GPR64x8AsmOp;873  let PrintMethod = "printGPR64x8";874}875 876//===----- END: v8.7a accelerator extension register operands -------------===//877 878// SVE predicate-as-counter registers879  def PN0    : AArch64Reg<0,   "pn0">, DwarfRegNum<[48]>;880  def PN1    : AArch64Reg<1,   "pn1">, DwarfRegNum<[49]>;881  def PN2    : AArch64Reg<2,   "pn2">, DwarfRegNum<[50]>;882  def PN3    : AArch64Reg<3,   "pn3">, DwarfRegNum<[51]>;883  def PN4    : AArch64Reg<4,   "pn4">, DwarfRegNum<[52]>;884  def PN5    : AArch64Reg<5,   "pn5">, DwarfRegNum<[53]>;885  def PN6    : AArch64Reg<6,   "pn6">, DwarfRegNum<[54]>;886  def PN7    : AArch64Reg<7,   "pn7">, DwarfRegNum<[55]>;887  def PN8    : AArch64Reg<8,   "pn8">, DwarfRegNum<[56]>;888  def PN9    : AArch64Reg<9,   "pn9">, DwarfRegNum<[57]>;889  def PN10   : AArch64Reg<10, "pn10">, DwarfRegNum<[58]>;890  def PN11   : AArch64Reg<11, "pn11">, DwarfRegNum<[59]>;891  def PN12   : AArch64Reg<12, "pn12">, DwarfRegNum<[60]>;892  def PN13   : AArch64Reg<13, "pn13">, DwarfRegNum<[61]>;893  def PN14   : AArch64Reg<14, "pn14">, DwarfRegNum<[62]>;894  def PN15   : AArch64Reg<15, "pn15">, DwarfRegNum<[63]>;895 896// SVE predicate registers897let SubRegIndices = [psub] in {898  def P0    : AArch64Reg<0,   "p0", [PN0]>, DwarfRegAlias<PN0>;899  def P1    : AArch64Reg<1,   "p1", [PN1]>, DwarfRegAlias<PN1>;900  def P2    : AArch64Reg<2,   "p2", [PN2]>, DwarfRegAlias<PN2>;901  def P3    : AArch64Reg<3,   "p3", [PN3]>, DwarfRegAlias<PN3>;902  def P4    : AArch64Reg<4,   "p4", [PN4]>, DwarfRegAlias<PN4>;903  def P5    : AArch64Reg<5,   "p5", [PN5]>, DwarfRegAlias<PN5>;904  def P6    : AArch64Reg<6,   "p6", [PN6]>, DwarfRegAlias<PN6>;905  def P7    : AArch64Reg<7,   "p7", [PN7]>, DwarfRegAlias<PN7>;906  def P8    : AArch64Reg<8,   "p8", [PN8]>, DwarfRegAlias<PN8>;907  def P9    : AArch64Reg<9,   "p9", [PN9]>, DwarfRegAlias<PN9>;908  def P10   : AArch64Reg<10, "p10", [PN10]>, DwarfRegAlias<PN10>;909  def P11   : AArch64Reg<11, "p11", [PN11]>, DwarfRegAlias<PN11>;910  def P12   : AArch64Reg<12, "p12", [PN12]>, DwarfRegAlias<PN12>;911  def P13   : AArch64Reg<13, "p13", [PN13]>, DwarfRegAlias<PN13>;912  def P14   : AArch64Reg<14, "p14", [PN14]>, DwarfRegAlias<PN14>;913  def P15   : AArch64Reg<15, "p15", [PN15]>, DwarfRegAlias<PN15>;914}915 916// SVE variable-size vector registers917let SubRegIndices = [zsub, zsub_hi] in {918def Z0    : AArch64Reg<0,   "z0",  [Q0, Q0_HI]>, DwarfRegNum<[96]>;919def Z1    : AArch64Reg<1,   "z1",  [Q1, Q1_HI]>, DwarfRegNum<[97]>;920def Z2    : AArch64Reg<2,   "z2",  [Q2, Q2_HI]>, DwarfRegNum<[98]>;921def Z3    : AArch64Reg<3,   "z3",  [Q3, Q3_HI]>, DwarfRegNum<[99]>;922def Z4    : AArch64Reg<4,   "z4",  [Q4, Q4_HI]>, DwarfRegNum<[100]>;923def Z5    : AArch64Reg<5,   "z5",  [Q5, Q5_HI]>, DwarfRegNum<[101]>;924def Z6    : AArch64Reg<6,   "z6",  [Q6, Q6_HI]>, DwarfRegNum<[102]>;925def Z7    : AArch64Reg<7,   "z7",  [Q7, Q7_HI]>, DwarfRegNum<[103]>;926def Z8    : AArch64Reg<8,   "z8",  [Q8, Q8_HI]>, DwarfRegNum<[104]>;927def Z9    : AArch64Reg<9,   "z9",  [Q9, Q9_HI]>, DwarfRegNum<[105]>;928def Z10   : AArch64Reg<10, "z10", [Q10, Q10_HI]>, DwarfRegNum<[106]>;929def Z11   : AArch64Reg<11, "z11", [Q11, Q11_HI]>, DwarfRegNum<[107]>;930def Z12   : AArch64Reg<12, "z12", [Q12, Q12_HI]>, DwarfRegNum<[108]>;931def Z13   : AArch64Reg<13, "z13", [Q13, Q13_HI]>, DwarfRegNum<[109]>;932def Z14   : AArch64Reg<14, "z14", [Q14, Q14_HI]>, DwarfRegNum<[110]>;933def Z15   : AArch64Reg<15, "z15", [Q15, Q15_HI]>, DwarfRegNum<[111]>;934def Z16   : AArch64Reg<16, "z16", [Q16, Q16_HI]>, DwarfRegNum<[112]>;935def Z17   : AArch64Reg<17, "z17", [Q17, Q17_HI]>, DwarfRegNum<[113]>;936def Z18   : AArch64Reg<18, "z18", [Q18, Q18_HI]>, DwarfRegNum<[114]>;937def Z19   : AArch64Reg<19, "z19", [Q19, Q19_HI]>, DwarfRegNum<[115]>;938def Z20   : AArch64Reg<20, "z20", [Q20, Q20_HI]>, DwarfRegNum<[116]>;939def Z21   : AArch64Reg<21, "z21", [Q21, Q21_HI]>, DwarfRegNum<[117]>;940def Z22   : AArch64Reg<22, "z22", [Q22, Q22_HI]>, DwarfRegNum<[118]>;941def Z23   : AArch64Reg<23, "z23", [Q23, Q23_HI]>, DwarfRegNum<[119]>;942def Z24   : AArch64Reg<24, "z24", [Q24, Q24_HI]>, DwarfRegNum<[120]>;943def Z25   : AArch64Reg<25, "z25", [Q25, Q25_HI]>, DwarfRegNum<[121]>;944def Z26   : AArch64Reg<26, "z26", [Q26, Q26_HI]>, DwarfRegNum<[122]>;945def Z27   : AArch64Reg<27, "z27", [Q27, Q27_HI]>, DwarfRegNum<[123]>;946def Z28   : AArch64Reg<28, "z28", [Q28, Q28_HI]>, DwarfRegNum<[124]>;947def Z29   : AArch64Reg<29, "z29", [Q29, Q29_HI]>, DwarfRegNum<[125]>;948def Z30   : AArch64Reg<30, "z30", [Q30, Q30_HI]>, DwarfRegNum<[126]>;949def Z31   : AArch64Reg<31, "z31", [Q31, Q31_HI]>, DwarfRegNum<[127]>;950}951 952// Enum describing the element size for destructive953// operations.954class ElementSizeEnum<bits<3> val> {955  bits<3> Value = val;956}957 958def ElementSizeNone : ElementSizeEnum<0>;959def ElementSizeB    : ElementSizeEnum<1>;960def ElementSizeH    : ElementSizeEnum<2>;961def ElementSizeS    : ElementSizeEnum<3>;962def ElementSizeD    : ElementSizeEnum<4>;963def ElementSizeQ    : ElementSizeEnum<5>;  // Unused964 965class SVERegOp <string Suffix, AsmOperandClass C,966                ElementSizeEnum Size,967                RegisterClass RC> : RegisterOperand<RC> {968  ElementSizeEnum ElementSize;969 970  let ElementSize = Size;971  let PrintMethod = !if(!eq(Suffix, ""),972                        "printSVERegOp<>",973                        "printSVERegOp<'" # Suffix # "'>");974  let ParserMatchClass = C;975}976 977class ZPRRegOp <string Suffix, AsmOperandClass C, ElementSizeEnum Size,978                RegisterClass RC> : SVERegOp<Suffix, C, Size, RC> {}979 980//******************************************************************************981 982// SVE predicate register classes.983class PPRClass<int firstreg, int lastreg, int step = 1> : RegisterClass<"AArch64",984                                  [ nxv16i1, nxv8i1, nxv4i1, nxv2i1, nxv1i1 ], 16,985                                  (sequence "P%u", firstreg, lastreg, step)> {986  let Size = 16;987}988 989def PPR    : PPRClass<0, 15> {990  let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::PPRRegClassID, 0, 16>";991}992def PPR_3b : PPRClass<0, 7> { // Restricted 3 bit SVE predicate register class.993  let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::PPRRegClassID, 0, 8>";994}995def PPR_p8to15 : PPRClass<8, 15> {996  let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::PPRRegClassID, 8, 8>";997}998 999def PPRMul2 : PPRClass<0, 14, 2>;1000 1001class PPRAsmOperand <string name, string RegClass, int Width>: AsmOperandClass {1002  let Name = "SVE" # name # "Reg";1003  let PredicateMethod = "isSVEPredicateVectorRegOfWidth<"1004                            # Width # ", " # "AArch64::" # RegClass # "RegClassID>";1005  let DiagnosticType = "InvalidSVE" # name # "Reg";1006  let RenderMethod = "addRegOperands";1007  let ParserMethod = "tryParseSVEPredicateVector<RegKind::SVEPredicateVector>";1008}1009 1010def PPRAsmOpAny   : PPRAsmOperand<"PredicateAny",   "PPR",     0>;1011def PPRAsmOp8     : PPRAsmOperand<"PredicateB",     "PPR",     8>;1012def PPRAsmOp16    : PPRAsmOperand<"PredicateH",     "PPR",    16>;1013def PPRAsmOp32    : PPRAsmOperand<"PredicateS",     "PPR",    32>;1014def PPRAsmOp64    : PPRAsmOperand<"PredicateD",     "PPR",    64>;1015def PPRAsmOp3bAny : PPRAsmOperand<"Predicate3bAny", "PPR_3b",  0>;1016 1017class PPRRegOp <string Suffix, AsmOperandClass C, ElementSizeEnum Size,1018                RegisterClass RC> : SVERegOp<Suffix, C, Size, RC> {}1019 1020def PPRAny   : PPRRegOp<"",  PPRAsmOpAny,   ElementSizeNone, PPR>;1021def PPR8     : PPRRegOp<"b", PPRAsmOp8,     ElementSizeB,    PPR>;1022def PPR16    : PPRRegOp<"h", PPRAsmOp16,    ElementSizeH,    PPR>;1023def PPR32    : PPRRegOp<"s", PPRAsmOp32,    ElementSizeS,    PPR>;1024def PPR64    : PPRRegOp<"d", PPRAsmOp64,    ElementSizeD,    PPR>;1025def PPR3bAny : PPRRegOp<"",  PPRAsmOp3bAny, ElementSizeNone, PPR_3b>;1026 1027class PNRClass<int firstreg, int lastreg> : RegisterClass<1028                                  "AArch64",1029                                  [ aarch64svcount ], 16,1030                                  (sequence "PN%u", firstreg, lastreg)> {1031  let Size = 16;1032}1033 1034def PNR        : PNRClass<0, 15> {1035  let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::PNRRegClassID, 0, 16>";1036}1037def PNR_3b     : PNRClass<0, 7>;1038def PNR_p8to15 : PNRClass<8, 15>;1039 1040// SVE predicate-as-counter operand1041class PNRAsmOperand<string name, string RegClass, int Width>: AsmOperandClass {1042  let Name = "SVE" # name # "Reg";1043  let PredicateMethod = "isSVEPredicateAsCounterRegOfWidth<"1044                            # Width # ", " # "AArch64::"1045                            # RegClass # "RegClassID>";1046  let DiagnosticType = "InvalidSVE" # name # "Reg";1047  let RenderMethod = "addRegOperands";1048  let ParserMethod   = "tryParseSVEPredicateVector<RegKind::SVEPredicateAsCounter>";1049}1050 1051def PNRAsmOpAny: PNRAsmOperand<"PNPredicateAny", "PNR", 0>;1052def PNRAsmOp8  : PNRAsmOperand<"PNPredicateB",   "PNR", 8>;1053def PNRAsmOp16 : PNRAsmOperand<"PNPredicateH",   "PNR", 16>;1054def PNRAsmOp32 : PNRAsmOperand<"PNPredicateS",   "PNR", 32>;1055def PNRAsmOp64 : PNRAsmOperand<"PNPredicateD",   "PNR", 64>;1056 1057class PNRRegOp<string Suffix, AsmOperandClass C, int Size, RegisterClass RC>1058    : SVERegOp<Suffix, C, ElementSizeNone, RC> {1059  let PrintMethod = "printPredicateAsCounter<" # Size # ">";1060}1061def PNRAny : PNRRegOp<"",  PNRAsmOpAny, 0,  PNR>;1062def PNR8   : PNRRegOp<"b", PNRAsmOp8,   8,  PNR>;1063def PNR16  : PNRRegOp<"h", PNRAsmOp16,  16, PNR>;1064def PNR32  : PNRRegOp<"s", PNRAsmOp32,  32, PNR>;1065def PNR64  : PNRRegOp<"d", PNRAsmOp64,  64, PNR>;1066 1067def PNRAsmAny_p8to15  : PNRAsmOperand<"PNPredicateAny_p8to15", "PNR_p8to15", 0>;1068def PNRAsmOp8_p8to15  : PNRAsmOperand<"PNPredicateB_p8to15",   "PNR_p8to15", 8>;1069def PNRAsmOp16_p8to15 : PNRAsmOperand<"PNPredicateH_p8to15",   "PNR_p8to15", 16>;1070def PNRAsmOp32_p8to15 : PNRAsmOperand<"PNPredicateS_p8to15",   "PNR_p8to15", 32>;1071def PNRAsmOp64_p8to15 : PNRAsmOperand<"PNPredicateD_p8to15",   "PNR_p8to15", 64>;1072 1073class PNRP8to15RegOp<string Suffix, AsmOperandClass C, int Width, RegisterClass RC>1074    : SVERegOp<Suffix, C, ElementSizeNone, RC> {1075  let PrintMethod   = "printPredicateAsCounter<" # Width # ">";1076  let EncoderMethod = "EncodePNR_p8to15";1077  let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::PNRRegClassID, 8, 8>";1078}1079 1080def PNRAny_p8to15 : PNRP8to15RegOp<"",  PNRAsmAny_p8to15,  0,  PNR_p8to15>;1081def PNR8_p8to15   : PNRP8to15RegOp<"b", PNRAsmOp8_p8to15,  8,  PNR_p8to15>;1082def PNR16_p8to15  : PNRP8to15RegOp<"h", PNRAsmOp16_p8to15, 16, PNR_p8to15>;1083def PNR32_p8to15  : PNRP8to15RegOp<"s", PNRAsmOp32_p8to15, 32, PNR_p8to15>;1084def PNR64_p8to15  : PNRP8to15RegOp<"d", PNRAsmOp64_p8to15, 64, PNR_p8to15>;1085 1086class PPRorPNRClass : RegisterClass<1087                                  "AArch64",1088                                  [ nxv16i1, nxv8i1, nxv4i1, nxv2i1, nxv1i1, aarch64svcount ], 16,1089                                  (add PPR, PNR)> {1090  let Size = 16;1091}1092 1093class PPRorPNRAsmOperand<string name, string RegClass, int Width>: AsmOperandClass {1094  let Name = "SVE" # name # "Reg";1095  let PredicateMethod = "isSVEPredicateOrPredicateAsCounterRegOfWidth<"1096                            # Width # ", " # "AArch64::"1097                            # RegClass # "RegClassID>";1098  let DiagnosticType = "InvalidSVE" # name # "Reg";1099  let RenderMethod = "addPPRorPNRRegOperands";1100  let ParserMethod = "tryParseSVEPredicateOrPredicateAsCounterVector";1101}1102 1103def PPRorPNR         : PPRorPNRClass {1104  let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::PPRorPNRRegClassID, 0, 16>";1105}1106def PPRorPNRAsmOp8   : PPRorPNRAsmOperand<"PPRorPNRB", "PPRorPNR", 8>;1107def PPRorPNRAsmOpAny : PPRorPNRAsmOperand<"PPRorPNRAny", "PPRorPNR", 0>;1108def PPRorPNRAny      : PPRRegOp<"", PPRorPNRAsmOpAny, ElementSizeNone, PPRorPNR>;1109def PPRorPNR8        : PPRRegOp<"b", PPRorPNRAsmOp8, ElementSizeB, PPRorPNR>;1110 1111// Pairs of SVE predicate vector registers.1112def PSeqPairs : RegisterTuples<[psub0, psub1], [(rotl PPR, 0), (rotl PPR, 1)]>;1113 1114def PPR2 : RegisterClass<"AArch64", [untyped], 16, (add PSeqPairs)> {1115  let Size = 32;1116  let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::PPR2RegClassID, 0, 16>";1117}1118 1119class PPRVectorList<int ElementWidth, int NumRegs> : AsmOperandClass {1120  let Name = "SVEPredicateList" # NumRegs # "x" # ElementWidth;1121  let ParserMethod = "tryParseVectorList<RegKind::SVEPredicateVector>";1122  let PredicateMethod = "isTypedVectorList<RegKind::SVEPredicateVector, "1123                            # NumRegs #", 0, "#ElementWidth #">";1124  let RenderMethod = "addVectorListOperands<AArch64Operand::VecListIdx_PReg, "1125                         # NumRegs #">";1126}1127 1128def PP_b : RegisterOperand<PPR2, "printTypedVectorList<0,'b'>"> {1129  let ParserMatchClass = PPRVectorList<8, 2>;1130}1131 1132def PP_h : RegisterOperand<PPR2, "printTypedVectorList<0,'h'>"> {1133  let ParserMatchClass = PPRVectorList<16, 2>;1134}1135 1136def PP_s : RegisterOperand<PPR2, "printTypedVectorList<0,'s'>"> {1137  let ParserMatchClass = PPRVectorList<32, 2>;1138}1139 1140def PP_d : RegisterOperand<PPR2, "printTypedVectorList<0,'d'>"> {1141  let ParserMatchClass = PPRVectorList<64, 2>;1142}1143 1144// SVE2 multiple-of-2 multi-predicate-vector operands1145def PPR2Mul2 : RegisterClass<"AArch64", [untyped], 16, (add (decimate PSeqPairs, 2))> {1146  let Size = 32;1147}1148 1149class PPRVectorListMul<int ElementWidth, int NumRegs> : PPRVectorList<ElementWidth, NumRegs> {1150  let Name = "SVEPredicateListMul" # NumRegs # "x" # ElementWidth;1151  let DiagnosticType = "Invalid" # Name;1152  let PredicateMethod =1153      "isTypedVectorListMultiple<RegKind::SVEPredicateVector, " # NumRegs # ", 0, "1154                                                                # ElementWidth #1155                                                                ", AArch64::PPRMul2RegClassID>";1156}1157 1158class PPR2MulRegOp<string Suffix, int Size, ElementSizeEnum ES>1159    : RegisterOperand<PPR2Mul2, "printTypedVectorList<0,'"#Suffix#"'>"> {1160  ElementSizeEnum ElementSize;1161  let ElementSize = ES;1162  let ParserMatchClass = PPRVectorListMul<Size, 2>;1163}1164 1165let EncoderMethod = "EncodeRegMul_MinMax<2, 0, 14>",1166    DecoderMethod = "DecodePPR2Mul2RegisterClass" in {1167 1168  def PP_b_mul_r : PPR2MulRegOp<"b", 8,  ElementSizeB>;1169  def PP_h_mul_r : PPR2MulRegOp<"h", 16, ElementSizeH>;1170  def PP_s_mul_r : PPR2MulRegOp<"s", 32, ElementSizeS>;1171  def PP_d_mul_r : PPR2MulRegOp<"d", 64, ElementSizeD>;1172 1173} // end let EncoderMethod/DecoderMethod1174 1175//===----------------------------------------------------------------------===//1176// SVE vector register classes1177class ZPRClass<int firstreg, int lastreg, int step = 1> : RegisterClass<"AArch64",1178                                            [nxv16i8, nxv8i16, nxv4i32, nxv2i64,1179                                             nxv2f16, nxv4f16, nxv8f16,1180                                             nxv2bf16, nxv4bf16, nxv8bf16,1181                                             nxv2f32, nxv4f32,1182                                             nxv2f64],1183                                            128, (sequence "Z%u", firstreg, lastreg, step)> {1184  let Size = 128;1185}1186 1187def ZPRMul2    : ZPRClass<0,  30, 2>;1188def ZPRMul4    : ZPRClass<0,  28, 4>;1189def ZPRMul2_Lo : ZPRClass<0,  14, 2>;1190def ZPRMul2_Hi : ZPRClass<16, 30, 2>;1191 1192def ZPR    : ZPRClass<0, 31> {1193  let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::ZPRRegClassID, 0, 32>";1194}1195def ZPR_4b : ZPRClass<0, 15> { // Restricted 4 bit SVE vector register class.1196  let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::ZPRRegClassID, 0, 16>";1197}1198def ZPR_3b : ZPRClass<0, 7> {  // Restricted 3 bit SVE vector register class.1199  let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::ZPRRegClassID, 0, 8>";1200}1201 1202class ZPRAsmOperand<string name, int Width, string RegClassSuffix = "">1203    : AsmOperandClass {1204  let Name = "SVE" # name # "Reg";1205  let PredicateMethod = "isSVEDataVectorRegOfWidth<"1206                            # Width # ", AArch64::ZPR"1207                            # RegClassSuffix # "RegClassID>";1208  let RenderMethod = "addRegOperands";1209  let DiagnosticType = "InvalidZPR" # RegClassSuffix # Width;1210  let ParserMethod = "tryParseSVEDataVector<false, "1211                               # !if(!eq(Width, 0), "false", "true") # ">";1212}1213 1214def ZPRAsmOpAny : ZPRAsmOperand<"VectorAny", 0>;1215def ZPRAsmOp8   : ZPRAsmOperand<"VectorB",   8>;1216def ZPRAsmOp16  : ZPRAsmOperand<"VectorH",   16>;1217def ZPRAsmOp32  : ZPRAsmOperand<"VectorS",   32>;1218def ZPRAsmOp64  : ZPRAsmOperand<"VectorD",   64>;1219def ZPRAsmOp128 : ZPRAsmOperand<"VectorQ",   128>;1220 1221def ZPRAny  : ZPRRegOp<"",  ZPRAsmOpAny, ElementSizeNone, ZPR>;1222def ZPR8    : ZPRRegOp<"b", ZPRAsmOp8,   ElementSizeB, ZPR>;1223def ZPR16   : ZPRRegOp<"h", ZPRAsmOp16,  ElementSizeH, ZPR>;1224def ZPR32   : ZPRRegOp<"s", ZPRAsmOp32,  ElementSizeS, ZPR>;1225def ZPR64   : ZPRRegOp<"d", ZPRAsmOp64,  ElementSizeD, ZPR>;1226def ZPR128  : ZPRRegOp<"q", ZPRAsmOp128, ElementSizeQ, ZPR>;1227 1228def ZPRAsmOp3b8   : ZPRAsmOperand<"Vector3bB", 8, "_3b">;1229def ZPRAsmOp3b16  : ZPRAsmOperand<"Vector3bH", 16, "_3b">;1230def ZPRAsmOp3b32  : ZPRAsmOperand<"Vector3bS", 32, "_3b">;1231 1232def ZPR3b8  : ZPRRegOp<"b", ZPRAsmOp3b8,  ElementSizeB, ZPR_3b>;1233def ZPR3b16 : ZPRRegOp<"h", ZPRAsmOp3b16, ElementSizeH, ZPR_3b>;1234def ZPR3b32 : ZPRRegOp<"s", ZPRAsmOp3b32, ElementSizeS, ZPR_3b>;1235 1236def ZPRAsmOp4b8   : ZPRAsmOperand<"Vector4bB", 8,  "_4b">;1237def ZPRAsmOp4b16  : ZPRAsmOperand<"Vector4bH", 16, "_4b">;1238def ZPRAsmOp4b32  : ZPRAsmOperand<"Vector4bS", 32, "_4b">;1239def ZPRAsmOp4b64  : ZPRAsmOperand<"Vector4bD", 64, "_4b">;1240 1241def ZPR4b8  : ZPRRegOp<"b", ZPRAsmOp4b8,  ElementSizeB, ZPR_4b>;1242def ZPR4b16 : ZPRRegOp<"h", ZPRAsmOp4b16, ElementSizeH, ZPR_4b>;1243def ZPR4b32 : ZPRRegOp<"s", ZPRAsmOp4b32, ElementSizeS, ZPR_4b>;1244def ZPR4b64 : ZPRRegOp<"d", ZPRAsmOp4b64, ElementSizeD, ZPR_4b>;1245 1246class ZPRMul2_MinToMaxRegOp<string Suffix, AsmOperandClass C, int  Min, int Max, ElementSizeEnum  Width, RegisterClass RC>1247    : ZPRRegOp<Suffix, C, Width, RC> {1248  let EncoderMethod = "EncodeRegMul_MinMax<2," # Min # ", " # Max # ">";1249  let DecoderMethod = "DecodeZPRMul2_MinMax<" # Min # ", " # Max # ">";1250}1251 1252def ZPRMul2AsmOp8_Lo  : ZPRAsmOperand<"VectorB_Lo",  8, "Mul2_Lo">;1253def ZPRMul2AsmOp8_Hi  : ZPRAsmOperand<"VectorB_Hi",  8, "Mul2_Hi">;1254def ZPRMul2AsmOp16_Lo : ZPRAsmOperand<"VectorH_Lo", 16, "Mul2_Lo">;1255def ZPRMul2AsmOp16_Hi : ZPRAsmOperand<"VectorH_Hi", 16, "Mul2_Hi">;1256def ZPRMul2AsmOp32_Lo : ZPRAsmOperand<"VectorS_Lo", 32, "Mul2_Lo">;1257def ZPRMul2AsmOp32_Hi : ZPRAsmOperand<"VectorS_Hi", 32, "Mul2_Hi">;1258def ZPRMul2AsmOp64_Lo : ZPRAsmOperand<"VectorD_Lo", 64, "Mul2_Lo">;1259def ZPRMul2AsmOp64_Hi : ZPRAsmOperand<"VectorD_Hi", 64, "Mul2_Hi">;1260 1261def ZPR_K : RegisterClass<"AArch64", [nxv16i8], 128,1262                          (add Z20, Z21, Z22, Z23, Z28, Z29, Z30, Z31)>{1263                             let Size = 128;1264}1265 1266def ZK : RegisterOperand<ZPR_K, "printSVERegOp<>">{1267  let EncoderMethod = "EncodeZK";1268  let DecoderMethod = "DecodeZK";1269  let ParserMatchClass = ZPRAsmOperand<"Vector_20to23or28to31", 0, "_K">;1270}1271 1272def ZPR8Mul2_Lo  : ZPRMul2_MinToMaxRegOp<"b", ZPRMul2AsmOp8_Lo,   0, 14, ElementSizeB, ZPRMul2_Lo>;1273def ZPR8Mul2_Hi  : ZPRMul2_MinToMaxRegOp<"b", ZPRMul2AsmOp8_Hi,  16, 30, ElementSizeB, ZPRMul2_Hi>;1274def ZPR16Mul2_Lo : ZPRMul2_MinToMaxRegOp<"h", ZPRMul2AsmOp16_Lo,  0, 14, ElementSizeH, ZPRMul2_Lo>;1275def ZPR16Mul2_Hi : ZPRMul2_MinToMaxRegOp<"h", ZPRMul2AsmOp16_Hi, 16, 30, ElementSizeH, ZPRMul2_Hi>;1276def ZPR32Mul2_Lo : ZPRMul2_MinToMaxRegOp<"s", ZPRMul2AsmOp32_Lo,  0, 14, ElementSizeS, ZPRMul2_Lo>;1277def ZPR32Mul2_Hi : ZPRMul2_MinToMaxRegOp<"s", ZPRMul2AsmOp32_Hi, 16, 30, ElementSizeS, ZPRMul2_Hi>;1278def ZPR64Mul2_Lo : ZPRMul2_MinToMaxRegOp<"d", ZPRMul2AsmOp64_Lo,  0, 14, ElementSizeD, ZPRMul2_Lo>;1279def ZPR64Mul2_Hi : ZPRMul2_MinToMaxRegOp<"d", ZPRMul2AsmOp64_Hi, 16, 30, ElementSizeD, ZPRMul2_Hi>;1280 1281class FPRasZPR<int Width> : AsmOperandClass{1282  let Name = "FPR" # Width # "asZPR";1283  let PredicateMethod = "isFPRasZPR<AArch64::FPR" # Width # "RegClassID>";1284  let RenderMethod = "addFPRasZPRRegOperands<" # Width # ">";1285}1286 1287class FPRasZPROperand<int Width> : RegisterOperand<ZPR> {1288  let ParserMatchClass = FPRasZPR<Width>;1289  let PrintMethod = "printZPRasFPR<" # Width # ">";1290}1291 1292def FPR8asZPR   : FPRasZPROperand<8>;1293def FPR16asZPR  : FPRasZPROperand<16>;1294def FPR32asZPR  : FPRasZPROperand<32>;1295def FPR64asZPR  : FPRasZPROperand<64>;1296def FPR128asZPR : FPRasZPROperand<128>;1297 1298// Pairs, triples, and quads of SVE vector registers.1299def ZSeqPairs   : RegisterTuples<[zsub0, zsub1], [(rotl ZPR, 0), (rotl ZPR, 1)]>;1300def ZSeqTriples : RegisterTuples<[zsub0, zsub1, zsub2], [(rotl ZPR, 0), (rotl ZPR, 1), (rotl ZPR, 2)]>;1301def ZSeqQuads   : RegisterTuples<[zsub0, zsub1, zsub2, zsub3], [(rotl ZPR, 0), (rotl ZPR, 1), (rotl ZPR, 2), (rotl ZPR, 3)]>;1302 1303def ZPR2   : RegisterClass<"AArch64", [untyped], 128, (add ZSeqPairs)>  {1304  let Size = 256;1305  let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::ZPR2RegClassID, 0, 32>";1306}1307def ZPR3  : RegisterClass<"AArch64", [untyped], 128, (add ZSeqTriples)> {1308  let Size = 384;1309  let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::ZPR3RegClassID, 0, 32>";1310}1311def ZPR4 : RegisterClass<"AArch64", [untyped], 128, (add ZSeqQuads)> {1312  let Size = 512;1313  let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::ZPR4RegClassID, 0, 32>";1314}1315 1316class ZPRVectorList<int ElementWidth, int NumRegs> : AsmOperandClass {1317  let Name = "SVEVectorList" # NumRegs # ElementWidth;1318  let ParserMethod = "tryParseVectorList<RegKind::SVEDataVector>";1319  let PredicateMethod =1320      "isTypedVectorList<RegKind::SVEDataVector, " #NumRegs #", 0, " #ElementWidth #">";1321  let RenderMethod = "addVectorListOperands<AArch64Operand::VecListIdx_ZReg, " # NumRegs # ">";1322}1323 1324def Z_b  : RegisterOperand<ZPR,  "printTypedVectorList<0,'b'>"> {1325  let ParserMatchClass = ZPRVectorList<8, 1>;1326}1327 1328def Z_h  : RegisterOperand<ZPR,  "printTypedVectorList<0,'h'>"> {1329  let ParserMatchClass = ZPRVectorList<16, 1>;1330}1331 1332def Z_s  : RegisterOperand<ZPR,  "printTypedVectorList<0,'s'>"> {1333  let ParserMatchClass = ZPRVectorList<32, 1>;1334}1335 1336def Z_d  : RegisterOperand<ZPR,  "printTypedVectorList<0,'d'>"> {1337  let ParserMatchClass = ZPRVectorList<64, 1>;1338}1339 1340def Z_q  : RegisterOperand<ZPR,  "printTypedVectorList<0,'q'>"> {1341  let ParserMatchClass = ZPRVectorList<128, 1>;1342}1343 1344def ZZ_Any  : RegisterOperand<ZPR2, "printTypedVectorList<0,0>"> {1345  let ParserMatchClass = ZPRVectorList<0, 2>;1346}1347 1348def ZZ_b  : RegisterOperand<ZPR2, "printTypedVectorList<0,'b'>"> {1349  let ParserMatchClass = ZPRVectorList<8, 2>;1350}1351 1352def ZZ_h  : RegisterOperand<ZPR2, "printTypedVectorList<0,'h'>"> {1353  let ParserMatchClass = ZPRVectorList<16, 2>;1354}1355 1356def ZZ_s  : RegisterOperand<ZPR2, "printTypedVectorList<0,'s'>"> {1357  let ParserMatchClass = ZPRVectorList<32, 2>;1358}1359 1360def ZZ_d  : RegisterOperand<ZPR2, "printTypedVectorList<0,'d'>"> {1361  let ParserMatchClass = ZPRVectorList<64, 2>;1362}1363 1364def ZZ_q  : RegisterOperand<ZPR2, "printTypedVectorList<0,'q'>"> {1365  let ParserMatchClass = ZPRVectorList<128, 2>;1366}1367 1368def ZZZ_Any  : RegisterOperand<ZPR3, "printTypedVectorList<0,0>"> {1369  let ParserMatchClass = ZPRVectorList<0, 3>;1370}1371 1372def ZZZ_b  : RegisterOperand<ZPR3, "printTypedVectorList<0,'b'>"> {1373  let ParserMatchClass = ZPRVectorList<8, 3>;1374}1375 1376def ZZZ_h  : RegisterOperand<ZPR3, "printTypedVectorList<0,'h'>"> {1377  let ParserMatchClass = ZPRVectorList<16, 3>;1378}1379 1380def ZZZ_s  : RegisterOperand<ZPR3, "printTypedVectorList<0,'s'>"> {1381  let ParserMatchClass = ZPRVectorList<32, 3>;1382}1383 1384def ZZZ_d  : RegisterOperand<ZPR3, "printTypedVectorList<0,'d'>"> {1385  let ParserMatchClass = ZPRVectorList<64, 3>;1386}1387 1388def ZZZ_q  : RegisterOperand<ZPR3, "printTypedVectorList<0,'q'>"> {1389  let ParserMatchClass = ZPRVectorList<128, 3>;1390}1391 1392def ZZZZ_b : RegisterOperand<ZPR4, "printTypedVectorList<0,'b'>"> {1393  let ParserMatchClass = ZPRVectorList<8, 4>;1394}1395 1396def ZZZZ_h : RegisterOperand<ZPR4, "printTypedVectorList<0,'h'>"> {1397  let ParserMatchClass = ZPRVectorList<16, 4>;1398}1399 1400def ZZZZ_s : RegisterOperand<ZPR4, "printTypedVectorList<0,'s'>"> {1401  let ParserMatchClass = ZPRVectorList<32, 4>;1402}1403 1404def ZZZZ_d : RegisterOperand<ZPR4, "printTypedVectorList<0,'d'>"> {1405  let ParserMatchClass = ZPRVectorList<64, 4>;1406}1407 1408def ZZZZ_q : RegisterOperand<ZPR4, "printTypedVectorList<0,'q'>"> {1409  let ParserMatchClass = ZPRVectorList<128, 4>;1410}1411 1412// SME2 multiple-of-2 or 4 multi-vector operands1413def ZPR2Mul2 : RegisterClass<"AArch64", [untyped], 128, (add (decimate ZSeqPairs, 2))> {1414  let Size = 256;1415}1416 1417def ZPR4Mul4 : RegisterClass<"AArch64", [untyped], 128, (add (decimate ZSeqQuads, 4))> {1418  let Size = 512;1419}1420 1421class ZPRVectorListMul<int ElementWidth, int NumRegs, string RegClassSuffix = "">1422  : ZPRVectorList<ElementWidth, NumRegs> {1423  let Name = "SVEVectorList" # NumRegs # "x" # ElementWidth # RegClassSuffix;1424  let DiagnosticType = "Invalid" # Name;1425  let PredicateMethod =1426      "isTypedVectorListMultiple<RegKind::SVEDataVector, "1427                                 # NumRegs # ", 0, "1428                                 # ElementWidth #  ", "1429                                 # "AArch64::ZPR" # RegClassSuffix # "RegClassID" # ">";1430}1431 1432let EncoderMethod = "EncodeRegMul_MinMax<2, 0, 30>",1433    DecoderMethod = "DecodeZPR2Mul2RegisterClass<0, 30>" in {1434  def ZZ_mul_r : RegisterOperand<ZPR2Mul2, "printTypedVectorList<0,0>"> {1435    let ParserMatchClass = ZPRVectorListMul<0, 2, "Mul2">;1436  }1437 1438  def ZZ_b_mul_r : RegisterOperand<ZPR2Mul2, "printTypedVectorList<0,'b'>"> {1439    let ParserMatchClass = ZPRVectorListMul<8, 2, "Mul2">;1440  }1441 1442  def ZZ_h_mul_r : RegisterOperand<ZPR2Mul2, "printTypedVectorList<0,'h'>"> {1443    let ParserMatchClass = ZPRVectorListMul<16, 2, "Mul2">;1444  }1445 1446  def ZZ_s_mul_r : RegisterOperand<ZPR2Mul2, "printTypedVectorList<0,'s'>"> {1447    let ParserMatchClass = ZPRVectorListMul<32, 2, "Mul2">;1448  }1449 1450  def ZZ_d_mul_r : RegisterOperand<ZPR2Mul2, "printTypedVectorList<0,'d'>"> {1451    let ParserMatchClass = ZPRVectorListMul<64, 2, "Mul2">;1452  }1453 1454  def ZZ_q_mul_r : RegisterOperand<ZPR2Mul2, "printTypedVectorList<0,'q'>"> {1455    let ParserMatchClass = ZPRVectorListMul<128, 2, "Mul2">;1456  }1457} // end let EncoderMethod/DecoderMethod1458 1459let EncoderMethod = "EncodeRegMul_MinMax<4, 0, 28>",1460    DecoderMethod = "DecodeZPR4Mul4RegisterClass" in {1461  def ZZZZ_b_mul_r : RegisterOperand<ZPR4Mul4, "printTypedVectorList<0,'b'>"> {1462    let ParserMatchClass = ZPRVectorListMul<8, 4, "Mul4">;1463  }1464 1465  def ZZZZ_h_mul_r : RegisterOperand<ZPR4Mul4, "printTypedVectorList<0,'h'>"> {1466    let ParserMatchClass = ZPRVectorListMul<16, 4, "Mul4">;1467  }1468 1469  def ZZZZ_s_mul_r : RegisterOperand<ZPR4Mul4, "printTypedVectorList<0,'s'>"> {1470    let ParserMatchClass = ZPRVectorListMul<32, 4, "Mul4">;1471  }1472 1473  def ZZZZ_d_mul_r : RegisterOperand<ZPR4Mul4, "printTypedVectorList<0,'d'>"> {1474    let ParserMatchClass = ZPRVectorListMul<64, 4, "Mul4">;1475  }1476 1477  def ZZZZ_q_mul_r : RegisterOperand<ZPR4Mul4, "printTypedVectorList<0,'q'>"> {1478    let ParserMatchClass = ZPRVectorListMul<128, 4, "Mul4">;1479  }1480} // end let EncoderMethod/DecoderMethod1481 1482// Pairs of consecutive ZPR, starting with an even register, split into1483// Lo=0-14 and Hi=16-30.1484def ZPR2Mul2_Lo : RegisterClass<"AArch64", [untyped], 128,1485                                (trunc (decimate ZSeqPairs, 2), 8)>  {1486  let Size = 256;1487}1488 1489def ZPR2Mul2_Hi : RegisterClass<"AArch64", [untyped], 128,1490                                (trunc (rotr (decimate ZSeqPairs, 2), 8), 8)>  {1491  let Size = 256;1492}1493 1494let EncoderMethod = "EncodeRegMul_MinMax<2, 0, 14>",1495    DecoderMethod = "DecodeZPR2Mul2RegisterClass<0, 16>" in {1496  def ZZ_b_mul_r_Lo : RegisterOperand<ZPR2Mul2_Lo, "printTypedVectorList<0,'b'>"> {1497    let ParserMatchClass = ZPRVectorListMul<8, 2, "Mul2_Lo">;1498  }1499 1500  def ZZ_h_mul_r_Lo : RegisterOperand<ZPR2Mul2_Lo, "printTypedVectorList<0,'h'>"> {1501    let ParserMatchClass = ZPRVectorListMul<16, 2, "Mul2_Lo">;1502  }1503 1504  def ZZ_s_mul_r_Lo : RegisterOperand<ZPR2Mul2_Lo, "printTypedVectorList<0,'s'>"> {1505    let ParserMatchClass = ZPRVectorListMul<32, 2, "Mul2_Lo">;1506  }1507 1508  def ZZ_d_mul_r_Lo : RegisterOperand<ZPR2Mul2_Lo, "printTypedVectorList<0,'d'>"> {1509    let ParserMatchClass = ZPRVectorListMul<64, 2, "Mul2_Lo">;1510  }1511}1512 1513let EncoderMethod = "EncodeRegMul_MinMax<2, 16, 30>",1514    DecoderMethod = "DecodeZPR2Mul2RegisterClass<16, 31>" in {1515  def ZZ_b_mul_r_Hi : RegisterOperand<ZPR2Mul2_Hi, "printTypedVectorList<0,'b'>"> {1516    let ParserMatchClass = ZPRVectorListMul<8, 2, "Mul2_Hi">;1517  }1518 1519  def ZZ_h_mul_r_Hi : RegisterOperand<ZPR2Mul2_Hi, "printTypedVectorList<0,'h'>"> {1520    let ParserMatchClass = ZPRVectorListMul<16, 2, "Mul2_Hi">;1521  }1522 1523  def ZZ_s_mul_r_Hi : RegisterOperand<ZPR2Mul2_Hi, "printTypedVectorList<0,'s'>"> {1524    let ParserMatchClass = ZPRVectorListMul<32, 2, "Mul2_Hi">;1525  }1526 1527  def ZZ_d_mul_r_Hi : RegisterOperand<ZPR2Mul2_Hi, "printTypedVectorList<0,'d'>"> {1528    let ParserMatchClass = ZPRVectorListMul<64, 2, "Mul2_Hi">;1529  }1530 } // end let EncoderMethod/DecoderMethod1531 1532// SME2 strided multi-vector operands1533 1534// ZStridedPairs1535//1536// A group of two Z vectors with strided numbering consisting of:1537//   Zn+0.T and Zn+8.T1538// where n is in the range 0 to 7 and 16 to 23 inclusive, and T is one of B, H,1539// S, or D.1540 1541// Z0_Z8, Z1_Z9, Z2_Z10, Z3_Z11, Z4_Z12, Z5_Z13, Z6_Z14, Z7_Z151542def ZStridedPairsLo : RegisterTuples<[zsub0, zsub1], [1543  (trunc (rotl ZPR, 0), 8), (trunc (rotl ZPR, 8), 8)1544]>;1545 1546// Z16_Z24, Z17_Z25, Z18_Z26, Z19_Z27, Z20_Z28, Z21_Z29, Z22_Z30, Z23_Z311547def ZStridedPairsHi : RegisterTuples<[zsub0, zsub1], [1548  (trunc (rotl ZPR, 16), 8), (trunc (rotl ZPR, 24), 8)1549]>;1550 1551// ZStridedQuads1552//1553// A group of four Z vectors with strided numbering consisting of:1554//   Zn+0.T, Zn+4.T, Zn+8.T and Zn+12.T1555// where n is in the range 0 to 3 and 16 to 19 inclusive, and T is one of B, H,1556// S, or D.1557 1558// Z0_Z4_Z8_Z12, Z1_Z5_Z9_Z13, Z2_Z6_Z10_Z14, Z3_Z7_Z11_Z151559def ZStridedQuadsLo : RegisterTuples<[zsub0, zsub1, zsub2, zsub3], [1560  (trunc (rotl ZPR, 0), 4), (trunc (rotl ZPR, 4), 4),1561  (trunc (rotl ZPR, 8), 4), (trunc (rotl ZPR, 12), 4)1562]>;1563// Z16_Z20_Z24_Z28, Z17_Z21_Z25_Z29, Z18_Z22_Z26_Z30, Z19_Z23_Z27_Z311564def ZStridedQuadsHi : RegisterTuples<[zsub0, zsub1, zsub2, zsub3], [1565  (trunc (rotl ZPR, 16), 4), (trunc (rotl ZPR, 20), 4),1566  (trunc (rotl ZPR, 24), 4), (trunc (rotl ZPR, 28), 4)1567]>;1568 1569def ZPR2Strided : RegisterClass<"AArch64", [untyped], 128,1570                                (add ZStridedPairsLo, ZStridedPairsHi)>  {1571  let Size = 256;1572  let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::ZPR2StridedRegClassID, 0, 16>";1573}1574def ZPR4Strided : RegisterClass<"AArch64", [untyped], 128,1575                                (add ZStridedQuadsLo, ZStridedQuadsHi)>  {1576  let Size = 512;1577  let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::ZPR4StridedRegClassID, 0, 8>";1578}1579 1580def ZPR2StridedOrContiguous : RegisterClass<"AArch64", [untyped], 128,1581                                (add ZStridedPairsLo, ZStridedPairsHi,1582                                (decimate ZSeqPairs, 2))> {1583  let Size = 256;1584}1585 1586class ZPRVectorListStrided<int ElementWidth, int NumRegs, int Stride>1587    : ZPRVectorList<ElementWidth, NumRegs> {1588  let Name = "SVEVectorListStrided" # NumRegs # "x" # ElementWidth;1589  let DiagnosticType = "Invalid" # Name;1590  let PredicateMethod = "isTypedVectorListStrided<RegKind::SVEDataVector, "1591                        # NumRegs # "," # Stride # "," # ElementWidth # ">";1592  let RenderMethod = "addStridedVectorListOperands<" # NumRegs # ">";1593}1594 1595let EncoderMethod = "EncodeZPR2StridedRegisterClass",1596    DecoderMethod = "DecodeSimpleRegisterClass<AArch64::ZPR2StridedRegClassID, 0, 16>" in {1597  def ZZ_b_strided1598      : RegisterOperand<ZPR2Strided, "printTypedVectorList<0, 'b'>"> {1599    let ParserMatchClass = ZPRVectorListStrided<8, 2, 8>;1600  }1601 1602  def ZZ_h_strided1603      : RegisterOperand<ZPR2Strided, "printTypedVectorList<0, 'h'>"> {1604    let ParserMatchClass = ZPRVectorListStrided<16, 2, 8>;1605  }1606 1607  def ZZ_s_strided1608      : RegisterOperand<ZPR2Strided, "printTypedVectorList<0,'s'>"> {1609    let ParserMatchClass = ZPRVectorListStrided<32, 2, 8>;1610  }1611 1612  def ZZ_d_strided1613      : RegisterOperand<ZPR2Strided, "printTypedVectorList<0,'d'>"> {1614    let ParserMatchClass = ZPRVectorListStrided<64, 2, 8>;1615  }1616 1617  def ZZ_b_strided_and_contiguous1618      : RegisterOperand<ZPR2StridedOrContiguous, "printTypedVectorList<0,'b'>">;1619  def ZZ_h_strided_and_contiguous1620      : RegisterOperand<ZPR2StridedOrContiguous, "printTypedVectorList<0,'h'>">;1621  def ZZ_s_strided_and_contiguous1622      : RegisterOperand<ZPR2StridedOrContiguous, "printTypedVectorList<0,'s'>">;1623  def ZZ_d_strided_and_contiguous1624      : RegisterOperand<ZPR2StridedOrContiguous, "printTypedVectorList<0,'d'>">;1625}1626 1627def ZPR4StridedOrContiguous : RegisterClass<"AArch64", [untyped], 128,1628                                (add ZStridedQuadsLo, ZStridedQuadsHi,1629                                (decimate ZSeqQuads, 4))>  {1630  let Size = 512;1631}1632 1633let EncoderMethod = "EncodeZPR4StridedRegisterClass",1634    DecoderMethod = "DecodeSimpleRegisterClass<AArch64::ZPR4StridedRegClassID, 0, 16>" in {1635  def ZZZZ_b_strided1636      : RegisterOperand<ZPR4Strided, "printTypedVectorList<0,'b'>"> {1637    let ParserMatchClass = ZPRVectorListStrided<8, 4, 4>;1638  }1639 1640  def ZZZZ_h_strided1641      : RegisterOperand<ZPR4Strided, "printTypedVectorList<0,'h'>"> {1642    let ParserMatchClass = ZPRVectorListStrided<16, 4, 4>;1643  }1644 1645  def ZZZZ_s_strided1646      : RegisterOperand<ZPR4Strided, "printTypedVectorList<0,'s'>"> {1647    let ParserMatchClass = ZPRVectorListStrided<32, 4, 4>;1648  }1649 1650  def ZZZZ_d_strided1651      : RegisterOperand<ZPR4Strided, "printTypedVectorList<0,'d'>"> {1652    let ParserMatchClass = ZPRVectorListStrided<64, 4, 4>;1653  }1654 1655  def ZZZZ_b_strided_and_contiguous1656      : RegisterOperand<ZPR4StridedOrContiguous, "printTypedVectorList<0,'b'>">;1657  def ZZZZ_h_strided_and_contiguous1658      : RegisterOperand<ZPR4StridedOrContiguous, "printTypedVectorList<0,'h'>">;1659  def ZZZZ_s_strided_and_contiguous1660      : RegisterOperand<ZPR4StridedOrContiguous, "printTypedVectorList<0,'s'>">;1661  def ZZZZ_d_strided_and_contiguous1662      : RegisterOperand<ZPR4StridedOrContiguous, "printTypedVectorList<0,'d'>">;1663}1664 1665class ZPRExtendAsmOperand<string ShiftExtend, int RegWidth, int Scale,1666                          bit ScaleAlwaysSame = 0b0> : AsmOperandClass {1667  let Name = "ZPRExtend" # ShiftExtend # RegWidth # Scale1668                         # !if(ScaleAlwaysSame, "Only", "");1669 1670  let PredicateMethod = "isSVEDataVectorRegWithShiftExtend<"1671                          # RegWidth # ", AArch64::ZPRRegClassID, "1672                          # "AArch64_AM::" # ShiftExtend # ", "1673                          # Scale # ", "1674                          # !if(ScaleAlwaysSame, "true", "false")1675                          # ">";1676  let DiagnosticType = "InvalidZPR" # RegWidth # ShiftExtend # Scale;1677  let RenderMethod = "addRegOperands";1678  let ParserMethod = "tryParseSVEDataVector<true, true>";1679}1680 1681class ZPRExtendRegisterOperand<bit SignExtend, bit IsLSL, string Repr,1682                               int RegWidth, int Scale, string Suffix = "">1683    : RegisterOperand<ZPR> {1684  let ParserMatchClass =1685    !cast<AsmOperandClass>("ZPR" # RegWidth # "AsmOpndExt" # Repr # Scale # Suffix);1686  let PrintMethod = "printRegWithShiftExtend<"1687                          # !if(SignExtend, "true", "false") # ", "1688                          # Scale # ", "1689                          # !if(IsLSL, "'x'", "'w'") # ", "1690                          # !if(!eq(RegWidth, 32), "'s'", "'d'") # ">";1691}1692 1693foreach RegWidth = [32, 64] in {1694  // UXTW(8|16|32|64)1695  def ZPR#RegWidth#AsmOpndExtUXTW8Only : ZPRExtendAsmOperand<"UXTW", RegWidth, 8, 0b1>;1696  def ZPR#RegWidth#AsmOpndExtUXTW8     : ZPRExtendAsmOperand<"UXTW", RegWidth, 8>;1697  def ZPR#RegWidth#AsmOpndExtUXTW16    : ZPRExtendAsmOperand<"UXTW", RegWidth, 16>;1698  def ZPR#RegWidth#AsmOpndExtUXTW32    : ZPRExtendAsmOperand<"UXTW", RegWidth, 32>;1699  def ZPR#RegWidth#AsmOpndExtUXTW64    : ZPRExtendAsmOperand<"UXTW", RegWidth, 64>;1700 1701  def ZPR#RegWidth#ExtUXTW8Only        : ZPRExtendRegisterOperand<0b0, 0b0, "UXTW", RegWidth, 8, "Only">;1702  def ZPR#RegWidth#ExtUXTW8            : ZPRExtendRegisterOperand<0b0, 0b0, "UXTW", RegWidth, 8>;1703  def ZPR#RegWidth#ExtUXTW16           : ZPRExtendRegisterOperand<0b0, 0b0, "UXTW", RegWidth, 16>;1704  def ZPR#RegWidth#ExtUXTW32           : ZPRExtendRegisterOperand<0b0, 0b0, "UXTW", RegWidth, 32>;1705  def ZPR#RegWidth#ExtUXTW64           : ZPRExtendRegisterOperand<0b0, 0b0, "UXTW", RegWidth, 64>;1706 1707  // SXTW(8|16|32|64)1708  def ZPR#RegWidth#AsmOpndExtSXTW8Only : ZPRExtendAsmOperand<"SXTW", RegWidth, 8, 0b1>;1709  def ZPR#RegWidth#AsmOpndExtSXTW8     : ZPRExtendAsmOperand<"SXTW", RegWidth, 8>;1710  def ZPR#RegWidth#AsmOpndExtSXTW16    : ZPRExtendAsmOperand<"SXTW", RegWidth, 16>;1711  def ZPR#RegWidth#AsmOpndExtSXTW32    : ZPRExtendAsmOperand<"SXTW", RegWidth, 32>;1712  def ZPR#RegWidth#AsmOpndExtSXTW64    : ZPRExtendAsmOperand<"SXTW", RegWidth, 64>;1713 1714  def ZPR#RegWidth#ExtSXTW8Only        : ZPRExtendRegisterOperand<0b1, 0b0, "SXTW", RegWidth, 8, "Only">;1715  def ZPR#RegWidth#ExtSXTW8            : ZPRExtendRegisterOperand<0b1, 0b0, "SXTW", RegWidth, 8>;1716  def ZPR#RegWidth#ExtSXTW16           : ZPRExtendRegisterOperand<0b1, 0b0, "SXTW", RegWidth, 16>;1717  def ZPR#RegWidth#ExtSXTW32           : ZPRExtendRegisterOperand<0b1, 0b0, "SXTW", RegWidth, 32>;1718  def ZPR#RegWidth#ExtSXTW64           : ZPRExtendRegisterOperand<0b1, 0b0, "SXTW", RegWidth, 64>;1719 1720  // LSL(8|16|32|64)1721  def ZPR#RegWidth#AsmOpndExtLSL8      : ZPRExtendAsmOperand<"LSL", RegWidth, 8>;1722  def ZPR#RegWidth#AsmOpndExtLSL16     : ZPRExtendAsmOperand<"LSL", RegWidth, 16>;1723  def ZPR#RegWidth#AsmOpndExtLSL32     : ZPRExtendAsmOperand<"LSL", RegWidth, 32>;1724  def ZPR#RegWidth#AsmOpndExtLSL64     : ZPRExtendAsmOperand<"LSL", RegWidth, 64>;1725  def ZPR#RegWidth#ExtLSL8             : ZPRExtendRegisterOperand<0b0, 0b1, "LSL", RegWidth, 8>;1726  def ZPR#RegWidth#ExtLSL16            : ZPRExtendRegisterOperand<0b0, 0b1, "LSL", RegWidth, 16>;1727  def ZPR#RegWidth#ExtLSL32            : ZPRExtendRegisterOperand<0b0, 0b1, "LSL", RegWidth, 32>;1728  def ZPR#RegWidth#ExtLSL64            : ZPRExtendRegisterOperand<0b0, 0b1, "LSL", RegWidth, 64>;1729}1730 1731class GPR64ShiftExtendAsmOperand <string AsmOperandName, int Scale, string RegClass> : AsmOperandClass {1732  let Name = AsmOperandName # Scale;1733  let PredicateMethod = "isGPR64WithShiftExtend<AArch64::"#RegClass#"RegClassID, " # Scale # ">";1734  let DiagnosticType = "Invalid" # AsmOperandName # Scale;1735  let RenderMethod = "addRegOperands";1736  let ParserMethod = "tryParseGPROperand<true>";1737}1738 1739class GPR64ExtendRegisterOperand<string Name, int Scale, RegisterClass RegClass> : RegisterOperand<RegClass>{1740  let ParserMatchClass = !cast<AsmOperandClass>(Name);1741  let PrintMethod = "printRegWithShiftExtend<false, " # Scale # ", 'x', 0>";1742}1743 1744foreach Scale = [8, 16, 32, 64, 128] in {1745  def GPR64shiftedAsmOpnd # Scale : GPR64ShiftExtendAsmOperand<"GPR64shifted", Scale, "GPR64">;1746  def GPR64shifted # Scale : GPR64ExtendRegisterOperand<"GPR64shiftedAsmOpnd" # Scale, Scale, GPR64>;1747 1748  def GPR64NoXZRshiftedAsmOpnd # Scale : GPR64ShiftExtendAsmOperand<"GPR64NoXZRshifted", Scale, "GPR64common">;1749  def GPR64NoXZRshifted # Scale : GPR64ExtendRegisterOperand<"GPR64NoXZRshiftedAsmOpnd" # Scale, Scale, GPR64common>;1750}1751 1752// Accumulator array tiles.1753def ZAQ0  : AArch64Reg<0,  "za0.q">;1754def ZAQ1  : AArch64Reg<1,  "za1.q">;1755def ZAQ2  : AArch64Reg<2,  "za2.q">;1756def ZAQ3  : AArch64Reg<3,  "za3.q">;1757def ZAQ4  : AArch64Reg<4,  "za4.q">;1758def ZAQ5  : AArch64Reg<5,  "za5.q">;1759def ZAQ6  : AArch64Reg<6,  "za6.q">;1760def ZAQ7  : AArch64Reg<7,  "za7.q">;1761def ZAQ8  : AArch64Reg<8,  "za8.q">;1762def ZAQ9  : AArch64Reg<9,  "za9.q">;1763def ZAQ10 : AArch64Reg<10, "za10.q">;1764def ZAQ11 : AArch64Reg<11, "za11.q">;1765def ZAQ12 : AArch64Reg<12, "za12.q">;1766def ZAQ13 : AArch64Reg<13, "za13.q">;1767def ZAQ14 : AArch64Reg<14, "za14.q">;1768def ZAQ15 : AArch64Reg<15, "za15.q">;1769 1770let SubRegIndices = [zasubq0, zasubq1] in {1771  def ZAD0 : AArch64Reg<0, "za0.d", [ZAQ0, ZAQ8]>;1772  def ZAD1 : AArch64Reg<1, "za1.d", [ZAQ1, ZAQ9]>;1773  def ZAD2 : AArch64Reg<2, "za2.d", [ZAQ2, ZAQ10]>;1774  def ZAD3 : AArch64Reg<3, "za3.d", [ZAQ3, ZAQ11]>;1775  def ZAD4 : AArch64Reg<4, "za4.d", [ZAQ4, ZAQ12]>;1776  def ZAD5 : AArch64Reg<5, "za5.d", [ZAQ5, ZAQ13]>;1777  def ZAD6 : AArch64Reg<6, "za6.d", [ZAQ6, ZAQ14]>;1778  def ZAD7 : AArch64Reg<7, "za7.d", [ZAQ7, ZAQ15]>;1779}1780 1781let SubRegIndices = [zasubd0, zasubd1] in {1782  def ZAS0 : AArch64Reg<0, "za0.s", [ZAD0, ZAD4]>;1783  def ZAS1 : AArch64Reg<1, "za1.s", [ZAD1, ZAD5]>;1784  def ZAS2 : AArch64Reg<2, "za2.s", [ZAD2, ZAD6]>;1785  def ZAS3 : AArch64Reg<3, "za3.s", [ZAD3, ZAD7]>;1786}1787 1788let SubRegIndices = [zasubs0, zasubs1] in {1789  def ZAH0 : AArch64Reg<0, "za0.h", [ZAS0, ZAS2]>;1790  def ZAH1 : AArch64Reg<1, "za1.h", [ZAS1, ZAS3]>;1791}1792 1793let SubRegIndices = [zasubh0, zasubh1] in {1794  def ZAB0 : AArch64Reg<0, "za0.b", [ZAH0, ZAH1]>;1795}1796 1797let SubRegIndices = [zasubb] in {1798  def ZA : AArch64Reg<0, "za", [ZAB0]>;1799}1800 1801def ZT0 : AArch64Reg<0, "zt0">;1802 1803// SME Register Classes1804 1805let isAllocatable = 0 in {1806  // Accumulator array1807  def MPR : RegisterClass<"AArch64", [untyped], 2048, (add ZA)> {1808    let Size = 2048;1809  }1810 1811  // Accumulator array as single tiles1812  def MPR8    : RegisterClass<"AArch64", [untyped], 2048, (add (sequence "ZAB%u", 0, 0))> {1813    let Size = 2048;1814  }1815  def MPR16   : RegisterClass<"AArch64", [untyped], 1024, (add (sequence "ZAH%u", 0, 1))> {1816    let Size = 1024;1817  }1818  def MPR32   : RegisterClass<"AArch64", [untyped],  512, (add (sequence "ZAS%u", 0, 3))> {1819    let Size = 512;1820  }1821  def MPR64   : RegisterClass<"AArch64", [untyped],  256, (add (sequence "ZAD%u", 0, 7))> {1822    let Size = 256;1823  }1824  def MPR128  : RegisterClass<"AArch64", [untyped],  128, (add (sequence "ZAQ%u", 0, 15))> {1825    let Size = 128;1826  }1827}1828 1829def ZTR : RegisterClass<"AArch64", [untyped], 512, (add ZT0)> {1830  let Size = 512;1831  let DiagnosticType = "InvalidLookupTable";1832}1833// SME Register Operands1834// There are three types of SME matrix register operands:1835// * Tiles:1836//1837//   These tiles make up the larger accumulator matrix. The tile representation1838//   has an element type suffix, e.g. za0.b or za15.q and can be any of the1839//   registers:1840//          ZAQ0..ZAQ151841//          ZAD0..ZAD71842//          ZAS0..ZAS31843//          ZAH0..ZAH11844//       or ZAB01845//1846// * Tile vectors:1847//1848//   Their representation is similar to regular tiles, but they have an extra1849//   'h' or 'v' to tell how the vector at [reg+offset] is laid out in the tile,1850//   horizontally or vertically.1851//1852//   e.g. za1h.h or za15v.q, which corresponds to vectors in registers ZAH1 and1853//   ZAQ15, respectively. The horizontal/vertical is more a property of the1854//   instruction, than a property of the asm-operand itself, or its register.1855//   The distinction is required for the parsing/printing of the operand,1856//   as from a compiler's perspective, the whole tile is read/written.1857//1858// * Accumulator matrix:1859//1860//   This is the entire matrix accumulator register ZA (<=> ZAB0), printed as1861//   'za'.1862 1863//1864// Tiles1865//1866 1867class MatrixTileAsmOperand<string RC, int EltSize> : AsmOperandClass {1868  let Name = "MatrixTile" # EltSize;1869  let DiagnosticType = "Invalid" # Name;1870  let ParserMethod = "tryParseMatrixRegister";1871  let RenderMethod = "addMatrixOperands";1872  let PredicateMethod = "isMatrixRegOperand<"1873                          # "MatrixKind::Tile" # ", "1874                          # EltSize # ", AArch64::" # RC # "RegClassID>";1875}1876 1877class MatrixTileOperand<int EltSize, RegisterClass RC>1878    : RegisterOperand<RC> {1879  let ParserMatchClass = MatrixTileAsmOperand<!cast<string>(RC), EltSize>;1880  let PrintMethod = "printMatrixTile";1881}1882 1883def TileOp16  : MatrixTileOperand<16, MPR16>;1884def TileOp32  : MatrixTileOperand<32, MPR32>;1885def TileOp64  : MatrixTileOperand<64, MPR64>;1886 1887//1888// Tile vectors (horizontal and vertical)1889//1890 1891class MatrixTileVectorAsmOperand<string RC, int EltSize, int IsVertical>1892    : AsmOperandClass {1893  let Name = "MatrixTileVector" # !if(IsVertical, "V", "H") # EltSize;1894  let DiagnosticType = "Invalid" # Name;1895  let ParserMethod = "tryParseMatrixRegister";1896  let RenderMethod = "addMatrixOperands";1897  let PredicateMethod = "isMatrixRegOperand<"1898                          # "MatrixKind::"1899                          # !if(IsVertical, "Col", "Row") # ", "1900                          # EltSize # ", AArch64::" # RC # "RegClassID>";1901}1902 1903class MatrixTileVectorOperand<int EltSize, RegisterClass RC, int IsVertical>1904    : RegisterOperand<RC> {1905  let ParserMatchClass = MatrixTileVectorAsmOperand<!cast<string>(RC), EltSize,1906                                                    IsVertical>;1907  let PrintMethod = "printMatrixTileVector<" # IsVertical # ">";1908}1909 1910def TileVectorOpH8   : MatrixTileVectorOperand<  8, MPR8,   0>;1911def TileVectorOpH16  : MatrixTileVectorOperand< 16, MPR16,  0>;1912def TileVectorOpH32  : MatrixTileVectorOperand< 32, MPR32,  0>;1913def TileVectorOpH64  : MatrixTileVectorOperand< 64, MPR64,  0>;1914def TileVectorOpH128 : MatrixTileVectorOperand<128, MPR128, 0>;1915 1916def TileVectorOpV8   : MatrixTileVectorOperand<  8, MPR8,   1>;1917def TileVectorOpV16  : MatrixTileVectorOperand< 16, MPR16,  1>;1918def TileVectorOpV32  : MatrixTileVectorOperand< 32, MPR32,  1>;1919def TileVectorOpV64  : MatrixTileVectorOperand< 64, MPR64,  1>;1920def TileVectorOpV128 : MatrixTileVectorOperand<128, MPR128, 1>;1921 1922//1923// Accumulator matrix1924//1925 1926class MatrixAsmOperand<string RC, int EltSize> : AsmOperandClass {1927  let Name = "Matrix" # !if(EltSize, !cast<string>(EltSize), "");1928  let DiagnosticType = "Invalid" # Name;1929  let ParserMethod = "tryParseMatrixRegister";1930  let RenderMethod = "addMatrixOperands";1931  let PredicateMethod = "isMatrixRegOperand<"1932                          # "MatrixKind::Array" # ", "1933                          # EltSize # ", AArch64::" # RC # "RegClassID>";1934}1935 1936class MatrixOperand<RegisterClass RC, int EltSize> : RegisterOperand<RC> {1937  let ParserMatchClass = MatrixAsmOperand<!cast<string>(RC), EltSize>;1938  let PrintMethod = "printMatrix<" # EltSize # ">";1939}1940 1941def MatrixOp : MatrixOperand<MPR, 0>;1942// SME2 register operands and classes1943def MatrixOp8 : MatrixOperand<MPR, 8>;1944def MatrixOp16 : MatrixOperand<MPR, 16>;1945def MatrixOp32 : MatrixOperand<MPR, 32>;1946def MatrixOp64 : MatrixOperand<MPR, 64>;1947 1948class MatrixTileListAsmOperand : AsmOperandClass {1949  let Name = "MatrixTileList";1950  let ParserMethod = "tryParseMatrixTileList";1951  let RenderMethod = "addMatrixTileListOperands";1952  let PredicateMethod = "isMatrixTileList";1953}1954 1955class MatrixTileListOperand : Operand<i8> {1956  let ParserMatchClass = MatrixTileListAsmOperand<>;1957  let DecoderMethod = "DecodeMatrixTileListRegisterClass";1958  let EncoderMethod = "EncodeMatrixTileListRegisterClass";1959  let PrintMethod = "printMatrixTileList";1960}1961 1962def MatrixTileList : MatrixTileListOperand<>;1963 1964def MatrixIndexGPR32_8_11 : RegisterClass<"AArch64", [i32], 32, (sequence "W%u", 8, 11)> {1965   let DiagnosticType = "InvalidMatrixIndexGPR32_8_11";1966   let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::MatrixIndexGPR32_8_11RegClassID, 0, 4>";1967}1968def MatrixIndexGPR32_12_15 : RegisterClass<"AArch64", [i32], 32, (sequence "W%u", 12, 15)> {1969  let DiagnosticType = "InvalidMatrixIndexGPR32_12_15";1970  let DecoderMethod = "DecodeSimpleRegisterClass<AArch64::MatrixIndexGPR32_12_15RegClassID, 0, 4>";1971}1972def MatrixIndexGPR32Op8_11 : RegisterOperand<MatrixIndexGPR32_8_11> {1973  let EncoderMethod = "encodeMatrixIndexGPR32<AArch64::W8>";1974}1975def MatrixIndexGPR32Op12_15 : RegisterOperand<MatrixIndexGPR32_12_15> {1976  let EncoderMethod = "encodeMatrixIndexGPR32<AArch64::W12>";1977}1978 1979def SVCROperand : AsmOperandClass {1980  let Name = "SVCR";1981  let ParserMethod = "tryParseSVCR";1982  let DiagnosticType = "Invalid" # Name;1983}1984 1985def svcr_op : Operand<i32>, TImmLeaf<i32, [{1986    return AArch64SVCR::lookupSVCRByEncoding(Imm) != nullptr;1987  }]> {1988  let ParserMatchClass = SVCROperand;1989  let PrintMethod = "printSVCROp";1990  let DecoderMethod = "DecodeSVCROp";1991  let MCOperandPredicate = [{1992    if (!MCOp.isImm())1993      return false;1994    return AArch64SVCR::lookupSVCRByEncoding(MCOp.getImm()) != nullptr;1995  }];1996}1997 1998let isAllocatable = 0, GeneratePressureSet = 0 in {1999  def W_HI_DummyRC : RegisterClass<"AArch64", [untyped], 0, (add (sequence "W%u_HI", 0, 30), WZR_HI, WSP_HI)>;2000  def B_HI_DummyRC : RegisterClass<"AArch64", [untyped], 0, (sequence "B%u_HI", 0, 31)>;2001  def H_HI_DummyRC : RegisterClass<"AArch64", [untyped], 0, (sequence "H%u_HI", 0, 31)>;2002  def S_HI_DummyRC : RegisterClass<"AArch64", [untyped], 0, (sequence "S%u_HI", 0, 31)>;2003  def D_HI_DummyRC : RegisterClass<"AArch64", [untyped], 0, (sequence "D%u_HI", 0, 31)>;2004  def Q_HI_DummyRC : RegisterClass<"AArch64", [untyped], 0, (sequence "Q%u_HI", 0, 31)>;2005}2006 2007//===----------------------------------------------------------------------===//2008// Register categories.2009//2010 2011def GeneralPurposeRegisters : RegisterCategory<[GPR64, GPR32]>;2012 2013def FIXED_REGS : RegisterClass<"AArch64", [i64], 64, (add FP, SP, VG, FFR)>;2014def FixedRegisters : RegisterCategory<[CCR, FIXED_REGS]>;2015