xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/PowerPC/PPCRegisterInfoDMR.td (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
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