xref: /llvm-project/llvm/lib/Target/PowerPC/PPCRegisterInfoDMR.td (revision 9df924a634ac5ea702b0d8d0d8b737c819a98095)
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