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