10b57cec5SDimitry Andric//===-- SparcRegisterInfo.td - Sparc 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 Sparc register file 110b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 120b57cec5SDimitry Andric 130b57cec5SDimitry Andricclass SparcReg<bits<16> Enc, string n> : Register<n> { 140b57cec5SDimitry Andric let HWEncoding = Enc; 150b57cec5SDimitry Andric let Namespace = "SP"; 160b57cec5SDimitry Andric} 170b57cec5SDimitry Andric 185f757f3fSDimitry Andricclass SparcCtrlReg<bits<16> Enc, string n, 195f757f3fSDimitry Andric list<string> altNames = []>: Register<n, altNames> { 200b57cec5SDimitry Andric let HWEncoding = Enc; 210b57cec5SDimitry Andric let Namespace = "SP"; 220b57cec5SDimitry Andric} 230b57cec5SDimitry Andric 240b57cec5SDimitry Andriclet Namespace = "SP" in { 250b57cec5SDimitry Andricdef sub_even : SubRegIndex<32>; 260b57cec5SDimitry Andricdef sub_odd : SubRegIndex<32, 32>; 270b57cec5SDimitry Andricdef sub_even64 : SubRegIndex<64>; 280b57cec5SDimitry Andricdef sub_odd64 : SubRegIndex<64, 64>; 290b57cec5SDimitry Andric} 300b57cec5SDimitry Andric 315f757f3fSDimitry Andriclet Namespace = "SP", 325f757f3fSDimitry Andric FallbackRegAltNameIndex = NoRegAltName in { 335f757f3fSDimitry Andric def RegNamesStateReg : RegAltNameIndex; 345f757f3fSDimitry Andric} 355f757f3fSDimitry Andric 360b57cec5SDimitry Andric// Registers are identified with 5-bit ID numbers. 370b57cec5SDimitry Andric// Ri - 32-bit integer registers 380b57cec5SDimitry Andricclass Ri<bits<16> Enc, string n> : SparcReg<Enc, n>; 390b57cec5SDimitry Andric 400b57cec5SDimitry Andric// Rdi - pairs of 32-bit integer registers 410b57cec5SDimitry Andricclass Rdi<bits<16> Enc, string n, list<Register> subregs> : SparcReg<Enc, n> { 420b57cec5SDimitry Andric let SubRegs = subregs; 430b57cec5SDimitry Andric let SubRegIndices = [sub_even, sub_odd]; 440b57cec5SDimitry Andric let CoveredBySubRegs = 1; 450b57cec5SDimitry Andric} 460b57cec5SDimitry Andric// Rf - 32-bit floating-point registers 470b57cec5SDimitry Andricclass Rf<bits<16> Enc, string n> : SparcReg<Enc, n>; 480b57cec5SDimitry Andric 490b57cec5SDimitry Andric// Rd - Slots in the FP register file for 64-bit floating-point values. 500b57cec5SDimitry Andricclass Rd<bits<16> Enc, string n, list<Register> subregs> : SparcReg<Enc, n> { 510b57cec5SDimitry Andric let SubRegs = subregs; 520b57cec5SDimitry Andric let SubRegIndices = [sub_even, sub_odd]; 530b57cec5SDimitry Andric let CoveredBySubRegs = 1; 540b57cec5SDimitry Andric} 550b57cec5SDimitry Andric 560b57cec5SDimitry Andric// Rq - Slots in the FP register file for 128-bit floating-point values. 570b57cec5SDimitry Andricclass Rq<bits<16> Enc, string n, list<Register> subregs> : SparcReg<Enc, n> { 580b57cec5SDimitry Andric let SubRegs = subregs; 590b57cec5SDimitry Andric let SubRegIndices = [sub_even64, sub_odd64]; 600b57cec5SDimitry Andric let CoveredBySubRegs = 1; 610b57cec5SDimitry Andric} 620b57cec5SDimitry Andric 630b57cec5SDimitry Andric// Control Registers 645f757f3fSDimitry Andricdef ICC : SparcCtrlReg<0, "icc">; // This represents icc and xcc in 64-bit code. 650b57cec5SDimitry Andricforeach I = 0-3 in 665f757f3fSDimitry Andric def FCC#I : SparcCtrlReg<I, "fcc"#I>; 670b57cec5SDimitry Andric 685f757f3fSDimitry Andricdef FSR : SparcCtrlReg<0, "fsr">; // Floating-point state register. 695f757f3fSDimitry Andricdef FQ : SparcCtrlReg<0, "fq">; // Floating-point deferred-trap queue. 705f757f3fSDimitry Andricdef CPSR : SparcCtrlReg<0, "csr">; // Co-processor state register. 715f757f3fSDimitry Andricdef CPQ : SparcCtrlReg<0, "cq">; // Co-processor queue. 720b57cec5SDimitry Andric 730b57cec5SDimitry Andric// Y register 745f757f3fSDimitry Andricdef Y : SparcCtrlReg<0, "y">, DwarfRegNum<[64]>; 750b57cec5SDimitry Andric// Ancillary state registers (implementation defined) 765f757f3fSDimitry Andricdef ASR1 : SparcCtrlReg<1, "asr1">; 775f757f3fSDimitry Andriclet RegAltNameIndices = [RegNamesStateReg] in { 785f757f3fSDimitry Andric// FIXME: Currently this results in the assembler accepting 795f757f3fSDimitry Andric// the alternate names (%ccr, %asi, etc.) when targeting V8. 805f757f3fSDimitry Andric// Make sure that the alternate names are available for V9 only: 815f757f3fSDimitry Andric// %asr2-asr6 : valid on both V8 and V9. 825f757f3fSDimitry Andric// %ccr, %asi, etc.: valid on V9, returns "no such register" error on V8. 835f757f3fSDimitry Andricdef ASR2 : SparcCtrlReg<2, "asr2", ["ccr"]>; 845f757f3fSDimitry Andricdef ASR3 : SparcCtrlReg<3, "asr3", ["asi"]>; 855f757f3fSDimitry Andricdef ASR4 : SparcCtrlReg<4, "asr4", ["tick"]>; 865f757f3fSDimitry Andricdef ASR5 : SparcCtrlReg<5, "asr5", ["pc"]>; 875f757f3fSDimitry Andricdef ASR6 : SparcCtrlReg<6, "asr6", ["fprs"]>; 885f757f3fSDimitry Andric} 895f757f3fSDimitry Andricdef ASR7 : SparcCtrlReg< 7, "asr7">; 905f757f3fSDimitry Andricdef ASR8 : SparcCtrlReg< 8, "asr8">; 915f757f3fSDimitry Andricdef ASR9 : SparcCtrlReg< 9, "asr9">; 925f757f3fSDimitry Andricdef ASR10 : SparcCtrlReg<10, "asr10">; 935f757f3fSDimitry Andricdef ASR11 : SparcCtrlReg<11, "asr11">; 945f757f3fSDimitry Andricdef ASR12 : SparcCtrlReg<12, "asr12">; 955f757f3fSDimitry Andricdef ASR13 : SparcCtrlReg<13, "asr13">; 965f757f3fSDimitry Andricdef ASR14 : SparcCtrlReg<14, "asr14">; 975f757f3fSDimitry Andricdef ASR15 : SparcCtrlReg<15, "asr15">; 985f757f3fSDimitry Andricdef ASR16 : SparcCtrlReg<16, "asr16">; 995f757f3fSDimitry Andricdef ASR17 : SparcCtrlReg<17, "asr17">; 1005f757f3fSDimitry Andricdef ASR18 : SparcCtrlReg<18, "asr18">; 1015f757f3fSDimitry Andricdef ASR19 : SparcCtrlReg<19, "asr19">; 1025f757f3fSDimitry Andricdef ASR20 : SparcCtrlReg<20, "asr20">; 1035f757f3fSDimitry Andricdef ASR21 : SparcCtrlReg<21, "asr21">; 1045f757f3fSDimitry Andricdef ASR22 : SparcCtrlReg<22, "asr22">; 1055f757f3fSDimitry Andricdef ASR23 : SparcCtrlReg<23, "asr23">; 1065f757f3fSDimitry Andricdef ASR24 : SparcCtrlReg<24, "asr24">; 1075f757f3fSDimitry Andricdef ASR25 : SparcCtrlReg<25, "asr25">; 1085f757f3fSDimitry Andricdef ASR26 : SparcCtrlReg<26, "asr26">; 1095f757f3fSDimitry Andricdef ASR27 : SparcCtrlReg<27, "asr27">; 1105f757f3fSDimitry Andricdef ASR28 : SparcCtrlReg<28, "asr28">; 1115f757f3fSDimitry Andricdef ASR29 : SparcCtrlReg<29, "asr29">; 1125f757f3fSDimitry Andricdef ASR30 : SparcCtrlReg<30, "asr30">; 1135f757f3fSDimitry Andricdef ASR31 : SparcCtrlReg<31, "asr31">; 1140b57cec5SDimitry Andric 1150b57cec5SDimitry Andric// Note that PSR, WIM, and TBR don't exist on the SparcV9, only the V8. 1165f757f3fSDimitry Andricdef PSR : SparcCtrlReg<0, "psr">; 1175f757f3fSDimitry Andricdef WIM : SparcCtrlReg<0, "wim">; 1185f757f3fSDimitry Andricdef TBR : SparcCtrlReg<0, "tbr">; 1190b57cec5SDimitry Andric 1205f757f3fSDimitry Andric// Privileged V9 state registers 1215f757f3fSDimitry Andricdef TPC : SparcCtrlReg< 0, "tpc">; 1225f757f3fSDimitry Andricdef TNPC : SparcCtrlReg< 1, "tnpc">; 1235f757f3fSDimitry Andricdef TSTATE : SparcCtrlReg< 2, "tstate">; 1245f757f3fSDimitry Andricdef TT : SparcCtrlReg< 3, "tt">; 1255f757f3fSDimitry Andricdef TICK : SparcCtrlReg< 4, "tick">; 1265f757f3fSDimitry Andricdef TBA : SparcCtrlReg< 5, "tba">; 1275f757f3fSDimitry Andricdef PSTATE : SparcCtrlReg< 6, "pstate">; 1285f757f3fSDimitry Andricdef TL : SparcCtrlReg< 7, "tl">; 1295f757f3fSDimitry Andricdef PIL : SparcCtrlReg< 8, "pil">; 1305f757f3fSDimitry Andricdef CWP : SparcCtrlReg< 9, "cwp">; 1315f757f3fSDimitry Andricdef CANSAVE : SparcCtrlReg<10, "cansave">; 1325f757f3fSDimitry Andricdef CANRESTORE : SparcCtrlReg<11, "canrestore">; 1335f757f3fSDimitry Andricdef CLEANWIN : SparcCtrlReg<12, "cleanwin">; 1345f757f3fSDimitry Andricdef OTHERWIN : SparcCtrlReg<13, "otherwin">; 1355f757f3fSDimitry Andricdef WSTATE : SparcCtrlReg<14, "wstate">; 1365f757f3fSDimitry Andricdef GL : SparcCtrlReg<16, "gl">; 1375f757f3fSDimitry Andricdef VER : SparcCtrlReg<31, "ver">; 1380b57cec5SDimitry Andric 1390b57cec5SDimitry Andric// Integer registers 1405f757f3fSDimitry Andricdef G0 : Ri< 0, "g0">, DwarfRegNum<[0]> { 141bdd1243dSDimitry Andric let isConstant = true; 142bdd1243dSDimitry Andric} 1435f757f3fSDimitry Andricdef G1 : Ri< 1, "g1">, DwarfRegNum<[1]>; 1445f757f3fSDimitry Andricdef G2 : Ri< 2, "g2">, DwarfRegNum<[2]>; 1455f757f3fSDimitry Andricdef G3 : Ri< 3, "g3">, DwarfRegNum<[3]>; 1465f757f3fSDimitry Andricdef G4 : Ri< 4, "g4">, DwarfRegNum<[4]>; 1475f757f3fSDimitry Andricdef G5 : Ri< 5, "g5">, DwarfRegNum<[5]>; 1485f757f3fSDimitry Andricdef G6 : Ri< 6, "g6">, DwarfRegNum<[6]>; 1495f757f3fSDimitry Andricdef G7 : Ri< 7, "g7">, DwarfRegNum<[7]>; 1505f757f3fSDimitry Andricdef O0 : Ri< 8, "o0">, DwarfRegNum<[8]>; 1515f757f3fSDimitry Andricdef O1 : Ri< 9, "o1">, DwarfRegNum<[9]>; 1525f757f3fSDimitry Andricdef O2 : Ri<10, "o2">, DwarfRegNum<[10]>; 1535f757f3fSDimitry Andricdef O3 : Ri<11, "o3">, DwarfRegNum<[11]>; 1545f757f3fSDimitry Andricdef O4 : Ri<12, "o4">, DwarfRegNum<[12]>; 1555f757f3fSDimitry Andricdef O5 : Ri<13, "o5">, DwarfRegNum<[13]>; 1565f757f3fSDimitry Andricdef O6 : Ri<14, "sp">, DwarfRegNum<[14]>; 1575f757f3fSDimitry Andricdef O7 : Ri<15, "o7">, DwarfRegNum<[15]>; 1585f757f3fSDimitry Andricdef L0 : Ri<16, "l0">, DwarfRegNum<[16]>; 1595f757f3fSDimitry Andricdef L1 : Ri<17, "l1">, DwarfRegNum<[17]>; 1605f757f3fSDimitry Andricdef L2 : Ri<18, "l2">, DwarfRegNum<[18]>; 1615f757f3fSDimitry Andricdef L3 : Ri<19, "l3">, DwarfRegNum<[19]>; 1625f757f3fSDimitry Andricdef L4 : Ri<20, "l4">, DwarfRegNum<[20]>; 1635f757f3fSDimitry Andricdef L5 : Ri<21, "l5">, DwarfRegNum<[21]>; 1645f757f3fSDimitry Andricdef L6 : Ri<22, "l6">, DwarfRegNum<[22]>; 1655f757f3fSDimitry Andricdef L7 : Ri<23, "l7">, DwarfRegNum<[23]>; 1665f757f3fSDimitry Andricdef I0 : Ri<24, "i0">, DwarfRegNum<[24]>; 1675f757f3fSDimitry Andricdef I1 : Ri<25, "i1">, DwarfRegNum<[25]>; 1685f757f3fSDimitry Andricdef I2 : Ri<26, "i2">, DwarfRegNum<[26]>; 1695f757f3fSDimitry Andricdef I3 : Ri<27, "i3">, DwarfRegNum<[27]>; 1705f757f3fSDimitry Andricdef I4 : Ri<28, "i4">, DwarfRegNum<[28]>; 1715f757f3fSDimitry Andricdef I5 : Ri<29, "i5">, DwarfRegNum<[29]>; 1725f757f3fSDimitry Andricdef I6 : Ri<30, "fp">, DwarfRegNum<[30]>; 1735f757f3fSDimitry Andricdef I7 : Ri<31, "i7">, DwarfRegNum<[31]>; 1740b57cec5SDimitry Andric 1750b57cec5SDimitry Andric// Floating-point registers 1765f757f3fSDimitry Andricdef F0 : Rf< 0, "f0">, DwarfRegNum<[32]>; 1775f757f3fSDimitry Andricdef F1 : Rf< 1, "f1">, DwarfRegNum<[33]>; 1785f757f3fSDimitry Andricdef F2 : Rf< 2, "f2">, DwarfRegNum<[34]>; 1795f757f3fSDimitry Andricdef F3 : Rf< 3, "f3">, DwarfRegNum<[35]>; 1805f757f3fSDimitry Andricdef F4 : Rf< 4, "f4">, DwarfRegNum<[36]>; 1815f757f3fSDimitry Andricdef F5 : Rf< 5, "f5">, DwarfRegNum<[37]>; 1825f757f3fSDimitry Andricdef F6 : Rf< 6, "f6">, DwarfRegNum<[38]>; 1835f757f3fSDimitry Andricdef F7 : Rf< 7, "f7">, DwarfRegNum<[39]>; 1845f757f3fSDimitry Andricdef F8 : Rf< 8, "f8">, DwarfRegNum<[40]>; 1855f757f3fSDimitry Andricdef F9 : Rf< 9, "f9">, DwarfRegNum<[41]>; 1865f757f3fSDimitry Andricdef F10 : Rf<10, "f10">, DwarfRegNum<[42]>; 1875f757f3fSDimitry Andricdef F11 : Rf<11, "f11">, DwarfRegNum<[43]>; 1885f757f3fSDimitry Andricdef F12 : Rf<12, "f12">, DwarfRegNum<[44]>; 1895f757f3fSDimitry Andricdef F13 : Rf<13, "f13">, DwarfRegNum<[45]>; 1905f757f3fSDimitry Andricdef F14 : Rf<14, "f14">, DwarfRegNum<[46]>; 1915f757f3fSDimitry Andricdef F15 : Rf<15, "f15">, DwarfRegNum<[47]>; 1925f757f3fSDimitry Andricdef F16 : Rf<16, "f16">, DwarfRegNum<[48]>; 1935f757f3fSDimitry Andricdef F17 : Rf<17, "f17">, DwarfRegNum<[49]>; 1945f757f3fSDimitry Andricdef F18 : Rf<18, "f18">, DwarfRegNum<[50]>; 1955f757f3fSDimitry Andricdef F19 : Rf<19, "f19">, DwarfRegNum<[51]>; 1965f757f3fSDimitry Andricdef F20 : Rf<20, "f20">, DwarfRegNum<[52]>; 1975f757f3fSDimitry Andricdef F21 : Rf<21, "f21">, DwarfRegNum<[53]>; 1985f757f3fSDimitry Andricdef F22 : Rf<22, "f22">, DwarfRegNum<[54]>; 1995f757f3fSDimitry Andricdef F23 : Rf<23, "f23">, DwarfRegNum<[55]>; 2005f757f3fSDimitry Andricdef F24 : Rf<24, "f24">, DwarfRegNum<[56]>; 2015f757f3fSDimitry Andricdef F25 : Rf<25, "f25">, DwarfRegNum<[57]>; 2025f757f3fSDimitry Andricdef F26 : Rf<26, "f26">, DwarfRegNum<[58]>; 2035f757f3fSDimitry Andricdef F27 : Rf<27, "f27">, DwarfRegNum<[59]>; 2045f757f3fSDimitry Andricdef F28 : Rf<28, "f28">, DwarfRegNum<[60]>; 2055f757f3fSDimitry Andricdef F29 : Rf<29, "f29">, DwarfRegNum<[61]>; 2065f757f3fSDimitry Andricdef F30 : Rf<30, "f30">, DwarfRegNum<[62]>; 2075f757f3fSDimitry Andricdef F31 : Rf<31, "f31">, DwarfRegNum<[63]>; 2080b57cec5SDimitry Andric 2090b57cec5SDimitry Andric// Aliases of the F* registers used to hold 64-bit fp values (doubles) 2105f757f3fSDimitry Andricdef D0 : Rd< 0, "f0", [F0, F1]>, DwarfRegNum<[72]>; 2115f757f3fSDimitry Andricdef D1 : Rd< 2, "f2", [F2, F3]>, DwarfRegNum<[73]>; 2125f757f3fSDimitry Andricdef D2 : Rd< 4, "f4", [F4, F5]>, DwarfRegNum<[74]>; 2135f757f3fSDimitry Andricdef D3 : Rd< 6, "f6", [F6, F7]>, DwarfRegNum<[75]>; 2145f757f3fSDimitry Andricdef D4 : Rd< 8, "f8", [F8, F9]>, DwarfRegNum<[76]>; 2155f757f3fSDimitry Andricdef D5 : Rd<10, "f10", [F10, F11]>, DwarfRegNum<[77]>; 2165f757f3fSDimitry Andricdef D6 : Rd<12, "f12", [F12, F13]>, DwarfRegNum<[78]>; 2175f757f3fSDimitry Andricdef D7 : Rd<14, "f14", [F14, F15]>, DwarfRegNum<[79]>; 2185f757f3fSDimitry Andricdef D8 : Rd<16, "f16", [F16, F17]>, DwarfRegNum<[80]>; 2195f757f3fSDimitry Andricdef D9 : Rd<18, "f18", [F18, F19]>, DwarfRegNum<[81]>; 2205f757f3fSDimitry Andricdef D10 : Rd<20, "f20", [F20, F21]>, DwarfRegNum<[82]>; 2215f757f3fSDimitry Andricdef D11 : Rd<22, "f22", [F22, F23]>, DwarfRegNum<[83]>; 2225f757f3fSDimitry Andricdef D12 : Rd<24, "f24", [F24, F25]>, DwarfRegNum<[84]>; 2235f757f3fSDimitry Andricdef D13 : Rd<26, "f26", [F26, F27]>, DwarfRegNum<[85]>; 2245f757f3fSDimitry Andricdef D14 : Rd<28, "f28", [F28, F29]>, DwarfRegNum<[86]>; 2255f757f3fSDimitry Andricdef D15 : Rd<30, "f30", [F30, F31]>, DwarfRegNum<[87]>; 2260b57cec5SDimitry Andric 2270b57cec5SDimitry Andric// Co-processor registers 2285f757f3fSDimitry Andricdef C0 : Ri< 0, "c0">; 2295f757f3fSDimitry Andricdef C1 : Ri< 1, "c1">; 2305f757f3fSDimitry Andricdef C2 : Ri< 2, "c2">; 2315f757f3fSDimitry Andricdef C3 : Ri< 3, "c3">; 2325f757f3fSDimitry Andricdef C4 : Ri< 4, "c4">; 2335f757f3fSDimitry Andricdef C5 : Ri< 5, "c5">; 2345f757f3fSDimitry Andricdef C6 : Ri< 6, "c6">; 2355f757f3fSDimitry Andricdef C7 : Ri< 7, "c7">; 2365f757f3fSDimitry Andricdef C8 : Ri< 8, "c8">; 2375f757f3fSDimitry Andricdef C9 : Ri< 9, "c9">; 2385f757f3fSDimitry Andricdef C10 : Ri<10, "c10">; 2395f757f3fSDimitry Andricdef C11 : Ri<11, "c11">; 2405f757f3fSDimitry Andricdef C12 : Ri<12, "c12">; 2415f757f3fSDimitry Andricdef C13 : Ri<13, "c13">; 2425f757f3fSDimitry Andricdef C14 : Ri<14, "c14">; 2435f757f3fSDimitry Andricdef C15 : Ri<15, "c15">; 2445f757f3fSDimitry Andricdef C16 : Ri<16, "c16">; 2455f757f3fSDimitry Andricdef C17 : Ri<17, "c17">; 2465f757f3fSDimitry Andricdef C18 : Ri<18, "c18">; 2475f757f3fSDimitry Andricdef C19 : Ri<19, "c19">; 2485f757f3fSDimitry Andricdef C20 : Ri<20, "c20">; 2495f757f3fSDimitry Andricdef C21 : Ri<21, "c21">; 2505f757f3fSDimitry Andricdef C22 : Ri<22, "c22">; 2515f757f3fSDimitry Andricdef C23 : Ri<23, "c23">; 2525f757f3fSDimitry Andricdef C24 : Ri<24, "c24">; 2535f757f3fSDimitry Andricdef C25 : Ri<25, "c25">; 2545f757f3fSDimitry Andricdef C26 : Ri<26, "c26">; 2555f757f3fSDimitry Andricdef C27 : Ri<27, "c27">; 2565f757f3fSDimitry Andricdef C28 : Ri<28, "c28">; 2575f757f3fSDimitry Andricdef C29 : Ri<29, "c29">; 2585f757f3fSDimitry Andricdef C30 : Ri<30, "c30">; 2595f757f3fSDimitry Andricdef C31 : Ri<31, "c31">; 2600b57cec5SDimitry Andric 2610b57cec5SDimitry Andric// Unaliased double precision floating point registers. 2620b57cec5SDimitry Andric// FIXME: Define DwarfRegNum for these registers. 2635f757f3fSDimitry Andricdef D16 : SparcReg< 1, "f32">; 2645f757f3fSDimitry Andricdef D17 : SparcReg< 3, "f34">; 2655f757f3fSDimitry Andricdef D18 : SparcReg< 5, "f36">; 2665f757f3fSDimitry Andricdef D19 : SparcReg< 7, "f38">; 2675f757f3fSDimitry Andricdef D20 : SparcReg< 9, "f40">; 2685f757f3fSDimitry Andricdef D21 : SparcReg<11, "f42">; 2695f757f3fSDimitry Andricdef D22 : SparcReg<13, "f44">; 2705f757f3fSDimitry Andricdef D23 : SparcReg<15, "f46">; 2715f757f3fSDimitry Andricdef D24 : SparcReg<17, "f48">; 2725f757f3fSDimitry Andricdef D25 : SparcReg<19, "f50">; 2735f757f3fSDimitry Andricdef D26 : SparcReg<21, "f52">; 2745f757f3fSDimitry Andricdef D27 : SparcReg<23, "f54">; 2755f757f3fSDimitry Andricdef D28 : SparcReg<25, "f56">; 2765f757f3fSDimitry Andricdef D29 : SparcReg<27, "f58">; 2775f757f3fSDimitry Andricdef D30 : SparcReg<29, "f60">; 2785f757f3fSDimitry Andricdef D31 : SparcReg<31, "f62">; 2790b57cec5SDimitry Andric 2800b57cec5SDimitry Andric// Aliases of the F* registers used to hold 128-bit for values (long doubles). 2815f757f3fSDimitry Andricdef Q0 : Rq< 0, "f0", [D0, D1]>; 2825f757f3fSDimitry Andricdef Q1 : Rq< 4, "f4", [D2, D3]>; 2835f757f3fSDimitry Andricdef Q2 : Rq< 8, "f8", [D4, D5]>; 2845f757f3fSDimitry Andricdef Q3 : Rq<12, "f12", [D6, D7]>; 2855f757f3fSDimitry Andricdef Q4 : Rq<16, "f16", [D8, D9]>; 2865f757f3fSDimitry Andricdef Q5 : Rq<20, "f20", [D10, D11]>; 2875f757f3fSDimitry Andricdef Q6 : Rq<24, "f24", [D12, D13]>; 2885f757f3fSDimitry Andricdef Q7 : Rq<28, "f28", [D14, D15]>; 2895f757f3fSDimitry Andricdef Q8 : Rq< 1, "f32", [D16, D17]>; 2905f757f3fSDimitry Andricdef Q9 : Rq< 5, "f36", [D18, D19]>; 2915f757f3fSDimitry Andricdef Q10 : Rq< 9, "f40", [D20, D21]>; 2925f757f3fSDimitry Andricdef Q11 : Rq<13, "f44", [D22, D23]>; 2935f757f3fSDimitry Andricdef Q12 : Rq<17, "f48", [D24, D25]>; 2945f757f3fSDimitry Andricdef Q13 : Rq<21, "f52", [D26, D27]>; 2955f757f3fSDimitry Andricdef Q14 : Rq<25, "f56", [D28, D29]>; 2965f757f3fSDimitry Andricdef Q15 : Rq<29, "f60", [D30, D31]>; 2970b57cec5SDimitry Andric 2980b57cec5SDimitry Andric// Aliases of the integer registers used for LDD/STD double-word operations 2995f757f3fSDimitry Andricdef G0_G1 : Rdi< 0, "g0", [G0, G1]>; 3005f757f3fSDimitry Andricdef G2_G3 : Rdi< 2, "g2", [G2, G3]>; 3015f757f3fSDimitry Andricdef G4_G5 : Rdi< 4, "g4", [G4, G5]>; 3025f757f3fSDimitry Andricdef G6_G7 : Rdi< 6, "g6", [G6, G7]>; 3035f757f3fSDimitry Andricdef O0_O1 : Rdi< 8, "o0", [O0, O1]>; 3045f757f3fSDimitry Andricdef O2_O3 : Rdi<10, "o2", [O2, O3]>; 3055f757f3fSDimitry Andricdef O4_O5 : Rdi<12, "o4", [O4, O5]>; 3065f757f3fSDimitry Andricdef O6_O7 : Rdi<14, "o6", [O6, O7]>; 3075f757f3fSDimitry Andricdef L0_L1 : Rdi<16, "l0", [L0, L1]>; 3085f757f3fSDimitry Andricdef L2_L3 : Rdi<18, "l2", [L2, L3]>; 3095f757f3fSDimitry Andricdef L4_L5 : Rdi<20, "l4", [L4, L5]>; 3105f757f3fSDimitry Andricdef L6_L7 : Rdi<22, "l6", [L6, L7]>; 3115f757f3fSDimitry Andricdef I0_I1 : Rdi<24, "i0", [I0, I1]>; 3125f757f3fSDimitry Andricdef I2_I3 : Rdi<26, "i2", [I2, I3]>; 3135f757f3fSDimitry Andricdef I4_I5 : Rdi<28, "i4", [I4, I5]>; 3145f757f3fSDimitry Andricdef I6_I7 : Rdi<30, "i6", [I6, I7]>; 3150b57cec5SDimitry Andric 3160b57cec5SDimitry Andric// Aliases of the co-processor registers used for LDD/STD double-word operations 3175f757f3fSDimitry Andricdef C0_C1 : Rdi< 0, "c0", [C0, C1]>; 3185f757f3fSDimitry Andricdef C2_C3 : Rdi< 2, "c2", [C2, C3]>; 3195f757f3fSDimitry Andricdef C4_C5 : Rdi< 4, "c4", [C4, C5]>; 3205f757f3fSDimitry Andricdef C6_C7 : Rdi< 6, "c6", [C6, C7]>; 3215f757f3fSDimitry Andricdef C8_C9 : Rdi< 8, "c8", [C8, C9]>; 3225f757f3fSDimitry Andricdef C10_C11 : Rdi<10, "c10", [C10, C11]>; 3235f757f3fSDimitry Andricdef C12_C13 : Rdi<12, "c12", [C12, C13]>; 3245f757f3fSDimitry Andricdef C14_C15 : Rdi<14, "c14", [C14, C15]>; 3255f757f3fSDimitry Andricdef C16_C17 : Rdi<16, "c16", [C16, C17]>; 3265f757f3fSDimitry Andricdef C18_C19 : Rdi<18, "c18", [C18, C19]>; 3275f757f3fSDimitry Andricdef C20_C21 : Rdi<20, "c20", [C20, C21]>; 3285f757f3fSDimitry Andricdef C22_C23 : Rdi<22, "c22", [C22, C23]>; 3295f757f3fSDimitry Andricdef C24_C25 : Rdi<24, "c24", [C24, C25]>; 3305f757f3fSDimitry Andricdef C26_C27 : Rdi<26, "c26", [C26, C27]>; 3315f757f3fSDimitry Andricdef C28_C29 : Rdi<28, "c28", [C28, C29]>; 3325f757f3fSDimitry Andricdef C30_C31 : Rdi<30, "c30", [C30, C31]>; 3330b57cec5SDimitry Andric 3340b57cec5SDimitry Andric// Register classes. 3350b57cec5SDimitry Andric// 3360b57cec5SDimitry Andric// FIXME: the register order should be defined in terms of the preferred 3370b57cec5SDimitry Andric// allocation order... 3380b57cec5SDimitry Andric// 3390b57cec5SDimitry Andric// This register class should not be used to hold i64 values, use the I64Regs 3400b57cec5SDimitry Andric// register class for that. The i64 type is included here to allow i64 patterns 3410b57cec5SDimitry Andric// using the integer instructions. 3420b57cec5SDimitry Andricdef IntRegs : RegisterClass<"SP", [i32, i64], 32, 3430b57cec5SDimitry Andric (add (sequence "I%u", 0, 7), 3440b57cec5SDimitry Andric (sequence "G%u", 0, 7), 3450b57cec5SDimitry Andric (sequence "L%u", 0, 7), 3460b57cec5SDimitry Andric (sequence "O%u", 0, 7))>; 3470b57cec5SDimitry Andric 3480b57cec5SDimitry Andric// Should be in the same order as IntRegs. 3490b57cec5SDimitry Andricdef IntPair : RegisterClass<"SP", [v2i32], 64, 3500b57cec5SDimitry Andric (add I0_I1, I2_I3, I4_I5, I6_I7, 3510b57cec5SDimitry Andric G0_G1, G2_G3, G4_G5, G6_G7, 3520b57cec5SDimitry Andric L0_L1, L2_L3, L4_L5, L6_L7, 3530b57cec5SDimitry Andric O0_O1, O2_O3, O4_O5, O6_O7)>; 3540b57cec5SDimitry Andric 3550b57cec5SDimitry Andric// Register class for 64-bit mode, with a 64-bit spill slot size. 3560b57cec5SDimitry Andric// These are the same as the 32-bit registers, so TableGen will consider this 3570b57cec5SDimitry Andric// to be a sub-class of IntRegs. That works out because requiring a 64-bit 3580b57cec5SDimitry Andric// spill slot is a stricter constraint than only requiring a 32-bit spill slot. 3590b57cec5SDimitry Andricdef I64Regs : RegisterClass<"SP", [i64], 64, (add IntRegs)>; 3600b57cec5SDimitry Andric 3610b57cec5SDimitry Andric// Floating point register classes. 3620b57cec5SDimitry Andricdef FPRegs : RegisterClass<"SP", [f32], 32, (sequence "F%u", 0, 31)>; 3630b57cec5SDimitry Andricdef DFPRegs : RegisterClass<"SP", [f64], 64, (sequence "D%u", 0, 31)>; 3640b57cec5SDimitry Andricdef QFPRegs : RegisterClass<"SP", [f128], 128, (sequence "Q%u", 0, 15)>; 3650b57cec5SDimitry Andric 3660b57cec5SDimitry Andric// The Low?FPRegs classes are used only for inline-asm constraints. 3670b57cec5SDimitry Andricdef LowDFPRegs : RegisterClass<"SP", [f64], 64, (sequence "D%u", 0, 15)>; 3680b57cec5SDimitry Andricdef LowQFPRegs : RegisterClass<"SP", [f128], 128, (sequence "Q%u", 0, 7)>; 3690b57cec5SDimitry Andric 3700b57cec5SDimitry Andric// Floating point control register classes. 3710b57cec5SDimitry Andricdef FCCRegs : RegisterClass<"SP", [i1], 1, (sequence "FCC%u", 0, 3)>; 3720b57cec5SDimitry Andric 373*74626c16SDimitry Andric// GPR argument registers. 374*74626c16SDimitry Andricdef GPROutgoingArg : RegisterClass<"SP", [i32, i64], 32, (sequence "O%u", 0, 5)>; 375*74626c16SDimitry Andricdef GPRIncomingArg : RegisterClass<"SP", [i32, i64], 32, (sequence "I%u", 0, 5)>; 376*74626c16SDimitry Andric 3770b57cec5SDimitry Andriclet isAllocatable = 0 in { 3780b57cec5SDimitry Andric // Ancillary state registers 3795f757f3fSDimitry Andric // FIXME: TICK is special-cased here as it can be accessed 3805f757f3fSDimitry Andric // from the ASR (as ASR4) or the privileged register set. 3815f757f3fSDimitry Andric // For now this is required for the parser to work. 3820b57cec5SDimitry Andric def ASRRegs : RegisterClass<"SP", [i32], 32, 3835f757f3fSDimitry Andric (add Y, TICK, (sequence "ASR%u", 1, 31))>; 3840b57cec5SDimitry Andric 3850b57cec5SDimitry Andric // This register class should not be used to hold i64 values. 3860b57cec5SDimitry Andric def CoprocRegs : RegisterClass<"SP", [i32], 32, 3870b57cec5SDimitry Andric (add (sequence "C%u", 0, 31))>; 3880b57cec5SDimitry Andric 3890b57cec5SDimitry Andric // Should be in the same order as CoprocRegs. 3900b57cec5SDimitry Andric def CoprocPair : RegisterClass<"SP", [v2i32], 64, 3910b57cec5SDimitry Andric (add C0_C1, C2_C3, C4_C5, C6_C7, 3920b57cec5SDimitry Andric C8_C9, C10_C11, C12_C13, C14_C15, 3930b57cec5SDimitry Andric C16_C17, C18_C19, C20_C21, C22_C23, 3940b57cec5SDimitry Andric C24_C25, C26_C27, C28_C29, C30_C31)>; 3950b57cec5SDimitry Andric} 3960b57cec5SDimitry Andric 3970b57cec5SDimitry Andric// Privileged Registers 3980b57cec5SDimitry Andricdef PRRegs : RegisterClass<"SP", [i64], 64, 3990b57cec5SDimitry Andric (add TPC, TNPC, TSTATE, TT, TICK, TBA, PSTATE, TL, PIL, CWP, 4005f757f3fSDimitry Andric CANSAVE, CANRESTORE, CLEANWIN, OTHERWIN, WSTATE, GL, VER)>; 401