xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/Mips/MipsRegisterInfo.td (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
10b57cec5SDimitry Andric//===-- MipsRegisterInfo.td - Mips Register defs -----------*- tablegen -*-===//
20b57cec5SDimitry Andric//
30b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric//
70b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric
90b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
100b57cec5SDimitry Andric//  Declarations that describe the MIPS register file
110b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
120b57cec5SDimitry Andriclet Namespace = "Mips" in {
130b57cec5SDimitry Andricdef sub_32     : SubRegIndex<32>;
140b57cec5SDimitry Andricdef sub_64     : SubRegIndex<64>;
150b57cec5SDimitry Andricdef sub_lo     : SubRegIndex<32>;
160b57cec5SDimitry Andricdef sub_hi     : SubRegIndex<32, 32>;
170b57cec5SDimitry Andricdef sub_dsp16_19 : SubRegIndex<4, 16>;
180b57cec5SDimitry Andricdef sub_dsp20    : SubRegIndex<1, 20>;
190b57cec5SDimitry Andricdef sub_dsp21    : SubRegIndex<1, 21>;
200b57cec5SDimitry Andricdef sub_dsp22    : SubRegIndex<1, 22>;
210b57cec5SDimitry Andricdef sub_dsp23    : SubRegIndex<1, 23>;
220b57cec5SDimitry Andric}
230b57cec5SDimitry Andric
240b57cec5SDimitry Andricclass Unallocatable {
250b57cec5SDimitry Andric  bit isAllocatable = 0;
260b57cec5SDimitry Andric}
270b57cec5SDimitry Andric
280b57cec5SDimitry Andric// We have banks of 32 registers each.
290b57cec5SDimitry Andricclass MipsReg<bits<16> Enc, string n> : Register<n> {
300b57cec5SDimitry Andric  let HWEncoding = Enc;
310b57cec5SDimitry Andric  let Namespace = "Mips";
320b57cec5SDimitry Andric}
330b57cec5SDimitry Andric
340b57cec5SDimitry Andricclass MipsRegWithSubRegs<bits<16> Enc, string n, list<Register> subregs>
350b57cec5SDimitry Andric  : RegisterWithSubRegs<n, subregs> {
360b57cec5SDimitry Andric  let HWEncoding = Enc;
370b57cec5SDimitry Andric  let Namespace = "Mips";
380b57cec5SDimitry Andric}
390b57cec5SDimitry Andric
400b57cec5SDimitry Andric// Mips CPU Registers.
410b57cec5SDimitry Andricclass MipsGPRReg<bits<16> Enc, string n> : MipsReg<Enc, n>;
420b57cec5SDimitry Andric
430b57cec5SDimitry Andric// Mips 64-bit CPU Registers
440b57cec5SDimitry Andricclass Mips64GPRReg<bits<16> Enc, string n, list<Register> subregs>
450b57cec5SDimitry Andric  : MipsRegWithSubRegs<Enc, n, subregs> {
460b57cec5SDimitry Andric  let SubRegIndices = [sub_32];
470b57cec5SDimitry Andric}
480b57cec5SDimitry Andric
490b57cec5SDimitry Andric// Mips 32-bit FPU Registers
500b57cec5SDimitry Andricclass FPR<bits<16> Enc, string n> : MipsReg<Enc, n>;
510b57cec5SDimitry Andric
520b57cec5SDimitry Andric// Mips 64-bit (aliased) FPU Registers
530b57cec5SDimitry Andricclass AFPR<bits<16> Enc, string n, list<Register> subregs>
540b57cec5SDimitry Andric  : MipsRegWithSubRegs<Enc, n, subregs> {
550b57cec5SDimitry Andric  let SubRegIndices = [sub_lo, sub_hi];
560b57cec5SDimitry Andric  let CoveredBySubRegs = 1;
570b57cec5SDimitry Andric}
580b57cec5SDimitry Andric
590b57cec5SDimitry Andricclass AFPR64<bits<16> Enc, string n, list<Register> subregs>
600b57cec5SDimitry Andric  : MipsRegWithSubRegs<Enc, n, subregs> {
610b57cec5SDimitry Andric  let SubRegIndices = [sub_lo, sub_hi];
620b57cec5SDimitry Andric  let CoveredBySubRegs = 1;
630b57cec5SDimitry Andric}
640b57cec5SDimitry Andric
650b57cec5SDimitry Andric// Mips 128-bit (aliased) MSA Registers
660b57cec5SDimitry Andricclass AFPR128<bits<16> Enc, string n, list<Register> subregs>
670b57cec5SDimitry Andric  : MipsRegWithSubRegs<Enc, n, subregs> {
680b57cec5SDimitry Andric  let SubRegIndices = [sub_64];
690b57cec5SDimitry Andric}
700b57cec5SDimitry Andric
710b57cec5SDimitry Andric// Accumulator Registers
720b57cec5SDimitry Andricclass ACCReg<bits<16> Enc, string n, list<Register> subregs>
730b57cec5SDimitry Andric  : MipsRegWithSubRegs<Enc, n, subregs> {
740b57cec5SDimitry Andric  let SubRegIndices = [sub_lo, sub_hi];
750b57cec5SDimitry Andric  let CoveredBySubRegs = 1;
760b57cec5SDimitry Andric}
770b57cec5SDimitry Andric
780b57cec5SDimitry Andric// Mips Hardware Registers
790b57cec5SDimitry Andricclass HWR<bits<16> Enc, string n> : MipsReg<Enc, n>;
800b57cec5SDimitry Andric
810b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
820b57cec5SDimitry Andric//  Registers
830b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
840b57cec5SDimitry Andric
850b57cec5SDimitry Andriclet Namespace = "Mips" in {
860b57cec5SDimitry Andric  // General Purpose Registers
87*bdd1243dSDimitry Andric  let isConstant = true in
880b57cec5SDimitry Andric  def ZERO : MipsGPRReg< 0, "zero">, DwarfRegNum<[0]>;
890b57cec5SDimitry Andric  def AT   : MipsGPRReg< 1, "1">,    DwarfRegNum<[1]>;
900b57cec5SDimitry Andric  def V0   : MipsGPRReg< 2, "2">,    DwarfRegNum<[2]>;
910b57cec5SDimitry Andric  def V1   : MipsGPRReg< 3, "3">,    DwarfRegNum<[3]>;
920b57cec5SDimitry Andric  def A0   : MipsGPRReg< 4, "4">,    DwarfRegNum<[4]>;
930b57cec5SDimitry Andric  def A1   : MipsGPRReg< 5, "5">,    DwarfRegNum<[5]>;
940b57cec5SDimitry Andric  def A2   : MipsGPRReg< 6, "6">,    DwarfRegNum<[6]>;
950b57cec5SDimitry Andric  def A3   : MipsGPRReg< 7, "7">,    DwarfRegNum<[7]>;
960b57cec5SDimitry Andric  def T0   : MipsGPRReg< 8, "8">,    DwarfRegNum<[8]>;
970b57cec5SDimitry Andric  def T1   : MipsGPRReg< 9, "9">,    DwarfRegNum<[9]>;
980b57cec5SDimitry Andric  def T2   : MipsGPRReg< 10, "10">,  DwarfRegNum<[10]>;
990b57cec5SDimitry Andric  def T3   : MipsGPRReg< 11, "11">,  DwarfRegNum<[11]>;
1000b57cec5SDimitry Andric  def T4   : MipsGPRReg< 12, "12">,  DwarfRegNum<[12]>;
1010b57cec5SDimitry Andric  def T5   : MipsGPRReg< 13, "13">,  DwarfRegNum<[13]>;
1020b57cec5SDimitry Andric  def T6   : MipsGPRReg< 14, "14">,  DwarfRegNum<[14]>;
1030b57cec5SDimitry Andric  def T7   : MipsGPRReg< 15, "15">,  DwarfRegNum<[15]>;
1040b57cec5SDimitry Andric  def S0   : MipsGPRReg< 16, "16">,  DwarfRegNum<[16]>;
1050b57cec5SDimitry Andric  def S1   : MipsGPRReg< 17, "17">,  DwarfRegNum<[17]>;
1060b57cec5SDimitry Andric  def S2   : MipsGPRReg< 18, "18">,  DwarfRegNum<[18]>;
1070b57cec5SDimitry Andric  def S3   : MipsGPRReg< 19, "19">,  DwarfRegNum<[19]>;
1080b57cec5SDimitry Andric  def S4   : MipsGPRReg< 20, "20">,  DwarfRegNum<[20]>;
1090b57cec5SDimitry Andric  def S5   : MipsGPRReg< 21, "21">,  DwarfRegNum<[21]>;
1100b57cec5SDimitry Andric  def S6   : MipsGPRReg< 22, "22">,  DwarfRegNum<[22]>;
1110b57cec5SDimitry Andric  def S7   : MipsGPRReg< 23, "23">,  DwarfRegNum<[23]>;
1120b57cec5SDimitry Andric  def T8   : MipsGPRReg< 24, "24">,  DwarfRegNum<[24]>;
1130b57cec5SDimitry Andric  def T9   : MipsGPRReg< 25, "25">,  DwarfRegNum<[25]>;
1140b57cec5SDimitry Andric  def K0   : MipsGPRReg< 26, "26">,  DwarfRegNum<[26]>;
1150b57cec5SDimitry Andric  def K1   : MipsGPRReg< 27, "27">,  DwarfRegNum<[27]>;
1160b57cec5SDimitry Andric  def GP   : MipsGPRReg< 28, "gp">,  DwarfRegNum<[28]>;
1170b57cec5SDimitry Andric  def SP   : MipsGPRReg< 29, "sp">,  DwarfRegNum<[29]>;
1180b57cec5SDimitry Andric  def FP   : MipsGPRReg< 30, "fp">,  DwarfRegNum<[30]>;
1190b57cec5SDimitry Andric  def RA   : MipsGPRReg< 31, "ra">,  DwarfRegNum<[31]>;
1200b57cec5SDimitry Andric
1210b57cec5SDimitry Andric  // General Purpose 64-bit Registers
122*bdd1243dSDimitry Andric  let isConstant = true in
1230b57cec5SDimitry Andric  def ZERO_64 : Mips64GPRReg< 0, "zero", [ZERO]>, DwarfRegNum<[0]>;
1240b57cec5SDimitry Andric  def AT_64   : Mips64GPRReg< 1, "1",    [AT]>, DwarfRegNum<[1]>;
1250b57cec5SDimitry Andric  def V0_64   : Mips64GPRReg< 2, "2",    [V0]>, DwarfRegNum<[2]>;
1260b57cec5SDimitry Andric  def V1_64   : Mips64GPRReg< 3, "3",    [V1]>, DwarfRegNum<[3]>;
1270b57cec5SDimitry Andric  def A0_64   : Mips64GPRReg< 4, "4",    [A0]>, DwarfRegNum<[4]>;
1280b57cec5SDimitry Andric  def A1_64   : Mips64GPRReg< 5, "5",    [A1]>, DwarfRegNum<[5]>;
1290b57cec5SDimitry Andric  def A2_64   : Mips64GPRReg< 6, "6",    [A2]>, DwarfRegNum<[6]>;
1300b57cec5SDimitry Andric  def A3_64   : Mips64GPRReg< 7, "7",    [A3]>, DwarfRegNum<[7]>;
1310b57cec5SDimitry Andric  def T0_64   : Mips64GPRReg< 8, "8",    [T0]>, DwarfRegNum<[8]>;
1320b57cec5SDimitry Andric  def T1_64   : Mips64GPRReg< 9, "9",    [T1]>, DwarfRegNum<[9]>;
1330b57cec5SDimitry Andric  def T2_64   : Mips64GPRReg< 10, "10",  [T2]>, DwarfRegNum<[10]>;
1340b57cec5SDimitry Andric  def T3_64   : Mips64GPRReg< 11, "11",  [T3]>, DwarfRegNum<[11]>;
1350b57cec5SDimitry Andric  def T4_64   : Mips64GPRReg< 12, "12",  [T4]>, DwarfRegNum<[12]>;
1360b57cec5SDimitry Andric  def T5_64   : Mips64GPRReg< 13, "13",  [T5]>, DwarfRegNum<[13]>;
1370b57cec5SDimitry Andric  def T6_64   : Mips64GPRReg< 14, "14",  [T6]>, DwarfRegNum<[14]>;
1380b57cec5SDimitry Andric  def T7_64   : Mips64GPRReg< 15, "15",  [T7]>, DwarfRegNum<[15]>;
1390b57cec5SDimitry Andric  def S0_64   : Mips64GPRReg< 16, "16",  [S0]>, DwarfRegNum<[16]>;
1400b57cec5SDimitry Andric  def S1_64   : Mips64GPRReg< 17, "17",  [S1]>, DwarfRegNum<[17]>;
1410b57cec5SDimitry Andric  def S2_64   : Mips64GPRReg< 18, "18",  [S2]>, DwarfRegNum<[18]>;
1420b57cec5SDimitry Andric  def S3_64   : Mips64GPRReg< 19, "19",  [S3]>, DwarfRegNum<[19]>;
1430b57cec5SDimitry Andric  def S4_64   : Mips64GPRReg< 20, "20",  [S4]>, DwarfRegNum<[20]>;
1440b57cec5SDimitry Andric  def S5_64   : Mips64GPRReg< 21, "21",  [S5]>, DwarfRegNum<[21]>;
1450b57cec5SDimitry Andric  def S6_64   : Mips64GPRReg< 22, "22",  [S6]>, DwarfRegNum<[22]>;
1460b57cec5SDimitry Andric  def S7_64   : Mips64GPRReg< 23, "23",  [S7]>, DwarfRegNum<[23]>;
1470b57cec5SDimitry Andric  def T8_64   : Mips64GPRReg< 24, "24",  [T8]>, DwarfRegNum<[24]>;
1480b57cec5SDimitry Andric  def T9_64   : Mips64GPRReg< 25, "25",  [T9]>, DwarfRegNum<[25]>;
1490b57cec5SDimitry Andric  def K0_64   : Mips64GPRReg< 26, "26",  [K0]>, DwarfRegNum<[26]>;
1500b57cec5SDimitry Andric  def K1_64   : Mips64GPRReg< 27, "27",  [K1]>, DwarfRegNum<[27]>;
1510b57cec5SDimitry Andric  def GP_64   : Mips64GPRReg< 28, "gp",  [GP]>, DwarfRegNum<[28]>;
1520b57cec5SDimitry Andric  def SP_64   : Mips64GPRReg< 29, "sp",  [SP]>, DwarfRegNum<[29]>;
1530b57cec5SDimitry Andric  def FP_64   : Mips64GPRReg< 30, "fp",  [FP]>, DwarfRegNum<[30]>;
1540b57cec5SDimitry Andric  def RA_64   : Mips64GPRReg< 31, "ra",  [RA]>, DwarfRegNum<[31]>;
1550b57cec5SDimitry Andric
1560b57cec5SDimitry Andric  /// Mips Single point precision FPU Registers
1570b57cec5SDimitry Andric  foreach I = 0-31 in
1580b57cec5SDimitry Andric  def F#I : FPR<I, "f"#I>, DwarfRegNum<[!add(I, 32)]>;
1590b57cec5SDimitry Andric
1600b57cec5SDimitry Andric  // Higher half of 64-bit FP registers.
1610b57cec5SDimitry Andric  foreach I = 0-31 in
1620b57cec5SDimitry Andric  def F_HI#I : FPR<I, "f"#I>, DwarfRegNum<[!add(I, 32)]>;
1630b57cec5SDimitry Andric
1640b57cec5SDimitry Andric  /// Mips Double point precision FPU Registers (aliased
1650b57cec5SDimitry Andric  /// with the single precision to hold 64 bit values)
1660b57cec5SDimitry Andric  foreach I = 0-15 in
1670b57cec5SDimitry Andric  def D#I : AFPR<!shl(I, 1), "f"#!shl(I, 1),
1680b57cec5SDimitry Andric                 [!cast<FPR>("F"#!shl(I, 1)),
1690b57cec5SDimitry Andric                  !cast<FPR>("F"#!add(!shl(I, 1), 1))]>;
1700b57cec5SDimitry Andric
1710b57cec5SDimitry Andric  /// Mips Double point precision FPU Registers in MFP64 mode.
1720b57cec5SDimitry Andric  foreach I = 0-31 in
1730b57cec5SDimitry Andric  def D#I#_64 : AFPR64<I, "f"#I, [!cast<FPR>("F"#I), !cast<FPR>("F_HI"#I)]>,
1740b57cec5SDimitry Andric                DwarfRegNum<[!add(I, 32)]>;
1750b57cec5SDimitry Andric
1760b57cec5SDimitry Andric  /// Mips MSA registers
1770b57cec5SDimitry Andric  /// MSA and FPU cannot both be present unless the FPU has 64-bit registers
1780b57cec5SDimitry Andric  foreach I = 0-31 in
1790b57cec5SDimitry Andric  def W#I : AFPR128<I, "w"#I, [!cast<AFPR64>("D"#I#"_64")]>,
1800b57cec5SDimitry Andric            DwarfRegNum<[!add(I, 32)]>;
1810b57cec5SDimitry Andric
1820b57cec5SDimitry Andric  // Hi/Lo registers
1830b57cec5SDimitry Andric  def HI0 : MipsReg<0, "ac0">, DwarfRegNum<[64]>;
1840b57cec5SDimitry Andric  def HI1 : MipsReg<1, "ac1">, DwarfRegNum<[176]>;
1850b57cec5SDimitry Andric  def HI2 : MipsReg<2, "ac2">, DwarfRegNum<[178]>;
1860b57cec5SDimitry Andric  def HI3 : MipsReg<3, "ac3">, DwarfRegNum<[180]>;
1870b57cec5SDimitry Andric  def LO0 : MipsReg<0, "ac0">, DwarfRegNum<[65]>;
1880b57cec5SDimitry Andric  def LO1 : MipsReg<1, "ac1">, DwarfRegNum<[177]>;
1890b57cec5SDimitry Andric  def LO2 : MipsReg<2, "ac2">, DwarfRegNum<[179]>;
1900b57cec5SDimitry Andric  def LO3 : MipsReg<3, "ac3">, DwarfRegNum<[181]>;
1910b57cec5SDimitry Andric
1920b57cec5SDimitry Andric  let SubRegIndices = [sub_32] in {
1930b57cec5SDimitry Andric  def HI0_64  : RegisterWithSubRegs<"hi", [HI0]>;
1940b57cec5SDimitry Andric  def LO0_64  : RegisterWithSubRegs<"lo", [LO0]>;
1950b57cec5SDimitry Andric  }
1960b57cec5SDimitry Andric
1970b57cec5SDimitry Andric  // FP control registers.
1980b57cec5SDimitry Andric  foreach I = 0-31 in
1995ffd83dbSDimitry Andric  def FCR#I : MipsReg<I, ""#I>;
2000b57cec5SDimitry Andric
2010b57cec5SDimitry Andric  // FP condition code registers.
2020b57cec5SDimitry Andric  foreach I = 0-7 in
2035ffd83dbSDimitry Andric  def FCC#I : MipsReg<I, "fcc"#I>;
2040b57cec5SDimitry Andric
2050b57cec5SDimitry Andric  // COP0 registers.
2060b57cec5SDimitry Andric  foreach I = 0-31 in
2075ffd83dbSDimitry Andric  def COP0#I : MipsReg<I, ""#I>;
2080b57cec5SDimitry Andric
2090b57cec5SDimitry Andric  // COP2 registers.
2100b57cec5SDimitry Andric  foreach I = 0-31 in
2115ffd83dbSDimitry Andric  def COP2#I : MipsReg<I, ""#I>;
2120b57cec5SDimitry Andric
2130b57cec5SDimitry Andric  // COP3 registers.
2140b57cec5SDimitry Andric  foreach I = 0-31 in
2155ffd83dbSDimitry Andric  def COP3#I : MipsReg<I, ""#I>;
2160b57cec5SDimitry Andric
2170b57cec5SDimitry Andric  // PC register
2180b57cec5SDimitry Andric  def PC : Register<"pc">;
2190b57cec5SDimitry Andric
2200b57cec5SDimitry Andric  // Hardware registers
2210b57cec5SDimitry Andric  def HWR0 : MipsReg<0, "hwr_cpunum">;
2220b57cec5SDimitry Andric  def HWR1 : MipsReg<1, "hwr_synci_step">;
2230b57cec5SDimitry Andric  def HWR2 : MipsReg<2, "hwr_cc">;
2240b57cec5SDimitry Andric  def HWR3 : MipsReg<3, "hwr_ccres">;
2250b57cec5SDimitry Andric
2260b57cec5SDimitry Andric  foreach I = 4-31 in
2275ffd83dbSDimitry Andric  def HWR#I : MipsReg<I, ""#I>;
2280b57cec5SDimitry Andric
2290b57cec5SDimitry Andric  // Accum registers
2300b57cec5SDimitry Andric  foreach I = 0-3 in
2315ffd83dbSDimitry Andric  def AC#I : ACCReg<I, "ac"#I,
2320b57cec5SDimitry Andric                    [!cast<Register>("LO"#I), !cast<Register>("HI"#I)]>;
2330b57cec5SDimitry Andric
2340b57cec5SDimitry Andric  def AC0_64 : ACCReg<0, "ac0", [LO0_64, HI0_64]>;
2350b57cec5SDimitry Andric
2360b57cec5SDimitry Andric  // DSP-ASE control register fields.
2370b57cec5SDimitry Andric  def DSPPos : Register<"">;
2380b57cec5SDimitry Andric  def DSPSCount : Register<"">;
2390b57cec5SDimitry Andric  def DSPCarry : Register<"">;
2400b57cec5SDimitry Andric  def DSPEFI : Register<"">;
2410b57cec5SDimitry Andric  def DSPOutFlag16_19 : Register<"">;
2420b57cec5SDimitry Andric  def DSPOutFlag20 : Register<"">;
2430b57cec5SDimitry Andric  def DSPOutFlag21 : Register<"">;
2440b57cec5SDimitry Andric  def DSPOutFlag22 : Register<"">;
2450b57cec5SDimitry Andric  def DSPOutFlag23 : Register<"">;
2460b57cec5SDimitry Andric  def DSPCCond : Register<"">;
2470b57cec5SDimitry Andric
2480b57cec5SDimitry Andric  let SubRegIndices = [sub_dsp16_19, sub_dsp20, sub_dsp21, sub_dsp22,
2490b57cec5SDimitry Andric                       sub_dsp23] in
2500b57cec5SDimitry Andric  def DSPOutFlag : RegisterWithSubRegs<"", [DSPOutFlag16_19, DSPOutFlag20,
2510b57cec5SDimitry Andric                                            DSPOutFlag21, DSPOutFlag22,
2520b57cec5SDimitry Andric                                            DSPOutFlag23]>;
2530b57cec5SDimitry Andric
2540b57cec5SDimitry Andric  // MSA-ASE control registers.
2550b57cec5SDimitry Andric  def MSAIR      : MipsReg<0, "0">;
2560b57cec5SDimitry Andric  def MSACSR     : MipsReg<1, "1">;
2570b57cec5SDimitry Andric  def MSAAccess  : MipsReg<2, "2">;
2580b57cec5SDimitry Andric  def MSASave    : MipsReg<3, "3">;
2590b57cec5SDimitry Andric  def MSAModify  : MipsReg<4, "4">;
2600b57cec5SDimitry Andric  def MSARequest : MipsReg<5, "5">;
2610b57cec5SDimitry Andric  def MSAMap     : MipsReg<6, "6">;
2620b57cec5SDimitry Andric  def MSAUnmap   : MipsReg<7, "7">;
2630b57cec5SDimitry Andric  // MSA-ASE fake control registers.
2640b57cec5SDimitry Andric  // These registers do not exist, but instructions like `cfcmsa`
2650b57cec5SDimitry Andric  // and `ctcmsa` allows to specify them.
2660b57cec5SDimitry Andric  foreach I = 8-31 in
2675ffd83dbSDimitry Andric  def MSA#I : MipsReg<I, ""#I>;
2680b57cec5SDimitry Andric
2690b57cec5SDimitry Andric  // Octeon multiplier and product registers
2700b57cec5SDimitry Andric  def MPL0 : MipsReg<0, "mpl0">;
2710b57cec5SDimitry Andric  def MPL1 : MipsReg<1, "mpl1">;
2720b57cec5SDimitry Andric  def MPL2 : MipsReg<2, "mpl2">;
2730b57cec5SDimitry Andric  def P0 : MipsReg<0, "p0">;
2740b57cec5SDimitry Andric  def P1 : MipsReg<1, "p1">;
2750b57cec5SDimitry Andric  def P2 : MipsReg<2, "p2">;
2760b57cec5SDimitry Andric
2770b57cec5SDimitry Andric}
2780b57cec5SDimitry Andric
2790b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
2800b57cec5SDimitry Andric// Register Classes
2810b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
2820b57cec5SDimitry Andric
2830b57cec5SDimitry Andricclass GPR32Class<list<ValueType> regTypes> :
2840b57cec5SDimitry Andric  RegisterClass<"Mips", regTypes, 32, (add
2850b57cec5SDimitry Andric  // Reserved
2860b57cec5SDimitry Andric  ZERO, AT,
2870b57cec5SDimitry Andric  // Return Values and Arguments
2880b57cec5SDimitry Andric  V0, V1, A0, A1, A2, A3,
2890b57cec5SDimitry Andric  // Not preserved across procedure calls
2900b57cec5SDimitry Andric  T0, T1, T2, T3, T4, T5, T6, T7,
2910b57cec5SDimitry Andric  // Callee save
2920b57cec5SDimitry Andric  S0, S1, S2, S3, S4, S5, S6, S7,
2930b57cec5SDimitry Andric  // Not preserved across procedure calls
2940b57cec5SDimitry Andric  T8, T9,
2950b57cec5SDimitry Andric  // Reserved
2960b57cec5SDimitry Andric  K0, K1, GP, SP, FP, RA)>;
2970b57cec5SDimitry Andric
2980b57cec5SDimitry Andricdef GPR32 : GPR32Class<[i32]>;
2990b57cec5SDimitry Andric
3000b57cec5SDimitry Andricdef GPR32ZERO : RegisterClass<"Mips", [i32], 32, (add
3010b57cec5SDimitry Andric  // Reserved
3020b57cec5SDimitry Andric  ZERO)>;
3030b57cec5SDimitry Andric
3040b57cec5SDimitry Andricdef GPR32NONZERO : RegisterClass<"Mips", [i32], 32, (add
3050b57cec5SDimitry Andric  // Reserved
3060b57cec5SDimitry Andric  AT,
3070b57cec5SDimitry Andric  // Return Values and Arguments
3080b57cec5SDimitry Andric  V0, V1, A0, A1, A2, A3,
3090b57cec5SDimitry Andric  // Not preserved across procedure calls
3100b57cec5SDimitry Andric  T0, T1, T2, T3, T4, T5, T6, T7,
3110b57cec5SDimitry Andric  // Callee save
3120b57cec5SDimitry Andric  S0, S1, S2, S3, S4, S5, S6, S7,
3130b57cec5SDimitry Andric  // Not preserved across procedure calls
3140b57cec5SDimitry Andric  T8, T9,
3150b57cec5SDimitry Andric  // Reserved
3160b57cec5SDimitry Andric  K0, K1, GP, SP, FP, RA)>;
3170b57cec5SDimitry Andric
3180b57cec5SDimitry Andricdef DSPR  : GPR32Class<[v4i8, v2i16]>;
3190b57cec5SDimitry Andric
3200b57cec5SDimitry Andricdef GPRMM16 : RegisterClass<"Mips", [i32], 32, (add
3210b57cec5SDimitry Andric  // Callee save
3220b57cec5SDimitry Andric  S0, S1,
3230b57cec5SDimitry Andric  // Return Values and Arguments
3240b57cec5SDimitry Andric  V0, V1, A0, A1, A2, A3)>;
3250b57cec5SDimitry Andric
3260b57cec5SDimitry Andricdef GPRMM16Zero : RegisterClass<"Mips", [i32], 32, (add
3270b57cec5SDimitry Andric  // Reserved
3280b57cec5SDimitry Andric  ZERO,
3290b57cec5SDimitry Andric  // Callee save
3300b57cec5SDimitry Andric  S1,
3310b57cec5SDimitry Andric  // Return Values and Arguments
3320b57cec5SDimitry Andric  V0, V1, A0, A1, A2, A3)>;
3330b57cec5SDimitry Andric
3340b57cec5SDimitry Andricdef GPRMM16MoveP : RegisterClass<"Mips", [i32], 32, (add
3350b57cec5SDimitry Andric  // Reserved
3360b57cec5SDimitry Andric  ZERO,
3370b57cec5SDimitry Andric  // Callee save
3380b57cec5SDimitry Andric  S1,
3390b57cec5SDimitry Andric  // Return Values and Arguments
3400b57cec5SDimitry Andric  V0, V1,
3410b57cec5SDimitry Andric  // Callee save
3420b57cec5SDimitry Andric  S0, S2, S3, S4)>;
3430b57cec5SDimitry Andric
3440b57cec5SDimitry Andricdef GPRMM16MovePPairFirst : RegisterClass<"Mips", [i32], 32, (add
3450b57cec5SDimitry Andric  // Arguments
3460b57cec5SDimitry Andric  A0, A1, A2)>;
3470b57cec5SDimitry Andric
3480b57cec5SDimitry Andricdef GPRMM16MovePPairSecond : RegisterClass<"Mips", [i32], 32, (add
3490b57cec5SDimitry Andric  // Arguments
3500b57cec5SDimitry Andric  A1, A2, A3,
3510b57cec5SDimitry Andric  // Callee save
3520b57cec5SDimitry Andric  S5, S6)>;
3530b57cec5SDimitry Andric
3540b57cec5SDimitry Andricdef GPR64 : RegisterClass<"Mips", [i64], 64, (add
3550b57cec5SDimitry Andric  // Reserved
3560b57cec5SDimitry Andric  ZERO_64, AT_64,
3570b57cec5SDimitry Andric  // Return Values and Arguments
3580b57cec5SDimitry Andric  V0_64, V1_64, A0_64, A1_64, A2_64, A3_64,
3590b57cec5SDimitry Andric  // Not preserved across procedure calls
3600b57cec5SDimitry Andric  T0_64, T1_64, T2_64, T3_64, T4_64, T5_64, T6_64, T7_64,
3610b57cec5SDimitry Andric  // Callee save
3620b57cec5SDimitry Andric  S0_64, S1_64, S2_64, S3_64, S4_64, S5_64, S6_64, S7_64,
3630b57cec5SDimitry Andric  // Not preserved across procedure calls
3640b57cec5SDimitry Andric  T8_64, T9_64,
3650b57cec5SDimitry Andric  // Reserved
3660b57cec5SDimitry Andric  K0_64, K1_64, GP_64, SP_64, FP_64, RA_64)>;
3670b57cec5SDimitry Andric
3680b57cec5SDimitry Andricdef CPU16Regs : RegisterClass<"Mips", [i32], 32, (add
3690b57cec5SDimitry Andric  // Return Values and Arguments
3700b57cec5SDimitry Andric  V0, V1, A0, A1, A2, A3,
3710b57cec5SDimitry Andric  // Callee save
3720b57cec5SDimitry Andric  S0, S1)>;
3730b57cec5SDimitry Andric
3740b57cec5SDimitry Andricdef CPU16RegsPlusSP : RegisterClass<"Mips", [i32], 32, (add
3750b57cec5SDimitry Andric  // Return Values and Arguments
3760b57cec5SDimitry Andric  V0, V1, A0, A1, A2, A3,
3770b57cec5SDimitry Andric  // Callee save
3780b57cec5SDimitry Andric  S0, S1,
3790b57cec5SDimitry Andric  SP)>;
3800b57cec5SDimitry Andric
3810b57cec5SDimitry Andricdef CPURAReg : RegisterClass<"Mips", [i32], 32, (add RA)>, Unallocatable;
3820b57cec5SDimitry Andric
3830b57cec5SDimitry Andricdef CPUSPReg : RegisterClass<"Mips", [i32], 32, (add SP)>, Unallocatable;
3840b57cec5SDimitry Andric
3850b57cec5SDimitry Andric// 64bit fp:
3860b57cec5SDimitry Andric// * FGR64  - 32 64-bit registers
3870b57cec5SDimitry Andric// * AFGR64 - 16 32-bit even registers (32-bit FP Mode)
3880b57cec5SDimitry Andric//
3890b57cec5SDimitry Andric// 32bit fp:
3900b57cec5SDimitry Andric// * FGR32 - 16 32-bit even registers
3910b57cec5SDimitry Andric// * FGR32 - 32 32-bit registers (single float only mode)
3920b57cec5SDimitry Andricdef FGR32 : RegisterClass<"Mips", [f32], 32, (sequence "F%u", 0, 31)> {
3930b57cec5SDimitry Andric  // Do not allocate odd registers when given -mattr=+nooddspreg.
3940b57cec5SDimitry Andric  let AltOrders = [(decimate FGR32, 2)];
3950b57cec5SDimitry Andric  let AltOrderSelect = [{
3960b57cec5SDimitry Andric    const auto & S = MF.getSubtarget<MipsSubtarget>();
3970b57cec5SDimitry Andric    return S.isABI_O32() && !S.useOddSPReg();
3980b57cec5SDimitry Andric  }];
3990b57cec5SDimitry Andric}
4000b57cec5SDimitry Andric
4010b57cec5SDimitry Andricdef AFGR64 : RegisterClass<"Mips", [f64], 64, (add
4020b57cec5SDimitry Andric  // Return Values and Arguments
4030b57cec5SDimitry Andric  D0, D1,
4040b57cec5SDimitry Andric  // Not preserved across procedure calls
4050b57cec5SDimitry Andric  D2, D3, D4, D5,
4060b57cec5SDimitry Andric  // Return Values and Arguments
4070b57cec5SDimitry Andric  D6, D7,
4080b57cec5SDimitry Andric  // Not preserved across procedure calls
4090b57cec5SDimitry Andric  D8, D9,
4100b57cec5SDimitry Andric  // Callee save
4110b57cec5SDimitry Andric  D10, D11, D12, D13, D14, D15)>;
4120b57cec5SDimitry Andric
4130b57cec5SDimitry Andricdef FGR64 : RegisterClass<"Mips", [f64], 64, (sequence "D%u_64", 0, 31)> {
4140b57cec5SDimitry Andric  // Do not allocate odd registers when given -mattr=+nooddspreg.
4150b57cec5SDimitry Andric  let AltOrders = [(decimate FGR64, 2)];
4160b57cec5SDimitry Andric  let AltOrderSelect = [{
4170b57cec5SDimitry Andric    const auto & S = MF.getSubtarget<MipsSubtarget>();
4180b57cec5SDimitry Andric    return S.isABI_O32() && !S.useOddSPReg();
4190b57cec5SDimitry Andric  }];
4200b57cec5SDimitry Andric}
4210b57cec5SDimitry Andric
4220b57cec5SDimitry Andric// FP control registers.
4230b57cec5SDimitry Andricdef CCR : RegisterClass<"Mips", [i32], 32, (sequence "FCR%u", 0, 31)>,
4240b57cec5SDimitry Andric          Unallocatable;
4250b57cec5SDimitry Andric
4260b57cec5SDimitry Andric// FP condition code registers.
4270b57cec5SDimitry Andricdef FCC : RegisterClass<"Mips", [i32], 32, (sequence "FCC%u", 0, 7)>,
4280b57cec5SDimitry Andric          Unallocatable;
4290b57cec5SDimitry Andric
4300b57cec5SDimitry Andric// MIPS32r6/MIPS64r6 store FPU condition codes in normal FGR registers.
4310b57cec5SDimitry Andric// This class allows us to represent this in codegen patterns.
4320b57cec5SDimitry Andricdef FGRCC : RegisterClass<"Mips", [i32], 32, (sequence "F%u", 0, 31)>;
4330b57cec5SDimitry Andric
4340b57cec5SDimitry Andricdef MSA128F16 : RegisterClass<"Mips", [f16], 128, (sequence "W%u", 0, 31)>;
4350b57cec5SDimitry Andric
4360b57cec5SDimitry Andricdef MSA128B: RegisterClass<"Mips", [v16i8], 128,
4370b57cec5SDimitry Andric                           (sequence "W%u", 0, 31)>;
4380b57cec5SDimitry Andricdef MSA128H: RegisterClass<"Mips", [v8i16, v8f16], 128,
4390b57cec5SDimitry Andric                           (sequence "W%u", 0, 31)>;
4400b57cec5SDimitry Andricdef MSA128W: RegisterClass<"Mips", [v4i32, v4f32], 128,
4410b57cec5SDimitry Andric                           (sequence "W%u", 0, 31)>;
4420b57cec5SDimitry Andricdef MSA128D: RegisterClass<"Mips", [v2i64, v2f64], 128,
4430b57cec5SDimitry Andric                           (sequence "W%u", 0, 31)>;
4440b57cec5SDimitry Andricdef MSA128WEvens: RegisterClass<"Mips", [v4i32, v4f32], 128,
4450b57cec5SDimitry Andric                                (decimate (sequence "W%u", 0, 31), 2)>;
4460b57cec5SDimitry Andric
4470b57cec5SDimitry Andricdef MSACtrl: RegisterClass<"Mips", [i32], 32, (add
4480b57cec5SDimitry Andric  MSAIR, MSACSR, MSAAccess, MSASave, MSAModify, MSARequest, MSAMap, MSAUnmap,
4490b57cec5SDimitry Andric  (sequence "MSA%u", 8, 31))>, Unallocatable;
4500b57cec5SDimitry Andric
4510b57cec5SDimitry Andric// Hi/Lo Registers
4520b57cec5SDimitry Andricdef LO32 : RegisterClass<"Mips", [i32], 32, (add LO0)>;
4530b57cec5SDimitry Andricdef HI32 : RegisterClass<"Mips", [i32], 32, (add HI0)>;
4540b57cec5SDimitry Andricdef LO32DSP : RegisterClass<"Mips", [i32], 32, (sequence "LO%u", 0, 3)>;
4550b57cec5SDimitry Andricdef HI32DSP : RegisterClass<"Mips", [i32], 32, (sequence "HI%u", 0, 3)>;
4560b57cec5SDimitry Andricdef LO64 : RegisterClass<"Mips", [i64], 64, (add LO0_64)>;
4570b57cec5SDimitry Andricdef HI64 : RegisterClass<"Mips", [i64], 64, (add HI0_64)>;
4580b57cec5SDimitry Andric
4590b57cec5SDimitry Andric// Hardware registers
4600b57cec5SDimitry Andricdef HWRegs : RegisterClass<"Mips", [i32], 32, (sequence "HWR%u", 0, 31)>,
4610b57cec5SDimitry Andric             Unallocatable;
4620b57cec5SDimitry Andric
4630b57cec5SDimitry Andric// Accumulator Registers
4640b57cec5SDimitry Andricdef ACC64 : RegisterClass<"Mips", [untyped], 64, (add AC0)> {
4650b57cec5SDimitry Andric  let Size = 64;
4660b57cec5SDimitry Andric}
4670b57cec5SDimitry Andric
4680b57cec5SDimitry Andricdef ACC128 : RegisterClass<"Mips", [untyped], 128, (add AC0_64)> {
4690b57cec5SDimitry Andric  let Size = 128;
4700b57cec5SDimitry Andric}
4710b57cec5SDimitry Andric
4720b57cec5SDimitry Andricdef ACC64DSP : RegisterClass<"Mips", [untyped], 64, (sequence "AC%u", 0, 3)> {
4730b57cec5SDimitry Andric  let Size = 64;
4740b57cec5SDimitry Andric}
4750b57cec5SDimitry Andric
4760b57cec5SDimitry Andricdef DSPCC : RegisterClass<"Mips", [v4i8, v2i16], 32, (add DSPCCond)>;
4770b57cec5SDimitry Andric
4780b57cec5SDimitry Andric// Coprocessor 0 registers.
4790b57cec5SDimitry Andricdef COP0 : RegisterClass<"Mips", [i32], 32, (sequence "COP0%u", 0, 31)>,
4800b57cec5SDimitry Andric           Unallocatable;
4810b57cec5SDimitry Andric
4820b57cec5SDimitry Andric// Coprocessor 2 registers.
4830b57cec5SDimitry Andricdef COP2 : RegisterClass<"Mips", [i32], 32, (sequence "COP2%u", 0, 31)>,
4840b57cec5SDimitry Andric           Unallocatable;
4850b57cec5SDimitry Andric
4860b57cec5SDimitry Andric// Coprocessor 3 registers.
4870b57cec5SDimitry Andricdef COP3 : RegisterClass<"Mips", [i32], 32, (sequence "COP3%u", 0, 31)>,
4880b57cec5SDimitry Andric           Unallocatable;
4890b57cec5SDimitry Andric
4900b57cec5SDimitry Andric// Stack pointer and global pointer classes for instructions that are limited
4910b57cec5SDimitry Andric// to a single register such as lwgp/lwsp in microMIPS.
4920b57cec5SDimitry Andricdef SP32 : RegisterClass<"Mips", [i32], 32, (add SP)>, Unallocatable;
4930b57cec5SDimitry Andricdef SP64 : RegisterClass<"Mips", [i64], 64, (add SP_64)>, Unallocatable;
4940b57cec5SDimitry Andricdef GP32 : RegisterClass<"Mips", [i32], 32, (add GP)>, Unallocatable;
4950b57cec5SDimitry Andricdef GP64 : RegisterClass<"Mips", [i64], 64, (add GP_64)>, Unallocatable;
4960b57cec5SDimitry Andric
4970b57cec5SDimitry Andric// Octeon multiplier and product registers
4980b57cec5SDimitry Andricdef OCTEON_MPL : RegisterClass<"Mips", [i64], 64, (add MPL0, MPL1, MPL2)>,
4990b57cec5SDimitry Andric                 Unallocatable;
5000b57cec5SDimitry Andricdef OCTEON_P : RegisterClass<"Mips", [i64], 64, (add P0, P1, P2)>,
5010b57cec5SDimitry Andric               Unallocatable;
5020b57cec5SDimitry Andric
5030b57cec5SDimitry Andric// Register Operands.
5040b57cec5SDimitry Andric
5050b57cec5SDimitry Andricclass MipsAsmRegOperand : AsmOperandClass {
5060b57cec5SDimitry Andric  let ParserMethod = "parseAnyRegister";
5070b57cec5SDimitry Andric}
5080b57cec5SDimitry Andric
5090b57cec5SDimitry Andricdef GPR64AsmOperand : MipsAsmRegOperand {
5100b57cec5SDimitry Andric  let Name = "GPR64AsmReg";
5110b57cec5SDimitry Andric  let PredicateMethod = "isGPRAsmReg";
5120b57cec5SDimitry Andric}
5130b57cec5SDimitry Andric
5140b57cec5SDimitry Andricdef GPR32ZeroAsmOperand : MipsAsmRegOperand {
5150b57cec5SDimitry Andric  let Name = "GPR32ZeroAsmReg";
5160b57cec5SDimitry Andric  let PredicateMethod = "isGPRZeroAsmReg";
5170b57cec5SDimitry Andric}
5180b57cec5SDimitry Andric
5190b57cec5SDimitry Andricdef GPR32NonZeroAsmOperand : MipsAsmRegOperand {
5200b57cec5SDimitry Andric  let Name = "GPR32NonZeroAsmReg";
5210b57cec5SDimitry Andric  let PredicateMethod = "isGPRNonZeroAsmReg";
5220b57cec5SDimitry Andric}
5230b57cec5SDimitry Andric
5240b57cec5SDimitry Andricdef GPR32AsmOperand : MipsAsmRegOperand {
5250b57cec5SDimitry Andric  let Name = "GPR32AsmReg";
5260b57cec5SDimitry Andric  let PredicateMethod = "isGPRAsmReg";
5270b57cec5SDimitry Andric}
5280b57cec5SDimitry Andric
5290b57cec5SDimitry Andricdef GPRMM16AsmOperand : MipsAsmRegOperand {
5300b57cec5SDimitry Andric  let Name = "GPRMM16AsmReg";
5310b57cec5SDimitry Andric  let PredicateMethod = "isMM16AsmReg";
5320b57cec5SDimitry Andric}
5330b57cec5SDimitry Andric
5340b57cec5SDimitry Andricdef GPRMM16AsmOperandZero : MipsAsmRegOperand {
5350b57cec5SDimitry Andric  let Name = "GPRMM16AsmRegZero";
5360b57cec5SDimitry Andric  let PredicateMethod = "isMM16AsmRegZero";
5370b57cec5SDimitry Andric}
5380b57cec5SDimitry Andric
5390b57cec5SDimitry Andricdef GPRMM16AsmOperandMoveP : MipsAsmRegOperand {
5400b57cec5SDimitry Andric  let Name = "GPRMM16AsmRegMoveP";
5410b57cec5SDimitry Andric  let PredicateMethod = "isMM16AsmRegMoveP";
5420b57cec5SDimitry Andric}
5430b57cec5SDimitry Andric
5440b57cec5SDimitry Andricdef GPRMM16AsmOperandMovePPairFirst : MipsAsmRegOperand {
5450b57cec5SDimitry Andric  let Name = "GPRMM16AsmRegMovePPairFirst";
5460b57cec5SDimitry Andric  let PredicateMethod = "isMM16AsmRegMovePPairFirst";
5470b57cec5SDimitry Andric}
5480b57cec5SDimitry Andric
5490b57cec5SDimitry Andricdef GPRMM16AsmOperandMovePPairSecond : MipsAsmRegOperand {
5500b57cec5SDimitry Andric  let Name = "GPRMM16AsmRegMovePPairSecond";
5510b57cec5SDimitry Andric  let PredicateMethod = "isMM16AsmRegMovePPairSecond";
5520b57cec5SDimitry Andric}
5530b57cec5SDimitry Andric
5540b57cec5SDimitry Andricdef ACC64DSPAsmOperand : MipsAsmRegOperand {
5550b57cec5SDimitry Andric  let Name = "ACC64DSPAsmReg";
5560b57cec5SDimitry Andric  let PredicateMethod = "isACCAsmReg";
5570b57cec5SDimitry Andric}
5580b57cec5SDimitry Andric
5590b57cec5SDimitry Andricdef HI32DSPAsmOperand : MipsAsmRegOperand {
5600b57cec5SDimitry Andric  let Name = "HI32DSPAsmReg";
5610b57cec5SDimitry Andric  let PredicateMethod = "isACCAsmReg";
5620b57cec5SDimitry Andric}
5630b57cec5SDimitry Andric
5640b57cec5SDimitry Andricdef LO32DSPAsmOperand : MipsAsmRegOperand {
5650b57cec5SDimitry Andric  let Name = "LO32DSPAsmReg";
5660b57cec5SDimitry Andric  let PredicateMethod = "isACCAsmReg";
5670b57cec5SDimitry Andric}
5680b57cec5SDimitry Andric
5690b57cec5SDimitry Andricdef CCRAsmOperand : MipsAsmRegOperand {
5700b57cec5SDimitry Andric  let Name = "CCRAsmReg";
5710b57cec5SDimitry Andric}
5720b57cec5SDimitry Andric
5730b57cec5SDimitry Andricdef AFGR64AsmOperand : MipsAsmRegOperand {
5740b57cec5SDimitry Andric  let Name = "AFGR64AsmReg";
5750b57cec5SDimitry Andric  let PredicateMethod = "isFGRAsmReg";
5760b57cec5SDimitry Andric}
5770b57cec5SDimitry Andric
5780b57cec5SDimitry Andricdef StrictlyAFGR64AsmOperand : MipsAsmRegOperand {
5790b57cec5SDimitry Andric  let Name = "StrictlyAFGR64AsmReg";
5800b57cec5SDimitry Andric  let PredicateMethod = "isStrictlyFGRAsmReg";
5810b57cec5SDimitry Andric}
5820b57cec5SDimitry Andric
5830b57cec5SDimitry Andricdef FGR64AsmOperand : MipsAsmRegOperand {
5840b57cec5SDimitry Andric  let Name = "FGR64AsmReg";
5850b57cec5SDimitry Andric  let PredicateMethod = "isFGRAsmReg";
5860b57cec5SDimitry Andric}
5870b57cec5SDimitry Andric
5880b57cec5SDimitry Andricdef StrictlyFGR64AsmOperand : MipsAsmRegOperand {
5890b57cec5SDimitry Andric  let Name = "StrictlyFGR64AsmReg";
5900b57cec5SDimitry Andric  let PredicateMethod = "isStrictlyFGRAsmReg";
5910b57cec5SDimitry Andric}
5920b57cec5SDimitry Andric
5930b57cec5SDimitry Andricdef FGR32AsmOperand : MipsAsmRegOperand {
5940b57cec5SDimitry Andric  let Name = "FGR32AsmReg";
5950b57cec5SDimitry Andric  let PredicateMethod = "isFGRAsmReg";
5960b57cec5SDimitry Andric}
5970b57cec5SDimitry Andric
5980b57cec5SDimitry Andricdef StrictlyFGR32AsmOperand : MipsAsmRegOperand {
5990b57cec5SDimitry Andric  let Name = "StrictlyFGR32AsmReg";
6000b57cec5SDimitry Andric  let PredicateMethod = "isStrictlyFGRAsmReg";
6010b57cec5SDimitry Andric}
6020b57cec5SDimitry Andric
6030b57cec5SDimitry Andricdef FCCRegsAsmOperand : MipsAsmRegOperand {
6040b57cec5SDimitry Andric  let Name = "FCCAsmReg";
6050b57cec5SDimitry Andric}
6060b57cec5SDimitry Andric
6070b57cec5SDimitry Andricdef MSA128AsmOperand : MipsAsmRegOperand {
6080b57cec5SDimitry Andric  let Name = "MSA128AsmReg";
6090b57cec5SDimitry Andric}
6100b57cec5SDimitry Andric
6110b57cec5SDimitry Andricdef MSACtrlAsmOperand : MipsAsmRegOperand {
6120b57cec5SDimitry Andric  let Name = "MSACtrlAsmReg";
6130b57cec5SDimitry Andric}
6140b57cec5SDimitry Andric
6150b57cec5SDimitry Andricdef GPR32ZeroOpnd : RegisterOperand<GPR32ZERO> {
6160b57cec5SDimitry Andric  let ParserMatchClass = GPR32ZeroAsmOperand;
6170b57cec5SDimitry Andric}
6180b57cec5SDimitry Andric
6190b57cec5SDimitry Andricdef GPR32NonZeroOpnd : RegisterOperand<GPR32NONZERO> {
6200b57cec5SDimitry Andric  let ParserMatchClass = GPR32NonZeroAsmOperand;
6210b57cec5SDimitry Andric}
6220b57cec5SDimitry Andric
6230b57cec5SDimitry Andricdef GPR32Opnd : RegisterOperand<GPR32> {
6240b57cec5SDimitry Andric  let ParserMatchClass = GPR32AsmOperand;
6250b57cec5SDimitry Andric}
6260b57cec5SDimitry Andric
6270b57cec5SDimitry Andricdef GPRMM16Opnd : RegisterOperand<GPRMM16> {
6280b57cec5SDimitry Andric  let ParserMatchClass = GPRMM16AsmOperand;
6290b57cec5SDimitry Andric}
6300b57cec5SDimitry Andric
6310b57cec5SDimitry Andricdef GPRMM16OpndZero : RegisterOperand<GPRMM16Zero> {
6320b57cec5SDimitry Andric  let ParserMatchClass = GPRMM16AsmOperandZero;
6330b57cec5SDimitry Andric}
6340b57cec5SDimitry Andric
6350b57cec5SDimitry Andricdef GPRMM16OpndMoveP : RegisterOperand<GPRMM16MoveP> {
6360b57cec5SDimitry Andric  let ParserMatchClass = GPRMM16AsmOperandMoveP;
6370b57cec5SDimitry Andric  let EncoderMethod = "getMovePRegSingleOpValue";
6380b57cec5SDimitry Andric}
6390b57cec5SDimitry Andric
6400b57cec5SDimitry Andricdef GPRMM16OpndMovePPairFirst : RegisterOperand<GPRMM16MovePPairFirst> {
6410b57cec5SDimitry Andric  let ParserMatchClass = GPRMM16AsmOperandMovePPairFirst;
6420b57cec5SDimitry Andric}
6430b57cec5SDimitry Andric
6440b57cec5SDimitry Andricdef GPRMM16OpndMovePPairSecond : RegisterOperand<GPRMM16MovePPairSecond> {
6450b57cec5SDimitry Andric  let ParserMatchClass = GPRMM16AsmOperandMovePPairSecond;
6460b57cec5SDimitry Andric}
6470b57cec5SDimitry Andric
6480b57cec5SDimitry Andricdef GPR64Opnd : RegisterOperand<GPR64> {
6490b57cec5SDimitry Andric  let ParserMatchClass = GPR64AsmOperand;
6500b57cec5SDimitry Andric}
6510b57cec5SDimitry Andric
6520b57cec5SDimitry Andricdef DSPROpnd : RegisterOperand<DSPR> {
6530b57cec5SDimitry Andric  let ParserMatchClass = GPR32AsmOperand;
6540b57cec5SDimitry Andric}
6550b57cec5SDimitry Andric
6560b57cec5SDimitry Andricdef CCROpnd : RegisterOperand<CCR> {
6570b57cec5SDimitry Andric  let ParserMatchClass = CCRAsmOperand;
6580b57cec5SDimitry Andric}
6590b57cec5SDimitry Andric
6600b57cec5SDimitry Andricdef HWRegsAsmOperand : MipsAsmRegOperand {
6610b57cec5SDimitry Andric  let Name = "HWRegsAsmReg";
6620b57cec5SDimitry Andric}
6630b57cec5SDimitry Andric
6640b57cec5SDimitry Andricdef COP0AsmOperand : MipsAsmRegOperand {
6650b57cec5SDimitry Andric  let Name = "COP0AsmReg";
6660b57cec5SDimitry Andric}
6670b57cec5SDimitry Andric
6680b57cec5SDimitry Andricdef COP2AsmOperand : MipsAsmRegOperand {
6690b57cec5SDimitry Andric  let Name = "COP2AsmReg";
6700b57cec5SDimitry Andric}
6710b57cec5SDimitry Andric
6720b57cec5SDimitry Andricdef COP3AsmOperand : MipsAsmRegOperand {
6730b57cec5SDimitry Andric  let Name = "COP3AsmReg";
6740b57cec5SDimitry Andric}
6750b57cec5SDimitry Andric
6760b57cec5SDimitry Andricdef HWRegsOpnd : RegisterOperand<HWRegs> {
6770b57cec5SDimitry Andric  let ParserMatchClass = HWRegsAsmOperand;
6780b57cec5SDimitry Andric}
6790b57cec5SDimitry Andric
6800b57cec5SDimitry Andricdef AFGR64Opnd : RegisterOperand<AFGR64> {
6810b57cec5SDimitry Andric  let ParserMatchClass = AFGR64AsmOperand;
6820b57cec5SDimitry Andric}
6830b57cec5SDimitry Andric
6840b57cec5SDimitry Andricdef StrictlyAFGR64Opnd : RegisterOperand<AFGR64> {
6850b57cec5SDimitry Andric  let ParserMatchClass = StrictlyAFGR64AsmOperand;
6860b57cec5SDimitry Andric}
6870b57cec5SDimitry Andric
6880b57cec5SDimitry Andricdef FGR64Opnd : RegisterOperand<FGR64> {
6890b57cec5SDimitry Andric  let ParserMatchClass = FGR64AsmOperand;
6900b57cec5SDimitry Andric}
6910b57cec5SDimitry Andric
6920b57cec5SDimitry Andricdef StrictlyFGR64Opnd : RegisterOperand<FGR64> {
6930b57cec5SDimitry Andric  let ParserMatchClass = StrictlyFGR64AsmOperand;
6940b57cec5SDimitry Andric}
6950b57cec5SDimitry Andric
6960b57cec5SDimitry Andricdef FGR32Opnd : RegisterOperand<FGR32> {
6970b57cec5SDimitry Andric  let ParserMatchClass = FGR32AsmOperand;
6980b57cec5SDimitry Andric}
6990b57cec5SDimitry Andric
7000b57cec5SDimitry Andricdef StrictlyFGR32Opnd : RegisterOperand<FGR32> {
7010b57cec5SDimitry Andric  let ParserMatchClass = StrictlyFGR32AsmOperand;
7020b57cec5SDimitry Andric}
7030b57cec5SDimitry Andric
7040b57cec5SDimitry Andricdef FGRCCOpnd : RegisterOperand<FGRCC> {
7050b57cec5SDimitry Andric  // The assembler doesn't use register classes so we can re-use
7060b57cec5SDimitry Andric  // FGR32AsmOperand.
7070b57cec5SDimitry Andric  let ParserMatchClass = FGR32AsmOperand;
7080b57cec5SDimitry Andric}
7090b57cec5SDimitry Andric
7100b57cec5SDimitry Andricdef FCCRegsOpnd : RegisterOperand<FCC> {
7110b57cec5SDimitry Andric  let ParserMatchClass = FCCRegsAsmOperand;
7120b57cec5SDimitry Andric}
7130b57cec5SDimitry Andric
7140b57cec5SDimitry Andricdef LO32DSPOpnd : RegisterOperand<LO32DSP> {
7150b57cec5SDimitry Andric  let ParserMatchClass = LO32DSPAsmOperand;
7160b57cec5SDimitry Andric}
7170b57cec5SDimitry Andric
7180b57cec5SDimitry Andricdef HI32DSPOpnd : RegisterOperand<HI32DSP> {
7190b57cec5SDimitry Andric  let ParserMatchClass = HI32DSPAsmOperand;
7200b57cec5SDimitry Andric}
7210b57cec5SDimitry Andric
7220b57cec5SDimitry Andricdef ACC64DSPOpnd : RegisterOperand<ACC64DSP> {
7230b57cec5SDimitry Andric  let ParserMatchClass = ACC64DSPAsmOperand;
7240b57cec5SDimitry Andric}
7250b57cec5SDimitry Andric
7260b57cec5SDimitry Andricdef COP0Opnd : RegisterOperand<COP0> {
7270b57cec5SDimitry Andric  let ParserMatchClass = COP0AsmOperand;
7280b57cec5SDimitry Andric}
7290b57cec5SDimitry Andric
7300b57cec5SDimitry Andricdef COP2Opnd : RegisterOperand<COP2> {
7310b57cec5SDimitry Andric  let ParserMatchClass = COP2AsmOperand;
7320b57cec5SDimitry Andric}
7330b57cec5SDimitry Andric
7340b57cec5SDimitry Andricdef COP3Opnd : RegisterOperand<COP3> {
7350b57cec5SDimitry Andric  let ParserMatchClass = COP3AsmOperand;
7360b57cec5SDimitry Andric}
7370b57cec5SDimitry Andric
7380b57cec5SDimitry Andricdef MSA128F16Opnd : RegisterOperand<MSA128F16> {
7390b57cec5SDimitry Andric  let ParserMatchClass = MSA128AsmOperand;
7400b57cec5SDimitry Andric}
7410b57cec5SDimitry Andric
7420b57cec5SDimitry Andricdef MSA128BOpnd : RegisterOperand<MSA128B> {
7430b57cec5SDimitry Andric  let ParserMatchClass = MSA128AsmOperand;
7440b57cec5SDimitry Andric}
7450b57cec5SDimitry Andric
7460b57cec5SDimitry Andricdef MSA128HOpnd : RegisterOperand<MSA128H> {
7470b57cec5SDimitry Andric  let ParserMatchClass = MSA128AsmOperand;
7480b57cec5SDimitry Andric}
7490b57cec5SDimitry Andric
7500b57cec5SDimitry Andricdef MSA128WOpnd : RegisterOperand<MSA128W> {
7510b57cec5SDimitry Andric  let ParserMatchClass = MSA128AsmOperand;
7520b57cec5SDimitry Andric}
7530b57cec5SDimitry Andric
7540b57cec5SDimitry Andricdef MSA128DOpnd : RegisterOperand<MSA128D> {
7550b57cec5SDimitry Andric  let ParserMatchClass = MSA128AsmOperand;
7560b57cec5SDimitry Andric}
7570b57cec5SDimitry Andric
7580b57cec5SDimitry Andricdef MSA128CROpnd : RegisterOperand<MSACtrl> {
7590b57cec5SDimitry Andric  let ParserMatchClass = MSACtrlAsmOperand;
7600b57cec5SDimitry Andric}
761