gem5 v23.0.0.1
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
registers.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2015-2021 Advanced Micro Devices, Inc.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 *
11 * 2. Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation
13 * and/or other materials provided with the distribution.
14 *
15 * 3. Neither the name of the copyright holder nor the names of its
16 * contributors may be used to endorse or promote products derived from this
17 * software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31
33
34namespace gem5
35{
36
37namespace VegaISA
38{
39 std::string
40 opSelectorToRegSym(int idx, int numRegs)
41 {
42 std::string reg_sym;
43
44 // we have an SGPR
45 if (idx <= REG_SGPR_MAX) {
46 if (numRegs > 1)
47 reg_sym = "s[" + std::to_string(idx) + ":" +
48 std::to_string(idx + numRegs - 1) + "]";
49 else
50 reg_sym = "s" + std::to_string(idx);
51 return reg_sym;
52 } else if (idx >= REG_VGPR_MIN && idx <= REG_VGPR_MAX) {
53 if (numRegs > 1)
54 reg_sym = "v[" + std::to_string(idx - REG_VGPR_MIN) + ":" +
55 std::to_string(idx - REG_VGPR_MIN + numRegs - 1) + "]";
56 else
57 reg_sym = "v" + std::to_string(idx - REG_VGPR_MIN);
58 return reg_sym;
59 } else if (idx >= REG_INT_CONST_POS_MIN &&
60 idx <= REG_INT_CONST_POS_MAX) {
61 reg_sym = std::to_string(idx - REG_INT_CONST_POS_MIN + 1);
62 return reg_sym;
63 } else if (idx >= REG_INT_CONST_NEG_MIN &&
64 idx <= REG_INT_CONST_NEG_MAX) {
65 int inline_val = -1 - (idx - REG_INT_CONST_NEG_MIN);
66 reg_sym = std::to_string(inline_val);
67 return reg_sym;
68 }
69
70 switch (idx) {
72 reg_sym = "flat_scratch_lo";
73 break;
75 reg_sym = "flat_scratch_hi";
76 break;
77 case REG_VCC_LO:
78 reg_sym = "vcc_lo";
79 break;
80 case REG_VCC_HI:
81 reg_sym = "vcc_hi";
82 break;
83 case REG_M0:
84 reg_sym = "m0";
85 break;
86 case REG_EXEC_LO:
87 reg_sym = "exec";
88 break;
89 case REG_ZERO:
90 reg_sym = "0";
91 break;
92 case REG_POS_HALF:
93 reg_sym = "0.5";
94 break;
95 case REG_NEG_HALF:
96 reg_sym = "-0.5";
97 break;
98 case REG_POS_ONE:
99 reg_sym = "1";
100 break;
101 case REG_NEG_ONE:
102 reg_sym = "-1";
103 break;
104 case REG_POS_TWO:
105 reg_sym = "2";
106 break;
107 case REG_NEG_TWO:
108 reg_sym = "-2";
109 break;
110 case REG_POS_FOUR:
111 reg_sym = "4";
112 break;
113 case REG_NEG_FOUR:
114 reg_sym = "-4";
115 break;
116 default:
117 fatal("VEGA ISA instruction has unknown register index %u\n", idx);
118 break;
119 }
120
121 return reg_sym;
122 }
123
124 int
125 opSelectorToRegIdx(int idx, int numScalarRegs)
126 {
127 int regIdx = -1;
128
129 if (idx <= REG_SGPR_MAX) {
130 regIdx = idx;
131 } else if (idx >= REG_VGPR_MIN && idx <= REG_VGPR_MAX) {
132 regIdx = idx - REG_VGPR_MIN;
133 } else if (idx == REG_VCC_LO) {
145 regIdx = numScalarRegs - 2;
146 } else if (idx == REG_VCC_HI) {
147 regIdx = numScalarRegs - 1;
148 } else if (idx == REG_FLAT_SCRATCH_LO) {
161 regIdx = numScalarRegs - 4;
162 } else if (idx == REG_FLAT_SCRATCH_HI) {
163 regIdx = numScalarRegs - 3;
164 } else if (idx == REG_EXEC_LO || idx == REG_EXEC_HI) {
172 return idx;
173 }
174
175 return regIdx;
176 }
177
178 bool
179 isPosConstVal(int opIdx)
180 {
181 bool is_pos_const_val = (opIdx >= REG_INT_CONST_POS_MIN
182 && opIdx <= REG_INT_CONST_POS_MAX);
183
184 return is_pos_const_val;
185 }
186
187 bool
188 isNegConstVal(int opIdx)
189 {
190 bool is_neg_const_val = (opIdx >= REG_INT_CONST_NEG_MIN
191 && opIdx <= REG_INT_CONST_NEG_MAX);
192
193 return is_neg_const_val;
194 }
195
196 bool
197 isConstVal(int opIdx)
198 {
199 bool is_const_val = isPosConstVal(opIdx) || isNegConstVal(opIdx);
200 return is_const_val;
201 }
202
203 bool
204 isLiteral(int opIdx)
205 {
206 return opIdx == REG_SRC_LITERAL;
207 }
208
209 bool
210 isExecMask(int opIdx)
211 {
212 return opIdx == REG_EXEC_LO || opIdx == REG_EXEC_HI;
213 }
214
215 bool
216 isVccReg(int opIdx)
217 {
218 return opIdx == REG_VCC_LO || opIdx == REG_VCC_HI;
219 }
220
221 bool
223 {
224 return opIdx == REG_FLAT_SCRATCH_LO || opIdx == REG_FLAT_SCRATCH_HI;
225 }
226
227 bool
228 isScalarReg(int opIdx)
229 {
230 // FLAT_SCRATCH and VCC are stored in an SGPR pair
231 if (opIdx <= REG_SGPR_MAX || opIdx == REG_FLAT_SCRATCH_LO ||
232 opIdx == REG_FLAT_SCRATCH_HI || opIdx == REG_VCC_LO ||
233 opIdx == REG_VCC_HI) {
234 return true;
235 }
236
237 return false;
238 }
239
240 bool
241 isVectorReg(int opIdx)
242 {
243 if (opIdx >= REG_VGPR_MIN && opIdx <= REG_VGPR_MAX)
244 return true;
245
246 return false;
247 }
248
249} // namespace VegaISA
250} // namespace gem5
#define fatal(...)
This implements a cprintf based fatal() function.
Definition logging.hh:200
bool isVectorReg(int opIdx)
Definition registers.cc:241
bool isNegConstVal(int opIdx)
Definition registers.cc:188
bool isVccReg(int opIdx)
Definition registers.cc:216
int opSelectorToRegIdx(int opIdx, int numScalarRegs)
Definition registers.cc:125
bool isConstVal(int opIdx)
Definition registers.cc:197
std::string opSelectorToRegSym(int opIdx, int numRegs=0)
Definition registers.cc:40
bool isLiteral(int opIdx)
Definition registers.cc:204
bool isScalarReg(int opIdx)
Definition registers.cc:228
bool isFlatScratchReg(int opIdx)
Definition registers.cc:222
bool isPosConstVal(int opIdx)
Definition registers.cc:179
bool isExecMask(int opIdx)
Definition registers.cc:210
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....

Generated on Mon Jul 10 2023 15:31:56 for gem5 by doxygen 1.9.7