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