1*bdd1243dSDimitry Andric//===- PPCRegisterInfoDMR.td - The PowerPC Register File *- tablegen -*----===// 2*bdd1243dSDimitry Andric// 3*bdd1243dSDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*bdd1243dSDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 5*bdd1243dSDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*bdd1243dSDimitry Andric// 7*bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 8*bdd1243dSDimitry Andric// 9*bdd1243dSDimitry Andric// Register info specific to Power PC Dense Math Registers(DMR). 10*bdd1243dSDimitry Andric// 11*bdd1243dSDimitry Andric// Register classes in this file are related to the Dense Math Registers (DMR). 12*bdd1243dSDimitry Andric// There are a total of 8 DMR registers numbered 0 to 7. 13*bdd1243dSDimitry Andric// The 4 different views of each DMR register. 14*bdd1243dSDimitry Andric// 15*bdd1243dSDimitry Andric// [ DMR0 ] 16*bdd1243dSDimitry Andric// | WACC0 | WACC_HI0 | 17*bdd1243dSDimitry Andric// | DMRROWp0 | DMRROWp1 | DMRROWp2 | DMRROWp3 | 18*bdd1243dSDimitry Andric// |DMRROW0|DMRROW1|DMRROW2|DMRROW3|DMRROW4|DMRROW5|DMRROW6|DMRROW7| 19*bdd1243dSDimitry Andric// [128bits|128bits|128bits|128bits|128bits|128bits|128bits|128bits] 20*bdd1243dSDimitry Andric// 21*bdd1243dSDimitry Andric// In addition to the above classes two consecutive DMR registers make a DMR 22*bdd1243dSDimitry Andric// DMR pair (DMRp) that is 2048 bits. 23*bdd1243dSDimitry Andric//===----------------------------------------------------------------------===// 24*bdd1243dSDimitry Andric 25*bdd1243dSDimitry Andriclet Namespace = "PPC" in { 26*bdd1243dSDimitry Andricdef sub_dmrrow0 : SubRegIndex<128>; 27*bdd1243dSDimitry Andricdef sub_dmrrow1 : SubRegIndex<128, 128>; 28*bdd1243dSDimitry Andricdef sub_dmrrowp0 : SubRegIndex<256>; 29*bdd1243dSDimitry Andricdef sub_dmrrowp1 : SubRegIndex<256, 256>; 30*bdd1243dSDimitry Andricdef sub_wacc_lo : SubRegIndex<512>; 31*bdd1243dSDimitry Andricdef sub_wacc_hi : SubRegIndex<512, 512>; 32*bdd1243dSDimitry Andricdef sub_dmr0 : SubRegIndex<1024>; 33*bdd1243dSDimitry Andricdef sub_dmr1 : SubRegIndex<1024, 1024>; 34*bdd1243dSDimitry Andric} 35*bdd1243dSDimitry Andric 36*bdd1243dSDimitry Andric// A single row in a DMR register. 37*bdd1243dSDimitry Andric// There are 8 128 bit rows in each DMR register and 8 DMR registers so that 38*bdd1243dSDimitry Andric// makes 64 DMRROW registers in total. 39*bdd1243dSDimitry Andricclass DMRROW<bits<6> num, string n> : PPCReg<n> { 40*bdd1243dSDimitry Andric let HWEncoding{5-0} = num; 41*bdd1243dSDimitry Andric} 42*bdd1243dSDimitry Andric 43*bdd1243dSDimitry Andric// A consecutive pair of DMR row registers. 44*bdd1243dSDimitry Andricclass DMRROWp<bits<5> num, string n, list<Register> subregs> : PPCReg<n> { 45*bdd1243dSDimitry Andric let HWEncoding{4-0} = num; 46*bdd1243dSDimitry Andric let SubRegs = subregs; 47*bdd1243dSDimitry Andric} 48*bdd1243dSDimitry Andric 49*bdd1243dSDimitry Andric// WACC - Wide ACC registers. Accumulator registers that are subregs of DMR. 50*bdd1243dSDimitry Andric// These ACC registers no longer include VSR regs as subregs. 51*bdd1243dSDimitry Andricclass WACC<bits<3> num, string n, list<Register> subregs> : PPCReg<n> { 52*bdd1243dSDimitry Andric let HWEncoding{2-0} = num; 53*bdd1243dSDimitry Andric let SubRegs = subregs; 54*bdd1243dSDimitry Andric} 55*bdd1243dSDimitry Andric 56*bdd1243dSDimitry Andric// High bits for the ACC registers. 57*bdd1243dSDimitry Andric// When the ACC register is used these bits are ignored. 58*bdd1243dSDimitry Andric// When the ACC register is the target, these bits are set to zero. 59*bdd1243dSDimitry Andricclass WACC_HI<bits<3> num, string n, list<Register> subregs> : PPCReg<n> { 60*bdd1243dSDimitry Andric let HWEncoding{2-0} = num; 61*bdd1243dSDimitry Andric let SubRegs = subregs; 62*bdd1243dSDimitry Andric} 63*bdd1243dSDimitry Andric 64*bdd1243dSDimitry Andricclass DMR<bits<3> num, string n, list<Register> subregs> : PPCReg<n> { 65*bdd1243dSDimitry Andric let HWEncoding{2-0} = num; 66*bdd1243dSDimitry Andric let SubRegs = subregs; 67*bdd1243dSDimitry Andric} 68*bdd1243dSDimitry Andric 69*bdd1243dSDimitry Andricclass DMRp<bits<2> num, string n, list<Register> subregs> : PPCReg<n> { 70*bdd1243dSDimitry Andric let HWEncoding{1-0} = num; 71*bdd1243dSDimitry Andric let SubRegs = subregs; 72*bdd1243dSDimitry Andric} 73*bdd1243dSDimitry Andric 74*bdd1243dSDimitry Andric// The DMR Row type registers are the lowest level of registers and have no 75*bdd1243dSDimitry Andric// subregs. 76*bdd1243dSDimitry Andricforeach Index = 0-63 in { 77*bdd1243dSDimitry Andric def DMRROW#Index : DMRROW<Index, "dmrrow"#Index>, DwarfRegNum<[-1, -1]>; 78*bdd1243dSDimitry Andric} 79*bdd1243dSDimitry Andric 80*bdd1243dSDimitry Andric// DMRROW pairs are consecutive pairs. 81*bdd1243dSDimitry Andric// DMRROWp0 = DMRROW0, DMRROW1 82*bdd1243dSDimitry Andric// DMRROWp1 = DMRROW2, DMRROW3 83*bdd1243dSDimitry Andric// DMRROWp2 = DMRROW4, DMRROW5 84*bdd1243dSDimitry Andric// etc... 85*bdd1243dSDimitry Andriclet SubRegIndices = [sub_dmrrow0, sub_dmrrow1] in { 86*bdd1243dSDimitry Andric foreach Index = 0-31 in { 87*bdd1243dSDimitry Andric def DMRROWp#Index : DMRROWp<Index, "dmrrowp"#Index, 88*bdd1243dSDimitry Andric [!cast<DMRROW>("DMRROW"#!mul(Index, 2)), 89*bdd1243dSDimitry Andric !cast<DMRROW>("DMRROW"#!add(!mul(Index, 2), 1))]>, DwarfRegNum<[-1, -1]>; 90*bdd1243dSDimitry Andric } 91*bdd1243dSDimitry Andric} 92*bdd1243dSDimitry Andric 93*bdd1243dSDimitry Andriclet SubRegIndices = [sub_dmrrowp0, sub_dmrrowp1] in { 94*bdd1243dSDimitry Andric // WACC0 = DMRROWp0, DMRROWp1 95*bdd1243dSDimitry Andric // WACC1 = DMRROWp4, DMRROWp5 96*bdd1243dSDimitry Andric // WACC2 = DMRROWp8, DMRROWp9 97*bdd1243dSDimitry Andric // etc... 98*bdd1243dSDimitry Andric foreach Index = 0-7 in { 99*bdd1243dSDimitry Andric def WACC#Index : WACC<Index, "wacc"#Index, 100*bdd1243dSDimitry Andric [!cast<DMRROWp>("DMRROWp"#!mul(Index, 4)), 101*bdd1243dSDimitry Andric !cast<DMRROWp>("DMRROWp"#!add(!mul(Index, 4), 1))]>, DwarfRegNum<[-1, -1]>; 102*bdd1243dSDimitry Andric } 103*bdd1243dSDimitry Andric 104*bdd1243dSDimitry Andric // WACC_HI0 = DMRROWp2, DMRROWp3 105*bdd1243dSDimitry Andric // WACC_HI1 = DMRROWp6, DMRROWp7 106*bdd1243dSDimitry Andric // WACC_HI2 = DMRROWp10, DMRROWp11 107*bdd1243dSDimitry Andric // etc... 108*bdd1243dSDimitry Andric foreach Index = 0-7 in { 109*bdd1243dSDimitry Andric def WACC_HI#Index : WACC_HI<Index, "wacc_hi"#Index, 110*bdd1243dSDimitry Andric [!cast<DMRROWp>("DMRROWp"#!add(!mul(Index, 4), 2)), 111*bdd1243dSDimitry Andric !cast<DMRROWp>("DMRROWp"#!add(!mul(Index, 4), 3))]>, DwarfRegNum<[-1, -1]>; 112*bdd1243dSDimitry Andric } 113*bdd1243dSDimitry Andric} 114*bdd1243dSDimitry Andric 115*bdd1243dSDimitry Andric// DMR0 = WACC0, WACC_HI0 116*bdd1243dSDimitry Andric// DMR1 = WACC1, WACC_HI1 117*bdd1243dSDimitry Andric// DMR2 = WACC2, WACC_HI2 118*bdd1243dSDimitry Andric// etc... 119*bdd1243dSDimitry Andriclet SubRegIndices = [sub_wacc_lo, sub_wacc_hi] in { 120*bdd1243dSDimitry Andric foreach Index = 0-7 in { 121*bdd1243dSDimitry Andric def DMR#Index : DMR<Index, "dmr"#Index, [!cast<WACC>("WACC"#Index), !cast<WACC_HI>("WACC_HI"#Index)]>, DwarfRegNum<[-1, -1]>; 122*bdd1243dSDimitry Andric } 123*bdd1243dSDimitry Andric} 124*bdd1243dSDimitry Andric 125*bdd1243dSDimitry Andric// DMRp0 = DMR0, DMR1 126*bdd1243dSDimitry Andric// DMRp1 = DMR2, DMR3 127*bdd1243dSDimitry Andric// DMRp2 = DMR4, DMR5 128*bdd1243dSDimitry Andric// DMRp3 = DMR6, DMR7 129*bdd1243dSDimitry Andriclet SubRegIndices = [sub_dmr0, sub_dmr1] in { 130*bdd1243dSDimitry Andric def DMRp0 : DMRp<0, "dmrp0", [DMR0, DMR1]>, DwarfRegNum<[-1, -1]>; 131*bdd1243dSDimitry Andric def DMRp1 : DMRp<1, "dmrp1", [DMR2, DMR3]>, DwarfRegNum<[-1, -1]>; 132*bdd1243dSDimitry Andric def DMRp2 : DMRp<2, "dmrp2", [DMR4, DMR5]>, DwarfRegNum<[-1, -1]>; 133*bdd1243dSDimitry Andric def DMRp3 : DMRp<3, "dmrp3", [DMR6, DMR7]>, DwarfRegNum<[-1, -1]>; 134*bdd1243dSDimitry Andric} 135*bdd1243dSDimitry Andric 136*bdd1243dSDimitry Andricdef DMRROWRC : RegisterClass<"PPC", [v128i1], 128, 137*bdd1243dSDimitry Andric (add (sequence "DMRROW%u", 0, 63))> { 138*bdd1243dSDimitry Andric let Size = 128; 139*bdd1243dSDimitry Andric} 140*bdd1243dSDimitry Andric 141*bdd1243dSDimitry Andricdef DMRROWpRC : RegisterClass<"PPC", [v256i1], 128, 142*bdd1243dSDimitry Andric (add (sequence "DMRROWp%u", 0, 31))> { 143*bdd1243dSDimitry Andric let Size = 256; 144*bdd1243dSDimitry Andric} 145*bdd1243dSDimitry Andric 146*bdd1243dSDimitry Andricdef WACCRC : RegisterClass<"PPC", [v512i1], 128, 147*bdd1243dSDimitry Andric (add (sequence "WACC%u", 0, 7))> { 148*bdd1243dSDimitry Andric let Size = 512; 149*bdd1243dSDimitry Andric} 150*bdd1243dSDimitry Andric 151*bdd1243dSDimitry Andricdef WACC_HIRC : RegisterClass<"PPC", [v512i1], 128, 152*bdd1243dSDimitry Andric (add (sequence "WACC_HI%u", 0, 7))> { 153*bdd1243dSDimitry Andric let Size = 512; 154*bdd1243dSDimitry Andric} 155*bdd1243dSDimitry Andric 156*bdd1243dSDimitry Andricdef DMRRC : RegisterClass<"PPC", [v1024i1], 128, 157*bdd1243dSDimitry Andric (add (sequence "DMR%u", 0, 7))> { 158*bdd1243dSDimitry Andric let Size = 1024; 159*bdd1243dSDimitry Andric} 160*bdd1243dSDimitry Andric 161*bdd1243dSDimitry Andricdef DMRpRC : RegisterClass<"PPC", [v2048i1], 128, 162*bdd1243dSDimitry Andric (add DMRp0, DMRp1, DMRp2, DMRp3)> { 163*bdd1243dSDimitry Andric let Size = 2048; 164*bdd1243dSDimitry Andric} 165