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